Repository: yyhuni/xingrin Branch: main Commit: 2a0e09c4eea6 Files: 828 Total size: 11.1 MB Directory structure: gitextract__pp8fuf4/ ├── .dockerignore ├── .github/ │ └── workflows/ │ └── docker-build.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── VERSION ├── backend/ │ ├── .gitignore │ ├── apps/ │ │ ├── __init__.py │ │ ├── asset/ │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── dtos/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asset/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── directory_dto.py │ │ │ │ │ ├── endpoint_dto.py │ │ │ │ │ ├── host_port_mapping_dto.py │ │ │ │ │ ├── ip_address_dto.py │ │ │ │ │ ├── port_dto.py │ │ │ │ │ ├── subdomain_dto.py │ │ │ │ │ ├── vulnerability_dto.py │ │ │ │ │ └── website_dto.py │ │ │ │ └── snapshot/ │ │ │ │ ├── __init__.py │ │ │ │ ├── directory_snapshot_dto.py │ │ │ │ ├── endpoint_snapshot_dto.py │ │ │ │ ├── host_port_mapping_snapshot_dto.py │ │ │ │ ├── subdomain_snapshot_dto.py │ │ │ │ ├── vulnerability_snapshot_dto.py │ │ │ │ └── website_snapshot_dto.py │ │ │ ├── migrations/ │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── 0002_create_search_views.py │ │ │ │ ├── 0003_add_screenshot_models.py │ │ │ │ ├── 0004_add_status_code_to_screenshot.py │ │ │ │ └── __init__.py │ │ │ ├── models/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asset_models.py │ │ │ │ ├── screenshot_models.py │ │ │ │ ├── snapshot_models.py │ │ │ │ └── statistics_models.py │ │ │ ├── repositories/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asset/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── directory_repository.py │ │ │ │ │ ├── endpoint_repository.py │ │ │ │ │ ├── host_port_mapping_repository.py │ │ │ │ │ ├── subdomain_repository.py │ │ │ │ │ └── website_repository.py │ │ │ │ ├── snapshot/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── directory_snapshot_repository.py │ │ │ │ │ ├── endpoint_snapshot_repository.py │ │ │ │ │ ├── host_port_mapping_snapshot_repository.py │ │ │ │ │ ├── subdomain_snapshot_repository.py │ │ │ │ │ ├── vulnerability_snapshot_repository.py │ │ │ │ │ └── website_snapshot_repository.py │ │ │ │ └── statistics_repository.py │ │ │ ├── serializers.py │ │ │ ├── services/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asset/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── directory_service.py │ │ │ │ │ ├── endpoint_service.py │ │ │ │ │ ├── host_port_mapping_service.py │ │ │ │ │ ├── subdomain_service.py │ │ │ │ │ ├── vulnerability_service.py │ │ │ │ │ └── website_service.py │ │ │ │ ├── playwright_screenshot_service.py │ │ │ │ ├── screenshot_service.py │ │ │ │ ├── search_service.py │ │ │ │ ├── snapshot/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── directory_snapshots_service.py │ │ │ │ │ ├── endpoint_snapshots_service.py │ │ │ │ │ ├── host_port_mapping_snapshots_service.py │ │ │ │ │ ├── subdomain_snapshots_service.py │ │ │ │ │ ├── vulnerability_snapshots_service.py │ │ │ │ │ └── website_snapshots_service.py │ │ │ │ └── statistics_service.py │ │ │ ├── urls.py │ │ │ └── views/ │ │ │ ├── __init__.py │ │ │ ├── asset_views.py │ │ │ └── search_views.py │ │ ├── common/ │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── authentication.py │ │ │ ├── container_bootstrap.py │ │ │ ├── decorators/ │ │ │ │ ├── __init__.py │ │ │ │ └── db_connection.py │ │ │ ├── definitions.py │ │ │ ├── error_codes.py │ │ │ ├── exception_handlers.py │ │ │ ├── management/ │ │ │ │ └── commands/ │ │ │ │ ├── db_health_check.py │ │ │ │ ├── db_monitor.py │ │ │ │ └── init_admin.py │ │ │ ├── migrations/ │ │ │ │ ├── 0001_initial.py │ │ │ │ └── __init__.py │ │ │ ├── models/ │ │ │ │ ├── __init__.py │ │ │ │ └── blacklist.py │ │ │ ├── normalizer.py │ │ │ ├── pagination.py │ │ │ ├── permissions.py │ │ │ ├── prefect_django_setup.py │ │ │ ├── response_helpers.py │ │ │ ├── serializers/ │ │ │ │ ├── __init__.py │ │ │ │ └── blacklist_serializers.py │ │ │ ├── services/ │ │ │ │ ├── __init__.py │ │ │ │ ├── blacklist_service.py │ │ │ │ └── system_log_service.py │ │ │ ├── signals.py │ │ │ ├── urls.py │ │ │ ├── utils/ │ │ │ │ ├── __init__.py │ │ │ │ ├── blacklist_filter.py │ │ │ │ ├── csv_utils.py │ │ │ │ ├── dedup.py │ │ │ │ ├── filter_utils.py │ │ │ │ └── hash.py │ │ │ ├── validators.py │ │ │ ├── views/ │ │ │ │ ├── __init__.py │ │ │ │ ├── auth_views.py │ │ │ │ ├── blacklist_views.py │ │ │ │ ├── health_views.py │ │ │ │ ├── system_log_views.py │ │ │ │ └── version_views.py │ │ │ └── websocket_auth.py │ │ ├── engine/ │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── consumers/ │ │ │ │ ├── __init__.py │ │ │ │ └── worker_deploy_consumer.py │ │ │ ├── management/ │ │ │ │ ├── __init__.py │ │ │ │ └── commands/ │ │ │ │ ├── __init__.py │ │ │ │ ├── init_default_engine.py │ │ │ │ ├── init_fingerprints.py │ │ │ │ ├── init_nuclei_templates.py │ │ │ │ └── init_wordlists.py │ │ │ ├── migrations/ │ │ │ │ ├── 0001_initial.py │ │ │ │ └── __init__.py │ │ │ ├── models/ │ │ │ │ ├── __init__.py │ │ │ │ ├── engine.py │ │ │ │ └── fingerprints.py │ │ │ ├── repositories/ │ │ │ │ ├── __init__.py │ │ │ │ ├── django_engine_repository.py │ │ │ │ ├── django_wordlist_repository.py │ │ │ │ ├── django_worker_repository.py │ │ │ │ └── nuclei_repo_repository.py │ │ │ ├── routing.py │ │ │ ├── scheduler.py │ │ │ ├── serializers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── engine_serializer.py │ │ │ │ ├── fingerprints/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── arl.py │ │ │ │ │ ├── ehole.py │ │ │ │ │ ├── fingerprinthub.py │ │ │ │ │ ├── fingers.py │ │ │ │ │ ├── goby.py │ │ │ │ │ └── wappalyzer.py │ │ │ │ ├── nuclei_template_repo_serializer.py │ │ │ │ ├── wordlist_serializer.py │ │ │ │ └── worker_serializer.py │ │ │ ├── services/ │ │ │ │ ├── __init__.py │ │ │ │ ├── deploy_service.py │ │ │ │ ├── engine_service.py │ │ │ │ ├── fingerprints/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── arl_service.py │ │ │ │ │ ├── base.py │ │ │ │ │ ├── ehole.py │ │ │ │ │ ├── fingerprinthub_service.py │ │ │ │ │ ├── fingers_service.py │ │ │ │ │ ├── goby.py │ │ │ │ │ └── wappalyzer.py │ │ │ │ ├── nuclei_template_repo_service.py │ │ │ │ ├── task_distributor.py │ │ │ │ ├── wordlist_service.py │ │ │ │ ├── worker_load_service.py │ │ │ │ └── worker_service.py │ │ │ ├── urls.py │ │ │ └── views/ │ │ │ ├── __init__.py │ │ │ ├── engine_views.py │ │ │ ├── fingerprints/ │ │ │ │ ├── __init__.py │ │ │ │ ├── arl.py │ │ │ │ ├── base.py │ │ │ │ ├── ehole.py │ │ │ │ ├── fingerprinthub.py │ │ │ │ ├── fingers.py │ │ │ │ ├── goby.py │ │ │ │ └── wappalyzer.py │ │ │ ├── nuclei_template_repo_views.py │ │ │ ├── wordlist_views.py │ │ │ └── worker_views.py │ │ ├── scan/ │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── configs/ │ │ │ │ ├── command_templates.py │ │ │ │ └── engine_config_example.yaml │ │ │ ├── flows/ │ │ │ │ ├── __init__.py │ │ │ │ ├── directory_scan_flow.py │ │ │ │ ├── fingerprint_detect_flow.py │ │ │ │ ├── initiate_scan_flow.py │ │ │ │ ├── port_scan_flow.py │ │ │ │ ├── screenshot_flow.py │ │ │ │ ├── site_scan_flow.py │ │ │ │ ├── subdomain_discovery_flow.py │ │ │ │ ├── url_fetch/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── domain_name_url_fetch_flow.py │ │ │ │ │ ├── main_flow.py │ │ │ │ │ ├── sites_url_fetch_flow.py │ │ │ │ │ └── utils.py │ │ │ │ └── vuln_scan/ │ │ │ │ ├── __init__.py │ │ │ │ ├── endpoints_vuln_scan_flow.py │ │ │ │ ├── main_flow.py │ │ │ │ └── utils.py │ │ │ ├── handlers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── initiate_scan_flow_handlers.py │ │ │ │ └── scan_flow_handlers.py │ │ │ ├── management/ │ │ │ │ └── __init__.py │ │ │ ├── migrations/ │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── 0002_add_cached_screenshots_count.py │ │ │ │ ├── 0003_add_wecom_fields.py │ │ │ │ └── __init__.py │ │ │ ├── models/ │ │ │ │ ├── __init__.py │ │ │ │ ├── scan_log_model.py │ │ │ │ ├── scan_models.py │ │ │ │ ├── scheduled_scan_model.py │ │ │ │ └── subfinder_provider_settings_model.py │ │ │ ├── notifications/ │ │ │ │ ├── __init__.py │ │ │ │ ├── consumers.py │ │ │ │ ├── models.py │ │ │ │ ├── receivers.py │ │ │ │ ├── repositories.py │ │ │ │ ├── routing.py │ │ │ │ ├── serializers.py │ │ │ │ ├── services.py │ │ │ │ ├── types.py │ │ │ │ ├── urls.py │ │ │ │ └── views.py │ │ │ ├── orchestrators/ │ │ │ │ ├── __init__.py │ │ │ │ └── flow_orchestrator.py │ │ │ ├── providers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── database_provider.py │ │ │ │ ├── list_provider.py │ │ │ │ ├── pipeline_provider.py │ │ │ │ ├── snapshot_provider.py │ │ │ │ └── tests/ │ │ │ │ ├── __init__.py │ │ │ │ ├── test_common_properties.py │ │ │ │ ├── test_database_provider.py │ │ │ │ ├── test_list_provider.py │ │ │ │ ├── test_pipeline_provider.py │ │ │ │ └── test_snapshot_provider.py │ │ │ ├── repositories/ │ │ │ │ ├── __init__.py │ │ │ │ ├── django_scan_repository.py │ │ │ │ └── scheduled_scan_repository.py │ │ │ ├── scripts/ │ │ │ │ ├── __init__.py │ │ │ │ ├── run_cleanup.py │ │ │ │ ├── run_delete_scans.py │ │ │ │ ├── run_initiate_scan.py │ │ │ │ └── run_scheduled_scan.py │ │ │ ├── serializers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── mixins.py │ │ │ │ ├── scan_log_serializers.py │ │ │ │ ├── scan_serializers.py │ │ │ │ ├── scheduled_scan_serializers.py │ │ │ │ └── subfinder_provider_settings_serializers.py │ │ │ ├── services/ │ │ │ │ ├── __init__.py │ │ │ │ ├── quick_scan_service.py │ │ │ │ ├── scan_control_service.py │ │ │ │ ├── scan_creation_service.py │ │ │ │ ├── scan_service.py │ │ │ │ ├── scan_state_service.py │ │ │ │ ├── scan_stats_service.py │ │ │ │ ├── scheduled_scan_service.py │ │ │ │ ├── subfinder_provider_config_service.py │ │ │ │ └── target_export_service.py │ │ │ ├── tasks/ │ │ │ │ ├── __init__.py │ │ │ │ ├── directory_scan/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── export_sites_task.py │ │ │ │ │ └── run_and_stream_save_directories_task.py │ │ │ │ ├── fingerprint_detect/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── export_urls_task.py │ │ │ │ │ └── run_xingfinger_task.py │ │ │ │ ├── port_scan/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── export_hosts_task.py │ │ │ │ │ ├── run_and_stream_save_ports_task.py │ │ │ │ │ └── types.py │ │ │ │ ├── screenshot/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── capture_screenshots_task.py │ │ │ │ ├── site_scan/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── export_site_urls_task.py │ │ │ │ │ └── run_and_stream_save_websites_task.py │ │ │ │ ├── subdomain_discovery/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── merge_and_validate_task.py │ │ │ │ │ ├── run_subdomain_discovery_task.py │ │ │ │ │ └── save_domains_task.py │ │ │ │ ├── tests/ │ │ │ │ │ └── test_task_backward_compatibility.py │ │ │ │ ├── url_fetch/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── clean_urls_task.py │ │ │ │ │ ├── export_sites_task.py │ │ │ │ │ ├── merge_and_deduplicate_urls_task.py │ │ │ │ │ ├── run_and_stream_save_urls_task.py │ │ │ │ │ ├── run_url_fetcher_task.py │ │ │ │ │ └── save_urls_task.py │ │ │ │ └── vuln_scan/ │ │ │ │ ├── __init__.py │ │ │ │ ├── export_endpoints_task.py │ │ │ │ ├── run_and_stream_save_dalfox_vulns_task.py │ │ │ │ ├── run_and_stream_save_nuclei_vulns_task.py │ │ │ │ └── run_vuln_tool_task.py │ │ │ ├── urls.py │ │ │ ├── utils/ │ │ │ │ ├── __init__.py │ │ │ │ ├── command_builder.py │ │ │ │ ├── command_executor.py │ │ │ │ ├── config_merger.py │ │ │ │ ├── config_parser.py │ │ │ │ ├── directory_cleanup.py │ │ │ │ ├── fingerprint_helpers.py │ │ │ │ ├── nuclei_helpers.py │ │ │ │ ├── performance.py │ │ │ │ ├── system_load.py │ │ │ │ ├── user_logger.py │ │ │ │ ├── wordlist_helpers.py │ │ │ │ └── workspace_utils.py │ │ │ └── views/ │ │ │ ├── __init__.py │ │ │ ├── scan_log_views.py │ │ │ ├── scan_views.py │ │ │ ├── scheduled_scan_views.py │ │ │ └── subfinder_provider_settings_views.py │ │ └── targets/ │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── repositories/ │ │ │ ├── __init__.py │ │ │ ├── django_organization_repository.py │ │ │ └── django_target_repository.py │ │ ├── scripts/ │ │ │ ├── __init__.py │ │ │ ├── run_delete_organizations.py │ │ │ └── run_delete_targets.py │ │ ├── serializers.py │ │ ├── services/ │ │ │ ├── __init__.py │ │ │ ├── organization_service.py │ │ │ └── target_service.py │ │ ├── urls.py │ │ └── views.py │ ├── config/ │ │ ├── __init__.py │ │ ├── asgi.py │ │ ├── logging_config.py │ │ ├── settings.py │ │ └── urls.py │ ├── fingerprints/ │ │ ├── ARL.yaml │ │ ├── ehole.json │ │ ├── fingerprinthub_web.json │ │ ├── fingers_http.json │ │ ├── goby.json │ │ └── wappalyzer.json │ ├── manage.py │ ├── pyproject.toml │ ├── requirements.txt │ ├── resources/ │ │ └── resolvers.txt │ ├── scripts/ │ │ ├── generate_test_data_sql.py │ │ ├── performance/ │ │ │ ├── monitor_pg_performance.sh │ │ │ ├── pg_stats_after_test.sql │ │ │ ├── pg_stats_before_test.sql │ │ │ └── start_performance_test.sh │ │ └── worker-deploy/ │ │ ├── agent.sh │ │ ├── bootstrap.sh │ │ ├── install.sh │ │ ├── start-agent.sh │ │ └── uninstall.sh │ └── wordlist/ │ ├── dir_default.txt │ └── subdomains-top1million-110000.txt ├── docker/ │ ├── agent/ │ │ └── Dockerfile │ ├── docker-compose.dev.yml │ ├── docker-compose.yml │ ├── frontend/ │ │ └── Dockerfile │ ├── nginx/ │ │ ├── Dockerfile │ │ ├── nginx.conf │ │ └── ssl/ │ │ └── README.md │ ├── postgres/ │ │ ├── Dockerfile │ │ └── init-user-db.sh │ ├── restart.sh │ ├── scripts/ │ │ ├── common.sh │ │ ├── init-data.sh │ │ ├── install-pg-ivm.sh │ │ ├── setup-swap.sh │ │ ├── setup-system-monitor.sh │ │ └── test-pg-ivm.sh │ ├── server/ │ │ ├── Dockerfile │ │ └── start.sh │ ├── start.sh │ ├── stop.sh │ └── worker/ │ └── Dockerfile ├── docker-push.sh ├── docs/ │ ├── README.md │ ├── nuclei-template-architecture.md │ ├── plans/ │ │ ├── 2026-03-08-oss-readiness-design.md │ │ └── 2026-03-08-oss-readiness.md │ ├── quick-start.md │ ├── scan-flow-architecture.md │ ├── version-management.md │ └── wordlist-architecture.md ├── frontend/ │ ├── .gitignore │ ├── app/ │ │ ├── [locale]/ │ │ │ ├── dashboard/ │ │ │ │ ├── data.json │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── login/ │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ ├── organization/ │ │ │ │ ├── [id]/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ ├── scan/ │ │ │ │ ├── engine/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── history/ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ ├── directories/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── endpoints/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── ip-addresses/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ ├── overview/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ ├── screenshots/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── subdomain/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── vulnerabilities/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── websites/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── scheduled/ │ │ │ │ └── page.tsx │ │ │ ├── search/ │ │ │ │ └── page.tsx │ │ │ ├── settings/ │ │ │ │ ├── api-keys/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── blacklist/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── notifications/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── system-logs/ │ │ │ │ │ └── page.tsx │ │ │ │ └── workers/ │ │ │ │ └── page.tsx │ │ │ ├── target/ │ │ │ │ ├── [id]/ │ │ │ │ │ ├── details/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── directories/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── endpoints/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── ip-addresses/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── overview/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ ├── screenshots/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── settings/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── subdomain/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── vulnerabilities/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── websites/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── tools/ │ │ │ │ ├── config/ │ │ │ │ │ ├── custom/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── opensource/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── fingerprints/ │ │ │ │ │ ├── arl/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── ehole/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── fingerprinthub/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── fingers/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── goby/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── wappalyzer/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── nuclei/ │ │ │ │ │ ├── [repoId]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── page.tsx │ │ │ │ └── wordlists/ │ │ │ │ └── page.tsx │ │ │ └── vulnerabilities/ │ │ │ └── page.tsx │ │ ├── globals.css │ │ └── layout.tsx │ ├── components/ │ │ ├── about-dialog.tsx │ │ ├── app-sidebar.tsx │ │ ├── auth/ │ │ │ ├── auth-guard.tsx │ │ │ ├── auth-layout.tsx │ │ │ ├── change-password-dialog.tsx │ │ │ └── index.ts │ │ ├── color-theme-switcher.tsx │ │ ├── common/ │ │ │ ├── bulk-add-urls-dialog.tsx │ │ │ └── smart-filter-input.tsx │ │ ├── dashboard/ │ │ │ ├── asset-distribution-chart.tsx │ │ │ ├── asset-trend-chart.tsx │ │ │ ├── dashboard-activity-tabs.tsx │ │ │ ├── dashboard-data-table.tsx │ │ │ ├── dashboard-scan-history.tsx │ │ │ ├── dashboard-scheduled-scans.tsx │ │ │ ├── dashboard-stat-cards.tsx │ │ │ ├── recent-vulnerabilities.tsx │ │ │ └── vuln-severity-chart.tsx │ │ ├── directories/ │ │ │ ├── directories-columns.tsx │ │ │ ├── directories-data-table.tsx │ │ │ └── directories-view.tsx │ │ ├── disk/ │ │ │ └── disk-stat-cards.tsx │ │ ├── endpoints/ │ │ │ ├── endpoints-columns.tsx │ │ │ ├── endpoints-data-table.tsx │ │ │ ├── endpoints-detail-view.tsx │ │ │ └── index.ts │ │ ├── fingerprints/ │ │ │ ├── arl-fingerprint-columns.tsx │ │ │ ├── arl-fingerprint-data-table.tsx │ │ │ ├── arl-fingerprint-dialog.tsx │ │ │ ├── arl-fingerprint-view.tsx │ │ │ ├── ehole-fingerprint-columns.tsx │ │ │ ├── ehole-fingerprint-data-table.tsx │ │ │ ├── ehole-fingerprint-dialog.tsx │ │ │ ├── ehole-fingerprint-view.tsx │ │ │ ├── fingerprinthub-fingerprint-columns.tsx │ │ │ ├── fingerprinthub-fingerprint-data-table.tsx │ │ │ ├── fingerprinthub-fingerprint-dialog.tsx │ │ │ ├── fingerprinthub-fingerprint-view.tsx │ │ │ ├── fingers-fingerprint-columns.tsx │ │ │ ├── fingers-fingerprint-data-table.tsx │ │ │ ├── fingers-fingerprint-dialog.tsx │ │ │ ├── fingers-fingerprint-view.tsx │ │ │ ├── goby-fingerprint-columns.tsx │ │ │ ├── goby-fingerprint-data-table.tsx │ │ │ ├── goby-fingerprint-dialog.tsx │ │ │ ├── goby-fingerprint-view.tsx │ │ │ ├── import-fingerprint-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── wappalyzer-fingerprint-columns.tsx │ │ │ ├── wappalyzer-fingerprint-data-table.tsx │ │ │ ├── wappalyzer-fingerprint-dialog.tsx │ │ │ └── wappalyzer-fingerprint-view.tsx │ │ ├── ip-addresses/ │ │ │ ├── index.ts │ │ │ ├── ip-addresses-columns.tsx │ │ │ ├── ip-addresses-data-table.tsx │ │ │ └── ip-addresses-view.tsx │ │ ├── language-switcher.tsx │ │ ├── loading-spinner.tsx │ │ ├── nav-secondary.tsx │ │ ├── nav-system.tsx │ │ ├── nav-user.tsx │ │ ├── notifications/ │ │ │ ├── index.ts │ │ │ └── notification-drawer.tsx │ │ ├── organization/ │ │ │ ├── add-organization-dialog.tsx │ │ │ ├── edit-organization-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── organization-columns.tsx │ │ │ ├── organization-data-table.tsx │ │ │ ├── organization-detail-view.tsx │ │ │ ├── organization-list.tsx │ │ │ └── targets/ │ │ │ ├── add-target-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── link-target-dialog.tsx │ │ │ ├── targets-columns.tsx │ │ │ ├── targets-data-table.tsx │ │ │ └── targets-detail-view.tsx │ │ ├── providers/ │ │ │ ├── index.ts │ │ │ ├── query-provider.tsx │ │ │ ├── theme-provider.tsx │ │ │ └── ui-i18n-provider.tsx │ │ ├── route-prefetch.tsx │ │ ├── route-progress.tsx │ │ ├── scan/ │ │ │ ├── engine/ │ │ │ │ ├── engine-columns.tsx │ │ │ │ ├── engine-create-dialog.tsx │ │ │ │ ├── engine-data-table.tsx │ │ │ │ ├── engine-edit-dialog.tsx │ │ │ │ └── index.ts │ │ │ ├── engine-preset-selector.tsx │ │ │ ├── history/ │ │ │ │ ├── index.ts │ │ │ │ ├── scan-history-columns.tsx │ │ │ │ ├── scan-history-data-table.tsx │ │ │ │ ├── scan-history-list.tsx │ │ │ │ ├── scan-history-stat-cards.tsx │ │ │ │ └── scan-overview.tsx │ │ │ ├── initiate-scan-dialog.tsx │ │ │ ├── quick-scan-dialog.tsx │ │ │ ├── scan-config-editor.tsx │ │ │ ├── scan-log-list.tsx │ │ │ ├── scan-progress-dialog.tsx │ │ │ └── scheduled/ │ │ │ ├── create-scheduled-scan-dialog.tsx │ │ │ ├── edit-scheduled-scan-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── scheduled-scan-columns.tsx │ │ │ └── scheduled-scan-data-table.tsx │ │ ├── screenshots/ │ │ │ └── screenshots-gallery.tsx │ │ ├── search/ │ │ │ ├── index.ts │ │ │ ├── search-page.tsx │ │ │ ├── search-pagination.tsx │ │ │ ├── search-result-card.tsx │ │ │ └── search-results-table.tsx │ │ ├── settings/ │ │ │ ├── system-logs/ │ │ │ │ ├── ansi-log-viewer.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── log-toolbar.tsx │ │ │ │ └── system-logs-view.tsx │ │ │ └── workers/ │ │ │ ├── deploy-terminal-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── worker-dialog.tsx │ │ │ └── worker-list.tsx │ │ ├── site-header.tsx │ │ ├── subdomains/ │ │ │ ├── bulk-add-subdomains-dialog.tsx │ │ │ ├── index.ts │ │ │ ├── subdomains-columns.tsx │ │ │ ├── subdomains-data-table.tsx │ │ │ └── subdomains-detail-view.tsx │ │ ├── target/ │ │ │ ├── add-target-dialog.tsx │ │ │ ├── all-targets-columns.tsx │ │ │ ├── all-targets-detail-view.tsx │ │ │ ├── index.ts │ │ │ ├── target-overview.tsx │ │ │ ├── target-settings.tsx │ │ │ └── targets-data-table.tsx │ │ ├── theme-toggle.tsx │ │ ├── tools/ │ │ │ ├── commands/ │ │ │ │ ├── commands-columns.tsx │ │ │ │ ├── commands-data-table.tsx │ │ │ │ └── index.ts │ │ │ ├── config/ │ │ │ │ ├── add-custom-tool-dialog.tsx │ │ │ │ ├── add-tool-dialog.tsx │ │ │ │ ├── custom-tools-list.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── opensource-tools-list.tsx │ │ │ │ └── tool-card.tsx │ │ │ ├── index.ts │ │ │ ├── wordlist-edit-dialog.tsx │ │ │ └── wordlist-upload-dialog.tsx │ │ ├── ui/ │ │ │ ├── alert-dialog.tsx │ │ │ ├── alert.tsx │ │ │ ├── avatar.tsx │ │ │ ├── badge.tsx │ │ │ ├── button.tsx │ │ │ ├── calendar.tsx │ │ │ ├── card-grid-skeleton.tsx │ │ │ ├── card.tsx │ │ │ ├── chart.tsx │ │ │ ├── checkbox.tsx │ │ │ ├── collapsible.tsx │ │ │ ├── command.tsx │ │ │ ├── confirm-dialog.tsx │ │ │ ├── copyable-popover-content.tsx │ │ │ ├── data-table/ │ │ │ │ ├── column-header.tsx │ │ │ │ ├── column-resizer.tsx │ │ │ │ ├── expandable-cell.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── pagination.tsx │ │ │ │ ├── toolbar.tsx │ │ │ │ └── unified-data-table.tsx │ │ │ ├── data-table-skeleton.tsx │ │ │ ├── datetime-picker.tsx │ │ │ ├── dialog.tsx │ │ │ ├── drawer.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── dropzone.tsx │ │ │ ├── field.tsx │ │ │ ├── form.tsx │ │ │ ├── hover-card.tsx │ │ │ ├── input.tsx │ │ │ ├── label.tsx │ │ │ ├── master-detail-skeleton.tsx │ │ │ ├── popover.tsx │ │ │ ├── progress.tsx │ │ │ ├── radio-group.tsx │ │ │ ├── scroll-area.tsx │ │ │ ├── select.tsx │ │ │ ├── separator.tsx │ │ │ ├── shadcn-io/ │ │ │ │ ├── banner/ │ │ │ │ │ └── index.tsx │ │ │ │ └── status/ │ │ │ │ └── index.tsx │ │ │ ├── sheet.tsx │ │ │ ├── sidebar.tsx │ │ │ ├── skeleton.tsx │ │ │ ├── sonner.tsx │ │ │ ├── spinner.tsx │ │ │ ├── switch.tsx │ │ │ ├── table.tsx │ │ │ ├── tabs.tsx │ │ │ ├── textarea.tsx │ │ │ ├── toggle-group.tsx │ │ │ ├── toggle.tsx │ │ │ ├── tooltip.tsx │ │ │ └── yaml-editor.tsx │ │ ├── vulnerabilities/ │ │ │ ├── index.ts │ │ │ ├── vulnerabilities-columns.tsx │ │ │ ├── vulnerabilities-data-table.tsx │ │ │ ├── vulnerabilities-detail-view.tsx │ │ │ └── vulnerability-detail-dialog.tsx │ │ └── websites/ │ │ ├── websites-columns.tsx │ │ ├── websites-data-table.tsx │ │ └── websites-view.tsx │ ├── components.json │ ├── eslint.config.mjs │ ├── hooks/ │ │ ├── use-api-key-settings.ts │ │ ├── use-auth.ts │ │ ├── use-color-theme.ts │ │ ├── use-commands.ts │ │ ├── use-dashboard.ts │ │ ├── use-directories.ts │ │ ├── use-disk.ts │ │ ├── use-endpoints.ts │ │ ├── use-engines.ts │ │ ├── use-fingerprints.ts │ │ ├── use-global-blacklist.ts │ │ ├── use-ip-addresses.ts │ │ ├── use-mobile.ts │ │ ├── use-notification-settings.ts │ │ ├── use-notification-sse.ts │ │ ├── use-notifications.ts │ │ ├── use-nuclei-git-settings.ts │ │ ├── use-nuclei-repos.ts │ │ ├── use-nuclei-templates.ts │ │ ├── use-organizations.ts │ │ ├── use-route-prefetch.ts │ │ ├── use-scan-logs.ts │ │ ├── use-scans.ts │ │ ├── use-scheduled-scans.ts │ │ ├── use-screenshots.ts │ │ ├── use-search.ts │ │ ├── use-step.ts │ │ ├── use-subdomains.ts │ │ ├── use-system-logs.ts │ │ ├── use-targets.ts │ │ ├── use-tools.ts │ │ ├── use-version.ts │ │ ├── use-vulnerabilities.ts │ │ ├── use-websites.ts │ │ ├── use-wordlists.ts │ │ └── use-workers.ts │ ├── i18n/ │ │ ├── config.ts │ │ ├── navigation.ts │ │ └── request.ts │ ├── lib/ │ │ ├── api-client.ts │ │ ├── date-utils.ts │ │ ├── domain-validator.ts │ │ ├── endpoint-validator.ts │ │ ├── engine-config.ts │ │ ├── env.ts │ │ ├── error-code-map.ts │ │ ├── error-handler.ts │ │ ├── i18n-format.ts │ │ ├── response-parser.ts │ │ ├── subdomain-validator.ts │ │ ├── table-utils.ts │ │ ├── target-validator.ts │ │ ├── toast-helpers.ts │ │ ├── url-validator.ts │ │ └── utils.ts │ ├── messages/ │ │ ├── en.json │ │ └── zh.json │ ├── middleware.ts │ ├── mock/ │ │ ├── config.ts │ │ ├── data/ │ │ │ ├── auth.ts │ │ │ ├── blacklist.ts │ │ │ ├── dashboard.ts │ │ │ ├── directories.ts │ │ │ ├── endpoints.ts │ │ │ ├── engines.ts │ │ │ ├── fingerprints.ts │ │ │ ├── ip-addresses.ts │ │ │ ├── notification-settings.ts │ │ │ ├── notifications.ts │ │ │ ├── nuclei-templates.ts │ │ │ ├── organizations.ts │ │ │ ├── scans.ts │ │ │ ├── scheduled-scans.ts │ │ │ ├── search.ts │ │ │ ├── subdomains.ts │ │ │ ├── system-logs.ts │ │ │ ├── targets.ts │ │ │ ├── tools.ts │ │ │ ├── vulnerabilities.ts │ │ │ ├── websites.ts │ │ │ ├── wordlists.ts │ │ │ └── workers.ts │ │ └── index.ts │ ├── next.config.ts │ ├── package.json │ ├── postcss.config.mjs │ ├── public/ │ │ ├── animations/ │ │ │ └── Security000-Purple.json │ │ └── mockServiceWorker.js │ ├── services/ │ │ ├── api-key-settings.service.ts │ │ ├── auth.service.ts │ │ ├── command.service.ts │ │ ├── dashboard.service.ts │ │ ├── directory.service.ts │ │ ├── disk.service.ts │ │ ├── endpoint.service.ts │ │ ├── engine.service.ts │ │ ├── fingerprint.service.ts │ │ ├── global-blacklist.service.ts │ │ ├── ip-address.service.ts │ │ ├── notification-settings.service.ts │ │ ├── notification.service.ts │ │ ├── nuclei-git.service.ts │ │ ├── nuclei-repo.api.ts │ │ ├── nuclei.service.ts │ │ ├── organization.service.ts │ │ ├── scan.service.ts │ │ ├── scheduled-scan.service.ts │ │ ├── screenshot.service.ts │ │ ├── search.service.ts │ │ ├── subdomain.service.ts │ │ ├── system-log.service.ts │ │ ├── target.service.ts │ │ ├── tool.service.ts │ │ ├── version.service.ts │ │ ├── vulnerability.service.ts │ │ ├── website.service.ts │ │ ├── wordlist.service.ts │ │ └── worker.service.ts │ ├── styles/ │ │ └── themes/ │ │ ├── bubblegum.css │ │ ├── clean-slate.css │ │ ├── cosmic-night.css │ │ ├── cyberpunk-1.css │ │ ├── eva-01.css │ │ ├── index.css │ │ ├── quantum-rose.css │ │ ├── vercel-dark.css │ │ ├── vercel.css │ │ └── violet-bloom.css │ ├── tsconfig.json │ ├── types/ │ │ ├── api-key-settings.types.ts │ │ ├── api-response.types.ts │ │ ├── auth.types.ts │ │ ├── command.types.ts │ │ ├── common.types.ts │ │ ├── dashboard.types.ts │ │ ├── data-table.types.ts │ │ ├── directory.types.ts │ │ ├── disk.types.ts │ │ ├── endpoint.types.ts │ │ ├── engine.types.ts │ │ ├── fingerprint.types.ts │ │ ├── ip-address.types.ts │ │ ├── notification-settings.types.ts │ │ ├── notification.types.ts │ │ ├── nuclei-git.types.ts │ │ ├── nuclei.types.ts │ │ ├── organization.types.ts │ │ ├── psl.d.ts │ │ ├── scan.types.ts │ │ ├── scheduled-scan.types.ts │ │ ├── search.types.ts │ │ ├── subdomain.types.ts │ │ ├── system-log.types.ts │ │ ├── target.types.ts │ │ ├── tool.types.ts │ │ ├── version.types.ts │ │ ├── vulnerability.types.ts │ │ ├── website.types.ts │ │ ├── wordlist.types.ts │ │ └── worker.types.ts │ └── vercel.json ├── install.sh ├── restart.sh ├── start.sh ├── stop.sh ├── uninstall.sh └── update.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ # Node modules(前端本地开发产物,Docker 构建时会重新安装) frontend/node_modules frontend/.next # Python 虚拟环境 .venv __pycache__ *.pyc # 日志和临时文件 *.log .DS_Store # Git .git .gitignore # IDE .idea .vscode # Docker 相关(避免嵌套) docker/.env ================================================ FILE: .github/workflows/docker-build.yml ================================================ name: Build and Push Docker Images on: push: tags: - 'v*' # 只在推送 v 开头的 tag 时触发(如 v1.0.0) workflow_dispatch: # 手动触发 # 并发控制:同一分支只保留最新的构建,取消之前正在运行的 concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: REGISTRY: docker.io IMAGE_PREFIX: yyhuni permissions: contents: write jobs: # AMD64 构建(原生 x64 runner) build-amd64: runs-on: ubuntu-latest strategy: matrix: include: - image: xingrin-server dockerfile: docker/server/Dockerfile context: . - image: xingrin-frontend dockerfile: docker/frontend/Dockerfile context: . - image: xingrin-worker dockerfile: docker/worker/Dockerfile context: . - image: xingrin-nginx dockerfile: docker/nginx/Dockerfile context: . - image: xingrin-agent dockerfile: docker/agent/Dockerfile context: . - image: xingrin-postgres dockerfile: docker/postgres/Dockerfile context: docker/postgres steps: - name: Checkout uses: actions/checkout@v4 - name: Free disk space run: | sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL sudo docker image prune -af - name: Generate SSL certificates for nginx build if: matrix.image == 'xingrin-nginx' run: | mkdir -p docker/nginx/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout docker/nginx/ssl/privkey.pem \ -out docker/nginx/ssl/fullchain.pem \ -subj "/CN=localhost" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get version id: version run: | if [[ $GITHUB_REF == refs/tags/* ]]; then echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT else echo "VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT fi - name: Build and push AMD64 uses: docker/build-push-action@v5 with: context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} platforms: linux/amd64 push: true tags: ${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:${{ steps.version.outputs.VERSION }}-amd64 build-args: IMAGE_TAG=${{ steps.version.outputs.VERSION }} cache-from: type=registry,ref=${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:cache-amd64 cache-to: type=registry,ref=${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:cache-amd64,mode=max provenance: false sbom: false # ARM64 构建(原生 ARM64 runner) build-arm64: runs-on: ubuntu-22.04-arm strategy: matrix: include: - image: xingrin-server dockerfile: docker/server/Dockerfile context: . - image: xingrin-frontend dockerfile: docker/frontend/Dockerfile context: . - image: xingrin-worker dockerfile: docker/worker/Dockerfile context: . - image: xingrin-nginx dockerfile: docker/nginx/Dockerfile context: . - image: xingrin-agent dockerfile: docker/agent/Dockerfile context: . - image: xingrin-postgres dockerfile: docker/postgres/Dockerfile context: docker/postgres steps: - name: Checkout uses: actions/checkout@v4 - name: Generate SSL certificates for nginx build if: matrix.image == 'xingrin-nginx' run: | mkdir -p docker/nginx/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout docker/nginx/ssl/privkey.pem \ -out docker/nginx/ssl/fullchain.pem \ -subj "/CN=localhost" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get version id: version run: | if [[ $GITHUB_REF == refs/tags/* ]]; then echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT else echo "VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT fi - name: Build and push ARM64 uses: docker/build-push-action@v5 with: context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} platforms: linux/arm64 push: true tags: ${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:${{ steps.version.outputs.VERSION }}-arm64 build-args: IMAGE_TAG=${{ steps.version.outputs.VERSION }} cache-from: type=registry,ref=${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:cache-arm64 cache-to: type=registry,ref=${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:cache-arm64,mode=max provenance: false sbom: false # 合并多架构 manifest merge-manifests: runs-on: ubuntu-latest needs: [build-amd64, build-arm64] strategy: matrix: image: - xingrin-server - xingrin-frontend - xingrin-worker - xingrin-nginx - xingrin-agent - xingrin-postgres steps: - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get version id: version run: | if [[ $GITHUB_REF == refs/tags/* ]]; then echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT echo "IS_RELEASE=true" >> $GITHUB_OUTPUT else echo "VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "IS_RELEASE=false" >> $GITHUB_OUTPUT fi - name: Create and push multi-arch manifest run: | VERSION=${{ steps.version.outputs.VERSION }} IMAGE=${{ env.IMAGE_PREFIX }}/${{ matrix.image }} docker manifest create ${IMAGE}:${VERSION} \ ${IMAGE}:${VERSION}-amd64 \ ${IMAGE}:${VERSION}-arm64 docker manifest push ${IMAGE}:${VERSION} if [[ "${{ steps.version.outputs.IS_RELEASE }}" == "true" ]]; then docker manifest create ${IMAGE}:latest \ ${IMAGE}:${VERSION}-amd64 \ ${IMAGE}:${VERSION}-arm64 docker manifest push ${IMAGE}:latest fi # 更新 VERSION 文件 update-version: runs-on: ubuntu-latest needs: merge-manifests if: startsWith(github.ref, 'refs/tags/v') steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 # 获取完整历史,用于判断 tag 所在分支 token: ${{ secrets.GITHUB_TOKEN }} - name: Determine source branch and version id: branch run: | VERSION="${GITHUB_REF#refs/tags/}" # 查找包含此 tag 的分支 BRANCHES=$(git branch -r --contains ${{ github.ref_name }}) echo "Branches containing tag: $BRANCHES" # 判断 tag 来自哪个分支 if echo "$BRANCHES" | grep -q "origin/main"; then TARGET_BRANCH="main" UPDATE_LATEST="true" elif echo "$BRANCHES" | grep -q "origin/dev"; then TARGET_BRANCH="dev" UPDATE_LATEST="false" else echo "Warning: Tag not found in main or dev branch, defaulting to main" TARGET_BRANCH="main" UPDATE_LATEST="false" fi echo "BRANCH=$TARGET_BRANCH" >> $GITHUB_OUTPUT echo "VERSION=$VERSION" >> $GITHUB_OUTPUT echo "UPDATE_LATEST=$UPDATE_LATEST" >> $GITHUB_OUTPUT echo "Will update VERSION on branch: $TARGET_BRANCH" - name: Checkout target branch run: | git checkout ${{ steps.branch.outputs.BRANCH }} - name: Update VERSION file run: | VERSION="${{ steps.branch.outputs.VERSION }}" echo "$VERSION" > VERSION echo "Updated VERSION to $VERSION on branch ${{ steps.branch.outputs.BRANCH }}" - name: Commit and push run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add VERSION git diff --staged --quiet || git commit -m "chore: bump version to ${{ steps.branch.outputs.VERSION }}" git push origin ${{ steps.branch.outputs.BRANCH }} ================================================ FILE: .gitignore ================================================ # ============================ # 操作系统相关文件 # ============================ .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db # ============================ # 前端 (Next.js/Node.js) 相关 # ============================ # 依赖目录 front-back/node_modules/ front-back/.pnpm-store/ # Next.js 构建产物 front-back/.next/ front-back/out/ front-back/dist/ # 环境变量文件 front-back/.env front-back/.env.local front-back/.env.development.local front-back/.env.test.local front-back/.env.production.local # 运行时和缓存 front-back/.turbo/ front-back/.swc/ front-back/.eslintcache front-back/.tsbuildinfo # ============================ # 后端 (Python/Django) 相关 # ============================ # Python 虚拟环境 .venv/ venv/ env/ ENV/ # Python 编译文件 *.pyc *.pyo *.pyd __pycache__/ *.py[cod] *$py.class # Django 相关 backend/db.sqlite3 backend/db.sqlite3-journal backend/media/ backend/staticfiles/ backend/.env backend/.env.local # Python 测试和覆盖率 .pytest_cache/ .coverage htmlcov/ *.cover .hypothesis/ # ============================ # 后端 (Go) 相关 # ============================ # 编译产物 backend/bin/ backend/dist/ backend/*.exe backend/*.exe~ backend/*.dll backend/*.so backend/*.dylib # 测试相关 backend/*.test backend/*.out backend/*.prof # Go workspace 文件 backend/go.work backend/go.work.sum # Go 依赖管理 backend/vendor/ # ============================ # IDE 和编辑器相关 # ============================ .vscode/ .idea/ .cursor/ .claude/ .kiro/ .playwright-mcp/ *.swp *.swo *~ # ============================ # Docker 相关 # ============================ docker/.env docker/.env.local # SSL 证书和私钥(不应提交) docker/nginx/ssl/*.pem docker/nginx/ssl/*.key docker/nginx/ssl/*.crt # ============================ # 日志文件和扫描结果 # ============================ *.log logs/ results/ # 开发脚本运行时文件(进程 ID 和启动日志) backend/scripts/dev/.pids/ # ============================ # 临时文件 # ============================ tmp/ temp/ .cache/ HGETALL KEYS vuln_scan/input_endpoints.txt open-in-v0 ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge 我们作为成员、贡献者和维护者,承诺让社区中的每个人都能在没有骚扰的环境中参与项目,不论年龄、体型、可见或不可见残障、族裔、性别特征、性别认同和表达、经验水平、教育程度、社会经济地位、国籍、外貌、种族、宗教或性取向。 我们承诺以开放、友善、多元和尊重的方式参与社区建设。 ## Our Standards 积极行为示例: - 以尊重和建设性的方式给出反馈 - 对不同观点和经验保持开放态度 - 真诚接受合理批评并持续改进 - 以社区整体利益为先 不可接受的行为包括: - 人身攻击、侮辱、歧视或骚扰言论 - 恶意挑衅、持续性争吵或破坏讨论秩序 - 发布他人私人信息 - 其他在专业环境中不适当的行为 ## Enforcement Responsibilities 维护者有责任公平、及时地澄清和执行社区行为标准,并可对任何不当行为采取适当且公正的纠正措施。 ## Scope 本行为准则适用于所有项目空间,也适用于代表项目参与公共场合的行为,包括使用官方邮箱、社交账号或在活动中作为项目代表发言。 ## Enforcement 如果你遇到骚扰、辱骂或其他不可接受的行为,请联系维护者:`poem@admin.com`。 所有投诉都会被审查并得到适当回应。 ## Attribution 本行为准则参考 Contributor Covenant,并根据本项目需要进行了简化整理。 ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to XingRin 感谢你愿意为 XingRin 做出贡献。 ## 贡献方式 - 提交 Bug 报告 - 提出功能建议或产品想法 - 改进文档、安装流程和示例 - 提交代码修复或新功能 Pull Request ## 开始之前 在开始较大改动前,建议先创建 Issue 说明背景、目标和实现方向,避免重复工作。 对于小修复、文档修正和明显 Bug,也欢迎直接提交 Pull Request。 ## Pull Request 建议 - 保持改动聚焦,避免把无关修改混在一个 PR 中 - 尽量补充必要的说明、截图或复现步骤 - 如果涉及安全相关行为,请明确测试范围和授权前提 - 与现有代码风格、命名和目录结构保持一致 ## Issue 建议 提交 Issue 时,建议附上: - 使用场景 - 复现步骤 - 实际结果与预期结果 - 日志、截图或错误信息 - 运行环境信息 ## 许可证约定 提交 Pull Request 即表示你确认: - 你有权提交这些代码、文档或资源 - 你的贡献将以本仓库当前使用的 [MIT License](./LICENSE) 发布 ## 社区协作 参与社区前,请先阅读 [Code of Conduct](./CODE_OF_CONDUCT.md)。 感谢你的时间、想法和贡献。 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2025-2026 yyhuni Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

XingRin - 星环

开源攻击面管理平台 (ASM) | 面向授权安全测试与防御研究的资产发现与安全自动化系统

持续维护中:由于现在架构,代码对于ai开发来说,演化进度难度很高,代码原生分布式能力弱,为了适应项目的长期发展,正在进行新一代架构重构,后端采用 Go 语言为核心,其强大的分布式能力是目前最优解,当前版本暂停维护,Issue、建议和 PR 都欢迎提交,旧项目的所有建议,都会逐步迁移到新版本。预计5-6月份上线新仓库,欢迎入群等待。

GitHub stars GitHub forks GitHub issues License

功能特性资产搜索快速开始文档反馈与贡献

关键词: Open Source | ASM | 攻击面管理 | 授权安全测试 | 防御研究 | 资产发现 | 资产搜索 | 安全自动化 | 风险检测 | 子域名枚举 | EASM

--- ## 在线 Demo **[https://xingrin.vercel.app/](https://xingrin.vercel.app/)** > 仅用于 UI 展示,未接入后端数据库 > XingRin 聚焦 **自有资产管理、授权安全测试与防御研究** 场景,帮助安全团队对互联网暴露面进行持续发现、监控与分析。 ---

现代化 UI

Light Mode Bubblegum Cosmic Night Quantum Rose

## 文档 - [技术文档](./docs/README.md) - 技术文档导航(持续完善中) - [快速开始](./docs/quick-start.md) - 一键安装和部署指南 - [版本管理](./docs/version-management.md) - Git Tag 驱动的自动化版本管理系统 - [安全检测模板架构](./docs/nuclei-template-architecture.md) - 检测模板仓库的存储与同步 - [字典文件架构](./docs/wordlist-architecture.md) - 字典文件的存储与同步 - [扫描流程架构](./docs/scan-flow-architecture.md) - 完整扫描流程与工具编排 - [贡献指南](./CONTRIBUTING.md) - Issue、Pull Request 与贡献约定 - [安全策略](./SECURITY.md) - 漏洞报告与安全响应流程 - [行为准则](./CODE_OF_CONDUCT.md) - 社区协作行为规范 --- ## 功能特性 ### 扫描能力 | 功能 | 状态 | 工具 | 说明 | |------|------|------|------| | 子域名扫描 | 已完成 | Subfinder, Amass, PureDNS | 被动收集 + 主动枚举,聚合 50+ 数据源 | | 端口扫描 | 已完成 | Naabu | 自定义端口范围 | | 站点发现 | 已完成 | HTTPX | HTTP 探测,自动获取标题、状态码、技术栈 | | 指纹识别 | 已完成 | XingFinger | 2.7W+ 指纹规则,多源指纹库 | | URL 收集 | 已完成 | Waymore, Katana | 历史数据 + 主动爬取 | | 目录扫描 | 已完成 | FFUF | 高效探测,智能字典 | | 安全检测 | 已完成 | Nuclei, Dalfox | 9000+ 检测模板,覆盖常见 Web 风险与配置问题 | | 站点截图 | 已完成 | Playwright | WebP 高压缩存储 | ### 平台能力 | 功能 | 状态 | 说明 | |------|------|------| | 目标管理 | 已完成 | 多层级组织,支持域名/IP 目标 | | 资产快照 | 已完成 | 扫描结果对比,追踪资产变化 | | 黑名单过滤 | 已完成 | 全局 + Target 级,支持通配符/CIDR | | 定时任务 | 已完成 | Cron 表达式,自动化周期扫描 | | 分布式扫描 | 已完成 | 多 Worker 节点,负载感知调度 | | 全局搜索 | 已完成 | 表达式语法,多字段组合查询 | | 通知推送 | 已完成 | 企业微信、Telegram、Discord | | API 密钥管理 | 已完成 | 可视化配置各数据源 API Key | ### 扫描流程架构 完整的扫描流程包括:子域名发现、端口扫描、站点发现、指纹识别、URL 收集、目录扫描、安全检测等阶段 ```mermaid flowchart LR START["开始扫描"] subgraph STAGE1["阶段 1: 资产发现"] direction TB SUB["子域名发现
subfinder, amass, puredns"] PORT["端口扫描
naabu"] SITE["站点识别
httpx"] FINGER["指纹识别
xingfinger"] SUB --> PORT --> SITE --> FINGER end subgraph STAGE2["阶段 2: 深度分析"] direction TB URL["URL 收集
waymore, katana"] DIR["目录扫描
ffuf"] SCREENSHOT["站点截图
playwright"] end subgraph STAGE3["阶段 3: 安全检测"] VULN["安全检测
nuclei, dalfox"] end FINISH["扫描完成"] START --> STAGE1 FINGER --> STAGE2 STAGE2 --> STAGE3 STAGE3 --> FINISH style START fill:#34495e,stroke:#2c3e50,stroke-width:2px,color:#fff style FINISH fill:#27ae60,stroke:#229954,stroke-width:2px,color:#fff style STAGE1 fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff style STAGE2 fill:#9b59b6,stroke:#8e44ad,stroke-width:2px,color:#fff style STAGE3 fill:#e67e22,stroke:#d35400,stroke-width:2px,color:#fff style SUB fill:#5dade2,stroke:#3498db,stroke-width:1px,color:#fff style PORT fill:#5dade2,stroke:#3498db,stroke-width:1px,color:#fff style SITE fill:#5dade2,stroke:#3498db,stroke-width:1px,color:#fff style FINGER fill:#5dade2,stroke:#3498db,stroke-width:1px,color:#fff style URL fill:#bb8fce,stroke:#9b59b6,stroke-width:1px,color:#fff style DIR fill:#bb8fce,stroke:#9b59b6,stroke-width:1px,color:#fff style SCREENSHOT fill:#bb8fce,stroke:#9b59b6,stroke-width:1px,color:#fff style VULN fill:#f0b27a,stroke:#e67e22,stroke-width:1px,color:#fff ``` 详细说明请查看 [扫描流程架构文档](./docs/scan-flow-architecture.md) ### 分布式架构 - **多节点扫描** - 支持部署多个 Worker 节点,横向扩展扫描能力 - **本地节点** - 零配置,安装即自动注册本地 Docker Worker - **远程节点** - SSH 一键部署远程 VPS 作为扫描节点 - **负载感知调度** - 实时感知节点负载,自动分发任务到最优节点 - **节点监控** - 实时心跳检测,CPU/内存/磁盘状态监控 - **断线重连** - 节点离线自动检测,恢复后自动重新接入 ```mermaid flowchart TB subgraph MASTER["主服务器 (Master Server)"] direction TB REDIS["Redis 负载缓存"] subgraph SCHEDULER["任务调度器 (Task Distributor)"] direction TB SUBMIT["接收扫描任务"] SELECT["负载感知选择"] DISPATCH["智能分发"] SUBMIT --> SELECT SELECT --> DISPATCH end REDIS -.负载数据.-> SELECT end subgraph WORKERS["Worker 节点集群"] direction TB W1["Worker 1 (本地)
CPU: 45% | MEM: 60%"] W2["Worker 2 (远程)
CPU: 30% | MEM: 40%"] W3["Worker N (远程)
CPU: 90% | MEM: 85%"] end DISPATCH -->|任务分发| W1 DISPATCH -->|任务分发| W2 DISPATCH -->|高负载跳过| W3 W1 -.心跳上报.-> REDIS W2 -.心跳上报.-> REDIS W3 -.心跳上报.-> REDIS ``` ### 全局资产搜索 - **多类型搜索** - 支持 Website 和 Endpoint 两种资产类型 - **表达式语法** - 支持 `=`(模糊)、`==`(精确)、`!=`(不等于)操作符 - **逻辑组合** - 支持 `&&` (AND) 和 `||` (OR) 逻辑组合 - **多字段查询** - 支持 host、url、title、tech、status、body、header 字段 - **CSV 导出** - 流式导出全部搜索结果,无数量限制 #### 搜索语法示例 ```bash # 基础搜索 host="api" # host 包含 "api" status=="200" # 状态码精确等于 200 tech="nginx" # 技术栈包含 nginx # 组合搜索 host="api" && status=="200" # host 包含 api 且状态码为 200 tech="vue" || tech="react" # 技术栈包含 vue 或 react # 复杂查询 host="admin" && tech="php" && status=="200" url="/api/v1" && status!="404" ``` ### 可视化界面 - **数据统计** - 资产/漏洞统计仪表盘 - **实时通知** - WebSocket 消息推送 - **通知推送** - 实时企业微信,tg,discard消息推送服务 --- ## 快速开始 ### 环境要求 - **操作系统**: Ubuntu 20.04+ / Debian 11+ - **系统架构**: AMD64 (x86_64) / ARM64 (aarch64) - **硬件**: 2核 4G 内存起步,20GB+ 磁盘空间 ### 一键安装 ```bash # 克隆项目 git clone https://github.com/yyhuni/xingrin.git cd xingrin # 安装并启动(生产模式) sudo ./install.sh # 中国大陆用户推荐使用镜像加速(第三方加速服务可能会失效,不保证长期可用) sudo ./install.sh --mirror ``` > **--mirror 参数说明** > - 自动配置 Docker 镜像加速(国内镜像源) > - 加速 Git 仓库克隆(Nuclei 模板等) ### 访问服务 - **Web 界面**: `https://ip:8083` - **默认账号**: admin / admin(首次登录后请修改密码) ### 常用命令 ```bash # 启动服务 sudo ./start.sh # 停止服务 sudo ./stop.sh # 重启服务 sudo ./restart.sh # 卸载 sudo ./uninstall.sh ``` ## 反馈与贡献 - **发现 Bug、想法或改进建议**:欢迎提交 [Issue](https://github.com/yyhuni/xingrin/issues) - **想直接参与开发**:欢迎发起 Pull Request,提交前建议先阅读 [贡献指南](./CONTRIBUTING.md) - **安全问题反馈**:请优先阅读 [安全策略](./SECURITY.md),避免公开披露未修复漏洞 ## 联系 - 微信公众号: **塔罗安全学苑** - 微信群去公众号底下的菜单,有个交流群,点击就可以看到了,链接过期可以私信我拉你 微信公众号 ### 关注公众号免费领取指纹库 | 指纹库 | 数量 | |--------|------| | ehole.json | 21,977 | | ARL.yaml | 9,264 | | goby.json | 7,086 | | FingerprintHub.json | 3,147 | > 关注公众号回复「指纹」即可获取 ## 赞助支持 如果这个项目对你有帮助,谢谢请我能喝杯蜜雪冰城,你的star和赞助是我免费更新的动力

微信支付 支付宝

## 安全与合规说明 **重要:请在使用前仔细阅读** 1. 本项目面向**授权安全测试**、**防御研究**与**自有资产攻击面管理**场景 2. 使用者必须确保已获得目标系统、数据和环境的**明确合法授权** 3. 请勿将本项目用于任何未经授权的扫描、入侵、破坏或其他违法行为 4. 使用者应自行确认其行为符合所在地区法律法规、合同义务和组织政策 5. 项目维护者**不对滥用行为负责** 使用本工具即表示您同意: - 仅在合法授权范围内使用 - 遵守所在地区的法律法规 - 承担因滥用产生的一切后果 ## Star History 如果这个项目对你有帮助,请给一个 Star 支持一下! [![Star History Chart](https://api.star-history.com/svg?repos=yyhuni/xingrin&type=Date)](https://star-history.com/#yyhuni/xingrin&Date) ## 许可证 本项目采用 [MIT License](LICENSE)。 MIT 许可证允许商业和非商业使用、修改、分发与私有部署,但要求保留原始版权和许可证声明。 请注意:开源许可证授予的是代码使用、修改和分发权限,并不构成对任何未经授权安全测试或违法行为的许可。使用者仍需自行确保其用途合法、合规且已获得明确授权。 ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Supported Versions 安全修复优先面向以下范围: | Version | Supported | | --- | --- | | `main` 最新提交 | ✅ | | 最新稳定发布 | ✅ | | 历史旧版本 | ⚠️ 仅在风险较高且易于回补时评估 | ## Reporting a Vulnerability 如果你发现了潜在安全漏洞,请不要直接公开提交未修复细节。 建议的报告方式: 1. 通过 GitHub 私密安全报告功能提交(如果仓库已开启) 2. 或发送邮件至 `poem@admin.com` 提交时建议包含: - 漏洞类型与影响范围 - 复现步骤或最小 PoC - 受影响版本、环境与配置 - 可能的修复建议(如果有) ## Response Process - 我会尽快确认收到报告 - 我会评估影响范围、可复现性和修复优先级 - 修复完成后,会在合适时间通过提交记录、Release 或公告说明 感谢你以负责任的方式帮助改进 XingRin 的安全性。 ================================================ FILE: VERSION ================================================ v1.5.8 ================================================ FILE: backend/.gitignore ================================================ # Python __pycache__/ *.py[cod] *$py.class *.so .Python *.egg-info/ dist/ build/ .hypothesis/ # Hypothesis 属性测试缓存 # 虚拟环境 venv/ env/ ENV/ # Django *.log db.sqlite3 db.sqlite3-journal /media /staticfiles # 运行时文件(Flower、PID) /var/* !/var/.gitkeep flower.db pids/ script/dev/.pids/ # 扫描结果和日志(后端数据) /results/* !/results/.gitkeep /logs/* !/logs/.gitkeep # 环境变量(敏感信息) .env .env.development .env.production .env.staging # 只提交模板文件:.env.*.example # IDE .vscode/ .idea/ *.swp *.swo *~ # macOS .DS_Store ================================================ FILE: backend/apps/__init__.py ================================================ ================================================ FILE: backend/apps/asset/__init__.py ================================================ ================================================ FILE: backend/apps/asset/apps.py ================================================ from django.apps import AppConfig class AssetConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.asset' ================================================ FILE: backend/apps/asset/dtos/__init__.py ================================================ """Asset DTOs - 数据传输对象""" # 资产模块 DTOs from .asset import ( SubdomainDTO, WebSiteDTO, IPAddressDTO, DirectoryDTO, PortDTO, EndpointDTO, ) # 快照模块 DTOs from .snapshot import ( SubdomainSnapshotDTO, ) __all__ = [ # 资产模块 'SubdomainDTO', 'WebSiteDTO', 'IPAddressDTO', 'DirectoryDTO', 'PortDTO', 'EndpointDTO', # 快照模块 'SubdomainSnapshotDTO', ] ================================================ FILE: backend/apps/asset/dtos/asset/__init__.py ================================================ """Asset DTOs - 数据传输对象""" from .subdomain_dto import SubdomainDTO from .ip_address_dto import IPAddressDTO from .port_dto import PortDTO from .website_dto import WebSiteDTO from .directory_dto import DirectoryDTO from .host_port_mapping_dto import HostPortMappingDTO from .endpoint_dto import EndpointDTO from .vulnerability_dto import VulnerabilityDTO __all__ = [ 'SubdomainDTO', 'IPAddressDTO', 'PortDTO', 'WebSiteDTO', 'DirectoryDTO', 'HostPortMappingDTO', 'EndpointDTO', 'VulnerabilityDTO', ] ================================================ FILE: backend/apps/asset/dtos/asset/directory_dto.py ================================================ """Directory DTO""" from dataclasses import dataclass from typing import Optional @dataclass class DirectoryDTO: """目录数据传输对象""" target_id: int url: str status: Optional[int] = None content_length: Optional[int] = None words: Optional[int] = None lines: Optional[int] = None content_type: str = '' duration: Optional[int] = None ================================================ FILE: backend/apps/asset/dtos/asset/endpoint_dto.py ================================================ """Endpoint DTO""" from dataclasses import dataclass from typing import Optional, List @dataclass class EndpointDTO: """端点 DTO - 资产表数据传输对象""" target_id: int url: str host: Optional[str] = None title: Optional[str] = None status_code: Optional[int] = None content_length: Optional[int] = None webserver: Optional[str] = None response_body: Optional[str] = None content_type: Optional[str] = None tech: Optional[List[str]] = None vhost: Optional[bool] = None location: Optional[str] = None matched_gf_patterns: Optional[List[str]] = None response_headers: Optional[str] = None def __post_init__(self): if self.tech is None: self.tech = [] if self.matched_gf_patterns is None: self.matched_gf_patterns = [] ================================================ FILE: backend/apps/asset/dtos/asset/host_port_mapping_dto.py ================================================ """HostPortMapping DTO""" from dataclasses import dataclass @dataclass class HostPortMappingDTO: """主机端口映射 DTO(资产表)""" target_id: int host: str ip: str port: int ================================================ FILE: backend/apps/asset/dtos/asset/ip_address_dto.py ================================================ """IPAddress DTO""" from dataclasses import dataclass @dataclass class IPAddressDTO: """ IP地址数据传输对象 只包含 IP 自身的信息,不包含关联关系。 关联关系通过 SubdomainIPAssociationDTO 管理。 """ ip: str protocol_version: str = '' is_private: bool = False reverse_pointer: str = '' ================================================ FILE: backend/apps/asset/dtos/asset/port_dto.py ================================================ """Port DTO""" from dataclasses import dataclass @dataclass class PortDTO: """端口数据传输对象""" ip_address_id: int number: int service_name: str = '' target_id: int = None scan_id: int = None ================================================ FILE: backend/apps/asset/dtos/asset/subdomain_dto.py ================================================ """Subdomain DTO""" from dataclasses import dataclass @dataclass class SubdomainDTO: """ 子域名 DTO(纯资产表) 用于传递子域名资产数据,只包含资产本身的信息。 扫描相关信息存储在快照表中。 """ name: str target_id: int # 必填:子域名必须属于某个目标 ================================================ FILE: backend/apps/asset/dtos/asset/vulnerability_dto.py ================================================ """Vulnerability DTO""" from dataclasses import dataclass, field from typing import Optional, Dict, Any from decimal import Decimal @dataclass class VulnerabilityDTO: """漏洞数据传输对象(资产表用)""" target_id: int url: str vuln_type: str severity: str source: str = "" cvss_score: Optional[Decimal] = None description: str = "" raw_output: Dict[str, Any] = field(default_factory=dict) ================================================ FILE: backend/apps/asset/dtos/asset/website_dto.py ================================================ """WebSite DTO""" from dataclasses import dataclass from typing import List, Optional @dataclass class WebSiteDTO: """网站数据传输对象""" target_id: int url: str host: str = '' title: str = '' status_code: Optional[int] = None content_length: Optional[int] = None location: str = '' webserver: str = '' content_type: str = '' tech: List[str] = None response_body: str = '' vhost: Optional[bool] = None created_at: str = None response_headers: str = '' def __post_init__(self): if self.tech is None: self.tech = [] ================================================ FILE: backend/apps/asset/dtos/snapshot/__init__.py ================================================ """Snapshot DTOs""" from .subdomain_snapshot_dto import SubdomainSnapshotDTO from .host_port_mapping_snapshot_dto import HostPortMappingSnapshotDTO from .website_snapshot_dto import WebsiteSnapshotDTO from .directory_snapshot_dto import DirectorySnapshotDTO from .endpoint_snapshot_dto import EndpointSnapshotDTO from .vulnerability_snapshot_dto import VulnerabilitySnapshotDTO __all__ = [ 'SubdomainSnapshotDTO', 'HostPortMappingSnapshotDTO', 'WebsiteSnapshotDTO', 'DirectorySnapshotDTO', 'EndpointSnapshotDTO', 'VulnerabilitySnapshotDTO', ] ================================================ FILE: backend/apps/asset/dtos/snapshot/directory_snapshot_dto.py ================================================ """Directory Snapshot DTO""" from dataclasses import dataclass from typing import Optional from apps.asset.dtos.asset import DirectoryDTO @dataclass class DirectorySnapshotDTO: """ 目录快照数据传输对象 用于保存扫描过程中发现的目录信息到快照表 注意:target_id 只用于传递数据和转换为资产 DTO,不会保存到快照表中。 快照只属于 scan。 """ scan_id: int target_id: int # 仅用于传递数据,不保存到数据库 url: str status: Optional[int] = None content_length: Optional[int] = None words: Optional[int] = None lines: Optional[int] = None content_type: str = '' duration: Optional[int] = None def to_asset_dto(self) -> DirectoryDTO: """ 转换为资产 DTO(用于同步到资产表) 注意:去除 scan_id 字段,因为资产表不需要 Returns: DirectoryDTO: 资产表 DTO """ return DirectoryDTO( target_id=self.target_id, url=self.url, status=self.status, content_length=self.content_length, words=self.words, lines=self.lines, content_type=self.content_type, duration=self.duration ) ================================================ FILE: backend/apps/asset/dtos/snapshot/endpoint_snapshot_dto.py ================================================ """EndpointSnapshot DTO""" from dataclasses import dataclass from typing import List, Optional @dataclass class EndpointSnapshotDTO: """ 端点快照 DTO 注意:target_id 只用于传递数据和转换为资产 DTO,不会保存到快照表中。 快照只属于 scan。 """ scan_id: int target_id: int # 必填,用于同步到资产表 url: str host: str = '' # 主机名(域名或IP地址) title: str = '' status_code: Optional[int] = None content_length: Optional[int] = None location: str = '' webserver: str = '' content_type: str = '' tech: List[str] = None response_body: str = '' vhost: Optional[bool] = None matched_gf_patterns: List[str] = None response_headers: str = '' def __post_init__(self): if self.tech is None: self.tech = [] if self.matched_gf_patterns is None: self.matched_gf_patterns = [] def to_asset_dto(self): """ 转换为资产 DTO(用于同步到资产表) Returns: EndpointDTO: 资产表 DTO(移除 scan_id) """ from apps.asset.dtos.asset import EndpointDTO return EndpointDTO( target_id=self.target_id, url=self.url, host=self.host, title=self.title, status_code=self.status_code, content_length=self.content_length, webserver=self.webserver, response_body=self.response_body, content_type=self.content_type, tech=self.tech if self.tech else [], vhost=self.vhost, location=self.location, matched_gf_patterns=self.matched_gf_patterns if self.matched_gf_patterns else [], response_headers=self.response_headers, ) ================================================ FILE: backend/apps/asset/dtos/snapshot/host_port_mapping_snapshot_dto.py ================================================ """HostPortMappingSnapshot DTO""" from dataclasses import dataclass from typing import Optional @dataclass class HostPortMappingSnapshotDTO: """主机端口映射快照 DTO""" scan_id: int host: str ip: str port: int target_id: Optional[int] = None # 冗余字段,用于同步到资产表 def to_asset_dto(self): """ 转换为资产 DTO(用于同步到资产表) Returns: HostPortMappingDTO: 资产表 DTO(移除 scan_id) """ from apps.asset.dtos.asset import HostPortMappingDTO if self.target_id is None: raise ValueError("target_id 不能为 None,无法同步到资产表") return HostPortMappingDTO( target_id=self.target_id, host=self.host, ip=self.ip, port=self.port ) ================================================ FILE: backend/apps/asset/dtos/snapshot/subdomain_snapshot_dto.py ================================================ """SubdomainSnapshot DTO""" from dataclasses import dataclass from typing import TYPE_CHECKING if TYPE_CHECKING: from apps.asset.dtos import SubdomainDTO @dataclass class SubdomainSnapshotDTO: """ 子域名快照 DTO 用于传递快照数据,包含完整的业务上下文信息。 快照表记录每次扫描的历史数据。 """ name: str scan_id: int # 必填:快照必须关联扫描任务 target_id: int # 必填:目标ID(用于转换为资产 DTO) def to_asset_dto(self) -> 'SubdomainDTO': """ 转换为资产 DTO(用于保存到资产表) Returns: SubdomainDTO: 资产 DTO(不包含 scan_id) Note: 资产表只存储核心数据,扫描上下文(scan_id)不保存到资产表。 target_id 已经包含在 DTO 中,无需额外传参。 """ from apps.asset.dtos import SubdomainDTO return SubdomainDTO(name=self.name, target_id=self.target_id) ================================================ FILE: backend/apps/asset/dtos/snapshot/vulnerability_snapshot_dto.py ================================================ """VulnerabilitySnapshot DTO""" from dataclasses import dataclass, field from typing import Optional, Dict, Any from decimal import Decimal @dataclass class VulnerabilitySnapshotDTO: """漏洞快照 DTO 对应 VulnerabilitySnapshot 模型,用于在 Service/Task 之间传递漏洞结果数据。 设计与其他快照 DTO 一致: - scan_id: 只属于快照表 - target_id: 只用于转换为资产 DTO,不直接存入快照表 """ scan_id: int target_id: int # 仅用于传递数据和生成资产 DTO,不保存到快照表 url: str vuln_type: str severity: str source: str = "" cvss_score: Optional[Decimal] = None description: str = "" raw_output: Dict[str, Any] = field(default_factory=dict) def to_asset_dto(self): """转换为漏洞资产 DTO(用于同步到 Vulnerability 表)。""" from apps.asset.dtos.asset import VulnerabilityDTO return VulnerabilityDTO( target_id=self.target_id, url=self.url, vuln_type=self.vuln_type, severity=self.severity, source=self.source, cvss_score=self.cvss_score, description=self.description, raw_output=self.raw_output, ) ================================================ FILE: backend/apps/asset/dtos/snapshot/website_snapshot_dto.py ================================================ """WebsiteSnapshot DTO""" from dataclasses import dataclass from typing import List, Optional @dataclass class WebsiteSnapshotDTO: """ 网站快照 DTO 注意:target_id 只用于传递数据和转换为资产 DTO,不会保存到快照表中。 快照只属于 scan,target 信息通过 scan.target 获取。 """ scan_id: int target_id: int # 必填,用于同步到资产表 url: str host: str title: str = '' status_code: Optional[int] = None # 统一命名:status -> status_code content_length: Optional[int] = None location: str = '' webserver: str = '' # 统一命名:web_server -> webserver content_type: str = '' tech: List[str] = None response_body: str = '' vhost: Optional[bool] = None response_headers: str = '' def __post_init__(self): if self.tech is None: self.tech = [] def to_asset_dto(self): """ 转换为资产 DTO(用于同步到资产表) Returns: WebSiteDTO: 资产表 DTO(移除 scan_id) """ from apps.asset.dtos.asset import WebSiteDTO return WebSiteDTO( target_id=self.target_id, url=self.url, host=self.host, title=self.title, status_code=self.status_code, content_length=self.content_length, location=self.location, webserver=self.webserver, content_type=self.content_type, tech=self.tech if self.tech else [], response_body=self.response_body, vhost=self.vhost, response_headers=self.response_headers, ) ================================================ FILE: backend/apps/asset/migrations/0001_initial.py ================================================ # Generated by Django 5.2.7 on 2026-01-06 00:55 import django.contrib.postgres.fields import django.contrib.postgres.indexes import django.core.validators import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('scan', '0001_initial'), ('targets', '0001_initial'), ] operations = [ migrations.CreateModel( name='AssetStatistics', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('total_targets', models.IntegerField(default=0, help_text='目标总数')), ('total_subdomains', models.IntegerField(default=0, help_text='子域名总数')), ('total_ips', models.IntegerField(default=0, help_text='IP地址总数')), ('total_endpoints', models.IntegerField(default=0, help_text='端点总数')), ('total_websites', models.IntegerField(default=0, help_text='网站总数')), ('total_vulns', models.IntegerField(default=0, help_text='漏洞总数')), ('total_assets', models.IntegerField(default=0, help_text='总资产数(子域名+IP+端点+网站)')), ('prev_targets', models.IntegerField(default=0, help_text='上次目标总数')), ('prev_subdomains', models.IntegerField(default=0, help_text='上次子域名总数')), ('prev_ips', models.IntegerField(default=0, help_text='上次IP地址总数')), ('prev_endpoints', models.IntegerField(default=0, help_text='上次端点总数')), ('prev_websites', models.IntegerField(default=0, help_text='上次网站总数')), ('prev_vulns', models.IntegerField(default=0, help_text='上次漏洞总数')), ('prev_assets', models.IntegerField(default=0, help_text='上次总资产数')), ('updated_at', models.DateTimeField(auto_now=True, help_text='最后更新时间')), ], options={ 'verbose_name': '资产统计', 'verbose_name_plural': '资产统计', 'db_table': 'asset_statistics', }, ), migrations.CreateModel( name='StatisticsHistory', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date', models.DateField(help_text='统计日期', unique=True)), ('total_targets', models.IntegerField(default=0, help_text='目标总数')), ('total_subdomains', models.IntegerField(default=0, help_text='子域名总数')), ('total_ips', models.IntegerField(default=0, help_text='IP地址总数')), ('total_endpoints', models.IntegerField(default=0, help_text='端点总数')), ('total_websites', models.IntegerField(default=0, help_text='网站总数')), ('total_vulns', models.IntegerField(default=0, help_text='漏洞总数')), ('total_assets', models.IntegerField(default=0, help_text='总资产数')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ], options={ 'verbose_name': '统计历史', 'verbose_name_plural': '统计历史', 'db_table': 'statistics_history', 'ordering': ['-date'], 'indexes': [models.Index(fields=['date'], name='statistics__date_1d29cd_idx')], }, ), migrations.CreateModel( name='Directory', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.CharField(help_text='完整请求 URL', max_length=2000)), ('status', models.IntegerField(blank=True, help_text='HTTP 响应状态码', null=True)), ('content_length', models.BigIntegerField(blank=True, help_text='响应体字节大小(Content-Length 或实际长度)', null=True)), ('words', models.IntegerField(blank=True, help_text='响应体中单词数量(按空格分割)', null=True)), ('lines', models.IntegerField(blank=True, help_text='响应体行数(按换行符分割)', null=True)), ('content_type', models.CharField(blank=True, default='', help_text='响应头 Content-Type 值', max_length=200)), ('duration', models.BigIntegerField(blank=True, help_text='请求耗时(单位:纳秒)', null=True)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('target', models.ForeignKey(help_text='所属的扫描目标', on_delete=django.db.models.deletion.CASCADE, related_name='directories', to='targets.target')), ], options={ 'verbose_name': '目录', 'verbose_name_plural': '目录', 'db_table': 'directory', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='directory_created_2cef03_idx'), models.Index(fields=['target'], name='directory_target__e310c8_idx'), models.Index(fields=['url'], name='directory_url_ba40cd_idx'), models.Index(fields=['status'], name='directory_status_40bbe6_idx'), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='directory_url_trgm_idx', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('target', 'url'), name='unique_directory_url_target')], }, ), migrations.CreateModel( name='DirectorySnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.CharField(help_text='目录URL', max_length=2000)), ('status', models.IntegerField(blank=True, help_text='HTTP状态码', null=True)), ('content_length', models.BigIntegerField(blank=True, help_text='内容长度', null=True)), ('words', models.IntegerField(blank=True, help_text='响应体中单词数量(按空格分割)', null=True)), ('lines', models.IntegerField(blank=True, help_text='响应体行数(按换行符分割)', null=True)), ('content_type', models.CharField(blank=True, default='', help_text='响应头 Content-Type 值', max_length=200)), ('duration', models.BigIntegerField(blank=True, help_text='请求耗时(单位:纳秒)', null=True)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='directory_snapshots', to='scan.scan')), ], options={ 'verbose_name': '目录快照', 'verbose_name_plural': '目录快照', 'db_table': 'directory_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='directory_s_scan_id_c45900_idx'), models.Index(fields=['url'], name='directory_s_url_b4b72b_idx'), models.Index(fields=['status'], name='directory_s_status_e9f57e_idx'), models.Index(fields=['content_type'], name='directory_s_content_45e864_idx'), models.Index(fields=['-created_at'], name='directory_s_created_eb9d27_idx'), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='dir_snap_url_trgm', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('scan', 'url'), name='unique_directory_per_scan_snapshot')], }, ), migrations.CreateModel( name='Endpoint', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='最终访问的完整URL')), ('host', models.CharField(blank=True, default='', help_text='主机名(域名或IP地址)', max_length=253)), ('location', models.TextField(blank=True, default='', help_text='重定向地址(HTTP 3xx 响应头 Location)')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('title', models.TextField(blank=True, default='', help_text='网页标题(HTML 标签内容)')), ('webserver', models.TextField(blank=True, default='', help_text='服务器类型(HTTP 响应头 Server 值)')), ('response_body', models.TextField(blank=True, default='', help_text='HTTP响应体')), ('content_type', models.TextField(blank=True, default='', help_text='响应类型(HTTP Content-Type 响应头)')), ('tech', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='技术栈(服务器/框架/语言等)', size=None)), ('status_code', models.IntegerField(blank=True, help_text='HTTP状态码', null=True)), ('content_length', models.IntegerField(blank=True, help_text='响应体大小(单位字节)', null=True)), ('vhost', models.BooleanField(blank=True, help_text='是否支持虚拟主机', null=True)), ('matched_gf_patterns', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='匹配的GF模式列表,用于识别敏感端点(如api, debug, config等)', size=None)), ('response_headers', models.TextField(blank=True, default='', help_text='原始HTTP响应头')), ('target', models.ForeignKey(help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)', on_delete=django.db.models.deletion.CASCADE, related_name='endpoints', to='targets.target')), ], options={ 'verbose_name': '端点', 'verbose_name_plural': '端点', 'db_table': 'endpoint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='endpoint_created_44fe9c_idx'), models.Index(fields=['target'], name='endpoint_target__7f9065_idx'), models.Index(fields=['url'], name='endpoint_url_30f66e_idx'), models.Index(fields=['host'], name='endpoint_host_5b4cc8_idx'), models.Index(fields=['status_code'], name='endpoint_status__5d4fdd_idx'), models.Index(fields=['title'], name='endpoint_title_29e26c_idx'), django.contrib.postgres.indexes.GinIndex(fields=['tech'], name='endpoint_tech_2bfa7c_gin'), django.contrib.postgres.indexes.GinIndex(fields=['response_headers'], name='endpoint_resp_headers_trgm_idx', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='endpoint_url_trgm_idx', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['title'], name='endpoint_title_trgm_idx', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('url', 'target'), name='unique_endpoint_url_target')], }, ), migrations.CreateModel( name='EndpointSnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='端点URL')), ('host', models.CharField(blank=True, default='', help_text='主机名(域名或IP地址)', max_length=253)), ('title', models.TextField(blank=True, default='', help_text='页面标题')), ('status_code', models.IntegerField(blank=True, help_text='HTTP状态码', null=True)), ('content_length', models.IntegerField(blank=True, help_text='内容长度', null=True)), ('location', models.TextField(blank=True, default='', help_text='重定向位置')), ('webserver', models.TextField(blank=True, default='', help_text='Web服务器')), ('content_type', models.TextField(blank=True, default='', help_text='内容类型')), ('tech', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='技术栈', size=None)), ('response_body', models.TextField(blank=True, default='', help_text='HTTP响应体')), ('vhost', models.BooleanField(blank=True, help_text='虚拟主机标志', null=True)), ('matched_gf_patterns', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='匹配的GF模式列表', size=None)), ('response_headers', models.TextField(blank=True, default='', help_text='原始HTTP响应头')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='endpoint_snapshots', to='scan.scan')), ], options={ 'verbose_name': '端点快照', 'verbose_name_plural': '端点快照', 'db_table': 'endpoint_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='endpoint_sn_scan_id_6ac9a7_idx'), models.Index(fields=['url'], name='endpoint_sn_url_205160_idx'), models.Index(fields=['host'], name='endpoint_sn_host_577bfd_idx'), models.Index(fields=['title'], name='endpoint_sn_title_516a05_idx'), models.Index(fields=['status_code'], name='endpoint_sn_status__83efb0_idx'), models.Index(fields=['webserver'], name='endpoint_sn_webserv_66be83_idx'), models.Index(fields=['-created_at'], name='endpoint_sn_created_21fb5b_idx'), django.contrib.postgres.indexes.GinIndex(fields=['tech'], name='endpoint_sn_tech_0d0752_gin'), django.contrib.postgres.indexes.GinIndex(fields=['response_headers'], name='ep_snap_resp_hdr_trgm', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='ep_snap_url_trgm', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['title'], name='ep_snap_title_trgm', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('scan', 'url'), name='unique_endpoint_per_scan_snapshot')], }, ), migrations.CreateModel( name='HostPortMapping', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('host', models.CharField(help_text='主机名(域名或IP)', max_length=1000)), ('ip', models.GenericIPAddressField(help_text='IP地址')), ('port', models.IntegerField(help_text='端口号(1-65535)', validators=[django.core.validators.MinValueValidator(1, message='端口号必须大于等于1'), django.core.validators.MaxValueValidator(65535, message='端口号必须小于等于65535')])), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('target', models.ForeignKey(help_text='所属的扫描目标', on_delete=django.db.models.deletion.CASCADE, related_name='host_port_mappings', to='targets.target')), ], options={ 'verbose_name': '主机端口映射', 'verbose_name_plural': '主机端口映射', 'db_table': 'host_port_mapping', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['target'], name='host_port_m_target__943e9b_idx'), models.Index(fields=['host'], name='host_port_m_host_f78363_idx'), models.Index(fields=['ip'], name='host_port_m_ip_2e6f02_idx'), models.Index(fields=['port'], name='host_port_m_port_9fb9ff_idx'), models.Index(fields=['host', 'ip'], name='host_port_m_host_3ce245_idx'), models.Index(fields=['-created_at'], name='host_port_m_created_11cd22_idx')], 'constraints': [models.UniqueConstraint(fields=('target', 'host', 'ip', 'port'), name='unique_target_host_ip_port')], }, ), migrations.CreateModel( name='HostPortMappingSnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('host', models.CharField(help_text='主机名(域名或IP)', max_length=1000)), ('ip', models.GenericIPAddressField(help_text='IP地址')), ('port', models.IntegerField(help_text='端口号(1-65535)', validators=[django.core.validators.MinValueValidator(1, message='端口号必须大于等于1'), django.core.validators.MaxValueValidator(65535, message='端口号必须小于等于65535')])), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务(主关联)', on_delete=django.db.models.deletion.CASCADE, related_name='host_port_mapping_snapshots', to='scan.scan')), ], options={ 'verbose_name': '主机端口映射快照', 'verbose_name_plural': '主机端口映射快照', 'db_table': 'host_port_mapping_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='host_port_m_scan_id_50ba0b_idx'), models.Index(fields=['host'], name='host_port_m_host_e99054_idx'), models.Index(fields=['ip'], name='host_port_m_ip_54818c_idx'), models.Index(fields=['port'], name='host_port_m_port_ed7b48_idx'), models.Index(fields=['host', 'ip'], name='host_port_m_host_8a463a_idx'), models.Index(fields=['scan', 'host'], name='host_port_m_scan_id_426fdb_idx'), models.Index(fields=['-created_at'], name='host_port_m_created_fb28b8_idx')], 'constraints': [models.UniqueConstraint(fields=('scan', 'host', 'ip', 'port'), name='unique_scan_host_ip_port_snapshot')], }, ), migrations.CreateModel( name='Subdomain', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(help_text='子域名名称', max_length=1000)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('target', models.ForeignKey(help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)', on_delete=django.db.models.deletion.CASCADE, related_name='subdomains', to='targets.target')), ], options={ 'verbose_name': '子域名', 'verbose_name_plural': '子域名', 'db_table': 'subdomain', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='subdomain_created_e187a8_idx'), models.Index(fields=['name', 'target'], name='subdomain_name_60e1d0_idx'), models.Index(fields=['target'], name='subdomain_target__e409f0_idx'), models.Index(fields=['name'], name='subdomain_name_d40ba7_idx'), django.contrib.postgres.indexes.GinIndex(fields=['name'], name='subdomain_name_trgm_idx', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('name', 'target'), name='unique_subdomain_name_target')], }, ), migrations.CreateModel( name='SubdomainSnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(help_text='子域名名称', max_length=1000)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='subdomain_snapshots', to='scan.scan')), ], options={ 'verbose_name': '子域名快照', 'verbose_name_plural': '子域名快照', 'db_table': 'subdomain_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='subdomain_s_scan_id_68c253_idx'), models.Index(fields=['name'], name='subdomain_s_name_2da42b_idx'), models.Index(fields=['-created_at'], name='subdomain_s_created_d2b48e_idx'), django.contrib.postgres.indexes.GinIndex(fields=['name'], name='subdomain_snap_name_trgm', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('scan', 'name'), name='unique_subdomain_per_scan_snapshot')], }, ), migrations.CreateModel( name='Vulnerability', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.CharField(help_text='漏洞所在的URL', max_length=2000)), ('vuln_type', models.CharField(help_text='漏洞类型(如 xss, sqli)', max_length=100)), ('severity', models.CharField(choices=[('unknown', '未知'), ('info', '信息'), ('low', '低'), ('medium', '中'), ('high', '高'), ('critical', '危急')], default='unknown', help_text='严重性(未知/信息/低/中/高/危急)', max_length=20)), ('source', models.CharField(blank=True, default='', help_text='来源工具(如 dalfox, nuclei, crlfuzz)', max_length=50)), ('cvss_score', models.DecimalField(blank=True, decimal_places=1, help_text='CVSS 评分(0.0-10.0)', max_digits=3, null=True)), ('description', models.TextField(blank=True, default='', help_text='漏洞描述')), ('raw_output', models.JSONField(blank=True, default=dict, help_text='工具原始输出')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('target', models.ForeignKey(help_text='所属的扫描目标', on_delete=django.db.models.deletion.CASCADE, related_name='vulnerabilities', to='targets.target')), ], options={ 'verbose_name': '漏洞', 'verbose_name_plural': '漏洞', 'db_table': 'vulnerability', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['target'], name='vulnerabili_target__755a02_idx'), models.Index(fields=['vuln_type'], name='vulnerabili_vuln_ty_3010cd_idx'), models.Index(fields=['severity'], name='vulnerabili_severit_1a798b_idx'), models.Index(fields=['source'], name='vulnerabili_source_7c7552_idx'), models.Index(fields=['url'], name='vulnerabili_url_4dcc4d_idx'), models.Index(fields=['-created_at'], name='vulnerabili_created_e25ff7_idx')], }, ), migrations.CreateModel( name='VulnerabilitySnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.CharField(help_text='漏洞所在的URL', max_length=2000)), ('vuln_type', models.CharField(help_text='漏洞类型(如 xss, sqli)', max_length=100)), ('severity', models.CharField(choices=[('unknown', '未知'), ('info', '信息'), ('low', '低'), ('medium', '中'), ('high', '高'), ('critical', '危急')], default='unknown', help_text='严重性(未知/信息/低/中/高/危急)', max_length=20)), ('source', models.CharField(blank=True, default='', help_text='来源工具(如 dalfox, nuclei, crlfuzz)', max_length=50)), ('cvss_score', models.DecimalField(blank=True, decimal_places=1, help_text='CVSS 评分(0.0-10.0)', max_digits=3, null=True)), ('description', models.TextField(blank=True, default='', help_text='漏洞描述')), ('raw_output', models.JSONField(blank=True, default=dict, help_text='工具原始输出')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='vulnerability_snapshots', to='scan.scan')), ], options={ 'verbose_name': '漏洞快照', 'verbose_name_plural': '漏洞快照', 'db_table': 'vulnerability_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='vulnerabili_scan_id_7b81c9_idx'), models.Index(fields=['url'], name='vulnerabili_url_11a707_idx'), models.Index(fields=['vuln_type'], name='vulnerabili_vuln_ty_6b90ee_idx'), models.Index(fields=['severity'], name='vulnerabili_severit_4eae0d_idx'), models.Index(fields=['source'], name='vulnerabili_source_968b1f_idx'), models.Index(fields=['-created_at'], name='vulnerabili_created_53a12e_idx')], }, ), migrations.CreateModel( name='WebSite', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='最终访问的完整URL')), ('host', models.CharField(blank=True, default='', help_text='主机名(域名或IP地址)', max_length=253)), ('location', models.TextField(blank=True, default='', help_text='重定向地址(HTTP 3xx 响应头 Location)')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('title', models.TextField(blank=True, default='', help_text='网页标题(HTML <title> 标签内容)')), ('webserver', models.TextField(blank=True, default='', help_text='服务器类型(HTTP 响应头 Server 值)')), ('response_body', models.TextField(blank=True, default='', help_text='HTTP响应体')), ('content_type', models.TextField(blank=True, default='', help_text='响应类型(HTTP Content-Type 响应头)')), ('tech', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='技术栈(服务器/框架/语言等)', size=None)), ('status_code', models.IntegerField(blank=True, help_text='HTTP状态码', null=True)), ('content_length', models.IntegerField(blank=True, help_text='响应体大小(单位字节)', null=True)), ('vhost', models.BooleanField(blank=True, help_text='是否支持虚拟主机', null=True)), ('response_headers', models.TextField(blank=True, default='', help_text='原始HTTP响应头')), ('target', models.ForeignKey(help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)', on_delete=django.db.models.deletion.CASCADE, related_name='websites', to='targets.target')), ], options={ 'verbose_name': '站点', 'verbose_name_plural': '站点', 'db_table': 'website', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='website_created_c9cfd2_idx'), models.Index(fields=['url'], name='website_url_b18883_idx'), models.Index(fields=['host'], name='website_host_996b50_idx'), models.Index(fields=['target'], name='website_target__2a353b_idx'), models.Index(fields=['title'], name='website_title_c2775b_idx'), models.Index(fields=['status_code'], name='website_status__51663d_idx'), django.contrib.postgres.indexes.GinIndex(fields=['tech'], name='website_tech_e3f0cb_gin'), django.contrib.postgres.indexes.GinIndex(fields=['response_headers'], name='website_resp_headers_trgm_idx', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='website_url_trgm_idx', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['title'], name='website_title_trgm_idx', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('url', 'target'), name='unique_website_url_target')], }, ), migrations.CreateModel( name='WebsiteSnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='站点URL')), ('host', models.CharField(blank=True, default='', help_text='主机名(域名或IP地址)', max_length=253)), ('title', models.TextField(blank=True, default='', help_text='页面标题')), ('status_code', models.IntegerField(blank=True, help_text='HTTP状态码', null=True)), ('content_length', models.BigIntegerField(blank=True, help_text='内容长度', null=True)), ('location', models.TextField(blank=True, default='', help_text='重定向位置')), ('webserver', models.TextField(blank=True, default='', help_text='Web服务器')), ('content_type', models.TextField(blank=True, default='', help_text='内容类型')), ('tech', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='技术栈', size=None)), ('response_body', models.TextField(blank=True, default='', help_text='HTTP响应体')), ('vhost', models.BooleanField(blank=True, help_text='虚拟主机标志', null=True)), ('response_headers', models.TextField(blank=True, default='', help_text='原始HTTP响应头')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='website_snapshots', to='scan.scan')), ], options={ 'verbose_name': '网站快照', 'verbose_name_plural': '网站快照', 'db_table': 'website_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='website_sna_scan_id_26b6dc_idx'), models.Index(fields=['url'], name='website_sna_url_801a70_idx'), models.Index(fields=['host'], name='website_sna_host_348fe1_idx'), models.Index(fields=['title'], name='website_sna_title_b1a5ee_idx'), models.Index(fields=['-created_at'], name='website_sna_created_2c149a_idx'), django.contrib.postgres.indexes.GinIndex(fields=['tech'], name='website_sna_tech_3d6d2f_gin'), django.contrib.postgres.indexes.GinIndex(fields=['response_headers'], name='ws_snap_resp_hdr_trgm', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['url'], name='ws_snap_url_trgm', opclasses=['gin_trgm_ops']), django.contrib.postgres.indexes.GinIndex(fields=['title'], name='ws_snap_title_trgm', opclasses=['gin_trgm_ops'])], 'constraints': [models.UniqueConstraint(fields=('scan', 'url'), name='unique_website_per_scan_snapshot')], }, ), ] ================================================ FILE: backend/apps/asset/migrations/0002_create_search_views.py ================================================ """ 创建资产搜索物化视图(使用 pg_ivm 增量维护) 这些视图用于资产搜索功能,提供高性能的全文搜索能力。 """ from django.db import migrations class Migration(migrations.Migration): """创建资产搜索所需的增量物化视图""" dependencies = [ ('asset', '0001_initial'), ] operations = [ # 1. 确保 pg_ivm 扩展已安装 migrations.RunSQL( sql="CREATE EXTENSION IF NOT EXISTS pg_ivm;", reverse_sql="DROP EXTENSION IF EXISTS pg_ivm;", ), # 2. 创建 Website 搜索视图 # 注意:pg_ivm 不支持 ArrayField,所以 tech 字段需要从原表 JOIN 获取 migrations.RunSQL( sql=""" SELECT pgivm.create_immv('asset_search_view', $$ SELECT w.id, w.url, w.host, w.title, w.status_code, w.response_headers, w.response_body, w.content_type, w.content_length, w.webserver, w.location, w.vhost, w.created_at, w.target_id FROM website w $$); """, reverse_sql="DROP TABLE IF EXISTS asset_search_view CASCADE;", ), # 3. 创建 Endpoint 搜索视图 migrations.RunSQL( sql=""" SELECT pgivm.create_immv('endpoint_search_view', $$ SELECT e.id, e.url, e.host, e.title, e.status_code, e.response_headers, e.response_body, e.content_type, e.content_length, e.webserver, e.location, e.vhost, e.created_at, e.target_id FROM endpoint e $$); """, reverse_sql="DROP TABLE IF EXISTS endpoint_search_view CASCADE;", ), # 4. 为搜索视图创建索引(加速查询) migrations.RunSQL( sql=[ # Website 搜索视图索引 "CREATE INDEX IF NOT EXISTS asset_search_view_host_idx ON asset_search_view (host);", "CREATE INDEX IF NOT EXISTS asset_search_view_url_idx ON asset_search_view (url);", "CREATE INDEX IF NOT EXISTS asset_search_view_title_idx ON asset_search_view (title);", "CREATE INDEX IF NOT EXISTS asset_search_view_status_idx ON asset_search_view (status_code);", "CREATE INDEX IF NOT EXISTS asset_search_view_created_idx ON asset_search_view (created_at DESC);", # Endpoint 搜索视图索引 "CREATE INDEX IF NOT EXISTS endpoint_search_view_host_idx ON endpoint_search_view (host);", "CREATE INDEX IF NOT EXISTS endpoint_search_view_url_idx ON endpoint_search_view (url);", "CREATE INDEX IF NOT EXISTS endpoint_search_view_title_idx ON endpoint_search_view (title);", "CREATE INDEX IF NOT EXISTS endpoint_search_view_status_idx ON endpoint_search_view (status_code);", "CREATE INDEX IF NOT EXISTS endpoint_search_view_created_idx ON endpoint_search_view (created_at DESC);", ], reverse_sql=[ "DROP INDEX IF EXISTS asset_search_view_host_idx;", "DROP INDEX IF EXISTS asset_search_view_url_idx;", "DROP INDEX IF EXISTS asset_search_view_title_idx;", "DROP INDEX IF EXISTS asset_search_view_status_idx;", "DROP INDEX IF EXISTS asset_search_view_created_idx;", "DROP INDEX IF EXISTS endpoint_search_view_host_idx;", "DROP INDEX IF EXISTS endpoint_search_view_url_idx;", "DROP INDEX IF EXISTS endpoint_search_view_title_idx;", "DROP INDEX IF EXISTS endpoint_search_view_status_idx;", "DROP INDEX IF EXISTS endpoint_search_view_created_idx;", ], ), ] ================================================ FILE: backend/apps/asset/migrations/0003_add_screenshot_models.py ================================================ # Generated by Django 5.2.7 on 2026-01-07 02:21 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('asset', '0002_create_search_views'), ('scan', '0001_initial'), ('targets', '0001_initial'), ] operations = [ migrations.CreateModel( name='Screenshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='截图对应的 URL')), ('image', models.BinaryField(help_text='截图 WebP 二进制数据(压缩后)')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ('target', models.ForeignKey(help_text='所属目标', on_delete=django.db.models.deletion.CASCADE, related_name='screenshots', to='targets.target')), ], options={ 'verbose_name': '截图', 'verbose_name_plural': '截图', 'db_table': 'screenshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['target'], name='screenshot_target__2f01f6_idx'), models.Index(fields=['-created_at'], name='screenshot_created_c0ad4b_idx')], 'constraints': [models.UniqueConstraint(fields=('target', 'url'), name='unique_screenshot_per_target')], }, ), migrations.CreateModel( name='ScreenshotSnapshot', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('url', models.TextField(help_text='截图对应的 URL')), ('image', models.BinaryField(help_text='截图 WebP 二进制数据(压缩后)')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='所属的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='screenshot_snapshots', to='scan.scan')), ], options={ 'verbose_name': '截图快照', 'verbose_name_plural': '截图快照', 'db_table': 'screenshot_snapshot', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scan'], name='screenshot__scan_id_fb8c4d_idx'), models.Index(fields=['-created_at'], name='screenshot__created_804117_idx')], 'constraints': [models.UniqueConstraint(fields=('scan', 'url'), name='unique_screenshot_per_scan_snapshot')], }, ), ] ================================================ FILE: backend/apps/asset/migrations/0004_add_status_code_to_screenshot.py ================================================ # Generated by Django 5.2.7 on 2026-01-07 13:29 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('asset', '0003_add_screenshot_models'), ] operations = [ migrations.AddField( model_name='screenshot', name='status_code', field=models.SmallIntegerField(blank=True, help_text='HTTP 响应状态码', null=True), ), migrations.AddField( model_name='screenshotsnapshot', name='status_code', field=models.SmallIntegerField(blank=True, help_text='HTTP 响应状态码', null=True), ), ] ================================================ FILE: backend/apps/asset/migrations/__init__.py ================================================ ================================================ FILE: backend/apps/asset/models/__init__.py ================================================ # 导入所有模型,确保Django能发现它们 # 业务模型 from .asset_models import ( Subdomain, WebSite, Endpoint, Directory, HostPortMapping, Vulnerability, ) # 快照模型 from .snapshot_models import ( SubdomainSnapshot, WebsiteSnapshot, DirectorySnapshot, HostPortMappingSnapshot, EndpointSnapshot, VulnerabilitySnapshot, ) # 截图模型 from .screenshot_models import ( Screenshot, ScreenshotSnapshot, ) # 统计模型 from .statistics_models import AssetStatistics, StatisticsHistory # 导出所有模型供外部导入 __all__ = [ # 业务模型 'Subdomain', 'WebSite', 'Endpoint', 'Directory', 'HostPortMapping', 'Vulnerability', # 快照模型 'SubdomainSnapshot', 'WebsiteSnapshot', 'DirectorySnapshot', 'HostPortMappingSnapshot', 'EndpointSnapshot', 'VulnerabilitySnapshot', # 截图模型 'Screenshot', 'ScreenshotSnapshot', # 统计模型 'AssetStatistics', 'StatisticsHistory', ] ================================================ FILE: backend/apps/asset/models/asset_models.py ================================================ from django.db import models from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.indexes import GinIndex from django.core.validators import MinValueValidator, MaxValueValidator class Subdomain(models.Model): """ 子域名模型(纯资产表) 设计特点: - 只存储子域名资产信息 - 与其他资产表(IPAddress、Port)无直接关联 - 扫描历史记录存储在 SubdomainSnapshot 快照表中 """ id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', # 使用字符串引用避免循环导入 on_delete=models.CASCADE, related_name='subdomains', help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)' ) name = models.CharField(max_length=1000, help_text='子域名名称') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'subdomain' verbose_name = '子域名' verbose_name_plural = '子域名' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['name', 'target']), # 复合索引,优化 get_by_names_and_target_id 批量查询 models.Index(fields=['target']), # 优化从target_id快速查找下面的子域名 models.Index(fields=['name']), # 优化从name快速查找子域名,搜索场景 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='subdomain_name_trgm_idx', fields=['name'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 普通唯一约束:name + target 组合唯一 models.UniqueConstraint( fields=['name', 'target'], name='unique_subdomain_name_target' ) ] def __str__(self): return str(self.name or f'Subdomain {self.id}') class Endpoint(models.Model): """端点模型""" id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', # 使用字符串引用 on_delete=models.CASCADE, related_name='endpoints', help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)' ) url = models.TextField(help_text='最终访问的完整URL') host = models.CharField( max_length=253, blank=True, default='', help_text='主机名(域名或IP地址)' ) location = models.TextField( blank=True, default='', help_text='重定向地址(HTTP 3xx 响应头 Location)' ) created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') title = models.TextField( blank=True, default='', help_text='网页标题(HTML <title> 标签内容)' ) webserver = models.TextField( blank=True, default='', help_text='服务器类型(HTTP 响应头 Server 值)' ) response_body = models.TextField( blank=True, default='', help_text='HTTP响应体' ) content_type = models.TextField( blank=True, default='', help_text='响应类型(HTTP Content-Type 响应头)' ) tech = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='技术栈(服务器/框架/语言等)' ) status_code = models.IntegerField( null=True, blank=True, help_text='HTTP状态码' ) content_length = models.IntegerField( null=True, blank=True, help_text='响应体大小(单位字节)' ) vhost = models.BooleanField( null=True, blank=True, help_text='是否支持虚拟主机' ) matched_gf_patterns = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='匹配的GF模式列表,用于识别敏感端点(如api, debug, config等)' ) response_headers = models.TextField( blank=True, default='', help_text='原始HTTP响应头' ) class Meta: db_table = 'endpoint' verbose_name = '端点' verbose_name_plural = '端点' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['target']), # 优化从 target_id快速查找下面的端点(主关联字段) models.Index(fields=['url']), # URL索引,优化查询性能 models.Index(fields=['host']), # host索引,优化根据主机名查询 models.Index(fields=['status_code']), # 状态码索引,优化筛选 models.Index(fields=['title']), # title索引,优化智能过滤搜索 GinIndex(fields=['tech']), # GIN索引,优化 tech 数组字段的 __contains 查询 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='endpoint_resp_headers_trgm_idx', fields=['response_headers'], opclasses=['gin_trgm_ops'] ), GinIndex( name='endpoint_url_trgm_idx', fields=['url'], opclasses=['gin_trgm_ops'] ), GinIndex( name='endpoint_title_trgm_idx', fields=['title'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 普通唯一约束:url + target 组合唯一 models.UniqueConstraint( fields=['url', 'target'], name='unique_endpoint_url_target' ) ] def __str__(self): return str(self.url or f'Endpoint {self.id}') class WebSite(models.Model): """站点模型""" id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', # 使用字符串引用 on_delete=models.CASCADE, related_name='websites', help_text='所属的扫描目标(主关联字段,表示所属关系,不能为空)' ) url = models.TextField(help_text='最终访问的完整URL') host = models.CharField( max_length=253, blank=True, default='', help_text='主机名(域名或IP地址)' ) location = models.TextField( blank=True, default='', help_text='重定向地址(HTTP 3xx 响应头 Location)' ) created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') title = models.TextField( blank=True, default='', help_text='网页标题(HTML <title> 标签内容)' ) webserver = models.TextField( blank=True, default='', help_text='服务器类型(HTTP 响应头 Server 值)' ) response_body = models.TextField( blank=True, default='', help_text='HTTP响应体' ) content_type = models.TextField( blank=True, default='', help_text='响应类型(HTTP Content-Type 响应头)' ) tech = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='技术栈(服务器/框架/语言等)' ) status_code = models.IntegerField( null=True, blank=True, help_text='HTTP状态码' ) content_length = models.IntegerField( null=True, blank=True, help_text='响应体大小(单位字节)' ) vhost = models.BooleanField( null=True, blank=True, help_text='是否支持虚拟主机' ) response_headers = models.TextField( blank=True, default='', help_text='原始HTTP响应头' ) class Meta: db_table = 'website' verbose_name = '站点' verbose_name_plural = '站点' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['url']), # URL索引,优化查询性能 models.Index(fields=['host']), # host索引,优化根据主机名查询 models.Index(fields=['target']), # 优化从 target_id快速查找下面的站点 models.Index(fields=['title']), # title索引,优化智能过滤搜索 models.Index(fields=['status_code']), # 状态码索引,优化智能过滤搜索 GinIndex(fields=['tech']), # GIN索引,优化 tech 数组字段的 __contains 查询 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='website_resp_headers_trgm_idx', fields=['response_headers'], opclasses=['gin_trgm_ops'] ), GinIndex( name='website_url_trgm_idx', fields=['url'], opclasses=['gin_trgm_ops'] ), GinIndex( name='website_title_trgm_idx', fields=['title'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 普通唯一约束:url + target 组合唯一 models.UniqueConstraint( fields=['url', 'target'], name='unique_website_url_target' ) ] def __str__(self): return str(self.url or f'Website {self.id}') class Directory(models.Model): """ 目录模型 """ id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, related_name='directories', help_text='所属的扫描目标' ) url = models.CharField( null=False, blank=False, max_length=2000, help_text='完整请求 URL' ) status = models.IntegerField( null=True, blank=True, help_text='HTTP 响应状态码' ) content_length = models.BigIntegerField( null=True, blank=True, help_text='响应体字节大小(Content-Length 或实际长度)' ) words = models.IntegerField( null=True, blank=True, help_text='响应体中单词数量(按空格分割)' ) lines = models.IntegerField( null=True, blank=True, help_text='响应体行数(按换行符分割)' ) content_type = models.CharField( max_length=200, blank=True, default='', help_text='响应头 Content-Type 值' ) duration = models.BigIntegerField( null=True, blank=True, help_text='请求耗时(单位:纳秒)' ) created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'directory' verbose_name = '目录' verbose_name_plural = '目录' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['target']), # 优化从target_id快速查找下面的目录 models.Index(fields=['url']), # URL索引,优化搜索和唯一约束 models.Index(fields=['status']), # 状态码索引,优化筛选 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='directory_url_trgm_idx', fields=['url'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 普通唯一约束:target + url 组合唯一 models.UniqueConstraint( fields=['target', 'url'], name='unique_directory_url_target' ), ] def __str__(self): return str(self.url or f'Directory {self.id}') class HostPortMapping(models.Model): """ 主机端口映射表 设计特点: - 存储主机(host)、IP、端口的三元映射关系 - 只关联 target_id,不关联其他资产表 - target + host + ip + port 组成复合唯一约束 """ id = models.AutoField(primary_key=True) # ==================== 关联字段 ==================== target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, related_name='host_port_mappings', help_text='所属的扫描目标' ) # ==================== 核心字段 ==================== host = models.CharField( max_length=1000, blank=False, help_text='主机名(域名或IP)' ) ip = models.GenericIPAddressField( blank=False, help_text='IP地址' ) port = models.IntegerField( blank=False, validators=[ MinValueValidator(1, message='端口号必须大于等于1'), MaxValueValidator(65535, message='端口号必须小于等于65535') ], help_text='端口号(1-65535)' ) # ==================== 时间字段 ==================== created_at = models.DateTimeField( auto_now_add=True, help_text='创建时间' ) class Meta: db_table = 'host_port_mapping' verbose_name = '主机端口映射' verbose_name_plural = '主机端口映射' ordering = ['-created_at'] indexes = [ models.Index(fields=['target']), # 优化按目标查询 models.Index(fields=['host']), # 优化按主机名查询 models.Index(fields=['ip']), # 优化按IP查询 models.Index(fields=['port']), # 优化按端口查询 models.Index(fields=['host', 'ip']), # 优化组合查询 models.Index(fields=['-created_at']), # 优化时间排序 ] constraints = [ # 复合唯一约束:target + host + ip + port 组合唯一 models.UniqueConstraint( fields=['target', 'host', 'ip', 'port'], name='unique_target_host_ip_port' ), ] def __str__(self): return f'{self.host} ({self.ip}:{self.port})' class Vulnerability(models.Model): """ 漏洞模型(资产表) 存储发现的漏洞资产,与 Target 关联。 扫描历史记录存储在 VulnerabilitySnapshot 快照表中。 """ # 延迟导入避免循环引用 from apps.common.definitions import VulnSeverity id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, related_name='vulnerabilities', help_text='所属的扫描目标' ) # ==================== 核心字段 ==================== url = models.CharField(max_length=2000, help_text='漏洞所在的URL') vuln_type = models.CharField(max_length=100, help_text='漏洞类型(如 xss, sqli)') severity = models.CharField( max_length=20, choices=VulnSeverity.choices, default=VulnSeverity.UNKNOWN, help_text='严重性(未知/信息/低/中/高/危急)' ) source = models.CharField(max_length=50, blank=True, default='', help_text='来源工具(如 dalfox, nuclei, crlfuzz)') cvss_score = models.DecimalField(max_digits=3, decimal_places=1, null=True, blank=True, help_text='CVSS 评分(0.0-10.0)') description = models.TextField(blank=True, default='', help_text='漏洞描述') raw_output = models.JSONField(blank=True, default=dict, help_text='工具原始输出') # ==================== 时间字段 ==================== created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'vulnerability' verbose_name = '漏洞' verbose_name_plural = '漏洞' ordering = ['-created_at'] indexes = [ models.Index(fields=['target']), models.Index(fields=['vuln_type']), models.Index(fields=['severity']), models.Index(fields=['source']), models.Index(fields=['url']), # url索引,优化智能过滤搜索 models.Index(fields=['-created_at']), ] def __str__(self): return f'{self.vuln_type} - {self.url[:50]}' ================================================ FILE: backend/apps/asset/models/screenshot_models.py ================================================ from django.db import models class ScreenshotSnapshot(models.Model): """ 截图快照 记录:某次扫描中捕获的网站截图 """ id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='screenshot_snapshots', help_text='所属的扫描任务' ) url = models.TextField(help_text='截图对应的 URL') status_code = models.SmallIntegerField(null=True, blank=True, help_text='HTTP 响应状态码') image = models.BinaryField(help_text='截图 WebP 二进制数据(压缩后)') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'screenshot_snapshot' verbose_name = '截图快照' verbose_name_plural = '截图快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['-created_at']), ] constraints = [ models.UniqueConstraint( fields=['scan', 'url'], name='unique_screenshot_per_scan_snapshot' ), ] def __str__(self): return f'{self.url} (Scan #{self.scan_id})' class Screenshot(models.Model): """ 截图资产 存储:目标的最新截图(从快照同步) """ id = models.AutoField(primary_key=True) target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, related_name='screenshots', help_text='所属目标' ) url = models.TextField(help_text='截图对应的 URL') status_code = models.SmallIntegerField(null=True, blank=True, help_text='HTTP 响应状态码') image = models.BinaryField(help_text='截图 WebP 二进制数据(压缩后)') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') updated_at = models.DateTimeField(auto_now=True, help_text='更新时间') class Meta: db_table = 'screenshot' verbose_name = '截图' verbose_name_plural = '截图' ordering = ['-created_at'] indexes = [ models.Index(fields=['target']), models.Index(fields=['-created_at']), ] constraints = [ models.UniqueConstraint( fields=['target', 'url'], name='unique_screenshot_per_target' ), ] def __str__(self): return f'{self.url} (Target #{self.target_id})' ================================================ FILE: backend/apps/asset/models/snapshot_models.py ================================================ from django.db import models from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.indexes import GinIndex from django.core.validators import MinValueValidator, MaxValueValidator class SubdomainSnapshot(models.Model): """子域名快照""" id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='subdomain_snapshots', help_text='所属的扫描任务' ) name = models.CharField(max_length=1000, help_text='子域名名称') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'subdomain_snapshot' verbose_name = '子域名快照' verbose_name_plural = '子域名快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['name']), models.Index(fields=['-created_at']), # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='subdomain_snap_name_trgm', fields=['name'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 唯一约束:同一次扫描中,同一个子域名只能记录一次 models.UniqueConstraint( fields=['scan', 'name'], name='unique_subdomain_per_scan_snapshot' ), ] def __str__(self): return f'{self.name} (Scan #{self.scan_id})' class WebsiteSnapshot(models.Model): """ 网站快照 记录:某次扫描中发现的网站 """ id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='website_snapshots', help_text='所属的扫描任务' ) # 扫描结果数据 url = models.TextField(help_text='站点URL') host = models.CharField(max_length=253, blank=True, default='', help_text='主机名(域名或IP地址)') title = models.TextField(blank=True, default='', help_text='页面标题') status_code = models.IntegerField(null=True, blank=True, help_text='HTTP状态码') content_length = models.BigIntegerField(null=True, blank=True, help_text='内容长度') location = models.TextField(blank=True, default='', help_text='重定向位置') webserver = models.TextField(blank=True, default='', help_text='Web服务器') content_type = models.TextField(blank=True, default='', help_text='内容类型') tech = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='技术栈' ) response_body = models.TextField(blank=True, default='', help_text='HTTP响应体') vhost = models.BooleanField(null=True, blank=True, help_text='虚拟主机标志') response_headers = models.TextField( blank=True, default='', help_text='原始HTTP响应头' ) created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'website_snapshot' verbose_name = '网站快照' verbose_name_plural = '网站快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['url']), models.Index(fields=['host']), # host索引,优化根据主机名查询 models.Index(fields=['title']), # title索引,优化标题搜索 models.Index(fields=['-created_at']), GinIndex(fields=['tech']), # GIN索引,优化数组字段查询 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='ws_snap_resp_hdr_trgm', fields=['response_headers'], opclasses=['gin_trgm_ops'] ), GinIndex( name='ws_snap_url_trgm', fields=['url'], opclasses=['gin_trgm_ops'] ), GinIndex( name='ws_snap_title_trgm', fields=['title'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 唯一约束:同一次扫描中,同一个URL只能记录一次 models.UniqueConstraint( fields=['scan', 'url'], name='unique_website_per_scan_snapshot' ), ] def __str__(self): return f'{self.url} (Scan #{self.scan_id})' class DirectorySnapshot(models.Model): """ 目录快照 记录:某次扫描中发现的目录 """ id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='directory_snapshots', help_text='所属的扫描任务' ) # 扫描结果数据 url = models.CharField(max_length=2000, help_text='目录URL') status = models.IntegerField(null=True, blank=True, help_text='HTTP状态码') content_length = models.BigIntegerField(null=True, blank=True, help_text='内容长度') words = models.IntegerField(null=True, blank=True, help_text='响应体中单词数量(按空格分割)') lines = models.IntegerField(null=True, blank=True, help_text='响应体行数(按换行符分割)') content_type = models.CharField(max_length=200, blank=True, default='', help_text='响应头 Content-Type 值') duration = models.BigIntegerField(null=True, blank=True, help_text='请求耗时(单位:纳秒)') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'directory_snapshot' verbose_name = '目录快照' verbose_name_plural = '目录快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['url']), models.Index(fields=['status']), # 状态码索引,优化筛选 models.Index(fields=['content_type']), # content_type索引,优化内容类型搜索 models.Index(fields=['-created_at']), # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='dir_snap_url_trgm', fields=['url'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 唯一约束:同一次扫描中,同一个目录URL只能记录一次 models.UniqueConstraint( fields=['scan', 'url'], name='unique_directory_per_scan_snapshot' ), ] def __str__(self): return f'{self.url} (Scan #{self.scan_id})' class HostPortMappingSnapshot(models.Model): """ 主机端口映射快照表 设计特点: - 存储某次扫描中发现的主机(host)、IP、端口的三元映射关系 - 主关联 scan_id,记录扫描历史 - scan + host + ip + port 组成复合唯一约束 """ id = models.AutoField(primary_key=True) # ==================== 关联字段 ==================== scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='host_port_mapping_snapshots', help_text='所属的扫描任务(主关联)' ) # ==================== 核心字段 ==================== host = models.CharField( max_length=1000, blank=False, help_text='主机名(域名或IP)' ) ip = models.GenericIPAddressField( blank=False, help_text='IP地址' ) port = models.IntegerField( blank=False, validators=[ MinValueValidator(1, message='端口号必须大于等于1'), MaxValueValidator(65535, message='端口号必须小于等于65535') ], help_text='端口号(1-65535)' ) # ==================== 时间字段 ==================== created_at = models.DateTimeField( auto_now_add=True, help_text='创建时间' ) class Meta: db_table = 'host_port_mapping_snapshot' verbose_name = '主机端口映射快照' verbose_name_plural = '主机端口映射快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), # 优化按扫描查询 models.Index(fields=['host']), # 优化按主机名查询 models.Index(fields=['ip']), # 优化按IP查询 models.Index(fields=['port']), # 优化按端口查询 models.Index(fields=['host', 'ip']), # 优化组合查询 models.Index(fields=['scan', 'host']), # 优化扫描+主机查询 models.Index(fields=['-created_at']), # 优化时间排序 ] constraints = [ # 复合唯一约束:同一次扫描中,scan + host + ip + port 组合唯一 models.UniqueConstraint( fields=['scan', 'host', 'ip', 'port'], name='unique_scan_host_ip_port_snapshot' ), ] def __str__(self): return f'{self.host} ({self.ip}:{self.port}) [Scan #{self.scan_id}]' class EndpointSnapshot(models.Model): """ 端点快照 记录:某次扫描中发现的端点 """ id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='endpoint_snapshots', help_text='所属的扫描任务' ) # 扫描结果数据 url = models.TextField(help_text='端点URL') host = models.CharField( max_length=253, blank=True, default='', help_text='主机名(域名或IP地址)' ) title = models.TextField(blank=True, default='', help_text='页面标题') status_code = models.IntegerField(null=True, blank=True, help_text='HTTP状态码') content_length = models.IntegerField(null=True, blank=True, help_text='内容长度') location = models.TextField(blank=True, default='', help_text='重定向位置') webserver = models.TextField(blank=True, default='', help_text='Web服务器') content_type = models.TextField(blank=True, default='', help_text='内容类型') tech = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='技术栈' ) response_body = models.TextField(blank=True, default='', help_text='HTTP响应体') vhost = models.BooleanField(null=True, blank=True, help_text='虚拟主机标志') matched_gf_patterns = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='匹配的GF模式列表' ) response_headers = models.TextField( blank=True, default='', help_text='原始HTTP响应头' ) created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'endpoint_snapshot' verbose_name = '端点快照' verbose_name_plural = '端点快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['url']), models.Index(fields=['host']), # host索引,优化根据主机名查询 models.Index(fields=['title']), # title索引,优化标题搜索 models.Index(fields=['status_code']), # 状态码索引,优化筛选 models.Index(fields=['webserver']), # webserver索引,优化服务器搜索 models.Index(fields=['-created_at']), GinIndex(fields=['tech']), # GIN索引,优化数组字段查询 # pg_trgm GIN 索引,支持 LIKE '%keyword%' 模糊搜索 GinIndex( name='ep_snap_resp_hdr_trgm', fields=['response_headers'], opclasses=['gin_trgm_ops'] ), GinIndex( name='ep_snap_url_trgm', fields=['url'], opclasses=['gin_trgm_ops'] ), GinIndex( name='ep_snap_title_trgm', fields=['title'], opclasses=['gin_trgm_ops'] ), ] constraints = [ # 唯一约束:同一次扫描中,同一个URL只能记录一次 models.UniqueConstraint( fields=['scan', 'url'], name='unique_endpoint_per_scan_snapshot' ), ] def __str__(self): return f'{self.url} (Scan #{self.scan_id})' class VulnerabilitySnapshot(models.Model): """ 漏洞快照 记录:某次扫描中发现的漏洞 """ # 延迟导入避免循环引用 from apps.common.definitions import VulnSeverity id = models.AutoField(primary_key=True) scan = models.ForeignKey( 'scan.Scan', on_delete=models.CASCADE, related_name='vulnerability_snapshots', help_text='所属的扫描任务' ) # ==================== 核心字段 ==================== url = models.CharField(max_length=2000, help_text='漏洞所在的URL') vuln_type = models.CharField(max_length=100, help_text='漏洞类型(如 xss, sqli)') severity = models.CharField( max_length=20, choices=VulnSeverity.choices, default=VulnSeverity.UNKNOWN, help_text='严重性(未知/信息/低/中/高/危急)' ) source = models.CharField(max_length=50, blank=True, default='', help_text='来源工具(如 dalfox, nuclei, crlfuzz)') cvss_score = models.DecimalField(max_digits=3, decimal_places=1, null=True, blank=True, help_text='CVSS 评分(0.0-10.0)') description = models.TextField(blank=True, default='', help_text='漏洞描述') raw_output = models.JSONField(blank=True, default=dict, help_text='工具原始输出') # ==================== 时间字段 ==================== created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') class Meta: db_table = 'vulnerability_snapshot' verbose_name = '漏洞快照' verbose_name_plural = '漏洞快照' ordering = ['-created_at'] indexes = [ models.Index(fields=['scan']), models.Index(fields=['url']), # url索引,优化URL搜索 models.Index(fields=['vuln_type']), models.Index(fields=['severity']), models.Index(fields=['source']), models.Index(fields=['-created_at']), ] def __str__(self): return f'{self.vuln_type} - {self.url[:50]} (Scan #{self.scan_id})' ================================================ FILE: backend/apps/asset/models/statistics_models.py ================================================ from django.db import models class AssetStatistics(models.Model): """ 资产统计表 存储预聚合的全局统计数据,避免仪表盘实时 COUNT 大表。 由定时任务(Prefect Flow)定期刷新。 """ id = models.AutoField(primary_key=True) # ==================== 当前统计字段 ==================== total_targets = models.IntegerField(default=0, help_text='目标总数') total_subdomains = models.IntegerField(default=0, help_text='子域名总数') total_ips = models.IntegerField(default=0, help_text='IP地址总数') total_endpoints = models.IntegerField(default=0, help_text='端点总数') total_websites = models.IntegerField(default=0, help_text='网站总数') total_vulns = models.IntegerField(default=0, help_text='漏洞总数') total_assets = models.IntegerField(default=0, help_text='总资产数(子域名+IP+端点+网站)') # ==================== 上次统计字段(用于计算趋势)==================== prev_targets = models.IntegerField(default=0, help_text='上次目标总数') prev_subdomains = models.IntegerField(default=0, help_text='上次子域名总数') prev_ips = models.IntegerField(default=0, help_text='上次IP地址总数') prev_endpoints = models.IntegerField(default=0, help_text='上次端点总数') prev_websites = models.IntegerField(default=0, help_text='上次网站总数') prev_vulns = models.IntegerField(default=0, help_text='上次漏洞总数') prev_assets = models.IntegerField(default=0, help_text='上次总资产数') # ==================== 时间字段 ==================== updated_at = models.DateTimeField(auto_now=True, help_text='最后更新时间') class Meta: db_table = 'asset_statistics' verbose_name = '资产统计' verbose_name_plural = '资产统计' def __str__(self): return f'AssetStatistics (updated: {self.updated_at})' @classmethod def get_or_create_singleton(cls) -> 'AssetStatistics': """获取或创建单例统计记录""" obj, _ = cls.objects.get_or_create(pk=1) return obj class StatisticsHistory(models.Model): """ 统计历史表(用于折线图) 每天记录一条快照,用于展示趋势。 由定时任务在刷新统计时自动写入。 """ date = models.DateField(unique=True, help_text='统计日期') # 各类资产数量 total_targets = models.IntegerField(default=0, help_text='目标总数') total_subdomains = models.IntegerField(default=0, help_text='子域名总数') total_ips = models.IntegerField(default=0, help_text='IP地址总数') total_endpoints = models.IntegerField(default=0, help_text='端点总数') total_websites = models.IntegerField(default=0, help_text='网站总数') total_vulns = models.IntegerField(default=0, help_text='漏洞总数') total_assets = models.IntegerField(default=0, help_text='总资产数') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') updated_at = models.DateTimeField(auto_now=True, help_text='更新时间') class Meta: db_table = 'statistics_history' verbose_name = '统计历史' verbose_name_plural = '统计历史' ordering = ['-date'] indexes = [ models.Index(fields=['date']), ] def __str__(self): return f'StatisticsHistory ({self.date})' ================================================ FILE: backend/apps/asset/repositories/__init__.py ================================================ """Asset Repositories - 数据访问层""" # 资产模块 Repositories from .asset import ( DjangoSubdomainRepository, DjangoWebSiteRepository, DjangoDirectoryRepository, DjangoHostPortMappingRepository, DjangoEndpointRepository, ) # 快照模块 Repositories from .snapshot import ( DjangoSubdomainSnapshotRepository, DjangoHostPortMappingSnapshotRepository, DjangoWebsiteSnapshotRepository, DjangoDirectorySnapshotRepository, DjangoEndpointSnapshotRepository, ) # 统计模块 Repository from .statistics_repository import AssetStatisticsRepository __all__ = [ # 资产模块 'DjangoSubdomainRepository', 'DjangoWebSiteRepository', 'DjangoDirectoryRepository', 'DjangoHostPortMappingRepository', 'DjangoEndpointRepository', # 快照模块 'DjangoSubdomainSnapshotRepository', 'DjangoHostPortMappingSnapshotRepository', 'DjangoWebsiteSnapshotRepository', 'DjangoDirectorySnapshotRepository', 'DjangoEndpointSnapshotRepository', # 统计模块 'AssetStatisticsRepository', ] ================================================ FILE: backend/apps/asset/repositories/asset/__init__.py ================================================ """Asset Repositories - 数据访问层""" from .subdomain_repository import DjangoSubdomainRepository from .website_repository import DjangoWebSiteRepository from .directory_repository import DjangoDirectoryRepository from .host_port_mapping_repository import DjangoHostPortMappingRepository from .endpoint_repository import DjangoEndpointRepository __all__ = [ 'DjangoSubdomainRepository', 'DjangoWebSiteRepository', 'DjangoDirectoryRepository', 'DjangoHostPortMappingRepository', 'DjangoEndpointRepository', ] ================================================ FILE: backend/apps/asset/repositories/asset/directory_repository.py ================================================ """ Django ORM 实现的 Directory Repository """ import logging from typing import List, Iterator from django.db import transaction from apps.asset.models.asset_models import Directory from apps.asset.dtos import DirectoryDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoDirectoryRepository: """Django ORM 实现的 Directory Repository""" def bulk_upsert(self, items: List[DirectoryDTO]) -> int: """ 批量创建或更新 Directory(upsert) 存在则更新所有字段,不存在则创建。 使用 Django 原生 update_conflicts。 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: Directory DTO 列表 Returns: int: 处理的记录数 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, Directory) # 直接从 DTO 字段构建 Model directories = [ Directory( target_id=item.target_id, url=item.url, status=item.status, content_length=item.content_length, words=item.words, lines=item.lines, content_type=item.content_type or '', duration=item.duration ) for item in unique_items ] with transaction.atomic(): Directory.objects.bulk_create( directories, update_conflicts=True, unique_fields=['target', 'url'], update_fields=[ 'status', 'content_length', 'words', 'lines', 'content_type', 'duration' ], batch_size=1000 ) logger.debug(f"批量 upsert Directory 成功: {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量 upsert Directory 失败: {e}") raise def bulk_create_ignore_conflicts(self, items: List[DirectoryDTO]) -> int: """ 批量创建 Directory(存在即跳过) 与 bulk_upsert 不同,此方法不会更新已存在的记录。 适用于批量添加场景,只提供 URL,没有其他字段数据。 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: Directory DTO 列表 Returns: int: 处理的记录数 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, Directory) directories = [ Directory( target_id=item.target_id, url=item.url, status=item.status, content_length=item.content_length, words=item.words, lines=item.lines, content_type=item.content_type or '', duration=item.duration ) for item in unique_items ] with transaction.atomic(): Directory.objects.bulk_create( directories, ignore_conflicts=True, batch_size=1000 ) logger.debug(f"批量创建 Directory 成功(ignore_conflicts): {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量创建 Directory 失败: {e}") raise def count_by_target(self, target_id: int) -> int: """统计目标下的目录总数""" return Directory.objects.filter(target_id=target_id).count() def get_all(self): """获取所有目录""" return Directory.objects.all().order_by('-created_at') def get_by_target(self, target_id: int): """获取目标下的所有目录""" return Directory.objects.filter(target_id=target_id).order_by('-created_at') def get_urls_for_export(self, target_id: int, batch_size: int = 1000) -> Iterator[str]: """流式导出目标下的所有目录 URL""" try: queryset = ( Directory.objects .filter(target_id=target_id) .values_list('url', flat=True) .order_by('url') .iterator(chunk_size=batch_size) ) for url in queryset: yield url except Exception as e: logger.error("流式导出目录 URL 失败 - Target ID: %s, 错误: %s", target_id, e) raise def iter_raw_data_for_export( self, target_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID batch_size: 每批数据量 Yields: 包含所有目录字段的字典 """ qs = ( Directory.objects .filter(target_id=target_id) .values( 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/asset/endpoint_repository.py ================================================ """Endpoint Repository - Django ORM 实现""" import logging from typing import List, Iterator from apps.asset.models import Endpoint from apps.asset.dtos.asset import EndpointDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk from django.db import transaction logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoEndpointRepository: """端点 Repository - 负责端点表的数据访问""" def bulk_upsert(self, items: List[EndpointDTO]) -> int: """ 批量创建或更新端点(upsert) 存在则更新所有字段,不存在则创建。 使用 Django 原生 update_conflicts。 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: 端点 DTO 列表 Returns: int: 处理的记录数 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, Endpoint) # 直接从 DTO 字段构建 Model endpoints = [ Endpoint( target_id=item.target_id, url=item.url, host=item.host or '', title=item.title or '', status_code=item.status_code, content_length=item.content_length, webserver=item.webserver or '', response_body=item.response_body or '', content_type=item.content_type or '', tech=item.tech if item.tech else [], vhost=item.vhost, location=item.location or '', matched_gf_patterns=item.matched_gf_patterns if item.matched_gf_patterns else [], response_headers=item.response_headers if item.response_headers else '' ) for item in unique_items ] with transaction.atomic(): Endpoint.objects.bulk_create( endpoints, update_conflicts=True, unique_fields=['url', 'target'], update_fields=[ 'host', 'title', 'status_code', 'content_length', 'webserver', 'response_body', 'content_type', 'tech', 'vhost', 'location', 'matched_gf_patterns', 'response_headers' ], batch_size=1000 ) logger.debug(f"批量 upsert 端点成功: {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量 upsert 端点失败: {e}") raise def get_all(self): """获取所有端点(全局查询)""" return Endpoint.objects.all().order_by('-created_at') def get_by_target(self, target_id: int): """ 获取目标下的所有端点 Args: target_id: 目标 ID Returns: QuerySet: 端点查询集 """ return Endpoint.objects.filter(target_id=target_id).order_by('-created_at') def count_by_target(self, target_id: int) -> int: """ 统计目标下的端点数量 Args: target_id: 目标 ID Returns: int: 端点数量 """ return Endpoint.objects.filter(target_id=target_id).count() def bulk_create_ignore_conflicts(self, items: List[EndpointDTO]) -> int: """ 批量创建端点(存在即跳过) 与 bulk_upsert 不同,此方法不会更新已存在的记录。 适用于快速扫描场景,只提供 URL,没有其他字段数据。 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: 端点 DTO 列表 Returns: int: 处理的记录数 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, Endpoint) # 直接从 DTO 字段构建 Model endpoints = [ Endpoint( target_id=item.target_id, url=item.url, host=item.host or '', title=item.title or '', status_code=item.status_code, content_length=item.content_length, webserver=item.webserver or '', response_body=item.response_body or '', content_type=item.content_type or '', tech=item.tech if item.tech else [], vhost=item.vhost, location=item.location or '', matched_gf_patterns=item.matched_gf_patterns if item.matched_gf_patterns else [], response_headers=item.response_headers if item.response_headers else '' ) for item in unique_items ] with transaction.atomic(): Endpoint.objects.bulk_create( endpoints, ignore_conflicts=True, batch_size=1000 ) logger.debug(f"批量创建端点成功(ignore_conflicts): {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量创建端点失败: {e}") raise def iter_raw_data_for_export( self, target_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID batch_size: 每批数据量 Yields: 包含所有端点字段的字典 """ qs = ( Endpoint.objects .filter(target_id=target_id) .values( 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'matched_gf_patterns', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/asset/host_port_mapping_repository.py ================================================ """HostPortMapping Repository - Django ORM 实现""" import logging from typing import List, Iterator, Dict, Optional from django.db.models import QuerySet, Min from apps.asset.models.asset_models import HostPortMapping from apps.asset.dtos.asset import HostPortMappingDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoHostPortMappingRepository: """HostPortMapping Repository - Django ORM 实现 职责:纯数据访问,不包含业务逻辑 """ def bulk_create_ignore_conflicts(self, items: List[HostPortMappingDTO]) -> int: """ 批量创建主机端口关联(忽略冲突) 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: 主机端口关联 DTO 列表 Returns: int: 实际创建的记录数 """ try: logger.debug("准备批量创建主机端口关联 - 数量: %d", len(items)) if not items: logger.debug("主机端口关联为空,跳过创建") return 0 # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, HostPortMapping) records = [ HostPortMapping( target_id=item.target_id, host=item.host, ip=item.ip, port=item.port ) for item in unique_items ] created = HostPortMapping.objects.bulk_create( records, ignore_conflicts=True ) created_count = len(created) if created else 0 logger.debug("主机端口关联创建完成 - 数量: %d", created_count) return created_count except Exception as e: logger.error( "批量创建主机端口关联失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_for_export(self, target_id: int, batch_size: int = 1000): queryset = ( HostPortMapping.objects .filter(target_id=target_id) .order_by("host", "port") .values("host", "port") .iterator(chunk_size=batch_size) ) for item in queryset: yield item def get_ips_for_export(self, target_id: int, batch_size: int = 1000) -> Iterator[str]: """流式导出目标下的所有唯一 IP 地址。""" queryset = ( HostPortMapping.objects .filter(target_id=target_id) .values_list("ip", flat=True) .distinct() .order_by("ip") .iterator(chunk_size=batch_size) ) for ip in queryset: yield ip def get_queryset_by_target(self, target_id: int) -> QuerySet: """获取目标下的 QuerySet""" return HostPortMapping.objects.filter(target_id=target_id) def get_all_queryset(self) -> QuerySet: """获取所有记录的 QuerySet""" return HostPortMapping.objects.all() def get_queryset_by_ip(self, ip: str, target_id: Optional[int] = None) -> QuerySet: """获取指定 IP 的 QuerySet""" qs = HostPortMapping.objects.filter(ip=ip) if target_id: qs = qs.filter(target_id=target_id) return qs def iter_raw_data_for_export( self, target_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID batch_size: 每批数据量 Yields: { 'ip': '192.168.1.1', 'host': 'example.com', 'port': 80, 'created_at': datetime } """ qs = ( HostPortMapping.objects .filter(target_id=target_id) .values('ip', 'host', 'port', 'created_at') .order_by('ip', 'host', 'port') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/asset/subdomain_repository.py ================================================ """Subdomain Repository - Django ORM 实现""" import logging from typing import List, Iterator from django.db import transaction from apps.asset.models.asset_models import Subdomain from apps.asset.dtos import SubdomainDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoSubdomainRepository: """基于 Django ORM 的子域名仓储实现""" def bulk_create_ignore_conflicts(self, items: List[SubdomainDTO]) -> None: """ 批量创建子域名,忽略冲突 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: 子域名 DTO 列表 """ if not items: return try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, Subdomain) subdomain_objects = [ Subdomain( name=item.name, target_id=item.target_id, ) for item in unique_items ] with transaction.atomic(): Subdomain.objects.bulk_create( subdomain_objects, ignore_conflicts=True, ) logger.debug(f"成功处理 {len(unique_items)} 条子域名记录") except Exception as e: logger.error(f"批量插入子域名失败: {e}") raise def get_all(self): """获取所有子域名""" return Subdomain.objects.all().order_by('-created_at') def get_by_target(self, target_id: int): """获取目标下的所有子域名""" return Subdomain.objects.filter(target_id=target_id).order_by('-created_at') def count_by_target(self, target_id: int) -> int: """统计目标下的域名数量""" return Subdomain.objects.filter(target_id=target_id).count() def get_domains_for_export(self, target_id: int, batch_size: int = 1000) -> Iterator[str]: """流式导出域名""" queryset = Subdomain.objects.filter( target_id=target_id ).only('name').iterator(chunk_size=batch_size) for subdomain in queryset: yield subdomain.name def get_by_names_and_target_id(self, names: set, target_id: int) -> dict: """根据域名列表和目标ID批量查询 Subdomain""" subdomains = Subdomain.objects.filter( name__in=names, target_id=target_id ).only('id', 'name') return {sd.name: sd for sd in subdomains} def iter_raw_data_for_export( self, target_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID batch_size: 每批数据量 Yields: {'name': 'sub.example.com', 'created_at': datetime} """ qs = ( Subdomain.objects .filter(target_id=target_id) .values('name', 'created_at') .order_by('name') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/asset/website_repository.py ================================================ """ Django ORM 实现的 WebSite Repository """ import logging from typing import List, Generator, Optional, Iterator from django.db import transaction from apps.asset.models.asset_models import WebSite from apps.asset.dtos import WebSiteDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoWebSiteRepository: """Django ORM 实现的 WebSite Repository""" def bulk_upsert(self, items: List[WebSiteDTO]) -> int: """ 批量创建或更新 WebSite(upsert) 存在则更新所有字段,不存在则创建。 使用 Django 原生 update_conflicts。 注意:自动按模型唯一约束去重,保留最后一条记录。 Args: items: WebSite DTO 列表 Returns: int: 处理的记录数 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, WebSite) # 直接从 DTO 字段构建 Model websites = [ WebSite( target_id=item.target_id, url=item.url, host=item.host or '', location=item.location or '', title=item.title or '', webserver=item.webserver or '', response_body=item.response_body or '', content_type=item.content_type or '', tech=item.tech if item.tech else [], status_code=item.status_code, content_length=item.content_length, vhost=item.vhost, response_headers=item.response_headers if item.response_headers else '' ) for item in unique_items ] with transaction.atomic(): WebSite.objects.bulk_create( websites, update_conflicts=True, unique_fields=['url', 'target'], update_fields=[ 'host', 'location', 'title', 'webserver', 'response_body', 'content_type', 'tech', 'status_code', 'content_length', 'vhost', 'response_headers' ], batch_size=1000 ) logger.debug(f"批量 upsert WebSite 成功: {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量 upsert WebSite 失败: {e}") raise def get_urls_for_export(self, target_id: int, batch_size: int = 1000) -> Generator[str, None, None]: """ 流式导出目标下的所有站点 URL """ try: queryset = WebSite.objects.filter( target_id=target_id ).values_list('url', flat=True).iterator(chunk_size=batch_size) for url in queryset: yield url except Exception as e: logger.error(f"流式导出站点 URL 失败 - Target ID: {target_id}, 错误: {e}") raise def get_all(self): """获取所有网站""" return WebSite.objects.all().order_by('-created_at') def get_by_target(self, target_id: int): """获取目标下的所有网站""" return WebSite.objects.filter(target_id=target_id).order_by('-created_at') def count_by_target(self, target_id: int) -> int: """统计目标下的站点总数""" return WebSite.objects.filter(target_id=target_id).count() def get_by_url(self, url: str, target_id: int) -> Optional[int]: """根据 URL 和 target_id 查找站点 ID""" website = WebSite.objects.filter(url=url, target_id=target_id).first() return website.id if website else None def bulk_create_ignore_conflicts(self, items: List[WebSiteDTO]) -> int: """ 批量创建 WebSite(存在即跳过) 注意:自动按模型唯一约束去重,保留最后一条记录。 """ if not items: return 0 try: # 自动按模型唯一约束去重 unique_items = deduplicate_for_bulk(items, WebSite) websites = [ WebSite( target_id=item.target_id, url=item.url, host=item.host or '', location=item.location or '', title=item.title or '', webserver=item.webserver or '', response_body=item.response_body or '', content_type=item.content_type or '', tech=item.tech if item.tech else [], status_code=item.status_code, content_length=item.content_length, vhost=item.vhost, response_headers=item.response_headers if item.response_headers else '' ) for item in unique_items ] with transaction.atomic(): WebSite.objects.bulk_create( websites, ignore_conflicts=True, batch_size=1000 ) logger.debug(f"批量创建 WebSite 成功(ignore_conflicts): {len(unique_items)} 条") return len(unique_items) except Exception as e: logger.error(f"批量创建 WebSite 失败: {e}") raise def iter_raw_data_for_export( self, target_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID batch_size: 每批数据量 Yields: 包含所有网站字段的字典 """ qs = ( WebSite.objects .filter(target_id=target_id) .values( 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/snapshot/__init__.py ================================================ """Snapshot Repositories - 数据访问层""" from .subdomain_snapshot_repository import DjangoSubdomainSnapshotRepository from .host_port_mapping_snapshot_repository import DjangoHostPortMappingSnapshotRepository from .website_snapshot_repository import DjangoWebsiteSnapshotRepository from .directory_snapshot_repository import DjangoDirectorySnapshotRepository from .endpoint_snapshot_repository import DjangoEndpointSnapshotRepository from .vulnerability_snapshot_repository import DjangoVulnerabilitySnapshotRepository __all__ = [ 'DjangoSubdomainSnapshotRepository', 'DjangoHostPortMappingSnapshotRepository', 'DjangoWebsiteSnapshotRepository', 'DjangoDirectorySnapshotRepository', 'DjangoEndpointSnapshotRepository', 'DjangoVulnerabilitySnapshotRepository', ] ================================================ FILE: backend/apps/asset/repositories/snapshot/directory_snapshot_repository.py ================================================ """Directory Snapshot Repository - 目录快照数据访问层""" import logging from typing import List, Iterator from django.db import transaction from apps.asset.models import DirectorySnapshot from apps.asset.dtos.snapshot import DirectorySnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoDirectorySnapshotRepository: """ 目录快照仓储(Django ORM 实现) 负责目录快照表的数据访问操作 """ def save_snapshots(self, items: List[DirectorySnapshotDTO]) -> None: """ 批量保存目录快照记录 使用 ignore_conflicts 策略,如果快照已存在(相同 scan + url)则跳过 注意:会自动按 (scan_id, url) 去重,保留最后一条记录。 Args: items: 目录快照 DTO 列表 Raises: ValueError: items 为空 Exception: 数据库操作失败 """ if not items: logger.warning("目录快照列表为空,跳过保存") return try: # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, DirectorySnapshot) # 转换为 Django 模型对象 snapshot_objects = [ DirectorySnapshot( scan_id=item.scan_id, url=item.url, status=item.status, content_length=item.content_length, words=item.words, lines=item.lines, content_type=item.content_type, duration=item.duration ) for item in unique_items ] with transaction.atomic(): # 批量插入,忽略冲突 # 如果 scan + url 已存在,跳过 DirectorySnapshot.objects.bulk_create( snapshot_objects, ignore_conflicts=True ) logger.debug("成功保存 %d 条目录快照记录", len(unique_items)) except Exception as e: logger.error( "批量保存目录快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_by_scan(self, scan_id: int): return DirectorySnapshot.objects.filter(scan_id=scan_id).order_by('-created_at') def get_all(self): return DirectorySnapshot.objects.all().order_by('-created_at') def iter_raw_data_for_export( self, scan_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID batch_size: 每批数据量 Yields: 包含所有目录字段的字典 """ qs = ( DirectorySnapshot.objects .filter(scan_id=scan_id) .values( 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/snapshot/endpoint_snapshot_repository.py ================================================ """EndpointSnapshot Repository - Django ORM 实现""" import logging from typing import List, Iterator from apps.asset.models.snapshot_models import EndpointSnapshot from apps.asset.dtos.snapshot import EndpointSnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoEndpointSnapshotRepository: """端点快照 Repository - 负责端点快照表的数据访问""" def save_snapshots(self, items: List[EndpointSnapshotDTO]) -> None: """ 保存端点快照 注意:会自动按 (scan_id, url) 去重,保留最后一条记录。 Args: items: 端点快照 DTO 列表 Note: - 保存完整的快照数据 - 基于唯一约束 (scan + url) 自动去重 """ try: logger.debug("准备保存端点快照 - 数量: %d", len(items)) if not items: logger.debug("端点快照为空,跳过保存") return # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, EndpointSnapshot) # 构建快照对象 snapshots = [] for item in unique_items: snapshots.append(EndpointSnapshot( scan_id=item.scan_id, url=item.url, host=item.host if item.host else '', title=item.title, status_code=item.status_code, content_length=item.content_length, location=item.location, webserver=item.webserver, content_type=item.content_type, tech=item.tech if item.tech else [], response_body=item.response_body, vhost=item.vhost, matched_gf_patterns=item.matched_gf_patterns if item.matched_gf_patterns else [], response_headers=item.response_headers if item.response_headers else '' )) # 批量创建(忽略冲突,基于唯一约束去重) EndpointSnapshot.objects.bulk_create( snapshots, ignore_conflicts=True ) logger.debug("端点快照保存成功 - 数量: %d", len(snapshots)) except Exception as e: logger.error( "保存端点快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_by_scan(self, scan_id: int): return EndpointSnapshot.objects.filter(scan_id=scan_id).order_by('-created_at') def get_all(self): return EndpointSnapshot.objects.all().order_by('-created_at') def iter_raw_data_for_export( self, scan_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID batch_size: 每批数据量 Yields: 包含所有端点字段的字典 """ qs = ( EndpointSnapshot.objects .filter(scan_id=scan_id) .values( 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'matched_gf_patterns', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/snapshot/host_port_mapping_snapshot_repository.py ================================================ """HostPortMappingSnapshot Repository - Django ORM 实现""" import logging from typing import List, Iterator from apps.asset.models.snapshot_models import HostPortMappingSnapshot from apps.asset.dtos.snapshot import HostPortMappingSnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoHostPortMappingSnapshotRepository: """HostPortMappingSnapshot Repository - Django ORM 实现,负责主机端口映射快照表的数据访问""" def save_snapshots(self, items: List[HostPortMappingSnapshotDTO]) -> None: """ 保存主机端口关联快照 注意:会自动按 (scan_id, host, ip, port) 去重,保留最后一条记录。 Args: items: 主机端口关联快照 DTO 列表 Note: - 保存完整的快照数据 - 基于唯一约束 (scan + host + ip + port) 自动去重 """ try: logger.debug("准备保存主机端口关联快照 - 数量: %d", len(items)) if not items: logger.debug("主机端口关联快照为空,跳过保存") return # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, HostPortMappingSnapshot) # 构建快照对象 snapshots = [] for item in unique_items: snapshots.append(HostPortMappingSnapshot( scan_id=item.scan_id, host=item.host, ip=item.ip, port=item.port )) # 批量创建(忽略冲突,基于唯一约束去重) HostPortMappingSnapshot.objects.bulk_create( snapshots, ignore_conflicts=True ) logger.debug("主机端口关联快照保存成功 - 数量: %d", len(snapshots)) except Exception as e: logger.error( "保存主机端口关联快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_ip_aggregation_by_scan(self, scan_id: int, filter_query: str = None): from django.db.models import Min from apps.common.utils.filter_utils import apply_filters qs = HostPortMappingSnapshot.objects.filter(scan_id=scan_id) # 应用智能过滤 if filter_query: field_mapping = { 'ip': 'ip', 'port': 'port', 'host': 'host', } qs = apply_filters(qs, filter_query, field_mapping) ip_aggregated = ( qs .values('ip') .annotate( created_at=Min('created_at') ) .order_by('-created_at') ) results = [] for item in ip_aggregated: ip = item['ip'] mappings = ( HostPortMappingSnapshot.objects .filter(scan_id=scan_id, ip=ip) .values('host', 'port') .distinct() ) hosts = sorted({m['host'] for m in mappings}) ports = sorted({m['port'] for m in mappings}) results.append({ 'ip': ip, 'hosts': hosts, 'ports': ports, 'created_at': item['created_at'], }) return results def get_all_ip_aggregation(self, filter_query: str = None): """获取所有 IP 聚合数据""" from django.db.models import Min from apps.common.utils.filter_utils import apply_filters qs = HostPortMappingSnapshot.objects.all() # 应用智能过滤 if filter_query: field_mapping = { 'ip': 'ip', 'port': 'port', 'host': 'host', } qs = apply_filters(qs, filter_query, field_mapping) ip_aggregated = ( qs .values('ip') .annotate(created_at=Min('created_at')) .order_by('-created_at') ) results = [] for item in ip_aggregated: ip = item['ip'] mappings = ( HostPortMappingSnapshot.objects .filter(ip=ip) .values('host', 'port') .distinct() ) hosts = sorted({m['host'] for m in mappings}) ports = sorted({m['port'] for m in mappings}) results.append({ 'ip': ip, 'hosts': hosts, 'ports': ports, 'created_at': item['created_at'], }) return results def get_ips_for_export(self, scan_id: int, batch_size: int = 1000) -> Iterator[str]: """流式导出扫描下的所有唯一 IP 地址。""" queryset = ( HostPortMappingSnapshot.objects .filter(scan_id=scan_id) .values_list("ip", flat=True) .distinct() .order_by("ip") .iterator(chunk_size=batch_size) ) for ip in queryset: yield ip def iter_raw_data_for_export( self, scan_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID batch_size: 每批数据量 Yields: { 'ip': '192.168.1.1', 'host': 'example.com', 'port': 80, 'created_at': datetime } """ qs = ( HostPortMappingSnapshot.objects .filter(scan_id=scan_id) .values('ip', 'host', 'port', 'created_at') .order_by('ip', 'host', 'port') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/snapshot/subdomain_snapshot_repository.py ================================================ """Django ORM 实现的 SubdomainSnapshot Repository""" import logging from typing import List, Iterator from apps.asset.models.snapshot_models import SubdomainSnapshot from apps.asset.dtos import SubdomainSnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoSubdomainSnapshotRepository: """子域名快照 Repository - 负责子域名快照表的数据访问""" def save_subdomain_snapshots(self, items: List[SubdomainSnapshotDTO]) -> None: """ 保存子域名快照 注意:会自动按 (scan_id, name) 去重,保留最后一条记录。 Args: items: 子域名快照 DTO 列表 Note: - 保存完整的快照数据 - 基于唯一约束自动去重(忽略冲突) """ try: logger.debug("准备保存子域名快照 - 数量: %d", len(items)) if not items: logger.debug("子域名快照为空,跳过保存") return # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, SubdomainSnapshot) # 构建快照对象 snapshots = [] for item in unique_items: snapshots.append(SubdomainSnapshot( scan_id=item.scan_id, name=item.name, )) # 批量创建(忽略冲突,基于唯一约束去重) SubdomainSnapshot.objects.bulk_create(snapshots, ignore_conflicts=True) logger.debug("子域名快照保存成功 - 数量: %d", len(snapshots)) except Exception as e: logger.error( "保存子域名快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_by_scan(self, scan_id: int): return SubdomainSnapshot.objects.filter(scan_id=scan_id).order_by('-created_at') def get_all(self): return SubdomainSnapshot.objects.all().order_by('-created_at') def iter_raw_data_for_export( self, scan_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID batch_size: 每批数据量 Yields: {'name': 'sub.example.com', 'created_at': datetime} """ qs = ( SubdomainSnapshot.objects .filter(scan_id=scan_id) .values('name', 'created_at') .order_by('name') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/snapshot/vulnerability_snapshot_repository.py ================================================ """Vulnerability Snapshot Repository - 漏洞快照数据访问层""" import logging from typing import List from django.db import transaction from apps.asset.models import VulnerabilitySnapshot from apps.asset.dtos.snapshot import VulnerabilitySnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoVulnerabilitySnapshotRepository: """漏洞快照仓储(Django ORM 实现)""" def save_snapshots(self, items: List[VulnerabilitySnapshotDTO]) -> None: """批量保存漏洞快照记录。 使用 ``ignore_conflicts`` 策略,如果快照已存在则跳过。 具体唯一约束由数据库模型控制。 注意:会自动按唯一约束字段去重,保留最后一条记录。 """ if not items: logger.warning("漏洞快照列表为空,跳过保存") return try: # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, VulnerabilitySnapshot) snapshot_objects = [ VulnerabilitySnapshot( scan_id=item.scan_id, url=item.url, vuln_type=item.vuln_type, severity=item.severity, source=item.source, cvss_score=item.cvss_score, description=item.description, raw_output=item.raw_output, ) for item in unique_items ] with transaction.atomic(): VulnerabilitySnapshot.objects.bulk_create( snapshot_objects, ignore_conflicts=True, ) logger.debug("成功保存 %d 条漏洞快照记录", len(unique_items)) except Exception as e: logger.error( "批量保存漏洞快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True, ) raise def get_by_scan(self, scan_id: int): """按扫描任务获取漏洞快照 QuerySet。""" return VulnerabilitySnapshot.objects.filter(scan_id=scan_id).order_by("-created_at") def get_all(self): return VulnerabilitySnapshot.objects.all().order_by('-created_at') ================================================ FILE: backend/apps/asset/repositories/snapshot/website_snapshot_repository.py ================================================ """WebsiteSnapshot Repository - Django ORM 实现""" import logging from typing import List, Iterator from apps.asset.models.snapshot_models import WebsiteSnapshot from apps.asset.dtos.snapshot import WebsiteSnapshotDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoWebsiteSnapshotRepository: """网站快照 Repository - 负责网站快照表的数据访问""" def save_snapshots(self, items: List[WebsiteSnapshotDTO]) -> None: """ 保存网站快照 注意:会自动按 (scan_id, url) 去重,保留最后一条记录。 Args: items: 网站快照 DTO 列表 Note: - 保存完整的快照数据 - 基于唯一约束 (scan + subdomain + url) 自动去重 """ try: logger.debug("准备保存网站快照 - 数量: %d", len(items)) if not items: logger.debug("网站快照为空,跳过保存") return # 根据模型唯一约束自动去重 unique_items = deduplicate_for_bulk(items, WebsiteSnapshot) # 构建快照对象 snapshots = [] for item in unique_items: snapshots.append(WebsiteSnapshot( scan_id=item.scan_id, url=item.url, host=item.host, title=item.title, status_code=item.status_code, content_length=item.content_length, location=item.location, webserver=item.webserver, content_type=item.content_type, tech=item.tech if item.tech else [], response_body=item.response_body, vhost=item.vhost, response_headers=item.response_headers if item.response_headers else '' )) # 批量创建(忽略冲突,基于唯一约束去重) WebsiteSnapshot.objects.bulk_create( snapshots, ignore_conflicts=True ) logger.debug("网站快照保存成功 - 数量: %d", len(snapshots)) except Exception as e: logger.error( "保存网站快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_by_scan(self, scan_id: int): return WebsiteSnapshot.objects.filter(scan_id=scan_id).order_by('-created_at') def get_all(self): return WebsiteSnapshot.objects.all().order_by('-created_at') def iter_raw_data_for_export( self, scan_id: int, batch_size: int = 1000 ) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID batch_size: 每批数据量 Yields: 包含所有网站字段的字典 """ qs = ( WebsiteSnapshot.objects .filter(scan_id=scan_id) .values( 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'created_at' ) .order_by('url') ) for row in qs.iterator(chunk_size=batch_size): yield row ================================================ FILE: backend/apps/asset/repositories/statistics_repository.py ================================================ """资产统计 Repository""" import logging from datetime import date, timedelta from typing import Optional, List from apps.asset.models import AssetStatistics, StatisticsHistory logger = logging.getLogger(__name__) class AssetStatisticsRepository: """ 资产统计数据访问层 职责: - 读取/更新预聚合的统计数据 """ def get_statistics(self) -> Optional[AssetStatistics]: """ 获取统计数据 Returns: 统计数据对象,不存在则返回 None """ return AssetStatistics.objects.first() def get_or_create_statistics(self) -> AssetStatistics: """ 获取或创建统计数据(单例) Returns: 统计数据对象 """ return AssetStatistics.get_or_create_singleton() def update_statistics( self, total_targets: int, total_subdomains: int, total_ips: int, total_endpoints: int, total_websites: int, total_vulns: int, ) -> AssetStatistics: """ 更新统计数据 Args: total_targets: 目标总数 total_subdomains: 子域名总数 total_ips: IP 总数 total_endpoints: 端点总数 total_websites: 网站总数 total_vulns: 漏洞总数 Returns: 更新后的统计数据对象 """ stats = self.get_or_create_statistics() # 1. 保存当前值到 prev_* 字段 stats.prev_targets = stats.total_targets stats.prev_subdomains = stats.total_subdomains stats.prev_ips = stats.total_ips stats.prev_endpoints = stats.total_endpoints stats.prev_websites = stats.total_websites stats.prev_vulns = stats.total_vulns stats.prev_assets = stats.total_assets # 2. 更新当前值 stats.total_targets = total_targets stats.total_subdomains = total_subdomains stats.total_ips = total_ips stats.total_endpoints = total_endpoints stats.total_websites = total_websites stats.total_vulns = total_vulns stats.total_assets = total_subdomains + total_ips + total_endpoints + total_websites stats.save() logger.info( "更新资产统计: targets=%d, subdomains=%d, ips=%d, endpoints=%d, websites=%d, vulns=%d, assets=%d", total_targets, total_subdomains, total_ips, total_endpoints, total_websites, total_vulns, stats.total_assets ) return stats def save_daily_snapshot(self, stats: AssetStatistics) -> StatisticsHistory: """ 保存每日统计快照(幂等,每天只存一条) Args: stats: 当前统计数据 Returns: 历史记录对象 """ history, created = StatisticsHistory.objects.update_or_create( date=date.today(), defaults={ 'total_targets': stats.total_targets, 'total_subdomains': stats.total_subdomains, 'total_ips': stats.total_ips, 'total_endpoints': stats.total_endpoints, 'total_websites': stats.total_websites, 'total_vulns': stats.total_vulns, 'total_assets': stats.total_assets, } ) action = "创建" if created else "更新" logger.info(f"{action}统计快照: date={history.date}, assets={history.total_assets}") return history def get_history(self, days: int = 7) -> List[StatisticsHistory]: """ 获取历史统计数据(用于折线图) Args: days: 获取最近多少天的数据,默认 7 天 Returns: 历史记录列表,按日期升序 """ start_date = date.today() - timedelta(days=days - 1) return list( StatisticsHistory.objects .filter(date__gte=start_date) .order_by('date') ) ================================================ FILE: backend/apps/asset/serializers.py ================================================ from rest_framework import serializers from .models import Subdomain, WebSite, Directory, HostPortMapping, Endpoint, Vulnerability from .models.snapshot_models import ( SubdomainSnapshot, WebsiteSnapshot, DirectorySnapshot, EndpointSnapshot, VulnerabilitySnapshot, ) from .models.screenshot_models import Screenshot, ScreenshotSnapshot # 注意:IPAddress 和 Port 模型已被重构为 HostPortMapping # 以下是基于新架构的序列化器实现 # class PortSerializer(serializers.ModelSerializer): # """端口序列化器""" # # class Meta: # model = Port # fields = ['number', 'service_name', 'description', 'is_uncommon'] class SubdomainSerializer(serializers.ModelSerializer): """子域名序列化器""" class Meta: model = Subdomain fields = [ 'id', 'name', 'created_at', 'target' ] read_only_fields = ['id', 'created_at'] class SubdomainListSerializer(serializers.ModelSerializer): """子域名列表序列化器(用于扫描详情)""" # 注意:Subdomain 模型已简化,只保留核心字段 # cname, is_cdn, cdn_name 等字段已移至 SubdomainSnapshot # ports 和 ip_addresses 关系已被重构为 HostPortMapping class Meta: model = Subdomain fields = [ 'id', 'name', 'created_at' ] read_only_fields = ['id', 'created_at'] # class IPAddressListSerializer(serializers.ModelSerializer): # """IP 地址列表序列化器""" # # subdomain = serializers.CharField(source='subdomain.name', allow_blank=True, default='') # created_at = serializers.DateTimeField(read_only=True) # ports = PortSerializer(many=True, read_only=True) # # class Meta: # model = IPAddress # fields = [ # 'id', # 'ip', # 'subdomain', # 'reverse_pointer', # 'created_at', # 'ports', # ] # read_only_fields = fields class WebSiteSerializer(serializers.ModelSerializer): """站点序列化器(目标详情页)""" subdomain = serializers.CharField(source='subdomain.name', allow_blank=True, default='') responseHeaders = serializers.CharField(source='response_headers', read_only=True) # 原始HTTP响应头 class Meta: model = WebSite fields = [ 'id', 'url', 'host', 'location', 'title', 'webserver', 'content_type', 'status_code', 'content_length', 'response_body', 'tech', 'vhost', 'responseHeaders', # HTTP响应头 'subdomain', 'created_at', ] read_only_fields = fields class VulnerabilitySerializer(serializers.ModelSerializer): """漏洞资产序列化器(按目标查看漏洞资产)。""" class Meta: model = Vulnerability fields = [ 'id', 'target', 'url', 'vuln_type', 'severity', 'source', 'cvss_score', 'description', 'raw_output', 'created_at', ] read_only_fields = fields class VulnerabilitySnapshotSerializer(serializers.ModelSerializer): """漏洞快照序列化器(用于扫描历史漏洞列表)。""" class Meta: model = VulnerabilitySnapshot fields = [ 'id', 'url', 'vuln_type', 'severity', 'source', 'cvss_score', 'description', 'raw_output', 'created_at', ] read_only_fields = fields class EndpointListSerializer(serializers.ModelSerializer): """端点列表序列化器(用于目标端点列表页)""" # GF 匹配模式(gf-patterns 工具匹配的敏感 URL 模式) gfPatterns = serializers.ListField( child=serializers.CharField(), source='matched_gf_patterns', read_only=True, ) responseHeaders = serializers.CharField(source='response_headers', read_only=True) # 原始HTTP响应头 class Meta: model = Endpoint fields = [ 'id', 'url', 'location', 'status_code', 'title', 'content_length', 'content_type', 'webserver', 'response_body', 'tech', 'vhost', 'responseHeaders', # HTTP响应头 'gfPatterns', 'created_at', ] read_only_fields = fields class DirectorySerializer(serializers.ModelSerializer): """目录序列化器""" created_at = serializers.DateTimeField(read_only=True) class Meta: model = Directory fields = [ 'id', 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at', ] read_only_fields = fields class IPAddressAggregatedSerializer(serializers.Serializer): """ IP 地址聚合序列化器 基于 HostPortMapping 模型,按 IP 聚合显示: - ip: IP 地址 - hosts: 该 IP 关联的所有主机名列表 - ports: 该 IP 关联的所有端口列表 - created_at: 创建时间 """ ip = serializers.IPAddressField(read_only=True) hosts = serializers.ListField(child=serializers.CharField(), read_only=True) ports = serializers.ListField(child=serializers.IntegerField(), read_only=True) created_at = serializers.DateTimeField(read_only=True) # ==================== 快照序列化器 ==================== class SubdomainSnapshotSerializer(serializers.ModelSerializer): """子域名快照序列化器(用于扫描历史)""" class Meta: model = SubdomainSnapshot fields = ['id', 'name', 'created_at'] read_only_fields = fields class WebsiteSnapshotSerializer(serializers.ModelSerializer): """网站快照序列化器(用于扫描历史)""" subdomain_name = serializers.CharField(source='subdomain.name', read_only=True) responseHeaders = serializers.CharField(source='response_headers', read_only=True) # 原始HTTP响应头 class Meta: model = WebsiteSnapshot fields = [ 'id', 'url', 'location', 'title', 'webserver', 'content_type', 'status_code', 'content_length', 'response_body', 'tech', 'vhost', 'responseHeaders', # HTTP响应头 'subdomain_name', 'created_at', ] read_only_fields = fields class DirectorySnapshotSerializer(serializers.ModelSerializer): """目录快照序列化器(用于扫描历史)""" class Meta: model = DirectorySnapshot fields = [ 'id', 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at', ] read_only_fields = fields class EndpointSnapshotSerializer(serializers.ModelSerializer): """端点快照序列化器(用于扫描历史)""" # GF 匹配模式(gf-patterns 工具匹配的敏感 URL 模式) gfPatterns = serializers.ListField( child=serializers.CharField(), source='matched_gf_patterns', read_only=True, ) responseHeaders = serializers.CharField(source='response_headers', read_only=True) # 原始HTTP响应头 class Meta: model = EndpointSnapshot fields = [ 'id', 'url', 'host', 'location', 'title', 'webserver', 'content_type', 'status_code', 'content_length', 'response_body', 'tech', 'vhost', 'responseHeaders', # HTTP响应头 'gfPatterns', 'created_at', ] read_only_fields = fields # ==================== 截图序列化器 ==================== class ScreenshotListSerializer(serializers.ModelSerializer): """截图资产列表序列化器(不包含 image 字段)""" class Meta: model = Screenshot fields = ['id', 'url', 'status_code', 'created_at', 'updated_at'] read_only_fields = fields class ScreenshotSnapshotListSerializer(serializers.ModelSerializer): """截图快照列表序列化器(不包含 image 字段)""" class Meta: model = ScreenshotSnapshot fields = ['id', 'url', 'status_code', 'created_at'] read_only_fields = fields ================================================ FILE: backend/apps/asset/services/__init__.py ================================================ """Asset Services - 业务逻辑层""" # 资产模块 Services from .asset import ( SubdomainService, WebSiteService, DirectoryService, HostPortMappingService, EndpointService, VulnerabilityService, ) # 快照模块 Services from .snapshot import ( SubdomainSnapshotsService, HostPortMappingSnapshotsService, WebsiteSnapshotsService, DirectorySnapshotsService, EndpointSnapshotsService, VulnerabilitySnapshotsService, ) # 统计模块 Service from .statistics_service import AssetStatisticsService __all__ = [ # 资产模块 'SubdomainService', 'WebSiteService', 'DirectoryService', 'HostPortMappingService', 'EndpointService', 'VulnerabilityService', # 快照模块 'SubdomainSnapshotsService', 'HostPortMappingSnapshotsService', 'WebsiteSnapshotsService', 'DirectorySnapshotsService', 'EndpointSnapshotsService', 'VulnerabilitySnapshotsService', # 统计模块 'AssetStatisticsService', ] ================================================ FILE: backend/apps/asset/services/asset/__init__.py ================================================ """Asset Services - 资产模块的业务逻辑层""" from .subdomain_service import SubdomainService from .website_service import WebSiteService from .directory_service import DirectoryService from .host_port_mapping_service import HostPortMappingService from .endpoint_service import EndpointService from .vulnerability_service import VulnerabilityService __all__ = [ 'SubdomainService', 'WebSiteService', 'DirectoryService', 'HostPortMappingService', 'EndpointService', 'VulnerabilityService', ] ================================================ FILE: backend/apps/asset/services/asset/directory_service.py ================================================ """Directory Service - 目录业务逻辑层""" import logging from typing import List, Iterator, Optional from apps.asset.repositories import DjangoDirectoryRepository from apps.asset.dtos import DirectoryDTO from apps.common.validators import is_valid_url, is_url_match_target from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) class DirectoryService: """目录业务逻辑层""" # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'status': 'status', } def __init__(self, repository=None): """初始化目录服务""" self.repo = repository or DjangoDirectoryRepository() def bulk_upsert(self, directory_dtos: List[DirectoryDTO]) -> int: """ 批量创建或更新目录(upsert) 存在则更新所有字段,不存在则创建。 Args: directory_dtos: DirectoryDTO 列表 Returns: int: 处理的记录数 """ if not directory_dtos: return 0 try: return self.repo.bulk_upsert(directory_dtos) except Exception as e: logger.error(f"批量 upsert 目录失败: {e}") raise def bulk_create_urls(self, target_id: int, target_name: str, target_type: str, urls: List[str]) -> int: """ 批量创建目录(仅 URL,使用 ignore_conflicts) 验证 URL 格式和匹配,过滤无效/不匹配 URL,去重后批量创建。 已存在的记录会被跳过。 Args: target_id: 目标 ID target_name: 目标名称(用于匹配验证) target_type: 目标类型 ('domain', 'ip', 'cidr') urls: URL 列表 Returns: int: 实际创建的记录数 """ if not urls: return 0 # 过滤有效 URL 并去重 valid_urls = [] seen = set() for url in urls: if not isinstance(url, str): continue url = url.strip() if not url or url in seen: continue if not is_valid_url(url): continue # 匹配验证(前端已阻止不匹配的提交,后端作为双重保障) if not is_url_match_target(url, target_name, target_type): continue seen.add(url) valid_urls.append(url) if not valid_urls: return 0 # 获取创建前的数量 count_before = self.repo.count_by_target(target_id) # 创建 DTO 列表并批量创建 directory_dtos = [ DirectoryDTO(url=url, target_id=target_id) for url in valid_urls ] self.repo.bulk_create_ignore_conflicts(directory_dtos) # 获取创建后的数量 count_after = self.repo.count_by_target(target_id) return count_after - count_before def get_directories_by_target(self, target_id: int, filter_query: Optional[str] = None): """获取目标下的所有目录""" queryset = self.repo.get_by_target(target_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: Optional[str] = None): """获取所有目录""" queryset = self.repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_directory_urls_by_target(self, target_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取目标下的所有目录 URL""" return self.repo.get_urls_for_export(target_id=target_id, batch_size=chunk_size) def iter_raw_data_for_csv_export(self, target_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID Yields: 原始数据字典 """ return self.repo.iter_raw_data_for_export(target_id=target_id) __all__ = ['DirectoryService'] ================================================ FILE: backend/apps/asset/services/asset/endpoint_service.py ================================================ """ Endpoint 服务层 处理 URL/端点相关的业务逻辑 """ import logging from typing import List, Iterator, Optional from apps.asset.dtos.asset import EndpointDTO from apps.asset.repositories.asset import DjangoEndpointRepository from apps.common.validators import is_valid_url, is_url_match_target from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) class EndpointService: """ Endpoint 服务类 提供 Endpoint(URL/端点)相关的业务逻辑 """ # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'host': 'host', 'title': 'title', 'status_code': 'status_code', 'tech': 'tech', } def __init__(self): """初始化 Endpoint 服务""" self.repo = DjangoEndpointRepository() def bulk_upsert(self, endpoints: List[EndpointDTO]) -> int: """ 批量创建或更新端点(upsert) 存在则更新所有字段,不存在则创建。 Args: endpoints: 端点数据列表 Returns: int: 处理的记录数 """ if not endpoints: return 0 try: return self.repo.bulk_upsert(endpoints) except Exception as e: logger.error(f"批量 upsert 端点失败: {e}") raise def bulk_create_urls(self, target_id: int, target_name: str, target_type: str, urls: List[str]) -> int: """ 批量创建端点(仅 URL,使用 ignore_conflicts) 验证 URL 格式和匹配,过滤无效/不匹配 URL,去重后批量创建。 已存在的记录会被跳过。 Args: target_id: 目标 ID target_name: 目标名称(用于匹配验证) target_type: 目标类型 ('domain', 'ip', 'cidr') urls: URL 列表 Returns: int: 实际创建的记录数 """ if not urls: return 0 # 过滤有效 URL 并去重 valid_urls = [] seen = set() for url in urls: if not isinstance(url, str): continue url = url.strip() if not url or url in seen: continue if not is_valid_url(url): continue # 匹配验证(前端已阻止不匹配的提交,后端作为双重保障) if not is_url_match_target(url, target_name, target_type): continue seen.add(url) valid_urls.append(url) if not valid_urls: return 0 # 获取创建前的数量 count_before = self.repo.count_by_target(target_id) # 创建 DTO 列表并批量创建 endpoint_dtos = [ EndpointDTO(url=url, target_id=target_id) for url in valid_urls ] self.repo.bulk_create_ignore_conflicts(endpoint_dtos) # 获取创建后的数量 count_after = self.repo.count_by_target(target_id) return count_after - count_before def get_endpoints_by_target(self, target_id: int, filter_query: Optional[str] = None): """获取目标下的所有端点""" queryset = self.repo.get_by_target(target_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING, json_array_fields=['tech']) return queryset def count_endpoints_by_target(self, target_id: int) -> int: """ 统计目标下的端点数量 Args: target_id: 目标 ID Returns: int: 端点数量 """ return self.repo.count_by_target(target_id) def get_all(self, filter_query: Optional[str] = None): """获取所有端点(全局查询)""" queryset = self.repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING, json_array_fields=['tech']) return queryset def iter_endpoint_urls_by_target(self, target_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取目标下的所有端点 URL,用于导出。""" queryset = self.repo.get_by_target(target_id) for url in queryset.values_list('url', flat=True).iterator(chunk_size=chunk_size): yield url def iter_raw_data_for_csv_export(self, target_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID Yields: 原始数据字典 """ return self.repo.iter_raw_data_for_export(target_id=target_id) ================================================ FILE: backend/apps/asset/services/asset/host_port_mapping_service.py ================================================ """HostPortMapping Service - 业务逻辑层""" import logging from typing import List, Iterator, Optional, Dict from django.db.models import Min from apps.asset.repositories.asset import DjangoHostPortMappingRepository from apps.asset.dtos.asset import HostPortMappingDTO from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) class HostPortMappingService: """主机端口映射服务 - 负责主机端口映射数据的业务逻辑 职责: - 业务逻辑处理(过滤、聚合) - 调用 Repository 进行数据访问 """ # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'ip': 'ip', 'port': 'port', 'host': 'host', } def __init__(self): self.repo = DjangoHostPortMappingRepository() def bulk_create_ignore_conflicts(self, items: List[HostPortMappingDTO]) -> int: """ 批量创建主机端口映射(忽略冲突) Args: items: 主机端口映射 DTO 列表 Returns: int: 实际创建的记录数 Note: 使用数据库唯一约束 + ignore_conflicts 自动去重 """ try: logger.debug("Service: 准备批量创建主机端口映射 - 数量: %d", len(items)) created_count = self.repo.bulk_create_ignore_conflicts(items) logger.info("Service: 主机端口映射创建成功 - 数量: %d", created_count) return created_count except Exception as e: logger.error( "Service: 批量创建主机端口映射失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def iter_host_port_by_target(self, target_id: int, batch_size: int = 1000): return self.repo.get_for_export(target_id=target_id, batch_size=batch_size) def get_ip_aggregation_by_target( self, target_id: int, filter_query: Optional[str] = None ) -> List[Dict]: """获取目标下的 IP 聚合数据 Args: target_id: 目标 ID filter_query: 智能过滤语法字符串 Returns: 聚合后的 IP 数据列表 """ # 从 Repository 获取基础 QuerySet qs = self.repo.get_queryset_by_target(target_id) # Service 层应用过滤逻辑 if filter_query: qs = apply_filters(qs, filter_query, self.FILTER_FIELD_MAPPING) # Service 层处理聚合逻辑 return self._aggregate_by_ip(qs, filter_query, target_id=target_id) def get_all_ip_aggregation(self, filter_query: Optional[str] = None) -> List[Dict]: """获取所有 IP 聚合数据(全局查询) Args: filter_query: 智能过滤语法字符串 Returns: 聚合后的 IP 数据列表 """ # 从 Repository 获取基础 QuerySet qs = self.repo.get_all_queryset() # Service 层应用过滤逻辑 if filter_query: qs = apply_filters(qs, filter_query, self.FILTER_FIELD_MAPPING) # Service 层处理聚合逻辑 return self._aggregate_by_ip(qs, filter_query) def _aggregate_by_ip( self, qs, filter_query: Optional[str] = None, target_id: Optional[int] = None ) -> List[Dict]: """按 IP 聚合数据 Args: qs: 已过滤的 QuerySet filter_query: 过滤条件(用于子查询) target_id: 目标 ID(用于子查询限定范围) Returns: 聚合后的数据列表 """ ip_aggregated = ( qs .values('ip') .annotate(created_at=Min('created_at')) .order_by('-created_at') ) results = [] for item in ip_aggregated: ip = item['ip'] # 获取该 IP 的所有 host 和 port(也需要应用过滤条件) mappings_qs = self.repo.get_queryset_by_ip(ip, target_id=target_id) if filter_query: mappings_qs = apply_filters(mappings_qs, filter_query, self.FILTER_FIELD_MAPPING) mappings = mappings_qs.values('host', 'port').distinct() hosts = sorted({m['host'] for m in mappings}) ports = sorted({m['port'] for m in mappings}) results.append({ 'ip': ip, 'hosts': hosts, 'ports': ports, 'created_at': item['created_at'], }) return results def iter_ips_by_target(self, target_id: int, batch_size: int = 1000) -> Iterator[str]: """流式获取目标下的所有唯一 IP 地址。""" return self.repo.get_ips_for_export(target_id=target_id, batch_size=batch_size) def iter_raw_data_for_csv_export(self, target_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID Yields: 原始数据字典 {ip, host, port, created_at} """ return self.repo.iter_raw_data_for_export(target_id=target_id) ================================================ FILE: backend/apps/asset/services/asset/subdomain_service.py ================================================ import logging from typing import List, Dict, Optional from dataclasses import dataclass from apps.asset.repositories import DjangoSubdomainRepository from apps.asset.dtos import SubdomainDTO from apps.common.validators import is_valid_domain from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) @dataclass class BulkCreateResult: """批量创建结果""" created_count: int skipped_count: int invalid_count: int mismatched_count: int total_received: int class SubdomainService: """子域名业务逻辑层""" # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'name': 'name', } def __init__(self, repository=None): """ 初始化子域名服务 Args: repository: 子域名仓储实例(用于依赖注入) """ self.repo = repository or DjangoSubdomainRepository() # ==================== 查询操作 ==================== def get_all(self, filter_query: Optional[str] = None): """ 获取所有子域名 Args: filter_query: 智能过滤语法字符串 Returns: QuerySet: 子域名查询集 """ logger.debug("获取所有子域名") queryset = self.repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_subdomains_by_target(self, target_id: int, filter_query: Optional[str] = None): """ 获取目标下的子域名 Args: target_id: 目标 ID filter_query: 智能过滤语法字符串 Returns: QuerySet: 子域名查询集 """ queryset = self.repo.get_by_target(target_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def count_subdomains_by_target(self, target_id: int) -> int: """ 统计目标下的子域名数量 Args: target_id: 目标 ID Returns: int: 子域名数量 """ logger.debug("统计目标下子域名数量 - Target ID: %d", target_id) return self.repo.count_by_target(target_id) def get_by_names_and_target_id(self, names: set, target_id: int) -> dict: """ 根据域名列表和目标ID批量查询子域名 Args: names: 域名集合 target_id: 目标 ID Returns: dict: {域名: Subdomain对象} """ logger.debug("批量查询子域名 - 数量: %d, Target ID: %d", len(names), target_id) return self.repo.get_by_names_and_target_id(names, target_id) def get_subdomain_names_by_target(self, target_id: int) -> List[str]: """ 获取目标下的所有子域名名称 Args: target_id: 目标 ID Returns: List[str]: 子域名名称列表 """ logger.debug("获取目标下所有子域名 - Target ID: %d", target_id) return list(self.repo.get_domains_for_export(target_id=target_id)) def iter_subdomain_names_by_target(self, target_id: int, chunk_size: int = 1000): """ 流式获取目标下的所有子域名名称(内存优化) Args: target_id: 目标 ID chunk_size: 批次大小 Yields: str: 子域名名称 """ logger.debug("流式获取目标下所有子域名 - Target ID: %d, 批次大小: %d", target_id, chunk_size) return self.repo.get_domains_for_export(target_id=target_id, batch_size=chunk_size) def iter_raw_data_for_csv_export(self, target_id: int): """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID Yields: 原始数据字典 {name, created_at} """ return self.repo.iter_raw_data_for_export(target_id=target_id) # ==================== 创建操作 ==================== def bulk_create_ignore_conflicts(self, items: List[SubdomainDTO]) -> None: """ 批量创建子域名,忽略冲突 Args: items: 子域名 DTO 列表 Note: 使用 ignore_conflicts 策略,重复记录会被跳过 """ logger.debug("批量创建子域名 - 数量: %d", len(items)) return self.repo.bulk_create_ignore_conflicts(items) def bulk_create_subdomains( self, target_id: int, target_name: str, subdomains: List[str] ) -> BulkCreateResult: """ 批量创建子域名(带验证) Args: target_id: 目标 ID target_name: 目标域名(用于匹配验证) subdomains: 子域名列表 Returns: BulkCreateResult: 创建结果统计 """ total_received = len(subdomains) target_name = target_name.lower().strip() def is_subdomain_match(subdomain: str) -> bool: """验证子域名是否匹配目标域名""" if subdomain == target_name: return True if subdomain.endswith('.' + target_name): return True return False # 过滤有效的子域名 valid_subdomains = [] invalid_count = 0 mismatched_count = 0 for subdomain in subdomains: if not isinstance(subdomain, str) or not subdomain.strip(): continue subdomain = subdomain.lower().strip() # 验证格式 if not is_valid_domain(subdomain): invalid_count += 1 continue # 验证匹配 if not is_subdomain_match(subdomain): mismatched_count += 1 continue valid_subdomains.append(subdomain) # 去重 unique_subdomains = list(set(valid_subdomains)) duplicate_count = len(valid_subdomains) - len(unique_subdomains) if not unique_subdomains: return BulkCreateResult( created_count=0, skipped_count=duplicate_count, invalid_count=invalid_count, mismatched_count=mismatched_count, total_received=total_received, ) # 获取创建前的数量 count_before = self.repo.count_by_target(target_id) # 创建 DTO 列表并批量创建 subdomain_dtos = [ SubdomainDTO(name=name, target_id=target_id) for name in unique_subdomains ] self.repo.bulk_create_ignore_conflicts(subdomain_dtos) # 获取创建后的数量 count_after = self.repo.count_by_target(target_id) created_count = count_after - count_before # 计算因数据库冲突跳过的数量 db_skipped = len(unique_subdomains) - created_count return BulkCreateResult( created_count=created_count, skipped_count=duplicate_count + db_skipped, invalid_count=invalid_count, mismatched_count=mismatched_count, total_received=total_received, ) __all__ = ['SubdomainService', 'BulkCreateResult'] ================================================ FILE: backend/apps/asset/services/asset/vulnerability_service.py ================================================ """Vulnerability Service - 漏洞资产业务逻辑层""" import logging from typing import List, Optional from apps.asset.models import Vulnerability from apps.asset.dtos.asset import VulnerabilityDTO from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) @auto_ensure_db_connection class VulnerabilityService: """漏洞资产服务 当前提供基础的批量创建能力,使用 ignore_conflicts 依赖数据库唯一约束去重。 """ # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'type': 'vuln_type', 'severity': 'severity', 'source': 'source', 'url': 'url', } def bulk_create_ignore_conflicts(self, items: List[VulnerabilityDTO]) -> None: """批量创建漏洞资产记录,忽略冲突。 注意:会自动按 (target_id, url, vuln_type, source) 去重,保留最后一条记录。 Note: - 是否去重取决于模型上的唯一/部分唯一约束; - 当前 Vulnerability 模型未定义唯一约束,因此会保留全部记录。 """ if not items: logger.debug("漏洞资产列表为空,跳过保存") return try: # 根据模型唯一约束自动去重(如果模型没有唯一约束则跳过) unique_items = deduplicate_for_bulk(items, Vulnerability) vulns = [ Vulnerability( target_id=item.target_id, url=item.url, vuln_type=item.vuln_type, severity=item.severity, source=item.source, cvss_score=item.cvss_score, description=item.description, raw_output=item.raw_output, ) for item in unique_items ] Vulnerability.objects.bulk_create(vulns, ignore_conflicts=True) logger.info("漏洞资产保存成功 - 数量: %d", len(vulns)) except Exception as e: logger.error( "批量保存漏洞资产失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True, ) raise # ==================== 查询方法 ==================== def get_all(self, filter_query: Optional[str] = None): """获取所有漏洞 QuerySet(用于全局漏洞列表)。 Args: filter_query: 智能过滤语法字符串 Returns: QuerySet[Vulnerability]: 所有漏洞,按创建时间倒序 """ queryset = Vulnerability.objects.all().order_by("-created_at") if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_vulnerabilities_by_target(self, target_id: int, filter_query: Optional[str] = None): """按目标获取漏洞 QuerySet(用于分页)。 Args: target_id: 目标 ID filter_query: 智能过滤语法字符串 Returns: QuerySet[Vulnerability]: 目标下的所有漏洞,按创建时间倒序 """ queryset = Vulnerability.objects.filter(target_id=target_id).order_by("-created_at") if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def count_by_target(self, target_id: int) -> int: """统计目标下的漏洞数量。""" return Vulnerability.objects.filter(target_id=target_id).count() ================================================ FILE: backend/apps/asset/services/asset/website_service.py ================================================ """WebSite Service - 网站业务逻辑层""" import logging from typing import List, Iterator, Optional from apps.asset.repositories import DjangoWebSiteRepository from apps.asset.dtos import WebSiteDTO from apps.common.validators import is_valid_url, is_url_match_target from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) class WebSiteService: """网站业务逻辑层""" # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'host': 'host', 'title': 'title', 'status_code': 'status_code', 'tech': 'tech', } def __init__(self, repository=None): """初始化网站服务""" self.repo = repository or DjangoWebSiteRepository() def bulk_upsert(self, website_dtos: List[WebSiteDTO]) -> int: """ 批量创建或更新网站(upsert) 存在则更新所有字段,不存在则创建。 Args: website_dtos: WebSiteDTO 列表 Returns: int: 处理的记录数 """ if not website_dtos: return 0 try: return self.repo.bulk_upsert(website_dtos) except Exception as e: logger.error(f"批量 upsert 网站失败: {e}") raise def bulk_create_urls(self, target_id: int, target_name: str, target_type: str, urls: List[str]) -> int: """ 批量创建网站(仅 URL,使用 ignore_conflicts) 验证 URL 格式和匹配,过滤无效/不匹配 URL,去重后批量创建。 已存在的记录会被跳过。 Args: target_id: 目标 ID target_name: 目标名称(用于匹配验证) target_type: 目标类型 ('domain', 'ip', 'cidr') urls: URL 列表 Returns: int: 实际创建的记录数 """ if not urls: return 0 # 过滤有效 URL 并去重 valid_urls = [] seen = set() for url in urls: if not isinstance(url, str): continue url = url.strip() if not url or url in seen: continue if not is_valid_url(url): continue # 匹配验证(前端已阻止不匹配的提交,后端作为双重保障) if not is_url_match_target(url, target_name, target_type): continue seen.add(url) valid_urls.append(url) if not valid_urls: return 0 # 获取创建前的数量 count_before = self.repo.count_by_target(target_id) # 创建 DTO 列表并批量创建 website_dtos = [ WebSiteDTO(url=url, target_id=target_id) for url in valid_urls ] self.repo.bulk_create_ignore_conflicts(website_dtos) # 获取创建后的数量 count_after = self.repo.count_by_target(target_id) return count_after - count_before def get_websites_by_target(self, target_id: int, filter_query: Optional[str] = None): """获取目标下的所有网站""" queryset = self.repo.get_by_target(target_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING, json_array_fields=['tech']) return queryset def get_all(self, filter_query: Optional[str] = None): """获取所有网站""" queryset = self.repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING, json_array_fields=['tech']) return queryset def get_by_url(self, url: str, target_id: int) -> int: """根据 URL 和 target_id 查找网站 ID""" return self.repo.get_by_url(url=url, target_id=target_id) def iter_website_urls_by_target(self, target_id: int, chunk_size: int = 1000): """流式获取目标下的所有站点 URL""" return self.repo.get_urls_for_export(target_id=target_id, batch_size=chunk_size) def iter_raw_data_for_csv_export(self, target_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: target_id: 目标 ID Yields: 原始数据字典 """ return self.repo.iter_raw_data_for_export(target_id=target_id) __all__ = ['WebSiteService'] ================================================ FILE: backend/apps/asset/services/playwright_screenshot_service.py ================================================ """ Playwright 截图服务 使用 Playwright 异步批量捕获网站截图 """ import asyncio import logging from typing import Optional, AsyncGenerator logger = logging.getLogger(__name__) class PlaywrightScreenshotService: """Playwright 截图服务 - 异步多 Page 并发截图""" # 内置默认值(不暴露给用户) DEFAULT_VIEWPORT_WIDTH = 1920 DEFAULT_VIEWPORT_HEIGHT = 1080 DEFAULT_TIMEOUT = 30000 # 毫秒 DEFAULT_JPEG_QUALITY = 85 def __init__( self, viewport_width: int = DEFAULT_VIEWPORT_WIDTH, viewport_height: int = DEFAULT_VIEWPORT_HEIGHT, timeout: int = DEFAULT_TIMEOUT, concurrency: int = 5 ): """ 初始化 Playwright 截图服务 Args: viewport_width: 视口宽度(像素) viewport_height: 视口高度(像素) timeout: 页面加载超时时间(毫秒) concurrency: 并发截图数 """ self.viewport_width = viewport_width self.viewport_height = viewport_height self.timeout = timeout self.concurrency = concurrency async def capture_screenshot(self, url: str, page) -> tuple[Optional[bytes], Optional[int]]: """ 捕获单个 URL 的截图 Args: url: 目标 URL page: Playwright Page 对象 Returns: (screenshot_bytes, status_code) 元组 - screenshot_bytes: JPEG 格式的截图字节数据,失败返回 None - status_code: HTTP 响应状态码,失败返回 None """ status_code = None try: # 尝试加载页面,即使返回错误状态码也继续截图 try: response = await page.goto(url, timeout=self.timeout, wait_until='networkidle') if response: status_code = response.status except Exception as goto_error: # 页面加载失败(4xx/5xx 或其他错误),但页面可能已部分渲染 # 仍然尝试截图以捕获错误页面 logger.debug("页面加载异常但尝试截图: %s, 错误: %s", url, str(goto_error)[:50]) # 尝试截图(即使 goto 失败) screenshot_bytes = await page.screenshot( type='jpeg', quality=self.DEFAULT_JPEG_QUALITY, full_page=False ) return (screenshot_bytes, status_code) except asyncio.TimeoutError: logger.warning("截图超时: %s", url) return (None, None) except Exception as e: logger.warning("截图失败: %s, 错误: %s", url, str(e)[:100]) return (None, None) async def _capture_with_semaphore( self, url: str, context, semaphore: asyncio.Semaphore ) -> tuple[str, Optional[bytes], Optional[int]]: """ 使用信号量控制并发的截图任务 Args: url: 目标 URL context: Playwright BrowserContext semaphore: 并发控制信号量 Returns: (url, screenshot_bytes, status_code) 元组 """ async with semaphore: page = await context.new_page() try: screenshot_bytes, status_code = await self.capture_screenshot(url, page) return (url, screenshot_bytes, status_code) finally: await page.close() async def capture_batch( self, urls: list[str] ) -> AsyncGenerator[tuple[str, Optional[bytes], Optional[int]], None]: """ 批量捕获截图(异步生成器) 使用单个 BrowserContext + 多 Page 并发模式 通过 Semaphore 控制并发数 Args: urls: URL 列表 Yields: (url, screenshot_bytes, status_code) 元组 """ if not urls: return from playwright.async_api import async_playwright async with async_playwright() as p: # 启动浏览器(headless 模式) browser = await p.chromium.launch( headless=True, args=[ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu' ] ) try: # 创建单个 context context = await browser.new_context( viewport={ 'width': self.viewport_width, 'height': self.viewport_height }, ignore_https_errors=True, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ) # 使用 Semaphore 控制并发 semaphore = asyncio.Semaphore(self.concurrency) # 创建所有任务 tasks = [ self._capture_with_semaphore(url, context, semaphore) for url in urls ] # 使用 as_completed 实现流式返回 for coro in asyncio.as_completed(tasks): result = await coro yield result await context.close() finally: await browser.close() async def capture_batch_collect( self, urls: list[str] ) -> list[tuple[str, Optional[bytes], Optional[int]]]: """ 批量捕获截图(收集所有结果) Args: urls: URL 列表 Returns: [(url, screenshot_bytes, status_code), ...] 列表 """ results = [] async for result in self.capture_batch(urls): results.append(result) return results ================================================ FILE: backend/apps/asset/services/screenshot_service.py ================================================ """ 截图服务 负责截图的压缩、保存和同步 """ import io import logging import os from typing import Optional from PIL import Image logger = logging.getLogger(__name__) class ScreenshotService: """截图服务 - 负责压缩、保存和同步""" def __init__(self, max_width: int = 800, target_kb: int = 100): """ 初始化截图服务 Args: max_width: 最大宽度(像素) target_kb: 目标文件大小(KB) """ self.max_width = max_width self.target_kb = target_kb def compress_screenshot(self, image_path: str) -> Optional[bytes]: """ 压缩截图为 WebP 格式 Args: image_path: PNG 截图文件路径 Returns: 压缩后的 WebP 二进制数据,失败返回 None """ if not os.path.exists(image_path): logger.warning(f"截图文件不存在: {image_path}") return None try: with Image.open(image_path) as img: return self._compress_image(img) except Exception as e: logger.error(f"压缩截图失败: {image_path}, 错误: {e}") return None def compress_from_bytes(self, image_bytes: bytes) -> Optional[bytes]: """ 从字节数据压缩截图为 WebP 格式 Args: image_bytes: JPEG/PNG 图片字节数据 Returns: 压缩后的 WebP 二进制数据,失败返回 None """ if not image_bytes: return None try: img = Image.open(io.BytesIO(image_bytes)) return self._compress_image(img) except Exception as e: logger.error(f"从字节压缩截图失败: {e}") return None def _compress_image(self, img: Image.Image) -> Optional[bytes]: """ 压缩 PIL Image 对象为 WebP 格式 Args: img: PIL Image 对象 Returns: 压缩后的 WebP 二进制数据 """ try: if img.mode in ('RGBA', 'P'): img = img.convert('RGB') width, height = img.size if width > self.max_width: ratio = self.max_width / width new_size = (self.max_width, int(height * ratio)) img = img.resize(new_size, Image.Resampling.LANCZOS) quality = 80 while quality >= 10: buffer = io.BytesIO() img.save(buffer, format='WEBP', quality=quality, method=6) if len(buffer.getvalue()) <= self.target_kb * 1024: return buffer.getvalue() quality -= 10 return buffer.getvalue() except Exception as e: logger.error(f"压缩图片失败: {e}") return None def save_screenshot_snapshot( self, scan_id: int, url: str, image_data: bytes, status_code: int | None = None ) -> bool: """ 保存截图快照到 ScreenshotSnapshot 表 Args: scan_id: 扫描 ID url: 截图对应的 URL image_data: 压缩后的图片二进制数据 status_code: HTTP 响应状态码 Returns: 是否保存成功 """ from apps.asset.models import ScreenshotSnapshot try: ScreenshotSnapshot.objects.update_or_create( scan_id=scan_id, url=url, defaults={'image': image_data, 'status_code': status_code} ) return True except Exception as e: logger.error(f"保存截图快照失败: scan_id={scan_id}, url={url}, 错误: {e}") return False def sync_screenshots_to_asset(self, scan_id: int, target_id: int) -> int: """ 将扫描的截图快照同步到资产表 Args: scan_id: 扫描 ID target_id: 目标 ID Returns: 同步的截图数量 """ from apps.asset.models import Screenshot, ScreenshotSnapshot snapshots = ScreenshotSnapshot.objects.filter(scan_id=scan_id) count = 0 for snapshot in snapshots: try: Screenshot.objects.update_or_create( target_id=target_id, url=snapshot.url, defaults={ 'image': snapshot.image, 'status_code': snapshot.status_code } ) count += 1 except Exception as e: logger.error(f"同步截图到资产表失败: url={snapshot.url}, 错误: {e}") logger.info(f"同步截图完成: scan_id={scan_id}, target_id={target_id}, 数量={count}") return count def process_and_save_screenshot(self, scan_id: int, url: str, image_path: str) -> bool: """ 处理并保存截图(压缩 + 保存快照) Args: scan_id: 扫描 ID url: 截图对应的 URL image_path: PNG 截图文件路径 Returns: 是否处理成功 """ image_data = self.compress_screenshot(image_path) if image_data is None: return False return self.save_screenshot_snapshot(scan_id, url, image_data) ================================================ FILE: backend/apps/asset/services/search_service.py ================================================ """ 资产搜索服务 提供资产搜索的核心业务逻辑: - 从物化视图查询数据 - 支持表达式语法解析 - 支持 =(模糊)、==(精确)、!=(不等于)操作符 - 支持 && (AND) 和 || (OR) 逻辑组合 - 支持 Website 和 Endpoint 两种资产类型 """ import logging import re from typing import Optional, List, Dict, Any, Tuple, Literal, Iterator from django.db import connection logger = logging.getLogger(__name__) # 支持的字段映射(前端字段名 -> 数据库字段名) FIELD_MAPPING = { 'host': 'host', 'url': 'url', 'title': 'title', 'tech': 'tech', 'status': 'status_code', 'body': 'response_body', 'header': 'response_headers', } # 数组类型字段 ARRAY_FIELDS = {'tech'} # 资产类型到视图名的映射 VIEW_MAPPING = { 'website': 'asset_search_view', 'endpoint': 'endpoint_search_view', } # 资产类型到原表名的映射(用于 JOIN 获取数组字段) # ⚠️ 重要:pg_ivm 不支持 ArrayField,所有数组字段必须从原表 JOIN 获取 TABLE_MAPPING = { 'website': 'website', 'endpoint': 'endpoint', } # 有效的资产类型 VALID_ASSET_TYPES = {'website', 'endpoint'} # Website 查询字段(v=视图,t=原表) # ⚠️ 注意:t.tech 从原表获取,因为 pg_ivm 不支持 ArrayField WEBSITE_SELECT_FIELDS = """ v.id, v.url, v.host, v.title, t.tech, -- ArrayField,从 website 表 JOIN 获取 v.status_code, v.response_headers, v.response_body, v.content_type, v.content_length, v.webserver, v.location, v.vhost, v.created_at, v.target_id """ # Endpoint 查询字段 # ⚠️ 注意:t.tech 和 t.matched_gf_patterns 从原表获取,因为 pg_ivm 不支持 ArrayField ENDPOINT_SELECT_FIELDS = """ v.id, v.url, v.host, v.title, t.tech, -- ArrayField,从 endpoint 表 JOIN 获取 v.status_code, v.response_headers, v.response_body, v.content_type, v.content_length, v.webserver, v.location, v.vhost, t.matched_gf_patterns, -- ArrayField,从 endpoint 表 JOIN 获取 v.created_at, v.target_id """ class SearchQueryParser: """ 搜索查询解析器 支持语法: - field="value" 模糊匹配(ILIKE %value%) - field=="value" 精确匹配 - field!="value" 不等于 - && AND 连接 - || OR 连接 - () 分组(暂不支持嵌套) 示例: - host="api" && tech="nginx" - tech="vue" || tech="react" - status=="200" && host!="test" """ # 匹配单个条件: field="value" 或 field=="value" 或 field!="value" CONDITION_PATTERN = re.compile(r'(\w+)\s*(==|!=|=)\s*"([^"]*)"') @classmethod def parse(cls, query: str) -> Tuple[str, List[Any]]: """ 解析查询字符串,返回 SQL WHERE 子句和参数 Args: query: 搜索查询字符串 Returns: (where_clause, params) 元组 """ if not query or not query.strip(): return "1=1", [] query = query.strip() # 检查是否包含操作符语法,如果不包含则作为 host 模糊搜索 if not cls.CONDITION_PATTERN.search(query): # 裸文本,默认作为 host 模糊搜索(v 是视图别名) return "v.host ILIKE %s", [f"%{query}%"] # 按 || 分割为 OR 组 or_groups = cls._split_by_or(query) if len(or_groups) == 1: # 没有 OR,直接解析 AND 条件 return cls._parse_and_group(or_groups[0]) # 多个 OR 组 or_clauses = [] all_params = [] for group in or_groups: clause, params = cls._parse_and_group(group) if clause and clause != "1=1": or_clauses.append(f"({clause})") all_params.extend(params) if not or_clauses: return "1=1", [] return " OR ".join(or_clauses), all_params @classmethod def _split_by_or(cls, query: str) -> List[str]: """按 || 分割查询,但忽略引号内的 ||""" parts = [] current = "" in_quotes = False i = 0 while i < len(query): char = query[i] if char == '"': in_quotes = not in_quotes current += char elif not in_quotes and i + 1 < len(query) and query[i:i+2] == '||': if current.strip(): parts.append(current.strip()) current = "" i += 1 # 跳过第二个 | else: current += char i += 1 if current.strip(): parts.append(current.strip()) return parts if parts else [query] @classmethod def _parse_and_group(cls, group: str) -> Tuple[str, List[Any]]: """解析 AND 组(用 && 连接的条件)""" # 移除外层括号 group = group.strip() if group.startswith('(') and group.endswith(')'): group = group[1:-1].strip() # 按 && 分割 parts = cls._split_by_and(group) and_clauses = [] all_params = [] for part in parts: clause, params = cls._parse_condition(part.strip()) if clause: and_clauses.append(clause) all_params.extend(params) if not and_clauses: return "1=1", [] return " AND ".join(and_clauses), all_params @classmethod def _split_by_and(cls, query: str) -> List[str]: """按 && 分割查询,但忽略引号内的 &&""" parts = [] current = "" in_quotes = False i = 0 while i < len(query): char = query[i] if char == '"': in_quotes = not in_quotes current += char elif not in_quotes and i + 1 < len(query) and query[i:i+2] == '&&': if current.strip(): parts.append(current.strip()) current = "" i += 1 # 跳过第二个 & else: current += char i += 1 if current.strip(): parts.append(current.strip()) return parts if parts else [query] @classmethod def _parse_condition(cls, condition: str) -> Tuple[Optional[str], List[Any]]: """ 解析单个条件 Returns: (sql_clause, params) 或 (None, []) 如果解析失败 """ # 移除括号 condition = condition.strip() if condition.startswith('(') and condition.endswith(')'): condition = condition[1:-1].strip() match = cls.CONDITION_PATTERN.match(condition) if not match: logger.warning(f"无法解析条件: {condition}") return None, [] field, operator, value = match.groups() field = field.lower() # 验证字段 if field not in FIELD_MAPPING: logger.warning(f"未知字段: {field}") return None, [] db_field = FIELD_MAPPING[field] is_array = field in ARRAY_FIELDS # 根据操作符生成 SQL if operator == '=': # 模糊匹配 return cls._build_like_condition(db_field, value, is_array) elif operator == '==': # 精确匹配 return cls._build_exact_condition(db_field, value, is_array) elif operator == '!=': # 不等于 return cls._build_not_equal_condition(db_field, value, is_array) return None, [] @classmethod def _build_like_condition(cls, field: str, value: str, is_array: bool) -> Tuple[str, List[Any]]: """构建模糊匹配条件""" if is_array: # 数组字段:检查数组中是否有元素包含该值(从原表 t 获取) return f"EXISTS (SELECT 1 FROM unnest(t.{field}) AS elem WHERE elem ILIKE %s)", [f"%{value}%"] elif field == 'status_code': # 状态码是整数,模糊匹配转为精确匹配 try: return f"v.{field} = %s", [int(value)] except ValueError: return f"v.{field}::text ILIKE %s", [f"%{value}%"] else: return f"v.{field} ILIKE %s", [f"%{value}%"] @classmethod def _build_exact_condition(cls, field: str, value: str, is_array: bool) -> Tuple[str, List[Any]]: """构建精确匹配条件""" if is_array: # 数组字段:检查数组中是否包含该精确值(从原表 t 获取) return f"%s = ANY(t.{field})", [value] elif field == 'status_code': # 状态码是整数 try: return f"v.{field} = %s", [int(value)] except ValueError: return f"v.{field}::text = %s", [value] else: return f"v.{field} = %s", [value] @classmethod def _build_not_equal_condition(cls, field: str, value: str, is_array: bool) -> Tuple[str, List[Any]]: """构建不等于条件""" if is_array: # 数组字段:检查数组中不包含该值(从原表 t 获取) return f"NOT (%s = ANY(t.{field}))", [value] elif field == 'status_code': try: return f"(v.{field} IS NULL OR v.{field} != %s)", [int(value)] except ValueError: return f"(v.{field} IS NULL OR v.{field}::text != %s)", [value] else: return f"(v.{field} IS NULL OR v.{field} != %s)", [value] AssetType = Literal['website', 'endpoint'] class AssetSearchService: """资产搜索服务""" def search( self, query: str, asset_type: AssetType = 'website', limit: Optional[int] = None ) -> List[Dict[str, Any]]: """ 搜索资产 Args: query: 搜索查询字符串 asset_type: 资产类型 ('website' 或 'endpoint') limit: 最大返回数量(可选) Returns: List[Dict]: 搜索结果列表 """ where_clause, params = SearchQueryParser.parse(query) # 根据资产类型选择视图、原表和字段 view_name = VIEW_MAPPING.get(asset_type, 'asset_search_view') table_name = TABLE_MAPPING.get(asset_type, 'website') select_fields = ENDPOINT_SELECT_FIELDS if asset_type == 'endpoint' else WEBSITE_SELECT_FIELDS # JOIN 原表获取数组字段(tech, matched_gf_patterns) sql = f""" SELECT {select_fields} FROM {view_name} v JOIN {table_name} t ON v.id = t.id WHERE {where_clause} ORDER BY v.created_at DESC """ # 添加 LIMIT if limit is not None and limit > 0: sql += f" LIMIT {int(limit)}" try: with connection.cursor() as cursor: cursor.execute(sql, params) columns = [col[0] for col in cursor.description] results = [] for row in cursor.fetchall(): result = dict(zip(columns, row)) results.append(result) return results except Exception as e: logger.error(f"搜索查询失败: {e}, SQL: {sql}, params: {params}") raise def count(self, query: str, asset_type: AssetType = 'website', statement_timeout_ms: int = 300000) -> int: """ 统计搜索结果数量 Args: query: 搜索查询字符串 asset_type: 资产类型 ('website' 或 'endpoint') statement_timeout_ms: SQL 语句超时时间(毫秒),默认 5 分钟 Returns: int: 结果总数 """ where_clause, params = SearchQueryParser.parse(query) # 根据资产类型选择视图和原表 view_name = VIEW_MAPPING.get(asset_type, 'asset_search_view') table_name = TABLE_MAPPING.get(asset_type, 'website') # JOIN 原表以支持数组字段查询 sql = f"SELECT COUNT(*) FROM {view_name} v JOIN {table_name} t ON v.id = t.id WHERE {where_clause}" try: with connection.cursor() as cursor: # 为导出设置更长的超时时间(仅影响当前会话) cursor.execute(f"SET LOCAL statement_timeout = {statement_timeout_ms}") cursor.execute(sql, params) return cursor.fetchone()[0] except Exception as e: logger.error(f"统计查询失败: {e}") raise def search_iter( self, query: str, asset_type: AssetType = 'website', batch_size: int = 1000, statement_timeout_ms: int = 300000 ) -> Iterator[Dict[str, Any]]: """ 流式搜索资产(使用分批查询,内存友好) Args: query: 搜索查询字符串 asset_type: 资产类型 ('website' 或 'endpoint') batch_size: 每批获取的数量 statement_timeout_ms: SQL 语句超时时间(毫秒),默认 5 分钟 Yields: Dict: 单条搜索结果 """ where_clause, params = SearchQueryParser.parse(query) # 根据资产类型选择视图、原表和字段 view_name = VIEW_MAPPING.get(asset_type, 'asset_search_view') table_name = TABLE_MAPPING.get(asset_type, 'website') select_fields = ENDPOINT_SELECT_FIELDS if asset_type == 'endpoint' else WEBSITE_SELECT_FIELDS # 使用 OFFSET/LIMIT 分批查询(Django 不支持命名游标) offset = 0 try: while True: # JOIN 原表获取数组字段 sql = f""" SELECT {select_fields} FROM {view_name} v JOIN {table_name} t ON v.id = t.id WHERE {where_clause} ORDER BY v.created_at DESC LIMIT {batch_size} OFFSET {offset} """ with connection.cursor() as cursor: # 为导出设置更长的超时时间(仅影响当前会话) cursor.execute(f"SET LOCAL statement_timeout = {statement_timeout_ms}") cursor.execute(sql, params) columns = [col[0] for col in cursor.description] rows = cursor.fetchall() if not rows: break for row in rows: yield dict(zip(columns, row)) # 如果返回的行数少于 batch_size,说明已经是最后一批 if len(rows) < batch_size: break offset += batch_size except Exception as e: logger.error(f"流式搜索查询失败: {e}, SQL: {sql}, params: {params}") raise ================================================ FILE: backend/apps/asset/services/snapshot/__init__.py ================================================ """Snapshot Services - 快照服务""" from .subdomain_snapshots_service import SubdomainSnapshotsService from .host_port_mapping_snapshots_service import HostPortMappingSnapshotsService from .website_snapshots_service import WebsiteSnapshotsService from .directory_snapshots_service import DirectorySnapshotsService from .endpoint_snapshots_service import EndpointSnapshotsService from .vulnerability_snapshots_service import VulnerabilitySnapshotsService __all__ = [ 'SubdomainSnapshotsService', 'HostPortMappingSnapshotsService', 'WebsiteSnapshotsService', 'DirectorySnapshotsService', 'EndpointSnapshotsService', 'VulnerabilitySnapshotsService', ] ================================================ FILE: backend/apps/asset/services/snapshot/directory_snapshots_service.py ================================================ """Directory Snapshots Service - 业务逻辑层""" import logging from typing import List, Iterator from apps.asset.repositories.snapshot import DjangoDirectorySnapshotRepository from apps.asset.services.asset import DirectoryService from apps.asset.dtos.snapshot import DirectorySnapshotDTO logger = logging.getLogger(__name__) class DirectorySnapshotsService: """目录快照服务 - 统一管理快照和资产同步""" def __init__(self): self.snapshot_repo = DjangoDirectorySnapshotRepository() self.asset_service = DirectoryService() def save_and_sync(self, items: List[DirectorySnapshotDTO]) -> None: """ 保存目录快照并同步到资产表(统一入口) 流程: 1. 保存到快照表(完整记录,包含 scan_id) 2. 同步到资产表(去重,不包含 scan_id) Args: items: 目录快照 DTO 列表(必须包含 target_id) Raises: Exception: 数据库操作失败 """ if not items: return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过目录快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: logger.debug("保存目录快照并同步到资产表 - 数量: %d", len(items)) # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到快照表") self.snapshot_repo.save_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表(upsert) # - 新记录:插入资产表 # - 已存在的记录:更新字段(created_at 不更新,保留创建时间) logger.debug("步骤 2: 同步到资产表(通过 Service 层,upsert)") asset_items = [item.to_asset_dto() for item in items] self.asset_service.bulk_upsert(asset_items) logger.info("目录快照和资产数据保存成功 - 数量: %d", len(items)) except Exception as e: logger.error( "保存目录快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'status': 'status', 'content_type': 'content_type', } def get_by_scan(self, scan_id: int, filter_query: str = None): from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_by_scan(scan_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: str = None): """获取所有目录快照""" from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_directory_urls_by_scan(self, scan_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取某次扫描下的所有目录 URL。""" queryset = self.snapshot_repo.get_by_scan(scan_id) for snapshot in queryset.iterator(chunk_size=chunk_size): yield snapshot.url def iter_raw_data_for_csv_export(self, scan_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID Yields: 原始数据字典 """ return self.snapshot_repo.iter_raw_data_for_export(scan_id=scan_id) ================================================ FILE: backend/apps/asset/services/snapshot/endpoint_snapshots_service.py ================================================ """Endpoint Snapshots Service - 业务逻辑层""" import logging from typing import List, Iterator from apps.asset.repositories.snapshot import DjangoEndpointSnapshotRepository from apps.asset.services.asset import EndpointService from apps.asset.dtos.snapshot import EndpointSnapshotDTO logger = logging.getLogger(__name__) class EndpointSnapshotsService: """端点快照服务 - 统一管理快照和资产同步""" def __init__(self): self.snapshot_repo = DjangoEndpointSnapshotRepository() self.asset_service = EndpointService() def save_and_sync(self, items: List[EndpointSnapshotDTO]) -> None: """ 保存端点快照并同步到资产表(统一入口) 流程: 1. 保存到快照表(完整记录) 2. 同步到资产表(去重) Args: items: 端点快照 DTO 列表(必须包含 target_id) Raises: ValueError: 如果 items 中的 target_id 为 None Exception: 数据库操作失败 """ if not items: return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过端点快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: logger.debug("保存端点快照并同步到资产表 - 数量: %d", len(items)) # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到快照表") self.snapshot_repo.save_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表 # 使用 upsert:新记录插入,已存在的记录更新 logger.debug("步骤 2: 同步到资产表(通过 Service 层)") asset_items = [item.to_asset_dto() for item in items] self.asset_service.bulk_upsert(asset_items) logger.info("端点快照和资产数据保存成功 - 数量: %d", len(items)) except Exception as e: logger.error( "保存端点快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'host': 'host', 'title': 'title', 'status_code': 'status_code', 'webserver': 'webserver', 'tech': 'tech', } def get_by_scan(self, scan_id: int, filter_query: str = None): from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_by_scan(scan_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: str = None): """获取所有端点快照""" from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_endpoint_urls_by_scan(self, scan_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取某次扫描下的所有端点 URL。""" queryset = self.snapshot_repo.get_by_scan(scan_id) for snapshot in queryset.iterator(chunk_size=chunk_size): yield snapshot.url def iter_raw_data_for_csv_export(self, scan_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID Yields: 原始数据字典 """ return self.snapshot_repo.iter_raw_data_for_export(scan_id=scan_id) ================================================ FILE: backend/apps/asset/services/snapshot/host_port_mapping_snapshots_service.py ================================================ """HostPortMapping Snapshots Service - 业务逻辑层""" import logging from typing import List, Iterator from apps.asset.repositories.snapshot import DjangoHostPortMappingSnapshotRepository from apps.asset.services.asset import HostPortMappingService from apps.asset.dtos.snapshot import HostPortMappingSnapshotDTO logger = logging.getLogger(__name__) class HostPortMappingSnapshotsService: """HostPortMapping Snapshots Service - 统一管理快照和资产同步""" def __init__(self): self.snapshot_repo = DjangoHostPortMappingSnapshotRepository() self.asset_service = HostPortMappingService() def save_and_sync(self, items: List[HostPortMappingSnapshotDTO]) -> None: """ 保存主机端口关联快照并同步到资产表(统一入口) 流程: 1. 保存到快照表(完整记录,包含 scan_id) 2. 同步到资产表(去重,不包含 scan_id) Args: items: 主机端口关联快照 DTO 列表(必须包含 target_id) Note: target_id 已经包含在 DTO 中,无需额外传参。 """ logger.debug("保存主机端口关联快照 - 数量: %d", len(items)) if not items: logger.debug("快照数据为空,跳过保存") return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过主机端口快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到快照表") self.snapshot_repo.save_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表 # 注意:去重是通过数据库的 UNIQUE 约束 + ignore_conflicts 实现的 # - 新记录:插入资产表 # - 已存在的记录:自动跳过 logger.debug("步骤 2: 同步到资产表(通过 Service 层)") asset_items = [item.to_asset_dto() for item in items] self.asset_service.bulk_create_ignore_conflicts(asset_items) logger.info("主机端口关联快照和资产数据保存成功 - 数量: %d", len(items)) except Exception as e: logger.error( "保存主机端口关联快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise def get_ip_aggregation_by_scan(self, scan_id: int, filter_query: str = None): return self.snapshot_repo.get_ip_aggregation_by_scan(scan_id, filter_query=filter_query) def get_all_ip_aggregation(self, filter_query: str = None): """获取所有 IP 聚合数据""" return self.snapshot_repo.get_all_ip_aggregation(filter_query=filter_query) def iter_ips_by_scan(self, scan_id: int, batch_size: int = 1000) -> Iterator[str]: """流式获取某次扫描下的所有唯一 IP 地址。""" return self.snapshot_repo.get_ips_for_export(scan_id=scan_id, batch_size=batch_size) def iter_raw_data_for_csv_export(self, scan_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID Yields: 原始数据字典 {ip, host, port, created_at} """ return self.snapshot_repo.iter_raw_data_for_export(scan_id=scan_id) ================================================ FILE: backend/apps/asset/services/snapshot/subdomain_snapshots_service.py ================================================ import logging from typing import List, Iterator from apps.asset.dtos import SubdomainSnapshotDTO from apps.asset.repositories import DjangoSubdomainSnapshotRepository logger = logging.getLogger(__name__) class SubdomainSnapshotsService: """子域名快照服务 - 负责子域名快照数据的业务逻辑""" def __init__(self): self.subdomain_snapshot_repo = DjangoSubdomainSnapshotRepository() def save_and_sync(self, items: List[SubdomainSnapshotDTO]) -> None: """ 保存子域名快照并同步到资产表(统一入口) 流程: 1. 保存到快照表(完整记录,包含 scan_id) 2. 同步到资产表(去重,不包含 scan_id) Args: items: 子域名快照 DTO 列表(包含 target_id) Note: target_id 已经包含在 DTO 中,无需额外传参。 """ logger.debug("保存子域名快照 - 数量: %d", len(items)) if not items: logger.debug("快照数据为空,跳过保存") return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到快照表") self.subdomain_snapshot_repo.save_subdomain_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表(通过数据库唯一约束自动去重) # 注意:去重是通过数据库的 UNIQUE 约束 + ignore_conflicts 实现的 # - 新子域名:插入资产表 # - 已存在的子域名:自动跳过(不更新,因为资产表只记录核心数据) asset_items = [item.to_asset_dto() for item in items] from apps.asset.services import SubdomainService subdomain_service = SubdomainService() subdomain_service.bulk_create_ignore_conflicts(asset_items) logger.info("子域名快照和业务数据保存成功 - 数量: %d", len(items)) except Exception as e: logger.error( "保存子域名快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'name': 'name', } def get_by_scan(self, scan_id: int, filter_query: str = None): from apps.common.utils.filter_utils import apply_filters queryset = self.subdomain_snapshot_repo.get_by_scan(scan_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: str = None): """获取所有子域名快照""" from apps.common.utils.filter_utils import apply_filters queryset = self.subdomain_snapshot_repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_subdomain_names_by_scan(self, scan_id: int, chunk_size: int = 1000) -> Iterator[str]: queryset = self.subdomain_snapshot_repo.get_by_scan(scan_id) for snapshot in queryset.iterator(chunk_size=chunk_size): yield snapshot.name def iter_raw_data_for_csv_export(self, scan_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID Yields: 原始数据字典 {name, created_at} """ return self.subdomain_snapshot_repo.iter_raw_data_for_export(scan_id=scan_id) ================================================ FILE: backend/apps/asset/services/snapshot/vulnerability_snapshots_service.py ================================================ """Vulnerability Snapshots Service - 业务逻辑层""" import logging from typing import List, Iterator from apps.asset.repositories.snapshot import DjangoVulnerabilitySnapshotRepository from apps.asset.services.asset.vulnerability_service import VulnerabilityService from apps.asset.dtos.snapshot import VulnerabilitySnapshotDTO logger = logging.getLogger(__name__) class VulnerabilitySnapshotsService: """漏洞快照服务 - 统一管理快照和资产同步。 流程与 Website/Directory 等保持一致: 1. 保存到 VulnerabilitySnapshot 快照表(包含 scan_id) 2. 转为 VulnerabilityDTO 并同步到 Vulnerability 资产表(基于 target_id) """ def __init__(self): self.snapshot_repo = DjangoVulnerabilitySnapshotRepository() self.asset_service = VulnerabilityService() def save_and_sync(self, items: List[VulnerabilitySnapshotDTO]) -> None: """保存漏洞快照并同步到漏洞资产表。""" if not items: return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过漏洞快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: logger.debug("保存漏洞快照并同步到资产表 - 数量: %d", len(items)) # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到漏洞快照表") self.snapshot_repo.save_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表 logger.debug("步骤 2: 同步到漏洞资产表") asset_items = [item.to_asset_dto() for item in items] self.asset_service.bulk_create_ignore_conflicts(asset_items) logger.info("漏洞快照和资产数据保存成功 - 数量: %d", len(items)) # 步骤 3: 发布漏洞保存信号(通知等模块可监听) from apps.common.signals import vulnerabilities_saved vulnerabilities_saved.send( sender=self.__class__, items=items, scan_id=scan_id, target_id=items[0].target_id if items else None ) except Exception as e: logger.error( "保存漏洞快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True, ) raise # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'type': 'vuln_type', 'url': 'url', 'severity': 'severity', 'source': 'source', } def get_by_scan(self, scan_id: int, filter_query: str = None): """按扫描任务获取所有漏洞快照。""" from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_by_scan(scan_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: str = None): """获取所有漏洞快照""" from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_vuln_urls_by_scan(self, scan_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取某次扫描下的所有漏洞 URL。""" queryset = self.snapshot_repo.get_by_scan(scan_id) for snapshot in queryset.iterator(chunk_size=chunk_size): yield snapshot.url ================================================ FILE: backend/apps/asset/services/snapshot/website_snapshots_service.py ================================================ """Website Snapshots Service - 业务逻辑层""" import logging from typing import List, Iterator from apps.asset.repositories.snapshot import DjangoWebsiteSnapshotRepository from apps.asset.services.asset import WebSiteService from apps.asset.dtos.snapshot import WebsiteSnapshotDTO logger = logging.getLogger(__name__) class WebsiteSnapshotsService: """网站快照服务 - 统一管理快照和资产同步""" def __init__(self): self.snapshot_repo = DjangoWebsiteSnapshotRepository() self.asset_service = WebSiteService() def save_and_sync(self, items: List[WebsiteSnapshotDTO]) -> None: """ 保存网站快照并同步到资产表(统一入口) 流程: 1. 保存到快照表(完整记录,包含 scan_id) 2. 同步到资产表(去重,不包含 scan_id) Args: items: 网站快照 DTO 列表(必须包含 target_id) Raises: ValueError: 如果 items 中的 target_id 为 None Exception: 数据库操作失败 """ if not items: return # 检查 Scan 是否仍存在(防止删除后竞态写入) scan_id = items[0].scan_id from apps.scan.repositories import DjangoScanRepository if not DjangoScanRepository().exists(scan_id): logger.warning("Scan 已删除,跳过网站快照保存 - scan_id=%s, 数量=%d", scan_id, len(items)) return try: logger.debug("保存网站快照并同步到资产表 - 数量: %d", len(items)) # 步骤 1: 保存到快照表 logger.debug("步骤 1: 保存到快照表") self.snapshot_repo.save_snapshots(items) # 步骤 2: 转换为资产 DTO 并保存到资产表(upsert) # - 新记录:插入资产表 # - 已存在的记录:更新字段(created_at 不更新,保留创建时间) logger.debug("步骤 2: 同步到资产表(通过 Service 层,upsert)") asset_items = [item.to_asset_dto() for item in items] self.asset_service.bulk_upsert(asset_items) logger.info("网站快照和资产数据保存成功 - 数量: %d", len(items)) except Exception as e: logger.error( "保存网站快照失败 - 数量: %d, 错误: %s", len(items), str(e), exc_info=True ) raise # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'url': 'url', 'host': 'host', 'title': 'title', 'status_code': 'status_code', 'webserver': 'webserver', 'tech': 'tech', } def get_by_scan(self, scan_id: int, filter_query: str = None): from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_by_scan(scan_id) if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def get_all(self, filter_query: str = None): """获取所有网站快照""" from apps.common.utils.filter_utils import apply_filters queryset = self.snapshot_repo.get_all() if filter_query: queryset = apply_filters(queryset, filter_query, self.FILTER_FIELD_MAPPING) return queryset def iter_website_urls_by_scan(self, scan_id: int, chunk_size: int = 1000) -> Iterator[str]: """流式获取某次扫描下的所有站点 URL(按创建时间倒序)。""" queryset = self.snapshot_repo.get_by_scan(scan_id) for snapshot in queryset.iterator(chunk_size=chunk_size): yield snapshot.url def iter_raw_data_for_csv_export(self, scan_id: int) -> Iterator[dict]: """ 流式获取原始数据用于 CSV 导出 Args: scan_id: 扫描 ID Yields: 原始数据字典 """ return self.snapshot_repo.iter_raw_data_for_export(scan_id=scan_id) ================================================ FILE: backend/apps/asset/services/statistics_service.py ================================================ """资产统计 Service""" import logging from typing import Optional from django.db.models import Count from apps.asset.repositories import AssetStatisticsRepository from apps.asset.models import ( AssetStatistics, StatisticsHistory, Subdomain, WebSite, Endpoint, HostPortMapping, Vulnerability, ) from apps.targets.models import Target from apps.scan.models import Scan logger = logging.getLogger(__name__) class AssetStatisticsService: """ 资产统计服务 职责: - 获取统计数据 - 刷新统计数据(供定时任务调用) """ def __init__(self): self.repo = AssetStatisticsRepository() def get_statistics(self) -> dict: """ 获取统计数据 Returns: 统计数据字典 """ stats = self.repo.get_statistics() if stats is None: # 如果没有统计数据,返回默认值 return { 'total_targets': 0, 'total_subdomains': 0, 'total_ips': 0, 'total_endpoints': 0, 'total_websites': 0, 'total_vulns': 0, 'total_assets': 0, 'running_scans': Scan.objects.filter(status='running').count(), 'updated_at': None, # 变化值 'change_targets': 0, 'change_subdomains': 0, 'change_ips': 0, 'change_endpoints': 0, 'change_websites': 0, 'change_vulns': 0, 'change_assets': 0, 'vuln_by_severity': self._get_vuln_by_severity(), } # 运行中的扫描数量实时查询(数量小,无需缓存) running_scans = Scan.objects.filter(status='running').count() return { 'total_targets': stats.total_targets, 'total_subdomains': stats.total_subdomains, 'total_ips': stats.total_ips, 'total_endpoints': stats.total_endpoints, 'total_websites': stats.total_websites, 'total_vulns': stats.total_vulns, 'total_assets': stats.total_assets, 'running_scans': running_scans, 'updated_at': stats.updated_at, # 变化值 = 当前值 - 上次值 'change_targets': stats.total_targets - stats.prev_targets, 'change_subdomains': stats.total_subdomains - stats.prev_subdomains, 'change_ips': stats.total_ips - stats.prev_ips, 'change_endpoints': stats.total_endpoints - stats.prev_endpoints, 'change_websites': stats.total_websites - stats.prev_websites, 'change_vulns': stats.total_vulns - stats.prev_vulns, 'change_assets': stats.total_assets - stats.prev_assets, # 漏洞严重程度分布 'vuln_by_severity': self._get_vuln_by_severity(), } def _get_vuln_by_severity(self) -> dict: """获取按严重程度统计的漏洞数量""" result = Vulnerability.objects.values('severity').annotate(count=Count('id')) severity_map = {item['severity']: item['count'] for item in result} return { 'critical': severity_map.get('critical', 0), 'high': severity_map.get('high', 0), 'medium': severity_map.get('medium', 0), 'low': severity_map.get('low', 0), 'info': severity_map.get('info', 0), } def refresh_statistics(self) -> AssetStatistics: """ 刷新统计数据(执行实际 COUNT 查询) 供定时任务调用,不建议在接口中直接调用。 Returns: 更新后的统计数据对象 """ logger.info("开始刷新资产统计...") # 执行 COUNT 查询 total_targets = Target.objects.filter(deleted_at__isnull=True).count() total_subdomains = Subdomain.objects.count() total_ips = HostPortMapping.objects.values('ip').distinct().count() total_endpoints = Endpoint.objects.count() total_websites = WebSite.objects.count() total_vulns = Vulnerability.objects.count() # 更新统计表 stats = self.repo.update_statistics( total_targets=total_targets, total_subdomains=total_subdomains, total_ips=total_ips, total_endpoints=total_endpoints, total_websites=total_websites, total_vulns=total_vulns, ) # 保存每日快照(用于折线图) self.repo.save_daily_snapshot(stats) logger.info("资产统计刷新完成") return stats def get_statistics_history(self, days: int = 7) -> list[dict]: """ 获取历史统计数据(用于折线图) Args: days: 获取最近多少天的数据,默认 7 天 Returns: 历史数据列表,每项包含 date 和各统计字段 """ history = self.repo.get_history(days=days) return [ { 'date': h.date.isoformat(), 'totalTargets': h.total_targets, 'totalSubdomains': h.total_subdomains, 'totalIps': h.total_ips, 'totalEndpoints': h.total_endpoints, 'totalWebsites': h.total_websites, 'totalVulns': h.total_vulns, 'totalAssets': h.total_assets, } for h in history ] ================================================ FILE: backend/apps/asset/urls.py ================================================ """ Asset 应用 URL 配置 """ from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import ( SubdomainViewSet, WebSiteViewSet, DirectoryViewSet, VulnerabilityViewSet, AssetStatisticsViewSet, AssetSearchView, AssetSearchExportView, EndpointViewSet, HostPortMappingViewSet, ScreenshotViewSet, ) # 创建 DRF 路由器 router = DefaultRouter() # 注册 ViewSet router.register(r'subdomains', SubdomainViewSet, basename='subdomain') router.register(r'websites', WebSiteViewSet, basename='website') router.register(r'directories', DirectoryViewSet, basename='directory') router.register(r'endpoints', EndpointViewSet, basename='endpoint') router.register(r'ip-addresses', HostPortMappingViewSet, basename='ip-address') router.register(r'vulnerabilities', VulnerabilityViewSet, basename='vulnerability') router.register(r'screenshots', ScreenshotViewSet, basename='screenshot') router.register(r'statistics', AssetStatisticsViewSet, basename='asset-statistics') urlpatterns = [ path('assets/', include(router.urls)), path('assets/search/', AssetSearchView.as_view(), name='asset-search'), path('assets/search/export/', AssetSearchExportView.as_view(), name='asset-search-export'), ] ================================================ FILE: backend/apps/asset/views/__init__.py ================================================ """ Asset 应用视图模块 重新导出所有视图类以保持向后兼容 """ from .asset_views import ( AssetStatisticsViewSet, SubdomainViewSet, WebSiteViewSet, DirectoryViewSet, EndpointViewSet, HostPortMappingViewSet, VulnerabilityViewSet, SubdomainSnapshotViewSet, WebsiteSnapshotViewSet, DirectorySnapshotViewSet, EndpointSnapshotViewSet, HostPortMappingSnapshotViewSet, VulnerabilitySnapshotViewSet, ScreenshotViewSet, ScreenshotSnapshotViewSet, ) from .search_views import AssetSearchView, AssetSearchExportView __all__ = [ 'AssetStatisticsViewSet', 'SubdomainViewSet', 'WebSiteViewSet', 'DirectoryViewSet', 'EndpointViewSet', 'HostPortMappingViewSet', 'VulnerabilityViewSet', 'SubdomainSnapshotViewSet', 'WebsiteSnapshotViewSet', 'DirectorySnapshotViewSet', 'EndpointSnapshotViewSet', 'HostPortMappingSnapshotViewSet', 'VulnerabilitySnapshotViewSet', 'ScreenshotViewSet', 'ScreenshotSnapshotViewSet', 'AssetSearchView', 'AssetSearchExportView', ] ================================================ FILE: backend/apps/asset/views/asset_views.py ================================================ import logging from rest_framework import viewsets, status, filters from rest_framework.decorators import action from rest_framework.response import Response from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from rest_framework.request import Request from rest_framework.exceptions import NotFound, ValidationError as DRFValidationError from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.db import DatabaseError, IntegrityError, OperationalError from ..serializers import ( SubdomainListSerializer, WebSiteSerializer, DirectorySerializer, VulnerabilitySerializer, EndpointListSerializer, IPAddressAggregatedSerializer, SubdomainSnapshotSerializer, WebsiteSnapshotSerializer, DirectorySnapshotSerializer, EndpointSnapshotSerializer, VulnerabilitySnapshotSerializer ) from ..services import ( SubdomainService, WebSiteService, DirectoryService, VulnerabilityService, AssetStatisticsService, EndpointService, HostPortMappingService ) from ..services.snapshot import ( SubdomainSnapshotsService, WebsiteSnapshotsService, DirectorySnapshotsService, EndpointSnapshotsService, HostPortMappingSnapshotsService, VulnerabilitySnapshotsService ) from apps.common.pagination import BasePagination logger = logging.getLogger(__name__) class AssetStatisticsViewSet(viewsets.ViewSet): """ 资产统计 API 提供仪表盘所需的统计数据(预聚合,读取缓存表) """ def __init__(self, **kwargs): super().__init__(**kwargs) self.service = AssetStatisticsService() def list(self, request): """ 获取资产统计数据 GET /assets/statistics/ 返回: - totalTargets: 目标总数 - totalSubdomains: 子域名总数 - totalIps: IP 总数 - totalEndpoints: 端点总数 - totalWebsites: 网站总数 - totalVulns: 漏洞总数 - totalAssets: 总资产数 - runningScans: 运行中的扫描数 - updatedAt: 统计更新时间 """ try: stats = self.service.get_statistics() return success_response(data={ 'totalTargets': stats['total_targets'], 'totalSubdomains': stats['total_subdomains'], 'totalIps': stats['total_ips'], 'totalEndpoints': stats['total_endpoints'], 'totalWebsites': stats['total_websites'], 'totalVulns': stats['total_vulns'], 'totalAssets': stats['total_assets'], 'runningScans': stats['running_scans'], 'updatedAt': stats['updated_at'], # 变化值 'changeTargets': stats['change_targets'], 'changeSubdomains': stats['change_subdomains'], 'changeIps': stats['change_ips'], 'changeEndpoints': stats['change_endpoints'], 'changeWebsites': stats['change_websites'], 'changeVulns': stats['change_vulns'], 'changeAssets': stats['change_assets'], # 漏洞严重程度分布 'vulnBySeverity': stats['vuln_by_severity'], }) except (DatabaseError, OperationalError) as e: logger.exception("获取资产统计数据失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get statistics', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action(detail=False, methods=['get'], url_path='history') def history(self, request: Request): """ 获取统计历史数据(用于折线图) GET /assets/statistics/history/?days=7 Query Parameters: days: 获取最近多少天的数据,默认 7,最大 90 Returns: 历史数据列表 """ try: days_param = request.query_params.get('days', '7') try: days = int(days_param) except (ValueError, TypeError): days = 7 days = min(max(days, 1), 90) # 限制在 1-90 天 history = self.service.get_statistics_history(days=days) return success_response(data=history) except (DatabaseError, OperationalError) as e: logger.exception("获取统计历史数据失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get history data', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) # 注意:IPAddress 模型已被重构为 HostPortMapping # IPAddressViewSet 已删除,需要根据新架构重新实现 class SubdomainViewSet(viewsets.ModelViewSet): """子域名管理 ViewSet 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/subdomains/ 2. 独立路由:GET /api/subdomains/(全局查询) 支持智能过滤语法(filter 参数): - name="api" 子域名模糊匹配 - name=="api.example.com" 精确匹配 - 多条件空格分隔 AND 关系 """ serializer_class = SubdomainListSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = SubdomainService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,支持智能过滤""" target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_subdomains_by_target(target_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['post'], url_path='bulk-create') def bulk_create(self, request, **kwargs): """批量创建子域名 POST /api/targets/{target_pk}/subdomains/bulk-create/ 请求体: { "subdomains": ["sub1.example.com", "sub2.example.com"] } 响应: { "data": { "createdCount": 10, "skippedCount": 2, "invalidCount": 1, "mismatchedCount": 1, "totalReceived": 14 } } """ from apps.targets.models import Target target_pk = self.kwargs.get('target_pk') if not target_pk: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Must create subdomains under a target', status_code=status.HTTP_400_BAD_REQUEST ) # 获取目标 try: target = Target.objects.get(pk=target_pk) except Target.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Target not found', status_code=status.HTTP_404_NOT_FOUND ) # 验证目标类型必须为域名 if target.type != Target.TargetType.DOMAIN: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Only domain type targets support subdomain import', status_code=status.HTTP_400_BAD_REQUEST ) # 获取请求体中的子域名列表 subdomains = request.data.get('subdomains', []) if not subdomains or not isinstance(subdomains, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Request body cannot be empty or invalid format', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 service 层处理 try: result = self.service.bulk_create_subdomains( target_id=int(target_pk), target_name=target.name, subdomains=subdomains ) except Exception as e: logger.exception("批量创建子域名失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Server internal error', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={ 'createdCount': result.created_count, 'skippedCount': result.skipped_count, 'invalidCount': result.invalid_count, 'mismatchedCount': result.mismatched_count, 'totalReceived': result.total_received, }) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出子域名为 CSV 格式 CSV 列:name, created_at """ from apps.common.utils import create_csv_export_response, format_datetime target_pk = self.kwargs.get('target_pk') if not target_pk: raise DRFValidationError('必须在目标下导出') data_iterator = self.service.iter_raw_data_for_csv_export(target_id=target_pk) headers = ['name', 'created_at'] formatters = {'created_at': format_datetime} return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"target-{target_pk}-subdomains.csv", field_formatters=formatters ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除子域名 POST /api/assets/subdomains/bulk-delete/ 请求体: {"ids": [1, 2, 3]} 响应: {"deletedCount": 3} """ ids = request.data.get('ids', []) if not ids or not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import Subdomain deleted_count, _ = Subdomain.objects.filter(id__in=ids).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除子域名失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete subdomains', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class WebSiteViewSet(viewsets.ModelViewSet): """站点管理 ViewSet 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/websites/ 2. 独立路由:GET /api/websites/(全局查询) 支持智能过滤语法(filter 参数): - url="api" URL 模糊匹配 - host="example" 主机名模糊匹配 - title="login" 标题模糊匹配 - status="200,301" 状态码多值匹配 - tech="nginx" 技术栈匹配(数组字段) - 多条件空格分隔 AND 关系 """ serializer_class = WebSiteSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = WebSiteService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,支持智能过滤""" target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_websites_by_target(target_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['post'], url_path='bulk-create') def bulk_create(self, request, **kwargs): """批量创建网站 POST /api/targets/{target_pk}/websites/bulk-create/ 请求体: { "urls": ["https://example.com", "https://test.com"] } 响应: { "data": { "createdCount": 10 } } """ from apps.targets.models import Target target_pk = self.kwargs.get('target_pk') if not target_pk: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Must create websites under a target', status_code=status.HTTP_400_BAD_REQUEST ) # 获取目标 try: target = Target.objects.get(pk=target_pk) except Target.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Target not found', status_code=status.HTTP_404_NOT_FOUND ) # 获取请求体中的 URL 列表 urls = request.data.get('urls', []) if not urls or not isinstance(urls, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Request body cannot be empty or invalid format', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 service 层处理 try: created_count = self.service.bulk_create_urls( target_id=int(target_pk), target_name=target.name, target_type=target.type, urls=urls ) except Exception as e: logger.exception("批量创建网站失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Server internal error', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={ 'createdCount': created_count, }) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出网站为 CSV 格式 CSV 列:url, host, location, title, status_code, content_length, content_type, webserver, tech, response_body, response_headers, vhost, created_at """ from apps.common.utils import create_csv_export_response, format_datetime, format_list_field target_pk = self.kwargs.get('target_pk') if not target_pk: raise DRFValidationError('必须在目标下导出') data_iterator = self.service.iter_raw_data_for_csv_export(target_id=target_pk) headers = [ 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'created_at' ] formatters = { 'created_at': format_datetime, 'tech': lambda x: format_list_field(x, separator=','), } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"target-{target_pk}-websites.csv", field_formatters=formatters ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除网站 POST /api/assets/websites/bulk-delete/ 请求体: {"ids": [1, 2, 3]} 响应: {"deletedCount": 3} """ ids = request.data.get('ids', []) if not ids or not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import WebSite deleted_count, _ = WebSite.objects.filter(id__in=ids).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除网站失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete websites', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class DirectoryViewSet(viewsets.ModelViewSet): """目录管理 ViewSet 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/directories/ 2. 独立路由:GET /api/directories/(全局查询) 支持智能过滤语法(filter 参数): - url="admin" URL 模糊匹配 - status="200,301" 状态码多值匹配 - 多条件空格分隔 AND 关系 """ serializer_class = DirectorySerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = DirectoryService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,支持智能过滤""" target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_directories_by_target(target_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['post'], url_path='bulk-create') def bulk_create(self, request, **kwargs): """批量创建目录 POST /api/targets/{target_pk}/directories/bulk-create/ 请求体: { "urls": ["https://example.com/admin", "https://example.com/api"] } 响应: { "data": { "createdCount": 10 } } """ from apps.targets.models import Target target_pk = self.kwargs.get('target_pk') if not target_pk: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Must create directories under a target', status_code=status.HTTP_400_BAD_REQUEST ) # 获取目标 try: target = Target.objects.get(pk=target_pk) except Target.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Target not found', status_code=status.HTTP_404_NOT_FOUND ) # 获取请求体中的 URL 列表 urls = request.data.get('urls', []) if not urls or not isinstance(urls, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Request body cannot be empty or invalid format', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 service 层处理 try: created_count = self.service.bulk_create_urls( target_id=int(target_pk), target_name=target.name, target_type=target.type, urls=urls ) except Exception as e: logger.exception("批量创建目录失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Server internal error', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={ 'createdCount': created_count, }) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出目录为 CSV 格式 CSV 列:url, status, content_length, words, lines, content_type, duration, created_at """ from apps.common.utils import create_csv_export_response, format_datetime target_pk = self.kwargs.get('target_pk') if not target_pk: raise DRFValidationError('必须在目标下导出') data_iterator = self.service.iter_raw_data_for_csv_export(target_id=target_pk) headers = [ 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at' ] formatters = { 'created_at': format_datetime, } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"target-{target_pk}-directories.csv", field_formatters=formatters ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除目录 POST /api/assets/directories/bulk-delete/ 请求体: {"ids": [1, 2, 3]} 响应: {"deletedCount": 3} """ ids = request.data.get('ids', []) if not ids or not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import Directory deleted_count, _ = Directory.objects.filter(id__in=ids).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除目录失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete directories', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class EndpointViewSet(viewsets.ModelViewSet): """端点管理 ViewSet 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/endpoints/ 2. 独立路由:GET /api/endpoints/(全局查询) 支持智能过滤语法(filter 参数): - url="api" URL 模糊匹配 - host="example" 主机名模糊匹配 - title="login" 标题模糊匹配 - status="200,301" 状态码多值匹配 - tech="nginx" 技术栈匹配(数组字段) - 多条件空格分隔 AND 关系 """ serializer_class = EndpointListSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = EndpointService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,支持智能过滤""" target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_endpoints_by_target(target_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['post'], url_path='bulk-create') def bulk_create(self, request, **kwargs): """批量创建端点 POST /api/targets/{target_pk}/endpoints/bulk-create/ 请求体: { "urls": ["https://example.com/api/v1", "https://example.com/api/v2"] } 响应: { "data": { "createdCount": 10 } } """ from apps.targets.models import Target target_pk = self.kwargs.get('target_pk') if not target_pk: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Must create endpoints under a target', status_code=status.HTTP_400_BAD_REQUEST ) # 获取目标 try: target = Target.objects.get(pk=target_pk) except Target.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Target not found', status_code=status.HTTP_404_NOT_FOUND ) # 获取请求体中的 URL 列表 urls = request.data.get('urls', []) if not urls or not isinstance(urls, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Request body cannot be empty or invalid format', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 service 层处理 try: created_count = self.service.bulk_create_urls( target_id=int(target_pk), target_name=target.name, target_type=target.type, urls=urls ) except Exception as e: logger.exception("批量创建端点失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Server internal error', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={ 'createdCount': created_count, }) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出端点为 CSV 格式 CSV 列:url, host, location, title, status_code, content_length, content_type, webserver, tech, response_body, response_headers, vhost, matched_gf_patterns, created_at """ from apps.common.utils import create_csv_export_response, format_datetime, format_list_field target_pk = self.kwargs.get('target_pk') if not target_pk: raise DRFValidationError('必须在目标下导出') data_iterator = self.service.iter_raw_data_for_csv_export(target_id=target_pk) headers = [ 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'matched_gf_patterns', 'created_at' ] formatters = { 'created_at': format_datetime, 'tech': lambda x: format_list_field(x, separator=','), 'matched_gf_patterns': lambda x: format_list_field(x, separator=','), } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"target-{target_pk}-endpoints.csv", field_formatters=formatters ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除端点 POST /api/assets/endpoints/bulk-delete/ 请求体: {"ids": [1, 2, 3]} 响应: {"deletedCount": 3} """ ids = request.data.get('ids', []) if not ids or not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import Endpoint deleted_count, _ = Endpoint.objects.filter(id__in=ids).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除端点失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete endpoints', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class HostPortMappingViewSet(viewsets.ModelViewSet): """主机端口映射管理 ViewSet(IP 地址聚合视图) 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/ip-addresses/ 2. 独立路由:GET /api/ip-addresses/(全局查询) 返回按 IP 聚合的数据,每个 IP 显示其关联的所有 hosts 和 ports 支持智能过滤语法(filter 参数): - ip="192.168" IP 模糊匹配 - port="80,443" 端口多值匹配 - host="api" 主机名模糊匹配 - 多条件空格分隔 AND 关系 注意:由于返回的是聚合数据(字典列表),不支持 DRF SearchFilter """ serializer_class = IPAddressAggregatedSerializer pagination_class = BasePagination # 智能过滤字段映射 FILTER_FIELD_MAPPING = { 'ip': 'ip', 'port': 'port', 'host': 'host', } def __init__(self, **kwargs): super().__init__(**kwargs) self.service = HostPortMappingService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,返回按 IP 聚合的数据 支持智能过滤语法(filter 参数) """ target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_ip_aggregation_by_target(target_pk, filter_query=filter_query) return self.service.get_all_ip_aggregation(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出 IP 地址为 CSV 格式 CSV 列:ip, host, port, created_at """ from apps.common.utils import create_csv_export_response, format_datetime target_pk = self.kwargs.get('target_pk') if not target_pk: raise DRFValidationError('必须在目标下导出') # 获取流式数据迭代器 data_iterator = self.service.iter_raw_data_for_csv_export(target_id=target_pk) # CSV 表头和格式化器 headers = ['ip', 'host', 'port', 'created_at'] formatters = { 'created_at': format_datetime } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"target-{target_pk}-ip-addresses.csv", field_formatters=formatters ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除 IP 地址映射 POST /api/assets/ip-addresses/bulk-delete/ 请求体: {"ips": ["192.168.1.1", "10.0.0.1"]} 响应: {"deletedCount": 3} 注意:由于 IP 地址是聚合显示的,删除时传入 IP 列表, 会删除该 IP 下的所有 host:port 映射记录 """ ips = request.data.get('ips', []) if not ips or not isinstance(ips, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ips is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import HostPortMapping deleted_count, _ = HostPortMapping.objects.filter(ip__in=ips).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除 IP 地址映射失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete ip addresses', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class VulnerabilityViewSet(viewsets.ModelViewSet): """漏洞资产管理 ViewSet(只读) 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/vulnerabilities/ 2. 独立路由:GET /api/vulnerabilities/(全局查询) 支持智能过滤语法(filter 参数): - type="xss" 漏洞类型模糊匹配 - severity="high" 严重程度匹配 - source="nuclei" 来源工具匹配 - url="api" URL 模糊匹配 - 多条件空格分隔 AND 关系 """ serializer_class = VulnerabilitySerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = VulnerabilityService() def get_queryset(self): """根据是否有 target_pk 参数决定查询范围,支持智能过滤""" target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) if target_pk: return self.service.get_vulnerabilities_by_target(target_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) # ==================== 快照 ViewSet(Scan 嵌套路由) ==================== class SubdomainSnapshotViewSet(viewsets.ModelViewSet): """子域名快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/subdomains/ 支持智能过滤语法(filter 参数): - name="api" 子域名模糊匹配 - name=="api.example.com" 精确匹配 - name!="test" 排除匹配 """ serializer_class = SubdomainSnapshotSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering_fields = ['name', 'created_at'] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = SubdomainSnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出子域名快照为 CSV 格式 CSV 列:name, created_at """ from apps.common.utils import create_csv_export_response, format_datetime scan_pk = self.kwargs.get('scan_pk') if not scan_pk: raise DRFValidationError('必须在扫描下导出') data_iterator = self.service.iter_raw_data_for_csv_export(scan_id=scan_pk) headers = ['name', 'created_at'] formatters = {'created_at': format_datetime} return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"scan-{scan_pk}-subdomains.csv", field_formatters=formatters ) class WebsiteSnapshotViewSet(viewsets.ModelViewSet): """网站快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/websites/ 支持智能过滤语法(filter 参数): - url="api" URL 模糊匹配 - host="example" 主机名模糊匹配 - title="login" 标题模糊匹配 - status="200" 状态码匹配 - webserver="nginx" 服务器类型匹配 - tech="php" 技术栈匹配 """ serializer_class = WebsiteSnapshotSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = WebsiteSnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出网站快照为 CSV 格式 CSV 列:url, host, location, title, status_code, content_length, content_type, webserver, tech, response_body, response_headers, vhost, created_at """ from apps.common.utils import create_csv_export_response, format_datetime, format_list_field scan_pk = self.kwargs.get('scan_pk') if not scan_pk: raise DRFValidationError('必须在扫描下导出') data_iterator = self.service.iter_raw_data_for_csv_export(scan_id=scan_pk) headers = [ 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'created_at' ] formatters = { 'created_at': format_datetime, 'tech': lambda x: format_list_field(x, separator=','), } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"scan-{scan_pk}-websites.csv", field_formatters=formatters ) class DirectorySnapshotViewSet(viewsets.ModelViewSet): """目录快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/directories/ 支持智能过滤语法(filter 参数): - url="admin" URL 模糊匹配 - status="200" 状态码匹配 - content_type="html" 内容类型匹配 """ serializer_class = DirectorySnapshotSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = DirectorySnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出目录快照为 CSV 格式 CSV 列:url, status, content_length, words, lines, content_type, duration, created_at """ from apps.common.utils import create_csv_export_response, format_datetime scan_pk = self.kwargs.get('scan_pk') if not scan_pk: raise DRFValidationError('必须在扫描下导出') data_iterator = self.service.iter_raw_data_for_csv_export(scan_id=scan_pk) headers = [ 'url', 'status', 'content_length', 'words', 'lines', 'content_type', 'duration', 'created_at' ] formatters = { 'created_at': format_datetime, } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"scan-{scan_pk}-directories.csv", field_formatters=formatters ) class EndpointSnapshotViewSet(viewsets.ModelViewSet): """端点快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/endpoints/ 支持智能过滤语法(filter 参数): - url="api" URL 模糊匹配 - host="example" 主机名模糊匹配 - title="login" 标题模糊匹配 - status="200" 状态码匹配 - webserver="nginx" 服务器类型匹配 - tech="php" 技术栈匹配 """ serializer_class = EndpointSnapshotSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = EndpointSnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出端点快照为 CSV 格式 CSV 列:url, host, location, title, status_code, content_length, content_type, webserver, tech, response_body, response_headers, vhost, matched_gf_patterns, created_at """ from apps.common.utils import create_csv_export_response, format_datetime, format_list_field scan_pk = self.kwargs.get('scan_pk') if not scan_pk: raise DRFValidationError('必须在扫描下导出') data_iterator = self.service.iter_raw_data_for_csv_export(scan_id=scan_pk) headers = [ 'url', 'host', 'location', 'title', 'status_code', 'content_length', 'content_type', 'webserver', 'tech', 'response_body', 'response_headers', 'vhost', 'matched_gf_patterns', 'created_at' ] formatters = { 'created_at': format_datetime, 'tech': lambda x: format_list_field(x, separator=','), 'matched_gf_patterns': lambda x: format_list_field(x, separator=','), } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"scan-{scan_pk}-endpoints.csv", field_formatters=formatters ) class HostPortMappingSnapshotViewSet(viewsets.ModelViewSet): """主机端口映射快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/ip-addresses/ 支持智能过滤语法(filter 参数): - ip="192.168" IP 模糊匹配 - port="80" 端口匹配 - host="api" 主机名模糊匹配 注意:由于返回的是聚合数据(字典列表),过滤在 Service 层处理 """ serializer_class = IPAddressAggregatedSerializer pagination_class = BasePagination def __init__(self, **kwargs): super().__init__(**kwargs) self.service = HostPortMappingSnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_ip_aggregation_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all_ip_aggregation(filter_query=filter_query) @action(detail=False, methods=['get'], url_path='export') def export(self, request, **kwargs): """导出 IP 地址为 CSV 格式 CSV 列:ip, host, port, created_at """ from apps.common.utils import create_csv_export_response, format_datetime scan_pk = self.kwargs.get('scan_pk') if not scan_pk: raise DRFValidationError('必须在扫描下导出') # 获取流式数据迭代器 data_iterator = self.service.iter_raw_data_for_csv_export(scan_id=scan_pk) # CSV 表头和格式化器 headers = ['ip', 'host', 'port', 'created_at'] formatters = { 'created_at': format_datetime } return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=f"scan-{scan_pk}-ip-addresses.csv", field_formatters=formatters ) class VulnerabilitySnapshotViewSet(viewsets.ModelViewSet): """漏洞快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/vulnerabilities/ 支持智能过滤语法(filter 参数): - type="xss" 漏洞类型模糊匹配 - url="api" URL 模糊匹配 - severity="high" 严重程度匹配 - source="nuclei" 来源工具匹配 """ serializer_class = VulnerabilitySnapshotSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.service = VulnerabilitySnapshotsService() def get_queryset(self): scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) if scan_pk: return self.service.get_by_scan(scan_pk, filter_query=filter_query) return self.service.get_all(filter_query=filter_query) # ==================== 截图 ViewSet ==================== class ScreenshotViewSet(viewsets.ModelViewSet): """截图资产 ViewSet 支持两种访问方式: 1. 嵌套路由:GET /api/targets/{target_pk}/screenshots/ 2. 独立路由:GET /api/screenshots/(全局查询) 支持智能过滤语法(filter 参数): - url="example" URL 模糊匹配 """ from ..serializers import ScreenshotListSerializer serializer_class = ScreenshotListSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def get_queryset(self): """根据是否有 target_pk 参数决定查询范围""" from ..models import Screenshot target_pk = self.kwargs.get('target_pk') filter_query = self.request.query_params.get('filter', None) queryset = Screenshot.objects.all() if target_pk: queryset = queryset.filter(target_id=target_pk) if filter_query: # 简单的 URL 模糊匹配 queryset = queryset.filter(url__icontains=filter_query) return queryset.order_by('-created_at') @action(detail=True, methods=['get'], url_path='image') def image(self, request, pk=None, **kwargs): """获取截图图片 GET /api/assets/screenshots/{id}/image/ 返回 WebP 格式的图片二进制数据 """ from django.http import HttpResponse from ..models import Screenshot try: screenshot = Screenshot.objects.get(pk=pk) if not screenshot.image: return error_response( code=ErrorCodes.NOT_FOUND, message='Screenshot image not found', status_code=status.HTTP_404_NOT_FOUND ) response = HttpResponse(screenshot.image, content_type='image/webp') response['Content-Disposition'] = f'inline; filename="screenshot_{pk}.webp"' return response except Screenshot.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Screenshot not found', status_code=status.HTTP_404_NOT_FOUND ) @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request, **kwargs): """批量删除截图 POST /api/assets/screenshots/bulk-delete/ 请求体: {"ids": [1, 2, 3]} 响应: {"deletedCount": 3} """ ids = request.data.get('ids', []) if not ids or not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids is required and must be a list', status_code=status.HTTP_400_BAD_REQUEST ) try: from ..models import Screenshot deleted_count, _ = Screenshot.objects.filter(id__in=ids).delete() return success_response(data={'deletedCount': deleted_count}) except Exception as e: logger.exception("批量删除截图失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete screenshots', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) class ScreenshotSnapshotViewSet(viewsets.ModelViewSet): """截图快照 ViewSet - 嵌套路由:GET /api/scans/{scan_pk}/screenshots/ 支持智能过滤语法(filter 参数): - url="example" URL 模糊匹配 """ from ..serializers import ScreenshotSnapshotListSerializer serializer_class = ScreenshotSnapshotListSerializer pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] def get_queryset(self): """根据 scan_pk 参数查询""" from ..models import ScreenshotSnapshot scan_pk = self.kwargs.get('scan_pk') filter_query = self.request.query_params.get('filter', None) queryset = ScreenshotSnapshot.objects.all() if scan_pk: queryset = queryset.filter(scan_id=scan_pk) if filter_query: # 简单的 URL 模糊匹配 queryset = queryset.filter(url__icontains=filter_query) return queryset.order_by('-created_at') @action(detail=True, methods=['get'], url_path='image') def image(self, request, pk=None, **kwargs): """获取截图快照图片 GET /api/scans/{scan_pk}/screenshots/{id}/image/ 返回 WebP 格式的图片二进制数据 """ from django.http import HttpResponse from ..models import ScreenshotSnapshot try: screenshot = ScreenshotSnapshot.objects.get(pk=pk) if not screenshot.image: return error_response( code=ErrorCodes.NOT_FOUND, message='Screenshot image not found', status_code=status.HTTP_404_NOT_FOUND ) response = HttpResponse(screenshot.image, content_type='image/webp') response['Content-Disposition'] = f'inline; filename="screenshot_snapshot_{pk}.webp"' return response except ScreenshotSnapshot.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message='Screenshot snapshot not found', status_code=status.HTTP_404_NOT_FOUND ) ================================================ FILE: backend/apps/asset/views/search_views.py ================================================ """ 资产搜索 API 视图 提供资产搜索的 REST API 接口: - GET /api/assets/search/ - 搜索资产 - GET /api/assets/search/export/ - 导出搜索结果为 CSV 搜索语法: - field="value" 模糊匹配(ILIKE %value%) - field=="value" 精确匹配 - field!="value" 不等于 - && AND 连接 - || OR 连接 支持的字段: - host: 主机名 - url: URL - title: 标题 - tech: 技术栈 - status: 状态码 - body: 响应体 - header: 响应头 支持的资产类型: - website: 站点(默认) - endpoint: 端点 """ import logging import json from datetime import datetime from urllib.parse import urlparse, urlunparse from rest_framework import status from rest_framework.views import APIView from rest_framework.request import Request from django.db import connection from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.asset.services.search_service import AssetSearchService, VALID_ASSET_TYPES logger = logging.getLogger(__name__) class AssetSearchView(APIView): """ 资产搜索 API GET /api/assets/search/ Query Parameters: q: 搜索查询表达式 asset_type: 资产类型 ('website' 或 'endpoint',默认 'website') page: 页码(从 1 开始,默认 1) pageSize: 每页数量(默认 10,最大 100) 示例查询: ?q=host="api" && tech="nginx" ?q=tech="vue" || tech="react"&asset_type=endpoint ?q=status=="200" && host!="test" Response: { "results": [...], "total": 100, "page": 1, "pageSize": 10, "totalPages": 10, "assetType": "website" } """ def __init__(self, **kwargs): super().__init__(**kwargs) self.service = AssetSearchService() def _parse_headers(self, headers_data) -> dict: """解析响应头为字典""" if not headers_data: return {} try: return json.loads(headers_data) except (json.JSONDecodeError, TypeError): result = {} for line in str(headers_data).split('\n'): if ':' in line: key, value = line.split(':', 1) result[key.strip()] = value.strip() return result def _format_result(self, result: dict, vulnerabilities_by_url: dict, asset_type: str) -> dict: """格式化单个搜索结果""" url = result.get('url', '') vulns = vulnerabilities_by_url.get(url, []) # 基础字段(Website 和 Endpoint 共有) formatted = { 'id': result.get('id'), 'url': url, 'host': result.get('host', ''), 'title': result.get('title', ''), 'technologies': result.get('tech', []) or [], 'statusCode': result.get('status_code'), 'contentLength': result.get('content_length'), 'contentType': result.get('content_type', ''), 'webserver': result.get('webserver', ''), 'location': result.get('location', ''), 'vhost': result.get('vhost'), 'responseHeaders': self._parse_headers(result.get('response_headers')), 'responseBody': result.get('response_body', ''), 'createdAt': result.get('created_at').isoformat() if result.get('created_at') else None, 'targetId': result.get('target_id'), } # Website 特有字段:漏洞关联 if asset_type == 'website': formatted['vulnerabilities'] = [ { 'id': v.get('id'), 'name': v.get('vuln_type', ''), 'vulnType': v.get('vuln_type', ''), 'severity': v.get('severity', 'info'), } for v in vulns ] # Endpoint 特有字段 if asset_type == 'endpoint': formatted['matchedGfPatterns'] = result.get('matched_gf_patterns', []) or [] return formatted def _get_vulnerabilities_by_url_prefix(self, website_urls: list) -> dict: """ 根据 URL 前缀批量查询漏洞数据 漏洞 URL 是 website URL 的子路径,使用前缀匹配: - website.url: https://example.com/path?query=1 - vulnerability.url: https://example.com/path/api/users Args: website_urls: website URL 列表,格式为 [(url, target_id), ...] Returns: dict: {website_url: [vulnerability_list]} """ if not website_urls: return {} try: with connection.cursor() as cursor: # 构建 OR 条件:每个 website URL(去掉查询参数)作为前缀匹配 conditions = [] params = [] url_mapping = {} # base_url -> original_url for url, target_id in website_urls: if not url or target_id is None: continue # 使用 urlparse 去掉查询参数和片段,只保留 scheme://netloc/path parsed = urlparse(url) base_url = urlunparse((parsed.scheme, parsed.netloc, parsed.path, '', '', '')) url_mapping[base_url] = url conditions.append("(v.url LIKE %s AND v.target_id = %s)") params.extend([base_url + '%', target_id]) if not conditions: return {} where_clause = " OR ".join(conditions) sql = f""" SELECT v.id, v.vuln_type, v.severity, v.url, v.target_id FROM vulnerability v WHERE {where_clause} ORDER BY CASE v.severity WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 WHEN 'low' THEN 4 ELSE 5 END """ cursor.execute(sql, params) # 获取所有漏洞 all_vulns = [] for row in cursor.fetchall(): all_vulns.append({ 'id': row[0], 'vuln_type': row[1], 'name': row[1], 'severity': row[2], 'url': row[3], 'target_id': row[4], }) # 按原始 website URL 分组(用于返回结果) result = {url: [] for url, _ in website_urls} for vuln in all_vulns: vuln_url = vuln['url'] # 找到匹配的 website URL(最长前缀匹配) for website_url, target_id in website_urls: parsed = urlparse(website_url) base_url = urlunparse((parsed.scheme, parsed.netloc, parsed.path, '', '', '')) if vuln_url.startswith(base_url) and vuln['target_id'] == target_id: result[website_url].append(vuln) break return result except Exception as e: logger.error(f"批量查询漏洞失败: {e}") return {} def get(self, request: Request): """搜索资产""" # 获取搜索查询 query = request.query_params.get('q', '').strip() if not query: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Search query (q) is required', status_code=status.HTTP_400_BAD_REQUEST ) # 获取并验证资产类型 asset_type = request.query_params.get('asset_type', 'website').strip().lower() if asset_type not in VALID_ASSET_TYPES: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=f'Invalid asset_type. Must be one of: {", ".join(VALID_ASSET_TYPES)}', status_code=status.HTTP_400_BAD_REQUEST ) # 获取分页参数 try: page = int(request.query_params.get('page', 1)) page_size = int(request.query_params.get('pageSize', 10)) except (ValueError, TypeError): page = 1 page_size = 10 # 限制分页参数 page = max(1, page) page_size = min(max(1, page_size), 100) # 获取总数和搜索结果 total = self.service.count(query, asset_type) total_pages = (total + page_size - 1) // page_size if total > 0 else 1 offset = (page - 1) * page_size all_results = self.service.search(query, asset_type) results = all_results[offset:offset + page_size] # 批量查询漏洞数据(仅 Website 类型需要) vulnerabilities_by_url = {} if asset_type == 'website': website_urls = [(r.get('url'), r.get('target_id')) for r in results if r.get('url') and r.get('target_id')] vulnerabilities_by_url = self._get_vulnerabilities_by_url_prefix(website_urls) if website_urls else {} # 格式化结果 formatted_results = [self._format_result(r, vulnerabilities_by_url, asset_type) for r in results] return success_response(data={ 'results': formatted_results, 'total': total, 'page': page, 'pageSize': page_size, 'totalPages': total_pages, 'assetType': asset_type, }) class AssetSearchExportView(APIView): """ 资产搜索导出 API GET /api/assets/search/export/ Query Parameters: q: 搜索查询表达式 asset_type: 资产类型 ('website' 或 'endpoint',默认 'website') Response: CSV 文件(带 Content-Length,支持浏览器显示下载进度) """ def __init__(self, **kwargs): super().__init__(**kwargs) self.service = AssetSearchService() def _get_headers_and_formatters(self, asset_type: str): """获取 CSV 表头和格式化器""" from apps.common.utils import format_datetime, format_list_field if asset_type == 'website': headers = ['url', 'host', 'title', 'status_code', 'content_type', 'content_length', 'webserver', 'location', 'tech', 'vhost', 'created_at'] else: headers = ['url', 'host', 'title', 'status_code', 'content_type', 'content_length', 'webserver', 'location', 'tech', 'matched_gf_patterns', 'vhost', 'created_at'] formatters = { 'created_at': format_datetime, 'tech': lambda x: format_list_field(x, separator='; '), 'matched_gf_patterns': lambda x: format_list_field(x, separator='; '), 'vhost': lambda x: 'true' if x else ('false' if x is False else ''), } return headers, formatters def get(self, request: Request): """导出搜索结果为 CSV(带 Content-Length,支持下载进度显示)""" from apps.common.utils import create_csv_export_response # 获取搜索查询 query = request.query_params.get('q', '').strip() if not query: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Search query (q) is required', status_code=status.HTTP_400_BAD_REQUEST ) # 获取并验证资产类型 asset_type = request.query_params.get('asset_type', 'website').strip().lower() if asset_type not in VALID_ASSET_TYPES: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=f'Invalid asset_type. Must be one of: {", ".join(VALID_ASSET_TYPES)}', status_code=status.HTTP_400_BAD_REQUEST ) # 检查是否有结果(快速检查,避免空导出) total = self.service.count(query, asset_type) if total == 0: return error_response( code=ErrorCodes.NOT_FOUND, message='No results to export', status_code=status.HTTP_404_NOT_FOUND ) # 获取表头和格式化器 headers, formatters = self._get_headers_and_formatters(asset_type) # 生成文件名 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') filename = f'search_{asset_type}_{timestamp}.csv' # 使用通用导出工具 data_iterator = self.service.search_iter(query, asset_type) return create_csv_export_response( data_iterator=data_iterator, headers=headers, filename=filename, field_formatters=formatters, show_progress=True # 显示下载进度 ) ================================================ FILE: backend/apps/common/__init__.py ================================================ """ 通用工具模块 提供各种共享的工具类和函数 """ from .normalizer import normalize_domain, normalize_ip, normalize_cidr, normalize_target from .validators import validate_domain, validate_ip, validate_cidr, detect_target_type __all__ = [ # 规范化工具 'normalize_domain', 'normalize_ip', 'normalize_cidr', 'normalize_target', # 验证器 'validate_domain', 'validate_ip', 'validate_cidr', 'detect_target_type', ] ================================================ FILE: backend/apps/common/apps.py ================================================ from django.apps import AppConfig class CommonConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.common' # 因为在 apps/ 目录下 def ready(self): """应用就绪时调用""" pass ================================================ FILE: backend/apps/common/authentication.py ================================================ from rest_framework.authentication import SessionAuthentication class CsrfExemptSessionAuthentication(SessionAuthentication): """ 前后端分离项目使用的 Session 认证 禁用 CSRF 检查,因为 CSRF 主要防护的是同源页面表单提交 前后端分离项目通过 CORS 控制跨域访问,不需要 CSRF """ def enforce_csrf(self, request): # 不执行 CSRF 检查 return ================================================ FILE: backend/apps/common/container_bootstrap.py ================================================ """ 容器启动引导模块 提供动态任务容器的通用初始化功能: - 从 Server 配置中心获取配置 - 设置环境变量 - 初始化 Django 环境 使用方式: from apps.common.container_bootstrap import fetch_config_and_setup_django fetch_config_and_setup_django() # 必须在 Django 导入之前调用 """ import os import sys import requests import logging import urllib3 # 禁用自签名证书的 SSL 警告(远程 Worker 场景) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) logger = logging.getLogger(__name__) def fetch_config_and_setup_django(): """ 从配置中心获取配置并初始化 Django Note: 必须在 Django 导入之前调用此函数 """ server_url = os.environ.get("SERVER_URL") if not server_url: print("[ERROR] 缺少 SERVER_URL 环境变量", file=sys.stderr) sys.exit(1) # 通过环境变量声明 Worker 身份(本地/远程) is_local = os.environ.get("IS_LOCAL", "false").lower() == "true" config_url = f"{server_url}/api/workers/config/?is_local={str(is_local).lower()}" print(f"[CONFIG] 正在从配置中心获取配置: {config_url}") print(f"[CONFIG] IS_LOCAL={is_local}") try: # 构建请求头(包含 Worker API Key) headers = {} worker_api_key = os.environ.get("WORKER_API_KEY", "") if worker_api_key: headers["X-Worker-API-Key"] = worker_api_key # verify=False: 远程 Worker 通过 HTTPS 访问时可能使用自签名证书 resp = requests.get(config_url, headers=headers, timeout=10, verify=False) resp.raise_for_status() config = resp.json() # 数据库配置(必需) db_host = config['db']['host'] db_port = config['db']['port'] db_name = config['db']['name'] db_user = config['db']['user'] os.environ.setdefault("DB_HOST", db_host) os.environ.setdefault("DB_PORT", db_port) os.environ.setdefault("DB_NAME", db_name) os.environ.setdefault("DB_USER", db_user) os.environ.setdefault("DB_PASSWORD", config['db']['password']) # 日志配置 os.environ.setdefault("LOG_DIR", config['paths']['logs']) os.environ.setdefault("LOG_LEVEL", config['logging']['level']) os.environ.setdefault("ENABLE_COMMAND_LOGGING", str(config['logging']['enableCommandLogging']).lower()) os.environ.setdefault("DEBUG", str(config['debug'])) print(f"[CONFIG] ✓ 配置获取成功") print(f"[CONFIG] DB_HOST: {db_host}") print(f"[CONFIG] DB_PORT: {db_port}") print(f"[CONFIG] DB_NAME: {db_name}") print(f"[CONFIG] DB_USER: {db_user}") except Exception as e: print(f"[ERROR] 获取配置失败: {config_url} - {e}", file=sys.stderr) sys.exit(1) # 初始化 Django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') import django django.setup() return config ================================================ FILE: backend/apps/common/decorators/__init__.py ================================================ """ 通用装饰器模块 提供可在整个项目中复用的装饰器 """ from .db_connection import ( ensure_db_connection, auto_ensure_db_connection, async_check_and_reconnect, ensure_db_connection_async, ) __all__ = [ 'ensure_db_connection', 'auto_ensure_db_connection', 'async_check_and_reconnect', 'ensure_db_connection_async', ] ================================================ FILE: backend/apps/common/decorators/db_connection.py ================================================ """ 数据库连接装饰器 提供自动数据库连接健康检查的装饰器,确保长时间运行的任务中数据库连接不会失效。 主要功能: - @auto_ensure_db_connection: 类装饰器,自动为所有公共方法添加连接检查 - @ensure_db_connection: 方法装饰器,单独为某个方法添加连接检查 使用场景: - Repository 层的数据库操作 - Service 层需要确保数据库连接的操作 - 任何需要数据库连接健康检查的类或方法 """ import logging import functools import time from django.db import connection from asgiref.sync import sync_to_async logger = logging.getLogger(__name__) def ensure_db_connection(method): """ 方法装饰器:自动确保数据库连接健康 在方法执行前自动检查数据库连接,如果连接失效则自动重连。 使用场景: - 需要单独装饰某个方法时使用 - 通常建议使用类装饰器 @auto_ensure_db_connection 示例: @ensure_db_connection def my_method(self): # 会自动检查连接健康 ... """ @functools.wraps(method) def wrapper(self, *args, **kwargs): _check_and_reconnect() return method(self, *args, **kwargs) return wrapper def auto_ensure_db_connection(cls): """ 类装饰器:自动给所有公共方法添加数据库连接检查 自动为类中所有公共方法(不以 _ 开头的方法)添加 @ensure_db_connection 装饰器。 特性: - 自动装饰所有公共方法 - 跳过私有方法(以 _ 开头) - 跳过类方法和静态方法 - 跳过已经装饰过的方法 使用方式: @auto_ensure_db_connection class MyRepository: def bulk_create(self, items): # 自动添加连接检查 ... def query(self, filters): # 自动添加连接检查 ... def _private_method(self): # 不会添加装饰器 ... 优势: - 无需为每个方法手动添加装饰器 - 减少代码重复 - 降低遗漏风险 """ for attr_name in dir(cls): # 跳过私有方法和魔术方法 if attr_name.startswith('_'): continue attr = getattr(cls, attr_name) # 只装饰可调用的实例方法 if callable(attr) and not isinstance(attr, (staticmethod, classmethod)): # 检查是否已经被装饰过(避免重复装饰) if not hasattr(attr, '_db_connection_ensured'): wrapped = ensure_db_connection(attr) wrapped._db_connection_ensured = True setattr(cls, attr_name, wrapped) return cls def _check_and_reconnect(max_retries=5): """ 检查数据库连接健康状态,必要时使用指数退避重新连接 策略: 1. 尝试执行简单查询测试连接 2. 如果失败,使用指数退避策略重试(最多5次) 3. 每次重试的等待时间:2^attempt 秒 (1s, 2s, 4s, 8s, 16s) 异常处理: - 连接失效时自动重连 - 记录警告日志和重试信息 - 忽略关闭连接时的错误 - 达到最大重试次数后抛出异常 """ last_error = None for attempt in range(max_retries): try: connection.ensure_connection() with connection.cursor() as cursor: cursor.execute("SELECT 1") cursor.fetchone() # 连接成功 if attempt > 0: logger.info(f"数据库重连成功 (尝试 {attempt + 1}/{max_retries})") return except Exception as e: last_error = e logger.warning( f"数据库连接检查失败 (尝试 {attempt + 1}/{max_retries}): {e}" ) # 关闭失效的连接 try: connection.close() except Exception: pass # 忽略关闭时的错误 # 如果还有重试机会,使用指数退避等待 if attempt < max_retries - 1: delay = 2 ** attempt # 指数退避: 1, 2, 4, 8, 16 秒 logger.info(f"等待 {delay} 秒后重试...") time.sleep(delay) else: # 最后一次尝试也失败,抛出异常 logger.error( f"数据库重连失败,已达最大重试次数 ({max_retries})" ) raise last_error async def async_check_and_reconnect(max_retries=5): await sync_to_async(_check_and_reconnect, thread_sensitive=True)(max_retries=max_retries) def ensure_db_connection_async(method): @functools.wraps(method) async def wrapper(*args, **kwargs): await async_check_and_reconnect() return await method(*args, **kwargs) return wrapper __all__ = [ 'ensure_db_connection', 'auto_ensure_db_connection', 'async_check_and_reconnect', 'ensure_db_connection_async', ] ================================================ FILE: backend/apps/common/definitions.py ================================================ from django.db import models class ScanStatus(models.TextChoices): """扫描任务状态枚举""" CANCELLED = 'cancelled', '已取消' COMPLETED = 'completed', '已完成' FAILED = 'failed', '失败' INITIATED = 'initiated', '初始化' RUNNING = 'running', '运行中' class VulnSeverity(models.TextChoices): """漏洞严重性枚举""" UNKNOWN = 'unknown', '未知' INFO = 'info', '信息' LOW = 'low', '低' MEDIUM = 'medium', '中' HIGH = 'high', '高' CRITICAL = 'critical', '危急' ================================================ FILE: backend/apps/common/error_codes.py ================================================ """ 标准化错误码定义 采用简化方案(参考 Stripe、GitHub 等大厂做法): - 只定义 5-10 个通用错误码 - 未知错误使用通用错误码 - 错误码格式:大写字母和下划线组成 """ class ErrorCodes: """标准化错误码 只定义通用错误码,其他错误使用通用消息。 这是 Stripe、GitHub 等大厂的标准做法。 错误码格式规范: - 使用大写字母和下划线 - 简洁明了,易于理解 - 前端通过错误码映射到 i18n 键 """ # 通用错误码(8 个) VALIDATION_ERROR = 'VALIDATION_ERROR' # 输入验证失败 NOT_FOUND = 'NOT_FOUND' # 资源未找到 PERMISSION_DENIED = 'PERMISSION_DENIED' # 权限不足 SERVER_ERROR = 'SERVER_ERROR' # 服务器内部错误 BAD_REQUEST = 'BAD_REQUEST' # 请求格式错误 CONFLICT = 'CONFLICT' # 资源冲突(如重复创建) UNAUTHORIZED = 'UNAUTHORIZED' # 未认证 RATE_LIMITED = 'RATE_LIMITED' # 请求过于频繁 ================================================ FILE: backend/apps/common/exception_handlers.py ================================================ """ 自定义异常处理器 统一处理 DRF 异常,确保错误响应格式一致 """ from rest_framework.views import exception_handler from rest_framework import status from rest_framework.exceptions import AuthenticationFailed, NotAuthenticated from apps.common.response_helpers import error_response from apps.common.error_codes import ErrorCodes def custom_exception_handler(exc, context): """ 自定义异常处理器 处理认证相关异常,返回统一格式的错误响应 """ # 先调用 DRF 默认的异常处理器 response = exception_handler(exc, context) if response is not None: # 处理 401 未认证错误 if response.status_code == status.HTTP_401_UNAUTHORIZED: return error_response( code=ErrorCodes.UNAUTHORIZED, message='Authentication required', status_code=status.HTTP_401_UNAUTHORIZED ) # 处理 403 权限不足错误 if response.status_code == status.HTTP_403_FORBIDDEN: return error_response( code=ErrorCodes.PERMISSION_DENIED, message='Permission denied', status_code=status.HTTP_403_FORBIDDEN ) # 处理 NotAuthenticated 和 AuthenticationFailed 异常 if isinstance(exc, (NotAuthenticated, AuthenticationFailed)): return error_response( code=ErrorCodes.UNAUTHORIZED, message='Authentication required', status_code=status.HTTP_401_UNAUTHORIZED ) return response ================================================ FILE: backend/apps/common/management/commands/db_health_check.py ================================================ """ 数据库健康检查管理命令 使用方法: python manage.py db_health_check # 基础延迟测试(5次) python manage.py db_health_check --test-count=10 # 指定测试次数 python manage.py db_health_check --reconnect # 强制重连后测试 python manage.py db_health_check --stats # 显示连接统计信息 python manage.py db_health_check --api-test # 测试实际API查询性能 python manage.py db_health_check --monitor # 监控数据库服务器性能指标 python manage.py db_health_check --db=other # 指定数据库别名 python manage.py db_health_check --api-test --test-count=10 # API性能测试10次 python manage.py db_health_check --reconnect --api-test # 重连后进行API测试 示例: # 快速延迟检查 python manage.py db_health_check --test-count=3 # 完整性能分析 python manage.py db_health_check --api-test --stats --test-count=5 # 数据库服务器监控 python manage.py db_health_check --monitor """ import time import logging from django.core.management.base import BaseCommand from django.db import connection, connections from django.conf import settings logger = logging.getLogger(__name__) class Command(BaseCommand): """Django管理命令:数据库健康检查""" help = '检查数据库连接健康状态' def add_arguments(self, parser): parser.add_argument( '--reconnect', action='store_true', help='强制重新连接数据库', ) parser.add_argument( '--stats', action='store_true', help='显示连接统计信息', ) parser.add_argument( '--db', type=str, default='default', help='指定数据库别名(默认: default)', ) parser.add_argument( '--test-count', type=int, default=5, help='延迟测试次数(默认: 5)', ) parser.add_argument( '--api-test', action='store_true', help='测试实际API查询性能', ) parser.add_argument( '--monitor', action='store_true', help='监控数据库服务器性能指标', ) def handle(self, *args, **options): db_alias = options['db'] test_count = options['test_count'] self.stdout.write(f"正在测试数据库 '{db_alias}' 连接...") # 获取数据库连接 db_connection = connections[db_alias] if options['reconnect']: self.stdout.write("强制重新连接数据库...") try: db_connection.close() db_connection.ensure_connection() self.stdout.write(self.style.SUCCESS("✓ 重连成功")) except Exception as e: self.stdout.write(self.style.ERROR(f"✗ 重连失败: {e}")) return # 测试数据库延迟 if options['monitor']: self.monitor_database_performance(db_connection) elif options['api_test']: self.test_api_performance(test_count) else: self.test_database_latency(db_connection, test_count) if options['stats']: self.show_connection_stats(db_connection) def test_database_latency(self, db_connection, test_count): """测试数据库延迟""" self.stdout.write(f"\n开始延迟测试({test_count} 次)...") latencies = [] successful_tests = 0 connection_times = [] query_times = [] for i in range(test_count): try: # 测试连接建立时间 conn_start = time.time() db_connection.ensure_connection() conn_end = time.time() conn_time = (conn_end - conn_start) * 1000 connection_times.append(conn_time) # 测试查询执行时间 query_start = time.time() with db_connection.cursor() as cursor: cursor.execute("SELECT 1") result = cursor.fetchone() query_end = time.time() query_time = (query_end - query_start) * 1000 query_times.append(query_time) total_time = conn_time + query_time latencies.append(total_time) successful_tests += 1 self.stdout.write(f" 测试 {i+1}: 总计{total_time:.2f}ms (连接:{conn_time:.2f}ms + 查询:{query_time:.2f}ms) ✓") except Exception as e: self.stdout.write(f" 测试 {i+1}: 失败 - {e}") # 计算统计信息 if latencies: avg_latency = sum(latencies) / len(latencies) min_latency = min(latencies) max_latency = max(latencies) avg_conn_time = sum(connection_times) / len(connection_times) avg_query_time = sum(query_times) / len(query_times) self.stdout.write(f"\n延迟统计:") self.stdout.write(f" 成功测试: {successful_tests}/{test_count}") self.stdout.write(f" 平均总延迟: {avg_latency:.2f}ms") self.stdout.write(f" 平均连接时间: {avg_conn_time:.2f}ms") self.stdout.write(f" 平均查询时间: {avg_query_time:.2f}ms") self.stdout.write(f" 最小延迟: {min_latency:.2f}ms") self.stdout.write(f" 最大延迟: {max_latency:.2f}ms") # 分析延迟来源 if avg_conn_time > avg_query_time * 2: self.stdout.write(self.style.WARNING(" 分析: 连接建立是主要延迟来源")) elif avg_query_time > avg_conn_time * 2: self.stdout.write(self.style.WARNING(" 分析: 查询执行是主要延迟来源")) else: self.stdout.write(" 分析: 连接和查询延迟相当") # 延迟评估 if avg_latency < 10: self.stdout.write(self.style.SUCCESS(" 评估: 延迟很低,连接优秀")) elif avg_latency < 50: self.stdout.write(self.style.SUCCESS(" 评估: 延迟较低,连接良好")) elif avg_latency < 200: self.stdout.write(self.style.WARNING(" 评估: 延迟中等,连接可接受")) else: self.stdout.write(self.style.ERROR(" 评估: 延迟较高,可能影响性能")) else: self.stdout.write(self.style.ERROR("所有测试都失败了")) def test_api_performance(self, test_count): """测试实际API查询性能""" self.stdout.write(f"\n开始API性能测试({test_count} 次)...") # 导入必要的模块 from apps.scan.models import Scan from apps.engine.models import ScanEngine from apps.targets.models import Target from django.db.models import Count api_latencies = [] successful_tests = 0 for i in range(test_count): try: start_time = time.time() # 测试多种查询类型 # 1. 简单查询 - 引擎列表 engines = list(ScanEngine.objects.all()[:10]) # 2. 复杂查询 - 扫描列表(即使没有数据也会执行复杂的JOIN) scan_queryset = Scan.objects.select_related( 'target', 'engine' ).annotate( subdomains_count=Count('subdomains', distinct=True), endpoints_count=Count('endpoints', distinct=True), ips_count=Count('ip_addresses', distinct=True) ).order_by('-id')[:10] scan_list = list(scan_queryset) # 3. 目标查询 targets = list(Target.objects.all()[:10]) end_time = time.time() latency_ms = (end_time - start_time) * 1000 api_latencies.append(latency_ms) successful_tests += 1 self.stdout.write(f" API测试 {i+1}: {latency_ms:.2f}ms ✓ (引擎:{len(engines)}, 扫描:{len(scan_list)}, 目标:{len(targets)})") except Exception as e: self.stdout.write(f" API测试 {i+1}: 失败 - {e}") # 计算API查询统计信息 if api_latencies: avg_latency = sum(api_latencies) / len(api_latencies) min_latency = min(api_latencies) max_latency = max(api_latencies) self.stdout.write(f"\nAPI查询统计:") self.stdout.write(f" 成功测试: {successful_tests}/{test_count}") self.stdout.write(f" 平均延迟: {avg_latency:.2f}ms") self.stdout.write(f" 最小延迟: {min_latency:.2f}ms") self.stdout.write(f" 最大延迟: {max_latency:.2f}ms") # 与简单查询对比 simple_query_avg = 150 # 基于之前的测试结果 overhead = avg_latency - simple_query_avg self.stdout.write(f" 业务逻辑开销: {overhead:.2f}ms") # 性能评估 if avg_latency < 500: self.stdout.write(self.style.SUCCESS(" 评估: API响应速度良好")) elif avg_latency < 1000: self.stdout.write(self.style.WARNING(" 评估: API响应速度一般")) else: self.stdout.write(self.style.ERROR(" 评估: API响应速度较慢,需要优化")) else: self.stdout.write(self.style.ERROR("所有API测试都失败了")) def monitor_database_performance(self, db_connection): """监控数据库服务器性能指标""" self.stdout.write(f"\n开始监控数据库性能指标...") try: with db_connection.cursor() as cursor: # 1. 数据库基本信息 self.stdout.write(f"\n=== 数据库基本信息 ===") cursor.execute("SELECT version();") version = cursor.fetchone()[0] self.stdout.write(f"PostgreSQL版本: {version}") cursor.execute("SELECT current_database();") db_name = cursor.fetchone()[0] self.stdout.write(f"当前数据库: {db_name}") # 2. 连接信息 self.stdout.write(f"\n=== 连接状态 ===") cursor.execute(""" SELECT count(*) as total_connections, count(*) FILTER (WHERE state = 'active') as active_connections, count(*) FILTER (WHERE state = 'idle') as idle_connections FROM pg_stat_activity; """) conn_stats = cursor.fetchone() self.stdout.write(f"总连接数: {conn_stats[0]}") self.stdout.write(f"活跃连接: {conn_stats[1]}") self.stdout.write(f"空闲连接: {conn_stats[2]}") # 3. 数据库大小 self.stdout.write(f"\n=== 数据库大小 ===") cursor.execute(""" SELECT pg_size_pretty(pg_database_size(current_database())) as db_size; """) db_size = cursor.fetchone()[0] self.stdout.write(f"数据库大小: {db_size}") # 4. 表统计信息 self.stdout.write(f"\n=== 主要表统计 ===") cursor.execute(""" SELECT schemaname, relname, n_tup_ins as inserts, n_tup_upd as updates, n_tup_del as deletes, n_live_tup as live_rows, n_dead_tup as dead_rows FROM pg_stat_user_tables WHERE schemaname = 'public' ORDER BY n_live_tup DESC LIMIT 10; """) tables = cursor.fetchall() if tables: for table in tables: self.stdout.write(f" {table[1]}: {table[5]} 行 (插入:{table[2]}, 更新:{table[3]}, 删除:{table[4]}, 死行:{table[6]})") else: self.stdout.write(" 暂无表统计数据") # 5. 慢查询统计 self.stdout.write(f"\n=== 查询性能统计 ===") cursor.execute(""" SELECT query, calls, total_time, mean_time, rows FROM pg_stat_statements WHERE query NOT LIKE '%pg_stat_statements%' ORDER BY mean_time DESC LIMIT 5; """) try: slow_queries = cursor.fetchall() if slow_queries: for i, query in enumerate(slow_queries, 1): self.stdout.write(f" {i}. 平均耗时: {query[3]:.2f}ms, 调用次数: {query[1]}") self.stdout.write(f" 查询: {query[0][:100]}...") else: self.stdout.write(" 未找到查询统计(可能未启用pg_stat_statements扩展)") except Exception: self.stdout.write(" 查询统计不可用(需要pg_stat_statements扩展)") # 6. 锁信息 self.stdout.write(f"\n=== 锁状态 ===") cursor.execute(""" SELECT mode, count(*) FROM pg_locks GROUP BY mode ORDER BY count(*) DESC; """) locks = cursor.fetchall() total_locks = sum(lock[1] for lock in locks) self.stdout.write(f"总锁数量: {total_locks}") for lock in locks: self.stdout.write(f" {lock[0]}: {lock[1]} 个") # 7. 缓存命中率 self.stdout.write(f"\n=== 缓存性能 ===") cursor.execute(""" SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) * 100 as cache_hit_ratio FROM pg_statio_user_tables; """) cache_stats = cursor.fetchone() if cache_stats[0] and cache_stats[1]: self.stdout.write(f"缓存命中率: {cache_stats[2]:.2f}%") self.stdout.write(f"磁盘读取: {cache_stats[0]} 块") self.stdout.write(f"缓存命中: {cache_stats[1]} 块") else: self.stdout.write("缓存统计: 暂无数据") # 8. 检查点和WAL self.stdout.write(f"\n=== WAL和检查点 ===") cursor.execute(""" SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time FROM pg_stat_bgwriter; """) bgwriter = cursor.fetchone() self.stdout.write(f"定时检查点: {bgwriter[0]}") self.stdout.write(f"请求检查点: {bgwriter[1]}") self.stdout.write(f"检查点写入时间: {bgwriter[2]}ms") self.stdout.write(f"检查点同步时间: {bgwriter[3]}ms") # 9. 当前活跃查询 self.stdout.write(f"\n=== 当前活跃查询 ===") cursor.execute(""" SELECT pid, application_name, state, query_start, now() - query_start as duration, left(query, 100) as query_preview FROM pg_stat_activity WHERE state = 'active' AND query NOT LIKE '%pg_stat_activity%' ORDER BY query_start; """) active_queries = cursor.fetchall() if active_queries: for query in active_queries: self.stdout.write(f" PID {query[0]} ({query[1]}): 运行 {query[4]}") self.stdout.write(f" 查询: {query[5]}...") else: self.stdout.write(" 当前无活跃查询") except Exception as e: self.stdout.write(self.style.ERROR(f"监控失败: {e}")) def show_connection_stats(self, db_connection): """显示连接统计信息""" self.stdout.write(f"\n连接信息:") # 基本连接信息 settings_dict = db_connection.settings_dict self.stdout.write(f" 数据库类型: {db_connection.vendor}") self.stdout.write(f" 主机: {settings_dict.get('HOST', 'localhost')}") self.stdout.write(f" 端口: {settings_dict.get('PORT', '5432')}") self.stdout.write(f" 数据库名: {settings_dict.get('NAME', '')}") self.stdout.write(f" 用户: {settings_dict.get('USER', '')}") # 连接配置 conn_max_age = settings_dict.get('CONN_MAX_AGE', 0) self.stdout.write(f" 连接最大存活时间: {conn_max_age}秒") # 查询统计 if hasattr(db_connection, 'queries'): query_count = len(db_connection.queries) if query_count > 0: total_time = sum(float(q['time']) for q in db_connection.queries) self.stdout.write(f" 查询次数: {query_count}") self.stdout.write(f" 总查询时间: {total_time:.4f}秒") # 连接状态 is_connected = hasattr(db_connection, 'connection') and db_connection.connection is not None self.stdout.write(f" 连接状态: {'已连接' if is_connected else '未连接'}") ================================================ FILE: backend/apps/common/management/commands/db_monitor.py ================================================ """ 简化的数据库性能监控命令 专注于可能导致查询延迟的关键指标 """ import time from django.core.management.base import BaseCommand from django.db import connections class Command(BaseCommand): """简化的数据库性能监控""" help = '监控数据库性能关键指标' def add_arguments(self, parser): parser.add_argument( '--interval', type=int, default=5, help='监控间隔(秒,默认: 5)', ) parser.add_argument( '--count', type=int, default=3, help='监控次数(默认: 3)', ) def handle(self, *args, **options): interval = options['interval'] count = options['count'] self.stdout.write("🔍 数据库性能监控开始...") for i in range(count): if i > 0: time.sleep(interval) self.stdout.write(f"\n=== 第 {i+1} 次监控 ===") self.monitor_key_metrics() def monitor_key_metrics(self): """监控关键性能指标""" db_connection = connections['default'] try: with db_connection.cursor() as cursor: # 1. 连接和活动状态 cursor.execute(""" SELECT count(*) as total_connections, count(*) FILTER (WHERE state = 'active') as active, count(*) FILTER (WHERE state = 'idle') as idle, count(*) FILTER (WHERE state = 'idle in transaction') as idle_in_trans, count(*) FILTER (WHERE wait_event_type IS NOT NULL) as waiting FROM pg_stat_activity; """) conn_stats = cursor.fetchone() self.stdout.write(f"连接: 总计{conn_stats[0]} | 活跃{conn_stats[1]} | 空闲{conn_stats[2]} | 事务中{conn_stats[3]} | 等待{conn_stats[4]}") # 2. 锁等待情况 cursor.execute(""" SELECT count(*) as total_locks, count(*) FILTER (WHERE NOT granted) as waiting_locks FROM pg_locks; """) lock_stats = cursor.fetchone() if lock_stats[1] > 0: self.stdout.write(self.style.WARNING(f"🔒 锁: 总计{lock_stats[0]} | 等待{lock_stats[1]}")) else: self.stdout.write(f"🔒 锁: 总计{lock_stats[0]} | 等待{lock_stats[1]}") # 3. 长时间运行的查询 cursor.execute(""" SELECT pid, application_name, now() - query_start as duration, state, left(query, 60) as query_preview FROM pg_stat_activity WHERE state = 'active' AND query_start < now() - interval '1 second' AND query NOT LIKE '%pg_stat_activity%' ORDER BY query_start; """) long_queries = cursor.fetchall() if long_queries: self.stdout.write(self.style.WARNING(f"⏱️ 长查询 ({len(long_queries)} 个):")) for query in long_queries: self.stdout.write(f" PID {query[0]} ({query[1]}): {query[2]} - {query[4]}...") else: self.stdout.write("⏱️ 长查询: 无") # 4. 缓存命中率 cursor.execute(""" SELECT sum(heap_blks_hit) as cache_hits, sum(heap_blks_read) as disk_reads, CASE WHEN sum(heap_blks_hit) + sum(heap_blks_read) = 0 THEN 0 ELSE round(sum(heap_blks_hit) * 100.0 / (sum(heap_blks_hit) + sum(heap_blks_read)), 2) END as hit_ratio FROM pg_statio_user_tables; """) cache_stats = cursor.fetchone() if cache_stats[0] or cache_stats[1]: hit_ratio = cache_stats[2] or 0 if hit_ratio < 95: self.stdout.write(self.style.WARNING(f"💾 缓存命中率: {hit_ratio}% (缓存:{cache_stats[0]}, 磁盘:{cache_stats[1]})")) else: self.stdout.write(f"💾 缓存命中率: {hit_ratio}% (缓存:{cache_stats[0]}, 磁盘:{cache_stats[1]})") else: self.stdout.write("💾 缓存: 暂无统计数据") # 5. 检查点活动(尝试获取,如果失败则跳过) try: cursor.execute("SELECT * FROM pg_stat_bgwriter LIMIT 1;") bgwriter_cols = [desc[0] for desc in cursor.description] if 'checkpoints_timed' in bgwriter_cols: cursor.execute(""" SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time FROM pg_stat_bgwriter; """) bgwriter = cursor.fetchone() total_checkpoints = bgwriter[0] + bgwriter[1] if bgwriter[2] > 10000 or bgwriter[3] > 5000: self.stdout.write(self.style.WARNING(f"📝 检查点: 总计{total_checkpoints} | 写入{bgwriter[2]}ms | 同步{bgwriter[3]}ms")) else: self.stdout.write(f"📝 检查点: 总计{total_checkpoints} | 写入{bgwriter[2]}ms | 同步{bgwriter[3]}ms") else: self.stdout.write("📝 检查点: 统计不可用") except Exception: self.stdout.write("📝 检查点: 统计不可用") # 6. 数据库大小变化 cursor.execute("SELECT pg_database_size(current_database());") db_size = cursor.fetchone()[0] db_size_mb = round(db_size / 1024 / 1024, 2) self.stdout.write(f"💿 数据库大小: {db_size_mb} MB") # 7. 测试查询延迟 start_time = time.time() cursor.execute("SELECT 1") cursor.fetchone() query_latency = (time.time() - start_time) * 1000 if query_latency > 500: self.stdout.write(self.style.ERROR(f"⚡ 查询延迟: {query_latency:.2f}ms (高)")) elif query_latency > 200: self.stdout.write(self.style.WARNING(f"⚡ 查询延迟: {query_latency:.2f}ms (中)")) else: self.stdout.write(f"⚡ 查询延迟: {query_latency:.2f}ms (正常)") except Exception as e: self.stdout.write(self.style.ERROR(f"监控失败: {e}")) ================================================ FILE: backend/apps/common/management/commands/init_admin.py ================================================ """ 初始化 admin 用户 用法: python manage.py init_admin [--password <password>] """ import os from django.core.management.base import BaseCommand from django.contrib.auth import get_user_model User = get_user_model() DEFAULT_USERNAME = 'admin' DEFAULT_PASSWORD = 'admin' # 默认密码,建议首次登录后修改 class Command(BaseCommand): help = '初始化 admin 用户' def add_arguments(self, parser): parser.add_argument( '--password', type=str, default=os.getenv('ADMIN_PASSWORD', DEFAULT_PASSWORD), help='admin 用户密码 (默认: admin 或 ADMIN_PASSWORD 环境变量)' ) parser.add_argument( '--force', action='store_true', help='强制重置密码(如果用户已存在)' ) def handle(self, *args, **options): password = options['password'] force = options['force'] try: user = User.objects.get(username=DEFAULT_USERNAME) if force: user.set_password(password) user.save() self.stdout.write( self.style.SUCCESS(f'✓ admin 用户密码已重置') ) else: self.stdout.write( self.style.WARNING(f'⚠ admin 用户已存在,跳过创建(使用 --force 重置密码)') ) except User.DoesNotExist: User.objects.create_superuser( username=DEFAULT_USERNAME, email='admin@localhost', password=password ) self.stdout.write( self.style.SUCCESS(f'✓ admin 用户创建成功') ) self.stdout.write( self.style.WARNING(f' 用户名: {DEFAULT_USERNAME}') ) self.stdout.write( self.style.WARNING(f' 密码: {password}') ) self.stdout.write( self.style.WARNING(f' ⚠ 请首次登录后修改密码!') ) ================================================ FILE: backend/apps/common/migrations/0001_initial.py ================================================ # Generated by Django 5.2.7 on 2026-01-06 00:55 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('targets', '0001_initial'), ] operations = [ migrations.CreateModel( name='BlacklistRule', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('pattern', models.CharField(help_text='规则模式,如 *.gov, 10.0.0.0/8, 192.168.1.1', max_length=255)), ('rule_type', models.CharField(choices=[('domain', '域名'), ('ip', 'IP地址'), ('cidr', 'CIDR范围'), ('keyword', '关键词')], help_text='规则类型:domain, ip, cidr', max_length=20)), ('scope', models.CharField(choices=[('global', '全局规则'), ('target', 'Target规则')], db_index=True, help_text='作用域:global 或 target', max_length=20)), ('description', models.CharField(blank=True, default='', help_text='规则描述', max_length=500)), ('created_at', models.DateTimeField(auto_now_add=True)), ('target', models.ForeignKey(blank=True, help_text='关联的 Target(仅 scope=target 时有值)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='blacklist_rules', to='targets.target')), ], options={ 'db_table': 'blacklist_rule', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['scope', 'rule_type'], name='blacklist_r_scope_6ff77f_idx'), models.Index(fields=['target', 'scope'], name='blacklist_r_target__191441_idx')], 'constraints': [models.UniqueConstraint(fields=('pattern', 'scope', 'target'), name='unique_blacklist_rule')], }, ), ] ================================================ FILE: backend/apps/common/migrations/__init__.py ================================================ ================================================ FILE: backend/apps/common/models/__init__.py ================================================ """Common models""" from apps.common.models.blacklist import BlacklistRule __all__ = ['BlacklistRule'] ================================================ FILE: backend/apps/common/models/blacklist.py ================================================ """黑名单规则模型""" from django.db import models class BlacklistRule(models.Model): """黑名单规则模型 用于存储黑名单过滤规则,支持域名、IP、CIDR 三种类型。 支持两层作用域:全局规则和 Target 级规则。 """ class RuleType(models.TextChoices): DOMAIN = 'domain', '域名' IP = 'ip', 'IP地址' CIDR = 'cidr', 'CIDR范围' KEYWORD = 'keyword', '关键词' class Scope(models.TextChoices): GLOBAL = 'global', '全局规则' TARGET = 'target', 'Target规则' id = models.AutoField(primary_key=True) pattern = models.CharField( max_length=255, help_text='规则模式,如 *.gov, 10.0.0.0/8, 192.168.1.1' ) rule_type = models.CharField( max_length=20, choices=RuleType.choices, help_text='规则类型:domain, ip, cidr' ) scope = models.CharField( max_length=20, choices=Scope.choices, db_index=True, help_text='作用域:global 或 target' ) target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, null=True, blank=True, related_name='blacklist_rules', help_text='关联的 Target(仅 scope=target 时有值)' ) description = models.CharField( max_length=500, blank=True, default='', help_text='规则描述' ) created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'blacklist_rule' indexes = [ models.Index(fields=['scope', 'rule_type']), models.Index(fields=['target', 'scope']), ] constraints = [ models.UniqueConstraint( fields=['pattern', 'scope', 'target'], name='unique_blacklist_rule' ), ] ordering = ['-created_at'] def __str__(self): if self.scope == self.Scope.TARGET and self.target: return f"[{self.scope}:{self.target_id}] {self.pattern}" return f"[{self.scope}] {self.pattern}" ================================================ FILE: backend/apps/common/normalizer.py ================================================ import re # 预编译正则表达式,避免每次调用时重新编译 IP_PATTERN = re.compile(r'^[\d.:]+$') def normalize_domain(domain: str) -> str: """ 规范化域名 - 去除首尾空格 - 转换为小写 - 移除末尾的点 Args: domain: 原始域名 Returns: 规范化后的域名 Raises: ValueError: 域名为空或只包含空格 """ if not domain or not domain.strip(): raise ValueError("域名不能为空") normalized = domain.strip().lower() # 移除末尾的点 if normalized.endswith('.'): normalized = normalized.rstrip('.') return normalized def normalize_ip(ip: str) -> str: """ 规范化 IP 地址 - 去除首尾空格 - IP 地址不转小写(保持原样) Args: ip: 原始 IP 地址 Returns: 规范化后的 IP 地址 Raises: ValueError: IP 地址为空或只包含空格 """ if not ip or not ip.strip(): raise ValueError("IP 地址不能为空") return ip.strip() def normalize_cidr(cidr: str) -> str: """ 规范化 CIDR - 去除首尾空格 - CIDR 不转小写(保持原样) Args: cidr: 原始 CIDR Returns: 规范化后的 CIDR Raises: ValueError: CIDR 为空或只包含空格 """ if not cidr or not cidr.strip(): raise ValueError("CIDR 不能为空") return cidr.strip() def normalize_target(target: str) -> str: """ 规范化目标名称(统一入口) 根据目标格式自动选择合适的规范化函数 Args: target: 原始目标名称 Returns: 规范化后的目标名称 Raises: ValueError: 目标为空或只包含空格 """ if not target or not target.strip(): raise ValueError("目标名称不能为空") # 先去除首尾空格 trimmed = target.strip() # 如果包含 /,按 CIDR 处理 if '/' in trimmed: return normalize_cidr(trimmed) # 如果是纯数字、点、冒号组成,按 IP 处理 if IP_PATTERN.match(trimmed): return normalize_ip(trimmed) # 否则按域名处理 return normalize_domain(trimmed) ================================================ FILE: backend/apps/common/pagination.py ================================================ """ 自定义分页器,匹配前端响应格式 """ from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response class BasePagination(PageNumberPagination): """ 基础分页器,统一返回格式 响应格式: { "results": [...], "total": 100, "page": 1, "pageSize": 10, "totalPages": 10 } """ page_size = 10 # 默认每页 10 条 page_size_query_param = 'pageSize' # 允许客户端自定义每页数量 max_page_size = 1000 # 最大每页数量限制 def get_paginated_response(self, data): """自定义响应格式""" return Response({ 'results': data, # 数据列表 'total': self.page.paginator.count, # 总记录数 'page': self.page.number, # 当前页码(从 1 开始) 'page_size': self.page.paginator.per_page, # 实际使用的每页大小 'total_pages': self.page.paginator.num_pages # 总页数 }) ================================================ FILE: backend/apps/common/permissions.py ================================================ """ 集中式权限管理 实现三类端点的认证逻辑: 1. 公开端点(无需认证):登录、登出、获取当前用户状态 2. Worker 端点(API Key 认证):注册、配置、心跳、回调、资源同步 3. 业务端点(Session 认证):其他所有 API """ import re import logging from django.conf import settings from rest_framework.permissions import BasePermission logger = logging.getLogger(__name__) # 公开端点白名单(无需任何认证) PUBLIC_ENDPOINTS = [ r'^/api/auth/login/$', r'^/api/auth/logout/$', r'^/api/auth/me/$', ] # Worker API 端点(需要 API Key 认证) # 包括:注册、配置、心跳、回调、资源同步(字典下载) WORKER_ENDPOINTS = [ r'^/api/workers/register/$', r'^/api/workers/config/$', r'^/api/workers/\d+/heartbeat/$', r'^/api/callbacks/', # 资源同步端点(Worker 需要下载字典文件) r'^/api/wordlists/download/$', # 注意:指纹导出 API 使用 Session 认证(前端用户导出用) # Worker 通过数据库直接获取指纹数据,不需要 HTTP API ] class IsAuthenticatedOrPublic(BasePermission): """ 自定义权限类: - 白名单内的端点公开访问 - Worker 端点需要 API Key 认证 - 其他端点需要 Session 认证 """ def has_permission(self, request, view): path = request.path # 检查是否在公开白名单内 for pattern in PUBLIC_ENDPOINTS: if re.match(pattern, path): return True # 检查是否是 Worker 端点 for pattern in WORKER_ENDPOINTS: if re.match(pattern, path): return self._check_worker_api_key(request) # 其他路径需要 Session 认证 return request.user and request.user.is_authenticated def _check_worker_api_key(self, request): """验证 Worker API Key""" api_key = request.headers.get('X-Worker-API-Key') expected_key = getattr(settings, 'WORKER_API_KEY', None) if not expected_key: # 未配置 API Key 时,拒绝所有 Worker 请求 logger.warning("WORKER_API_KEY 未配置,拒绝 Worker 请求") return False if not api_key: logger.warning(f"Worker 请求缺少 X-Worker-API-Key Header: {request.path}") return False if api_key != expected_key: logger.warning(f"Worker API Key 无效: {request.path}") return False return True ================================================ FILE: backend/apps/common/prefect_django_setup.py ================================================ """ Prefect Flow Django 环境初始化模块 在所有 Prefect Flow 文件开头导入此模块即可自动配置 Django 环境 """ import os import sys def setup_django_for_prefect(): """ 为 Prefect Flow 配置 Django 环境 此函数会: 1. 添加项目根目录到 Python 路径 2. 设置 DJANGO_SETTINGS_MODULE 环境变量 3. 调用 django.setup() 初始化 Django 4. 关闭旧的数据库连接,确保使用新连接 使用方式: from apps.common.prefect_django_setup import setup_django_for_prefect setup_django_for_prefect() """ # 获取项目根目录(backend 目录) current_dir = os.path.dirname(os.path.abspath(__file__)) backend_dir = os.path.join(current_dir, '../..') backend_dir = os.path.abspath(backend_dir) # 添加到 Python 路径 if backend_dir not in sys.path: sys.path.insert(0, backend_dir) # 配置 Django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') # 初始化 Django import django django.setup() # 关闭所有旧的数据库连接,确保 Worker 进程使用新连接 # 解决 "server closed the connection unexpectedly" 问题 from django.db import connections connections.close_all() def close_old_db_connections(): """ 关闭旧的数据库连接 在长时间运行的任务中调用此函数,可以确保使用有效的数据库连接。 适用于: - Flow 开始前 - Task 开始前 - 长时间空闲后恢复操作前 """ from django.db import connections connections.close_all() # 自动执行初始化(导入即生效) setup_django_for_prefect() ================================================ FILE: backend/apps/common/response_helpers.py ================================================ """ 标准化 API 响应辅助函数 遵循行业标准(RFC 9457 Problem Details)和大厂实践(Google、Stripe、GitHub): - 成功响应只包含数据,不包含 message 字段 - 错误响应使用机器可读的错误码,前端映射到 i18n 消息 """ from typing import Any, Dict, List, Optional, Union from rest_framework import status from rest_framework.response import Response def success_response( data: Optional[Union[Dict[str, Any], List[Any]]] = None, status_code: int = status.HTTP_200_OK ) -> Response: """ 标准化成功响应 直接返回数据,不做包装,符合 Stripe/GitHub 等大厂标准。 Args: data: 响应数据(dict 或 list) status_code: HTTP 状态码,默认 200 Returns: Response: DRF Response 对象 Examples: # 单个资源 >>> success_response(data={'id': 1, 'name': 'Test'}) {'id': 1, 'name': 'Test'} # 操作结果 >>> success_response(data={'count': 3, 'scans': [...]}) {'count': 3, 'scans': [...]} # 创建资源 >>> success_response(data={'id': 1}, status_code=201) """ # 注意:不能使用 data or {},因为空列表 [] 会被转换为 {} if data is None: data = {} return Response(data, status=status_code) def error_response( code: str, message: Optional[str] = None, details: Optional[List[Dict[str, Any]]] = None, status_code: int = status.HTTP_400_BAD_REQUEST ) -> Response: """ 标准化错误响应 Args: code: 错误码(如 'VALIDATION_ERROR', 'NOT_FOUND') 格式:大写字母和下划线组成 message: 开发者调试信息(非用户显示) details: 详细错误信息(如字段级验证错误) status_code: HTTP 状态码,默认 400 Returns: Response: DRF Response 对象 Examples: # 简单错误 >>> error_response(code='NOT_FOUND', status_code=404) {'error': {'code': 'NOT_FOUND'}} # 带调试信息 >>> error_response( ... code='VALIDATION_ERROR', ... message='Invalid input data', ... details=[{'field': 'name', 'message': 'Required'}] ... ) {'error': {'code': 'VALIDATION_ERROR', 'message': '...', 'details': [...]}} """ error_body: Dict[str, Any] = {'code': code} if message: error_body['message'] = message if details: error_body['details'] = details return Response({'error': error_body}, status=status_code) ================================================ FILE: backend/apps/common/serializers/__init__.py ================================================ """Common serializers""" from .blacklist_serializers import ( BlacklistRuleSerializer, GlobalBlacklistRuleSerializer, TargetBlacklistRuleSerializer, ) __all__ = [ 'BlacklistRuleSerializer', 'GlobalBlacklistRuleSerializer', 'TargetBlacklistRuleSerializer', ] ================================================ FILE: backend/apps/common/serializers/blacklist_serializers.py ================================================ """黑名单规则序列化器""" from rest_framework import serializers from apps.common.models import BlacklistRule from apps.common.utils import detect_rule_type class BlacklistRuleSerializer(serializers.ModelSerializer): """黑名单规则序列化器""" class Meta: model = BlacklistRule fields = [ 'id', 'pattern', 'rule_type', 'scope', 'target', 'description', 'created_at', ] read_only_fields = ['id', 'rule_type', 'created_at'] def validate_pattern(self, value): """验证规则模式""" if not value or not value.strip(): raise serializers.ValidationError("规则模式不能为空") return value.strip() def create(self, validated_data): """创建规则时自动识别规则类型""" pattern = validated_data.get('pattern', '') validated_data['rule_type'] = detect_rule_type(pattern) return super().create(validated_data) def update(self, instance, validated_data): """更新规则时重新识别规则类型""" if 'pattern' in validated_data: pattern = validated_data['pattern'] validated_data['rule_type'] = detect_rule_type(pattern) return super().update(instance, validated_data) class GlobalBlacklistRuleSerializer(BlacklistRuleSerializer): """全局黑名单规则序列化器""" class Meta(BlacklistRuleSerializer.Meta): fields = ['id', 'pattern', 'rule_type', 'description', 'created_at'] read_only_fields = ['id', 'rule_type', 'created_at'] def create(self, validated_data): """创建全局规则""" validated_data['scope'] = BlacklistRule.Scope.GLOBAL validated_data['target'] = None return super().create(validated_data) class TargetBlacklistRuleSerializer(BlacklistRuleSerializer): """Target 黑名单规则序列化器""" class Meta(BlacklistRuleSerializer.Meta): fields = ['id', 'pattern', 'rule_type', 'description', 'created_at'] read_only_fields = ['id', 'rule_type', 'created_at'] def create(self, validated_data): """创建 Target 规则(target_id 由 view 设置)""" validated_data['scope'] = BlacklistRule.Scope.TARGET return super().create(validated_data) ================================================ FILE: backend/apps/common/services/__init__.py ================================================ """ 通用服务模块 提供系统级别的公共服务,包括: - SystemLogService: 系统日志读取服务 - BlacklistService: 黑名单过滤服务 注意:FilterService 已移至 apps.common.utils.filter_utils 推荐使用: from apps.common.utils.filter_utils import apply_filters """ from .system_log_service import SystemLogService from .blacklist_service import BlacklistService __all__ = [ 'SystemLogService', 'BlacklistService', ] ================================================ FILE: backend/apps/common/services/blacklist_service.py ================================================ """ 黑名单规则管理服务 负责黑名单规则的 CRUD 操作(数据库层面)。 过滤逻辑请使用 apps.common.utils.BlacklistFilter。 架构说明: - Model: BlacklistRule (apps.common.models.blacklist) - Service: BlacklistService (本文件) - 规则 CRUD - Utils: BlacklistFilter (apps.common.utils.blacklist_filter) - 过滤逻辑 - View: GlobalBlacklistView, TargetViewSet.blacklist """ import logging from typing import List, Dict, Any, Optional from django.db.models import QuerySet from apps.common.utils import detect_rule_type logger = logging.getLogger(__name__) def _normalize_patterns(patterns: List[str]) -> List[str]: """ 规范化规则列表:去重 + 过滤空行 Args: patterns: 原始规则列表 Returns: List[str]: 去重后的规则列表(保持顺序) """ return list(dict.fromkeys(filter(None, (p.strip() for p in patterns)))) class BlacklistService: """ 黑名单规则管理服务 只负责规则的 CRUD 操作,不包含过滤逻辑。 过滤逻辑请使用 BlacklistFilter 工具类。 """ def get_global_rules(self) -> QuerySet: """ 获取全局黑名单规则列表 Returns: QuerySet: 全局规则查询集 """ from apps.common.models import BlacklistRule return BlacklistRule.objects.filter(scope=BlacklistRule.Scope.GLOBAL) def get_target_rules(self, target_id: int) -> QuerySet: """ 获取 Target 级黑名单规则列表 Args: target_id: Target ID Returns: QuerySet: Target 级规则查询集 """ from apps.common.models import BlacklistRule return BlacklistRule.objects.filter( scope=BlacklistRule.Scope.TARGET, target_id=target_id ) def get_rules(self, target_id: Optional[int] = None) -> List: """ 获取黑名单规则(全局 + Target 级) Args: target_id: Target ID,用于加载 Target 级规则 Returns: List[BlacklistRule]: 规则列表 """ from apps.common.models import BlacklistRule # 加载全局规则 rules = list(BlacklistRule.objects.filter(scope=BlacklistRule.Scope.GLOBAL)) # 加载 Target 级规则 if target_id: target_rules = BlacklistRule.objects.filter( scope=BlacklistRule.Scope.TARGET, target_id=target_id ) rules.extend(target_rules) return rules def replace_global_rules(self, patterns: List[str]) -> Dict[str, Any]: """ 全量替换全局黑名单规则(PUT 语义) Args: patterns: 新的规则模式列表 Returns: Dict: {'count': int} 最终规则数量 """ from apps.common.models import BlacklistRule count = self._replace_rules( patterns=patterns, scope=BlacklistRule.Scope.GLOBAL, target=None ) logger.info("全量替换全局黑名单规则: %d 条", count) return {'count': count} def replace_target_rules(self, target, patterns: List[str]) -> Dict[str, Any]: """ 全量替换 Target 级黑名单规则(PUT 语义) Args: target: Target 对象 patterns: 新的规则模式列表 Returns: Dict: {'count': int} 最终规则数量 """ from apps.common.models import BlacklistRule count = self._replace_rules( patterns=patterns, scope=BlacklistRule.Scope.TARGET, target=target ) logger.info("全量替换 Target 黑名单规则: %d 条 (Target: %s)", count, target.name) return {'count': count} def _replace_rules(self, patterns: List[str], scope: str, target=None) -> int: """ 内部方法:全量替换规则 Args: patterns: 规则模式列表 scope: 规则作用域 (GLOBAL/TARGET) target: Target 对象(仅 TARGET 作用域需要) Returns: int: 最终规则数量 """ from apps.common.models import BlacklistRule from django.db import transaction patterns = _normalize_patterns(patterns) with transaction.atomic(): # 1. 删除旧规则 delete_filter = {'scope': scope} if target: delete_filter['target'] = target BlacklistRule.objects.filter(**delete_filter).delete() # 2. 创建新规则 if patterns: rules = [ BlacklistRule( pattern=pattern, rule_type=detect_rule_type(pattern), scope=scope, target=target ) for pattern in patterns ] BlacklistRule.objects.bulk_create(rules) return len(patterns) ================================================ FILE: backend/apps/common/services/system_log_service.py ================================================ """ 系统日志服务模块 提供系统日志的读取功能,支持: - 从日志目录读取日志文件 - 限制返回行数,防止内存溢出 - 列出可用的日志文件 """ import fnmatch import logging import os import subprocess from datetime import datetime, timezone from typing import TypedDict logger = logging.getLogger(__name__) class LogFileInfo(TypedDict): """日志文件信息""" filename: str category: str # 'system' | 'error' | 'performance' | 'container' size: int modifiedAt: str # ISO 8601 格式 class SystemLogService: """ 系统日志服务类 负责读取系统日志文件,支持从容器内路径或宿主机挂载路径读取日志。 """ # 日志文件分类规则 CATEGORY_RULES = [ ('xingrin.log', 'system'), ('xingrin_error.log', 'error'), ('performance.log', 'performance'), ('container_*.log', 'container'), ] def __init__(self): # 日志目录路径 self.log_dir = "/opt/xingrin/logs" self.default_file = "xingrin.log" # 默认日志文件 self.default_lines = 200 # 默认返回行数 self.max_lines = 10000 # 最大返回行数限制 self.timeout_seconds = 3 # tail 命令超时时间 def _categorize_file(self, filename: str) -> str | None: """ 根据文件名判断日志分类 Returns: 分类名称,如果不是日志文件则返回 None """ for pattern, category in self.CATEGORY_RULES: if fnmatch.fnmatch(filename, pattern): return category return None def _validate_filename(self, filename: str) -> bool: """ 验证文件名是否合法(防止路径遍历攻击) Args: filename: 要验证的文件名 Returns: bool: 文件名是否合法 """ # 不允许包含路径分隔符 if '/' in filename or '\\' in filename: return False # 不允许 .. 路径遍历 if '..' in filename: return False # 必须是已知的日志文件类型 return self._categorize_file(filename) is not None def get_log_files(self) -> list[LogFileInfo]: """ 获取所有可用的日志文件列表 Returns: 日志文件信息列表,按分类和文件名排序 """ files: list[LogFileInfo] = [] if not os.path.isdir(self.log_dir): logger.warning("日志目录不存在: %s", self.log_dir) return files for filename in os.listdir(self.log_dir): filepath = os.path.join(self.log_dir, filename) # 只处理文件,跳过目录 if not os.path.isfile(filepath): continue # 判断分类 category = self._categorize_file(filename) if category is None: continue # 获取文件信息 try: stat = os.stat(filepath) modified_at = datetime.fromtimestamp( stat.st_mtime, tz=timezone.utc ).isoformat() files.append({ 'filename': filename, 'category': category, 'size': stat.st_size, 'modifiedAt': modified_at, }) except OSError as e: logger.warning("获取文件信息失败 %s: %s", filepath, e) continue # 排序:按分类优先级(system > error > performance > container),然后按文件名 category_order = {'system': 0, 'error': 1, 'performance': 2, 'container': 3} files.sort(key=lambda f: (category_order.get(f['category'], 99), f['filename'])) return files def get_logs_content(self, filename: str | None = None, lines: int | None = None) -> str: """ 获取系统日志内容 Args: filename: 日志文件名,默认为 xingrin.log lines: 返回的日志行数,默认 200 行,最大 10000 行 Returns: str: 日志内容,每行以换行符分隔,保持原始顺序 Raises: ValueError: 文件名不合法 FileNotFoundError: 日志文件不存在 """ # 文件名处理 if filename is None: filename = self.default_file # 验证文件名 if not self._validate_filename(filename): raise ValueError(f"无效的文件名: {filename}") # 构建完整路径 log_file = os.path.join(self.log_dir, filename) # 检查文件是否存在 if not os.path.isfile(log_file): raise FileNotFoundError(f"日志文件不存在: {filename}") # 参数校验和默认值处理 if lines is None: lines = self.default_lines lines = int(lines) if lines < 1: lines = 1 if lines > self.max_lines: lines = self.max_lines # 使用 tail 命令读取日志文件末尾内容 cmd = ["tail", "-n", str(lines), log_file] result = subprocess.run( cmd, capture_output=True, text=True, timeout=self.timeout_seconds, check=False, ) if result.returncode != 0: logger.warning( "tail command failed: returncode=%s stderr=%s", result.returncode, (result.stderr or "").strip(), ) # 直接返回原始内容,保持文件中的顺序 return result.stdout or "" ================================================ FILE: backend/apps/common/signals.py ================================================ """通用信号定义 定义项目中使用的自定义信号,用于解耦各模块之间的通信。 使用方式: 1. 发布信号:signal.send(sender=SomeClass, **kwargs) 2. 接收信号:@receiver(signal) def handler(sender, **kwargs): ... """ from django.dispatch import Signal # ==================== 漏洞相关信号 ==================== # 漏洞保存完成信号 # 参数: # - items: List[VulnerabilitySnapshotDTO] 保存的漏洞列表 # - scan_id: int 扫描任务ID # - target_id: int 目标ID vulnerabilities_saved = Signal() # ==================== Worker 相关信号 ==================== # Worker 删除失败信号(只在失败时发送) # 参数: # - worker_name: str Worker 名称 # - message: str 失败原因 worker_delete_failed = Signal() # 所有 Worker 高负载信号 # 参数: # - worker_name: str 被选中的 Worker 名称 # - cpu: float CPU 使用率 # - mem: float 内存使用率 all_workers_high_load = Signal() ================================================ FILE: backend/apps/common/urls.py ================================================ """ 通用模块 URL 配置 路由说明: - /api/health/ 健康检查接口(无需认证) - /api/auth/* 认证相关接口(登录、登出、用户信息) - /api/system/* 系统管理接口(日志查看等) - /api/blacklist/* 黑名单管理接口 """ from django.urls import path from .views import ( LoginView, LogoutView, MeView, ChangePasswordView, SystemLogsView, SystemLogFilesView, HealthCheckView, GlobalBlacklistView, VersionView, CheckUpdateView, ) urlpatterns = [ # 健康检查(无需认证) path('health/', HealthCheckView.as_view(), name='health-check'), # 认证相关 path('auth/login/', LoginView.as_view(), name='auth-login'), path('auth/logout/', LogoutView.as_view(), name='auth-logout'), path('auth/me/', MeView.as_view(), name='auth-me'), path('auth/change-password/', ChangePasswordView.as_view(), name='auth-change-password'), # 系统管理 path('system/logs/', SystemLogsView.as_view(), name='system-logs'), path('system/logs/files/', SystemLogFilesView.as_view(), name='system-log-files'), path('system/version/', VersionView.as_view(), name='system-version'), path('system/check-update/', CheckUpdateView.as_view(), name='system-check-update'), # 黑名单管理(PUT 全量替换模式) path('blacklist/rules/', GlobalBlacklistView.as_view(), name='blacklist-rules'), ] ================================================ FILE: backend/apps/common/utils/__init__.py ================================================ """Common utilities""" from .dedup import deduplicate_for_bulk, get_unique_fields from .hash import ( calc_file_sha256, calc_stream_sha256, safe_calc_file_sha256, is_file_hash_match, ) from .csv_utils import ( generate_csv_rows, format_list_field, format_datetime, create_csv_export_response, UTF8_BOM, ) from .blacklist_filter import ( BlacklistFilter, detect_rule_type, extract_host, ) __all__ = [ 'deduplicate_for_bulk', 'get_unique_fields', 'calc_file_sha256', 'calc_stream_sha256', 'safe_calc_file_sha256', 'is_file_hash_match', 'generate_csv_rows', 'format_list_field', 'format_datetime', 'create_csv_export_response', 'UTF8_BOM', 'BlacklistFilter', 'detect_rule_type', 'extract_host', ] ================================================ FILE: backend/apps/common/utils/blacklist_filter.py ================================================ """ 黑名单过滤工具 提供域名、IP、CIDR、关键词的黑名单匹配功能。 纯工具类,不涉及数据库操作。 支持的规则类型: 1. 域名精确匹配: example.com - 规则: example.com - 匹配: example.com - 不匹配: sub.example.com, other.com 2. 域名后缀匹配: *.example.com - 规则: *.example.com - 匹配: sub.example.com, a.b.example.com, example.com - 不匹配: other.com, example.com.cn 3. 关键词匹配: *cdn* - 规则: *cdn* - 匹配: cdn.example.com, a.cdn.b.com, mycdn123.com - 不匹配: example.com (不包含 cdn) 4. IP 精确匹配: 192.168.1.1 - 规则: 192.168.1.1 - 匹配: 192.168.1.1 - 不匹配: 192.168.1.2 5. CIDR 范围匹配: 192.168.0.0/24 - 规则: 192.168.0.0/24 - 匹配: 192.168.0.1, 192.168.0.255 - 不匹配: 192.168.1.1 使用方式: from apps.common.utils import BlacklistFilter # 创建过滤器(传入规则列表) rules = BlacklistRule.objects.filter(...) filter = BlacklistFilter(rules) # 检查单个目标 if filter.is_allowed('http://example.com'): process(url) # 流式处理 for url in urls: if filter.is_allowed(url): process(url) """ import ipaddress import logging from typing import List, Optional from urllib.parse import urlparse from apps.common.validators import is_valid_ip, validate_cidr logger = logging.getLogger(__name__) def detect_rule_type(pattern: str) -> str: """ 自动识别规则类型 支持的模式: - 域名精确匹配: example.com - 域名后缀匹配: *.example.com - 关键词匹配: *cdn* (匹配包含 cdn 的域名) - IP 精确匹配: 192.168.1.1 - CIDR 范围: 192.168.0.0/24 Args: pattern: 规则模式字符串 Returns: str: 规则类型 ('domain', 'ip', 'cidr', 'keyword') """ if not pattern: return 'domain' pattern = pattern.strip() # 检查关键词模式: *keyword* (前后都有星号,中间无点) if pattern.startswith('*') and pattern.endswith('*') and len(pattern) > 2: keyword = pattern[1:-1] # 关键词中不能有点(否则可能是域名模式) if '.' not in keyword: return 'keyword' # 检查 CIDR(包含 /) if '/' in pattern: try: validate_cidr(pattern) return 'cidr' except ValueError: pass # 检查 IP(去掉通配符前缀后验证) clean_pattern = pattern.lstrip('*').lstrip('.') if is_valid_ip(clean_pattern): return 'ip' # 默认为域名 return 'domain' def extract_host(target: str) -> str: """ 从目标字符串中提取主机名 支持: - 纯域名:example.com - 纯 IP:192.168.1.1 - URL:http://example.com/path Args: target: 目标字符串 Returns: str: 提取的主机名 """ if not target: return '' target = target.strip() # 如果是 URL,提取 hostname if '://' in target: try: parsed = urlparse(target) return parsed.hostname or target except Exception: return target return target class BlacklistFilter: """ 黑名单过滤器 预编译规则,提供高效的匹配功能。 """ def __init__(self, rules: List): """ 初始化过滤器 Args: rules: BlacklistRule 对象列表 """ from apps.common.models import BlacklistRule # 预解析:按类型分类 + CIDR 预编译 self._domain_rules = [] # (pattern, is_wildcard, suffix) self._ip_rules = set() # 精确 IP 用 set,O(1) 查找 self._cidr_rules = [] # (pattern, network_obj) self._keyword_rules = [] # 关键词列表(小写) # 去重:跨 scope 可能有重复规则 seen_patterns = set() for rule in rules: if rule.pattern in seen_patterns: continue seen_patterns.add(rule.pattern) if rule.rule_type == BlacklistRule.RuleType.DOMAIN: pattern = rule.pattern.lower() if pattern.startswith('*.'): self._domain_rules.append((pattern, True, pattern[1:])) else: self._domain_rules.append((pattern, False, None)) elif rule.rule_type == BlacklistRule.RuleType.IP: self._ip_rules.add(rule.pattern) elif rule.rule_type == BlacklistRule.RuleType.CIDR: try: network = ipaddress.ip_network(rule.pattern, strict=False) self._cidr_rules.append((rule.pattern, network)) except ValueError: pass elif rule.rule_type == BlacklistRule.RuleType.KEYWORD: # *cdn* -> cdn keyword = rule.pattern[1:-1].lower() self._keyword_rules.append(keyword) def is_allowed(self, target: str) -> bool: """ 检查目标是否通过过滤 Args: target: 要检查的目标(域名/IP/URL) Returns: bool: True 表示通过(不在黑名单),False 表示被过滤 """ if not target: return True host = extract_host(target) if not host: return True # 先判断输入类型,再走对应分支 if is_valid_ip(host): return self._check_ip_rules(host) else: return self._check_domain_rules(host) def _check_domain_rules(self, host: str) -> bool: """检查域名规则(精确匹配 + 后缀匹配 + 关键词匹配)""" host_lower = host.lower() # 1. 域名规则(精确 + 后缀) for pattern, is_wildcard, suffix in self._domain_rules: if is_wildcard: if host_lower.endswith(suffix) or host_lower == pattern[2:]: return False else: if host_lower == pattern: return False # 2. 关键词匹配(字符串 in 操作,O(n*m)) for keyword in self._keyword_rules: if keyword in host_lower: return False return True def _check_ip_rules(self, host: str) -> bool: """检查 IP 规则(精确匹配 + CIDR)""" # 1. IP 精确匹配(O(1)) if host in self._ip_rules: return False # 2. CIDR 匹配 if self._cidr_rules: try: ip_obj = ipaddress.ip_address(host) for _, network in self._cidr_rules: if ip_obj in network: return False except ValueError: pass return True ================================================ FILE: backend/apps/common/utils/csv_utils.py ================================================ """CSV 导出工具模块 提供流式 CSV 生成功能,支持: - UTF-8 BOM(Excel 兼容) - RFC 4180 规范转义 - 流式生成(内存友好) - 带 Content-Length 的文件响应(支持浏览器下载进度显示) """ import csv import io import os import tempfile import logging from datetime import datetime from typing import Iterator, Dict, Any, List, Callable, Optional from django.http import FileResponse, StreamingHttpResponse logger = logging.getLogger(__name__) # UTF-8 BOM,确保 Excel 正确识别编码 UTF8_BOM = '\ufeff' def generate_csv_rows( data_iterator: Iterator[Dict[str, Any]], headers: List[str], field_formatters: Optional[Dict[str, Callable]] = None ) -> Iterator[str]: """ 流式生成 CSV 行 Args: data_iterator: 数据迭代器,每个元素是一个字典 headers: CSV 表头列表 field_formatters: 字段格式化函数字典,key 为字段名,value 为格式化函数 Yields: CSV 行字符串(包含换行符) Example: >>> data = [{'ip': '192.168.1.1', 'hosts': ['a.com', 'b.com']}] >>> headers = ['ip', 'hosts'] >>> formatters = {'hosts': format_list_field} >>> for row in generate_csv_rows(iter(data), headers, formatters): ... print(row, end='') """ # 输出 BOM + 表头 output = io.StringIO() writer = csv.writer(output, quoting=csv.QUOTE_MINIMAL) writer.writerow(headers) yield UTF8_BOM + output.getvalue() # 输出数据行 for row_data in data_iterator: output = io.StringIO() writer = csv.writer(output, quoting=csv.QUOTE_MINIMAL) row = [] for header in headers: value = row_data.get(header, '') if field_formatters and header in field_formatters: value = field_formatters[header](value) row.append(value if value is not None else '') writer.writerow(row) yield output.getvalue() def format_list_field(values: List, separator: str = ';') -> str: """ 将列表字段格式化为分号分隔的字符串 Args: values: 值列表 separator: 分隔符,默认为分号 Returns: 分隔符连接的字符串 Example: >>> format_list_field(['a.com', 'b.com']) 'a.com;b.com' >>> format_list_field([80, 443]) '80;443' >>> format_list_field([]) '' >>> format_list_field(None) '' """ if not values: return '' return separator.join(str(v) for v in values) def format_datetime(dt: Optional[datetime]) -> str: """ 格式化日期时间为字符串(转换为本地时区) Args: dt: datetime 对象或 None Returns: 格式化的日期时间字符串,格式为 YYYY-MM-DD HH:MM:SS(本地时区) Example: >>> from datetime import datetime >>> format_datetime(datetime(2024, 1, 15, 10, 30, 0)) '2024-01-15 10:30:00' >>> format_datetime(None) '' """ if dt is None: return '' if isinstance(dt, str): return dt # 转换为本地时区(从 Django settings 获取) from django.utils import timezone if timezone.is_aware(dt): dt = timezone.localtime(dt) return dt.strftime('%Y-%m-%d %H:%M:%S') def create_csv_export_response( data_iterator: Iterator[Dict[str, Any]], headers: List[str], filename: str, field_formatters: Optional[Dict[str, Callable]] = None, show_progress: bool = True ) -> FileResponse | StreamingHttpResponse: """ 创建 CSV 导出响应 根据 show_progress 参数选择响应类型: - True: 使用临时文件 + FileResponse,带 Content-Length(浏览器显示下载进度) - False: 使用 StreamingHttpResponse(内存更友好,但无下载进度) Args: data_iterator: 数据迭代器,每个元素是一个字典 headers: CSV 表头列表 filename: 下载文件名(如 "export_2024.csv") field_formatters: 字段格式化函数字典 show_progress: 是否显示下载进度(默认 True) Returns: FileResponse 或 StreamingHttpResponse Example: >>> data_iter = service.iter_data() >>> headers = ['url', 'host', 'created_at'] >>> formatters = {'created_at': format_datetime} >>> response = create_csv_export_response( ... data_iter, headers, 'websites.csv', formatters ... ) >>> return response """ if show_progress: return _create_file_response(data_iterator, headers, filename, field_formatters) else: return _create_streaming_response(data_iterator, headers, filename, field_formatters) def _create_file_response( data_iterator: Iterator[Dict[str, Any]], headers: List[str], filename: str, field_formatters: Optional[Dict[str, Callable]] = None ) -> FileResponse: """ 创建带 Content-Length 的文件响应(支持浏览器下载进度) 实现方式:先写入临时文件,再返回 FileResponse """ # 创建临时文件 temp_file = tempfile.NamedTemporaryFile( mode='w', suffix='.csv', delete=False, encoding='utf-8' ) temp_path = temp_file.name try: # 流式写入 CSV 数据到临时文件 for row in generate_csv_rows(data_iterator, headers, field_formatters): temp_file.write(row) temp_file.close() # 获取文件大小 file_size = os.path.getsize(temp_path) # 创建文件响应 response = FileResponse( open(temp_path, 'rb'), content_type='text/csv; charset=utf-8', as_attachment=True, filename=filename ) response['Content-Length'] = file_size # 设置清理回调:响应完成后删除临时文件 original_close = response.file_to_stream.close def close_and_cleanup(): original_close() try: os.unlink(temp_path) except OSError: pass response.file_to_stream.close = close_and_cleanup return response except Exception as e: # 清理临时文件 try: temp_file.close() except: pass try: os.unlink(temp_path) except OSError: pass logger.error(f"创建 CSV 导出响应失败: {e}") raise def _create_streaming_response( data_iterator: Iterator[Dict[str, Any]], headers: List[str], filename: str, field_formatters: Optional[Dict[str, Callable]] = None ) -> StreamingHttpResponse: """ 创建流式响应(无 Content-Length,内存更友好) """ response = StreamingHttpResponse( generate_csv_rows(data_iterator, headers, field_formatters), content_type='text/csv; charset=utf-8' ) response['Content-Disposition'] = f'attachment; filename="{filename}"' return response ================================================ FILE: backend/apps/common/utils/dedup.py ================================================ """ 批量数据去重工具 用于 bulk_create 前的批次内去重,避免 PostgreSQL ON CONFLICT 错误。 自动从 Django 模型读取唯一约束字段,无需手动指定。 """ import logging from typing import List, TypeVar, Tuple, Optional from django.db import models logger = logging.getLogger(__name__) T = TypeVar('T') def get_unique_fields(model: type[models.Model]) -> Optional[Tuple[str, ...]]: """ 从 Django 模型获取唯一约束字段 按优先级查找: 1. Meta.constraints 中的 UniqueConstraint 2. Meta.unique_together Args: model: Django 模型类 Returns: 唯一约束字段元组,如果没有则返回 None """ meta = model._meta # 1. 优先查找 UniqueConstraint for constraint in getattr(meta, 'constraints', []): if isinstance(constraint, models.UniqueConstraint): # 跳过条件约束(partial unique) if getattr(constraint, 'condition', None) is None: return tuple(constraint.fields) # 2. 回退到 unique_together unique_together = getattr(meta, 'unique_together', None) if unique_together: # unique_together 可能是 (('a', 'b'),) 或 ('a', 'b') if unique_together and isinstance(unique_together[0], (list, tuple)): return tuple(unique_together[0]) return tuple(unique_together) return None def deduplicate_for_bulk(items: List[T], model: type[models.Model]) -> List[T]: """ 根据模型唯一约束对数据去重 自动从模型读取唯一约束字段,生成去重 key。 保留最后一条记录(后面的数据通常是更新的)。 Args: items: 待去重的数据列表(DTO 或 Model 对象) model: Django 模型类(用于读取唯一约束) Returns: 去重后的数据列表 Example: # 自动从 Endpoint 模型读取唯一约束 (url, target) unique_items = deduplicate_for_bulk(items, Endpoint) """ if not items: return items unique_fields = get_unique_fields(model) if unique_fields is None: # 模型没有唯一约束,无需去重 logger.debug(f"{model.__name__} 没有唯一约束,跳过去重") return items # 处理外键字段名(target -> target_id) def make_key(item: T) -> tuple: key_parts = [] for field in unique_fields: # 尝试 field_id(外键)和 field 两种形式 value = getattr(item, f'{field}_id', None) if value is None: value = getattr(item, field, None) key_parts.append(value) return tuple(key_parts) # 使用字典去重,保留最后一条 seen = {} for item in items: key = make_key(item) seen[key] = item unique_items = list(seen.values()) if len(unique_items) < len(items): logger.debug(f"{model.__name__} 去重: {len(items)} -> {len(unique_items)} 条") return unique_items ================================================ FILE: backend/apps/common/utils/filter_utils.py ================================================ """智能过滤工具 - 通用查询语法解析和 Django ORM 查询构建 支持的语法: - field="value" 模糊匹配(包含) - field=="value" 精确匹配 - field!="value" 不等于 逻辑运算符: - AND: && 或 and 或 空格(默认) - OR: || 或 or 示例: type="xss" || type="sqli" # OR type="xss" or type="sqli" # OR(等价) severity="high" && source="nuclei" # AND severity="high" source="nuclei" # AND(空格默认为 AND) severity="high" and source="nuclei" # AND(等价) 使用示例: from apps.common.utils.filter_utils import apply_filters field_mapping = {'ip': 'ip', 'port': 'port', 'host': 'host'} queryset = apply_filters(queryset, 'ip="192" || port="80"', field_mapping) """ import re import logging from dataclasses import dataclass from typing import List, Dict, Optional, Union from enum import Enum from django.db.models import QuerySet, Q, F, Func, CharField from django.db.models.functions import Cast logger = logging.getLogger(__name__) class ArrayToString(Func): """PostgreSQL array_to_string 函数""" function = 'array_to_string' template = "%(function)s(%(expressions)s, ',')" output_field = CharField() class LogicalOp(Enum): """逻辑运算符""" AND = 'AND' OR = 'OR' @dataclass class ParsedFilter: """解析后的过滤条件""" field: str # 字段名 operator: str # 操作符: '=', '==', '!=' value: str # 原始值 @dataclass class FilterGroup: """过滤条件组(带逻辑运算符)""" filter: ParsedFilter logical_op: LogicalOp # 与前一个条件的逻辑关系 class QueryParser: """查询语法解析器 支持 ||/or (OR) 和 &&/and/空格 (AND) 逻辑运算符 """ # 正则匹配: field="value", field=="value", field!="value" FILTER_PATTERN = re.compile(r'(\w+)(==|!=|=)"([^"]*)"') # 逻辑运算符模式(带空格) OR_PATTERN = re.compile(r'\s*(\|\||(?<![a-zA-Z])or(?![a-zA-Z]))\s*', re.IGNORECASE) AND_PATTERN = re.compile(r'\s*(&&|(?<![a-zA-Z])and(?![a-zA-Z]))\s*', re.IGNORECASE) @classmethod def parse(cls, query_string: str) -> List[FilterGroup]: """解析查询语法字符串 Args: query_string: 查询语法字符串 Returns: 解析后的过滤条件组列表 Examples: >>> QueryParser.parse('type="xss" || type="sqli"') [FilterGroup(filter=..., logical_op=AND), # 第一个默认 AND FilterGroup(filter=..., logical_op=OR)] """ if not query_string or not query_string.strip(): return [] # 第一步:提取所有过滤条件并用占位符替换,保护引号内的空格 filters_found = [] placeholder_pattern = '__FILTER_{}__' def replace_filter(match): idx = len(filters_found) filters_found.append(match.group(0)) return placeholder_pattern.format(idx) # 先用正则提取所有 field="value" 形式的条件 protected = cls.FILTER_PATTERN.sub(replace_filter, query_string) # 标准化逻辑运算符 # 先处理 || 和 or -> __OR__ normalized = cls.OR_PATTERN.sub(' __OR__ ', protected) # 再处理 && 和 and -> __AND__ normalized = cls.AND_PATTERN.sub(' __AND__ ', normalized) # 分词:按空格分割,保留逻辑运算符标记 tokens = normalized.split() groups = [] pending_op = LogicalOp.AND # 默认 AND for token in tokens: if token == '__OR__': pending_op = LogicalOp.OR elif token == '__AND__': pending_op = LogicalOp.AND elif token.startswith('__FILTER_') and token.endswith('__'): # 还原占位符为原始过滤条件 try: idx = int(token[9:-2]) # 提取索引 original_filter = filters_found[idx] match = cls.FILTER_PATTERN.match(original_filter) if match: field, operator, value = match.groups() groups.append(FilterGroup( filter=ParsedFilter( field=field.lower(), operator=operator, value=value ), logical_op=pending_op if groups else LogicalOp.AND )) pending_op = LogicalOp.AND # 重置为默认 AND except (ValueError, IndexError): pass # 其他 token 忽略(无效输入) return groups class QueryBuilder: """Django ORM 查询构建器 将解析后的过滤条件转换为 Django ORM 查询,支持 AND/OR 逻辑 """ @classmethod def build_query( cls, queryset: QuerySet, filter_groups: List[FilterGroup], field_mapping: Dict[str, str], json_array_fields: List[str] = None ) -> QuerySet: """构建 Django ORM 查询 Args: queryset: Django QuerySet filter_groups: 解析后的过滤条件组列表 field_mapping: 字段映射 json_array_fields: JSON 数组字段列表(使用 __contains 查询) Returns: 过滤后的 QuerySet """ if not filter_groups: return queryset json_array_fields = json_array_fields or [] # 收集需要 annotate 的数组模糊搜索字段 array_fuzzy_fields = set() # 第一遍:检查是否有数组模糊匹配 for group in filter_groups: f = group.filter db_field = field_mapping.get(f.field) if db_field and db_field in json_array_fields and f.operator == '=': array_fuzzy_fields.add(db_field) # 对数组模糊搜索字段做 annotate for field in array_fuzzy_fields: annotate_name = f'{field}_text' queryset = queryset.annotate(**{annotate_name: ArrayToString(F(field))}) # 构建 Q 对象 combined_q = None for group in filter_groups: f = group.filter # 字段映射 db_field = field_mapping.get(f.field) if not db_field: logger.debug(f"忽略未知字段: {f.field}") continue # 判断是否为 JSON 数组字段 is_json_array = db_field in json_array_fields # 构建单个条件的 Q 对象 q = cls._build_single_q(db_field, f.operator, f.value, is_json_array) if q is None: continue # 组合 Q 对象 if combined_q is None: combined_q = q elif group.logical_op == LogicalOp.OR: combined_q = combined_q | q else: # AND combined_q = combined_q & q if combined_q is not None: return queryset.filter(combined_q) return queryset @classmethod def _build_single_q(cls, field: str, operator: str, value: str, is_json_array: bool = False) -> Optional[Q]: """构建单个条件的 Q 对象""" if is_json_array: if operator == '==': # 精确匹配:数组中包含完全等于 value 的元素 return Q(**{f'{field}__contains': [value]}) elif operator == '!=': # 不包含:数组中不包含完全等于 value 的元素 return ~Q(**{f'{field}__contains': [value]}) else: # '=' 模糊匹配 # 使用 annotate 后的字段进行模糊搜索 # 字段已在 build_query 中通过 ArrayToString 转换为文本 annotate_name = f'{field}_text' return Q(**{f'{annotate_name}__icontains': value}) if operator == '!=': return cls._build_not_equal_q(field, value) elif operator == '==': return cls._build_exact_q(field, value) else: # '=' return cls._build_fuzzy_q(field, value) @classmethod def _try_convert_to_int(cls, value: str) -> Optional[int]: """尝试将值转换为整数""" try: return int(value.strip()) except (ValueError, TypeError): return None @classmethod def _build_fuzzy_q(cls, field: str, value: str) -> Q: """模糊匹配: 包含""" return Q(**{f'{field}__icontains': value}) @classmethod def _build_exact_q(cls, field: str, value: str) -> Q: """精确匹配""" int_val = cls._try_convert_to_int(value) if int_val is not None: return Q(**{f'{field}__exact': int_val}) return Q(**{f'{field}__exact': value}) @classmethod def _build_not_equal_q(cls, field: str, value: str) -> Q: """不等于""" int_val = cls._try_convert_to_int(value) if int_val is not None: return ~Q(**{f'{field}__exact': int_val}) return ~Q(**{f'{field}__exact': value}) def apply_filters( queryset: QuerySet, query_string: str, field_mapping: Dict[str, str], json_array_fields: List[str] = None ) -> QuerySet: """应用过滤条件到 QuerySet Args: queryset: Django QuerySet query_string: 查询语法字符串 field_mapping: 字段映射 json_array_fields: JSON 数组字段列表(使用 __contains 查询) Returns: 过滤后的 QuerySet Examples: # OR 查询 apply_filters(qs, 'type="xss" || type="sqli"', mapping) apply_filters(qs, 'type="xss" or type="sqli"', mapping) # AND 查询 apply_filters(qs, 'severity="high" && source="nuclei"', mapping) apply_filters(qs, 'severity="high" source="nuclei"', mapping) # 混合查询 apply_filters(qs, 'type="xss" || type="sqli" && severity="high"', mapping) # JSON 数组字段查询 apply_filters(qs, 'implies="PHP"', mapping, json_array_fields=['implies']) """ if not query_string or not query_string.strip(): return queryset try: filter_groups = QueryParser.parse(query_string) if not filter_groups: logger.debug(f"未解析到有效过滤条件: {query_string}") return queryset logger.debug(f"解析过滤条件: {filter_groups}") return QueryBuilder.build_query( queryset, filter_groups, field_mapping, json_array_fields=json_array_fields ) except Exception as e: logger.warning(f"过滤解析错误: {e}, query: {query_string}") return queryset # 静默降级 ================================================ FILE: backend/apps/common/utils/hash.py ================================================ """通用文件 hash 计算与校验工具 提供 SHA-256 哈希计算和校验功能,用于: - 字典文件上传时计算 hash - Worker 侧本地缓存校验 """ import hashlib import logging from typing import Optional, BinaryIO logger = logging.getLogger(__name__) # 默认分块大小:64KB(兼顾内存和性能) DEFAULT_CHUNK_SIZE = 65536 def calc_file_sha256(file_path: str, chunk_size: int = DEFAULT_CHUNK_SIZE) -> str: """计算文件的 SHA-256 哈希值 Args: file_path: 文件绝对路径 chunk_size: 分块读取大小(字节),默认 64KB Returns: str: SHA-256 十六进制字符串(64 字符) Raises: FileNotFoundError: 文件不存在 OSError: 文件读取失败 """ hasher = hashlib.sha256() with open(file_path, "rb") as f: for chunk in iter(lambda: f.read(chunk_size), b""): hasher.update(chunk) return hasher.hexdigest() def calc_stream_sha256(stream: BinaryIO, chunk_size: int = DEFAULT_CHUNK_SIZE) -> str: """从二进制流计算 SHA-256(用于边写边算) Args: stream: 可读取的二进制流(如 UploadedFile.chunks()) chunk_size: 分块大小 Returns: str: SHA-256 十六进制字符串 """ hasher = hashlib.sha256() for chunk in iter(lambda: stream.read(chunk_size), b""): hasher.update(chunk) return hasher.hexdigest() def safe_calc_file_sha256(file_path: str) -> Optional[str]: """安全计算文件 SHA-256(异常时返回 None) Args: file_path: 文件绝对路径 Returns: str | None: SHA-256 十六进制字符串,或 None(文件不存在/读取失败) """ try: return calc_file_sha256(file_path) except FileNotFoundError: logger.warning("计算 hash 失败:文件不存在 - %s", file_path) return None except OSError as exc: logger.warning("计算 hash 失败:读取错误 - %s: %s", file_path, exc) return None def is_file_hash_match(file_path: str, expected_hash: str) -> bool: """校验文件 hash 是否与期望值匹配 Args: file_path: 文件绝对路径 expected_hash: 期望的 SHA-256 十六进制字符串 Returns: bool: True 表示匹配,False 表示不匹配或计算失败 """ if not expected_hash: # 期望值为空,视为"无法校验",返回 False 让调用方决定是否重新下载 return False actual_hash = safe_calc_file_sha256(file_path) if actual_hash is None: return False return actual_hash.lower() == expected_hash.lower() ================================================ FILE: backend/apps/common/validators.py ================================================ """域名、IP、端口、URL 和目标验证工具函数""" import ipaddress import logging from urllib.parse import urlparse import validators logger = logging.getLogger(__name__) def validate_domain(domain: str) -> None: """ 验证域名格式(使用 validators 库) Args: domain: 域名字符串(应该已经规范化) Raises: ValueError: 域名格式无效 """ if not domain: raise ValueError("域名不能为空") # 使用 validators 库验证域名格式 # 支持国际化域名(IDN)和各种边界情况 if not validators.domain(domain): raise ValueError(f"域名格式无效: {domain}") def is_valid_domain(domain: str) -> bool: """ 判断是否为有效域名(不抛异常) Args: domain: 域名字符串 Returns: bool: 是否为有效域名 """ if not domain or len(domain) > 253: return False return bool(validators.domain(domain)) def validate_ip(ip: str) -> None: """ 验证 IP 地址格式(支持 IPv4 和 IPv6) Args: ip: IP 地址字符串(应该已经规范化) Raises: ValueError: IP 地址格式无效 """ if not ip: raise ValueError("IP 地址不能为空") try: ipaddress.ip_address(ip) except ValueError: raise ValueError(f"IP 地址格式无效: {ip}") def is_valid_ip(ip: str) -> bool: """ 判断是否为有效 IP 地址(不抛异常) Args: ip: IP 地址字符串 Returns: bool: 是否为有效 IP 地址 """ if not ip: return False try: ipaddress.ip_address(ip) return True except ValueError: return False def validate_cidr(cidr: str) -> None: """ 验证 CIDR 格式(支持 IPv4 和 IPv6) Args: cidr: CIDR 字符串(应该已经规范化) Raises: ValueError: CIDR 格式无效 """ if not cidr: raise ValueError("CIDR 不能为空") try: ipaddress.ip_network(cidr, strict=False) except ValueError: raise ValueError(f"CIDR 格式无效: {cidr}") def detect_target_type(name: str) -> str: """ 检测目标类型(不做规范化,只验证) Args: name: 目标名称(应该已经规范化) Returns: str: 目标类型 ('domain', 'ip', 'cidr') - 使用 Target.TargetType 枚举值 Raises: ValueError: 如果无法识别目标类型 """ # 在函数内部导入模型,避免 AppRegistryNotReady 错误 from apps.targets.models import Target if not name: raise ValueError("目标名称不能为空") # 检查是否是 CIDR 格式(包含 /) if '/' in name: validate_cidr(name) return Target.TargetType.CIDR # 检查是否是 IP 地址 try: validate_ip(name) return Target.TargetType.IP except ValueError: pass # 检查是否是合法域名 try: validate_domain(name) return Target.TargetType.DOMAIN except ValueError: pass # 无法识别的格式 raise ValueError(f"无法识别的目标格式: {name},必须是域名、IP地址或CIDR范围") def validate_port(port: any) -> tuple[bool, int | None]: """ 验证并转换端口号 Args: port: 待验证的端口号(可能是字符串、整数或其他类型) Returns: tuple: (is_valid, port_number) - is_valid: 端口是否有效 - port_number: 有效时为整数端口号,无效时为 None 验证规则: 1. 必须能转换为整数 2. 必须在 1-65535 范围内 示例: >>> is_valid, port_num = validate_port(8080) >>> is_valid, port_num (True, 8080) >>> is_valid, port_num = validate_port("invalid") >>> is_valid, port_num (False, None) """ try: port_num = int(port) if 1 <= port_num <= 65535: return True, port_num else: logger.warning("端口号超出有效范围 (1-65535): %d", port_num) return False, None except (ValueError, TypeError): logger.warning("端口号格式错误,无法转换为整数: %s", port) return False, None # ==================== URL 验证函数 ==================== def validate_url(url: str) -> None: """ 验证 URL 格式,必须包含 scheme(http:// 或 https://) Args: url: URL 字符串 Raises: ValueError: URL 格式无效或缺少 scheme """ if not url: raise ValueError("URL 不能为空") # 检查是否包含 scheme if not url.startswith('http://') and not url.startswith('https://'): raise ValueError("URL 必须包含协议(http:// 或 https://)") try: parsed = urlparse(url) if not parsed.hostname: raise ValueError("URL 必须包含主机名") except Exception: raise ValueError(f"URL 格式无效: {url}") def is_valid_url(url: str, max_length: int = 2000) -> bool: """ 判断是否为有效 URL(不抛异常) Args: url: URL 字符串 max_length: URL 最大长度,默认 2000 Returns: bool: 是否为有效 URL """ if not url or len(url) > max_length: return False try: validate_url(url) return True except ValueError: return False def is_url_match_target(url: str, target_name: str, target_type: str) -> bool: """ 判断 URL 是否匹配目标 Args: url: URL 字符串 target_name: 目标名称(域名、IP 或 CIDR) target_type: 目标类型 ('domain', 'ip', 'cidr') Returns: bool: 是否匹配 """ try: parsed = urlparse(url) hostname = parsed.hostname if not hostname: return False hostname = hostname.lower() target_name = target_name.lower() if target_type == 'domain': # 域名类型:hostname 等于 target_name 或以 .target_name 结尾 return hostname == target_name or hostname.endswith('.' + target_name) elif target_type == 'ip': # IP 类型:hostname 必须完全等于 target_name return hostname == target_name elif target_type == 'cidr': # CIDR 类型:hostname 必须是 IP 且在 CIDR 范围内 try: ip = ipaddress.ip_address(hostname) network = ipaddress.ip_network(target_name, strict=False) return ip in network except ValueError: # hostname 不是有效 IP return False return False except Exception: return False def detect_input_type(input_str: str) -> str: """ 检测输入类型(用于快速扫描输入解析) Args: input_str: 输入字符串(应该已经 strip) Returns: str: 输入类型 ('url', 'domain', 'ip', 'cidr') """ if not input_str: raise ValueError("输入不能为空") # 1. 包含 :// 一定是 URL if '://' in input_str: return 'url' # 2. 包含 / 需要判断是 CIDR 还是 URL(缺少 scheme) if '/' in input_str: # CIDR 格式: IP/prefix,如 10.0.0.0/8 parts = input_str.split('/') if len(parts) == 2: ip_part, prefix_part = parts # 如果斜杠后是纯数字且在 0-32 范围内,检查是否是 CIDR if prefix_part.isdigit() and 0 <= int(prefix_part) <= 32: ip_parts = ip_part.split('.') if len(ip_parts) == 4 and all(p.isdigit() for p in ip_parts): return 'cidr' # 不是 CIDR,视为 URL(缺少 scheme,后续验证会报错) return 'url' # 3. 检查是否是 IP 地址 try: ipaddress.ip_address(input_str) return 'ip' except ValueError: pass # 4. 默认为域名 return 'domain' ================================================ FILE: backend/apps/common/views/__init__.py ================================================ """ 通用模块视图导出 包含: - 健康检查视图:Docker 健康检查 - 认证相关视图:登录、登出、用户信息、修改密码 - 系统日志视图:实时日志查看 - 黑名单视图:全局黑名单规则管理 - 版本视图:系统版本和更新检查 """ from .health_views import HealthCheckView from .auth_views import LoginView, LogoutView, MeView, ChangePasswordView from .system_log_views import SystemLogsView, SystemLogFilesView from .blacklist_views import GlobalBlacklistView from .version_views import VersionView, CheckUpdateView __all__ = [ 'HealthCheckView', 'LoginView', 'LogoutView', 'MeView', 'ChangePasswordView', 'SystemLogsView', 'SystemLogFilesView', 'GlobalBlacklistView', 'VersionView', 'CheckUpdateView', ] ================================================ FILE: backend/apps/common/views/auth_views.py ================================================ """ 认证相关视图 使用 Django 内置认证系统,支持 Session 认证 """ import logging from django.contrib.auth import authenticate, login, logout, update_session_auth_hash from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from rest_framework import status from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import AllowAny from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes logger = logging.getLogger(__name__) @method_decorator(csrf_exempt, name='dispatch') class LoginView(APIView): """ 用户登录 POST /api/auth/login/ """ authentication_classes = [] # 禁用认证(绕过 CSRF) permission_classes = [AllowAny] def post(self, request): username = request.data.get('username') password = request.data.get('password') if not username or not password: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Username and password are required', status_code=status.HTTP_400_BAD_REQUEST ) user = authenticate(request, username=username, password=password) if user is not None: login(request, user) logger.info(f"用户 {username} 登录成功") return success_response( data={ 'user': { 'id': user.id, 'username': user.username, 'isStaff': user.is_staff, 'isSuperuser': user.is_superuser, } } ) else: logger.warning(f"用户 {username} 登录失败:用户名或密码错误") return error_response( code=ErrorCodes.UNAUTHORIZED, message='Invalid username or password', status_code=status.HTTP_401_UNAUTHORIZED ) @method_decorator(csrf_exempt, name='dispatch') class LogoutView(APIView): """ 用户登出 POST /api/auth/logout/ """ authentication_classes = [] # 禁用认证(绕过 CSRF) permission_classes = [AllowAny] def post(self, request): # 从 session 获取用户名用于日志 user_id = request.session.get('_auth_user_id') if user_id: from django.contrib.auth import get_user_model User = get_user_model() try: user = User.objects.get(pk=user_id) username = user.username logout(request) logger.info(f"用户 {username} 已登出") except User.DoesNotExist: logout(request) else: logout(request) return success_response() @method_decorator(csrf_exempt, name='dispatch') class MeView(APIView): """ 获取当前用户信息 GET /api/auth/me/ """ authentication_classes = [] # 禁用认证(绕过 CSRF) permission_classes = [AllowAny] def get(self, request): # 从 session 获取用户 from django.contrib.auth import get_user_model User = get_user_model() user_id = request.session.get('_auth_user_id') if user_id: try: user = User.objects.get(pk=user_id) return success_response( data={ 'authenticated': True, 'user': { 'id': user.id, 'username': user.username, 'isStaff': user.is_staff, 'isSuperuser': user.is_superuser, } } ) except User.DoesNotExist: pass return success_response( data={ 'authenticated': False, 'user': None } ) @method_decorator(csrf_exempt, name='dispatch') class ChangePasswordView(APIView): """ 修改密码 POST /api/auth/change-password/ """ def post(self, request): # 使用全局权限类验证,request.user 已经是认证用户 user = request.user # CamelCaseParser 将 oldPassword -> old_password old_password = request.data.get('old_password') new_password = request.data.get('new_password') if not old_password or not new_password: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Old password and new password are required', status_code=status.HTTP_400_BAD_REQUEST ) if not user.check_password(old_password): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Old password is incorrect', status_code=status.HTTP_400_BAD_REQUEST ) user.set_password(new_password) user.save() # 更新 session,避免用户被登出 update_session_auth_hash(request, user) logger.info(f"用户 {user.username} 已修改密码") return success_response() ================================================ FILE: backend/apps/common/views/blacklist_views.py ================================================ """全局黑名单 API 视图""" import logging from rest_framework import status from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from apps.common.response_helpers import success_response, error_response from apps.common.services import BlacklistService logger = logging.getLogger(__name__) class GlobalBlacklistView(APIView): """ 全局黑名单规则 API Endpoints: - GET /api/blacklist/rules/ - 获取全局黑名单列表 - PUT /api/blacklist/rules/ - 全量替换规则(文本框保存场景) 设计说明: - 使用 PUT 全量替换模式,适合"文本框每行一个规则"的前端场景 - 用户编辑文本框 -> 点击保存 -> 后端全量替换 架构:MVS 模式 - View: 参数验证、响应格式化 - Service: 业务逻辑(BlacklistService) - Model: 数据持久化(BlacklistRule) """ permission_classes = [IsAuthenticated] def __init__(self, **kwargs): super().__init__(**kwargs) self.blacklist_service = BlacklistService() def get(self, request): """ 获取全局黑名单规则列表 返回格式: { "patterns": ["*.gov", "*.edu", "10.0.0.0/8"] } """ rules = self.blacklist_service.get_global_rules() patterns = list(rules.values_list('pattern', flat=True)) return success_response(data={'patterns': patterns}) def put(self, request): """ 全量替换全局黑名单规则 请求格式: { "patterns": ["*.gov", "*.edu", "10.0.0.0/8"] } 或者空数组清空所有规则: { "patterns": [] } """ patterns = request.data.get('patterns', []) # 兼容字符串输入(换行分隔) if isinstance(patterns, str): patterns = [p for p in patterns.split('\n') if p.strip()] if not isinstance(patterns, list): return error_response( code='VALIDATION_ERROR', message='patterns 必须是数组' ) # 调用 Service 层全量替换 result = self.blacklist_service.replace_global_rules(patterns) return success_response(data=result) ================================================ FILE: backend/apps/common/views/health_views.py ================================================ """ 健康检查视图 提供 Docker 健康检查端点,无需认证。 """ from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import AllowAny class HealthCheckView(APIView): """ 健康检查端点 GET /api/health/ 返回服务状态,用于 Docker 健康检查。 此端点无需认证。 """ permission_classes = [AllowAny] def get(self, request): return Response({'status': 'ok'}) ================================================ FILE: backend/apps/common/views/system_log_views.py ================================================ """ 系统日志视图模块 提供系统日志的 REST API 接口,供前端实时查看系统运行日志。 """ import logging from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.common.services.system_log_service import SystemLogService logger = logging.getLogger(__name__) @method_decorator(csrf_exempt, name="dispatch") class SystemLogFilesView(APIView): """ 日志文件列表 API 视图 GET /api/system/logs/files/ 获取所有可用的日志文件列表 Response: { "files": [ { "filename": "xingrin.log", "category": "system", "size": 1048576, "modifiedAt": "2025-01-15T10:30:00+00:00" }, ... ] } """ def __init__(self, **kwargs): super().__init__(**kwargs) self.service = SystemLogService() def get(self, request): """获取日志文件列表""" try: files = self.service.get_log_files() return success_response(data={"files": files}) except Exception: logger.exception("获取日志文件列表失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get log files', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @method_decorator(csrf_exempt, name="dispatch") class SystemLogsView(APIView): """ 系统日志 API 视图 GET /api/system/logs/ 获取系统日志内容 Query Parameters: file (str, optional): 日志文件名,默认 xingrin.log lines (int, optional): 返回的日志行数,默认 200,最大 10000 Response: { "content": "日志内容字符串..." } """ def __init__(self, **kwargs): super().__init__(**kwargs) self.service = SystemLogService() def get(self, request): """ 获取系统日志 支持通过 file 和 lines 参数控制返回内容。 """ try: # 解析参数 filename = request.query_params.get("file") lines_raw = request.query_params.get("lines") lines = int(lines_raw) if lines_raw is not None else None # 调用服务获取日志内容 content = self.service.get_logs_content(filename=filename, lines=lines) return success_response(data={"content": content}) except ValueError as e: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(e) if 'file' in str(e).lower() else 'lines must be an integer', status_code=status.HTTP_400_BAD_REQUEST ) except FileNotFoundError as e: return error_response( code=ErrorCodes.NOT_FOUND, message=str(e), status_code=status.HTTP_404_NOT_FOUND ) except Exception: logger.exception("获取系统日志失败") return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get system logs', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) ================================================ FILE: backend/apps/common/views/version_views.py ================================================ """ 系统版本相关视图 """ import logging from pathlib import Path import requests from rest_framework.request import Request from rest_framework.response import Response from rest_framework.views import APIView from apps.common.error_codes import ErrorCodes from apps.common.response_helpers import error_response, success_response logger = logging.getLogger(__name__) # GitHub 仓库信息 GITHUB_REPO = "yyhuni/xingrin" GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_REPO}/releases/latest" GITHUB_RELEASES_URL = f"https://github.com/{GITHUB_REPO}/releases" def get_current_version() -> str: """读取当前版本号""" import os # 方式1:从环境变量读取(Docker 容器中推荐) version = os.environ.get('IMAGE_TAG', '') if version: return version # 方式2:从文件读取(开发环境) possible_paths = [ Path('/app/VERSION'), Path(__file__).parent.parent.parent.parent.parent / 'VERSION', ] for path in possible_paths: try: return path.read_text(encoding='utf-8').strip() except (FileNotFoundError, OSError): continue return "unknown" def compare_versions(current: str, latest: str) -> bool: """ 比较版本号,判断是否有更新 Returns: True 表示有更新可用 """ def parse_version(v: str) -> tuple: v = v.lstrip('v') parts = v.split('.') result = [] for part in parts: if '-' in part: num, _ = part.split('-', 1) result.append(int(num)) else: result.append(int(part)) return tuple(result) try: return parse_version(latest) > parse_version(current) except (ValueError, AttributeError): return False class VersionView(APIView): """获取当前系统版本""" def get(self, _request: Request) -> Response: """获取当前版本信息""" return success_response(data={ 'version': get_current_version(), 'github_repo': GITHUB_REPO, }) class CheckUpdateView(APIView): """检查系统更新""" def get(self, _request: Request) -> Response: """ 检查是否有新版本 Returns: - current_version: 当前版本 - latest_version: 最新版本 - has_update: 是否有更新 - release_url: 发布页面 URL - release_notes: 更新说明(如果有) """ current_version = get_current_version() try: response = requests.get( GITHUB_API_URL, headers={'Accept': 'application/vnd.github.v3+json'}, timeout=10 ) if response.status_code == 404: return success_response(data={ 'current_version': current_version, 'latest_version': current_version, 'has_update': False, 'release_url': GITHUB_RELEASES_URL, 'release_notes': None, }) response.raise_for_status() release_data = response.json() latest_version = release_data.get('tag_name', current_version) has_update = compare_versions(current_version, latest_version) return success_response(data={ 'current_version': current_version, 'latest_version': latest_version, 'has_update': has_update, 'release_url': release_data.get('html_url', GITHUB_RELEASES_URL), 'release_notes': release_data.get('body'), 'published_at': release_data.get('published_at'), }) except requests.RequestException as e: logger.warning("检查更新失败: %s", e) return error_response( code=ErrorCodes.SERVER_ERROR, message="无法连接到 GitHub,请稍后重试", ) ================================================ FILE: backend/apps/common/websocket_auth.py ================================================ """ WebSocket 认证基类 提供需要认证的 WebSocket Consumer 基类 """ import logging from channels.generic.websocket import AsyncWebsocketConsumer logger = logging.getLogger(__name__) class AuthenticatedWebsocketConsumer(AsyncWebsocketConsumer): """ 需要认证的 WebSocket Consumer 基类 子类应该重写 on_connect() 方法实现具体的连接逻辑 """ async def connect(self): """ 连接时验证用户认证状态 未认证时使用 close(code=4001) 拒绝连接 """ user = self.scope.get('user') if not user or not user.is_authenticated: logger.warning( f"WebSocket 连接被拒绝:用户未认证 - Path: {self.scope.get('path')}" ) await self.close(code=4001) return # 调用子类的连接逻辑 await self.on_connect() async def on_connect(self): """ 子类实现具体的连接逻辑 默认实现:接受连接 """ await self.accept() ================================================ FILE: backend/apps/engine/__init__.py ================================================ ================================================ FILE: backend/apps/engine/apps.py ================================================ import os from django.apps import AppConfig class EngineConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.engine' verbose_name = '扫描引擎' def ready(self): """应用就绪时启动定时调度器""" # 只在主进程中启动调度器(避免 autoreload 重复启动) # 检查是否在 runserver 的 autoreload 子进程中 if os.environ.get('RUN_MAIN') == 'true' or not self._is_runserver(): # 只在 Server 容器中启动调度器(Worker 容器不需要) if not os.environ.get('SERVER_URL'): # Worker 容器有 SERVER_URL self._start_scheduler() def _is_runserver(self): """检查是否通过 runserver 启动""" import sys return 'runserver' in sys.argv def _start_scheduler(self): """启动调度器""" try: from apps.engine.scheduler import start_scheduler start_scheduler() except Exception as e: import logging logger = logging.getLogger(__name__) logger.warning(f"调度器启动失败: {e}") ================================================ FILE: backend/apps/engine/consumers/__init__.py ================================================ """ Engine WebSocket Consumers """ from .worker_deploy_consumer import WorkerDeployConsumer __all__ = ['WorkerDeployConsumer'] ================================================ FILE: backend/apps/engine/consumers/worker_deploy_consumer.py ================================================ """ WebSocket Consumer - Worker 交互式终端 (使用 PTY) """ import json import logging import asyncio import os from asgiref.sync import sync_to_async from django.conf import settings from apps.common.websocket_auth import AuthenticatedWebsocketConsumer from apps.engine.services import WorkerService logger = logging.getLogger(__name__) class WorkerDeployConsumer(AuthenticatedWebsocketConsumer): """ Worker 交互式终端 WebSocket Consumer 使用 paramiko invoke_shell 实现真正的交互式终端 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.ssh_client = None self.shell = None self.worker = None self.read_task = None self.worker_service = WorkerService() async def on_connect(self): """连接时加入对应 Worker 的组并自动建立 SSH 连接(已通过认证)""" self.worker_id = self.scope['url_route']['kwargs']['worker_id'] self.group_name = f'worker_deploy_{self.worker_id}' await self.channel_layer.group_add(self.group_name, self.channel_name) await self.accept() logger.info(f"终端已连接 - Worker: {self.worker_id}") # 自动建立 SSH 连接 await self._auto_ssh_connect() async def disconnect(self, close_code): """断开时清理资源""" if self.read_task: self.read_task.cancel() if self.shell: try: self.shell.close() except Exception: pass if self.ssh_client: try: self.ssh_client.close() except Exception: pass await self.channel_layer.group_discard(self.group_name, self.channel_name) logger.info(f"终端已断开 - Worker: {self.worker_id}") async def receive(self, text_data=None, bytes_data=None): """接收客户端消息""" if bytes_data: # 二进制数据直接发送到 shell if self.shell: await asyncio.to_thread(self.shell.send, bytes_data) return if not text_data: return try: data = json.loads(text_data) msg_type = data.get('type') if msg_type == 'resize': cols = data.get('cols', 80) rows = data.get('rows', 24) if self.shell: await asyncio.to_thread(self.shell.resize_pty, cols, rows) elif msg_type == 'input': # 终端输入 if self.shell: text = data.get('data', '') await asyncio.to_thread(self.shell.send, text) elif msg_type == 'deploy': # 执行部署脚本(后台运行) await self._run_deploy_script() elif msg_type == 'attach': # 查看部署进度(attach 到 tmux 会话) await self._attach_deploy_session() elif msg_type == 'uninstall': # 执行卸载脚本(后台运行) await self._run_uninstall_script() except json.JSONDecodeError: # 可能是普通文本输入 if self.shell and text_data: await asyncio.to_thread(self.shell.send, text_data) except Exception as e: logger.error(f"处理消息错误: {e}") async def _auto_ssh_connect(self): """自动从数据库读取密码并连接""" logger.info(f"[SSH] 开始自动连接 - Worker ID: {self.worker_id}") # 通过服务层获取 Worker 节点 # thread_sensitive=False 确保在新线程中运行,避免数据库连接问题 self.worker = await sync_to_async(self.worker_service.get_worker, thread_sensitive=False)(self.worker_id) logger.info(f"[SSH] Worker 查询结果: {self.worker}") if not self.worker: await self.send(text_data=json.dumps({ 'type': 'error', 'message': 'Worker 不存在' })) return if not self.worker.password: await self.send(text_data=json.dumps({ 'type': 'error', 'message': '未配置 SSH 密码,请先编辑节点信息' })) return # 使用默认终端大小 await self._ssh_connect(self.worker.password, 80, 24) async def _ssh_connect(self, password: str, cols: int = 80, rows: int = 24): """建立 SSH 连接并启动交互式 shell (使用 tmux 持久化会话)""" try: import paramiko except ImportError: await self.send(text_data=json.dumps({ 'type': 'error', 'message': '服务器缺少 paramiko 库' })) return # self.worker 已在 _auto_ssh_connect 中查询 try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) await asyncio.to_thread( ssh.connect, self.worker.ip_address, port=self.worker.ssh_port, username=self.worker.username, password=password, timeout=30 ) self.ssh_client = ssh # 启动交互式 shell(连接时不做 tmux 安装,仅提供普通 shell) self.shell = await asyncio.to_thread( ssh.invoke_shell, term='xterm-256color', width=cols, height=rows ) # 发送连接成功消息 logger.info(f"[SSH] 准备发送 connected 消息 - Worker: {self.worker_id}") await self.send(text_data=json.dumps({ 'type': 'connected' })) logger.info(f"[SSH] connected 消息已发送 - Worker: {self.worker_id}") # 启动读取任务 self.read_task = asyncio.create_task(self._read_shell_output()) logger.info(f"[SSH] Shell 已连接,读取任务已启动 - Worker: {self.worker_id}") except paramiko.AuthenticationException: logger.error(f"[SSH] 认证失败 - Worker: {self.worker_id}") await self.send(text_data=json.dumps({ 'type': 'error', 'message': '认证失败,密码错误' })) except Exception as e: logger.error(f"[SSH] 连接失败 - Worker: {self.worker_id}, Error: {e}") await self.send(text_data=json.dumps({ 'type': 'error', 'message': f'连接失败: {str(e)}' })) async def _read_shell_output(self): """持续读取 shell 输出并发送到客户端""" try: while self.shell and not self.shell.closed: if self.shell.recv_ready(): data = await asyncio.to_thread(self.shell.recv, 4096) if data: await self.send(bytes_data=data) else: await asyncio.sleep(0.01) except asyncio.CancelledError: pass except Exception as e: logger.error(f"读取 shell 输出错误: {e}") async def _run_deploy_script(self): """运行部署脚本(在 tmux 会话中执行,支持断线续连) 流程: 1. 通过 SFTP 上传脚本到远程服务器 2. 使用 exec_command 静默执行(不在交互式终端回显) 3. 通过 WebSocket 发送结果到前端显示 """ if not self.ssh_client: return from apps.engine.services.deploy_service import ( get_bootstrap_script, get_deploy_script, get_start_agent_script ) # 优先使用 settings 中配置的对外访问主机(PUBLIC_HOST)拼接 Django URL public_host = getattr(settings, 'PUBLIC_HOST', '').strip() server_port = getattr(settings, 'SERVER_PORT', '8888') if not public_host: error_msg = ( "未配置 PUBLIC_HOST,请在 docker/.env 中设置对外访问 IP/域名 " "(PUBLIC_HOST) 并重启服务后再执行远程部署" ) logger.error(error_msg) await self.send(text_data=json.dumps({ 'type': 'error', 'message': error_msg, })) return # 远程 Worker 通过 nginx HTTPS 访问(nginx 反代到后端 8888) # 使用 https://{PUBLIC_HOST}:{PUBLIC_PORT} 而不是直连 8888 端口 public_port = getattr(settings, 'PUBLIC_PORT', '8083') heartbeat_api_url = f"https://{public_host}:{public_port}" session_name = f'xingrin_deploy_{self.worker_id}' remote_script_path = '/tmp/xingrin_deploy.sh' # 获取外置脚本内容 bootstrap_script = get_bootstrap_script() deploy_script = get_deploy_script() start_script = get_start_agent_script( heartbeat_api_url=heartbeat_api_url, worker_id=self.worker_id ) # 合并脚本 combined_script = f"""#!/bin/bash set -e # ==================== 阶段 1: 环境初始化 ==================== {bootstrap_script} # ==================== 阶段 2: 安装 Docker ==================== {deploy_script} # ==================== 阶段 3: 启动 Agent ==================== {start_script} echo "SUCCESS" """ # 更新状态为 deploying await sync_to_async(self.worker_service.update_status)(self.worker_id, 'deploying') # 发送开始提示 start_msg = "\r\n\033[36m[XingRin] 正在准备部署...\033[0m\r\n" await self.send(bytes_data=start_msg.encode()) try: # 1. 上传脚本 sftp = await asyncio.to_thread(self.ssh_client.open_sftp) with sftp.file(remote_script_path, 'w') as f: f.write(combined_script) sftp.chmod(remote_script_path, 0o755) await asyncio.to_thread(sftp.close) # 2. 静默执行部署命令(使用 exec_command,不会回显到终端) deploy_cmd = f""" # 确保 tmux 安装 if ! command -v tmux >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then sudo apt-get update -qq && sudo apt-get install -y -qq tmux >/dev/null 2>&1 fi fi # 检查脚本是否存在 if [ ! -f "{remote_script_path}" ]; then echo "SCRIPT_NOT_FOUND" exit 1 fi # 启动 tmux 会话 if command -v tmux >/dev/null 2>&1; then tmux kill-session -t {session_name} 2>/dev/null || true # 使用 bash 执行脚本,确保环境正确 tmux new-session -d -s {session_name} "bash {remote_script_path}; echo '部署完成,按回车退出'; read" # 验证会话是否创建成功 sleep 0.5 if tmux has-session -t {session_name} 2>/dev/null; then echo "SUCCESS" else echo "SESSION_CREATE_FAILED" fi else echo "TMUX_NOT_FOUND" fi """ stdin, stdout, stderr = await asyncio.to_thread( self.ssh_client.exec_command, deploy_cmd ) result = await asyncio.to_thread(stdout.read) result = result.decode().strip() # 3. 发送结果到前端终端显示 if "SUCCESS" in result: # 部署任务已在后台启动,保持 deploying 状态 # 只有当心跳上报成功后才会变成 deployed(通过 heartbeat API 自动更新) success_msg = ( "\r\n\033[32m✓ 部署任务已在后台启动\033[0m\r\n" f"\033[90m 会话: {session_name}\033[0m\r\n" "\r\n" "\033[36m点击 [查看进度] 按钮查看部署输出\033[0m\r\n" f"\033[90m或手动执行: tmux attach -t {session_name}\033[0m\r\n" "\r\n" ) else: # 获取更多错误信息 err = await asyncio.to_thread(stderr.read) err_msg = err.decode().strip() if err else "" success_msg = f"\r\n\033[31m✗ 部署启动失败\033[0m\r\n\033[90m结果: {result}\r\n错误: {err_msg}\033[0m\r\n" await self.send(bytes_data=success_msg.encode()) except Exception as e: error_msg = f"\033[31m✗ 部署失败: {str(e)}\033[0m\r\n" await self.send(bytes_data=error_msg.encode()) logger.error(f"部署脚本执行失败: {e}") async def _run_uninstall_script(self): """在远程主机上执行 Worker 卸载脚本 逻辑: 1. 通过服务层读取本地 worker-uninstall.sh 内容 2. 上传到远程 /tmp/xingrin_uninstall.sh 并赋予执行权限 3. 使用 exec_command 以 bash 执行脚本 4. 将执行结果摘要写回前端终端 """ if not self.ssh_client: return from apps.engine.services.deploy_service import get_uninstall_script uninstall_script = get_uninstall_script() remote_script_path = '/tmp/xingrin_uninstall.sh' start_msg = "\r\n\033[36m[XingRin] 正在执行 Worker 卸载...\033[0m\r\n" await self.send(bytes_data=start_msg.encode()) try: # 上传卸载脚本 sftp = await asyncio.to_thread(self.ssh_client.open_sftp) with sftp.file(remote_script_path, 'w') as f: f.write(uninstall_script) sftp.chmod(remote_script_path, 0o755) await asyncio.to_thread(sftp.close) # 执行卸载脚本 cmd = f"bash {remote_script_path}" stdin, stdout, stderr = await asyncio.to_thread( self.ssh_client.exec_command, cmd ) out = await asyncio.to_thread(stdout.read) err = await asyncio.to_thread(stderr.read) # 转换换行符为终端格式 (\n -> \r\n) output_text = out.decode().strip().replace('\n', '\r\n') if out else "" error_text = err.decode().strip().replace('\n', '\r\n') if err else "" # 简单判断是否成功(退出码 + 关键字) exit_status = stdout.channel.recv_exit_status() if exit_status == 0: # 卸载成功,重置状态为 pending await sync_to_async(self.worker_service.update_status)(self.worker_id, 'pending') # 删除 Redis 中的心跳数据 from apps.engine.services.worker_load_service import worker_load_service worker_load_service.delete_load(self.worker_id) # 发送状态更新到前端 await self.send(text_data=json.dumps({ 'type': 'status', 'status': 'pending' # 卸载后变为待部署状态 })) msg = "\r\n\033[32m✓ 节点卸载完成\033[0m\r\n" if output_text: msg += f"\033[90m{output_text}\033[0m\r\n" else: msg = "\r\n\033[31m✗ Worker 卸载失败\033[0m\r\n" if output_text: msg += f"\033[90m输出: {output_text}\033[0m\r\n" if error_text: msg += f"\033[90m错误: {error_text}\033[0m\r\n" await self.send(bytes_data=msg.encode()) except Exception as e: error_msg = f"\033[31m✗ 卸载执行异常: {str(e)}\033[0m\r\n" await self.send(bytes_data=error_msg.encode()) logger.error(f"卸载脚本执行失败: {e}") async def _attach_deploy_session(self): """Attach 到部署会话查看进度""" if not self.shell or not self.ssh_client: return session_name = f'xingrin_deploy_{self.worker_id}' # 先静默检查会话是否存在 check_cmd = f"tmux has-session -t {session_name} 2>/dev/null && echo EXISTS || echo NOT_EXISTS" stdin, stdout, stderr = await asyncio.to_thread( self.ssh_client.exec_command, check_cmd ) result = await asyncio.to_thread(stdout.read) result = result.decode().strip() if "EXISTS" in result: # 会话存在,直接 attach await asyncio.to_thread(self.shell.send, f"tmux attach -t {session_name}\n") else: # 会话不存在,发送提示 msg = "\r\n\033[33m没有正在运行的部署任务\033[0m\r\n\033[90m请先点击 [执行部署] 按钮启动部署\033[0m\r\n\r\n" await self.send(bytes_data=msg.encode()) # Channel Layer 消息处理 async def terminal_output(self, event): if self.shell: await asyncio.to_thread(self.shell.send, event['content']) async def deploy_status(self, event): await self.send(text_data=json.dumps({ 'type': 'status', 'status': event['status'], 'message': event.get('message', '') })) ================================================ FILE: backend/apps/engine/management/__init__.py ================================================ ================================================ FILE: backend/apps/engine/management/commands/__init__.py ================================================ ================================================ FILE: backend/apps/engine/management/commands/init_default_engine.py ================================================ """ 初始化默认扫描引擎 用法: python manage.py init_default_engine # 只创建不存在的引擎(不覆盖已有) python manage.py init_default_engine --force # 强制覆盖所有引擎配置 python manage.py init_default_engine --force-sub # 只覆盖子引擎,保留 full scan cd /root/my-vulun-scan/docker docker compose exec server python backend/manage.py init_default_engine --force 功能: - 读取 engine_config_example.yaml 作为默认配置 - 创建 full scan(默认引擎)+ 各扫描类型的子引擎 - 默认不覆盖已有配置,加 --force 才会覆盖 - 加 --force-sub 只覆盖子引擎配置,保留用户自定义的 full scan """ from django.core.management.base import BaseCommand from io import StringIO from pathlib import Path from ruamel.yaml import YAML from apps.engine.models import ScanEngine class Command(BaseCommand): help = '初始化默认扫描引擎配置(默认不覆盖已有,加 --force 强制覆盖)' def add_arguments(self, parser): parser.add_argument( '--force', action='store_true', help='强制覆盖已有的引擎配置(包括 full scan 和子引擎)', ) parser.add_argument( '--force-sub', action='store_true', help='只覆盖子引擎配置,保留 full scan(升级时使用)', ) def handle(self, *args, **options): force = options.get('force', False) force_sub = options.get('force_sub', False) # 读取默认配置文件 config_path = Path(__file__).resolve().parent.parent.parent.parent / 'scan' / 'configs' / 'engine_config_example.yaml' if not config_path.exists(): self.stdout.write(self.style.ERROR(f'配置文件不存在: {config_path}')) return with open(config_path, 'r', encoding='utf-8') as f: default_config = f.read() # 使用 ruamel.yaml 解析,保留注释 yaml_parser = YAML() yaml_parser.preserve_quotes = True try: config_dict = yaml_parser.load(default_config) or {} except Exception as e: self.stdout.write(self.style.ERROR(f'引擎配置 YAML 解析失败: {e}')) return # 1) full scan:保留完整配置 engine = ScanEngine.objects.filter(name='full scan').first() if engine: if force: engine.configuration = default_config engine.save() self.stdout.write(self.style.SUCCESS(f'✓ 扫描引擎 full scan 配置已更新 (ID: {engine.id})')) else: self.stdout.write(self.style.WARNING(f' ⊘ full scan 已存在,跳过(使用 --force 覆盖)')) else: engine = ScanEngine.objects.create( name='full scan', configuration=default_config, ) self.stdout.write(self.style.SUCCESS(f'✓ 扫描引擎 full scan 已创建 (ID: {engine.id})')) # 2) 为每个扫描类型生成一个「单一扫描类型」的子引擎 # 例如:subdomain_discovery, port_scan, ... from apps.scan.configs.command_templates import get_supported_scan_types supported_scan_types = set(get_supported_scan_types()) for scan_type, scan_cfg in config_dict.items(): # 只处理受支持且结构为 {tools: {...}} 的扫描类型 if scan_type not in supported_scan_types: continue if not isinstance(scan_cfg, dict): continue # subdomain_discovery 使用 4 阶段新结构(无 tools 字段),其他扫描类型仍要求有 tools if scan_type != 'subdomain_discovery' and 'tools' not in scan_cfg: continue # 构造只包含当前扫描类型配置的 YAML(保留注释) single_config = {scan_type: scan_cfg} try: stream = StringIO() yaml_parser.dump(single_config, stream) single_yaml = stream.getvalue() except Exception as e: self.stdout.write(self.style.ERROR(f'生成子引擎 {scan_type} 配置失败: {e}')) continue engine_name = f"{scan_type}" sub_engine = ScanEngine.objects.filter(name=engine_name).first() if sub_engine: # force 或 force_sub 都会覆盖子引擎 if force or force_sub: sub_engine.configuration = single_yaml sub_engine.save() self.stdout.write(self.style.SUCCESS( f' ✓ 子引擎 {engine_name} 配置已更新 (ID: {sub_engine.id})' )) else: self.stdout.write(self.style.WARNING( f' ⊘ {engine_name} 已存在,跳过(使用 --force 覆盖)' )) else: sub_engine = ScanEngine.objects.create( name=engine_name, configuration=single_yaml, ) self.stdout.write(self.style.SUCCESS( f' ✓ 子引擎 {engine_name} 已创建 (ID: {sub_engine.id})' )) ================================================ FILE: backend/apps/engine/management/commands/init_fingerprints.py ================================================ """初始化内置指纹库 - EHole 指纹: ehole.json -> 导入到数据库 - Goby 指纹: goby.json -> 导入到数据库 - Wappalyzer 指纹: wappalyzer.json -> 导入到数据库 - Fingers 指纹: fingers_http.json -> 导入到数据库 - FingerPrintHub 指纹: fingerprinthub_web.json -> 导入到数据库 - ARL 指纹: ARL.yaml -> 导入到数据库 可重复执行:如果数据库已有数据则跳过,只在空库时导入。 """ import json import logging from pathlib import Path import yaml from django.conf import settings from django.core.management.base import BaseCommand from apps.engine.models import ( EholeFingerprint, GobyFingerprint, WappalyzerFingerprint, FingersFingerprint, FingerPrintHubFingerprint, ARLFingerprint, ) from apps.engine.services.fingerprints import ( EholeFingerprintService, GobyFingerprintService, WappalyzerFingerprintService, FingersFingerprintService, FingerPrintHubFingerprintService, ARLFingerprintService, ) logger = logging.getLogger(__name__) # 内置指纹配置 DEFAULT_FINGERPRINTS = [ { "type": "ehole", "filename": "ehole.json", "model": EholeFingerprint, "service": EholeFingerprintService, "data_key": "fingerprint", # JSON 中指纹数组的 key "file_format": "json", }, { "type": "goby", "filename": "goby.json", "model": GobyFingerprint, "service": GobyFingerprintService, "data_key": None, # Goby 是数组格式,直接使用整个 JSON "file_format": "json", }, { "type": "wappalyzer", "filename": "wappalyzer.json", "model": WappalyzerFingerprint, "service": WappalyzerFingerprintService, "data_key": "apps", # Wappalyzer 使用 apps 对象 "file_format": "json", }, { "type": "fingers", "filename": "fingers_http.json", "model": FingersFingerprint, "service": FingersFingerprintService, "data_key": None, # Fingers 是数组格式 "file_format": "json", }, { "type": "fingerprinthub", "filename": "fingerprinthub_web.json", "model": FingerPrintHubFingerprint, "service": FingerPrintHubFingerprintService, "data_key": None, # FingerPrintHub 是数组格式 "file_format": "json", }, { "type": "arl", "filename": "ARL.yaml", "model": ARLFingerprint, "service": ARLFingerprintService, "data_key": None, # ARL 是 YAML 数组格式 "file_format": "yaml", }, ] class Command(BaseCommand): help = "初始化内置指纹库" def handle(self, *args, **options): project_base = Path(settings.BASE_DIR).parent # /app/backend -> /app fingerprints_dir = project_base / "backend" / "fingerprints" initialized = 0 skipped = 0 failed = 0 for item in DEFAULT_FINGERPRINTS: fp_type = item["type"] filename = item["filename"] model = item["model"] service_class = item["service"] data_key = item["data_key"] file_format = item.get("file_format", "json") # 检查数据库是否已有数据 existing_count = model.objects.count() if existing_count > 0: self.stdout.write(self.style.SUCCESS( f"[{fp_type}] 数据库已有 {existing_count} 条记录,跳过初始化" )) skipped += 1 continue # 查找源文件 src_path = fingerprints_dir / filename if not src_path.exists(): self.stdout.write(self.style.WARNING( f"[{fp_type}] 未找到内置指纹文件: {src_path},跳过" )) failed += 1 continue # 读取并解析文件(支持 JSON 和 YAML) try: with open(src_path, "r", encoding="utf-8") as f: if file_format == "yaml": file_data = yaml.safe_load(f) else: file_data = json.load(f) except (json.JSONDecodeError, yaml.YAMLError, OSError) as exc: self.stdout.write(self.style.ERROR( f"[{fp_type}] 读取指纹文件失败: {exc}" )) failed += 1 continue # 提取指纹数据(根据不同格式处理) fingerprints = self._extract_fingerprints(file_data, data_key, fp_type) if not fingerprints: self.stdout.write(self.style.WARNING( f"[{fp_type}] 指纹文件中没有有效数据,跳过" )) failed += 1 continue # 使用 Service 批量导入 try: service = service_class() result = service.batch_create_fingerprints(fingerprints) created = result.get("created", 0) failed_count = result.get("failed", 0) self.stdout.write(self.style.SUCCESS( f"[{fp_type}] 导入成功: 创建 {created} 条,失败 {failed_count} 条" )) initialized += 1 except Exception as exc: self.stdout.write(self.style.ERROR( f"[{fp_type}] 导入失败: {exc}" )) failed += 1 continue self.stdout.write(self.style.SUCCESS( f"指纹初始化完成: 成功 {initialized}, 已存在跳过 {skipped}, 失败 {failed}" )) def _extract_fingerprints(self, json_data, data_key, fp_type): """ 根据不同格式提取指纹数据,兼容数组和对象两种格式 支持的格式: - 数组格式: [...] 或 {"key": [...]} - 对象格式: {...} 或 {"key": {...}} -> 转换为 [{"name": k, ...v}] """ # 获取目标数据 if data_key is None: # 直接使用整个 JSON target = json_data else: # 从指定 key 获取,支持多个可能的 key(如 apps/technologies) if data_key == "apps": target = json_data.get("apps") or json_data.get("technologies") or {} else: target = json_data.get(data_key, []) # 根据数据类型处理 if isinstance(target, list): # 已经是数组格式,直接返回 return target elif isinstance(target, dict): # 对象格式,转换为数组 [{"name": key, ...value}] return [{"name": name, **data} if isinstance(data, dict) else {"name": name} for name, data in target.items()] return [] ================================================ FILE: backend/apps/engine/management/commands/init_nuclei_templates.py ================================================ """初始化 Nuclei 模板仓库 项目安装后执行此命令,自动创建官方模板仓库记录。 使用方式: python manage.py init_nuclei_templates # 只创建记录(检测本地已有仓库) python manage.py init_nuclei_templates --sync # 创建并同步(git clone) """ import logging import subprocess from pathlib import Path from django.conf import settings from django.core.management.base import BaseCommand from django.utils import timezone from apps.engine.models import NucleiTemplateRepo from apps.engine.services import NucleiTemplateRepoService logger = logging.getLogger(__name__) # 默认仓库配置 DEFAULT_REPOS = [ { "name": "nuclei-templates", "repo_url": "https://github.com/projectdiscovery/nuclei-templates.git", "description": "Nuclei 官方模板仓库,包含数千个漏洞检测模板", }, ] def get_local_commit_hash(local_path: Path) -> str: """获取本地 Git 仓库的 commit hash""" if not (local_path / ".git").is_dir(): return "" result = subprocess.run( ["git", "-C", str(local_path), "rev-parse", "HEAD"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) return result.stdout.strip() if result.returncode == 0 else "" class Command(BaseCommand): help = "初始化 Nuclei 模板仓库(创建官方模板仓库记录)" def add_arguments(self, parser): parser.add_argument( "--sync", action="store_true", help="创建后立即同步(git clone),首次需要较长时间", ) parser.add_argument( "--force", action="store_true", help="强制重新创建(删除已存在的同名仓库)", ) def handle(self, *args, **options): do_sync = options.get("sync", False) force = options.get("force", False) service = NucleiTemplateRepoService() base_dir = Path(getattr(settings, "NUCLEI_TEMPLATES_REPOS_BASE_DIR", "/opt/xingrin/nuclei-repos")) created = 0 skipped = 0 synced = 0 for repo_config in DEFAULT_REPOS: name = repo_config["name"] repo_url = repo_config["repo_url"] # 检查是否已存在 existing = NucleiTemplateRepo.objects.filter(name=name).first() if existing: if force: self.stdout.write(self.style.WARNING( f"[{name}] 强制模式,删除已存在的仓库记录" )) service.remove_local_path_dir(existing) existing.delete() else: self.stdout.write(self.style.SUCCESS( f"[{name}] 已存在,跳过创建" )) skipped += 1 # 如果需要同步且已存在,也执行同步 if do_sync and existing.id: try: result = service.refresh_repo(existing.id) self.stdout.write(self.style.SUCCESS( f"[{name}] 同步完成: {result.get('action', 'unknown')}, " f"commit={result.get('commitHash', 'N/A')[:8]}" )) synced += 1 except Exception as e: self.stdout.write(self.style.ERROR( f"[{name}] 同步失败: {e}" )) continue # 创建新仓库记录 try: # 检查本地是否已有仓库(由 install.sh 预下载) local_path = base_dir / name local_commit = get_local_commit_hash(local_path) repo = NucleiTemplateRepo.objects.create( name=name, repo_url=repo_url, local_path=str(local_path) if local_commit else "", commit_hash=local_commit, last_synced_at=timezone.now() if local_commit else None, ) if local_commit: self.stdout.write(self.style.SUCCESS( f"[{name}] 创建成功(检测到本地仓库): commit={local_commit[:8]}" )) else: self.stdout.write(self.style.SUCCESS( f"[{name}] 创建成功: id={repo.id}" )) created += 1 # 如果本地没有仓库且需要同步 if not local_commit and do_sync: try: self.stdout.write(self.style.WARNING( f"[{name}] 正在同步(首次可能需要几分钟)..." )) result = service.refresh_repo(repo.id) self.stdout.write(self.style.SUCCESS( f"[{name}] 同步完成: {result.get('action', 'unknown')}, " f"commit={result.get('commitHash', 'N/A')[:8]}" )) synced += 1 except Exception as e: self.stdout.write(self.style.ERROR( f"[{name}] 同步失败: {e}" )) except Exception as e: self.stdout.write(self.style.ERROR( f"[{name}] 创建失败: {e}" )) self.stdout.write(self.style.SUCCESS( f"\n初始化完成: 创建 {created}, 跳过 {skipped}, 同步 {synced}" )) ================================================ FILE: backend/apps/engine/management/commands/init_wordlists.py ================================================ """初始化所有内置字典 Wordlist 记录 内置字典从镜像内 /app/backend/wordlist/ 复制到运行时目录 /opt/xingrin/wordlists/: - 目录扫描默认字典: dir_default.txt - 子域名爆破默认字典: subdomains-top1million-110000.txt 可重复执行:如果已存在同名记录且文件有效则跳过,只在缺失或文件丢失时创建/修复。 """ import logging import shutil from pathlib import Path from django.conf import settings from django.core.management.base import BaseCommand from apps.common.utils import safe_calc_file_sha256 from apps.engine.models import Wordlist logger = logging.getLogger(__name__) DEFAULT_WORDLISTS = [ { "name": "dir_default.txt", "filename": "dir_default.txt", "description": "内置默认目录字典", }, { "name": "subdomains-top1million-110000.txt", "filename": "subdomains-top1million-110000.txt", "description": "内置默认子域名字典", }, ] class Command(BaseCommand): help = "初始化所有内置字典 Wordlist 记录" def handle(self, *args, **options): project_base = Path(settings.BASE_DIR).parent # /app/backend -> /app base_wordlist_dir = project_base / "backend" / "wordlist" runtime_base_dir = Path(getattr(settings, "WORDLISTS_BASE_PATH", "/opt/xingrin/wordlists")) runtime_base_dir.mkdir(parents=True, exist_ok=True) initialized = 0 skipped = 0 failed = 0 for item in DEFAULT_WORDLISTS: name = item["name"] filename = item["filename"] description = item["description"] existing = Wordlist.objects.filter(name=name).first() if existing: file_path = existing.file_path or "" file_hash = getattr(existing, 'file_hash', '') or '' if file_path and Path(file_path).exists() and file_hash: # 记录、文件、hash 都在,直接跳过 self.stdout.write(self.style.SUCCESS( f"[{name}] 已存在且文件有效,跳过初始化 (file_path={file_path})" )) skipped += 1 continue elif file_path and Path(file_path).exists() and not file_hash: # 文件在但 hash 缺失,需要补算 self.stdout.write(self.style.WARNING( f"[{name}] 记录已存在但缺少 file_hash,将补算并更新" )) else: self.stdout.write(self.style.WARNING( f"[{name}] 记录已存在但物理文件丢失,将重新创建文件路径并修复记录" )) src_path = base_wordlist_dir / filename dest_path = runtime_base_dir / filename if not src_path.exists(): self.stdout.write(self.style.WARNING( f"[{name}] 未找到内置字典文件: {src_path},跳过" )) failed += 1 continue try: shutil.copy2(src_path, dest_path) except OSError as exc: self.stdout.write(self.style.WARNING( f"[{name}] 复制内置字典到运行目录失败: {exc}" )) failed += 1 continue # 统计文件大小和行数 try: file_size = dest_path.stat().st_size except OSError: file_size = 0 line_count = 0 try: with dest_path.open("rb") as f: for _ in f: line_count += 1 except OSError: logger.warning("统计字典行数失败: %s", src_path) # 计算文件 hash file_hash = safe_calc_file_sha256(str(dest_path)) or "" # 如果之前已有记录则更新,否则创建新记录 if existing: existing.file_path = str(dest_path) existing.file_size = file_size existing.line_count = line_count existing.file_hash = file_hash existing.description = existing.description or description existing.save(update_fields=[ "file_path", "file_size", "line_count", "file_hash", "description", "updated_at", ]) wordlist = existing action = "更新" else: wordlist = Wordlist.objects.create( name=name, description=description, file_path=str(dest_path), file_size=file_size, line_count=line_count, file_hash=file_hash, ) action = "创建" initialized += 1 hash_preview = (wordlist.file_hash[:16] + "...") if wordlist.file_hash else "N/A" self.stdout.write(self.style.SUCCESS( f"[{name}] {action}字典记录成功: id={wordlist.id}, size={wordlist.file_size}, lines={wordlist.line_count}, hash={hash_preview}" )) self.stdout.write(self.style.SUCCESS( f"初始化完成: 成功 {initialized}, 已存在跳过 {skipped}, 文件缺失 {failed}" )) ================================================ FILE: backend/apps/engine/migrations/0001_initial.py ================================================ # Generated by Django 5.2.7 on 2026-01-06 00:55 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='NucleiTemplateRepo', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='仓库名称,用于前端展示和配置引用', max_length=200, unique=True)), ('repo_url', models.CharField(help_text='Git 仓库地址', max_length=500)), ('local_path', models.CharField(blank=True, default='', help_text='本地工作目录绝对路径', max_length=500)), ('commit_hash', models.CharField(blank=True, default='', help_text='最后同步的 Git commit hash,用于 Worker 版本校验', max_length=40)), ('last_synced_at', models.DateTimeField(blank=True, help_text='最后一次成功同步时间', null=True)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ], options={ 'verbose_name': 'Nuclei 模板仓库', 'verbose_name_plural': 'Nuclei 模板仓库', 'db_table': 'nuclei_template_repo', }, ), migrations.CreateModel( name='ARLFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='指纹名称', max_length=300, unique=True)), ('rule', models.TextField(help_text='匹配规则表达式')), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'ARL 指纹', 'verbose_name_plural': 'ARL 指纹', 'db_table': 'arl_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['name'], name='arl_fingerp_name_c3a305_idx'), models.Index(fields=['-created_at'], name='arl_fingerp_created_ed1060_idx')], }, ), migrations.CreateModel( name='EholeFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('cms', models.CharField(help_text='产品/CMS名称', max_length=200)), ('method', models.CharField(default='keyword', help_text='匹配方式', max_length=200)), ('location', models.CharField(default='body', help_text='匹配位置', max_length=200)), ('keyword', models.JSONField(default=list, help_text='关键词列表')), ('is_important', models.BooleanField(default=False, help_text='是否重点资产')), ('type', models.CharField(blank=True, default='-', help_text='分类', max_length=100)), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'EHole 指纹', 'verbose_name_plural': 'EHole 指纹', 'db_table': 'ehole_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['cms'], name='ehole_finge_cms_72ca2c_idx'), models.Index(fields=['method'], name='ehole_finge_method_17f0db_idx'), models.Index(fields=['location'], name='ehole_finge_locatio_7bb82b_idx'), models.Index(fields=['type'], name='ehole_finge_type_ca2bce_idx'), models.Index(fields=['is_important'], name='ehole_finge_is_impo_d56e64_idx'), models.Index(fields=['-created_at'], name='ehole_finge_created_d862b0_idx')], 'constraints': [models.UniqueConstraint(fields=('cms', 'method', 'location'), name='unique_ehole_fingerprint')], }, ), migrations.CreateModel( name='FingerPrintHubFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('fp_id', models.CharField(help_text='指纹ID', max_length=200, unique=True)), ('name', models.CharField(help_text='指纹名称', max_length=300)), ('author', models.CharField(blank=True, default='', help_text='作者', max_length=200)), ('tags', models.CharField(blank=True, default='', help_text='标签', max_length=500)), ('severity', models.CharField(blank=True, default='info', help_text='严重程度', max_length=50)), ('metadata', models.JSONField(blank=True, default=dict, help_text='元数据')), ('http', models.JSONField(default=list, help_text='HTTP 匹配规则')), ('source_file', models.CharField(blank=True, default='', help_text='来源文件', max_length=500)), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'FingerPrintHub 指纹', 'verbose_name_plural': 'FingerPrintHub 指纹', 'db_table': 'fingerprinthub_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['fp_id'], name='fingerprint_fp_id_df467f_idx'), models.Index(fields=['name'], name='fingerprint_name_95b6fb_idx'), models.Index(fields=['author'], name='fingerprint_author_80f54b_idx'), models.Index(fields=['severity'], name='fingerprint_severit_f70422_idx'), models.Index(fields=['-created_at'], name='fingerprint_created_bec16c_idx')], }, ), migrations.CreateModel( name='FingersFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='指纹名称', max_length=300, unique=True)), ('link', models.URLField(blank=True, default='', help_text='相关链接', max_length=500)), ('rule', models.JSONField(default=list, help_text='匹配规则数组')), ('tag', models.JSONField(default=list, help_text='标签数组')), ('focus', models.BooleanField(default=False, help_text='是否重点关注')), ('default_port', models.JSONField(blank=True, default=list, help_text='默认端口数组')), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'Fingers 指纹', 'verbose_name_plural': 'Fingers 指纹', 'db_table': 'fingers_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['name'], name='fingers_fin_name_952de0_idx'), models.Index(fields=['link'], name='fingers_fin_link_4c6b7f_idx'), models.Index(fields=['focus'], name='fingers_fin_focus_568c7f_idx'), models.Index(fields=['-created_at'], name='fingers_fin_created_46fc91_idx')], }, ), migrations.CreateModel( name='GobyFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='产品名称', max_length=300, unique=True)), ('logic', models.CharField(help_text='逻辑表达式', max_length=500)), ('rule', models.JSONField(default=list, help_text='规则数组')), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'Goby 指纹', 'verbose_name_plural': 'Goby 指纹', 'db_table': 'goby_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['name'], name='goby_finger_name_82084c_idx'), models.Index(fields=['logic'], name='goby_finger_logic_a63226_idx'), models.Index(fields=['-created_at'], name='goby_finger_created_50e000_idx')], }, ), migrations.CreateModel( name='ScanEngine', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(help_text='引擎名称', max_length=200, unique=True)), ('configuration', models.CharField(blank=True, default='', help_text='引擎配置,yaml 格式', max_length=10000)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ], options={ 'verbose_name': '扫描引擎', 'verbose_name_plural': '扫描引擎', 'db_table': 'scan_engine', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='scan_engine_created_da4870_idx')], }, ), migrations.CreateModel( name='WappalyzerFingerprint', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='应用名称', max_length=300, unique=True)), ('cats', models.JSONField(default=list, help_text='分类 ID 数组')), ('cookies', models.JSONField(blank=True, default=dict, help_text='Cookie 检测规则')), ('headers', models.JSONField(blank=True, default=dict, help_text='HTTP Header 检测规则')), ('script_src', models.JSONField(blank=True, default=list, help_text='脚本 URL 正则数组')), ('js', models.JSONField(blank=True, default=list, help_text='JavaScript 变量检测规则')), ('implies', models.JSONField(blank=True, default=list, help_text='依赖关系数组')), ('meta', models.JSONField(blank=True, default=dict, help_text='HTML meta 标签检测规则')), ('html', models.JSONField(blank=True, default=list, help_text='HTML 内容正则数组')), ('description', models.TextField(blank=True, default='', help_text='应用描述')), ('website', models.URLField(blank=True, default='', help_text='官网链接', max_length=500)), ('cpe', models.CharField(blank=True, default='', help_text='CPE 标识符', max_length=300)), ('created_at', models.DateTimeField(auto_now_add=True)), ], options={ 'verbose_name': 'Wappalyzer 指纹', 'verbose_name_plural': 'Wappalyzer 指纹', 'db_table': 'wappalyzer_fingerprint', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['name'], name='wappalyzer__name_63c669_idx'), models.Index(fields=['website'], name='wappalyzer__website_88de1c_idx'), models.Index(fields=['cpe'], name='wappalyzer__cpe_30c761_idx'), models.Index(fields=['-created_at'], name='wappalyzer__created_8e6c21_idx')], }, ), migrations.CreateModel( name='Wordlist', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(help_text='字典名称,唯一', max_length=200, unique=True)), ('description', models.CharField(blank=True, default='', help_text='字典描述', max_length=200)), ('file_path', models.CharField(help_text='后端保存的字典文件绝对路径', max_length=500)), ('file_size', models.BigIntegerField(default=0, help_text='文件大小(字节)')), ('line_count', models.IntegerField(default=0, help_text='字典行数')), ('file_hash', models.CharField(blank=True, default='', help_text='文件 SHA-256 哈希,用于缓存校验', max_length=64)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ], options={ 'verbose_name': '字典文件', 'verbose_name_plural': '字典文件', 'db_table': 'wordlist', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='wordlist_created_4afb02_idx')], }, ), migrations.CreateModel( name='WorkerNode', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='节点名称', max_length=100)), ('ip_address', models.GenericIPAddressField(help_text='IP 地址(本地节点为 127.0.0.1)')), ('ssh_port', models.IntegerField(default=22, help_text='SSH 端口')), ('username', models.CharField(default='root', help_text='SSH 用户名', max_length=50)), ('password', models.CharField(blank=True, default='', help_text='SSH 密码', max_length=200)), ('is_local', models.BooleanField(default=False, help_text='是否为本地节点(Docker 容器内)')), ('status', models.CharField(choices=[('pending', '待部署'), ('deploying', '部署中'), ('online', '在线'), ('offline', '离线'), ('updating', '更新中'), ('outdated', '版本过低')], default='pending', help_text='状态: pending/deploying/online/offline', max_length=20)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'Worker 节点', 'db_table': 'worker_node', 'ordering': ['-created_at'], 'constraints': [models.UniqueConstraint(condition=models.Q(('is_local', False)), fields=('ip_address',), name='unique_remote_worker_ip'), models.UniqueConstraint(fields=('name',), name='unique_worker_name')], }, ), ] ================================================ FILE: backend/apps/engine/migrations/__init__.py ================================================ ================================================ FILE: backend/apps/engine/models/__init__.py ================================================ """Engine Models 导出所有 Engine 模块的 Models """ from .engine import WorkerNode, ScanEngine, Wordlist, NucleiTemplateRepo from .fingerprints import ( EholeFingerprint, GobyFingerprint, WappalyzerFingerprint, FingersFingerprint, FingerPrintHubFingerprint, ARLFingerprint, ) __all__ = [ # 核心 Models "WorkerNode", "ScanEngine", "Wordlist", "NucleiTemplateRepo", # 指纹 Models "EholeFingerprint", "GobyFingerprint", "WappalyzerFingerprint", "FingersFingerprint", "FingerPrintHubFingerprint", "ARLFingerprint", ] ================================================ FILE: backend/apps/engine/models/engine.py ================================================ """Engine 模块核心 Models 包含 WorkerNode, ScanEngine, Wordlist, NucleiTemplateRepo """ from django.db import models class WorkerNode(models.Model): """Worker 节点模型 - 分布式扫描执行器""" # 状态选项(前后端统一) STATUS_CHOICES = [ ('pending', '待部署'), ('deploying', '部署中'), ('online', '在线'), ('offline', '离线'), ('updating', '更新中'), ('outdated', '版本过低'), ] name = models.CharField(max_length=100, help_text='节点名称') # 本地节点会自动填入 127.0.0.1 或容器 IP ip_address = models.GenericIPAddressField(help_text='IP 地址(本地节点为 127.0.0.1)') ssh_port = models.IntegerField(default=22, help_text='SSH 端口') username = models.CharField(max_length=50, default='root', help_text='SSH 用户名') password = models.CharField(max_length=200, blank=True, default='', help_text='SSH 密码') # 本地节点标记(Docker 容器内的 Worker) is_local = models.BooleanField(default=False, help_text='是否为本地节点(Docker 容器内)') # 状态(前后端统一) status = models.CharField( max_length=20, choices=STATUS_CHOICES, default='pending', help_text='状态: pending/deploying/online/offline' ) # 心跳数据存储在 Redis(worker:load:{id}),不再使用数据库字段 created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'worker_node' verbose_name = 'Worker 节点' ordering = ['-created_at'] constraints = [ # 远程节点 IP 唯一(本地节点不限制,因为都是 127.0.0.1) models.UniqueConstraint( fields=['ip_address'], condition=models.Q(is_local=False), name='unique_remote_worker_ip' ), # 名称全局唯一 models.UniqueConstraint( fields=['name'], name='unique_worker_name' ), ] def __str__(self): if self.is_local: return f"{self.name} (本地)" return f"{self.name} ({self.ip_address or '未知'})" class ScanEngine(models.Model): """扫描引擎模型""" id = models.AutoField(primary_key=True) name = models.CharField(max_length=200, unique=True, help_text='引擎名称') configuration = models.CharField(max_length=10000, blank=True, default='', help_text='引擎配置,yaml 格式') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') updated_at = models.DateTimeField(auto_now=True, help_text='更新时间') class Meta: db_table = 'scan_engine' verbose_name = '扫描引擎' verbose_name_plural = '扫描引擎' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), ] def __str__(self): return str(self.name or f'ScanEngine {self.id}') class Wordlist(models.Model): """字典文件模型""" id = models.AutoField(primary_key=True) name = models.CharField(max_length=200, unique=True, help_text='字典名称,唯一') description = models.CharField(max_length=200, blank=True, default='', help_text='字典描述') file_path = models.CharField(max_length=500, help_text='后端保存的字典文件绝对路径') file_size = models.BigIntegerField(default=0, help_text='文件大小(字节)') line_count = models.IntegerField(default=0, help_text='字典行数') file_hash = models.CharField(max_length=64, blank=True, default='', help_text='文件 SHA-256 哈希,用于缓存校验') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') updated_at = models.DateTimeField(auto_now=True, help_text='更新时间') class Meta: db_table = 'wordlist' verbose_name = '字典文件' verbose_name_plural = '字典文件' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), ] def __str__(self) -> str: return self.name class NucleiTemplateRepo(models.Model): """Nuclei 模板 Git 仓库模型(多仓库)""" name = models.CharField(max_length=200, unique=True, help_text="仓库名称,用于前端展示和配置引用") repo_url = models.CharField(max_length=500, help_text="Git 仓库地址") local_path = models.CharField(max_length=500, blank=True, default='', help_text="本地工作目录绝对路径") commit_hash = models.CharField(max_length=40, blank=True, default='', help_text="最后同步的 Git commit hash,用于 Worker 版本校验") last_synced_at = models.DateTimeField(null=True, blank=True, help_text="最后一次成功同步时间") created_at = models.DateTimeField(auto_now_add=True, help_text="创建时间") updated_at = models.DateTimeField(auto_now=True, help_text="更新时间") class Meta: db_table = "nuclei_template_repo" verbose_name = "Nuclei 模板仓库" verbose_name_plural = "Nuclei 模板仓库" def __str__(self) -> str: # pragma: no cover - 简单表示 return f"NucleiTemplateRepo({self.id}, {self.name})" ================================================ FILE: backend/apps/engine/models/fingerprints.py ================================================ """指纹相关 Models 包含 EHole、Goby、Wappalyzer 等指纹格式的数据模型 """ from django.db import models class GobyFingerprint(models.Model): """Goby 格式指纹规则 Goby 使用逻辑表达式和规则数组进行匹配: - logic: 逻辑表达式,如 "a||b", "(a&&b)||c" - rule: 规则数组,每条规则包含 label, feature, is_equal """ name = models.CharField(max_length=300, unique=True, help_text='产品名称') logic = models.CharField(max_length=500, help_text='逻辑表达式') rule = models.JSONField(default=list, help_text='规则数组') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'goby_fingerprint' verbose_name = 'Goby 指纹' verbose_name_plural = 'Goby 指纹' ordering = ['-created_at'] indexes = [ models.Index(fields=['name']), models.Index(fields=['logic']), models.Index(fields=['-created_at']), ] def __str__(self) -> str: return f"{self.name} ({self.logic})" class EholeFingerprint(models.Model): """EHole 格式指纹规则(字段与 ehole.json 一致)""" cms = models.CharField(max_length=200, help_text='产品/CMS名称') method = models.CharField(max_length=200, default='keyword', help_text='匹配方式') location = models.CharField(max_length=200, default='body', help_text='匹配位置') keyword = models.JSONField(default=list, help_text='关键词列表') is_important = models.BooleanField(default=False, help_text='是否重点资产') type = models.CharField(max_length=100, blank=True, default='-', help_text='分类') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'ehole_fingerprint' verbose_name = 'EHole 指纹' verbose_name_plural = 'EHole 指纹' ordering = ['-created_at'] indexes = [ # 搜索过滤字段索引 models.Index(fields=['cms']), models.Index(fields=['method']), models.Index(fields=['location']), models.Index(fields=['type']), models.Index(fields=['is_important']), # 排序字段索引 models.Index(fields=['-created_at']), ] constraints = [ # 唯一约束:cms + method + location 组合不能重复 models.UniqueConstraint( fields=['cms', 'method', 'location'], name='unique_ehole_fingerprint' ), ] def __str__(self) -> str: return f"{self.cms} ({self.method}@{self.location})" class WappalyzerFingerprint(models.Model): """Wappalyzer 格式指纹规则 Wappalyzer 支持多种检测方式:cookies, headers, scriptSrc, js, meta, html 等 """ name = models.CharField(max_length=300, unique=True, help_text='应用名称') cats = models.JSONField(default=list, help_text='分类 ID 数组') cookies = models.JSONField(default=dict, blank=True, help_text='Cookie 检测规则') headers = models.JSONField(default=dict, blank=True, help_text='HTTP Header 检测规则') script_src = models.JSONField(default=list, blank=True, help_text='脚本 URL 正则数组') js = models.JSONField(default=list, blank=True, help_text='JavaScript 变量检测规则') implies = models.JSONField(default=list, blank=True, help_text='依赖关系数组') meta = models.JSONField(default=dict, blank=True, help_text='HTML meta 标签检测规则') html = models.JSONField(default=list, blank=True, help_text='HTML 内容正则数组') description = models.TextField(blank=True, default='', help_text='应用描述') website = models.URLField(max_length=500, blank=True, default='', help_text='官网链接') cpe = models.CharField(max_length=300, blank=True, default='', help_text='CPE 标识符') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'wappalyzer_fingerprint' verbose_name = 'Wappalyzer 指纹' verbose_name_plural = 'Wappalyzer 指纹' ordering = ['-created_at'] indexes = [ models.Index(fields=['name']), models.Index(fields=['website']), models.Index(fields=['cpe']), models.Index(fields=['-created_at']), ] def __str__(self) -> str: return f"{self.name}" class FingersFingerprint(models.Model): """Fingers 格式指纹规则 (fingers_http.json) 使用正则表达式和标签进行匹配,支持 favicon hash、header、body 等多种检测方式 """ name = models.CharField(max_length=300, unique=True, help_text='指纹名称') link = models.URLField(max_length=500, blank=True, default='', help_text='相关链接') rule = models.JSONField(default=list, help_text='匹配规则数组') tag = models.JSONField(default=list, help_text='标签数组') focus = models.BooleanField(default=False, help_text='是否重点关注') default_port = models.JSONField(default=list, blank=True, help_text='默认端口数组') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'fingers_fingerprint' verbose_name = 'Fingers 指纹' verbose_name_plural = 'Fingers 指纹' ordering = ['-created_at'] indexes = [ models.Index(fields=['name']), models.Index(fields=['link']), models.Index(fields=['focus']), models.Index(fields=['-created_at']), ] def __str__(self) -> str: return f"{self.name}" class FingerPrintHubFingerprint(models.Model): """FingerPrintHub 格式指纹规则 (fingerprinthub_web.json) 基于 nuclei 模板格式,使用 HTTP 请求和响应特征进行匹配 """ fp_id = models.CharField(max_length=200, unique=True, help_text='指纹ID') name = models.CharField(max_length=300, help_text='指纹名称') author = models.CharField(max_length=200, blank=True, default='', help_text='作者') tags = models.CharField(max_length=500, blank=True, default='', help_text='标签') severity = models.CharField(max_length=50, blank=True, default='info', help_text='严重程度') metadata = models.JSONField(default=dict, blank=True, help_text='元数据') http = models.JSONField(default=list, help_text='HTTP 匹配规则') source_file = models.CharField(max_length=500, blank=True, default='', help_text='来源文件') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'fingerprinthub_fingerprint' verbose_name = 'FingerPrintHub 指纹' verbose_name_plural = 'FingerPrintHub 指纹' ordering = ['-created_at'] indexes = [ models.Index(fields=['fp_id']), models.Index(fields=['name']), models.Index(fields=['author']), models.Index(fields=['severity']), models.Index(fields=['-created_at']), ] def __str__(self) -> str: return f"{self.name} ({self.fp_id})" class ARLFingerprint(models.Model): """ARL 格式指纹规则 (ARL.yaml) 使用简单的 name + rule 表达式格式 """ name = models.CharField(max_length=300, unique=True, help_text='指纹名称') rule = models.TextField(help_text='匹配规则表达式') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'arl_fingerprint' verbose_name = 'ARL 指纹' verbose_name_plural = 'ARL 指纹' ordering = ['-created_at'] indexes = [ models.Index(fields=['name']), models.Index(fields=['-created_at']), ] def __str__(self) -> str: return f"{self.name}" ================================================ FILE: backend/apps/engine/repositories/__init__.py ================================================ """Engine Repositories 模块 提供 ScanEngine、WorkerNode、Wordlist、NucleiRepo 等数据访问层实现 """ from .django_engine_repository import DjangoEngineRepository from .django_worker_repository import DjangoWorkerRepository from .django_wordlist_repository import DjangoWordlistRepository from .nuclei_repo_repository import NucleiTemplateRepository, TemplateFileRepository __all__ = [ "DjangoEngineRepository", "DjangoWorkerRepository", "DjangoWordlistRepository", "NucleiTemplateRepository", "TemplateFileRepository", ] ================================================ FILE: backend/apps/engine/repositories/django_engine_repository.py ================================================ """ ScanEngine 数据访问层 Django ORM 实现 基于 Django ORM 的 ScanEngine Repository 实现类 """ import logging from ..models import ScanEngine from apps.common.decorators import auto_ensure_db_connection logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoEngineRepository: """基于 Django ORM 的 ScanEngine 数据访问层实现""" def get_all(self): """获取所有扫描引擎查询集""" return ScanEngine.objects.all().order_by('-created_at') # type: ignore def get_by_id(self, engine_id: int) -> ScanEngine | None: """ 根据 ID 获取扫描引擎 Args: engine_id: 引擎 ID Returns: ScanEngine 对象或 None """ try: return ScanEngine.objects.get(id=engine_id) # type: ignore except ScanEngine.DoesNotExist: # type: ignore logger.warning("ScanEngine 不存在 - Engine ID: %s", engine_id) return None __all__ = ['DjangoEngineRepository'] ================================================ FILE: backend/apps/engine/repositories/django_wordlist_repository.py ================================================ """Wordlist 数据访问层 Django ORM 实现 基于 Django ORM 的 Wordlist Repository 实现类 """ import logging from apps.engine.models import Wordlist from apps.common.decorators import auto_ensure_db_connection logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoWordlistRepository: """基于 Django ORM 的 Wordlist 数据访问层实现""" def get_queryset(self): """获取字典查询集""" return Wordlist.objects.all().order_by("-created_at") def get_by_id(self, wordlist_id: int) -> Wordlist | None: """根据 ID 获取字典""" try: return Wordlist.objects.get(id=wordlist_id) except Wordlist.DoesNotExist: logger.warning("Wordlist 不存在 - ID: %s", wordlist_id) return None def get_by_name(self, name: str) -> Wordlist | None: try: return Wordlist.objects.get(name=name) except Wordlist.DoesNotExist: logger.warning("Wordlist 不存在 - 名称: %s", name) return None def create(self, **kwargs) -> Wordlist: """创建字典记录""" return Wordlist.objects.create(**kwargs) def delete(self, wordlist_id: int) -> bool: """删除字典记录""" wordlist = self.get_by_id(wordlist_id) if not wordlist: return False wordlist.delete() return True __all__ = ["DjangoWordlistRepository"] ================================================ FILE: backend/apps/engine/repositories/django_worker_repository.py ================================================ """ WorkerNode 数据访问层 Django ORM 实现 基于 Django ORM 的 WorkerNode Repository 实现类 """ import logging from typing import Any from django.utils import timezone from apps.engine.models import WorkerNode from apps.common.decorators import auto_ensure_db_connection logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoWorkerRepository: """基于 Django ORM 的 WorkerNode 数据访问层实现""" def get_by_id(self, worker_id: int) -> WorkerNode | None: """根据 ID 获取 Worker 节点""" try: return WorkerNode.objects.get(id=worker_id) except WorkerNode.DoesNotExist: logger.warning("WorkerNode 不存在 - ID: %s", worker_id) return None def get_all(self): """获取所有 Worker 节点的查询集""" return WorkerNode.objects.all().order_by("-created_at") def update_status(self, worker_id: int, status: str) -> bool: """更新 Worker 节点状态""" worker = self.get_by_id(worker_id) if not worker: return False worker.status = status worker.save(update_fields=["status"]) logger.info("Worker %s 状态更新为: %s", worker_id, status) return True def delete_by_id(self, worker_id: int) -> bool: """根据 ID 删除 Worker 节点""" worker = self.get_by_id(worker_id) if not worker: return False worker.delete() logger.info("Worker %s 已删除", worker_id) return True def get_or_create_by_name( self, name: str, is_local: bool = True ) -> tuple[WorkerNode, bool]: """ 根据名称获取或创建 Worker 节点 用于本地 Worker 自注册。 Args: name: Worker 名称 is_local: 是否为本地节点 Returns: (worker, created) 元组 """ import socket # 尝试获取本机 IP try: hostname = socket.gethostname() ip_address = socket.gethostbyname(hostname) except Exception: ip_address = '127.0.0.1' worker, created = WorkerNode.objects.get_or_create( name=name, defaults={ 'ip_address': ip_address, 'is_local': is_local, 'status': 'offline', # 等待心跳上报后自动变为 online } ) if created: logger.info("本地 Worker 注册成功: %s (IP: %s)", name, ip_address) else: logger.debug("本地 Worker 已存在: %s", name) return worker, created __all__ = ["DjangoWorkerRepository"] ================================================ FILE: backend/apps/engine/repositories/nuclei_repo_repository.py ================================================ """Nuclei 模板仓库 Repository 层 本模块包含两个 Repository 类,负责数据访问: 1. NucleiTemplateRepository - 职责:ORM 操作,按 ID 查询仓库配置 - 被 Service 层调用,不直接被 View 调用 2. TemplateFileRepository - 职责:文件系统操作,读取模板目录树和文件内容(只读) - 按仓库的 local_path 构建,一个仓库对应一个实例 调用链路: View → Service → Repository → Model/FileSystem """ from __future__ import annotations import os from pathlib import Path from typing import Dict, List, Optional from apps.common.decorators import auto_ensure_db_connection from apps.engine.models import NucleiTemplateRepo @auto_ensure_db_connection class NucleiTemplateRepository: """Nuclei 模板仓库 ORM Repository 负责与 NucleiTemplateRepo 模型交互,提供按 ID 查询功能。 CRUD 操作由 DRF ModelViewSet 默认实现,这里只保留 Service 需要的查询方法。 """ def get_by_id(self, repo_id: int) -> Optional[NucleiTemplateRepo]: """根据 ID 获取仓库对象 Args: repo_id: 仓库 ID Returns: NucleiTemplateRepo 对象,不存在返回 None """ try: return NucleiTemplateRepo.objects.get(id=repo_id) except NucleiTemplateRepo.DoesNotExist: return None class TemplateFileRepository: """模板文件系统 Repository(只读) 负责读取指定根目录下的 Nuclei 模板文件。 每个仓库克隆到本地后,用这个类来读取目录树和文件内容。 Attributes: root: 仓库本地根目录路径(即 git clone 的目标目录) """ def __init__(self, root: Path) -> None: """初始化文件系统 Repository Args: root: 仓库本地根目录路径(会自动转换为绝对路径) """ # 确保存储的是绝对路径 self.root = root.resolve() def get_tree(self) -> List[Dict]: """获取模板目录树结构 遍历 root 目录,构建树形结构,只包含: - 文件夹节点 - .yaml / .yml 文件节点 Returns: 树形结构列表,格式如下: [ { "type": "folder", "name": "nuclei-templates", "path": "", "children": [ {"type": "folder", "name": "http", "path": "http", "children": [...]}, {"type": "file", "name": "example.yaml", "path": "http/example.yaml"} ] } ] """ # self.root 在 __init__ 中已确保是绝对路径 root_dir = self.root # 根节点 root_node: Dict = { "type": "folder", "name": root_dir.name or "root", "path": "", "children": [], } # 目录不存在时返回空树 if not root_dir.exists() or not root_dir.is_dir(): return [root_node] # 用于快速查找父节点 path_to_node: Dict[Path, Dict] = {root_dir: root_node} # 遍历目录树 for dirpath, dirnames, filenames in os.walk(root_dir): current_dir = Path(dirpath) parent_node = path_to_node.get(current_dir) if parent_node is None: continue # 添加子目录节点(按名称排序) for dirname in sorted(dirnames): child_fs_path = current_dir / dirname rel = child_fs_path.relative_to(root_dir) api_path = rel.as_posix() # 使用 POSIX 风格路径(前端友好) node: Dict = { "type": "folder", "name": dirname, "path": api_path, "children": [], } parent_node.setdefault("children", []).append(node) path_to_node[child_fs_path] = node # 添加模板文件节点(仅 .yaml / .yml,按名称排序) for filename in sorted(filenames): if not (filename.endswith(".yaml") or filename.endswith(".yml")): continue file_fs_path = current_dir / filename rel = file_fs_path.relative_to(root_dir) api_path = rel.as_posix() file_node: Dict = { "type": "file", "name": filename, "path": api_path, } parent_node.setdefault("children", []).append(file_node) return [root_node] def get_file_content(self, rel_path: str) -> Optional[Dict]: """根据相对路径获取模板文件内容 Args: rel_path: 相对于 root 的路径,如 "http/cves/CVE-2021-1234.yaml" Returns: 成功时返回: { "path": "http/cves/CVE-2021-1234.yaml", "name": "CVE-2021-1234.yaml", "content": "id: CVE-2021-1234\ninfo:\n name: ..." } 失败时返回 None(路径无效、文件不存在、读取失败等) """ # 清理路径 rel_path = (rel_path or "").strip().lstrip("/") if not rel_path: return None # self.root 在 __init__ 中已确保是绝对路径 base_dir = self.root # 拼接后 resolve() 确保解析 .. 等相对路径符号(防止目录遍历攻击) target_path = (base_dir / rel_path).resolve() # 防止目录遍历攻击:确保目标路径在 base_dir 内 try: target_path.relative_to(base_dir) except ValueError: return None # 检查文件是否存在 if not target_path.is_file(): return None # 读取文件内容 try: content = target_path.read_text(encoding="utf-8", errors="replace") except OSError: return None return { "path": rel_path, "name": target_path.name, "content": content, } __all__ = ["NucleiTemplateRepository", "TemplateFileRepository"] ================================================ FILE: backend/apps/engine/routing.py ================================================ """ Worker WebSocket 路由配置 """ from django.urls import path from .consumers import WorkerDeployConsumer websocket_urlpatterns = [ path('ws/workers/<int:worker_id>/deploy/', WorkerDeployConsumer.as_asgi()), ] ================================================ FILE: backend/apps/engine/scheduler.py ================================================ """ APScheduler 定时任务调度器 替代 Prefect Work Pool,用于触发定时任务。 实际任务执行通过 task_distributor 分发到各 Worker。 """ import logging from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.interval import IntervalTrigger from django.conf import settings logger = logging.getLogger(__name__) # 全局调度器实例 _scheduler: BackgroundScheduler | None = None def get_scheduler() -> BackgroundScheduler: """获取调度器实例""" global _scheduler if _scheduler is None: _scheduler = BackgroundScheduler( timezone=settings.TIME_ZONE, job_defaults={ 'coalesce': True, # 合并错过的任务 'max_instances': 1, # 同一任务最多同时运行1个实例 'misfire_grace_time': 60 * 5, # 错过5分钟内仍然执行 } ) return _scheduler def start_scheduler(): """启动调度器并注册所有定时任务""" scheduler = get_scheduler() if scheduler.running: logger.info("调度器已在运行") return # 注册定时任务 _register_scheduled_jobs(scheduler) # 启动调度器 scheduler.start() logger.info("✓ APScheduler 定时调度器已启动") def shutdown_scheduler(): """关闭调度器""" global _scheduler if _scheduler and _scheduler.running: _scheduler.shutdown(wait=False) logger.info("APScheduler 调度器已关闭") _scheduler = None def _register_scheduled_jobs(scheduler: BackgroundScheduler): """注册所有定时任务""" # 1. 定时扫描任务(检查并执行到期的定时扫描) scheduler.add_job( _trigger_scheduled_scans, trigger=IntervalTrigger(minutes=1), # 每分钟检查并触发到期任务 id='scheduled_scans', name='定时扫描任务', replace_existing=True, ) logger.info(" - 已注册: 定时扫描任务(每分钟)") # 2. 资产统计刷新(每小时) scheduler.add_job( _trigger_statistics_refresh, trigger=CronTrigger(minute=0), # 每小时整点 id='statistics_refresh', name='资产统计刷新', replace_existing=True, ) logger.info(" - 已注册: 资产统计刷新(每小时)") # 3. 扫描结果清理(每天凌晨3点) scheduler.add_job( _trigger_cleanup, trigger=CronTrigger(hour=3, minute=0), id='scan_cleanup', name='扫描结果清理', replace_existing=True, ) logger.info(" - 已注册: 扫描结果清理(每天 03:00)") # 注意:搜索物化视图刷新已迁移到 pg_ivm 增量维护,无需定时任务 def _trigger_scheduled_scans(): """触发到期的定时扫描任务""" try: from apps.scan.services.scheduled_scan_service import ScheduledScanService service = ScheduledScanService() triggered_count = service.trigger_due_scans() if triggered_count > 0: logger.info(f"定时扫描: 已触发 {triggered_count} 个任务") except Exception as e: logger.error(f"定时扫描任务执行失败: {e}", exc_info=True) def _trigger_statistics_refresh(): """触发资产统计刷新""" try: from apps.asset.services.statistics_service import AssetStatisticsService service = AssetStatisticsService() service.refresh_statistics() logger.info("资产统计刷新完成") except Exception as e: logger.error(f"资产统计刷新失败: {e}", exc_info=True) def _trigger_cleanup(): """触发扫描结果清理(分发到各 Worker)""" try: from apps.engine.services.task_distributor import TaskDistributor distributor = TaskDistributor() results = distributor.execute_cleanup_on_all_workers() logger.info(f"扫描清理任务已分发到 {len(results)} 个 Worker") except Exception as e: logger.error(f"扫描清理任务分发失败: {e}", exc_info=True) ================================================ FILE: backend/apps/engine/serializers/__init__.py ================================================ """ Engine Serializers """ from .worker_serializer import WorkerNodeSerializer from .engine_serializer import ScanEngineSerializer from .wordlist_serializer import WordlistSerializer from .nuclei_template_repo_serializer import NucleiTemplateRepoSerializer __all__ = [ "WorkerNodeSerializer", "ScanEngineSerializer", "WordlistSerializer", "NucleiTemplateRepoSerializer", ] ================================================ FILE: backend/apps/engine/serializers/engine_serializer.py ================================================ """ 扫描引擎序列化器 """ from rest_framework import serializers from apps.engine.models import ScanEngine class ScanEngineSerializer(serializers.ModelSerializer): """扫描引擎序列化器""" class Meta: model = ScanEngine fields = [ 'id', 'name', 'configuration', 'created_at', 'updated_at', ] read_only_fields = ['id', 'created_at', 'updated_at'] def to_representation(self, instance): """自定义序列化输出""" data = super().to_representation(instance) # 确保 configuration 字段存在且不为 null if data.get('configuration') is None: data['configuration'] = '' return data def validate_name(self, value): """验证引擎名称""" if not value.strip(): raise serializers.ValidationError("引擎名称不能为空") return value.strip() def validate_configuration(self, value): """验证 YAML 配置""" if value: # 可以在这里添加 YAML 格式验证 import yaml try: yaml.safe_load(value) except yaml.YAMLError as e: raise serializers.ValidationError(f"YAML 格式错误: {str(e)}") return value ================================================ FILE: backend/apps/engine/serializers/fingerprints/__init__.py ================================================ """指纹管理 Serializers 导出所有指纹相关的 Serializer 类 """ from .ehole import EholeFingerprintSerializer from .goby import GobyFingerprintSerializer from .wappalyzer import WappalyzerFingerprintSerializer from .fingers import FingersFingerprintSerializer from .fingerprinthub import FingerPrintHubFingerprintSerializer from .arl import ARLFingerprintSerializer __all__ = [ "EholeFingerprintSerializer", "GobyFingerprintSerializer", "WappalyzerFingerprintSerializer", "FingersFingerprintSerializer", "FingerPrintHubFingerprintSerializer", "ARLFingerprintSerializer", ] ================================================ FILE: backend/apps/engine/serializers/fingerprints/arl.py ================================================ """ARL 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import ARLFingerprint class ARLFingerprintSerializer(serializers.ModelSerializer): """ARL 指纹序列化器 字段映射: - name: 指纹名称 (必填, 唯一) - rule: 匹配规则表达式 (必填) """ class Meta: model = ARLFingerprint fields = ['id', 'name', 'rule', 'created_at'] read_only_fields = ['id', 'created_at'] def validate_name(self, value): """校验 name 字段""" if not value or not value.strip(): raise serializers.ValidationError("name 字段不能为空") return value.strip() def validate_rule(self, value): """校验 rule 字段""" if not value or not value.strip(): raise serializers.ValidationError("rule 字段不能为空") return value.strip() ================================================ FILE: backend/apps/engine/serializers/fingerprints/ehole.py ================================================ """EHole 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import EholeFingerprint class EholeFingerprintSerializer(serializers.ModelSerializer): """EHole 指纹序列化器""" class Meta: model = EholeFingerprint fields = ['id', 'cms', 'method', 'location', 'keyword', 'is_important', 'type', 'created_at'] read_only_fields = ['id', 'created_at'] def validate_cms(self, value): """校验 cms 字段""" if not value or not value.strip(): raise serializers.ValidationError("cms 字段不能为空") return value.strip() def validate_keyword(self, value): """校验 keyword 字段""" if not isinstance(value, list): raise serializers.ValidationError("keyword 必须是数组") return value ================================================ FILE: backend/apps/engine/serializers/fingerprints/fingerprinthub.py ================================================ """FingerPrintHub 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import FingerPrintHubFingerprint class FingerPrintHubFingerprintSerializer(serializers.ModelSerializer): """FingerPrintHub 指纹序列化器 字段映射: - fp_id: 指纹ID (必填, 唯一) - name: 指纹名称 (必填) - author: 作者 (可选) - tags: 标签字符串 (可选) - severity: 严重程度 (可选, 默认 'info') - metadata: 元数据 JSON (可选) - http: HTTP 匹配规则数组 (必填) - source_file: 来源文件 (可选) """ class Meta: model = FingerPrintHubFingerprint fields = ['id', 'fp_id', 'name', 'author', 'tags', 'severity', 'metadata', 'http', 'source_file', 'created_at'] read_only_fields = ['id', 'created_at'] def validate_fp_id(self, value): """校验 fp_id 字段""" if not value or not value.strip(): raise serializers.ValidationError("fp_id 字段不能为空") return value.strip() def validate_name(self, value): """校验 name 字段""" if not value or not value.strip(): raise serializers.ValidationError("name 字段不能为空") return value.strip() def validate_http(self, value): """校验 http 字段""" if not isinstance(value, list): raise serializers.ValidationError("http 必须是数组") return value def validate_metadata(self, value): """校验 metadata 字段""" if not isinstance(value, dict): raise serializers.ValidationError("metadata 必须是对象") return value ================================================ FILE: backend/apps/engine/serializers/fingerprints/fingers.py ================================================ """Fingers 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import FingersFingerprint class FingersFingerprintSerializer(serializers.ModelSerializer): """Fingers 指纹序列化器 字段映射: - name: 指纹名称 (必填, 唯一) - link: 相关链接 (可选) - rule: 匹配规则数组 (必填) - tag: 标签数组 (可选) - focus: 是否重点关注 (可选, 默认 False) - default_port: 默认端口数组 (可选) """ class Meta: model = FingersFingerprint fields = ['id', 'name', 'link', 'rule', 'tag', 'focus', 'default_port', 'created_at'] read_only_fields = ['id', 'created_at'] def validate_name(self, value): """校验 name 字段""" if not value or not value.strip(): raise serializers.ValidationError("name 字段不能为空") return value.strip() def validate_rule(self, value): """校验 rule 字段""" if not isinstance(value, list): raise serializers.ValidationError("rule 必须是数组") return value def validate_tag(self, value): """校验 tag 字段""" if not isinstance(value, list): raise serializers.ValidationError("tag 必须是数组") return value def validate_default_port(self, value): """校验 default_port 字段""" if not isinstance(value, list): raise serializers.ValidationError("default_port 必须是数组") return value ================================================ FILE: backend/apps/engine/serializers/fingerprints/goby.py ================================================ """Goby 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import GobyFingerprint class GobyFingerprintSerializer(serializers.ModelSerializer): """Goby 指纹序列化器""" class Meta: model = GobyFingerprint fields = ['id', 'name', 'logic', 'rule', 'created_at'] read_only_fields = ['id', 'created_at'] def validate_name(self, value): """校验 name 字段""" if not value or not value.strip(): raise serializers.ValidationError("name 字段不能为空") return value.strip() def validate_rule(self, value): """校验 rule 字段""" if not isinstance(value, list): raise serializers.ValidationError("rule 必须是数组") return value ================================================ FILE: backend/apps/engine/serializers/fingerprints/wappalyzer.py ================================================ """Wappalyzer 指纹 Serializer""" from rest_framework import serializers from apps.engine.models import WappalyzerFingerprint class WappalyzerFingerprintSerializer(serializers.ModelSerializer): """Wappalyzer 指纹序列化器""" class Meta: model = WappalyzerFingerprint fields = [ 'id', 'name', 'cats', 'cookies', 'headers', 'script_src', 'js', 'implies', 'meta', 'html', 'description', 'website', 'cpe', 'created_at' ] read_only_fields = ['id', 'created_at'] def validate_name(self, value): """校验 name 字段""" if not value or not value.strip(): raise serializers.ValidationError("name 字段不能为空") return value.strip() ================================================ FILE: backend/apps/engine/serializers/nuclei_template_repo_serializer.py ================================================ """Nuclei 模板仓库序列化器 用于 DRF ModelViewSet 的 CRUD 操作,将 NucleiTemplateRepo 模型序列化为 JSON。 字段说明: - id: 仓库 ID(只读,自动生成) - name: 仓库名称,用于前端展示 - repo_url: Git 仓库地址,如 https://github.com/projectdiscovery/nuclei-templates.git - local_path: 本地克隆路径(只读,由后端自动生成) - last_synced_at: 最后同步时间(只读) - created_at: 创建时间(只读) - updated_at: 更新时间(只读) """ from __future__ import annotations from rest_framework import serializers from apps.engine.models import NucleiTemplateRepo class NucleiTemplateRepoSerializer(serializers.ModelSerializer): """Nuclei 模板仓库序列化器 用于仓库的 CRUD API 响应。 """ class Meta: model = NucleiTemplateRepo fields = [ "id", # 仓库 ID(只读) "name", # 仓库名称 "repo_url", # Git 仓库地址 "local_path", # 本地克隆路径(只读) "commit_hash", # 最后同步的 commit hash(只读) "last_synced_at", # 最后同步时间(只读) "created_at", # 创建时间(只读) "updated_at", # 更新时间(只读) ] read_only_fields = [ "id", "local_path", # 由后端根据 name 自动生成 "commit_hash", # 由 refresh 操作更新 "last_synced_at", # 由 refresh 操作更新 "created_at", "updated_at", ] __all__ = ["NucleiTemplateRepoSerializer"] ================================================ FILE: backend/apps/engine/serializers/wordlist_serializer.py ================================================ """字典文件序列化器""" from rest_framework import serializers from apps.engine.models import Wordlist class WordlistSerializer(serializers.ModelSerializer): """字典文件序列化器""" class Meta: model = Wordlist fields = [ "id", "name", "description", "file_path", "file_size", "line_count", "file_hash", "created_at", "updated_at", ] read_only_fields = [ "id", "file_path", "file_size", "line_count", "file_hash", "created_at", "updated_at", ] ================================================ FILE: backend/apps/engine/serializers/worker_serializer.py ================================================ """ Worker 节点序列化器 """ from rest_framework import serializers from apps.engine.models import WorkerNode class WorkerNodeSerializer(serializers.ModelSerializer): """ Worker 节点序列化器 优化:通过 context['loads'] 传入批量查询的 Redis 数据,避免 N+1 查询 """ # 密码只写(不返回给前端) password = serializers.CharField(write_only=True, required=False, allow_blank=True) # 状态(数据库存储 + Redis 心跳补充判断) status = serializers.SerializerMethodField() # 负载数据(从 Redis 读取) info = serializers.SerializerMethodField() class Meta: model = WorkerNode fields = ['id', 'name', 'ip_address', 'ssh_port', 'username', 'status', 'is_local', 'info', 'created_at', 'updated_at', 'password'] read_only_fields = ['id', 'status', 'is_local', 'info', 'created_at', 'updated_at'] def _get_load_from_context(self, worker_id: int) -> dict | None: """从 context 获取预加载的负载数据""" loads = self.context.get('loads', {}) return loads.get(worker_id) def get_status(self, obj) -> str: """ 获取状态(前后端统一): - pending/deploying: 直接返回数据库值 - online/offline: 通过 Redis 心跳动态判断 """ # pending 和 deploying 直接返回 if obj.status in ('pending', 'deploying'): return obj.status # online/offline 通过 Redis 心跳判断 # 优先从 context 获取(批量查询) load = self._get_load_from_context(obj.id) if load is not None: return 'online' # 回退:单独查询 Redis from apps.engine.services.worker_load_service import worker_load_service if worker_load_service.is_online(obj.id): return 'online' return 'offline' def get_info(self, obj) -> dict | None: """获取负载数据 注意:返回的字典键名使用 camelCase,因为 djangorestframework_camel_case 只转换序列化器字段名,不会递归转换 SerializerMethodField 返回的嵌套字典 """ # 优先从 context 获取(批量查询) load = self._get_load_from_context(obj.id) if load is not None: return { 'cpuPercent': load.get('cpu', 0), 'memoryPercent': load.get('mem', 0), } # 回退:单独查询 Redis from apps.engine.services.worker_load_service import worker_load_service load = worker_load_service.get_load(obj.id) if load: return { 'cpuPercent': load.get('cpu', 0), 'memoryPercent': load.get('mem', 0), } return None def create(self, validated_data): """创建时保存密码""" return super().create(validated_data) def update(self, instance, validated_data): """更新时,如果密码为空则不更新密码""" password = validated_data.get('password', '') if not password: validated_data.pop('password', None) return super().update(instance, validated_data) ================================================ FILE: backend/apps/engine/services/__init__.py ================================================ """ Engine 服务层 """ from .engine_service import EngineService from .worker_service import WorkerService from .wordlist_service import WordlistService from .nuclei_template_repo_service import NucleiTemplateRepoService from .deploy_service import ( get_bootstrap_script, get_deploy_script, get_start_agent_script, get_uninstall_script, ) __all__ = [ "EngineService", "WorkerService", "WordlistService", "NucleiTemplateRepoService", "get_bootstrap_script", "get_deploy_script", "get_start_agent_script", "get_uninstall_script", ] ================================================ FILE: backend/apps/engine/services/deploy_service.py ================================================ """ 远程节点部署脚本服务 脚本文件位置:backend/scripts/worker-deploy/ - bootstrap.sh: 环境初始化(安装基础依赖) - install.sh: 安装 Docker + 拉取镜像 - uninstall.sh: 卸载脚本 - start-agent.sh: 启动 agent 容器 - agent.sh: 心跳上报(在容器内运行) 新架构说明: - 远程节点只需安装 Docker 和运行 agent - 扫描任务由主服务器通过 SSH docker run 执行 """ from pathlib import Path from django.conf import settings # 脚本目录 SCRIPTS_DIR = Path(__file__).parent.parent.parent.parent / "scripts" / "worker-deploy" def _read_script(filename: str) -> str: """读取脚本文件内容""" script_path = SCRIPTS_DIR / filename if script_path.exists(): return script_path.read_text() else: raise FileNotFoundError(f"脚本文件不存在: {script_path}") def get_bootstrap_script() -> str: """获取环境初始化脚本""" return _read_script("bootstrap.sh") def get_deploy_script() -> str: """获取安装脚本(安装 Docker + 拉取镜像)""" script = _read_script("install.sh") # 注入镜像版本配置(确保远程节点使用相同版本) docker_user = getattr(settings, 'DOCKER_USER', 'yyhuni') image_tag = settings.IMAGE_TAG # 必须有值,settings.py 启动时已校验 version_export = f'export DOCKER_USER="{docker_user}"\nexport IMAGE_TAG="{image_tag}"\n' # 在 set -e 后插入版本配置 script = script.replace('set -e\n', f'set -e\n\n{version_export}', 1) return script def get_uninstall_script() -> str: """获取卸载脚本""" return _read_script("uninstall.sh") def get_start_agent_script( heartbeat_api_url: str = None, worker_id: int = None ) -> str: """ 获取 agent 启动脚本 :param heartbeat_api_url: 心跳上报地址 :param worker_id: Worker ID """ script = _read_script("start-agent.sh") # 替换变量 script = script.replace("{{HEARTBEAT_API_URL}}", heartbeat_api_url or '') script = script.replace("{{WORKER_ID}}", str(worker_id) if worker_id else '') script = script.replace("{{WORKER_API_KEY}}", getattr(settings, 'WORKER_API_KEY', '')) # 注入镜像版本配置(确保远程节点使用相同版本) docker_user = getattr(settings, 'DOCKER_USER', 'yyhuni') image_tag = settings.IMAGE_TAG # 必须有值,settings.py 启动时已校验 version_export = f'export DOCKER_USER="{docker_user}"\nexport IMAGE_TAG="{image_tag}"\n' # 在 set -e 后插入版本配置 script = script.replace('set -e\n', f'set -e\n\n{version_export}', 1) return script ================================================ FILE: backend/apps/engine/services/engine_service.py ================================================ """ ScanEngine 业务逻辑服务层(Service) 负责扫描引擎相关的业务逻辑处理 """ import logging from ..models import ScanEngine from ..repositories import DjangoEngineRepository logger = logging.getLogger(__name__) class EngineService: """ScanEngine 业务逻辑服务""" def __init__(self): """初始化服务,注入 Repository 依赖""" self.repo = DjangoEngineRepository() def get_engine(self, engine_id: int) -> ScanEngine | None: """ 获取扫描引擎 Args: engine_id: 引擎 ID Returns: ScanEngine 对象或 None """ return self.repo.get_by_id(engine_id) def get_all_engines(self): """获取所有扫描引擎查询集""" return self.repo.get_all() __all__ = ['EngineService'] ================================================ FILE: backend/apps/engine/services/fingerprints/__init__.py ================================================ """指纹管理 Services 导出所有指纹相关的 Service 类 """ from .base import BaseFingerprintService from .ehole import EholeFingerprintService from .goby import GobyFingerprintService from .wappalyzer import WappalyzerFingerprintService from .fingers_service import FingersFingerprintService from .fingerprinthub_service import FingerPrintHubFingerprintService from .arl_service import ARLFingerprintService __all__ = [ "BaseFingerprintService", "EholeFingerprintService", "GobyFingerprintService", "WappalyzerFingerprintService", "FingersFingerprintService", "FingerPrintHubFingerprintService", "ARLFingerprintService", ] ================================================ FILE: backend/apps/engine/services/fingerprints/arl_service.py ================================================ """ARL 指纹管理 Service 实现 ARL 格式指纹的校验、转换和导出逻辑 支持 YAML 格式的导入导出 """ import logging import yaml from apps.engine.models import ARLFingerprint from .base import BaseFingerprintService logger = logging.getLogger(__name__) class ARLFingerprintService(BaseFingerprintService): """ARL 指纹管理服务(继承基类,实现 ARL 特定逻辑)""" model = ARLFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 ARL 指纹 校验规则: - name 字段必须存在且非空 - rule 字段必须存在且非空 Args: item: 单条指纹数据 Returns: bool: 是否有效 """ name = item.get('name', '') rule = item.get('rule', '') return bool(name and str(name).strip()) and bool(rule and str(rule).strip()) def to_model_data(self, item: dict) -> dict: """ 转换 ARL YAML 格式为 Model 字段 Args: item: 原始 ARL YAML 数据 Returns: dict: Model 字段数据 """ return { 'name': str(item.get('name', '')).strip(), 'rule': str(item.get('rule', '')).strip(), } def get_export_data(self) -> list: """ 获取导出数据(ARL 格式 - 数组,用于 YAML 导出) Returns: list: ARL 格式的数据(数组格式) [ {"name": "...", "rule": "..."}, ... ] """ fingerprints = self.model.objects.all() return [ { 'name': fp.name, 'rule': fp.rule, } for fp in fingerprints ] def export_to_yaml(self, output_path: str) -> int: """ 导出所有指纹到 YAML 文件 Args: output_path: 输出文件路径 Returns: int: 导出的指纹数量 """ data = self.get_export_data() with open(output_path, 'w', encoding='utf-8') as f: yaml.dump(data, f, allow_unicode=True, default_flow_style=False, sort_keys=False) count = len(data) logger.info("导出 ARL 指纹文件: %s, 数量: %d", output_path, count) return count def parse_yaml_import(self, yaml_content: str) -> list: """ 解析 YAML 格式的导入内容 Args: yaml_content: YAML 格式的字符串内容 Returns: list: 解析后的指纹数据列表 Raises: ValueError: 当 YAML 格式无效时 """ try: data = yaml.safe_load(yaml_content) if not isinstance(data, list): raise ValueError("ARL YAML 文件必须是数组格式") return data except yaml.YAMLError as e: raise ValueError(f"无效的 YAML 格式: {e}") ================================================ FILE: backend/apps/engine/services/fingerprints/base.py ================================================ """指纹管理基类 Service 提供通用的批量操作和缓存逻辑,供 EHole/Goby/Wappalyzer 等子类继承 """ import json import logging from typing import Any logger = logging.getLogger(__name__) class BaseFingerprintService: """指纹管理基类 Service,提供通用的批量操作和缓存逻辑""" model = None # 子类必须指定 BATCH_SIZE = 1000 # 每批处理数量 def validate_fingerprint(self, item: dict) -> bool: """ 校验单条指纹,子类必须实现 Args: item: 单条指纹数据 Returns: bool: 是否有效 """ raise NotImplementedError("子类必须实现 validate_fingerprint 方法") def validate_fingerprints(self, raw_data: list) -> tuple[list, list]: """ 批量校验指纹数据 Args: raw_data: 原始指纹数据列表 Returns: tuple: (valid_items, invalid_items) """ valid, invalid = [], [] for item in raw_data: if self.validate_fingerprint(item): valid.append(item) else: invalid.append(item) return valid, invalid def to_model_data(self, item: dict) -> dict: """ 转换为 Model 字段,子类必须实现 Args: item: 原始指纹数据 Returns: dict: Model 字段数据 """ raise NotImplementedError("子类必须实现 to_model_data 方法") def bulk_create(self, fingerprints: list) -> int: """ 批量创建指纹记录(已校验的数据) Args: fingerprints: 已校验的指纹数据列表 Returns: int: 成功创建数量 """ if not fingerprints: return 0 objects = [self.model(**self.to_model_data(item)) for item in fingerprints] created = self.model.objects.bulk_create(objects, ignore_conflicts=True) return len(created) def batch_create_fingerprints(self, raw_data: list) -> dict: """ 完整流程:分批校验 + 批量创建 Args: raw_data: 原始指纹数据列表 Returns: dict: {'created': int, 'failed': int} """ total_created = 0 total_failed = 0 for i in range(0, len(raw_data), self.BATCH_SIZE): batch = raw_data[i:i + self.BATCH_SIZE] valid, invalid = self.validate_fingerprints(batch) total_created += self.bulk_create(valid) total_failed += len(invalid) logger.info( "批量创建指纹完成: created=%d, failed=%d, total=%d", total_created, total_failed, len(raw_data) ) return {'created': total_created, 'failed': total_failed} def get_export_data(self) -> dict: """ 获取导出数据,子类必须实现 Returns: dict: 导出的 JSON 数据 """ raise NotImplementedError("子类必须实现 get_export_data 方法") def export_to_file(self, output_path: str) -> int: """ 导出所有指纹到 JSON 文件 Args: output_path: 输出文件路径 Returns: int: 导出的指纹数量 """ data = self.get_export_data() with open(output_path, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) count = len(data.get('fingerprint', [])) logger.info("导出指纹文件: %s, 数量: %d", output_path, count) return count def get_fingerprint_version(self) -> str: """ 获取指纹库版本标识(用于缓存校验) Returns: str: 版本标识,格式 "{count}_{latest_timestamp}" 版本变化场景: - 新增记录 → count 变化 - 删除记录 → count 变化 - 清空全部 → count 变为 0 """ count = self.model.objects.count() latest = self.model.objects.order_by('-created_at').first() latest_ts = int(latest.created_at.timestamp()) if latest else 0 return f"{count}_{latest_ts}" ================================================ FILE: backend/apps/engine/services/fingerprints/ehole.py ================================================ """EHole 指纹管理 Service 实现 EHole 格式指纹的校验、转换和导出逻辑 """ from apps.engine.models import EholeFingerprint from .base import BaseFingerprintService class EholeFingerprintService(BaseFingerprintService): """EHole 指纹管理服务(继承基类,实现 EHole 特定逻辑)""" model = EholeFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 EHole 指纹 校验规则: - cms 字段必须存在且非空 - keyword 字段必须是数组 Args: item: 单条指纹数据 Returns: bool: 是否有效 """ cms = item.get('cms', '') keyword = item.get('keyword') return bool(cms and str(cms).strip()) and isinstance(keyword, list) def to_model_data(self, item: dict) -> dict: """ 转换 EHole JSON 格式为 Model 字段 字段映射: - isImportant (JSON) → is_important (Model) Args: item: 原始 EHole JSON 数据 Returns: dict: Model 字段数据 """ return { 'cms': str(item.get('cms', '')).strip(), 'method': item.get('method', 'keyword'), 'location': item.get('location', 'body'), 'keyword': item.get('keyword', []), 'is_important': item.get('isImportant', False), 'type': item.get('type', '-'), } def get_export_data(self) -> dict: """ 获取导出数据(EHole JSON 格式) Returns: dict: EHole 格式的 JSON 数据 { "fingerprint": [ {"cms": "...", "method": "...", "location": "...", "keyword": [...], "isImportant": false, "type": "..."}, ... ], "version": "1000_1703836800" } """ fingerprints = self.model.objects.all() data = [] for fp in fingerprints: data.append({ 'cms': fp.cms, 'method': fp.method, 'location': fp.location, 'keyword': fp.keyword, 'isImportant': fp.is_important, # 转回 JSON 格式 'type': fp.type, }) return { 'fingerprint': data, 'version': self.get_fingerprint_version(), } ================================================ FILE: backend/apps/engine/services/fingerprints/fingerprinthub_service.py ================================================ """FingerPrintHub 指纹管理 Service 实现 FingerPrintHub 格式指纹的校验、转换和导出逻辑 """ from apps.engine.models import FingerPrintHubFingerprint from .base import BaseFingerprintService class FingerPrintHubFingerprintService(BaseFingerprintService): """FingerPrintHub 指纹管理服务(继承基类,实现 FingerPrintHub 特定逻辑)""" model = FingerPrintHubFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 FingerPrintHub 指纹 校验规则: - id 字段必须存在且非空 - info 字段必须存在且包含 name - http 字段必须是数组 Args: item: 单条指纹数据 Returns: bool: 是否有效 """ fp_id = item.get('id', '') info = item.get('info', {}) http = item.get('http') if not fp_id or not str(fp_id).strip(): return False if not isinstance(info, dict) or not info.get('name'): return False if not isinstance(http, list): return False return True def to_model_data(self, item: dict) -> dict: """ 转换 FingerPrintHub JSON 格式为 Model 字段 字段映射(嵌套结构转扁平): - id (JSON) → fp_id (Model) - info.name (JSON) → name (Model) - info.author (JSON) → author (Model) - info.tags (JSON) → tags (Model) - info.severity (JSON) → severity (Model) - info.metadata (JSON) → metadata (Model) - http (JSON) → http (Model) - _source_file (JSON) → source_file (Model) Args: item: 原始 FingerPrintHub JSON 数据 Returns: dict: Model 字段数据 """ info = item.get('info', {}) return { 'fp_id': str(item.get('id', '')).strip(), 'name': str(info.get('name', '')).strip(), 'author': info.get('author', ''), 'tags': info.get('tags', ''), 'severity': info.get('severity', 'info'), 'metadata': info.get('metadata', {}), 'http': item.get('http', []), 'source_file': item.get('_source_file', ''), } def get_export_data(self) -> list: """ 获取导出数据(FingerPrintHub JSON 格式 - 数组) Returns: list: FingerPrintHub 格式的 JSON 数据(数组格式) [ { "id": "...", "info": {"name": "...", "author": "...", "tags": "...", "severity": "...", "metadata": {...}}, "http": [...], "_source_file": "..." }, ... ] """ fingerprints = self.model.objects.all() data = [] for fp in fingerprints: item = { 'id': fp.fp_id, 'info': { 'name': fp.name, 'author': fp.author, 'tags': fp.tags, 'severity': fp.severity, 'metadata': fp.metadata, }, 'http': fp.http, } # 只有当 source_file 非空时才添加该字段 if fp.source_file: item['_source_file'] = fp.source_file data.append(item) return data ================================================ FILE: backend/apps/engine/services/fingerprints/fingers_service.py ================================================ """Fingers 指纹管理 Service 实现 Fingers 格式指纹的校验、转换和导出逻辑 """ from apps.engine.models import FingersFingerprint from .base import BaseFingerprintService class FingersFingerprintService(BaseFingerprintService): """Fingers 指纹管理服务(继承基类,实现 Fingers 特定逻辑)""" model = FingersFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 Fingers 指纹 校验规则: - name 字段必须存在且非空 - rule 字段必须是数组 Args: item: 单条指纹数据 Returns: bool: 是否有效 """ name = item.get('name', '') rule = item.get('rule') return bool(name and str(name).strip()) and isinstance(rule, list) def to_model_data(self, item: dict) -> dict: """ 转换 Fingers JSON 格式为 Model 字段 字段映射: - default_port (JSON) → default_port (Model) Args: item: 原始 Fingers JSON 数据 Returns: dict: Model 字段数据 """ return { 'name': str(item.get('name', '')).strip(), 'link': item.get('link', ''), 'rule': item.get('rule', []), 'tag': item.get('tag', []), 'focus': item.get('focus', False), 'default_port': item.get('default_port', []), } def get_export_data(self) -> list: """ 获取导出数据(Fingers JSON 格式 - 数组) Returns: list: Fingers 格式的 JSON 数据(数组格式) [ {"name": "...", "link": "...", "rule": [...], "tag": [...], "focus": false, "default_port": [...]}, ... ] """ fingerprints = self.model.objects.all() data = [] for fp in fingerprints: item = { 'name': fp.name, 'link': fp.link, 'rule': fp.rule, 'tag': fp.tag, } # 只有当 focus 为 True 时才添加该字段(保持与原始格式一致) if fp.focus: item['focus'] = fp.focus # 只有当 default_port 非空时才添加该字段 if fp.default_port: item['default_port'] = fp.default_port data.append(item) return data ================================================ FILE: backend/apps/engine/services/fingerprints/goby.py ================================================ """Goby 指纹管理 Service 实现 Goby 格式指纹的校验、转换和导出逻辑 """ from apps.engine.models import GobyFingerprint from .base import BaseFingerprintService class GobyFingerprintService(BaseFingerprintService): """Goby 指纹管理服务(继承基类,实现 Goby 特定逻辑)""" model = GobyFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 Goby 指纹 支持两种格式: 1. 标准格式: {"name": "...", "logic": "...", "rule": [...]} 2. JSONL 格式: {"product": "...", "rule": "..."} Args: item: 单条指纹数据 Returns: bool: 是否有效 """ # 标准格式:name + logic + rule(数组) name = item.get('name', '') if name and item.get('logic') is not None and isinstance(item.get('rule'), list): return bool(str(name).strip()) # JSONL 格式:product + rule(字符串) product = item.get('product', '') rule = item.get('rule', '') return bool(product and str(product).strip() and rule and str(rule).strip()) def to_model_data(self, item: dict) -> dict: """ 转换 Goby JSON 格式为 Model 字段 支持两种输入格式: 1. 标准格式: {"name": "...", "logic": "...", "rule": [...]} 2. JSONL 格式: {"product": "...", "rule": "..."} Args: item: 原始 Goby JSON 数据 Returns: dict: Model 字段数据 """ # 标准格式 if 'name' in item and isinstance(item.get('rule'), list): return { 'name': str(item.get('name', '')).strip(), 'logic': item.get('logic', ''), 'rule': item.get('rule', []), } # JSONL 格式:将 rule 字符串转为单元素数组 return { 'name': str(item.get('product', '')).strip(), 'logic': 'or', # JSONL 格式默认 or 逻辑 'rule': [item.get('rule', '')] if item.get('rule') else [], } def get_export_data(self) -> list: """ 获取导出数据(Goby JSON 格式 - 数组) Returns: list: Goby 格式的 JSON 数据(数组格式) [ {"name": "...", "logic": "...", "rule": [...]}, ... ] """ fingerprints = self.model.objects.all() return [ { 'name': fp.name, 'logic': fp.logic, 'rule': fp.rule, } for fp in fingerprints ] ================================================ FILE: backend/apps/engine/services/fingerprints/wappalyzer.py ================================================ """Wappalyzer 指纹管理 Service 实现 Wappalyzer 格式指纹的校验、转换和导出逻辑 """ from apps.engine.models import WappalyzerFingerprint from .base import BaseFingerprintService class WappalyzerFingerprintService(BaseFingerprintService): """Wappalyzer 指纹管理服务(继承基类,实现 Wappalyzer 特定逻辑)""" model = WappalyzerFingerprint def validate_fingerprint(self, item: dict) -> bool: """ 校验单条 Wappalyzer 指纹 校验规则: - name 字段必须存在且非空(从 apps 对象的 key 传入) Args: item: 单条指纹数据 Returns: bool: 是否有效 """ name = item.get('name', '') return bool(name and str(name).strip()) def to_model_data(self, item: dict) -> dict: """ 转换 Wappalyzer JSON 格式为 Model 字段 字段映射: - scriptSrc (JSON) → script_src (Model) Args: item: 原始 Wappalyzer JSON 数据 Returns: dict: Model 字段数据 """ return { 'name': str(item.get('name', '')).strip(), 'cats': item.get('cats', []), 'cookies': item.get('cookies', {}), 'headers': item.get('headers', {}), 'script_src': item.get('scriptSrc', []), # JSON: scriptSrc -> Model: script_src 'js': item.get('js', []), 'implies': item.get('implies', []), 'meta': item.get('meta', {}), 'html': item.get('html', []), 'description': item.get('description', ''), 'website': item.get('website', ''), 'cpe': item.get('cpe', ''), } def get_export_data(self) -> dict: """ 获取导出数据(Wappalyzer JSON 格式) Returns: dict: Wappalyzer 格式的 JSON 数据 { "apps": { "AppName": {"cats": [...], "cookies": {...}, ...}, ... } } """ fingerprints = self.model.objects.all() apps = {} for fp in fingerprints: app_data = {} if fp.cats: app_data['cats'] = fp.cats if fp.cookies: app_data['cookies'] = fp.cookies if fp.headers: app_data['headers'] = fp.headers if fp.script_src: app_data['scriptSrc'] = fp.script_src # Model: script_src -> JSON: scriptSrc if fp.js: app_data['js'] = fp.js if fp.implies: app_data['implies'] = fp.implies if fp.meta: app_data['meta'] = fp.meta if fp.html: app_data['html'] = fp.html if fp.description: app_data['description'] = fp.description if fp.website: app_data['website'] = fp.website if fp.cpe: app_data['cpe'] = fp.cpe apps[fp.name] = app_data return {'apps': apps} ================================================ FILE: backend/apps/engine/services/nuclei_template_repo_service.py ================================================ """Nuclei 模板仓库业务 Service 层 本模块封装 Nuclei 多仓库的核心业务逻辑: 1. Git 同步(refresh_repo) - 首次调用:git clone --depth 1 - 后续调用:git pull --ff-only - 自动更新 last_synced_at 和 local_path 2. 模板只读浏览 - get_template_tree: 获取目录树结构 - get_template_content: 获取单个模板文件内容 注意:仓库的 CRUD 操作由 DRF ModelViewSet 默认实现,不在 Service 层处理。 调用链路: View.refresh() → Service.refresh_repo() → subprocess(git) View.templates_tree() → Service.get_template_tree() → Repository.get_tree() View.templates_content() → Service.get_template_content() → Repository.get_file_content() 配置项(settings.py): NUCLEI_TEMPLATES_REPOS_BASE_DIR: 仓库本地存储根目录,默认 /opt/xingrin/nuclei-repos """ from __future__ import annotations import logging import shutil from pathlib import Path from typing import Any, Dict, List, Optional from django.conf import settings from django.core.exceptions import ValidationError from django.utils import timezone from apps.engine.repositories import NucleiTemplateRepository, TemplateFileRepository logger = logging.getLogger(__name__) class NucleiTemplateRepoService: """Nuclei 多仓库业务 Service 负责 Git 同步和模板只读浏览逻辑。 通过依赖注入 Repository,方便单元测试。 Attributes: repo: NucleiTemplateRepository 实例,用于 ORM 操作 """ def __init__(self, repository: NucleiTemplateRepository | None = None) -> None: """初始化 Service Args: repository: 可选,注入 NucleiTemplateRepository 实例(用于测试) """ self.repo = repository or NucleiTemplateRepository() # ==================== 内部辅助方法 ==================== def _get_repo_obj(self, repo_id: int): """获取仓库对象 Args: repo_id: 仓库 ID Returns: NucleiTemplateRepo 对象 Raises: ValidationError: 仓库不存在时抛出 """ obj = self.repo.get_by_id(repo_id) if not obj: raise ValidationError("仓库不存在") return obj def _get_base_dir(self) -> Path: """获取仓库本地存储根目录 从 settings.NUCLEI_TEMPLATES_REPOS_BASE_DIR 读取,默认 /opt/xingrin/nuclei-repos。 如果目录不存在会自动创建。 Returns: 根目录 Path 对象 """ base_dir = getattr(settings, "NUCLEI_TEMPLATES_REPOS_BASE_DIR", "/opt/xingrin/nuclei-repos") path = Path(base_dir).resolve() path.mkdir(parents=True, exist_ok=True) return path def remove_local_path_dir(self, repo_obj) -> None: """删除与仓库关联的本地目录(如果存在) 只会删除位于 NUCLEI_TEMPLATES_REPOS_BASE_DIR 下的目录,避免误删其它路径。 Args: repo_obj: NucleiTemplateRepo 实例 """ raw = (getattr(repo_obj, "local_path", "") or "").strip() if not raw: return base_dir = self._get_base_dir() path = Path(raw).expanduser().resolve() # 仅允许删除 base_dir 下的子目录 try: path.relative_to(base_dir) except ValueError: return if not path.exists() or not path.is_dir(): return try: shutil.rmtree(path) except OSError: # 删除失败时记录日志但不阻塞主流程 logger.warning("删除 nuclei 本地目录失败: %s", path, exc_info=True) def ensure_local_path(self, repo_obj) -> Path: """确保仓库的本地路径存在并返回 Path 规则: - 如果 repo.local_path 已有值: - 展开 ~ 并 resolve() 为绝对路径 - 如果尚未设置: - 使用 baseDir/nameSlug 生成目录,例如: /opt/xingrin/nuclei-repos/di-san-fang-mo-ban - 如果 name 不可 slugify,则退化为 repo-<id> 任何情况下都会保证目标目录已创建。 Args: repo_obj: NucleiTemplateRepo 实例 Returns: 本地目录的绝对 Path """ from django.utils.text import slugify # 已有 local_path,直接规范化为绝对路径 if getattr(repo_obj, "local_path", None): path = Path(repo_obj.local_path).expanduser().resolve() else: base_dir = self._get_base_dir() # 根据仓库名称生成 slug,避免中文/空格等问题 raw_name = (repo_obj.name or "").strip() slug = slugify(raw_name) if raw_name else "" if not slug: slug = f"repo-{repo_obj.id}" path = (base_dir / slug).resolve() repo_obj.local_path = str(path) repo_obj.save(update_fields=["local_path"]) path.mkdir(parents=True, exist_ok=True) return path # ==================== Git 同步 ==================== def refresh_repo(self, repo_id: int) -> Dict[str, Any]: """同步仓库(Git clone 或 pull) 根据 local_path 是否存在 .git 目录判断: - 不存在:执行 git clone --depth 1(浅克隆,节省空间) - 存在:执行 git pull --ff-only(快进合并) 同步成功后会更新数据库中的 last_synced_at 和 local_path。 Args: repo_id: 仓库 ID Returns: { "repoId": 1, "action": "clone" | "pull", "localPath": "/opt/xingrin/nuclei-repos/my-templates", "stdout": "...", "stderr": "..." } Raises: ValidationError: 仓库不存在 RuntimeError: Git 命令执行失败 """ import subprocess obj = self._get_repo_obj(repo_id) # 确保本地路径已生成并为绝对路径 local_path = self.ensure_local_path(obj) git_dir = local_path / ".git" cmd: List[str] action: str # 直接使用原始 URL(不再使用 Git 加速) repo_url = obj.repo_url # 判断是 clone 还是 pull if git_dir.is_dir(): # 检查远程地址是否变化 current_remote = subprocess.run( ["git", "-C", str(local_path), "remote", "get-url", "origin"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) current_url = current_remote.stdout.strip() if current_remote.returncode == 0 else "" # 检查是否需要重新 clone if current_url != repo_url: # 远程地址变化,删除旧目录重新 clone logger.info("nuclei 模板仓库 %s 远程地址变化,重新 clone: %s -> %s", obj.id, current_url, repo_url) shutil.rmtree(local_path) local_path.mkdir(parents=True, exist_ok=True) cmd = ["git", "clone", "--depth", "1", repo_url, str(local_path)] action = "clone" else: # 已有仓库且地址未变,执行 pull cmd = ["git", "-C", str(local_path), "pull", "--ff-only"] action = "pull" else: # 新仓库,执行 clone if local_path.exists() and not local_path.is_dir(): raise RuntimeError(f"本地路径已存在且不是目录: {local_path}") # --depth 1 浅克隆,只获取最新提交,节省空间和时间 cmd = ["git", "clone", "--depth", "1", repo_url, str(local_path)] action = "clone" # 执行 Git 命令 result = subprocess.run( cmd, check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) # 检查执行结果 if result.returncode != 0: logger.warning("nuclei 模板仓库 %s git %s 失败: %s", obj.id, action, result.stderr.strip()) raise RuntimeError("Git 同步失败") # 获取当前 commit hash commit_result = subprocess.run( ["git", "-C", str(local_path), "rev-parse", "HEAD"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) commit_hash = commit_result.stdout.strip() if commit_result.returncode == 0 else "" # 同步成功,更新数据库(包含 commit_hash) obj.last_synced_at = timezone.now() obj.local_path = str(local_path) obj.commit_hash = commit_hash obj.save(update_fields=["last_synced_at", "local_path", "commit_hash"]) logger.info( "nuclei 模板仓库 %s git %s 成功, commit=%s", obj.id, action, commit_hash[:8] if commit_hash else "N/A" ) return { "repoId": obj.id, "action": action, "localPath": str(local_path), "commitHash": commit_hash, "stdout": result.stdout, "stderr": result.stderr, } # ==================== 模板树与内容(只读) ==================== def _get_fs_repo(self, repo_id: int) -> TemplateFileRepository: """获取文件系统 Repository 实例 Args: repo_id: 仓库 ID Returns: TemplateFileRepository 实例 Raises: ValidationError: 仓库不存在 """ obj = self._get_repo_obj(repo_id) # 确保本地路径已生成并为绝对路径 root = self.ensure_local_path(obj) # 传入绝对路径给 Repository return TemplateFileRepository(root=root) def get_template_tree(self, repo_id: int) -> List[Dict[str, Any]]: """获取仓库的模板目录树 Args: repo_id: 仓库 ID Returns: 目录树结构,详见 TemplateFileRepository.get_tree() """ fs_repo = self._get_fs_repo(repo_id) return fs_repo.get_tree() def get_template_content(self, repo_id: int, rel_path: str) -> Optional[Dict[str, Any]]: """获取单个模板文件内容 Args: repo_id: 仓库 ID rel_path: 相对路径,如 "http/cves/CVE-2021-1234.yaml" Returns: 文件内容,详见 TemplateFileRepository.get_file_content() 文件不存在或读取失败返回 None """ fs_repo = self._get_fs_repo(repo_id) return fs_repo.get_file_content(rel_path) __all__ = ["NucleiTemplateRepoService"] ================================================ FILE: backend/apps/engine/services/task_distributor.py ================================================ """ 负载感知任务分发器 根据 Worker 负载动态分发任务,支持本地和远程 Worker。 核心逻辑: 1. 查询所有在线 Worker 的负载(从心跳数据) 2. 选择负载最低的 Worker(可能是本地或远程) 3. 本地 Worker:直接执行 docker run 4. 远程 Worker:通过 SSH 执行 docker run 5. 任务执行完自动销毁容器(--rm) 镜像版本管理: - 版本锁定:使用 settings.IMAGE_TAG 确保 server 和 worker 版本一致 - 预拉取策略:安装时预拉取镜像,执行时使用 --pull=missing - 本地开发:可通过 TASK_EXECUTOR_IMAGE 环境变量指向本地镜像 环境变量注入: - Worker 容器不使用 env_file,通过 docker run -e 动态注入 - 只注入 SERVER_URL,容器启动后从配置中心获取完整配置 - 本地 Worker:SERVER_URL = http://server:{port}(Docker 内部网络) - 远程 Worker:SERVER_URL = http://{public_host}:{port}(公网地址) 任务启动流程: 1. Server 调用 execute_scan_flow() 等方法提交任务 2. select_best_worker() 从 Redis 读取心跳数据,选择负载最低的节点 3. _build_docker_command() 构建完整的 docker run 命令: - 设置网络(本地加入 Docker 网络,远程不指定) - 注入环境变量(-e SERVER_URL=...) - 挂载结果和日志目录(-v) - 指定执行脚本(python -m apps.scan.scripts.xxx) 4. _execute_docker_command() 执行命令: - 本地:subprocess.run() 直接执行 - 远程:paramiko SSH 执行 5. docker run -d 立即返回容器 ID,任务在后台执行 特点: - 负载感知:任务优先分发到最空闲的机器 - 统一调度:本地和远程 Worker 使用相同的选择逻辑 - 资源隔离:每个任务独立容器 - 按需创建:空闲时零占用 - 版本一致:所有节点使用相同版本的 worker 镜像 """ import logging import time from typing import Optional, Dict, Any import paramiko from django.conf import settings from apps.engine.models import WorkerNode logger = logging.getLogger(__name__) class TaskDistributor: """ 负载感知任务分发器 根据 Worker 负载自动选择最优节点执行任务。 - 本地 Worker (is_local=True):直接执行 docker 命令 - 远程 Worker (is_local=False):通过 SSH 执行 docker 命令 负载均衡策略: - 心跳间隔:3 秒(Agent 上报到 Redis) - 任务间隔:6 秒(确保心跳已更新) - 高负载阈值:85%(CPU 或内存超过则跳过) - 在线判断:Redis TTL(15秒过期视为离线) """ # 上次任务提交时间(类级别,所有实例共享) _last_submit_time: float = 0 def __init__(self): self.docker_image = settings.TASK_EXECUTOR_IMAGE if not self.docker_image: raise ValueError("TASK_EXECUTOR_IMAGE 未配置,请确保 IMAGE_TAG 环境变量已设置") # 统一使用 /opt/xingrin 下的路径 self.logs_mount = "/opt/xingrin/logs" self.submit_interval = getattr(settings, 'TASK_SUBMIT_INTERVAL', 5) def get_online_workers(self) -> list[WorkerNode]: """ 获取所有在线的 Worker 判断条件: - status in ('online', 'offline') 表示已部署 - Redis 中有心跳数据(TTL 未过期) """ from apps.engine.services.worker_load_service import worker_load_service # 1. 获取所有已部署的节点(online/offline 表示已部署) workers = WorkerNode.objects.filter(status__in=['online', 'offline']) # 2. 过滤出 Redis 中有心跳数据的(在线) online_workers = [] for worker in workers: if worker_load_service.is_online(worker.id): online_workers.append(worker) return online_workers def select_best_worker(self) -> Optional[WorkerNode]: """ 选择负载最低的在线 Worker 选择策略: - 从 Redis 读取实时负载数据 - CPU 权重 70%,内存权重 30% - 排除 CPU > 85% 或 内存 > 85% 的机器 Returns: 最优 Worker,如果没有可用的返回 None """ from apps.engine.services.worker_load_service import worker_load_service workers = self.get_online_workers() if not workers: logger.warning("没有可用的在线 Worker") return None # 从 Redis 批量获取负载数据 worker_ids = [w.id for w in workers] loads = worker_load_service.get_all_loads(worker_ids) # 计算每个 Worker 的负载分数 scored_workers = [] high_load_workers = [] # 高负载 Worker(降级备选) for worker in workers: # 从 Redis 获取负载数据 load = loads.get(worker.id) if not load: # Redis 无数据,跳过该节点(不应该发生,因为 get_online_workers 已过滤) logger.warning(f"Worker {worker.name} 无负载数据,跳过") continue cpu = load.get('cpu', 0) mem = load.get('mem', 0) # 加权分数(越低越好) score = cpu * 0.7 + mem * 0.3 # 区分正常和高负载(阈值降到 85%,更保守) if cpu > 85 or mem > 85: high_load_workers.append((worker, score, cpu, mem)) logger.debug( "高负载 Worker: %s (CPU: %.1f%%, MEM: %.1f%%)", worker.name, cpu, mem ) else: scored_workers.append((worker, score, cpu, mem)) # 降级策略:如果没有正常负载的,循环等待后重新检测 if not scored_workers: if high_load_workers: # 高负载等待参数(默认每 60 秒检测一次,最多 10 次) high_load_wait = getattr(settings, 'HIGH_LOAD_WAIT_SECONDS', 60) high_load_max_retries = getattr(settings, 'HIGH_LOAD_MAX_RETRIES', 10) # 开始等待前发送高负载通知 high_load_workers.sort(key=lambda x: x[1]) _, _, first_cpu, first_mem = high_load_workers[0] from apps.common.signals import all_workers_high_load all_workers_high_load.send( sender=self.__class__, worker_name="所有节点", cpu=first_cpu, mem=first_mem ) for retry in range(high_load_max_retries): logger.warning( "所有 Worker 高负载,等待 %d 秒后重试... (%d/%d)", high_load_wait, retry + 1, high_load_max_retries ) time.sleep(high_load_wait) # 重新获取负载数据 loads = worker_load_service.get_all_loads(worker_ids) # 重新评估 scored_workers = [] high_load_workers = [] for worker in workers: load = loads.get(worker.id) if not load: continue cpu = load.get('cpu', 0) mem = load.get('mem', 0) score = cpu * 0.7 + mem * 0.3 if cpu > 85 or mem > 85: high_load_workers.append((worker, score, cpu, mem)) else: scored_workers.append((worker, score, cpu, mem)) # 如果有正常负载的 Worker,跳出循环 if scored_workers: logger.info("检测到正常负载 Worker,结束等待") break # 超时或仍然高负载,选择负载最低的 if not scored_workers and high_load_workers: high_load_workers.sort(key=lambda x: x[1]) best_worker, _, cpu, mem = high_load_workers[0] logger.warning( "等待超时,强制分发到高负载 Worker: %s (CPU: %.1f%%, MEM: %.1f%%)", best_worker.name, cpu, mem ) return best_worker return best_worker else: logger.warning("没有可用的 Worker") return None # 选择分数最低的 scored_workers.sort(key=lambda x: x[1]) best_worker, score, cpu, mem = scored_workers[0] logger.info( "选择 Worker: %s (CPU: %.1f%%, MEM: %.1f%%, Score: %.1f)", best_worker.name, cpu, mem, score ) return best_worker def _wait_for_submit_interval(self): """ 等待任务提交间隔(后台线程中执行,不阻塞 API) 确保连续任务提交之间有足够的间隔,让心跳有时间更新负载数据。 如果距上次提交已超过间隔,则不等待。 """ if TaskDistributor._last_submit_time > 0: elapsed = time.time() - TaskDistributor._last_submit_time if elapsed < self.submit_interval: time.sleep(self.submit_interval - elapsed) TaskDistributor._last_submit_time = time.time() def _build_docker_command( self, worker: WorkerNode, script_module: str, script_args: Dict[str, Any], ) -> str: """ 构建 docker run 命令 容器只需要 SERVER_URL,启动后从配置中心获取完整配置。 Args: worker: 目标 Worker(用于区分本地/远程网络) script_module: 脚本模块路径(如 apps.scan.scripts.run_initiate_scan) script_args: 脚本参数(会转换为命令行参数) Returns: 完整的 docker run 命令 """ import shlex # 根据 Worker 类型确定网络和 Server 地址 if worker.is_local: # 本地:加入 Docker 网络,使用内部服务名 network_arg = f"--network {settings.DOCKER_NETWORK_NAME}" server_url = f"http://server:{settings.SERVER_PORT}" else: # 远程:通过 Nginx 反向代理访问(HTTPS,不直连 8888 端口) network_arg = "" server_url = f"https://{settings.PUBLIC_HOST}:{settings.PUBLIC_PORT}" # 挂载路径(统一挂载 /opt/xingrin,扫描工具在 /opt/xingrin-tools/bin 不受影响) host_xingrin_dir = "/opt/xingrin" # 环境变量:SERVER_URL + IS_LOCAL,其他配置容器启动时从配置中心获取 # IS_LOCAL 用于 Worker 向配置中心声明身份,决定返回的数据库地址 # Prefect 本地模式配置:启用 ephemeral server(本地临时服务器) is_local_str = "true" if worker.is_local else "false" env_vars = [ f"-e SERVER_URL={shlex.quote(server_url)}", f"-e IS_LOCAL={is_local_str}", f"-e WORKER_API_KEY={shlex.quote(settings.WORKER_API_KEY)}", # Worker API 认证密钥 "-e PREFECT_HOME=/tmp/.prefect", # 设置 Prefect 数据目录到可写位置 "-e PREFECT_SERVER_EPHEMERAL_ENABLED=true", # 启用 ephemeral server(本地临时服务器) "-e PREFECT_SERVER_EPHEMERAL_STARTUP_TIMEOUT_SECONDS=120", # 增加启动超时时间 "-e PREFECT_SERVER_DATABASE_CONNECTION_URL=sqlite+aiosqlite:////tmp/.prefect/prefect.db", # 使用 /tmp 下的 SQLite "-e PREFECT_LOGGING_LEVEL=WARNING", # 日志级别(减少 DEBUG 噪音) ] # 挂载卷(统一挂载整个 /opt/xingrin 目录) volumes = [ f"-v {host_xingrin_dir}:{host_xingrin_dir}", ] # 构建命令行参数 # 使用 shlex.quote 处理特殊字符,确保参数在 shell 中正确解析 args_str = " ".join([f"--{k}={shlex.quote(str(v))}" for k, v in script_args.items()]) # 日志文件路径(容器内),保留最近 10000 行 log_file = f"{self.logs_mount}/container_{script_module.split('.')[-1]}.log" # 构建内部命令(日志轮转 + 执行脚本) inner_cmd = f'tail -n 10000 {log_file} > {log_file}.tmp 2>/dev/null; mv {log_file}.tmp {log_file} 2>/dev/null; python -m {script_module} {args_str} >> {log_file} 2>&1' # 完整命令 # 镜像拉取策略:--pull=missing # - 本地 Worker:install.sh 已预拉取镜像,直接使用本地版本 # - 远程 Worker:deploy 时已预拉取镜像,直接使用本地版本 # - 避免每次任务都检查 Docker Hub,提升性能和稳定性 # OOM 优先级:--oom-score-adj=1000 让 Worker 在内存不足时优先被杀 # - 范围 -1000 到 1000,值越大越容易被 OOM Killer 选中 # - 保护 server/nginx/frontend 等核心服务,确保 Web 界面可用 cmd = f'''docker run --rm -d --pull=missing {network_arg} \\ --oom-score-adj=1000 \\ {' '.join(env_vars)} \\ {' '.join(volumes)} \\ {self.docker_image} \\ sh -c "{inner_cmd}"''' return cmd def _execute_docker_command( self, worker: WorkerNode, docker_cmd: str, ) -> tuple[bool, str]: """ 在 Worker 上执行 docker run 命令 docker run -d 会立即返回容器 ID,无需等待任务完成。 Args: worker: 目标 Worker docker_cmd: docker run 命令 Returns: (success, container_id) 元组 """ logger.info("准备执行 Docker 命令 - Worker: %s, Local: %s", worker.name, worker.is_local) logger.info("Docker 命令: %s", docker_cmd[:200] + '...' if len(docker_cmd) > 200 else docker_cmd) if worker.is_local: return self._execute_local_docker(docker_cmd) else: return self._execute_ssh_docker(worker, docker_cmd) def _execute_local_docker( self, docker_cmd: str, ) -> tuple[bool, str]: """ 在本地执行 docker run 命令 docker run -d 立即返回容器 ID。 """ import subprocess logger.info("开始执行本地 Docker 命令...") try: result = subprocess.run( docker_cmd, shell=True, capture_output=True, text=True, ) if result.returncode != 0: logger.error( "本地 Docker 执行失败 - Exit: %d, Stderr: %s, Stdout: %s", result.returncode, result.stderr[:500], result.stdout[:500] ) return False, result.stderr container_id = result.stdout.strip() logger.info("本地 Docker 执行成功 - Container ID: %s", container_id[:12] if container_id else 'N/A') return True, container_id except Exception as e: logger.error("本地 Docker 执行异常: %s", e, exc_info=True) return False, f"执行异常: {e}" def _execute_ssh_docker( self, worker: WorkerNode, docker_cmd: str, ) -> tuple[bool, str]: """ 在远程 Worker 上通过 SSH 执行 docker run 命令 docker run -d 立即返回容器 ID,无需长时间等待。 Args: worker: 目标 Worker docker_cmd: docker run 命令 Returns: (success, container_id) 元组 """ ssh = None logger.info("开始 SSH Docker 执行 - Worker: %s (%s:%d)", worker.name, worker.ip_address, worker.ssh_port) try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接(SSH 连接超时 10 秒足够) ssh.connect( hostname=worker.ip_address, port=worker.ssh_port, username=worker.username, password=worker.password if worker.password else None, timeout=10, ) logger.debug("SSH 连接成功 - Worker: %s", worker.name) # 执行 docker run(-d 模式立即返回) stdin, stdout, stderr = ssh.exec_command(docker_cmd) exit_code = stdout.channel.recv_exit_status() output = stdout.read().decode().strip() error = stderr.read().decode().strip() if exit_code != 0: logger.error( "SSH Docker 执行失败 - Worker: %s, Exit: %d, Stderr: %s, Stdout: %s", worker.name, exit_code, error[:500], output[:500] ) return False, error logger.info("SSH Docker 执行成功 - Worker: %s, Container ID: %s", worker.name, output[:12] if output else 'N/A') return True, output except paramiko.AuthenticationException as e: logger.error("SSH 认证失败 - Worker: %s, Error: %s", worker.name, e) return False, f"认证失败: {e}" except paramiko.SSHException as e: logger.error("SSH 连接错误 - Worker: %s, Error: %s", worker.name, e) return False, f"SSH 错误: {e}" except Exception as e: logger.error("SSH Docker 执行异常 - Worker: %s, Error: %s", worker.name, e) return False, f"执行异常: {e}" finally: if ssh: ssh.close() def execute_scan_flow( self, scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, engine_name: str, scheduled_scan_name: str | None = None, ) -> tuple[bool, str, Optional[str], Optional[int]]: """ 在远程或本地 Worker 上执行扫描 Flow Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作目录 engine_name: 引擎名称 scheduled_scan_name: 定时扫描任务名称(可选) Returns: (success, message, container_id, worker_id) 元组 Note: engine_config 由 Flow 内部通过 scan_id 查询数据库获取 """ logger.info("="*60) logger.info("execute_scan_flow 开始") logger.info(" scan_id: %s", scan_id) logger.info(" target_name: %s", target_name) logger.info(" target_id: %s", target_id) logger.info(" scan_workspace_dir: %s", scan_workspace_dir) logger.info(" engine_name: %s", engine_name) logger.info(" docker_image: %s", self.docker_image) logger.info("="*60) # 1. 等待提交间隔(后台线程执行,不阻塞 API) logger.info("等待提交间隔...") self._wait_for_submit_interval() logger.info("提交间隔等待完成") # 2. 选择最佳 Worker worker = self.select_best_worker() if not worker: return False, "没有可用的 Worker", None, None # 3. 构建 docker run 命令 script_args = { 'scan_id': scan_id, 'target_name': target_name, 'target_id': target_id, 'scan_workspace_dir': scan_workspace_dir, 'engine_name': engine_name, } if scheduled_scan_name: script_args['scheduled_scan_name'] = scheduled_scan_name docker_cmd = self._build_docker_command( worker=worker, script_module='apps.scan.scripts.run_initiate_scan', script_args=script_args, ) logger.info( "提交扫描任务到 Worker: %s - Scan ID: %d, Target: %s", worker.name, scan_id, target_name ) # 4. 执行 docker run(本地直接执行,远程通过 SSH) success, output = self._execute_docker_command(worker, docker_cmd) if success: container_id = output[:12] if output else None logger.info( "扫描任务已提交 - Scan ID: %d, Worker: %s, Container: %s", scan_id, worker.name, container_id ) return True, f"任务已提交到 {worker.name}", container_id, worker.id else: logger.error( "扫描任务提交失败 - Scan ID: %d, Worker: %s, Error: %s", scan_id, worker.name, output ) return False, output, None, None def execute_cleanup_on_all_workers( self, retention_days: int = 7, ) -> list[dict]: """ 在所有 Worker 上执行清理任务 Args: retention_days: 保留天数,默认7天 Returns: 各 Worker 的执行结果列表 """ results = [] # 获取所有在线的 Worker workers = self.get_online_workers() if not workers: logger.warning("没有可用的 Worker 执行清理任务") return results logger.info(f"开始在 {len(workers)} 个 Worker 上执行清理任务") for worker in workers: try: # 构建 docker run 命令(清理过期扫描结果目录) script_args = { 'results_dir': '/opt/xingrin/results', 'retention_days': retention_days, } docker_cmd = self._build_docker_command( worker=worker, script_module='apps.scan.scripts.run_cleanup', script_args=script_args, ) # 执行清理命令 success, output = self._execute_docker_command(worker, docker_cmd) results.append({ 'worker_id': worker.id, 'worker_name': worker.name, 'success': success, 'output': output[:500] if output else None, }) if success: logger.info(f"✓ Worker {worker.name} 清理任务已启动") else: logger.warning(f"✗ Worker {worker.name} 清理任务启动失败: {output}") except Exception as e: logger.error(f"Worker {worker.name} 清理任务执行异常: {e}") results.append({ 'worker_id': worker.id, 'worker_name': worker.name, 'success': False, 'error': str(e), }) return results def execute_delete_task( self, task_type: str, ids: list[int], ) -> tuple[bool, str, str | None]: """ 分发删除任务到最优 Worker 统一入口,根据 task_type 选择对应的删除脚本执行。 Args: task_type: 任务类型 ('targets', 'organizations', 'scans') ids: 要删除的 ID 列表 Returns: (success, message, container_id) 元组 """ import json # 映射任务类型到脚本 script_map = { 'targets': 'apps.targets.scripts.run_delete_targets', 'organizations': 'apps.targets.scripts.run_delete_organizations', 'scans': 'apps.scan.scripts.run_delete_scans', } # 映射任务类型到参数名 param_map = { 'targets': 'target_ids', 'organizations': 'organization_ids', 'scans': 'scan_ids', } if task_type not in script_map: return False, f"不支持的任务类型: {task_type}", None # 选择最佳 Worker worker = self.select_best_worker() if not worker: return False, "没有可用的 Worker", None # 构建参数(ID 列表需要 JSON 序列化) script_args = { param_map[task_type]: json.dumps(ids), } # 构建 docker run 命令 docker_cmd = self._build_docker_command( worker=worker, script_module=script_map[task_type], script_args=script_args, ) logger.info( "分发删除任务 - 类型: %s, 数量: %d, Worker: %s", task_type, len(ids), worker.name ) # 执行命令 success, output = self._execute_docker_command(worker, docker_cmd) if success: container_id = output.strip() if output else None logger.info( "✓ 删除任务已分发 - 类型: %s, Container: %s", task_type, container_id ) return True, f"任务已提交到 {worker.name}", container_id else: logger.error( "✗ 删除任务分发失败 - 类型: %s, Error: %s", task_type, output ) return False, output, None # 单例 _distributor: Optional[TaskDistributor] = None def get_task_distributor() -> TaskDistributor: """获取任务分发器单例""" global _distributor if _distributor is None: _distributor = TaskDistributor() return _distributor ================================================ FILE: backend/apps/engine/services/wordlist_service.py ================================================ """Wordlist 业务逻辑服务层(Service) 负责字典文件相关的业务逻辑处理 """ import hashlib import logging import os import time from typing import Optional from django.conf import settings from django.core.exceptions import ValidationError from django.core.files.uploadedfile import UploadedFile from apps.common.utils import safe_calc_file_sha256 from apps.engine.models import Wordlist from apps.engine.repositories import DjangoWordlistRepository logger = logging.getLogger(__name__) class WordlistService: """字典文件业务逻辑服务""" def __init__(self) -> None: """初始化服务,注入 Repository 依赖""" self.repo = DjangoWordlistRepository() def get_queryset(self): """获取字典列表查询集""" return self.repo.get_queryset() def get_wordlist(self, wordlist_id: int) -> Optional[Wordlist]: """根据 ID 获取字典""" return self.repo.get_by_id(wordlist_id) def get_wordlist_by_name(self, name: str) -> Optional[Wordlist]: name = (name or "").strip() if not name: return None return self.repo.get_by_name(name) def create_wordlist( self, name: str, description: str, uploaded_file: UploadedFile, ) -> Wordlist: """创建字典文件记录并保存物理文件""" name = (name or "").strip() if not name: raise ValidationError("字典名称不能为空") if self._exists_by_name(name): raise ValidationError("已存在同名字典") base_dir = getattr(settings, "WORDLISTS_BASE_PATH", "/opt/xingrin/wordlists") storage_dir = base_dir os.makedirs(storage_dir, exist_ok=True) # 按原始文件名保存(做最小清洗),同名上传时覆盖旧文件 original_name = os.path.basename(uploaded_file.name or "wordlist.txt") # 仅清理路径分隔符,保留空格等字符,避免目录穿越 safe_name = original_name.replace("/", "_").replace("\\", "_") or "wordlist.txt" # 如果没有扩展名,补一个 .txt,方便识别 base, ext = os.path.splitext(safe_name) if not ext: safe_name = f"{base}.txt" full_path = os.path.join(storage_dir, safe_name) # 边写边算 hash hasher = hashlib.sha256() with open(full_path, "wb+") as dest: for chunk in uploaded_file.chunks(): dest.write(chunk) hasher.update(chunk) file_hash = hasher.hexdigest() try: file_size = os.path.getsize(full_path) except OSError: file_size = 0 line_count = 0 try: with open(full_path, "rb") as f: for _ in f: line_count += 1 except OSError: logger.warning("统计字典行数失败: %s", full_path) wordlist = self.repo.create( name=name, description=description or "", file_path=full_path, file_size=file_size, line_count=line_count, file_hash=file_hash, ) logger.info( "创建字典: id=%s, name=%s, size=%s, lines=%s, hash=%s", wordlist.id, wordlist.name, wordlist.file_size, wordlist.line_count, wordlist.file_hash[:16] + "..." if wordlist.file_hash else "N/A", ) return wordlist def delete_wordlist(self, wordlist_id: int) -> bool: """删除字典记录及对应的物理文件""" wordlist: Optional[Wordlist] = self.repo.get_by_id(wordlist_id) if not wordlist: return False file_path = wordlist.file_path if file_path: try: if os.path.exists(file_path): os.remove(file_path) except OSError as exc: logger.warning("删除字典文件失败: %s - %s", file_path, exc) return self.repo.delete(wordlist_id) def _exists_by_name(self, name: str) -> bool: """判断是否存在同名的字典""" return self.repo.get_queryset().filter(name=name).exists() def get_wordlist_content(self, wordlist_id: int) -> Optional[str]: """获取字典文件内容""" wordlist = self.repo.get_by_id(wordlist_id) if not wordlist or not wordlist.file_path: return None try: with open(wordlist.file_path, "r", encoding="utf-8", errors="replace") as f: return f.read() except OSError as exc: logger.warning("读取字典文件失败: %s - %s", wordlist.file_path, exc) return None def update_wordlist_content(self, wordlist_id: int, content: str) -> Optional[Wordlist]: """更新字典文件内容并重新计算 hash""" wordlist = self.repo.get_by_id(wordlist_id) if not wordlist or not wordlist.file_path: return None try: # 写入新内容 with open(wordlist.file_path, "w", encoding="utf-8") as f: f.write(content) # 重新计算统计信息 file_size = os.path.getsize(wordlist.file_path) line_count = content.count("\n") + (1 if content and not content.endswith("\n") else 0) file_hash = safe_calc_file_sha256(wordlist.file_path) or "" # 更新记录 wordlist.file_size = file_size wordlist.line_count = line_count wordlist.file_hash = file_hash wordlist.save(update_fields=["file_size", "line_count", "file_hash", "updated_at"]) logger.info( "更新字典内容: id=%s, name=%s, size=%s, lines=%s, hash=%s", wordlist.id, wordlist.name, wordlist.file_size, wordlist.line_count, wordlist.file_hash[:16] + "..." if wordlist.file_hash else "N/A", ) return wordlist except OSError as exc: logger.error("写入字典文件失败: %s - %s", wordlist.file_path, exc) return None __all__ = ["WordlistService"] ================================================ FILE: backend/apps/engine/services/worker_load_service.py ================================================ """ Worker 负载服务(Redis) 存储结构: - worker:load:{worker_id} - Hash: {cpu, mem, updated} - TTL: 60 秒(超时自动清理) """ import logging from typing import Optional, Dict, Any from datetime import datetime import redis from django.conf import settings logger = logging.getLogger(__name__) class WorkerLoadService: """Worker 负载数据服务(基于 Redis)""" # Key 前缀 KEY_PREFIX = "worker:load:" # 数据过期时间(秒)- 超过此时间未更新视为离线 # 心跳间隔 3 秒,TTL 设为 15 秒(5 次心跳容错) TTL_SECONDS = 15 def __init__(self): self._redis: Optional[redis.Redis] = None @property def redis(self) -> redis.Redis: """懒加载 Redis 连接""" if self._redis is None: self._redis = redis.Redis( host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, decode_responses=True, ) return self._redis def _key(self, worker_id: int) -> str: """生成 Redis key""" return f"{self.KEY_PREFIX}{worker_id}" def update_load(self, worker_id: int, cpu_percent: float, memory_percent: float) -> bool: """ 更新 Worker 负载数据 Args: worker_id: Worker ID cpu_percent: CPU 使用率 memory_percent: 内存使用率 Returns: 是否成功 """ try: key = self._key(worker_id) data = { "cpu": cpu_percent, "mem": memory_percent, "updated": datetime.now().isoformat(), } # 使用 pipeline 原子操作 pipe = self.redis.pipeline() pipe.hset(key, mapping=data) pipe.expire(key, self.TTL_SECONDS) pipe.execute() return True except Exception as e: logger.error(f"更新 Worker 负载失败 - ID: {worker_id}: {e}") return False def get_load(self, worker_id: int) -> Optional[Dict[str, Any]]: """ 获取 Worker 负载数据 Returns: {"cpu": float, "mem": float, "updated": str} 或 None """ try: key = self._key(worker_id) data = self.redis.hgetall(key) if not data: return None return { "cpu": float(data.get("cpu", 0)), "mem": float(data.get("mem", 0)), "updated": data.get("updated", ""), } except Exception as e: logger.error(f"获取 Worker 负载失败 - ID: {worker_id}: {e}") return None def get_all_loads(self, worker_ids: list[int]) -> Dict[int, Dict[str, Any]]: """ 批量获取 Worker 负载数据 Args: worker_ids: Worker ID 列表 Returns: {worker_id: {"cpu": float, "mem": float}} 字典 """ result = {} try: pipe = self.redis.pipeline() for worker_id in worker_ids: pipe.hgetall(self._key(worker_id)) responses = pipe.execute() for worker_id, data in zip(worker_ids, responses): if data: result[worker_id] = { "cpu": float(data.get("cpu", 0)), "mem": float(data.get("mem", 0)), } except Exception as e: logger.error(f"批量获取 Worker 负载失败: {e}") return result def delete_load(self, worker_id: int) -> bool: """删除 Worker 负载数据""" try: self.redis.delete(self._key(worker_id)) return True except Exception as e: logger.error(f"删除 Worker 负载失败 - ID: {worker_id}: {e}") return False def is_online(self, worker_id: int) -> bool: """检查 Worker 是否在线(Redis 中有数据且未过期)""" return self.redis.exists(self._key(worker_id)) > 0 # 单例 worker_load_service = WorkerLoadService() ================================================ FILE: backend/apps/engine/services/worker_service.py ================================================ """ WorkerNode 业务逻辑服务层(Service) 负责 Worker 节点相关的业务逻辑处理 """ import logging from typing import Any from apps.engine.repositories import DjangoWorkerRepository logger = logging.getLogger(__name__) class WorkerService: """Worker 节点业务逻辑服务""" def __init__(self) -> None: """初始化服务,注入 Repository 依赖""" self.repo = DjangoWorkerRepository() # ==================== 查询 ==================== def get_worker(self, worker_id: int): """根据 ID 获取 Worker 节点""" return self.repo.get_by_id(worker_id) def get_all_workers(self): """获取所有 Worker 节点查询集""" return self.repo.get_all() # ==================== 状态更新 ==================== def update_status(self, worker_id: int, status: str) -> bool: """更新 Worker 节点状态 Args: worker_id: Worker ID status: 状态 (pending/deploying/online/offline) """ return self.repo.update_status(worker_id, status) def delete_worker(self, worker_id: int) -> bool: """删除 Worker 节点""" return self.repo.delete_by_id(worker_id) # ==================== 自注册 ==================== def register_worker(self, name: str, is_local: bool = True): """ 注册 Worker 节点(本地 Worker 自注册用) 幂等操作:已存在则返回现有节点。 Args: name: Worker 名称 is_local: 是否为本地节点 Returns: (WorkerNode, created) 元组 """ return self.repo.get_or_create_by_name( name=name, is_local=is_local ) def remote_uninstall( self, worker_id: int, ip_address: str, ssh_port: int, username: str, password: str | None ) -> tuple[bool, str]: """ 在远程主机上执行卸载脚本 Args: worker_id: Worker ID(仅用于日志) ip_address: SSH 主机地址 ssh_port: SSH 端口 username: SSH 用户名 password: SSH 密码 Returns: (success, message) 元组 """ if not password: return False, "未配置 SSH 密码,跳过远程卸载" try: import paramiko from apps.engine.services.deploy_service import get_uninstall_script ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) logger.info(f"[卸载] 正在连接 {ip_address}...") ssh.connect( ip_address, port=ssh_port, username=username, password=password, timeout=30 ) # 上传卸载脚本 uninstall_script = get_uninstall_script() remote_script_path = '/tmp/xingrin_uninstall.sh' sftp = ssh.open_sftp() with sftp.file(remote_script_path, 'w') as f: f.write(uninstall_script) sftp.chmod(remote_script_path, 0o755) sftp.close() # 执行卸载脚本 logger.info(f"[卸载] 正在执行卸载脚本...") stdin, stdout, stderr = ssh.exec_command(f"bash {remote_script_path}") exit_status = stdout.channel.recv_exit_status() ssh.close() if exit_status == 0: logger.info(f"[卸载] Worker {worker_id} 远程卸载成功") return True, "远程卸载成功" else: error = stderr.read().decode().strip() logger.warning(f"[卸载] Worker {worker_id} 远程卸载失败: {error}") return False, f"远程卸载失败: {error}" except Exception as e: logger.warning(f"[卸载] Worker {worker_id} 远程卸载异常: {e}") return False, f"远程卸载异常: {str(e)}" def execute_remote_command( self, ip_address: str, ssh_port: int, username: str, password: str | None, command: str ) -> tuple[bool, str]: """ 在远程主机上执行命令 Args: ip_address: SSH 主机地址 ssh_port: SSH 端口 username: SSH 用户名 password: SSH 密码 command: 要执行的命令 Returns: (success, message) 元组 """ if not password: return False, "未配置 SSH 密码" try: import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect( ip_address, port=ssh_port, username=username, password=password, timeout=30 ) stdin, stdout, stderr = ssh.exec_command(command, timeout=120) exit_status = stdout.channel.recv_exit_status() ssh.close() if exit_status == 0: return True, stdout.read().decode().strip() else: error = stderr.read().decode().strip() return False, error except Exception as e: return False, str(e) __all__ = ["WorkerService"] ================================================ FILE: backend/apps/engine/urls.py ================================================ from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import ( ScanEngineViewSet, WorkerNodeViewSet, WordlistViewSet, NucleiTemplateRepoViewSet, ) from .views.fingerprints import ( EholeFingerprintViewSet, GobyFingerprintViewSet, WappalyzerFingerprintViewSet, FingersFingerprintViewSet, FingerPrintHubFingerprintViewSet, ARLFingerprintViewSet, ) # 创建路由器 router = DefaultRouter() router.register(r"engines", ScanEngineViewSet, basename="engine") router.register(r"workers", WorkerNodeViewSet, basename="worker") router.register(r"wordlists", WordlistViewSet, basename="wordlist") router.register(r"nuclei/repos", NucleiTemplateRepoViewSet, basename="nuclei-repos") # 指纹管理 router.register(r"fingerprints/ehole", EholeFingerprintViewSet, basename="ehole-fingerprint") router.register(r"fingerprints/goby", GobyFingerprintViewSet, basename="goby-fingerprint") router.register(r"fingerprints/wappalyzer", WappalyzerFingerprintViewSet, basename="wappalyzer-fingerprint") router.register(r"fingerprints/fingers", FingersFingerprintViewSet, basename="fingers-fingerprint") router.register(r"fingerprints/fingerprinthub", FingerPrintHubFingerprintViewSet, basename="fingerprinthub-fingerprint") router.register(r"fingerprints/arl", ARLFingerprintViewSet, basename="arl-fingerprint") urlpatterns = [ path("", include(router.urls)), ] ================================================ FILE: backend/apps/engine/views/__init__.py ================================================ """Engine Views""" from .worker_views import WorkerNodeViewSet from .engine_views import ScanEngineViewSet from .wordlist_views import WordlistViewSet from .nuclei_template_repo_views import NucleiTemplateRepoViewSet __all__ = [ "WorkerNodeViewSet", "ScanEngineViewSet", "WordlistViewSet", "NucleiTemplateRepoViewSet", ] ================================================ FILE: backend/apps/engine/views/engine_views.py ================================================ """ 扫描引擎 Views """ from rest_framework import viewsets from apps.engine.serializers import ScanEngineSerializer from apps.engine.services import EngineService class ScanEngineViewSet(viewsets.ModelViewSet): """ 扫描引擎 ViewSet 自动提供完整的 CRUD 操作: - GET /api/engines/ - 获取引擎列表 - POST /api/engines/ - 创建新引擎 - GET /api/engines/{id}/ - 获取引擎详情 - PUT /api/engines/{id}/ - 更新引擎 - PATCH /api/engines/{id}/ - 部分更新引擎 - DELETE /api/engines/{id}/ - 删除引擎 """ serializer_class = ScanEngineSerializer def __init__(self, **kwargs): super().__init__(**kwargs) self.engine_service = EngineService() def get_queryset(self): """通过服务层获取查询集""" return self.engine_service.get_all_engines() ================================================ FILE: backend/apps/engine/views/fingerprints/__init__.py ================================================ """指纹管理 ViewSets 导出所有指纹相关的 ViewSet 类 """ from .base import BaseFingerprintViewSet from .ehole import EholeFingerprintViewSet from .goby import GobyFingerprintViewSet from .wappalyzer import WappalyzerFingerprintViewSet from .fingers import FingersFingerprintViewSet from .fingerprinthub import FingerPrintHubFingerprintViewSet from .arl import ARLFingerprintViewSet __all__ = [ "BaseFingerprintViewSet", "EholeFingerprintViewSet", "GobyFingerprintViewSet", "WappalyzerFingerprintViewSet", "FingersFingerprintViewSet", "FingerPrintHubFingerprintViewSet", "ARLFingerprintViewSet", ] ================================================ FILE: backend/apps/engine/views/fingerprints/arl.py ================================================ """ARL 指纹管理 ViewSet""" import yaml from django.http import HttpResponse from rest_framework.decorators import action from rest_framework.exceptions import ValidationError from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response from apps.engine.models import ARLFingerprint from apps.engine.serializers.fingerprints import ARLFingerprintSerializer from apps.engine.services.fingerprints import ARLFingerprintService from .base import BaseFingerprintViewSet class ARLFingerprintViewSet(BaseFingerprintViewSet): """ARL 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data,支持 YAML) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载(YAML 格式) 智能过滤语法(filter 参数): - name="word" 模糊匹配 name 字段 - name=="WordPress" 精确匹配 - rule="body=" 按规则内容筛选 """ queryset = ARLFingerprint.objects.all() serializer_class = ARLFingerprintSerializer pagination_class = BasePagination service_class = ARLFingerprintService # 排序配置 ordering_fields = ['created_at', 'name'] ordering = ['-created_at'] # ARL 过滤字段映射 FILTER_FIELD_MAPPING = { 'name': 'name', 'rule': 'rule', } def parse_import_data(self, json_data) -> list: """ 解析 ARL 格式的导入数据(JSON 格式) 输入格式:[{...}, {...}] 数组格式 返回:指纹列表 """ if isinstance(json_data, list): return json_data return [] def get_export_filename(self) -> str: """导出文件名""" return 'ARL.yaml' @action(detail=False, methods=['post']) def import_file(self, request): """ 文件导入(支持 YAML 和 JSON 格式) POST /api/engine/fingerprints/arl/import_file/ 请求格式:multipart/form-data - file: YAML 或 JSON 文件 返回:同 batch_create """ file = request.FILES.get('file') if not file: raise ValidationError('缺少文件') filename = file.name.lower() content = file.read().decode('utf-8') try: if filename.endswith('.yaml') or filename.endswith('.yml'): # YAML 格式 fingerprints = yaml.safe_load(content) else: # JSON 格式 import json fingerprints = json.loads(content) except (yaml.YAMLError, json.JSONDecodeError) as e: raise ValidationError(f'无效的文件格式: {e}') if not isinstance(fingerprints, list): raise ValidationError('文件内容必须是数组格式') if not fingerprints: raise ValidationError('文件中没有有效的指纹数据') result = self.get_service().batch_create_fingerprints(fingerprints) return success_response(data=result) @action(detail=False, methods=['get']) def export(self, request): """ 导出指纹(YAML 格式) GET /api/engine/fingerprints/arl/export/ 返回:YAML 文件下载 """ data = self.get_service().get_export_data() content = yaml.dump(data, allow_unicode=True, default_flow_style=False, sort_keys=False) response = HttpResponse(content, content_type='application/x-yaml') response['Content-Disposition'] = f'attachment; filename="{self.get_export_filename()}"' return response ================================================ FILE: backend/apps/engine/views/fingerprints/base.py ================================================ """指纹管理基类 ViewSet 提供通用的 CRUD 和批量操作,供 EHole/Goby/Wappalyzer 等子类继承 """ import json import logging from django.http import HttpResponse from rest_framework import viewsets, status, filters from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.exceptions import ValidationError from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response from apps.common.utils.filter_utils import apply_filters logger = logging.getLogger(__name__) class BaseFingerprintViewSet(viewsets.ModelViewSet): """指纹管理基类 ViewSet,供 EHole/Goby/Wappalyzer 等子类继承 提供的 API: 标准 CRUD(继承自 ModelViewSet): - GET / 列表查询(分页 + 智能过滤) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(本类实现): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data,适合 10MB+ 大文件) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - field="value" 模糊匹配(包含) - field=="value" 精确匹配 - 多条件空格分隔 AND 关系 - || 或 or OR 关系 子类必须实现: - service_class Service 类 - parse_import_data 解析导入数据格式 - get_export_filename 导出文件名 """ pagination_class = BasePagination filter_backends = [filters.OrderingFilter] ordering = ['-created_at'] # 子类必须指定 service_class = None # Service 类 # 智能过滤字段映射,子类必须覆盖 FILTER_FIELD_MAPPING = {} # JSON 数组字段列表(使用 __contains 查询),子类可覆盖 JSON_ARRAY_FIELDS = [] def get_queryset(self): """支持智能过滤语法""" queryset = super().get_queryset() filter_query = self.request.query_params.get('filter', None) if filter_query: queryset = apply_filters( queryset, filter_query, self.FILTER_FIELD_MAPPING, json_array_fields=getattr(self, 'JSON_ARRAY_FIELDS', []) ) return queryset def get_service(self): """获取 Service 实例""" if self.service_class is None: raise NotImplementedError("子类必须指定 service_class") return self.service_class() def parse_import_data(self, json_data: dict) -> list: """ 解析导入数据,子类必须实现 Args: json_data: 解析后的 JSON 数据 Returns: list: 指纹数据列表 """ raise NotImplementedError("子类必须实现 parse_import_data 方法") def get_export_filename(self) -> str: """ 导出文件名,子类必须实现 Returns: str: 文件名 """ raise NotImplementedError("子类必须实现 get_export_filename 方法") @action(detail=False, methods=['post']) def batch_create(self, request): """ 批量创建指纹规则 POST /api/engine/fingerprints/{type}/batch_create/ 请求格式: { "fingerprints": [ {"cms": "WordPress", "method": "keyword", ...}, ... ] } 返回: { "created": 2, "failed": 0 } """ fingerprints = request.data.get('fingerprints', []) if not fingerprints: raise ValidationError('fingerprints 不能为空') if not isinstance(fingerprints, list): raise ValidationError('fingerprints 必须是数组') result = self.get_service().batch_create_fingerprints(fingerprints) return success_response(data=result, status_code=status.HTTP_201_CREATED) @action(detail=False, methods=['post']) def import_file(self, request): """ 文件导入(适合大文件,10MB+) POST /api/engine/fingerprints/{type}/import_file/ 请求格式:multipart/form-data - file: JSON 文件(支持标准 JSON 和 JSONL 格式) 返回:同 batch_create """ file = request.FILES.get('file') if not file: raise ValidationError('缺少文件') try: content = file.read().decode('utf-8') json_data = self._parse_json_content(content) except json.JSONDecodeError as e: raise ValidationError(f'无效的 JSON 格式: {e}') except UnicodeDecodeError as e: raise ValidationError(f'文件编码错误: {e}') fingerprints = self.parse_import_data(json_data) if not fingerprints: raise ValidationError('文件中没有有效的指纹数据') result = self.get_service().batch_create_fingerprints(fingerprints) return success_response(data=result, status_code=status.HTTP_201_CREATED) def _parse_json_content(self, content: str): """ 解析 JSON 内容,支持标准 JSON 和 JSONL 格式 Args: content: 文件内容字符串 Returns: 解析后的数据(list 或 dict) """ content = content.strip() # 尝试标准 JSON 解析 try: return json.loads(content) except json.JSONDecodeError: pass # 尝试 JSONL 格式(每行一个 JSON 对象) lines = content.split('\n') result = [] for i, line in enumerate(lines): line = line.strip() if not line: continue try: result.append(json.loads(line)) except json.JSONDecodeError as e: raise json.JSONDecodeError(f'第 {i + 1} 行解析失败: {e.msg}', e.doc, e.pos) if not result: raise json.JSONDecodeError('文件为空或格式无效', content, 0) return result @action(detail=False, methods=['post'], url_path='bulk-delete') def bulk_delete(self, request): """ 批量删除 POST /api/engine/fingerprints/{type}/bulk-delete/ 请求格式:{"ids": [1, 2, 3]} 返回:{"deleted": 3} """ ids = request.data.get('ids', []) if not ids: raise ValidationError('ids 不能为空') if not isinstance(ids, list): raise ValidationError('ids 必须是数组') deleted_count = self.queryset.model.objects.filter(id__in=ids).delete()[0] return success_response(data={'deleted': deleted_count}) @action(detail=False, methods=['post'], url_path='delete-all') def delete_all(self, request): """ 删除所有指纹 POST /api/engine/fingerprints/{type}/delete-all/ 返回:{"deleted": 1000} """ deleted_count = self.queryset.model.objects.all().delete()[0] return success_response(data={'deleted': deleted_count}) @action(detail=False, methods=['get']) def export(self, request): """ 导出指纹(前端下载) GET /api/engine/fingerprints/{type}/export/ 返回:JSON 文件下载 """ data = self.get_service().get_export_data() content = json.dumps(data, ensure_ascii=False, indent=2) response = HttpResponse(content, content_type='application/json') response['Content-Disposition'] = f'attachment; filename="{self.get_export_filename()}"' return response ================================================ FILE: backend/apps/engine/views/fingerprints/ehole.py ================================================ """EHole 指纹管理 ViewSet""" from apps.common.pagination import BasePagination from apps.engine.models import EholeFingerprint from apps.engine.serializers.fingerprints import EholeFingerprintSerializer from apps.engine.services.fingerprints import EholeFingerprintService from .base import BaseFingerprintViewSet class EholeFingerprintViewSet(BaseFingerprintViewSet): """EHole 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - cms="word" 模糊匹配 cms 字段 - cms=="WordPress" 精确匹配 - type="CMS" 按类型筛选 - method="keyword" 按匹配方式筛选 - location="body" 按匹配位置筛选 """ queryset = EholeFingerprint.objects.all() serializer_class = EholeFingerprintSerializer pagination_class = BasePagination service_class = EholeFingerprintService # 排序配置 ordering_fields = ['created_at', 'cms'] ordering = ['-created_at'] # EHole 过滤字段映射 FILTER_FIELD_MAPPING = { 'cms': 'cms', 'method': 'method', 'location': 'location', 'type': 'type', 'isImportant': 'is_important', } def parse_import_data(self, json_data: dict) -> list: """ 解析 EHole JSON 格式的导入数据 输入格式:{"fingerprint": [...]} 返回:指纹列表 """ return json_data.get('fingerprint', []) def get_export_filename(self) -> str: """导出文件名""" return 'ehole.json' ================================================ FILE: backend/apps/engine/views/fingerprints/fingerprinthub.py ================================================ """FingerPrintHub 指纹管理 ViewSet""" from apps.common.pagination import BasePagination from apps.engine.models import FingerPrintHubFingerprint from apps.engine.serializers.fingerprints import FingerPrintHubFingerprintSerializer from apps.engine.services.fingerprints import FingerPrintHubFingerprintService from .base import BaseFingerprintViewSet class FingerPrintHubFingerprintViewSet(BaseFingerprintViewSet): """FingerPrintHub 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - name="word" 模糊匹配 name 字段 - fp_id=="xxx" 精确匹配指纹ID - author="xxx" 按作者筛选 - severity="info" 按严重程度筛选 - tags="cms" 按标签筛选 """ queryset = FingerPrintHubFingerprint.objects.all() serializer_class = FingerPrintHubFingerprintSerializer pagination_class = BasePagination service_class = FingerPrintHubFingerprintService # 排序配置 ordering_fields = ['created_at', 'name', 'severity'] ordering = ['-created_at'] # FingerPrintHub 过滤字段映射 FILTER_FIELD_MAPPING = { 'fp_id': 'fp_id', 'name': 'name', 'author': 'author', 'tags': 'tags', 'severity': 'severity', 'source_file': 'source_file', } # JSON 数组字段(使用 __contains 查询) JSON_ARRAY_FIELDS = ['http'] def parse_import_data(self, json_data) -> list: """ 解析 FingerPrintHub JSON 格式的导入数据 输入格式:[{...}, {...}] 数组格式 返回:指纹列表 """ if isinstance(json_data, list): return json_data return [] def get_export_filename(self) -> str: """导出文件名""" return 'fingerprinthub_web.json' ================================================ FILE: backend/apps/engine/views/fingerprints/fingers.py ================================================ """Fingers 指纹管理 ViewSet""" from apps.common.pagination import BasePagination from apps.engine.models import FingersFingerprint from apps.engine.serializers.fingerprints import FingersFingerprintSerializer from apps.engine.services.fingerprints import FingersFingerprintService from .base import BaseFingerprintViewSet class FingersFingerprintViewSet(BaseFingerprintViewSet): """Fingers 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - name="word" 模糊匹配 name 字段 - name=="WordPress" 精确匹配 - tag="cms" 按标签筛选 - focus="true" 按重点关注筛选 """ queryset = FingersFingerprint.objects.all() serializer_class = FingersFingerprintSerializer pagination_class = BasePagination service_class = FingersFingerprintService # 排序配置 ordering_fields = ['created_at', 'name'] ordering = ['-created_at'] # Fingers 过滤字段映射 FILTER_FIELD_MAPPING = { 'name': 'name', 'link': 'link', 'focus': 'focus', } # JSON 数组字段(使用 __contains 查询) JSON_ARRAY_FIELDS = ['tag', 'rule', 'default_port'] def parse_import_data(self, json_data) -> list: """ 解析 Fingers JSON 格式的导入数据 输入格式:[{...}, {...}] 数组格式 返回:指纹列表 """ if isinstance(json_data, list): return json_data return [] def get_export_filename(self) -> str: """导出文件名""" return 'fingers_http.json' ================================================ FILE: backend/apps/engine/views/fingerprints/goby.py ================================================ """Goby 指纹管理 ViewSet""" from apps.common.pagination import BasePagination from apps.engine.models import GobyFingerprint from apps.engine.serializers.fingerprints import GobyFingerprintSerializer from apps.engine.services.fingerprints import GobyFingerprintService from .base import BaseFingerprintViewSet class GobyFingerprintViewSet(BaseFingerprintViewSet): """Goby 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - name="word" 模糊匹配 name 字段 - name=="ProductName" 精确匹配 """ queryset = GobyFingerprint.objects.all() serializer_class = GobyFingerprintSerializer pagination_class = BasePagination service_class = GobyFingerprintService # 排序配置 ordering_fields = ['created_at', 'name'] ordering = ['-created_at'] # Goby 过滤字段映射 FILTER_FIELD_MAPPING = { 'name': 'name', 'logic': 'logic', } def parse_import_data(self, json_data) -> list: """ 解析 Goby JSON 格式的导入数据 Goby 格式是数组格式:[{...}, {...}, ...] 输入格式:[{"name": "...", "logic": "...", "rule": [...]}, ...] 返回:指纹列表 """ if isinstance(json_data, list): return json_data return [] def get_export_filename(self) -> str: """导出文件名""" return 'goby.json' ================================================ FILE: backend/apps/engine/views/fingerprints/wappalyzer.py ================================================ """Wappalyzer 指纹管理 ViewSet""" from apps.common.pagination import BasePagination from apps.engine.models import WappalyzerFingerprint from apps.engine.serializers.fingerprints import WappalyzerFingerprintSerializer from apps.engine.services.fingerprints import WappalyzerFingerprintService from .base import BaseFingerprintViewSet class WappalyzerFingerprintViewSet(BaseFingerprintViewSet): """Wappalyzer 指纹管理 ViewSet 继承自 BaseFingerprintViewSet,提供以下 API: 标准 CRUD(ModelViewSet): - GET / 列表查询(分页) - POST / 创建单条 - GET /{id}/ 获取详情 - PUT /{id}/ 更新 - DELETE /{id}/ 删除 批量操作(继承自基类): - POST /batch_create/ 批量创建(JSON body) - POST /import_file/ 文件导入(multipart/form-data) - POST /bulk-delete/ 批量删除 - POST /delete-all/ 删除所有 - GET /export/ 导出下载 智能过滤语法(filter 参数): - name="word" 模糊匹配 name 字段 - name=="AppName" 精确匹配 """ queryset = WappalyzerFingerprint.objects.all() serializer_class = WappalyzerFingerprintSerializer pagination_class = BasePagination service_class = WappalyzerFingerprintService # 排序配置 ordering_fields = ['created_at', 'name'] ordering = ['-created_at'] # Wappalyzer 过滤字段映射 # 注意:implies 是 JSON 数组字段,使用 __contains 查询 FILTER_FIELD_MAPPING = { 'name': 'name', 'description': 'description', 'website': 'website', 'cpe': 'cpe', 'implies': 'implies', # JSON 数组字段 } # JSON 数组字段列表(使用 __contains 查询) JSON_ARRAY_FIELDS = ['implies'] def parse_import_data(self, json_data: dict) -> list: """ 解析 Wappalyzer JSON 格式的导入数据 Wappalyzer 格式是 apps 对象格式:{"apps": {"AppName": {...}, ...}} 输入格式:{"apps": {"1C-Bitrix": {"cats": [...], ...}, ...}} 返回:指纹列表(每个 app 转换为带 name 字段的 dict) """ apps = json_data.get('apps', {}) fingerprints = [] for name, data in apps.items(): item = {'name': name, **data} fingerprints.append(item) return fingerprints def get_export_filename(self) -> str: """导出文件名""" return 'wappalyzer.json' ================================================ FILE: backend/apps/engine/views/nuclei_template_repo_views.py ================================================ """Nuclei 模板仓库 View 层(HTTP 接口) 本模块提供 Nuclei 多仓库管理的 REST API,基于 DRF ModelViewSet。 API 列表: ========== 仓库 CRUD(ModelViewSet 默认实现): - GET /api/nuclei/repos/ 获取仓库列表 - POST /api/nuclei/repos/ 创建仓库 - GET /api/nuclei/repos/{id}/ 获取仓库详情 - PUT /api/nuclei/repos/{id}/ 更新仓库 - DELETE /api/nuclei/repos/{id}/ 删除仓库 自定义 Action: - POST /api/nuclei/repos/{id}/refresh/ 手动 Git 同步(clone/pull) - GET /api/nuclei/repos/{id}/templates/tree/ 获取当前本地模板目录树(不自动同步) - GET /api/nuclei/repos/{id}/templates/content/ 获取单个模板内容(只读) 调用链路: HTTP Request → View → Service → Repository → Model/FileSystem """ from __future__ import annotations import logging from django.core.exceptions import ValidationError from rest_framework import status, viewsets from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.response import Response from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.engine.models import NucleiTemplateRepo from apps.engine.serializers import NucleiTemplateRepoSerializer from apps.engine.services import NucleiTemplateRepoService logger = logging.getLogger(__name__) class NucleiTemplateRepoViewSet(viewsets.ModelViewSet): """Nuclei 模板 Git 仓库 ViewSet 继承 ModelViewSet,自动获得 CRUD 能力: - list: 获取仓库列表 - create: 创建仓库 - retrieve: 获取仓库详情 - update: 更新仓库 - destroy: 删除仓库 额外提供三个自定义 Action(见下方方法)。 Attributes: queryset: 默认查询集,按创建时间倒序 serializer_class: 序列化器类 service: Service 层实例,处理业务逻辑 """ # DRF ModelViewSet 配置 queryset = NucleiTemplateRepo.objects.all().order_by("-created_at") serializer_class = NucleiTemplateRepoSerializer def __init__(self, *args, **kwargs) -> None: # type: ignore[override] """初始化 ViewSet,创建 Service 实例""" super().__init__(*args, **kwargs) self.service = NucleiTemplateRepoService() def perform_create(self, serializer) -> None: # type: ignore[override] """创建仓库时初始化本地路径目录 设计原则:第一次创建仓库就确定好 local_path,后续所有 Git 拉取和模板读取 都复用这个固定目录,避免运行时才临时决定路径。 """ instance = serializer.save() # 初始化并持久化 local_path,同时在文件系统中创建对应目录 self.service.ensure_local_path(instance) def perform_destroy(self, instance: NucleiTemplateRepo) -> None: # type: ignore[override] """删除仓库时同时清理本地目录 前端在 /tools/nuclei/ 点击删除时: - 这里会先尝试删除 instance.local_path 对应的目录 - 然后调用父类逻辑删除数据库记录 """ # 清理本地目录(最佳努力,不影响主流程) self.service.remove_local_path_dir(instance) super().perform_destroy(instance) # ==================== 自定义 Action: Git 同步 ==================== @action(detail=True, methods=["post"], url_path="refresh") def refresh(self, request: Request, pk: str | None = None) -> Response: """手动触发 Git 同步 POST /api/nuclei/repos/{id}/refresh/ 执行 git clone(首次)或 git pull(后续)。 同步成功后更新 last_synced_at。 Returns: 200: {"message": "刷新成功", "result": {...}} 400: {"message": "无效的仓库 ID"} 或 {"message": "仓库不存在"} 500: {"message": "刷新仓库失败"} """ # 解析仓库 ID try: repo_id = int(pk) if pk is not None else None except (TypeError, ValueError): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Invalid repository ID', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 Service 层 try: result = self.service.refresh_repo(repo_id) except ValidationError as exc: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(exc), status_code=status.HTTP_400_BAD_REQUEST ) except Exception as exc: # noqa: BLE001 logger.error("刷新 Nuclei 模板仓库失败: %s", exc, exc_info=True) return error_response( code=ErrorCodes.SERVER_ERROR, message=f'Refresh failed: {exc}', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={'result': result}) # ==================== 自定义 Action: 模板只读浏览 ==================== @action(detail=True, methods=["get"], url_path="templates/tree") def templates_tree(self, request: Request, pk: str | None = None) -> Response: """获取模板目录树 GET /api/nuclei/repos/{id}/templates/tree/ 只读取当前本地仓库目录,不主动触发 Git 同步。 如需拉取远端最新内容,请先调用 POST /api/nuclei/repos/{id}/refresh/。 返回的树形结构包含所有文件夹和 .yaml/.yml 文件。 Returns: 200: {"roots": [{type, name, path, children}, ...]} 400: {"message": "无效的仓库 ID"} 或 {"message": "仓库不存在"} 500: {"message": "获取模板目录树失败"} """ # 解析仓库 ID try: repo_id = int(pk) if pk is not None else None except (TypeError, ValueError): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Invalid repository ID', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 Service 层,仅从当前本地目录读取目录树 try: roots = self.service.get_template_tree(repo_id) except ValidationError as exc: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(exc), status_code=status.HTTP_400_BAD_REQUEST ) except Exception as exc: # noqa: BLE001 logger.error("获取 Nuclei 模板目录树失败: %s", exc, exc_info=True) return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get template tree', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response(data={'roots': roots}) @action(detail=True, methods=["get"], url_path="templates/content") def templates_content(self, request: Request, pk: str | None = None) -> Response: """获取单个模板文件内容 GET /api/nuclei/repos/{id}/templates/content/?path=http/example.yaml Query Parameters: path: 模板相对路径,如 "http/cves/CVE-2021-1234.yaml" Returns: 200: {"path": "...", "name": "...", "content": "..."} 400: {"message": "无效的仓库 ID"} 或 {"message": "缺少 path 参数"} 404: {"message": "模板不存在或无法读取"} 500: {"message": "获取模板内容失败"} """ # 解析仓库 ID try: repo_id = int(pk) if pk is not None else None except (TypeError, ValueError): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Invalid repository ID', status_code=status.HTTP_400_BAD_REQUEST ) # 解析 path 参数 rel_path = (request.query_params.get("path", "") or "").strip() if not rel_path: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing path parameter', status_code=status.HTTP_400_BAD_REQUEST ) # 调用 Service 层 try: result = self.service.get_template_content(repo_id, rel_path) except ValidationError as exc: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(exc), status_code=status.HTTP_400_BAD_REQUEST ) except Exception as exc: # noqa: BLE001 logger.error("获取 Nuclei 模板内容失败: %s", exc, exc_info=True) return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to get template content', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) # 文件不存在 if result is None: return error_response( code=ErrorCodes.NOT_FOUND, message='Template not found or unreadable', status_code=status.HTTP_404_NOT_FOUND ) return success_response(data=result) ================================================ FILE: backend/apps/engine/views/wordlist_views.py ================================================ """字典管理 API Views""" import os from django.core.exceptions import ValidationError from django.http import FileResponse from rest_framework import status, viewsets from rest_framework.decorators import action from rest_framework.response import Response from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.engine.serializers.wordlist_serializer import WordlistSerializer from apps.engine.services.wordlist_service import WordlistService class WordlistViewSet(viewsets.ViewSet): """字典管理 ViewSet""" pagination_class = BasePagination def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.service = WordlistService() @property def paginator(self): """懒加载分页器实例""" if not hasattr(self, "_paginator"): if self.pagination_class is None: self._paginator = None else: self._paginator = self.pagination_class() return self._paginator def list(self, request): """获取字典列表""" queryset = self.service.get_queryset() page = self.paginator.paginate_queryset(queryset, request, view=self) serializer = WordlistSerializer(page, many=True) return self.paginator.get_paginated_response(serializer.data) def create(self, request): """上传并创建字典记录""" name = (request.data.get("name", "") or "").strip() description = request.data.get("description", "") or "" uploaded_file = request.FILES.get("file") if not uploaded_file: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing wordlist file', status_code=status.HTTP_400_BAD_REQUEST ) try: wordlist = self.service.create_wordlist( name=name, description=description, uploaded_file=uploaded_file, ) except ValidationError as exc: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(exc), status_code=status.HTTP_400_BAD_REQUEST ) serializer = WordlistSerializer(wordlist) return success_response(data=serializer.data, status_code=status.HTTP_201_CREATED) def destroy(self, request, pk=None): """删除字典记录""" try: wordlist_id = int(pk) except (TypeError, ValueError): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Invalid ID', status_code=status.HTTP_400_BAD_REQUEST ) success = self.service.delete_wordlist(wordlist_id) if not success: return error_response( code=ErrorCodes.NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND ) return Response(status=status.HTTP_204_NO_CONTENT) @action(detail=False, methods=["get"], url_path="download") def download(self, request): """通过字典名称下载文件内容 Query 参数: - wordlist: 字典名称,对应 Wordlist.name(唯一) """ name = (request.query_params.get("wordlist", "") or "").strip() if not name: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing parameter: wordlist', status_code=status.HTTP_400_BAD_REQUEST ) wordlist = self.service.get_wordlist_by_name(name) if not wordlist: return error_response( code=ErrorCodes.NOT_FOUND, message='Wordlist not found', status_code=status.HTTP_404_NOT_FOUND ) file_path = wordlist.file_path if not file_path or not os.path.exists(file_path): return error_response( code=ErrorCodes.NOT_FOUND, message='Wordlist file not found', status_code=status.HTTP_404_NOT_FOUND ) filename = os.path.basename(file_path) response = FileResponse(open(file_path, "rb"), as_attachment=True, filename=filename) return response @action(detail=True, methods=["get", "put"], url_path="content") def content(self, request, pk=None): """获取或更新字典文件内容 GET: 返回字典文件的文本内容 PUT: 更新字典文件内容,重新计算 hash """ try: wordlist_id = int(pk) except (TypeError, ValueError): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Invalid ID', status_code=status.HTTP_400_BAD_REQUEST ) if request.method == "GET": content = self.service.get_wordlist_content(wordlist_id) if content is None: return error_response( code=ErrorCodes.NOT_FOUND, message='Wordlist not found or file unreadable', status_code=status.HTTP_404_NOT_FOUND ) return success_response(data={"content": content}) elif request.method == "PUT": content = request.data.get("content") if content is None: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing content parameter', status_code=status.HTTP_400_BAD_REQUEST ) wordlist = self.service.update_wordlist_content(wordlist_id, content) if not wordlist: return error_response( code=ErrorCodes.NOT_FOUND, message='Wordlist not found or update failed', status_code=status.HTTP_404_NOT_FOUND ) serializer = WordlistSerializer(wordlist) return success_response(data=serializer.data) ================================================ FILE: backend/apps/engine/views/worker_views.py ================================================ """ Worker 节点 Views """ import os import threading import logging from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.engine.serializers import WorkerNodeSerializer from apps.engine.services import WorkerService from apps.common.signals import worker_delete_failed logger = logging.getLogger(__name__) class WorkerNodeViewSet(viewsets.ModelViewSet): """ Worker 节点 ViewSet HTTP API: - GET /api/workers/ - 获取节点列表 - POST /api/workers/ - 创建节点 - DELETE /api/workers/{id}/ - 删除节点(同时执行远程卸载) - POST /api/workers/{id}/heartbeat/ - 心跳上报 部署通过 WebSocket 终端进行: - ws://host/ws/workers/{id}/deploy/ """ serializer_class = WorkerNodeSerializer def __init__(self, **kwargs): super().__init__(**kwargs) self.worker_service = WorkerService() def get_queryset(self): """通过服务层获取 Worker 查询集""" return self.worker_service.get_all_workers() def get_serializer_context(self): """传入批量查询的 Redis 负载数据,避免 N+1 查询""" context = super().get_serializer_context() # 仅在 list 操作时批量预加载 if self.action == 'list': from apps.engine.services.worker_load_service import worker_load_service queryset = self.get_queryset() worker_ids = list(queryset.values_list('id', flat=True)) context['loads'] = worker_load_service.get_all_loads(worker_ids) return context def destroy(self, request, *args, **kwargs): """ 删除 Worker 节点 流程: 1. 后台线程执行远程卸载脚本 2. 卸载完成后删除数据库记录 3. 发送通知 """ worker = self.get_object() # 在主线程中提取所有需要的数据(避免后台线程访问 ORM 对象) worker_id = worker.id worker_name = worker.name ip_address = worker.ip_address ssh_port = worker.ssh_port username = worker.username password = worker.password # 1. 删除 Redis 中的负载数据 from apps.engine.services.worker_load_service import worker_load_service worker_load_service.delete_load(worker_id) # 2. 删除数据库记录(立即生效,前端刷新时不会再看到) self.worker_service.delete_worker(worker_id) def _async_remote_uninstall(): """后台执行远程卸载""" try: success, message = self.worker_service.remote_uninstall( worker_id=worker_id, ip_address=ip_address, ssh_port=ssh_port, username=username, password=password ) if success: logger.info(f"Worker {worker_name} 远程卸载成功") else: logger.warning(f"Worker {worker_name} 远程卸载: {message}") # 卸载失败时发送通知 worker_delete_failed.send( sender=self.__class__, worker_name=worker_name, message=message ) except Exception as e: logger.error(f"Worker {worker_name} 远程卸载失败: {e}") worker_delete_failed.send( sender=self.__class__, worker_name=worker_name, message=str(e) ) # 2. 后台线程执行远程卸载(不阻塞响应) threading.Thread(target=_async_remote_uninstall, daemon=True).start() # 3. 立即返回成功 return success_response( data={'name': worker_name} ) @action(detail=True, methods=['post']) def heartbeat(self, request, pk=None): """ 接收心跳上报(写 Redis,首次心跳更新部署状态,检查版本) 请求体: { "cpu_percent": 50.0, "memory_percent": 60.0, "version": "v1.0.9" } 返回: { "status": "ok", "need_update": true/false, "server_version": "v1.0.19" } 状态流转: ┌─────────────────────────────────────────────────────────────────────┐ │ 场景 │ 状态变化 │ ├─────────────────────────────┼───────────────────────────────────────┤ │ 首次心跳 │ pending/deploying → online │ │ 远程 Worker 版本不匹配 │ online → updating → (更新成功) online │ │ 远程 Worker 更新失败 │ updating → outdated │ │ 本地 Worker 版本不匹配 │ online → outdated (需手动 update.sh) │ │ 版本匹配 │ updating/outdated → online │ └─────────────────────────────┴───────────────────────────────────────┘ """ from apps.engine.services.worker_load_service import worker_load_service from django.conf import settings worker = self.get_object() info = request.data if request.data else {} # 1. 写入 Redis(实时负载数据,TTL=60秒) cpu = info.get('cpu_percent', 0) mem = info.get('memory_percent', 0) worker_load_service.update_load(worker.id, cpu, mem) # 2. 首次心跳:更新状态为 online if worker.status not in ('online', 'offline'): worker.status = 'online' worker.save(update_fields=['status']) # 3. 版本检查:比较 agent 版本与 server 版本 agent_version = info.get('version', '') server_version = settings.IMAGE_TAG # Server 当前版本 need_update = False if agent_version and agent_version != 'unknown': # 版本不匹配时通知 agent 更新 need_update = agent_version != server_version if need_update: logger.info( f"Worker {worker.name} 版本不匹配: agent={agent_version}, server={server_version}" ) # 远程 Worker:服务端主动通过 SSH 触发更新 if not worker.is_local and worker.ip_address: self._trigger_remote_agent_update(worker, server_version) else: # 本地 Worker 版本不匹配:标记为 outdated # 需要用户手动执行 update.sh 更新 if worker.status != 'outdated': worker.status = 'outdated' worker.save(update_fields=['status']) else: # 版本匹配,确保状态为 online if worker.status in ('updating', 'outdated'): worker.status = 'online' worker.save(update_fields=['status']) return success_response( data={ 'status': 'ok', 'needUpdate': need_update, 'serverVersion': server_version } ) def _trigger_remote_agent_update(self, worker, target_version: str): """ 通过 SSH 触发远程 agent 更新(后台执行,不阻塞心跳响应) 使用 Redis 锁防止重复触发(同一 worker 60秒内只触发一次) """ import redis from django.conf import settings as django_settings redis_url = f"redis://{django_settings.REDIS_HOST}:{django_settings.REDIS_PORT}/{django_settings.REDIS_DB}" redis_client = redis.from_url(redis_url) lock_key = f"agent_update_lock:{worker.id}" # 尝试获取锁(60秒过期,防止重复触发) if not redis_client.set(lock_key, "1", nx=True, ex=60): logger.debug(f"Worker {worker.name} 更新已在进行中,跳过") return # 获取锁成功,设置状态为 updating self._set_worker_status(worker.id, 'updating') # 提取数据避免后台线程访问 ORM worker_id = worker.id worker_name = worker.name ip_address = worker.ip_address ssh_port = worker.ssh_port username = worker.username password = worker.password def _async_update(): try: logger.info(f"开始远程更新 Worker {worker_name} 到 {target_version}") # 构建更新命令:拉取新镜像并重启 agent docker_user = getattr(django_settings, 'DOCKER_USER', 'yyhuni') update_cmd = f''' docker pull {docker_user}/xingrin-agent:{target_version} && \ docker stop xingrin-agent 2>/dev/null || true && \ docker rm xingrin-agent 2>/dev/null || true && \ docker run -d --pull=always \ --name xingrin-agent \ --restart always \ -e HEARTBEAT_API_URL="https://{django_settings.PUBLIC_HOST}:{getattr(django_settings, 'PUBLIC_PORT', '8083')}" \ -e WORKER_ID="{worker_id}" \ -e IMAGE_TAG="{target_version}" \ -v /proc:/host/proc:ro \ {docker_user}/xingrin-agent:{target_version} ''' success, message = self.worker_service.execute_remote_command( ip_address=ip_address, ssh_port=ssh_port, username=username, password=password, command=update_cmd ) if success: logger.info(f"Worker {worker_name} 远程更新成功") # 更新成功后,新 agent 心跳会自动把状态改回 online else: logger.warning(f"Worker {worker_name} 远程更新失败: {message}") # 更新失败,标记为 outdated self._set_worker_status(worker_id, 'outdated') except Exception as e: logger.error(f"Worker {worker_name} 远程更新异常: {e}") self._set_worker_status(worker_id, 'outdated') finally: # 释放锁 redis_client.delete(lock_key) # 后台执行,不阻塞心跳响应 threading.Thread(target=_async_update, daemon=True).start() def _set_worker_status(self, worker_id: int, status: str): """更新 Worker 状态(用于后台线程)""" try: from apps.engine.models import WorkerNode WorkerNode.objects.filter(id=worker_id).update(status=status) except Exception as e: logger.error(f"更新 Worker {worker_id} 状态失败: {e}") @action(detail=False, methods=['post']) def register(self, request): """ Worker 自注册 API 本地 Worker 启动时调用此接口注册自己。 如果同名节点已存在,返回现有记录;否则创建新记录。 请求体: { "name": "Local-Scan-Worker", "is_local": true } 返回: { "worker_id": 1, "name": "Local-Scan-Worker", "created": false # true 表示新创建,false 表示已存在 } """ name = request.data.get('name') is_local = request.data.get('is_local', True) if not name: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing name parameter', status_code=status.HTTP_400_BAD_REQUEST ) worker, created = self.worker_service.register_worker( name=name, is_local=is_local ) return success_response( data={ 'workerId': worker.id, 'name': worker.name, 'created': created } ) @action(detail=False, methods=['get']) def config(self, request): """ 获取任务容器配置(配置中心 API) Worker 启动时调用此接口获取完整配置,实现配置中心化管理。 Worker 通过 IS_LOCAL 环境变量声明身份,请求时带上 ?is_local=true/false 参数。 请求参数: is_local: true/false - Worker 是否为本地节点(Docker 网络内) 返回: { "db": {"host": "...", "port": "...", ...}, "paths": {"results": "...", "logs": "..."} } 配置逻辑: - 本地 Worker (is_local=true): db_host=postgres - 远程 Worker (is_local=false): db_host=PUBLIC_HOST """ from django.conf import settings import logging logger = logging.getLogger(__name__) # 从请求参数获取 Worker 身份(由 Worker 自己声明) # 不再依赖 IP 判断,避免不同网络环境下的兼容性问题 is_local_param = request.query_params.get('is_local', '').lower() is_local_worker = is_local_param == 'true' # 根据请求来源返回不同的数据库地址 db_host = settings.DATABASES['default']['HOST'] _is_internal_db = db_host in ('postgres', 'localhost', '127.0.0.1') logger.info( "Worker 配置请求 - is_local_param: %s, is_local_worker: %s, db_host: %s, is_internal_db: %s", is_local_param, is_local_worker, db_host, _is_internal_db ) if _is_internal_db: # 本地数据库场景 if is_local_worker: # 本地 Worker:直接用 Docker 内部服务名 worker_db_host = 'postgres' else: # 远程 Worker:通过公网 IP 访问 public_host = settings.PUBLIC_HOST if public_host in ('server', 'localhost', '127.0.0.1'): logger.warning("远程 Worker 请求配置,但 PUBLIC_HOST=%s 不是有效的公网地址", public_host) worker_db_host = public_host else: # 远程数据库场景:所有 Worker 都用 DB_HOST worker_db_host = db_host logger.info("返回 Worker 配置 - db_host: %s", worker_db_host) return success_response( data={ 'db': { 'host': worker_db_host, 'port': str(settings.DATABASES['default']['PORT']), 'name': settings.DATABASES['default']['NAME'], 'user': settings.DATABASES['default']['USER'], 'password': settings.DATABASES['default']['PASSWORD'], }, 'paths': { 'results': getattr(settings, 'CONTAINER_RESULTS_MOUNT', '/opt/xingrin/results'), 'logs': getattr(settings, 'CONTAINER_LOGS_MOUNT', '/opt/xingrin/logs'), }, 'logging': { 'level': os.getenv('LOG_LEVEL', 'INFO'), 'enableCommandLogging': os.getenv('ENABLE_COMMAND_LOGGING', 'true').lower() == 'true', }, 'debug': settings.DEBUG, } ) ================================================ FILE: backend/apps/scan/__init__.py ================================================ ================================================ FILE: backend/apps/scan/apps.py ================================================ from django.apps import AppConfig class ScanConfig(AppConfig): """扫描应用配置类""" default_auto_field = 'django.db.models.BigAutoField' name = 'apps.scan' def ready(self): """应用启动时注册信号接收器""" # 导入接收器模块以注册信号处理函数 from apps.scan.notifications import receivers # noqa: F401 ================================================ FILE: backend/apps/scan/configs/command_templates.py ================================================ """ 扫描工具命令模板(简化版,不使用 Jinja2) 使用 Python 原生字符串格式化,零依赖。 """ from django.conf import settings # ==================== 路径配置 ==================== SCAN_TOOLS_BASE_PATH = getattr(settings, 'SCAN_TOOLS_BASE_PATH', '/usr/local/bin') # ==================== 子域名发现 ==================== SUBDOMAIN_DISCOVERY_COMMANDS = { 'subfinder': { # 使用所有数据源(包括付费源,只要配置了 API key) # -all 使用所有数据源(slow 但全面) # -v 显示详细输出,包括使用的数据源(调试用) # 注意:不要加 -recursive,它会排除不支持递归的源(如 fofa) 'base': "subfinder -d {domain} -all -o '{output_file}' -v", 'optional': { 'threads': '-t {threads}', # 控制并发 goroutine 数 'provider_config': "-pc '{provider_config}'", # Provider 配置文件路径 } }, 'sublist3r': { 'base': "python3 '/usr/local/share/Sublist3r/sublist3r.py' -d {domain} -o '{output_file}'", 'optional': { 'threads': '-t {threads}' } }, 'assetfinder': { 'base': "assetfinder --subs-only {domain} > '{output_file}'", }, # === 主动字典爆破 === 'subdomain_bruteforce': { # 使用字典对目标域名进行 DNS 爆破 # -d 目标域名,-w 字典文件,-o 输出文件 'base': "puredns bruteforce '{wordlist}' {domain} -r /app/backend/resources/resolvers.txt --write '{output_file}' --quiet", 'optional': {}, }, # === DNS 存活验证(最终统一验证)=== 'subdomain_resolve': { # 验证子域名是否能解析(存活验证) # 输入文件为候选子域列表,输出为存活子域列表 'base': "puredns resolve '{input_file}' -r /app/backend/resources/resolvers.txt --write '{output_file}' --wildcard-tests 50 --wildcard-batch 1000000 --quiet", 'optional': {}, }, # === 变异生成 + 存活验证(流式管道,避免 OOM)=== 'subdomain_permutation_resolve': { # 流式管道:dnsgen 生成变异域名 | puredns resolve 验证存活 # 不落盘中间文件,避免内存爆炸;不做通配符过滤 'base': "cat '{input_file}' | dnsgen - | puredns resolve -r /app/backend/resources/resolvers.txt --write '{output_file}' --wildcard-tests 50 --wildcard-batch 1000000 --quiet", 'optional': {}, }, } # ==================== 端口扫描 ==================== PORT_SCAN_COMMANDS = { 'naabu_active': { 'base': "naabu -exclude-cdn -warm-up-time 5 -verify -list '{domains_file}' -json -silent", 'optional': { 'threads': '-c {threads}', 'ports': '-p {ports}', 'top_ports': '-top-ports {top_ports}', 'rate': '-rate {rate}' } }, 'naabu_passive': { 'base': "naabu -list '{domains_file}' -passive -json -silent" }, } # ==================== 站点扫描 ==================== SITE_SCAN_COMMANDS = { 'httpx': { 'base': ( "'{scan_tools_base}/httpx' -l '{url_file}' " '-status-code -content-type -content-length ' '-location -title -server ' '-tech-detect -cdn -vhost ' '-include-response ' '-rstr 2000 ' '-random-agent -no-color -json -silent' ), 'optional': { 'threads': '-threads {threads}', 'rate_limit': '-rate-limit {rate_limit}', 'request_timeout': '-timeout {request_timeout}', 'retries': '-retries {retries}' } }, } # ==================== 目录扫描 ==================== DIRECTORY_SCAN_COMMANDS = { 'ffuf': { 'base': "'{scan_tools_base}/ffuf' -u '{url}FUZZ' -se -ac -sf -json -w '{wordlist}'", 'optional': { 'delay': '-p {delay}', 'threads': '-t {threads}', 'request_timeout': '-timeout {request_timeout}', 'match_codes': '-mc {match_codes}', 'rate': '-rate {rate}' } }, } # ==================== URL 获取 ==================== URL_FETCH_COMMANDS = { 'waymore': { 'base': "waymore -i {domain_name} -mode U -oU '{output_file}'", 'input_type': 'domain_name' }, 'katana': { 'base': ( "katana -list '{sites_file}' -o '{output_file}' " '-jc ' # 开启 JavaScript 爬取 + 自动解析 .js 文件里的所有端点(最重要) '-xhr ' # 额外从 JS 中提取 XHR/Fetch 请求的 API 路径(再多挖 10-20% 隐藏接口) '-kf all ' # 在每个目录下自动 fuzz 所有已知敏感文件(.env、.git、backup、config、ds_store 等 5000+ 条) '-fs rdn ' # 智能过滤相对重复+噪声路径(分页、?id=1/2/3 这类垃圾全干掉,输出极干净) '-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" ' # 固定一个正常 UA(Katana 默认会随机,但固定更低调) '-silent ' # 安静模式(终端不输出进度条,只出 URL) ), 'optional': { 'depth': '-d {depth}', # 爬取最大深度(平衡深度与时间,默认 3,推荐 5) 'threads': '-c {threads}', # 全局并发数(极低并发最像真人,推荐 10) 'rate_limit': '-rl {rate_limit}', # 全局硬限速:每秒最多 N 个请求(WAF 几乎不报警,推荐 30) 'random_delay': '-rd {random_delay}', # 每次请求之间随机延迟 N 秒(再加一层人性化,推荐 1) 'retry': '-retry {retry}', # 失败请求自动重试次数(网络抖动不丢包,推荐 2) 'request_timeout': '-timeout {request_timeout}' # 单请求超时秒数(防卡死,推荐 12) }, 'input_type': 'sites_file' }, 'uro': { 'base': "uro -i '{input_file}' -o '{output_file}'", 'optional': { 'whitelist': '-w {whitelist}', # 只保留指定扩展名的 URL(空格分隔) 'blacklist': '-b {blacklist}', # 排除指定扩展名的 URL(空格分隔) 'filters': '-f {filters}' # 额外的过滤规则(空格分隔) } }, 'httpx': { 'base': ( "'{scan_tools_base}/httpx' -l '{url_file}' " '-status-code -content-type -content-length ' '-location -title -server ' '-tech-detect -cdn -vhost ' '-include-response ' '-rstr 2000 ' '-random-agent -no-color -json -silent' ), 'optional': { 'threads': '-threads {threads}', 'rate_limit': '-rate-limit {rate_limit}', 'request_timeout': '-timeout {request_timeout}', 'retries': '-retries {retries}' } }, } VULN_SCAN_COMMANDS = { 'dalfox_xss': { 'base': ( 'dalfox --silence --no-color --no-spinner ' '--skip-bav ' "file '{endpoints_file}' " '--waf-evasion ' '--format json' ), 'optional': { 'only_poc': '--only-poc {only_poc}', 'ignore_return': '--ignore-return {ignore_return}', 'blind_xss_server': '-b {blind_xss_server}', 'delay': '--delay {delay}', 'request_timeout': '--timeout {request_timeout}', # 是否追加 UA 头,由 user_agent 是否存在决定 'user_agent': '--user-agent "{user_agent}"', 'worker': '--worker {worker}', }, 'input_type': 'endpoints_file', }, 'nuclei': { # nuclei 漏洞扫描 # -j: JSON 输出(每行一条完整 JSON) # -silent: 静默模式 # -l: 输入 URL 列表文件 # -t: 模板目录路径(支持多个仓库,多次 -t 由 template_args 直接拼接) 'base': "nuclei -j -silent -l '{endpoints_file}' {template_args}", 'optional': { 'concurrency': '-c {concurrency}', # 并发数(默认 25) 'rate_limit': '-rl {rate_limit}', # 每秒请求数限制 'request_timeout': '-timeout {request_timeout}', # 请求超时秒数 'bulk_size': '-bs {bulk_size}', # 批量处理大小 'retries': '-retries {retries}', # 重试次数 'severity': '-severity {severity}', # 过滤严重性(info,low,medium,high,critical) 'tags': '-tags {tags}', # 过滤标签 'exclude_tags': '-etags {exclude_tags}', # 排除标签 }, 'input_type': 'endpoints_file', }, } # ==================== 指纹识别 ==================== FINGERPRINT_DETECT_COMMANDS = { 'xingfinger': { # 流式输出模式(不使用 -o,输出到 stdout) # -l: URL 列表文件输入 # -s: 静默模式,只输出命中结果 # --json: JSON 格式输出(每行一条) 'base': "xingfinger -l '{urls_file}' -s --json", 'optional': { # 自定义指纹库路径 'ehole': '--ehole {ehole}', 'goby': '--goby {goby}', 'wappalyzer': '--wappalyzer {wappalyzer}', 'fingers': '--fingers {fingers}', 'fingerprinthub': '--fingerprint {fingerprinthub}', 'arl': '--arl {arl}', } }, } # ==================== 工具映射 ==================== COMMAND_TEMPLATES = { 'subdomain_discovery': SUBDOMAIN_DISCOVERY_COMMANDS, 'port_scan': PORT_SCAN_COMMANDS, 'site_scan': SITE_SCAN_COMMANDS, 'fingerprint_detect': FINGERPRINT_DETECT_COMMANDS, 'directory_scan': DIRECTORY_SCAN_COMMANDS, 'url_fetch': URL_FETCH_COMMANDS, 'vuln_scan': VULN_SCAN_COMMANDS, 'screenshot': {}, # 使用 Python 原生库(Playwright),无命令模板 } # ==================== 扫描类型配置 ==================== # 执行阶段定义(按顺序执行) # Stage 1: 资产发现 - 子域名 → 端口 → 站点探测 → 指纹识别 # Stage 2: URL 收集 - URL 获取 + 目录扫描(并行) # Stage 3: 截图 - 在 URL 收集完成后执行,捕获更多发现的页面 # Stage 4: 漏洞扫描 - 最后执行 EXECUTION_STAGES = [ { 'mode': 'sequential', 'flows': ['subdomain_discovery', 'port_scan', 'site_scan', 'fingerprint_detect'] }, { 'mode': 'parallel', 'flows': ['url_fetch', 'directory_scan'] }, { 'mode': 'sequential', 'flows': ['screenshot'] }, { 'mode': 'sequential', 'flows': ['vuln_scan'] }, ] def get_supported_scan_types(): """ 获取支持的扫描类型 Returns: list: 支持的扫描类型列表(从 COMMAND_TEMPLATES 的 keys 获取) """ return list(COMMAND_TEMPLATES.keys()) def get_command_template(scan_type: str, tool_name: str) -> dict: """ 获取工具的命令模板 Args: scan_type: 扫描类型 tool_name: 工具名称 Returns: 命令模板字典,如果未找到则返回 None """ templates = COMMAND_TEMPLATES.get(scan_type, {}) return templates.get(tool_name) ================================================ FILE: backend/apps/scan/configs/engine_config_example.yaml ================================================ # 引擎配置 # # 参数命名:统一用中划线(如 rate-limit),系统自动转换为下划线 # 必需参数:enabled(是否启用) # 可选参数:timeout(超时秒数,默认 auto 自动计算) subdomain_discovery: # ==================== 子域名发现 ==================== # Stage 1: 被动收集(并行) - 必选,至少启用一个工具 # Stage 2: 字典爆破(可选) - 使用字典暴力枚举子域名 # Stage 3: 变异生成 + 验证(可选) - 基于已发现域名生成变异,流式验证存活 # Stage 4: DNS 存活验证(可选) - 验证所有候选域名是否能解析 # === Stage 1: 被动收集工具(并行执行)=== passive_tools: subfinder: enabled: true timeout: 3600 # 1小时 # threads: 10 # 并发 goroutine 数 sublist3r: enabled: true timeout: 3600 # threads: 50 # 线程数 assetfinder: enabled: true timeout: 3600 # === Stage 2: 主动字典爆破(可选)=== bruteforce: enabled: false subdomain_bruteforce: # timeout: auto # 自动根据字典行数计算 wordlist-name: subdomains-top1million-110000.txt # 对应「字典管理」中的 Wordlist.name # === Stage 3: 变异生成 + 存活验证(可选)=== permutation: enabled: true subdomain_permutation_resolve: timeout: 7200 # === Stage 4: DNS 存活验证(可选)=== resolve: enabled: true subdomain_resolve: timeout: auto # 自动根据候选子域数量计算 port_scan: # ==================== 端口扫描 ==================== tools: naabu_active: enabled: true # timeout: auto # 自动计算(目标数 × 端口数 × 0.5秒),范围 60秒 ~ 2天 threads: 200 # 并发连接数(默认 5) # ports: 1-65535 # 扫描端口范围(默认 1-65535) top-ports: 100 # 扫描 nmap top 100 端口 rate: 50 # 扫描速率 naabu_passive: enabled: true # timeout: auto # 被动扫描通常较快 site_scan: # ==================== 站点扫描 ==================== tools: httpx: enabled: true # timeout: auto # 自动计算(每个 URL 约 1 秒) # threads: 50 # 并发线程数(默认 50) # rate-limit: 150 # 每秒请求数(默认 150) # request-timeout: 10 # 单个请求超时秒数(默认 10) # retries: 2 # 请求失败重试次数 fingerprint_detect: # ==================== 指纹识别 ==================== # 在 站点扫描 后串行执行,识别 WebSite 的技术栈 tools: xingfinger: enabled: true fingerprint-libs: [ehole, goby, wappalyzer, fingers, fingerprinthub, arl] # 默认启动全部指纹库 directory_scan: # ==================== 目录扫描 ==================== tools: ffuf: enabled: true # timeout: auto # 自动计算(字典行数 × 0.02秒),范围 60秒 ~ 2小时 max-workers: 5 # 并发扫描站点数(默认 5) wordlist-name: dir_default.txt # 对应「字典管理」中的 Wordlist.name delay: 0.1-2.0 # 请求间隔,支持范围随机(如 "0.1-2.0") threads: 10 # 并发线程数(默认 40) request-timeout: 10 # HTTP 请求超时秒数(默认 10) match-codes: 200,201,301,302,401,403 # 匹配的 HTTP 状态码 # rate: 0 # 每秒请求数(默认 0 不限制) screenshot: # ==================== 网站截图 ==================== # 使用 Playwright 对网站进行截图,保存为 WebP 格式 # 在 Stage 2 与 url_fetch、directory_scan 并行执行 tools: playwright: enabled: true concurrency: 5 # 并发截图数(默认 5) url_sources: [websites] # URL 来源,当前对website截图,还可以用 [websites, endpoints] url_fetch: # ==================== URL 获取 ==================== tools: waymore: enabled: true timeout: 3600 # 固定 1 小时(按域名输入) katana: enabled: true # timeout: auto # 自动计算(根据站点数量) depth: 5 # 爬取最大深度(默认 3) threads: 10 # 全局并发数 rate-limit: 30 # 每秒最多请求数 random-delay: 1 # 请求间随机延迟秒数 retry: 2 # 失败重试次数 request-timeout: 12 # 单请求超时秒数 uro: enabled: true # timeout: auto # 自动计算(每 100 个 URL 约 1 秒),范围 30 ~ 300 秒 # whitelist: # 只保留指定扩展名 # - php # - asp # blacklist: # 排除指定扩展名(静态资源) # - jpg # - png # - css # filters: # 额外过滤规则 # - hasparams # 只保留有参数的 URL # - vuln # 只保留可能有漏洞的 URL httpx: enabled: true # timeout: auto # 自动计算(每个 URL 约 1 秒) # threads: 50 # 并发线程数(默认 50) # rate-limit: 150 # 每秒请求数(默认 150) # request-timeout: 10 # 单个请求超时秒数(默认 10) # retries: 2 # 请求失败重试次数 vuln_scan: # ==================== 漏洞扫描 ==================== tools: dalfox_xss: enabled: true # timeout: auto # 自动计算(endpoints 行数 × 100 秒) request-timeout: 10 # 单个请求超时秒数 only-poc: r # 只输出 POC 结果(r: 反射型) ignore-return: "302,404,403" # 忽略的返回码 delay: 50 # 请求间隔(毫秒) worker: 30 # worker 数量 user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" # blind-xss-server: xxx # 盲打 XSS 回连服务地址 nuclei: enabled: true # timeout: auto # 自动计算(根据 endpoints 行数) template-repo-names: # 模板仓库列表,对应「Nuclei 模板」中的仓库名 - nuclei-templates # - nuclei-custom # 可追加自定义仓库 concurrency: 25 # 并发数(默认 25) rate-limit: 150 # 每秒请求数限制(默认 150) request-timeout: 5 # 单个请求超时秒数(默认 5) severity: medium,high,critical # 只扫描中高危 # tags: cve,rce # 只使用指定标签的模板 ================================================ FILE: backend/apps/scan/flows/__init__.py ================================================ """Prefect Flows(编排层) 注意:大部分 Flow 已迁移到 scripts/ 目录作为普通脚本执行 """ from .initiate_scan_flow import initiate_scan_flow from .subdomain_discovery_flow import subdomain_discovery_flow from .fingerprint_detect_flow import fingerprint_detect_flow __all__ = [ 'initiate_scan_flow', 'subdomain_discovery_flow', 'fingerprint_detect_flow', ] ================================================ FILE: backend/apps/scan/flows/directory_scan_flow.py ================================================ """ 目录扫描 Flow 负责编排目录扫描的完整流程 架构: - Flow 负责编排多个原子 Task - 支持并发执行扫描工具(使用 ThreadPoolTaskRunner) - 每个 Task 可独立重试 - 配置由 YAML 解析 """ import hashlib import logging import subprocess from datetime import datetime from pathlib import Path from typing import List, Tuple from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.tasks.directory_scan import ( export_sites_task, run_and_stream_save_directories_task, ) from apps.scan.utils import ( build_scan_command, ensure_wordlist_local, user_log, wait_for_system_load, ) logger = logging.getLogger(__name__) # 默认最大并发数 DEFAULT_MAX_WORKERS = 5 def calculate_directory_scan_timeout( tool_config: dict, base_per_word: float = 1.0, min_timeout: int = 60, ) -> int: """ 根据字典行数计算目录扫描超时时间 计算公式:超时时间 = 字典行数 × 每个单词基础时间 超时范围:最小 60 秒,无上限 Args: tool_config: 工具配置字典,包含 wordlist 路径 base_per_word: 每个单词的基础时间(秒),默认 1.0秒 min_timeout: 最小超时时间(秒),默认 60秒 Returns: int: 计算出的超时时间(秒) """ import os wordlist_path = tool_config.get('wordlist') if not wordlist_path: logger.warning("工具配置中未指定 wordlist,使用默认超时: %d秒", min_timeout) return min_timeout wordlist_path = os.path.expanduser(wordlist_path) if not os.path.exists(wordlist_path): logger.warning("字典文件不存在: %s,使用默认超时: %d秒", wordlist_path, min_timeout) return min_timeout try: result = subprocess.run( ['wc', '-l', wordlist_path], capture_output=True, text=True, check=True ) line_count = int(result.stdout.strip().split()[0]) timeout = max(min_timeout, int(line_count * base_per_word)) logger.info( "目录扫描超时计算 - 字典: %s, 行数: %d, 基础时间: %.3f秒/词, 计算超时: %d秒", wordlist_path, line_count, base_per_word, timeout ) return timeout except (subprocess.CalledProcessError, ValueError, IndexError) as e: logger.error("计算超时时间失败: %s", e) return min_timeout def _get_max_workers(tool_config: dict, default: int = DEFAULT_MAX_WORKERS) -> int: """从单个工具配置中获取 max_workers 参数""" if not isinstance(tool_config, dict): return default max_workers = tool_config.get('max_workers') or tool_config.get('max-workers') if isinstance(max_workers, int) and max_workers > 0: return max_workers return default def _export_site_urls( target_id: int, directory_scan_dir: Path ) -> Tuple[str, int]: """ 导出目标下的所有站点 URL 到文件 Args: target_id: 目标 ID directory_scan_dir: 目录扫描目录 Returns: tuple: (sites_file, site_count) """ logger.info("Step 1: 导出目标的所有站点 URL") sites_file = str(directory_scan_dir / 'sites.txt') export_result = export_sites_task( target_id=target_id, output_file=sites_file, batch_size=1000 ) site_count = export_result['total_count'] logger.info( "✓ 站点 URL 导出完成 - 文件: %s, 数量: %d", export_result['output_file'], site_count ) if site_count == 0: logger.warning("目标下没有站点,无法执行目录扫描") return export_result['output_file'], site_count def _generate_log_filename( tool_name: str, site_url: str, directory_scan_dir: Path ) -> Path: """生成唯一的日志文件名(使用 URL 的 hash 确保并发时不会冲突)""" url_hash = hashlib.md5( site_url.encode(), usedforsecurity=False ).hexdigest()[:8] timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f') return directory_scan_dir / f"{tool_name}_{url_hash}_{timestamp}.log" def _prepare_tool_wordlist(tool_name: str, tool_config: dict) -> bool: """准备工具的字典文件,返回是否成功""" wordlist_name = tool_config.get('wordlist_name') if not wordlist_name: return True try: local_wordlist_path = ensure_wordlist_local(wordlist_name) tool_config['wordlist'] = local_wordlist_path return True except Exception as exc: logger.error("为工具 %s 准备字典失败: %s", tool_name, exc) return False def _build_scan_params( tool_name: str, tool_config: dict, sites: List[str], directory_scan_dir: Path, site_timeout: int ) -> Tuple[List[dict], List[str]]: """构建所有站点的扫描参数,返回 (scan_params_list, failed_sites)""" scan_params_list = [] failed_sites = [] for idx, site_url in enumerate(sites, 1): try: command = build_scan_command( tool_name=tool_name, scan_type='directory_scan', command_params={'url': site_url}, tool_config=tool_config ) log_file = _generate_log_filename(tool_name, site_url, directory_scan_dir) scan_params_list.append({ 'idx': idx, 'site_url': site_url, 'command': command, 'log_file': str(log_file), 'timeout': site_timeout }) except Exception as e: logger.error( "✗ [%d/%d] 构建 %s 命令失败: %s - 站点: %s", idx, len(sites), tool_name, e, site_url ) failed_sites.append(site_url) return scan_params_list, failed_sites def _execute_batch( batch_params: List[dict], tool_name: str, scan_id: int, target_id: int, directory_scan_dir: Path, total_sites: int ) -> Tuple[int, List[str]]: """执行一批扫描任务,返回 (directories_found, failed_sites)""" directories_found = 0 failed_sites = [] # 提交任务 futures = [] for params in batch_params: future = run_and_stream_save_directories_task.submit( cmd=params['command'], tool_name=tool_name, scan_id=scan_id, target_id=target_id, site_url=params['site_url'], cwd=str(directory_scan_dir), shell=True, batch_size=1000, timeout=params['timeout'], log_file=params['log_file'] ) futures.append((params['idx'], params['site_url'], future)) # 等待结果 for idx, site_url, future in futures: try: result = future.result() dirs_count = result.get('created_directories', 0) directories_found += dirs_count logger.info( "✓ [%d/%d] 站点扫描完成: %s - 发现 %d 个目录", idx, total_sites, site_url, dirs_count ) except Exception as exc: failed_sites.append(site_url) if 'timeout' in str(exc).lower(): logger.warning( "⚠️ [%d/%d] 站点扫描超时: %s - 错误: %s", idx, total_sites, site_url, exc ) else: logger.error( "✗ [%d/%d] 站点扫描失败: %s - 错误: %s", idx, total_sites, site_url, exc ) return directories_found, failed_sites def _run_scans_concurrently( enabled_tools: dict, sites_file: str, directory_scan_dir: Path, scan_id: int, target_id: int, ) -> Tuple[int, int, List[str]]: """ 并发执行目录扫描任务 Returns: tuple: (total_directories, processed_sites, failed_sites) """ # 读取站点列表 sites: List[str] = [] with open(sites_file, 'r', encoding='utf-8') as f: sites = [line.strip() for line in f if line.strip()] if not sites: logger.warning("站点列表为空") return 0, 0, [] logger.info( "准备并发扫描 %d 个站点,使用工具: %s", len(sites), ', '.join(enabled_tools.keys()) ) total_directories = 0 processed_sites_count = 0 failed_sites: List[str] = [] for tool_name, tool_config in enabled_tools.items(): max_workers = _get_max_workers(tool_config) logger.info("=" * 60) logger.info("使用工具: %s (并发模式, max_workers=%d)", tool_name, max_workers) logger.info("=" * 60) user_log(scan_id, "directory_scan", f"Running {tool_name}") # 准备字典文件 if not _prepare_tool_wordlist(tool_name, tool_config): failed_sites.extend(sites) continue # 计算超时时间 site_timeout = tool_config.get('timeout', 300) if site_timeout == 'auto': site_timeout = calculate_directory_scan_timeout(tool_config) logger.info("✓ 工具 %s 动态计算 timeout: %d秒", tool_name, site_timeout) # 构建扫描参数 scan_params_list, build_failed = _build_scan_params( tool_name, tool_config, sites, directory_scan_dir, site_timeout ) failed_sites.extend(build_failed) if not scan_params_list: logger.warning("没有有效的扫描任务") continue # 分批执行 total_tasks = len(scan_params_list) logger.info("开始分批执行 %d 个扫描任务(每批 %d 个)...", total_tasks, max_workers) last_progress_percent = 0 tool_directories = 0 tool_processed = 0 for batch_start in range(0, total_tasks, max_workers): batch_end = min(batch_start + max_workers, total_tasks) batch_params = scan_params_list[batch_start:batch_end] batch_num = batch_start // max_workers + 1 logger.info( "执行第 %d 批任务(%d-%d/%d)...", batch_num, batch_start + 1, batch_end, total_tasks ) dirs_found, batch_failed = _execute_batch( batch_params, tool_name, scan_id, target_id, directory_scan_dir, len(sites) ) total_directories += dirs_found tool_directories += dirs_found tool_processed += len(batch_params) - len(batch_failed) processed_sites_count += len(batch_params) - len(batch_failed) failed_sites.extend(batch_failed) # 进度里程碑:每 20% 输出一次 current_progress = int((batch_end / total_tasks) * 100) if current_progress >= last_progress_percent + 20: user_log( scan_id, "directory_scan", f"Progress: {batch_end}/{total_tasks} sites scanned" ) last_progress_percent = (current_progress // 20) * 20 logger.info( "✓ 工具 %s 执行完成 - 已处理站点: %d/%d, 发现目录: %d", tool_name, tool_processed, total_tasks, tool_directories ) user_log( scan_id, "directory_scan", f"{tool_name} completed: found {tool_directories} directories" ) if failed_sites: logger.warning("部分站点扫描失败: %d/%d", len(failed_sites), len(sites)) logger.info( "✓ 并发目录扫描执行完成 - 成功: %d/%d, 失败: %d, 总目录数: %d", processed_sites_count, len(sites), len(failed_sites), total_directories ) return total_directories, processed_sites_count, failed_sites @flow( name="directory_scan", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def directory_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """ 目录扫描 Flow 主要功能: 1. 从 target 获取所有站点的 URL 2. 对每个站点 URL 执行目录扫描(支持 ffuf 等工具) 3. 流式保存扫描结果到数据库 Directory 表 Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作空间目录 enabled_tools: 启用的工具配置字典 Returns: dict: 扫描结果 """ try: wait_for_system_load(context="directory_scan_flow") logger.info( "开始目录扫描 - Scan ID: %s, Target: %s, Workspace: %s", scan_id, target_name, scan_workspace_dir ) user_log(scan_id, "directory_scan", "Starting directory scan") # 参数验证 if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") if not enabled_tools: raise ValueError("enabled_tools 不能为空") # Step 0: 创建工作目录 from apps.scan.utils import setup_scan_directory directory_scan_dir = setup_scan_directory(scan_workspace_dir, 'directory_scan') # Step 1: 导出站点 URL sites_file, site_count = _export_site_urls(target_id, directory_scan_dir) if site_count == 0: logger.warning("跳过目录扫描:没有站点可扫描 - Scan ID: %s", scan_id) user_log(scan_id, "directory_scan", "Skipped: no sites to scan", "warning") return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'sites_file': sites_file, 'site_count': 0, 'total_directories': 0, 'processed_sites': 0, 'failed_sites_count': 0, 'executed_tasks': ['export_sites'] } # Step 2: 工具配置信息 logger.info("Step 2: 工具配置信息") tool_info = [ f"{name}(max_workers={_get_max_workers(cfg)})" for name, cfg in enabled_tools.items() ] logger.info("✓ 启用工具: %s", ', '.join(tool_info)) # Step 3: 并发执行扫描 logger.info("Step 3: 并发执行扫描工具并实时保存结果") total_directories, processed_sites, failed_sites = _run_scans_concurrently( enabled_tools=enabled_tools, sites_file=sites_file, directory_scan_dir=directory_scan_dir, scan_id=scan_id, target_id=target_id, ) if processed_sites == 0 and site_count > 0: logger.warning( "所有站点扫描均失败 - 总站点数: %d, 失败数: %d", site_count, len(failed_sites) ) logger.info("✓ 目录扫描完成 - 发现目录: %d", total_directories) user_log( scan_id, "directory_scan", f"directory_scan completed: found {total_directories} directories" ) return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'sites_file': sites_file, 'site_count': site_count, 'total_directories': total_directories, 'processed_sites': processed_sites, 'failed_sites_count': len(failed_sites), 'executed_tasks': ['export_sites', 'run_and_stream_save_directories'] } except Exception as e: logger.exception("目录扫描失败: %s", e) raise ================================================ FILE: backend/apps/scan/flows/fingerprint_detect_flow.py ================================================ """ 指纹识别 Flow 负责编排指纹识别的完整流程 架构: - Flow 负责编排多个原子 Task - 在 site_scan 后串行执行 - 使用 xingfinger 工具识别技术栈 - 流式处理输出,批量更新数据库 """ import logging from datetime import datetime from pathlib import Path from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.tasks.fingerprint_detect import ( export_urls_for_fingerprint_task, run_xingfinger_and_stream_update_tech_task, ) from apps.scan.utils import build_scan_command, user_log, wait_for_system_load from apps.scan.utils.fingerprint_helpers import get_fingerprint_paths logger = logging.getLogger(__name__) def calculate_fingerprint_detect_timeout( url_count: int, base_per_url: float = 10.0, min_timeout: int = 300 ) -> int: """ 根据 URL 数量计算超时时间 公式:超时时间 = URL 数量 × 每 URL 基础时间 最小值:300秒,无上限 Args: url_count: URL 数量 base_per_url: 每 URL 基础时间(秒),默认 10秒 min_timeout: 最小超时时间(秒),默认 300秒 Returns: int: 计算出的超时时间(秒) """ return max(min_timeout, int(url_count * base_per_url)) def _export_urls( target_id: int, fingerprint_dir: Path, source: str = 'website' ) -> tuple[str, int]: """ 导出 URL 到文件 Args: target_id: 目标 ID fingerprint_dir: 指纹识别目录 source: 数据源类型 Returns: tuple: (urls_file, total_count) """ logger.info("Step 1: 导出 URL 列表 (source=%s)", source) urls_file = str(fingerprint_dir / 'urls.txt') export_result = export_urls_for_fingerprint_task( target_id=target_id, output_file=urls_file, source=source, batch_size=1000 ) total_count = export_result['total_count'] logger.info( "✓ URL 导出完成 - 文件: %s, 数量: %d", export_result['output_file'], total_count ) return export_result['output_file'], total_count def _run_fingerprint_detect( enabled_tools: dict, urls_file: str, url_count: int, fingerprint_dir: Path, scan_id: int, target_id: int, source: str ) -> tuple[dict, list]: """ 执行指纹识别任务 Args: enabled_tools: 已启用的工具配置字典 urls_file: URL 文件路径 url_count: URL 总数 fingerprint_dir: 指纹识别目录 scan_id: 扫描任务 ID target_id: 目标 ID source: 数据源类型 Returns: tuple: (tool_stats, failed_tools) """ tool_stats = {} failed_tools = [] for tool_name, tool_config in enabled_tools.items(): # 1. 获取指纹库路径 lib_names = tool_config.get('fingerprint_libs', ['ehole']) fingerprint_paths = get_fingerprint_paths(lib_names) if not fingerprint_paths: reason = f"没有可用的指纹库: {lib_names}" logger.warning(reason) failed_tools.append({'tool': tool_name, 'reason': reason}) continue # 2. 将指纹库路径合并到 tool_config(用于命令构建) tool_config_with_paths = {**tool_config, **fingerprint_paths} # 3. 构建命令 try: command = build_scan_command( tool_name=tool_name, scan_type='fingerprint_detect', command_params={'urls_file': urls_file}, tool_config=tool_config_with_paths ) except Exception as e: reason = f"命令构建失败: {e}" logger.error("构建 %s 命令失败: %s", tool_name, e) failed_tools.append({'tool': tool_name, 'reason': reason}) continue # 4. 计算超时时间 timeout = calculate_fingerprint_detect_timeout(url_count) # 5. 生成日志文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = fingerprint_dir / f"{tool_name}_{timestamp}.log" logger.info( "开始执行 %s 指纹识别 - URL数: %d, 超时: %ds, 指纹库: %s", tool_name, url_count, timeout, list(fingerprint_paths.keys()) ) user_log(scan_id, "fingerprint_detect", f"Running {tool_name}: {command}") # 6. 执行扫描任务 try: result = run_xingfinger_and_stream_update_tech_task( cmd=command, tool_name=tool_name, scan_id=scan_id, target_id=target_id, source=source, cwd=str(fingerprint_dir), timeout=timeout, log_file=str(log_file), batch_size=100 ) tool_stats[tool_name] = { 'command': command, 'result': result, 'timeout': timeout, 'fingerprint_libs': list(fingerprint_paths.keys()) } tool_updated = result.get('updated_count', 0) logger.info( "✓ 工具 %s 执行完成 - 处理记录: %d, 更新: %d, 未找到: %d", tool_name, result.get('processed_records', 0), tool_updated, result.get('not_found_count', 0) ) user_log( scan_id, "fingerprint_detect", f"{tool_name} completed: identified {tool_updated} fingerprints" ) except Exception as exc: reason = str(exc) failed_tools.append({'tool': tool_name, 'reason': reason}) logger.error("工具 %s 执行失败: %s", tool_name, exc, exc_info=True) user_log(scan_id, "fingerprint_detect", f"{tool_name} failed: {reason}", "error") if failed_tools: logger.warning( "以下指纹识别工具执行失败: %s", ', '.join([f['tool'] for f in failed_tools]) ) return tool_stats, failed_tools @flow( name="fingerprint_detect", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def fingerprint_detect_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """ 指纹识别 Flow 主要功能: 1. 从数据库导出目标下所有 WebSite URL 到文件 2. 使用 xingfinger 进行技术栈识别 3. 解析结果并更新 WebSite.tech 字段(合并去重) 工作流程: Step 0: 创建工作目录 Step 1: 导出 URL 列表 Step 2: 解析配置,获取启用的工具 Step 3: 执行 xingfinger 并解析结果 Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作空间目录 enabled_tools: 启用的工具配置(xingfinger) Returns: dict: 扫描结果 """ try: # 负载检查:等待系统资源充足 wait_for_system_load(context="fingerprint_detect_flow") logger.info( "开始指纹识别 - Scan ID: %s, Target: %s, Workspace: %s", scan_id, target_name, scan_workspace_dir ) user_log(scan_id, "fingerprint_detect", "Starting fingerprint detection") # 参数验证 if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") # 数据源类型(当前只支持 website) source = 'website' # Step 0: 创建工作目录 from apps.scan.utils import setup_scan_directory fingerprint_dir = setup_scan_directory(scan_workspace_dir, 'fingerprint_detect') # Step 1: 导出 URL(支持懒加载) urls_file, url_count = _export_urls(target_id, fingerprint_dir, source) if url_count == 0: logger.warning("跳过指纹识别:没有 URL 可扫描 - Scan ID: %s", scan_id) user_log(scan_id, "fingerprint_detect", "Skipped: no URLs to scan", "warning") return _build_empty_result(scan_id, target_name, scan_workspace_dir, urls_file) # Step 2: 工具配置信息 logger.info("Step 2: 工具配置信息") logger.info("✓ 启用工具: %s", ', '.join(enabled_tools.keys())) # Step 3: 执行指纹识别 logger.info("Step 3: 执行指纹识别") tool_stats, failed_tools = _run_fingerprint_detect( enabled_tools=enabled_tools, urls_file=urls_file, url_count=url_count, fingerprint_dir=fingerprint_dir, scan_id=scan_id, target_id=target_id, source=source ) # 动态生成已执行的任务列表 executed_tasks = ['export_urls_for_fingerprint'] executed_tasks.extend([f'run_xingfinger ({tool})' for tool in tool_stats]) # 汇总所有工具的结果 total_processed = sum( stats['result'].get('processed_records', 0) for stats in tool_stats.values() ) total_updated = sum( stats['result'].get('updated_count', 0) for stats in tool_stats.values() ) total_created = sum( stats['result'].get('created_count', 0) for stats in tool_stats.values() ) total_snapshots = sum( stats['result'].get('snapshot_count', 0) for stats in tool_stats.values() ) # 记录 Flow 完成 logger.info("✓ 指纹识别完成 - 识别指纹: %d", total_updated) user_log( scan_id, "fingerprint_detect", f"fingerprint_detect completed: identified {total_updated} fingerprints" ) successful_tools = [ name for name in enabled_tools if name not in [f['tool'] for f in failed_tools] ] return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'urls_file': urls_file, 'url_count': url_count, 'processed_records': total_processed, 'updated_count': total_updated, 'created_count': total_created, 'snapshot_count': total_snapshots, 'executed_tasks': executed_tasks, 'tool_stats': { 'total': len(enabled_tools), 'successful': len(successful_tools), 'failed': len(failed_tools), 'successful_tools': successful_tools, 'failed_tools': failed_tools, 'details': tool_stats } } except ValueError as e: logger.error("配置错误: %s", e) raise except RuntimeError as e: logger.error("运行时错误: %s", e) raise except Exception as e: logger.exception("指纹识别失败: %s", e) raise def _build_empty_result( scan_id: int, target_name: str, scan_workspace_dir: str, urls_file: str ) -> dict: """构建空结果(无 URL 可扫描时)""" return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'urls_file': urls_file, 'url_count': 0, 'processed_records': 0, 'updated_count': 0, 'created_count': 0, 'snapshot_count': 0, 'executed_tasks': ['export_urls_for_fingerprint'], 'tool_stats': { 'total': 0, 'successful': 0, 'failed': 0, 'successful_tools': [], 'failed_tools': [], 'details': {} } } ================================================ FILE: backend/apps/scan/flows/initiate_scan_flow.py ================================================ """ 扫描初始化 Flow 负责编排扫描任务的初始化流程 职责: - 使用 FlowOrchestrator 解析 YAML 配置 - 在 Prefect Flow 中执行子 Flow(Subflow) - 按照 YAML 顺序编排工作流 - 不包含具体业务逻辑(由 Tasks 和 FlowOrchestrator 实现) 架构: - Flow: Prefect 编排层(本文件) - FlowOrchestrator: 配置解析和执行计划(apps/scan/services/) - Tasks: 执行层(apps/scan/tasks/) - Handlers: 状态管理(apps/scan/handlers/) """ # Django 环境初始化(导入即生效) # 注意:动态扫描容器应使用 run_initiate_scan.py 启动,以便在导入前设置环境变量 from apps.common.prefect_django_setup import setup_django_for_prefect from prefect import flow, task from pathlib import Path import logging from apps.scan.handlers import ( on_initiate_scan_flow_running, on_initiate_scan_flow_completed, on_initiate_scan_flow_failed, ) from prefect.futures import wait from apps.scan.utils import setup_scan_workspace from apps.scan.orchestrators import FlowOrchestrator logger = logging.getLogger(__name__) @task(name="run_subflow") def _run_subflow_task(scan_type: str, flow_func, flow_kwargs: dict): """包装子 Flow 的 Task,用于在并行阶段并发执行子 Flow。""" logger.info("开始执行子 Flow: %s", scan_type) return flow_func(**flow_kwargs) @flow( name='initiate_scan', description='扫描任务初始化流程', log_prints=True, on_running=[on_initiate_scan_flow_running], on_completion=[on_initiate_scan_flow_completed], on_failure=[on_initiate_scan_flow_failed], ) def initiate_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, engine_name: str, scheduled_scan_name: str | None = None, ) -> dict: """ 初始化扫描任务(动态工作流编排) 根据 YAML 配置动态编排工作流: - 从数据库获取 engine_config (YAML) - 检测启用的扫描类型 - 按照定义的阶段执行: Stage 1: Discovery (顺序执行) - subdomain_discovery - port_scan - site_scan Stage 2: Analysis (并行执行) - url_fetch - directory_scan Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: Scan 工作空间目录路径 engine_name: 引擎名称(用于显示) scheduled_scan_name: 定时扫描任务名称(可选,用于通知显示) Returns: dict: 执行结果摘要 Raises: ValueError: 参数验证失败或配置无效 RuntimeError: 执行失败 """ try: # ==================== 参数验证 ==================== if not scan_id: raise ValueError("scan_id is required") if not scan_workspace_dir: raise ValueError("scan_workspace_dir is required") if not engine_name: raise ValueError("engine_name is required") logger.info("="*60) logger.info("开始初始化扫描任务") logger.info(f"Scan ID: {scan_id}") logger.info(f"Target: {target_name}") logger.info(f"Engine: {engine_name}") logger.info(f"Workspace: {scan_workspace_dir}") logger.info("="*60) # ==================== Task 1: 创建 Scan 工作空间 ==================== scan_workspace_path = setup_scan_workspace(scan_workspace_dir) # ==================== Task 2: 获取引擎配置 ==================== from apps.scan.models import Scan scan = Scan.objects.get(id=scan_id) engine_config = scan.yaml_configuration # 使用 engine_names 进行显示 display_engine_name = ', '.join(scan.engine_names) if scan.engine_names else engine_name # ==================== Task 3: 解析配置,生成执行计划 ==================== orchestrator = FlowOrchestrator(engine_config) # FlowOrchestrator 已经解析了所有工具配置 enabled_tools_by_type = orchestrator.enabled_tools_by_type logger.info("执行计划生成成功") logger.info(f"扫描类型: {' → '.join(orchestrator.scan_types)}") logger.info(f"总共 {len(orchestrator.scan_types)} 个 Flow") # ==================== 初始化阶段进度 ==================== # 在解析完配置后立即初始化,此时已有完整的 scan_types 列表 from apps.scan.services import ScanService scan_service = ScanService() scan_service.init_stage_progress(scan_id, orchestrator.scan_types) logger.info(f"✓ 初始化阶段进度 - Stages: {orchestrator.scan_types}") # ==================== 更新 Target 最后扫描时间 ==================== # 在开始扫描时更新,表示"最后一次扫描开始时间" from apps.targets.services import TargetService target_service = TargetService() target_service.update_last_scanned_at(target_id) logger.info(f"✓ 更新 Target 最后扫描时间 - Target ID: {target_id}") # ==================== Task 3: 执行 Flow(动态阶段执行)==================== # 注意:各阶段状态更新由 scan_flow_handlers.py 自动处理(running/completed/failed) executed_flows = [] results = {} # 通用执行参数 flow_kwargs = { 'scan_id': scan_id, 'target_name': target_name, 'target_id': target_id, 'scan_workspace_dir': str(scan_workspace_path) } def record_flow_result(scan_type, result=None, error=None): """ 统一的结果记录函数 Args: scan_type: 扫描类型名称 result: 执行结果(成功时) error: 异常对象(失败时) """ if error: # 失败处理:记录错误但不抛出异常,让扫描继续执行后续阶段 error_msg = f"{scan_type} 执行失败: {str(error)}" logger.warning(error_msg) executed_flows.append(f"{scan_type} (失败)") results[scan_type] = {'success': False, 'error': str(error)} # 不再抛出异常,让扫描继续 else: # 成功处理 executed_flows.append(scan_type) results[scan_type] = result logger.info(f"✓ {scan_type} 执行成功") def get_valid_flows(flow_names): """ 获取有效的 Flow 函数列表,并为每个 Flow 准备专属参数 Args: flow_names: 扫描类型名称列表 Returns: list: [(scan_type, flow_func, flow_specific_kwargs), ...] 有效的函数列表 """ valid_flows = [] for scan_type in flow_names: flow_func = orchestrator.get_flow_function(scan_type) if flow_func: # 为每个 Flow 准备专属的参数(包含对应的 enabled_tools) flow_specific_kwargs = dict(flow_kwargs) flow_specific_kwargs['enabled_tools'] = enabled_tools_by_type.get(scan_type, {}) valid_flows.append((scan_type, flow_func, flow_specific_kwargs)) else: logger.warning(f"跳过未实现的 Flow: {scan_type}") return valid_flows # --------------------------------------------------------- # 动态阶段执行(基于 FlowOrchestrator 定义) # --------------------------------------------------------- for mode, enabled_flows in orchestrator.get_execution_stages(): if mode == 'sequential': # 顺序执行 logger.info("="*60) logger.info(f"顺序执行阶段: {', '.join(enabled_flows)}") logger.info("="*60) for scan_type, flow_func, flow_specific_kwargs in get_valid_flows(enabled_flows): logger.info("="*60) logger.info(f"执行 Flow: {scan_type}") logger.info("="*60) try: result = flow_func(**flow_specific_kwargs) record_flow_result(scan_type, result=result) except Exception as e: record_flow_result(scan_type, error=e) elif mode == 'parallel': # 并行执行阶段:通过 Task 包装子 Flow,并使用 Prefect TaskRunner 并发运行 logger.info("="*60) logger.info(f"并行执行阶段: {', '.join(enabled_flows)}") logger.info("="*60) futures = [] # 提交所有并行子 Flow 任务 for scan_type, flow_func, flow_specific_kwargs in get_valid_flows(enabled_flows): logger.info("="*60) logger.info(f"提交并行子 Flow 任务: {scan_type}") logger.info("="*60) future = _run_subflow_task.submit( scan_type=scan_type, flow_func=flow_func, flow_kwargs=flow_specific_kwargs, ) futures.append((scan_type, future)) # 等待所有并行子 Flow 完成 if futures: wait([f for _, f in futures]) # 检查结果(复用统一的结果处理逻辑) for scan_type, future in futures: try: result = future.result() record_flow_result(scan_type, result=result) except Exception as e: record_flow_result(scan_type, error=e) # ==================== 完成 ==================== logger.info("="*60) logger.info("✓ 扫描任务初始化完成") logger.info(f"执行的 Flow: {', '.join(executed_flows)}") logger.info("="*60) # ==================== 返回结果 ==================== return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': str(scan_workspace_path), 'executed_flows': executed_flows, 'results': results } except ValueError as e: # 参数错误 logger.error("参数错误: %s", e) raise except RuntimeError as e: # 执行失败 logger.error("运行时错误: %s", e) raise except OSError as e: # 文件系统错误(工作空间创建失败) logger.error("文件系统错误: %s", e) raise except Exception as e: # 其他未预期错误 logger.exception("初始化扫描任务失败: %s", e) # 注意:失败状态更新由 Prefect State Handlers 自动处理 raise ================================================ FILE: backend/apps/scan/flows/port_scan_flow.py ================================================ """ 端口扫描 Flow 负责编排端口扫描的完整流程 架构: - Flow 负责编排多个原子 Task - 支持串行执行扫描工具(流式处理) - 每个 Task 可独立重试 - 配置由 YAML 解析 """ import logging import subprocess from datetime import datetime from pathlib import Path from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.tasks.port_scan import ( export_hosts_task, run_and_stream_save_ports_task, ) from apps.scan.utils import build_scan_command, user_log, wait_for_system_load logger = logging.getLogger(__name__) def calculate_port_scan_timeout( tool_config: dict, file_path: str, base_per_pair: float = 0.5 ) -> int: """ 根据目标数量和端口数量计算超时时间 计算公式:超时时间 = 目标数 × 端口数 × base_per_pair 超时范围:60秒 ~ 无上限 Args: tool_config: 工具配置字典,包含端口配置(ports, top-ports等) file_path: 目标文件路径(域名/IP列表) base_per_pair: 每个"端口-目标对"的基础时间(秒),默认 0.5秒 Returns: int: 计算出的超时时间(秒),最小 60 秒 """ try: result = subprocess.run( ['wc', '-l', file_path], capture_output=True, text=True, check=True ) target_count = int(result.stdout.strip().split()[0]) port_count = _parse_port_count(tool_config) total_work = target_count * port_count timeout = max(60, int(total_work * base_per_pair)) logger.info( "计算端口扫描 timeout - 目标数: %d, 端口数: %d, 总工作量: %d, 超时: %d秒", target_count, port_count, total_work, timeout ) return timeout except Exception as e: logger.warning("计算 timeout 失败: %s,使用默认值 600秒", e) return 600 def _parse_port_count(tool_config: dict) -> int: """ 从工具配置中解析端口数量 优先级: 1. top-ports: N → 返回 N 2. ports: "80,443,8080" → 返回逗号分隔的数量 3. ports: "1-1000" → 返回范围的大小 4. ports: "1-65535" → 返回 65535 5. 默认 → 返回 100(naabu 默认扫描 top 100) Args: tool_config: 工具配置字典 Returns: int: 端口数量 """ # 检查 top-ports 配置 if 'top-ports' in tool_config: top_ports = tool_config['top-ports'] if isinstance(top_ports, int) and top_ports > 0: return top_ports logger.warning("top-ports 配置无效: %s,使用默认值", top_ports) # 检查 ports 配置 if 'ports' in tool_config: ports_str = str(tool_config['ports']).strip() # 逗号分隔的端口列表:80,443,8080 if ',' in ports_str: return len([p.strip() for p in ports_str.split(',') if p.strip()]) # 端口范围:1-1000 if '-' in ports_str: try: start, end = ports_str.split('-', 1) start_port = int(start.strip()) end_port = int(end.strip()) if 1 <= start_port <= end_port <= 65535: return end_port - start_port + 1 logger.warning("端口范围无效: %s,使用默认值", ports_str) except ValueError: logger.warning("端口范围解析失败: %s,使用默认值", ports_str) # 单个端口 try: port = int(ports_str) if 1 <= port <= 65535: return 1 except ValueError: logger.warning("端口配置解析失败: %s,使用默认值", ports_str) # 默认值:naabu 默认扫描 top 100 端口 return 100 def _export_hosts(target_id: int, port_scan_dir: Path) -> tuple[str, int, str]: """ 导出主机列表到文件 根据 Target 类型自动决定导出内容: - DOMAIN: 从 Subdomain 表导出子域名 - IP: 直接写入 target.name - CIDR: 展开 CIDR 范围内的所有 IP Args: target_id: 目标 ID port_scan_dir: 端口扫描目录 Returns: tuple: (hosts_file, host_count, target_type) """ logger.info("Step 1: 导出主机列表") hosts_file = str(port_scan_dir / 'hosts.txt') export_result = export_hosts_task( target_id=target_id, output_file=hosts_file, ) host_count = export_result['total_count'] target_type = export_result.get('target_type', 'unknown') logger.info( "✓ 主机列表导出完成 - 类型: %s, 文件: %s, 数量: %d", target_type, export_result['output_file'], host_count ) if host_count == 0: logger.warning("目标下没有可扫描的主机,无法执行端口扫描") return export_result['output_file'], host_count, target_type def _run_scans_sequentially( enabled_tools: dict, domains_file: str, port_scan_dir: Path, scan_id: int, target_id: int, target_name: str ) -> tuple[dict, int, list, list]: """ 串行执行端口扫描任务 Args: enabled_tools: 已启用的工具配置字典 domains_file: 域名文件路径 port_scan_dir: 端口扫描目录 scan_id: 扫描任务 ID target_id: 目标 ID target_name: 目标名称(用于错误日志) Returns: tuple: (tool_stats, processed_records, successful_tool_names, failed_tools) """ tool_stats = {} processed_records = 0 failed_tools = [] for tool_name, tool_config in enabled_tools.items(): # 构建命令 try: command = build_scan_command( tool_name=tool_name, scan_type='port_scan', command_params={'domains_file': domains_file}, tool_config=tool_config ) except Exception as e: reason = f"命令构建失败: {e}" logger.error("构建 %s 命令失败: %s", tool_name, e) failed_tools.append({'tool': tool_name, 'reason': reason}) continue # 获取超时时间 config_timeout = tool_config['timeout'] if config_timeout == 'auto': config_timeout = calculate_port_scan_timeout(tool_config, str(domains_file)) logger.info("✓ 工具 %s 动态计算 timeout: %d秒", tool_name, config_timeout) # 生成日志文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = port_scan_dir / f"{tool_name}_{timestamp}.log" logger.info("开始执行 %s 扫描(超时: %d秒)...", tool_name, config_timeout) user_log(scan_id, "port_scan", f"Running {tool_name}: {command}") # 执行扫描任务 try: result = run_and_stream_save_ports_task( cmd=command, tool_name=tool_name, scan_id=scan_id, target_id=target_id, cwd=str(port_scan_dir), shell=True, batch_size=1000, timeout=config_timeout, log_file=str(log_file) ) tool_stats[tool_name] = { 'command': command, 'result': result, 'timeout': config_timeout } tool_records = result.get('processed_records', 0) processed_records += tool_records logger.info("✓ 工具 %s 流式处理完成 - 记录数: %d", tool_name, tool_records) user_log(scan_id, "port_scan", f"{tool_name} completed: found {tool_records} ports") except subprocess.TimeoutExpired: reason = f"timeout after {config_timeout}s" failed_tools.append({'tool': tool_name, 'reason': reason}) logger.warning( "⚠️ 工具 %s 执行超时 - 超时配置: %d秒\n" "注意:超时前已解析的端口数据已保存到数据库,但扫描未完全完成。", tool_name, config_timeout ) user_log(scan_id, "port_scan", f"{tool_name} failed: {reason}", "error") except Exception as exc: reason = str(exc) failed_tools.append({'tool': tool_name, 'reason': reason}) logger.error("工具 %s 执行失败: %s", tool_name, exc, exc_info=True) user_log(scan_id, "port_scan", f"{tool_name} failed: {reason}", "error") if failed_tools: logger.warning( "以下扫描工具执行失败: %s", ', '.join([f['tool'] for f in failed_tools]) ) if not tool_stats: error_details = "; ".join([f"{f['tool']}: {f['reason']}" for f in failed_tools]) logger.warning("所有端口扫描工具均失败 - 目标: %s, 失败工具: %s", target_name, error_details) return {}, 0, [], failed_tools successful_tool_names = [ name for name in enabled_tools if name not in [f['tool'] for f in failed_tools] ] logger.info( "✓ 串行端口扫描执行完成 - 成功: %d/%d (成功: %s, 失败: %s)", len(tool_stats), len(enabled_tools), ', '.join(successful_tool_names) if successful_tool_names else '无', ', '.join([f['tool'] for f in failed_tools]) if failed_tools else '无' ) return tool_stats, processed_records, successful_tool_names, failed_tools @flow( name="port_scan", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def port_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """ 端口扫描 Flow 主要功能: 1. 扫描目标域名/IP 的开放端口 2. 保存 host + ip + port 三元映射到 HostPortMapping 表 输出资产: - HostPortMapping:主机端口映射(host + ip + port 三元组) 工作流程: Step 0: 创建工作目录 Step 1: 导出域名列表到文件(供扫描工具使用) Step 2: 解析配置,获取启用的工具 Step 3: 串行执行扫描工具,运行端口扫描工具并实时解析输出到数据库 Args: scan_id: 扫描任务 ID target_name: 域名 target_id: 目标 ID scan_workspace_dir: Scan 工作空间目录 enabled_tools: 启用的工具配置字典 Returns: dict: 扫描结果 Raises: ValueError: 配置错误 RuntimeError: 执行失败 """ try: wait_for_system_load(context="port_scan_flow") if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") if not enabled_tools: raise ValueError("enabled_tools 不能为空") logger.info( "开始端口扫描 - Scan ID: %s, Target: %s, Workspace: %s", scan_id, target_name, scan_workspace_dir ) user_log(scan_id, "port_scan", "Starting port scan") # Step 0: 创建工作目录 from apps.scan.utils import setup_scan_directory port_scan_dir = setup_scan_directory(scan_workspace_dir, 'port_scan') # Step 1: 导出主机列表 hosts_file, host_count, target_type = _export_hosts(target_id, port_scan_dir) if host_count == 0: logger.warning("跳过端口扫描:没有主机可扫描 - Scan ID: %s", scan_id) user_log(scan_id, "port_scan", "Skipped: no hosts to scan", "warning") return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'hosts_file': hosts_file, 'host_count': 0, 'target_type': target_type, 'processed_records': 0, 'executed_tasks': ['export_hosts'], 'tool_stats': { 'total': 0, 'successful': 0, 'failed': 0, 'successful_tools': [], 'failed_tools': [], 'details': {} } } # Step 2: 工具配置信息 logger.info("Step 2: 工具配置信息") logger.info("✓ 启用工具: %s", ', '.join(enabled_tools.keys())) # Step 3: 串行执行扫描工具 logger.info("Step 3: 串行执行扫描工具") tool_stats, processed_records, successful_tool_names, failed_tools = _run_scans_sequentially( enabled_tools=enabled_tools, domains_file=hosts_file, port_scan_dir=port_scan_dir, scan_id=scan_id, target_id=target_id, target_name=target_name ) logger.info("✓ 端口扫描完成 - 发现端口: %d", processed_records) user_log(scan_id, "port_scan", f"port_scan completed: found {processed_records} ports") executed_tasks = ['export_hosts', 'parse_config'] executed_tasks.extend([f'run_and_stream_save_ports ({tool})' for tool in tool_stats]) return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'hosts_file': hosts_file, 'host_count': host_count, 'target_type': target_type, 'processed_records': processed_records, 'executed_tasks': executed_tasks, 'tool_stats': { 'total': len(tool_stats) + len(failed_tools), 'successful': len(successful_tool_names), 'failed': len(failed_tools), 'successful_tools': successful_tool_names, 'failed_tools': failed_tools, 'details': tool_stats } } except ValueError as e: logger.error("配置错误: %s", e) raise except RuntimeError as e: logger.error("运行时错误: %s", e) raise except Exception as e: logger.exception("端口扫描失败: %s", e) raise ================================================ FILE: backend/apps/scan/flows/screenshot_flow.py ================================================ """ 截图 Flow 负责编排截图的完整流程: 1. 从数据库获取 URL 列表(websites 和/或 endpoints) 2. 批量截图并保存快照 3. 同步到资产表 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库获取 URL 2. Provider 模式:使用 TargetProvider 从任意数据源获取 URL """ import logging from typing import Optional from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.providers import TargetProvider from apps.scan.services.target_export_service import DataSource, get_urls_with_fallback from apps.scan.tasks.screenshot import capture_screenshots_task from apps.scan.utils import user_log, wait_for_system_load logger = logging.getLogger(__name__) # URL 来源到 DataSource 的映射 _SOURCE_MAPPING = { 'websites': DataSource.WEBSITE, 'endpoints': DataSource.ENDPOINT, } def _parse_screenshot_config(enabled_tools: dict) -> dict: """解析截图配置""" playwright_config = enabled_tools.get('playwright', {}) return { 'concurrency': playwright_config.get('concurrency', 5), 'url_sources': playwright_config.get('url_sources', ['websites']) } def _map_url_sources_to_data_sources(url_sources: list[str]) -> list[str]: """将配置中的 url_sources 映射为 DataSource 常量""" sources = [] for source in url_sources: if source in _SOURCE_MAPPING: sources.append(_SOURCE_MAPPING[source]) else: logger.warning("未知的 URL 来源: %s,跳过", source) # 添加默认回退(从 subdomain 构造) sources.append(DataSource.DEFAULT) return sources def _collect_urls_from_provider(provider: TargetProvider) -> tuple[list[str], str, list[str]]: """从 Provider 收集 URL""" logger.info("使用 Provider 模式获取 URL - Provider: %s", type(provider).__name__) urls = list(provider.iter_urls()) blacklist_filter = provider.get_blacklist_filter() if blacklist_filter: urls = [url for url in urls if blacklist_filter.is_allowed(url)] return urls, 'provider', ['provider'] def _collect_urls_from_database( target_id: int, url_sources: list[str] ) -> tuple[list[str], str, list[str]]: """从数据库收集 URL(带黑名单过滤和回退)""" data_sources = _map_url_sources_to_data_sources(url_sources) result = get_urls_with_fallback(target_id, sources=data_sources) return result['urls'], result['source'], result['tried_sources'] def _build_empty_result(scan_id: int, target_name: str) -> dict: """构建空结果""" return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'total_urls': 0, 'successful': 0, 'failed': 0, 'synced': 0 } @flow( name="screenshot", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def screenshot_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict, provider: Optional[TargetProvider] = None ) -> dict: """ 截图 Flow 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库获取 URL 2. Provider 模式:使用 TargetProvider 从任意数据源获取 URL Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作空间目录 enabled_tools: 启用的工具配置 provider: TargetProvider 实例(新模式,可选) Returns: 截图结果字典 """ try: # 负载检查:等待系统资源充足 wait_for_system_load(context="screenshot_flow") mode = 'Provider' if provider else 'Legacy' logger.info( "开始截图扫描 - Scan ID: %s, Target: %s, Mode: %s", scan_id, target_name, mode ) user_log(scan_id, "screenshot", "Starting screenshot capture") # Step 1: 解析配置 config = _parse_screenshot_config(enabled_tools) concurrency = config['concurrency'] logger.info("截图配置 - 并发: %d, URL来源: %s", concurrency, config['url_sources']) # Step 2: 收集 URL 列表 if provider is not None: urls, source_info, tried_sources = _collect_urls_from_provider(provider) else: urls, source_info, tried_sources = _collect_urls_from_database( target_id, config['url_sources'] ) logger.info( "URL 收集完成 - 来源: %s, 数量: %d, 尝试过: %s", source_info, len(urls), tried_sources ) if not urls: logger.warning("没有可截图的 URL,跳过截图任务") user_log(scan_id, "screenshot", "Skipped: no URLs to capture", "warning") return _build_empty_result(scan_id, target_name) user_log( scan_id, "screenshot", f"Found {len(urls)} URLs to capture (source: {source_info})" ) # Step 3: 批量截图 logger.info("批量截图 - %d 个 URL", len(urls)) capture_result = capture_screenshots_task( urls=urls, scan_id=scan_id, target_id=target_id, config={'concurrency': concurrency} ) # Step 4: 同步到资产表 logger.info("同步截图到资产表") from apps.asset.services.screenshot_service import ScreenshotService synced = ScreenshotService().sync_screenshots_to_asset(scan_id, target_id) total = capture_result['total'] successful = capture_result['successful'] failed = capture_result['failed'] logger.info( "✓ 截图完成 - 总数: %d, 成功: %d, 失败: %d, 同步: %d", total, successful, failed, synced ) user_log( scan_id, "screenshot", f"Screenshot completed: {successful}/{total} captured, {synced} synced" ) return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'total_urls': total, 'successful': successful, 'failed': failed, 'synced': synced } except Exception: logger.exception("截图 Flow 失败") user_log(scan_id, "screenshot", "Screenshot failed", "error") raise ================================================ FILE: backend/apps/scan/flows/site_scan_flow.py ================================================ """ 站点扫描 Flow 负责编排站点扫描的完整流程 架构: - Flow 负责编排多个原子 Task - 支持串行执行扫描工具(流式处理) - 每个 Task 可独立重试 - 配置由 YAML 解析 """ import logging import subprocess from dataclasses import dataclass from datetime import datetime from pathlib import Path from typing import Optional from prefect import flow # Django 环境初始化(导入即生效) from apps.common.prefect_django_setup import setup_django_for_prefect # noqa: F401 from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.tasks.site_scan import ( export_site_urls_task, run_and_stream_save_websites_task, ) from apps.scan.utils import build_scan_command, user_log, wait_for_system_load logger = logging.getLogger(__name__) @dataclass class ScanContext: """扫描上下文,封装扫描参数""" scan_id: int target_id: int target_name: str site_scan_dir: Path urls_file: str total_urls: int def _count_file_lines(file_path: str) -> int: """使用 wc -l 统计文件行数""" try: result = subprocess.run( ['wc', '-l', file_path], capture_output=True, text=True, check=True ) return int(result.stdout.strip().split()[0]) except (subprocess.CalledProcessError, ValueError, IndexError) as e: logger.warning("wc -l 计算行数失败: %s,返回 0", e) return 0 def _calculate_timeout_by_line_count( file_path: str, base_per_time: int = 1, min_timeout: int = 60 ) -> int: """ 根据文件行数计算 timeout Args: file_path: 要统计行数的文件路径 base_per_time: 每行的基础时间(秒),默认1秒 min_timeout: 最小超时时间(秒),默认60秒 Returns: int: 计算出的超时时间(秒),不低于 min_timeout """ line_count = _count_file_lines(file_path) timeout = max(line_count * base_per_time, min_timeout) logger.info( "timeout 自动计算: 文件=%s, 行数=%d, 每行时间=%d秒, timeout=%d秒", file_path, line_count, base_per_time, timeout ) return timeout def _export_site_urls( target_id: int, site_scan_dir: Path ) -> tuple[str, int, int]: """ 导出站点 URL 到文件 Args: target_id: 目标 ID site_scan_dir: 站点扫描目录 Returns: tuple: (urls_file, total_urls, association_count) """ logger.info("Step 1: 导出站点URL列表") urls_file = str(site_scan_dir / 'site_urls.txt') export_result = export_site_urls_task( target_id=target_id, output_file=urls_file, batch_size=1000 ) total_urls = export_result['total_urls'] association_count = export_result['association_count'] logger.info( "✓ 站点URL导出完成 - 文件: %s, URL数量: %d, 关联数: %d", export_result['output_file'], total_urls, association_count ) if total_urls == 0: logger.warning("目标下没有可用的站点URL,无法执行站点扫描") return export_result['output_file'], total_urls, association_count def _get_tool_timeout(tool_config: dict, urls_file: str) -> int: """获取工具超时时间(支持 'auto' 动态计算)""" config_timeout = tool_config.get('timeout', 300) if config_timeout == 'auto': return _calculate_timeout_by_line_count(urls_file, base_per_time=1) dynamic_timeout = _calculate_timeout_by_line_count(urls_file, base_per_time=1) return max(dynamic_timeout, config_timeout) def _execute_single_tool( tool_name: str, tool_config: dict, ctx: ScanContext ) -> Optional[dict]: """ 执行单个扫描工具 Returns: 成功返回结果字典,失败返回 None """ # 构建命令 try: command = build_scan_command( tool_name=tool_name, scan_type='site_scan', command_params={'url_file': ctx.urls_file}, tool_config=tool_config ) except (ValueError, KeyError) as e: logger.error("构建 %s 命令失败: %s", tool_name, e) return None timeout = _get_tool_timeout(tool_config, ctx.urls_file) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = ctx.site_scan_dir / f"{tool_name}_{timestamp}.log" logger.info( "开始执行 %s 站点扫描 - URL数: %d, 超时: %ds", tool_name, ctx.total_urls, timeout ) user_log(ctx.scan_id, "site_scan", f"Running {tool_name}: {command}") try: result = run_and_stream_save_websites_task( cmd=command, tool_name=tool_name, scan_id=ctx.scan_id, target_id=ctx.target_id, cwd=str(ctx.site_scan_dir), shell=True, timeout=timeout, log_file=str(log_file) ) tool_created = result.get('created_websites', 0) skipped = result.get('skipped_no_subdomain', 0) + result.get('skipped_failed', 0) logger.info( "✓ 工具 %s 完成 - 处理: %d, 创建: %d, 跳过: %d", tool_name, result.get('processed_records', 0), tool_created, skipped ) user_log( ctx.scan_id, "site_scan", f"{tool_name} completed: found {tool_created} websites" ) return {'command': command, 'result': result, 'timeout': timeout} except subprocess.TimeoutExpired: logger.warning( "⚠️ 工具 %s 执行超时 - 超时配置: %d秒 (超时前数据已保存)", tool_name, timeout ) user_log( ctx.scan_id, "site_scan", f"{tool_name} failed: timeout after {timeout}s", "error" ) except (OSError, RuntimeError) as exc: logger.error("工具 %s 执行失败: %s", tool_name, exc, exc_info=True) user_log(ctx.scan_id, "site_scan", f"{tool_name} failed: {exc}", "error") return None def _run_scans_sequentially( enabled_tools: dict, ctx: ScanContext ) -> tuple[dict, int, list, list]: """ 串行执行站点扫描任务 Returns: tuple: (tool_stats, processed_records, successful_tools, failed_tools) """ tool_stats = {} processed_records = 0 failed_tools = [] for tool_name, tool_config in enabled_tools.items(): result = _execute_single_tool(tool_name, tool_config, ctx) if result: tool_stats[tool_name] = result processed_records += result['result'].get('processed_records', 0) else: failed_tools.append({'tool': tool_name, 'reason': '执行失败'}) if failed_tools: logger.warning( "以下扫描工具执行失败: %s", ', '.join(f['tool'] for f in failed_tools) ) if not tool_stats: logger.warning( "所有站点扫描工具均失败 - 目标: %s", ctx.target_name ) return {}, 0, [], failed_tools successful_tools = [ name for name in enabled_tools if name not in {f['tool'] for f in failed_tools} ] logger.info( "✓ 站点扫描执行完成 - 成功: %d/%d", len(tool_stats), len(enabled_tools) ) return tool_stats, processed_records, successful_tools, failed_tools def _build_empty_result( scan_id: int, target_name: str, scan_workspace_dir: str, urls_file: str, association_count: int ) -> dict: """构建空结果(无 URL 可扫描时)""" return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'urls_file': urls_file, 'total_urls': 0, 'association_count': association_count, 'processed_records': 0, 'created_websites': 0, 'skipped_no_subdomain': 0, 'skipped_failed': 0, 'executed_tasks': ['export_site_urls'], 'tool_stats': { 'total': 0, 'successful': 0, 'failed': 0, 'successful_tools': [], 'failed_tools': [], 'details': {} } } def _aggregate_tool_results(tool_stats: dict) -> tuple[int, int, int]: """汇总工具结果""" total_created = sum( s['result'].get('created_websites', 0) for s in tool_stats.values() ) total_skipped_no_subdomain = sum( s['result'].get('skipped_no_subdomain', 0) for s in tool_stats.values() ) total_skipped_failed = sum( s['result'].get('skipped_failed', 0) for s in tool_stats.values() ) return total_created, total_skipped_no_subdomain, total_skipped_failed def _validate_flow_params( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str ) -> None: """验证 Flow 参数""" if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") @flow( name="site_scan", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def site_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """ 站点扫描 Flow 主要功能: 1. 从target获取所有子域名与其对应的端口号,拼接成URL写入文件 2. 用httpx进行批量请求并实时保存到数据库(流式处理) Args: scan_id: 扫描任务 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作空间目录 enabled_tools: 启用的工具配置字典 Returns: dict: 扫描结果 Raises: ValueError: 配置错误 RuntimeError: 执行失败 """ try: wait_for_system_load(context="site_scan_flow") logger.info( "开始站点扫描 - Scan ID: %s, Target: %s, Workspace: %s", scan_id, target_name, scan_workspace_dir ) _validate_flow_params(scan_id, target_name, target_id, scan_workspace_dir) user_log(scan_id, "site_scan", "Starting site scan") # Step 0: 创建工作目录 from apps.scan.utils import setup_scan_directory site_scan_dir = setup_scan_directory(scan_workspace_dir, 'site_scan') # Step 1: 导出站点 URL urls_file, total_urls, association_count = _export_site_urls( target_id, site_scan_dir ) if total_urls == 0: logger.warning("跳过站点扫描:没有站点 URL 可扫描 - Scan ID: %s", scan_id) user_log(scan_id, "site_scan", "Skipped: no site URLs to scan", "warning") return _build_empty_result( scan_id, target_name, scan_workspace_dir, urls_file, association_count ) # Step 2: 工具配置信息 logger.info("✓ 启用工具: %s", ', '.join(enabled_tools)) # Step 3: 串行执行扫描工具 ctx = ScanContext( scan_id=scan_id, target_id=target_id, target_name=target_name, site_scan_dir=site_scan_dir, urls_file=urls_file, total_urls=total_urls ) tool_stats, processed_records, successful_tools, failed_tools = \ _run_scans_sequentially(enabled_tools, ctx) # 汇总结果 executed_tasks = ['export_site_urls', 'parse_config'] executed_tasks.extend( f'run_and_stream_save_websites ({tool})' for tool in tool_stats ) total_created, total_skipped_no_sub, total_skipped_failed = \ _aggregate_tool_results(tool_stats) logger.info("✓ 站点扫描完成 - 创建站点: %d", total_created) user_log( scan_id, "site_scan", f"site_scan completed: found {total_created} websites" ) return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'urls_file': urls_file, 'total_urls': total_urls, 'association_count': association_count, 'processed_records': processed_records, 'created_websites': total_created, 'skipped_no_subdomain': total_skipped_no_sub, 'skipped_failed': total_skipped_failed, 'executed_tasks': executed_tasks, 'tool_stats': { 'total': len(enabled_tools), 'successful': len(successful_tools), 'failed': len(failed_tools), 'successful_tools': successful_tools, 'failed_tools': failed_tools, 'details': tool_stats } } except ValueError: raise except RuntimeError: raise ================================================ FILE: backend/apps/scan/flows/subdomain_discovery_flow.py ================================================ """ 子域名发现扫描 Flow 负责编排子域名发现扫描的完整流程 架构: - Flow 负责编排多个原子 Task - 支持并行执行扫描工具 - 每个 Task 可独立重试 - 配置由 YAML 解析 增强流程(4 阶段): Stage 1: 被动收集(并行) - 必选 Stage 2: 字典爆破(可选) - 子域名字典爆破 Stage 3: 变异生成 + 验证(可选) - dnsgen + 通用存活验证 Stage 4: DNS 存活验证(可选) - 通用存活验证 各阶段可灵活开关,最终结果根据实际执行的阶段动态决定 """ import logging import subprocess import uuid from dataclasses import dataclass, field from datetime import datetime from pathlib import Path from typing import Optional from prefect import flow # Django 环境初始化(导入即生效,pylint: disable=unused-import) from apps.common.prefect_django_setup import setup_django_for_prefect # noqa: F401 from apps.common.normalizer import normalize_domain from apps.common.validators import validate_domain from apps.engine.services.wordlist_service import WordlistService from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.utils import ( build_scan_command, ensure_wordlist_local, user_log, wait_for_system_load, ) logger = logging.getLogger(__name__) # 泛解析检测配置 _SAMPLE_MULTIPLIER = 100 # 采样数量 = 原文件 × 100 _EXPANSION_THRESHOLD = 50 # 膨胀阈值 = 原文件 × 50 _SAMPLE_TIMEOUT = 7200 # 采样超时 2 小时 @dataclass class ScanContext: """扫描上下文,用于在各阶段间传递状态""" scan_id: int target_id: int domain_name: str result_dir: Path timestamp: str current_result: str = "" executed_tasks: list = field(default_factory=list) failed_tools: list = field(default_factory=list) successful_tools: list = field(default_factory=list) def _validate_and_normalize_target(target_name: str) -> str: """验证并规范化目标域名""" try: normalized_target = normalize_domain(target_name) validate_domain(normalized_target) logger.debug("域名验证通过: %s -> %s", target_name, normalized_target) return normalized_target except ValueError as e: raise ValueError(f"无效的目标域名: {target_name} - {e}") from e def _count_lines(file_path: str) -> int: """统计文件非空行数""" try: with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: return sum(1 for line in f if line.strip()) except OSError as e: logger.warning("统计文件行数失败: %s - %s", file_path, e) return 0 def _merge_files(file_list: list, output_file: str) -> str: """合并多个文件并去重""" domains = set() for f in file_list: if f and Path(f).exists(): with open(f, 'r', encoding='utf-8', errors='ignore') as fp: for line in fp: line = line.strip() if line: domains.add(line) with open(output_file, 'w', encoding='utf-8') as fp: for domain in sorted(domains): fp.write(domain + '\n') logger.info("合并完成: %d 个域名 -> %s", len(domains), output_file) return output_file def _calculate_auto_timeout(file_path: str, multiplier: int = 3, default: int = 3600) -> int: """根据文件行数计算超时时间""" try: with open(file_path, 'rb') as f: line_count = sum(1 for _ in f) return line_count * multiplier if line_count > 0 else default except OSError: return default def _run_single_tool( tool_name: str, tool_config: dict, command_params: dict, result_dir: Path, scan_id: Optional[int] = None, scan_type: str = 'subdomain_discovery' ) -> str: """运行单个扫描工具,返回输出文件路径,失败返回空字符串""" from apps.scan.tasks.subdomain_discovery import run_subdomain_discovery_task timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') short_uuid = uuid.uuid4().hex[:4] output_file = str(result_dir / f"{tool_name}_{timestamp}_{short_uuid}.txt") command_params['output_file'] = output_file try: command = build_scan_command( tool_name=tool_name, scan_type=scan_type, command_params=command_params, tool_config=tool_config ) except (ValueError, KeyError) as e: logger.error("构建 %s 命令失败: %s", tool_name, e) return "" timeout = tool_config.get('timeout', 3600) if timeout == 'auto': timeout = 3600 logger.info("执行 %s: %s", tool_name, command) if scan_id: user_log(scan_id, scan_type, f"Running {tool_name}: {command}") try: result = run_subdomain_discovery_task( tool=tool_name, command=command, timeout=timeout, output_file=output_file ) return result if result else "" except (subprocess.TimeoutExpired, OSError) as e: logger.warning("%s 执行失败: %s", tool_name, e) return "" def _run_scans_parallel( enabled_tools: dict, domain_name: str, result_dir: Path, scan_id: int, provider_config_path: Optional[str] = None ) -> tuple[list, list, list]: """并行运行所有启用的子域名扫描工具""" from apps.scan.tasks.subdomain_discovery import run_subdomain_discovery_task timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') futures = {} failed_tools = [] for tool_name, tool_config in enabled_tools.items(): short_uuid = uuid.uuid4().hex[:4] output_file = str(result_dir / f"{tool_name}_{timestamp}_{short_uuid}.txt") command_params = {'domain': domain_name, 'output_file': output_file} if tool_name == 'subfinder' and provider_config_path: command_params['provider_config'] = provider_config_path try: command = build_scan_command( tool_name=tool_name, scan_type='subdomain_discovery', command_params=command_params, tool_config=tool_config ) except (ValueError, KeyError) as e: logger.error("构建 %s 命令失败: %s", tool_name, e) failed_tools.append({'tool': tool_name, 'reason': f'命令构建失败: {e}'}) continue timeout = tool_config.get('timeout', 600) if timeout == 'auto': timeout = 600 logger.info("✓ 工具 %s 使用默认 timeout: %d秒", tool_name, timeout) logger.debug("提交任务 - 工具: %s, 超时: %ds, 输出: %s", tool_name, timeout, output_file) user_log(scan_id, "subdomain_discovery", f"Running {tool_name}: {command}") future = run_subdomain_discovery_task.submit( tool=tool_name, command=command, timeout=timeout, output_file=output_file ) futures[tool_name] = future if not futures: logger.warning("所有扫描工具均无法启动 - 目标: %s", domain_name) return [], [{'tool': 'all', 'reason': '所有工具均无法启动'}], [] result_files = [] for tool_name, future in futures.items(): try: result = future.result() if result: result_files.append(result) logger.info("✓ 扫描工具 %s 执行成功: %s", tool_name, result) user_log(scan_id, "subdomain_discovery", f"{tool_name} completed") else: failed_tools.append({'tool': tool_name, 'reason': '未生成结果文件'}) logger.warning("⚠️ 扫描工具 %s 未生成结果文件", tool_name) user_log(scan_id, "subdomain_discovery", f"{tool_name} failed: no output", "error") except (subprocess.TimeoutExpired, OSError) as e: failed_tools.append({'tool': tool_name, 'reason': str(e)}) logger.warning("⚠️ 扫描工具 %s 执行失败: %s", tool_name, e) user_log(scan_id, "subdomain_discovery", f"{tool_name} failed: {e}", "error") successful_tools = [name for name in futures if name not in [f['tool'] for f in failed_tools]] logger.info( "✓ 扫描工具并行执行完成 - 成功: %d/%d", len(result_files), len(futures) ) return result_files, failed_tools, successful_tools def _generate_provider_config(result_dir: Path, scan_id: int) -> Optional[str]: """为 subfinder 生成第三方数据源配置""" try: from apps.scan.services.subfinder_provider_config_service import ( SubfinderProviderConfigService, ) config_path = SubfinderProviderConfigService().generate(str(result_dir)) if config_path: logger.info("Provider 配置文件已生成: %s", config_path) user_log(scan_id, "subdomain_discovery", "Provider config generated for subfinder") return config_path except (ImportError, OSError) as e: logger.warning("生成 Provider 配置文件失败: %s", e) return None def _run_stage1_passive(ctx: ScanContext, enabled_tools: dict, provider_config: Optional[str]): """Stage 1: 被动收集(并行)""" if not enabled_tools: return logger.info("=" * 40) logger.info("Stage 1: 被动收集(并行)") logger.info("=" * 40) logger.info("启用工具: %s", ', '.join(enabled_tools.keys())) user_log( ctx.scan_id, "subdomain_discovery", f"Stage 1: passive collection ({', '.join(enabled_tools.keys())})" ) result_files, failed, successful = _run_scans_parallel( enabled_tools=enabled_tools, domain_name=ctx.domain_name, result_dir=ctx.result_dir, scan_id=ctx.scan_id, provider_config_path=provider_config ) ctx.failed_tools.extend(failed) ctx.successful_tools.extend(successful) ctx.executed_tasks.extend([f'passive ({tool})' for tool in successful]) # 合并结果 ctx.current_result = str(ctx.result_dir / f"subs_passive_{ctx.timestamp}.txt") if result_files: ctx.current_result = _merge_files(result_files, ctx.current_result) ctx.executed_tasks.append('merge_passive') else: Path(ctx.current_result).touch() def _run_stage2_bruteforce(ctx: ScanContext, bruteforce_config: dict): """Stage 2: 字典爆破(可选)""" if not bruteforce_config.get('enabled', False): return logger.info("=" * 40) logger.info("Stage 2: 字典爆破") logger.info("=" * 40) user_log(ctx.scan_id, "subdomain_discovery", "Stage 2: bruteforce") tool_config = bruteforce_config.get('subdomain_bruteforce', {}) wordlist_name = tool_config.get('wordlist_name', 'dns_wordlist.txt') try: local_wordlist_path = ensure_wordlist_local(wordlist_name) # 计算 timeout timeout_value = tool_config.get('timeout', 3600) if timeout_value == 'auto': wordlist = WordlistService().get_wordlist_by_name(wordlist_name) line_count = getattr(wordlist, 'line_count', None) if wordlist else None if line_count is None: line_count = _calculate_auto_timeout(local_wordlist_path, 1, 0) timeout_value = int(line_count) * 3 if line_count else 3600 tool_config = {**tool_config, 'timeout': timeout_value} result = _run_single_tool( tool_name='subdomain_bruteforce', tool_config=tool_config, command_params={'domain': ctx.domain_name, 'wordlist': local_wordlist_path}, result_dir=ctx.result_dir, scan_id=ctx.scan_id ) if result: ctx.current_result = _merge_files( [ctx.current_result, result], str(ctx.result_dir / f"subs_merged_{ctx.timestamp}.txt") ) ctx.successful_tools.append('subdomain_bruteforce') ctx.executed_tasks.append('bruteforce') logger.info("✓ subdomain_bruteforce 执行完成") user_log(ctx.scan_id, "subdomain_discovery", "subdomain_bruteforce completed") else: ctx.failed_tools.append({'tool': 'subdomain_bruteforce', 'reason': '执行失败'}) logger.warning("⚠️ subdomain_bruteforce 执行失败") user_log(ctx.scan_id, "subdomain_discovery", "subdomain_bruteforce failed", "error") except (ValueError, OSError) as exc: ctx.failed_tools.append({'tool': 'subdomain_bruteforce', 'reason': str(exc)}) logger.warning("字典准备失败,跳过字典爆破: %s", exc) user_log(ctx.scan_id, "subdomain_discovery", f"subdomain_bruteforce failed: {exc}", "error") def _run_stage3_permutation(ctx: ScanContext, permutation_config: dict): """Stage 3: 变异生成 + 验证(可选)""" if not permutation_config.get('enabled', False): return logger.info("=" * 40) logger.info("Stage 3: 变异生成 + 存活验证(流式管道)") logger.info("=" * 40) user_log(ctx.scan_id, "subdomain_discovery", "Stage 3: permutation + resolve") tool_config = permutation_config.get('subdomain_permutation_resolve', {}) before_count = _count_lines(ctx.current_result) sample_size = before_count * _SAMPLE_MULTIPLIER max_allowed = before_count * _EXPANSION_THRESHOLD sample_output = str(ctx.result_dir / f"subs_permuted_sample_{ctx.timestamp}.txt") sample_cmd = ( f"cat {ctx.current_result} | dnsgen - | head -n {sample_size} | " f"puredns resolve -r /app/backend/resources/resolvers.txt " f"--write {sample_output} --wildcard-tests 50 --wildcard-batch 1000000 --quiet" ) logger.info( "泛解析采样检测: 原文件 %d 个, 采样 %d 个, 阈值 %d 个", before_count, sample_size, max_allowed ) try: subprocess.run( sample_cmd, shell=True, # noqa: S602 timeout=_SAMPLE_TIMEOUT, check=False, capture_output=True ) sample_count = _count_lines(sample_output) if Path(sample_output).exists() else 0 logger.info( "采样结果: %d 个域名存活 (原文件: %d, 阈值: %d)", sample_count, before_count, max_allowed ) if sample_count > max_allowed: ratio = sample_count / before_count if before_count > 0 else sample_count logger.warning( "跳过变异: 采样检测到泛解析 (%d > %d, 膨胀率 %.1fx)", sample_count, max_allowed, ratio ) ctx.failed_tools.append({ 'tool': 'subdomain_permutation_resolve', 'reason': f"采样检测到泛解析 (膨胀率 {ratio:.1f}x)" }) user_log( ctx.scan_id, "subdomain_discovery", f"subdomain_permutation_resolve skipped: wildcard (ratio {ratio:.1f}x)", "warning" ) return # 采样通过,执行完整变异 logger.info("采样检测通过,执行完整变异...") result = _run_single_tool( tool_name='subdomain_permutation_resolve', tool_config=tool_config, command_params={'input_file': ctx.current_result}, result_dir=ctx.result_dir, scan_id=ctx.scan_id ) if result: ctx.current_result = _merge_files( [ctx.current_result, result], str(ctx.result_dir / f"subs_with_permuted_{ctx.timestamp}.txt") ) ctx.successful_tools.append('subdomain_permutation_resolve') ctx.executed_tasks.append('permutation') logger.info("✓ subdomain_permutation_resolve 执行完成") user_log(ctx.scan_id, "subdomain_discovery", "subdomain_permutation_resolve completed") else: ctx.failed_tools.append({'tool': 'subdomain_permutation_resolve', 'reason': '执行失败'}) logger.warning("⚠️ subdomain_permutation_resolve 执行失败") user_log( ctx.scan_id, "subdomain_discovery", "subdomain_permutation_resolve failed", "error" ) except subprocess.TimeoutExpired: ctx.failed_tools.append({'tool': 'subdomain_permutation_resolve', 'reason': '采样检测超时'}) logger.warning("采样检测超时 (%d秒),跳过变异", _SAMPLE_TIMEOUT) user_log( ctx.scan_id, "subdomain_discovery", "subdomain_permutation_resolve failed: timeout", "error" ) except OSError as e: ctx.failed_tools.append({'tool': 'subdomain_permutation_resolve', 'reason': f'采样检测失败: {e}'}) logger.warning("采样检测失败: %s,跳过变异", e) user_log(ctx.scan_id, "subdomain_discovery", f"subdomain_permutation_resolve failed: {e}", "error") def _run_stage4_resolve(ctx: ScanContext, resolve_config: dict): """Stage 4: DNS 存活验证(可选)""" if not resolve_config.get('enabled', False): return logger.info("=" * 40) logger.info("Stage 4: DNS 存活验证") logger.info("=" * 40) user_log(ctx.scan_id, "subdomain_discovery", "Stage 4: DNS resolve") tool_config = resolve_config.get('subdomain_resolve', {}) # 动态计算 timeout timeout_value = tool_config.get('timeout', 3600) if timeout_value == 'auto': timeout_value = _calculate_auto_timeout(ctx.current_result, 3, 3600) tool_config = {**tool_config, 'timeout': timeout_value} result = _run_single_tool( tool_name='subdomain_resolve', tool_config=tool_config, command_params={'input_file': ctx.current_result}, result_dir=ctx.result_dir, scan_id=ctx.scan_id ) if result: ctx.current_result = result ctx.successful_tools.append('subdomain_resolve') ctx.executed_tasks.append('resolve') logger.info("✓ subdomain_resolve 执行完成") user_log(ctx.scan_id, "subdomain_discovery", "subdomain_resolve completed") else: ctx.failed_tools.append({'tool': 'subdomain_resolve', 'reason': '执行失败'}) logger.warning("⚠️ subdomain_resolve 执行失败") user_log(ctx.scan_id, "subdomain_discovery", "subdomain_resolve failed", "error") def _save_to_database(ctx: ScanContext) -> int: """Final: 保存到数据库""" from apps.scan.tasks.subdomain_discovery import merge_and_validate_task, save_domains_task logger.info("=" * 40) logger.info("Final: 保存到数据库") logger.info("=" * 40) final_file = merge_and_validate_task( result_files=[ctx.current_result], result_dir=str(ctx.result_dir) ) save_result = save_domains_task( domains_file=final_file, scan_id=ctx.scan_id, target_id=ctx.target_id ) ctx.executed_tasks.append('save_domains') return save_result.get('processed_records', 0) def _empty_result(scan_id: int, target: str, scan_workspace_dir: str) -> dict: """返回空结果""" return { 'success': True, 'scan_id': scan_id, 'target': target, 'scan_workspace_dir': scan_workspace_dir, 'total': 0, 'executed_tasks': [], 'tool_stats': { 'total': 0, 'successful': 0, 'failed': 0, 'successful_tools': [], 'failed_tools': [] } } @flow( name="subdomain_discovery", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def subdomain_discovery_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """子域名发现扫描流程 工作流程(4 阶段): Stage 1: 被动收集(并行) - 必选 Stage 2: 字典爆破(可选) - 子域名字典爆破 Stage 3: 变异生成 + 验证(可选) - dnsgen + 通用存活验证 Stage 4: DNS 存活验证(可选) - 通用存活验证 Final: 保存到数据库 注意: - 子域名发现只对 DOMAIN 类型目标有意义 - IP 和 CIDR 类型目标会自动跳过 """ try: wait_for_system_load(context="subdomain_discovery_flow") # 参数验证 if scan_id is None: raise ValueError("scan_id 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") if enabled_tools is None: raise ValueError("enabled_tools 不能为空") if not target_name: logger.warning("未提供目标域名,跳过子域名发现扫描") return _empty_result(scan_id, '', scan_workspace_dir) # 检查 Target 类型 from apps.targets.models import Target from apps.targets.services import TargetService target = TargetService().get_target(target_id) if target and target.type != Target.TargetType.DOMAIN: logger.info( "跳过子域名发现扫描: Target 类型为 %s (ID=%d),仅适用于域名类型", target.type, target_id ) return _empty_result(scan_id, target_name, scan_workspace_dir) # 验证并规范化目标域名 try: domain_name = _validate_and_normalize_target(target_name) except ValueError as e: logger.warning("目标域名无效,跳过子域名发现扫描: %s", e) return _empty_result(scan_id, target_name, scan_workspace_dir) # 准备工作目录 from apps.scan.utils import setup_scan_directory result_dir = setup_scan_directory(scan_workspace_dir, 'subdomain_discovery') logger.info( "开始子域名发现扫描 - Scan ID: %s, Domain: %s, Workspace: %s", scan_id, domain_name, scan_workspace_dir ) user_log(scan_id, "subdomain_discovery", f"Starting subdomain discovery for {domain_name}") # 解析配置 scan_config = enabled_tools passive_tools = scan_config.get('passive_tools', {}) bruteforce_config = scan_config.get('bruteforce', {}) permutation_config = scan_config.get('permutation', {}) resolve_config = scan_config.get('resolve', {}) enabled_passive_tools = { k: v for k, v in passive_tools.items() if v.get('enabled', True) } # 创建扫描上下文 ctx = ScanContext( scan_id=scan_id, target_id=target_id, domain_name=domain_name, result_dir=result_dir, timestamp=datetime.now().strftime('%Y%m%d_%H%M%S') ) # 生成 Provider 配置 provider_config = _generate_provider_config(result_dir, scan_id) # 执行各阶段 _run_stage1_passive(ctx, enabled_passive_tools, provider_config) _run_stage2_bruteforce(ctx, bruteforce_config) _run_stage3_permutation(ctx, permutation_config) _run_stage4_resolve(ctx, resolve_config) # 保存到数据库 processed_domains = _save_to_database(ctx) logger.info("✓ 子域名发现扫描完成") user_log( scan_id, "subdomain_discovery", f"subdomain_discovery completed: found {processed_domains} subdomains" ) # 计算工具总数 total_tools = len(enabled_passive_tools) if bruteforce_config.get('enabled', False): total_tools += 1 if permutation_config.get('enabled', False): total_tools += 1 if resolve_config.get('enabled', False): total_tools += 1 return { 'success': True, 'scan_id': scan_id, 'target': domain_name, 'scan_workspace_dir': scan_workspace_dir, 'total': processed_domains, 'executed_tasks': ctx.executed_tasks, 'tool_stats': { 'total': total_tools, 'successful': len(ctx.successful_tools), 'failed': len(ctx.failed_tools), 'successful_tools': ctx.successful_tools, 'failed_tools': ctx.failed_tools } } except ValueError as e: logger.error("配置错误: %s", e) raise except RuntimeError as e: logger.error("运行时错误: %s", e) raise ================================================ FILE: backend/apps/scan/flows/url_fetch/__init__.py ================================================ """ URL Fetch Flow 模块 提供 URL 获取相关的 Flow: - url_fetch_flow: 主 Flow(按输入类型编排 + 统一后处理) - domain_name_url_fetch_flow: 基于 domain_name(来自 target_name)输入的 URL 获取子 Flow(如 waymore) - sites_url_fetch_flow: 基于 sites_file 输入的 URL 获取子 Flow(如 katana 等爬虫) """ from .main_flow import url_fetch_flow from .domain_name_url_fetch_flow import domain_name_url_fetch_flow from .sites_url_fetch_flow import sites_url_fetch_flow __all__ = [ 'url_fetch_flow', 'domain_name_url_fetch_flow', 'sites_url_fetch_flow', ] ================================================ FILE: backend/apps/scan/flows/url_fetch/domain_name_url_fetch_flow.py ================================================ """ 基于 Target 根域名的 URL 被动收集 Flow 用于 waymore 等被动收集工具: - 输入:Target 的根域名(target_name,如 example.com) - 工具会自动从第三方源(Wayback Machine、Common Crawl 等)查询该域名及其子域名的历史 URL - 不需要遍历子域名列表,工具内部会处理 *.example.com 注意: - 此 Flow 只对 DOMAIN 类型 Target 有效 - IP 和 CIDR 类型会自动跳过(被动收集工具不支持) """ # Django 环境初始化 from apps.common.prefect_django_setup import setup_django_for_prefect import logging import uuid from datetime import datetime from pathlib import Path from typing import Dict from prefect import flow from apps.common.validators import validate_domain from apps.scan.tasks.url_fetch import run_url_fetcher_task from apps.scan.utils import build_scan_command logger = logging.getLogger(__name__) @flow(name="domain_name_url_fetch_flow", log_prints=True) def domain_name_url_fetch_flow( scan_id: int, target_id: int, target_name: str, output_dir: str, domain_name_tools: Dict[str, dict], ) -> dict: """ 基于 Target 根域名执行 URL 被动收集(当前主要用于 waymore) 执行流程: 1. 校验 Target 类型(IP/CIDR 类型跳过) 2. 使用传入的工具列表对根域名执行被动收集 3. 工具内部会自动查询该域名及其子域名的历史 URL 4. 汇总结果文件列表 Args: scan_id: 扫描 ID target_id: 目标 ID target_name: Target 根域名(如 example.com),不是子域名列表 output_dir: 输出目录 domain_name_tools: 被动收集工具配置(如 waymore) 注意: - 此 Flow 只对 DOMAIN 类型 Target 有效 - IP 和 CIDR 类型会自动跳过(waymore 等工具不支持) - 工具会自动收集 *.target_name 的所有历史 URL,无需遍历子域名 """ from apps.scan.utils import user_log try: output_path = Path(output_dir) output_path.mkdir(parents=True, exist_ok=True) # 检查 Target 类型,IP/CIDR 类型跳过 from apps.targets.services import TargetService from apps.targets.models import Target target_service = TargetService() target = target_service.get_target(target_id) if target and target.type != Target.TargetType.DOMAIN: logger.info( "跳过 domain_name URL 获取: Target 类型为 %s (ID=%d, Name=%s),waymore 等工具仅适用于域名类型", target.type, target_id, target_name ) return { "success": True, "result_files": [], "failed_tools": [], "successful_tools": [], } # 复用公共域名校验逻辑,确保 target_name 是合法域名 validate_domain(target_name) logger.info( "开始基于 domain_name 的 URL 获取 - Target: %s, Tools: %s", target_name, ", ".join(domain_name_tools.keys()) if domain_name_tools else "无", ) futures: dict[str, object] = {} failed_tools: list[dict] = [] # 提交所有基于域名的 URL 获取任务 for tool_name, tool_config in domain_name_tools.items(): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") short_uuid = uuid.uuid4().hex[:4] output_file = str(output_path / f"{tool_name}_{timestamp}_{short_uuid}.txt") command_params = { "domain_name": target_name, "output_file": output_file, } try: command = build_scan_command( tool_name=tool_name, scan_type="url_fetch", command_params=command_params, tool_config=tool_config, ) except Exception as e: logger.error("构建 %s 命令失败: %s", tool_name, e) failed_tools.append({"tool": tool_name, "reason": f"命令构建失败: {e}"}) continue # 计算超时时间:domain_name 模式下,没有行数统计,auto 使用固定超时 raw_timeout = tool_config.get("timeout", 3600) timeout = 3600 if isinstance(raw_timeout, str) and raw_timeout == "auto": timeout = 3600 logger.info( "工具 %s 使用固定自动超时: %d 秒 (domain_name 模式)", tool_name, timeout, ) else: try: timeout = int(raw_timeout) except (TypeError, ValueError): logger.warning( "工具 %s 的 timeout 配置无效(%s),将使用默认 3600 秒", tool_name, raw_timeout, ) timeout = 3600 logger.info( "提交任务 - 工具: %s, domain_name: %s, 超时: %d秒", tool_name, target_name, timeout, ) # 记录工具开始执行日志 user_log(scan_id, "url_fetch", f"Running {tool_name}: {command}") future = run_url_fetcher_task.submit( tool_name=tool_name, command=command, timeout=timeout, output_file=output_file, ) futures[tool_name] = future result_files: list[str] = [] successful_tools: list[str] = [] # 收集执行结果 for tool_name, future in futures.items(): try: result = future.result() if result and result.get("success"): result_files.append(result["output_file"]) successful_tools.append(tool_name) url_count = result.get("url_count", 0) logger.info( "✓ 工具 %s 执行成功 - 发现 URL: %d", tool_name, url_count, ) user_log(scan_id, "url_fetch", f"{tool_name} completed: found {url_count} urls") else: reason = "未生成结果或无有效 URL" failed_tools.append( { "tool": tool_name, "reason": reason, } ) logger.warning("⚠️ 工具 %s 未生成有效结果", tool_name) user_log(scan_id, "url_fetch", f"{tool_name} failed: {reason}", "error") except Exception as e: reason = str(e) failed_tools.append({"tool": tool_name, "reason": reason}) logger.warning("⚠️ 工具 %s 执行失败: %s", tool_name, e) user_log(scan_id, "url_fetch", f"{tool_name} failed: {reason}", "error") logger.info( "基于 domain_name 的 URL 获取完成 - 成功工具: %s, 失败工具: %s", successful_tools or "无", [f["tool"] for f in failed_tools] or "无", ) return { "success": True, "result_files": result_files, "failed_tools": failed_tools, "successful_tools": successful_tools, } except Exception as e: logger.error("domain_name URL 获取失败: %s", e, exc_info=True) return { "success": False, "result_files": [], "failed_tools": [ {"tool": "domain_name_url_fetch_flow", "reason": str(e)}, ], "successful_tools": [], } ================================================ FILE: backend/apps/scan/flows/url_fetch/main_flow.py ================================================ """ URL Fetch 主 Flow 负责编排不同输入类型的 URL 获取子 Flow(domain_name / sites_file),以及统一的后处理(uro 去重、httpx 验证) 架构: - 调用 domain_name_url_fetch_flow(domain_name 输入)和 sites_url_fetch_flow(sites_file 输入) - 合并多个子 Flow 的结果 - 统一进行 uro 去重(如果启用) - 统一进行 httpx 验证(如果启用) """ import logging from datetime import datetime from pathlib import Path from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_completed, on_scan_flow_failed, on_scan_flow_running, ) from apps.scan.utils import user_log, wait_for_system_load from .domain_name_url_fetch_flow import domain_name_url_fetch_flow from .sites_url_fetch_flow import sites_url_fetch_flow from .utils import calculate_timeout_by_line_count logger = logging.getLogger(__name__) # ==================== 工具分类配置 ==================== # 使用 target_name (domain_name) 作为输入的 URL 获取工具 DOMAIN_NAME_TOOLS = {'waymore'} # 使用 sites_file 作为输入的 URL 获取工具 SITES_FILE_TOOLS = {'katana'} # 后处理工具:不参与获取,用于清理和验证 POST_PROCESS_TOOLS = {'uro', 'httpx'} def _classify_tools(enabled_tools: dict) -> tuple[dict, dict, dict, dict]: """ 将启用的工具按输入类型分类 Returns: tuple: (domain_name_tools, sites_file_tools, uro_config, httpx_config) """ domain_name_tools: dict = {} sites_file_tools: dict = {} uro_config = None httpx_config = None for tool_name, tool_config in enabled_tools.items(): if tool_name in DOMAIN_NAME_TOOLS: domain_name_tools[tool_name] = tool_config elif tool_name in SITES_FILE_TOOLS: sites_file_tools[tool_name] = tool_config elif tool_name == 'uro': uro_config = tool_config elif tool_name == 'httpx': httpx_config = tool_config else: logger.warning("未知工具类型: %s,跳过", tool_name) return domain_name_tools, sites_file_tools, uro_config, httpx_config def _merge_and_deduplicate_urls(result_files: list, url_fetch_dir: Path) -> tuple[str, int]: """合并并去重 URL""" from apps.scan.tasks.url_fetch import merge_and_deduplicate_urls_task merged_file = merge_and_deduplicate_urls_task( result_files=result_files, result_dir=str(url_fetch_dir) ) # 统计唯一 URL 数量 unique_url_count = 0 if Path(merged_file).exists(): with open(merged_file, 'r', encoding='utf-8') as f: unique_url_count = sum(1 for line in f if line.strip()) logger.info( "✓ URL 合并去重完成 - 合并文件: %s, 唯一 URL 数: %d", merged_file, unique_url_count ) return merged_file, unique_url_count def _clean_urls_with_uro( merged_file: str, uro_config: dict, url_fetch_dir: Path ) -> tuple[str, int, int]: """使用 uro 清理合并后的 URL 列表""" from apps.scan.tasks.url_fetch import clean_urls_task raw_timeout = uro_config.get('timeout', 60) whitelist = uro_config.get('whitelist') blacklist = uro_config.get('blacklist') filters = uro_config.get('filters') # 计算超时时间 if isinstance(raw_timeout, str) and raw_timeout == 'auto': timeout = calculate_timeout_by_line_count( tool_config=uro_config, file_path=merged_file, base_per_time=1, min_timeout=60, ) logger.info("uro 自动计算超时时间(按行数,每行 1 秒,最小 60 秒): %d 秒", timeout) else: try: timeout = int(raw_timeout) except (TypeError, ValueError): logger.warning("uro timeout 配置无效(%s),使用默认 60 秒", raw_timeout) timeout = 60 result = clean_urls_task( input_file=merged_file, output_dir=str(url_fetch_dir), timeout=timeout, whitelist=whitelist, blacklist=blacklist, filters=filters ) if result['success']: return result['output_file'], result['output_count'], result['removed_count'] logger.warning("uro 清理失败: %s,使用原始合并文件", result.get('error', '未知错误')) return merged_file, result['input_count'], 0 def _validate_and_stream_save_urls( merged_file: str, httpx_config: dict, url_fetch_dir: Path, scan_id: int, target_id: int ) -> int: """使用 httpx 验证 URL 存活并流式保存到数据库""" from apps.scan.utils import build_scan_command from apps.scan.tasks.url_fetch import run_and_stream_save_urls_task logger.info("开始使用 httpx 验证 URL 存活状态...") # 统计待验证的 URL 数量 try: with open(merged_file, 'r', encoding='utf-8') as f: url_count = sum(1 for _ in f) logger.info("待验证 URL 数量: %d", url_count) except OSError as e: logger.error("读取 URL 文件失败: %s", e) return 0 if url_count == 0: logger.warning("没有需要验证的 URL") return 0 # 构建 httpx 命令 command_params = {'url_file': merged_file} try: command = build_scan_command( tool_name='httpx', scan_type='url_fetch', command_params=command_params, tool_config=httpx_config ) except (ValueError, KeyError) as e: logger.error("构建 httpx 命令失败: %s", e) logger.warning("降级处理:将直接保存所有 URL(不验证存活)") return _save_urls_to_database(merged_file, scan_id, target_id) # 计算超时时间 raw_timeout = httpx_config.get('timeout', 'auto') if isinstance(raw_timeout, str) and raw_timeout == 'auto': # 按 URL 行数计算超时时间:每行 3 秒,最小 60 秒 timeout = max(60, url_count * 3) logger.info( "自动计算 httpx 超时时间(按行数,每行 3 秒,最小 60 秒): url_count=%d, timeout=%d 秒", url_count, timeout ) else: try: timeout = int(raw_timeout) except (TypeError, ValueError): timeout = 3600 logger.info("使用配置的 httpx 超时时间: %d 秒", timeout) # 生成日志文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = url_fetch_dir / f"httpx_validation_{timestamp}.log" # 流式执行 result = run_and_stream_save_urls_task( cmd=command, tool_name='httpx', scan_id=scan_id, target_id=target_id, cwd=str(url_fetch_dir), shell=True, timeout=timeout, log_file=str(log_file) ) saved = result.get('saved_urls', 0) logger.info( "✓ httpx 验证完成 - 存活 URL: %d (%.1f%%)", saved, (saved / url_count * 100) if url_count > 0 else 0 ) return saved def _save_urls_to_database(merged_file: str, scan_id: int, target_id: int) -> int: """保存 URL 到数据库(不验证存活)""" from apps.scan.tasks.url_fetch import save_urls_task result = save_urls_task( urls_file=merged_file, scan_id=scan_id, target_id=target_id ) saved_count = result.get('saved_urls', 0) logger.info("✓ URL 保存完成 - 保存数量: %d", saved_count) return saved_count @flow( name="url_fetch", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def url_fetch_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: dict ) -> dict: """ URL 获取主 Flow 执行流程: 1. 准备工作目录 2. 按输入类型分类工具(domain_name / sites_file / 后处理) 3. 并行执行子 Flow - domain_name_url_fetch_flow: 基于 domain_name(来自 target_name)执行 URL 获取(如 waymore) - sites_url_fetch_flow: 基于 sites_file 执行爬虫(如 katana 等) 4. 合并所有子 Flow 的结果并去重 5. uro 去重(如果启用) 6. httpx 验证(如果启用) Args: scan_id: 扫描 ID target_name: 目标名称 target_id: 目标 ID scan_workspace_dir: 扫描工作目录 enabled_tools: 启用的工具配置 Returns: dict: 扫描结果 """ try: # 负载检查:等待系统资源充足 wait_for_system_load(context="url_fetch_flow") logger.info( "开始 URL 获取扫描 - Scan ID: %s, Target: %s, Workspace: %s", scan_id, target_name, scan_workspace_dir ) user_log(scan_id, "url_fetch", "Starting URL fetch") # Step 1: 准备工作目录 from apps.scan.utils import setup_scan_directory url_fetch_dir = setup_scan_directory(scan_workspace_dir, 'url_fetch') # Step 2: 分类工具(按输入类型) domain_name_tools, sites_file_tools, uro_config, httpx_config = _classify_tools(enabled_tools) logger.info( "工具分类 - domain_name: %s, sites_file: %s, uro: %s, httpx: %s", list(domain_name_tools.keys()) or '无', list(sites_file_tools.keys()) or '无', '启用' if uro_config else '未启用', '启用' if httpx_config else '未启用' ) # 检查是否有获取工具 if not domain_name_tools and not sites_file_tools: raise ValueError( "URL Fetch 流程需要至少启用一个 URL 获取工具(如 waymore, katana)。" "httpx 和 uro 仅用于后处理,不能单独使用。" ) # Step 3: 执行子 Flow all_result_files = [] all_failed_tools = [] all_successful_tools = [] # 3a: 基于 domain_name 的 URL 被动收集(如 waymore) if domain_name_tools: tn_result = domain_name_url_fetch_flow( scan_id=scan_id, target_id=target_id, target_name=target_name, output_dir=str(url_fetch_dir), domain_name_tools=domain_name_tools, ) all_result_files.extend(tn_result.get('result_files', [])) all_failed_tools.extend(tn_result.get('failed_tools', [])) all_successful_tools.extend(tn_result.get('successful_tools', [])) # 3b: 爬虫(以 sites_file 为输入) if sites_file_tools: crawl_result = sites_url_fetch_flow( scan_id=scan_id, target_id=target_id, target_name=target_name, output_dir=str(url_fetch_dir), enabled_tools=sites_file_tools ) all_result_files.extend(crawl_result.get('result_files', [])) all_failed_tools.extend(crawl_result.get('failed_tools', [])) all_successful_tools.extend(crawl_result.get('successful_tools', [])) # 检查是否有成功的工具 if not all_result_files: error_details = "; ".join([ "%s: %s" % (f['tool'], f['reason']) for f in all_failed_tools ]) logger.warning("所有 URL 获取工具均失败 - 目标: %s, 失败详情: %s", target_name, error_details) return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'unique_url_count': 0, 'valid_url_count': 0, 'failed_tools': all_failed_tools, 'successful_tools': [], 'message': '所有 URL 获取工具均无结果' } # Step 4: 合并并去重 URL merged_file, _ = _merge_and_deduplicate_urls( result_files=all_result_files, url_fetch_dir=url_fetch_dir ) # Step 5: 使用 uro 清理 URL(如果启用) url_file_for_validation = merged_file if uro_config and uro_config.get('enabled', False): url_file_for_validation, _, _ = _clean_urls_with_uro( merged_file=merged_file, uro_config=uro_config, url_fetch_dir=url_fetch_dir ) # Step 6: 使用 httpx 验证存活并保存(如果启用) if httpx_config and httpx_config.get('enabled', False): saved_count = _validate_and_stream_save_urls( merged_file=url_file_for_validation, httpx_config=httpx_config, url_fetch_dir=url_fetch_dir, scan_id=scan_id, target_id=target_id ) else: saved_count = _save_urls_to_database( merged_file=url_file_for_validation, scan_id=scan_id, target_id=target_id ) # 记录 Flow 完成 logger.info("✓ URL 获取完成 - 保存 endpoints: %d", saved_count) user_log(scan_id, "url_fetch", "url_fetch completed: found %d endpoints" % saved_count) # 构建已执行的任务列表 executed_tasks = ['setup_directory', 'classify_tools'] if domain_name_tools: executed_tasks.append('domain_name_url_fetch_flow') if sites_file_tools: executed_tasks.append('sites_url_fetch_flow') executed_tasks.append('merge_and_deduplicate') if uro_config and uro_config.get('enabled', False): executed_tasks.append('uro_clean') if httpx_config and httpx_config.get('enabled', False): executed_tasks.append('httpx_validation_and_save') else: executed_tasks.append('save_urls') return { 'success': True, 'scan_id': scan_id, 'target': target_name, 'scan_workspace_dir': scan_workspace_dir, 'total': saved_count, 'executed_tasks': executed_tasks, 'tool_stats': { 'total': len(domain_name_tools) + len(sites_file_tools), 'successful': len(all_successful_tools), 'failed': len(all_failed_tools), 'successful_tools': all_successful_tools, 'failed_tools': [f['tool'] for f in all_failed_tools] } } except Exception as e: logger.error("URL 获取扫描失败: %s", e, exc_info=True) raise ================================================ FILE: backend/apps/scan/flows/url_fetch/sites_url_fetch_flow.py ================================================ """ URL 爬虫 Flow 主动爬取网站页面,提取 URL 和 JS 端点 工具:katana, gospider, hakrawler 等 输入:sites_file(站点 URL 列表) """ # Django 环境初始化 from apps.common.prefect_django_setup import setup_django_for_prefect import logging from pathlib import Path from prefect import flow from .utils import run_tools_parallel logger = logging.getLogger(__name__) def _export_sites_file(target_id: int, scan_id: int, target_name: str, output_dir: Path) -> tuple[str, int]: """ 导出站点 URL 列表到文件 懒加载模式:如果 WebSite 表为空,根据 Target 类型生成默认 URL Args: target_id: 目标 ID scan_id: 扫描 ID target_name: 目标名称(用于懒加载) output_dir: 输出目录 Returns: tuple: (file_path, count) """ from apps.scan.tasks.url_fetch import export_sites_task output_file = str(output_dir / "sites.txt") result = export_sites_task( output_file=output_file, target_id=target_id, scan_id=scan_id ) count = result['asset_count'] if count > 0: logger.info("✓ 站点列表导出完成 - 数量: %d", count) else: logger.warning("站点列表为空,爬虫可能无法正常工作") return output_file, count @flow(name="sites_url_fetch_flow", log_prints=True) def sites_url_fetch_flow( scan_id: int, target_id: int, target_name: str, output_dir: str, enabled_tools: dict ) -> dict: """ URL 爬虫子 Flow 执行流程: 1. 导出站点 URL 列表(sites_file) 2. 并行执行爬虫工具 3. 返回结果文件列表 Args: scan_id: 扫描 ID target_id: 目标 ID target_name: 目标名称 output_dir: 输出目录 enabled_tools: 启用的爬虫工具配置 Returns: dict: { 'success': bool, 'result_files': list, 'failed_tools': list, 'successful_tools': list, 'sites_count': int } """ try: output_path = Path(output_dir) logger.info( "开始 URL 爬虫 - Target: %s, Tools: %s", target_name, ', '.join(enabled_tools.keys()) ) # Step 1: 导出站点 URL 列表 sites_file, sites_count = _export_sites_file( target_id=target_id, scan_id=scan_id, target_name=target_name, output_dir=output_path ) # 默认值模式下,即使原本没有站点,也会有默认 URL 作为输入 if sites_count == 0: logger.warning("没有可用的站点,跳过爬虫") return { 'success': True, 'result_files': [], 'failed_tools': [], 'successful_tools': [], 'sites_count': 0 } # Step 2: 并行执行爬虫工具 result_files, failed_tools, successful_tools = run_tools_parallel( tools=enabled_tools, input_file=sites_file, input_type="sites_file", output_dir=output_path, scan_id=scan_id ) logger.info( "✓ 爬虫完成 - 成功: %d/%d, 结果文件: %d", len(successful_tools), len(enabled_tools), len(result_files) ) return { 'success': True, 'result_files': result_files, 'failed_tools': failed_tools, 'successful_tools': successful_tools, 'sites_count': sites_count } except Exception as e: logger.error("URL 爬虫失败: %s", e, exc_info=True) return { 'success': False, 'result_files': [], 'failed_tools': [{'tool': 'sites_url_fetch_flow', 'reason': str(e)}], 'successful_tools': [], 'sites_count': 0 } ================================================ FILE: backend/apps/scan/flows/url_fetch/utils.py ================================================ """ URL Fetch 共享工具函数 """ import logging import subprocess import uuid from datetime import datetime from pathlib import Path from apps.scan.utils import build_scan_command logger = logging.getLogger(__name__) def calculate_timeout_by_line_count( tool_config: dict, file_path: str, base_per_time: int = 1, min_timeout: int = 60, ) -> int: """ 根据文件行数自动计算超时时间 Args: tool_config: 工具配置(保留参数,未来可能用于更复杂的计算) file_path: 输入文件路径 base_per_time: 每行的基础时间(秒) min_timeout: 最小超时时间(秒),默认60秒 Returns: int: 计算出的超时时间(秒),不低于 min_timeout """ try: result = subprocess.run( ['wc', '-l', file_path], capture_output=True, text=True, check=True, ) line_count = int(result.stdout.strip().split()[0]) timeout = max(line_count * base_per_time, min_timeout) logger.info( "timeout 自动计算: 文件=%s, 行数=%d, 每行时间=%d秒, 最小值=%d秒, timeout=%d秒", file_path, line_count, base_per_time, min_timeout, timeout, ) return timeout except Exception as e: logger.warning("wc -l 计算行数失败: %s,将使用默认 timeout: %d秒", e, min_timeout) return min_timeout def prepare_tool_execution( tool_name: str, tool_config: dict, input_file: str, input_type: str, output_dir: Path, scan_type: str = "url_fetch" ) -> dict: """ 准备单个工具的执行参数 Args: tool_name: 工具名称 tool_config: 工具配置 input_file: 输入文件路径 input_type: 输入类型(domains_file 或 sites_file) output_dir: 输出目录 scan_type: 扫描类型 Returns: dict: 执行参数,包含 command, input_file, output_file, timeout 或包含 error 键表示失败 """ # 1. 统计输入文件行数 try: with open(input_file, 'r') as f: input_count = sum(1 for _ in f) logger.info("工具 %s - 输入类型: %s, 数量: %d", tool_name, input_type, input_count) except Exception as e: return {"error": f"读取输入文件失败: {e}"} # 2. 生成输出文件路径(带时间戳和短 UUID 后缀) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") short_uuid = uuid.uuid4().hex[:4] output_file = str(output_dir / f"{tool_name}_{timestamp}_{short_uuid}.txt") # 3. 构建命令 command_params = { input_type: input_file, "output_file": output_file, } try: command = build_scan_command( tool_name=tool_name, scan_type=scan_type, command_params=command_params, tool_config=tool_config, ) except Exception as e: logger.error("构建 %s 命令失败: %s", tool_name, e) return {"error": f"命令构建失败: {e}"} # 4. 计算超时时间(支持 auto 和显式整数) raw_timeout = tool_config.get("timeout", 3600) timeout = 3600 if isinstance(raw_timeout, str) and raw_timeout == "auto": try: # katana / waymore 每个站点需要更长时间 base_per_time = 360 if tool_name in ("katana", "waymore") else 1 timeout = calculate_timeout_by_line_count( tool_config=tool_config, file_path=input_file, base_per_time=base_per_time, ) except Exception as e: logger.warning( "工具 %s 自动计算 timeout 失败,将使用默认 3600 秒: %s", tool_name, e, ) timeout = 3600 else: try: timeout = int(raw_timeout) except (TypeError, ValueError): logger.warning( "工具 %s 的 timeout 配置无效(%s),将使用默认 3600 秒", tool_name, raw_timeout, ) timeout = 3600 # 5. 返回执行参数 return { "command": command, "input_file": input_file, "input_type": input_type, "output_file": output_file, "timeout": timeout, } def run_tools_parallel( tools: dict, input_file: str, input_type: str, output_dir: Path, scan_id: int ) -> tuple[list, list, list]: """ 并行执行工具列表 Args: tools: 工具配置字典 {tool_name: tool_config} input_file: 输入文件路径 input_type: 输入类型 output_dir: 输出目录 scan_id: 扫描任务 ID(用于记录日志) Returns: tuple: (result_files, failed_tools, successful_tool_names) """ from apps.scan.tasks.url_fetch import run_url_fetcher_task from apps.scan.utils import user_log futures: dict[str, object] = {} failed_tools: list[dict] = [] # 提交所有工具的并行任务 for tool_name, tool_config in tools.items(): exec_params = prepare_tool_execution( tool_name=tool_name, tool_config=tool_config, input_file=input_file, input_type=input_type, output_dir=output_dir, ) if "error" in exec_params: failed_tools.append({"tool": tool_name, "reason": exec_params["error"]}) continue logger.info( "提交任务 - 工具: %s, 输入: %s, 超时: %d秒", tool_name, input_type, exec_params["timeout"], ) # 记录工具开始执行日志 user_log(scan_id, "url_fetch", f"Running {tool_name}: {exec_params['command']}") # 提交并行任务 future = run_url_fetcher_task.submit( tool_name=tool_name, command=exec_params["command"], timeout=exec_params["timeout"], output_file=exec_params["output_file"], ) futures[tool_name] = future # 收集执行结果 result_files = [] for tool_name, future in futures.items(): try: result = future.result() if result and result['success']: result_files.append(result['output_file']) url_count = result['url_count'] logger.info( "✓ 工具 %s 执行成功 - 发现 URL: %d", tool_name, url_count ) user_log(scan_id, "url_fetch", f"{tool_name} completed: found {url_count} urls") else: reason = '未生成结果或无有效URL' failed_tools.append({ 'tool': tool_name, 'reason': reason }) logger.warning("⚠️ 工具 %s 未生成有效结果", tool_name) user_log(scan_id, "url_fetch", f"{tool_name} failed: {reason}", "error") except Exception as e: reason = str(e) failed_tools.append({ 'tool': tool_name, 'reason': reason }) logger.warning("⚠️ 工具 %s 执行失败: %s", tool_name, e) user_log(scan_id, "url_fetch", f"{tool_name} failed: {reason}", "error") # 计算成功的工具列表 failed_tool_names = [f['tool'] for f in failed_tools] successful_tool_names = [ name for name in tools.keys() if name not in failed_tool_names ] return result_files, failed_tools, successful_tool_names ================================================ FILE: backend/apps/scan/flows/vuln_scan/__init__.py ================================================ """vuln_scan Flow 模块 包含漏洞扫描相关的 Flow: - vuln_scan_flow: 主 Flow(编排各类漏洞扫描子 Flow) - endpoints_vuln_scan_flow: 基于 endpoints_file 的漏洞扫描子 Flow(Dalfox 等) """ from .main_flow import vuln_scan_flow from .endpoints_vuln_scan_flow import endpoints_vuln_scan_flow __all__ = [ "vuln_scan_flow", "endpoints_vuln_scan_flow", ] ================================================ FILE: backend/apps/scan/flows/vuln_scan/endpoints_vuln_scan_flow.py ================================================ from apps.common.prefect_django_setup import setup_django_for_prefect import logging from datetime import datetime from pathlib import Path from typing import Dict from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_running, on_scan_flow_completed, on_scan_flow_failed, ) from apps.scan.utils import build_scan_command, ensure_nuclei_templates_local, user_log from apps.scan.tasks.vuln_scan import ( export_endpoints_task, run_vuln_tool_task, run_and_stream_save_dalfox_vulns_task, run_and_stream_save_nuclei_vulns_task, ) from .utils import calculate_timeout_by_line_count logger = logging.getLogger(__name__) @flow( name="endpoints_vuln_scan_flow", log_prints=True, ) def endpoints_vuln_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: Dict[str, dict], ) -> dict: """基于 Endpoint 的漏洞扫描 Flow(串行执行 Dalfox 等工具)。""" try: if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") if not enabled_tools: raise ValueError("enabled_tools 不能为空") from apps.scan.utils import setup_scan_directory vuln_scan_dir = setup_scan_directory(scan_workspace_dir, 'vuln_scan') endpoints_file = vuln_scan_dir / "input_endpoints.txt" # Step 1: 导出 Endpoint URL export_result = export_endpoints_task( target_id=target_id, output_file=str(endpoints_file), ) total_endpoints = export_result.get("total_count", 0) if total_endpoints == 0 or not endpoints_file.exists() or endpoints_file.stat().st_size == 0: logger.warning("目标下没有可用 Endpoint,跳过漏洞扫描") return { "success": True, "scan_id": scan_id, "target": target_name, "scan_workspace_dir": scan_workspace_dir, "endpoints_file": str(endpoints_file), "endpoint_count": 0, "executed_tools": [], "tool_results": {}, } logger.info("Endpoint 导出完成,共 %d 条,开始执行漏洞扫描", total_endpoints) tool_results: Dict[str, dict] = {} # Step 2: 并行执行每个漏洞扫描工具(目前主要是 Dalfox) # 1)先为每个工具 submit Prefect Task,让 Worker 并行调度 # 2)再统一收集各自的结果,组装成 tool_results tool_futures: Dict[str, dict] = {} for tool_name, tool_config in enabled_tools.items(): # Nuclei 需要先确保本地模板存在(支持多个模板仓库) template_args = "" if tool_name == "nuclei": repo_names = tool_config.get("template_repo_names") if not repo_names or not isinstance(repo_names, (list, tuple)): logger.error("Nuclei 配置缺少 template_repo_names(数组),跳过") continue template_paths = [] try: for repo_name in repo_names: path = ensure_nuclei_templates_local(repo_name) template_paths.append(path) logger.info("Nuclei 模板路径 [%s]: %s", repo_name, path) except Exception as e: logger.error("获取 Nuclei 模板失败: %s,跳过 nuclei 扫描", e) continue template_args = " ".join(f"-t {p}" for p in template_paths) # 构建命令参数 command_params = {"endpoints_file": str(endpoints_file)} if template_args: command_params["template_args"] = template_args command = build_scan_command( tool_name=tool_name, scan_type="vuln_scan", command_params=command_params, tool_config=tool_config, ) raw_timeout = tool_config.get("timeout", 600) if isinstance(raw_timeout, str) and raw_timeout == "auto": # timeout=auto 时,根据 endpoints_file 行数自动计算超时时间 # Dalfox: 每行 100 秒,Nuclei: 每行 30 秒 base_per_time = 30 if tool_name == "nuclei" else 100 timeout = calculate_timeout_by_line_count( tool_config=tool_config, file_path=str(endpoints_file), base_per_time=base_per_time, ) else: try: timeout = int(raw_timeout) except (TypeError, ValueError) as e: raise ValueError( f"工具 {tool_name} 的 timeout 配置无效: {raw_timeout!r}" ) from e timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_file = vuln_scan_dir / f"{tool_name}_{timestamp}.log" # Dalfox XSS 使用流式任务,一边解析一边保存漏洞结果 if tool_name == "dalfox_xss": logger.info("开始执行漏洞扫描工具 %s(流式保存漏洞结果,已提交任务)", tool_name) user_log(scan_id, "vuln_scan", f"Running {tool_name}: {command}") future = run_and_stream_save_dalfox_vulns_task.submit( cmd=command, tool_name=tool_name, scan_id=scan_id, target_id=target_id, cwd=str(vuln_scan_dir), shell=True, batch_size=1, timeout=timeout, log_file=str(log_file), ) tool_futures[tool_name] = { "future": future, "command": command, "timeout": timeout, "log_file": str(log_file), "mode": "streaming", } elif tool_name == "nuclei": # Nuclei 使用流式任务 logger.info("开始执行漏洞扫描工具 %s(流式保存漏洞结果,已提交任务)", tool_name) user_log(scan_id, "vuln_scan", f"Running {tool_name}: {command}") future = run_and_stream_save_nuclei_vulns_task.submit( cmd=command, tool_name=tool_name, scan_id=scan_id, target_id=target_id, cwd=str(vuln_scan_dir), shell=True, batch_size=1, timeout=timeout, log_file=str(log_file), ) tool_futures[tool_name] = { "future": future, "command": command, "timeout": timeout, "log_file": str(log_file), "mode": "streaming", } else: # 其他工具仍使用非流式执行逻辑 logger.info("开始执行漏洞扫描工具 %s(已提交任务)", tool_name) user_log(scan_id, "vuln_scan", f"Running {tool_name}: {command}") future = run_vuln_tool_task.submit( tool_name=tool_name, command=command, timeout=timeout, log_file=str(log_file), ) tool_futures[tool_name] = { "future": future, "command": command, "timeout": timeout, "log_file": str(log_file), "mode": "normal", } # 统一收集所有工具的执行结果 for tool_name, meta in tool_futures.items(): future = meta["future"] try: result = future.result() if meta["mode"] == "streaming": created_vulns = result.get("created_vulns", 0) tool_results[tool_name] = { "command": meta["command"], "timeout": meta["timeout"], "processed_records": result.get("processed_records"), "created_vulns": created_vulns, "command_log_file": meta["log_file"], } logger.info("✓ 工具 %s 执行完成 - 漏洞: %d", tool_name, created_vulns) user_log(scan_id, "vuln_scan", f"{tool_name} completed: found {created_vulns} vulnerabilities") else: tool_results[tool_name] = { "command": meta["command"], "timeout": meta["timeout"], "duration": result.get("duration"), "returncode": result.get("returncode"), "command_log_file": result.get("command_log_file"), } logger.info("✓ 工具 %s 执行完成 - returncode=%s", tool_name, result.get("returncode")) user_log(scan_id, "vuln_scan", f"{tool_name} completed") except Exception as e: reason = str(e) logger.error("工具 %s 执行失败: %s", tool_name, e, exc_info=True) user_log(scan_id, "vuln_scan", f"{tool_name} failed: {reason}", "error") return { "success": True, "scan_id": scan_id, "target": target_name, "scan_workspace_dir": scan_workspace_dir, "endpoints_file": str(endpoints_file), "endpoint_count": total_endpoints, "executed_tools": list(enabled_tools.keys()), "tool_results": tool_results, } except Exception as e: logger.exception("Endpoint 漏洞扫描失败: %s", e) raise ================================================ FILE: backend/apps/scan/flows/vuln_scan/main_flow.py ================================================ """ 漏洞扫描主 Flow """ import logging from typing import Dict, Tuple from prefect import flow from apps.scan.handlers.scan_flow_handlers import ( on_scan_flow_running, on_scan_flow_completed, on_scan_flow_failed, ) from apps.scan.configs.command_templates import get_command_template from apps.scan.utils import user_log, wait_for_system_load from .endpoints_vuln_scan_flow import endpoints_vuln_scan_flow logger = logging.getLogger(__name__) def _classify_vuln_tools(enabled_tools: Dict[str, dict]) -> Tuple[Dict[str, dict], Dict[str, dict]]: """根据命令模板中的 input_type 对漏洞扫描工具进行分类。 当前支持: - endpoints_file: 以端点列表文件为输入(例如 Dalfox XSS) 预留: - 其他 input_type 将被归类到 other_tools,暂不处理。 """ endpoints_tools: Dict[str, dict] = {} other_tools: Dict[str, dict] = {} for tool_name, tool_config in enabled_tools.items(): template = get_command_template("vuln_scan", tool_name) or {} input_type = template.get("input_type", "endpoints_file") if input_type == "endpoints_file": endpoints_tools[tool_name] = tool_config else: other_tools[tool_name] = tool_config return endpoints_tools, other_tools @flow( name="vuln_scan", log_prints=True, on_running=[on_scan_flow_running], on_completion=[on_scan_flow_completed], on_failure=[on_scan_flow_failed], ) def vuln_scan_flow( scan_id: int, target_name: str, target_id: int, scan_workspace_dir: str, enabled_tools: Dict[str, dict], ) -> dict: """漏洞扫描主 Flow:串行编排各类漏洞扫描子 Flow。 支持工具: - dalfox_xss: XSS 漏洞扫描(流式保存) - nuclei: 通用漏洞扫描(流式保存,支持模板 commit hash 同步) """ try: # 负载检查:等待系统资源充足 wait_for_system_load(context="vuln_scan_flow") if scan_id is None: raise ValueError("scan_id 不能为空") if not target_name: raise ValueError("target_name 不能为空") if target_id is None: raise ValueError("target_id 不能为空") if not scan_workspace_dir: raise ValueError("scan_workspace_dir 不能为空") if not enabled_tools: raise ValueError("enabled_tools 不能为空") logger.info("开始漏洞扫描 - Scan ID: %s, Target: %s", scan_id, target_name) user_log(scan_id, "vuln_scan", "Starting vulnerability scan") # Step 1: 分类工具 endpoints_tools, other_tools = _classify_vuln_tools(enabled_tools) logger.info( "漏洞扫描工具分类 - endpoints_file: %s, 其他: %s", list(endpoints_tools.keys()) or "无", list(other_tools.keys()) or "无", ) if other_tools: logger.warning( "存在暂不支持输入类型的漏洞扫描工具,将被忽略: %s", list(other_tools.keys()), ) if not endpoints_tools: raise ValueError("漏洞扫描需要至少启用一个以 endpoints_file 为输入的工具(如 dalfox_xss、nuclei)。") # Step 2: 执行 Endpoint 漏洞扫描子 Flow(串行) endpoint_result = endpoints_vuln_scan_flow( scan_id=scan_id, target_name=target_name, target_id=target_id, scan_workspace_dir=scan_workspace_dir, enabled_tools=endpoints_tools, ) # 记录 Flow 完成 total_vulns = sum( r.get("created_vulns", 0) for r in endpoint_result.get("tool_results", {}).values() ) logger.info("✓ 漏洞扫描完成 - 新增漏洞: %d", total_vulns) user_log(scan_id, "vuln_scan", f"vuln_scan completed: found {total_vulns} vulnerabilities") # 目前只有一个子 Flow,直接返回其结果 return endpoint_result except Exception as e: logger.exception("漏洞扫描主 Flow 失败: %s", e) raise ================================================ FILE: backend/apps/scan/flows/vuln_scan/utils.py ================================================ """ Vuln Scan 共享工具函数 """ import logging import subprocess logger = logging.getLogger(__name__) def calculate_timeout_by_line_count( tool_config: dict, file_path: str, base_per_time: int = 1, min_timeout: int = 600, ) -> int: """ 根据文件行数自动计算超时时间 Args: tool_config: 工具配置(保留参数,未来可能用于更复杂的计算) file_path: 输入文件路径 base_per_time: 每行的基础时间(秒) min_timeout: 最小超时时间(秒),默认600秒(10分钟) Returns: int: 计算出的超时时间(秒),不低于 min_timeout """ try: result = subprocess.run( ["wc", "-l", file_path], capture_output=True, text=True, check=True, ) line_count = int(result.stdout.strip().split()[0]) timeout = max(line_count * base_per_time, min_timeout) logger.info( "timeout 自动计算: 文件=%s, 行数=%d, 每行时间=%d秒, 最小值=%d秒, timeout=%d秒", file_path, line_count, base_per_time, min_timeout, timeout, ) return timeout except Exception as e: logger.warning("wc -l 计算行数失败: %s,使用最小超时: %d秒", e, min_timeout) return min_timeout ================================================ FILE: backend/apps/scan/handlers/__init__.py ================================================ """Prefect Flow 状态处理器 当前架构使用 Docker + SSH 执行任务,不使用 Prefect Server。 docker stop 会触发 on_failure 处理器。 """ from .initiate_scan_flow_handlers import ( on_initiate_scan_flow_running, on_initiate_scan_flow_completed, on_initiate_scan_flow_failed, ) from .scan_flow_handlers import ( on_scan_flow_running, on_scan_flow_completed, on_scan_flow_failed, ) __all__ = [ # 初始化扫描流程处理器 'on_initiate_scan_flow_running', 'on_initiate_scan_flow_completed', 'on_initiate_scan_flow_failed', # 通用扫描流程处理器 'on_scan_flow_running', 'on_scan_flow_completed', 'on_scan_flow_failed', ] ================================================ FILE: backend/apps/scan/handlers/initiate_scan_flow_handlers.py ================================================ """ initiate_scan_flow 状态处理器 负责 initiate_scan_flow 生命周期的状态同步: - on_running: Flow 开始运行时更新扫描状态为 RUNNING - on_completion: Flow 成功完成时更新扫描状态为 COMPLETED - on_failure: Flow 失败时更新扫描状态为 FAILED(包括超时、异常、docker stop 等) 策略:快速失败(Fail-Fast) - 任何子任务失败都会导致 Flow 失败 - Flow 成功 = 所有任务成功 """ import logging from prefect import Flow from prefect.client.schemas import FlowRun, State logger = logging.getLogger(__name__) def on_initiate_scan_flow_running(flow: Flow, flow_run: FlowRun, state: State) -> None: """ initiate_scan_flow 开始运行时的回调 职责:更新 Scan 状态为 RUNNING + 发送通知 触发时机: - Prefect Flow 状态变为 Running 时自动触发 - 在 Flow 函数体执行之前调用 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态 """ logger.info("🚀 initiate_scan_flow_running 回调开始运行 - Flow Run: %s", flow_run.id) scan_id = flow_run.parameters.get('scan_id') target_name = flow_run.parameters.get('target_name') engine_name = flow_run.parameters.get('engine_name') scheduled_scan_name = flow_run.parameters.get('scheduled_scan_name') if not scan_id: logger.warning( "Flow 参数中缺少 scan_id,跳过状态更新 - Flow Run: %s", flow_run.id ) return def _update_running_status(): from apps.scan.services import ScanService from apps.common.definitions import ScanStatus service = ScanService() success = service.update_status( scan_id, ScanStatus.RUNNING ) if success: logger.info( "✓ Flow 状态回调:扫描状态已更新为 RUNNING - Scan ID: %s, Flow Run: %s", scan_id, flow_run.id ) else: logger.error( "✗ Flow 状态回调:更新扫描状态失败 - Scan ID: %s", scan_id ) return success # 执行状态更新(Repository 层已有 @auto_ensure_db_connection 保证连接可靠性) _update_running_status() # 发送通知 logger.info("准备发送扫描开始通知 - Scan ID: %s, Target: %s", scan_id, target_name) try: from apps.scan.notifications import create_notification, NotificationLevel, NotificationCategory # 根据是否为定时扫描构建不同的标题和消息 if scheduled_scan_name: title = f"⏰ {target_name} 扫描开始" message = f"定时任务:{scheduled_scan_name}\n引擎:{engine_name}" else: title = f"{target_name} 扫描开始" message = f"引擎:{engine_name}" create_notification( title=title, message=message, level=NotificationLevel.MEDIUM, category=NotificationCategory.SCAN ) logger.info("✓ 扫描开始通知已发送 - Scan ID: %s, Target: %s", scan_id, target_name) except Exception as e: logger.error(f"发送扫描开始通知失败 - Scan ID: {scan_id}: {e}", exc_info=True) def on_initiate_scan_flow_completed(flow: Flow, flow_run: FlowRun, state: State) -> None: """ initiate_scan_flow 成功完成时的回调 职责:更新 Scan 状态为 COMPLETED 触发时机: - Prefect Flow 正常执行完成时自动触发 - 在 Flow 函数体返回之后调用 策略:快速失败(Fail-Fast) - Flow 成功完成 = 所有任务成功 → COMPLETED - Flow 执行失败 = 有任务失败 → FAILED (由 on_failed 处理) 竞态条件处理: - 如果用户已手动取消(状态已是 CANCELLED),保持终态,不覆盖 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态 """ logger.info("✅ initiate_scan_flow_completed 回调开始运行 - Flow Run: %s", flow_run.id) scan_id = flow_run.parameters.get('scan_id') target_name = flow_run.parameters.get('target_name') engine_name = flow_run.parameters.get('engine_name') if not scan_id: return def _update_completed_status(): from apps.scan.services import ScanService from apps.common.definitions import ScanStatus from django.utils import timezone service = ScanService() # 仅在运行中时更新为 COMPLETED;其他状态保持不变 completed_updated = service.update_status_if_match( scan_id=scan_id, current_status=ScanStatus.RUNNING, new_status=ScanStatus.COMPLETED, stopped_at=timezone.now() ) if completed_updated: logger.info( "✓ Flow 状态回调:扫描状态已原子更新为 COMPLETED - Scan ID: %s, Flow Run: %s", scan_id, flow_run.id ) return service.update_cached_stats(scan_id) else: logger.info( "ℹ️ Flow 状态回调:状态未更新(可能已是终态)- Scan ID: %s, Flow Run: %s", scan_id, flow_run.id ) return None # 执行状态更新并获取统计数据 stats = _update_completed_status() # 注意:物化视图刷新已迁移到 pg_ivm 增量维护,无需手动标记刷新 # 发送通知(包含统计摘要) logger.info("准备发送扫描完成通知 - Scan ID: %s, Target: %s", scan_id, target_name) try: from apps.scan.notifications import create_notification, NotificationLevel, NotificationCategory # 构建通知消息 message = f"引擎:{engine_name}" if stats: results = [] results.append(f"子域名: {stats.get('subdomains', 0)}") results.append(f"站点: {stats.get('websites', 0)}") results.append(f"IP: {stats.get('ips', 0)}") results.append(f"端点: {stats.get('endpoints', 0)}") results.append(f"目录: {stats.get('directories', 0)}") vulns_total = stats.get('vulns_total', 0) if vulns_total > 0: results.append(f"漏洞: {vulns_total} (严重:{stats.get('vulns_critical', 0)} 高:{stats.get('vulns_high', 0)} 中:{stats.get('vulns_medium', 0)} 低:{stats.get('vulns_low', 0)})") else: results.append("漏洞: 0") message += f"\n结果:{' | '.join(results)}" create_notification( title=f"{target_name} 扫描完成", message=message, level=NotificationLevel.MEDIUM, category=NotificationCategory.SCAN ) logger.info("✓ 扫描完成通知已发送 - Scan ID: %s, Target: %s", scan_id, target_name) except Exception as e: logger.error(f"发送扫描完成通知失败 - Scan ID: {scan_id}: {e}", exc_info=True) def on_initiate_scan_flow_failed(flow: Flow, flow_run: FlowRun, state: State) -> None: """ initiate_scan_flow 失败时的回调 职责:更新 Scan 状态为 FAILED,并记录错误信息 触发时机: - Prefect Flow 执行失败或抛出异常时自动触发 - Flow 超时、任务失败等所有失败场景都会触发此回调 竞态条件处理: - 如果用户已手动取消(状态已是 CANCELLED),保持终态,不覆盖 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态(包含错误信息) """ logger.info("❌ initiate_scan_flow_failed 回调开始运行 - Flow Run: %s", flow_run.id) scan_id = flow_run.parameters.get('scan_id') target_name = flow_run.parameters.get('target_name') engine_name = flow_run.parameters.get('engine_name') if not scan_id: return def _update_failed_status(): from apps.scan.services import ScanService from apps.common.definitions import ScanStatus from django.utils import timezone service = ScanService() # 提取错误信息 error_message = str(state.message) if state.message else "Flow 执行失败" # 仅在运行中时更新为 FAILED;其他状态保持不变 failed_updated = service.update_status_if_match( scan_id=scan_id, current_status=ScanStatus.RUNNING, new_status=ScanStatus.FAILED, stopped_at=timezone.now() ) if failed_updated: # 成功更新(正常失败流程) logger.error( "✗ Flow 状态回调:扫描状态已原子更新为 FAILED - Scan ID: %s, Flow Run: %s, 错误: %s", scan_id, flow_run.id, error_message ) # 更新缓存统计数据(终态) service.update_cached_stats(scan_id) else: logger.warning( "⚠️ Flow 状态回调:未更新任何记录(可能已被其他进程处理)- Scan ID: %s, Flow Run: %s", scan_id, flow_run.id ) return True # 执行状态更新 _update_failed_status() # 发送通知 logger.info("准备发送扫描失败通知 - Scan ID: %s, Target: %s", scan_id, target_name) try: from apps.scan.notifications import create_notification, NotificationLevel, NotificationCategory error_message = str(state.message) if state.message else "未知错误" message = f"引擎:{engine_name}\n错误:{error_message}" create_notification( title=f"{target_name} 扫描失败", message=message, level=NotificationLevel.HIGH, category=NotificationCategory.SCAN ) logger.info("✓ 扫描失败通知已发送 - Scan ID: %s, Target: %s", scan_id, target_name) except Exception as e: logger.error(f"发送扫描失败通知失败 - Scan ID: {scan_id}: {e}", exc_info=True) ================================================ FILE: backend/apps/scan/handlers/scan_flow_handlers.py ================================================ """ 扫描流程处理器 负责处理扫描流程(端口扫描、子域名发现等)的状态变化和通知 职责: - 更新各阶段的进度状态(running/completed/failed) - 发送扫描阶段的通知 - 记录 Flow 性能指标 """ import logging from prefect import Flow from prefect.client.schemas import FlowRun, State from apps.scan.utils.performance import FlowPerformanceTracker from apps.scan.utils import user_log logger = logging.getLogger(__name__) # 存储每个 flow_run 的性能追踪器 _flow_trackers: dict[str, FlowPerformanceTracker] = {} def _get_stage_from_flow_name(flow_name: str) -> str | None: """ 从 Flow name 获取对应的 stage Flow name 直接作为 stage(与 engine_config 的 key 一致) 排除主 Flow(initiate_scan) """ # 排除主 Flow,它不是阶段 Flow if flow_name == 'initiate_scan': return None return flow_name def on_scan_flow_running(flow: Flow, flow_run: FlowRun, state: State) -> None: """ 扫描流程开始运行时的回调 职责: - 更新阶段进度为 running - 发送扫描开始通知 - 启动性能追踪 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态 """ logger.info("🚀 扫描流程开始运行 - Flow: %s, Run ID: %s", flow.name, flow_run.id) # 提取流程参数 flow_params = flow_run.parameters or {} scan_id = flow_params.get('scan_id') target_name = flow_params.get('target_name', 'unknown') target_id = flow_params.get('target_id') # 启动性能追踪 if scan_id: tracker = FlowPerformanceTracker(flow.name, scan_id) tracker.start(target_id=target_id, target_name=target_name) _flow_trackers[str(flow_run.id)] = tracker # 更新阶段进度 stage = _get_stage_from_flow_name(flow.name) if scan_id and stage: try: from apps.scan.services import ScanService service = ScanService() service.start_stage(scan_id, stage) logger.info(f"✓ 阶段进度已更新为 running - Scan ID: {scan_id}, Stage: {stage}") except Exception as e: logger.error(f"更新阶段进度失败 - Scan ID: {scan_id}, Stage: {stage}: {e}") def on_scan_flow_completed(flow: Flow, flow_run: FlowRun, state: State) -> None: """ 扫描流程完成时的回调 职责: - 更新阶段进度为 completed - 发送扫描完成通知(可选) - 记录性能指标 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态 """ logger.info("✅ 扫描流程完成 - Flow: %s, Run ID: %s", flow.name, flow_run.id) # 提取流程参数 flow_params = flow_run.parameters or {} scan_id = flow_params.get('scan_id') # 获取 flow result result = None try: result = state.result() if state.result else None except Exception: pass # 记录性能指标 tracker = _flow_trackers.pop(str(flow_run.id), None) if tracker: tracker.finish(success=True) # 更新阶段进度 stage = _get_stage_from_flow_name(flow.name) if scan_id and stage: try: from apps.scan.services import ScanService service = ScanService() # 从 flow result 中提取 detail(如果有) detail = None if isinstance(result, dict): detail = result.get('detail') service.complete_stage(scan_id, stage, detail) logger.info(f"✓ 阶段进度已更新为 completed - Scan ID: {scan_id}, Stage: {stage}") # 每个阶段完成后刷新缓存统计,便于前端实时看到增量 try: service.update_cached_stats(scan_id) logger.info("✓ 阶段完成后已刷新缓存统计 - Scan ID: %s", scan_id) except Exception as e: logger.error("阶段完成后刷新缓存统计失败 - Scan ID: %s, 错误: %s", scan_id, e) except Exception as e: logger.error(f"更新阶段进度失败 - Scan ID: {scan_id}, Stage: {stage}: {e}") def on_scan_flow_failed(flow: Flow, flow_run: FlowRun, state: State) -> None: """ 扫描流程失败时的回调 职责: - 更新阶段进度为 failed - 发送扫描失败通知 - 记录性能指标(含错误信息) - 写入 ScanLog 供前端显示 Args: flow: Prefect Flow 对象 flow_run: Flow 运行实例 state: Flow 当前状态 """ logger.info("❌ 扫描流程失败 - Flow: %s, Run ID: %s", flow.name, flow_run.id) # 提取流程参数 flow_params = flow_run.parameters or {} scan_id = flow_params.get('scan_id') target_name = flow_params.get('target_name', 'unknown') # 提取错误信息 error_message = str(state.message) if state.message else "未知错误" # 写入 ScanLog 供前端显示 stage = _get_stage_from_flow_name(flow.name) if scan_id and stage: user_log(scan_id, stage, f"Failed: {error_message}", "error") # 记录性能指标(失败情况) tracker = _flow_trackers.pop(str(flow_run.id), None) if tracker: tracker.finish(success=False, error_message=error_message) # 更新阶段进度 stage = _get_stage_from_flow_name(flow.name) if scan_id and stage: try: from apps.scan.services import ScanService service = ScanService() service.fail_stage(scan_id, stage, error_message) logger.info(f"✓ 阶段进度已更新为 failed - Scan ID: {scan_id}, Stage: {stage}") except Exception as e: logger.error(f"更新阶段进度失败 - Scan ID: {scan_id}, Stage: {stage}: {e}") # 发送通知 try: from apps.scan.notifications import create_notification, NotificationLevel message = f"任务:{flow.name}\n状态:执行失败\n错误:{error_message}" create_notification( title=target_name, message=message, level=NotificationLevel.HIGH ) logger.error(f"✓ 扫描失败通知已发送 - Target: {target_name}, Flow: {flow.name}, Error: {error_message}") except Exception as e: logger.error(f"发送扫描失败通知失败 - Flow: {flow.name}: {e}") ================================================ FILE: backend/apps/scan/management/__init__.py ================================================ ================================================ FILE: backend/apps/scan/migrations/0001_initial.py ================================================ # Generated by Django 5.2.7 on 2026-01-06 00:55 import django.contrib.postgres.fields import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('engine', '0001_initial'), ('targets', '0001_initial'), ] operations = [ migrations.CreateModel( name='NotificationSettings', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('discord_enabled', models.BooleanField(default=False, help_text='是否启用 Discord 通知')), ('discord_webhook_url', models.URLField(blank=True, default='', help_text='Discord Webhook URL')), ('categories', models.JSONField(default=dict, help_text='各分类通知开关,如 {"scan": true, "vulnerability": true, "asset": true, "system": false}')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': '通知设置', 'verbose_name_plural': '通知设置', 'db_table': 'notification_settings', }, ), migrations.CreateModel( name='SubfinderProviderSettings', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('providers', models.JSONField(default=dict, help_text='各 Provider 的 API Key 配置')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'Subfinder Provider 配置', 'verbose_name_plural': 'Subfinder Provider 配置', 'db_table': 'subfinder_provider_settings', }, ), migrations.CreateModel( name='Notification', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('category', models.CharField(choices=[('scan', '扫描任务'), ('vulnerability', '漏洞发现'), ('asset', '资产发现'), ('system', '系统消息')], db_index=True, default='system', help_text='通知分类', max_length=20)), ('level', models.CharField(choices=[('low', '低'), ('medium', '中'), ('high', '高'), ('critical', '严重')], db_index=True, default='low', help_text='通知级别', max_length=20)), ('title', models.CharField(help_text='通知标题', max_length=200)), ('message', models.CharField(help_text='通知内容', max_length=2000)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('is_read', models.BooleanField(default=False, help_text='是否已读')), ('read_at', models.DateTimeField(blank=True, help_text='阅读时间', null=True)), ], options={ 'verbose_name': '通知', 'verbose_name_plural': '通知', 'db_table': 'notification', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='notificatio_created_c430f0_idx'), models.Index(fields=['category', '-created_at'], name='notificatio_categor_df0584_idx'), models.Index(fields=['level', '-created_at'], name='notificatio_level_0e5d12_idx'), models.Index(fields=['is_read', '-created_at'], name='notificatio_is_read_518ce0_idx')], }, ), migrations.CreateModel( name='Scan', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('engine_ids', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, help_text='引擎 ID 列表', size=None)), ('engine_names', models.JSONField(default=list, help_text='引擎名称列表,如 ["引擎A", "引擎B"]')), ('yaml_configuration', models.TextField(default='', help_text='YAML 格式的扫描配置')), ('created_at', models.DateTimeField(auto_now_add=True, help_text='任务创建时间')), ('stopped_at', models.DateTimeField(blank=True, help_text='扫描结束时间', null=True)), ('status', models.CharField(choices=[('cancelled', '已取消'), ('completed', '已完成'), ('failed', '失败'), ('initiated', '初始化'), ('running', '运行中')], db_index=True, default='initiated', help_text='任务状态', max_length=20)), ('results_dir', models.CharField(blank=True, default='', help_text='结果存储目录', max_length=100)), ('container_ids', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, help_text='容器 ID 列表(Docker Container ID)', size=None)), ('error_message', models.CharField(blank=True, default='', help_text='错误信息', max_length=2000)), ('deleted_at', models.DateTimeField(blank=True, db_index=True, help_text='删除时间(NULL表示未删除)', null=True)), ('progress', models.IntegerField(default=0, help_text='扫描进度 0-100')), ('current_stage', models.CharField(blank=True, default='', help_text='当前扫描阶段', max_length=50)), ('stage_progress', models.JSONField(default=dict, help_text='各阶段进度详情')), ('cached_subdomains_count', models.IntegerField(default=0, help_text='缓存的子域名数量')), ('cached_websites_count', models.IntegerField(default=0, help_text='缓存的网站数量')), ('cached_endpoints_count', models.IntegerField(default=0, help_text='缓存的端点数量')), ('cached_ips_count', models.IntegerField(default=0, help_text='缓存的IP地址数量')), ('cached_directories_count', models.IntegerField(default=0, help_text='缓存的目录数量')), ('cached_vulns_total', models.IntegerField(default=0, help_text='缓存的漏洞总数')), ('cached_vulns_critical', models.IntegerField(default=0, help_text='缓存的严重漏洞数量')), ('cached_vulns_high', models.IntegerField(default=0, help_text='缓存的高危漏洞数量')), ('cached_vulns_medium', models.IntegerField(default=0, help_text='缓存的中危漏洞数量')), ('cached_vulns_low', models.IntegerField(default=0, help_text='缓存的低危漏洞数量')), ('stats_updated_at', models.DateTimeField(blank=True, help_text='统计数据最后更新时间', null=True)), ('target', models.ForeignKey(help_text='扫描目标', on_delete=django.db.models.deletion.CASCADE, related_name='scans', to='targets.target')), ('worker', models.ForeignKey(blank=True, help_text='执行扫描的 Worker 节点', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='scans', to='engine.workernode')), ], options={ 'verbose_name': '扫描任务', 'verbose_name_plural': '扫描任务', 'db_table': 'scan', 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='ScanLog', fields=[ ('id', models.BigAutoField(primary_key=True, serialize=False)), ('level', models.CharField(choices=[('info', 'Info'), ('warning', 'Warning'), ('error', 'Error')], default='info', help_text='日志级别', max_length=10)), ('content', models.TextField(help_text='日志内容')), ('created_at', models.DateTimeField(auto_now_add=True, db_index=True, help_text='创建时间')), ('scan', models.ForeignKey(help_text='关联的扫描任务', on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='scan.scan')), ], options={ 'verbose_name': '扫描日志', 'verbose_name_plural': '扫描日志', 'db_table': 'scan_log', 'ordering': ['created_at'], }, ), migrations.CreateModel( name='ScheduledScan', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(help_text='任务名称', max_length=200)), ('engine_ids', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, help_text='引擎 ID 列表', size=None)), ('engine_names', models.JSONField(default=list, help_text='引擎名称列表,如 ["引擎A", "引擎B"]')), ('yaml_configuration', models.TextField(default='', help_text='YAML 格式的扫描配置')), ('cron_expression', models.CharField(default='0 2 * * *', help_text='Cron 表达式,格式:分 时 日 月 周', max_length=100)), ('is_enabled', models.BooleanField(db_index=True, default=True, help_text='是否启用')), ('run_count', models.IntegerField(default=0, help_text='已执行次数')), ('last_run_time', models.DateTimeField(blank=True, help_text='上次执行时间', null=True)), ('next_run_time', models.DateTimeField(blank=True, help_text='下次执行时间', null=True)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, help_text='更新时间')), ('organization', models.ForeignKey(blank=True, help_text='扫描组织(设置后执行时动态获取组织下所有目标)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='scheduled_scans', to='targets.organization')), ('target', models.ForeignKey(blank=True, help_text='扫描单个目标(与 organization 二选一)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='scheduled_scans', to='targets.target')), ], options={ 'verbose_name': '定时扫描任务', 'verbose_name_plural': '定时扫描任务', 'db_table': 'scheduled_scan', 'ordering': ['-created_at'], }, ), migrations.AddIndex( model_name='scan', index=models.Index(fields=['-created_at'], name='scan_created_0bb6c7_idx'), ), migrations.AddIndex( model_name='scan', index=models.Index(fields=['target'], name='scan_target__718b9d_idx'), ), migrations.AddIndex( model_name='scan', index=models.Index(fields=['deleted_at', '-created_at'], name='scan_deleted_eb17e8_idx'), ), migrations.AddIndex( model_name='scanlog', index=models.Index(fields=['scan', 'created_at'], name='scan_log_scan_id_c4814a_idx'), ), migrations.AddIndex( model_name='scheduledscan', index=models.Index(fields=['-created_at'], name='scheduled_s_created_9b9c2e_idx'), ), migrations.AddIndex( model_name='scheduledscan', index=models.Index(fields=['is_enabled', '-created_at'], name='scheduled_s_is_enab_23d660_idx'), ), migrations.AddIndex( model_name='scheduledscan', index=models.Index(fields=['name'], name='scheduled_s_name_bf332d_idx'), ), ] ================================================ FILE: backend/apps/scan/migrations/0002_add_cached_screenshots_count.py ================================================ # Generated by Django 5.2.7 on 2026-01-07 14:03 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('scan', '0001_initial'), ] operations = [ migrations.AddField( model_name='scan', name='cached_screenshots_count', field=models.IntegerField(default=0, help_text='缓存的截图数量'), ), ] ================================================ FILE: backend/apps/scan/migrations/0003_add_wecom_fields.py ================================================ # Generated manually for WeCom notification support from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('scan', '0002_add_cached_screenshots_count'), ] operations = [ migrations.AddField( model_name='notificationsettings', name='wecom_enabled', field=models.BooleanField(default=False, help_text='是否启用企业微信通知'), ), migrations.AddField( model_name='notificationsettings', name='wecom_webhook_url', field=models.URLField(blank=True, default='', help_text='企业微信机器人 Webhook URL'), ), ] ================================================ FILE: backend/apps/scan/migrations/__init__.py ================================================ ================================================ FILE: backend/apps/scan/models/__init__.py ================================================ """Scan Models - 统一导出""" from .scan_models import Scan, SoftDeleteManager from .scan_log_model import ScanLog from .scheduled_scan_model import ScheduledScan from .subfinder_provider_settings_model import SubfinderProviderSettings # 兼容旧名称(已废弃,请使用 SubfinderProviderSettings) ProviderSettings = SubfinderProviderSettings __all__ = [ 'Scan', 'ScanLog', 'ScheduledScan', 'SoftDeleteManager', 'SubfinderProviderSettings', 'ProviderSettings', # 兼容旧名称 ] ================================================ FILE: backend/apps/scan/models/scan_log_model.py ================================================ """扫描日志模型""" from django.db import models class ScanLog(models.Model): """扫描日志模型""" class Level(models.TextChoices): INFO = 'info', 'Info' WARNING = 'warning', 'Warning' ERROR = 'error', 'Error' id = models.BigAutoField(primary_key=True) scan = models.ForeignKey( 'Scan', on_delete=models.CASCADE, related_name='logs', db_index=True, help_text='关联的扫描任务' ) level = models.CharField( max_length=10, choices=Level.choices, default=Level.INFO, help_text='日志级别' ) content = models.TextField(help_text='日志内容') created_at = models.DateTimeField(auto_now_add=True, db_index=True, help_text='创建时间') class Meta: db_table = 'scan_log' verbose_name = '扫描日志' verbose_name_plural = '扫描日志' ordering = ['created_at'] indexes = [ models.Index(fields=['scan', 'created_at']), ] def __str__(self): return f"[{self.level}] {self.content[:50]}" ================================================ FILE: backend/apps/scan/models/scan_models.py ================================================ """扫描相关模型""" from django.db import models from django.contrib.postgres.fields import ArrayField from apps.common.definitions import ScanStatus class SoftDeleteManager(models.Manager): """软删除管理器:默认只返回未删除的记录""" def get_queryset(self): return super().get_queryset().filter(deleted_at__isnull=True) class Scan(models.Model): """扫描任务模型""" id = models.AutoField(primary_key=True) target = models.ForeignKey('targets.Target', on_delete=models.CASCADE, related_name='scans', help_text='扫描目标') # 多引擎支持字段 engine_ids = ArrayField( models.IntegerField(), default=list, help_text='引擎 ID 列表' ) engine_names = models.JSONField( default=list, help_text='引擎名称列表,如 ["引擎A", "引擎B"]' ) yaml_configuration = models.TextField( default='', help_text='YAML 格式的扫描配置' ) created_at = models.DateTimeField(auto_now_add=True, help_text='任务创建时间') stopped_at = models.DateTimeField(null=True, blank=True, help_text='扫描结束时间') status = models.CharField( max_length=20, choices=ScanStatus.choices, default=ScanStatus.INITIATED, db_index=True, help_text='任务状态' ) results_dir = models.CharField(max_length=100, blank=True, default='', help_text='结果存储目录') container_ids = ArrayField( models.CharField(max_length=100), blank=True, default=list, help_text='容器 ID 列表(Docker Container ID)' ) worker = models.ForeignKey( 'engine.WorkerNode', on_delete=models.SET_NULL, related_name='scans', null=True, blank=True, help_text='执行扫描的 Worker 节点' ) error_message = models.CharField(max_length=2000, blank=True, default='', help_text='错误信息') # ==================== 软删除字段 ==================== deleted_at = models.DateTimeField(null=True, blank=True, db_index=True, help_text='删除时间(NULL表示未删除)') # ==================== 管理器 ==================== objects = SoftDeleteManager() # 默认管理器:只返回未删除的记录 all_objects = models.Manager() # 全量管理器:包括已删除的记录(用于硬删除) # ==================== 进度跟踪字段 ==================== progress = models.IntegerField(default=0, help_text='扫描进度 0-100') current_stage = models.CharField(max_length=50, blank=True, default='', help_text='当前扫描阶段') stage_progress = models.JSONField(default=dict, help_text='各阶段进度详情') # ==================== 缓存统计字段 ==================== cached_subdomains_count = models.IntegerField(default=0, help_text='缓存的子域名数量') cached_websites_count = models.IntegerField(default=0, help_text='缓存的网站数量') cached_endpoints_count = models.IntegerField(default=0, help_text='缓存的端点数量') cached_ips_count = models.IntegerField(default=0, help_text='缓存的IP地址数量') cached_directories_count = models.IntegerField(default=0, help_text='缓存的目录数量') cached_screenshots_count = models.IntegerField(default=0, help_text='缓存的截图数量') cached_vulns_total = models.IntegerField(default=0, help_text='缓存的漏洞总数') cached_vulns_critical = models.IntegerField(default=0, help_text='缓存的严重漏洞数量') cached_vulns_high = models.IntegerField(default=0, help_text='缓存的高危漏洞数量') cached_vulns_medium = models.IntegerField(default=0, help_text='缓存的中危漏洞数量') cached_vulns_low = models.IntegerField(default=0, help_text='缓存的低危漏洞数量') stats_updated_at = models.DateTimeField(null=True, blank=True, help_text='统计数据最后更新时间') class Meta: db_table = 'scan' verbose_name = '扫描任务' verbose_name_plural = '扫描任务' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['target']), models.Index(fields=['deleted_at', '-created_at']), ] def __str__(self): return f"Scan #{self.id} - {self.target.name}" ================================================ FILE: backend/apps/scan/models/scheduled_scan_model.py ================================================ """定时扫描任务模型""" from django.db import models from django.contrib.postgres.fields import ArrayField class ScheduledScan(models.Model): """定时扫描任务模型""" id = models.AutoField(primary_key=True) name = models.CharField(max_length=200, help_text='任务名称') engine_ids = ArrayField( models.IntegerField(), default=list, help_text='引擎 ID 列表' ) engine_names = models.JSONField( default=list, help_text='引擎名称列表,如 ["引擎A", "引擎B"]' ) yaml_configuration = models.TextField( default='', help_text='YAML 格式的扫描配置' ) organization = models.ForeignKey( 'targets.Organization', on_delete=models.CASCADE, related_name='scheduled_scans', null=True, blank=True, help_text='扫描组织(设置后执行时动态获取组织下所有目标)' ) target = models.ForeignKey( 'targets.Target', on_delete=models.CASCADE, related_name='scheduled_scans', null=True, blank=True, help_text='扫描单个目标(与 organization 二选一)' ) cron_expression = models.CharField( max_length=100, default='0 2 * * *', help_text='Cron 表达式,格式:分 时 日 月 周' ) is_enabled = models.BooleanField(default=True, db_index=True, help_text='是否启用') run_count = models.IntegerField(default=0, help_text='已执行次数') last_run_time = models.DateTimeField(null=True, blank=True, help_text='上次执行时间') next_run_time = models.DateTimeField(null=True, blank=True, help_text='下次执行时间') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') updated_at = models.DateTimeField(auto_now=True, help_text='更新时间') class Meta: db_table = 'scheduled_scan' verbose_name = '定时扫描任务' verbose_name_plural = '定时扫描任务' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['is_enabled', '-created_at']), models.Index(fields=['name']), ] def __str__(self): return f"ScheduledScan #{self.id} - {self.name}" ================================================ FILE: backend/apps/scan/models/subfinder_provider_settings_model.py ================================================ """Subfinder Provider 配置模型(单例模式) 用于存储 subfinder 第三方数据源的 API Key 配置 """ from django.db import models class SubfinderProviderSettings(models.Model): """ Subfinder Provider 配置(单例模式) 存储第三方数据源的 API Key 配置,用于 subfinder 子域名发现 支持的 Provider: - fofa: email + api_key (composite) - censys: api_id + api_secret (composite) - hunter, shodan, zoomeye, securitytrails, threatbook, quake: api_key (single) """ providers = models.JSONField( default=dict, help_text='各 Provider 的 API Key 配置' ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'subfinder_provider_settings' verbose_name = 'Subfinder Provider 配置' verbose_name_plural = 'Subfinder Provider 配置' DEFAULT_PROVIDERS = { 'fofa': {'enabled': False, 'email': '', 'api_key': ''}, 'hunter': {'enabled': False, 'api_key': ''}, 'shodan': {'enabled': False, 'api_key': ''}, 'censys': {'enabled': False, 'api_id': '', 'api_secret': ''}, 'zoomeye': {'enabled': False, 'api_key': ''}, 'securitytrails': {'enabled': False, 'api_key': ''}, 'threatbook': {'enabled': False, 'api_key': ''}, 'quake': {'enabled': False, 'api_key': ''}, } def save(self, *args, **kwargs): self.pk = 1 super().save(*args, **kwargs) @classmethod def get_instance(cls) -> 'SubfinderProviderSettings': """获取或创建单例实例""" obj, _ = cls.objects.get_or_create( pk=1, defaults={'providers': cls.DEFAULT_PROVIDERS.copy()} ) return obj def get_provider_config(self, provider: str) -> dict: """获取指定 Provider 的配置""" return self.providers.get(provider, self.DEFAULT_PROVIDERS.get(provider, {})) def is_provider_enabled(self, provider: str) -> bool: """检查指定 Provider 是否启用""" config = self.get_provider_config(provider) return config.get('enabled', False) ================================================ FILE: backend/apps/scan/notifications/__init__.py ================================================ """极简通知系统""" from .types import NotificationLevel, NotificationCategory from .models import Notification from .services import create_notification __all__ = [ 'NotificationLevel', 'NotificationCategory', 'Notification', 'create_notification' ] ================================================ FILE: backend/apps/scan/notifications/consumers.py ================================================ """ WebSocket Consumer - 通知实时推送 """ import json import logging import asyncio from apps.common.websocket_auth import AuthenticatedWebsocketConsumer logger = logging.getLogger(__name__) class NotificationConsumer(AuthenticatedWebsocketConsumer): """ 通知 WebSocket Consumer 处理客户端连接、断开和通知推送 使用 Redis Channel Layer 订阅通知 支持心跳保活机制 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.heartbeat_task = None # 心跳任务 async def on_connect(self): """ 客户端连接时调用(已通过认证) 加入通知广播组 """ # 通知组名(所有客户端共享) self.group_name = 'notifications' # 加入组 await self.channel_layer.group_add( self.group_name, self.channel_name ) # 接受 WebSocket 连接 await self.accept() # 发送连接成功消息 await self.send(text_data=json.dumps({ 'type': 'connected', 'message': '连接成功' }, ensure_ascii=False)) # 启动服务端心跳(可选:防止中间件超时) # self.heartbeat_task = asyncio.create_task(self._heartbeat_loop()) logger.debug(f"WebSocket 连接已建立 - Channel: {self.channel_name}") async def disconnect(self, close_code): """ 客户端断开时调用 离开通知广播组 """ # 取消心跳任务 if self.heartbeat_task and not self.heartbeat_task.done(): self.heartbeat_task.cancel() try: await self.heartbeat_task except asyncio.CancelledError: pass # 离开组 await self.channel_layer.group_discard( self.group_name, self.channel_name ) logger.debug(f"WebSocket 连接已断开 - Channel: {self.channel_name}, Code: {close_code}") async def receive(self, text_data): """ 接收客户端消息 当前实现不需要处理客户端消息,保留以备扩展 """ try: data = json.loads(text_data) message_type = data.get('type') # 心跳响应 if message_type == 'ping': await self.send(text_data=json.dumps({ 'type': 'pong', 'message': '心跳响应' }, ensure_ascii=False)) logger.debug(f"心跳响应 - Channel: {self.channel_name}") except json.JSONDecodeError as e: logger.warning(f"解析客户端消息失败 - Channel: {self.channel_name}: {e}") except Exception as e: logger.error(f"处理客户端消息异常 - Channel: {self.channel_name}: {e}", exc_info=True) async def notification_message(self, event): """ 接收来自 Channel Layer 的通知消息 转发给 WebSocket 客户端 Args: event: 消息事件,包含通知数据 """ try: # 构造发送给客户端的消息 message = { 'type': 'notification', 'id': event['id'], 'category': event.get('category', 'system'), 'title': event['title'], 'message': event['message'], 'level': event['level'], 'created_at': event['created_at'] } # 发送给客户端 await self.send(text_data=json.dumps(message, ensure_ascii=False)) logger.debug(f"通知已推送 - Channel: {self.channel_name}, ID: {event['id']}") except Exception as e: logger.error(f"推送通知失败 - Channel: {self.channel_name}: {e}", exc_info=True) async def _heartbeat_loop(self): """ 服务端主动心跳循环(可选) 定期向客户端发送 ping 消息,保持连接活跃 防止中间件或防火墙断开长时间无活动的连接 注意:通常客户端心跳就足够了,这是额外的保险措施 """ try: while True: await asyncio.sleep(45) # 每 45 秒发送一次心跳 await self.send(text_data=json.dumps({ 'type': 'ping', 'message': '服务端心跳' }, ensure_ascii=False)) logger.debug(f"服务端心跳已发送 - Channel: {self.channel_name}") except asyncio.CancelledError: logger.debug(f"心跳循环已取消 - Channel: {self.channel_name}") except Exception as e: logger.error(f"心跳循环异常 - Channel: {self.channel_name}: {e}", exc_info=True) ================================================ FILE: backend/apps/scan/notifications/models.py ================================================ """通知系统数据模型""" import logging from datetime import timedelta from django.db import models from django.utils import timezone from .types import NotificationCategory, NotificationLevel logger = logging.getLogger(__name__) class NotificationSettings(models.Model): """ 通知设置(单例模型) 存储 Discord webhook 配置和各分类的通知开关 """ # Discord 配置 discord_enabled = models.BooleanField(default=False, help_text='是否启用 Discord 通知') discord_webhook_url = models.URLField(blank=True, default='', help_text='Discord Webhook URL') # 企业微信配置 wecom_enabled = models.BooleanField(default=False, help_text='是否启用企业微信通知') wecom_webhook_url = models.URLField(blank=True, default='', help_text='企业微信机器人 Webhook URL') # 分类开关(使用 JSONField 存储) categories = models.JSONField( default=dict, help_text='各分类通知开关,如 {"scan": true, "vulnerability": true, "asset": true, "system": false}' ) # 时间信息 created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'notification_settings' verbose_name = '通知设置' verbose_name_plural = '通知设置' def save(self, *args, **kwargs): self.pk = 1 # 单例模式 super().save(*args, **kwargs) @classmethod def get_instance(cls) -> 'NotificationSettings': """获取或创建单例实例""" obj, _ = cls.objects.get_or_create( pk=1, defaults={ 'discord_enabled': False, 'discord_webhook_url': '', 'categories': { 'scan': True, 'vulnerability': True, 'asset': True, 'system': False, } } ) return obj def is_category_enabled(self, category: str) -> bool: """检查指定分类是否启用通知""" return self.categories.get(category, False) class Notification(models.Model): """通知模型""" id = models.AutoField(primary_key=True) category = models.CharField( max_length=20, choices=NotificationCategory.choices, default=NotificationCategory.SYSTEM, db_index=True, help_text='通知分类' ) level = models.CharField( max_length=20, choices=NotificationLevel.choices, default=NotificationLevel.LOW, db_index=True, help_text='通知级别' ) title = models.CharField(max_length=200, help_text='通知标题') message = models.CharField(max_length=2000, help_text='通知内容') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') is_read = models.BooleanField(default=False, help_text='是否已读') read_at = models.DateTimeField(null=True, blank=True, help_text='阅读时间') class Meta: db_table = 'notification' verbose_name = '通知' verbose_name_plural = '通知' ordering = ['-created_at'] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['category', '-created_at']), models.Index(fields=['level', '-created_at']), models.Index(fields=['is_read', '-created_at']), ] def __str__(self): return f"{self.get_level_display()} - {self.title}" @classmethod def cleanup_old_notifications(cls) -> int: """清理超过15天的旧通知""" cutoff_date = timezone.now() - timedelta(days=15) deleted_count, _ = cls.objects.filter(created_at__lt=cutoff_date).delete() return deleted_count or 0 def save(self, *args, **kwargs): """重写save方法,在创建新通知时自动清理旧通知""" is_new = self.pk is None super().save(*args, **kwargs) if is_new: try: deleted_count = self.__class__.cleanup_old_notifications() if deleted_count > 0: logger.info("自动清理了 %d 条超过15天的旧通知", deleted_count) except Exception: logger.warning("通知自动清理失败", exc_info=True) ================================================ FILE: backend/apps/scan/notifications/receivers.py ================================================ """信号接收器 - 处理通知相关的信号 监听各种信号并发送相应的通知。 """ import logging from django.dispatch import receiver from apps.common.signals import vulnerabilities_saved, worker_delete_failed, all_workers_high_load from apps.scan.notifications import create_notification, NotificationLevel, NotificationCategory logger = logging.getLogger(__name__) @receiver(vulnerabilities_saved) def on_vulnerabilities_saved(sender, items, scan_id, target_id, **kwargs): """漏洞保存完成后的通知处理 为每个漏洞发送详细通知 """ if not items: return # 获取目标名称 target_name = "未知目标" if target_id: try: from apps.targets.models import Target target = Target.objects.filter(id=target_id).first() if target: target_name = target.name except Exception: pass # 严重程度映射 severity_level_map = { 'critical': NotificationLevel.CRITICAL, 'high': NotificationLevel.HIGH, 'medium': NotificationLevel.MEDIUM, 'low': NotificationLevel.LOW, } for vuln in items: try: severity = vuln.severity or 'unknown' # 构建漏洞详情消息 message = f"漏洞:{vuln.vuln_type}\n" message += f"程度:{severity}\n" message += f"目标:{target_name}\n" message += f"URL:{vuln.url}" if vuln.source: message += f"\n来源:{vuln.source}" if vuln.description: message += f"\n描述:{vuln.description}" # 根据漏洞严重程度设置通知级别 level = severity_level_map.get(severity.lower(), NotificationLevel.MEDIUM) create_notification( title=f"{vuln.vuln_type}", message=message, level=level, category=NotificationCategory.VULNERABILITY ) except Exception as e: logger.error("发送漏洞通知失败 - url=%s: %s", vuln.url, e, exc_info=True) logger.info("漏洞通知已发送 - scan_id=%s, 数量=%d", scan_id, len(items)) @receiver(worker_delete_failed) def on_worker_delete_failed(sender, worker_name, message, **kwargs): """Worker 删除失败时的通知处理""" create_notification( title="Worker 删除警告", message=f"节点 {worker_name} 已从数据库删除,但远程卸载失败: {message}", level=NotificationLevel.MEDIUM, category=NotificationCategory.SYSTEM ) logger.warning("Worker 删除失败通知已发送 - worker=%s, message=%s", worker_name, message) @receiver(all_workers_high_load) def on_all_workers_high_load(sender, worker_name, cpu, mem, **kwargs): """所有 Worker 高负载时的通知处理""" create_notification( title="系统负载较高", message=f"所有节点负载较高(最低负载节点 CPU: {cpu:.1f}%, 内存: {mem:.1f}%),系统将等待最多 10 分钟后分发任务,扫描速度可能受影响", level=NotificationLevel.MEDIUM, category=NotificationCategory.SYSTEM ) logger.warning("高负载通知已发送 - cpu=%.1f%%, mem=%.1f%%", cpu, mem) ================================================ FILE: backend/apps/scan/notifications/repositories.py ================================================ """通知系统仓储层模块""" import logging from dataclasses import dataclass from typing import Optional from django.db.models import QuerySet from django.utils import timezone from apps.common.decorators import auto_ensure_db_connection from .models import Notification, NotificationSettings logger = logging.getLogger(__name__) @dataclass class NotificationSettingsData: """通知设置更新数据""" discord_enabled: bool discord_webhook_url: str categories: dict[str, bool] wecom_enabled: bool = False wecom_webhook_url: str = '' @auto_ensure_db_connection class NotificationSettingsRepository: """通知设置仓储层""" def get_settings(self) -> NotificationSettings: """获取通知设置单例""" return NotificationSettings.get_instance() def update_settings(self, data: NotificationSettingsData) -> NotificationSettings: """更新通知设置""" settings = NotificationSettings.get_instance() settings.discord_enabled = data.discord_enabled settings.discord_webhook_url = data.discord_webhook_url settings.wecom_enabled = data.wecom_enabled settings.wecom_webhook_url = data.wecom_webhook_url settings.categories = data.categories settings.save() return settings def is_category_enabled(self, category: str) -> bool: """检查指定分类是否启用""" return self.get_settings().is_category_enabled(category) @auto_ensure_db_connection class DjangoNotificationRepository: """通知数据仓储层""" def get_filtered( self, level: Optional[str] = None, unread: Optional[bool] = None ) -> QuerySet[Notification]: """ 获取过滤后的通知列表 Args: level: 通知级别过滤 unread: 已读状态过滤 (True=未读, False=已读, None=全部) """ queryset = Notification.objects.all() if level: queryset = queryset.filter(level=level) if unread is True: queryset = queryset.filter(is_read=False) elif unread is False: queryset = queryset.filter(is_read=True) return queryset.order_by("-created_at") def get_unread_count(self) -> int: """获取未读通知数量""" return Notification.objects.filter(is_read=False).count() def mark_all_as_read(self) -> int: """标记所有通知为已读,返回更新数量""" return Notification.objects.filter(is_read=False).update( is_read=True, read_at=timezone.now(), ) def create( self, title: str, message: str, level: str, category: str = 'system' ) -> Notification: """创建新通知""" return Notification.objects.create( category=category, level=level, title=title, message=message, ) ================================================ FILE: backend/apps/scan/notifications/routing.py ================================================ """ WebSocket 路由配置 """ from django.urls import path # 延迟导入,避免循环依赖 from .consumers import NotificationConsumer websocket_urlpatterns = [ path('ws/notifications/', NotificationConsumer.as_asgi()), ] ================================================ FILE: backend/apps/scan/notifications/serializers.py ================================================ """通知序列化器""" from rest_framework import serializers from .models import Notification class NotificationSerializer(serializers.ModelSerializer): class Meta: model = Notification fields = [ 'id', 'category', 'title', 'message', 'level', 'is_read', 'created_at', 'read_at', ] ================================================ FILE: backend/apps/scan/notifications/services.py ================================================ """通知服务 - 支持数据库存储和 WebSocket 实时推送""" import logging import time import requests import urllib3 from .models import Notification, NotificationSettings from .types import NotificationLevel, NotificationCategory from .repositories import DjangoNotificationRepository, NotificationSettingsRepository # 禁用自签名证书的 SSL 警告(远程 Worker 回调场景) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) logger = logging.getLogger(__name__) # ============================================================ # 外部推送渠道抽象 # ============================================================ # Discord Embed 颜色映射(使用字符串 key,因为 model 字段存储的是字符串) DISCORD_COLORS = { 'low': 0x3498db, # 蓝色 'medium': 0xf39c12, # 橙色 'high': 0xe74c3c, # 红色 'critical': 0x9b59b6, # 紫色 } # 分类 emoji(使用字符串 key) CATEGORY_EMOJI = { 'scan': '🔍', 'vulnerability': '⚠️', 'asset': '🌐', 'system': '⚙️', } def push_to_external_channels(notification: Notification) -> None: """ 推送通知到外部渠道(Discord、Slack 等) 根据用户设置决定推送到哪些渠道。 目前支持:Discord 未来可扩展:Slack、Telegram、Email 等 Args: notification: 通知对象 """ settings = NotificationSettings.get_instance() # 检查分类是否启用 if not settings.is_category_enabled(notification.category): logger.debug(f"分类 {notification.category} 未启用外部推送") return # Discord 渠道 if settings.discord_enabled and settings.discord_webhook_url: try: _send_discord(notification, settings.discord_webhook_url) except Exception as e: logger.warning(f"Discord 推送失败: {e}") # 企业微信渠道 if settings.wecom_enabled and settings.wecom_webhook_url: try: _send_wecom(notification, settings.wecom_webhook_url) except Exception as e: logger.warning(f"企业微信推送失败: {e}") def _send_discord(notification: Notification, webhook_url: str) -> bool: """发送到 Discord Webhook""" try: color = DISCORD_COLORS.get(notification.level, 0x95a5a6) emoji = CATEGORY_EMOJI.get(notification.category, '📢') embed = { 'title': f"{emoji} {notification.title}", 'description': notification.message, 'color': color, 'footer': { 'text': f"级别: {notification.get_level_display()} | 分类: {notification.get_category_display()}" }, 'timestamp': notification.created_at.isoformat(), } response = requests.post( webhook_url, json={'embeds': [embed]}, timeout=10 ) if response.status_code in (200, 204): logger.info(f"Discord 通知发送成功 - {notification.title}") return True else: logger.warning(f"Discord 发送失败 - 状态码: {response.status_code}") return False except requests.RequestException as e: logger.error(f"Discord 网络错误: {e}") return False def _send_wecom(notification: Notification, webhook_url: str) -> bool: """发送到企业微信机器人 Webhook""" try: emoji = CATEGORY_EMOJI.get(notification.category, '📢') # 企业微信 Markdown 格式 content = f"""**{emoji} {notification.title}** > 级别:{notification.get_level_display()} > 分类:{notification.get_category_display()} {notification.message}""" payload = { 'msgtype': 'markdown', 'markdown': {'content': content} } response = requests.post(webhook_url, json=payload, timeout=10) if response.status_code == 200: result = response.json() if result.get('errcode') == 0: logger.info(f"企业微信通知发送成功 - {notification.title}") return True logger.warning(f"企业微信发送失败 - errcode: {result.get('errcode')}, errmsg: {result.get('errmsg')}") return False logger.warning(f"企业微信发送失败 - 状态码: {response.status_code}") return False except requests.RequestException as e: logger.error(f"企业微信网络错误: {e}") return False # ============================================================ # 设置服务 # ============================================================ class NotificationSettingsService: """通知设置服务""" def __init__(self, repository: NotificationSettingsRepository | None = None): self.repo = repository or NotificationSettingsRepository() def get_settings(self) -> dict: """获取通知设置(前端格式)""" settings = self.repo.get_settings() return { 'discord': { 'enabled': settings.discord_enabled, 'webhookUrl': settings.discord_webhook_url, }, 'wecom': { 'enabled': settings.wecom_enabled, 'webhookUrl': settings.wecom_webhook_url, }, 'categories': settings.categories, } def update_settings(self, data: dict) -> dict: """更新通知设置 注意:DRF CamelCaseJSONParser 会将前端的 webhookUrl 转换为 webhook_url """ discord_data = data.get('discord', {}) wecom_data = data.get('wecom', {}) categories = data.get('categories', {}) # CamelCaseJSONParser 转换后的字段名是 webhook_url discord_webhook_url = discord_data.get('webhook_url', '') wecom_webhook_url = wecom_data.get('webhook_url', '') settings = self.repo.update_settings( discord_enabled=discord_data.get('enabled', False), discord_webhook_url=discord_webhook_url, wecom_enabled=wecom_data.get('enabled', False), wecom_webhook_url=wecom_webhook_url, categories=categories, ) return { 'discord': { 'enabled': settings.discord_enabled, 'webhookUrl': settings.discord_webhook_url, }, 'wecom': { 'enabled': settings.wecom_enabled, 'webhookUrl': settings.wecom_webhook_url, }, 'categories': settings.categories, } class NotificationService: """通知业务服务,封装常用查询与更新操作""" def __init__(self, repository: DjangoNotificationRepository | None = None): self.repo = repository or DjangoNotificationRepository() def get_notifications(self, level: str | None = None, unread: bool | None = None): return self.repo.get_filtered(level=level, unread=unread) def get_unread_count(self) -> int: return self.repo.get_unread_count() def mark_all_as_read(self) -> int: return self.repo.mark_all_as_read() def create_notification( title: str, message: str, level: NotificationLevel = NotificationLevel.LOW, category: NotificationCategory = NotificationCategory.SYSTEM ) -> Notification: """ 创建通知记录并实时推送 增强的重试机制: - 最多重试 3 次 - 每次重试前强制关闭并重建数据库连接 - 重试间隔:1秒 → 2秒 → 3秒 - 针对连接错误进行特殊处理 Args: title: 通知标题 message: 通知消息 level: 通知级别 category: 通知分类 Returns: Notification: 创建的通知对象 Raises: Exception: 重试3次后仍然失败 """ from django.db import connection from psycopg2 import OperationalError, InterfaceError repo = DjangoNotificationRepository() max_retries = 3 last_exception = None for attempt in range(1, max_retries + 1): try: # 强制关闭旧连接并重建(每次尝试都重建) if attempt > 1: logger.debug(f"重试创建通知 ({attempt}/{max_retries}) - {title}") connection.close() connection.ensure_connection() # 测试连接是否真的可用 connection.cursor().execute("SELECT 1") # 1. 写入数据库(通过仓储层统一访问 ORM) notification = repo.create( title=title, message=message, level=level, category=category, ) # 2. WebSocket 实时推送(推送失败不影响通知创建) try: _push_to_websocket(notification) except Exception as push_error: logger.warning(f"WebSocket 推送失败,但通知已创建 - {title}: {push_error}") # 3. 外部渠道推送(Discord/Slack 等,推送失败不影响通知创建) try: push_to_external_channels(notification) except Exception as external_error: logger.warning(f"外部渠道推送失败,但通知已创建 - {title}: {external_error}") if attempt > 1: logger.info(f"✓ 通知创建成功(重试 {attempt-1} 次后) - {title}") else: logger.debug(f"通知已创建并推送 - {title}") return notification except (OperationalError, InterfaceError) as e: # 数据库连接错误,需要重试 last_exception = e error_msg = str(e) logger.warning( f"数据库连接错误 ({attempt}/{max_retries}) - {title}: {error_msg[:100]}" ) if attempt < max_retries: # 指数退避:1秒、2秒、3秒 sleep_time = attempt logger.debug(f"等待 {sleep_time} 秒后重试...") time.sleep(sleep_time) else: logger.error( f"创建通知失败 - 数据库连接问题(已重试 {max_retries} 次) - {title}: {error_msg}" ) except Exception as e: # 其他错误,不重试直接抛出 last_exception = e error_str = str(e).lower() if 'connection' in error_str or 'closed' in error_str: logger.error(f"创建通知失败 - 连接相关错误 - {title}: {e}") else: logger.error(f"创建通知失败 - {title}: {e}") # 非连接错误,直接抛出不重试 raise # 所有重试都失败了 error_msg = f"创建通知失败 - 已重试 {max_retries} 次仍然失败 - {title}" logger.error(error_msg) raise RuntimeError(error_msg) from last_exception def _push_to_websocket(notification: Notification) -> None: """ 推送通知到 WebSocket 客户端 - 在 Server 容器中:直接通过 Channel Layer 推送 - 在 Worker 容器中:通过 API 回调让 Server 推送(因为 Worker 无法访问 Redis) """ import os # 检测是否在 Worker 容器中(有 SERVER_URL 环境变量) server_url = os.environ.get("SERVER_URL") if server_url: # Worker 容器:通过 API 回调 _push_via_api_callback(notification, server_url) else: # Server 容器:直接推送 _push_via_channel_layer(notification) def _push_via_api_callback(notification: Notification, server_url: str) -> None: """ 通过 HTTP 回调推送通知(Worker → Server 跨容器通信) 注意:这不是同进程内的 service 调用 view,而是 Worker 容器 通过 HTTP 请求 Server 容器的 /api/callbacks/notification/ 接口。 Worker 无法直接访问 Redis,需要由 Server 代为推送 WebSocket。 """ import os import requests try: callback_url = f"{server_url}/api/callbacks/notification/" data = { 'id': notification.id, 'category': notification.category, 'title': notification.title, 'message': notification.message, 'level': notification.level, 'created_at': notification.created_at.isoformat() } # 构建请求头(包含 Worker API Key) headers = {'Content-Type': 'application/json'} worker_api_key = os.environ.get("WORKER_API_KEY", "") if worker_api_key: headers["X-Worker-API-Key"] = worker_api_key # verify=False: 远程 Worker 回调 Server 时可能使用自签名证书 resp = requests.post(callback_url, json=data, headers=headers, timeout=5, verify=False) resp.raise_for_status() logger.debug(f"通知回调推送成功 - ID: {notification.id}") except Exception as e: logger.warning(f"通知回调推送失败 - ID: {notification.id}: {e}") def _push_via_channel_layer(notification: Notification) -> None: """通过 Channel Layer 直接推送通知(Server 容器使用)""" try: logger.debug(f"开始推送通知到 WebSocket - ID: {notification.id}") from asgiref.sync import async_to_sync from channels.layers import get_channel_layer # 获取 Channel Layer channel_layer = get_channel_layer() if channel_layer is None: logger.warning("Channel Layer 未配置,跳过 WebSocket 推送") return # 构造通知数据 data = { 'type': 'notification.message', # 对应 Consumer 的 notification_message 方法 'id': notification.id, 'category': notification.category, 'title': notification.title, 'message': notification.message, 'level': notification.level, 'created_at': notification.created_at.isoformat() } # 发送到通知组(所有连接的客户端) async_to_sync(channel_layer.group_send)( 'notifications', # 组名 data ) logger.debug(f"通知推送成功 - ID: {notification.id}") except ImportError as e: logger.warning(f"Channels 模块未安装,跳过 WebSocket 推送: {e}") except Exception as e: logger.warning(f"WebSocket 推送失败 - ID: {notification.id}: {e}", exc_info=True) ================================================ FILE: backend/apps/scan/notifications/types.py ================================================ """通知系统类型定义""" from django.db import models class NotificationLevel(models.TextChoices): """通知级别""" LOW = 'low', '低' MEDIUM = 'medium', '中' HIGH = 'high', '高' CRITICAL = 'critical', '严重' class NotificationCategory(models.TextChoices): """通知分类""" SCAN = 'scan', '扫描任务' VULNERABILITY = 'vulnerability', '漏洞发现' ASSET = 'asset', '资产发现' SYSTEM = 'system', '系统消息' ================================================ FILE: backend/apps/scan/notifications/urls.py ================================================ """ 通知系统 URL 配置 """ from django.urls import path from . import views from .views import ( NotificationCollectionView, NotificationMarkAllAsReadView, NotificationUnreadCountView, ) app_name = 'notifications' urlpatterns = [ # 通知列表 path('', NotificationCollectionView.as_view(), name='list'), # 未读数量 path('unread-count/', NotificationUnreadCountView.as_view(), name='unread-count'), # 标记全部已读 path('mark-all-as-read/', NotificationMarkAllAsReadView.as_view(), name='mark-all-as-read'), ] # WebSocket 实时通知路由在 routing.py 中定义:ws://host/ws/notifications/ ================================================ FILE: backend/apps/scan/notifications/views.py ================================================ """ 通知系统视图 - REST API 和测试接口 """ import logging from typing import Any from django.http import JsonResponse from django.utils import timezone from rest_framework import status from rest_framework.decorators import api_view from rest_framework.request import Request from rest_framework.response import Response from rest_framework.views import APIView from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from .models import Notification from .serializers import NotificationSerializer from .types import NotificationLevel from .services import NotificationService, NotificationSettingsService logger = logging.getLogger(__name__) def _parse_bool(value: str | None) -> bool | None: """解析字符串为布尔值 Args: value: 字符串值,支持 '1', 'true', 'yes' 为 True;'0', 'false', 'no' 为 False Returns: 布尔值,或 None(如果无法解析) """ if value is None: return None value = str(value).strip().lower() if value in {'1', 'true', 'yes'}: return True if value in {'0', 'false', 'no'}: return False return None class NotificationCollectionView(APIView): """通知列表 支持的方法: - GET: 获取通知列表(支持分页和过滤) """ pagination_class = BasePagination def get(self, request: Request) -> Response: """ 获取通知列表 URL: GET /api/notifications/?page=1&pageSize=20&level=info&unread=true 查询参数: - page: 页码(默认 1) - pageSize: 每页数量(默认 10,最大 1000) - level: 通知级别过滤(low/medium/high) - unread: 是否未读(true/false) 返回: - results: 通知列表 - total: 总记录数 - page: 当前页码 - page_size: 每页大小 - total_pages: 总页数 """ service = NotificationService() # 按级别过滤 level_param = request.query_params.get('level') level_filter = level_param if level_param in NotificationLevel.values else None # 按已读状态过滤 # unread=true: 仅未读 unread=false: 仅已读 unread=None: 全部 unread_param = _parse_bool(request.query_params.get('unread')) queryset = service.get_notifications(level=level_filter, unread=unread_param) # 使用通用分页器 paginator = self.pagination_class() page_obj = paginator.paginate_queryset(queryset, request) serializer = NotificationSerializer(page_obj, many=True) return paginator.get_paginated_response(serializer.data) class NotificationUnreadCountView(APIView): """获取未读通知数量 URL: GET /api/notifications/unread-count/ 功能: - 返回当前未读通知的数量 返回: - count: 未读通知数量 """ def get(self, request: Request) -> Response: """获取未读通知数量""" service = NotificationService() count = service.get_unread_count() return success_response(data={'count': count}) class NotificationMarkAllAsReadView(APIView): """标记全部通知为已读 URL: POST /api/notifications/mark-all-as-read/ 功能: - 将所有未读通知标记为已读 - 更新 read_at 时间戳 返回: - updated: 更新的通知数量 """ def post(self, request: Request) -> Response: """标记全部通知为已读""" service = NotificationService() updated = service.mark_all_as_read() return success_response(data={'updated': updated}) class NotificationSettingsView(APIView): """通知设置 API URL: /api/settings/notifications/ 支持的方法: - GET: 获取当前通知设置 - PUT: 更新通知设置 """ def get(self, request: Request) -> Response: """获取通知设置""" service = NotificationSettingsService() settings = service.get_settings() return success_response(data=settings) def put(self, request: Request) -> Response: """更新通知设置""" service = NotificationSettingsService() settings = service.update_settings(request.data) return success_response(data=settings) # ============================================ # Worker 回调 API # ============================================ @api_view(['POST']) # 权限由全局 IsAuthenticatedOrPublic 处理,/api/callbacks/* 需要 Worker API Key 认证 def notification_callback(request): """ 接收 Worker 的通知推送请求 Worker 容器无法直接访问 Redis,通过此 API 回调让 Server 推送 WebSocket。 需要 Worker API Key 认证(X-Worker-API-Key Header)。 POST /api/callbacks/notification/ { "id": 1, "category": "scan", "title": "扫描开始", "message": "...", "level": "info", "created_at": "2025-01-01T00:00:00" } """ try: data = request.data # 验证必要字段 required_fields = ['id', 'category', 'title', 'message', 'level', 'created_at'] for field in required_fields: if field not in data: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=f'Missing field: {field}', status_code=status.HTTP_400_BAD_REQUEST ) # 推送到 WebSocket _push_notification_to_websocket(data) logger.debug(f"回调通知推送成功 - ID: {data['id']}, Title: {data['title']}") return success_response(data={'status': 'ok'}) except Exception as e: logger.error(f"回调通知处理失败: {e}", exc_info=True) return error_response( code=ErrorCodes.SERVER_ERROR, message=str(e), status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) def _push_notification_to_websocket(data: dict): """推送通知到 WebSocket(Server 端使用)""" from asgiref.sync import async_to_sync from channels.layers import get_channel_layer channel_layer = get_channel_layer() if channel_layer is None: logger.warning("Channel Layer 未配置,跳过 WebSocket 推送") return # 构造通知数据 ws_data = { 'type': 'notification.message', 'id': data['id'], 'category': data['category'], 'title': data['title'], 'message': data['message'], 'level': data['level'], 'created_at': data['created_at'] } # 发送到通知组 async_to_sync(channel_layer.group_send)( 'notifications', ws_data ) ================================================ FILE: backend/apps/scan/orchestrators/__init__.py ================================================ """ 工作流编排器模块 提供工作流编排相关的类和函数 """ from .flow_orchestrator import FlowOrchestrator __all__ = [ 'FlowOrchestrator', ] ================================================ FILE: backend/apps/scan/orchestrators/flow_orchestrator.py ================================================ """ 工作流编排器 职责: - 解析 YAML 配置 - 检测扫描类型 - 提供 Flow 函数映射 - 生成执行计划 注意:本类只负责准备和解析,不执行 Flow Flow 的执行由 initiate_scan_flow (Prefect @flow) 负责 """ import logging import yaml from typing import Dict, List, Optional, Callable, Any from apps.scan.configs.command_templates import get_supported_scan_types, EXECUTION_STAGES logger = logging.getLogger(__name__) class FlowOrchestrator: """ 工作流编排器 负责解析 YAML 配置并生成执行计划,不执行具体的 Flow """ def __init__(self, engine_config: str): """ 初始化编排器 Args: engine_config: YAML 格式的引擎配置字符串 Raises: ValueError: 配置为空或解析失败 """ if not engine_config or not engine_config.strip(): raise ValueError("引擎配置不能为空") try: self.config = yaml.safe_load(engine_config) or {} except yaml.YAMLError as e: logger.error(f"引擎配置解析失败: {e}") raise ValueError(f"引擎配置解析失败: {e}") if not self.config: raise ValueError("引擎配置为空") # 检测启用的扫描类型 self.scan_types = self._detect_scan_types() # 解析所有扫描类型的工具配置 from apps.scan.utils.config_parser import parse_enabled_tools_from_dict self.enabled_tools_by_type = {} for scan_type in self.scan_types: try: enabled_tools = parse_enabled_tools_from_dict( scan_type=scan_type, parsed_config=self.config ) if enabled_tools: self.enabled_tools_by_type[scan_type] = enabled_tools logger.debug(f"✓ {scan_type}: {len(enabled_tools)} 个启用工具") except Exception as e: logger.error(f"解析 {scan_type} 工具配置失败: {e}") raise logger.info(f"✓ FlowOrchestrator 初始化完成,{len(self.enabled_tools_by_type)} 个扫描类型有启用的工具") def _parse_config(self, engine_config: str) -> Dict: """ 解析 YAML 配置 Args: engine_config: YAML 格式字符串 Returns: dict: 解析后的配置字典 Raises: ValueError: 配置为空或解析失败 """ if not engine_config: raise ValueError("引擎配置为空,请提供有效的 YAML 配置") try: config = yaml.safe_load(engine_config) if not config: raise ValueError("YAML 配置解析结果为空") logger.info(f"YAML 配置解析成功,检测到的 key: {list(config.keys())}") return config except yaml.YAMLError as e: raise ValueError(f"YAML 配置解析失败: {e}") def _detect_scan_types(self) -> List[str]: """ 检测配置中已启用的扫描类型(按 YAML 顺序) Returns: list: 已启用的扫描类型列表 Raises: ValueError: 未检测到有效的扫描类型 """ # 保持 YAML 中的顺序,且只包含已启用的类型 supported_scan_types = get_supported_scan_types() scan_types = [ key for key in self.config.keys() if key in supported_scan_types and self.is_scan_type_enabled(key) ] if not scan_types: raise ValueError( f"未检测到已启用的扫描类型。\n" f"配置中的 key: {list(self.config.keys())}\n" f"支持的扫描类型: {supported_scan_types}" ) logger.info(f"检测到已启用的扫描类型(按顺序): {scan_types}") return scan_types def is_scan_type_enabled(self, scan_type: str) -> bool: """ 判断指定扫描类型是否启用(存在配置且有启用的工具) Args: scan_type: 扫描类型 Returns: bool: 是否启用 """ if scan_type not in self.config: return False scan_config = self.config.get(scan_type, {}) # 子域名发现使用 passive_tools 结构 if scan_type == 'subdomain_discovery': passive_tools = scan_config.get('passive_tools', {}) for tool_config in passive_tools.values(): if isinstance(tool_config, dict) and tool_config.get('enabled', False): return True return False # 其他扫描类型(包括 screenshot):检查 tools tools = scan_config.get('tools', {}) for tool_config in tools.values(): if isinstance(tool_config, dict) and tool_config.get('enabled', False): return True return False def get_execution_stages(self): """ 迭代器:获取所有执行阶段 Yields: tuple: (mode, enabled_flows) - mode: 执行模式('sequential' 或 'parallel') - enabled_flows: 该阶段中已启用的扫描类型列表 Example: for mode, flows in orchestrator.get_execution_stages(): if mode == 'sequential': for flow in flows: execute_flow(flow) else: # parallel execute_parallel(flows) """ for stage in EXECUTION_STAGES: # 筛选出已启用的流程 enabled_flows = [ flow for flow in stage['flows'] if flow in self.scan_types ] # 只返回有启用流程的阶段 if enabled_flows: logger.debug(f"阶段 {stage['mode']}: {enabled_flows}") yield stage['mode'], enabled_flows def get_flow_function(self, scan_type: str) -> Optional[Callable]: """ 获取指定扫描类型的 Flow 函数(延迟导入) Args: scan_type: 扫描类型 Returns: Callable: Flow 函数,如果未实现则返回 None """ if scan_type == 'subdomain_discovery': from apps.scan.flows.subdomain_discovery_flow import subdomain_discovery_flow return subdomain_discovery_flow elif scan_type == 'port_scan': from apps.scan.flows.port_scan_flow import port_scan_flow return port_scan_flow elif scan_type == 'site_scan': from apps.scan.flows.site_scan_flow import site_scan_flow return site_scan_flow elif scan_type == 'fingerprint_detect': from apps.scan.flows.fingerprint_detect_flow import fingerprint_detect_flow return fingerprint_detect_flow elif scan_type == 'directory_scan': from apps.scan.flows.directory_scan_flow import directory_scan_flow return directory_scan_flow elif scan_type == 'url_fetch': from apps.scan.flows.url_fetch import url_fetch_flow return url_fetch_flow elif scan_type == 'vuln_scan': from apps.scan.flows.vuln_scan import vuln_scan_flow return vuln_scan_flow elif scan_type == 'screenshot': from apps.scan.flows.screenshot_flow import screenshot_flow return screenshot_flow else: logger.warning(f"未实现的扫描类型: {scan_type}") return None ================================================ FILE: backend/apps/scan/providers/__init__.py ================================================ """ 扫描目标提供者模块 提供统一的目标获取接口,支持多种数据源: - DatabaseTargetProvider: 从数据库查询(完整扫描) - ListTargetProvider: 使用内存列表(快速扫描阶段1) - SnapshotTargetProvider: 从快照表读取(快速扫描阶段2+) - PipelineTargetProvider: 使用管道输出(Phase 2) 使用方式: from apps.scan.providers import ( DatabaseTargetProvider, ListTargetProvider, SnapshotTargetProvider, ProviderContext ) # 数据库模式(完整扫描) provider = DatabaseTargetProvider(target_id=123) # 列表模式(快速扫描阶段1) context = ProviderContext(target_id=1, scan_id=100) provider = ListTargetProvider( targets=["a.test.com"], context=context ) # 快照模式(快速扫描阶段2+) context = ProviderContext(target_id=1, scan_id=100) provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain", context=context ) # 使用 Provider for host in provider.iter_hosts(): scan(host) """ from .base import TargetProvider, ProviderContext from .list_provider import ListTargetProvider from .database_provider import DatabaseTargetProvider from .snapshot_provider import SnapshotTargetProvider, SnapshotType from .pipeline_provider import PipelineTargetProvider, StageOutput __all__ = [ 'TargetProvider', 'ProviderContext', 'ListTargetProvider', 'DatabaseTargetProvider', 'SnapshotTargetProvider', 'SnapshotType', 'PipelineTargetProvider', 'StageOutput', ] ================================================ FILE: backend/apps/scan/providers/base.py ================================================ """ 扫描目标提供者基础模块 定义 ProviderContext 数据类和 TargetProvider 抽象基类。 """ import ipaddress import logging from abc import ABC, abstractmethod from dataclasses import dataclass from typing import TYPE_CHECKING, Iterator, Optional if TYPE_CHECKING: from apps.common.utils import BlacklistFilter logger = logging.getLogger(__name__) @dataclass class ProviderContext: """ Provider 上下文,携带元数据 Attributes: target_id: 关联的 Target ID(用于结果保存),None 表示临时扫描(不保存) scan_id: 扫描任务 ID """ target_id: Optional[int] = None scan_id: Optional[int] = None class TargetProvider(ABC): """ 扫描目标提供者抽象基类 职责: - 提供扫描目标(域名、IP、URL 等)的迭代器 - 提供黑名单过滤器 - 携带上下文信息(target_id, scan_id 等) - 自动展开 CIDR(子类无需关心) 使用方式: provider = create_target_provider(target_id=123) for host in provider.iter_hosts(): print(host) """ def __init__(self, context: Optional[ProviderContext] = None): self._context = context or ProviderContext() @property def context(self) -> ProviderContext: """返回 Provider 上下文""" return self._context @staticmethod def _expand_host(host: str) -> Iterator[str]: """ 展开主机(如果是 CIDR 则展开为多个 IP,否则直接返回) 示例: "192.168.1.0/30" → "192.168.1.1", "192.168.1.2" "192.168.1.1" → "192.168.1.1" "example.com" → "example.com" """ from apps.common.validators import detect_target_type from apps.targets.models import Target host = host.strip() if not host: return try: target_type = detect_target_type(host) if target_type == Target.TargetType.CIDR: network = ipaddress.ip_network(host, strict=False) if network.num_addresses == 1: yield str(network.network_address) else: yield from (str(ip) for ip in network.hosts()) elif target_type in (Target.TargetType.IP, Target.TargetType.DOMAIN): yield host except ValueError as e: logger.warning("跳过无效的主机格式 '%s': %s", host, str(e)) def iter_hosts(self) -> Iterator[str]: """迭代主机列表(域名/IP),自动展开 CIDR""" for host in self._iter_raw_hosts(): yield from self._expand_host(host) @abstractmethod def _iter_raw_hosts(self) -> Iterator[str]: """迭代原始主机列表(可能包含 CIDR),子类实现""" pass @abstractmethod def iter_urls(self) -> Iterator[str]: """迭代 URL 列表""" pass @abstractmethod def get_blacklist_filter(self) -> Optional['BlacklistFilter']: """获取黑名单过滤器,返回 None 表示不过滤""" pass @property def target_id(self) -> Optional[int]: """返回关联的 target_id,临时扫描返回 None""" return self._context.target_id @property def scan_id(self) -> Optional[int]: """返回关联的 scan_id""" return self._context.scan_id ================================================ FILE: backend/apps/scan/providers/database_provider.py ================================================ """ 数据库目标提供者模块 提供基于数据库查询的目标提供者实现。 """ import logging from typing import TYPE_CHECKING, Iterator, Optional from .base import ProviderContext, TargetProvider if TYPE_CHECKING: from apps.common.utils import BlacklistFilter logger = logging.getLogger(__name__) class DatabaseTargetProvider(TargetProvider): """ 数据库目标提供者 - 从 Target 表及关联资产表查询 数据来源: - iter_hosts(): 根据 Target 类型返回域名/IP - iter_urls(): WebSite/Endpoint 表,带回退链 使用方式: provider = DatabaseTargetProvider(target_id=123) for host in provider.iter_hosts(): scan(host) """ def __init__(self, target_id: int, context: Optional[ProviderContext] = None): ctx = context or ProviderContext() ctx.target_id = target_id super().__init__(ctx) self._blacklist_filter: Optional['BlacklistFilter'] = None def iter_hosts(self) -> Iterator[str]: """从数据库查询主机列表,自动展开 CIDR 并应用黑名单过滤""" blacklist = self.get_blacklist_filter() for host in self._iter_raw_hosts(): for expanded_host in self._expand_host(host): if not blacklist or blacklist.is_allowed(expanded_host): yield expanded_host def _iter_raw_hosts(self) -> Iterator[str]: """从数据库查询原始主机列表(可能包含 CIDR)""" from apps.asset.services.asset.subdomain_service import SubdomainService from apps.targets.models import Target from apps.targets.services import TargetService target = TargetService().get_target(self.target_id) if not target: logger.warning("Target ID %d 不存在", self.target_id) return if target.type == Target.TargetType.DOMAIN: yield target.name for domain in SubdomainService().iter_subdomain_names_by_target( target_id=self.target_id, chunk_size=1000 ): if domain != target.name: yield domain elif target.type in (Target.TargetType.IP, Target.TargetType.CIDR): yield target.name def iter_urls(self) -> Iterator[str]: """从数据库查询 URL 列表,使用回退链:Endpoint → WebSite → Default""" from apps.scan.services.target_export_service import ( DataSource, _iter_urls_with_fallback, ) blacklist = self.get_blacklist_filter() for url, _ in _iter_urls_with_fallback( target_id=self.target_id, sources=[DataSource.ENDPOINT, DataSource.WEBSITE, DataSource.DEFAULT], blacklist_filter=blacklist ): yield url def get_blacklist_filter(self) -> Optional['BlacklistFilter']: """获取黑名单过滤器(延迟加载)""" if self._blacklist_filter is None: from apps.common.services import BlacklistService from apps.common.utils import BlacklistFilter rules = BlacklistService().get_rules(self.target_id) self._blacklist_filter = BlacklistFilter(rules) return self._blacklist_filter ================================================ FILE: backend/apps/scan/providers/list_provider.py ================================================ """ 列表目标提供者模块 提供基于内存列表的目标提供者实现。 """ from typing import Iterator, Optional, List from .base import TargetProvider, ProviderContext class ListTargetProvider(TargetProvider): """ 列表目标提供者 - 直接使用内存中的列表 用于快速扫描、临时扫描等场景,只扫描用户指定的目标。 特点: - 不查询数据库 - 不应用黑名单过滤(用户明确指定的目标) - 不关联 target_id(由调用方负责创建 Target) - 自动检测输入类型(URL/域名/IP/CIDR) - 自动展开 CIDR 使用方式: # 快速扫描:用户提供目标,自动识别类型 provider = ListTargetProvider(targets=[ "example.com", # 域名 "192.168.1.0/24", # CIDR(自动展开) "https://api.example.com" # URL ]) for host in provider.iter_hosts(): scan(host) """ def __init__( self, targets: Optional[List[str]] = None, context: Optional[ProviderContext] = None ): """ 初始化列表目标提供者 Args: targets: 目标列表(自动识别类型:URL/域名/IP/CIDR) context: Provider 上下文 """ from apps.common.validators import detect_input_type ctx = context or ProviderContext() super().__init__(ctx) # 自动分类目标 self._hosts = [] self._urls = [] if targets: for target in targets: target = target.strip() if not target: continue try: input_type = detect_input_type(target) if input_type == 'url': self._urls.append(target) else: # domain/ip/cidr 都作为 host self._hosts.append(target) except ValueError: # 无法识别类型,默认作为 host self._hosts.append(target) def _iter_raw_hosts(self) -> Iterator[str]: """迭代原始主机列表(可能包含 CIDR)""" yield from self._hosts def iter_urls(self) -> Iterator[str]: """迭代 URL 列表""" yield from self._urls def get_blacklist_filter(self) -> None: """列表模式不使用黑名单过滤""" return None ================================================ FILE: backend/apps/scan/providers/pipeline_provider.py ================================================ """ 管道目标提供者模块 提供基于管道阶段输出的目标提供者实现。 用于 Phase 2 管道模式的阶段间数据传递。 """ from dataclasses import dataclass, field from typing import Iterator, Optional, List, Dict, Any from .base import TargetProvider, ProviderContext @dataclass class StageOutput: """ 阶段输出数据 用于在管道阶段之间传递数据。 Attributes: hosts: 主机列表(域名/IP) urls: URL 列表 new_targets: 新发现的目标列表 stats: 统计信息 success: 是否成功 error: 错误信息 """ hosts: List[str] = field(default_factory=list) urls: List[str] = field(default_factory=list) new_targets: List[str] = field(default_factory=list) stats: Dict[str, Any] = field(default_factory=dict) success: bool = True error: Optional[str] = None class PipelineTargetProvider(TargetProvider): """ 管道目标提供者 - 使用上一阶段的输出 用于 Phase 2 管道模式的阶段间数据传递。 特点: - 不查询数据库 - 不应用黑名单过滤(数据已在上一阶段过滤) - 直接使用 StageOutput 中的数据 使用方式(Phase 2): stage1_output = stage1.run(input) provider = PipelineTargetProvider( previous_output=stage1_output, target_id=123 ) for host in provider.iter_hosts(): stage2.scan(host) """ def __init__( self, previous_output: StageOutput, target_id: Optional[int] = None, context: Optional[ProviderContext] = None ): """ 初始化管道目标提供者 Args: previous_output: 上一阶段的输出 target_id: 可选,关联到某个 Target(用于保存结果) context: Provider 上下文 """ ctx = context or ProviderContext(target_id=target_id) super().__init__(ctx) self._previous_output = previous_output def _iter_raw_hosts(self) -> Iterator[str]: """迭代上一阶段输出的原始主机(可能包含 CIDR)""" yield from self._previous_output.hosts def iter_urls(self) -> Iterator[str]: """迭代上一阶段输出的 URL""" yield from self._previous_output.urls def get_blacklist_filter(self) -> None: """管道传递的数据已经过滤过了""" return None @property def previous_output(self) -> StageOutput: """返回上一阶段的输出""" return self._previous_output ================================================ FILE: backend/apps/scan/providers/snapshot_provider.py ================================================ """ 快照目标提供者模块 提供基于快照表的目标提供者实现。 用于快速扫描的阶段间数据传递。 """ import logging from typing import Iterator, Optional, Literal from .base import TargetProvider, ProviderContext logger = logging.getLogger(__name__) # 快照类型定义 SnapshotType = Literal["subdomain", "website", "endpoint", "host_port"] class SnapshotTargetProvider(TargetProvider): """ 快照目标提供者 - 从快照表读取本次扫描的数据 用于快速扫描的阶段间数据传递,解决精确扫描控制问题。 核心价值: - 只返回本次扫描(scan_id)发现的资产 - 避免扫描历史数据(DatabaseTargetProvider 会扫描所有历史资产) 特点: - 通过 scan_id 过滤快照表 - 不应用黑名单过滤(数据已在上一阶段过滤) - 支持多种快照类型(subdomain/website/endpoint/host_port) 使用场景: # 快速扫描流程 用户输入: a.test.com 创建 Target: test.com (id=1) 创建 Scan: scan_id=100 # 阶段1: 子域名发现 provider = ListTargetProvider( targets=["a.test.com"], context=ProviderContext(target_id=1, scan_id=100) ) # 发现: b.a.test.com, c.a.test.com # 保存: SubdomainSnapshot(scan_id=100) + Subdomain(target_id=1) # 阶段2: 端口扫描 provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain", context=ProviderContext(target_id=1, scan_id=100) ) # 只返回: b.a.test.com, c.a.test.com(本次扫描发现的) # 不返回: www.test.com, api.test.com(历史数据) # 阶段3: 网站扫描 provider = SnapshotTargetProvider( scan_id=100, snapshot_type="host_port", context=ProviderContext(target_id=1, scan_id=100) ) # 只返回本次扫描发现的 IP:Port """ def __init__( self, scan_id: int, snapshot_type: SnapshotType, context: Optional[ProviderContext] = None ): """ 初始化快照目标提供者 Args: scan_id: 扫描任务 ID(必需) snapshot_type: 快照类型 - "subdomain": 子域名快照(SubdomainSnapshot) - "website": 网站快照(WebsiteSnapshot) - "endpoint": 端点快照(EndpointSnapshot) - "host_port": 主机端口映射快照(HostPortMappingSnapshot) context: Provider 上下文 """ ctx = context or ProviderContext() ctx.scan_id = scan_id super().__init__(ctx) self._scan_id = scan_id self._snapshot_type = snapshot_type def _iter_raw_hosts(self) -> Iterator[str]: """ 从快照表迭代主机列表 根据 snapshot_type 选择不同的快照表: - subdomain: SubdomainSnapshot.name - host_port: HostPortMappingSnapshot.host (返回 host:port 格式,不经过验证) """ if self._snapshot_type == "subdomain": from apps.asset.services.snapshot import SubdomainSnapshotsService service = SubdomainSnapshotsService() yield from service.iter_subdomain_names_by_scan( scan_id=self._scan_id, chunk_size=1000 ) elif self._snapshot_type == "host_port": # host_port 类型不使用 _iter_raw_hosts,直接在 iter_hosts 中处理 # 这里返回空,避免被基类的 iter_hosts 调用 return else: # 其他类型暂不支持 iter_hosts logger.warning( "快照类型 '%s' 不支持 iter_hosts,返回空迭代器", self._snapshot_type ) return def iter_hosts(self) -> Iterator[str]: """ 迭代主机列表 对于 host_port 类型,返回 host:port 格式,不经过 CIDR 展开验证 """ if self._snapshot_type == "host_port": # host_port 类型直接返回 host:port,不经过 _expand_host 验证 from apps.asset.services.snapshot import HostPortMappingSnapshotsService service = HostPortMappingSnapshotsService() queryset = service.get_by_scan(scan_id=self._scan_id) for mapping in queryset.iterator(chunk_size=1000): yield f"{mapping.host}:{mapping.port}" else: # 其他类型使用基类的 iter_hosts(会调用 _iter_raw_hosts 并展开 CIDR) yield from super().iter_hosts() def iter_urls(self) -> Iterator[str]: """ 从快照表迭代 URL 列表 根据 snapshot_type 选择不同的快照表: - website: WebsiteSnapshot.url - endpoint: EndpointSnapshot.url """ if self._snapshot_type == "website": from apps.asset.services.snapshot import WebsiteSnapshotsService service = WebsiteSnapshotsService() yield from service.iter_website_urls_by_scan( scan_id=self._scan_id, chunk_size=1000 ) elif self._snapshot_type == "endpoint": from apps.asset.services.snapshot import EndpointSnapshotsService service = EndpointSnapshotsService() # 从快照表获取端点 URL queryset = service.get_by_scan(scan_id=self._scan_id) for endpoint in queryset.iterator(chunk_size=1000): yield endpoint.url else: # 其他类型暂不支持 iter_urls logger.warning( "快照类型 '%s' 不支持 iter_urls,返回空迭代器", self._snapshot_type ) return def get_blacklist_filter(self) -> None: """快照数据已在上一阶段过滤过了""" return None @property def snapshot_type(self) -> SnapshotType: """返回快照类型""" return self._snapshot_type ================================================ FILE: backend/apps/scan/providers/tests/__init__.py ================================================ """ 扫描目标提供者测试模块 """ ================================================ FILE: backend/apps/scan/providers/tests/test_common_properties.py ================================================ """ 通用属性测试 包含跨多个 Provider 的通用属性测试: - Property 4: Context Propagation - Property 5: Non-Database Provider Blacklist Filter - Property 7: CIDR Expansion Consistency """ import pytest from hypothesis import given, strategies as st, settings from ipaddress import IPv4Network from apps.scan.providers import ( ProviderContext, ListTargetProvider, DatabaseTargetProvider, PipelineTargetProvider, SnapshotTargetProvider ) from apps.scan.providers.pipeline_provider import StageOutput class TestContextPropagation: """ Property 4: Context Propagation *For any* ProviderContext,传入 Provider 构造函数后, Provider 的 target_id 和 scan_id 属性应该与 context 中的值一致。 **Validates: Requirements 1.3, 1.5, 7.4, 7.5** """ @given( target_id=st.integers(min_value=1, max_value=10000), scan_id=st.integers(min_value=1, max_value=10000) ) @settings(max_examples=100) def test_property_4_list_provider_context_propagation(self, target_id, scan_id): """ Property 4: Context Propagation (ListTargetProvider) Feature: scan-target-provider, Property 4: Context Propagation **Validates: Requirements 1.3, 1.5, 7.4, 7.5** """ ctx = ProviderContext(target_id=target_id, scan_id=scan_id) provider = ListTargetProvider(targets=["example.com"], context=ctx) assert provider.target_id == target_id assert provider.scan_id == scan_id assert provider.context.target_id == target_id assert provider.context.scan_id == scan_id @given( target_id=st.integers(min_value=1, max_value=10000), scan_id=st.integers(min_value=1, max_value=10000) ) @settings(max_examples=100) def test_property_4_database_provider_context_propagation(self, target_id, scan_id): """ Property 4: Context Propagation (DatabaseTargetProvider) Feature: scan-target-provider, Property 4: Context Propagation **Validates: Requirements 1.3, 1.5, 7.4, 7.5** """ ctx = ProviderContext(target_id=999, scan_id=scan_id) # DatabaseTargetProvider 会覆盖 context 中的 target_id provider = DatabaseTargetProvider(target_id=target_id, context=ctx) assert provider.target_id == target_id # 使用构造函数参数 assert provider.scan_id == scan_id # 使用 context 中的值 assert provider.context.target_id == target_id assert provider.context.scan_id == scan_id @given( target_id=st.integers(min_value=1, max_value=10000), scan_id=st.integers(min_value=1, max_value=10000) ) @settings(max_examples=100) def test_property_4_pipeline_provider_context_propagation(self, target_id, scan_id): """ Property 4: Context Propagation (PipelineTargetProvider) Feature: scan-target-provider, Property 4: Context Propagation **Validates: Requirements 1.3, 1.5, 7.4, 7.5** """ ctx = ProviderContext(target_id=target_id, scan_id=scan_id) stage_output = StageOutput(hosts=["example.com"]) provider = PipelineTargetProvider(previous_output=stage_output, context=ctx) assert provider.target_id == target_id assert provider.scan_id == scan_id assert provider.context.target_id == target_id assert provider.context.scan_id == scan_id @given( target_id=st.integers(min_value=1, max_value=10000), scan_id=st.integers(min_value=1, max_value=10000) ) @settings(max_examples=100) def test_property_4_snapshot_provider_context_propagation(self, target_id, scan_id): """ Property 4: Context Propagation (SnapshotTargetProvider) Feature: scan-target-provider, Property 4: Context Propagation **Validates: Requirements 1.3, 1.5, 7.4, 7.5** """ ctx = ProviderContext(target_id=target_id, scan_id=999) # SnapshotTargetProvider 会覆盖 context 中的 scan_id provider = SnapshotTargetProvider( scan_id=scan_id, snapshot_type="subdomain", context=ctx ) assert provider.target_id == target_id # 使用 context 中的值 assert provider.scan_id == scan_id # 使用构造函数参数 assert provider.context.target_id == target_id assert provider.context.scan_id == scan_id class TestNonDatabaseProviderBlacklistFilter: """ Property 5: Non-Database Provider Blacklist Filter *For any* ListTargetProvider 或 PipelineTargetProvider 实例, get_blacklist_filter() 方法应该返回 None。 **Validates: Requirements 3.4, 9.4, 9.5** """ @given(targets=st.lists(st.text(min_size=1, max_size=20), max_size=10)) @settings(max_examples=100) def test_property_5_list_provider_no_blacklist(self, targets): """ Property 5: Non-Database Provider Blacklist Filter (ListTargetProvider) Feature: scan-target-provider, Property 5: Non-Database Provider Blacklist Filter **Validates: Requirements 3.4, 9.4, 9.5** """ provider = ListTargetProvider(targets=targets) assert provider.get_blacklist_filter() is None @given(hosts=st.lists(st.text(min_size=1, max_size=20), max_size=10)) @settings(max_examples=100) def test_property_5_pipeline_provider_no_blacklist(self, hosts): """ Property 5: Non-Database Provider Blacklist Filter (PipelineTargetProvider) Feature: scan-target-provider, Property 5: Non-Database Provider Blacklist Filter **Validates: Requirements 3.4, 9.4, 9.5** """ stage_output = StageOutput(hosts=hosts) provider = PipelineTargetProvider(previous_output=stage_output) assert provider.get_blacklist_filter() is None def test_property_5_snapshot_provider_no_blacklist(self): """ Property 5: Non-Database Provider Blacklist Filter (SnapshotTargetProvider) Feature: scan-target-provider, Property 5: Non-Database Provider Blacklist Filter **Validates: Requirements 3.4, 9.4, 9.5** """ provider = SnapshotTargetProvider(scan_id=1, snapshot_type="subdomain") assert provider.get_blacklist_filter() is None class TestCIDRExpansionConsistency: """ Property 7: CIDR Expansion Consistency *For any* CIDR 字符串(如 "192.168.1.0/24"),所有 Provider 的 iter_hosts() 方法应该将其展开为相同的单个 IP 地址列表。 **Validates: Requirements 1.1, 3.6** """ @given( # 生成小的 CIDR 范围以避免测试超时 network_prefix=st.integers(min_value=1, max_value=254), cidr_suffix=st.integers(min_value=28, max_value=30) # /28 = 16 IPs, /30 = 4 IPs ) @settings(max_examples=50, deadline=None) def test_property_7_cidr_expansion_consistency(self, network_prefix, cidr_suffix): """ Property 7: CIDR Expansion Consistency Feature: scan-target-provider, Property 7: CIDR Expansion Consistency **Validates: Requirements 1.1, 3.6** For any CIDR string, all Providers should expand it to the same IP list. """ cidr = f"192.168.{network_prefix}.0/{cidr_suffix}" # 计算预期的 IP 列表 network = IPv4Network(cidr, strict=False) # 排除网络地址和广播地址 expected_ips = [str(ip) for ip in network.hosts()] # 如果 CIDR 太小(/31 或 /32),使用所有地址 if not expected_ips: expected_ips = [str(ip) for ip in network] # ListTargetProvider list_provider = ListTargetProvider(targets=[cidr]) list_result = list(list_provider.iter_hosts()) # PipelineTargetProvider stage_output = StageOutput(hosts=[cidr]) pipeline_provider = PipelineTargetProvider(previous_output=stage_output) pipeline_result = list(pipeline_provider.iter_hosts()) # 验证:所有 Provider 展开的结果应该一致 assert list_result == expected_ips, f"ListProvider CIDR expansion mismatch for {cidr}" assert pipeline_result == expected_ips, f"PipelineProvider CIDR expansion mismatch for {cidr}" assert list_result == pipeline_result, f"Providers produce different results for {cidr}" def test_cidr_expansion_with_multiple_cidrs(self): """测试多个 CIDR 的展开一致性""" cidrs = ["192.168.1.0/30", "10.0.0.0/30"] # 计算预期结果 expected_ips = [] for cidr in cidrs: network = IPv4Network(cidr, strict=False) expected_ips.extend([str(ip) for ip in network.hosts()]) # ListTargetProvider list_provider = ListTargetProvider(targets=cidrs) list_result = list(list_provider.iter_hosts()) # PipelineTargetProvider stage_output = StageOutput(hosts=cidrs) pipeline_provider = PipelineTargetProvider(previous_output=stage_output) pipeline_result = list(pipeline_provider.iter_hosts()) # 验证 assert list_result == expected_ips assert pipeline_result == expected_ips assert list_result == pipeline_result def test_mixed_hosts_and_cidrs(self): """测试混合主机和 CIDR 的处理""" targets = ["example.com", "192.168.1.0/30", "test.com"] # 计算预期结果 network = IPv4Network("192.168.1.0/30", strict=False) cidr_ips = [str(ip) for ip in network.hosts()] expected = ["example.com"] + cidr_ips + ["test.com"] # ListTargetProvider list_provider = ListTargetProvider(targets=targets) list_result = list(list_provider.iter_hosts()) # 验证 assert list_result == expected ================================================ FILE: backend/apps/scan/providers/tests/test_database_provider.py ================================================ """ DatabaseTargetProvider 属性测试 Property 7: DatabaseTargetProvider Blacklist Application *For any* 带有黑名单规则的 target_id,DatabaseTargetProvider 的 iter_hosts() 和 iter_urls() 应该过滤掉匹配黑名单规则的目标。 **Validates: Requirements 2.3, 10.1, 10.2, 10.3** """ import pytest from unittest.mock import patch, MagicMock from hypothesis import given, strategies as st, settings from apps.scan.providers.database_provider import DatabaseTargetProvider from apps.scan.providers.base import ProviderContext # 生成有效域名的策略 def valid_domain_strategy(): """生成有效的域名""" label = st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=2, max_size=10 ) return st.builds( lambda a, b, c: f"{a}.{b}.{c}", label, label, st.sampled_from(['com', 'net', 'org', 'io']) ) class MockBlacklistFilter: """模拟黑名单过滤器""" def __init__(self, blocked_patterns: list): self.blocked_patterns = blocked_patterns def is_allowed(self, target: str) -> bool: """检查目标是否被允许(不在黑名单中)""" for pattern in self.blocked_patterns: if pattern in target: return False return True class TestDatabaseTargetProviderProperties: """DatabaseTargetProvider 属性测试类""" @given( hosts=st.lists(valid_domain_strategy(), min_size=1, max_size=20), blocked_keyword=st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=2, max_size=5 ) ) @settings(max_examples=100) def test_property_7_blacklist_filters_hosts(self, hosts, blocked_keyword): """ Property 7: DatabaseTargetProvider Blacklist Application (hosts) Feature: scan-target-provider, Property 7: DatabaseTargetProvider Blacklist Application **Validates: Requirements 2.3, 10.1, 10.2, 10.3** For any set of hosts and a blacklist keyword, the provider should filter out all hosts containing the blocked keyword. """ # 创建模拟的黑名单过滤器 mock_filter = MockBlacklistFilter([blocked_keyword]) # 创建 provider 并注入模拟的黑名单过滤器 provider = DatabaseTargetProvider(target_id=1) provider._blacklist_filter = mock_filter # 模拟 Target 和 SubdomainService mock_target = MagicMock() mock_target.type = 'domain' mock_target.name = hosts[0] if hosts else 'example.com' with patch('apps.targets.services.TargetService') as mock_target_service, \ patch('apps.asset.services.asset.subdomain_service.SubdomainService') as mock_subdomain_service: mock_target_service.return_value.get_target.return_value = mock_target mock_subdomain_service.return_value.iter_subdomain_names_by_target.return_value = iter(hosts[1:] if len(hosts) > 1 else []) # 获取结果 result = list(provider.iter_hosts()) # 验证:所有结果都不包含被阻止的关键词 for host in result: assert blocked_keyword not in host, f"Host '{host}' should be filtered by blacklist keyword '{blocked_keyword}'" # 验证:所有不包含关键词的主机都应该在结果中 if hosts: all_hosts = [hosts[0]] + [h for h in hosts[1:] if h != hosts[0]] expected_allowed = [h for h in all_hosts if blocked_keyword not in h] else: expected_allowed = [] assert set(result) == set(expected_allowed) class TestDatabaseTargetProviderUnit: """DatabaseTargetProvider 单元测试类""" def test_target_id_in_context(self): """测试 target_id 正确设置到上下文中""" provider = DatabaseTargetProvider(target_id=123) assert provider.target_id == 123 assert provider.context.target_id == 123 def test_context_propagation(self): """测试上下文传递""" ctx = ProviderContext(scan_id=789) provider = DatabaseTargetProvider(target_id=123, context=ctx) assert provider.target_id == 123 # target_id 被覆盖 assert provider.scan_id == 789 def test_blacklist_filter_lazy_loading(self): """测试黑名单过滤器延迟加载""" provider = DatabaseTargetProvider(target_id=123) # 初始时 _blacklist_filter 为 None assert provider._blacklist_filter is None # 模拟 BlacklistService with patch('apps.common.services.BlacklistService') as mock_service, \ patch('apps.common.utils.BlacklistFilter') as mock_filter_class: mock_service.return_value.get_rules.return_value = [] mock_filter_instance = MagicMock() mock_filter_class.return_value = mock_filter_instance # 第一次调用 result1 = provider.get_blacklist_filter() assert result1 == mock_filter_instance # 第二次调用应该返回缓存的实例 result2 = provider.get_blacklist_filter() assert result2 == mock_filter_instance # BlacklistService 只应该被调用一次 mock_service.return_value.get_rules.assert_called_once_with(123) def test_nonexistent_target_returns_empty(self): """测试不存在的 target 返回空迭代器""" provider = DatabaseTargetProvider(target_id=99999) with patch('apps.targets.services.TargetService') as mock_service, \ patch('apps.common.services.BlacklistService') as mock_blacklist_service: mock_service.return_value.get_target.return_value = None mock_blacklist_service.return_value.get_rules.return_value = [] result = list(provider.iter_hosts()) assert result == [] ================================================ FILE: backend/apps/scan/providers/tests/test_list_provider.py ================================================ """ ListTargetProvider 属性测试 Property 1: ListTargetProvider Round-Trip *For any* 主机列表和 URL 列表,创建 ListTargetProvider 后迭代 iter_hosts() 和 iter_urls() 应该返回与输入相同的元素(顺序相同)。 **Validates: Requirements 3.1, 3.2** """ import pytest from hypothesis import given, strategies as st, settings, assume from apps.scan.providers.list_provider import ListTargetProvider from apps.scan.providers.base import ProviderContext # 生成有效域名的策略 def valid_domain_strategy(): """生成有效的域名""" # 生成简单的域名格式: subdomain.domain.tld label = st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=2, max_size=10 ) return st.builds( lambda a, b, c: f"{a}.{b}.{c}", label, label, st.sampled_from(['com', 'net', 'org', 'io']) ) # 生成有效 IP 地址的策略 def valid_ip_strategy(): """生成有效的 IPv4 地址""" octet = st.integers(min_value=1, max_value=254) return st.builds( lambda a, b, c, d: f"{a}.{b}.{c}.{d}", octet, octet, octet, octet ) # 组合策略:域名或 IP host_strategy = st.one_of(valid_domain_strategy(), valid_ip_strategy()) # 生成有效 URL 的策略 def valid_url_strategy(): """生成有效的 URL""" domain = valid_domain_strategy() return st.builds( lambda d, path: f"https://{d}/{path}" if path else f"https://{d}", domain, st.one_of( st.just(""), st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=1, max_size=10 ) ) ) url_strategy = valid_url_strategy() class TestListTargetProviderProperties: """ListTargetProvider 属性测试类""" @given(hosts=st.lists(host_strategy, max_size=50)) @settings(max_examples=100) def test_property_1_hosts_round_trip(self, hosts): """ Property 1: ListTargetProvider Round-Trip (hosts) Feature: scan-target-provider, Property 1: ListTargetProvider Round-Trip **Validates: Requirements 3.1, 3.2** For any host list, creating a ListTargetProvider and iterating iter_hosts() should return the same elements in the same order. """ # ListTargetProvider 使用 targets 参数,自动分类为 hosts/urls provider = ListTargetProvider(targets=hosts) result = list(provider.iter_hosts()) assert result == hosts @given(urls=st.lists(url_strategy, max_size=50)) @settings(max_examples=100) def test_property_1_urls_round_trip(self, urls): """ Property 1: ListTargetProvider Round-Trip (urls) Feature: scan-target-provider, Property 1: ListTargetProvider Round-Trip **Validates: Requirements 3.1, 3.2** For any URL list, creating a ListTargetProvider and iterating iter_urls() should return the same elements in the same order. """ # ListTargetProvider 使用 targets 参数,自动分类为 hosts/urls provider = ListTargetProvider(targets=urls) result = list(provider.iter_urls()) assert result == urls @given( hosts=st.lists(host_strategy, max_size=30), urls=st.lists(url_strategy, max_size=30) ) @settings(max_examples=100) def test_property_1_combined_round_trip(self, hosts, urls): """ Property 1: ListTargetProvider Round-Trip (combined) Feature: scan-target-provider, Property 1: ListTargetProvider Round-Trip **Validates: Requirements 3.1, 3.2** For any combination of hosts and URLs, both should round-trip correctly. """ # 合并 hosts 和 urls,ListTargetProvider 会自动分类 combined = hosts + urls provider = ListTargetProvider(targets=combined) hosts_result = list(provider.iter_hosts()) urls_result = list(provider.iter_urls()) assert hosts_result == hosts assert urls_result == urls class TestListTargetProviderUnit: """ListTargetProvider 单元测试类""" def test_empty_lists(self): """测试空列表返回空迭代器 - Requirements 3.5""" provider = ListTargetProvider() assert list(provider.iter_hosts()) == [] assert list(provider.iter_urls()) == [] def test_blacklist_filter_returns_none(self): """测试黑名单过滤器返回 None - Requirements 3.4""" provider = ListTargetProvider(targets=["example.com"]) assert provider.get_blacklist_filter() is None def test_target_id_association(self): """测试 target_id 关联 - Requirements 3.3""" ctx = ProviderContext(target_id=123) provider = ListTargetProvider(targets=["example.com"], context=ctx) assert provider.target_id == 123 def test_context_propagation(self): """测试上下文传递""" ctx = ProviderContext(target_id=456, scan_id=789) provider = ListTargetProvider(targets=["example.com"], context=ctx) assert provider.target_id == 456 assert provider.scan_id == 789 ================================================ FILE: backend/apps/scan/providers/tests/test_pipeline_provider.py ================================================ """ PipelineTargetProvider 属性测试 Property 3: PipelineTargetProvider Round-Trip *For any* StageOutput 对象,PipelineTargetProvider 的 iter_hosts() 和 iter_urls() 应该返回与 StageOutput 中 hosts 和 urls 列表相同的元素。 **Validates: Requirements 5.1, 5.2** """ import pytest from hypothesis import given, strategies as st, settings from apps.scan.providers.pipeline_provider import PipelineTargetProvider, StageOutput from apps.scan.providers.base import ProviderContext # 生成有效域名的策略 def valid_domain_strategy(): """生成有效的域名""" label = st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=2, max_size=10 ) return st.builds( lambda a, b, c: f"{a}.{b}.{c}", label, label, st.sampled_from(['com', 'net', 'org', 'io']) ) # 生成有效 IP 地址的策略 def valid_ip_strategy(): """生成有效的 IPv4 地址""" octet = st.integers(min_value=1, max_value=254) return st.builds( lambda a, b, c, d: f"{a}.{b}.{c}.{d}", octet, octet, octet, octet ) # 组合策略:域名或 IP host_strategy = st.one_of(valid_domain_strategy(), valid_ip_strategy()) # 生成有效 URL 的策略 def valid_url_strategy(): """生成有效的 URL""" domain = valid_domain_strategy() return st.builds( lambda d, path: f"https://{d}/{path}" if path else f"https://{d}", domain, st.one_of( st.just(""), st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=1, max_size=10 ) ) ) url_strategy = valid_url_strategy() class TestPipelineTargetProviderProperties: """PipelineTargetProvider 属性测试类""" @given(hosts=st.lists(host_strategy, max_size=50)) @settings(max_examples=100) def test_property_3_hosts_round_trip(self, hosts): """ Property 3: PipelineTargetProvider Round-Trip (hosts) Feature: scan-target-provider, Property 3: PipelineTargetProvider Round-Trip **Validates: Requirements 5.1, 5.2** For any StageOutput with hosts, PipelineTargetProvider should return the same hosts in the same order. """ stage_output = StageOutput(hosts=hosts) provider = PipelineTargetProvider(previous_output=stage_output) result = list(provider.iter_hosts()) assert result == hosts @given(urls=st.lists(url_strategy, max_size=50)) @settings(max_examples=100) def test_property_3_urls_round_trip(self, urls): """ Property 3: PipelineTargetProvider Round-Trip (urls) Feature: scan-target-provider, Property 3: PipelineTargetProvider Round-Trip **Validates: Requirements 5.1, 5.2** For any StageOutput with urls, PipelineTargetProvider should return the same urls in the same order. """ stage_output = StageOutput(urls=urls) provider = PipelineTargetProvider(previous_output=stage_output) result = list(provider.iter_urls()) assert result == urls @given( hosts=st.lists(host_strategy, max_size=30), urls=st.lists(url_strategy, max_size=30) ) @settings(max_examples=100) def test_property_3_combined_round_trip(self, hosts, urls): """ Property 3: PipelineTargetProvider Round-Trip (combined) Feature: scan-target-provider, Property 3: PipelineTargetProvider Round-Trip **Validates: Requirements 5.1, 5.2** For any StageOutput with both hosts and urls, both should round-trip correctly. """ stage_output = StageOutput(hosts=hosts, urls=urls) provider = PipelineTargetProvider(previous_output=stage_output) hosts_result = list(provider.iter_hosts()) urls_result = list(provider.iter_urls()) assert hosts_result == hosts assert urls_result == urls class TestPipelineTargetProviderUnit: """PipelineTargetProvider 单元测试类""" def test_empty_stage_output(self): """测试空 StageOutput 返回空迭代器 - Requirements 5.5""" stage_output = StageOutput() provider = PipelineTargetProvider(previous_output=stage_output) assert list(provider.iter_hosts()) == [] assert list(provider.iter_urls()) == [] def test_blacklist_filter_returns_none(self): """测试黑名单过滤器返回 None - Requirements 5.3""" stage_output = StageOutput(hosts=["example.com"]) provider = PipelineTargetProvider(previous_output=stage_output) assert provider.get_blacklist_filter() is None def test_target_id_association(self): """测试 target_id 关联 - Requirements 5.4""" stage_output = StageOutput(hosts=["example.com"]) provider = PipelineTargetProvider(previous_output=stage_output, target_id=123) assert provider.target_id == 123 def test_context_propagation(self): """测试上下文传递""" ctx = ProviderContext(target_id=456, scan_id=789) stage_output = StageOutput(hosts=["example.com"]) provider = PipelineTargetProvider(previous_output=stage_output, context=ctx) assert provider.target_id == 456 assert provider.scan_id == 789 def test_previous_output_property(self): """测试 previous_output 属性""" stage_output = StageOutput(hosts=["example.com"], urls=["https://example.com"]) provider = PipelineTargetProvider(previous_output=stage_output) assert provider.previous_output is stage_output assert provider.previous_output.hosts == ["example.com"] assert provider.previous_output.urls == ["https://example.com"] def test_stage_output_with_metadata(self): """测试带元数据的 StageOutput""" stage_output = StageOutput( hosts=["example.com"], urls=["https://example.com"], new_targets=["new.example.com"], stats={"count": 1}, success=True, error=None ) provider = PipelineTargetProvider(previous_output=stage_output) assert list(provider.iter_hosts()) == ["example.com"] assert list(provider.iter_urls()) == ["https://example.com"] assert provider.previous_output.new_targets == ["new.example.com"] assert provider.previous_output.stats == {"count": 1} ================================================ FILE: backend/apps/scan/providers/tests/test_snapshot_provider.py ================================================ """ SnapshotTargetProvider 单元测试 """ import pytest from unittest.mock import Mock, patch from apps.scan.providers import SnapshotTargetProvider, ProviderContext class TestSnapshotTargetProvider: """SnapshotTargetProvider 测试类""" def test_init_with_scan_id_and_type(self): """测试初始化""" provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain" ) assert provider.scan_id == 100 assert provider.snapshot_type == "subdomain" assert provider.target_id is None # 默认 context def test_init_with_context(self): """测试带 context 初始化""" ctx = ProviderContext(target_id=1, scan_id=100) provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain", context=ctx ) assert provider.scan_id == 100 assert provider.target_id == 1 assert provider.snapshot_type == "subdomain" @patch('apps.asset.services.snapshot.SubdomainSnapshotsService') def test_iter_hosts_subdomain(self, mock_service_class): """测试从子域名快照迭代主机""" # Mock service mock_service = Mock() mock_service.iter_subdomain_names_by_scan.return_value = iter([ "a.example.com", "b.example.com" ]) mock_service_class.return_value = mock_service # 创建 provider provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain" ) # 迭代主机 hosts = list(provider.iter_hosts()) assert hosts == ["a.example.com", "b.example.com"] mock_service.iter_subdomain_names_by_scan.assert_called_once_with( scan_id=100, chunk_size=1000 ) @patch('apps.asset.services.snapshot.HostPortMappingSnapshotsService') def test_iter_hosts_host_port(self, mock_service_class): """测试从主机端口映射快照迭代主机""" # Mock queryset mock_mapping1 = Mock() mock_mapping1.host = "example.com" mock_mapping1.port = 80 mock_mapping2 = Mock() mock_mapping2.host = "example.com" mock_mapping2.port = 443 mock_queryset = Mock() mock_queryset.iterator.return_value = iter([mock_mapping1, mock_mapping2]) # Mock service mock_service = Mock() mock_service.get_by_scan.return_value = mock_queryset mock_service_class.return_value = mock_service # 创建 provider provider = SnapshotTargetProvider( scan_id=100, snapshot_type="host_port" ) # 迭代主机 hosts = list(provider.iter_hosts()) assert hosts == ["example.com:80", "example.com:443"] mock_service.get_by_scan.assert_called_once_with(scan_id=100) @patch('apps.asset.services.snapshot.WebsiteSnapshotsService') def test_iter_urls_website(self, mock_service_class): """测试从网站快照迭代 URL""" # Mock service mock_service = Mock() mock_service.iter_website_urls_by_scan.return_value = iter([ "http://example.com", "https://example.com" ]) mock_service_class.return_value = mock_service # 创建 provider provider = SnapshotTargetProvider( scan_id=100, snapshot_type="website" ) # 迭代 URL urls = list(provider.iter_urls()) assert urls == ["http://example.com", "https://example.com"] mock_service.iter_website_urls_by_scan.assert_called_once_with( scan_id=100, chunk_size=1000 ) @patch('apps.asset.services.snapshot.EndpointSnapshotsService') def test_iter_urls_endpoint(self, mock_service_class): """测试从端点快照迭代 URL""" # Mock queryset mock_endpoint1 = Mock() mock_endpoint1.url = "http://example.com/api/v1" mock_endpoint2 = Mock() mock_endpoint2.url = "http://example.com/api/v2" mock_queryset = Mock() mock_queryset.iterator.return_value = iter([mock_endpoint1, mock_endpoint2]) # Mock service mock_service = Mock() mock_service.get_by_scan.return_value = mock_queryset mock_service_class.return_value = mock_service # 创建 provider provider = SnapshotTargetProvider( scan_id=100, snapshot_type="endpoint" ) # 迭代 URL urls = list(provider.iter_urls()) assert urls == ["http://example.com/api/v1", "http://example.com/api/v2"] mock_service.get_by_scan.assert_called_once_with(scan_id=100) def test_iter_hosts_unsupported_type(self): """测试不支持的快照类型(iter_hosts)""" provider = SnapshotTargetProvider( scan_id=100, snapshot_type="website" # website 不支持 iter_hosts ) hosts = list(provider.iter_hosts()) assert hosts == [] def test_iter_urls_unsupported_type(self): """测试不支持的快照类型(iter_urls)""" provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain" # subdomain 不支持 iter_urls ) urls = list(provider.iter_urls()) assert urls == [] def test_get_blacklist_filter(self): """测试黑名单过滤器(快照模式不使用黑名单)""" provider = SnapshotTargetProvider( scan_id=100, snapshot_type="subdomain" ) assert provider.get_blacklist_filter() is None def test_context_propagation(self): """测试上下文传递""" ctx = ProviderContext(target_id=456, scan_id=789) provider = SnapshotTargetProvider( scan_id=100, # 会被 context 覆盖 snapshot_type="subdomain", context=ctx ) assert provider.target_id == 456 assert provider.scan_id == 100 # scan_id 在 __init__ 中被设置 ================================================ FILE: backend/apps/scan/repositories/__init__.py ================================================ """ Scan Repositories 模块 提供 Scan 模型的数据访问层实现 其他模型的 Repository 应从各自的 app 导入 """ # Django ORM 实现 from .django_scan_repository import DjangoScanRepository from .scheduled_scan_repository import DjangoScheduledScanRepository, ScheduledScanDTO # 为了向后兼容,保留 ScanRepository 别名 ScanRepository = DjangoScanRepository __all__ = [ # 实现类 'DjangoScanRepository', 'DjangoScheduledScanRepository', 'ScheduledScanDTO', # 向后兼容别名 'ScanRepository', ] ================================================ FILE: backend/apps/scan/repositories/django_scan_repository.py ================================================ """ Scan 数据访问层 Django ORM 实现 基于 Django ORM 的 Scan Repository 实现类 """ from __future__ import annotations import logging from typing import List, Tuple, Dict from datetime import datetime from django.db import transaction, DatabaseError from django.db.models import QuerySet, F, Value, Func, Count from django.utils import timezone from apps.scan.models import Scan from apps.targets.models import Target from apps.common.definitions import ScanStatus from apps.common.decorators import auto_ensure_db_connection logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoScanRepository: """基于 Django ORM 的 Scan 数据访问层实现""" # ==================== 基础 CRUD 操作 ==================== def get_by_id(self, scan_id: int, prefetch_relations: bool = False, for_update: bool = False ) -> Scan | None: """ 根据 ID 获取扫描任务 Args: scan_id: 扫描任务 ID prefetch_relations: 是否预加载关联对象(target, worker) 默认 False,只在需要展示关联信息时设为 True for_update: 是否加锁(用于更新场景) Returns: Scan 对象或 None """ try: # 根据是否需要更新来决定是否加锁 if for_update: queryset = Scan.objects.select_for_update() # type: ignore # pylint: disable=no-member else: queryset = Scan.objects # type: ignore # pylint: disable=no-member # 预加载关联对象(性能优化:默认不加载) if prefetch_relations: queryset = queryset.select_related('target', 'worker') return queryset.get(id=scan_id) except Scan.DoesNotExist: # type: ignore # pylint: disable=no-member logger.warning("Scan 不存在 - Scan ID: %s", scan_id) return None def get_by_id_for_update(self, scan_id: int) -> Scan | None: """ 根据 ID 获取扫描任务(加锁) 用于需要更新的场景,避免并发冲突。 不预加载关联对象,保持查询最小化,提高加锁性能。 Args: scan_id: 扫描任务 ID Returns: Scan 对象或 None Note: - 使用默认的阻塞模式(等待锁释放) - 不包含关联对象(target, worker),如需关联对象请使用 get_by_id() """ try: return Scan.objects.select_for_update().get(id=scan_id) # type: ignore # pylint: disable=no-member except Scan.DoesNotExist: # type: ignore # pylint: disable=no-member logger.warning("Scan 不存在 - Scan ID: %s", scan_id) return None def exists(self, scan_id: int) -> bool: """ 检查扫描任务是否存在 Args: scan_id: 扫描任务 ID Returns: 是否存在 """ return Scan.objects.filter(id=scan_id).exists() def create(self, target: Target, engine_ids: List[int], engine_names: List[str], yaml_configuration: str, results_dir: str, status: ScanStatus = ScanStatus.INITIATED ) -> Scan: """ 创建扫描任务 Args: target: 扫描目标 engine_ids: 引擎 ID 列表 engine_names: 引擎名称列表 yaml_configuration: YAML 格式的扫描配置 results_dir: 结果目录 status: 初始状态 Returns: 创建的 Scan 对象 """ scan = Scan( target=target, engine_ids=engine_ids, engine_names=engine_names, yaml_configuration=yaml_configuration, results_dir=results_dir, status=status, container_ids=[] ) scan.save() logger.debug("创建 Scan - ID: %s, Target: %s", scan.id, target.name) return scan def bulk_create(self, scans: List[Scan]) -> List[Scan]: """ 批量创建扫描任务 Args: scans: Scan 对象列表 Returns: 创建的 Scan 对象列表 """ created_scans = Scan.objects.bulk_create(scans) # type: ignore # pylint: disable=no-member logger.debug("批量创建 Scan - 数量: %d", len(created_scans)) return created_scans def soft_delete_by_ids(self, scan_ids: List[int]) -> int: """ 根据 ID 列表批量软删除 Scan Args: scan_ids: Scan ID 列表 Returns: 软删除的记录数 """ try: updated_count = ( Scan.objects .filter(id__in=scan_ids) .update(deleted_at=timezone.now()) ) logger.debug( "批量软删除 Scan 成功 - Count: %s, 更新记录: %s", len(scan_ids), updated_count ) return updated_count except Exception as e: logger.error( "批量软删除 Scan 失败 - IDs: %s, 错误: %s", scan_ids, e ) raise def hard_delete_by_ids(self, scan_ids: List[int]) -> Tuple[int, Dict[str, int]]: """ 根据 ID 列表硬删除 Scan(使用数据库级 CASCADE) Args: scan_ids: Scan ID 列表 Returns: (删除的记录数, 删除详情字典) """ try: batch_size = 1000 total_deleted = 0 logger.debug(f"开始批量删除 {len(scan_ids)} 个 Scan(数据库 CASCADE)...") for i in range(0, len(scan_ids), batch_size): batch_ids = scan_ids[i:i + batch_size] count, _ = Scan.all_objects.filter(id__in=batch_ids).delete() total_deleted += count logger.debug(f"批次删除完成: {len(batch_ids)} 个 Scan,删除 {count} 条记录") deleted_details = { 'scans': len(scan_ids), 'total': total_deleted, 'note': 'Database CASCADE - detailed stats unavailable' } logger.debug( "批量硬删除成功(CASCADE)- Scan数: %s, 总删除记录: %s", len(scan_ids), total_deleted ) return total_deleted, deleted_details except Exception as e: logger.error( "批量硬删除失败(CASCADE)- Scan数: %s, 错误: %s", len(scan_ids), str(e), exc_info=True ) raise # ==================== 查询操作 ==================== def get_all(self, prefetch_relations: bool = True) -> QuerySet[Scan]: """ 获取所有扫描任务 Args: prefetch_relations: 是否预加载关联对象(target, worker) Returns: Scan QuerySet """ queryset = Scan.objects.all() # type: ignore # pylint: disable=no-member if prefetch_relations: queryset = queryset.select_related('target', 'worker') return queryset.order_by('-created_at') def get_statistics(self) -> dict: """ 获取扫描任务统计数据 Returns: 统计数据字典 Note: 使用缓存字段聚合,性能优异 """ from django.db.models import Sum # 基础统计 total_scans = Scan.objects.count() # type: ignore # pylint: disable=no-member # 按状态统计 running_scans = Scan.objects.filter(status='running').count() # type: ignore # pylint: disable=no-member completed_scans = Scan.objects.filter(status='completed').count() # type: ignore # pylint: disable=no-member failed_scans = Scan.objects.filter(status='failed').count() # type: ignore # pylint: disable=no-member # 使用缓存字段聚合统计(只统计已完成的扫描) aggregated = Scan.objects.filter(status='completed').aggregate( # type: ignore # pylint: disable=no-member total_vulns=Sum('cached_vulns_total'), total_subdomains=Sum('cached_subdomains_count'), total_endpoints=Sum('cached_endpoints_count'), total_websites=Sum('cached_websites_count'), total_ips=Sum('cached_ips_count'), ) total_vulns = aggregated['total_vulns'] or 0 total_subdomains = aggregated['total_subdomains'] or 0 total_endpoints = aggregated['total_endpoints'] or 0 total_websites = aggregated['total_websites'] or 0 total_ips = aggregated['total_ips'] or 0 return { 'total': total_scans, 'running': running_scans, 'completed': completed_scans, 'failed': failed_scans, 'total_vulns': total_vulns, 'total_subdomains': total_subdomains, 'total_endpoints': total_endpoints, 'total_websites': total_websites, 'total_ips': total_ips, 'total_assets': total_subdomains + total_endpoints + total_websites + total_ips, } # ==================== 状态更新操作 ==================== @transaction.atomic def update_status(self, scan_id: int, status: ScanStatus, error_message: str | None = None, stopped_at: datetime | None = None ) -> bool: """ 更新扫描任务状态 Args: scan_id: 扫描任务 ID status: 新状态 error_message: 错误消息(可选) stopped_at: 结束时间(可选,由调用方决定是否传递) Returns: 是否更新成功 Note: Repository 层不判断业务状态,只负责数据更新 created_at 是自动设置的,不需要手动传递 """ scan = self.get_by_id_for_update(scan_id) if not scan: return False scan.status = status if error_message: if len(error_message) > 2000: scan.error_message = error_message[:1980] + "... (已截断)" logger.warning( "错误信息过长(%d 字符),已截断 - Scan ID: %s", len(error_message), scan_id ) else: scan.error_message = error_message # 根据传递的参数更新时间戳(由调用方决定) if stopped_at is not None: scan.stopped_at = stopped_at scan.save() logger.debug( "更新 Scan 状态 - ID: %s, 状态: %s", scan_id, ScanStatus(status).label ) return True def append_container_id(self, scan_id: int, container_id: str) -> bool: """ 追加容器 ID 到 container_ids 数组(并发安全) 使用 PostgreSQL 的 array_append 函数在数据库层面进行原子操作, 避免并发场景下的 Race Condition。 Args: scan_id: 扫描任务 ID container_id: Docker 容器 ID Returns: 是否追加成功 Note: - 使用 F 表达式和 ArrayAppend 确保并发安全 - 生成的 SQL: UPDATE scan SET container_ids = array_append(container_ids, ?) """ try: container_field = Scan._meta.get_field('container_ids') updated_count = Scan.objects.filter(id=scan_id).update( # type: ignore container_ids=Func( F('container_ids'), Value(container_id), function='ARRAY_APPEND', output_field=container_field ) ) if updated_count > 0: logger.debug("追加容器 ID - Scan ID: %s, Container ID: %s", scan_id, container_id) return True else: logger.warning("Scan 不存在,无法追加容器 ID - Scan ID: %s", scan_id) return False except DatabaseError as e: logger.error("追加容器 ID 失败 - Scan ID: %s, 错误: %s", scan_id, e) return False def update_worker(self, scan_id: int, worker_id: int) -> bool: """ 更新扫描任务的 Worker ID Args: scan_id: 扫描任务 ID worker_id: Worker 节点 ID Returns: 是否更新成功 """ try: updated_count = Scan.objects.filter(id=scan_id).update(worker_id=worker_id) # type: ignore if updated_count > 0: logger.debug("更新 Worker ID - Scan ID: %s, Worker ID: %s", scan_id, worker_id) return True else: logger.warning("Scan 不存在,无法更新 Worker ID - Scan ID: %s", scan_id) return False except DatabaseError as e: logger.error("更新 Worker ID 失败 - Scan ID: %s, 错误: %s", scan_id, e) return False def update_cached_stats(self, scan_id: int) -> dict | None: """ 更新扫描任务的缓存统计数据 使用 Django ORM 聚合查询,避免原生 SQL,保持数据库抽象 Args: scan_id: 扫描任务 ID Returns: 成功返回统计数据字典,失败返回 None """ try: from apps.asset.models import VulnerabilitySnapshot scan = self.get_by_id(scan_id, prefetch_relations=False) if not scan: logger.error("Scan 不存在,无法更新缓存统计数据 - Scan ID: %s", scan_id) return None # 统计快照数据(用于扫描历史) # IP 数量需要按 IP 去重统计 ips_count = scan.host_port_mapping_snapshots.values('ip').distinct().count() # 漏洞统计:按扫描维度基于 VulnerabilitySnapshot 聚合 vuln_qs = VulnerabilitySnapshot.objects.filter(scan_id=scan_id) total_vulns = vuln_qs.count() severity_stats = { 'critical': 0, 'high': 0, 'medium': 0, 'low': 0, } for row in vuln_qs.values('severity').annotate(count=Count('id')): sev = (row.get('severity') or '').lower() count = row.get('count') or 0 if sev in severity_stats: severity_stats[sev] = count stats = { 'subdomains': scan.subdomain_snapshots.count(), 'websites': scan.website_snapshots.count(), 'endpoints': scan.endpoint_snapshots.count(), 'ips': ips_count, 'directories': scan.directory_snapshots.count(), 'screenshots': scan.screenshot_snapshots.count(), 'vulns_total': total_vulns, 'vulns_critical': severity_stats['critical'], 'vulns_high': severity_stats['high'], 'vulns_medium': severity_stats['medium'], 'vulns_low': severity_stats['low'], } # 批量更新字段(使用 cached_ 前缀的字段名) cached_stats = { 'cached_subdomains_count': stats['subdomains'], 'cached_websites_count': stats['websites'], 'cached_endpoints_count': stats['endpoints'], 'cached_ips_count': stats['ips'], 'cached_directories_count': stats['directories'], 'cached_screenshots_count': stats['screenshots'], 'cached_vulns_total': stats['vulns_total'], 'cached_vulns_critical': stats['vulns_critical'], 'cached_vulns_high': stats['vulns_high'], 'cached_vulns_medium': stats['vulns_medium'], 'cached_vulns_low': stats['vulns_low'], 'stats_updated_at': timezone.now() } for field, value in cached_stats.items(): setattr(scan, field, value) scan.save(update_fields=list(cached_stats.keys())) logger.debug("更新缓存统计数据成功 - Scan ID: %s", scan_id) return stats except DatabaseError as e: logger.exception("数据库错误:更新缓存统计数据失败 - Scan ID: %s", scan_id) return None except Exception as e: logger.error("更新缓存统计数据失败 - Scan ID: %s, 错误: %s", scan_id, e) return None def update_status_if_match(self, scan_id: int, current_status: ScanStatus, new_status: ScanStatus, stopped_at: datetime | None = None ) -> bool: """ 条件更新扫描状态(原子操作) 仅当扫描状态匹配 current_status 时才更新为 new_status。 这是一个原子操作,用于处理并发场景下的状态更新。 Args: scan_id: 扫描ID current_status: 当前期望的状态 new_status: 要更新到的新状态 stopped_at: 停止时间(可选) Returns: bool: 是否更新成功(True=更新了记录,False=未更新) """ try: update_fields = { 'status': new_status, } if stopped_at: update_fields['stopped_at'] = stopped_at # 原子操作:只有状态匹配时才更新 updated = Scan.objects.filter( id=scan_id, status=current_status ).update(**update_fields) if updated > 0: logger.debug( "条件更新扫描状态成功 - Scan ID: %s, %s → %s", scan_id, current_status.value, new_status.value ) return True else: logger.debug( "条件更新扫描状态跳过(状态不匹配) - Scan ID: %s, 期望: %s, 目标: %s", scan_id, current_status.value, new_status.value ) return False except Exception as e: logger.error( "条件更新扫描状态失败 - Scan ID: %s, %s → %s, 错误: %s", scan_id, current_status.value, new_status.value, e ) return False def update_progress( self, scan_id: int, progress: int | None = None, current_stage: str | None = None, stage_progress: dict | None = None ) -> bool: """ 更新扫描进度信息 Args: scan_id: 扫描任务 ID progress: 进度百分比 0-100(可选) current_stage: 当前阶段(可选) stage_progress: 各阶段详情(可选) Returns: 是否更新成功 """ try: update_fields = {} if progress is not None: update_fields['progress'] = progress if current_stage is not None: update_fields['current_stage'] = current_stage if stage_progress is not None: update_fields['stage_progress'] = stage_progress if not update_fields: return True # 无需更新 updated = Scan.objects.filter(id=scan_id).update(**update_fields) if updated > 0: logger.debug( "更新扫描进度 - Scan ID: %s, progress: %s, stage: %s", scan_id, progress, current_stage ) return True else: logger.warning("Scan 不存在,无法更新进度 - Scan ID: %s", scan_id) return False except Exception as e: logger.error( "更新扫描进度失败 - Scan ID: %s, 错误: %s", scan_id, e ) return False # 导出接口 __all__ = ['DjangoScanRepository'] ================================================ FILE: backend/apps/scan/repositories/scheduled_scan_repository.py ================================================ """ 定时扫描任务 Repository 数据访问层:负责 ScheduledScan 模型的 CRUD 操作 """ import logging from typing import List, Optional, Tuple, Dict from dataclasses import dataclass from datetime import datetime from django.db import transaction from django.utils import timezone from apps.common.decorators import auto_ensure_db_connection from apps.scan.models import ScheduledScan logger = logging.getLogger(__name__) @dataclass class ScheduledScanDTO: """定时扫描 DTO 扫描模式(二选一): - 组织扫描:设置 organization_id,执行时动态获取组织下所有目标 - 目标扫描:设置 target_id,扫描单个目标 - organization_id 优先级高于 target_id """ id: Optional[int] = None name: str = '' engine_ids: List[int] = None # 多引擎支持 engine_names: List[str] = None # 引擎名称列表 yaml_configuration: str = '' # YAML 格式的扫描配置 organization_id: Optional[int] = None # 组织扫描模式 target_id: Optional[int] = None # 目标扫描模式 cron_expression: Optional[str] = None is_enabled: bool = True run_count: int = 0 last_run_time: Optional[datetime] = None next_run_time: Optional[datetime] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None def __post_init__(self): if self.engine_ids is None: self.engine_ids = [] if self.engine_names is None: self.engine_names = [] @auto_ensure_db_connection class DjangoScheduledScanRepository: """ 定时扫描任务 Repository 职责: - CRUD 操作 - 查询封装 - 不包含业务逻辑 """ def get_by_id(self, scheduled_scan_id: int) -> Optional[ScheduledScan]: """根据 ID 查询定时扫描任务""" try: return ScheduledScan.objects.select_related('organization', 'target').get(id=scheduled_scan_id) except ScheduledScan.DoesNotExist: return None def get_queryset(self): """ 获取所有定时扫描任务的查询集 Returns: QuerySet """ return ScheduledScan.objects.select_related('organization', 'target').order_by('-created_at') def get_all(self, page: int = 1, page_size: int = 10) -> Tuple[List[ScheduledScan], int]: """ 分页查询所有定时扫描任务 Returns: (定时扫描列表, 总数) """ queryset = self.get_queryset() total = queryset.count() offset = (page - 1) * page_size scheduled_scans = list(queryset[offset:offset + page_size]) return scheduled_scans, total def get_enabled(self) -> List[ScheduledScan]: """获取所有启用的定时扫描任务""" return list( ScheduledScan.objects.select_related('target') .filter(is_enabled=True) .order_by('-created_at') ) def create(self, dto: ScheduledScanDTO) -> ScheduledScan: """ 创建定时扫描任务 Args: dto: 定时扫描 DTO Returns: 创建的 ScheduledScan 对象 """ with transaction.atomic(): scheduled_scan = ScheduledScan.objects.create( name=dto.name, engine_ids=dto.engine_ids, engine_names=dto.engine_names, yaml_configuration=dto.yaml_configuration, organization_id=dto.organization_id, # 组织扫描模式 target_id=dto.target_id if not dto.organization_id else None, # 目标扫描模式 cron_expression=dto.cron_expression, is_enabled=dto.is_enabled, ) scan_mode = "organization" if dto.organization_id else "target" logger.info("创建定时扫描任务 - ID: %s, Name: %s, Mode: %s", scheduled_scan.id, scheduled_scan.name, scan_mode) return scheduled_scan def update(self, scheduled_scan_id: int, dto: ScheduledScanDTO) -> Optional[ScheduledScan]: """ 更新定时扫描任务 Args: scheduled_scan_id: 定时扫描 ID dto: 更新的数据 Returns: 更新后的 ScheduledScan 对象,不存在返回 None """ try: with transaction.atomic(): scheduled_scan = ScheduledScan.objects.select_for_update().get(id=scheduled_scan_id) # 更新基本字段 if dto.name: scheduled_scan.name = dto.name if dto.engine_ids is not None: scheduled_scan.engine_ids = dto.engine_ids if dto.engine_names is not None: scheduled_scan.engine_names = dto.engine_names if dto.yaml_configuration is not None: scheduled_scan.yaml_configuration = dto.yaml_configuration if dto.cron_expression is not None: scheduled_scan.cron_expression = dto.cron_expression if dto.is_enabled is not None: scheduled_scan.is_enabled = dto.is_enabled if dto.next_run_time is not None: scheduled_scan.next_run_time = dto.next_run_time # 切换扫描模式 if dto.organization_id is not None: # 切换到组织扫描模式 scheduled_scan.organization_id = dto.organization_id scheduled_scan.target_id = None # 清空目标 elif dto.target_id is not None: # 切换到目标扫描模式 scheduled_scan.organization_id = None # 清空组织 scheduled_scan.target_id = dto.target_id scheduled_scan.save() scan_mode = "organization" if scheduled_scan.organization_id else "target" logger.info("更新定时扫描任务 - ID: %s, Mode: %s", scheduled_scan_id, scan_mode) return scheduled_scan except ScheduledScan.DoesNotExist: logger.warning("定时扫描任务不存在 - ID: %s", scheduled_scan_id) return None def update_next_run_time(self, scheduled_scan_id: int, next_run_time: datetime) -> bool: """更新下次执行时间""" updated = ScheduledScan.objects.filter(id=scheduled_scan_id).update( next_run_time=next_run_time ) return updated > 0 def increment_run_count(self, scheduled_scan_id: int) -> bool: """增加执行次数并更新上次执行时间""" from django.db.models import F updated = ScheduledScan.objects.filter(id=scheduled_scan_id).update( run_count=F('run_count') + 1, last_run_time=timezone.now() ) return updated > 0 def toggle_enabled(self, scheduled_scan_id: int, enabled: bool) -> bool: """切换启用状态""" updated = ScheduledScan.objects.filter(id=scheduled_scan_id).update( is_enabled=enabled ) return updated > 0 def hard_delete(self, scheduled_scan_id: int) -> bool: """删除定时扫描任务""" deleted, _ = ScheduledScan.objects.filter(id=scheduled_scan_id).delete() if deleted > 0: logger.info("硬删除定时扫描任务 - ID: %s", scheduled_scan_id) return deleted > 0 ================================================ FILE: backend/apps/scan/scripts/__init__.py ================================================ ================================================ FILE: backend/apps/scan/scripts/run_cleanup.py ================================================ #!/usr/bin/env python """ 清理任务脚本 用于动态容器执行清理任务,目前支持: - results: 清理过期的扫描结果目录 如需添加其他清理任务,添加对应的 cleanup_xxx() 函数即可。 注意:此脚本只做文件清理,不需要 Django 环境。 """ import argparse import shutil import logging from datetime import datetime, timedelta from pathlib import Path logging.basicConfig( level=logging.INFO, format='[%(asctime)s] [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) logger = logging.getLogger(__name__) def cleanup_results(results_dir: str, retention_days: int) -> dict: """ 清理过期的扫描结果目录 Args: results_dir: 扫描结果根目录 retention_days: 保留天数 Returns: 清理统计信息 """ results_path = Path(results_dir) if not results_path.exists(): logger.warning(f"扫描结果目录不存在: {results_dir}") return {'deleted': 0, 'failed': 0, 'skipped': 0} cutoff_date = datetime.now() - timedelta(days=retention_days) stats = {'deleted': 0, 'failed': 0, 'skipped': 0, 'freed_bytes': 0} logger.info(f"开始清理扫描结果 - 目录: {results_dir}, 保留天数: {retention_days}") logger.info(f"清理截止时间: {cutoff_date}") for item in results_path.iterdir(): if not item.is_dir(): continue # 只处理 scan_ 开头的目录 if not item.name.startswith('scan_'): stats['skipped'] += 1 continue try: # 获取目录修改时间 mtime = datetime.fromtimestamp(item.stat().st_mtime) if mtime < cutoff_date: # 计算目录大小 dir_size = sum(f.stat().st_size for f in item.rglob('*') if f.is_file()) # 删除目录 shutil.rmtree(item) stats['deleted'] += 1 stats['freed_bytes'] += dir_size logger.info(f" 已删除: {item.name} (修改时间: {mtime}, 大小: {dir_size / 1024 / 1024:.2f} MB)") else: stats['skipped'] += 1 except Exception as e: logger.error(f" 删除失败: {item.name} - {e}") stats['failed'] += 1 logger.info(f"清理完成 - 删除: {stats['deleted']}, 失败: {stats['failed']}, 跳过: {stats['skipped']}") logger.info(f"释放空间: {stats['freed_bytes'] / 1024 / 1024:.2f} MB") return stats def main(): parser = argparse.ArgumentParser(description="清理任务") parser.add_argument("--results_dir", type=str, default="/opt/xingrin/results", help="扫描结果目录") parser.add_argument("--retention_days", type=int, default=7, help="保留天数") args = parser.parse_args() stats = cleanup_results(args.results_dir, args.retention_days) print(f"清理完成: {stats}") if __name__ == "__main__": main() ================================================ FILE: backend/apps/scan/scripts/run_delete_scans.py ================================================ #!/usr/bin/env python """ 扫描硬删除脚本 用于动态容器执行,硬删除已软删除的扫描及其关联数据。 """ import sys import argparse import json import logging from apps.common.container_bootstrap import fetch_config_and_setup_django logging.basicConfig( level=logging.INFO, format='[%(asctime)s] [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) logger = logging.getLogger(__name__) def hard_delete_scans(scan_ids: list[int]) -> dict: """ 硬删除扫描 Args: scan_ids: 扫描 ID 列表 Returns: 删除统计信息 """ from apps.scan.services import ScanService service = ScanService() try: deleted_count, details = service.hard_delete_scans(scan_ids) logger.info(f"✓ 硬删除完成 - 删除数量: {deleted_count}") logger.info(f" 详情: {details}") return { 'success': True, 'deleted_count': deleted_count, 'details': details, } except Exception as e: logger.error(f"硬删除失败: {e}", exc_info=True) return { 'success': False, 'error': str(e), } def main(): parser = argparse.ArgumentParser(description="硬删除扫描") parser.add_argument("--scan_ids", type=str, required=True, help="扫描 ID 列表 (JSON)") args = parser.parse_args() # 解析 scan_ids scan_ids = json.loads(args.scan_ids) logger.info(f"开始硬删除 {len(scan_ids)} 个扫描") # 获取配置并初始化 Django fetch_config_and_setup_django() # 执行删除 result = hard_delete_scans(scan_ids) print(f"删除完成: {result}") if not result.get('success'): sys.exit(1) if __name__ == "__main__": main() ================================================ FILE: backend/apps/scan/scripts/run_initiate_scan.py ================================================ #!/usr/bin/env python """ 扫描任务启动脚本 用于动态扫描容器启动时执行。 必须在 Django 导入之前获取配置并设置环境变量。 """ import argparse import sys import os import traceback def diagnose_prefect_environment(): """诊断 Prefect 运行环境,输出详细信息用于排查问题""" print("\n" + "="*60) print("Prefect 环境诊断") print("="*60) # 1. 检查 Prefect 相关环境变量 print("\n[诊断] Prefect 环境变量:") prefect_vars = [ 'PREFECT_HOME', 'PREFECT_API_URL', 'PREFECT_SERVER_EPHEMERAL_ENABLED', 'PREFECT_SERVER_EPHEMERAL_STARTUP_TIMEOUT_SECONDS', 'PREFECT_SERVER_DATABASE_CONNECTION_URL', 'PREFECT_LOGGING_LEVEL', 'PREFECT_DEBUG_MODE', ] for var in prefect_vars: value = os.environ.get(var, 'NOT SET') print(f" {var}={value}") # 2. 检查 PREFECT_HOME 目录 prefect_home = os.environ.get('PREFECT_HOME', os.path.expanduser('~/.prefect')) print(f"\n[诊断] PREFECT_HOME 目录: {prefect_home}") if os.path.exists(prefect_home): print(f" ✓ 目录存在") print(f" 可写: {os.access(prefect_home, os.W_OK)}") try: files = os.listdir(prefect_home) print(f" 文件列表: {files[:10]}{'...' if len(files) > 10 else ''}") except Exception as e: print(f" ✗ 无法列出文件: {e}") else: print(f" 目录不存在,尝试创建...") try: os.makedirs(prefect_home, exist_ok=True) print(f" ✓ 创建成功") except Exception as e: print(f" ✗ 创建失败: {e}") # 3. 检查 uvicorn 是否可用 print(f"\n[诊断] uvicorn 可用性:") import shutil uvicorn_path = shutil.which('uvicorn') if uvicorn_path: print(f" ✓ uvicorn 路径: {uvicorn_path}") else: print(f" ✗ uvicorn 不在 PATH 中") print(f" PATH: {os.environ.get('PATH', 'NOT SET')}") # 4. 检查 Prefect 版本 print(f"\n[诊断] Prefect 版本:") try: import prefect print(f" ✓ prefect=={prefect.__version__}") except Exception as e: print(f" ✗ 无法导入 prefect: {e}") # 5. 检查 SQLite 支持 print(f"\n[诊断] SQLite 支持:") try: import sqlite3 print(f" ✓ sqlite3 版本: {sqlite3.sqlite_version}") # 测试创建数据库 test_db = os.path.join(prefect_home, 'test.db') conn = sqlite3.connect(test_db) conn.execute('CREATE TABLE IF NOT EXISTS test (id INTEGER)') conn.close() os.remove(test_db) print(f" ✓ SQLite 读写测试通过") except Exception as e: print(f" ✗ SQLite 测试失败: {e}") # 6. 检查端口绑定能力 print(f"\n[诊断] 端口绑定测试:") try: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', 0)) port = sock.getsockname()[1] sock.close() print(f" ✓ 可以绑定 127.0.0.1 端口 (测试端口: {port})") except Exception as e: print(f" ✗ 端口绑定失败: {e}") # 7. 检查内存情况 print(f"\n[诊断] 系统资源:") try: import psutil mem = psutil.virtual_memory() print(f" 内存总量: {mem.total / 1024 / 1024:.0f} MB") print(f" 可用内存: {mem.available / 1024 / 1024:.0f} MB") print(f" 内存使用率: {mem.percent}%") except ImportError: print(f" psutil 未安装,跳过内存检查") except Exception as e: print(f" ✗ 资源检查失败: {e}") print("\n" + "="*60) print("诊断完成") print("="*60 + "\n") def main(): print("="*60) print("run_initiate_scan.py 启动") print(f" Python: {sys.version}") print(f" CWD: {os.getcwd()}") print(f" SERVER_URL: {os.environ.get('SERVER_URL', 'NOT SET')}") print("="*60) # 1. 从配置中心获取配置并初始化 Django(必须在 Django 导入之前) print("[1/4] 从配置中心获取配置...") try: from apps.common.container_bootstrap import fetch_config_and_setup_django fetch_config_and_setup_django() print("[1/4] ✓ 配置获取成功") except Exception as e: print(f"[1/4] ✗ 配置获取失败: {e}") traceback.print_exc() sys.exit(1) # 2. 解析命令行参数 print("[2/4] 解析命令行参数...") parser = argparse.ArgumentParser(description="执行扫描初始化 Flow") parser.add_argument("--scan_id", type=int, required=True, help="扫描任务 ID") parser.add_argument("--target_name", type=str, required=True, help="目标名称") parser.add_argument("--target_id", type=int, required=True, help="目标 ID") parser.add_argument("--scan_workspace_dir", type=str, required=True, help="扫描工作目录") parser.add_argument("--engine_name", type=str, required=True, help="引擎名称") parser.add_argument("--scheduled_scan_name", type=str, default=None, help="定时扫描任务名称(可选)") args = parser.parse_args() print(f"[2/4] ✓ 参数解析成功:") print(f" scan_id: {args.scan_id}") print(f" target_name: {args.target_name}") print(f" target_id: {args.target_id}") print(f" scan_workspace_dir: {args.scan_workspace_dir}") print(f" engine_name: {args.engine_name}") print(f" scheduled_scan_name: {args.scheduled_scan_name}") # 2.5. 运行 Prefect 环境诊断(仅在 DEBUG 模式下) if os.environ.get('DEBUG', '').lower() == 'true': diagnose_prefect_environment() # 3. 现在可以安全导入 Django 相关模块 print("[3/4] 导入 initiate_scan_flow...") try: from apps.scan.flows.initiate_scan_flow import initiate_scan_flow print("[3/4] ✓ 导入成功") except Exception as e: print(f"[3/4] ✗ 导入失败: {e}") traceback.print_exc() sys.exit(1) # 4. 执行 Flow print("[4/4] 执行 initiate_scan_flow...") try: result = initiate_scan_flow( scan_id=args.scan_id, target_name=args.target_name, target_id=args.target_id, scan_workspace_dir=args.scan_workspace_dir, engine_name=args.engine_name, scheduled_scan_name=args.scheduled_scan_name, ) print("[4/4] ✓ Flow 执行完成") print(f"结果: {result}") except Exception as e: print(f"[4/4] ✗ Flow 执行失败: {e}") traceback.print_exc() sys.exit(1) if __name__ == "__main__": main() ================================================ FILE: backend/apps/scan/scripts/run_scheduled_scan.py ================================================ ================================================ FILE: backend/apps/scan/serializers/__init__.py ================================================ """Scan Serializers - 统一导出""" from .mixins import ScanConfigValidationMixin from .scan_serializers import ( ScanSerializer, ScanHistorySerializer, QuickScanSerializer, InitiateScanSerializer, ) from .scan_log_serializers import ScanLogSerializer from .scheduled_scan_serializers import ( ScheduledScanSerializer, CreateScheduledScanSerializer, UpdateScheduledScanSerializer, ToggleScheduledScanSerializer, ) from .subfinder_provider_settings_serializers import SubfinderProviderSettingsSerializer # 兼容旧名称 ProviderSettingsSerializer = SubfinderProviderSettingsSerializer __all__ = [ # Mixins 'ScanConfigValidationMixin', # Scan 'ScanSerializer', 'ScanHistorySerializer', 'QuickScanSerializer', 'InitiateScanSerializer', # ScanLog 'ScanLogSerializer', # Scheduled Scan 'ScheduledScanSerializer', 'CreateScheduledScanSerializer', 'UpdateScheduledScanSerializer', 'ToggleScheduledScanSerializer', # Subfinder Provider Settings 'SubfinderProviderSettingsSerializer', 'ProviderSettingsSerializer', # 兼容旧名称 ] ================================================ FILE: backend/apps/scan/serializers/mixins.py ================================================ """序列化器通用 Mixin 和工具类""" from rest_framework import serializers import yaml class DuplicateKeyLoader(yaml.SafeLoader): """自定义 YAML Loader,检测重复 key""" pass def _check_duplicate_keys(loader, node, deep=False): """检测 YAML mapping 中的重复 key""" mapping = {} for key_node, value_node in node.value: key = loader.construct_object(key_node, deep=deep) if key in mapping: raise yaml.constructor.ConstructorError( "while constructing a mapping", node.start_mark, f"发现重复的配置项 '{key}',后面的配置会覆盖前面的配置,请删除重复项", key_node.start_mark ) mapping[key] = loader.construct_object(value_node, deep=deep) return mapping DuplicateKeyLoader.add_constructor( yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, _check_duplicate_keys ) class ScanConfigValidationMixin: """扫描配置验证 Mixin""" def validate_configuration(self, value): """验证 YAML 配置格式""" if not value or not value.strip(): raise serializers.ValidationError("configuration 不能为空") try: yaml.load(value, Loader=DuplicateKeyLoader) except yaml.YAMLError as e: raise serializers.ValidationError(f"无效的 YAML 格式: {str(e)}") return value def validate_engine_ids(self, value): """验证引擎 ID 列表""" if not value: raise serializers.ValidationError("engine_ids 不能为空,请至少选择一个扫描引擎") return value def validate_engine_names(self, value): """验证引擎名称列表""" if not value: raise serializers.ValidationError("engine_names 不能为空") return value ================================================ FILE: backend/apps/scan/serializers/scan_log_serializers.py ================================================ """扫描日志序列化器""" from rest_framework import serializers from ..models import ScanLog class ScanLogSerializer(serializers.ModelSerializer): """扫描日志序列化器""" class Meta: model = ScanLog fields = ['id', 'level', 'content', 'created_at'] ================================================ FILE: backend/apps/scan/serializers/scan_serializers.py ================================================ """扫描任务序列化器""" from rest_framework import serializers from ..models import Scan from .mixins import ScanConfigValidationMixin class ScanSerializer(serializers.ModelSerializer): """扫描任务序列化器""" target_name = serializers.SerializerMethodField() class Meta: model = Scan fields = [ 'id', 'target', 'target_name', 'engine_ids', 'engine_names', 'created_at', 'stopped_at', 'status', 'results_dir', 'container_ids', 'error_message' ] read_only_fields = [ 'id', 'created_at', 'stopped_at', 'results_dir', 'container_ids', 'error_message', 'status' ] def get_target_name(self, obj): return obj.target.name if obj.target else None class ScanHistorySerializer(serializers.ModelSerializer): """扫描历史列表序列化器""" target_name = serializers.CharField(source='target.name', read_only=True) worker_name = serializers.CharField(source='worker.name', read_only=True, allow_null=True) summary = serializers.SerializerMethodField() progress = serializers.IntegerField(read_only=True) current_stage = serializers.CharField(read_only=True) stage_progress = serializers.JSONField(read_only=True) class Meta: model = Scan fields = [ 'id', 'target', 'target_name', 'engine_ids', 'engine_names', 'worker_name', 'created_at', 'status', 'error_message', 'summary', 'progress', 'current_stage', 'stage_progress', 'yaml_configuration' ] def get_summary(self, obj): summary = { 'subdomains': obj.cached_subdomains_count or 0, 'websites': obj.cached_websites_count or 0, 'endpoints': obj.cached_endpoints_count or 0, 'ips': obj.cached_ips_count or 0, 'directories': obj.cached_directories_count or 0, 'screenshots': obj.cached_screenshots_count or 0, } summary['vulnerabilities'] = { 'total': obj.cached_vulns_total or 0, 'critical': obj.cached_vulns_critical or 0, 'high': obj.cached_vulns_high or 0, 'medium': obj.cached_vulns_medium or 0, 'low': obj.cached_vulns_low or 0, } return summary class QuickScanSerializer(ScanConfigValidationMixin, serializers.Serializer): """快速扫描序列化器""" MAX_BATCH_SIZE = 5000 targets = serializers.ListField( child=serializers.DictField(), help_text='目标列表,每个目标包含 name 字段' ) configuration = serializers.CharField(required=True, help_text='YAML 格式的扫描配置') engine_ids = serializers.ListField(child=serializers.IntegerField(), required=True) engine_names = serializers.ListField(child=serializers.CharField(), required=True) def validate_targets(self, value): if not value: raise serializers.ValidationError("目标列表不能为空") if len(value) > self.MAX_BATCH_SIZE: raise serializers.ValidationError( f"快速扫描最多支持 {self.MAX_BATCH_SIZE} 个目标,当前提交了 {len(value)} 个" ) for idx, target in enumerate(value): if 'name' not in target: raise serializers.ValidationError(f"第 {idx + 1} 个目标缺少 name 字段") if not target['name']: raise serializers.ValidationError(f"第 {idx + 1} 个目标的 name 不能为空") return value class InitiateScanSerializer(ScanConfigValidationMixin, serializers.Serializer): """发起扫描任务序列化器""" configuration = serializers.CharField(required=True, help_text='YAML 格式的扫描配置') engine_ids = serializers.ListField(child=serializers.IntegerField(), required=True) engine_names = serializers.ListField(child=serializers.CharField(), required=True) organization_id = serializers.IntegerField(required=False, allow_null=True) target_id = serializers.IntegerField(required=False, allow_null=True) def validate(self, data): organization_id = data.get('organization_id') target_id = data.get('target_id') if not organization_id and not target_id: raise serializers.ValidationError('必须提供 organization_id 或 target_id 其中之一') if organization_id and target_id: raise serializers.ValidationError('organization_id 和 target_id 只能提供其中之一') return data ================================================ FILE: backend/apps/scan/serializers/scheduled_scan_serializers.py ================================================ """定时扫描序列化器""" from rest_framework import serializers from ..models import ScheduledScan from .mixins import ScanConfigValidationMixin class ScheduledScanSerializer(serializers.ModelSerializer): """定时扫描任务序列化器(用于列表和详情)""" organization_id = serializers.IntegerField(source='organization.id', read_only=True, allow_null=True) organization_name = serializers.CharField(source='organization.name', read_only=True, allow_null=True) target_id = serializers.IntegerField(source='target.id', read_only=True, allow_null=True) target_name = serializers.CharField(source='target.name', read_only=True, allow_null=True) scan_mode = serializers.SerializerMethodField() class Meta: model = ScheduledScan fields = [ 'id', 'name', 'engine_ids', 'engine_names', 'organization_id', 'organization_name', 'target_id', 'target_name', 'scan_mode', 'cron_expression', 'is_enabled', 'run_count', 'last_run_time', 'next_run_time', 'created_at', 'updated_at' ] read_only_fields = [ 'id', 'run_count', 'last_run_time', 'next_run_time', 'created_at', 'updated_at' ] def get_scan_mode(self, obj): return 'organization' if obj.organization_id else 'target' class CreateScheduledScanSerializer(ScanConfigValidationMixin, serializers.Serializer): """创建定时扫描任务序列化器""" name = serializers.CharField(max_length=200, help_text='任务名称') configuration = serializers.CharField(required=True, help_text='YAML 格式的扫描配置') engine_ids = serializers.ListField(child=serializers.IntegerField(), required=True) engine_names = serializers.ListField(child=serializers.CharField(), required=True) organization_id = serializers.IntegerField(required=False, allow_null=True) target_id = serializers.IntegerField(required=False, allow_null=True) cron_expression = serializers.CharField(max_length=100, default='0 2 * * *') is_enabled = serializers.BooleanField(default=True) def validate(self, data): organization_id = data.get('organization_id') target_id = data.get('target_id') if not organization_id and not target_id: raise serializers.ValidationError('必须提供 organization_id 或 target_id 其中之一') if organization_id and target_id: raise serializers.ValidationError('organization_id 和 target_id 只能提供其中之一') return data class UpdateScheduledScanSerializer(serializers.Serializer): """更新定时扫描任务序列化器""" name = serializers.CharField(max_length=200, required=False) engine_ids = serializers.ListField(child=serializers.IntegerField(), required=False) organization_id = serializers.IntegerField(required=False, allow_null=True) target_id = serializers.IntegerField(required=False, allow_null=True) cron_expression = serializers.CharField(max_length=100, required=False) is_enabled = serializers.BooleanField(required=False) def validate_engine_ids(self, value): if value is not None and not value: raise serializers.ValidationError("engine_ids 不能为空") return value class ToggleScheduledScanSerializer(serializers.Serializer): """切换定时扫描启用状态序列化器""" is_enabled = serializers.BooleanField(help_text='是否启用') ================================================ FILE: backend/apps/scan/serializers/subfinder_provider_settings_serializers.py ================================================ """Subfinder Provider 配置序列化器""" from rest_framework import serializers class SubfinderProviderSettingsSerializer(serializers.Serializer): """Subfinder Provider 配置序列化器 支持的 Provider: - fofa: email + api_key (composite) - censys: api_id + api_secret (composite) - hunter, shodan, zoomeye, securitytrails, threatbook, quake: api_key (single) 注意:djangorestframework-camel-case 会自动处理 camelCase <-> snake_case 转换 所以这里统一使用 snake_case """ VALID_PROVIDERS = { 'fofa', 'hunter', 'shodan', 'censys', 'zoomeye', 'securitytrails', 'threatbook', 'quake' } def to_internal_value(self, data): """验证并转换输入数据""" if not isinstance(data, dict): raise serializers.ValidationError('Expected a dictionary') result = {} for provider, config in data.items(): if provider not in self.VALID_PROVIDERS: continue if not isinstance(config, dict): continue db_config = {'enabled': bool(config.get('enabled', False))} if provider == 'fofa': db_config['email'] = str(config.get('email', '')) db_config['api_key'] = str(config.get('api_key', '')) elif provider == 'censys': db_config['api_id'] = str(config.get('api_id', '')) db_config['api_secret'] = str(config.get('api_secret', '')) else: db_config['api_key'] = str(config.get('api_key', '')) result[provider] = db_config return result def to_representation(self, instance): """输出数据(数据库格式,camel-case 中间件会自动转换)""" if isinstance(instance, dict): return instance return instance.providers if hasattr(instance, 'providers') else {} ================================================ FILE: backend/apps/scan/services/__init__.py ================================================ """ 扫描服务模块 提供各种扫描任务的服务功能 架构: - ScanService: 主服务(协调者) - ScanCreationService: 创建服务 - ScanStateService: 状态管理服务 - ScanControlService: 控制服务 - ScanStatsService: 统计服务 """ from .scan_service import ScanService from .scan_creation_service import ScanCreationService from .scan_state_service import ScanStateService from .scan_control_service import ScanControlService from .scan_stats_service import ScanStatsService from .scheduled_scan_service import ScheduledScanService from .target_export_service import ( TargetExportService, create_export_service, export_urls_with_fallback, DataSource, ) __all__ = [ 'ScanService', # 主入口(向后兼容) 'ScanCreationService', 'ScanStateService', 'ScanControlService', 'ScanStatsService', 'ScheduledScanService', 'TargetExportService', # 目标导出服务 'create_export_service', 'export_urls_with_fallback', 'DataSource', ] ================================================ FILE: backend/apps/scan/services/quick_scan_service.py ================================================ """ 快速扫描服务 负责解析用户输入(URL、域名、IP、CIDR)并创建对应的资产数据 """ import logging from dataclasses import dataclass from typing import Optional, Literal, List, Dict, Any from urllib.parse import urlparse from django.db import transaction from apps.common.validators import validate_url, detect_input_type, validate_domain, validate_ip, validate_cidr, is_valid_ip from apps.targets.services.target_service import TargetService from apps.targets.models import Target from apps.asset.dtos import WebSiteDTO from apps.asset.dtos.asset import EndpointDTO from apps.asset.repositories.asset.website_repository import DjangoWebSiteRepository from apps.asset.repositories.asset.endpoint_repository import DjangoEndpointRepository logger = logging.getLogger(__name__) @dataclass class ParsedInputDTO: """ 解析输入 DTO 只在快速扫描流程中使用 """ original_input: str input_type: Literal['url', 'domain', 'ip', 'cidr'] target_name: str # host/domain/ip/cidr target_type: Literal['domain', 'ip', 'cidr'] website_url: Optional[str] = None # 根 URL(scheme://host[:port]) endpoint_url: Optional[str] = None # 完整 URL(含路径) is_valid: bool = True error: Optional[str] = None line_number: Optional[int] = None class QuickScanService: """快速扫描服务 - 解析输入并创建资产""" def __init__(self): self.target_service = TargetService() self.website_repo = DjangoWebSiteRepository() self.endpoint_repo = DjangoEndpointRepository() def parse_inputs(self, inputs: List[str]) -> List[ParsedInputDTO]: """ 解析多行输入 Args: inputs: 输入字符串列表(每行一个) Returns: 解析结果列表(跳过空行) """ results = [] for line_number, input_str in enumerate(inputs, start=1): input_str = input_str.strip() # 空行跳过 if not input_str: continue try: # 检测输入类型 input_type = detect_input_type(input_str) if input_type == 'url': dto = self._parse_url_input(input_str, line_number) else: dto = self._parse_target_input(input_str, input_type, line_number) results.append(dto) except ValueError as e: # 解析失败,记录错误 results.append(ParsedInputDTO( original_input=input_str, input_type='domain', # 默认类型 target_name=input_str, target_type='domain', is_valid=False, error=str(e), line_number=line_number )) return results def _parse_url_input(self, url_str: str, line_number: int) -> ParsedInputDTO: """ 解析 URL 输入 Args: url_str: URL 字符串 line_number: 行号 Returns: ParsedInputDTO """ # 验证 URL 格式 validate_url(url_str) # 使用标准库解析 parsed = urlparse(url_str) host = parsed.hostname # 不含端口 has_path = parsed.path and parsed.path != '/' # 构建 root_url: scheme://host[:port] root_url = f"{parsed.scheme}://{parsed.netloc}" # 检测 host 类型(domain 或 ip) target_type = 'ip' if is_valid_ip(host) else 'domain' return ParsedInputDTO( original_input=url_str, input_type='url', target_name=host, target_type=target_type, website_url=root_url, endpoint_url=url_str if has_path else None, line_number=line_number ) def _parse_target_input( self, input_str: str, input_type: str, line_number: int ) -> ParsedInputDTO: """ 解析非 URL 输入(domain/ip/cidr) Args: input_str: 输入字符串 input_type: 输入类型 line_number: 行号 Returns: ParsedInputDTO """ # 验证格式 if input_type == 'domain': validate_domain(input_str) target_type = 'domain' elif input_type == 'ip': validate_ip(input_str) target_type = 'ip' elif input_type == 'cidr': validate_cidr(input_str) target_type = 'cidr' else: raise ValueError(f"未知的输入类型: {input_type}") return ParsedInputDTO( original_input=input_str, input_type=input_type, target_name=input_str, target_type=target_type, website_url=None, endpoint_url=None, line_number=line_number ) @transaction.atomic def process_quick_scan( self, inputs: List[str], engine_id: int ) -> Dict[str, Any]: """ 处理快速扫描请求 Args: inputs: 输入字符串列表 engine_id: 扫描引擎 ID Returns: 处理结果字典 """ # 1. 解析输入 parsed_inputs = self.parse_inputs(inputs) # 分离有效和无效输入 valid_inputs = [p for p in parsed_inputs if p.is_valid] invalid_inputs = [p for p in parsed_inputs if not p.is_valid] if not valid_inputs: return { 'targets': [], 'target_stats': {'created': 0, 'reused': 0, 'failed': len(invalid_inputs)}, 'asset_stats': {'websites_created': 0, 'endpoints_created': 0}, 'errors': [ {'line_number': p.line_number, 'input': p.original_input, 'error': p.error} for p in invalid_inputs ] } # 2. 创建资产 asset_result = self.create_assets_from_parsed_inputs(valid_inputs) # 3. 返回结果 return { 'targets': asset_result['targets'], 'target_stats': asset_result['target_stats'], 'asset_stats': asset_result['asset_stats'], 'errors': [ {'line_number': p.line_number, 'input': p.original_input, 'error': p.error} for p in invalid_inputs ] } def create_assets_from_parsed_inputs( self, parsed_inputs: List[ParsedInputDTO] ) -> Dict[str, Any]: """ 从解析结果创建资产 Args: parsed_inputs: 解析结果列表(只包含有效输入) Returns: 创建结果字典 """ # 1. 收集所有 target 数据(内存操作,去重) targets_data = {} for dto in parsed_inputs: if dto.target_name not in targets_data: targets_data[dto.target_name] = {'name': dto.target_name, 'type': dto.target_type} targets_list = list(targets_data.values()) # 2. 批量创建 Target(复用现有方法) target_result = self.target_service.batch_create_targets(targets_list) # 3. 查询刚创建的 Target,建立 name → id 映射 target_names = [d['name'] for d in targets_list] targets = Target.objects.filter(name__in=target_names) target_id_map = {t.name: t.id for t in targets} # 4. 收集 Website DTO(内存操作,去重) website_dtos = [] seen_websites = set() for dto in parsed_inputs: if dto.website_url and dto.website_url not in seen_websites: seen_websites.add(dto.website_url) target_id = target_id_map.get(dto.target_name) if target_id: website_dtos.append(WebSiteDTO( target_id=target_id, url=dto.website_url, host=dto.target_name )) # 5. 批量创建 Website(存在即跳过) websites_created = 0 if website_dtos: websites_created = self.website_repo.bulk_create_ignore_conflicts(website_dtos) # 6. 收集 Endpoint DTO(内存操作,去重) endpoint_dtos = [] seen_endpoints = set() for dto in parsed_inputs: if dto.endpoint_url and dto.endpoint_url not in seen_endpoints: seen_endpoints.add(dto.endpoint_url) target_id = target_id_map.get(dto.target_name) if target_id: endpoint_dtos.append(EndpointDTO( target_id=target_id, url=dto.endpoint_url, host=dto.target_name )) # 7. 批量创建 Endpoint(存在即跳过) endpoints_created = 0 if endpoint_dtos: endpoints_created = self.endpoint_repo.bulk_create_ignore_conflicts(endpoint_dtos) return { 'targets': list(targets), 'target_stats': { 'created': target_result['created_count'], 'reused': 0, # bulk_create 无法区分新建和复用 'failed': target_result['failed_count'] }, 'asset_stats': { 'websites_created': websites_created, 'endpoints_created': endpoints_created } } ================================================ FILE: backend/apps/scan/services/scan_control_service.py ================================================ """ 扫描控制服务 职责: - 停止扫描(docker kill 强制杀死) - 删除扫描(两阶段删除) """ import logging import threading from typing import Dict, List from django.db import transaction, connection from django.db.utils import DatabaseError, OperationalError from django.core.exceptions import ObjectDoesNotExist from django.utils import timezone from apps.common.definitions import ScanStatus from apps.scan.repositories import DjangoScanRepository logger = logging.getLogger(__name__) class ScanControlService: """ 扫描控制服务 职责: - 停止扫描(取消 Flow Run) - 删除扫描(两阶段删除) - 批量操作 """ def __init__(self): """ 初始化服务 """ self.scan_repo = DjangoScanRepository() def _stop_containers( self, container_ids: List[str], worker_id: int, ) -> int: """ 在指定 Worker 上停止 Docker 容器 Args: container_ids: 容器 ID 列表 worker_id: Worker 节点 ID Returns: 成功停止的数量 """ if not container_ids: return 0 from apps.engine.models import WorkerNode try: worker = WorkerNode.objects.get(id=worker_id) except WorkerNode.DoesNotExist: logger.error(f"Worker 不存在: {worker_id}") return 0 # 构建 docker kill 命令(强制杀死,避免进程不响应 SIGTERM) container_ids_str = ' '.join(container_ids) docker_cmd = f"docker kill {container_ids_str} 2>/dev/null || true" stopped_count = 0 if worker.is_local: # 本地执行 import subprocess try: result = subprocess.run( docker_cmd, shell=True, capture_output=True, text=True, timeout=30 ) # 统计成功停止的容器数(输出的每一行是一个成功停止的容器 ID) if result.stdout: stopped_count = len(result.stdout.strip().split('\n')) logger.info(f"本地 docker kill 完成: {stopped_count}/{len(container_ids)}") except Exception as e: logger.error(f"本地 docker kill 失败: {e}") else: # 远程通过 SSH 执行 import paramiko ssh = None try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect( hostname=worker.ip_address, port=worker.ssh_port, username=worker.username, password=worker.password if worker.password else None, timeout=10, ) stdin, stdout, stderr = ssh.exec_command(docker_cmd, timeout=30) output = stdout.read().decode().strip() if output: stopped_count = len(output.split('\n')) logger.info(f"SSH docker kill 完成 - Worker: {worker.name}, 数量: {stopped_count}/{len(container_ids)}") except Exception as e: logger.error(f"SSH docker kill 失败 - Worker: {worker.name}: {e}") finally: if ssh: ssh.close() return stopped_count def delete_scans_two_phase(self, scan_ids: List[int]) -> dict: """ 两阶段删除扫描任务 流程: 1. 软删除:立即更新 deleted_at 字段(同步,快速) 2. 后台异步:停止容器 + 分发硬删除任务(不阻塞 API) Args: scan_ids: 扫描任务 ID 列表 Returns: 删除结果统计 """ # 1. 获取要删除的 Scan 信息 scans = list(self.scan_repo.get_all(prefetch_relations=False).filter(id__in=scan_ids)) if not scans: raise ValueError("未找到要删除的 Scan") scan_names = [f"Scan #{s.id}" for s in scans] existing_ids = [s.id for s in scans] # 2. 收集需要停止的容器信息(同步收集,异步执行) containers_by_worker: Dict[int, List[str]] = {} for scan in scans: if scan.status in [ScanStatus.RUNNING, ScanStatus.INITIATED]: if scan.container_ids and scan.worker_id: if scan.worker_id not in containers_by_worker: containers_by_worker[scan.worker_id] = [] containers_by_worker[scan.worker_id].extend(scan.container_ids) # 3. 第一阶段:软删除(同步,快速) soft_count = self.scan_repo.soft_delete_by_ids(existing_ids) logger.info(f"✓ 软删除完成: {soft_count} 个 Scan") # 4. 第二阶段:后台异步执行停止容器 + 硬删除(不阻塞 API) thread = threading.Thread( target=self._async_cleanup_and_hard_delete, args=(existing_ids, containers_by_worker), daemon=True, ) thread.start() return { 'soft_deleted_count': soft_count, 'scan_names': scan_names, 'hard_delete_scheduled': True, } def _async_cleanup_and_hard_delete( self, scan_ids: List[int], containers_by_worker: Dict[int, List[str]] ): """ 后台线程:停止容器 + 分发硬删除任务 """ # 后台线程需要新的数据库连接 connection.close() # 1. 停止容器 if containers_by_worker: total_containers = sum(len(c) for c in containers_by_worker.values()) logger.info(f"🛑 后台停止容器 - Worker 数量: {len(containers_by_worker)}, 容器数量: {total_containers}") stopped_count = 0 for worker_id, container_ids in containers_by_worker.items(): try: count = self._stop_containers(container_ids, worker_id) stopped_count += count except Exception as e: logger.warning(f"停止容器时出错 - Worker ID {worker_id}: {e}") logger.info(f"✓ 已停止 {stopped_count}/{total_containers} 个容器") # 2. 分发硬删除任务 try: from apps.engine.services.task_distributor import get_task_distributor distributor = get_task_distributor() success, message, container_id = distributor.execute_delete_task( task_type='scans', ids=scan_ids ) if success: logger.info(f"✓ 硬删除任务已分发 - Container: {container_id}") else: logger.warning(f"硬删除任务分发失败: {message}") except Exception as e: logger.error(f"❌ 分发删除任务失败: {e}", exc_info=True) def stop_scan(self, scan_id: int) -> tuple[bool, int]: """ 主动停止扫描任务(用户发起) 工作流程: 1. 验证扫描状态(只能停止 RUNNING/INITIATED) 2. 通过 docker kill 强制终止容器 3. 立即更新状态为 CANCELLED(终态) Args: scan_id: 扫描任务 ID Returns: (是否成功, 停止的容器数量) 并发安全: 使用数据库行锁(select_for_update)防止并发修改, 避免用户重复点击导致的重复操作 """ try: # 1. 在事务内获取扫描对象、检查状态、更新状态(加锁,防止并发) with transaction.atomic(): # 使用 select_for_update() 加行锁,防止并发修改 scan = self.scan_repo.get_by_id_for_update(scan_id) if not scan: logger.error("Scan 不存在 - Scan ID: %s", scan_id) return False, 0 # 2. 验证状态(只能停止 RUNNING/INITIATED) if scan.status not in [ScanStatus.RUNNING, ScanStatus.INITIATED]: logger.warning( "无法停止扫描:当前状态为 %s - Scan ID: %s", ScanStatus(scan.status).label, scan_id ) return False, 0 # 3. 获取容器 ID 列表和 Worker ID(在锁内读取,确保数据一致性) container_ids = scan.container_ids or [] worker_id = scan.worker_id # 4. 立即更新状态为 CANCELLED(终态) scan.status = ScanStatus.CANCELLED scan.stopped_at = timezone.now() scan.error_message = "用户手动取消扫描" scan.save(update_fields=['status', 'stopped_at', 'error_message']) logger.info("✓ 已更新状态为 CANCELLED(事务内)- Scan ID: %s", scan_id) # 5. 更新阶段进度:running → cancelled, pending → cancelled from apps.scan.services.scan_state_service import ScanStateService state_service = ScanStateService() state_service.cancel_running_stages(scan_id, final_status="cancelled") # 事务结束,锁释放 # 后续耗时操作在事务外执行,避免长时间持有锁 # 6. 停止 Docker 容器(通过 SSH/本地执行 docker stop) stopped_count = 0 if container_ids and worker_id: try: stopped_count = self._stop_containers(container_ids, worker_id) logger.info( "✓ 已停止 %d/%d 个容器 - Scan ID: %s", stopped_count, len(container_ids), scan_id ) except Exception as e: logger.error("停止容器失败: %s", e) # 容器停止失败不影响取消结果,状态已经更新为 CANCELLED elif not worker_id: logger.warning("无 Worker 信息,跳过容器停止 - Scan ID: %s", scan_id) else: logger.info("无关联容器需要停止 - Scan ID: %s", scan_id) return True, stopped_count except (DatabaseError, OperationalError) as e: logger.exception("数据库错误:停止扫描失败 - Scan ID: %s", scan_id) raise except ObjectDoesNotExist: logger.error("Scan 不存在 - Scan ID: %s", scan_id) return False, 0 # 导出接口 __all__ = ['ScanControlService'] ================================================ FILE: backend/apps/scan/services/scan_creation_service.py ================================================ """ 扫描创建服务 职责: - 准备扫描参数 - 创建 Scan 记录 - 通过负载感知分发器在最优 Worker 上执行任务(支持本地和远程) """ import uuid import logging import threading from typing import List, Tuple from datetime import datetime from pathlib import Path from django.conf import settings from django.db import transaction, connection from django.db.utils import DatabaseError, IntegrityError, OperationalError from django.core.exceptions import ValidationError, ObjectDoesNotExist from apps.scan.models import Scan from apps.scan.repositories import DjangoScanRepository from apps.scan.utils.config_merger import merge_engine_configs, ConfigConflictError from apps.targets.repositories import DjangoTargetRepository, DjangoOrganizationRepository from apps.engine.repositories import DjangoEngineRepository from apps.targets.models import Target from apps.engine.models import ScanEngine from apps.common.definitions import ScanStatus from apps.engine.services.task_distributor import get_task_distributor logger = logging.getLogger(__name__) class ScanCreationService: """ 扫描创建服务 职责: - 准备扫描参数 - 创建 Scan 记录 - 通过负载感知分发器在最优 Worker 上执行任务 - 处理创建过程中的错误 """ def __init__(self): """ 初始化服务 Note: 移除了依赖注入,因为: 1. 项目没有单元测试需求 2. 不会更换数据库实现 3. 所有调用都是直接实例化 4. 减少不必要的复杂度 """ self.scan_repo = DjangoScanRepository() self.target_repo = DjangoTargetRepository() self.organization_repo = DjangoOrganizationRepository() self.engine_repo = DjangoEngineRepository() def prepare_initiate_scan( self, organization_id: int | None = None, target_id: int | None = None, engine_id: int | None = None ) -> tuple[List[Target], ScanEngine]: """ 准备扫描任务所需的数据 职责: 1. 参数验证(必填项、互斥参数) 2. 资源查询(Engine、Organization、Target) 3. 业务逻辑判断(组织下是否有目标) 4. 返回准备好的目标列表和扫描引擎 Args: organization_id: 组织ID(可选) target_id: 目标ID(可选) engine_id: 扫描引擎ID(必填) Returns: (目标列表, 扫描引擎对象) - 供 create_scans 方法使用 Raises: ValidationError: 参数验证失败或业务规则不满足 ObjectDoesNotExist: 资源不存在(Organization/Target/ScanEngine) Note: - organization_id 和 target_id 必须二选一 - 如果提供 organization_id,返回该组织下所有目标 - 如果提供 target_id,返回单个目标列表 """ # 1. 参数验证 if not engine_id: raise ValidationError('缺少必填参数: engine_id') if not organization_id and not target_id: raise ValidationError('必须提供 organization_id 或 target_id 其中之一') if organization_id and target_id: raise ValidationError('organization_id 和 target_id 只能提供其中之一') # 2. 查询扫描引擎(通过 Repository 层) engine = self.engine_repo.get_by_id(engine_id) if not engine: logger.error("扫描引擎不存在 - Engine ID: %s", engine_id) raise ObjectDoesNotExist(f'ScanEngine ID {engine_id} 不存在') # 3. 根据参数获取目标列表 targets = [] if organization_id: # 根据组织ID获取所有目标(通过 Repository 层) organization = self.organization_repo.get_by_id(organization_id) if not organization: logger.error("组织不存在 - Organization ID: %s", organization_id) raise ObjectDoesNotExist(f'Organization ID {organization_id} 不存在') targets = self.organization_repo.get_targets(organization_id) if not targets: raise ValidationError(f'组织 ID {organization_id} 下没有目标') logger.debug( "准备发起扫描 - 组织: %s, 目标数量: %d, 引擎: %s", organization.name, len(targets), engine.name ) else: # 根据目标ID获取单个目标(通过 Repository 层) target = self.target_repo.get_by_id(target_id) if not target: logger.error("目标不存在 - Target ID: %s", target_id) raise ObjectDoesNotExist(f'Target ID {target_id} 不存在') targets = [target] logger.debug( "准备发起扫描 - 目标: %s, 引擎: %s", target.name, engine.name ) return targets, engine def prepare_initiate_scan_multi_engine( self, organization_id: int | None = None, target_id: int | None = None, engine_ids: List[int] | None = None ) -> Tuple[List[Target], str, List[str], List[int]]: """ 准备多引擎扫描任务所需的数据 职责: 1. 参数验证(必填项、互斥参数) 2. 资源查询(Engines、Organization、Target) 3. 合并引擎配置(检测冲突) 4. 返回准备好的目标列表、合并配置和引擎信息 Args: organization_id: 组织ID(可选) target_id: 目标ID(可选) engine_ids: 扫描引擎ID列表(必填) Returns: (目标列表, 合并配置, 引擎名称列表, 引擎ID列表) - 供 create_scans 方法使用 Raises: ValidationError: 参数验证失败或业务规则不满足 ObjectDoesNotExist: 资源不存在(Organization/Target/ScanEngine) ConfigConflictError: 引擎配置存在冲突 Note: - organization_id 和 target_id 必须二选一 - 如果提供 organization_id,返回该组织下所有目标 - 如果提供 target_id,返回单个目标列表 """ # 1. 参数验证 if not engine_ids: raise ValidationError('缺少必填参数: engine_ids') if not organization_id and not target_id: raise ValidationError('必须提供 organization_id 或 target_id 其中之一') if organization_id and target_id: raise ValidationError('organization_id 和 target_id 只能提供其中之一') # 2. 查询所有扫描引擎 engines = [] for engine_id in engine_ids: engine = self.engine_repo.get_by_id(engine_id) if not engine: logger.error("扫描引擎不存在 - Engine ID: %s", engine_id) raise ObjectDoesNotExist(f'ScanEngine ID {engine_id} 不存在') engines.append(engine) # 3. 合并引擎配置(可能抛出 ConfigConflictError) engine_configs = [(e.name, e.configuration or '') for e in engines] merged_configuration = merge_engine_configs(engine_configs) engine_names = [e.name for e in engines] logger.debug( "引擎配置合并成功 - 引擎: %s", ', '.join(engine_names) ) # 4. 根据参数获取目标列表 targets = [] if organization_id: # 根据组织ID获取所有目标 organization = self.organization_repo.get_by_id(organization_id) if not organization: logger.error("组织不存在 - Organization ID: %s", organization_id) raise ObjectDoesNotExist(f'Organization ID {organization_id} 不存在') targets = self.organization_repo.get_targets(organization_id) if not targets: raise ValidationError(f'组织 ID {organization_id} 下没有目标') logger.debug( "准备发起扫描 - 组织: %s, 目标数量: %d, 引擎: %s", organization.name, len(targets), ', '.join(engine_names) ) else: # 根据目标ID获取单个目标 target = self.target_repo.get_by_id(target_id) if not target: logger.error("目标不存在 - Target ID: %s", target_id) raise ObjectDoesNotExist(f'Target ID {target_id} 不存在') targets = [target] logger.debug( "准备发起扫描 - 目标: %s, 引擎: %s", target.name, ', '.join(engine_names) ) return targets, merged_configuration, engine_names, engine_ids def _generate_scan_workspace_dir(self) -> str: """ 生成 Scan 工作空间目录路径 职责: - 生成唯一的 Scan 级别工作空间目录路径字符串 - 不创建实际目录(由 Flow 层负责) Returns: Scan 工作空间目录路径字符串 格式:{SCAN_RESULTS_DIR}/scan_{timestamp}_{uuid8}/ 示例:/data/scans/scan_20231104_152030_a3f2b7e9/ Raises: ValueError: 如果 SCAN_RESULTS_DIR 未设置或为空 Note: 使用秒级时间戳 + 8 位 UUID 确保路径唯一性 冲突概率:同一秒内创建 1000 个扫描,冲突概率 < 0.01% """ timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') unique_id = uuid.uuid4().hex[:8] # 8 位十六进制UUID (4,294,967,296 种可能) # 从 settings 获取,保持配置统一 base_dir = getattr(settings, 'SCAN_RESULTS_DIR', None) if not base_dir: error_msg = "SCAN_RESULTS_DIR 未设置,无法创建扫描工作空间" logger.error(error_msg) raise ValueError(error_msg) scan_workspace_dir = str(Path(base_dir) / f"scan_{timestamp}_{unique_id}") return scan_workspace_dir def create_scans( self, targets: List[Target], engine_ids: List[int], engine_names: List[str], yaml_configuration: str, scheduled_scan_name: str | None = None ) -> List[Scan]: """ 为多个目标批量创建扫描任务,后台异步分发到 Worker Args: targets: 目标列表 engine_ids: 引擎 ID 列表 engine_names: 引擎名称列表 yaml_configuration: YAML 格式的扫描配置 scheduled_scan_name: 定时扫描任务名称(可选,用于通知显示) Returns: 创建的 Scan 对象列表(立即返回,不等待分发完成) 流程: 1. 同步:批量创建 Scan 记录(快速) 2. 异步:后台线程通过 TaskDistributor 分发任务到 Workers """ # 第一步:准备批量创建的数据 scans_to_create = [] for target in targets: try: scan_workspace_dir = self._generate_scan_workspace_dir() scan = Scan( target=target, engine_ids=engine_ids, engine_names=engine_names, yaml_configuration=yaml_configuration, results_dir=scan_workspace_dir, status=ScanStatus.INITIATED, container_ids=[], ) scans_to_create.append(scan) except (ValidationError, ValueError) as e: logger.error( "准备扫描任务数据失败 - Target: %s, 错误: %s", target.name, e ) continue if not scans_to_create: logger.warning("没有需要创建的扫描任务") return [] # 第二步:使用事务批量创建(同步,快速) created_scans = [] try: with transaction.atomic(): created_scans = self.scan_repo.bulk_create(scans_to_create) logger.info("批量创建扫描记录成功 - 数量: %d", len(created_scans)) except (DatabaseError, IntegrityError) as e: logger.exception("数据库错误:批量创建扫描记录失败 - 错误: %s", e) return [] except ValidationError as e: logger.error("验证错误:扫描任务数据无效 - 错误: %s", e) return [] # 第三步:分发任务到 Workers # 使用第一个引擎名称作为显示名称,或者合并显示 display_engine_name = ', '.join(engine_names) if engine_names else '' scan_data = [ { 'scan_id': scan.id, 'target_name': scan.target.name, 'target_id': scan.target.id, 'results_dir': scan.results_dir, 'engine_name': display_engine_name, 'scheduled_scan_name': scheduled_scan_name, } for scan in created_scans ] # 后台线程异步分发(不阻塞 API/调度器) thread = threading.Thread( target=self._distribute_scans_to_workers, args=(scan_data,), daemon=True, ) thread.start() logger.info("扫描任务已创建,后台分发中 - 数量: %d", len(created_scans)) return created_scans def _distribute_scans_to_workers(self, scan_data: List[dict]): """ 后台线程:分发扫描任务到 Workers Args: scan_data: 扫描任务数据列表 """ logger.info("="*60) logger.info("开始分发扫描任务到 Workers - 数量: %d", len(scan_data)) logger.info("="*60) # 后台线程需要新的数据库连接 connection.close() logger.info("已关闭旧数据库连接,准备获取新连接") distributor = get_task_distributor() logger.info("TaskDistributor 初始化完成") scan_repo = DjangoScanRepository() logger.info("ScanRepository 初始化完成") for data in scan_data: scan_id = data['scan_id'] logger.info("-"*40) logger.info("准备分发扫描任务 - Scan ID: %s, Target: %s", scan_id, data['target_name']) try: logger.info("调用 distributor.execute_scan_flow...") success, message, container_id, worker_id = distributor.execute_scan_flow( scan_id=scan_id, target_name=data['target_name'], target_id=data['target_id'], scan_workspace_dir=data['results_dir'], engine_name=data['engine_name'], scheduled_scan_name=data.get('scheduled_scan_name'), ) logger.info( "execute_scan_flow 返回 - success: %s, message: %s, container_id: %s, worker_id: %s", success, message, container_id, worker_id ) if success: if container_id: scan_repo.append_container_id(scan_id, container_id) logger.info("已记录 container_id: %s", container_id) if worker_id: scan_repo.update_worker(scan_id, worker_id) logger.info("已记录 worker_id: %s", worker_id) logger.info( "✓ 扫描任务已提交 - Scan ID: %s, Worker: %s", scan_id, worker_id ) else: logger.error("execute_scan_flow 返回失败 - message: %s", message) raise Exception(message) except Exception as e: logger.error("提交扫描任务失败 - Scan ID: %s, 错误: %s", scan_id, e) logger.exception("详细堆栈:") try: scan_repo.update_status( scan_id, ScanStatus.FAILED, error_message=f'提交任务失败: {e}', ) except (DatabaseError, OperationalError) as save_error: logger.error("更新状态失败 - Scan ID: %s, 错误: %s", scan_id, save_error) # 导出接口 __all__ = ['ScanCreationService'] ================================================ FILE: backend/apps/scan/services/scan_service.py ================================================ """ 扫描任务服务 负责 Scan 模型的所有业务逻辑 """ from __future__ import annotations import logging import uuid from typing import Dict, List, TYPE_CHECKING from datetime import datetime from pathlib import Path from django.conf import settings from django.db import transaction from django.db.utils import DatabaseError, IntegrityError, OperationalError from django.core.exceptions import ValidationError, ObjectDoesNotExist from apps.scan.models import Scan from apps.scan.repositories import DjangoScanRepository from apps.targets.repositories import DjangoTargetRepository, DjangoOrganizationRepository from apps.engine.repositories import DjangoEngineRepository from apps.targets.models import Target from apps.engine.models import ScanEngine from apps.common.definitions import ScanStatus logger = logging.getLogger(__name__) class ScanService: """ 扫描任务服务(协调者) 职责: - 协调各个子服务 - 提供统一的公共接口 - 保持向后兼容 注意: - 具体业务逻辑已拆分到子服务 - 本类主要负责委托和协调 """ # 终态集合:这些状态一旦设置,不应该被覆盖 FINAL_STATUSES = { ScanStatus.COMPLETED, ScanStatus.FAILED, ScanStatus.CANCELLED } def __init__(self): """ 初始化服务 """ # 初始化子服务 from apps.scan.services.scan_creation_service import ScanCreationService from apps.scan.services.scan_state_service import ScanStateService from apps.scan.services.scan_control_service import ScanControlService from apps.scan.services.scan_stats_service import ScanStatsService self.creation_service = ScanCreationService() self.state_service = ScanStateService() self.control_service = ScanControlService() self.stats_service = ScanStatsService() # 保留 ScanRepository(用于 get_scan 方法) self.scan_repo = DjangoScanRepository() def get_scan(self, scan_id: int, prefetch_relations: bool) -> Scan | None: """ 获取扫描任务(包含关联对象) 自动预加载 engine 和 target,避免 N+1 查询问题 Args: scan_id: 扫描任务 ID Returns: Scan 对象(包含 engine 和 target)或 None """ return self.scan_repo.get_by_id(scan_id, prefetch_relations) def get_all_scans(self, prefetch_relations: bool = True): return self.scan_repo.get_all(prefetch_relations=prefetch_relations) def prepare_initiate_scan( self, organization_id: int | None = None, target_id: int | None = None, engine_id: int | None = None ) -> tuple[List[Target], ScanEngine]: """ 为创建扫描任务做准备,返回所需的目标列表和扫描引擎 """ return self.creation_service.prepare_initiate_scan( organization_id, target_id, engine_id ) def prepare_initiate_scan_multi_engine( self, organization_id: int | None = None, target_id: int | None = None, engine_ids: List[int] | None = None ) -> tuple[List[Target], str, List[str], List[int]]: """ 为创建多引擎扫描任务做准备 Returns: (目标列表, 合并配置, 引擎名称列表, 引擎ID列表) """ return self.creation_service.prepare_initiate_scan_multi_engine( organization_id, target_id, engine_ids ) def create_scans( self, targets: List[Target], engine_ids: List[int], engine_names: List[str], yaml_configuration: str, scheduled_scan_name: str | None = None ) -> List[Scan]: """批量创建扫描任务(委托给 ScanCreationService)""" return self.creation_service.create_scans( targets, engine_ids, engine_names, yaml_configuration, scheduled_scan_name ) # ==================== 状态管理方法(委托给 ScanStateService) ==================== def update_status( self, scan_id: int, status: ScanStatus, error_message: str | None = None, stopped_at: datetime | None = None ) -> bool: """更新 Scan 状态(委托给 ScanStateService)""" return self.state_service.update_status( scan_id, status, error_message, stopped_at ) def update_status_if_match( self, scan_id: int, current_status: ScanStatus, new_status: ScanStatus, stopped_at: datetime | None = None ) -> bool: """条件更新 Scan 状态(委托给 ScanStateService)""" return self.state_service.update_status_if_match( scan_id, current_status, new_status, stopped_at ) def update_cached_stats(self, scan_id: int) -> dict | None: """更新缓存统计数据(委托给 ScanStateService),返回统计数据字典""" return self.state_service.update_cached_stats(scan_id) # ==================== 进度跟踪方法(委托给 ScanStateService) ==================== def init_stage_progress(self, scan_id: int, stages: list[str]) -> bool: """初始化阶段进度(委托给 ScanStateService)""" return self.state_service.init_stage_progress(scan_id, stages) def start_stage(self, scan_id: int, stage: str) -> bool: """开始执行某个阶段(委托给 ScanStateService)""" return self.state_service.start_stage(scan_id, stage) def complete_stage(self, scan_id: int, stage: str, detail: str | None = None) -> bool: """完成某个阶段(委托给 ScanStateService)""" return self.state_service.complete_stage(scan_id, stage, detail) def fail_stage(self, scan_id: int, stage: str, error: str | None = None) -> bool: """标记某个阶段失败(委托给 ScanStateService)""" return self.state_service.fail_stage(scan_id, stage, error) def cancel_running_stages(self, scan_id: int, final_status: str = "cancelled") -> bool: """取消所有正在运行的阶段(委托给 ScanStateService)""" return self.state_service.cancel_running_stages(scan_id, final_status) # TODO:待接入 def add_command_to_scan(self, scan_id: int, stage_name: str, tool_name: str, command: str) -> bool: """ 增量添加命令到指定扫描阶段 Args: scan_id: 扫描任务ID stage_name: 阶段名称(如 'subdomain_discovery', 'port_scan') tool_name: 工具名称 command: 执行命令 Returns: bool: 是否成功添加 """ try: scan = self.get_scan(scan_id, prefetch_relations=False) if not scan: logger.error(f"扫描任务不存在: {scan_id}") return False stage_progress = scan.stage_progress or {} # 确保指定阶段存在 if stage_name not in stage_progress: stage_progress[stage_name] = {'status': 'running', 'commands': []} # 确保 commands 列表存在 if 'commands' not in stage_progress[stage_name]: stage_progress[stage_name]['commands'] = [] # 增量添加命令 command_entry = f"{tool_name}: {command}" stage_progress[stage_name]['commands'].append(command_entry) scan.stage_progress = stage_progress scan.save(update_fields=['stage_progress']) command_count = len(stage_progress[stage_name]['commands']) logger.info(f"✓ 记录命令: {stage_name}.{tool_name} (总计: {command_count})") return True except Exception as e: logger.error(f"记录命令失败: {e}") return False # ==================== 删除和控制方法(委托给 ScanControlService) ==================== def delete_scans_two_phase(self, scan_ids: List[int]) -> dict: """两阶段删除扫描任务(委托给 ScanControlService)""" return self.control_service.delete_scans_two_phase(scan_ids) def stop_scan(self, scan_id: int) -> tuple[bool, int]: """停止扫描任务(委托给 ScanControlService)""" return self.control_service.stop_scan(scan_id) def hard_delete_scans(self, scan_ids: List[int]) -> tuple[int, Dict[str, int]]: """ 硬删除扫描任务(真正删除数据) 用于 Worker 容器中执行,删除已软删除的扫描及其关联数据。 Args: scan_ids: 扫描任务 ID 列表 Returns: (删除数量, 详情字典) """ return self.scan_repo.hard_delete_by_ids(scan_ids) # ==================== 统计方法(委托给 ScanStatsService) ==================== def get_statistics(self) -> dict: """获取扫描统计数据(委托给 ScanStatsService)""" return self.stats_service.get_statistics() # 导出接口 __all__ = ['ScanService'] ================================================ FILE: backend/apps/scan/services/scan_state_service.py ================================================ """ 扫描状态管理服务 职责: - 更新扫描状态 - 条件状态更新(乐观锁) - 更新缓存统计数据 """ import logging from datetime import datetime from django.db.utils import DatabaseError, OperationalError from django.core.exceptions import ObjectDoesNotExist from apps.common.definitions import ScanStatus from apps.scan.repositories import DjangoScanRepository logger = logging.getLogger(__name__) class ScanStateService: """ 扫描状态管理服务 职责: - 更新扫描状态 - 条件状态更新(乐观锁) - 更新缓存统计数据 - 状态验证 """ def __init__(self): """ 初始化服务 """ self.repo = DjangoScanRepository() def update_status( self, scan_id: int, status: ScanStatus, error_message: str | None = None, stopped_at: datetime | None = None ) -> bool: """ 更新 Scan 状态 Args: scan_id: 扫描任务 ID status: 新状态 error_message: 错误消息(可选) stopped_at: 结束时间(可选) Returns: 是否更新成功 Note: created_at 是自动设置的,不需要手动传递 """ try: result = self.repo.update_status( scan_id, status, error_message, stopped_at=stopped_at ) if result: logger.debug( "更新 Scan 状态成功 - Scan ID: %s, 状态: %s", scan_id, ScanStatus(status).label ) return result except (DatabaseError, OperationalError) as e: logger.exception("数据库错误:更新 Scan 状态失败 - Scan ID: %s", scan_id) raise # 数据库错误应该向上传播 except ObjectDoesNotExist: logger.error("Scan 不存在 - Scan ID: %s", scan_id) return False def update_status_if_match( self, scan_id: int, current_status: ScanStatus, new_status: ScanStatus, stopped_at: datetime | None = None ) -> bool: """ 条件更新 Scan 状态(原子操作) 仅当扫描状态匹配 current_status 时才更新为 new_status。 这是一个原子操作,用于处理并发场景下的状态更新。 Args: scan_id: 扫描任务 ID current_status: 当前期望的状态 new_status: 要更新到的新状态 stopped_at: 结束时间(可选) Returns: 是否更新成功(True=更新了记录,False=未更新或状态不匹配) Note: 此方法通过 Repository 层执行原子操作,适用于需要条件更新的场景 """ try: result = self.repo.update_status_if_match( scan_id=scan_id, current_status=current_status, new_status=new_status, stopped_at=stopped_at ) if result: logger.debug( "条件更新 Scan 状态成功 - Scan ID: %s, %s → %s", scan_id, current_status.value, new_status.value ) return result except (DatabaseError, OperationalError) as e: logger.exception( "数据库错误:条件更新 Scan 状态失败 - Scan ID: %s", scan_id ) raise except Exception as e: logger.error( "条件更新 Scan 状态失败 - Scan ID: %s, 错误: %s", scan_id, e ) return False def update_cached_stats(self, scan_id: int) -> dict | None: """ 更新扫描任务的缓存统计数据 使用 Repository 层进行数据访问,符合分层架构规范 Args: scan_id: 扫描任务 ID Returns: 成功返回统计数据字典,失败返回 None Note: 应该在扫描进入终态时调用,更新缓存的统计字段以提升查询性能 """ try: # 通过 Repository 层更新统计数据 result = self.repo.update_cached_stats(scan_id) if result: logger.debug("更新缓存统计数据成功 - Scan ID: %s", scan_id) return result except (DatabaseError, OperationalError) as e: logger.exception("数据库错误:更新缓存统计数据失败 - Scan ID: %s", scan_id) return None except Exception as e: logger.error("更新缓存统计数据失败 - Scan ID: %s, 错误: %s", scan_id, e) return None def update_progress( self, scan_id: int, progress: int | None = None, current_stage: str | None = None, stage_progress: dict | None = None ) -> bool: """ 更新扫描进度信息 Args: scan_id: 扫描任务 ID progress: 进度百分比 0-100(可选) current_stage: 当前阶段(可选) stage_progress: 各阶段详情(可选) Returns: 是否更新成功 """ try: result = self.repo.update_progress( scan_id, progress=progress, current_stage=current_stage, stage_progress=stage_progress ) if result: logger.debug( "更新扫描进度成功 - Scan ID: %s, stage: %s", scan_id, current_stage ) return result except (DatabaseError, OperationalError) as e: logger.exception("数据库错误:更新扫描进度失败 - Scan ID: %s", scan_id) return False except Exception as e: logger.error("更新扫描进度失败 - Scan ID: %s, 错误: %s", scan_id, e) return False def init_stage_progress(self, scan_id: int, stages: list[str]) -> bool: """ 初始化阶段进度(所有阶段设为 pending) Args: scan_id: 扫描任务 ID stages: 阶段列表,如 ['subdomain_discovery', 'port_scan', ...] 顺序与 engine_config 配置和 Flow 执行顺序一致 Returns: 是否初始化成功 """ stage_progress = { stage: {"status": "pending", "order": idx} for idx, stage in enumerate(stages) } return self.update_progress( scan_id, progress=0, stage_progress=stage_progress ) def start_stage(self, scan_id: int, stage: str) -> bool: """ 开始执行某个阶段 Args: scan_id: 扫描任务 ID stage: 阶段名称 Returns: 是否更新成功 """ from datetime import datetime # 从数据库获取当前进度状态 scan = self.repo.get_by_id(scan_id) if not scan: logger.warning(f"start_stage: Scan not found - ID: {scan_id}") return False stage_progress = scan.stage_progress or {} # 保留原有的 order 字段 existing = stage_progress.get(stage, {}) order = existing.get("order", 0) # 如果阶段已经是 cancelled 状态,不要启动 if existing.get("status") == "cancelled": logger.info(f"start_stage: 阶段已取消,跳过 - Scan ID: {scan_id}, Stage: {stage}") return True stage_progress[stage] = { "status": "running", "order": order, "started_at": datetime.now().isoformat() } # 计算进度百分比 total_stages = len(stage_progress) completed = sum(1 for s in stage_progress.values() if s.get("status") == "completed") progress = int((completed / total_stages) * 100) if total_stages > 0 else 0 return self.update_progress( scan_id, progress=progress, current_stage=stage, stage_progress=stage_progress ) def complete_stage( self, scan_id: int, stage: str, detail: str | None = None ) -> bool: """ 完成某个阶段 Args: scan_id: 扫描任务 ID stage: 阶段名称 detail: 完成详情(可选) Returns: 是否更新成功 """ from datetime import datetime # 从数据库获取当前进度状态 scan = self.repo.get_by_id(scan_id) if not scan: logger.warning(f"complete_stage: Scan not found - ID: {scan_id}") return False stage_progress = scan.stage_progress or {} existing = stage_progress.get(stage, {}) order = existing.get("order", 0) started_at = existing.get("started_at") # 如果阶段已经是 cancelled 状态,不要覆盖为 completed if existing.get("status") == "cancelled": logger.info(f"complete_stage: 阶段已取消,跳过 - Scan ID: {scan_id}, Stage: {stage}") return True duration = 0 # 默认 0,避免 null if started_at: try: start_time = datetime.fromisoformat(started_at) duration = int((datetime.now() - start_time).total_seconds()) except (ValueError, TypeError): logger.warning(f"complete_stage: 无法解析 started_at - Stage: {stage}, Value: {started_at}") else: logger.error(f"complete_stage: started_at 缺失 - Scan ID: {scan_id}, Stage: {stage}") stage_progress[stage] = { "status": "completed", "order": order, "duration": duration, } if detail: stage_progress[stage]["detail"] = detail # 计算进度百分比 total_stages = len(stage_progress) completed = sum(1 for s in stage_progress.values() if s.get("status") == "completed") progress = int((completed / total_stages) * 100) if total_stages > 0 else 0 # 如果全部完成,进度设为 100 if completed == total_stages: progress = 100 return self.update_progress( scan_id, progress=progress, current_stage="" if completed == total_stages else stage, stage_progress=stage_progress ) def fail_stage( self, scan_id: int, stage: str, error: str | None = None ) -> bool: """ 标记某个阶段失败 Args: scan_id: 扫描任务 ID stage: 阶段名称 error: 错误信息(可选) Returns: 是否更新成功 """ # 从数据库获取当前进度状态 scan = self.repo.get_by_id(scan_id) if not scan: logger.warning(f"fail_stage: Scan not found - ID: {scan_id}") return False stage_progress = scan.stage_progress or {} # 保留原有的 order 字段 existing = stage_progress.get(stage, {}) order = existing.get("order", 0) # 如果阶段已经是 cancelled 状态,不要覆盖为 failed # (用户手动停止时会先标记为 cancelled,docker kill 后触发的 on_failed 不应覆盖) if existing.get("status") == "cancelled": logger.info(f"fail_stage: 阶段已取消,跳过 - Scan ID: {scan_id}, Stage: {stage}") return True stage_progress[stage] = { "status": "failed", "order": order, "error": error } return self.update_progress( scan_id, current_stage=stage, stage_progress=stage_progress ) def cancel_running_stages(self, scan_id: int, final_status: str = "cancelled") -> bool: """ 标记所有未完成的阶段(扫描被取消时调用) 将所有 running 状态的阶段标记为 final_status, 将所有 pending 状态的阶段标记为 skipped Args: scan_id: 扫描任务 ID final_status: running 阶段的最终状态 Returns: 是否更新成功 """ try: scan = self.repo.get_by_id(scan_id) if not scan or not scan.stage_progress: return False stage_progress = scan.stage_progress updated = False for stage, info in stage_progress.items(): status = info.get("status") order = info.get("order", 0) if status == "running": # 正在运行的阶段标记为 final_status stage_progress[stage] = { "status": final_status, "order": order, } updated = True elif status == "pending": # 未开始的阶段统一标记为 cancelled stage_progress[stage] = { "status": "cancelled", "order": order, } updated = True if updated: self.update_progress( scan_id, current_stage="", stage_progress=stage_progress ) return True except Exception as e: logger.error("取消阶段进度失败 - Scan ID: %s, 错误: %s", scan_id, e) return False # 导出接口 __all__ = ['ScanStateService'] ================================================ FILE: backend/apps/scan/services/scan_stats_service.py ================================================ """ 扫描统计服务 职责: - 获取扫描统计数据 - 数据聚合查询 """ import logging from django.db.utils import DatabaseError, OperationalError from apps.scan.repositories import DjangoScanRepository logger = logging.getLogger(__name__) class ScanStatsService: """ 扫描统计服务 职责: - 统计数据查询 - 数据聚合 """ def __init__(self): """ 初始化服务 """ self.scan_repo = DjangoScanRepository() def get_statistics(self) -> dict: """ 获取扫描任务统计数据 Returns: 统计数据字典 Raises: DatabaseError: 数据库错误 Note: 使用 Repository 层的聚合查询,性能优异 """ try: statistics = self.scan_repo.get_statistics() logger.debug("获取扫描统计数据成功 - 总数: %d", statistics['total']) return statistics except (DatabaseError, OperationalError) as e: logger.exception("数据库错误:获取扫描统计数据失败") raise # 导出接口 __all__ = ['ScanStatsService'] ================================================ FILE: backend/apps/scan/services/scheduled_scan_service.py ================================================ """ 定时扫描任务 Service 业务逻辑层: - 管理定时扫描任务的 CRUD - 计算下次执行时间 - APScheduler 会每分钟检查 next_run_time,到期任务通过 task_distributor 分发 """ import logging from typing import List, Optional, Tuple from datetime import datetime from django.core.exceptions import ValidationError from apps.scan.models import ScheduledScan from apps.scan.repositories import DjangoScheduledScanRepository, ScheduledScanDTO from apps.scan.utils.config_merger import merge_engine_configs, ConfigConflictError from apps.engine.repositories import DjangoEngineRepository from apps.targets.services import TargetService logger = logging.getLogger(__name__) class ScheduledScanService: """ 定时扫描任务服务 职责: - 定时扫描任务的 CRUD 操作 - 调度逻辑处理(基于 next_run_time) """ def __init__(self): self.repo = DjangoScheduledScanRepository() self.engine_repo = DjangoEngineRepository() self.target_service = TargetService() # ==================== 查询方法 ==================== def get_by_id(self, scheduled_scan_id: int) -> Optional[ScheduledScan]: """根据 ID 获取定时扫描任务""" return self.repo.get_by_id(scheduled_scan_id) def get_queryset(self): """获取所有定时扫描任务的查询集""" return self.repo.get_queryset() def get_all(self, page: int = 1, page_size: int = 10) -> Tuple[List[ScheduledScan], int]: """分页获取所有定时扫描任务""" return self.repo.get_all(page, page_size) # ==================== 创建方法 ==================== def create(self, dto: ScheduledScanDTO) -> ScheduledScan: """ 创建定时扫描任务(使用引擎 ID 合并配置) 流程: 1. 验证参数 2. 合并引擎配置 3. 创建数据库记录 4. 计算并设置 next_run_time Args: dto: 定时扫描 DTO Returns: 创建的 ScheduledScan 对象 Raises: ValidationError: 参数验证失败 ConfigConflictError: 引擎配置冲突 """ # 1. 验证参数 self._validate_create_dto(dto) # 2. 合并引擎配置 engines = [] engine_names = [] for engine_id in dto.engine_ids: engine = self.engine_repo.get_by_id(engine_id) if engine: engines.append((engine.name, engine.configuration or '')) engine_names.append(engine.name) merged_configuration = merge_engine_configs(engines) # 设置 DTO 的合并配置和引擎名称 dto.engine_names = engine_names dto.yaml_configuration = merged_configuration # 3. 创建数据库记录 scheduled_scan = self.repo.create(dto) # 4. 如果有 cron 表达式且已启用,计算下次执行时间 if scheduled_scan.cron_expression and scheduled_scan.is_enabled: next_run_time = self._calculate_next_run_time(scheduled_scan) if next_run_time: self.repo.update_next_run_time(scheduled_scan.id, next_run_time) scheduled_scan.next_run_time = next_run_time logger.info( "创建定时扫描任务 - ID: %s, 名称: %s, 下次执行: %s", scheduled_scan.id, scheduled_scan.name, scheduled_scan.next_run_time ) return scheduled_scan def create_with_configuration(self, dto: ScheduledScanDTO) -> ScheduledScan: """ 创建定时扫描任务(直接使用前端传递的配置) 流程: 1. 验证参数 2. 直接使用 dto.yaml_configuration 3. 创建数据库记录 4. 计算并设置 next_run_time Args: dto: 定时扫描 DTO(必须包含 yaml_configuration) Returns: 创建的 ScheduledScan 对象 Raises: ValidationError: 参数验证失败 """ # 1. 验证参数 self._validate_create_dto_with_configuration(dto) # 2. 创建数据库记录(直接使用 dto 中的配置) scheduled_scan = self.repo.create(dto) # 3. 如果有 cron 表达式且已启用,计算下次执行时间 if scheduled_scan.cron_expression and scheduled_scan.is_enabled: next_run_time = self._calculate_next_run_time(scheduled_scan) if next_run_time: self.repo.update_next_run_time(scheduled_scan.id, next_run_time) scheduled_scan.next_run_time = next_run_time logger.info( "创建定时扫描任务 - ID: %s, 名称: %s, 下次执行: %s", scheduled_scan.id, scheduled_scan.name, scheduled_scan.next_run_time ) return scheduled_scan def _validate_create_dto(self, dto: ScheduledScanDTO) -> None: """验证创建 DTO(使用引擎 ID)""" # 基础验证 self._validate_base_dto(dto) if not dto.engine_ids: raise ValidationError('必须选择扫描引擎') # 验证所有引擎是否存在 for engine_id in dto.engine_ids: if not self.engine_repo.get_by_id(engine_id): raise ValidationError(f'扫描引擎 ID {engine_id} 不存在') def _validate_create_dto_with_configuration(self, dto: ScheduledScanDTO) -> None: """验证创建 DTO(使用前端传递的配置)""" # 基础验证 self._validate_base_dto(dto) if not dto.yaml_configuration: raise ValidationError('配置不能为空') def _validate_base_dto(self, dto: ScheduledScanDTO) -> None: """验证 DTO 的基础字段(公共逻辑)""" from apps.targets.repositories import DjangoOrganizationRepository if not dto.name: raise ValidationError('任务名称不能为空') # 验证扫描模式(organization_id 和 target_id 互斥) if not dto.organization_id and not dto.target_id: raise ValidationError('必须选择组织或扫描目标') if dto.organization_id and dto.target_id: raise ValidationError('组织扫描和目标扫描只能选择其中一种') # 组织扫描模式:验证组织是否存在 if dto.organization_id: org_repo = DjangoOrganizationRepository() if not org_repo.get_by_id(dto.organization_id): raise ValidationError(f'组织 ID {dto.organization_id} 不存在') # 目标扫描模式:验证目标是否存在 if dto.target_id: if not self.target_service.get_by_id(dto.target_id): raise ValidationError(f'目标 ID {dto.target_id} 不存在') # 验证 cron 表达式格式(简单校验) if dto.cron_expression: parts = dto.cron_expression.split() if len(parts) != 5: raise ValidationError('Cron 表达式格式错误,需要 5 个部分:分 时 日 月 周') # ==================== 更新方法 ==================== def update(self, scheduled_scan_id: int, dto: ScheduledScanDTO) -> Optional[ScheduledScan]: """ 更新定时扫描任务 Args: scheduled_scan_id: 定时扫描 ID dto: 更新的数据 Returns: 更新后的 ScheduledScan 对象 Raises: ConfigConflictError: 引擎配置冲突 """ existing = self.repo.get_by_id(scheduled_scan_id) if not existing: return None # 如果引擎变更,重新合并配置 if dto.engine_ids is not None: engines = [] engine_names = [] for engine_id in dto.engine_ids: engine = self.engine_repo.get_by_id(engine_id) if engine: engines.append((engine.name, engine.configuration or '')) engine_names.append(engine.name) merged_configuration = merge_engine_configs(engines) dto.engine_names = engine_names dto.yaml_configuration = merged_configuration # 更新数据库记录 scheduled_scan = self.repo.update(scheduled_scan_id, dto) if not scheduled_scan: return None # 如果 cron 表达式或启用状态变化,重新计算 next_run_time cron_changed = dto.cron_expression is not None and dto.cron_expression != existing.cron_expression enabled_changed = dto.is_enabled is not None and dto.is_enabled != existing.is_enabled if cron_changed or enabled_changed: if scheduled_scan.is_enabled and scheduled_scan.cron_expression: next_run_time = self._calculate_next_run_time(scheduled_scan) self.repo.update_next_run_time(scheduled_scan.id, next_run_time) scheduled_scan.next_run_time = next_run_time else: # 禁用或无 cron 表达式,清空下次执行时间 self.repo.update_next_run_time(scheduled_scan.id, None) scheduled_scan.next_run_time = None return scheduled_scan # ==================== 启用/禁用方法 ==================== def toggle_enabled(self, scheduled_scan_id: int, enabled: bool) -> bool: """ 切换定时扫描任务的启用状态 Args: scheduled_scan_id: 定时扫描 ID enabled: 是否启用 Returns: 是否成功 """ scheduled_scan = self.repo.get_by_id(scheduled_scan_id) if not scheduled_scan: return False # 更新数据库 if not self.repo.toggle_enabled(scheduled_scan_id, enabled): return False # 更新 next_run_time if enabled and scheduled_scan.cron_expression: next_run_time = self._calculate_next_run_time(scheduled_scan) self.repo.update_next_run_time(scheduled_scan_id, next_run_time) else: self.repo.update_next_run_time(scheduled_scan_id, None) logger.info("切换定时扫描状态 - ID: %s, Enabled: %s", scheduled_scan_id, enabled) return True def record_run(self, scheduled_scan_id: int) -> bool: """ 记录一次执行(增加执行次数、更新上次执行时间、计算下次执行时间) Args: scheduled_scan_id: 定时扫描 ID Returns: 是否成功 """ # 1. 增加执行次数并更新上次执行时间 if not self.repo.increment_run_count(scheduled_scan_id): return False # 2. 计算并更新下次执行时间 scheduled_scan = self.repo.get_by_id(scheduled_scan_id) if scheduled_scan and scheduled_scan.cron_expression: next_run_time = self._calculate_next_run_time(scheduled_scan) if next_run_time: self.repo.update_next_run_time(scheduled_scan_id, next_run_time) return True # ==================== 删除方法 ==================== def delete(self, scheduled_scan_id: int) -> bool: """ 删除定时扫描任务 Args: scheduled_scan_id: 定时扫描 ID Returns: 是否成功 """ return self.repo.hard_delete(scheduled_scan_id) # ==================== 定时触发(APScheduler 调用)==================== def trigger_due_scans(self) -> int: """ 检查并触发所有到期的定时扫描任务 由 APScheduler 每分钟调用一次,检查 next_run_time <= now 的任务 Returns: 触发的任务数量 """ from django.utils import timezone from croniter import croniter now = timezone.now() triggered_count = 0 # 获取所有启用且到期的定时扫描 due_scans = ScheduledScan.objects.filter( is_enabled=True, next_run_time__lte=now, ) for scheduled_scan in due_scans: try: # 1. 先计算并更新下次执行时间(防止重复触发) # 这样即使触发过程耗时较长,下一次 APScheduler 调用也不会再次查询到这个任务 cron = croniter(scheduled_scan.cron_expression, now) next_run = cron.get_next(datetime) self.repo.update_next_run_time(scheduled_scan.id, next_run) # 2. 触发扫描 self._trigger_scan_now(scheduled_scan) # 3. 更新执行记录(run_count + 1, last_run_time = now) self.repo.increment_run_count(scheduled_scan.id) triggered_count += 1 logger.info( "定时扫描已触发 - ID: %s, 名称: %s, 下次执行: %s", scheduled_scan.id, scheduled_scan.name, next_run ) except Exception as e: logger.error( "定时扫描触发失败 - ID: %s, Error: %s", scheduled_scan.id, e ) # 注意:即使触发失败,next_run_time 已更新,任务会在下次计划时间重试 # 这是合理的行为:避免失败任务被无限重试 return triggered_count # ==================== 内部方法 ==================== def _trigger_scan_now(self, scheduled_scan: ScheduledScan) -> int: """ 立即触发扫描(支持组织扫描和目标扫描两种模式) 复用 ScanService 的逻辑,与 API 调用保持一致。 使用存储的 yaml_configuration 而不是重新合并。 """ from apps.scan.services.scan_service import ScanService scan_service = ScanService() # 1. 准备扫描所需数据(使用存储的多引擎配置) targets, _, _, _ = scan_service.prepare_initiate_scan_multi_engine( organization_id=scheduled_scan.organization_id, target_id=scheduled_scan.target_id, engine_ids=scheduled_scan.engine_ids ) # 2. 创建扫描任务,使用存储的合并配置 created_scans = scan_service.create_scans( targets=targets, engine_ids=scheduled_scan.engine_ids, engine_names=scheduled_scan.engine_names, yaml_configuration=scheduled_scan.yaml_configuration, scheduled_scan_name=scheduled_scan.name ) logger.info( "定时扫描已触发 - ScheduledScan ID: %s, 创建扫描数: %d", scheduled_scan.id, len(created_scans) ) return len(created_scans) # ==================== 辅助方法 ==================== def _calculate_next_run_time(self, scheduled_scan: ScheduledScan) -> Optional[datetime]: """ 计算下次执行时间 Args: scheduled_scan: 定时扫描对象 Returns: 下次执行时间,once 类型返回 None """ from croniter import croniter from django.utils import timezone cron_expr = scheduled_scan.cron_expression if not cron_expr: return None try: cron = croniter(cron_expr, timezone.now()) return cron.get_next(datetime) except Exception as e: logger.error("计算下次执行时间失败: %s", e) return None ================================================ FILE: backend/apps/scan/services/subfinder_provider_config_service.py ================================================ """Subfinder Provider 配置文件生成服务 负责生成 subfinder 的 provider-config.yaml 配置文件 """ import logging import os from pathlib import Path from typing import Optional import yaml from ..models import SubfinderProviderSettings logger = logging.getLogger(__name__) class SubfinderProviderConfigService: """Subfinder Provider 配置文件生成服务""" # Provider 格式定义 PROVIDER_FORMATS = { 'fofa': {'type': 'composite', 'format': '{email}:{api_key}'}, 'censys': {'type': 'composite', 'format': '{api_id}:{api_secret}'}, 'hunter': {'type': 'single', 'field': 'api_key'}, 'shodan': {'type': 'single', 'field': 'api_key'}, 'zoomeye': {'type': 'single', 'field': 'api_key'}, 'securitytrails': {'type': 'single', 'field': 'api_key'}, 'threatbook': {'type': 'single', 'field': 'api_key'}, 'quake': {'type': 'single', 'field': 'api_key'}, } def generate(self, output_dir: str) -> Optional[str]: """ 生成 provider-config.yaml 文件 Args: output_dir: 输出目录路径 Returns: 生成的配置文件路径,如果没有启用的 provider 则返回 None """ settings = SubfinderProviderSettings.get_instance() config = {} has_enabled = False for provider, format_info in self.PROVIDER_FORMATS.items(): provider_config = settings.providers.get(provider, {}) if not provider_config.get('enabled'): config[provider] = [] continue value = self._build_provider_value(provider, provider_config) if value: config[provider] = [value] # 单个 key 放入数组 has_enabled = True logger.debug(f"Provider {provider} 已启用") else: config[provider] = [] # 检查是否有任何启用的 provider if not has_enabled: logger.info("没有启用的 Provider,跳过配置文件生成") return None # 确保输出目录存在 output_path = Path(output_dir) / 'provider-config.yaml' output_path.parent.mkdir(parents=True, exist_ok=True) # 写入 YAML 文件(使用默认列表格式,和 subfinder 一致) with open(output_path, 'w', encoding='utf-8') as f: yaml.dump(config, f, default_flow_style=False, allow_unicode=True) # 设置文件权限为 600(仅所有者可读写) os.chmod(output_path, 0o600) logger.info(f"Provider 配置文件已生成: {output_path}") return str(output_path) def _build_provider_value(self, provider: str, config: dict) -> Optional[str]: """根据 provider 格式规则构建配置值 Args: provider: provider 名称 config: provider 配置字典 Returns: 构建的配置值字符串,如果配置不完整则返回 None """ format_info = self.PROVIDER_FORMATS.get(provider) if not format_info: return None if format_info['type'] == 'composite': # 复合格式:需要多个字段 format_str = format_info['format'] try: # 提取格式字符串中的字段名 # 例如 '{email}:{api_key}' -> ['email', 'api_key'] import re fields = re.findall(r'\{(\w+)\}', format_str) # 检查所有字段是否都有值 values = {} for field in fields: value = config.get(field, '').strip() if not value: logger.debug(f"Provider {provider} 缺少字段 {field}") return None values[field] = value return format_str.format(**values) except (KeyError, ValueError) as e: logger.warning(f"构建 {provider} 配置值失败: {e}") return None else: # 单字段格式 field = format_info['field'] value = config.get(field, '').strip() if not value: logger.debug(f"Provider {provider} 缺少字段 {field}") return None return value def cleanup(self, config_path: str) -> None: """清理配置文件 Args: config_path: 配置文件路径 """ try: if config_path and Path(config_path).exists(): Path(config_path).unlink() logger.debug(f"已清理配置文件: {config_path}") except Exception as e: logger.warning(f"清理配置文件失败: {config_path} - {e}") ================================================ FILE: backend/apps/scan/services/target_export_service.py ================================================ """ 目标导出服务 提供统一的目标提取和文件导出功能,支持: - URL 导出(纯导出,不做隐式回退) - 默认 URL 生成(独立方法) - 带回退链的 URL 导出(用例层编排) - 域名/IP 导出(用于端口扫描) - 黑名单过滤集成 """ import ipaddress import logging from pathlib import Path from typing import Dict, Any, Optional, List, Iterator, Tuple from django.db.models import QuerySet from apps.common.utils import BlacklistFilter logger = logging.getLogger(__name__) class DataSource: """数据源类型常量""" ENDPOINT = "endpoint" WEBSITE = "website" HOST_PORT = "host_port" DEFAULT = "default" def create_export_service(target_id: int) -> 'TargetExportService': """ 工厂函数:创建带黑名单过滤的导出服务 Args: target_id: 目标 ID,用于加载黑名单规则 Returns: TargetExportService: 配置好黑名单过滤器的导出服务实例 """ from apps.common.services import BlacklistService rules = BlacklistService().get_rules(target_id) blacklist_filter = BlacklistFilter(rules) return TargetExportService(blacklist_filter=blacklist_filter) def _iter_default_urls_from_target( target_id: int, blacklist_filter: Optional[BlacklistFilter] = None ) -> Iterator[str]: """ 内部生成器:从 Target 本身生成默认 URL 根据 Target 类型生成 URL: - DOMAIN: http(s)://domain - IP: http(s)://ip - CIDR: 展开为所有 IP 的 http(s)://ip - URL: 直接使用目标 URL Args: target_id: 目标 ID blacklist_filter: 黑名单过滤器 Yields: str: URL """ from apps.targets.services import TargetService from apps.targets.models import Target target_service = TargetService() target = target_service.get_target(target_id) if not target: logger.warning("Target ID %d 不存在,无法生成默认 URL", target_id) return target_name = target.name target_type = target.type # 根据 Target 类型生成 URL if target_type == Target.TargetType.DOMAIN: urls = [f"http://{target_name}", f"https://{target_name}"] elif target_type == Target.TargetType.IP: urls = [f"http://{target_name}", f"https://{target_name}"] elif target_type == Target.TargetType.CIDR: try: network = ipaddress.ip_network(target_name, strict=False) urls = [] for ip in network.hosts(): urls.extend([f"http://{ip}", f"https://{ip}"]) # /32 或 /128 特殊处理 if not urls: ip = str(network.network_address) urls = [f"http://{ip}", f"https://{ip}"] except ValueError as e: logger.error("CIDR 解析失败: %s - %s", target_name, e) return elif target_type == Target.TargetType.URL: urls = [target_name] else: logger.warning("不支持的 Target 类型: %s", target_type) return # 过滤并产出 for url in urls: if blacklist_filter and not blacklist_filter.is_allowed(url): continue yield url def _iter_urls_with_fallback( target_id: int, sources: List[str], blacklist_filter: Optional[BlacklistFilter] = None, batch_size: int = 1000, tried_sources: Optional[List[str]] = None ) -> Iterator[Tuple[str, str]]: """ 内部生成器:流式产出 URL(带回退链) 按 sources 顺序尝试每个数据源,直到有数据返回。 回退逻辑: - 数据源有数据且通过过滤 → 产出 URL,停止回退 - 数据源有数据但全被过滤 → 不回退,停止(避免意外暴露) - 数据源为空 → 继续尝试下一个 Args: target_id: 目标 ID sources: 数据源优先级列表 blacklist_filter: 黑名单过滤器 batch_size: 批次大小 tried_sources: 可选,用于记录尝试过的数据源(外部传入列表,会被修改) Yields: Tuple[str, str]: (url, source) - URL 和来源标识 """ from apps.asset.models import Endpoint, WebSite for source in sources: if tried_sources is not None: tried_sources.append(source) has_output = False # 是否有输出(通过过滤的) has_raw_data = False # 是否有原始数据(过滤前) if source == DataSource.DEFAULT: # 默认 URL 生成(从 Target 本身构造,复用共用生成器) for url in _iter_default_urls_from_target(target_id, blacklist_filter): has_raw_data = True has_output = True yield url, source # 检查是否有原始数据(需要单独判断,因为生成器可能被过滤后为空) if not has_raw_data: # 再次检查 Target 是否存在 from apps.targets.services import TargetService target = TargetService().get_target(target_id) has_raw_data = target is not None if has_raw_data: if not has_output: logger.info("%s 有数据但全被黑名单过滤,不回退", source) return continue # 构建对应数据源的 queryset if source == DataSource.ENDPOINT: queryset = Endpoint.objects.filter(target_id=target_id).values_list('url', flat=True) elif source == DataSource.WEBSITE: queryset = WebSite.objects.filter(target_id=target_id).values_list('url', flat=True) else: logger.warning("未知的数据源类型: %s,跳过", source) continue for url in queryset.iterator(chunk_size=batch_size): if url: has_raw_data = True if blacklist_filter and not blacklist_filter.is_allowed(url): continue has_output = True yield url, source # 有原始数据就停止(不管是否被过滤) if has_raw_data: if not has_output: logger.info("%s 有数据但全被黑名单过滤,不回退", source) return logger.info("%s 为空,尝试下一个数据源", source) def get_urls_with_fallback( target_id: int, sources: List[str], batch_size: int = 1000 ) -> Dict[str, Any]: """ 带回退链的 URL 获取用例函数(返回列表) 按 sources 顺序尝试每个数据源,直到有数据返回。 Args: target_id: 目标 ID sources: 数据源优先级列表,如 ["website", "endpoint", "default"] batch_size: 批次大小 Returns: dict: { 'success': bool, 'urls': List[str], 'total_count': int, 'source': str, # 实际使用的数据源 'tried_sources': List[str], # 尝试过的数据源 } """ from apps.common.services import BlacklistService rules = BlacklistService().get_rules(target_id) blacklist_filter = BlacklistFilter(rules) urls = [] actual_source = 'none' tried_sources = [] for url, source in _iter_urls_with_fallback(target_id, sources, blacklist_filter, batch_size, tried_sources): urls.append(url) actual_source = source if urls: logger.info("从 %s 获取 %d 条 URL", actual_source, len(urls)) else: logger.warning("所有数据源都为空,无法获取 URL") return { 'success': True, 'urls': urls, 'total_count': len(urls), 'source': actual_source, 'tried_sources': tried_sources, } def export_urls_with_fallback( target_id: int, output_file: str, sources: List[str], batch_size: int = 1000 ) -> Dict[str, Any]: """ 带回退链的 URL 导出用例函数(写入文件) 按 sources 顺序尝试每个数据源,直到有数据返回。 流式写入,内存占用 O(1)。 Args: target_id: 目标 ID output_file: 输出文件路径 sources: 数据源优先级列表,如 ["endpoint", "website", "default"] batch_size: 批次大小 Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int, 'source': str, # 实际使用的数据源 'tried_sources': List[str], # 尝试过的数据源 } """ from apps.common.services import BlacklistService rules = BlacklistService().get_rules(target_id) blacklist_filter = BlacklistFilter(rules) output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) total_count = 0 actual_source = 'none' tried_sources = [] with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url, source in _iter_urls_with_fallback(target_id, sources, blacklist_filter, batch_size, tried_sources): f.write(f"{url}\n") total_count += 1 actual_source = source if total_count % 10000 == 0: logger.info("已导出 %d 个 URL...", total_count) if total_count > 0: logger.info("从 %s 导出 %d 条 URL 到 %s", actual_source, total_count, output_file) else: logger.warning("所有数据源都为空,无法导出 URL") return { 'success': True, 'output_file': str(output_path), 'total_count': total_count, 'source': actual_source, 'tried_sources': tried_sources, } class TargetExportService: """ 目标导出服务 - 提供统一的目标提取和文件导出功能 使用方式: # 方式 1:使用用例函数(推荐) from apps.scan.services.target_export_service import export_urls_with_fallback, DataSource result = export_urls_with_fallback( target_id=1, output_file='/path/to/output.txt', sources=[DataSource.ENDPOINT, DataSource.WEBSITE, DataSource.DEFAULT] ) # 方式 2:直接使用 Service(纯导出,不带回退) export_service = create_export_service(target_id) result = export_service.export_urls(target_id, output_path, queryset) """ def __init__(self, blacklist_filter: Optional[BlacklistFilter] = None): """ 初始化导出服务 Args: blacklist_filter: 黑名单过滤器,None 表示禁用过滤 """ self.blacklist_filter = blacklist_filter def export_urls( self, target_id: int, output_path: str, queryset: QuerySet, url_field: str = 'url', batch_size: int = 1000 ) -> Dict[str, Any]: """ 纯 URL 导出函数 - 只负责将 queryset 数据写入文件 不做任何隐式回退或默认 URL 生成。 Args: target_id: 目标 ID output_path: 输出文件路径 queryset: 数据源 queryset(由调用方构建,应为 values_list flat=True) url_field: URL 字段名(用于黑名单过滤) batch_size: 批次大小 Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int, # 实际写入数量 'queryset_count': int, # 原始数据数量(迭代计数) 'filtered_count': int, # 被黑名单过滤的数量 } Raises: IOError: 文件写入失败 """ output_file = Path(output_path) output_file.parent.mkdir(parents=True, exist_ok=True) logger.info("开始导出 URL - target_id=%s, output=%s", target_id, output_path) total_count = 0 filtered_count = 0 queryset_count = 0 try: with open(output_file, 'w', encoding='utf-8', buffering=8192) as f: for url in queryset.iterator(chunk_size=batch_size): queryset_count += 1 if url: # 黑名单过滤 if self.blacklist_filter and not self.blacklist_filter.is_allowed(url): filtered_count += 1 continue f.write(f"{url}\n") total_count += 1 if total_count % 10000 == 0: logger.info("已导出 %d 个 URL...", total_count) except IOError as e: logger.error("文件写入失败: %s - %s", output_path, e) raise if filtered_count > 0: logger.info("黑名单过滤: 过滤 %d 个 URL", filtered_count) logger.info( "✓ URL 导出完成 - 写入: %d, 原始: %d, 过滤: %d, 文件: %s", total_count, queryset_count, filtered_count, output_path ) return { 'success': True, 'output_file': str(output_file), 'total_count': total_count, 'queryset_count': queryset_count, 'filtered_count': filtered_count, } def generate_default_urls( self, target_id: int, output_path: str ) -> Dict[str, Any]: """ 默认 URL 生成器 根据 Target 类型生成默认 URL: - DOMAIN: http(s)://domain - IP: http(s)://ip - CIDR: 展开为所有 IP 的 http(s)://ip - URL: 直接使用目标 URL Args: target_id: 目标 ID output_path: 输出文件路径 Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int, } """ output_file = Path(output_path) output_file.parent.mkdir(parents=True, exist_ok=True) logger.info("生成默认 URL - target_id=%d", target_id) total_urls = 0 with open(output_file, 'w', encoding='utf-8', buffering=8192) as f: for url in _iter_default_urls_from_target(target_id, self.blacklist_filter): f.write(f"{url}\n") total_urls += 1 if total_urls % 10000 == 0: logger.info("已生成 %d 个 URL...", total_urls) logger.info("✓ 默认 URL 生成完成 - 数量: %d", total_urls) return { 'success': True, 'output_file': str(output_file), 'total_count': total_urls, } def export_hosts( self, target_id: int, output_path: str, batch_size: int = 1000 ) -> Dict[str, Any]: """ 主机列表导出函数(用于端口扫描) 根据 Target 类型选择导出逻辑: - DOMAIN: 从 Subdomain 表流式导出子域名 - IP: 直接写入 IP 地址 - CIDR: 展开为所有主机 IP Args: target_id: 目标 ID output_path: 输出文件路径 batch_size: 批次大小 Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int, 'target_type': str } """ from apps.targets.services import TargetService from apps.targets.models import Target output_file = Path(output_path) output_file.parent.mkdir(parents=True, exist_ok=True) # 获取 Target 信息 target_service = TargetService() target = target_service.get_target(target_id) if not target: raise ValueError(f"Target ID {target_id} 不存在") target_type = target.type target_name = target.name logger.info( "开始导出主机列表 - Target ID: %d, Name: %s, Type: %s, 输出文件: %s", target_id, target_name, target_type, output_path ) total_count = 0 if target_type == Target.TargetType.DOMAIN: total_count = self._export_domains(target_id, target_name, output_file, batch_size) type_desc = "域名" elif target_type == Target.TargetType.IP: total_count = self._export_ip(target_name, output_file) type_desc = "IP" elif target_type == Target.TargetType.CIDR: total_count = self._export_cidr(target_name, output_file) type_desc = "CIDR IP" else: raise ValueError(f"不支持的目标类型: {target_type}") logger.info( "✓ 主机列表导出完成 - 类型: %s, 总数: %d, 文件: %s", type_desc, total_count, output_path ) return { 'success': True, 'output_file': str(output_file), 'total_count': total_count, 'target_type': target_type } def _export_domains( self, target_id: int, target_name: str, output_path: Path, batch_size: int ) -> int: """导出域名类型目标的根域名 + 子域名""" from apps.asset.services.asset.subdomain_service import SubdomainService subdomain_service = SubdomainService() domain_iterator = subdomain_service.iter_subdomain_names_by_target( target_id=target_id, chunk_size=batch_size ) total_count = 0 written_domains = set() # 去重(子域名表可能已包含根域名) with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: # 1. 先写入根域名 if self._should_write_target(target_name): f.write(f"{target_name}\n") written_domains.add(target_name) total_count += 1 # 2. 再写入子域名(跳过已写入的根域名) for domain_name in domain_iterator: if domain_name in written_domains: continue if self._should_write_target(domain_name): f.write(f"{domain_name}\n") written_domains.add(domain_name) total_count += 1 if total_count % 10000 == 0: logger.info("已导出 %d 个域名...", total_count) return total_count def _export_ip(self, target_name: str, output_path: Path) -> int: """导出 IP 类型目标""" if self._should_write_target(target_name): with open(output_path, 'w', encoding='utf-8') as f: f.write(f"{target_name}\n") return 1 return 0 def _export_cidr(self, target_name: str, output_path: Path) -> int: """导出 CIDR 类型目标,展开为每个 IP""" network = ipaddress.ip_network(target_name, strict=False) total_count = 0 with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for ip in network.hosts(): ip_str = str(ip) if self._should_write_target(ip_str): f.write(f"{ip_str}\n") total_count += 1 if total_count % 10000 == 0: logger.info("已导出 %d 个 IP...", total_count) # /32 或 /128 特殊处理 if total_count == 0: ip_str = str(network.network_address) if self._should_write_target(ip_str): with open(output_path, 'w', encoding='utf-8') as f: f.write(f"{ip_str}\n") total_count = 1 return total_count def _should_write_target(self, target: str) -> bool: """检查目标是否应该写入(通过黑名单过滤)""" if self.blacklist_filter: return self.blacklist_filter.is_allowed(target) return True ================================================ FILE: backend/apps/scan/tasks/__init__.py ================================================ """ 扫描任务模块 包含: - Prefect Tasks: 具体操作的执行单元 架构说明: - Flow(flows/)编排 Tasks(tasks/) - Tasks 负责具体操作,Flow 负责编排 """ # 子域名发现任务(已重构为多个子任务) from .subdomain_discovery import ( run_subdomain_discovery_task, merge_and_validate_task, save_domains_task, ) # 指纹识别任务 from .fingerprint_detect import ( export_urls_for_fingerprint_task, run_xingfinger_and_stream_update_tech_task, ) # 注意: # - subdomain_discovery_task 已重构为多个子任务(subdomain_discovery/) # - finalize_scan_task 已废弃(Handler 统一管理状态) # - initiate_scan_task 已迁移到 flows/initiate_scan_flow.py # - cleanup_old_scans_task 已迁移到 flows(cleanup_old_scans_flow) # - create_scan_workspace_task 已删除,直接使用 setup_scan_workspace() __all__ = [ # 子域名发现任务 'run_subdomain_discovery_task', 'merge_and_validate_task', 'save_domains_task', # 指纹识别任务 'export_urls_for_fingerprint_task', 'run_xingfinger_and_stream_update_tech_task', ] ================================================ FILE: backend/apps/scan/tasks/directory_scan/__init__.py ================================================ """ 目录扫描任务 主要任务: - export_sites_task:导出站点列表到文件 - run_and_stream_save_directories_task:流式运行目录扫描并实时保存结果 """ from .export_sites_task import export_sites_task from .run_and_stream_save_directories_task import run_and_stream_save_directories_task __all__ = [ 'export_sites_task', 'run_and_stream_save_directories_task', ] ================================================ FILE: backend/apps/scan/tasks/directory_scan/export_sites_task.py ================================================ """ 导出站点 URL 到 TXT 文件的 Task 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 数据源: WebSite.url → Default """ import logging from typing import Optional from pathlib import Path from prefect import task from apps.scan.services.target_export_service import ( export_urls_with_fallback, DataSource, ) from apps.scan.providers import TargetProvider logger = logging.getLogger(__name__) @task(name="export_sites") def export_sites_task( target_id: Optional[int] = None, output_file: str = "", provider: Optional[TargetProvider] = None, batch_size: int = 1000, ) -> dict: """ 导出目标下的所有站点 URL 到 TXT 文件 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从数据库导出 2. Provider 模式:传入 provider,从任意数据源导出 数据源优先级(回退链,仅传统模式): 1. WebSite 表 - 站点级别 URL 2. 默认生成 - 根据 Target 类型生成 http(s)://target_name Args: target_id: 目标 ID(传统模式,向后兼容) output_file: 输出文件路径(绝对路径) provider: TargetProvider 实例(新模式) batch_size: 每次读取的批次大小,默认 1000 Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int } Raises: ValueError: 参数错误 IOError: 文件写入失败 """ # 参数验证:至少提供一个 if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # Provider 模式:使用 TargetProvider 导出 if provider is not None: logger.info("使用 Provider 模式 - Provider: %s", type(provider).__name__) return _export_with_provider(output_file, provider) # 传统模式:使用 export_urls_with_fallback logger.info("使用传统模式 - Target ID: %d", target_id) result = export_urls_with_fallback( target_id=target_id, output_file=output_file, sources=[DataSource.WEBSITE, DataSource.DEFAULT], batch_size=batch_size, ) logger.info( "站点 URL 导出完成 - source=%s, count=%d", result['source'], result['total_count'] ) # 保持返回值格式不变(向后兼容) return { 'success': result['success'], 'output_file': result['output_file'], 'total_count': result['total_count'], } def _export_with_provider(output_file: str, provider: TargetProvider) -> dict: """使用 Provider 导出 URL""" output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) total_count = 0 blacklist_filter = provider.get_blacklist_filter() with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url in provider.iter_urls(): # 应用黑名单过滤(如果有) if blacklist_filter and not blacklist_filter.is_allowed(url): continue f.write(f"{url}\n") total_count += 1 if total_count % 1000 == 0: logger.info("已导出 %d 个 URL...", total_count) logger.info("✓ URL 导出完成 - 总数: %d, 文件: %s", total_count, str(output_path)) return { 'success': True, 'output_file': str(output_path), 'total_count': total_count, } ================================================ FILE: backend/apps/scan/tasks/directory_scan/run_and_stream_save_directories_task.py ================================================ """ 基于 execute_stream 的流式目录扫描任务 主要功能: 1. 实时执行目录扫描命令(如 ffuf) 2. 流式处理命令输出,实时解析为 Directory 记录 3. 批量保存到数据库 4. 避免生成大量临时文件,提高效率 数据流向: 命令执行 → 流式输出 → 实时解析 → 批量保存 → 数据库 输入:扫描命令及参数 输出:Directory 记录 优化策略: - 使用 execute_stream 实时处理输出 - 流式处理避免内存溢出 - 批量操作减少数据库交互 """ import logging import json import subprocess import time from pathlib import Path from prefect import task from typing import Generator, Optional, TYPE_CHECKING from django.db import IntegrityError, OperationalError, DatabaseError from psycopg2 import InterfaceError from dataclasses import dataclass from apps.asset.dtos.snapshot import DirectorySnapshotDTO from apps.scan.utils import execute_stream # 类型检查时导入,运行时不导入(避免循环依赖) if TYPE_CHECKING: from apps.asset.services.snapshot import DirectorySnapshotsService logger = logging.getLogger(__name__) @dataclass class ServiceSet: """ Service 集合,用于依赖注入 提供目录扫描所需的 Service 实例,便于测试时注入 Mock 对象 """ snapshot: "DirectorySnapshotsService" @classmethod def create_default(cls) -> "ServiceSet": """创建默认的 Service 集合""" from apps.asset.services.snapshot import DirectorySnapshotsService return cls( snapshot=DirectorySnapshotsService() ) def _parse_and_validate_line(line: str) -> Optional[dict]: """ 解析并验证单行 JSON 数据 Args: line: 单行输出数据 Returns: Optional[dict]: 有效的 ffuf 扫描记录,或 None 如果验证失败 验证步骤: 1. 解析 JSON 格式 2. 验证数据类型为字典 3. 验证必要字段(url) """ try: # 步骤 1: 解析 JSON try: line_data = json.loads(line, strict=False) except json.JSONDecodeError: # logger.debug("跳过非 JSON 行: %s", line) return None # 步骤 2: 验证数据类型 if not isinstance(line_data, dict): logger.debug("跳过非字典数据") return None # 步骤 3: 验证必要字段 if not line_data.get('url'): logger.info("URL 为空,跳过 - 数据: %s", str(line_data)[:200]) return None # 返回有效记录 return { 'url': line_data['url'], 'status': line_data.get('status'), 'length': line_data.get('length'), 'words': line_data.get('words'), 'lines': line_data.get('lines'), 'content_type': line_data.get('content-type', ''), 'duration': line_data.get('duration') } except Exception: logger.info("跳过无法解析的行: %s", line[:100]) return None def _parse_ffuf_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[dict, None, None]: """ 流式解析 ffuf 目录扫描命令输出 基于 execute_stream 实时处理 ffuf 命令的 stdout,将每行 JSON 输出 转换为 Directory 记录格式 Args: cmd: ffuf 目录扫描命令 cwd: 工作目录 shell: 是否使用 shell 执行 timeout: 命令执行超时时间(秒),None 表示不设置超时 Yields: dict: 每次 yield 一条解析后的目录记录 """ logger.info("开始流式解析 ffuf 目录扫描命令输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 valid_records = 0 try: # 使用 execute_stream 获取实时输出流(带工具名、超时控制和日志文件) for line in execute_stream(cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file): total_lines += 1 # 解析并验证单行数据 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue valid_records += 1 # yield 一条有效记录 yield record # 每处理 1000 条记录输出一次进度 if valid_records % 1000 == 0: logger.info("已解析 %d 条有效记录...", valid_records) except subprocess.TimeoutExpired as e: # 超时异常:简洁输出,不显示堆栈 error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) from e except Exception as e: # 其他异常:输出详细堆栈以便调试 logger.error("流式解析命令输出失败: %s", e, exc_info=True) raise logger.info( "流式解析完成 - 总行数: %d, 有效记录: %d, 错误行数: %d", total_lines, valid_records, error_lines ) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3 ) -> dict: """ 保存一个批次的目录扫描结果(带重试机制) Args: batch: 数据批次 scan_id: 扫描任务ID target_id: 目标ID batch_num: 批次编号 services: Service 集合(必须,依赖注入) max_retries: 最大重试次数 Returns: dict: { 'success': bool, 'created_directories': int } """ for attempt in range(max_retries): try: count = _save_batch(batch, scan_id, target_id, batch_num, services) return { 'success': True, 'created_directories': count } except IntegrityError as e: # 数据完整性错误,不应重试 logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return { 'success': False, 'created_directories': 0 } except (OperationalError, DatabaseError, InterfaceError) as e: # 数据库连接/操作错误,可重试 if attempt < max_retries - 1: wait_time = 2 ** attempt # 指数退避: 1s, 2s, 4s logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100] ) time.sleep(wait_time) else: logger.error("批次 %d 保存失败(已重试 %d 次): %s", batch_num, max_retries, e) return { 'success': False, 'created_directories': 0 } except Exception as e: # 其他未知错误 - 检查是否为连接问题 error_str = str(e).lower() if 'connection' in error_str and attempt < max_retries - 1: logger.warning( "批次 %d 连接相关错误(尝试 %d/%d): %s,Repository 装饰器会自动重连", batch_num, attempt + 1, max_retries, str(e) ) time.sleep(2) else: logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) return { 'success': False, 'created_directories': 0 } return { 'success': False, 'created_directories': 0 } def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet ) -> int: """ 保存一个批次的数据到数据库(使用快照 Service) 数据关系链: Target → DirectorySnapshot (待创建) → Directory (自动同步) 处理流程: 1. 构建 DirectorySnapshotDTO:包含 scan_id 和 target_id 2. 调用快照 Service:save_and_sync() 自动保存快照并同步到资产表 Args: batch: 数据批次,list of dict scan_id: 扫描任务 ID target_id: 目标 ID batch_num: 批次编号(用于日志) services: Service 集合(依赖注入) Returns: int: 创建的记录数 """ if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return 0 # ========== Step 1: 准备 DirectorySnapshot 数据(内存操作,无需事务)========== # 使用列表推导式构建 DTO 列表 snapshot_items = [ DirectorySnapshotDTO( scan_id=scan_id, target_id=target_id, url=record['url'], status=record.get('status'), content_length=record.get('length'), words=record.get('words'), lines=record.get('lines'), content_type=record.get('content_type', ''), duration=record.get('duration') ) for record in batch ] # ========== Step 2: 保存快照并同步到资产表(通过快照 Service)========== if snapshot_items: services.snapshot.save_and_sync(snapshot_items) return len(snapshot_items) @task( name='run_and_stream_save_directories', retries=0, log_prints=True ) def run_and_stream_save_directories_task( cmd: str, tool_name: str, scan_id: int, target_id: int, site_url: str, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 1000, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> dict: """ 执行 ffuf 目录扫描命令并流式保存结果到数据库 该任务将: 1. 通过 site_url 查找对应的 WebSite 对象 2. 流式解析 ffuf 输出(JSON 格式) 3. 批量保存到 Directory 表 Args: cmd: ffuf 目录扫描命令 scan_id: 扫描任务 ID target_id: 目标 ID site_url: 当前站点 URL cwd: 工作目录(可选) shell: 是否使用 shell 执行(默认 False) batch_size: 批量保存大小(默认1000) timeout: 命令执行超时时间(秒),None 表示不设置超时 Returns: dict: { 'processed_records': int, # 处理的记录总数 'created_directories': int, # 创建的目录记录数 'site_url': str # 当前站点 URL } Raises: ValueError: 参数验证失败 RuntimeError: 命令执行或数据库操作失败 subprocess.TimeoutExpired: 命令执行超时 """ logger.info( "开始执行流式目录扫描任务 - site_url=%s, 超时=%s秒", site_url, timeout if timeout else '无限制' ) data_generator = None try: # 1. 初始化服务 services = ServiceSet.create_default() # 2. 初始化资源(不再需要查找 WebSite,Directory 直接关联 Target) data_generator = _parse_ffuf_stream_output(cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file) # 3. 流式处理记录并分批保存 total_records = 0 batch_num = 0 failed_batches = [] batch = [] total_created = 0 for record in data_generator: batch.append(record) total_records += 1 # 达到批次大小,执行保存 if len(batch) >= batch_size: batch_num += 1 result = _save_batch_with_retry( batch, scan_id, target_id, batch_num, services ) total_created += result.get('created_directories', 0) if not result['success']: failed_batches.append(batch_num) batch = [] # 清空批次 # 每20个批次输出进度 if batch_num % 20 == 0: logger.info( "进度: 已处理 %d 批次,%d 条记录", batch_num, total_records ) # 保存最后一批 if batch: batch_num += 1 result = _save_batch_with_retry( batch, scan_id, target_id, batch_num, services ) total_created += result.get('created_directories', 0) if not result['success']: failed_batches.append(batch_num) # 检查失败批次 if failed_batches: logger.warning( "部分批次保存失败 - 站点: %s, 失败批次: %s", site_url, failed_batches ) logger.info( "✓ 流式保存完成 - 站点: %s, 处理记录: %d(%d 批次),创建目录: %d", site_url, total_records, batch_num, total_created ) return { 'processed_records': total_records, 'created_directories': total_created, 'site_url': site_url } except subprocess.TimeoutExpired: # 超时异常直接向上传播,保留异常类型 logger.warning( "⚠️ 目录扫描任务超时 - site_url=%s, 超时=%s秒", site_url, timeout ) raise except Exception as e: error_msg = f"流式执行目录扫描任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: # 清理资源 if data_generator is not None: try: data_generator.close() logger.debug("已关闭数据生成器") except Exception as gen_close_error: logger.error("关闭生成器时出错: %s", gen_close_error) ================================================ FILE: backend/apps/scan/tasks/fingerprint_detect/__init__.py ================================================ """ 指纹识别任务模块 包含: - export_urls_for_fingerprint_task: 导出 URL 到文件 - run_xingfinger_and_stream_update_tech_task: 流式执行 xingfinger 并更新 tech """ from .export_urls_task import export_urls_for_fingerprint_task from .run_xingfinger_task import run_xingfinger_and_stream_update_tech_task __all__ = [ 'export_urls_for_fingerprint_task', 'run_xingfinger_and_stream_update_tech_task', ] ================================================ FILE: backend/apps/scan/tasks/fingerprint_detect/export_urls_task.py ================================================ """ 导出 URL 任务 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 用于指纹识别前导出目标下的 URL 到文件 """ import logging from typing import Optional from pathlib import Path from prefect import task from apps.scan.services.target_export_service import ( export_urls_with_fallback, DataSource, ) from apps.scan.providers import TargetProvider, DatabaseTargetProvider logger = logging.getLogger(__name__) @task(name="export_urls_for_fingerprint") def export_urls_for_fingerprint_task( target_id: Optional[int] = None, output_file: str = "", source: str = 'website', # 保留参数,兼容旧调用(实际值由回退链决定) provider: Optional[TargetProvider] = None, batch_size: int = 1000 ) -> dict: """ 导出目标下的 URL 到文件(用于指纹识别) 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从数据库导出 2. Provider 模式:传入 provider,从任意数据源导出 数据源优先级(回退链,仅传统模式): 1. WebSite 表 - 站点级别 URL 2. 默认生成 - 根据 Target 类型生成 http(s)://target_name Args: target_id: 目标 ID(传统模式,向后兼容) output_file: 输出文件路径 source: 数据源类型(保留参数,兼容旧调用,实际值由回退链决定) provider: TargetProvider 实例(新模式) batch_size: 批量读取大小 Returns: dict: {'output_file': str, 'total_count': int, 'source': str} """ # 参数验证:至少提供一个 if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # Provider 模式:使用 TargetProvider 导出 if provider is not None: logger.info("使用 Provider 模式 - Provider: %s", type(provider).__name__) return _export_with_provider(output_file, provider) # 传统模式:使用 export_urls_with_fallback logger.info("使用传统模式 - Target ID: %d", target_id) result = export_urls_with_fallback( target_id=target_id, output_file=output_file, sources=[DataSource.WEBSITE, DataSource.DEFAULT], batch_size=batch_size, ) logger.info( "指纹识别 URL 导出完成 - source=%s, count=%d", result['source'], result['total_count'] ) # 返回实际使用的数据源(不再固定为 "website") return { 'output_file': result['output_file'], 'total_count': result['total_count'], 'source': result['source'], } def _export_with_provider(output_file: str, provider: TargetProvider) -> dict: """使用 Provider 导出 URL""" output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) total_count = 0 blacklist_filter = provider.get_blacklist_filter() with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url in provider.iter_urls(): # 应用黑名单过滤(如果有) if blacklist_filter and not blacklist_filter.is_allowed(url): continue f.write(f"{url}\n") total_count += 1 if total_count % 1000 == 0: logger.info("已导出 %d 个 URL...", total_count) logger.info("✓ URL 导出完成 - 总数: %d, 文件: %s", total_count, str(output_path)) return { 'output_file': str(output_path), 'total_count': total_count, 'source': 'provider', } ================================================ FILE: backend/apps/scan/tasks/fingerprint_detect/run_xingfinger_task.py ================================================ """ xingfinger 执行任务 流式执行 xingfinger 命令并实时更新 tech 字段 """ import json import logging import subprocess from typing import Optional, Generator from urllib.parse import urlparse from django.db import connection from prefect import task from apps.scan.utils import execute_stream from apps.asset.dtos.snapshot import WebsiteSnapshotDTO from apps.asset.repositories.snapshot import DjangoWebsiteSnapshotRepository logger = logging.getLogger(__name__) def parse_xingfinger_line(line: str) -> dict | None: """ 解析 xingfinger 单行 JSON 输出 xingfinger 输出格式: {"url": "...", "cms": "...", "server": "BWS/1.1", "status_code": 200, "length": 642831, "title": "..."} Returns: dict: 包含 url, techs, server, title, status_code, content_length 的字典 None: 解析失败或 URL 为空时 """ try: item = json.loads(line) url = item.get('url', '').strip() if not url: return None # cms 字段按逗号分割,去除空白 cms = item.get('cms', '') techs = [t.strip() for t in cms.split(',') if t.strip()] if cms else [] return { 'url': url, 'techs': techs, 'server': item.get('server', ''), 'title': item.get('title', ''), 'status_code': item.get('status_code'), 'content_length': item.get('length'), } except json.JSONDecodeError: return None def bulk_merge_website_fields( records: list[dict], target_id: int ) -> dict: """ 批量合并更新 WebSite 字段(PostgreSQL 原生 SQL) 合并策略: - tech:数组合并去重 - title, webserver, status_code, content_length:只在原值为空/NULL 时更新 如果 URL 对应的记录不存在,会自动创建新记录。 Args: records: 解析后的记录列表,每个包含 {url, techs, server, title, status_code, content_length} target_id: 目标 ID Returns: dict: {'updated_count': int, 'created_count': int} """ from apps.asset.models import WebSite table_name = WebSite._meta.db_table updated_count = 0 created_count = 0 with connection.cursor() as cursor: for record in records: url = record['url'] techs = record.get('techs', []) server = record.get('server', '') or '' title = record.get('title', '') or '' status_code = record.get('status_code') content_length = record.get('content_length') # 先尝试更新(合并策略) update_sql = f""" UPDATE {table_name} SET tech = (SELECT ARRAY(SELECT DISTINCT unnest( COALESCE(tech, ARRAY[]::varchar[]) || %s::varchar[] ))), title = CASE WHEN title = '' OR title IS NULL THEN %s ELSE title END, webserver = CASE WHEN webserver = '' OR webserver IS NULL THEN %s ELSE webserver END, status_code = CASE WHEN status_code IS NULL THEN %s ELSE status_code END, content_length = CASE WHEN content_length IS NULL THEN %s ELSE content_length END WHERE url = %s AND target_id = %s """ cursor.execute(update_sql, [techs, title, server, status_code, content_length, url, target_id]) if cursor.rowcount > 0: updated_count += cursor.rowcount else: # 记录不存在,创建新记录 try: # 从 URL 提取 host parsed = urlparse(url) host = parsed.hostname or '' # 插入新记录(带冲突处理) insert_sql = f""" INSERT INTO {table_name} ( target_id, url, host, location, title, webserver, response_body, content_type, tech, status_code, content_length, response_headers, created_at ) VALUES (%s, %s, %s, '', %s, %s, '', '', %s::varchar[], %s, %s, '', NOW()) ON CONFLICT (target_id, url) DO UPDATE SET tech = (SELECT ARRAY(SELECT DISTINCT unnest( COALESCE({table_name}.tech, ARRAY[]::varchar[]) || EXCLUDED.tech ))), title = CASE WHEN {table_name}.title = '' OR {table_name}.title IS NULL THEN EXCLUDED.title ELSE {table_name}.title END, webserver = CASE WHEN {table_name}.webserver = '' OR {table_name}.webserver IS NULL THEN EXCLUDED.webserver ELSE {table_name}.webserver END, status_code = CASE WHEN {table_name}.status_code IS NULL THEN EXCLUDED.status_code ELSE {table_name}.status_code END, content_length = CASE WHEN {table_name}.content_length IS NULL THEN EXCLUDED.content_length ELSE {table_name}.content_length END """ cursor.execute(insert_sql, [target_id, url, host, title, server, techs, status_code, content_length]) created_count += 1 except Exception as e: logger.warning("创建 WebSite 记录失败 (url=%s): %s", url, e) return { 'updated_count': updated_count, 'created_count': created_count } def _parse_xingfinger_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[dict, None, None]: """ 流式解析 xingfinger 命令输出 基于 execute_stream 实时处理 xingfinger 命令的 stdout,将每行 JSON 输出 转换为完整字段字典 """ logger.info("开始流式解析 xingfinger 命令输出 - 命令: %s", cmd) total_lines = 0 valid_records = 0 try: for line in execute_stream(cmd=cmd, tool_name=tool_name, cwd=cwd, shell=True, timeout=timeout, log_file=log_file): total_lines += 1 # 解析单行 JSON result = parse_xingfinger_line(line) if result is None: continue valid_records += 1 yield result # 每处理 500 条记录输出一次进度 if valid_records % 500 == 0: logger.info("已解析 %d 条有效记录...", valid_records) except subprocess.TimeoutExpired as e: error_msg = f"xingfinger 命令执行超时 - 超过 {timeout} 秒" logger.warning(error_msg) raise RuntimeError(error_msg) from e except Exception as e: logger.error("流式解析 xingfinger 输出失败: %s", e, exc_info=True) raise logger.info("流式解析完成 - 总行数: %d, 有效记录: %d", total_lines, valid_records) @task(name="run_xingfinger_and_stream_update_tech") def run_xingfinger_and_stream_update_tech_task( cmd: str, tool_name: str, scan_id: int, target_id: int, source: str, cwd: str, timeout: int, log_file: str, batch_size: int = 100 ) -> dict: """ 流式执行 xingfinger 命令,保存快照并合并更新资产表 处理流程: 1. 流式执行 xingfinger 命令 2. 实时解析 JSON 输出(完整字段) 3. 累积到 batch_size 条后批量处理: - 保存快照(WebsiteSnapshot) - 合并更新资产表(WebSite) 合并策略: - tech:数组合并去重 - title, webserver, status_code, content_length:只在原值为空时更新 Returns: dict: { 'processed_records': int, 'updated_count': int, 'created_count': int, 'snapshot_count': int, 'batch_count': int } """ logger.info( "开始执行 xingfinger - scan_id=%s, target_id=%s, timeout=%s秒", scan_id, target_id, timeout ) data_generator = None snapshot_repo = DjangoWebsiteSnapshotRepository() try: # 初始化统计 processed_records = 0 updated_count = 0 created_count = 0 snapshot_count = 0 batch_count = 0 # 当前批次的记录列表 batch_records = [] # 流式处理 data_generator = _parse_xingfinger_stream_output( cmd=cmd, tool_name=tool_name, cwd=cwd, timeout=timeout, log_file=log_file ) for record in data_generator: processed_records += 1 batch_records.append(record) # 达到批次大小,执行批量处理 if len(batch_records) >= batch_size: batch_count += 1 result = _process_batch( batch_records, scan_id, target_id, batch_count, snapshot_repo ) updated_count += result['updated_count'] created_count += result['created_count'] snapshot_count += result['snapshot_count'] # 清空批次 batch_records = [] # 处理最后一批 if batch_records: batch_count += 1 result = _process_batch( batch_records, scan_id, target_id, batch_count, snapshot_repo ) updated_count += result['updated_count'] created_count += result['created_count'] snapshot_count += result['snapshot_count'] logger.info( "✓ xingfinger 执行完成 - 处理: %d, 更新: %d, 创建: %d, 快照: %d, 批次: %d", processed_records, updated_count, created_count, snapshot_count, batch_count ) return { 'processed_records': processed_records, 'updated_count': updated_count, 'created_count': created_count, 'snapshot_count': snapshot_count, 'batch_count': batch_count } except subprocess.TimeoutExpired: logger.warning("⚠️ xingfinger 执行超时 - target_id=%s, timeout=%s秒", target_id, timeout) raise except Exception as e: error_msg = f"xingfinger 执行失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: # 清理资源 if data_generator is not None: try: data_generator.close() except Exception as e: logger.debug("关闭生成器时出错: %s", e) def _process_batch( records: list[dict], scan_id: int, target_id: int, batch_num: int, snapshot_repo: DjangoWebsiteSnapshotRepository ) -> dict: """ 处理一个批次的数据:保存快照 + 合并更新资产表 Args: records: 解析后的记录列表 scan_id: 扫描任务 ID target_id: 目标 ID batch_num: 批次编号 snapshot_repo: 快照仓库 Returns: dict: {'updated_count': int, 'created_count': int, 'snapshot_count': int} """ # 1. 构建快照 DTO 列表 snapshot_dtos = [] for record in records: # 从 URL 提取 host parsed = urlparse(record['url']) host = parsed.hostname or '' dto = WebsiteSnapshotDTO( scan_id=scan_id, target_id=target_id, url=record['url'], host=host, title=record.get('title', '') or '', status_code=record.get('status_code'), content_length=record.get('content_length'), webserver=record.get('server', '') or '', tech=record.get('techs', []), ) snapshot_dtos.append(dto) # 2. 保存快照 snapshot_count = 0 if snapshot_dtos: try: snapshot_repo.save_snapshots(snapshot_dtos) snapshot_count = len(snapshot_dtos) except Exception as e: logger.warning("批次 %d 保存快照失败: %s", batch_num, e) # 3. 合并更新资产表 merge_result = bulk_merge_website_fields(records, target_id) logger.debug( "批次 %d 完成 - 更新: %d, 创建: %d, 快照: %d", batch_num, merge_result['updated_count'], merge_result['created_count'], snapshot_count ) return { 'updated_count': merge_result['updated_count'], 'created_count': merge_result['created_count'], 'snapshot_count': snapshot_count } ================================================ FILE: backend/apps/scan/tasks/port_scan/__init__.py ================================================ """ 端口扫描相关 Tasks 提供端口扫描流程所需的原子化任务 """ from .export_hosts_task import export_hosts_task from .run_and_stream_save_ports_task import run_and_stream_save_ports_task from .types import PortScanRecord __all__ = [ 'export_hosts_task', 'run_and_stream_save_ports_task', 'PortScanRecord', ] ================================================ FILE: backend/apps/scan/tasks/port_scan/export_hosts_task.py ================================================ """ 导出主机列表到 TXT 文件的 Task 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 根据 Target 类型决定导出内容: - DOMAIN: 从 Subdomain 表导出子域名 - IP: 直接写入 target.name - CIDR: 展开 CIDR 范围内的所有 IP """ import logging from pathlib import Path from typing import Optional from prefect import task from apps.scan.providers import DatabaseTargetProvider, TargetProvider logger = logging.getLogger(__name__) @task(name="export_hosts") def export_hosts_task( output_file: str, target_id: Optional[int] = None, provider: Optional[TargetProvider] = None, ) -> dict: """ 导出主机列表到 TXT 文件 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从数据库导出 2. Provider 模式:传入 provider,从任意数据源导出 根据 Target 类型自动决定导出内容: - DOMAIN: 从 Subdomain 表导出子域名(流式处理,支持 10万+ 域名) - IP: 直接写入 target.name(单个 IP) - CIDR: 展开 CIDR 范围内的所有可用 IP Args: output_file: 输出文件路径(绝对路径) target_id: 目标 ID(传统模式,向后兼容) provider: TargetProvider 实例(新模式) Returns: dict: { 'success': bool, 'output_file': str, 'total_count': int, 'target_type': str # 仅传统模式返回 } Raises: ValueError: 参数错误(target_id 和 provider 都未提供) IOError: 文件写入失败 """ if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # 向后兼容:如果没有提供 provider,使用 target_id 创建 DatabaseTargetProvider use_legacy_mode = provider is None if use_legacy_mode: logger.info("使用传统模式 - Target ID: %d", target_id) provider = DatabaseTargetProvider(target_id=target_id) else: logger.info("使用 Provider 模式 - Provider: %s", type(provider).__name__) # 确保输出目录存在 output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) # 使用 Provider 导出主机列表(iter_hosts 内部已处理黑名单过滤) total_count = 0 with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for host in provider.iter_hosts(): f.write(f"{host}\n") total_count += 1 if total_count % 1000 == 0: logger.info("已导出 %d 个主机...", total_count) logger.info("✓ 主机列表导出完成 - 总数: %d, 文件: %s", total_count, str(output_path)) result = { 'success': True, 'output_file': str(output_path), 'total_count': total_count, } # 传统模式:保持返回值格式不变(向后兼容) if use_legacy_mode: from apps.targets.services import TargetService target = TargetService().get_target(target_id) result['target_type'] = target.type if target else 'unknown' return result ================================================ FILE: backend/apps/scan/tasks/port_scan/run_and_stream_save_ports_task.py ================================================ """ 基于 stream_command 的流式端口扫描任务(简化版) 主要功能: 1. 实时执行端口扫描命令(如 naabu) 2. 流式处理命令输出,实时解析为 PortScanRecord 3. 批量保存到数据库(HostPortAssociation + HostPortAssociationSnapshot) 4. 避免生成大量临时文件,提高效率 数据流向: 命令执行 → 流式输出 → 实时解析 → 批量保存 → 数据库 输入:扫描命令及参数 输出:HostPortAssociation(资产表)+ HostPortAssociationSnapshot(快照表) 优化策略: - 使用 stream_command 实时处理输出 - 直接存储 host + ip + port 组合,不维护复杂关系 - 流式处理避免内存溢出 - 批量操作减少数据库交互 """ import logging import json import subprocess import time from asyncio import CancelledError from pathlib import Path from prefect import task from typing import Generator, List, Optional, TYPE_CHECKING from django.db import IntegrityError, OperationalError, DatabaseError from psycopg2 import InterfaceError from dataclasses import dataclass from .types import PortScanRecord from apps.scan.utils import execute_stream from apps.common.validators import validate_port from apps.common.definitions import ScanStatus from apps.scan.models import Scan # 类型检查时导入,运行时不导入(避免循环依赖) if TYPE_CHECKING: from apps.asset.services.snapshot import HostPortMappingSnapshotsService logger = logging.getLogger(__name__) @dataclass class ServiceSet: """ Service 集合,用于依赖注入 提供所有需要的 Service 实例,便于测试时注入 Mock 对象 """ snapshot: "HostPortMappingSnapshotsService" @classmethod def create_default(cls) -> "ServiceSet": """创建默认的 Service 集合""" from apps.asset.services.snapshot import HostPortMappingSnapshotsService return cls( snapshot=HostPortMappingSnapshotsService() ) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3 ) -> dict: """ 保存一个批次的端口扫描结果(带重试机制) Args: batch: 数据批次 scan_id: 扫描任务ID target_id: 目标ID batch_num: 批次编号 services: Service 集合(必须,包含 HostPortAssociationSnapshotsService) max_retries: 最大重试次数 Returns: dict: {'success': bool} """ for attempt in range(max_retries): try: result = _save_batch(batch, scan_id, target_id, batch_num, services) return result # {'success': True} except IntegrityError as e: # 数据完整性错误,不应重试(IntegrityError 是 DatabaseError 的子类,需先处理) logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return {'success': False} except (OperationalError, DatabaseError) as e: # 数据库连接/操作错误,可重试 if attempt < max_retries - 1: wait_time = 2 ** attempt # 指数退避: 1s, 2s, 4s logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100] ) time.sleep(wait_time) else: logger.error("批次 %d 保存失败(已重试 %d 次): %s", batch_num, max_retries, e) return {'success': False} except Exception as e: # 其他未知错误 logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) return {'success': False} return {'success': False} def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet # Service集合(依赖注入) ) -> dict: """ 保存一个批次的端口扫描数据到数据库(使用 Service 架构) 数据存储: 使用 HostPortAssociationSnapshotsService.save_and_sync() 自动保存到快照表并同步到资产表 处理流程: 1. 构建 HostPortAssociationSnapshotDTO 列表 2. 调用 service.save_and_sync() 统一处理 - 保存到快照表(scan_id) - 同步到资产表(target_id) Args: batch: 数据批次,list of {'host', 'ip', 'port'} scan_id: 扫描任务 ID target_id: 目标 ID batch_num: 批次编号(用于日志) services: Service 集合(包含 HostPortAssociationSnapshotsService) Returns: dict: {'success': bool} Raises: TypeError: batch 参数类型错误 IntegrityError: 数据完整性错误 OperationalError: 数据库操作错误 DatabaseError: 其他数据库错误 Note: 此函数不包含重试逻辑,由外层 _save_batch_with_retry 负责重试 Strategy: 使用 bulk_create + ignore_conflicts - 新记录:插入 - 重复记录:忽略(不更新) """ from apps.asset.dtos.snapshot import HostPortMappingSnapshotDTO # 参数验证 if not isinstance(batch, list): raise TypeError(f"batch 必须是 list 类型,实际: {type(batch).__name__}") if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return {'success': True} # 构建 DTO 列表(包含完整的业务上下文) items = [ HostPortMappingSnapshotDTO( scan_id=scan_id, target_id=target_id, # 包含 target_id 用于同步到资产表 host=record['host'], ip=record['ip'], port=record['port'] ) for record in batch ] # 调用 Service 统一处理(保存快照 + 同步资产) # DTO 已包含 target_id,无需额外传参 services.snapshot.save_and_sync(items) logger.debug("批次 %d: 已处理 %d 条记录", batch_num, len(batch)) return {'success': True} def _parse_and_validate_line(line: str) -> Optional[PortScanRecord]: """ 解析并验证单行 JSON 数据 Args: line: 单行输出数据 Returns: Optional[PortScanRecord]: 有效的端口扫描记录,或 None 如果验证失败 验证步骤: 1. 解析 JSON 格式 2. 验证数据类型为字典 3. 提取必要字段(host, ip, port) 4. 验证字段不为空 5. 验证端口号有效性 """ try: # 步骤 1: 解析 JSON try: line_data = json.loads(line, strict=False) except json.JSONDecodeError: # logger.info("跳过非 JSON 行: %s", line) return None # 步骤 2: 验证数据类型 if not isinstance(line_data, dict): logger.info("跳过非字典数据") return None # 步骤 3: 提取必要字段 host = line_data.get('host', '').strip() ip = line_data.get('ip', '').strip() port = line_data.get('port') logger.debug("解析到的主机名: %s, IP: %s, 端口: %s", host, ip, port) if not host and ip: host = ip logger.debug("主机名为空,使用 IP 作为 host") # 步骤 4: 验证字段不为空 if not host or not ip or port is None: logger.info("跳过缺少必要字段的记录") return None # 步骤 5: 验证端口号有效性 is_valid, port_num = validate_port(port) if not is_valid: return None # 返回有效记录 return { 'host': host, 'ip': ip, 'port': port_num, } except Exception: logger.info("跳过无法解析的行: %s", line[:100]) return None def _parse_naabu_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[PortScanRecord, None, None]: """ 流式解析 naabu 端口扫描命令输出 基于 stream_command 实时处理 naabu 命令的 stdout,将每行 JSON 输出 转换为 PortScanRecord 格式,沿用现有字段校验逻辑 Args: cmd: naabu 端口扫描命令(如: "naabu -l domains.txt -json") tool_name: 工具名称(如: "naabu") cwd: 工作目录 shell: 是否使用 shell 执行 timeout: 命令执行超时时间(秒),None 表示不设置超时 log_file: 日志文件路径(可选) Yields: PortScanRecord: 每次 yield 一条解析后的端口记录,格式: { 'host': str, # 域名 'ip': str, # IP地址 'port': int, # 端口号 } """ logger.info("开始流式解析 naabu 端口扫描命令输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 last_log_time = time.time() # 添加:记录上次日志时间 try: # 使用 execute_stream 获取实时输出流(带工具名、超时控制和日志文件) for line in execute_stream(cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file): total_lines += 1 try: # 解析并验证单行数据 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue # yield 一条有效记录 yield record # 添加:每100条记录输出一次处理速度统计 if total_lines % 100 == 0: current_time = time.time() elapsed = current_time - last_log_time logger.info( "流式处理进度 - 已处理: %d 行, 有效记录: %d, 错误: %d, 速度: %.1f 行/秒", total_lines, total_lines - error_lines, error_lines, 100 / elapsed if elapsed > 0 else 0 ) last_log_time = current_time except (json.JSONDecodeError, ValueError, KeyError): # 数据解析错误(可恢复):记录信息但继续处理后续数据 error_lines += 1 logger.info("跳过无法解析的行: %s", line) continue except subprocess.TimeoutExpired as e: # 超时异常:简洁输出,不显示堆栈 error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) from e except (IOError, OSError) as e: # IO错误(致命):无法继续读取数据流 logger.error("流式解析IO错误: %s", e, exc_info=True) raise RuntimeError(f"流式解析IO错误: {e}") from e except (BrokenPipeError, ConnectionError) as e: # 连接错误(致命):进程异常终止或管道断开 logger.error("流式解析连接错误(进程可能异常终止): %s", e, exc_info=True) raise RuntimeError(f"流式解析连接错误: {e}") from e except Exception as e: # 未预期的异常:输出详细堆栈以便调试 logger.error( "流式解析命令输出失败(未预期的异常): %s", e, exc_info=True ) raise logger.info( "流式解析完成 - 总行数: %d, 错误行数: %d", total_lines, error_lines, ) def _validate_task_parameters(cmd: str, target_id: int, scan_id: int, cwd: Optional[str]) -> None: """ 验证任务参数的有效性 Args: cmd: 扫描命令 target_id: 目标ID scan_id: 扫描ID cwd: 工作目录 Raises: ValueError: 参数验证失败 """ if not cmd or not cmd.strip(): raise ValueError("扫描命令不能为空") if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") if scan_id is None: raise ValueError("scan_id 不能为 None,必须指定扫描ID") # 验证工作目录(如果指定) if cwd and not Path(cwd).exists(): raise ValueError(f"工作目录不存在: {cwd}") def _accumulate_batch_stats(total_stats: dict, batch_result: dict) -> None: """ 累加批次统计信息 Args: total_stats: 总统计信息字典 batch_result: 批次结果字典 """ total_stats['created_ips'] += batch_result.get('created_ips', 0) total_stats['created_ports'] += batch_result.get('created_ports', 0) total_stats['skipped_no_subdomain'] += batch_result.get('skipped_no_subdomain', 0) total_stats['skipped_no_ip'] += batch_result.get('skipped_no_ip', 0) def _process_batch( batch: list, scan_id: int, target_id: int, batch_num: int, total_stats: dict, failed_batches: list, services: ServiceSet ) -> None: """ 处理单个批次 Args: batch: 数据批次 scan_id: 扫描ID target_id: 目标ID batch_num: 批次编号 total_stats: 总统计信息 failed_batches: 失败批次列表 services: Service 集合(必须,依赖注入) """ result = _save_batch_with_retry( batch, scan_id, target_id, batch_num, services ) # 累计统计信息(失败时可能有部分数据已保存) _accumulate_batch_stats(total_stats, result) if not result['success']: failed_batches.append(batch_num) logger.warning( "批次 %d 保存失败,但已累计统计信息:创建IP=%d, 创建端口=%d", batch_num, result.get('created_ips', 0), result.get('created_ports', 0) ) def _process_records_in_batches( data_generator, scan_id: int, target_id: int, batch_size: int, services: ServiceSet ) -> dict: """ 流式处理记录并分批保存 Args: data_generator: 数据生成器 scan_id: 扫描ID target_id: 目标ID batch_size: 批次大小 services: Service 集合(必须,依赖注入) Returns: dict: 处理统计信息 Raises: RuntimeError: 存在失败批次时抛出 subprocess.TimeoutExpired: 命令执行超时(部分数据已保存) Note: 如果发生超时,已处理的数据会被保留在数据库中, 但扫描任务会被标记为失败。这是预期行为。 """ total_records = 0 batch_num = 0 failed_batches = [] batch = [] cancel_check_interval = 50 # 每处理50条检查一次取消信号 # 统计信息 total_stats = { 'created_ips': 0, 'created_ports': 0, 'skipped_no_subdomain': 0, 'skipped_no_ip': 0 } # 流式读取生成器并分批保存 # 注意:如果超时,subprocess.TimeoutExpired 会从 data_generator 中抛出 # 此时已处理的数据已经保存到数据库 for record in data_generator: # 周期性检查取消信号,协作式终止 if cancel_check_interval > 0 and (total_records % cancel_check_interval == 0): _raise_if_cancelled(scan_id) batch.append(record) total_records += 1 # 达到批次大小,执行保存 if len(batch) >= batch_size: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) batch = [] # 清空批次 # 每20个批次输出进度 if batch_num % 20 == 0: logger.info("进度: 已处理 %d 批次,%d 条记录", batch_num, total_records) # 保存最后一批 if batch: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) # 最后再检查一次取消信号,避免在尾部卡住 _raise_if_cancelled(scan_id) # 检查失败批次 if failed_batches: error_msg = ( f"流式保存端口扫描结果时出现失败批次,处理记录: {total_records}," f"失败批次: {failed_batches}" ) logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) return { 'processed_records': total_records, 'batch_count': batch_num, **total_stats } def _build_final_result(stats: dict) -> dict: """ 构建最终结果并输出日志 Args: stats: 处理统计信息 Returns: dict: 最终结果 """ logger.info( "✓ 流式保存完成 - 处理记录: %d(%d 批次),创建IP: %d,创建端口: %d,跳过(无域名): %d,跳过(无IP): %d", stats['processed_records'], stats['batch_count'], stats['created_ips'], stats['created_ports'], stats['skipped_no_subdomain'], stats['skipped_no_ip'] ) # 如果没有创建任何记录,给出明确提示 if stats['created_ips'] == 0 and stats['created_ports'] == 0: logger.warning( "⚠️ 没有创建任何记录!可能原因:1) 域名不在数据库中 2) 命令输出格式问题 3) 重复数据被忽略" ) return { 'processed_records': stats['processed_records'], 'created_ips': stats['created_ips'], 'created_ports': stats['created_ports'], 'skipped_no_subdomain': stats['skipped_no_subdomain'], 'skipped_no_ip': stats['skipped_no_ip'] } def _cleanup_resources(data_generator) -> None: """ 清理任务资源 Args: data_generator: 数据生成器(可以为 None) Note: 此函数设计为幂等且安全: - 可以多次调用 - 接受 None 值 - 捕获所有异常,不会导致 finally 块失败 """ # 确保生成器被正确关闭 if data_generator is None: logger.debug("数据生成器为 None,无需清理") return try: data_generator.close() logger.debug("✓ 已成功关闭数据生成器") except StopIteration: # 生成器已经正常结束,这是预期行为 logger.debug("数据生成器已正常结束") except GeneratorExit: # 生成器已经被关闭,这是预期行为 logger.debug("数据生成器已被关闭") except Exception as gen_close_error: # 未预期的错误:记录但不抛出,避免掩盖原始异常 logger.error( "⚠️ 关闭生成器时出错(此错误不会影响任务结果): %s", gen_close_error, exc_info=True ) @task( name='run_and_stream_save_ports', retries=0, log_prints=True ) def run_and_stream_save_ports_task( cmd: str, tool_name: str, scan_id: int, target_id: int, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 1000, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> dict: """ 执行端口扫描命令并流式保存结果到数据库 该任务将: 1. 验证输入参数 2. 初始化资源(缓存、生成器) 3. 流式处理记录并分批保存 4. 构建并返回结果统计 Args: cmd: 端口扫描命令(如: "naabu -l domains.txt -json") tool_name: 工具名称(如: "naabu") scan_id: 扫描任务 ID target_id: 目标 ID cwd: 工作目录(可选) shell: 是否使用 shell 执行(默认 False) batch_size: 批量保存大小(默认1000) timeout: 命令执行超时时间(秒),None 表示不设置超时 log_file: 日志文件路径(可选) Returns: dict: { 'processed_records': int, # 处理的记录总数 'created_ips': int, # 创建的IP记录数 'created_ports': int, # 创建的端口记录数 'skipped_no_subdomain': int, # 因域名不存在跳过的记录数 'skipped_no_ip': int, # 因IP不存在跳过的记录数 } Raises: ValueError: 参数验证失败 RuntimeError: 命令执行或数据库操作失败 subprocess.TimeoutExpired: 命令执行超时 Performance: - 流式处理,实时解析命令输出 - 内存占用恒定(只存储一个 batch) - 复用现有的批次保存和重试逻辑 - 使用事务确保数据一致性 """ logger.info( "开始执行流式端口扫描任务 - target_id=%s, 超时=%s秒, 命令: %s", target_id, timeout if timeout else '无限制', cmd ) data_generator = None try: # 1. 验证参数 _validate_task_parameters(cmd, target_id, scan_id, cwd) # 2. 初始化资源 data_generator = _parse_naabu_stream_output(cmd, tool_name, cwd, shell, timeout, log_file) services = ServiceSet.create_default() # 3. 流式处理记录并分批保存 stats = _process_records_in_batches( data_generator, scan_id, target_id, batch_size, services ) # 4. 构建最终结果 return _build_final_result(stats) except CancelledError: # Prefect 取消信号:终止任务并标记为取消(让上层 handler 触发状态更新) logger.warning( "⚠️ 端口扫描任务检测到取消信号,正在终止 - scan_id=%s, target_id=%s", scan_id, target_id ) raise except subprocess.TimeoutExpired: # 超时异常:部分数据已保存,但扫描未完成 # 这是预期行为:流式处理会实时保存已解析的数据 logger.warning( "⚠️ 端口扫描任务超时 - target_id=%s, 超时=%s秒\n" "注意:超时前已解析的数据已保存到数据库,但扫描未完全完成。\n" "建议:增加超时时间或减少扫描目标数量。", target_id, timeout ) raise # 直接重新抛出,保留异常类型 except Exception as e: error_msg = f"流式执行端口扫描任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: # 5. 清理资源 _cleanup_resources(data_generator) def _raise_if_cancelled(scan_id: int) -> None: """检测扫描是否已请求取消,若已取消则抛出 CancelledError 以触发 Prefect 取消流程。""" status = Scan.objects.filter(id=scan_id).values_list("status", flat=True).first() if status == ScanStatus.CANCELLED: logger.warning("检测到取消信号,终止端口扫描 - scan_id=%s", scan_id) raise CancelledError() ================================================ FILE: backend/apps/scan/tasks/port_scan/types.py ================================================ """ 端口扫描相关类型定义 定义端口扫描流程中的数据结构,确保类型安全 """ from typing import TypedDict class PortScanRecord(TypedDict): """ 端口扫描记录类型定义 说明: 这是端口扫描的标准输出格式,包含: - host: 被扫描的域名 - ip: 域名解析后的 IP 地址(扫描工具自动解析) - port: 发现的开放端口 用途: - 解析器输出:parse_naabu_result_task - 保存器输入:save_ports_task 注意: IP 是端口扫描的必然产物,因为: 1. 扫描工具需要先解析域名到 IP 2. 端口属于 IP,而非域名 3. 同一域名可能有多个 IP """ host: str # 域名(如:www.example.com) ip: str # IP 地址(如:1.1.1.1) port: int # 端口号(如:80, 443, 22) ================================================ FILE: backend/apps/scan/tasks/screenshot/__init__.py ================================================ """ 截图任务模块 包含截图相关的所有任务: - capture_screenshots_task: 批量截图任务 """ from .capture_screenshots_task import capture_screenshots_task __all__ = [ 'capture_screenshots_task', ] ================================================ FILE: backend/apps/scan/tasks/screenshot/capture_screenshots_task.py ================================================ """ 批量截图任务 使用 Playwright 批量捕获网站截图,压缩后保存到数据库 """ import asyncio import logging import time from prefect import task logger = logging.getLogger(__name__) def _run_async(coro): """ 在同步环境中运行异步协程 Args: coro: 异步协程 Returns: 协程执行结果 """ try: loop = asyncio.get_event_loop() except RuntimeError: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) return loop.run_until_complete(coro) def _save_screenshot_with_retry( screenshot_service, scan_id: int, url: str, webp_data: bytes, status_code: int | None = None, max_retries: int = 3 ) -> bool: """ 保存截图到数据库(带重试机制) Args: screenshot_service: ScreenshotService 实例 scan_id: 扫描 ID url: URL webp_data: WebP 图片数据 status_code: HTTP 响应状态码 max_retries: 最大重试次数 Returns: 是否保存成功 """ for attempt in range(max_retries): try: if screenshot_service.save_screenshot_snapshot(scan_id, url, webp_data, status_code): return True # save 返回 False,等待后重试 if attempt < max_retries - 1: wait_time = 2 ** attempt # 指数退避:1s, 2s, 4s logger.warning( "保存截图失败(第 %d 次尝试),%d秒后重试: %s", attempt + 1, wait_time, url ) time.sleep(wait_time) except Exception as e: if attempt < max_retries - 1: wait_time = 2 ** attempt logger.warning( "保存截图异常(第 %d 次尝试),%d秒后重试: %s, 错误: %s", attempt + 1, wait_time, url, str(e)[:100] ) time.sleep(wait_time) else: logger.error("保存截图失败(已重试 %d 次): %s", max_retries, url) return False async def _capture_and_save_screenshots( urls: list[str], scan_id: int, concurrency: int ) -> dict: """ 异步批量截图并保存 Args: urls: URL 列表 scan_id: 扫描 ID concurrency: 并发数 Returns: 统计信息字典 """ from asgiref.sync import sync_to_async from apps.asset.services.playwright_screenshot_service import PlaywrightScreenshotService from apps.asset.services.screenshot_service import ScreenshotService # 初始化服务 playwright_service = PlaywrightScreenshotService(concurrency=concurrency) screenshot_service = ScreenshotService() # 包装同步的保存函数为异步 async_save_with_retry = sync_to_async(_save_screenshot_with_retry, thread_sensitive=True) # 统计 total = len(urls) successful = 0 failed = 0 logger.info("开始批量截图 - URL数: %d, 并发数: %d", total, concurrency) # 批量截图 async for url, screenshot_bytes, status_code in playwright_service.capture_batch(urls): if screenshot_bytes is None: failed += 1 continue # 压缩为 WebP webp_data = screenshot_service.compress_from_bytes(screenshot_bytes) if webp_data is None: logger.warning("压缩截图失败: %s", url) failed += 1 continue # 保存到数据库(带重试,使用 sync_to_async) if await async_save_with_retry(screenshot_service, scan_id, url, webp_data, status_code): successful += 1 if successful % 10 == 0: logger.info("截图进度: %d/%d 成功", successful, total) else: failed += 1 return { 'total': total, 'successful': successful, 'failed': failed } @task(name='capture_screenshots', retries=0) def capture_screenshots_task( urls: list[str], scan_id: int, target_id: int, config: dict ) -> dict: """ 批量截图任务 Args: urls: URL 列表 scan_id: 扫描 ID target_id: 目标 ID(用于日志) config: 截图配置 - concurrency: 并发数(默认 5) Returns: dict: { 'total': int, # 总 URL 数 'successful': int, # 成功截图数 'failed': int # 失败数 } """ if not urls: logger.info("URL 列表为空,跳过截图任务") return {'total': 0, 'successful': 0, 'failed': 0} concurrency = config.get('concurrency', 5) logger.info( "开始截图任务 - scan_id=%d, target_id=%d, URL数=%d, 并发=%d", scan_id, target_id, len(urls), concurrency ) try: result = _run_async(_capture_and_save_screenshots( urls=urls, scan_id=scan_id, concurrency=concurrency )) logger.info( "✓ 截图任务完成 - 总数: %d, 成功: %d, 失败: %d", result['total'], result['successful'], result['failed'] ) return result except Exception as e: logger.error("截图任务失败: %s", e, exc_info=True) raise RuntimeError(f"截图任务失败: {e}") from e ================================================ FILE: backend/apps/scan/tasks/site_scan/__init__.py ================================================ """ 站点扫描任务模块 包含站点扫描相关的所有任务: - export_site_urls_task: 导出站点URL到文件 - run_and_stream_save_websites_task: 流式运行httpx扫描并实时保存结果 """ from .export_site_urls_task import export_site_urls_task from .run_and_stream_save_websites_task import run_and_stream_save_websites_task __all__ = [ 'export_site_urls_task', 'run_and_stream_save_websites_task', ] ================================================ FILE: backend/apps/scan/tasks/site_scan/export_site_urls_task.py ================================================ """ 导出站点URL到文件的Task 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 特殊逻辑: - 80 端口:只生成 HTTP URL(省略端口号) - 443 端口:只生成 HTTPS URL(省略端口号) - 其他端口:生成 HTTP 和 HTTPS 两个URL(带端口号) """ import logging from typing import Optional from pathlib import Path from prefect import task from apps.asset.services import HostPortMappingService from apps.scan.services.target_export_service import create_export_service from apps.common.services import BlacklistService from apps.common.utils import BlacklistFilter from apps.scan.providers import TargetProvider, DatabaseTargetProvider, ProviderContext logger = logging.getLogger(__name__) def _generate_urls_from_port(host: str, port: int) -> list[str]: """ 根据端口生成 URL 列表 - 80 端口:只生成 HTTP URL(省略端口号) - 443 端口:只生成 HTTPS URL(省略端口号) - 其他端口:生成 HTTP 和 HTTPS 两个URL(带端口号) """ if port == 80: return [f"http://{host}"] elif port == 443: return [f"https://{host}"] else: return [f"http://{host}:{port}", f"https://{host}:{port}"] @task(name="export_site_urls") def export_site_urls_task( output_file: str, target_id: Optional[int] = None, provider: Optional[TargetProvider] = None, batch_size: int = 1000 ) -> dict: """ 导出目标下的所有站点URL到文件 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从 HostPortMapping 表导出 2. Provider 模式:传入 provider,从任意数据源导出 传统模式特殊逻辑: - 80 端口:只生成 HTTP URL(省略端口号) - 443 端口:只生成 HTTPS URL(省略端口号) - 其他端口:生成 HTTP 和 HTTPS 两个URL(带端口号) 回退逻辑(仅传统模式): - 如果 HostPortMapping 为空,使用 generate_default_urls() 生成默认 URL Args: output_file: 输出文件路径(绝对路径) target_id: 目标ID(传统模式,向后兼容) provider: TargetProvider 实例(新模式) batch_size: 每次处理的批次大小 Returns: dict: { 'success': bool, 'output_file': str, 'total_urls': int, 'association_count': int, # 主机端口关联数量(仅传统模式) 'source': str, # 数据来源: "host_port" | "default" | "provider" } Raises: ValueError: 参数错误 IOError: 文件写入失败 """ # 参数验证:至少提供一个 if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # 向后兼容:如果没有提供 provider,使用传统模式 if provider is None: logger.info("使用传统模式 - Target ID: %d, 输出文件: %s", target_id, output_file) return _export_site_urls_legacy(target_id, output_file, batch_size) # Provider 模式 logger.info("使用 Provider 模式 - Provider: %s, 输出文件: %s", type(provider).__name__, output_file) # 确保输出目录存在 output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) # 使用 Provider 导出 URL 列表 total_urls = 0 blacklist_filter = provider.get_blacklist_filter() with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url in provider.iter_urls(): # 应用黑名单过滤(如果有) if blacklist_filter and not blacklist_filter.is_allowed(url): continue f.write(f"{url}\n") total_urls += 1 if total_urls % 1000 == 0: logger.info("已导出 %d 个URL...", total_urls) logger.info("✓ URL导出完成 - 总数: %d, 文件: %s", total_urls, str(output_path)) return { 'success': True, 'output_file': str(output_path), 'total_urls': total_urls, 'source': 'provider', } def _export_site_urls_legacy(target_id: int, output_file: str, batch_size: int) -> dict: """ 传统模式:从 HostPortMapping 表导出 URL 保持原有逻辑不变,确保向后兼容 """ logger.info("开始统计站点URL - Target ID: %d, 输出文件: %s", target_id, output_file) # 确保输出目录存在 output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) # 获取规则并创建过滤器 blacklist_filter = BlacklistFilter(BlacklistService().get_rules(target_id)) # 直接查询 HostPortMapping 表,按 host 排序 service = HostPortMappingService() associations = service.iter_host_port_by_target( target_id=target_id, batch_size=batch_size, ) total_urls = 0 association_count = 0 filtered_count = 0 # 流式写入文件(特殊端口逻辑) with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for assoc in associations: association_count += 1 host = assoc['host'] port = assoc['port'] # 先校验 host,通过了再生成 URL if not blacklist_filter.is_allowed(host): filtered_count += 1 continue # 根据端口号生成URL for url in _generate_urls_from_port(host, port): f.write(f"{url}\n") total_urls += 1 if association_count % 1000 == 0: logger.info("已处理 %d 条关联,生成 %d 个URL...", association_count, total_urls) if filtered_count > 0: logger.info("黑名单过滤: 过滤 %d 条关联", filtered_count) logger.info( "✓ 站点URL导出完成 - 关联数: %d, 总URL数: %d, 文件: %s", association_count, total_urls, str(output_path) ) # 判断数据来源 source = "host_port" # 数据存在但全被过滤,不回退 if association_count > 0 and total_urls == 0: logger.info("HostPortMapping 有 %d 条数据,但全被黑名单过滤,不回退", association_count) return { 'success': True, 'output_file': str(output_path), 'total_urls': 0, 'association_count': association_count, 'source': source, } # 数据源为空,回退到默认 URL 生成 if total_urls == 0: logger.info("HostPortMapping 为空,使用默认 URL 生成") export_service = create_export_service(target_id) result = export_service.generate_default_urls(target_id, str(output_path)) total_urls = result['total_count'] source = "default" return { 'success': True, 'output_file': str(output_path), 'total_urls': total_urls, 'association_count': association_count, 'source': source, } ================================================ FILE: backend/apps/scan/tasks/site_scan/run_and_stream_save_websites_task.py ================================================ """ 基于 execute_stream 的流式站点扫描任务 主要功能: 1. 实时执行站点扫描命令(httpx) 2. 流式处理命令输出,实时解析为 HttpxRecord 3. 批量保存到数据库,复用现有的字段校验与统计逻辑 4. 避免生成大量临时文件,提高效率 数据流向: 命令执行 → 流式输出 → 实时解析 → 批量保存 → 数据库 输入:扫描命令及参数 输出:WebSite 记录 优化策略: - 使用 execute_stream 实时处理输出 - 复用现有的 _save_batch_with_retry 逻辑 - 流式处理避免内存溢出 - 批量操作减少数据库交互 """ import logging import json import subprocess import time from pathlib import Path from prefect import task from typing import Generator, Optional, Dict, Any, TYPE_CHECKING from django.db import IntegrityError, OperationalError, DatabaseError from dataclasses import dataclass from urllib.parse import urlparse, urlunparse from psycopg2 import InterfaceError from apps.asset.dtos.snapshot import WebsiteSnapshotDTO from apps.scan.utils import execute_stream # 类型检查时导入,运行时不导入(避免循环依赖) if TYPE_CHECKING: from apps.asset.services.snapshot import WebsiteSnapshotsService logger = logging.getLogger(__name__) @dataclass class ServiceSet: """ Service 集合,用于依赖注入 提供所有需要的 Service 实例,便于测试时注入 Mock 对象 """ snapshot: "WebsiteSnapshotsService" @classmethod def create_default(cls) -> 'ServiceSet': """创建默认的 Service 集合""" from apps.asset.services.snapshot import WebsiteSnapshotsService return cls( snapshot=WebsiteSnapshotsService() ) def _sanitize_string(value: str) -> str: """ 清理字符串中的 NUL 字符和其他不可打印字符 PostgreSQL 不允许字符串字段包含 NUL (0x00) 字符 """ if not value: return value # 移除 NUL 字符 return value.replace('\x00', '') def normalize_url(url: str) -> str: """ 标准化 URL,移除默认端口号 处理规则: - HTTPS 协议的 443 端口 → 移除端口号 - HTTP 协议的 80 端口 → 移除端口号 - 其他端口 → 保留端口号 Args: url: 原始 URL(如 https://www.example.com:443) Returns: str: 标准化后的 URL(如 https://www.example.com) Examples: >>> normalize_url('https://www.example.com:443') 'https://www.example.com' >>> normalize_url('http://www.example.com:80') 'http://www.example.com' >>> normalize_url('https://www.example.com:8443') 'https://www.example.com:8443' """ try: parsed = urlparse(url) # 检查是否需要移除端口号 should_remove_port = ( (parsed.scheme == 'https' and parsed.port == 443) or (parsed.scheme == 'http' and parsed.port == 80) ) if should_remove_port: # 重建 URL,不包含端口号 # netloc 可能是 'domain:port' 格式,需要只保留 hostname netloc = parsed.hostname or parsed.netloc.split(':')[0] normalized = urlunparse(( parsed.scheme, netloc, parsed.path, parsed.params, parsed.query, parsed.fragment )) return normalized # 不需要修改,返回原 URL return url except Exception as e: # 解析失败,返回原 URL logger.debug("URL 标准化失败: %s,使用原始 URL: %s", e, url) return url def _extract_hostname(url: str) -> str: """ 从 URL 提取主机名 Args: url: URL 字符串 Returns: str: 提取的主机名(小写) """ try: if url: parsed = urlparse(url) if parsed.hostname: return parsed.hostname # 降级方案:手动提取 return url.replace('http://', '').replace('https://', '').split('/')[0].split(':')[0] return '' except Exception as e: logger.debug("提取主机名失败: %s", e) return '' class HttpxRecord: """httpx 扫描记录数据类""" def __init__(self, data: Dict[str, Any]): self.url = _sanitize_string(data.get('url', '')) self.input = _sanitize_string(data.get('input', '')) self.title = _sanitize_string(data.get('title', '')) self.status_code = data.get('status_code') # int,不需要清理 self.content_length = data.get('content_length') # int,不需要清理 self.content_type = _sanitize_string(data.get('content_type', '')) self.location = _sanitize_string(data.get('location', '')) self.webserver = _sanitize_string(data.get('webserver', '')) self.response_body = _sanitize_string(data.get('body', '')) self.tech = [_sanitize_string(t) for t in data.get('tech', []) if isinstance(t, str)] # 列表中的字符串也需要清理 self.vhost = data.get('vhost') # bool,不需要清理 self.failed = data.get('failed', False) # bool,不需要清理 self.response_headers = _sanitize_string(data.get('raw_header', '')) # 从 URL 中提取主机名(优先使用 httpx 返回的 host,否则自动提取) httpx_host = _sanitize_string(data.get('host', '')) self.host = httpx_host if httpx_host else _extract_hostname(self.url) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3 ) -> dict: """ 保存一个批次的数据(带重试机制) Args: batch: 要保存的记录批次 scan_id: 扫描任务ID target_id: 目标ID batch_num: 批次编号 services: Service 集合(必须,依赖注入) max_retries: 最大重试次数 Returns: dict: { 'success': bool, 'created_websites': int, 'skipped_failed': int } """ for attempt in range(max_retries): try: stats = _save_batch(batch, scan_id, target_id, batch_num, services) return { 'success': True, 'created_websites': stats.get('created_websites', 0), 'skipped_failed': stats.get('skipped_failed', 0) } except IntegrityError as e: # 数据完整性错误,不应重试(IntegrityError 是 DatabaseError 的子类,需先处理) logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return { 'success': False, 'created_websites': 0, 'skipped_failed': 0 } except (OperationalError, DatabaseError, InterfaceError) as e: # 数据库级错误(连接中断、表结构不匹配等):按指数退避重试,最终失败时抛出异常让 Flow 失败 if attempt < max_retries - 1: wait_time = 2 ** attempt logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100] ) time.sleep(wait_time) else: logger.error( "批次 %d 保存失败(已重试 %d 次),将终止任务: %s", batch_num, max_retries, e, exc_info=True, ) # 让上层 Task 感知失败,从而标记整个扫描为失败 raise except Exception as e: # 其他未知异常也不再吞掉,直接抛出以便 Flow 标记为失败 logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) raise # 理论上不会走到这里,保留兜底返回值以满足类型约束 return { 'success': False, 'created_websites': 0, 'skipped_failed': 0 } def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet ) -> dict: """ 保存一个批次的数据到数据库(使用快照 Service) 数据关系链: Subdomain (已存在) → WebsiteSnapshot (待创建) → WebSite (自动同步) 处理流程: 1. 查询 Subdomain:根据域名批量查询(LRU缓存) 2. 构建 WebsiteSnapshotDTO:包含 scan_id 和 target_id 3. 调用快照 Service:save_and_sync() 自动保存快照并同步到资产表 Args: batch: 数据批次,list of HttpxRecord scan_id: 扫描任务 ID target_id: 目标 ID batch_num: 批次编号(用于日志) services: Service 集合(依赖注入) Returns: dict: 包含创建和跳过记录的统计信息 Raises: TypeError: batch 参数类型错误 IntegrityError: 数据完整性错误 OperationalError: 数据库操作错误 DatabaseError: 其他数据库错误 Note: 此函数不包含重试逻辑,由外层 _save_batch_with_retry 负责重试 """ # 参数验证 if not isinstance(batch, list): raise TypeError(f"batch 必须是 list 类型,实际: {type(batch).__name__}") if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return { 'created_websites': 0, 'skipped_failed': 0 } # 统计变量 skipped_failed = 0 # ========== Step 1: 准备 WebsiteSnapshot 数据(内存操作,无需事务)========== snapshot_items = [] for record in batch: # 跳过失败的请求 if record.failed: skipped_failed += 1 continue try: # 使用 input 字段(原始扫描的 URL)而不是 url 字段(重定向后的 URL) # 原因:避免多个不同的输入 URL 重定向到同一个 URL 时产生唯一约束冲突 # 例如:http://example.com 和 https://example.com 都重定向到 https://example.com # 如果使用 record.url,两条记录会有相同的 url,导致数据库冲突 # 如果使用 record.input,两条记录保留原始输入,不会冲突 normalized_url = normalize_url(record.input) if record.input else normalize_url(record.url) # 提取 host 字段(域名或IP地址) host = record.host if record.host else '' # 创建 WebsiteSnapshot DTO snapshot_dto = WebsiteSnapshotDTO( scan_id=scan_id, target_id=target_id, # 主关联字段 url=normalized_url, # 保存原始输入 URL(归一化后) host=host, # 主机名(域名或IP地址) location=record.location if record.location else '', title=record.title if record.title else '', webserver=record.webserver if record.webserver else '', response_body=record.response_body if record.response_body else '', content_type=record.content_type if record.content_type else '', tech=record.tech if isinstance(record.tech, list) else [], status_code=record.status_code, content_length=record.content_length, vhost=record.vhost, response_headers=record.response_headers if record.response_headers else '', ) snapshot_items.append(snapshot_dto) except Exception as e: logger.error("处理记录失败: %s,错误: %s", record.url, e) continue # ========== Step 2: 保存快照并同步到资产表(通过快照 Service)========== if snapshot_items: services.snapshot.save_and_sync(snapshot_items) return { 'created_websites': len(snapshot_items), 'skipped_failed': skipped_failed } def _parse_and_validate_line(line: str) -> Optional[HttpxRecord]: """ 解析并验证单行 JSON 数据 Args: line: 单行输出数据 Returns: Optional[HttpxRecord]: 有效的 httpx 扫描记录,或 None 如果验证失败 验证步骤: 1. 清理 NUL 字符 2. 解析 JSON 格式 3. 验证数据类型为字典 4. 创建 HttpxRecord 对象 5. 验证必要字段(url) """ try: # 步骤 1: 清理 NUL 字符后再解析 JSON line = _sanitize_string(line) # 步骤 2: 解析 JSON try: line_data = json.loads(line, strict=False) except json.JSONDecodeError: return None # 步骤 3: 验证数据类型 if not isinstance(line_data, dict): logger.info("跳过非字典数据") return None # 步骤 4: 创建记录 record = HttpxRecord(line_data) # 步骤 5: 验证必要字段 if not record.url: logger.info("URL 为空,跳过 - 数据: %s", str(line_data)[:200]) return None # 返回有效记录 return record except Exception: logger.info("跳过无法解析的行: %s", line[:100] if line else 'empty') return None def _parse_httpx_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[HttpxRecord, None, None]: """ 流式解析 httpx 站点扫描命令输出 基于 execute_stream 实时处理 httpx 命令的 stdout,将每行 JSON 输出 转换为 HttpxRecord 格式,沿用现有字段校验逻辑 Args: cmd: httpx 站点扫描命令 cwd: 工作目录 shell: 是否使用 shell 执行 timeout: 命令执行超时时间(秒),None 表示不设置超时 Yields: HttpxRecord: 每次 yield 一条解析后的站点记录 """ logger.info("开始流式解析 httpx 站点扫描命令输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 valid_records = 0 try: # 使用 execute_stream 获取实时输出流(带工具名、超时控制和日志文件) for line in execute_stream(cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file): total_lines += 1 # 解析并验证单行数据 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue valid_records += 1 # yield 一条有效记录 yield record # 每处理 5 条记录输出一次进度 if valid_records % 5 == 0: logger.info("已解析 %d 条有效记录...", valid_records) except subprocess.TimeoutExpired as e: # 超时异常:简洁输出,不显示堆栈 error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) from e except Exception as e: # 其他异常:输出详细堆栈以便调试 logger.error("流式解析命令输出失败: %s", e, exc_info=True) raise logger.info( "流式解析完成 - 总行数: %d, 有效记录: %d, 错误行数: %d", total_lines, valid_records, error_lines ) def _validate_task_parameters(cmd: str, target_id: int, scan_id: int, cwd: Optional[str]) -> None: """ 验证任务参数的有效性 Args: cmd: 扫描命令 target_id: 目标ID scan_id: 扫描ID cwd: 工作目录 Raises: ValueError: 参数验证失败 """ if not cmd or not cmd.strip(): raise ValueError("扫描命令不能为空") if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") if scan_id is None: raise ValueError("scan_id 不能为 None,必须指定扫描ID") # 验证工作目录(如果指定) if cwd and not Path(cwd).exists(): raise ValueError(f"工作目录不存在: {cwd}") def _accumulate_batch_stats(total_stats: dict, batch_result: dict) -> None: """ 累加批次统计信息 Args: total_stats: 总统计信息字典 batch_result: 批次结果字典 """ total_stats['created_websites'] += batch_result.get('created_websites', 0) total_stats['skipped_failed'] += batch_result.get('skipped_failed', 0) def _process_batch( batch: list, scan_id: int, target_id: int, batch_num: int, total_stats: dict, failed_batches: list, services: ServiceSet ) -> None: """ 处理单个批次 Args: batch: 数据批次 scan_id: 扫描ID target_id: 目标ID batch_num: 批次编号 total_stats: 总统计信息 failed_batches: 失败批次列表 services: Service 集合(必须,依赖注入) """ result = _save_batch_with_retry( batch, scan_id, target_id, batch_num, services ) # 累计统计信息(失败时可能有部分数据已保存) _accumulate_batch_stats(total_stats, result) if not result['success']: failed_batches.append(batch_num) logger.warning( "批次 %d 保存失败,但已累计统计信息:创建站点=%d", batch_num, result.get('created_websites', 0) ) def _process_records_in_batches( data_generator, scan_id: int, target_id: int, batch_size: int, services: ServiceSet ) -> dict: """ 流式处理记录并分批保存 Args: data_generator: 数据生成器 scan_id: 扫描ID target_id: 目标ID batch_size: 批次大小 services: Service 集合(必须,依赖注入) Returns: dict: 处理统计信息 Raises: RuntimeError: 存在失败批次时抛出 """ total_records = 0 batch_num = 0 failed_batches = [] batch = [] # 统计信息 total_stats = { 'created_websites': 0, 'skipped_failed': 0 } # 流式读取生成器并分批保存 for record in data_generator: batch.append(record) total_records += 1 # 达到批次大小,执行保存 if len(batch) >= batch_size: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) batch = [] # 清空批次 # 每 2 个批次输出进度 if batch_num % 2 == 0: logger.info("进度: 已处理 %d 批次,%d 条记录", batch_num, total_records) # 保存最后一批 if batch: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) # 检查失败批次 if failed_batches: error_msg = ( f"流式保存站点扫描结果时出现失败批次,处理记录: {total_records}," f"失败批次: {failed_batches}" ) logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) return { 'processed_records': total_records, 'batch_count': batch_num, **total_stats } def _build_final_result(stats: dict) -> dict: """ 构建最终结果并输出日志 Args: stats: 处理统计信息 Returns: dict: 最终结果 """ logger.info( "✓ 流式保存完成 - 处理记录: %d(%d 批次),创建站点: %d,跳过(失败): %d", stats['processed_records'], stats['batch_count'], stats['created_websites'], stats['skipped_failed'] ) # 如果没有创建任何记录,给出明确提示 if stats['created_websites'] == 0: logger.warning( "⚠️ 没有创建任何站点记录!可能原因:1) 域名不在数据库中 2) 命令输出格式问题 3) 重复数据被忽略 4) 所有请求都失败" ) return { 'processed_records': stats['processed_records'], 'created_websites': stats['created_websites'], 'skipped_failed': stats['skipped_failed'] } def _cleanup_resources(data_generator) -> None: """ 清理任务资源 Args: data_generator: 数据生成器 """ # 注:LRUCache 是局部变量,函数结束时会自动释放,无需手动 clear() # 确保生成器被正确关闭 if data_generator is not None: try: data_generator.close() logger.debug("已关闭数据生成器") except Exception as gen_close_error: logger.error("关闭生成器时出错: %s", gen_close_error) @task(name='run_and_stream_save_websites', retries=0) def run_and_stream_save_websites_task( cmd: str, tool_name: str, scan_id: int, target_id: int, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 10, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> dict: """ 执行 httpx 站点扫描命令并流式保存结果到数据库 该任务将: 1. 验证输入参数 2. 初始化资源(缓存、生成器) 3. 流式处理记录并分批保存 4. 构建并返回结果统计 Args: cmd: httpx 站点扫描命令 scan_id: 扫描任务 ID target_id: 目标 ID cwd: 工作目录(可选) shell: 是否使用 shell 执行(默认 False) batch_size: 批量保存大小(默认1000) timeout: 命令执行超时时间(秒),None 表示不设置超时 Returns: dict: { 'processed_records': int, # 处理的记录总数 'created_websites': int, # 创建的站点记录数 'skipped_failed': int, # 因请求失败跳过的记录数 } Raises: ValueError: 参数验证失败 RuntimeError: 命令执行或数据库操作失败 subprocess.TimeoutExpired: 命令执行超时 Performance: - 流式处理,实时解析命令输出 - 内存占用恒定(只存储一个 batch) - 复用现有的批次保存和重试逻辑 - 使用事务确保数据一致性 """ logger.info( "开始执行流式站点扫描任务 - target_id=%s, 超时=%s秒, 命令: %s", target_id, timeout if timeout else '无限制', cmd ) data_generator = None try: # 1. 验证参数 _validate_task_parameters(cmd, target_id, scan_id, cwd) # 2. 初始化资源 data_generator = _parse_httpx_stream_output(cmd, tool_name, cwd, shell, timeout, log_file) services = ServiceSet.create_default() # 3. 流式处理记录并分批保存 stats = _process_records_in_batches( data_generator, scan_id, target_id, batch_size, services ) # 4. 构建最终结果 return _build_final_result(stats) except subprocess.TimeoutExpired: # 超时异常直接向上传播,保留异常类型 logger.warning( "⚠️ 站点扫描任务超时 - target_id=%s, 超时=%s秒", target_id, timeout ) raise # 直接重新抛出,不包装 except Exception as e: error_msg = f"流式执行站点扫描任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: # 5. 清理资源 _cleanup_resources(data_generator) ================================================ FILE: backend/apps/scan/tasks/subdomain_discovery/__init__.py ================================================ """ 子域名发现任务模块 包含子域名扫描流程的 Prefect Tasks: - run_subdomain_discovery_task: 运行单个子域名发现工具(可并行) - merge_and_validate_task: 合并、解析并验证域名(一体化高性能) - save_domains_task: 保存到数据库 架构优势: - 每个 task 单一职责,可独立重试 - 支持并行执行扫描工具 - 流式处理 + 正则验证,性能提升 50-100 倍 - Flow 层编排,逻辑清晰 """ from .run_subdomain_discovery_task import run_subdomain_discovery_task from .merge_and_validate_task import merge_and_validate_task from .save_domains_task import save_domains_task __all__ = [ 'run_subdomain_discovery_task', 'merge_and_validate_task', 'save_domains_task', ] ================================================ FILE: backend/apps/scan/tasks/subdomain_discovery/merge_and_validate_task.py ================================================ """ 合并并去重域名任务 合并 merge + parse + validate 三个步骤,优化性能: - 单命令实现(LC_ALL=C sort -u) - C语言级性能,单进程高效 - 无临时文件,零额外开销 - 支持千万级数据处理 性能优势: - LC_ALL=C 字节序比较(比locale快20-30%) - 单进程直接处理多文件(无管道开销) - 内存占用恒定(~50MB for 50万域名) - 50万域名处理时间:~0.5秒(相比 Python 提升 ~67%) Note: - 工具(amass/subfinder)输出已标准化(小写,无空行) - sort -u 自动处理去重和排序 - 无需额外过滤,性能最优 """ import logging import subprocess import uuid from datetime import datetime from pathlib import Path from typing import List from prefect import task logger = logging.getLogger(__name__) def _count_file_lines(file_path: str) -> int: """使用 wc -l 统计文件行数,失败时返回 0""" try: result = subprocess.run( ["wc", "-l", file_path], check=True, capture_output=True, text=True, ) return int(result.stdout.strip().split()[0]) except (subprocess.CalledProcessError, ValueError, IndexError): return 0 def _calculate_timeout(total_lines: int) -> int: """根据总行数计算超时时间(每行约 0.1 秒,最少 600 秒)""" if total_lines <= 0: return 3600 return max(600, int(total_lines * 0.1)) def _validate_input_files(result_files: List[str]) -> List[str]: """验证输入文件存在性,返回有效文件列表""" valid_files = [] for file_path_str in result_files: file_path = Path(file_path_str) if file_path.exists(): valid_files.append(str(file_path)) else: logger.warning("结果文件不存在: %s", file_path) return valid_files @task(name='merge_and_deduplicate', retries=1, log_prints=True) def merge_and_validate_task(result_files: List[str], result_dir: str) -> str: """ 合并扫描结果并去重(高性能流式处理) 使用 LC_ALL=C sort -u 直接处理多文件,排序去重一步完成。 Args: result_files: 结果文件路径列表 result_dir: 结果目录 Returns: 去重后的域名文件路径 Raises: RuntimeError: 处理失败 """ logger.info("开始合并并去重 %d 个结果文件", len(result_files)) valid_files = _validate_input_files(result_files) if not valid_files: raise RuntimeError("所有结果文件都不存在") # 生成输出文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') short_uuid = uuid.uuid4().hex[:4] merged_file = Path(result_dir) / f"merged_{timestamp}_{short_uuid}.txt" # 计算超时时间 total_lines = sum(_count_file_lines(f) for f in valid_files) timeout = _calculate_timeout(total_lines) logger.info("合并去重: 输入总行数=%d, timeout=%d秒", total_lines, timeout) # 执行合并去重命令 cmd = f"LC_ALL=C sort -u {' '.join(valid_files)} -o {merged_file}" logger.debug("执行命令: %s", cmd) try: subprocess.run(cmd, shell=True, check=True, timeout=timeout) except subprocess.TimeoutExpired as exc: raise RuntimeError("合并去重超时,请检查数据量或系统资源") from exc except subprocess.CalledProcessError as exc: raise RuntimeError(f"系统命令执行失败: {exc.stderr or exc}") from exc # 验证输出文件 if not merged_file.exists(): raise RuntimeError("合并文件未被创建") unique_count = _count_file_lines(str(merged_file)) if unique_count == 0: # 降级为 Python 统计 with open(merged_file, 'r', encoding='utf-8') as f: unique_count = sum(1 for _ in f) if unique_count == 0: raise RuntimeError("未找到任何有效域名") file_size_kb = merged_file.stat().st_size / 1024 logger.info("✓ 合并去重完成 - 去重后: %d 个域名, 文件大小: %.2f KB", unique_count, file_size_kb) return str(merged_file) ================================================ FILE: backend/apps/scan/tasks/subdomain_discovery/run_subdomain_discovery_task.py ================================================ """ 运行扫描工具任务 负责运行单个子域名扫描工具(subfinder、sublist3r 等) """ import logging from pathlib import Path from prefect import task from apps.scan.utils import execute_and_wait logger = logging.getLogger(__name__) @task( name='run_subdomain_discovery', retries=0, # 显式禁用重试 log_prints=True ) def run_subdomain_discovery_task( tool: str, command: str, timeout: int, output_file: str ) -> str: """ 运行单个子域名发现工具 Args: tool: 子域名发现工具名称(用于日志) command: 完整的扫描命令(已由 Flow 层使用命令构建器生成) timeout: 命令执行超时时间(秒) output_file: 输出文件完整路径(由 Flow 层生成,包含目录和文件名) Returns: str: 结果文件路径 Raises: ValueError: 参数验证失败 RuntimeError: 扫描执行失败 Note: - 扫描结果通过工具的 -o 参数写入结果文件 - 使用通用的 run_scan_command 函数执行扫描 - 日志文件统一随 workspace 管理,默认保留 7 天自动清理 - 文件命名格式:{tool}_{timestamp}_{uuid4}.txt - 示例:subfinder_20250116_142200_a3f2.txt, subfinder_20250116_142200_a3f2.log """ # 准备路径 output_file_path = Path(output_file) log_file = str(output_file_path.with_suffix('.log')) # 使用通用的扫描命令执行器 try: result = execute_and_wait( tool_name=tool, command=command, timeout=timeout, log_file=log_file # 明确指定日志文件路径 ) # 验证输出文件是否生成 if not output_file_path.exists(): logger.warning( "扫描工具 %s 未生成结果文件: %s (returncode: %d)", tool, str(output_file_path), result['returncode'] # 强制转换为字符串 ) return "" # 检查文件大小 file_size = output_file_path.stat().st_size if file_size == 0: logger.warning("扫描工具 %s 生成的结果文件为空: %s", tool, output_file_path) return "" # 空文件视为无效结果,与未生成文件的行为一致 logger.info( "✓ 扫描完成: %s - 结果文件: %s (%.2f KB)", tool, str(output_file_path), file_size / 1024 # 使用绝对路径 ) # 返回结果文件路径 return str(output_file_path) except RuntimeError: # 直接向上抛出(已在 execute_and_wait 中记录日志) raise except Exception as e: error_msg = f"扫描工具 {tool} 执行异常: {e}" logger.error(error_msg, exc_info=True) raise ================================================ FILE: backend/apps/scan/tasks/subdomain_discovery/save_domains_task.py ================================================ """ 保存域名任务 负责将验证后的域名批量保存到数据库 """ import logging import time from pathlib import Path from prefect import task from typing import List from dataclasses import dataclass from django.db import IntegrityError, OperationalError, DatabaseError from apps.asset.services.snapshot import SubdomainSnapshotsService from apps.common.validators import validate_domain logger = logging.getLogger(__name__) @dataclass class ServiceSet: """ Service 集合,用于依赖注入 封装所有需要的 Service 实例,便于测试和管理。 """ snapshot: SubdomainSnapshotsService @classmethod def create_default(cls) -> 'ServiceSet': """创建默认的 Service 集合""" return cls( snapshot=SubdomainSnapshotsService() ) @task( name='save_domains', retries=0, log_prints=True ) def save_domains_task( domains_file: str, scan_id: int, target_id: int = None, batch_size: int = 1000 ) -> dict: """ 流式批量保存域名到数据库 Args: domains_file: 域名文件路径(流式读取) scan_id: 扫描任务 ID target_id: 目标 ID(可选) batch_size: 批量保存大小 Returns: dict: { 'processed_records': int # 处理的域名总数(不是实际创建数) } Raises: ValueError: 参数验证失败(target_id为None或路径不是文件) FileNotFoundError: 域名文件不存在 RuntimeError: 数据库操作失败 IOError: 文件读取失败 Performance: - 流式读取文件,边读边保存 - 内存占用恒定(只存储一个 batch) - 默认batch_size=1000(平衡性能和内存) - 批次失败自动重试 Note: 由于使用 ignore_conflicts,无法返回实际创建的数量 """ logger.info("开始从文件流式保存域名到数据库: %s", domains_file) # 参数验证 if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") # 文件验证 file_path = Path(domains_file) if not file_path.exists(): raise FileNotFoundError(f"域名文件不存在: {domains_file}") if not file_path.is_file(): raise ValueError(f"路径不是文件: {domains_file}") batch_num = 0 failed_batches = [] # 记录失败的批次 total_domains = 0 # 总域名数 # 初始化 Service 集合(依赖注入) services = ServiceSet.create_default() try: # 流式读取并分批保存 batch = [] with open(domains_file, 'r', encoding='utf-8') as f: for line in f: domain = line.strip() # 验证域名格式(包含空行检查) try: validate_domain(domain) except ValueError as e: logger.warning("跳过无效域名: %s - %s", domain, e) continue # 只有通过验证的域名才添加到批次和计数 # 注意:不在此处过滤黑名单,最大化资产发现 batch.append(domain) total_domains += 1 # 达到批次大小,执行保存 if len(batch) >= batch_size: batch_num += 1 result = _save_batch_with_retry(batch, scan_id, target_id, batch_num, services) if not result['success']: failed_batches.append(batch_num) logger.warning("批次 %d 保存失败,已记录", batch_num) batch = [] # 清空批次 # 每20个批次输出进度(减少日志开销) if batch_num % 20 == 0: logger.info("进度: 已处理 %d 批次,%d 个域名", batch_num, total_domains) # 保存最后一批(可能不足 batch_size) if batch: batch_num += 1 result = _save_batch_with_retry(batch, scan_id, target_id, batch_num, services) if not result['success']: failed_batches.append(batch_num) # 输出最终统计 if failed_batches: error_msg = ( f"保存域名时出现失败批次,处理域名: {total_domains}," f"失败批次: {failed_batches}" ) logger.error(error_msg) raise RuntimeError(error_msg) logger.info("✓ 保存完成 - 处理域名: %d(%d 批次)", total_domains, batch_num) return { 'processed_records': total_domains } except (IntegrityError, OperationalError, DatabaseError) as e: error_msg = f"数据库操作失败: {e}" logger.error(error_msg) raise RuntimeError(error_msg) from e except IOError as e: error_msg = f"文件读取失败: {e}" logger.error(error_msg) raise RuntimeError(error_msg) from e except Exception as e: error_msg = f"保存域名失败: {e}" logger.error(error_msg, exc_info=True) raise def _save_batch_with_retry( batch: List[str], scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3 ) -> dict: """ 保存一个批次的域名(带重试机制) Args: batch: 域名批次 scan_id: 扫描ID target_id: 目标ID batch_num: 批次编号 services: Service 集合(依赖注入) max_retries: 最大重试次数 Returns: dict: {'success': bool} Strategy: 使用 bulk_create + ignore_conflicts - 新域名:插入 (INSERT) - 重复域名:忽略(不更新,因为没有探测数据) """ # 调试日志:记录传入的参数 logger.info(f"[调试] _save_batch_with_retry 接收的参数: scan_id={scan_id}, target_id={target_id}, batch_size={len(batch)}") # 使用快照 DTO(包含完整的业务上下文) from apps.asset.dtos import SubdomainSnapshotDTO items = [ SubdomainSnapshotDTO( name=domain, scan_id=scan_id, target_id=target_id # 包含 target_id ) for domain in batch ] # 调试日志:记录第一个DTO的内容 if items: first_item = items[0] logger.info(f"[调试] 第一个 SubdomainSnapshotDTO: name={first_item.name}, scan_id={first_item.scan_id}, target_id={first_item.target_id}") for attempt in range(max_retries): try: # DTO 已包含 target_id,无需额外传参 services.snapshot.save_and_sync(items) logger.debug("批次 %d: 已处理 %d 个域名", batch_num, len(batch)) return {'success': True} except (OperationalError, DatabaseError) as e: # 数据库连接/操作错误,可重试 if attempt < max_retries - 1: wait_time = 2 ** attempt # 指数退避: 1s, 2s, 4s logger.warning("批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100]) time.sleep(wait_time) else: logger.error("批次 %d 保存失败(已重试 %d 次): %s", batch_num, max_retries, e) return {'success': False} except IntegrityError as e: # 数据完整性错误,不应重试 logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return {'success': False} except Exception as e: # 其他未知错误 logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) return {'success': False} return {'success': False} ================================================ FILE: backend/apps/scan/tasks/tests/test_task_backward_compatibility.py ================================================ """ Task 向后兼容性测试 Property 8: Task Backward Compatibility *For any* 任务调用,当仅提供 target_id 参数时,任务应该创建 DatabaseTargetProvider 并使用它进行数据访问,行为与改造前一致。 **Validates: Requirements 6.1, 6.2, 6.4, 6.5** """ import tempfile import pytest from pathlib import Path from unittest.mock import patch, MagicMock from hypothesis import given, strategies as st, settings from apps.scan.tasks.port_scan.export_hosts_task import export_hosts_task from apps.scan.tasks.site_scan.export_site_urls_task import export_site_urls_task from apps.scan.providers import ListTargetProvider # 生成有效域名的策略 def valid_domain_strategy(): """生成有效的域名""" label = st.text( alphabet=st.characters(whitelist_categories=('L',), min_codepoint=97, max_codepoint=122), min_size=2, max_size=10 ) return st.builds( lambda a, b, c: f"{a}.{b}.{c}", label, label, st.sampled_from(['com', 'net', 'org', 'io']) ) class TestExportHostsTaskBackwardCompatibility: """export_hosts_task 向后兼容性测试""" @given( target_id=st.integers(min_value=1, max_value=1000), hosts=st.lists(valid_domain_strategy(), min_size=1, max_size=10) ) @settings(max_examples=50, deadline=None) def test_property_8_legacy_mode_creates_database_provider(self, target_id, hosts): """ Property 8: Task Backward Compatibility (export_hosts_task) Feature: scan-target-provider, Property 8: Task Backward Compatibility **Validates: Requirements 6.1, 6.2, 6.4, 6.5** For any target_id, when calling export_hosts_task with only target_id, it should create a DatabaseTargetProvider and use it for data access. """ with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: # Mock Target 和 SubdomainService mock_target = MagicMock() mock_target.type = 'domain' mock_target.name = hosts[0] with patch('apps.scan.tasks.port_scan.export_hosts_task.DatabaseTargetProvider') as mock_provider_class, \ patch('apps.targets.services.TargetService') as mock_target_service: # 创建 mock provider 实例 mock_provider = MagicMock() mock_provider.iter_hosts.return_value = iter(hosts) mock_provider.get_blacklist_filter.return_value = None mock_provider_class.return_value = mock_provider # Mock TargetService mock_target_service.return_value.get_target.return_value = mock_target # 调用任务(传统模式:只传 target_id) result = export_hosts_task( output_file=output_file, target_id=target_id ) # 验证:应该创建了 DatabaseTargetProvider mock_provider_class.assert_called_once_with(target_id=target_id) # 验证:返回值包含必需字段 assert result['success'] is True assert result['output_file'] == output_file assert result['total_count'] == len(hosts) assert 'target_type' in result # 传统模式应该返回 target_type # 验证:文件内容正确 with open(output_file, 'r') as f: lines = [line.strip() for line in f.readlines()] assert lines == hosts finally: Path(output_file).unlink(missing_ok=True) def test_legacy_mode_with_provider_parameter(self): """测试当同时提供 target_id 和 provider 时,provider 优先""" with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: hosts = ['example.com', 'test.com'] provider = ListTargetProvider(targets=hosts) # 调用任务(同时提供 target_id 和 provider) result = export_hosts_task( output_file=output_file, target_id=123, # 应该被忽略 provider=provider ) # 验证:使用了 provider assert result['success'] is True assert result['total_count'] == len(hosts) assert 'target_type' not in result # Provider 模式不返回 target_type # 验证:文件内容正确 with open(output_file, 'r') as f: lines = [line.strip() for line in f.readlines()] assert lines == hosts finally: Path(output_file).unlink(missing_ok=True) def test_error_when_no_parameters(self): """测试当 target_id 和 provider 都未提供时抛出错误""" with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: with pytest.raises(ValueError, match="必须提供 target_id 或 provider 参数之一"): export_hosts_task(output_file=output_file) finally: Path(output_file).unlink(missing_ok=True) class TestExportSiteUrlsTaskBackwardCompatibility: """export_site_urls_task 向后兼容性测试""" def test_property_8_legacy_mode_uses_traditional_logic(self): """ Property 8: Task Backward Compatibility (export_site_urls_task) Feature: scan-target-provider, Property 8: Task Backward Compatibility **Validates: Requirements 6.1, 6.2, 6.4, 6.5** When calling export_site_urls_task with only target_id, it should use the traditional logic (_export_site_urls_legacy). """ with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: target_id = 123 # Mock HostPortMappingService mock_associations = [ {'host': 'example.com', 'port': 80}, {'host': 'test.com', 'port': 443}, ] with patch('apps.scan.tasks.site_scan.export_site_urls_task.HostPortMappingService') as mock_service_class, \ patch('apps.scan.tasks.site_scan.export_site_urls_task.BlacklistService') as mock_blacklist_service: # Mock HostPortMappingService mock_service = MagicMock() mock_service.iter_host_port_by_target.return_value = iter(mock_associations) mock_service_class.return_value = mock_service # Mock BlacklistService mock_blacklist = MagicMock() mock_blacklist.get_rules.return_value = [] mock_blacklist_service.return_value = mock_blacklist # 调用任务(传统模式:只传 target_id) result = export_site_urls_task( output_file=output_file, target_id=target_id ) # 验证:返回值包含传统模式的字段 assert result['success'] is True assert result['output_file'] == output_file assert result['total_urls'] == 2 # 80 端口生成 1 个 URL,443 端口生成 1 个 URL assert 'association_count' in result # 传统模式应该返回 association_count assert result['association_count'] == 2 assert result['source'] == 'host_port' # 验证:文件内容正确 with open(output_file, 'r') as f: lines = [line.strip() for line in f.readlines()] assert 'http://example.com' in lines assert 'https://test.com' in lines finally: Path(output_file).unlink(missing_ok=True) def test_provider_mode_uses_provider_logic(self): """测试当提供 provider 时使用 Provider 模式""" with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: urls = ['https://example.com', 'https://test.com'] provider = ListTargetProvider(targets=urls) # 调用任务(Provider 模式) result = export_site_urls_task( output_file=output_file, provider=provider ) # 验证:使用了 provider assert result['success'] is True assert result['total_urls'] == len(urls) assert 'association_count' not in result # Provider 模式不返回 association_count assert result['source'] == 'provider' # 验证:文件内容正确 with open(output_file, 'r') as f: lines = [line.strip() for line in f.readlines()] assert lines == urls finally: Path(output_file).unlink(missing_ok=True) def test_error_when_no_parameters(self): """测试当 target_id 和 provider 都未提供时抛出错误""" with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f: output_file = f.name try: with pytest.raises(ValueError, match="必须提供 target_id 或 provider 参数之一"): export_site_urls_task(output_file=output_file) finally: Path(output_file).unlink(missing_ok=True) ================================================ FILE: backend/apps/scan/tasks/url_fetch/__init__.py ================================================ """ URL 获取任务模块 包含 URL 获取相关的所有原子任务: - export_sites_task: 导出站点 URL 列表(用于 katana 等爬虫) - run_url_fetcher_task: 执行 URL 获取工具 - merge_and_deduplicate_urls_task: 合并去重 URL - clean_urls_task: 使用 uro 清理 URL - save_urls_task: 保存 URL 到数据库 - run_and_stream_save_urls_task: 流式验证并保存存活的 URL """ from .export_sites_task import export_sites_task from .run_url_fetcher_task import run_url_fetcher_task from .merge_and_deduplicate_urls_task import merge_and_deduplicate_urls_task from .clean_urls_task import clean_urls_task from .save_urls_task import save_urls_task from .run_and_stream_save_urls_task import run_and_stream_save_urls_task __all__ = [ 'export_sites_task', 'run_url_fetcher_task', 'merge_and_deduplicate_urls_task', 'clean_urls_task', 'save_urls_task', 'run_and_stream_save_urls_task', ] ================================================ FILE: backend/apps/scan/tasks/url_fetch/clean_urls_task.py ================================================ """ URL 清理任务 使用 uro 工具清理合并后的 URL 列表: - 去除重复和相似的 URL - 根据扩展名过滤(whitelist/blacklist) - 智能过滤无效 URL """ import logging import subprocess from pathlib import Path from datetime import datetime from prefect import task from typing import Optional from apps.scan.utils import execute_and_wait logger = logging.getLogger(__name__) @task( name='clean_urls_with_uro', retries=1, log_prints=True ) def clean_urls_task( input_file: str, output_dir: str, timeout: int = 60, whitelist: Optional[list] = None, blacklist: Optional[list] = None, filters: Optional[list] = None ) -> dict: """ 使用 uro 清理 URL 列表 Args: input_file: 输入的 URL 文件路径 output_dir: 输出目录 timeout: 超时时间(秒) whitelist: 只保留指定扩展名的 URL blacklist: 排除指定扩展名的 URL filters: 额外的过滤规则 Returns: dict: { 'success': bool, 'output_file': str, 'input_count': int, 'output_count': int, 'removed_count': int } """ input_path = Path(input_file) output_path = Path(output_dir) # 1. 验证输入文件 if not input_path.exists(): logger.error("输入文件不存在: %s", input_file) return { 'success': False, 'output_file': input_file, 'input_count': 0, 'output_count': 0, 'removed_count': 0, 'error': '输入文件不存在' } # 2. 统计输入 URL 数量 try: result = subprocess.run( ['wc', '-l', str(input_path)], capture_output=True, text=True, check=True ) input_count = int(result.stdout.strip().split()[0]) except Exception as e: logger.warning("统计输入文件行数失败: %s", e) input_count = 0 with open(input_path, 'r') as f: input_count = sum(1 for line in f if line.strip()) if input_count == 0: logger.warning("输入文件为空,跳过 uro 清理") return { 'success': True, 'output_file': input_file, 'input_count': 0, 'output_count': 0, 'removed_count': 0 } logger.info("开始 uro 清理 - 输入 URL 数: %d", input_count) # 3. 生成输出文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') output_file = output_path / f"urls_cleaned_{timestamp}.txt" # 4. 构建 uro 命令 cmd_parts = ['uro', '-i', str(input_path), '-o', str(output_file)] if whitelist: cmd_parts.extend(['-w'] + [str(w) for w in whitelist]) if blacklist: cmd_parts.extend(['-b'] + [str(b) for b in blacklist]) if filters: cmd_parts.extend(['-f'] + [str(f) for f in filters]) # 5. 构建命令字符串 command = ' '.join(cmd_parts) log_file = str(output_path / f"uro_{timestamp}.log") logger.debug("uro 命令: %s", command) # 6. 使用 execute_and_wait 执行(会自动发送通知) try: result = execute_and_wait( tool_name='uro', command=command, timeout=timeout, log_file=log_file ) if result['returncode'] != 0: logger.warning( "uro 返回非零状态码: %d", result['returncode'] ) # uro 可能正常完成但返回非零,检查输出文件 if not output_file.exists(): return { 'success': False, 'output_file': input_file, 'input_count': input_count, 'output_count': input_count, 'removed_count': 0, 'error': f'uro 执行失败 (returncode: {result["returncode"]})' } except RuntimeError as e: # execute_and_wait 超时或执行失败会抛出 RuntimeError logger.error("uro 执行失败: %s", e) return { 'success': False, 'output_file': input_file, 'input_count': input_count, 'output_count': input_count, 'removed_count': 0, 'error': str(e) } except Exception as e: logger.error("uro 执行异常: %s", e) return { 'success': False, 'output_file': input_file, 'input_count': input_count, 'output_count': input_count, 'removed_count': 0, 'error': str(e) } # 7. 统计清理后的 URL 数量 output_count = 0 if output_file.exists(): try: result = subprocess.run( ['wc', '-l', str(output_file)], capture_output=True, text=True, check=True ) output_count = int(result.stdout.strip().split()[0]) except Exception: with open(output_file, 'r') as f: output_count = sum(1 for line in f if line.strip()) else: logger.warning("uro 未生成输出文件,使用原始文件") return { 'success': False, 'output_file': input_file, 'input_count': input_count, 'output_count': input_count, 'removed_count': 0, 'error': '未生成输出文件' } removed_count = input_count - output_count logger.info( "✓ uro 清理完成 - 输入: %d, 输出: %d, 移除: %d (%.1f%%)", input_count, output_count, removed_count, (removed_count / input_count * 100) if input_count > 0 else 0 ) return { 'success': True, 'output_file': str(output_file), 'input_count': input_count, 'output_count': output_count, 'removed_count': removed_count } ================================================ FILE: backend/apps/scan/tasks/url_fetch/export_sites_task.py ================================================ """ 导出站点 URL 列表任务 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 数据源: WebSite.url → Default(用于 katana 等爬虫工具) """ import logging from typing import Optional from pathlib import Path from prefect import task from apps.scan.services.target_export_service import ( export_urls_with_fallback, DataSource, ) from apps.scan.providers import TargetProvider, DatabaseTargetProvider logger = logging.getLogger(__name__) @task( name='export_sites_for_url_fetch', retries=1, log_prints=True ) def export_sites_task( output_file: str, target_id: Optional[int] = None, scan_id: Optional[int] = None, provider: Optional[TargetProvider] = None, batch_size: int = 1000 ) -> dict: """ 导出站点 URL 列表到文件(用于 katana 等爬虫工具) 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从数据库导出 2. Provider 模式:传入 provider,从任意数据源导出 数据源优先级(回退链,仅传统模式): 1. WebSite 表 - 站点级别 URL 2. 默认生成 - 根据 Target 类型生成 http(s)://target_name Args: output_file: 输出文件路径 target_id: 目标 ID(传统模式,向后兼容) scan_id: 扫描 ID(保留参数,兼容旧调用) provider: TargetProvider 实例(新模式) batch_size: 批次大小(内存优化) Returns: dict: { 'output_file': str, # 输出文件路径 'asset_count': int, # 资产数量 } Raises: ValueError: 参数错误 RuntimeError: 执行失败 """ # 参数验证:至少提供一个 if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # Provider 模式:使用 TargetProvider 导出 if provider is not None: logger.info("使用 Provider 模式 - Provider: %s", type(provider).__name__) return _export_with_provider(output_file, provider) # 传统模式:使用 export_urls_with_fallback logger.info("使用传统模式 - Target ID: %d", target_id) result = export_urls_with_fallback( target_id=target_id, output_file=output_file, sources=[DataSource.WEBSITE, DataSource.DEFAULT], batch_size=batch_size, ) logger.info( "站点 URL 导出完成 - source=%s, count=%d", result['source'], result['total_count'] ) # 保持返回值格式不变(向后兼容) return { 'output_file': result['output_file'], 'asset_count': result['total_count'], } def _export_with_provider(output_file: str, provider: TargetProvider) -> dict: """使用 Provider 导出 URL""" output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) total_count = 0 blacklist_filter = provider.get_blacklist_filter() with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url in provider.iter_urls(): # 应用黑名单过滤(如果有) if blacklist_filter and not blacklist_filter.is_allowed(url): continue f.write(f"{url}\n") total_count += 1 if total_count % 1000 == 0: logger.info("已导出 %d 个 URL...", total_count) logger.info("✓ URL 导出完成 - 总数: %d, 文件: %s", total_count, str(output_path)) return { 'output_file': str(output_path), 'asset_count': total_count, } ================================================ FILE: backend/apps/scan/tasks/url_fetch/merge_and_deduplicate_urls_task.py ================================================ """ 合并并去重 URL 任务 合并多个工具的输出文件,去重并验证 URL 格式 性能优化:使用系统命令处理大文件 """ import logging import uuid import subprocess from pathlib import Path from datetime import datetime from prefect import task from typing import List logger = logging.getLogger(__name__) @task( name='merge_and_deduplicate_urls', retries=1, log_prints=True ) def merge_and_deduplicate_urls_task( result_files: List[str], result_dir: str ) -> str: """ 合并扫描结果并去重(高性能流式处理) 流程: 1. 使用 LC_ALL=C sort -u 直接处理多文件 2. 排序去重一步完成 3. 返回去重后的 URL 文件路径 Args: result_files: 结果文件路径列表 result_dir: 结果目录 Returns: str: 去重后的 URL 文件路径 Raises: RuntimeError: 处理失败 """ logger.info("开始合并并去重 %d 个结果文件(系统命令优化)", len(result_files)) result_path = Path(result_dir) # 验证文件存在性 valid_files = [] for file_path_str in result_files: file_path = Path(file_path_str) if file_path.exists(): valid_files.append(str(file_path)) else: logger.warning("结果文件不存在: %s", file_path) if not valid_files: raise RuntimeError("所有结果文件都不存在") # 生成输出文件路径 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') short_uuid = uuid.uuid4().hex[:4] merged_file = result_path / f"merged_{timestamp}_{short_uuid}.txt" try: # 使用系统命令一步完成: 排序去重 cmd = f"LC_ALL=C sort -u {' '.join(valid_files)} -o {merged_file}" logger.debug("执行命令: %s", cmd) # 按输入文件总行数动态计算超时时间 total_lines = 0 for file_path in valid_files: try: line_count_proc = subprocess.run( ["wc", "-l", file_path], check=True, capture_output=True, text=True, ) total_lines += int(line_count_proc.stdout.strip().split()[0]) except (subprocess.CalledProcessError, ValueError, IndexError): continue timeout = 3600 if total_lines > 0: # 按行数线性计算:每行约 0.1 秒 base_per_line = 0.1 est = int(total_lines * base_per_line) timeout = max(600, est) logger.info( "URL 合并去重 timeout 自动计算: 输入总行数=%d, timeout=%d秒", total_lines, timeout, ) result = subprocess.run( cmd, shell=True, check=True, timeout=timeout ) logger.debug("✓ 合并去重完成") # 统计结果 if not merged_file.exists(): raise RuntimeError("合并文件未被创建") # 优先使用 wc -l 统计行数,大文件性能更好 try: line_count_proc = subprocess.run( ["wc", "-l", str(merged_file)], check=True, capture_output=True, text=True, ) unique_count = int(line_count_proc.stdout.strip().split()[0]) except (subprocess.CalledProcessError, ValueError, IndexError) as e: logger.warning( "wc -l 统计失败(文件: %s),降级为 Python 逐行统计 - 错误: %s", merged_file, e, ) unique_count = 0 with open(merged_file, "r", encoding="utf-8") as file_obj: for _ in file_obj: unique_count += 1 if unique_count == 0: raise RuntimeError("未找到任何有效 URL") file_size = merged_file.stat().st_size logger.info( "✓ 合并去重完成 - 去重后: %d 个 URL, 文件大小: %.2f KB", unique_count, file_size / 1024, ) return str(merged_file) except subprocess.TimeoutExpired: error_msg = "合并去重超时(>60分钟),请检查数据量或系统资源" logger.warning(error_msg) # 超时是可预期的 raise RuntimeError(error_msg) except subprocess.CalledProcessError as e: error_msg = f"系统命令执行失败: {e.stderr if e.stderr else str(e)}" logger.error(error_msg) raise RuntimeError(error_msg) from e except IOError as e: error_msg = f"文件读写失败: {e}" logger.error(error_msg) raise RuntimeError(error_msg) from e except Exception as e: error_msg = f"合并去重失败: {e}" logger.error(error_msg, exc_info=True) raise ================================================ FILE: backend/apps/scan/tasks/url_fetch/run_and_stream_save_urls_task.py ================================================ """ 基于 execute_stream 的流式 URL 验证任务 主要功能: 1. 实时执行 httpx 命令验证 URL 2. 流式处理命令输出,解析 URL 信息 3. 批量保存到数据库(Endpoint 表) 4. 避免一次性加载所有 URL 到内存 数据流向: httpx 命令执行 → 流式输出 → 实时解析 → 批量保存 → Endpoint 表 优化策略: - 使用 execute_stream 实时处理输出 - 流式处理避免内存溢出 - 批量操作减少数据库交互 - 保存所有有效 URL(包括 4xx/5xx,便于安全分析) """ import logging import json import subprocess import time from pathlib import Path from prefect import task from typing import Generator, Optional, Dict, Any from django.db import IntegrityError, OperationalError, DatabaseError from psycopg2 import InterfaceError from dataclasses import dataclass from urllib.parse import urlparse from apps.asset.services.snapshot import EndpointSnapshotsService from apps.scan.utils import execute_stream logger = logging.getLogger(__name__) @dataclass class ServiceSet: """ Service 集合,用于依赖注入 提供 URL 验证所需的 Service 实例 """ snapshot: EndpointSnapshotsService @classmethod def create_default(cls) -> "ServiceSet": """创建默认的 Service 集合""" return cls( snapshot=EndpointSnapshotsService() ) def _sanitize_string(value: str) -> str: """ 清理字符串中的 NUL 字符和其他不可打印字符 PostgreSQL 不允许字符串字段包含 NUL (0x00) 字符 """ if not value: return value # 移除 NUL 字符 return value.replace('\x00', '') def _extract_hostname(url: str) -> str: """ 从 URL 提取主机名 Args: url: URL 字符串 Returns: str: 提取的主机名(小写) """ try: if url: parsed = urlparse(url) if parsed.hostname: return parsed.hostname # 降级方案:手动提取 return url.replace('http://', '').replace('https://', '').split('/')[0].split(':')[0] return '' except Exception as e: logger.debug("提取主机名失败: %s", e) return '' class HttpxRecord: """httpx 扫描记录数据类""" def __init__(self, data: Dict[str, Any]): self.url = _sanitize_string(data.get('url', '')) self.input = _sanitize_string(data.get('input', '')) self.title = _sanitize_string(data.get('title', '')) self.status_code = data.get('status_code') # int,不需要清理 self.content_length = data.get('content_length') # int,不需要清理 self.content_type = _sanitize_string(data.get('content_type', '')) self.location = _sanitize_string(data.get('location', '')) self.webserver = _sanitize_string(data.get('webserver', '')) self.response_body = _sanitize_string(data.get('body', '')) self.tech = [_sanitize_string(t) for t in data.get('tech', []) if isinstance(t, str)] # 列表中的字符串也需要清理 self.vhost = data.get('vhost') # bool,不需要清理 self.failed = data.get('failed', False) # bool,不需要清理 self.response_headers = _sanitize_string(data.get('raw_header', '')) # 从 URL 中提取主机名(优先使用 httpx 返回的 host,否则自动提取) httpx_host = _sanitize_string(data.get('host', '')) self.host = httpx_host if httpx_host else _extract_hostname(self.url) def _parse_and_validate_line(line: str) -> Optional[HttpxRecord]: """ 解析并验证单行 httpx JSON 输出 Args: line: 单行输出数据 Returns: Optional[HttpxRecord]: 有效的 httpx 记录,或 None 如果验证失败 """ try: # 清理 NUL 字符后再解析 JSON line = _sanitize_string(line) # 解析 JSON try: line_data = json.loads(line, strict=False) except json.JSONDecodeError: return None # 验证数据类型 if not isinstance(line_data, dict): logger.info("跳过非字典数据") return None # 创建记录 record = HttpxRecord(line_data) # 验证必要字段 if not record.url: logger.info("URL 为空,跳过 - 数据: %s", str(line_data)[:200]) return None return record except Exception: logger.info("跳过无法解析的行: %s", line[:100] if line else 'empty') return None def _parse_httpx_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[HttpxRecord, None, None]: """ 流式解析 httpx 命令输出 Args: cmd: httpx 命令 tool_name: 工具名称('httpx') cwd: 工作目录 shell: 是否使用 shell 执行 timeout: 命令执行超时时间(秒) log_file: 日志文件路径 Yields: HttpxRecord: 每次 yield 一条存活的 URL 记录 """ logger.info("开始流式解析 httpx 输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 valid_records = 0 try: # 使用 execute_stream 获取实时输出流 for line in execute_stream( cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file ): total_lines += 1 # 解析并验证单行数据 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue valid_records += 1 # yield 一条有效记录(存活的 URL) yield record # 每处理 100 条记录输出一次进度 if valid_records % 100 == 0: logger.info("已解析 %d 条存活的 URL...", valid_records) except subprocess.TimeoutExpired as e: error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) # 超时是可预期的,使用 warning 级别 raise RuntimeError(error_msg) from e except Exception as e: logger.error("流式解析命令输出失败: %s", e, exc_info=True) raise logger.info( "流式解析完成 - 总行数: %d, 存活 URL: %d, 无效/死链: %d", total_lines, valid_records, error_lines ) def _validate_task_parameters(cmd: str, target_id: int, scan_id: int, cwd: Optional[str]) -> None: """ 验证任务参数的有效性 Args: cmd: 扫描命令 target_id: 目标ID scan_id: 扫描ID cwd: 工作目录 Raises: ValueError: 参数验证失败 """ if not cmd or not cmd.strip(): raise ValueError("扫描命令不能为空") if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") if scan_id is None: raise ValueError("scan_id 不能为 None,必须指定扫描ID") # 验证工作目录(如果指定) if cwd and not Path(cwd).exists(): raise ValueError(f"工作目录不存在: {cwd}") def _build_final_result(stats: dict) -> dict: """ 构建最终结果并输出日志 Args: stats: 处理统计信息 Returns: dict: 最终结果 """ logger.info( "✓ URL 验证任务完成 - 处理记录: %d(%d 批次),创建端点: %d,跳过(失败): %d", stats['processed_records'], stats['batch_count'], stats['created_endpoints'], stats['skipped_failed'] ) # 如果没有创建任何记录,给出明确提示 if stats['created_endpoints'] == 0: logger.warning( "⚠️ 没有创建任何端点记录!可能原因:1) 命令输出格式问题 2) 重复数据被忽略 3) 所有请求都失败" ) return { 'processed_records': stats['processed_records'], 'created_endpoints': stats['created_endpoints'], 'skipped_failed': stats['skipped_failed'] } def _cleanup_resources(data_generator) -> None: """ 清理任务资源 Args: data_generator: 数据生成器 """ # 确保生成器被正确关闭 if data_generator is not None: try: data_generator.close() logger.debug("已关闭数据生成器") except Exception as gen_close_error: logger.error("关闭生成器时出错: %s", gen_close_error) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3 ) -> dict: """ 保存一个批次的 URL(带重试机制) Args: batch: 数据批次 scan_id: 扫描任务ID target_id: 目标ID batch_num: 批次编号 services: Service 集合 max_retries: 最大重试次数 Returns: dict: { 'success': bool, 'created_endpoints': int, 'skipped_failed': int } """ for attempt in range(max_retries): try: stats = _save_batch(batch, scan_id, target_id, batch_num, services) return { 'success': True, 'created_endpoints': stats.get('created_endpoints', 0), 'skipped_failed': stats.get('skipped_failed', 0) } except IntegrityError as e: # 唯一约束等数据完整性错误通常意味着重复数据,这里记录错误但不让整个扫描失败 logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return { 'success': False, 'created_endpoints': 0, 'skipped_failed': 0 } except (OperationalError, DatabaseError, InterfaceError) as e: # 数据库级错误(连接中断、表结构不匹配等):按指数退避重试,最终失败时抛出异常让 Flow 失败 if attempt < max_retries - 1: wait_time = 2 ** attempt logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100] ) time.sleep(wait_time) else: logger.error( "批次 %d 保存失败(已重试 %d 次),将终止任务: %s", batch_num, max_retries, e, exc_info=True, ) # 让上层 Task 感知失败,从而标记整个扫描为失败 raise except Exception as e: # 其他未知异常也不再吞掉,直接抛出以便 Flow 标记为失败 logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) raise # 理论上不会走到这里,保留兜底返回值以满足类型约束 return { 'success': False, 'created_endpoints': 0, 'skipped_failed': 0 } def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet ) -> dict: """ 保存一个批次的数据到数据库 Args: batch: 数据批次,list of HttpxRecord scan_id: 扫描任务 ID target_id: 目标 ID batch_num: 批次编号 services: Service 集合 Returns: dict: 包含创建和跳过记录的统计信息 """ # 参数验证 if not isinstance(batch, list): raise TypeError(f"batch 必须是 list 类型,实际: {type(batch).__name__}") if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return { 'created_endpoints': 0, 'skipped_failed': 0 } # 统计变量 skipped_failed = 0 # 批量构造 Endpoint 快照 DTO from apps.asset.dtos.snapshot import EndpointSnapshotDTO snapshots = [] for record in batch: # 跳过失败的请求 if record.failed: skipped_failed += 1 continue try: # Endpoint URL 直接使用原始值,不做标准化 # 原因:Endpoint URL 来自 waymore/katana,包含路径和参数,标准化可能改变含义 url = record.input if record.input else record.url # 提取 host 字段(域名或IP地址) host = record.host if record.host else '' dto = EndpointSnapshotDTO( scan_id=scan_id, target_id=target_id, url=url, host=host, title=record.title if record.title else '', status_code=record.status_code, content_length=record.content_length, location=record.location if record.location else '', webserver=record.webserver if record.webserver else '', content_type=record.content_type if record.content_type else '', tech=record.tech if isinstance(record.tech, list) else [], response_body=record.response_body if record.response_body else '', vhost=record.vhost if record.vhost else False, matched_gf_patterns=[], response_headers=record.response_headers if record.response_headers else '', ) snapshots.append(dto) except Exception as e: logger.error("处理记录失败: %s,错误: %s", record.url, e) continue if snapshots: try: # 通过快照服务统一保存快照并同步到资产表 services.snapshot.save_and_sync(snapshots) count = len(snapshots) logger.info( "批次 %d: 保存了 %d 个存活的 URL(共 %d 个,跳过失败: %d)", batch_num, count, len(batch), skipped_failed ) return { 'created_endpoints': count, 'skipped_failed': skipped_failed } except Exception as e: logger.error("批次 %d 批量保存失败: %s", batch_num, e) raise return { 'created_endpoints': 0, 'skipped_failed': skipped_failed } def _accumulate_batch_stats(total_stats: dict, batch_result: dict) -> None: """ 累加批次统计信息 Args: total_stats: 总统计信息字典 batch_result: 批次结果字典 """ total_stats['created_endpoints'] += batch_result.get('created_endpoints', 0) total_stats['skipped_failed'] += batch_result.get('skipped_failed', 0) def _process_batch( batch: list, scan_id: int, target_id: int, batch_num: int, total_stats: dict, failed_batches: list, services: ServiceSet ) -> None: """ 处理单个批次 Args: batch: 数据批次 scan_id: 扫描ID target_id: 目标ID batch_num: 批次编号 total_stats: 总统计信息 failed_batches: 失败批次列表 services: Service 集合(必须,依赖注入) """ result = _save_batch_with_retry( batch, scan_id, target_id, batch_num, services ) # 累计统计信息(失败时可能有部分数据已保存) _accumulate_batch_stats(total_stats, result) if not result['success']: failed_batches.append(batch_num) logger.warning( "批次 %d 保存失败,但已累计统计信息:创建端点=%d", batch_num, result.get('created_endpoints', 0) ) def _process_records_in_batches( data_generator, scan_id: int, target_id: int, batch_size: int, services: ServiceSet ) -> dict: """ 流式处理记录并分批保存 Args: data_generator: 数据生成器 scan_id: 扫描ID target_id: 目标ID batch_size: 批次大小 services: Service 集合 Returns: dict: 处理统计信息 Raises: RuntimeError: 存在失败批次时抛出 """ total_records = 0 batch_num = 0 failed_batches = [] batch = [] # 统计信息 total_stats = { 'created_endpoints': 0, 'skipped_failed': 0 } # 流式读取生成器并分批保存 for record in data_generator: batch.append(record) total_records += 1 # 达到批次大小,执行保存 if len(batch) >= batch_size: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) batch = [] # 清空批次 # 每 10 个批次输出进度 if batch_num % 10 == 0: logger.info("进度: 已处理 %d 批次,%d 条记录", batch_num, total_records) # 保存最后一批 if batch: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) # 检查失败批次 if failed_batches: error_msg = ( f"流式保存 URL 验证结果时出现失败批次,处理记录: {total_records}," f"失败批次: {failed_batches}" ) logger.warning(error_msg) raise RuntimeError(error_msg) return { 'processed_records': total_records, 'batch_count': batch_num, **total_stats } @task(name="run_and_stream_save_urls", retries=0) def run_and_stream_save_urls_task( cmd: str, tool_name: str, scan_id: int, target_id: int, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 100, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> dict: """ 执行 httpx 验证并流式保存存活的 URL 该任务将: 1. 验证输入参数 2. 初始化资源(缓存、生成器) 3. 流式处理记录并分批保存 4. 构建并返回结果统计 Args: cmd: httpx 命令 tool_name: 工具名称('httpx') scan_id: 扫描任务 ID target_id: 目标 ID cwd: 工作目录(可选) shell: 是否使用 shell 执行(默认 False) batch_size: 批次大小(默认 500) timeout: 超时时间(秒) log_file: 日志文件路径 Returns: dict: { 'processed_records': int, # 处理的记录总数 'created_endpoints': int, # 创建的端点记录数 'skipped_failed': int, # 因请求失败跳过的记录数 } Raises: ValueError: 参数验证失败 RuntimeError: 命令执行或数据库操作失败 subprocess.TimeoutExpired: 命令执行超时 """ logger.info( "开始执行流式 URL 验证任务 - target_id=%s, 超时=%s秒, 命令: %s", target_id, timeout if timeout else '无限制', cmd ) data_generator = None try: # 1. 验证参数 _validate_task_parameters(cmd, target_id, scan_id, cwd) # 2. 初始化资源 data_generator = _parse_httpx_stream_output( cmd, tool_name, cwd, shell, timeout, log_file ) services = ServiceSet.create_default() # 3. 流式处理记录并分批保存 stats = _process_records_in_batches( data_generator, scan_id, target_id, batch_size, services ) # 4. 构建最终结果 return _build_final_result(stats) except subprocess.TimeoutExpired: # 超时异常直接向上传播,保留异常类型 logger.warning( "⚠️ URL 验证任务超时 - target_id=%s, 超时=%s秒", target_id, timeout ) raise # 直接重新抛出,不包装 except Exception as e: error_msg = f"流式执行 URL 验证任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: # 5. 清理资源 _cleanup_resources(data_generator) ================================================ FILE: backend/apps/scan/tasks/url_fetch/run_url_fetcher_task.py ================================================ """ 执行 URL 获取工具任务 负责运行单个 URL 获取工具(waymore、katana 等)。 注意: - 输入文件(domains_file 或 sites_file)和命令的构建在 Flow 层完成 - 任务内部只负责执行已经构建好的命令并校验 / 统计结果 """ import logging from pathlib import Path from prefect import task from apps.scan.utils import execute_and_wait logger = logging.getLogger(__name__) @task( name='run_url_fetcher', retries=0, # 不重试,工具本身会处理 log_prints=True ) def run_url_fetcher_task( tool_name: str, command: str, timeout: int, output_file: str ) -> dict: """ 执行单个 URL 获取工具 Args: tool_name: 工具名称 command: 完整的命令字符串(由 Flow 层使用命令构建器生成) timeout: 命令执行超时时间(秒) output_file: 输出文件完整路径 Returns: dict: { 'tool': str, # 工具名称 'output_file': str, # 输出文件路径 'url_count': int, # 发现的 URL 数量 'target_count': int, # 处理的目标数量(占位,始终为 1) 'success': bool } """ output_file_path = Path(output_file) log_file = str(output_file_path.with_suffix('.log')) try: logger.info("开始执行 URL 获取工具 %s", tool_name) # 使用通用命令执行器 result = execute_and_wait( tool_name=tool_name, command=command, timeout=timeout, log_file=log_file ) # 验证输出文件是否生成 if not output_file_path.exists(): logger.warning( "URL 获取工具 %s 未生成结果文件: %s (returncode: %d)", tool_name, str(output_file_path), result['returncode'] ) return { 'tool': tool_name, 'output_file': output_file, 'url_count': 0, 'target_count': 0, 'success': False } # 检查文件大小 file_size = output_file_path.stat().st_size if file_size == 0: logger.warning("URL 获取工具 %s 生成的结果文件为空: %s", tool_name, output_file_path) return { 'tool': tool_name, 'output_file': output_file, 'url_count': 0, 'target_count': 0, 'success': False } # 统计 URL 数量(不在此处去重,全局去重交由 merge_and_deduplicate_urls_task 处理) final_count = 0 with open(output_file, 'r') as f: final_count = sum(1 for line in f if line.strip()) logger.info( "✓ URL 获取工具 %s 完成 - 结果文件: %s (URL 数量: %d)", tool_name, str(output_file_path), final_count ) return { 'tool': tool_name, 'output_file': output_file, 'url_count': final_count, 'target_count': 1, 'success': final_count > 0 } except RuntimeError: # 直接向上抛出(execute_and_wait 已记录详细日志) raise except Exception as e: error_msg = f"URL 获取工具 {tool_name} 执行异常: {e}" logger.error(error_msg, exc_info=True) raise ================================================ FILE: backend/apps/scan/tasks/url_fetch/save_urls_task.py ================================================ """ 保存 URL 到数据库任务 批量保存发现的 URL 到 Endpoint 表 支持批量插入和去重 """ import logging from pathlib import Path from prefect import task from typing import List, Optional from urllib.parse import urlparse from dataclasses import dataclass logger = logging.getLogger(__name__) @dataclass class ParsedURL: """解析后的 URL 数据""" url: str domain: str path: str query: Optional[str] method: str = 'GET' # 默认方法 def _parse_url(url: str) -> Optional[ParsedURL]: """ 解析 URL 提取各个组件 Args: url: 完整 URL Returns: ParsedURL 或 None(如果解析失败) """ try: # 确保有协议 if not url.startswith(('http://', 'https://')): url = f'http://{url}' parsed = urlparse(url) # 提取域名 domain = parsed.netloc if not domain: return None # 提取路径(默认为 /) path = parsed.path if parsed.path else '/' # 提取查询参数 query = parsed.query if parsed.query else None # 重建完整 URL(标准化) scheme = parsed.scheme if parsed.scheme else 'http' full_url = f"{scheme}://{domain}{path}" if query: full_url = f"{full_url}?{query}" return ParsedURL( url=full_url, domain=domain, path=path, query=query ) except Exception as e: logger.debug(f"解析 URL 失败 {url}: {e}") return None @task( name='save_urls', retries=1, log_prints=True ) def save_urls_task( urls_file: str, scan_id: int, target_id: int, batch_size: int = 1000 ) -> dict: """ 保存 URL 到数据库 Args: urls_file: URL 文件路径 scan_id: 扫描 ID target_id: 目标 ID batch_size: 批次大小 Returns: dict: { 'saved_urls': int, # 保存的 URL 数量 'total_urls': int, # 总 URL 数量 'skipped_urls': int # 跳过的 URL 数量 } """ try: logger.info(f"开始保存 URL 到数据库 - 扫描ID: {scan_id}, 目标ID: {target_id}") # 导入快照服务和 DTO from apps.asset.services.snapshot import EndpointSnapshotsService from apps.asset.dtos.snapshot import EndpointSnapshotDTO # 创建快照服务(统一负责快照 + 资产双写) snapshots_service = EndpointSnapshotsService() # 按批次流式读取并解析 URL,避免一次性加载全部到内存 total_urls = 0 invalid_urls = 0 valid_urls = 0 saved_count = 0 skipped_count = 0 batch_index = 0 current_batch: list[EndpointSnapshotDTO] = [] with open(urls_file, 'r') as f: for line in f: url = line.strip() if not url: continue total_urls += 1 # 解析 URL parsed = _parse_url(url) if not parsed: invalid_urls += 1 continue valid_urls += 1 current_batch.append( EndpointSnapshotDTO( scan_id=scan_id, url=parsed.url, host=parsed.domain, # 设置 host 字段 target_id=target_id, # 用于同步到资产表 ) ) # 达到批次大小时写入数据库 if len(current_batch) >= batch_size: batch_index += 1 try: snapshots_service.save_and_sync(current_batch) created_count = len(current_batch) saved_count += created_count logger.debug(f"批次 {batch_index}: 保存 {created_count} 个 URL") except Exception as e: logger.error(f"批量保存失败(批次 {batch_index}): {e}") skipped_count += len(current_batch) finally: current_batch = [] # 处理最后不足一个批次的 URL if current_batch: batch_index += 1 try: snapshots_service.save_and_sync(current_batch) created_count = len(current_batch) saved_count += created_count logger.debug(f"批次 {batch_index}: 保存 {created_count} 个 URL") except Exception as e: logger.error(f"批量保存失败(批次 {batch_index}): {e}") skipped_count += len(current_batch) if valid_urls == 0: logger.warning("没有有效的 URL 需要保存") return { 'saved_urls': 0, 'total_urls': total_urls, 'skipped_urls': invalid_urls, } logger.info( "准备保存 %d 个有效 URL(总计: %d,无效: %d)", valid_urls, total_urls, invalid_urls, ) # 计算最终跳过的数量(包括无效 URL 和保存失败的 URL) final_skipped = total_urls - saved_count logger.info( f"✓ URL 保存完成 - 保存: {saved_count}, " f"跳过: {final_skipped}(包括重复和无效), 总计: {total_urls}" ) return { 'saved_urls': saved_count, 'total_urls': total_urls, 'skipped_urls': final_skipped } except Exception as e: logger.error(f"保存 URL 失败: {e}", exc_info=True) raise RuntimeError(f"保存 URL 失败: {e}") from e ================================================ FILE: backend/apps/scan/tasks/vuln_scan/__init__.py ================================================ """漏洞扫描任务模块 包含: - export_endpoints_task: 导出端点 URL 到文件 - run_vuln_tool_task: 执行漏洞扫描工具(非流式) - run_and_stream_save_dalfox_vulns_task: Dalfox 流式执行并保存漏洞结果 - run_and_stream_save_nuclei_vulns_task: Nuclei 流式执行并保存漏洞结果 """ from .export_endpoints_task import export_endpoints_task from .run_vuln_tool_task import run_vuln_tool_task from .run_and_stream_save_dalfox_vulns_task import run_and_stream_save_dalfox_vulns_task from .run_and_stream_save_nuclei_vulns_task import run_and_stream_save_nuclei_vulns_task __all__ = [ "export_endpoints_task", "run_vuln_tool_task", "run_and_stream_save_dalfox_vulns_task", "run_and_stream_save_nuclei_vulns_task", ] ================================================ FILE: backend/apps/scan/tasks/vuln_scan/export_endpoints_task.py ================================================ """导出 Endpoint URL 到文件的 Task 支持两种模式: 1. 传统模式(向后兼容):使用 target_id 从数据库导出 2. Provider 模式:使用 TargetProvider 从任意数据源导出 数据源优先级(回退链,仅传统模式): 1. Endpoint.url - 最精细的 URL(含路径、参数等) 2. WebSite.url - 站点级别 URL 3. 默认生成 - 根据 Target 类型生成 http(s)://target_name """ import logging from typing import Dict, Optional from pathlib import Path from prefect import task from apps.scan.services.target_export_service import ( export_urls_with_fallback, DataSource, ) from apps.scan.providers import TargetProvider, DatabaseTargetProvider logger = logging.getLogger(__name__) @task(name="export_endpoints") def export_endpoints_task( target_id: Optional[int] = None, output_file: str = "", provider: Optional[TargetProvider] = None, batch_size: int = 1000, ) -> Dict[str, object]: """导出目标下的所有 Endpoint URL 到文本文件。 支持两种模式: 1. 传统模式(向后兼容):传入 target_id,从数据库导出 2. Provider 模式:传入 provider,从任意数据源导出 数据源优先级(回退链,仅传统模式): 1. Endpoint 表 - 最精细的 URL(含路径、参数等) 2. WebSite 表 - 站点级别 URL 3. 默认生成 - 根据 Target 类型生成 http(s)://target_name Args: target_id: 目标 ID(传统模式,向后兼容) output_file: 输出文件路径(绝对路径) provider: TargetProvider 实例(新模式) batch_size: 每次从数据库迭代的批大小 Returns: dict: { "success": bool, "output_file": str, "total_count": int, "source": str, # 数据来源: "endpoint" | "website" | "default" | "none" | "provider" } """ # 参数验证:至少提供一个 if target_id is None and provider is None: raise ValueError("必须提供 target_id 或 provider 参数之一") # Provider 模式:使用 TargetProvider 导出 if provider is not None: logger.info("使用 Provider 模式 - Provider: %s", type(provider).__name__) return _export_with_provider(output_file, provider) # 传统模式:使用 export_urls_with_fallback logger.info("使用传统模式 - Target ID: %d", target_id) result = export_urls_with_fallback( target_id=target_id, output_file=output_file, sources=[DataSource.ENDPOINT, DataSource.WEBSITE, DataSource.DEFAULT], batch_size=batch_size, ) logger.info( "URL 导出完成 - source=%s, count=%d, tried=%s", result['source'], result['total_count'], result['tried_sources'] ) return { "success": result['success'], "output_file": result['output_file'], "total_count": result['total_count'], "source": result['source'], } def _export_with_provider(output_file: str, provider: TargetProvider) -> Dict[str, object]: """使用 Provider 导出 URL""" output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) total_count = 0 blacklist_filter = provider.get_blacklist_filter() with open(output_path, 'w', encoding='utf-8', buffering=8192) as f: for url in provider.iter_urls(): # 应用黑名单过滤(如果有) if blacklist_filter and not blacklist_filter.is_allowed(url): continue f.write(f"{url}\n") total_count += 1 if total_count % 1000 == 0: logger.info("已导出 %d 个 URL...", total_count) logger.info("✓ URL 导出完成 - 总数: %d, 文件: %s", total_count, str(output_path)) return { "success": True, "output_file": str(output_path), "total_count": total_count, "source": "provider", } ================================================ FILE: backend/apps/scan/tasks/vuln_scan/run_and_stream_save_dalfox_vulns_task.py ================================================ """基于 execute_stream 的 Dalfox XSS 漏洞流式扫描任务 主要功能: 1. 实时执行 Dalfox 漏洞扫描命令 2. 流式处理命令输出,解析为统一的漏洞记录 3. 批量保存到 VulnerabilitySnapshot 表 4. 避免生成大量临时文件,提高效率 数据流向: 命令执行 → 流式输出 → 实时解析 → 批量保存 → 数据库 注意: Dalfox 的 JSON 输出为数组形式:首行为 '[',每条记录一行,行尾带逗号,末行为 ']' 本任务在解析阶段会: - 跳过 '['、']' 等控制行 - 去掉每条记录末尾的逗号,再做 json 解析 """ import logging import json import subprocess import time from asyncio import CancelledError from pathlib import Path from dataclasses import dataclass from typing import Generator, Optional, TYPE_CHECKING from prefect import task from django.db import IntegrityError, OperationalError, DatabaseError from psycopg2 import InterfaceError from apps.common.definitions import VulnSeverity, ScanStatus from apps.asset.dtos.snapshot import VulnerabilitySnapshotDTO from apps.scan.utils import execute_stream from apps.scan.models import Scan if TYPE_CHECKING: from apps.asset.services.snapshot import VulnerabilitySnapshotsService logger = logging.getLogger(__name__) @dataclass class ServiceSet: """Service 集合,用于依赖注入 提供漏洞扫描所需的 Service 实例,便于测试时注入 Mock 对象。 """ snapshot: "VulnerabilitySnapshotsService" @classmethod def create_default(cls) -> "ServiceSet": """创建默认的 Service 集合""" from apps.asset.services.snapshot import VulnerabilitySnapshotsService return cls(snapshot=VulnerabilitySnapshotsService()) def _validate_task_parameters(cmd: str, target_id: int, scan_id: int, cwd: Optional[str]) -> None: """验证任务参数的有效性。""" if not cmd or not cmd.strip(): raise ValueError("扫描命令不能为空") if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") if scan_id is None: raise ValueError("scan_id 不能为 None,必须指定扫描ID") if cwd and not Path(cwd).exists(): raise ValueError(f"工作目录不存在: {cwd}") def _map_severity(raw: Optional[str]) -> str: """将 Dalfox 的严重性字符串映射为内部 VulnSeverity。""" value = (raw or "").strip().lower() mapping = { "info": VulnSeverity.INFO, "information": VulnSeverity.INFO, "low": VulnSeverity.LOW, "medium": VulnSeverity.MEDIUM, "med": VulnSeverity.MEDIUM, "high": VulnSeverity.HIGH, "critical": VulnSeverity.CRITICAL, } return mapping.get(value, VulnSeverity.UNKNOWN) def _parse_and_validate_line(line: str) -> Optional[dict]: """解析并验证单行 Dalfox JSON 输出。 处理步骤: 1. 去除首尾空白 2. 跳过 '['、']' 等数组控制行 3. 去掉行尾逗号 4. 解析 JSON 并验证必要字段 """ try: raw = line.strip() if not raw: return None # 跳过数组控制行 if raw in ("[", "]", "],"): return None # 去掉尾部逗号 if raw.endswith(","): raw = raw[:-1].rstrip() try: data = json.loads(raw, strict=False) except json.JSONDecodeError: # logger.info("跳过非 JSON 行: %s", raw) return None if not isinstance(data, dict): logger.info("跳过非字典数据") return None # Dalfox 输出中的 URL 字段为 data url = (data.get("data") or "").strip() if not url: logger.info("跳过缺少 URL 的记录") return None severity = _map_severity(data.get("severity")) # 漏洞类型:根据 type 字段区分 XSS 类型 # R=Reflected, S=Stored, V=Verified type_code = data.get("type", "") type_map = {"R": "xss-reflected", "S": "xss-stored", "V": "xss-verified"} vuln_type = type_map.get(type_code, "xss") # 简化描述:只用 message_str,完整信息在 raw_output description = data.get("message_str") or "" return { "url": url, "vuln_type": vuln_type, "severity": severity, "source": "dalfox", "cvss_score": None, "description": description, "raw_output": data, # 存储解析后的 dict,而不是原始字符串 } except Exception: logger.info("跳过无法解析的行: %s", line[:100]) return None def _parse_dalfox_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None, ) -> Generator[dict, None, None]: """流式解析 Dalfox 漏洞扫描命令输出。""" logger.info("开始流式解析 Dalfox 漏洞扫描命令输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 valid_records = 0 try: for line in execute_stream( cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file, ): total_lines += 1 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue valid_records += 1 yield record if valid_records % 100 == 0: logger.info("已解析 %d 条有效漏洞记录...", valid_records) except subprocess.TimeoutExpired as e: error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) raise RuntimeError(error_msg) from e except Exception as e: logger.error("流式解析 Dalfox 命令输出失败: %s", e, exc_info=True) raise logger.info( "流式解析完成 - 总行数: %d, 有效记录: %d, 错误行数: %d", total_lines, valid_records, error_lines, ) def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, ) -> int: """保存一个批次的漏洞记录到数据库(使用快照 Service,同步到资产表)。""" if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return 0 snapshot_items = [] for record in batch: try: dto = VulnerabilitySnapshotDTO( scan_id=scan_id, target_id=target_id, url=record["url"], vuln_type=record["vuln_type"], severity=str(record["severity"]), source=record["source"], cvss_score=record.get("cvss_score"), description=record.get("description", ""), raw_output=record.get("raw_output", ""), ) snapshot_items.append(dto) except Exception as e: logger.error("构建漏洞快照 DTO 失败: %s,记录: %s", e, str(record)[:200]) continue if snapshot_items: services.snapshot.save_and_sync(snapshot_items) logger.info("批次 %d: 保存了 %d 条漏洞记录(共 %d 条)", batch_num, len(snapshot_items), len(batch)) return len(snapshot_items) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3, ) -> dict: """保存一个批次的漏洞记录(带重试机制)。""" for attempt in range(max_retries): try: created = _save_batch(batch, scan_id, target_id, batch_num, services) return {"success": True, "created_vulns": created} except IntegrityError as e: logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return {"success": False, "created_vulns": 0} except (OperationalError, DatabaseError, InterfaceError) as e: if attempt < max_retries - 1: wait_time = 2 ** attempt logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100], ) time.sleep(wait_time) else: logger.error("批次 %d 保存失败(已重试 %d 次): %s", batch_num, max_retries, e) return {"success": False, "created_vulns": 0} except Exception as e: logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) return {"success": False, "created_vulns": 0} return {"success": False, "created_vulns": 0} def _accumulate_batch_stats(total_stats: dict, batch_result: dict) -> None: """累加批次统计信息。""" total_stats["created_vulns"] += batch_result.get("created_vulns", 0) def _process_batch( batch: list, scan_id: int, target_id: int, batch_num: int, total_stats: dict, failed_batches: list, services: ServiceSet, ) -> None: """处理单个批次。""" result = _save_batch_with_retry(batch, scan_id, target_id, batch_num, services) _accumulate_batch_stats(total_stats, result) if not result["success"]: failed_batches.append(batch_num) logger.warning( "批次 %d 保存失败,但已累计统计信息:创建漏洞=%d", batch_num, result.get("created_vulns", 0), ) def _process_records_in_batches( data_generator, scan_id: int, target_id: int, batch_size: int, services: ServiceSet, ) -> dict: """流式处理记录并分批保存。""" total_records = 0 batch_num = 0 failed_batches = [] batch = [] cancel_check_interval = 50 # 每处理50条检查一次取消信号 total_stats = {"created_vulns": 0} for record in data_generator: if cancel_check_interval > 0 and (total_records % cancel_check_interval == 0): _raise_if_cancelled(scan_id) batch.append(record) total_records += 1 if len(batch) >= batch_size: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) batch = [] if batch_num % 20 == 0: logger.info("进度: 已处理 %d 批次,%d 条记录", batch_num, total_records) if batch: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) _raise_if_cancelled(scan_id) if failed_batches: error_msg = ( f"流式保存漏洞扫描结果时出现失败批次,处理记录: {total_records}," f"失败批次: {failed_batches}" ) logger.warning(error_msg) raise RuntimeError(error_msg) return { "processed_records": total_records, "batch_count": batch_num, **total_stats, } def _build_final_result(stats: dict) -> dict: """构建最终结果并输出日志。""" logger.info( "✓ Dalfox 流式保存完成 - 处理记录: %d(%d 批次),创建漏洞: %d", stats["processed_records"], stats["batch_count"], stats["created_vulns"], ) if stats["created_vulns"] == 0: logger.warning( "⚠️ 没有创建任何漏洞记录!可能原因:1) Dalfox 未发现漏洞 2) 输出格式问题 3) 重复数据被忽略" ) return { "processed_records": stats["processed_records"], "created_vulns": stats["created_vulns"], } def _cleanup_resources(data_generator) -> None: """清理任务资源。""" if data_generator is None: return try: data_generator.close() logger.debug("已关闭数据生成器") except Exception as gen_close_error: logger.error("关闭生成器时出错: %s", gen_close_error) @task( name="run_and_stream_save_dalfox_vulns", retries=0, log_prints=True, ) def run_and_stream_save_dalfox_vulns_task( cmd: str, tool_name: str, scan_id: int, target_id: int, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 1, # Dalfox 漏洞结果本来就不会特别多,可以改小点实时写入 timeout: Optional[int] = None, log_file: Optional[str] = None, ) -> dict: """执行 Dalfox 漏洞扫描命令并流式保存结果到数据库。""" logger.info( "开始执行 Dalfox 流式漏洞扫描任务 - target_id=%s, 超时=%s秒, 命令: %s", target_id, timeout if timeout else "无限制", cmd, ) data_generator = None try: _validate_task_parameters(cmd, target_id, scan_id, cwd) data_generator = _parse_dalfox_stream_output( cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file, ) services = ServiceSet.create_default() stats = _process_records_in_batches( data_generator, scan_id, target_id, batch_size, services, ) return _build_final_result(stats) except CancelledError: logger.warning( "⚠️ Dalfox 漏洞扫描任务检测到取消信号,正在终止 - scan_id=%s, target_id=%s", scan_id, target_id, ) raise except subprocess.TimeoutExpired: logger.warning( "⚠️ Dalfox 漏洞扫描任务超时 - target_id=%s, 超时=%s秒。超时前已解析的数据已保存到数据库。", target_id, timeout, ) raise except Exception as e: error_msg = f"流式执行 Dalfox 漏洞扫描任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: _cleanup_resources(data_generator) def _raise_if_cancelled(scan_id: int) -> None: """检测扫描是否已请求取消,若是则抛出 CancelledError 以触发 Prefect 取消流程。""" status = Scan.objects.filter(id=scan_id).values_list("status", flat=True).first() if status == ScanStatus.CANCELLED: logger.warning("检测到取消信号,终止 Dalfox 漏洞扫描 - scan_id=%s", scan_id) raise CancelledError() ================================================ FILE: backend/apps/scan/tasks/vuln_scan/run_and_stream_save_nuclei_vulns_task.py ================================================ """基于 execute_stream 的 Nuclei 漏洞流式扫描任务 主要功能: 1. 实时执行 Nuclei 漏洞扫描命令 2. 流式处理命令输出,解析为统一的漏洞记录 3. 批量保存到 VulnerabilitySnapshot 表 4. 避免生成大量临时文件,提高效率 数据流向: 命令执行 → 流式输出 → 实时解析 → 批量保存 → 数据库 注意: Nuclei 的 JSON 输出(-j 参数)为每行一条完整 JSON 对象。 """ import logging import json import subprocess import time from asyncio import CancelledError from pathlib import Path from dataclasses import dataclass from typing import Generator, Optional, TYPE_CHECKING from prefect import task from django.db import IntegrityError, OperationalError, DatabaseError from psycopg2 import InterfaceError from apps.common.definitions import VulnSeverity, ScanStatus from apps.asset.dtos.snapshot import VulnerabilitySnapshotDTO from apps.scan.utils import execute_stream from apps.scan.models import Scan if TYPE_CHECKING: from apps.asset.services.snapshot import VulnerabilitySnapshotsService logger = logging.getLogger(__name__) @dataclass class ServiceSet: """Service 集合,用于依赖注入""" snapshot: "VulnerabilitySnapshotsService" @classmethod def create_default(cls) -> "ServiceSet": """创建默认的 Service 集合""" from apps.asset.services.snapshot import VulnerabilitySnapshotsService return cls(snapshot=VulnerabilitySnapshotsService()) def _validate_task_parameters(cmd: str, target_id: int, scan_id: int, cwd: Optional[str]) -> None: """验证任务参数的有效性。""" if not cmd or not cmd.strip(): raise ValueError("扫描命令不能为空") if target_id is None: raise ValueError("target_id 不能为 None,必须指定目标ID") if scan_id is None: raise ValueError("scan_id 不能为 None,必须指定扫描ID") if cwd and not Path(cwd).exists(): raise ValueError(f"工作目录不存在: {cwd}") def _map_severity(raw: Optional[str]) -> str: """将 Nuclei 的严重性字符串映射为内部 VulnSeverity。""" value = (raw or "").strip().lower() mapping = { "info": VulnSeverity.INFO, "information": VulnSeverity.INFO, "low": VulnSeverity.LOW, "medium": VulnSeverity.MEDIUM, "high": VulnSeverity.HIGH, "critical": VulnSeverity.CRITICAL, } return mapping.get(value, VulnSeverity.UNKNOWN) def _parse_and_validate_line(line: str) -> Optional[dict]: """解析并验证单行 Nuclei JSON 输出。 Nuclei JSON 输出格式(每行一条完整 JSON): { "template": "dns/caa-fingerprint.yaml", "template-id": "caa-fingerprint", "info": { "name": "CAA Record", "severity": "info", "description": "...", "tags": ["dns", "caa"], "classification": {"cve-id": null, "cwe-id": ["cwe-200"]} }, "host": "test.yyhuni.rest", "matched-at": "test.yyhuni.rest", "type": "dns", "timestamp": "2025-12-04T17:33:31.903288+08:00", "matcher-status": true } """ try: raw = line.strip() if not raw: return None try: # strict=False 允许 JSON 中包含控制字符(如换行符、制表符等) # Nuclei 输出的 response 字段可能包含原始 HTTP 响应,其中有控制字符 data = json.loads(raw, strict=False) except json.JSONDecodeError: # logger.info("跳过非 JSON 行: %s", raw) return None if not isinstance(data, dict): logger.info("跳过非字典数据") return None # 提取 info 字段 info = data.get("info", {}) if not isinstance(info, dict): info = {} # URL: 优先用 matched-at,其次用 host url = data.get("matched-at") or data.get("host") or "" if not url: logger.info("跳过缺少 URL 的记录: %s", data.get("template-id", "unknown")) return None # 严重性 severity = _map_severity(info.get("severity")) # 漏洞类型:使用 template-id 作为类型标识 vuln_type = data.get("template-id", "unknown") # 简化描述:只用 info.name,完整信息在 raw_output description = info.get("name", "") return { "url": url, "vuln_type": vuln_type, "severity": severity, "source": "nuclei", "cvss_score": None, "description": description, "raw_output": data, # 存储解析后的 dict,而不是原始字符串 } except Exception: logger.info("跳过无法解析的行: %s", line[:100]) return None def _parse_nuclei_stream_output( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, timeout: Optional[int] = None, log_file: Optional[str] = None, ) -> Generator[dict, None, None]: """流式解析 Nuclei 漏洞扫描命令输出。""" logger.info("开始流式解析 Nuclei 漏洞扫描命令输出 - 命令: %s", cmd) total_lines = 0 error_lines = 0 valid_records = 0 try: for line in execute_stream( cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file, ): total_lines += 1 record = _parse_and_validate_line(line) if record is None: error_lines += 1 continue valid_records += 1 yield record if valid_records % 100 == 0: logger.info("已解析 %d 条有效漏洞记录...", valid_records) except subprocess.TimeoutExpired as e: error_msg = f"流式解析命令输出超时 - 命令执行超过 {timeout} 秒" logger.warning(error_msg) raise RuntimeError(error_msg) from e except Exception as e: logger.error("流式解析 Nuclei 命令输出失败: %s", e, exc_info=True) raise logger.info( "流式解析完成 - 总行数: %d, 有效记录: %d, 错误行数: %d", total_lines, valid_records, error_lines, ) def _save_batch( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, ) -> int: """保存一个批次的漏洞记录到数据库。""" if not batch: logger.debug("批次 %d 为空,跳过处理", batch_num) return 0 snapshot_items = [] for record in batch: try: dto = VulnerabilitySnapshotDTO( scan_id=scan_id, target_id=target_id, url=record["url"], vuln_type=record["vuln_type"], severity=str(record["severity"]), source=record["source"], cvss_score=record.get("cvss_score"), description=record.get("description", ""), raw_output=record.get("raw_output", ""), ) snapshot_items.append(dto) except Exception as e: logger.error("构建漏洞快照 DTO 失败: %s,记录: %s", e, str(record)[:200]) continue if snapshot_items: services.snapshot.save_and_sync(snapshot_items) logger.info("批次 %d: 保存了 %d 条漏洞记录(共 %d 条)", batch_num, len(snapshot_items), len(batch)) return len(snapshot_items) def _save_batch_with_retry( batch: list, scan_id: int, target_id: int, batch_num: int, services: ServiceSet, max_retries: int = 3, ) -> dict: """保存一个批次的漏洞记录(带重试机制)。""" for attempt in range(max_retries): try: created = _save_batch(batch, scan_id, target_id, batch_num, services) return {"success": True, "created_vulns": created} except IntegrityError as e: logger.error("批次 %d 数据完整性错误,跳过: %s", batch_num, str(e)[:100]) return {"success": False, "created_vulns": 0} except (OperationalError, DatabaseError, InterfaceError) as e: if attempt < max_retries - 1: wait_time = 2 ** attempt logger.warning( "批次 %d 保存失败(第 %d 次尝试),%d秒后重试: %s", batch_num, attempt + 1, wait_time, str(e)[:100], ) time.sleep(wait_time) else: logger.error("批次 %d 保存失败(已重试 %d 次): %s", batch_num, max_retries, e) return {"success": False, "created_vulns": 0} except Exception as e: logger.error("批次 %d 未知错误: %s", batch_num, e, exc_info=True) return {"success": False, "created_vulns": 0} return {"success": False, "created_vulns": 0} def _accumulate_batch_stats(total_stats: dict, batch_result: dict) -> None: """累加批次统计信息。""" total_stats["created_vulns"] += batch_result.get("created_vulns", 0) def _process_batch( batch: list, scan_id: int, target_id: int, batch_num: int, total_stats: dict, failed_batches: list, services: ServiceSet, ) -> None: """处理单个批次。""" result = _save_batch_with_retry(batch, scan_id, target_id, batch_num, services) _accumulate_batch_stats(total_stats, result) if not result["success"]: failed_batches.append(batch_num) logger.warning( "批次 %d 保存失败,但已累计统计信息:创建漏洞=%d", batch_num, result.get("created_vulns", 0), ) def _process_records_in_batches( data_generator, scan_id: int, target_id: int, batch_size: int, services: ServiceSet, ) -> dict: """流式处理记录并分批保存。""" total_records = 0 batch_num = 0 failed_batches = [] batch = [] cancel_check_interval = 50 # 每处理50条检查一次取消信号 total_stats = {"created_vulns": 0} for record in data_generator: if cancel_check_interval > 0 and (total_records % cancel_check_interval == 0): _raise_if_cancelled(scan_id) batch.append(record) total_records += 1 if len(batch) >= batch_size: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) batch = [] if batch_num % 20 == 0: logger.info("进度: 已处理 %d 批次,%d 条记录", batch_num, total_records) if batch: batch_num += 1 _process_batch(batch, scan_id, target_id, batch_num, total_stats, failed_batches, services) _raise_if_cancelled(scan_id) if failed_batches: error_msg = ( f"流式保存漏洞扫描结果时出现失败批次,处理记录: {total_records}," f"失败批次: {failed_batches}" ) logger.warning(error_msg) raise RuntimeError(error_msg) return { "processed_records": total_records, "batch_count": batch_num, **total_stats, } def _build_final_result(stats: dict) -> dict: """构建最终结果并输出日志。""" logger.info( "✓ Nuclei 流式保存完成 - 处理记录: %d(%d 批次),创建漏洞: %d", stats["processed_records"], stats["batch_count"], stats["created_vulns"], ) if stats["created_vulns"] == 0: logger.warning( "⚠️ 没有创建任何漏洞记录!可能原因:1) Nuclei 未发现漏洞 2) 输出格式问题 3) 重复数据被忽略" ) return { "processed_records": stats["processed_records"], "created_vulns": stats["created_vulns"], } def _cleanup_resources(data_generator) -> None: """清理任务资源。""" if data_generator is None: return try: data_generator.close() logger.debug("已关闭数据生成器") except Exception as gen_close_error: logger.error("关闭生成器时出错: %s", gen_close_error) @task( name="run_and_stream_save_nuclei_vulns", retries=0, log_prints=True, ) def run_and_stream_save_nuclei_vulns_task( cmd: str, tool_name: str, scan_id: int, target_id: int, cwd: Optional[str] = None, shell: bool = False, batch_size: int = 10, # Nuclei 结果可能较多,适当增大批次 timeout: Optional[int] = None, log_file: Optional[str] = None, ) -> dict: """执行 Nuclei 漏洞扫描命令并流式保存结果到数据库。""" logger.info( "开始执行 Nuclei 流式漏洞扫描任务 - target_id=%s, 超时=%s秒, 命令: %s", target_id, timeout if timeout else "无限制", cmd, ) data_generator = None try: _validate_task_parameters(cmd, target_id, scan_id, cwd) data_generator = _parse_nuclei_stream_output( cmd=cmd, tool_name=tool_name, cwd=cwd, shell=shell, timeout=timeout, log_file=log_file, ) services = ServiceSet.create_default() stats = _process_records_in_batches( data_generator, scan_id, target_id, batch_size, services, ) return _build_final_result(stats) except CancelledError: logger.warning( "⚠️ Nuclei 漏洞扫描任务检测到取消信号,正在终止 - scan_id=%s, target_id=%s", scan_id, target_id, ) raise except subprocess.TimeoutExpired: logger.warning( "⚠️ Nuclei 漏洞扫描任务超时 - target_id=%s, 超时=%s秒。超时前已解析的数据已保存到数据库。", target_id, timeout, ) raise except Exception as e: error_msg = f"流式执行 Nuclei 漏洞扫描任务失败: {e}" logger.error(error_msg, exc_info=True) raise RuntimeError(error_msg) from e finally: _cleanup_resources(data_generator) def _raise_if_cancelled(scan_id: int) -> None: """检测扫描是否已请求取消,若是则抛出 CancelledError 以触发 Prefect 取消流程。""" status = Scan.objects.filter(id=scan_id).values_list("status", flat=True).first() if status == ScanStatus.CANCELLED: logger.warning("检测到取消信号,终止 Nuclei 漏洞扫描 - scan_id=%s", scan_id) raise CancelledError() ================================================ FILE: backend/apps/scan/tasks/vuln_scan/run_vuln_tool_task.py ================================================ """执行漏洞扫描工具任务 负责运行单个漏洞扫描工具(目前主要是 Dalfox XSS)。 注意: - 命令构建在 Flow 层完成,这里只负责执行已经构建好的命令 - 使用通用 execute_and_wait 统一管理超时和日志 """ import logging from typing import Dict from prefect import task from apps.scan.utils import execute_and_wait logger = logging.getLogger(__name__) @task( name="run_vuln_tool", retries=0, log_prints=True, ) def run_vuln_tool_task( tool_name: str, command: str, timeout: int, log_file: str | None = None, ) -> Dict[str, object]: """执行单个漏洞扫描工具。 Args: tool_name: 工具名称(如 "dalfox_xss") command: 完整命令字符串(由 Flow 层构建) timeout: 命令执行超时时间(秒) log_file: 日志文件路径 Returns: dict: execute_and_wait 的返回结果字典,并附加 tool 字段。 """ try: logger.info("开始执行漏洞扫描工具 %s", tool_name) result = execute_and_wait( tool_name=tool_name, command=command, timeout=timeout, log_file=log_file, ) # 保持与 execute_and_wait 一致的字段,并额外附加工具名 return { "tool": tool_name, **result, } except RuntimeError: # execute_and_wait 已经记录详细日志,这里直接向上抛出 raise except Exception as e: error_msg = f"漏洞扫描工具 {tool_name} 执行异常: {e}" logger.error(error_msg, exc_info=True) raise ================================================ FILE: backend/apps/scan/urls.py ================================================ from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import ScanViewSet, ScheduledScanViewSet, ScanLogListView, SubfinderProviderSettingsView from .notifications.views import notification_callback from apps.asset.views import ( SubdomainSnapshotViewSet, WebsiteSnapshotViewSet, DirectorySnapshotViewSet, EndpointSnapshotViewSet, HostPortMappingSnapshotViewSet, VulnerabilitySnapshotViewSet, ScreenshotSnapshotViewSet ) # 创建路由器 router = DefaultRouter() # 注册 ViewSet router.register(r'scans', ScanViewSet, basename='scan') router.register(r'scheduled-scans', ScheduledScanViewSet, basename='scheduled-scan') # Scan 下的嵌套快照路由 scan_subdomains_list = SubdomainSnapshotViewSet.as_view({'get': 'list'}) scan_subdomains_export = SubdomainSnapshotViewSet.as_view({'get': 'export'}) scan_websites_list = WebsiteSnapshotViewSet.as_view({'get': 'list'}) scan_websites_export = WebsiteSnapshotViewSet.as_view({'get': 'export'}) scan_directories_list = DirectorySnapshotViewSet.as_view({'get': 'list'}) scan_directories_export = DirectorySnapshotViewSet.as_view({'get': 'export'}) scan_endpoints_list = EndpointSnapshotViewSet.as_view({'get': 'list'}) scan_endpoints_export = EndpointSnapshotViewSet.as_view({'get': 'export'}) scan_ip_addresses_list = HostPortMappingSnapshotViewSet.as_view({'get': 'list'}) scan_ip_addresses_export = HostPortMappingSnapshotViewSet.as_view({'get': 'export'}) scan_vulnerabilities_list = VulnerabilitySnapshotViewSet.as_view({'get': 'list'}) scan_screenshots_list = ScreenshotSnapshotViewSet.as_view({'get': 'list'}) scan_screenshots_image = ScreenshotSnapshotViewSet.as_view({'get': 'image'}) urlpatterns = [ path('', include(router.urls)), # Worker 回调 API path('callbacks/notification/', notification_callback, name='notification-callback'), # API Key 配置 path('settings/api-keys/', SubfinderProviderSettingsView.as_view(), name='subfinder-provider-settings'), # 扫描日志 API path('scans/<int:scan_id>/logs/', ScanLogListView.as_view(), name='scan-logs-list'), # 嵌套路由:/api/scans/{scan_pk}/xxx/ path('scans/<int:scan_pk>/subdomains/', scan_subdomains_list, name='scan-subdomains-list'), path('scans/<int:scan_pk>/subdomains/export/', scan_subdomains_export, name='scan-subdomains-export'), path('scans/<int:scan_pk>/websites/', scan_websites_list, name='scan-websites-list'), path('scans/<int:scan_pk>/websites/export/', scan_websites_export, name='scan-websites-export'), path('scans/<int:scan_pk>/directories/', scan_directories_list, name='scan-directories-list'), path('scans/<int:scan_pk>/directories/export/', scan_directories_export, name='scan-directories-export'), path('scans/<int:scan_pk>/endpoints/', scan_endpoints_list, name='scan-endpoints-list'), path('scans/<int:scan_pk>/endpoints/export/', scan_endpoints_export, name='scan-endpoints-export'), path('scans/<int:scan_pk>/ip-addresses/', scan_ip_addresses_list, name='scan-ip-addresses-list'), path('scans/<int:scan_pk>/ip-addresses/export/', scan_ip_addresses_export, name='scan-ip-addresses-export'), path('scans/<int:scan_pk>/vulnerabilities/', scan_vulnerabilities_list, name='scan-vulnerabilities-list'), path('scans/<int:scan_pk>/screenshots/', scan_screenshots_list, name='scan-screenshots-list'), path('scans/<int:scan_pk>/screenshots/<int:pk>/image/', scan_screenshots_image, name='scan-screenshots-image'), ] ================================================ FILE: backend/apps/scan/utils/__init__.py ================================================ """ 扫描模块工具包 提供扫描相关的工具函数。 """ from . import config_parser from .command_builder import build_scan_command from .command_executor import execute_and_wait, execute_stream from .directory_cleanup import remove_directory from .nuclei_helpers import ensure_nuclei_templates_local from .performance import CommandPerformanceTracker, FlowPerformanceTracker from .system_load import check_system_load, wait_for_system_load from .user_logger import user_log from .wordlist_helpers import ensure_wordlist_local from .workspace_utils import setup_scan_directory, setup_scan_workspace __all__ = [ # 目录清理 'remove_directory', # 工作空间 'setup_scan_workspace', 'setup_scan_directory', # 命令构建 'build_scan_command', # 命令执行 'execute_and_wait', 'execute_stream', # 系统负载 'wait_for_system_load', 'check_system_load', # 字典文件 'ensure_wordlist_local', # Nuclei 模板 'ensure_nuclei_templates_local', # 性能监控 'FlowPerformanceTracker', 'CommandPerformanceTracker', # 扫描日志 'user_log', # 配置解析 'config_parser', ] ================================================ FILE: backend/apps/scan/utils/command_builder.py ================================================ """ 简化的命令构建工具 使用 Python 原生 f-string 和条件拼接,零依赖,性能更好。 """ import logging from typing import Dict, Any logger = logging.getLogger(__name__) def build_scan_command( tool_name: str, scan_type: str, command_params: Dict[str, Any], tool_config: Dict[str, Any] ) -> str: """ 构建扫描工具命令(使用 f-string) Args: tool_name: 工具名称(如 'subfinder') scan_type: 扫描类型(如 'subdomain_discovery') command_params: 命令占位符参数 - domain: 目标域名 - domains_file: 域名列表文件(用于端口扫描) - url_file: URL列表文件(用于站点扫描) - target_file: 目标文件路径(通用) - output_file: 输出文件路径 tool_config: 工具配置参数(包含可选参数) - threads: 线程数 - timeout: 超时时间(秒) - 其他可选参数... Returns: 完整的命令字符串 Example: >>> build_scan_command( ... tool_name='subfinder', ... scan_type='subdomain_discovery', ... command_params={'domain': 'example.com', 'output_file': '/tmp/out.txt'}, ... tool_config={'threads': 10} ... ) 'subfinder -d example.com -o /tmp/out.txt -silent -t 10' """ from apps.scan.configs.command_templates import get_command_template, SCAN_TOOLS_BASE_PATH # 获取命令模板 template = get_command_template(scan_type, tool_name) if not template: raise ValueError(f"未找到工具 {tool_name} 的命令模板(扫描类型: {scan_type})") # 合并所有参数,并将中划线统一转成下划线 # 规范约定: # - 配置文件(YAML):参数名用中划线,贴近 CLI 原生参数(如 rate-limit, request-timeout) # - 模板文件(Python):参数名用下划线,符合 str.format() 占位符语法要求 # - 此处自动转换:rate-limit → rate_limit def normalize_key(k): return k.replace('-', '_') if isinstance(k, str) else k all_params = { 'scan_tools_base': SCAN_TOOLS_BASE_PATH, **{normalize_key(k): v for k, v in command_params.items()}, **{normalize_key(k): v for k, v in tool_config.items()} } # nuclei 特殊处理:要求 template_args 必填(支持多 -t),避免格式化缺失 if tool_name == "nuclei": if not all_params.get("template_args"): raise ValueError("nuclei 命令构建缺少 template_args(请检查模板仓库列表配置)") try: # 1. 构建基础命令 base_command = template['base'].format(**all_params) # 2. 拼接可选参数 optional_parts = [] for param_name, flag_template in template.get('optional', {}).items(): # 检查参数是否存在且有值 if param_name in all_params and all_params[param_name]: optional_parts.append(flag_template.format(**all_params)) # 3. 组合完整命令 full_command = base_command if optional_parts: full_command += ' ' + ' '.join(optional_parts) # 4. 清理多余空白 import re cleaned_command = re.sub(r'\s+', ' ', full_command).strip() return cleaned_command except KeyError as e: raise ValueError( f"命令构建失败:缺少必需参数 {e}\n" f"模板: {template}\n" f"提供的参数: {list(all_params.keys())}" ) except Exception as e: raise ValueError( f"命令构建失败: {e}\n" f"模板: {template}\n" f"提供的参数: {list(all_params.keys())}" ) ================================================ FILE: backend/apps/scan/utils/command_executor.py ================================================ """ 命令执行器 统一管理所有命令执行方式: - execute_and_wait(): 等待式执行,适合输出到文件的工具 - execute_stream(): 流式执行,适合实时处理输出的工具 性能监控: - 自动记录命令执行耗时、内存使用 - 输出到 performance logger """ import logging import os import re import signal import subprocess import threading import time from collections import deque from datetime import datetime from pathlib import Path from typing import Dict, Any, Optional, Generator from django.conf import settings try: # 可选依赖:用于根据 CPU / 内存负载做动态并发控制 import psutil except ImportError: # 运行环境缺少 psutil 时降级为无动态负载控制 psutil = None logger = logging.getLogger(__name__) # 延迟导入,避免循环依赖 def _get_command_tracker(tool_name: str, command: str): """获取命令性能追踪器(延迟导入)""" from apps.scan.utils.performance import CommandPerformanceTracker return CommandPerformanceTracker(tool_name, command) # 常量定义 GRACEFUL_SHUTDOWN_TIMEOUT = 5 # 进程优雅退出的超时时间(秒) MAX_LOG_TAIL_LINES = 1000 # 日志文件读取的最大行数 # 命令日志配置(从环境变量读取) # ENABLE_COMMAND_LOGGING=true: 输出所有内容(命令输出+错误)到log_file_path # ENABLE_COMMAND_LOGGING=false: 只输出错误到log_file_path ENABLE_COMMAND_LOGGING = getattr(settings, 'ENABLE_COMMAND_LOGGING', True) # 动态并发控制阈值(可在 Django settings 中覆盖) SCAN_CPU_HIGH = getattr(settings, 'SCAN_CPU_HIGH', 90.0) # CPU 高水位(百分比) SCAN_MEM_HIGH = getattr(settings, 'SCAN_MEM_HIGH', 80.0) # 内存高水位(百分比) SCAN_LOAD_CHECK_INTERVAL = getattr(settings, 'SCAN_LOAD_CHECK_INTERVAL', 180) # 负载检查间隔(秒) SCAN_COMMAND_STARTUP_DELAY = getattr(settings, 'SCAN_COMMAND_STARTUP_DELAY', 5) # 命令启动前等待(秒) _ACTIVE_COMMANDS = 0 _ACTIVE_COMMANDS_LOCK = threading.Lock() def _wait_for_system_load() -> None: """根据当前机器 CPU/内存负载,决定是否暂缓启动新的外部命令。""" # 1. 先强制等待,让之前启动的命令有时间消耗资源,避免并发启动导致延迟OOM if SCAN_COMMAND_STARTUP_DELAY > 0: time.sleep(SCAN_COMMAND_STARTUP_DELAY) # 2. 再检查系统负载 if psutil is None: raise ImportError("psutil 未安装,无法进行负载感知控制") while True: cpu = psutil.cpu_percent(interval=0.5) mem = psutil.virtual_memory().percent if cpu < SCAN_CPU_HIGH and mem < SCAN_MEM_HIGH: return logger.info( "系统负载较高,任务将排队执行,防止oom: cpu=%.1f%% (阈值 %.1f%%), mem=%.1f%% (阈值 %.1f%%)", cpu, SCAN_CPU_HIGH, mem, SCAN_MEM_HIGH, ) time.sleep(SCAN_LOAD_CHECK_INTERVAL) class CommandExecutor: """ 统一的命令执行器 提供两种执行模式: 1. execute_and_wait() - 等待式执行(适合文件输出) 2. execute_stream() - 流式执行(适合实时处理) """ def _write_command_start_header(self, log_file: Path, tool_name: str, command: str, timeout: Optional[int] = None): """ 在命令开始时写入头部信息 """ if not ENABLE_COMMAND_LOGGING: return try: with open(log_file, 'w', encoding='utf-8') as f: f.write(f"$ {command}\n") f.write(f"{'='*60}\n") f.write(f"# 工具: {tool_name}\n") f.write(f"# 开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") if timeout is not None: f.write(f"# 超时限制: {timeout}秒\n") f.write(f"# 状态: 执行中...\n") f.write(f"{'='*60}\n\n") except Exception as e: logger.error(f"写入命令开始信息失败: {e}") def _write_command_end_footer(self, log_file: Path, tool_name: str, duration: float, returncode: int, success: bool): """ 在命令结束时追加尾部信息 """ if not ENABLE_COMMAND_LOGGING: return try: with open(log_file, 'a', encoding='utf-8') as f: f.write(f"\n{'='*60}\n") f.write(f"# 结束时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") f.write(f"# 执行耗时: {duration:.2f}秒\n") f.write(f"# 退出码: {returncode}\n") f.write(f"# 状态: {'✓ 成功' if success else '✗ 失败'}\n") f.write(f"{'='*60}\n") logger.info(f"📝 {tool_name} 日志: {log_file} (耗时: {duration:.2f}秒)") except Exception as e: logger.error(f"写入命令结束信息失败: {e}") def _clean_output_line(self, line: str, suffix_char: Optional[str] = None) -> Optional[str]: """ 统一的输出行清理处理 处理顺序: 1. 去除首尾空白 2. 跳过空行 3. 处理字面转义字符串(如 \\x0d\\x0a) 4. 移除 ANSI 转义序列 5. 清理控制字符 6. 移除指定后缀字符 Args: line: 原始输出行 suffix_char: 要移除的末尾字符 Returns: 清理后的行内容,如果是空行则返回 None """ # 1. 去除行首尾的空白字符 line = line.strip() # 2. 跳过空行 if not line: return None # 3. 处理字面转义字符串(罕见但可能存在) # 处理常见的字面转义序列 escape_mappings = { '\\x0d\\x0a': '\n', # Windows 换行符字面量 '\\x0a': '\n', # Unix 换行符字面量 '\\x0d': '\r', # 回车符字面量 '\\r\\n': '\n', # 常见的转义表示 '\\n': '\n', # 换行符转义 '\\r': '\r', # 回车符转义 '\\t': '\t', # 制表符转义 } for literal, actual in escape_mappings.items(): if literal in line: line = line.replace(literal, actual) # 4. 移除 ANSI 转义序列(颜色、格式等控制字符) ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') line = ansi_escape.sub('', line) # 5. 清理控制字符 line = line.replace('\x00', '') # 移除 NUL 字符 line = line.replace('\r', '') # 移除回车符 line = line.replace('\b', '') # 移除退格符 line = line.replace('\f', '') # 移除换页符 line = line.replace('\v', '') # 移除垂直制表符 # 6. 再次去除空白(清理后可能产生新的空白) line = line.strip() if not line: return None # 7. 如果指定了后缀字符,移除末尾的后缀字符 if suffix_char and line.endswith(suffix_char): line = line[:-1].strip() if not line: return None return line def _kill_process_tree(self, process: subprocess.Popen) -> None: """ 强制终止进程树 当使用 shell=True 时,process.pid 是 shell 的 PID。 如果不杀掉整个进程组,shell 的子进程(实际工具)会变成孤儿进程继续运行。 """ if process.poll() is not None: return try: # 尝试杀掉进程组(需要进程启动时设置 start_new_session=True) os.killpg(os.getpgid(process.pid), signal.SIGKILL) logger.debug(f"已终止进程组: PGID={process.pid}") except ProcessLookupError: pass # 进程已不存在 except Exception as e: logger.warning(f"终止进程组失败 ({e}),尝试普通 kill") try: process.kill() except Exception: pass def execute_and_wait( self, tool_name: str, command: str, timeout: int, log_file: Optional[str] = None ) -> Dict[str, Any]: """ 等待式执行:启动命令并等待完成 适用场景:工具输出到文件(如 subfinder -o output.txt) Args: tool_name: 工具名称(用于日志) command: 完整的扫描命令(包含输出文件参数) timeout: 超时时间(秒) log_file: 日志文件路径(可选,None 表示丢弃 stderr) Returns: dict: { 'success': bool, # 命令是否成功执行(returncode == 0) 'returncode': int, # 命令退出码 'log_file': str | None # 日志文件路径 } Raises: ValueError: 参数验证失败 RuntimeError: 执行失败或超时 """ global _ACTIVE_COMMANDS # 验证参数 if not tool_name: raise ValueError("工具名称不能为空") if not command: raise ValueError("扫描命令不能为空") if timeout <= 0: raise ValueError(f"超时时间必须大于0: {timeout}") logger.info("开始运行扫描工具: %s", tool_name) # 准备日志文件 log_file_path = Path(log_file) if log_file else None # 记录开始时间(用于计算执行时间) start_time = datetime.now() # 初始化性能追踪器 perf_tracker = _get_command_tracker(tool_name, command) perf_tracker.start() process = None log_file_handle = None acquired_slot = False # 标记是否已增加全局活动命令计数 try: # 在启动新的外部命令之前,先根据 CPU/内存负载判断是否需要等待 _wait_for_system_load() acquired_slot = True if _ACTIVE_COMMANDS_LOCK: with _ACTIVE_COMMANDS_LOCK: _ACTIVE_COMMANDS += 1 current_active = _ACTIVE_COMMANDS else: current_active = 0 logger.info( "登记活动命令计数: tool=%s, active=%d", tool_name, current_active, ) logger.debug("执行命令: %s", command) if log_file_path: logger.debug("日志文件: %s", log_file_path) else: logger.debug("日志输出: 丢弃") # 准备输出流 stdout_target = subprocess.DEVNULL stderr_target = subprocess.DEVNULL if log_file_path: # 先写入命令开始信息 if ENABLE_COMMAND_LOGGING: self._write_command_start_header(log_file_path, tool_name, command, timeout) # 以追加模式打开日志文件 log_file_handle = open(log_file_path, 'a', encoding='utf-8', buffering=1) if ENABLE_COMMAND_LOGGING: stdout_target = log_file_handle stderr_target = subprocess.STDOUT else: stderr_target = log_file_handle # 启动进程 # 使用 start_new_session=True 创建新会话,使子进程成为新进程组的首领 # 这样我们可以通过 killpg 杀掉整个进程树 process = subprocess.Popen( command, stdin=subprocess.DEVNULL, shell=True, stdout=stdout_target, stderr=stderr_target, text=True, start_new_session=True ) # 设置进程 PID 用于性能追踪 perf_tracker.set_pid(process.pid) # 等待完成 process.communicate(timeout=timeout) # 检查执行结果 returncode = process.returncode success = (returncode == 0) # 计算执行时间 duration = (datetime.now() - start_time).total_seconds() # 追加命令结束信息(如果开启且有日志文件) if log_file_path and ENABLE_COMMAND_LOGGING: self._write_command_end_footer(log_file_path, tool_name, duration, returncode, success) command_log_file = str(log_file_path) if log_file_path else None if not success: # 命令执行失败,尝试读取错误日志 error_output = "" if log_file_path: error_output = self._read_log_tail(log_file_path, max_lines=MAX_LOG_TAIL_LINES) logger.warning( "扫描工具 %s 返回非零状态码: %d (执行时间: %.2f秒)", tool_name, returncode, duration ) if error_output: for line in error_output.strip().split('\n'): if line.strip(): logger.warning("%s", line) else: logger.info("✓ 扫描工具 %s 执行完成 (执行时间: %.2f秒)", tool_name, duration) # 记录性能日志 perf_tracker.finish(success=success, duration=duration, timeout=timeout) return { 'success': success, 'returncode': returncode, 'log_file': str(log_file_path) if log_file_path else None, 'command_log_file': command_log_file, 'duration': duration } except subprocess.TimeoutExpired as e: # 计算超时时的执行时间 duration = (datetime.now() - start_time).total_seconds() # 追加超时结束信息 if log_file_path and ENABLE_COMMAND_LOGGING: self._write_command_end_footer(log_file_path, tool_name, duration, -1, False) # 记录性能日志(超时) perf_tracker.finish(success=False, duration=duration, timeout=timeout, is_timeout=True) error_msg = f"扫描工具 {tool_name} 执行超时({timeout}秒,实际执行: {duration:.2f}秒)" logger.error(error_msg) if log_file_path and log_file_path.exists(): logger.debug("超时日志已保存: %s", log_file_path) raise RuntimeError(error_msg) from e except subprocess.SubprocessError as e: error_msg = f"扫描工具 {tool_name} 执行失败: {e}" logger.error(error_msg) raise RuntimeError(error_msg) from e except Exception as e: # 捕获所有异常(包括 Prefect 取消引发的 CancelledError 等) # 确保在 finally 块中清理进程 error_msg = f"扫描工具 {tool_name} 执行异常(可能是被中断): {e}" logger.error(error_msg, exc_info=True) raise finally: # 关键修复:确保进程树被清理 if process: self._kill_process_tree(process) # 关闭文件句柄 if log_file_handle: try: log_file_handle.close() except Exception: pass if acquired_slot: if _ACTIVE_COMMANDS_LOCK: with _ACTIVE_COMMANDS_LOCK: if _ACTIVE_COMMANDS > 0: _ACTIVE_COMMANDS -= 1 current_active = _ACTIVE_COMMANDS else: current_active = 0 logger.info( "释放活动命令计数: tool=%s, active=%d", tool_name, current_active, ) def execute_stream( self, cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, encoding: str = 'utf-8', suffix_char: Optional[str] = None, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[str, None, None]: """ 流式执行:逐行返回输出 适用场景:工具流式输出 JSON(如 naabu -json) Args: cmd: 要执行的命令 tool_name: 工具名称(用于日志记录) cwd: 工作目录 shell: 是否使用 shell 执行 encoding: 编码格式 suffix_char: 末尾后缀字符(用于移除) timeout: 命令执行超时时间(秒),None 表示不设置超时 log_file: 日志文件路径(可选) Yields: str: 每行输出的内容(已处理:去空白、去ANSI、去后缀) Raises: subprocess.TimeoutExpired: 命令执行超时 """ global _ACTIVE_COMMANDS # 记录开始时间(用于命令日志) start_time = datetime.now() acquired_slot = False # 初始化性能追踪器 perf_tracker = _get_command_tracker(tool_name, cmd) perf_tracker.start() # 准备日志文件路径 log_file_path = Path(log_file) if log_file else None if log_file_path: logger.debug(f"日志文件: {log_file_path}") else: logger.debug("日志输出: 丢弃") # 根据是否使用shell来格式化命令 command = cmd if shell else cmd.split() # 日志文件句柄 log_file_handle = None # 启动子进程,根据日志策略决定输出方向 if log_file_path: # 先写入命令开始信息 if ENABLE_COMMAND_LOGGING: self._write_command_start_header(log_file_path, tool_name, cmd, timeout) # 以追加模式打开日志文件(开始信息已写入) log_file_handle = open(log_file_path, 'a', encoding='utf-8', buffering=1) stdout_target = subprocess.PIPE stderr_target = log_file_handle if ENABLE_COMMAND_LOGGING: stderr_target = subprocess.STDOUT if not acquired_slot: # 日志模式下,在真正启动进程前做一次负载检查,并登记活动命令计数 _wait_for_system_load() acquired_slot = True if _ACTIVE_COMMANDS_LOCK: with _ACTIVE_COMMANDS_LOCK: _ACTIVE_COMMANDS += 1 current_active = _ACTIVE_COMMANDS else: current_active = 0 logger.info( "登记活动命令计数: tool=%s, active=%d", tool_name, current_active, ) process = subprocess.Popen( command, stdin=subprocess.DEVNULL, stdout=stdout_target, stderr=stderr_target, cwd=cwd, universal_newlines=True, encoding=encoding, shell=shell, start_new_session=True # 关键:创建新进程组 ) else: # 无日志文件:正常流式输出 if not acquired_slot: # 非日志模式,同样在启动进程前做一次负载检查,并登记活动命令计数 _wait_for_system_load() acquired_slot = True if _ACTIVE_COMMANDS_LOCK: with _ACTIVE_COMMANDS_LOCK: _ACTIVE_COMMANDS += 1 current_active = _ACTIVE_COMMANDS else: current_active = 0 logger.info( "登记活动命令计数: tool=%s, active=%d", tool_name, current_active, ) process = subprocess.Popen( command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=cwd, universal_newlines=True, encoding=encoding, shell=shell, start_new_session=True # 关键:创建新进程组 ) # 设置进程 PID 用于性能追踪 perf_tracker.set_pid(process.pid) # 超时控制:使用 Timer 在指定时间后终止进程 timed_out_event = threading.Event() def _kill_when_timeout(): timed_out_event.set() if process.poll() is None: # 进程还在运行 logger.warning(f"命令执行超时({timeout}秒),正在终止进程: {cmd}") self._kill_process_tree(process) # 使用新的终止方法 timer = None if timeout is not None: timer = threading.Timer(timeout, _kill_when_timeout) timer.start() try: # 逐行读取进程输出 stdout = process.stdout assert stdout is not None, "stdout should not be None when stdout=PIPE" for line in iter(lambda: stdout.readline(), ''): if not line: break # 统一字符处理 cleaned_line = self._clean_output_line(line, suffix_char) if cleaned_line is None: continue # 跳过空行 line = cleaned_line # 如果开启命令日志且有日志文件,同时写入日志文件 if log_file_handle and ENABLE_COMMAND_LOGGING: log_file_handle.write(line + '\n') log_file_handle.flush() # 直接返回行内容,由调用者负责解析 yield line finally: # 1. 停止定时器(如果还没触发) if timer: timer.cancel() timer.join(timeout=0.1) # 等待 timer 线程完全结束,避免悬挂 # 2. 清理进程资源 exit_code = None if timed_out_event.is_set(): # 超时情况:定时器已经处理了进程终止,只需获取退出码 logger.debug("进程已被超时定时器终止,等待进程结束") try: exit_code = process.wait(timeout=1.0) # 等待进程完全退出 except subprocess.TimeoutExpired: logger.warning("进程在超时后仍未退出,强制终止") self._kill_process_tree(process) exit_code = -1 else: # 正常结束:等待进程自然结束 # 如果是被外部中断(如 CancelledError),poll() 应为 None,需要 kill if process.poll() is None: logger.info(f"流式执行被中断,清理进程: {tool_name}") self._kill_process_tree(process) try: exit_code = process.wait(timeout=GRACEFUL_SHUTDOWN_TIMEOUT) except subprocess.TimeoutExpired: logger.warning( "程序未能在%d秒内自然结束,强制终止: %s", GRACEFUL_SHUTDOWN_TIMEOUT, cmd ) self._kill_process_tree(process) exit_code = -2 # 3. 关闭进程流 if process.stdout: process.stdout.close() if process.stderr: process.stderr.close() # 4. 关闭日志文件句柄 if log_file_handle: log_file_handle.close() # 5. 追加命令结束信息(如果开启且有日志文件) duration = (datetime.now() - start_time).total_seconds() success = not timed_out_event.is_set() and (exit_code == 0 if exit_code is not None else True) if log_file_path and ENABLE_COMMAND_LOGGING: # 追加结束信息到日志文件末尾 self._write_command_end_footer(log_file_path, tool_name, duration, exit_code or 0, success) # 6. 记录性能日志 perf_tracker.finish(success=success, duration=duration, timeout=timeout, is_timeout=timed_out_event.is_set()) if acquired_slot: if _ACTIVE_COMMANDS_LOCK: with _ACTIVE_COMMANDS_LOCK: if _ACTIVE_COMMANDS > 0: _ACTIVE_COMMANDS -= 1 current_active = _ACTIVE_COMMANDS else: current_active = 0 logger.info( "释放活动命令计数: tool=%s, active=%d", tool_name, current_active, ) def _read_log_tail(self, log_file: Path, max_lines: int = MAX_LOG_TAIL_LINES) -> str: """ 读取日志文件的末尾部分(常量内存实现) 使用 seek 从文件末尾往前读取,避免将整个文件加载到内存。 Args: log_file: 日志文件路径 max_lines: 最大读取行数 Returns: 日志内容(字符串),读取失败返回错误提示 """ if not log_file.exists(): logger.debug("日志文件不存在: %s", log_file) return "" file_size = log_file.stat().st_size if file_size == 0: logger.debug("日志文件为空: %s", log_file) return "" # 每次读取的块大小(8KB,足够容纳大多数日志行) chunk_size = 8192 def decode_line(line_bytes: bytes) -> str: """解码单行:优先 UTF-8,失败则降级 latin-1""" try: return line_bytes.decode('utf-8') except UnicodeDecodeError: return line_bytes.decode('latin-1', errors='replace') try: with open(log_file, 'rb') as f: lines_found: deque[bytes] = deque() remaining = b'' position = file_size while position > 0 and len(lines_found) < max_lines: read_size = min(chunk_size, position) position -= read_size f.seek(position) chunk = f.read(read_size) + remaining parts = chunk.split(b'\n') # 最前面的部分可能不完整,留到下次处理 remaining = parts[0] # 其余部分是完整的行(从后往前收集,用 appendleft 保持顺序) for part in reversed(parts[1:]): if len(lines_found) >= max_lines: break lines_found.appendleft(part) # 处理文件开头的行 if remaining and len(lines_found) < max_lines: lines_found.appendleft(remaining) return '\n'.join(decode_line(line) for line in lines_found) except PermissionError as e: logger.warning("日志文件权限不足 (%s): %s", log_file, e) return "(无法读取日志文件: 权限不足)" except IOError as e: logger.warning("日志文件读取IO错误 (%s): %s", log_file, e) return f"(无法读取日志文件: IO错误 - {e})" except Exception as e: logger.warning("读取日志文件失败 (%s): %s", log_file, e, exc_info=True) return f"(无法读取日志文件: {type(e).__name__} - {e})" # 单例实例 _executor = CommandExecutor() # 快捷函数 def execute_and_wait( tool_name: str, command: str, timeout: int, log_file: Optional[str] = None ) -> Dict[str, Any]: """ 等待式执行命令(快捷函数) 适用场景:工具输出到文件(如 subfinder -o output.txt) Args: tool_name: 工具名称 command: 扫描命令(包含输出文件参数) timeout: 超时时间(秒) log_file: 日志文件路径(可选) Returns: 执行结果字典(包含 duration 字段) Raises: RuntimeError: 执行失败或超时 """ return _executor.execute_and_wait(tool_name, command, timeout, log_file) def execute_stream( cmd: str, tool_name: str, cwd: Optional[str] = None, shell: bool = False, encoding: str = 'utf-8', suffix_char: Optional[str] = None, timeout: Optional[int] = None, log_file: Optional[str] = None ) -> Generator[str, None, None]: """ 流式执行命令(快捷函数) 适用场景:工具流式输出 JSON(如 naabu -json) Args: cmd: 要执行的命令 tool_name: 工具名称 cwd: 工作目录 shell: 是否使用 shell 执行 encoding: 编码格式 suffix_char: 末尾后缀字符 timeout: 命令执行超时时间(秒) log_file: 日志文件路径(可选) Yields: str: 每行输出的内容 Raises: subprocess.TimeoutExpired: 命令执行超时 """ return _executor.execute_stream(cmd, tool_name, cwd, shell, encoding, suffix_char, timeout, log_file) ================================================ FILE: backend/apps/scan/utils/config_merger.py ================================================ """ 配置合并工具模块 提供多引擎 YAML 配置的冲突检测和合并功能。 """ from typing import List, Tuple import yaml class ConfigConflictError(Exception): """配置冲突异常 当两个或多个引擎定义相同的顶层扫描类型键时抛出。 """ def __init__(self, conflicts: List[Tuple[str, str, str]]): """ 参数: conflicts: (键, 引擎1名称, 引擎2名称) 元组列表 """ self.conflicts = conflicts msg = "; ".join([f"{k} 同时存在于「{e1}」和「{e2}」" for k, e1, e2 in conflicts]) super().__init__(f"扫描类型冲突: {msg}") def merge_engine_configs(engines: List[Tuple[str, str]]) -> str: """ 合并多个引擎的 YAML 配置。 参数: engines: (引擎名称, 配置YAML) 元组列表 返回: 合并后的 YAML 字符串 异常: ConfigConflictError: 当顶层键冲突时 """ if not engines: return "" if len(engines) == 1: return engines[0][1] # 追踪每个顶层键属于哪个引擎 key_to_engine: dict[str, str] = {} conflicts: List[Tuple[str, str, str]] = [] for engine_name, config_yaml in engines: if not config_yaml or not config_yaml.strip(): continue try: parsed = yaml.safe_load(config_yaml) except yaml.YAMLError: # 无效 YAML 跳过 continue if not isinstance(parsed, dict): continue # 检查顶层键冲突 for key in parsed.keys(): if key in key_to_engine: conflicts.append((key, key_to_engine[key], engine_name)) else: key_to_engine[key] = engine_name if conflicts: raise ConfigConflictError(conflicts) # 无冲突,用双换行符连接配置 configs = [] for _, config_yaml in engines: if config_yaml and config_yaml.strip(): configs.append(config_yaml.strip()) return "\n\n".join(configs) ================================================ FILE: backend/apps/scan/utils/config_parser.py ================================================ """ 配置解析器 负责解析引擎配置(YAML)并提取启用的工具及其配置。 架构说明: - 命令模板:在 command_templates.py 中定义(基础命令 + 可选参数映射) - 工具配置:从引擎配置(engine_config YAML 字符串)读取 - 无默认配置文件:所有配置必须在引擎配置中提供 核心函数: - parse_enabled_tools_from_dict(): 解析并过滤启用的工具,返回工具配置字典 返回格式: - {'subfinder': {'enabled': True, 'threads': 10, 'timeout': 600}} - timeout 是必需参数,支持整数或 'auto'(由具体 Flow 处理) """ import logging from typing import Dict, Any logger = logging.getLogger(__name__) def _normalize_config_keys(config: Dict[str, Any]) -> Dict[str, Any]: """ 将配置字典的 key 中划线转换为下划线 规范约定: - 配置文件统一用中划线(贴近 CLI 参数风格) - 代码里统一用下划线(Python 标识符规范) - 此处自动转换:rate-limit → rate_limit Args: config: 原始配置字典 Returns: key 已转换的新字典 Raises: ValueError: 配置为 None 或非字典类型时抛出 """ if config is None: raise ValueError("配置不能为空(None),请检查 YAML 格式,确保冒号后有配置内容或使用 {} 表示空配置") if not isinstance(config, dict): raise ValueError(f"配置格式错误:期望 dict,实际 {type(config).__name__}") return { k.replace('-', '_') if isinstance(k, str) else k: v for k, v in config.items() } def _parse_subdomain_discovery_config(scan_config: Dict[str, Any]) -> Dict[str, Any]: """ 解析子域名发现配置(4阶段流程) 配置格式: { 'passive_tools': {'subfinder': {...}, ...}, 'bruteforce': {'enabled': True, 'subdomain_bruteforce': {...}}, 'permutation': {'enabled': True, 'subdomain_permutation_resolve': {...}}, 'resolve': {'enabled': True, 'subdomain_resolve': {...}} } Args: scan_config: subdomain_discovery 的配置字典 Returns: 配置字典,供 Flow 使用 """ if 'passive_tools' not in scan_config: logger.warning("子域名发现配置缺少 passive_tools") return {} result = {} # Stage 1: 被动收集工具 passive_tools = scan_config.get('passive_tools', {}) enabled_passive = {} for name, config in passive_tools.items(): if isinstance(config, dict) and config.get('enabled', False): enabled_passive[name] = _normalize_config_keys(config) result['passive_tools'] = enabled_passive # Stage 2: 字典爆破(可选) bruteforce = scan_config.get('bruteforce', {}) if bruteforce.get('enabled', False): # 转换内部工具配置的 key normalized_bruteforce = _normalize_config_keys(bruteforce) if 'subdomain_bruteforce' in normalized_bruteforce: normalized_bruteforce['subdomain_bruteforce'] = _normalize_config_keys( normalized_bruteforce['subdomain_bruteforce'] ) result['bruteforce'] = normalized_bruteforce # Stage 3: 变异生成(可选) permutation = scan_config.get('permutation', {}) if permutation.get('enabled', False): normalized_permutation = _normalize_config_keys(permutation) if 'subdomain_permutation_resolve' in normalized_permutation: normalized_permutation['subdomain_permutation_resolve'] = _normalize_config_keys( normalized_permutation['subdomain_permutation_resolve'] ) result['permutation'] = normalized_permutation # Stage 4: 存活验证(可选) resolve = scan_config.get('resolve', {}) if resolve.get('enabled', False): normalized_resolve = _normalize_config_keys(resolve) if 'subdomain_resolve' in normalized_resolve: normalized_resolve['subdomain_resolve'] = _normalize_config_keys( normalized_resolve['subdomain_resolve'] ) result['resolve'] = normalized_resolve logger.info( f"子域名发现: passive={len(enabled_passive)}, " f"bruteforce={'bruteforce' in result}, " f"permutation={'permutation' in result}, " f"resolve={'resolve' in result}" ) return result def parse_enabled_tools_from_dict( scan_type: str, parsed_config: Dict[str, Any] ) -> Dict[str, Dict[str, Any]]: """ 从解析后的配置字典中获取启用的工具及其配置 Args: scan_type: 扫描类型 (subdomain_discovery, port_scan, site_scan, directory_scan) parsed_config: 已解析的配置字典 Returns: 启用的工具配置字典 {tool_name: tool_config} 对于 subdomain_discovery,返回完整的配置结构(支持4阶段增强流程) Raises: ValueError: 配置格式错误或必需参数缺失/无效时抛出 """ if not parsed_config: logger.warning(f"配置字典为空 - scan_type: {scan_type}") return {} if scan_type not in parsed_config: logger.warning(f"配置中未找到扫描类型: {scan_type}") return {} scan_config = parsed_config[scan_type] # 子域名发现支持增强配置格式(4阶段) if scan_type == 'subdomain_discovery': return _parse_subdomain_discovery_config(scan_config) if 'tools' not in scan_config: logger.warning(f"扫描类型 {scan_type} 未配置任何工具") return {} tools = scan_config['tools'] # 过滤出启用的工具 enabled_tools = {} for name, config in tools.items(): if not isinstance(config, dict): raise ValueError(f"工具 {name} 配置格式错误:期望 dict,实际 {type(config).__name__}") # 检查是否启用(默认为 False) enabled_value = config.get('enabled', False) # 验证 enabled 字段类型 if not isinstance(enabled_value, bool): raise ValueError( f"工具 {name} 的 enabled 字段类型错误:期望 bool,实际 {type(enabled_value).__name__}" ) if enabled_value: # timeout 默认为 'auto',由具体 Flow 自动计算 timeout_value = config.get('timeout', 'auto') # 验证 timeout 值的有效性 if timeout_value != 'auto': if isinstance(timeout_value, int): if timeout_value <= 0: raise ValueError(f"工具 {name} 的 timeout 参数无效({timeout_value}),必须大于0") else: raise ValueError( f"工具 {name} 的 timeout 参数类型错误:期望 int 或 'auto',实际 {type(timeout_value).__name__}" ) # 将配置 key 中划线转为下划线,统一给下游代码使用 normalized_config = _normalize_config_keys(config) normalized_config['timeout'] = timeout_value # 确保 timeout 存在 enabled_tools[name] = normalized_config logger.info(f"扫描类型: {scan_type}, 启用工具: {len(enabled_tools)}/{len(tools)}") return enabled_tools ================================================ FILE: backend/apps/scan/utils/directory_cleanup.py ================================================ """ 目录清理工具模块 提供通用的目录清理功能 """ import logging import shutil from pathlib import Path logger = logging.getLogger(__name__) def remove_directory(directory: str) -> bool: """ 删除目录及其所有内容 Args: directory: 目录路径 Returns: 是否删除成功 Warning: 此函数会永久删除目录及其所有内容,请谨慎使用! Example: >>> remove_directory('/path/to/directory') True """ if not directory: logger.warning("目录路径为空,跳过删除") return False try: dir_path = Path(directory) if not dir_path.exists(): logger.warning("目录不存在,无需删除 - Path: %s", directory) return True # 删除整个目录 shutil.rmtree(dir_path) logger.info("✓ 目录已删除 - Path: %s", directory) return True except PermissionError as e: logger.error("权限不足,无法删除目录 - Path: %s, 错误: %s", directory, e) return False except Exception as e: # noqa: BLE001 logger.exception("删除目录失败 - Path: %s, 错误: %s", directory, e) return False __all__ = [ 'remove_directory', ] ================================================ FILE: backend/apps/scan/utils/fingerprint_helpers.py ================================================ """指纹文件本地缓存工具 提供 Worker 侧的指纹文件缓存和版本校验功能,用于: - 指纹识别扫描 (fingerprint_detect_flow) """ import json import logging import os from django.conf import settings logger = logging.getLogger(__name__) # 指纹库映射:lib_name → ensure_func_name FINGERPRINT_LIB_MAP = { 'ehole': 'ensure_ehole_fingerprint_local', 'goby': 'ensure_goby_fingerprint_local', 'wappalyzer': 'ensure_wappalyzer_fingerprint_local', 'fingers': 'ensure_fingers_fingerprint_local', 'fingerprinthub': 'ensure_fingerprinthub_fingerprint_local', 'arl': 'ensure_arl_fingerprint_local', } def ensure_ehole_fingerprint_local() -> str: """ 确保本地存在最新的 EHole 指纹文件(带缓存) 流程: 1. 获取当前指纹库版本 2. 检查缓存文件是否存在且版本匹配 3. 版本不匹配则重新导出 Returns: str: 本地指纹文件路径 使用场景: Worker 执行扫描任务前调用,获取最新指纹文件路径 """ from apps.engine.services.fingerprints import EholeFingerprintService service = EholeFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'ehole.json') version_file = os.path.join(base_dir, 'ehole.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("EHole 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "EHole 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) count = service.export_to_file(cache_file) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入版本文件失败: %s", e) logger.info("EHole 指纹文件已更新: %s", cache_file) return cache_file def ensure_goby_fingerprint_local() -> str: """ 确保本地存在最新的 Goby 指纹文件(带缓存) Returns: str: 本地指纹文件路径 """ from apps.engine.services.fingerprints import GobyFingerprintService service = GobyFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'goby.json') version_file = os.path.join(base_dir, 'goby.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取 Goby 版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("Goby 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "Goby 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) # Goby 导出格式是数组,直接写入 data = service.get_export_data() with open(cache_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入 Goby 版本文件失败: %s", e) logger.info("Goby 指纹文件已更新: %s", cache_file) return cache_file def ensure_wappalyzer_fingerprint_local() -> str: """ 确保本地存在最新的 Wappalyzer 指纹文件(带缓存) Returns: str: 本地指纹文件路径 """ from apps.engine.services.fingerprints import WappalyzerFingerprintService service = WappalyzerFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'wappalyzer.json') version_file = os.path.join(base_dir, 'wappalyzer.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取 Wappalyzer 版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("Wappalyzer 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "Wappalyzer 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) # Wappalyzer 导出格式是 {"apps": {...}} data = service.get_export_data() with open(cache_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入 Wappalyzer 版本文件失败: %s", e) logger.info("Wappalyzer 指纹文件已更新: %s", cache_file) return cache_file def get_fingerprint_paths(lib_names: list) -> dict: """ 获取多个指纹库的本地路径 Args: lib_names: 指纹库名称列表,如 ['ehole', 'goby'] Returns: dict: {lib_name: local_path},如 {'ehole': '/opt/xingrin/fingerprints/ehole.json'} 示例: paths = get_fingerprint_paths(['ehole']) # {'ehole': '/opt/xingrin/fingerprints/ehole.json'} """ paths = {} for lib_name in lib_names: if lib_name not in FINGERPRINT_LIB_MAP: logger.warning("不支持的指纹库: %s,跳过", lib_name) continue ensure_func_name = FINGERPRINT_LIB_MAP[lib_name] # 获取当前模块中的函数 ensure_func = globals().get(ensure_func_name) if ensure_func is None: logger.warning("指纹库 %s 的导出函数 %s 未实现,跳过", lib_name, ensure_func_name) continue try: paths[lib_name] = ensure_func() except Exception as e: logger.error("获取指纹库 %s 路径失败: %s", lib_name, e) continue return paths def ensure_fingers_fingerprint_local() -> str: """ 确保本地存在最新的 Fingers 指纹文件(带缓存) Returns: str: 本地指纹文件路径 """ from apps.engine.services.fingerprints import FingersFingerprintService service = FingersFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'fingers.json') version_file = os.path.join(base_dir, 'fingers.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取 Fingers 版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("Fingers 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "Fingers 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) data = service.get_export_data() with open(cache_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入 Fingers 版本文件失败: %s", e) logger.info("Fingers 指纹文件已更新: %s", cache_file) return cache_file def ensure_fingerprinthub_fingerprint_local() -> str: """ 确保本地存在最新的 FingerPrintHub 指纹文件(带缓存) Returns: str: 本地指纹文件路径 """ from apps.engine.services.fingerprints import FingerPrintHubFingerprintService service = FingerPrintHubFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'fingerprinthub.json') version_file = os.path.join(base_dir, 'fingerprinthub.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取 FingerPrintHub 版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("FingerPrintHub 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "FingerPrintHub 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) data = service.get_export_data() with open(cache_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入 FingerPrintHub 版本文件失败: %s", e) logger.info("FingerPrintHub 指纹文件已更新: %s", cache_file) return cache_file def ensure_arl_fingerprint_local() -> str: """ 确保本地存在最新的 ARL 指纹文件(带缓存) Returns: str: 本地指纹文件路径(YAML 格式) """ import yaml from apps.engine.services.fingerprints import ARLFingerprintService service = ARLFingerprintService() current_version = service.get_fingerprint_version() # 缓存目录和文件 base_dir = getattr(settings, 'FINGERPRINTS_BASE_PATH', '/opt/xingrin/fingerprints') os.makedirs(base_dir, exist_ok=True) cache_file = os.path.join(base_dir, 'arl.yaml') version_file = os.path.join(base_dir, 'arl.version') # 检查缓存版本 cached_version = None if os.path.exists(version_file): try: with open(version_file, 'r') as f: cached_version = f.read().strip() except OSError as e: logger.warning("读取 ARL 版本文件失败: %s", e) # 版本匹配,直接返回缓存 if cached_version == current_version and os.path.exists(cache_file): logger.info("ARL 指纹文件缓存有效(版本匹配): %s", cache_file) return cache_file # 版本不匹配,重新导出 logger.info( "ARL 指纹文件需要更新: cached=%s, current=%s", cached_version, current_version ) data = service.get_export_data() with open(cache_file, 'w', encoding='utf-8') as f: yaml.dump(data, f, allow_unicode=True, default_flow_style=False) # 写入版本文件 try: with open(version_file, 'w') as f: f.write(current_version) except OSError as e: logger.warning("写入 ARL 版本文件失败: %s", e) logger.info("ARL 指纹文件已更新: %s", cache_file) return cache_file __all__ = [ "ensure_ehole_fingerprint_local", "ensure_goby_fingerprint_local", "ensure_wappalyzer_fingerprint_local", "ensure_fingers_fingerprint_local", "ensure_fingerprinthub_fingerprint_local", "ensure_arl_fingerprint_local", "get_fingerprint_paths", "FINGERPRINT_LIB_MAP", ] ================================================ FILE: backend/apps/scan/utils/nuclei_helpers.py ================================================ """Nuclei 模板 Worker 侧工具函数 提供 Worker 侧确保本地模板与 Server 版本一致的功能。 使用 Git commit hash 做版本校验: - 从数据库获取 Server 的 commit_hash - 检查本地仓库的 commit hash 是否一致 - 不一致则 git fetch + git checkout 到指定 commit 调用示例: template_path = ensure_nuclei_templates_local("nuclei-templates") # 返回本地模板目录路径,可直接用于 nuclei -t 参数 """ import logging import subprocess from pathlib import Path from typing import Optional from django.conf import settings from apps.engine.models import NucleiTemplateRepo logger = logging.getLogger(__name__) def get_local_commit_hash(local_path: Path) -> Optional[str]: """获取本地 Git 仓库的当前 commit hash Args: local_path: 本地仓库路径 Returns: commit hash 字符串,失败返回 None """ if not (local_path / ".git").is_dir(): return None result = subprocess.run( ["git", "-C", str(local_path), "rev-parse", "HEAD"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) if result.returncode == 0: return result.stdout.strip() return None def git_clone(repo_url: str, local_path: Path) -> bool: """Git clone 仓库 Args: repo_url: 仓库 URL local_path: 本地路径 Returns: 是否成功 """ logger.info("正在 clone 模板仓库: %s -> %s", repo_url, local_path) result = subprocess.run( ["git", "clone", "--depth", "1", repo_url, str(local_path)], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) if result.returncode != 0: logger.error("git clone 失败: %s", result.stderr.strip()) return False return True def git_fetch_and_checkout(local_path: Path, commit_hash: str) -> bool: """Git fetch 并 checkout 到指定 commit Args: local_path: 本地仓库路径 commit_hash: 目标 commit hash Returns: 是否成功 """ logger.info("正在同步模板到 commit: %s", commit_hash[:8]) # 先 unshallow(如果是浅克隆) subprocess.run( ["git", "-C", str(local_path), "fetch", "--unshallow"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) # fetch origin fetch_result = subprocess.run( ["git", "-C", str(local_path), "fetch", "origin"], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) if fetch_result.returncode != 0: logger.error("git fetch 失败: %s", fetch_result.stderr.strip()) return False # checkout 到指定 commit checkout_result = subprocess.run( ["git", "-C", str(local_path), "checkout", commit_hash], check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) if checkout_result.returncode != 0: logger.error("git checkout 失败: %s", checkout_result.stderr.strip()) return False return True def ensure_nuclei_templates_local(repo_name: str) -> str: """确保 Worker 本地模板与 Server 版本一致 根据仓库名称查询数据库,获取 repo_url 和 commit_hash, 然后确保本地仓库存在且版本与 Server 一致。 Args: repo_name: 模板仓库名称,对应 NucleiTemplateRepo.name Returns: 本地模板目录的绝对路径 Raises: ValueError: 仓库不存在 RuntimeError: Git 操作失败 """ # 从数据库查询仓库记录 repo = NucleiTemplateRepo.objects.filter(name=repo_name).first() if not repo: raise ValueError(f"未找到模板仓库: {repo_name},请先在「Nuclei 模板」中添加并同步") repo_url = repo.repo_url expected_hash = repo.commit_hash if not repo_url: raise ValueError(f"模板仓库 {repo_name} 缺少 repo_url") # 本地存储路径 base_dir = getattr(settings, "NUCLEI_TEMPLATES_REPOS_BASE_DIR", "/opt/xingrin/nuclei-repos") local_path = Path(base_dir) / repo_name.replace(" ", "-").lower() local_path.mkdir(parents=True, exist_ok=True) # 检查本地是否有 .git 目录 if not (local_path / ".git").is_dir(): # 首次:git clone if not git_clone(repo_url, local_path): raise RuntimeError(f"无法 clone 模板仓库: {repo_name}") else: # 已有仓库:检查 commit hash local_hash = get_local_commit_hash(local_path) if expected_hash and local_hash != expected_hash: # commit 不一致:同步到 Server 版本 logger.info( "本地模板版本不一致: local=%s, server=%s", (local_hash or "N/A")[:8], expected_hash[:8], ) if not git_fetch_and_checkout(local_path, expected_hash): raise RuntimeError(f"无法同步模板仓库到指定版本: {repo_name}") elif not expected_hash: # Server 没有 commit_hash(未同步过),保持本地版本 logger.warning("模板仓库 %s 在 Server 端未同步,使用本地版本", repo_name) else: logger.info("本地模板版本一致: %s", local_hash[:8] if local_hash else "N/A") return str(local_path) __all__ = ["ensure_nuclei_templates_local"] ================================================ FILE: backend/apps/scan/utils/performance.py ================================================ """ 性能监控工具模块 提供 Flow 层的性能监控能力 功能: 1. Flow 性能监控 - 记录整体流程耗时、系统资源(CPU/内存) 2. 定时采样 - 每 N 秒记录一次系统资源状态 使用方式: # Flow 层(在 handlers 中使用) from apps.scan.utils.performance import FlowPerformanceTracker tracker = FlowPerformanceTracker(flow_name, scan_id) tracker.start() # ... 执行流程 ... tracker.finish(success=True, result=result) """ import logging import threading import time from dataclasses import dataclass from typing import Optional try: import psutil except ImportError: psutil = None # 性能日志使用专门的 logger perf_logger = logging.getLogger('performance') # 采样间隔(秒) SAMPLE_INTERVAL = 30 def _get_system_stats() -> dict: """ 获取当前系统资源状态 Returns: dict: {'cpu_percent': float, 'memory_gb': float, 'memory_percent': float} """ if not psutil: return {'cpu_percent': 0.0, 'memory_gb': 0.0, 'memory_percent': 0.0} try: cpu_percent = psutil.cpu_percent(interval=0.1) memory = psutil.virtual_memory() memory_gb = memory.used / (1024 ** 3) memory_percent = memory.percent # psutil 直接提供内存使用百分比 return { 'cpu_percent': cpu_percent, 'memory_gb': memory_gb, 'memory_percent': memory_percent } except Exception: return {'cpu_percent': 0.0, 'memory_gb': 0.0, 'memory_percent': 0.0} @dataclass class FlowPerformanceMetrics: """Flow 性能指标""" flow_name: str scan_id: int target_id: Optional[int] = None target_name: Optional[str] = None # 时间指标 start_time: float = 0.0 end_time: float = 0.0 duration_seconds: float = 0.0 # 系统资源指标 cpu_start: float = 0.0 cpu_end: float = 0.0 cpu_peak: float = 0.0 memory_gb_start: float = 0.0 memory_gb_end: float = 0.0 memory_gb_peak: float = 0.0 memory_percent_start: float = 0.0 memory_percent_end: float = 0.0 memory_percent_peak: float = 0.0 # 执行结果 success: bool = False error_message: Optional[str] = None class FlowPerformanceTracker: """ Flow 性能追踪器 用于追踪 Prefect Flow 的执行性能,包括: - 执行耗时 - 系统 CPU 和内存使用 - 定时采样(每 30 秒) 使用方式: tracker = FlowPerformanceTracker("directory_scan", scan_id=1) tracker.start(target_id=1, target_name="example.com") # ... flow 执行 ... tracker.finish(success=True, result={'created_count': 100}) """ def __init__(self, flow_name: str, scan_id: int): self.metrics = FlowPerformanceMetrics( flow_name=flow_name, scan_id=scan_id ) self._sampler_thread: Optional[threading.Thread] = None self._stop_event = threading.Event() self._samples: list[dict] = [] def start( self, target_id: Optional[int] = None, target_name: Optional[str] = None ) -> None: """开始追踪""" self.metrics.start_time = time.time() self.metrics.target_id = target_id self.metrics.target_name = target_name # 记录初始系统状态 stats = _get_system_stats() self.metrics.cpu_start = stats['cpu_percent'] self.metrics.memory_gb_start = stats['memory_gb'] self.metrics.memory_percent_start = stats['memory_percent'] self.metrics.cpu_peak = stats['cpu_percent'] self.metrics.memory_gb_peak = stats['memory_gb'] self.metrics.memory_percent_peak = stats['memory_percent'] # 记录开始日志 perf_logger.info( "📊 Flow 开始 - %s, scan_id=%d, 系统: CPU %.1f%%, 内存 %.1fGB(%.1f%%)", self.metrics.flow_name, self.metrics.scan_id, stats['cpu_percent'], stats['memory_gb'], stats['memory_percent'] ) # 启动采样线程 self._stop_event.clear() self._sampler_thread = threading.Thread( target=self._sample_loop, daemon=True, name=f"perf-sampler-{self.metrics.flow_name}-{self.metrics.scan_id}" ) self._sampler_thread.start() def _sample_loop(self) -> None: """定时采样循环""" elapsed = 0 while not self._stop_event.wait(timeout=SAMPLE_INTERVAL): elapsed += SAMPLE_INTERVAL stats = _get_system_stats() # 更新峰值 if stats['cpu_percent'] > self.metrics.cpu_peak: self.metrics.cpu_peak = stats['cpu_percent'] if stats['memory_gb'] > self.metrics.memory_gb_peak: self.metrics.memory_gb_peak = stats['memory_gb'] if stats['memory_percent'] > self.metrics.memory_percent_peak: self.metrics.memory_percent_peak = stats['memory_percent'] # 记录采样 self._samples.append({ 'elapsed': elapsed, 'cpu': stats['cpu_percent'], 'memory_gb': stats['memory_gb'], 'memory_percent': stats['memory_percent'] }) # 输出采样日志 perf_logger.info( "📊 Flow 执行中 - %s [%ds], 系统: CPU %.1f%%, 内存 %.1fGB(%.1f%%)", self.metrics.flow_name, elapsed, stats['cpu_percent'], stats['memory_gb'], stats['memory_percent'] ) def finish( self, success: bool = True, error_message: Optional[str] = None ) -> None: """ 结束追踪并记录性能日志 Args: success: 是否成功 error_message: 错误信息 """ # 停止采样线程 self._stop_event.set() if self._sampler_thread and self._sampler_thread.is_alive(): self._sampler_thread.join(timeout=1.0) # 记录结束时间和状态 self.metrics.end_time = time.time() self.metrics.duration_seconds = self.metrics.end_time - self.metrics.start_time self.metrics.success = success self.metrics.error_message = error_message # 记录结束时的系统状态 stats = _get_system_stats() self.metrics.cpu_end = stats['cpu_percent'] self.metrics.memory_gb_end = stats['memory_gb'] self.metrics.memory_percent_end = stats['memory_percent'] # 更新峰值(最后一次采样) if stats['cpu_percent'] > self.metrics.cpu_peak: self.metrics.cpu_peak = stats['cpu_percent'] if stats['memory_gb'] > self.metrics.memory_gb_peak: self.metrics.memory_gb_peak = stats['memory_gb'] if stats['memory_percent'] > self.metrics.memory_percent_peak: self.metrics.memory_percent_peak = stats['memory_percent'] # 记录结束日志 status = "✓" if success else "✗" perf_logger.info( "📊 Flow 结束 - %s %s, scan_id=%d, 耗时: %.1fs, " "CPU: %.1f%%→%.1f%%(峰值%.1f%%), 内存: %.1fGB(%.1f%%)→%.1fGB(%.1f%%)(峰值%.1fGB/%.1f%%)", self.metrics.flow_name, status, self.metrics.scan_id, self.metrics.duration_seconds, self.metrics.cpu_start, self.metrics.cpu_end, self.metrics.cpu_peak, self.metrics.memory_gb_start, self.metrics.memory_percent_start, self.metrics.memory_gb_end, self.metrics.memory_percent_end, self.metrics.memory_gb_peak, self.metrics.memory_percent_peak ) if not success and error_message: perf_logger.warning( "📊 Flow 失败原因 - %s: %s", self.metrics.flow_name, error_message ) def _get_process_stats(pid: int) -> dict: """ 获取指定进程及其子进程的资源使用(类似 htop 显示) Args: pid: 进程 ID Returns: dict: { 'cpu_percent': float, # 进程 CPU 使用率 'memory_mb': float, # 进程内存使用 (MB) 'memory_percent': float # 进程内存占比 } """ if not psutil: return {'cpu_percent': 0.0, 'memory_mb': 0.0, 'memory_percent': 0.0} try: process = psutil.Process(pid) # 获取进程及所有子进程 children = process.children(recursive=True) all_processes = [process] + children total_cpu = 0.0 total_memory = 0 for p in all_processes: try: # CPU 百分比计算: # - interval=0 使用上次调用的缓存值(需要先调用过一次初始化) # - 如果没有缓存值,会返回 0.0 # - 这避免了每次采样都等待 0.1 秒的问题 cpu_percent = p.cpu_percent() total_cpu += cpu_percent mem_info = p.memory_info() total_memory += mem_info.rss # RSS: Resident Set Size except (psutil.NoSuchProcess, psutil.AccessDenied): continue # 转换为 MB memory_mb = total_memory / (1024 * 1024) # 计算内存占比 total_mem = psutil.virtual_memory().total memory_percent = (total_memory / total_mem) * 100 if total_mem > 0 else 0.0 return { 'cpu_percent': total_cpu, 'memory_mb': memory_mb, 'memory_percent': memory_percent } except (psutil.NoSuchProcess, psutil.AccessDenied): return {'cpu_percent': 0.0, 'memory_mb': 0.0, 'memory_percent': 0.0} except Exception: return {'cpu_percent': 0.0, 'memory_mb': 0.0, 'memory_percent': 0.0} class CommandPerformanceTracker: """ 命令执行性能追踪器 用于追踪单个命令的执行性能,包括: - 执行耗时 - 进程级 CPU 和内存使用(类似 htop) - 系统整体资源状态 使用方式: tracker = CommandPerformanceTracker("ffuf", command="ffuf -u http://...") tracker.start() tracker.set_pid(process.pid) # 进程启动后设置 PID # ... 执行命令 ... tracker.finish(success=True, duration=45.2) """ def __init__(self, tool_name: str, command: str = ""): self.tool_name = tool_name self.command = command self.start_time: float = 0.0 self.pid: Optional[int] = None # 系统级资源 self.sys_cpu_start: float = 0.0 self.sys_memory_gb_start: float = 0.0 self.sys_memory_percent_start: float = 0.0 # 进程级资源峰值 self.proc_cpu_peak: float = 0.0 self.proc_memory_mb_peak: float = 0.0 self.proc_memory_percent_peak: float = 0.0 def start(self) -> None: """开始追踪,记录初始系统状态""" self.start_time = time.time() stats = _get_system_stats() self.sys_cpu_start = stats['cpu_percent'] self.sys_memory_gb_start = stats['memory_gb'] self.sys_memory_percent_start = stats['memory_percent'] # 截断过长的命令 cmd_display = self.command[:200] + "..." if len(self.command) > 200 else self.command perf_logger.info( "📊 命令开始 - %s, 系统: CPU %.1f%%, 内存 %.1fGB(%.1f%%), 命令: %s", self.tool_name, self.sys_cpu_start, self.sys_memory_gb_start, self.sys_memory_percent_start, cmd_display ) def set_pid(self, pid: int) -> None: """ 设置要追踪的进程 PID Args: pid: 进程 ID """ self.pid = pid # 初始化 CPU 采样(psutil 需要先调用一次) # CPU 百分比计算需要两次调用之间的时间间隔,第一次调用是初始化 if psutil and pid: try: process = psutil.Process(pid) # 第一次调用初始化 CPU 计算基准 process.cpu_percent() # 为所有子进程也初始化 CPU 计算 for child in process.children(recursive=True): try: child.cpu_percent() except (psutil.NoSuchProcess, psutil.AccessDenied): pass except (psutil.NoSuchProcess, psutil.AccessDenied): pass def sample(self) -> dict: """ 采样当前进程资源使用(可选,用于长时间运行的命令) Returns: dict: 进程资源使用情况 """ if not self.pid: return {'cpu_percent': 0.0, 'memory_mb': 0.0, 'memory_percent': 0.0} stats = _get_process_stats(self.pid) # 更新峰值 if stats['cpu_percent'] > self.proc_cpu_peak: self.proc_cpu_peak = stats['cpu_percent'] if stats['memory_mb'] > self.proc_memory_mb_peak: self.proc_memory_mb_peak = stats['memory_mb'] if stats['memory_percent'] > self.proc_memory_percent_peak: self.proc_memory_percent_peak = stats['memory_percent'] return stats def finish( self, success: bool = True, duration: Optional[float] = None, timeout: Optional[int] = None, is_timeout: bool = False ) -> None: """ 结束追踪并记录性能日志 Args: success: 是否成功 duration: 执行耗时(秒),如果不传则自动计算 timeout: 超时配置(秒) is_timeout: 是否超时 """ # 计算耗时 if duration is None: duration = time.time() - self.start_time # 获取结束时的系统状态 sys_stats = _get_system_stats() # 获取进程最终资源使用(如果进程还在) proc_stats = {'cpu_percent': 0.0, 'memory_mb': 0.0, 'memory_percent': 0.0} if self.pid: proc_stats = _get_process_stats(self.pid) # 更新峰值 if proc_stats['cpu_percent'] > self.proc_cpu_peak: self.proc_cpu_peak = proc_stats['cpu_percent'] if proc_stats['memory_mb'] > self.proc_memory_mb_peak: self.proc_memory_mb_peak = proc_stats['memory_mb'] if proc_stats['memory_percent'] > self.proc_memory_percent_peak: self.proc_memory_percent_peak = proc_stats['memory_percent'] status = "✓" if success else ("⏱ 超时" if is_timeout else "✗") # 截断过长的命令 cmd_display = self.command[:200] + "..." if len(self.command) > 200 else self.command # 日志格式:进程资源 + 系统资源 if self.pid and (self.proc_cpu_peak > 0 or self.proc_memory_mb_peak > 0): perf_logger.info( "📊 命令结束 - %s %s, 耗时: %.2fs%s, " "进程: CPU %.1f%%(峰值), 内存 %.1fMB(%.1f%%峰值), " "系统: CPU %.1f%%→%.1f%%, 内存 %.1fGB(%.1f%%)→%.1fGB(%.1f%%), " "命令: %s", self.tool_name, status, duration, f", 超时配置: {timeout}s" if timeout else "", self.proc_cpu_peak, self.proc_memory_mb_peak, self.proc_memory_percent_peak, self.sys_cpu_start, sys_stats['cpu_percent'], self.sys_memory_gb_start, self.sys_memory_percent_start, sys_stats['memory_gb'], sys_stats['memory_percent'], cmd_display ) else: # 没有进程级数据,只显示系统级 perf_logger.info( "📊 命令结束 - %s %s, 耗时: %.2fs%s, " "系统: CPU %.1f%%→%.1f%%, 内存 %.1fGB(%.1f%%)→%.1fGB(%.1f%%), " "命令: %s", self.tool_name, status, duration, f", 超时配置: {timeout}s" if timeout else "", self.sys_cpu_start, sys_stats['cpu_percent'], self.sys_memory_gb_start, self.sys_memory_percent_start, sys_stats['memory_gb'], sys_stats['memory_percent'], cmd_display ) ================================================ FILE: backend/apps/scan/utils/system_load.py ================================================ """ 系统负载检查工具 提供统一的系统负载检查功能,用于: - Flow 入口处检查系统资源是否充足 - 防止在高负载时启动新的扫描任务 """ import logging import time import psutil from django.conf import settings logger = logging.getLogger(__name__) # 动态并发控制阈值(可在 Django settings 中覆盖) SCAN_CPU_HIGH: float = getattr(settings, 'SCAN_CPU_HIGH', 90.0) SCAN_MEM_HIGH: float = getattr(settings, 'SCAN_MEM_HIGH', 80.0) SCAN_LOAD_CHECK_INTERVAL: int = getattr(settings, 'SCAN_LOAD_CHECK_INTERVAL', 180) def _get_current_load() -> tuple[float, float]: """获取当前 CPU 和内存使用率""" return psutil.cpu_percent(interval=0.5), psutil.virtual_memory().percent def wait_for_system_load( cpu_threshold: float = SCAN_CPU_HIGH, mem_threshold: float = SCAN_MEM_HIGH, check_interval: int = SCAN_LOAD_CHECK_INTERVAL, context: str = "task" ) -> None: """ 等待系统负载降到阈值以下 在高负载时阻塞等待,直到 CPU 和内存都低于阈值。 用于 Flow 入口处,防止在资源紧张时启动新任务。 """ while True: cpu, mem = _get_current_load() if cpu < cpu_threshold and mem < mem_threshold: logger.debug( "[%s] 系统负载正常: cpu=%.1f%%, mem=%.1f%%", context, cpu, mem ) return logger.info( "[%s] 系统负载较高,等待资源释放: " "cpu=%.1f%% (阈值 %.1f%%), mem=%.1f%% (阈值 %.1f%%)", context, cpu, cpu_threshold, mem, mem_threshold ) time.sleep(check_interval) def check_system_load( cpu_threshold: float = SCAN_CPU_HIGH, mem_threshold: float = SCAN_MEM_HIGH ) -> dict: """ 检查当前系统负载(非阻塞) Returns: dict: cpu_percent, mem_percent, cpu_threshold, mem_threshold, is_overloaded """ cpu, mem = _get_current_load() return { 'cpu_percent': cpu, 'mem_percent': mem, 'cpu_threshold': cpu_threshold, 'mem_threshold': mem_threshold, 'is_overloaded': cpu >= cpu_threshold or mem >= mem_threshold, } ================================================ FILE: backend/apps/scan/utils/user_logger.py ================================================ """ 扫描日志记录器 提供统一的日志记录接口,用于在 Flow 中记录用户可见的扫描进度日志。 特性: - 简单的函数式 API - 只写入数据库(ScanLog 表),不写 Python logging - 错误容忍(数据库失败不影响扫描执行) 职责分离: - user_log: 用户可见日志(写数据库,前端展示) - logger: 开发者日志(写日志文件/控制台,调试用) 使用示例: from apps.scan.utils import user_log # 用户日志(写数据库) user_log(scan_id, "port_scan", "Starting port scan") user_log(scan_id, "port_scan", "naabu completed: found 120 ports") # 开发者日志(写日志文件) logger.info("✓ 工具 %s 执行完成 - 记录数: %d", tool_name, count) """ import logging from django.db import DatabaseError logger = logging.getLogger(__name__) def user_log(scan_id: int, stage: str, message: str, level: str = "info"): """ 记录用户可见的扫描日志(只写数据库) Args: scan_id: 扫描任务 ID stage: 阶段名称,如 "port_scan", "site_scan" message: 日志消息 level: 日志级别,默认 "info",可选 "warning", "error" 数据库 content 格式: "[{stage}] {message}" """ formatted = f"[{stage}] {message}" try: from apps.scan.models import ScanLog ScanLog.objects.create( scan_id=scan_id, level=level, content=formatted ) except DatabaseError as e: logger.error("ScanLog write failed - scan_id=%s, error=%s", scan_id, e) except Exception as e: logger.error("ScanLog write unexpected error - scan_id=%s, error=%s", scan_id, e) ================================================ FILE: backend/apps/scan/utils/wordlist_helpers.py ================================================ """字典文件本地缓存与校验工具 提供 worker 侧的字典文件下载和 hash 校验功能,用于: - 目录扫描 (directory_scan_flow) - 子域名爆破 (subdomain_discovery_flow) """ import logging import os import ssl from pathlib import Path from urllib import request as urllib_request from urllib import parse as urllib_parse from django.conf import settings from apps.common.utils import is_file_hash_match from apps.engine.services import WordlistService logger = logging.getLogger(__name__) def ensure_wordlist_local(wordlist_name: str) -> str: """确保本地存在指定字典文件,并返回本地路径 流程: 1. 从 DB 查询 Wordlist 记录 2. 计算本地缓存路径 3. 如果本地文件存在且 hash 匹配,直接返回路径 4. 否则从后端 API 下载最新文件 Args: wordlist_name: 字典名称(对应 Wordlist.name) Returns: str: 本地字典文件绝对路径 Raises: ValueError: 字典不存在或参数无效 RuntimeError: 下载失败 """ if not wordlist_name: raise ValueError("wordlist_name 不能为空") service = WordlistService() wordlist = service.get_wordlist_by_name(wordlist_name) if not wordlist: raise ValueError(f"未找到名称为 '{wordlist_name}' 的字典,请在「字典管理」中先创建") # 计算本地缓存路径 backend_path = Path(wordlist.file_path) base_dir = getattr(settings, 'WORDLISTS_BASE_PATH', '/opt/xingrin/wordlists') storage_dir = Path(base_dir) storage_dir.mkdir(parents=True, exist_ok=True) local_path = storage_dir / backend_path.name # 获取期望的 hash(可能为空,表示老数据) expected_hash = getattr(wordlist, 'file_hash', '') or '' # 如果本地文件存在,进行 hash 校验 if local_path.exists(): if expected_hash: # 有 hash,进行校验 if is_file_hash_match(str(local_path), expected_hash): logger.info("本地字典文件有效(hash 匹配): %s", local_path) return str(local_path) else: logger.info("本地字典文件 hash 不匹配,将重新下载: %s", local_path) else: # 无 hash(老数据),保持旧逻辑:直接复用 logger.info("本地已存在字典文件(无 hash 校验): %s", local_path) return str(local_path) # 从后端下载字典 # 优先使用 SERVER_URL 环境变量(动态容器中传递),否则使用 settings 配置 server_url = os.getenv('SERVER_URL', '').strip() if server_url: api_base = f"{server_url.rstrip('/')}/api" else: public_host = getattr(settings, 'PUBLIC_HOST', '').strip() if not public_host: raise RuntimeError( "无法确定 Django API 地址:请配置 SERVER_URL 或 PUBLIC_HOST 环境变量" ) # 远程 Worker 通过 nginx HTTPS 访问,不再直连 8888 public_port = getattr(settings, 'PUBLIC_PORT', '8083') api_base = f"https://{public_host}:{public_port}/api" query = urllib_parse.urlencode({'wordlist': wordlist_name}) download_url = f"{api_base.rstrip('/')}/wordlists/download/?{query}" logger.info("从后端下载字典: %s -> %s", download_url, local_path) try: # 创建不验证 SSL 的上下文(远程 Worker 可能使用自签名证书) ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE # 创建带 API Key 的请求 req = urllib_request.Request(download_url) worker_api_key = os.getenv('WORKER_API_KEY', '') if worker_api_key: req.add_header('X-Worker-API-Key', worker_api_key) with urllib_request.urlopen(req, context=ssl_context) as resp: if resp.status != 200: raise RuntimeError(f"下载字典失败,HTTP {resp.status}") data = resp.read() except Exception as exc: logger.error("下载字典失败: %s", exc) raise RuntimeError(f"下载字典失败: {exc}") from exc with open(local_path, 'wb') as f: f.write(data) logger.info("字典下载完成并保存到: %s", local_path) return str(local_path) __all__ = ["ensure_wordlist_local"] ================================================ FILE: backend/apps/scan/utils/workspace_utils.py ================================================ """ 工作空间工具模块 提供统一的扫描工作目录创建和验证功能 """ from pathlib import Path import logging logger = logging.getLogger(__name__) def setup_scan_workspace(scan_workspace_dir: str) -> Path: """ 创建 Scan 根工作空间目录 Args: scan_workspace_dir: 工作空间目录路径 Returns: Path: 创建的目录路径 Raises: RuntimeError: 目录创建失败或不可写 """ workspace_path = Path(scan_workspace_dir) try: workspace_path.mkdir(parents=True, exist_ok=True) except OSError as e: raise RuntimeError(f"创建工作空间失败: {scan_workspace_dir} - {e}") from e # 验证可写 _verify_writable(workspace_path) logger.info("✓ Scan 工作空间已创建: %s", workspace_path) return workspace_path def setup_scan_directory(scan_workspace_dir: str, subdir: str) -> Path: """ 创建扫描子目录 Args: scan_workspace_dir: 根工作空间目录 subdir: 子目录名称(如 'fingerprint_detect', 'site_scan') Returns: Path: 创建的子目录路径 Raises: RuntimeError: 目录创建失败或不可写 """ scan_dir = Path(scan_workspace_dir) / subdir try: scan_dir.mkdir(parents=True, exist_ok=True) except OSError as e: raise RuntimeError(f"创建扫描目录失败: {scan_dir} - {e}") from e # 验证可写 _verify_writable(scan_dir) logger.info("✓ 扫描目录已创建: %s", scan_dir) return scan_dir def _verify_writable(path: Path) -> None: """ 验证目录可写 Args: path: 目录路径 Raises: RuntimeError: 目录不可写 """ test_file = path / ".test_write" try: test_file.touch() test_file.unlink() except OSError as e: raise RuntimeError(f"目录不可写: {path} - {e}") from e ================================================ FILE: backend/apps/scan/views/__init__.py ================================================ """Scan Views - 统一导出""" from .scan_views import ScanViewSet from .scheduled_scan_views import ScheduledScanViewSet from .scan_log_views import ScanLogListView from .subfinder_provider_settings_views import SubfinderProviderSettingsView __all__ = [ 'ScanViewSet', 'ScheduledScanViewSet', 'ScanLogListView', 'SubfinderProviderSettingsView', ] ================================================ FILE: backend/apps/scan/views/scan_log_views.py ================================================ """ 扫描日志 API 提供扫描日志查询接口,支持游标分页用于增量轮询。 """ from rest_framework.views import APIView from rest_framework.response import Response from apps.scan.models import ScanLog from apps.scan.serializers import ScanLogSerializer class ScanLogListView(APIView): """ GET /scans/{scan_id}/logs/ 游标分页 API,用于增量查询日志 查询参数: - afterId: 只返回此 ID 之后的日志(用于增量轮询,避免时间戳重复导致的重复日志) - limit: 返回数量限制(默认 200,最大 1000) 返回: - results: 日志列表 - hasMore: 是否还有更多日志 """ def get(self, request, scan_id: int): # 参数解析 after_id = request.query_params.get('afterId') try: limit = min(int(request.query_params.get('limit', 200)), 1000) except (ValueError, TypeError): limit = 200 # 查询日志(按 ID 排序,ID 是自增的,保证顺序一致) queryset = ScanLog.objects.filter(scan_id=scan_id).order_by('id') # 游标过滤(使用 ID 而非时间戳,避免同一时间戳多条日志导致重复) if after_id: try: queryset = queryset.filter(id__gt=int(after_id)) except (ValueError, TypeError): pass # 限制返回数量(多取一条用于判断 hasMore) logs = list(queryset[:limit + 1]) has_more = len(logs) > limit if has_more: logs = logs[:limit] return Response({ 'results': ScanLogSerializer(logs, many=True).data, 'hasMore': has_more, }) ================================================ FILE: backend/apps/scan/views/scan_views.py ================================================ from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.exceptions import NotFound, APIException from rest_framework.filters import SearchFilter from django_filters.rest_framework import DjangoFilterBackend from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db.utils import DatabaseError, IntegrityError, OperationalError import logging from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes from apps.scan.utils.config_merger import ConfigConflictError logger = logging.getLogger(__name__) from ..models import Scan, ScheduledScan from ..serializers import ( ScanSerializer, ScanHistorySerializer, QuickScanSerializer, InitiateScanSerializer, ScheduledScanSerializer, CreateScheduledScanSerializer, UpdateScheduledScanSerializer, ToggleScheduledScanSerializer ) from ..services.scan_service import ScanService from ..services.scheduled_scan_service import ScheduledScanService from ..repositories import ScheduledScanDTO from apps.targets.services.target_service import TargetService from apps.targets.services.organization_service import OrganizationService from apps.engine.services.engine_service import EngineService from apps.common.definitions import ScanStatus from apps.common.pagination import BasePagination class ScanViewSet(viewsets.ModelViewSet): """扫描任务视图集""" serializer_class = ScanSerializer pagination_class = BasePagination filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ['target'] # 支持 ?target=123 过滤 search_fields = ['target__name'] # 按目标名称搜索 def get_queryset(self): """优化查询集,提升API性能 查询优化策略: - select_related: 预加载 target 和 engine(一对一/多对一关系,使用 JOIN) - 移除 prefetch_related: 避免加载大量资产数据到内存 - order_by: 按创建时间降序排列(最新创建的任务排在最前面) 性能优化原理: - 列表页:使用缓存统计字段(cached_*_count),避免实时 COUNT 查询 - 序列化器:严格验证缓存字段,确保数据一致性 - 分页场景:每页只显示10条记录,查询高效 - 避免大数据加载:不再预加载所有关联的资产数据 """ # 只保留必要的 select_related,移除所有 prefetch_related scan_service = ScanService() queryset = scan_service.get_all_scans(prefetch_relations=True) return queryset def get_serializer_class(self): """根据不同的 action 返回不同的序列化器 - list action: 使用 ScanHistorySerializer(包含 summary 和 progress) - retrieve action: 使用 ScanHistorySerializer(包含 summary 和 progress) - 其他 action: 使用标准的 ScanSerializer """ if self.action in ['list', 'retrieve']: return ScanHistorySerializer return ScanSerializer def destroy(self, request, *args, **kwargs): """ 删除单个扫描任务(两阶段删除) 1. 软删除:立即对用户不可见 2. 硬删除:后台异步执行 """ try: scan = self.get_object() scan_service = ScanService() result = scan_service.delete_scans_two_phase([scan.id]) return success_response( data={ 'scanId': scan.id, 'deletedCount': result['soft_deleted_count'], 'deletedScans': result['scan_names'] } ) except Scan.DoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND ) except ValueError as e: return error_response( code=ErrorCodes.NOT_FOUND, message=str(e), status_code=status.HTTP_404_NOT_FOUND ) except Exception as e: logger.exception("删除扫描任务时发生错误") return error_response( code=ErrorCodes.SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action(detail=False, methods=['post']) def quick(self, request): """ 快速扫描接口 功能: 1. 接收目标列表和 YAML 配置 2. 自动解析输入(支持 URL、域名、IP、CIDR) 3. 批量创建 Target、Website、Endpoint 资产 4. 立即发起批量扫描 请求参数: { "targets": [{"name": "example.com"}, {"name": "https://example.com/api"}], "configuration": "subdomain_discovery:\n enabled: true\n ...", "engine_ids": [1, 2], // 可选,用于记录 "engine_names": ["引擎A", "引擎B"] // 可选,用于记录 } 支持的输入格式: - 域名: example.com - IP: 192.168.1.1 - CIDR: 10.0.0.0/8 - URL: https://example.com/api/v1 """ from ..services.quick_scan_service import QuickScanService serializer = QuickScanSerializer(data=request.data) serializer.is_valid(raise_exception=True) targets_data = serializer.validated_data['targets'] configuration = serializer.validated_data['configuration'] engine_ids = serializer.validated_data.get('engine_ids', []) engine_names = serializer.validated_data.get('engine_names', []) try: # 提取输入字符串列表 inputs = [t['name'] for t in targets_data] # 1. 使用 QuickScanService 解析输入并创建资产 quick_scan_service = QuickScanService() result = quick_scan_service.process_quick_scan(inputs, engine_ids[0] if engine_ids else None) targets = result['targets'] if not targets: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='No valid targets for scanning', details=result.get('errors', []), status_code=status.HTTP_400_BAD_REQUEST ) # 2. 直接使用前端传递的配置创建扫描 scan_service = ScanService() created_scans = scan_service.create_scans( targets=targets, engine_ids=engine_ids, engine_names=engine_names, yaml_configuration=configuration ) # 检查是否成功创建扫描任务 if not created_scans: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='No scan tasks were created. All targets may already have active scans.', details={ 'targetStats': result['target_stats'], 'assetStats': result['asset_stats'], 'errors': result.get('errors', []) }, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY ) # 序列化返回结果 scan_serializer = ScanSerializer(created_scans, many=True) return success_response( data={ 'count': len(created_scans), 'targetStats': result['target_stats'], 'assetStats': result['asset_stats'], 'errors': result.get('errors', []), 'scans': scan_serializer.data }, status_code=status.HTTP_201_CREATED ) except ValidationError as e: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(e), status_code=status.HTTP_400_BAD_REQUEST ) except Exception as e: logger.exception("快速扫描启动失败") return error_response( code=ErrorCodes.SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action(detail=False, methods=['post']) def initiate(self, request): """ 发起扫描任务 请求参数: - organization_id: 组织ID (int, 可选) - target_id: 目标ID (int, 可选) - configuration: YAML 配置字符串 (str, 必填) - engine_ids: 扫描引擎ID列表 (list[int], 必填) - engine_names: 引擎名称列表 (list[str], 必填) 注意: organization_id 和 target_id 二选一 返回: - 扫描任务详情(单个或多个) """ # 使用 serializer 验证请求数据 serializer = InitiateScanSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 获取验证后的数据 organization_id = serializer.validated_data.get('organization_id') target_id = serializer.validated_data.get('target_id') configuration = serializer.validated_data['configuration'] engine_ids = serializer.validated_data['engine_ids'] engine_names = serializer.validated_data['engine_names'] try: # 获取目标列表 scan_service = ScanService() if organization_id: from apps.targets.repositories import DjangoOrganizationRepository org_repo = DjangoOrganizationRepository() organization = org_repo.get_by_id(organization_id) if not organization: raise ObjectDoesNotExist(f'Organization ID {organization_id} 不存在') targets = org_repo.get_targets(organization_id) if not targets: raise ValidationError(f'组织 ID {organization_id} 下没有目标') else: from apps.targets.repositories import DjangoTargetRepository target_repo = DjangoTargetRepository() target = target_repo.get_by_id(target_id) if not target: raise ObjectDoesNotExist(f'Target ID {target_id} 不存在') targets = [target] # 直接使用前端传递的配置创建扫描 created_scans = scan_service.create_scans( targets=targets, engine_ids=engine_ids, engine_names=engine_names, yaml_configuration=configuration ) # 检查是否成功创建扫描任务 if not created_scans: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='No scan tasks were created. All targets may already have active scans.', status_code=status.HTTP_422_UNPROCESSABLE_ENTITY ) # 序列化返回结果 scan_serializer = ScanSerializer(created_scans, many=True) return success_response( data={ 'count': len(created_scans), 'scans': scan_serializer.data }, status_code=status.HTTP_201_CREATED ) except ObjectDoesNotExist as e: # 资源不存在错误(由 service 层抛出) return error_response( code=ErrorCodes.NOT_FOUND, message=str(e), status_code=status.HTTP_404_NOT_FOUND ) except ValidationError as e: # 参数验证错误(由 service 层抛出) return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(e), status_code=status.HTTP_400_BAD_REQUEST ) except (DatabaseError, IntegrityError, OperationalError): # 数据库错误 return error_response( code=ErrorCodes.SERVER_ERROR, message='Database error', status_code=status.HTTP_503_SERVICE_UNAVAILABLE ) # 所有快照相关的 action 和 export 已迁移到 asset/views.py 中的快照 ViewSet # GET /api/scans/{id}/subdomains/ -> SubdomainSnapshotViewSet # GET /api/scans/{id}/subdomains/export/ -> SubdomainSnapshotViewSet.export # GET /api/scans/{id}/websites/ -> WebsiteSnapshotViewSet # GET /api/scans/{id}/websites/export/ -> WebsiteSnapshotViewSet.export # GET /api/scans/{id}/directories/ -> DirectorySnapshotViewSet # GET /api/scans/{id}/directories/export/ -> DirectorySnapshotViewSet.export # GET /api/scans/{id}/endpoints/ -> EndpointSnapshotViewSet # GET /api/scans/{id}/endpoints/export/ -> EndpointSnapshotViewSet.export # GET /api/scans/{id}/ip-addresses/ -> HostPortMappingSnapshotViewSet # GET /api/scans/{id}/ip-addresses/export/ -> HostPortMappingSnapshotViewSet.export # GET /api/scans/{id}/vulnerabilities/ -> VulnerabilitySnapshotViewSet @action(detail=False, methods=['post', 'delete'], url_path='bulk-delete') def bulk_delete(self, request): """ 批量删除扫描记录 请求参数: - ids: 扫描ID列表 (list[int], 必填) 示例请求: POST /api/scans/bulk-delete/ { "ids": [1, 2, 3] } 返回: - message: 成功消息 - deletedCount: 实际删除的记录数 注意: - 使用级联删除,会同时删除关联的子域名、端点等数据 - 只删除存在的记录,不存在的ID会被忽略 """ ids = request.data.get('ids', []) # 参数验证 if not ids: return error_response( code=ErrorCodes.VALIDATION_ERROR, message='Missing required parameter: ids', status_code=status.HTTP_400_BAD_REQUEST ) if not isinstance(ids, list): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='ids must be an array', status_code=status.HTTP_400_BAD_REQUEST ) if not all(isinstance(i, int) for i in ids): return error_response( code=ErrorCodes.VALIDATION_ERROR, message='All elements in ids array must be integers', status_code=status.HTTP_400_BAD_REQUEST ) try: # 使用 Service 层批量删除(两阶段删除) scan_service = ScanService() result = scan_service.delete_scans_two_phase(ids) return success_response( data={ 'deletedCount': result['soft_deleted_count'], 'deletedScans': result['scan_names'] } ) except ValueError as e: # 未找到记录 return error_response( code=ErrorCodes.NOT_FOUND, message=str(e), status_code=status.HTTP_404_NOT_FOUND ) except Exception as e: logger.exception("批量删除扫描任务时发生错误") return error_response( code=ErrorCodes.SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action(detail=False, methods=['get']) def statistics(self, request): """ 获取扫描统计数据 返回扫描任务的汇总统计信息,用于仪表板和扫描历史页面。 使用缓存字段聚合查询,性能优异。 返回: - total: 总扫描次数 - running: 运行中的扫描数量 - completed: 已完成的扫描数量 - failed: 失败的扫描数量 - totalVulns: 总共发现的漏洞数量 - totalSubdomains: 总共发现的子域名数量 - totalEndpoints: 总共发现的端点数量 - totalAssets: 总资产数 """ try: # 使用 Service 层获取统计数据 scan_service = ScanService() stats = scan_service.get_statistics() return success_response( data={ 'total': stats['total'], 'running': stats['running'], 'completed': stats['completed'], 'failed': stats['failed'], 'totalVulns': stats['total_vulns'], 'totalSubdomains': stats['total_subdomains'], 'totalEndpoints': stats['total_endpoints'], 'totalWebsites': stats['total_websites'], 'totalAssets': stats['total_assets'], } ) except (DatabaseError, OperationalError): return error_response( code=ErrorCodes.SERVER_ERROR, message='Database error', status_code=status.HTTP_503_SERVICE_UNAVAILABLE ) @action(detail=True, methods=['post']) def stop(self, request, pk=None): # pylint: disable=unused-argument """ 停止扫描任务 URL: POST /api/scans/{id}/stop/ 功能: - 终止正在运行或初始化的扫描任务 - 更新扫描状态为 CANCELLED 状态限制: - 只能停止 RUNNING 或 INITIATED 状态的扫描 - 已完成、失败或取消的扫描无法停止 返回: - message: 成功消息 - revokedTaskCount: 取消的 Flow Run 数量 """ try: # 使用 Service 层处理停止逻辑 scan_service = ScanService() success, revoked_count = scan_service.stop_scan(scan_id=pk) if not success: # 检查是否是状态不允许的问题 scan = scan_service.get_scan(scan_id=pk, prefetch_relations=False) if scan and scan.status not in [ScanStatus.RUNNING, ScanStatus.INITIATED]: return error_response( code=ErrorCodes.BAD_REQUEST, message=f'Cannot stop scan: current status is {ScanStatus(scan.status).label}', status_code=status.HTTP_400_BAD_REQUEST ) # 其他失败原因 return error_response( code=ErrorCodes.SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) return success_response( data={'revokedTaskCount': revoked_count} ) except ObjectDoesNotExist: return error_response( code=ErrorCodes.NOT_FOUND, message=f'Scan ID {pk} not found', status_code=status.HTTP_404_NOT_FOUND ) except (DatabaseError, IntegrityError, OperationalError): return error_response( code=ErrorCodes.SERVER_ERROR, message='Database error', status_code=status.HTTP_503_SERVICE_UNAVAILABLE ) ================================================ FILE: backend/apps/scan/views/scheduled_scan_views.py ================================================ """ 定时扫描任务视图集 独立文件,避免 views.py 文件过大 """ from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.filters import SearchFilter from django.core.exceptions import ValidationError import logging from ..models import ScheduledScan from ..serializers import ( ScheduledScanSerializer, CreateScheduledScanSerializer, UpdateScheduledScanSerializer, ToggleScheduledScanSerializer ) from ..services.scheduled_scan_service import ScheduledScanService from ..repositories import ScheduledScanDTO from ..utils.config_merger import ConfigConflictError from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response, error_response from apps.common.error_codes import ErrorCodes logger = logging.getLogger(__name__) class ScheduledScanViewSet(viewsets.ModelViewSet): """ 定时扫描任务视图集 API 端点: - GET /scheduled-scans/ 获取定时扫描列表 - POST /scheduled-scans/ 创建定时扫描 - GET /scheduled-scans/{id}/ 获取定时扫描详情 - PUT /scheduled-scans/{id}/ 更新定时扫描 - DELETE /scheduled-scans/{id}/ 删除定时扫描 - POST /scheduled-scans/{id}/toggle/ 切换启用状态 查询参数: - target_id: 按目标 ID 过滤 - organization_id: 按组织 ID 过滤 - search: 按名称搜索 """ queryset = ScheduledScan.objects.all().order_by('-created_at') serializer_class = ScheduledScanSerializer pagination_class = BasePagination filter_backends = [SearchFilter] search_fields = ['name'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.service = ScheduledScanService() def get_queryset(self): """支持按 target_id 和 organization_id 过滤""" queryset = super().get_queryset() target_id = self.request.query_params.get('target_id') organization_id = self.request.query_params.get('organization_id') if target_id: queryset = queryset.filter(target_id=target_id) if organization_id: queryset = queryset.filter(organization_id=organization_id) return queryset def get_serializer_class(self): """根据 action 返回不同的序列化器""" if self.action == 'create': return CreateScheduledScanSerializer elif self.action in ['update', 'partial_update']: return UpdateScheduledScanSerializer elif self.action == 'toggle': return ToggleScheduledScanSerializer return ScheduledScanSerializer def create(self, request, *args, **kwargs): """创建定时扫描任务""" serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) try: data = serializer.validated_data dto = ScheduledScanDTO( name=data['name'], engine_ids=data.get('engine_ids', []), engine_names=data.get('engine_names', []), yaml_configuration=data['configuration'], organization_id=data.get('organization_id'), target_id=data.get('target_id'), cron_expression=data.get('cron_expression', '0 2 * * *'), is_enabled=data.get('is_enabled', True), ) scheduled_scan = self.service.create_with_configuration(dto) response_serializer = ScheduledScanSerializer(scheduled_scan) return success_response( data=response_serializer.data, status_code=status.HTTP_201_CREATED ) except ValidationError as e: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(e), status_code=status.HTTP_400_BAD_REQUEST ) def update(self, request, *args, **kwargs): """更新定时扫描任务""" instance = self.get_object() serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) try: data = serializer.validated_data dto = ScheduledScanDTO( name=data.get('name'), engine_ids=data.get('engine_ids'), organization_id=data.get('organization_id'), target_id=data.get('target_id'), cron_expression=data.get('cron_expression'), is_enabled=data.get('is_enabled'), ) scheduled_scan = self.service.update(instance.id, dto) response_serializer = ScheduledScanSerializer(scheduled_scan) return success_response(data=response_serializer.data) except ConfigConflictError as e: return error_response( code='CONFIG_CONFLICT', message=str(e), details=[ {'key': k, 'engines': [e1, e2]} for k, e1, e2 in e.conflicts ], status_code=status.HTTP_400_BAD_REQUEST ) except ValidationError as e: return error_response( code=ErrorCodes.VALIDATION_ERROR, message=str(e), status_code=status.HTTP_400_BAD_REQUEST ) def destroy(self, request, *args, **kwargs): """删除定时扫描任务""" instance = self.get_object() scan_id = instance.id name = instance.name if self.service.delete(scan_id): return success_response(data={'id': scan_id, 'name': name}) return error_response( code=ErrorCodes.SERVER_ERROR, message='Failed to delete scheduled scan', status_code=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action(detail=True, methods=['post']) def toggle(self, request, pk=None): """切换定时扫描任务的启用状态""" serializer = ToggleScheduledScanSerializer(data=request.data) serializer.is_valid(raise_exception=True) is_enabled = serializer.validated_data['is_enabled'] if self.service.toggle_enabled(int(pk), is_enabled): scheduled_scan = self.get_object() response_serializer = ScheduledScanSerializer(scheduled_scan) return success_response(data=response_serializer.data) return error_response( code=ErrorCodes.NOT_FOUND, message=f'Scheduled scan with ID {pk} not found or operation failed', status_code=status.HTTP_404_NOT_FOUND ) ================================================ FILE: backend/apps/scan/views/subfinder_provider_settings_views.py ================================================ """Subfinder Provider 配置视图""" import logging from rest_framework import status from rest_framework.views import APIView from rest_framework.response import Response from ..models import SubfinderProviderSettings from ..serializers import SubfinderProviderSettingsSerializer logger = logging.getLogger(__name__) class SubfinderProviderSettingsView(APIView): """Subfinder Provider 配置视图 GET /api/settings/api-keys/ - 获取配置 PUT /api/settings/api-keys/ - 更新配置 """ def get(self, request): """获取 Subfinder Provider 配置""" settings = SubfinderProviderSettings.get_instance() serializer = SubfinderProviderSettingsSerializer(settings.providers) return Response(serializer.data) def put(self, request): """更新 Subfinder Provider 配置""" serializer = SubfinderProviderSettingsSerializer(data=request.data) serializer.is_valid(raise_exception=True) settings = SubfinderProviderSettings.get_instance() settings.providers.update(serializer.validated_data) settings.save() logger.info("Subfinder Provider 配置已更新") return Response(SubfinderProviderSettingsSerializer(settings.providers).data) ================================================ FILE: backend/apps/targets/__init__.py ================================================ ================================================ FILE: backend/apps/targets/apps.py ================================================ from django.apps import AppConfig class TargetsConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.targets' verbose_name = '扫描目标管理' ================================================ FILE: backend/apps/targets/migrations/0001_initial.py ================================================ # Generated by Django 5.2.7 on 2026-01-06 00:55 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Target', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, default='', help_text='目标标识(域名/IP/CIDR)', max_length=300)), ('type', models.CharField(choices=[('domain', '域名'), ('ip', 'IP地址'), ('cidr', 'CIDR范围')], db_index=True, default='domain', help_text='目标类型', max_length=20)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('last_scanned_at', models.DateTimeField(blank=True, help_text='最后扫描时间', null=True)), ('deleted_at', models.DateTimeField(blank=True, db_index=True, help_text='删除时间(NULL表示未删除)', null=True)), ], options={ 'verbose_name': '扫描目标', 'verbose_name_plural': '扫描目标', 'db_table': 'target', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['type'], name='target_type_36a73c_idx'), models.Index(fields=['-created_at'], name='target_created_67f489_idx'), models.Index(fields=['deleted_at', '-created_at'], name='target_deleted_9fc9da_idx'), models.Index(fields=['deleted_at', 'type'], name='target_deleted_306a89_idx'), models.Index(fields=['name'], name='target_name_f1c641_idx')], 'constraints': [models.UniqueConstraint(condition=models.Q(('deleted_at__isnull', True)), fields=('name',), name='unique_target_name_active')], }, ), migrations.CreateModel( name='Organization', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(blank=True, default='', help_text='组织名称', max_length=300)), ('description', models.CharField(blank=True, default='', help_text='组织描述', max_length=1000)), ('created_at', models.DateTimeField(auto_now_add=True, help_text='创建时间')), ('deleted_at', models.DateTimeField(blank=True, db_index=True, help_text='删除时间(NULL表示未删除)', null=True)), ('targets', models.ManyToManyField(blank=True, help_text='所属目标列表', related_name='organizations', to='targets.target')), ], options={ 'verbose_name': '组织', 'verbose_name_plural': '组织', 'db_table': 'organization', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['-created_at'], name='organizatio_created_012eac_idx'), models.Index(fields=['deleted_at', '-created_at'], name='organizatio_deleted_2c604f_idx'), models.Index(fields=['name'], name='organizatio_name_bcc2ee_idx')], 'constraints': [models.UniqueConstraint(condition=models.Q(('deleted_at__isnull', True)), fields=('name',), name='unique_organization_name_active')], }, ), ] ================================================ FILE: backend/apps/targets/migrations/__init__.py ================================================ ================================================ FILE: backend/apps/targets/models.py ================================================ from django.db import models from django.utils import timezone class SoftDeleteManager(models.Manager): """软删除管理器:默认只返回未删除的记录""" def get_queryset(self): return super().get_queryset().filter(deleted_at__isnull=True) class Organization(models.Model): """组织模型""" id = models.AutoField(primary_key=True) name = models.CharField(max_length=300, blank=True, default='', help_text='组织名称') description = models.CharField(max_length=1000, blank=True, default='', help_text='组织描述') created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') # ==================== 软删除字段 ==================== deleted_at = models.DateTimeField(null=True, blank=True, db_index=True, help_text='删除时间(NULL表示未删除)') targets = models.ManyToManyField( 'Target', related_name='organizations', blank=True, help_text='所属目标列表' ) # ==================== 管理器 ==================== objects = SoftDeleteManager() # 默认管理器:只返回未删除的记录 all_objects = models.Manager() # 全量管理器:包括已删除的记录(用于硬删除) class Meta: db_table = 'organization' verbose_name = '组织' verbose_name_plural = '组织' ordering = ['-created_at'] # 部分唯一约束:只对未删除记录生效 constraints = [ models.UniqueConstraint( fields=['name'], condition=models.Q(deleted_at__isnull=True), name='unique_organization_name_active' ), ] indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['deleted_at', '-created_at']), # 软删除 + 时间索引 models.Index(fields=['name']), # 优化 name 搜索 ] def __str__(self): return str(self.name or f'Organization {self.id}') class Target(models.Model): """扫描目标模型 核心模型,存储要扫描的目标信息。 支持多种类型:域名、IP地址、CIDR范围等。 """ # ==================== 类型定义 ==================== class TargetType(models.TextChoices): DOMAIN = 'domain', '域名' IP = 'ip', 'IP地址' CIDR = 'cidr', 'CIDR范围' # ==================== 基本字段 ==================== id = models.AutoField(primary_key=True) name = models.CharField(max_length=300, blank=True, default='', help_text='目标标识(域名/IP/CIDR)') type = models.CharField( max_length=20, choices=TargetType.choices, default=TargetType.DOMAIN, db_index=True, help_text='目标类型' ) # ==================== 时间戳 ==================== created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间') last_scanned_at = models.DateTimeField(null=True, blank=True, help_text='最后扫描时间') # ==================== 软删除字段 ==================== deleted_at = models.DateTimeField(null=True, blank=True, db_index=True, help_text='删除时间(NULL表示未删除)') # ==================== 管理器 ==================== objects = SoftDeleteManager() # 默认管理器:只返回未删除的记录 all_objects = models.Manager() # 全量管理器:包括已删除的记录(用于硬删除) class Meta: db_table = 'target' verbose_name = '扫描目标' verbose_name_plural = '扫描目标' ordering = ['-created_at'] # 部分唯一约束:只对未删除记录生效 constraints = [ models.UniqueConstraint( fields=['name'], condition=models.Q(deleted_at__isnull=True), name='unique_target_name_active' ), ] indexes = [ models.Index(fields=['type']), models.Index(fields=['-created_at']), models.Index(fields=['deleted_at', '-created_at']), # 软删除 + 时间索引 models.Index(fields=['deleted_at', 'type']), # 软删除 + 类型索引 models.Index(fields=['name']), # 优化 name 搜索 ] def __str__(self): return str(self.name or f'Target {self.id}') ================================================ FILE: backend/apps/targets/repositories/__init__.py ================================================ """ Target Repositories 模块 提供 Target 和 Organization 数据访问层 """ from .django_target_repository import DjangoTargetRepository from .django_organization_repository import DjangoOrganizationRepository __all__ = [ 'DjangoTargetRepository', 'DjangoOrganizationRepository', ] ================================================ FILE: backend/apps/targets/repositories/django_organization_repository.py ================================================ """ Organization Django ORM 仓储实现 使用 Django ORM 实现组织数据访问 """ import logging from typing import List, Tuple, Dict from django.db.models import Count from django.utils import timezone from ..models import Organization, Target from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoOrganizationRepository: """Organization Django ORM 仓储实现""" def bulk_add_targets(self, organization_id: int, targets: List[Target]) -> None: """ 批量添加目标到组织 注意:会自动按 (organization_id, target_id) 去重,保留最后一条记录。 Args: organization_id: 组织 ID targets: Target 对象列表 """ if not targets: return # 使用 through model 批量插入,避免 N 次 add() ThroughModel = Organization.targets.through # 按 target_id 去重,避免批次内重复 seen = {} for t in targets: seen[t.id] = t unique_targets = list(seen.values()) if len(unique_targets) < len(targets): logger.debug(f"Organization-Target 关联去重: {len(targets)} -> {len(unique_targets)} 条") relations = [ ThroughModel(organization_id=organization_id, target_id=t.id) for t in unique_targets ] # 根据 through model 唯一约束自动去重 unique_relations = deduplicate_for_bulk(relations, ThroughModel) try: # 使用 ignore_conflicts 忽略已存在的关联 ThroughModel.objects.bulk_create(unique_relations, ignore_conflicts=True) except Exception as e: logger.error(f"批量关联目标失败: {e}") raise def get_by_id(self, organization_id: int) -> Organization | None: """ 根据 ID 获取组织 Args: organization_id: 组织 ID Returns: Organization 对象或 None """ try: return Organization.objects.get(id=organization_id) except Organization.DoesNotExist: logger.warning("组织不存在 - Organization ID: %s", organization_id) return None def get_names_by_ids(self, organization_ids: List[int]) -> List[Tuple[int, str]]: """ 根据 ID 列表获取组织的 ID 和名称 Args: organization_ids: 组织 ID 列表 Returns: [(id, name), ...] 元组列表 """ return list( Organization.objects .filter(id__in=organization_ids) .values_list('id', 'name') ) def soft_delete_by_ids(self, organization_ids: List[int]) -> int: """ 根据 ID 列表批量软删除组织 Args: organization_ids: 组织 ID 列表 Returns: 软删除的记录数 Note: - 使用软删除:只标记为已删除,不真正删除数据库记录 - 保留所有关联数据,可恢复 - 不会影响关联的目标(多对多关系保持不变) """ try: updated_count = ( Organization.objects .filter(id__in=organization_ids) .update(deleted_at=timezone.now()) ) logger.debug( "批量软删除组织成功 - Count: %s, 更新记录: %s", len(organization_ids), updated_count ) return updated_count except Exception as e: logger.error( "批量软删除组织失败 - IDs: %s, 错误: %s", organization_ids, e ) raise def get_targets(self, organization_id: int) -> List[Target]: """ 获取组织下的所有目标 Args: organization_id: 组织 ID Returns: Target 对象列表 """ organization = self.get_by_id(organization_id) if not organization: return [] return list(organization.targets.all()) def get_all(self): """ 获取所有组织 Returns: QuerySet: 组织查询集 """ return Organization.objects.all() def get_all_with_stats(self): """ 获取所有组织并预计算目标数量 Returns: QuerySet: 带统计信息的组织查询集 """ return ( Organization.objects .annotate(target_count=Count('targets')) .order_by('-created_at') ) def get_by_ids(self, organization_ids: List[int]) -> List[Organization]: """ 根据 ID 列表获取组织(只返回未删除的) Args: organization_ids: 组织 ID 列表 Returns: Organization 对象列表 """ return list(Organization.objects.filter(id__in=organization_ids)) def hard_delete_by_ids(self, organization_ids: List[int]) -> Tuple[int, Dict[str, int]]: """ 根据 ID 列表硬删除组织(真正删除数据) Args: organization_ids: 组织 ID 列表 Returns: (删除的记录数, 删除详情字典) Note: - 硬删除:从数据库中永久删除 - 使用 Django CASCADE 自动删除中间表 organization_targets 的关联记录 - 不会删除关联的 Target(多对多关系) - ⚠️ 不可恢复 - @auto_ensure_db_connection 自动重试数据库连接失败 """ try: # 使用 all_objects 管理器,可以删除已软删除的记录 deleted_count, deleted_details = ( Organization.all_objects .filter(id__in=organization_ids) .delete() ) logger.debug( "硬删除组织成功 - Count: %s, 删除记录数: %s, 详情: %s", len(organization_ids), deleted_count, deleted_details ) return deleted_count, deleted_details except Exception as e: logger.error( "硬删除组织失败 - IDs: %s, 错误: %s", organization_ids, e ) raise ================================================ FILE: backend/apps/targets/repositories/django_target_repository.py ================================================ """ Target Django ORM 仓储实现 使用 Django ORM 实现目标数据访问 """ import logging from typing import List, Tuple, Dict from django.db import transaction, IntegrityError, OperationalError, DatabaseError from django.utils import timezone from ..models import Target from apps.common.decorators import auto_ensure_db_connection from apps.common.utils import deduplicate_for_bulk logger = logging.getLogger(__name__) @auto_ensure_db_connection class DjangoTargetRepository: """Target Django ORM 仓储实现""" def count_by_ids(self, target_ids: List[int]) -> int: """ 统计给定 ID 列表中存在的目标数量 Args: target_ids: 目标 ID 列表 Returns: 存在的目标数量 """ if not target_ids: return 0 return Target.objects.filter(id__in=target_ids).count() def get_by_ids(self, target_ids: List[int]) -> List[Target]: """ 根据 ID 列表批量获取目标 Args: target_ids: 目标 ID 列表 Returns: Target 对象列表 """ if not target_ids: return [] return list(Target.objects.filter(id__in=target_ids)) def bulk_create_ignore_conflicts(self, targets: List[Target]) -> None: """ 批量创建目标,忽略冲突 注意:会自动按 name 去重,保留最后一条记录。 Args: targets: Target 对象列表 """ if not targets: return try: # 根据模型唯一约束自动去重 unique_targets = deduplicate_for_bulk(targets, Target) Target.objects.bulk_create(unique_targets, ignore_conflicts=True) except Exception as e: logger.error(f"批量创建目标失败: {e}") raise def get_by_names(self, names: List[str]) -> List[Target]: """ 根据名称列表批量获取目标 Args: names: 目标名称列表 Returns: Target 对象列表 """ if not names: return [] return list(Target.objects.filter(name__in=names)) def get_by_id(self, target_id: int) -> Target | None: """ 根据 ID 获取目标 Args: target_id: 目标 ID Returns: Target 对象或 None """ try: return Target.objects.get(id=target_id) except Target.DoesNotExist: logger.warning("目标不存在 - Target ID: %s", target_id) return None def get_names_by_ids(self, target_ids: List[int]) -> List[Tuple[int, str]]: """ 根据 ID 列表获取目标的 ID 和名称 Args: target_ids: 目标 ID 列表 Returns: [(id, name), ...] 元组列表 """ return list( Target.objects .filter(id__in=target_ids) .values_list('id', 'name') ) def soft_delete_by_ids(self, target_ids: List[int]) -> int: """ 根据 ID 列表批量软删除目标 Args: target_ids: 目标 ID 列表 Returns: 软删除的记录数 Note: - 使用软删除:只标记为已删除,不真正删除数据库记录 - 保留所有关联数据,可恢复 """ try: updated_count = ( Target.objects .filter(id__in=target_ids) .update(deleted_at=timezone.now()) ) logger.debug( "批量软删除目标成功 - Count: %s, 更新记录: %s", len(target_ids), updated_count ) return updated_count except Exception as e: logger.error( "批量软删除目标失败 - IDs: %s, 错误: %s", target_ids, e ) raise def get_all(self): """ 获取所有目标 Returns: QuerySet: 目标查询集 """ return Target.objects.prefetch_related('organizations').all() def get_or_create(self, name: str, target_type: str): """ 获取或创建目标 Args: name: 目标名称 target_type: 目标类型 Returns: (Target对象, 是否新创建的布尔值) """ return Target.objects.get_or_create( name=name, defaults={'type': target_type} ) def hard_delete_by_ids(self, target_ids: List[int]) -> Tuple[int, Dict[str, int]]: """ 根据 ID 列表硬删除目标(使用数据库级 CASCADE) Args: target_ids: 目标 ID 列表 Returns: (删除的记录数, 删除详情字典) Strategy: 使用数据库级 CASCADE 删除,性能最优 Note: - 硬删除:从数据库中永久删除 - 数据库自动处理所有外键级联删除 - 不触发 Django 信号(pre_delete/post_delete) """ try: batch_size = 1000 # 每批处理1000个目标 total_deleted = 0 logger.debug(f"开始批量删除 {len(target_ids)} 个目标(数据库 CASCADE)...") # 分批处理目标ID,避免单次删除过多 for i in range(0, len(target_ids), batch_size): batch_ids = target_ids[i:i + batch_size] # 直接删除目标,数据库自动级联删除所有关联数据 count, _ = Target.all_objects.filter(id__in=batch_ids).delete() total_deleted += count logger.debug(f"批次删除完成: {len(batch_ids)} 个目标,删除 {count} 条记录") # 由于使用数据库 CASCADE,无法获取详细统计 deleted_details = { 'targets': len(target_ids), 'total': total_deleted, 'note': 'Database CASCADE - detailed stats unavailable' } logger.debug( "批量硬删除成功(CASCADE)- 目标数: %s, 总删除记录: %s", len(target_ids), total_deleted ) return total_deleted, deleted_details except Exception as e: logger.error( "批量硬删除失败(CASCADE)- 目标数: %s, 错误: %s", len(target_ids), str(e), exc_info=True ) raise def update_last_scanned_at(self, target_id: int, scanned_at) -> bool: """ 更新目标的最后扫描时间 Args: target_id: 目标 ID scanned_at: 扫描时间 Returns: 是否更新成功 """ try: updated = Target.objects.filter(id=target_id).update(last_scanned_at=scanned_at) return updated > 0 except Exception as e: logger.error("更新最后扫描时间失败 - Target ID: %s, 错误: %s", target_id, e) return False ================================================ FILE: backend/apps/targets/scripts/__init__.py ================================================ ================================================ FILE: backend/apps/targets/scripts/run_delete_organizations.py ================================================ #!/usr/bin/env python """ 组织硬删除脚本 用于动态容器执行,硬删除已软删除的组织及其关联数据。 """ import sys import argparse import json import logging from apps.common.container_bootstrap import fetch_config_and_setup_django logging.basicConfig( level=logging.INFO, format='[%(asctime)s] [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) logger = logging.getLogger(__name__) def hard_delete_organizations(organization_ids: list[int]) -> dict: """ 硬删除组织 Args: organization_ids: 组织 ID 列表 Returns: 删除统计信息 """ from apps.targets.services import OrganizationService service = OrganizationService() try: deleted_count, details = service.hard_delete_organizations(organization_ids) logger.info(f"✓ 硬删除完成 - 删除数量: {deleted_count}") logger.info(f" 详情: {details}") return { 'success': True, 'deleted_count': deleted_count, 'details': details, } except Exception as e: logger.error(f"硬删除失败: {e}", exc_info=True) return { 'success': False, 'error': str(e), } def main(): parser = argparse.ArgumentParser(description="硬删除组织") parser.add_argument("--organization_ids", type=str, required=True, help="组织 ID 列表 (JSON)") args = parser.parse_args() # 解析 organization_ids organization_ids = json.loads(args.organization_ids) logger.info(f"开始硬删除 {len(organization_ids)} 个组织") # 获取配置并初始化 Django fetch_config_and_setup_django() # 执行删除 result = hard_delete_organizations(organization_ids) print(f"删除完成: {result}") if not result.get('success'): sys.exit(1) if __name__ == "__main__": main() ================================================ FILE: backend/apps/targets/scripts/run_delete_targets.py ================================================ #!/usr/bin/env python """ 目标硬删除脚本 用于动态容器执行,硬删除已软删除的目标。 """ import sys import argparse import json import logging from apps.common.container_bootstrap import fetch_config_and_setup_django logging.basicConfig( level=logging.INFO, format='[%(asctime)s] [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) logger = logging.getLogger(__name__) def hard_delete_targets(target_ids: list[int]) -> dict: """ 硬删除目标 Args: target_ids: 目标 ID 列表 Returns: 删除统计信息 """ from apps.targets.services import TargetService service = TargetService() try: deleted_count, details = service.hard_delete_targets(target_ids) logger.info(f"✓ 硬删除完成 - 删除数量: {deleted_count}") logger.info(f" 详情: {details}") return { 'success': True, 'deleted_count': deleted_count, 'details': details, } except Exception as e: logger.error(f"硬删除失败: {e}", exc_info=True) return { 'success': False, 'error': str(e), } def main(): parser = argparse.ArgumentParser(description="硬删除目标") parser.add_argument("--target_ids", type=str, required=True, help="目标 ID 列表 (JSON)") args = parser.parse_args() # 解析 target_ids target_ids = json.loads(args.target_ids) logger.info(f"开始硬删除 {len(target_ids)} 个目标") # 获取配置并初始化 Django fetch_config_and_setup_django() # 执行删除 result = hard_delete_targets(target_ids) print(f"删除完成: {result}") if not result.get('success'): sys.exit(1) if __name__ == "__main__": main() ================================================ FILE: backend/apps/targets/serializers.py ================================================ from rest_framework import serializers from django.db import IntegrityError from django.db.models import Count from .models import Organization, Target from apps.common.normalizer import normalize_target from apps.common.validators import detect_target_type from apps.asset.models import Vulnerability class SimpleOrganizationSerializer(serializers.ModelSerializer): """ 简化版组织序列化器 - 用于嵌套在其他序列化器中 注意事项: 1. 只包含基本字段 (id, name),不嵌套 targets 2. 避免循环引用:Organization ↔ Target 是多对多关系 如果双向嵌套会导致无限递归 3. 适用场景: - 在 TargetSerializer 中显示所属组织列表 - 在其他需要显示组织基本信息的地方 """ class Meta: model = Organization fields = ['id', 'name'] class TargetSerializer(serializers.ModelSerializer): """ 目标序列化器 性能优化说明: 1. 使用嵌套序列化器 SimpleOrganizationSerializer 显示关联的组织 2. ⚠️ 重要:ViewSet 必须使用 prefetch_related('organizations') 否则会产生 N+1 查询问题: - 没有预加载:100 个目标 = 1 + 100 = 101 次查询 - 正确预加载:100 个目标 = 1 + 1 = 2 次查询 已优化的视图: - TargetViewSet: queryset = Target.objects.prefetch_related('organizations') - OrganizationViewSet.targets(): queryset.prefetch_related('organizations') """ organizations = SimpleOrganizationSerializer(many=True, read_only=True) class Meta: model = Target fields = ['id', 'name', 'type', 'created_at', 'last_scanned_at', 'organizations'] read_only_fields = ['id', 'created_at', 'type'] def create(self, validated_data): """创建目标时自动规范化、检测目标类型""" name = validated_data.get('name', '') try: # 1. 规范化 normalized_name = normalize_target(name) # 2. 验证并检测类型 target_type = detect_target_type(normalized_name) # 3. 写入 validated_data['name'] = normalized_name validated_data['type'] = target_type return super().create(validated_data) except ValueError as e: raise serializers.ValidationError({'name': str(e)}) except IntegrityError: # 处理唯一性约束冲突 raise serializers.ValidationError({ 'name': f'目标 "{normalized_name}" 已存在' }) def update(self, instance, validated_data): """更新目标时,如果 name 变化则重新规范化和检测类型""" # 如果 name 发生变化,重新规范化和检测类型 if 'name' in validated_data and validated_data['name'] != instance.name: try: # 1. 规范化 normalized_name = normalize_target(validated_data['name']) # 2. 验证并检测类型 target_type = detect_target_type(normalized_name) # 3. 写入 validated_data['name'] = normalized_name validated_data['type'] = target_type except ValueError as e: raise serializers.ValidationError({'name': str(e)}) try: return super().update(instance, validated_data) except IntegrityError: # 处理唯一性约束冲突 raise serializers.ValidationError({ 'name': f'目标 "{validated_data.get("name", instance.name)}" 已存在' }) class TargetDetailSerializer(serializers.ModelSerializer): """ 目标详情序列化器 - 包含统计数据 用于单个目标详情页面(只读),包含各类资产的统计数量 Note: - 此序列化器只用于 retrieve action(只读操作) - 不包含 create/update 方法,因为详情页不需要修改功能 - 所有字段都是只读的,包括 name """ organizations = SimpleOrganizationSerializer(many=True, read_only=True) summary = serializers.SerializerMethodField() class Meta: model = Target fields = ['id', 'name', 'type', 'created_at', 'last_scanned_at', 'organizations', 'summary'] read_only_fields = ['id', 'name', 'type', 'created_at', 'last_scanned_at', 'summary'] def get_summary(self, obj): """计算目标资产统计数据 统计该目标下的资产数量: - subdomains: 子域名数量 - websites: 网站数量 - endpoints: 端点数量 - ips: IP地址数量 - directories: 目录数量 - screenshots: 截图数量 - vulnerabilities: 漏洞统计(暂时返回 0,待后续实现) 性能说明: - 使用 .count() 查询获取统计数据 - 每个统计字段执行一次数据库查询 - 不使用 annotate 预聚合的原因:多个 Count(distinct=True) 在大数据量时性能较差 - 对于详情页单条记录,直接 .count() 查询性能可接受 - ips 统计使用 distinct() 去重,因为 HostPortMapping 中同一 IP 可能有多个端口 """ # 基础资产统计(直接使用关联关系 count) subdomains_count = obj.subdomains.count() websites_count = obj.websites.count() endpoints_count = obj.endpoints.count() ips_count = obj.host_port_mappings.values('ip').distinct().count() directories_count = obj.directories.count() screenshots_count = obj.screenshots.count() # 漏洞统计:按目标维度实时统计 Vulnerability 资产表 vuln_qs = obj.vulnerabilities.all() total = vuln_qs.count() severity_stats = { 'critical': 0, 'high': 0, 'medium': 0, 'low': 0, } for row in vuln_qs.values('severity').annotate(count=Count('id')): sev = row['severity'] or '' count = row['count'] or 0 if sev in severity_stats: severity_stats[sev] = count return { 'subdomains': subdomains_count, 'websites': websites_count, 'endpoints': endpoints_count, 'ips': ips_count, 'directories': directories_count, 'screenshots': screenshots_count, 'vulnerabilities': { 'total': total, **severity_stats, } } class OrganizationSerializer(serializers.ModelSerializer): # 使用 IntegerField 接收由 annotate 预计算的 target_count # 避免 N+1 查询问题(在 ViewSet 的 get_queryset 中使用 annotate 预计算) target_count = serializers.IntegerField(read_only=True) class Meta: model = Organization fields = ['id', 'name', 'description', 'created_at', 'target_count'] read_only_fields = ['id', 'created_at', 'target_count'] class BatchCreateTargetSerializer(serializers.Serializer): """ 批量创建目标的序列化器 安全限制: - 最多支持 5000 个目标的批量创建 - 防止恶意用户提交大量数据导致服务器过载 """ # 批量创建的最大数量限制 MAX_BATCH_SIZE = 5000 # 目标列表 targets = serializers.ListField( child=serializers.DictField(), help_text='目标列表,每个目标包含 name 字段(type 会自动检测)' ) # 可选:关联的组织ID organization_id = serializers.IntegerField( required=False, allow_null=True, help_text='可选:关联到指定组织的ID' ) def validate_targets(self, value): """验证目标列表""" if not value: raise serializers.ValidationError("目标列表不能为空") # 检查数量限制,防止服务器过载 if len(value) > self.MAX_BATCH_SIZE: raise serializers.ValidationError( f"批量创建最多支持 {self.MAX_BATCH_SIZE} 个目标,当前提交了 {len(value)} 个" ) # 验证每个目标的必填字段 for idx, target in enumerate(value): if 'name' not in target: raise serializers.ValidationError(f"第 {idx + 1} 个目标缺少 name 字段") if not target['name']: raise serializers.ValidationError(f"第 {idx + 1} 个目标的 name 不能为空") return value ================================================ FILE: backend/apps/targets/services/__init__.py ================================================ """Target Services""" from .target_service import TargetService __all__ = ['TargetService'] ================================================ FILE: backend/apps/targets/services/organization_service.py ================================================ """ Organization 业务逻辑服务层(Service) 负责组织相关的业务逻辑处理 """ import logging from typing import List, Tuple, Dict from ..models import Organization from ..repositories.django_organization_repository import DjangoOrganizationRepository logger = logging.getLogger(__name__) class OrganizationService: """Organization 业务逻辑服务""" def __init__(self): """初始化服务,注入 Repository 依赖""" self.repo = DjangoOrganizationRepository() # ==================== 查询操作 ==================== def get_organization(self, organization_id: int) -> Organization | None: """ 获取组织 Args: organization_id: 组织 ID Returns: Organization 对象或 None """ return self.repo.get_by_id(organization_id) def get_all(self): """ 获取所有组织 Returns: QuerySet: 组织查询集 """ return self.repo.get_all() def get_all_with_stats(self): """ 获取所有组织(带统计信息) Returns: QuerySet: 带统计信息的组织查询集 """ return self.repo.get_all_with_stats() # ==================== 创建操作 ==================== def bulk_add_targets(self, organization_id: int, targets: List) -> None: """ 批量添加目标到组织 Args: organization_id: 组织 ID targets: Target 对象列表 """ logger.debug("批量关联目标到组织 - Org ID: %s, Targets: %s", organization_id, len(targets)) self.repo.bulk_add_targets(organization_id, targets) # ==================== 删除操作 ==================== def delete_organizations_two_phase(self, organization_ids: List[int]) -> Dict: """ 两阶段删除组织(业务方法) Args: organization_ids: 组织 ID 列表 Returns: { 'soft_deleted_count': int, 'hard_delete_scheduled': bool } Raises: ValueError: 未找到要删除的组织 Note: - 阶段 1:软删除(立即),用户立即看不到数据 - 阶段 2:硬删除(后台),真正删除数据和中间表 """ # 0. 先获取组织名称(用于返回给前端) org_names = [name for _, name in self.repo.get_names_by_ids(organization_ids)] # 1. 软删除(如果 ID 不存在,update 返回 0) soft_count = self.soft_delete_organizations(organization_ids) # 2. 检查是否有记录被删除 if soft_count == 0: raise ValueError("未找到要删除的组织") logger.info(f"✓ 软删除完成: {soft_count} 个组织") # 3. 使用 task_distributor 分发硬删除任务到 Worker try: from apps.engine.services.task_distributor import get_task_distributor distributor = get_task_distributor() success, message, container_id = distributor.execute_delete_task( task_type='organizations', ids=organization_ids ) if success: logger.info(f"✓ 硬删除任务已分发 - Container: {container_id}") else: logger.warning(f"硬删除任务分发失败: {message}") except Exception as e: logger.error(f"❌ 分发删除任务失败: {e}", exc_info=True) logger.warning("硬删除可能未成功提交,请检查 Worker 状态") return { 'soft_deleted_count': soft_count, 'organization_names': org_names, 'hard_delete_scheduled': True } def soft_delete_organizations(self, organization_ids: List[int]) -> int: """ 软删除组织 Args: organization_ids: 组织 ID 列表 Returns: 软删除的记录数 Note: - 返回值是实际更新的记录数,不是传入的 ID 数量 - 如果某些 ID 不存在,返回值会小于传入的 ID 数量 """ logger.info("软删除 %d 个组织", len(organization_ids)) try: deleted_count = self.repo.soft_delete_by_ids(organization_ids) logger.info("✓ 软删除成功 - 数量: %d", deleted_count) return deleted_count except Exception as e: logger.error("软删除失败: %s", e) raise def hard_delete_organizations(self, organization_ids: List[int]) -> Tuple[int, Dict[str, int]]: """ 硬删除组织(真正删除数据,使用 Django CASCADE) Args: organization_ids: 组织 ID 列表 Returns: (删除的记录数, 删除详情字典) Note: - 从数据库中永久删除 - Django CASCADE 自动删除 organization_targets 中间表记录 - 不会删除关联的 Target(多对多) """ logger.info("硬删除 %d 个组织", len(organization_ids)) try: deleted_count, deleted_details = self.repo.hard_delete_by_ids(organization_ids) logger.info("✓ 硬删除成功 - 数量: %d, 删除记录数: %d", len(organization_ids), deleted_count) return deleted_count, deleted_details except Exception as e: logger.error("❌ 硬删除失败 - IDs: %s, 错误: %s", organization_ids, e) raise ================================================ FILE: backend/apps/targets/services/target_service.py ================================================ """ Target 业务逻辑服务层(Service) 负责目标相关的业务逻辑处理 """ import logging from typing import List, Tuple, Dict, Any, Optional from django.db import transaction from ..models import Target from ..repositories.django_target_repository import DjangoTargetRepository logger = logging.getLogger(__name__) class TargetService: """Target 业务逻辑服务""" def __init__(self): """初始化服务,注入 Repository 依赖""" self.repo = DjangoTargetRepository() # ==================== 查询方法 ==================== def count_existing_ids(self, target_ids: List[int]) -> int: """ 统计给定 ID 列表中实际存在的目标数量 Args: target_ids: 目标 ID 列表 Returns: 存在的目标数量 """ return self.repo.count_by_ids(target_ids) # ==================== 查询操作 ==================== def get_target(self, target_id: int) -> Target | None: """ 获取目标 Args: target_id: 目标 ID Returns: Target 对象或 None """ return self.repo.get_by_id(target_id) def get_by_id(self, target_id: int) -> Target | None: """ 根据 ID 获取目标(get_target 别名) Args: target_id: 目标 ID Returns: Target 对象或 None """ return self.repo.get_by_id(target_id) def get_all(self): """ 获取所有目标 Returns: QuerySet: 目标查询集 """ return self.repo.get_all() def get_targets_by_names(self, names: List[str]) -> List[Target]: """ 根据名称批量获取目标 Args: names: 目标名称列表 Returns: Target 对象列表 """ return self.repo.get_by_names(names) def update_last_scanned_at(self, target_id: int) -> bool: """ 更新目标的最后扫描时间 Args: target_id: 目标 ID Returns: 是否更新成功 """ from django.utils import timezone return self.repo.update_last_scanned_at(target_id, timezone.now()) # ==================== 创建操作 ==================== def batch_create_targets( self, targets_data: List[Dict[str, Any]], organization_id: Optional[int] = None ) -> Dict[str, Any]: """ 批量创建目标 Args: targets_data: 目标数据列表,每个元素包含 name 字段 organization_id: 可选,关联到指定组织的 ID Returns: { 'created_count': int, # 处理的目标数量 'failed_count': int, 'failed_targets': List[Dict], 'message': str } Performance: 使用 bulk_create(ignore_conflicts=True) 直接创建,无需先查询。 1000个目标:~30ms """ from apps.targets.models import Target from apps.common.normalizer import normalize_target from apps.common.validators import detect_target_type from .organization_service import OrganizationService # ==================== 步骤 1:预处理数据 ==================== # 目的:规范化目标名称、检测类型、去重、过滤无效数据 valid_targets_map = {} # {name: type} failed_targets = [] for data in targets_data: name = data.get('name') if not name: continue try: norm_name = normalize_target(name) t_type = detect_target_type(norm_name) valid_targets_map[norm_name] = t_type except ValueError as e: failed_targets.append({'name': name, 'reason': str(e)}) if not valid_targets_map: return { 'created_count': 0, 'failed_count': len(failed_targets), 'failed_targets': failed_targets, 'message': "没有有效的目标" } # 验证组织是否存在 if organization_id: org_service = OrganizationService() organization = org_service.get_organization(organization_id) if not organization: raise ValueError(f'组织 ID {organization_id} 不存在') target_names = list(valid_targets_map.keys()) with transaction.atomic(): # ==================== 步骤 2:批量创建 Target(忽略冲突)==================== target_objs = [ Target(name=name, type=t_type) for name, t_type in valid_targets_map.items() ] self.repo.bulk_create_ignore_conflicts(target_objs) # ==================== 步骤 3:处理关联组织 ==================== if organization_id: # 重新查询获取所有涉及的 Target 对象(含 ID) all_targets = self.repo.get_by_names(target_names) org_service = OrganizationService() org_service.bulk_add_targets(organization_id, all_targets) # ==================== 懒加载模式:不预创建任何资产 ==================== # Subdomain/Website/Endpoint 将在各扫描流程中按需创建 created_count = len(valid_targets_map) logger.info( "批量创建目标完成(懒加载模式)- 处理: %d, 失败: %d", created_count, len(failed_targets) ) return { 'created_count': created_count, 'failed_count': len(failed_targets), 'failed_targets': failed_targets, 'message': f"成功处理 {created_count} 个目标" } # ==================== 删除操作 ==================== def delete_targets_two_phase(self, target_ids: List[int]) -> Dict: """ 两阶段删除目标(业务方法) Args: target_ids: 目标 ID 列表 Returns: { 'soft_deleted_count': int, 'hard_delete_scheduled': bool } Raises: ValueError: 未找到要删除的目标 Note: - 阶段 1:软删除(立即),用户立即看不到数据 - 阶段 2:硬删除(后台),真正删除数据和关联 """ # 0. 先获取目标名称(用于返回给前端) target_names = [name for _, name in self.repo.get_names_by_ids(target_ids)] # 1. 软删除(如果 ID 不存在,update 返回 0) soft_count = self.soft_delete_targets(target_ids) # 2. 检查是否有记录被删除 if soft_count == 0: raise ValueError("未找到要删除的目标") logger.info(f"✓ 软删除完成: {soft_count} 个目标") # 3. 使用 task_distributor 分发硬删除任务到 Worker try: from apps.engine.services.task_distributor import get_task_distributor distributor = get_task_distributor() success, message, container_id = distributor.execute_delete_task( task_type='targets', ids=target_ids ) if success: logger.info(f"✓ 硬删除任务已分发 - Container: {container_id}") else: logger.warning(f"硬删除任务分发失败: {message}") except Exception as e: logger.error(f"❌ 分发删除任务失败: {e}", exc_info=True) logger.warning("硬删除可能未成功提交,请检查 Worker 状态") return { 'soft_deleted_count': soft_count, 'target_names': target_names, 'hard_delete_scheduled': True } def soft_delete_targets(self, target_ids: List[int]) -> int: """ 软删除目标 Args: target_ids: 目标 ID 列表 Returns: 软删除的记录数 Note: - 返回值是实际更新的记录数,不是传入的 ID 数量 - 如果某些 ID 不存在,返回值会小于传入的 ID 数量 """ logger.info("软删除 %d 个目标", len(target_ids)) try: deleted_count = self.repo.soft_delete_by_ids(target_ids) logger.info("✓ 软删除成功 - 数量: %d", deleted_count) return deleted_count except Exception as e: logger.error("软删除失败: %s", e) raise def hard_delete_targets(self, target_ids: List[int]) -> Tuple[int, Dict[str, int]]: """ 硬删除目标(真正删除数据)- 使用数据库级 CASCADE Args: target_ids: 目标 ID 列表 Returns: (删除的记录数, 删除详情字典) Strategy: 使用数据库级 CASCADE 删除,性能最优 Note: - 硬删除:从数据库中永久删除 - 数据库自动级联删除所有关联数据 - 不触发 Django 信号(pre_delete/post_delete) """ logger.debug("准备硬删除目标(CASCADE)- Count: %s, IDs: %s", len(target_ids), target_ids) deleted_count, details = self.repo.hard_delete_by_ids(target_ids) logger.info( "硬删除目标成功(CASCADE)- Count: %s, 删除记录数: %s", len(target_ids), deleted_count ) return deleted_count, details ================================================ FILE: backend/apps/targets/urls.py ================================================ from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import OrganizationViewSet, TargetViewSet from apps.asset.views import ( SubdomainViewSet, WebSiteViewSet, DirectoryViewSet, EndpointViewSet, HostPortMappingViewSet, VulnerabilityViewSet, ScreenshotViewSet ) # 创建路由器 router = DefaultRouter() # 注册 ViewSet router.register(r'organizations', OrganizationViewSet, basename='organization') router.register(r'targets', TargetViewSet, basename='target') # Target 下的嵌套资产路由 target_subdomains_list = SubdomainViewSet.as_view({'get': 'list'}) target_subdomains_export = SubdomainViewSet.as_view({'get': 'export'}) target_subdomains_bulk_create = SubdomainViewSet.as_view({'post': 'bulk_create'}) target_websites_list = WebSiteViewSet.as_view({'get': 'list'}) target_websites_export = WebSiteViewSet.as_view({'get': 'export'}) target_websites_bulk_create = WebSiteViewSet.as_view({'post': 'bulk_create'}) target_directories_list = DirectoryViewSet.as_view({'get': 'list'}) target_directories_export = DirectoryViewSet.as_view({'get': 'export'}) target_directories_bulk_create = DirectoryViewSet.as_view({'post': 'bulk_create'}) target_endpoints_list = EndpointViewSet.as_view({'get': 'list'}) target_endpoints_export = EndpointViewSet.as_view({'get': 'export'}) target_endpoints_bulk_create = EndpointViewSet.as_view({'post': 'bulk_create'}) target_ip_addresses_list = HostPortMappingViewSet.as_view({'get': 'list'}) target_ip_addresses_export = HostPortMappingViewSet.as_view({'get': 'export'}) target_vulnerabilities_list = VulnerabilityViewSet.as_view({'get': 'list'}) target_screenshots_list = ScreenshotViewSet.as_view({'get': 'list'}) target_screenshots_bulk_delete = ScreenshotViewSet.as_view({'post': 'bulk_delete'}) urlpatterns = [ path('', include(router.urls)), # 嵌套路由:/api/targets/{target_pk}/xxx/ path('targets/<int:target_pk>/subdomains/', target_subdomains_list, name='target-subdomains-list'), path('targets/<int:target_pk>/subdomains/export/', target_subdomains_export, name='target-subdomains-export'), path('targets/<int:target_pk>/subdomains/bulk-create/', target_subdomains_bulk_create, name='target-subdomains-bulk-create'), path('targets/<int:target_pk>/websites/', target_websites_list, name='target-websites-list'), path('targets/<int:target_pk>/websites/export/', target_websites_export, name='target-websites-export'), path('targets/<int:target_pk>/websites/bulk-create/', target_websites_bulk_create, name='target-websites-bulk-create'), path('targets/<int:target_pk>/directories/', target_directories_list, name='target-directories-list'), path('targets/<int:target_pk>/directories/export/', target_directories_export, name='target-directories-export'), path('targets/<int:target_pk>/directories/bulk-create/', target_directories_bulk_create, name='target-directories-bulk-create'), path('targets/<int:target_pk>/endpoints/', target_endpoints_list, name='target-endpoints-list'), path('targets/<int:target_pk>/endpoints/export/', target_endpoints_export, name='target-endpoints-export'), path('targets/<int:target_pk>/endpoints/bulk-create/', target_endpoints_bulk_create, name='target-endpoints-bulk-create'), path('targets/<int:target_pk>/ip-addresses/', target_ip_addresses_list, name='target-ip-addresses-list'), path('targets/<int:target_pk>/ip-addresses/export/', target_ip_addresses_export, name='target-ip-addresses-export'), path('targets/<int:target_pk>/vulnerabilities/', target_vulnerabilities_list, name='target-vulnerabilities-list'), path('targets/<int:target_pk>/screenshots/', target_screenshots_list, name='target-screenshots-list'), path('targets/<int:target_pk>/screenshots/bulk-delete/', target_screenshots_bulk_delete, name='target-screenshots-bulk-delete'), ] ================================================ FILE: backend/apps/targets/views.py ================================================ import logging from rest_framework import viewsets, status, filters from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.exceptions import ValidationError, NotFound, APIException from django.db import transaction from django.db.models import Count from .models import Organization, Target from .serializers import OrganizationSerializer, TargetSerializer, TargetDetailSerializer, BatchCreateTargetSerializer from .services.target_service import TargetService from .services.organization_service import OrganizationService from apps.common.pagination import BasePagination from apps.common.response_helpers import success_response from apps.common.models import BlacklistRule from apps.common.serializers import TargetBlacklistRuleSerializer logger = logging.getLogger(__name__) class OrganizationViewSet(viewsets.ModelViewSet): """组织管理 - 增删改查""" serializer_class = OrganizationSerializer pagination_class = BasePagination filter_backends = [filters.SearchFilter, filters.OrderingFilter] search_fields = ['name'] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.org_service = OrganizationService() def get_queryset(self): """优化查询,预计算目标数量,避免 N+1 查询""" return self.org_service.get_all_with_stats() @action(detail=True, methods=['get']) def targets(self, request, pk=None): """ 获取组织的目标列表 GET /api/organizations/{id}/targets/?page=1&pageSize=10 """ organization = self.get_object() # 获取组织的目标(优化:使用 prefetch_related 预加载 organizations,避免 N+1 查询) queryset = organization.targets.prefetch_related('organizations').all() # 使用分页器 paginator = self.paginator page = paginator.paginate_queryset(queryset, request, view=self) if page is not None: serializer = TargetSerializer(page, many=True) return paginator.get_paginated_response(serializer.data) # 如果没有分页参数,抛出异常 raise ValidationError('必须提供分页参数 page 和 pageSize') @action(detail=True, methods=['post']) def unlink_targets(self, request, pk=None): """ 解除组织与目标的关联 POST /api/organizations/{id}/unlink_targets/ 请求格式: { "target_ids": [1, 2, 3] } 返回: { "unlinked_count": 3, "message": "成功解除 3 个目标的关联" } 注意:此操作只解除关联关系,不会删除目标本身 """ organization = self.get_object() target_ids = request.data.get('target_ids', []) if not target_ids: raise ValidationError('目标ID列表不能为空') if not isinstance(target_ids, list): raise ValidationError('target_ids 必须是数组') # 使用事务保护 with transaction.atomic(): # 验证目标是否存在且属于该组织(只查询 ID,避免加载完整对象) existing_target_ids = list( organization.targets.filter(id__in=target_ids).values_list('id', flat=True) ) existing_count = len(existing_target_ids) if existing_count == 0: raise ValidationError('未找到要解除关联的目标') # 批量解除关联(直接使用 ID,避免查询对象) organization.targets.remove(*existing_target_ids) return success_response(data={ 'unlinkedCount': existing_count }) def destroy(self, request, *args, **kwargs): """ 删除单个组织(复用批量删除逻辑) DELETE /api/organizations/{id}/ 功能: - 复用 bulk_delete 的两阶段删除逻辑 - 立即返回 200 OK,软删除完成,硬删除在后台执行 返回: - 200 OK: 软删除完成,硬删除已在后台启动 - 404 Not Found: 组织不存在 注意: - 两阶段删除:软删除(立即)+ 硬删除(后台任务) - 硬删除会清理 organization_targets 中间表 - 不会删除关联的 Target(多对多关系) """ try: organization = self.get_object() # 直接调用 Service 层的业务方法(软删除 + 分发硬删除任务) result = self.org_service.delete_organizations_two_phase([organization.id]) return success_response(data={ 'organizationId': organization.id, 'organizationName': organization.name, 'deletedCount': result['soft_deleted_count'], 'deletedOrganizations': result['organization_names'] }) except Organization.DoesNotExist: raise NotFound('组织不存在') except ValueError as e: raise NotFound(str(e)) except Exception as e: logger.exception("删除组织时发生错误") raise APIException('服务器错误,请稍后重试') @action(detail=False, methods=['post', 'delete'], url_path='bulk-delete') def bulk_delete(self, request): """ 批量删除组织(两阶段删除) POST/DELETE /api/organizations/bulk-delete/ 请求格式: { "ids": [1, 2, 3] } 功能: - 阶段 1:立即软删除(用户立即看不到数据) - 阶段 2:后台硬删除(真正删除数据和中间表) 返回: - 200 OK: 删除成功 - 400 Bad Request: 参数错误 - 404 Not Found: 未找到要删除的组织 注意: - 软删除:用户立即看不到 - 硬删除:清理数据库和 organization_targets 中间表 - 不会删除关联的 Target(多对多关系) - 硬删除任务通过 task_distributor 分发到动态容器执行 """ ids = request.data.get('ids', []) # 参数验证 if not ids: raise ValidationError('缺少必填参数: ids') if not isinstance(ids, list): raise ValidationError('ids 必须是数组') if not all(isinstance(i, int) for i in ids): raise ValidationError('ids 数组中的所有元素必须是整数') try: # 调用 Service 层的业务方法(软删除 + 分发硬删除任务) result = self.org_service.delete_organizations_two_phase(ids) return success_response(data={ 'deletedCount': result['soft_deleted_count'], 'deletedOrganizations': result['organization_names'] }) except ValueError as e: raise NotFound(str(e)) except Exception as e: logger.exception("删除组织时发生错误") raise APIException('服务器错误,请稍后重试') class TargetViewSet(viewsets.ModelViewSet): """ 目标管理 - 增删改查 性能优化说明: 1. 使用 prefetch_related('organizations') 预加载关联的组织 2. 配合 TargetSerializer 中的嵌套序列化器 SimpleOrganizationSerializer 3. 避免 N+1 查询问题: - 优化前:100 个目标 = 1 + 100 = 101 次查询 - 优化后:100 个目标 = 1 + 1 = 2 次查询 ⚠️ 重要:如果在其他地方使用 TargetSerializer,必须确保查询时使用了 prefetch_related('organizations'),否则仍会产生 N+1 查询 """ serializer_class = TargetSerializer pagination_class = BasePagination filter_backends = [filters.SearchFilter, filters.OrderingFilter] search_fields = ['name'] ordering = ['-created_at'] def __init__(self, **kwargs): super().__init__(**kwargs) self.target_service = TargetService() def get_queryset(self): """获取目标查询集 注意:不在这里使用 .annotate() 预聚合统计数据 原因: - 列表页(list action):需要分页 + 高性能统计 - 详情页(retrieve action):只需要一条记录的统计 统计策略: - 列表页:在 serializer 中用 .count() 单次查询(高性能) - 详情页:同样用 .count() 单次查询 ⚠️ 为什么不用 .annotate(): - 原因:多个 Count(distinct=True) 在大数据量时很慢(特别是目录数据) """ # 列表和详情都使用相同的查询集(详情页的统计交给 serializer 用 .count()) return self.target_service.get_all() def get_serializer_class(self): """根据不同的 action 返回不同的序列化器 - retrieve action: 使用 TargetDetailSerializer(包含 summary 统计数据) - 其他 action: 使用标准的 TargetSerializer """ if self.action == 'retrieve': return TargetDetailSerializer return TargetSerializer def destroy(self, request, *args, **kwargs): """ 删除单个目标(复用批量删除逻辑) DELETE /api/targets/{id}/ 功能: - 复用 bulk_delete 的两阶段删除逻辑 - 立即返回 200 OK,软删除完成,硬删除在后台执行 返回: - 200 OK: 软删除完成,硬删除已在后台启动 - 404 Not Found: 目标不存在 注意: - 两阶段删除:软删除(立即)+ 硬删除(后台任务) - 硬删除会使用分批删除策略处理大数据量 """ try: target = self.get_object() # 直接调用 Service 层的业务方法(软删除 + 分发硬删除任务) result = self.target_service.delete_targets_two_phase([target.id]) return success_response(data={ 'targetId': target.id, 'targetName': target.name, 'deletedCount': result['soft_deleted_count'] }) except Target.DoesNotExist: raise NotFound('目标不存在') except ValueError as e: raise NotFound(str(e)) except Exception as e: logger.exception("删除目标时发生错误") raise APIException('服务器错误,请稍后重试') @action(detail=False, methods=['post', 'delete'], url_path='bulk-delete') def bulk_delete(self, request): """ 批量删除目标(两阶段删除策略) POST/DELETE /api/targets/bulk-delete/ 请求格式: { "ids": [1, 2, 3] } 两阶段删除策略: 1. 阶段 1(立即):软删除目标,用户立即看不到数据 2. 阶段 2(后台):硬删除任务,真正清理数据 功能: - 立即软删除:用户立即看不到数据(响应快) - 后台硬删除:使用分批删除策略处理大数据量 返回: - 200 OK: 删除成功 - 400 Bad Request: 参数错误 - 404 Not Found: 未找到目标 注意: - 软删除:数据可恢复(deleted_at 不为 NULL) - 硬删除:数据不可恢复(真正从数据库删除) - 硬删除任务通过 task_distributor 分发到动态容器执行 """ ids = request.data.get('ids', []) # 参数验证 if not ids: raise ValidationError('缺少必填参数: ids') if not isinstance(ids, list): raise ValidationError('ids 必须是数组') if not all(isinstance(i, int) for i in ids): raise ValidationError('ids 数组中的所有元素必须是整数') try: # 调用 Service 层的业务方法(软删除 + 分发硬删除任务) result = self.target_service.delete_targets_two_phase(ids) return success_response(data={ 'deletedCount': result['soft_deleted_count'], 'deletedTargets': result['target_names'] }) except ValueError as e: raise NotFound(str(e)) except Exception as e: logger.exception("删除目标时发生错误") raise APIException('服务器错误,请稍后重试') @action(detail=False, methods=['post']) def batch_create(self, request): """ 批量创建目标 POST /api/targets/batch_create/ 请求格式: { "targets": [ {"name": "example.com"}, {"name": "192.168.1.1"}, {"name": "192.168.1.0/24"} ], "organization_id": 1 // 可选,关联到指定组织 } 限制: - 最多支持 1000 个目标的批量创建 - type 会根据 name 自动检测(域名/IP/CIDR) 返回: { "created_count": 2, "failed_count": 0, "failed_targets": [ {"name": "xxx", "reason": "无法识别的目标格式"} ], "message": "成功创建 2 个目标" } """ # 1. 参数验证 serializer = BatchCreateTargetSerializer(data=request.data) serializer.is_valid(raise_exception=True) targets_data = serializer.validated_data['targets'] organization_id = serializer.validated_data.get('organization_id') # 2. 调用 Service 层处理业务逻辑 try: result = self.target_service.batch_create_targets( targets_data=targets_data, organization_id=organization_id ) except ValueError as e: raise ValidationError(str(e)) # 3. 返回响应 return success_response(data=result, status_code=status.HTTP_201_CREATED) # subdomains action 已迁移到 SubdomainViewSet 嵌套路由 # GET /api/targets/{id}/subdomains/ -> SubdomainViewSet # vulnerabilities action 已迁移到 VulnerabilityViewSet 嵌套路由 # GET /api/targets/{id}/vulnerabilities/ -> VulnerabilityViewSet # 所有资产相关的 action 和 export 已迁移到 asset/views.py 中的各 ViewSet # GET /api/targets/{id}/subdomains/ -> SubdomainViewSet # GET /api/targets/{id}/subdomains/export/ -> SubdomainViewSet.export # GET /api/targets/{id}/websites/ -> WebSiteViewSet # GET /api/targets/{id}/websites/export/ -> WebSiteViewSet.export # GET /api/targets/{id}/endpoints/ -> EndpointViewSet # GET /api/targets/{id}/endpoints/export/ -> EndpointViewSet.export # GET /api/targets/{id}/directories/ -> DirectoryViewSet # GET /api/targets/{id}/directories/export/ -> DirectoryViewSet.export # GET /api/targets/{id}/ip-addresses/ -> HostPortMappingViewSet # GET /api/targets/{id}/ip-addresses/export/ -> HostPortMappingViewSet.export # GET /api/targets/{id}/vulnerabilities/ -> VulnerabilityViewSet # ==================== 黑名单管理 ==================== @action(detail=True, methods=['get', 'put'], url_path='blacklist') def blacklist(self, request, pk=None): """ Target 黑名单规则管理 GET /api/targets/{id}/blacklist/ - 获取 Target 黑名单列表 PUT /api/targets/{id}/blacklist/ - 全量替换规则(文本框保存场景) 设计说明: - 使用 PUT 全量替换模式,适合"文本框每行一个规则"的前端场景 - 用户编辑文本框 -> 点击保存 -> 后端全量替换 架构:MVS 模式 - View: 参数验证、响应格式化 - Service: 业务逻辑(BlacklistService) - Model: 数据持久化(BlacklistRule) """ from apps.common.services import BlacklistService target = self.get_object() blacklist_service = BlacklistService() if request.method == 'GET': # 获取 Target 的黑名单规则 rules = blacklist_service.get_target_rules(target.id) patterns = list(rules.values_list('pattern', flat=True)) return success_response(data={'patterns': patterns}) elif request.method == 'PUT': # 全量替换 patterns = request.data.get('patterns', []) if not isinstance(patterns, list): return Response( {'error': {'code': 'VALIDATION_ERROR', 'message': 'patterns 必须是数组'}}, status=status.HTTP_400_BAD_REQUEST ) # 调用 Service 层全量替换 result = blacklist_service.replace_target_rules(target, patterns) return success_response(data=result) ================================================ FILE: backend/config/__init__.py ================================================ """ 配置包初始化 确保 Prefect 配置在 Django 启动时被加载 """ # 延迟导入,避免在 ASGI 启动时出现循环依赖 # configure_prefect() 会在 Django 应用就绪时自动调用 __all__ = ('configure_prefect',) ================================================ FILE: backend/config/asgi.py ================================================ """ ASGI config for config project. It exposes the ASGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ """ import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') # 初始化 Django ASGI 应用(必须在导入路由之前) django_asgi_app = get_asgi_application() # 导入 WebSocket 路由 from apps.scan.notifications.routing import websocket_urlpatterns as notification_ws from apps.engine.routing import websocket_urlpatterns as worker_ws application = ProtocolTypeRouter({ 'http': django_asgi_app, 'websocket': AuthMiddlewareStack( URLRouter(notification_ws + worker_ws) ), }) ================================================ FILE: backend/config/logging_config.py ================================================ """ 日志配置模块(改进版 v2) 根据环境(开发/生产)和环境变量配置 Django 日志系统 改进内容: 1. ✅ 结构化日志 - JSON 格式便于日志分析和监控 2. ✅ 性能指标日志 - 专门记录性能相关信息 3. ⚠️ 异步日志处理 - 需要额外配置(见下方说明) 环境变量: - LOG_LEVEL: 全局日志级别 (DEBUG/INFO/WARNING/ERROR/CRITICAL) - LOG_DIR: 日志文件目录(留空则不输出文件) 开发环境特性: - 默认 DEBUG 级别 - 控制台彩色输出 - 可选文件输出 生产环境特性: - 默认 INFO 级别 - 控制台 + 文件输出(配置 LOG_DIR) - 文件自动轮转(10MB,保留5个备份) - JSON 结构化日志 - 性能指标日志 依赖安装: - pip install python-json-logger # JSON 格式化器 异步日志说明: - 当前使用标准 RotatingFileHandler(同步写入) - 如需异步处理,可使用 logging_config_new.py 中的 QueueHandler 方案 - 异步方案需要额外的 QueueListener 配置和生命周期管理 设计说明: - 直接从环境变量读取配置,避免与 settings.py 循环依赖 - settings.py 在加载时会调用此模块,此时 settings 对象尚未完全初始化 - 这是 Django 配置模块的常见模式 """ import os from pathlib import Path def get_logging_config(debug: bool = False): """ 获取日志配置字典 Args: debug: 是否为 DEBUG 模式 Returns: dict: Django LOGGING 配置字典 """ # 获取日志配置 log_level = os.getenv('LOG_LEVEL', 'DEBUG' if debug else 'INFO') log_dir = os.getenv('LOG_DIR', '') # 构建 handlers 配置 log_handlers = ['console'] logging_handlers = { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'colored' if debug else 'standard', 'stream': 'ext://sys.stdout', } } # 如果配置了日志目录,添加文件 handler if log_dir: log_path = Path(log_dir) log_path.mkdir(parents=True, exist_ok=True) # 标准文件日志 log_handlers.append('file') logging_handlers['file'] = { 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'standard', 'filename': str(log_path / 'xingrin.log'), 'maxBytes': 100 * 1024 * 1024, # 100MB 'backupCount': 5, 'encoding': 'utf-8', } # 错误日志单独记录 log_handlers.append('error_file') logging_handlers['error_file'] = { 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'standard', 'filename': str(log_path / 'xingrin_error.log'), 'maxBytes': 100 * 1024 * 1024, # 100MB 'backupCount': 5, 'encoding': 'utf-8', 'level': 'ERROR', # 只记录 ERROR 及以上级别 } # JSON 结构化日志(暂时关闭,需要时再开启) # log_handlers.append('json_file') # logging_handlers['json_file'] = { # 'class': 'logging.handlers.RotatingFileHandler', # 'formatter': 'json', # 'filename': str(log_path / 'xingrin_json.log'), # 'maxBytes': 100 * 1024 * 1024, # 100MB # 'backupCount': 5, # 'encoding': 'utf-8', # } # 性能指标日志(可读格式,便于人工查看) logging_handlers['performance_file'] = { 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'standard', # 使用可读格式,不用 JSON 'filename': str(log_path / 'performance.log'), 'maxBytes': 100 * 1024 * 1024, # 100MB 'backupCount': 5, 'encoding': 'utf-8', } # 构建完整的 LOGGING 配置 logging_config = { 'version': 1, 'disable_existing_loggers': False, # 格式化器 'formatters': { 'standard': { 'format': '[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)d] %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', }, 'colored': { 'format': '%(log_color)s[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)d]%(reset)s %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', '()': 'colorlog.ColoredFormatter', 'log_colors': { 'DEBUG': 'cyan', 'INFO': 'green', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'red,bg_white', }, }, # JSON 格式化器(结构化日志) 'json': { '()': 'pythonjsonlogger.jsonlogger.JsonFormatter', 'format': '%(asctime)s %(name)s %(levelname)s %(message)s %(pathname)s %(lineno)d', 'datefmt': '%Y-%m-%d %H:%M:%S', }, }, # 处理器 'handlers': logging_handlers, # 日志记录器 'loggers': { # Django 核心日志 'django': { 'handlers': log_handlers, 'level': 'INFO', # Django 框架日志,通常不需要 DEBUG 'propagate': False, }, 'django.request': { 'handlers': log_handlers, 'level': 'WARNING', # 请求错误日志 'propagate': False, }, 'django.server': { 'handlers': log_handlers, 'level': 'WARNING', # Django 开发服务器日志 'propagate': False, }, 'django.db.backends': { 'handlers': log_handlers, 'level': 'WARNING' if not debug else 'DEBUG', # SQL 查询日志(开发环境可启用) 'propagate': False, }, # 应用日志 - 扫描模块 'apps.scan': { 'handlers': log_handlers, 'level': log_level, 'propagate': False, }, # 应用日志 - 其他模块(统一级别) 'apps.asset': { 'handlers': log_handlers, 'level': log_level, 'propagate': False, }, 'apps.targets': { 'handlers': log_handlers, 'level': log_level, 'propagate': False, }, 'apps.engine': { 'handlers': log_handlers, 'level': log_level, 'propagate': False, }, 'apps.common': { 'handlers': log_handlers, 'level': log_level, 'propagate': False, }, # 第三方库日志控制 'websockets': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 WebSocket 的 DEBUG/INFO 日志 'propagate': False, }, 'websockets.client': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 WebSocket 客户端的调试日志 'propagate': False, }, 'httpx': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 HTTP 客户端的详细日志 'propagate': False, }, 'httpcore': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 HTTP 核心库的调试日志 'propagate': False, }, 'httpcore.connection': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 HTTP 连接的调试日志 'propagate': False, }, 'httpcore.http11': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 HTTP/1.1 协议的调试日志 'propagate': False, }, 'prefect': { 'handlers': log_handlers, 'level': 'INFO', # Prefect 框架日志保持 INFO 级别 'propagate': False, }, 'apscheduler': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭定时任务的 INFO 日志(每分钟执行) 'propagate': False, }, 'apscheduler.scheduler': { 'handlers': log_handlers, 'level': 'WARNING', 'propagate': False, }, 'apscheduler.executors': { 'handlers': log_handlers, 'level': 'WARNING', 'propagate': False, }, 'graphviz': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 graphviz 的 DEBUG 日志 'propagate': False, }, 'graphviz._tools': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 graphviz._tools 的 DEBUG 日志 'propagate': False, }, # Django 框架日志控制 'django.db.backends': { 'handlers': log_handlers, 'level': 'INFO', # 关闭数据库查询的 DEBUG 日志 'propagate': False, }, 'django.db.backends.schema': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭数据库模式的 DEBUG 日志 'propagate': False, }, 'django.utils.autoreload': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭自动重载的 DEBUG 日志 'propagate': False, }, 'django.request': { 'handlers': log_handlers, 'level': 'WARNING', # 只记录 WARNING 以上的请求日志(错误请求) 'propagate': False, }, 'django.server': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭服务器的 INFO 日志(如访问日志) 'propagate': False, }, # 其他第三方库日志控制 'asyncio': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 asyncio 的 DEBUG 日志 'propagate': False, }, 'urllib3': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭 urllib3 的详细日志 'propagate': False, }, 'urllib3.connectionpool': { 'handlers': log_handlers, 'level': 'WARNING', # 关闭连接池的详细日志 'propagate': False, }, # 性能指标日志(专门记录性能相关信息) 'performance': { 'handlers': ['performance_file'] if log_dir else ['console'], 'level': 'INFO', 'propagate': False, }, }, # 根日志记录器(兜底配置) 'root': { 'level': log_level, 'handlers': log_handlers, }, } return logging_config ================================================ FILE: backend/config/settings.py ================================================ """ Django settings for config project. Generated by 'django-admin startproject' using Django 5.2.7. For more information on this file, see https://docs.djangoproject.com/en/5.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ from pathlib import Path import os from dotenv import load_dotenv # 加载环境变量 load_dotenv() def get_bool_env(key: str, default: bool = False) -> bool: """获取布尔值环境变量,兼容多种写法(true/True/TRUE/1/yes)""" value = os.getenv(key, str(default)).lower() return value in ('true', '1', 'yes', 'on') # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.getenv('SECRET_KEY', 'django-insecure-default-key') # SECURITY WARNING: don't run with debug turned on in production! # 安全优先:默认为 False,开发环境需显式设置 DEBUG=True DEBUG = get_bool_env('DEBUG', False) ALLOWED_HOSTS = ['*'] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 第三方应用 'rest_framework', 'django_filters', # DRF 过滤器支持 'drf_yasg', 'corsheaders', 'channels', # WebSocket 支持 # 业务应用 'apps.common', # 通用工具 'apps.targets', # 扫描目标管理 'apps.scan', # 扫描任务管理 'apps.engine', # 扫描引擎管理 'apps.asset', # 资产管理 ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', # CORS 中间件(必须在 CommonMiddleware 之前) 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 已禁用 CSRF 校验 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'config.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 添加自定义模板目录 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'config.wsgi.application' # ASGI 应用配置(用于 WebSocket) ASGI_APPLICATION = 'config.asgi.application' # Database - PostgreSQL 配置 # https://docs.djangoproject.com/en/5.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': os.getenv('DB_ENGINE', 'django.db.backends.postgresql'), 'NAME': os.getenv('DB_NAME', 'xingrin'), 'USER': os.getenv('DB_USER', 'postgres'), 'PASSWORD': os.getenv('DB_PASSWORD', ''), 'HOST': os.getenv('DB_HOST', 'localhost'), 'PORT': os.getenv('DB_PORT', '5432'), # 连接池配置:针对长时间扫描任务优化 # 说明: # - 0: 每次请求后关闭(适合不稳定的远程连接) # - 60-120: 推荐值(平衡性能和资源占用) # - 300+: 适合长时间任务(减少连接重建开销) # - None: 永久连接(仅适合专用连接池,不推荐) 'CONN_MAX_AGE': int(os.getenv('DB_CONN_MAX_AGE', '60')), # 降低到 60 秒,更快检测失效连接 # Django 4.1+ 连接健康检查:每次使用前验证连接是否有效 # 解决 "server closed the connection unexpectedly" 问题 'CONN_HEALTH_CHECKS': True, # PostgreSQL 特定选项 - 针对远程数据库优化 'OPTIONS': { 'connect_timeout': 30, # 连接超时 30 秒(远程数据库需要更长时间) 'options': '-c statement_timeout=60000 -c idle_in_transaction_session_timeout=300000', # SQL 语句超时 60 秒,事务空闲超时 5 分钟 'keepalives': 1, # 启用 TCP keepalive 'keepalives_idle': 30, # TCP keepalive 空闲时间 30 秒(更积极地检测断连) 'keepalives_interval': 10, # TCP keepalive 间隔 10 秒 'keepalives_count': 5, # TCP keepalive 重试次数 # 性能优化参数 'sslmode': 'disable', # 禁用SSL以减少连接延迟(如果网络安全可控) 'application_name': 'xingrin_scanner', # 标识应用名称,便于监控 } } } # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ LANGUAGE_CODE = os.getenv('LANGUAGE_CODE', 'zh-hans') TIME_ZONE = os.getenv('TIME_ZONE', 'Asia/Shanghai') USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = 'static/' # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # ==================== Worker API Key 配置 ==================== # Worker 节点认证密钥(从环境变量读取) WORKER_API_KEY = os.environ.get('WORKER_API_KEY', '') # ==================== REST Framework 配置 ==================== REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'apps.common.pagination.BasePagination', # 使用基础分页器 # Session 认证(禁用 CSRF,前后端分离项目通过 CORS 控制跨域) 'DEFAULT_AUTHENTICATION_CLASSES': [ 'apps.common.authentication.CsrfExemptSessionAuthentication', ], # 全局权限配置:默认需要认证,公开端点和 Worker 端点在权限类中单独处理 'DEFAULT_PERMISSION_CLASSES': [ 'apps.common.permissions.IsAuthenticatedOrPublic', ], # 自定义异常处理器:统一 401/403 错误响应格式 'EXCEPTION_HANDLER': 'apps.common.exception_handlers.custom_exception_handler', # JSON 命名格式转换:后端 snake_case ↔ 前端 camelCase 'DEFAULT_RENDERER_CLASSES': ( 'djangorestframework_camel_case.render.CamelCaseJSONRenderer', # 响应数据转换为 camelCase 'djangorestframework_camel_case.render.CamelCaseBrowsableAPIRenderer', # 浏览器 API 也使用 camelCase ), 'DEFAULT_PARSER_CLASSES': ( 'djangorestframework_camel_case.parser.CamelCaseJSONParser', # 请求数据从 camelCase 转换为 snake_case 'djangorestframework_camel_case.parser.CamelCaseFormParser', # 表单数据也支持转换 'djangorestframework_camel_case.parser.CamelCaseMultiPartParser', # 文件上传支持转换 ), # 转换配置 'JSON_UNDERSCOREIZE': { 'no_underscore_before_number': True, # 数字前不加下划线 (field1 不会变成 field_1) }, } # ==================== CORS 配置 ==================== # 允许所有来源(前后端分离项目,安全性由认证系统保障) CORS_ALLOW_ALL_ORIGINS = os.getenv('CORS_ALLOW_ALL_ORIGINS', 'True').lower() == 'true' CORS_ALLOW_CREDENTIALS = True # 暴露额外的响应头给前端(Content-Disposition 用于文件下载获取文件名) CORS_EXPOSE_HEADERS = ['Content-Disposition'] # ==================== CSRF 配置 ==================== CSRF_TRUSTED_ORIGINS = os.getenv('CSRF_TRUSTED_ORIGINS', 'http://localhost:3000,http://127.0.0.1:3000').split(',') # ==================== Session 配置 ==================== SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 # 7 天 SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = 'Lax' # 跨站请求时发送 cookie # ==================== 扫描结果存储和清理配置 ==================== # 扫描结果存储目录(智能路径配置) _scan_results_dir_env = os.getenv('SCAN_RESULTS_DIR') if _scan_results_dir_env: # 使用环境变量指定的路径(支持相对和绝对路径) if os.path.isabs(_scan_results_dir_env): SCAN_RESULTS_DIR = _scan_results_dir_env # 绝对路径 else: SCAN_RESULTS_DIR = str(BASE_DIR / _scan_results_dir_env) # 相对路径转绝对路径 else: # 默认使用项目目录下的 results 文件夹 SCAN_RESULTS_DIR = str(BASE_DIR / 'results') # 扫描结果保留时间(单位:天) SCAN_RESULTS_RETENTION_DAYS = int(os.getenv('SCAN_RETENTION_DAYS', '3')) # ==================== Redis 配置 ==================== # Redis 配置(用于 WebSocket Channel Layer) REDIS_HOST = os.getenv('REDIS_HOST', 'localhost') REDIS_PORT = int(os.getenv('REDIS_PORT', 6379)) REDIS_DB = int(os.getenv('REDIS_DB', 0)) # Channels Layer 配置(WebSocket 后端) CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { 'hosts': [(REDIS_HOST, REDIS_PORT)], 'capacity': 1500, # 单个通道最大消息数 'expiry': 10, # 消息过期时间(秒) }, }, } # ==================== 日志配置 ==================== # 日志配置说明: # 1. 开发环境(DEBUG=True): # - 默认 DEBUG 级别,输出详细调试信息 # - 控制台彩色输出,便于调试 # - 可选文件输出(配置 LOG_DIR) # # 2. 生产环境(DEBUG=False): # - 默认 INFO 级别,只输出关键信息 # - 同时输出到控制台和文件(配置 LOG_DIR) # - 文件自动轮转,避免日志文件过大 # # 3. 环境变量控制: # - LOG_LEVEL: 全局日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL) # - LOG_DIR: 日志文件目录(留空则不输出文件) # from config.logging_config import get_logging_config LOGGING = get_logging_config(debug=DEBUG) # 命令执行日志开关(供 apps.scan.utils.command_executor 使用) ENABLE_COMMAND_LOGGING = get_bool_env('ENABLE_COMMAND_LOGGING', True) # ==================== 数据目录配置(统一使用 /opt/xingrin) ==================== # 所有数据目录统一挂载到 /opt/xingrin,便于管理和备份 # 扫描工具基础路径(worker 容器内,符合 FHS 标准) # 使用 /opt/xingrin-tools/bin 隔离项目专用扫描工具,避免与系统工具或 Python 包冲突 SCAN_TOOLS_BASE_PATH = os.getenv('SCAN_TOOLS_PATH', '/opt/xingrin-tools/bin') # 字典文件基础路径 WORDLISTS_BASE_PATH = os.getenv('WORDLISTS_PATH', '/opt/xingrin/wordlists') # 指纹库基础路径 FINGERPRINTS_BASE_PATH = os.getenv('FINGERPRINTS_PATH', '/opt/xingrin/fingerprints') # Nuclei 模板仓库根目录(存放 git clone 的仓库) NUCLEI_TEMPLATES_REPOS_BASE_DIR = os.getenv('NUCLEI_TEMPLATES_REPOS_DIR', '/opt/xingrin/nuclei-repos') # Nuclei 模板基础路径(custom / public 两类模板目录,已废弃,保留兼容) NUCLEI_CUSTOM_TEMPLATES_DIR = os.getenv('NUCLEI_CUSTOM_TEMPLATES_DIR', '/opt/xingrin/nuclei-templates/custom') NUCLEI_PUBLIC_TEMPLATES_DIR = os.getenv('NUCLEI_PUBLIC_TEMPLATES_DIR', '/opt/xingrin/nuclei-templates/public') # Nuclei 官方模板仓库地址 NUCLEI_TEMPLATES_REPO_URL = os.getenv('NUCLEI_TEMPLATES_REPO_URL', 'https://github.com/projectdiscovery/nuclei-templates.git') # 对外访问主机与端口(供 Worker 访问 Django 使用) PUBLIC_HOST = os.getenv('PUBLIC_HOST', 'localhost').strip() PUBLIC_PORT = os.getenv('PUBLIC_PORT', '8083').strip() # 对外 HTTPS 端口 SERVER_PORT = os.getenv('SERVER_PORT', '8888') # ============================================ # 任务分发器配置(负载感知调度) # ============================================ # Docker 镜像版本配置(统一管理,确保所有组件版本一致) DOCKER_USER = os.getenv('DOCKER_USER', 'yyhuni') IMAGE_TAG = os.getenv('IMAGE_TAG', '') # 任务执行器镜像配置(task_distributor 用于创建 worker 容器执行扫描任务) # # 版本一致性说明: # - 生产环境:IMAGE_TAG 锁定版本,确保 server 和 worker 版本一致 # - 开发环境:可通过 TASK_EXECUTOR_IMAGE 环境变量指向本地构建镜像 # # 环境区分逻辑: # 1. 主服务器环境: # - 有 IMAGE_TAG 环境变量(从 docker/.env 读取,install.sh 写入) # - 需要 TASK_EXECUTOR_IMAGE 来创建 worker 容器执行任务 # - 默认使用 {DOCKER_USER}/xingrin-worker:{IMAGE_TAG}(版本锁定) # - 开发时可设置 TASK_EXECUTOR_IMAGE=本地镜像名 覆盖 # # 2. Worker 容器环境: # - 无 IMAGE_TAG 环境变量(容器启动时未注入) # - 无 .env 文件 # - 不需要 TASK_EXECUTOR_IMAGE(worker 只执行任务,不会再创建其他容器) # - 设为空字符串避免 AttributeError,确保 settings 模块正常加载 # # 开发环境配置示例: # 在 docker/.env 中添加:TASK_EXECUTOR_IMAGE=docker-agent:test-v1.0.0 if IMAGE_TAG: # 主服务器场景:构建完整镜像名 TASK_EXECUTOR_IMAGE = os.getenv('TASK_EXECUTOR_IMAGE', f'{DOCKER_USER}/xingrin-worker:{IMAGE_TAG}') else: # Worker 容器场景:空值,防止加载错误 TASK_EXECUTOR_IMAGE = os.getenv('TASK_EXECUTOR_IMAGE', '') # 任务提交间隔(秒)- 防止短时间内重复分配到同一节点 # 应大于心跳间隔(3秒),确保负载数据已更新 TASK_SUBMIT_INTERVAL = int(os.getenv('TASK_SUBMIT_INTERVAL', '6')) # 本地 Worker Docker 网络名称(与 docker-compose.yml 中定义的一致) DOCKER_NETWORK_NAME = os.getenv('DOCKER_NETWORK_NAME', 'xingrin_network') # 宿主机挂载源路径(所有节点统一使用固定路径) # 部署前需创建:mkdir -p /opt/xingrin HOST_RESULTS_DIR = '/opt/xingrin/results' HOST_LOGS_DIR = '/opt/xingrin/logs' HOST_FINGERPRINTS_DIR = '/opt/xingrin/fingerprints' HOST_WORDLISTS_DIR = '/opt/xingrin/wordlists' # ============================================ # Worker 配置中心(任务容器从 /api/workers/config/ 获取) # ============================================ # Worker 数据库地址由 worker_views.py 的 config API 动态返回 # 根据请求来源(本地/远程)返回不同的配置: # - 本地 Worker(Docker 网络内):使用内部服务名 postgres # - 远程 Worker(公网访问):使用 PUBLIC_HOST # # 注意:Redis 仅在 Server 容器内使用,Worker 不需要直接连接 Redis _db_host = DATABASES['default']['HOST'] _is_internal_db = _db_host in ('postgres', 'localhost', '127.0.0.1') WORKER_DB_HOST = os.getenv('WORKER_DB_HOST', _db_host) # 容器内挂载目标路径(统一使用 /opt/xingrin) CONTAINER_RESULTS_MOUNT = '/opt/xingrin/results' CONTAINER_LOGS_MOUNT = '/opt/xingrin/logs' ================================================ FILE: backend/config/urls.py ================================================ """ URL configuration for config project. The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/5.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path, include from drf_yasg.views import get_schema_view from drf_yasg import openapi from apps.scan.notifications.views import NotificationSettingsView # API 文档配置 schema_view = get_schema_view( openapi.Info( title="XingRin API", default_version='v1', description="Web 应用侦察工具 API 文档", ), public=True, ) urlpatterns = [ # Django 后台管理 path('admin/', admin.site.urls), # API 文档 path('api/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='swagger'), path('api/redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='redoc'), # 业务 API(包含 organizations 和 targets) path('api/', include('apps.targets.urls')), # 扫描 API path('api/', include('apps.scan.urls')), # 引擎 & Worker API path('api/', include('apps.engine.urls')), # 资产 API path('api/', include('apps.asset.urls')), # 通知 API path('api/notifications/', include('apps.scan.notifications.urls')), # 通知设置 API path('api/settings/notifications/', NotificationSettingsView.as_view(), name='notification-settings'), # 认证 API path('api/', include('apps.common.urls')), ] ================================================ FILE: backend/fingerprints/ARL.yaml ================================================ - name: CISCO-RV016-VPN-Router_header rule: header="realm=\"rv016" - name: Sangfor-Data-Center_header rule: 'header="location: ./src/acloglogin.php"' - name: 天融信运维监控平台_header rule: header="天融信运维监控平台" - name: Metaswitch-Networks-MetaView-Web_body rule: body="content='dcl.metaview.web.client'" && body="src=\"dcl.metaview.web.client.nocache.js\">" - name: TP-LINK Wireless WR743ND_header rule: header="TP-LINK Wireless WR743ND" - name: Handle Proxy_icon_hash rule: icon_hash="926501571" - name: MDaemon Webmail_icon_hash rule: icon_hash="-766957661" - name: EFM-Networks-ipTIME-T16000_body rule: body="src=\"/images2/login_title.t16000.gif\"" - name: Sangfor-Data-Center_body rule: body="acloglogin.php" - name: Jana-Server_header rule: header="Jana-Server" - name: Goblin_header rule: header="Goblinserver:" - name: ADB Broadband S.p.A. (Network)_icon_hash rule: icon_hash="-587741716" - name: TP-LINK VPR400VPN_header rule: header="TP-LINK VPR400VPN" - name: Sqreen_header rule: header="Sqreen" - name: VMware ESXi_header rule: header="VMware ESXi" - name: LabVIEW_header rule: 'header="server: labview" && header="LabVIEW"' - name: mingyuanyun-Sales_body rule: body="value=\"明源售楼管理系统v5.0\"" && body="<img id=\"erp\" src=\"/_imgs/login/zs_erp.png" - name: AutoiPacket Webserver_header rule: header="AutoiPacket Webserver" - name: Apache-Dubbo_header rule: header=" basic realm=\"dubbo\"" - name: 华为_HUAWEI_ASG2050_header rule: header="HUAWEI ASG2050" - name: orangehrm_header rule: header="orangehrm" - name: Mattermost_header rule: header="Mattermost" - name: Lotus-Domino_header rule: header="Server:Lotus-Domino" - name: 加速乐CDN_header rule: header="加速乐CDN" - name: Craigs CMS_header rule: header="Craigs CMS" - name: AXIS-70U_header rule: header="AXIS-70U" - name: Entrolink_icon_hash rule: icon_hash="1973665246" - name: truVision NVR (interlogix)_icon_hash rule: icon_hash="1782271534" - name: phpMoneyBooks_body rule: body="href='http://phpmoneybooks.com'>phpmoneybooks" - name: Influxdb_header rule: header="X-Influxdb" - name: 致远 M1_icon_hash rule: icon_hash="3080850296" - name: 金和 OA_body rule: body="金和网络" && body="Jinher Software" - name: eagleeyescctv_body rule: body="ip surveillance for your life" && body="/nobody/logindevice.js" && body="IP Surveillance for Your Life" && body="/nobody/loginDevice.js" - name: TP-LINK-TD-8840T_header rule: header="realm=\"td-8840t" - name: 网旗路由器管理系统_header rule: header="网旗路由器管理系统" - name: EFM-Networks-ipTIME-A604V_body rule: body="src=\"/images2/login_title.a604v.gif\"" - name: 致远 M1_body rule: body="M1-Server 已启动,您可以使用移动设备登录M1" - name: AliyunOSS_header rule: 'header="server: aliyunoss" && header="x-oss-request-id" && header="AliyunOSS"' - name: ChinaTelecomArrearsRecoveryManagementSystem_body rule: body="id=\"v_login_container\"" - name: linksys-am_header rule: header="linksys-am" - name: Zyxel ZyWALL_icon_hash rule: icon_hash="-484708885" - name: DELL-N2024_body rule: body="class=\"login_server_default\">n2024" - name: AVIOSYS-IP-Camera_body rule: body="copyright aviosys" && body="view log" - name: Polycom-SoundPoint_header rule: 'header="server: polycom soundpoint ip telephone httpd"' - name: eagleeyescctv_header rule: header="avtech" - name: dahua-WP_body rule: body="src=\"/wpms/asset/common/js/jsencrypt.min.js\"" - name: DolphinScheduler_body rule: body="let node_env = 'true'" && body="<title>dolphinscheduler" - name: SES-imagotag_body rule: body="href=\"/xsl/accesspoint.xsl\"" - name: sapido-router_body rule: body="/etop_home_menu_style.css" && body="/b28n.js" - name: 1C-Bitrix_header rule: header="1C-Bitrix" - name: Linksys-Queretaro_header rule: header="Linksys-Queretaro" - name: CopAdd400_body rule: body="科博安全隔离与信息单向导入系统" && body="page/downloadlinuxclient.is.run" - name: APC_Management_body rule: body="This object on the APC Management Web Server is protected" - name: APC_Management_header rule: header="APC Management Card" - name: Zenoss_body rule: body="/zport/dmd/" - name: AtClose Server_header rule: header="AtClose Server" - name: 用友-时空KSOA_body rule: body="/images_index/productKSOA.jpg" - name: 08cms_body rule: body="content=\"08CMS" && body="typeof(_08cms)" - name: B_LINK-APRouter_header rule: header="realm=\"b-link-aprouter" - name: LeTV-路由器_header rule: header="LeTV-路由器" - name: 强讯科技 TalenTel_Log在线录音监听系统_header rule: header="强讯科技 TalenTel_Log在线录音监听系统" - name: Lenovo-Printer_body rule: body="" - name: Pushgateway_body rule: body="Pushgateway" - name: Sitecom-NAS_header rule: header="realm=\"sitecom login enter password (default is sitecom" - name: Exponent-CMS_body rule: body="content=\"exponent content management system" && body="powered by exponent cms" && body="content=\"Exponent Content Management System" && body="Powered by Exponent CMS" - name: 飞鱼星 家用智能路由_title rule: title="飞鱼星家用智能路由" - name: Moxa VPort Devices_header rule: header="Moxa VPort Devices" - name: Linksys BEFW11S4_header rule: header="Linksys BEFW11S4" - name: ZEBRA-GX430t_body rule: body="ztc gx430t" - name: Fortinet-CoyotePoint-Load-Balancer_header rule: 'header="server: coyotepoint"' - name: 智能表综合管理系统_body rule: body="js/jsCore.js" && body="Ajax_Code/Login.ashx" && body="login.css" - name: 爱信诺开票服务器_body rule: body="aisino.kps.console" - name: phpMyBible_body rule: body="
" - name: SuperMap-iServer_body rule: body="window.location.href=\"iserver\";" && body="id=\"copyright\">" - name: Micool-Management-System_body rule: body="米酷影视 版权所有" && body="name=\"keywords\" content=\"电影,视频大全,在线高清电影,付费电影,免费电影,剧集,电影,在线观看,vip高清电影直播\"" && body="bplay.php?play=" - name: InstantCMS_header rule: header="InstantCMS" - name: Asterisk_body rule: body="asterisk_rawmanPath" - name: Boa-WebServer_header rule: 'header="server: boa"' - name: 5iKQ_body rule: body="content=\"我爱考勤云平台" && body="我爱考勤云平台" && body="" - name: Hybris_header rule: header="Hybris" - name: Eloqua_header rule: header="Eloqua" - name: Asterisk_header rule: header="Asterisk" - name: hw99-Checking_body rule: body="/hwface/script/logincheck.js" - name: Fusemail WEB server_header rule: header="Fusemail WEB server" - name: 用友NC_body rule: body="logo/images/ufida_nc.png" && body="用友NC" - name: Kerio WinRoute Firewall_header rule: header="Kerio WinRoute Firewall" - name: ASUS-RT-AC5300_header rule: header="rt-ac5300" - name: ASUS-RT-AC5300_body rule: body="
rt-ac5300" - name: Intrinsyc-deviceWEB_header rule: header="realm=\"intrinsyc deviceweb" && header="Intrinsyc deviceWEB" - name: WebSOC知道网站立体监控系统_header rule: header="WebSOC知道网站立体监控系统" - name: 安恒玄武盾_header rule: header="安恒玄武盾" - name: 新秀文章管理系统_header rule: header="新秀文章管理系统" - name: SHARP-XG-C435X_header rule: header="realm=\"xg-c435x" - name: ActiveHTML_header rule: header="activehtml" && header="ActiveHTML" - name: Amazon_icon_hash rule: icon_hash="716989053" - name: Dradis-Framework_body rule: body="

dradis" - name: ZyWALL-USG-50_body rule: body="

zywall usg 50" && body="multi_lingual" && body="model\">zywall usg 50" - name: Dradis-Framework_header rule: header="_dradis_session=" && header="_dradis_session=" - name: MobileIron MyPhone@Work_header rule: header="MobileIron MyPhone@Work" - name: UiN-Meeting_body rule: body="uin.plist" - name: Javadoc_header rule: header="Javadoc" - name: Tencent-Exmail_body rule: body="cgi-bin/getinvestigate?flowid=" && body="cgi-bin/bizmail_portal" && body="/cgi-bin/getinvestigate?flowid=" && body="/cgi-bin/bizmail_portal" && body="content=\"登录腾讯企业邮箱" - name: DVR-Systems-webcam_body rule: body="your client does not have permission to get url /index.htm from this server.\"" - name: ZLAN_body rule: body="href=\"http://www.zlmcu.com\">zlan" - name: Tencent-Exmail_header rule: header="ssl_edition=mail.qq.com" && header="ssl_edition=mail.qq.com" - name: 云业CMS(yunyecms)_body rule: body="云业CMS" && body="yunyecms" - name: 云业CMS(yunyecms)_header rule: header="云业CMS" && header="yunyecms" - name: Bentley-Systems-ProjectWise_header rule: header="bentley.websession=" && header="Bentley.WebSession=" - name: 8cms_body rule: body="http://www.itf4.cn" && body="liangjing.org" && body="/tpl/templets" - name: MyfCMS闵益飞内容管理系统_body rule: body="MyfCMS闵益飞内容管理系统" - name: NetGear DD-wrt_header rule: header="NetGear DD-wrt" - name: Bentley-Systems-ProjectWise_body rule: body="href=\"projectwise.ico" && body="href=\"ProjectWise.ico" - name: TP-LINK Wireless WA7510N_header rule: header="TP-LINK Wireless WA7510N" - name: DrayTek-Vigor-Router_body rule: body="draytek corp. all rights reserved." && body="login to the router web configurator" - name: DrayTek-Vigor-Router_header rule: 'header="server: vigoraccess web server" && header="realm=\"login to the router web configurator"' - name: ALIYUN-RDS-API_body rule: body="href=\"system!stat.jspa" - name: Apache-Wicket_body rule: body="xmlns:wicket=" && body="/org.apache.wicket." && body="xmlns:wicket=" - name: Mihalism-Multi-Host_body rule: body="http://www.mihalism.com/product/mmh/\">mihalism multi host" && body="powered by mihalism multi host" && body="content=\"mihalism multi host" - name: RAISECOM-ISCOM2608G_body rule: body="color=\"#000000\">iscom2608g" - name: EFM-Networks-ipTIME-A2004R_body rule: body="src=\"/images2/login_title.a2004r.gif\"" - name: Moodle_icon_hash rule: icon_hash="-438482901" - name: cnzz_body rule: body="cnzz.com/stat.php?id=" - name: Moodle_header rule: header="moodlesession=" && header="moodleid_" - name: Moodle_body rule: body="title=\"moodle\" href=\"http://moodle.org/" && body="moodle" && body="moodle\":" - name: SourceCode-K2_body rule: body="document.getelementbyid(\"redirectform\".action = \"../mxworkspace/login.aspx" && body="document.getelementbyid(\"redirectform\".action = \"../workspace/default.aspx" - name: elasticsearch_body rule: body="You Know, for Search" - name: Kentico CMS_header rule: header="Kentico CMS" - name: SiteServer_body rule: body="http://www.siteserver.cn" && body="siteserver cms" && body="http://www.siteserver.cn" && body="T_系统首页模板" - name: NETGEAR DM111P_header rule: header="NETGEAR DM111P" - name: SCALANCE W_header rule: header="SCALANCE W" - name: TP-LINK R478_header rule: header="TP-LINK R478" - name: MyWebsite_header rule: header="MyWebsite" - name: Aisino-Telecom_body rule: body="航天信息股份有限公司 电信行业版" - name: NETGEAR MBR1515_header rule: header="NETGEAR MBR1515" - name: Axway-SecureTransport_header rule: header="securetransport" && header="SecureTransport" - name: Textcube_header rule: header="Textcube" - name: Netposa-Company's-product_body rule: 'body="

万解 - 东方网力:

" && body="东方网力科技股份有限公司" && body="
关于我们" && body="东方网力科技股份有限公司"' - name: DIGI-TransPort-WR11_body rule: body="class=\"heading\">transport wr11" - name: JianHengXinAn-JH-LAS_body rule: body="jh-la3600" && body="建恒信安日志审计系统" - name: UC-FAX_body rule: body=" href=\"web/css/faxcss.css\"" && body="src=\"web/img/log/logo-faxlogin.gif\"" - name: DevelopWay DW CMS_header rule: header="DevelopWay DW CMS" - name: TP-LINK Wireless WR641G/642G_header rule: header="TP-LINK Wireless WR641G/642G" - name: DLink-Internet-Camera_header rule: header="d-link internet camera" - name: NETGEAR DGN3500B_header rule: header="NETGEAR DGN3500B" - name: itenable_body rule: body="/enableq.css" && body="js/checkquestion.js.php" && body="/images/enableq.ico" - name: Npoint_body rule: body="content=\"n点虚拟主机管理系统" && body="js/ajax_x.js" && body="/inc/usercode.asp?npoint=" - name: 天源迪科和动力优品馆管理平台_header rule: header="天源迪科和动力优品馆管理平台" - name: Apache-Guacamole_body rule: body="images/guacamole-logo" && body="guacamole - clientless remote desktop" && body="scripts/guac-ui.js" - name: zychr-CMS_body rule: body="powered by zychr.com" - name: 中国期刊先知网_body rule: body="本系统由" - name: VNC-Enterprise-_header rule: 'header="server: vnc server enterprise edition"' - name: CSmail_header rule: header="CSmail" - name: MathJax_header rule: header="MathJax" - name: ewei-Plagform_body rule: body="易维平台" - name: reolink-NVR_body rule: body="balanced" - name: Jakarta-Project_body rule: body="alt=\"the jakarta project" && body="" - name: ownCloud_icon_hash rule: icon_hash="-1616115760" - name: ownCloud_header rule: header="ownCloud" - name: Uniview-VM8500_body rule: body="vm8500-imos110" - name: CancoSoft-asset-Management_body rule: body="var path = \"/cassets\";" - name: Honeywell-Intermec-EasyLAN_body rule: body="color=\"black\" size=\"5\">intermec easylan" - name: Honeywell-Intermec-EasyLAN_header rule: 'header="server: xcd webadmin"' - name: eyoucms_body rule: body="powered by eyoucms" && body="name=\"generator\" content=\"eyoucms" - name: NetPort_header rule: 'header="server: netport software" && header="power by netport"' - name: ZyXEL-Keenetic_header rule: header="realm=\"zyxel keenetic" - name: IBM-Watchfire_header rule: 'header="set-cookie: watchfiresessionid"' - name: ICEFLOW VPN Router_title rule: title="ICEFLOW VPN Router" - name: TP-LINK R470T+_header rule: header="TP-LINK R470T+" - name: Dahua_icon_hash rule: icon_hash="2828182062" - name: Yii-Framework_body rule: body="get started with yii" - name: pcitc-SSLVPN_body rule: body="src=\"new_style/placeholderfriend.js\"" - name: Moxa_NPort_5150A_body rule: body="5150A" - name: Linksys LCAM0336OD_header rule: header="Linksys LCAM0336OD" - name: Yii-Framework_header rule: header="yii_csrf_token" - name: TurboMail 邮件系统_body rule: body="TurboMail" && body="mailmain?type=login" - name: 锐捷交换机-睿易_body rule: body="cgi-bin/luci" && body="#f47f3e" - name: 西部数码CDN_header rule: header="西部数码CDN" - name: DELL-N1148T-ON_body rule: body="class=\"login_server_default\">n1148t-on" - name: SonicWALL-Company's-product_header rule: 'header="server: sonicwall"' - name: TRSMAS_header rule: header="X-Mas-Server" - name: Moxa_NPort_5150A_header rule: header="MoxaHttp" - name: SumoMe_header rule: header="SumoMe" - name: Linksys WRV54G_header rule: header="Linksys WRV54G" - name: 任子行 任天行网络安全管理系统_header rule: header="任子行 任天行网络安全管理系统" - name: 360-TianQing_body rule: body="/task/index/detail?id={item.id}" && body="已过期或者未授权,购买请联系4008-136-360" - name: Bicesoft-Super-Custom-Survey-Voting-System_body rule: body="href=\"images/bicesoft.css\"" && body="佰思超强自定义问卷调查系统(bicesoft.com" - name: Yzncms内容管理系统_header rule: header="Yzncms内容管理系统" - name: Yoast SEO_header rule: header="Yoast SEO" - name: etungtech-routers_body rule: body="cgi-bin/cgibox.cgi" && body="./img/logo.jpg" - name: Apache-Airflow_body rule: body="src=\"/static/pin_100.png\"" && body="airflow" - name: FNET HTTP - Freescale Embedded Web Server_header rule: header="FNET HTTP - Freescale Embedded Web Server" - name: Kerio-WinRout-Firewall_body rule: body="style/bodynonauth.css" && body="/gfx/kerio_logo.gif" - name: NETGEAR DGN2000B_header rule: header="NETGEAR DGN2000B" - name: Tenon-iTools_header rule: header="itools" && header="mac os x" - name: 乔客建站专家_Joekoe_CMS_body rule: body="乔客建站专家_Joekoe_CMS" - name: WEONLYDO-Product_header rule: 'header="server: weonlydo"' - name: Kerio-WinRout-Firewall_header rule: header="kerio winroute firewall" - name: Ruckus Wireless Router_header rule: header="Ruckus Wireless Router" - name: 博库 医院在线考试系统_header rule: header="博库 医院在线考试系统" - name: Sonatype Nexus Repository Manager_icon_hash rule: icon_hash="-1546574541" - name: Ajenti-Server-Admin-Panel_body rule: body="src=\"/ajenti:static/" && body="action=\"/ajenti:auth\"" - name: Hanwha-SRN-K3470S_body rule: body="$.nvr.model_name=\"srn-k3470s\"" - name: Plesk 面板_icon_hash rule: icon_hash="4160592263" - name: CISCO-M680_body rule: body="alt=\"cisco m680\"" - name: USP-Secure-Entry-Server_header rule: header="secure entry server" - name: dayrui系列产品_body rule: body="dayrui/statics" - name: ZoneMinder_body rule: body="zoneminder login" && body="ZoneMinder Login" - name: dayrui系列产品_header rule: header="dr_ci_session" - name: Linksys-MIR_header rule: header="Linksys-MIR" - name: JSEcoin_header rule: header="JSEcoin" - name: Doyo建站系统_header rule: header="Doyo建站系统" - name: NSFOCUS VPN_header rule: header="NSFOCUS VPN" - name: 汉得SRM_title rule: title="汉得SRM云平台" - name: Angular IO (AngularJS)_icon_hash rule: icon_hash="3039619512" - name: Sitellite_header rule: header="Sitellite" - name: Novell-iChain_body rule: body="src=\"ichainerrors/alertbar.gif" - name: SOPHOS-UTM220_body rule: body="var own_status" - name: TRENDnet-TV-IP312PI_header rule: header="realm=\"tv-ip312pi" - name: Deluge_icon_hash rule: icon_hash="944969688" - name: WLCMS_body rule: body="WLCMS" - name: NETCORE NR238_header rule: header="NETCORE NR238" - name: EFM-Networks-ipTIME-N704M_body rule: body="src =\"/images2/login_title.n704m.gif\"" && body="src =\"/images2/login_title.n704mlg.gif\"" - name: Novell-iChain_header rule: header="host name received is not for this web site" - name: MagicMail_body rule: body="/aboutus/magicmail.gif" - name: TP-LINK Wireless WR702N_header rule: header="TP-LINK Wireless WR702N" - name: Pimcore_header rule: header="Pimcore" - name: Sophos-Cyberoam-Product_body rule: body="href=\"http://www.cyberoam.com\" target=\"_blank\">www.cyberoam.com" - name: NETCORE-NAC_body rule: body="script/netcore.js" && body="./script/logic.js" && body="netis" - name: ifw8-Router_body rule: body="/index.htm?page=" && body="images/login-logo.png" && body="www.ifw8.cn" - name: Pc4Uploader_body rule: body="powered by pc4uploader" && body="pc4uploader qx200" - name: FITELnet-Router_header rule: 'header="server: gr-httpd server" && header="GR-HTTPD Server"' - name: Canon-MX720-series_body rule: body="nowrap>canon mx720 series" - name: naxsi_header rule: 'header="x-data-origin: naxsi"' - name: TP-LINK-Wireless-Router_body rule: body="javascript:gourl('http://www.tp-link.com.cn';" - name: Runda-Supervisory-Platform_body rule: body="class=\"log_rbox\"" - name: OpenVPN_icon_hash rule: icon_hash="396533629" - name: ZmCMS通用性企业网站建设管理系统_body rule: body="ZmCMS通用性企业网站建设管理系统" - name: Cisco ACE_header rule: header="ACE XML Gateway" - name: OpenVPN_header rule: header="realm=\"openvpn" - name: NETGEAR MBR1210_header rule: header="NETGEAR MBR1210" - name: FLIR AX8_header rule: header="FLIR AX8" - name: EnGenius-Switch_body rule: body="conner_basic conner_gdl" - name: NETGEAR C3000-100NAS_header rule: header="NETGEAR C3000-100NAS" - name: WebRAY Web应用防护系统_header rule: header="WebRAY Web应用防护系统" - name: IBM-Chassis-management_body rule: body=",\"chassis_name\":" - name: fengcms_body rule: body="Powered by FengCms" && body="content=\"FengCms" - name: Advanced Electron Forum_header rule: header="aefsid" - name: fluentd_header rule: header="fluentd" - name: Netsys_header rule: header="Netsys" - name: CISCO-Prime-Network-Registrar_body rule: body="productname=\"network registrar" - name: D_Link-DSR-150_body rule: 'body="
product page: dsr-150" && body="unified services router - dsr-150
"' - name: TP-LINK Wireless G WR340G_header rule: header="TP-LINK Wireless G WR340G" - name: Volusion_header rule: header="Volusion" - name: Tiger-IP-Connect_header rule: header="location network/index.php" - name: Vivotek (Camera)_icon_hash rule: icon_hash="-1654229048" - name: Linksys gateway_header rule: header="Linksys gateway" - name: InteractiveVirtualShipDisplaySystem_body rule: body="交互式虚拟船舶展示系统
" - name: YzmCMS_body rule: body="YzmCMS" && body="yzm-common.css" - name: PHP-Live_body rule: body="powered by " && body="" && body="/include/tiger.css" - name: Windows-Business-Server_body rule: body="src=\"images/sbslogo.gif" && body="href=\"/remote\">remote web workplace" - name: 任我行CRM_body rule: body="CRM_LASTLOGINUSERKEY" - name: Usabilla_header rule: header="Usabilla" - name: F5_BIGIP_header rule: header="BIGipServer" && header="X-WA-Info" && header="X-PvInfo" - name: BEWARD N100 H.264_header rule: header="BEWARD N100 H.264" - name: Cable/DSL-Router_header rule: header="realm=\"cable/dsl router" - name: 用友GRP-U8(财务系统)_header rule: header="用友GRP-U8(财务系统)" - name: Cloodie-HIS_body rule: body="src=\"/design/common/his.logo.white.svg\" alt=\"his logo" && body="href=\"/design/design/cloodie.css" - name: influxdata-InfluxDB_body rule: body="class=\"influxdb-version\"" - name: Ranzhi-OA_body rule: body="/sys/index.php?m=user&f=login&referer=" - name: FEX_header rule: 'header="server: fexsrv" && header="fexsrv"' - name: NETGEAR VVG2000_header rule: header="NETGEAR VVG2000" - name: FEX_body rule: body="href=\"mailto:fexmaster@ostc.de" && body="HREF=\"mailto:fexmaster@ostc.de" - name: Storeden_header rule: header="Storeden" - name: Docker_icon_hash rule: icon_hash="1937209448" - name: Docker_header rule: 'header="x-docker-registry-version" && header="x-docker-container: nginx"' - name: WebCache_header rule: header="WebCache" - name: PCITC-Cameras-and-Surveillance_body rule: body="images/slider/banner-gis.png" - name: Univention Portal_icon_hash rule: icon_hash="-1697334194" - name: MediPro乡镇政府门户网站系统_body rule: body="MediPro乡镇政府门户网站系统" - name: Ruijie-WiFi_body rule: body="var apmainpage = 'ap/main.htm" - name: amazon-cloudfront_header rule: header="X-Amz-Cf-Id" - name: ADT-IAM_body rule: body="content=\"tpn,vpn,内网安全,内网控制,主机防护\"" - name: EFM-Networks-ipTIME-N2E_body rule: body="src =\"/images2/login_title.n2e.gif\"" - name: Bit-Service_body rule: body="xmlpzs/webissue.asp" - name: 方卡在线(Isite)_body rule: body="方卡在线" && body="Isite" - name: Hikvision-Video-retrieval_body rule: body="海康威视" - name: 大米CMS_body rule: body="content=\"damicms" && body="content=\"大米CMS" - name: PHP-Layers_body rule: body="alt=\"powered by php layers menu" && body="" - name: 宝塔-BT.cn_body rule: body="入口校验失败" && body="没有找到站点" && body="可能原因" && body="CDN产品" && body="Web服务" && body="检查端口是否正确" && body="恭喜,站点创建成功" && body="面板系统后台" && body="系统自动生成" && body="扫码登录更安全" && body="bt.cn" && body="/login" && body="站点创建成功" && body="bt.cn" && body="站点创建成功" && body="宝塔" && body="宝塔Linux面板" - name: WebSideStory_body rule: body="http://websidestory.com" && body="websidestory code" && body="websidestory,inc. all rights reserved. u.s.patent no. 6,393,479b1" && body="<!-- websidestory html for search -->" - name: 奕桦网上商城YiiWaShopFree_header rule: header="奕桦网上商城YiiWaShopFree" - name: 网动云视讯平台_body rule: body="/js/roomHeight.js" && body="meetingShow!show.action" - name: Bubble_header rule: header="Bubble" - name: Surfilter-SURFNX-Security-Gateway_body rule: body="internal/templates/surfilter/images/logo_big.png" && body="/internal/templates/surfilter/css/" - name: 皓峰防火墙_header rule: header="皓峰防火墙" - name: 若依_body rule: body="ruoyi" && body="若依" && body="login" - name: TP-LINK R4238_header rule: header="TP-LINK R4238" - name: axTLS-Embad-Httpd_header rule: 'header="server: axhttpd"' - name: 皓峰防火墙_title rule: title="皓峰防火墙系统登录" - name: Hisense-Business-Management-Platform_body rule: body="src=\"up.jpg\"" && body="src=\"left.jpg\"" - name: Bandwidth-Management-Gateway_header rule: header="realm=\"bandwidth management gateway " - name: Pharos-LPC_header rule: header="realm=\"pharoslpc" - name: Tiki-wiki CMS_body rule: body="jqueryTiki = new Object" - name: ruijie_router_body rule: body="Ruijie" - name: Sitecore_header rule: header="sitecore cms" - name: MkDocs_header rule: header="MkDocs" - name: Advanced Electron Forum_body rule: body="Powered By AEF" && body="content=\"aef" - name: Mobinat-Wireless-Router_body rule: body="http://mobinnet.ir/faq" && body="http://mobinnet.ir/coverage" - name: Barracuda-Spam-Firewall_body rule: body="/barracuda.css" && body="http://www.barracudanetworks.com?a=bsf_product" && body="/barracuda.css" && body="http://www.barracudanetworks.com?a=bsf_product" - name: Travix_header rule: header="Travix" - name: Cisco-Wireless-LAN-Controller_body rule: body="action=\"/main_login.html" && body="cisco systems" && body="onclick=\"loginaction(" && body="cisco systems login" - name: Sophos-Web-Appliance_body rule: body="resources/images/sophos_web.ico" && body="url(resources/images/en/login_swa.jpg" - name: ZikulaCMS_header rule: header="ZikulaCMS" - name: PHPMPS分类信息_body rule: body="Powered by Phpmps" && body="templates/phpmps/style/index.css" - name: NSFOCUS TDC_header rule: header="NSFOCUS TDC" - name: Sophos_Email_Appliance_header rule: header="Sophos Email Appliance" - name: NETGEAR R6220_header rule: header="NETGEAR R6220" - name: ASUS-RT-AC1300UHP_body rule: body="<div class=\"prod_madelname\">rt-ac1300uhp" - name: PIOLINK-TiFRONT-Product_body rule: body="<em>tifront, the security switch" - name: Misskey_header rule: header="Misskey" - name: TR069-Client_header rule: 'header="realm=\"tr069 client" && header="server: tr069"' - name: Franklin Fueling Systems_body rule: body="Franklin Fueling Systems" - name: ocportal_header rule: header="ocportal" - name: Webmin_icon_hash rule: icon_hash="1453890729" && icon_hash="1280907310" && icon_hash="479413330" - name: FourSeasonsVPN_body rule: body="imgs/fs-black-box.jpg" - name: Microsoft-ISA-Server_body rule: body="the isa server denied the specified uniform resource locator" && body="the server denied the specified uniform resource locator (url. contact the server administrator" - name: PANSITE_header rule: header="PANSITE" - name: NETGEAR DGN1000_header rule: header="NETGEAR DGN1000" - name: 企智通上网行为管理_header rule: header="企智通上网行为管理" - name: gzmwiccard-System_body rule: body="抄表器驱动tp1100m" - name: Webmin_body rule: body="Webmin" && body="session_login" && body="webmin server on" && body="Webmin server on" - name: october cms_header rule: header="october cms" - name: Open Journal Systems_header rule: header="Open Journal Systems" - name: LINKSYS RV-042_header rule: header="LINKSYS RV-042" - name: ZTE Corporation (Gateway/Appliance)_icon_hash rule: icon_hash="459900502" - name: SuperMicro IPMI RMCP_header rule: header="SuperMicro IPMI RMCP" - name: huaxunchina-WLAN_body rule: body="var url=\"resetwebsvr.php?act=reset\";" && body="华讯方舟 - 集中无线控制器" - name: Materialize-CSS_body rule: body="/materialize.css" && body="/materialize.min.css" && body="materialize/materialize" && body="materialize/css" - name: bzfshop_header rule: header="bzfshop" - name: JAlbum_header rule: header="JAlbum" - name: Tomcat-Manager-Application_header rule: header="tomcat manager application" - name: 1024cms_body rule: body="Powered by 1024 CMS" && body="generator\" content=\"1024 CMS (c)" - name: HuaWei-eSpace-product_header rule: header="realm=\"enterprise ip phone huawei espace" - name: yii_header rule: header="YII_CSRF_TOKEN" - name: vaeThink_header rule: header="vaeThink" - name: SeaweedFS_icon_hash rule: icon_hash="1210969935" - name: 科荣 AIO 运营管理系统_body rule: body="style1/css/ListRange.css" && body="主账套" && body="login.jsp" - name: 新网企业邮_header rule: header="新网企业邮" - name: ipTIME-A8004NS-M_body rule: body="src=\"/images2/login_title.a8004nm.gif\"" - name: magicwinmail_header rule: header="magicwinmail_default_theme" - name: Miniature-JWS_header rule: header="rogatkin's" - name: modernizr_header rule: header="modernizr" - name: skywcm_header rule: header="skywcm" - name: KPPW_body rule: body="content=\"kekezu" && body="var siteurl = " && body="skin_path = 'tpl/default'," && body="<img id='imgflag' src=\"tpl/default/img/" - name: AirLive-Firmware&Driver_header rule: header="airlive airmax5" && header="airlive airmax2" - name: LotWan-Web-accelerator_body rule: body="北京华夏创新科技有限公司" - name: Newton_body rule: body="name=\"group_sn\"" - name: 和嘉科技 PEMS_header rule: header="和嘉科技 PEMS" - name: 安宁VMX反垃圾网关系统_header rule: header="安宁VMX反垃圾网关系统" - name: DSShop_header rule: header="DSShop" - name: FishEye_header rule: 'header="FESESSIONID=" && header="set-cookie: fesessionid"' - name: miniBB中文版_header rule: header="miniBB中文版" - name: BugSnag_header rule: header="BugSnag" - name: IPCop-Firewall_body rule: body="<!-- ipcop logo row -->" && body="href='https://sourceforge.net/projects/ipcop/" && body="href='http://sf.net/projects/ipcop/" - name: Unbounce_header rule: header="Unbounce" - name: IPCop-Firewall_header rule: header="IPCop-Firewall" - name: 网御 安全网关_body rule: body="安全系统" && body="网御星云" && body="login" - name: FishEye_body rule: body="fisheye " && body="fisheye-16.ico" - name: Acunetix_body rule: body="acunetix-logo-full-new-black.svg" && body="title>Acunetix" && body="" && body=" poweredge r820" - name: YYjiacms_body rule: body="YYjiacms" - name: Softbiz-Online-Classifieds_body rule: body="http://www.softbizscripts.com/classified-ads-plus-script-features.php" - name: 金蝶政务GSiS_body rule: body="/kdgs/script/kdgs.js" - name: Honeywell-IP-AK2_body rule: body="class=\"ak2word\">ip-ak2" - name: Alcatel_Lucent-Enterprise-gateway_body rule: body="欢迎登陆alcatel-lucent企业网关

请输入用户名和密码,3次出错将被锁定

" && body="alcatel-lucent" - name: Kedacom-ViewShot_body rule: body="background=\"image/viewshotuls-di.jpg" - name: Oracle-Enterprise-Performance-Management-System_body rule: body="" - name: USP-Secure-Login-Service_body rule: body="" && body="

" && body="dynomedia inc.

" - name: D-Link MiniAV_header rule: header="D-Link MiniAV" - name: Microsoft-SharePoint_header rule: header="microsoftsharepointteamservices" && header="sprequestduration" - name: Microsoft-SharePoint_body rule: body="content=\"microsoft sharepoint" && body="content=\"sharepoint team" && body="id=\"msowebpartpage_postbacksource" - name: 畅想之星 非书资源管理平台_header rule: header="畅想之星 非书资源管理平台" - name: Wp-Super-Cache_header rule: header="Wp-Super-Cache" - name: TeamPass_header rule: header="TeamPass" - name: 天玥运维安全网关_body rule: body="css/fw/full.css" && body="js/p/login.js" && body="login" - name: Solvonet Device(VoIP)_body rule: body="Solvonet Device" && body="VoIP" - name: Netgear-ReadyNAS_header rule: header="realm=\"readynas admin" - name: 百为路由_body rule: body="提交验证的id必须是ctl_submit" - name: JBoss Application Server 7_icon_hash rule: icon_hash="937999361" - name: 联想-防火墙_header rule: header="联想-防火墙" - name: TopSec SSLVPN_header rule: header="TopSec SSLVPN" - name: Adcash_header rule: header="Adcash" - name: 明致 OA_icon_hash rule: icon_hash="1591287747" - name: yfidea-OA_body rule: body="background=\"oa/images/index/oalogin.jpg\"" - name: Cloudera_header rule: header="Cloudera" - name: ACTi_body rule: body="ACTi Corporation All Rights Reserved" - name: 帕拉迪统一安全管理和综合审计系统_body rule: body="module/image/pldsec.css" - name: ColorMeShop_header rule: header="ColorMeShop" - name: Sweetrice_body rule: body="content=\"sweetrice" && body="powered by
basic cms sweetrice" - name: WP-Statistics_header rule: header="WP-Statistics" - name: MacbookAIR_header rule: header="macbook-air" - name: Gargoyle Router Management Utility_icon_hash rule: icon_hash="1862132268" - name: TypePad_header rule: header="TypePad" - name: dnaTools-dnaLIMS_body rule: body="/cgi-bin/dna/password.cgi" - name: ZTE-ZXHN-H268A_body rule: body="logintitle\">welcome to H268A. please login" - name: Gossamer-Forum_body rule: body="href=\"gforum.cgi?username=" && body="href=\"gforum.cgi?username=" - name: NSFOCUS-NIPS_body rule: body="/login_logo_nips_zh_cn.png" - name: DELL-PowerEdge-400SC_header rule: header="poweredge-400sc" - name: LK-IHC-Controller_body rule: body="/images/bg_image_lk.jpg" - name: OneAPM_header rule: header="OneAPM" - name: Proxmox-VE_body rule: body="class=\"boxheadline\">proxmox virtual environment" && body="href='http://www.proxmox.com' target='_blank' class=\"boxheadline" && body="ext.create('pve.stdworkspace'" - name: AniVN Server_header rule: header="AniVN Server" - name: WebSitePro_header rule: header="WebSitePro" - name: bet365_icon_hash rule: icon_hash="-2116540786" - name: GETSIMPLE-CMS_body rule: body="content=\"getsimple" && body="powered by getsimple" - name: ipinyou_body rule: body="stats.ipinyou.com/" - name: AliyunCDN_body rule: body="cdn.aliyuncs.com" - name: OpenMas_body rule: body="loginhead\"> print server homepage " - name: BMU_body rule: body="版本: espace ecs" - name: Prototype_header rule: header="Prototype" - name: CitusCMS_body rule: body="Powered by CitusCMS" && body="CitusCMS" && body="content=\"CitusCMS" - name: Cisco AMP_header rule: header="Cisco AMP" - name: Xaraya_header rule: header="Xaraya" - name: NETGEAR DG834PNB_header rule: header="NETGEAR DG834PNB" - name: 锐捷物联网平台_header rule: header="锐捷物联网平台" - name: Digital Keystone (DK)_icon_hash rule: icon_hash="-373674173" - name: MOVCMS_header rule: header="MOVCMS" - name: Topwalk-UIS_body rule: body="" - name: 教之初在线考试系统_header rule: header="教之初在线考试系统" - name: MaticsoftSNS_动软分享社区_body rule: body="MaticsoftSNS" && body="maticsoft" && body="/Areas/SNS/" - name: slack-instance_icon_hash rule: icon_hash="99395752" - name: Contrexx-CMS_body rule: body="powered by Contrexx" && body="content=\"Contrexx" - name: EDLM自助提卡系统_header rule: header="EDLM自助提卡系统" - name: BrewBlogger_body rule: body="developed by open blog" - name: Savant-Web-server_header rule: 'header="server: savant" && header="realm=\"savant"' - name: Bolt CMS_header rule: header="Bolt CMS" - name: Passenger_header rule: header="phusion_passenger" - name: phpWebSite_header rule: header="phpWebSite" - name: 哈尔滨新中新 金融化一卡通网站查询子系统_header rule: header="哈尔滨新中新 金融化一卡通网站查询子系统" - name: TRENDnet-TEW-822DRE_body rule: body="tew-822dre" && body="lang_obj.write(\"product_description\"" - name: Methode_header rule: header="Methode" - name: B2Bbuilder_icon_hash rule: icon_hash="492941040" - name: ChinaMDM-Mobile-Device-Management_body rule: body="innerhtml=\"chinamdm移动终端管理系统" && body="justsy/user/searchmenusbyusername/" - name: BlueQuartz_body rule: body="value=\"copyright (c 2000, cobalt networks" && body="VALUE=\"Copyright (C) 2000, Cobalt Networks" - name: MobilityGuard_body rule: body="click here for more information about mobilityguard" - name: jsyhit-System_body rule: body="content=\"仪化产品质量查询系统\"" - name: script.aculo.us_header rule: header="script.aculo.us" - name: FortiGuard_body rule: body="FortiGuard Web Filtering" && body="/XX/YY/ZZ/CI/MGPGHGPGPFGHCDPFGGOGFGEH" - name: QBServer_header rule: header="QBServer" - name: WaveIP_body rule: body="mac - srx550m" - name: zfsoft-Leaingrn_body rule: body="href=\"/jwglxt/logo/favicon.ico\"" - name: Caudium_header rule: 'header="caudium" && header="x-got-fish: pike" && header="Caudium" && header="X-Got-Fish:Pike"' - name: Novell Open Enterprise Server_header rule: header="Novell Open Enterprise Server" - name: DM Polopoly_header rule: header="DM Polopoly" - name: Hingesoft-HZCMS_body rule: body="produced by" && body="网站群内容管理系统" - name: SANGFOR-P5100_body rule: body="深信服科技版权所有" && body="p5100" - name: Gallery_body rule: body="/gallery/images/gallery.png" - name: xxl-job_body rule: body="/static/adminlte/dist/css/AdminLTE.min.css" && body="bower_components/PACE/pace.min.js" - name: Samsung-Router_body rule: body="samsung electronics" - name: HttpFS_body rule: body="httpfs service智慧城建项目管理系统powered by 微擎" && body="onsubmit=\"return formcheck(;\" class=\"we7-form\">" && body="content=\"微擎,微信" && body="powered by we7.cc" - name: 泛微OA ecology_header rule: header="ecology_JSessionid" - name: 即会通企业版(LiveUC)|视频会议_icon_hash rule: icon_hash="3657035475" - name: Informatics-CMS_body rule: body="content=\"informatics" && body="content=\"Informatics" - name: 品德科技医学在线考试系统_body rule: body="考试系统" && body="品德" && body="login.aspx" - name: WackoPicko_body rule: body="

welcome to wackopicko

" && body="

wackopicko.com

" - name: H3C-Firewall_body rule: body="class=\"dl_margin0\" align=\"left\">web网管用户登录
" && body="/php/common/checknum_creat.php?module=config_authnum" - name: WMSN_header rule: header="X-Powered-Cms:WMSN" - name: Intelbras-Roteador-ACtion-R1200_body rule: body="roteador action r1200

" - name: ATEN PN5320 HTTP Server_header rule: header="ATEN PN5320 HTTP Server" - name: 惠商+管理系统_title rule: title="惠商+管理系统" - name: joinf-ERP_body rule: body="

富通天下erp

" - name: TRENDnet-TEW-731BR_body rule: body="tew-731br" - name: QingYuan-HSSE_body rule: body="hsse 系统" - name: MYPAGE Platform_header rule: header="MYPAGE Platform" - name: Fbits_header rule: header="Fbits" - name: 惠尔顿 远程接入平台_header rule: header="惠尔顿 远程接入平台" - name: VisualSVN_header rule: header="realm=\"visualsvn server" - name: Cisco-Company's-product_body rule: body="cisco systems, inc. all rights reserved" - name: ZTE-D401_body rule: body="d401
" - name: StreamVideoEncoder_body rule: body="流媒体编码器专业版" - name: CruxCMS_body rule: body="Created by CruxCMS" - name: espocrm_header rule: header="espocrm" - name: ZyXEL-EMG2926_body rule: body="
  • emg2926
  • " - name: 深信服终端检测响应平台EDR_body rule: body="SANGFOR终端检测响应平台" - name: chanzhiEPS_header rule: header="chanzhiEPS" - name: NETGEAR WNDR4000_header rule: header="NETGEAR WNDR4000" - name: Linksys WRT300N_header rule: header="Linksys WRT300N" - name: Casbin_body rule: body="Casbin" && body="casbin" - name: Jumpserver_body rule: body="" - name: linksys rv042_header rule: header="linksys rv042" - name: FileNice_body rule: body="content=\"the fantabulous mechanical eviltwin code machine" && body="filenice/filenice.js" && body="content=\"the fantabulous mechanical eviltwin code machine" && body="fileNice/fileNice.js" - name: Mobotix-Camera_header rule: header="mobotix camera" - name: cradlepoint-IBR900L_body rule: body="cplogin.model = \"ibr900l\";" - name: 瑞友天翼-应用虚拟化系统_body rule: body="DownLoad.XGI" && body="realor.cn" && body="dvLogin" - name: Mobotix-Camera_body rule: body="content=\"mobotix ag" - name: Founder-Operation-management-and-decision-support-system_body rule: body="src=\"/portal/img/logo.png\"" && body="src=\"/desktop/ui/custom/getimage?img=iphoneview.png\"" - name: DELL-PowerEdge-M520_body rule: body="id=\"serverinfo\"> poweredge m520" - name: Linksys VPN_header rule: header="Linksys VPN" - name: hillston-OperationAndAnalysis_body rule: body="/static/css/main.4672616b.chunk.css" - name: cscms_body rule: body="cscms" - name: DDNS_header rule: header="ddns:" - name: wholeton-VPN_body rule: body="images/l_name.jpg" && body="jtpsoft style1" - name: ELOG HTTP_header rule: header="ELOG HTTP" - name: Hanwha-XRN-2011_body rule: body="$.nvr.model_name=\"xrn-2011\"" - name: JStorm_body rule: body="content=\"jstorm" - name: Epson-Printer_body rule: body="content=\"seiko epson" - name: opencart_中文版_header rule: header="opencart_中文版" - name: cisco UCM_body rule: body="/ccmadmin/" - name: Allegro RomPager_header rule: header="Allegro RomPager" - name: a-blog cms_header rule: header="a-blog cms" - name: Microsoft-UrlScan_header rule: header="rejected-by-urlscan" - name: CCProxy_header rule: header=" realm=\"ccproxy " && header="Server:CCProxy" - name: Mobile-law-enforcement-terminal_body rule: body="src=\"images/login/badgezh_cn.png" && body="huadean. all rights " - name: b3log-solo_header rule: header="b3log-solo" - name: DUclassified_body rule: body="assets/DUclassified.css" - name: 协众OA_body rule: body="scripts/cnoa.extra.js" && body="admin@cnoa.cn" && body="Powered by CNOA.CN" - name: NETGEAR-WNR612v3_header rule: header="netgear wnr612v3" - name: XSS平台_header rule: header="XSS平台" - name: Inktomi-Search_header rule: header="Inktomi Search" - name: Meraki-Network-Device_body rule: body="alt=\"cisco meraki\" src=\"img/cisco-meraki.png\"" && body="src=\"images/cisco-meraki.png\"" - name: TQ云呼叫中心_body rule: body="tq.cn/floatcard?" - name: Gleez Cms_header rule: header="Gleez Cms" - name: NETGEAR R6200v2_header rule: header="NETGEAR R6200v2" - name: Smart Ad Server_header rule: header="Smart Ad Server" - name: Vicworl_body rule: body="powered by vicworl" && body="content=\"vicworl" && body="vindex_right_d" && body="Powered by Vicworl" && body="content=\"Vicworl" && body="vindex_right_d" - name: Redmine_body rule: body="authenticity_token" && body="content=\"redmine" && body="powered by rt-n56u" && body="class=\"prod_madelname\" style=\"margin-left:78px;\">rt-n56u" && body="var product_name='rt-n56u'" - name: TOTO_LINK-N500RDG_body rule: body="src =\"/images/login_back_n500rdg.gif\"" - name: ComersusCart_body rule: body="CONTENT=\"Powered by Comersus" && body="href=\"comersus_showCart.asp" - name: HLK-RM04_header rule: header="realm=\"hlk-rm04" - name: Mdaweb_header rule: header="Mdaweb" - name: Kerio MailServer_header rule: header="Kerio MailServer" - name: 信达OA_body rule: body="http://www.xdoa.cn" && body="北京创信达科技有限公司" - name: DataLife-Engine_body rule: body="content=\"datalife engine" && body="content=\"DataLife Engine" - name: Ultra-CMDB_body rule: body="matrix" - name: 用友erp-nc_body rule: body="/nc/servlet/nc.ui.iufo.login.Index" - name: DataLife-Engine_header rule: header="dle_" && header="dle_" - name: Chamilo_header rule: header="X-Powered-By:Chamilo" - name: LG HDCP_header rule: header="LG HDCP" - name: Chamilo_body rule: body=" poweredge r720" - name: Yongyou-ism_body rule: body="sheight*window.screen.deviceydpi" - name: DORG_body rule: body="CONTENT=\"DORG" - name: TP-Link TL-WR941N_header rule: header="TP-Link TL-WR941N" - name: Textpattern CMS_header rule: header="Textpattern CMS" - name: aviatek-server_header rule: header="aviatek-server" - name: Cybrotech CyBroHttpServer_header rule: header="Cybrotech CyBroHttpServer" - name: EMC-Unisphere_body rule: body=" : dir-842" && body="

    dir-842 login

    "' - name: SimpleHelp (Remote Support)_icon_hash rule: icon_hash="1117165781" - name: Elcodi_header rule: header="Elcodi" - name: chimee_header rule: header="chimee" - name: IP-guard_body rule: body="IP-guard" && body="sign/login" - name: Apache-Traffic-Server_header rule: header="apachetrafficserver" && header="ApacheTrafficServer" - name: IBM WebSphere Application_header rule: header="IBM WebSphere Application" - name: 智慧型電能監控管理系統_header rule: header="智慧型電能監控管理系統" - name: ZZZCMS_body rule: body="href=\"/?brandlist/zzzcms" && body=".banner .in_business ul li dd" - name: V2 Conference 视频会议系统_body rule: body="window.location.href=\"/Conf/index.jsp\"" - name: TP-Link 740N_header rule: header="TP-Link 740N" - name: Thinker-IntelligentGateway_body rule: body="智能网关系统
    " - name: NOS Router_icon_hash rule: icon_hash="-831826827" - name: opencms_body rule: body="content=\"OpenCms" && body="Powered by OpenCms" - name: TP-LINK Wireless WR941N/942N_header rule: header="TP-LINK Wireless WR941N/942N" - name: LiveBOS Manager管理控制平台_icon_hash rule: icon_hash="3877875895" - name: 3gmeeting_header rule: header="3gmeeting" - name: PaloAlto-GlobalProtect_body rule: body="global-protect/login.esp" - name: CISCO_VPN_header rule: header="webvpn" - name: PageCookery Microblog_header rule: header="PageCookery Microblog" - name: Alcatel_Lucent-OS6860E-24_body rule: body="device os6860e-24" - name: LiveBOS Manager管理控制平台_title rule: title="LiveBOS控制台" - name: Laravel_body rule: body="Laravel" && body="PhpDebugBar.Widgets.LaravelSQLQueriesWidget" && body="Documentation" && body="Docs" && body="GitHub" - name: ZyXEL-VES-ADSL_header rule: header="realm=\"ves-" - name: Arab-Portal_body rule: 'body="powered by: arab" && body="Powered by: Arab"' - name: CMS4J_body rule: body="href=\"/cms4jadmin/login.jsp" && body="method=\"post\" name=\"cms4jsearchform\" id=\"cms4jsearchform" - name: NETGEAR VEGN2610_header rule: header="NETGEAR VEGN2610" - name: 网易企业邮箱_body rule: body="frmvalidator" - name: Citrix-XenServer_body rule: body="citrix systems, inc. xenserver" && body="xencenter installer" && body="Citrix Systems, Inc. XenServer" && body="XenCenter installer" - name: KYOCERA-Printer_header rule: 'header="server: km-mfp-http"' - name: Laravel_header rule: 'header="set-Cookie: laravel_session="' - name: CMS-Made-Simple_body rule: body="content=\"CMS Made Simple" - name: AWStats网站日志分析工具_body rule: body="content=\"AWStats" && body="Created by awstats" - name: AV-TECH Video Web_header rule: header="AV-TECH Video Web" - name: KYOCERA-Printer_body rule: body="var modelname=\"fs-" && body="var currentpage=\"\";" && body="var modelname=" - name: Chef Automate_icon_hash rule: icon_hash="-276759139" - name: Canon-MG5300-series_body rule: body="nowrap>canon mg5300 series" - name: ASUS-RT-AC68P_body rule: body="
    rt-ac68p" - name: E-Tiller_body rule: body="北京勤云" && body="reader/view_abstract.aspx" && body="reader/view_abstract.aspx" && body="北京勤云" - name: Polycom-RSS-Record_body rule: body="window.location.replace(\"/rss/\"" - name: NETGEAR WNR612ERT_header rule: header="NETGEAR WNR612ERT" - name: FIAMM-Camera_body rule: body="fiamm. all rights reserved." && body="vb.htm?authority3=" - name: TCExam_body rule: body="" && body="content=\"nicola asuni - tecnick.com s.r.l.\" />" - name: Dandian-CRM_body rule: body="url=general/erp/login/" && body="content=\"单点crm系统" && body="客户关系管理-crm" - name: WebAsyst-Shop-Script_body rule: 'body="shopping cart software"' - name: Phenomic_header rule: header="Phenomic" - name: ASUS-Router_body rule: body="asuswrt" - name: Traccar GPS tracking_icon_hash rule: icon_hash="-335153896" - name: Raytheon-DSP-2_body rule: 'body="unit name: dsp-2" && body="raytheon corporation"' - name: Comanche_header rule: header="Comanche" - name: ZiGuangHuaYu-Attendance Management System_body rule: body="广州紫光华宇信息技术有限公司" - name: D_Link-DCS-4622_body rule: 'body="Document Error: Unauthorized"' - name: zyxel-XGS3700_header rule: header="realm=\"xgs3700" - name: AxCMS_net_body rule: body="content=\"AxCMS.net" && body="Generated by AxCMS.net" - name: biept-System_body rule: body="class=\"loginin loginin1\"" - name: Adobe-Flex_body rule: body="learn more about flex at http://flex.org" - name: Simple Analytics_header rule: header="Simple Analytics" - name: IndusGuard-WAF_body rule: body="wafportal/wafportal.nocache.js" - name: Yepcomm_header rule: header="Yepcomm" - name: Canon-MX520-series_body rule: body="nowrap>canon mx520 series" - name: TaoDiCMS_header rule: header="TaoDiCMS" - name: Cisco 8600路由器_header rule: header="Cisco 8600" - name: PHPads_header rule: header="PHPads" - name: JSPGOU_header rule: header="JSPGOU" - name: GPON-Home-Gateway_body rule: body="/gponform/loginform" && body="xwebpagename" - name: Hanwha-SNP-6230RH_body rule: body="var defaultfilename = \"snp-6230rh\"" - name: OpenPHPNuke_header rule: header="OpenPHPNuke" - name: Squid_header rule: 'header="server: squid"' - name: phpPgAdmin_body rule: body="class=\"appname\">phppgadmin" - name: OXID eShop_header rule: header="OXID eShop" - name: 科达视讯云_header rule: header="科达视讯云" - name: Yahoo! Tag Manager_header rule: header="Yahoo! Tag Manager" - name: 优酷土豆路由宝_header rule: header="优酷土豆路由宝" - name: etcd-viewer_body rule: body="etcd viewer" - name: Sungoin-Traffic-management-platform_body rule: body="尚景流量管理平台" - name: graylog_body rule: body="org.graylog.plugins.pipelineprocessor.processorplugin" - name: H3C-ER2200G2_body rule: body="\"=aaaaaaaa" - name: TP-LINK R480E_header rule: header="TP-LINK R480E" - name: TOTO_LINK-N300RA_body rule: body="src =\"/images/login_back_zn300ra.gif\"" - name: Oceansoft_body rule: body="江苏欧索软件有限公司" && body="/ocensoftcomm.js" && body="技术支持:" && body="aspx/casecenter/acasecenter.aspx?pagetype=sxcx&casetype=sscs&casename=" && body="href=\"/e/action/listinfo/?" && body="江苏欧索" - name: Webgrind_body rule: body=" different functions called in " - name: TP-LINK WR820N_header rule: header="TP-LINK WR820N" - name: Komodo CMS_header rule: header="Komodo CMS" - name: 佳能网络摄像头 (Canon Network(Cameras)_body rule: body="佳能网络摄像头 (Canon Network" && body="Cameras" - name: Canon-MX340-series_body rule: body="nowrap>canon mx340 series" - name: DLink-DI-604_header rule: header="realm=\"di-604" - name: 网康科技·互联网控制网关_title rule: title="网康科技·互联网控制网关" - name: POSCMS_header rule: header="POSCMS" - name: LG-Smart-TV_body rule: body="lg smart tv" && body="lg smart tv" && body="[lg] smart tv" - name: NETGEAR-GS716Tv3_body rule: body="class=\"gs716tv3image spacer50percent topalign righthalign\"" - name: Xinnet-Enterprise-mail_body rule: body="北京新网数码信息技术有限公司 版权所有" - name: Volusion (V1)_header rule: header="Volusion (V1)" - name: D-Link-DAR-8000_body rule: body="dar-8000" - name: Vesta Hosting Control Panel_icon_hash rule: icon_hash="1954835352" - name: Digital-china-Camera_body rule: body="神州数码" - name: External-network-security-data-exchange-system_body rule: body="/unimas/" - name: Linksys-Smart-Wi-Fi_body rule: body="content=\"included with your linksys smart wi-fi " - name: Linksys WAG160Nv2_header rule: header="Linksys WAG160Nv2" - name: Fork CMS_header rule: header="Fork CMS" - name: TrendMicro-Product_body rule: body="deep security" - name: Adyen_header rule: header="Adyen" - name: GoCache_header rule: header="GoCache" - name: atfuture-System_body rule: body="/content/web/theme/skin01/img/p_login_logo01.png" - name: Linksys-USB-HDD_body rule: body="href=\"management/setup.cgi?next_file=lan.htm" - name: EDIMAX-Router_header rule: 'header="realm=\"default: admin/1234"' - name: Mustache_header rule: header="Mustache" - name: 华为-智能呼叫中心_header rule: header="华为-智能呼叫中心" - name: ADM Webserver_header rule: header="ADM Webserver" - name: SONY-SNC-ER580_header rule: header="realm=\"sony network camera snc-er580" - name: Exim smtpd_header rule: header="Exim smtpd" - name: Metabase_body rule: body="Metabase" && body="/app/assets/img/apple-touch-icon.png" - name: VMware Workspace ONE Access_icon_hash rule: icon_hash="3044492955" - name: 阿标_CMS管理系统_body rule: body="阿标_CMS管理系统" - name: Yonyou-ERP-NC_body rule: body="/nc/servlet/nc.ui.iufo.login.index" - name: Cachelogic-Expired-Domains-Script_body rule: body="href=\"http://cachelogic.net\">Cachelogic.net" - name: Privoxy代理_header rule: header="Privoxy" - name: TWebAP_header rule: header="TWebAP" - name: AKCMS_body rule: body="AKCMS" - name: TRENDnet-TEW-826DAP_body rule: body="var model = \"tew-826dap\"" - name: Simplébo_header rule: header="Simplébo" - name: IBM-KVM-switch_body rule: body="src=\"/avct.js" - name: Mean.io_header rule: header="Mean.io" - name: Apereo CAS_header rule: header="Apereo CAS" - name: 360-Enterprise-security_body rule: body="360entinst" && body="关于全网部署360私有云的通知" && body="私有云控制中心" && body="/download/360inst.exe" - name: Jupyter-Notebook_body rule: body="
    " && body="
    " - name: Alpha Anywhere Application Server_header rule: header="Alpha Anywhere Application Server" - name: TRENDnet-TV-IP430PI_header rule: header="realm=\"tv-ip430pi" - name: Portainer (Docker Management)_icon_hash rule: icon_hash="-1424036600" - name: 朗新天霁人力资源管理系统_body rule: body="hrsoft.com.cn" && body="chkLogindiv" && body="CustStyle" - name: FeiFeiCMS_header rule: header="FeiFeiCMS" - name: NukeViet_header rule: header="NukeViet" - name: FeiFeiCMS_body rule: body="feifeicms" - name: GoodSyncServer_header rule: header="GoodSyncServer" - name: unimas-CameraAudit_body rule: body="txtpasswordcssclass" - name: AADServer HTTP Server_header rule: header="AADServer HTTP Server" - name: Mac-OSX-Server_header rule: header="realm=\"mac os x server" - name: FluentNET_body rule: body="content=\"Fluent" - name: Apache Flink_header rule: header="Apache Flink" - name: WebIssues_body rule: body="
    webissues" && body="
    " - name: Walle瓦力平台_header rule: header="Walle瓦力平台" - name: 海天OA_body rule: body="HTVOS.js" - name: Panasonic-Ethernet-webcam_body rule: body="content=\"ncs g 2062\"" - name: DreamWeaver_header rule: header="DreamWeaver" - name: MDaemon-email-server_body rule: body="/worldclient.dll?view=main" && body="mdaemon/worldclient" - name: Subrion-CMS_body rule: body="href=\"http://www.subrion.com" && body="content=\"subrion cms" - name: ZyXEL-NBG6616_body rule: body="
  • nbg6616
  • " - name: Subrion-CMS_header rule: 'header="x-powered-cms: subrion cms"' - name: Smartstore_header rule: header="Smartstore" - name: Combeenation_header rule: header="Combeenation" - name: Ability Server_header rule: header="Ability Server" - name: Canon-MP620-series_body rule: body="nowrap>canon mp620 series" - name: Metabase_icon_hash rule: icon_hash="1953726032" - name: SONY-SNC-WR630_header rule: header="realm=\"snc-wr630" - name: yunmok_header rule: header="yunmok" - name: Sidao-OA_body rule: body="关于:思道OA" && body="思道OA v(.* Powered by (.*" - name: Leagsoft-IT-_body rule: body="action=\"/manager/logincontroller.htm?act=login" - name: PowerCreator CMS_header rule: header="PowerCreator CMS" - name: Avocent-Remote-management_body rule: body="avocent corporation" - name: Payara Server_header rule: header="Payara Server" - name: tulingtech-System_body rule: body="href=\"/content/login-ui/static/h-ui.admin/css/h-ui.login.css\"" - name: HP-ProLiant-ML350_header rule: header="proliant-ml350" - name: URP-综合教务系统_header rule: header="URP-综合教务系统" - name: iWebSNS_body rule: body="/jooyea/images/sns_idea1.jpg" && body="/jooyea/images/snslogo.gif" && body="/jooyea/images/sns_idea1.jpg" && body="/jooyea/images/snslogo.gif" - name: TopSec VPN_header rule: header="TopSec VPN" - name: TP-LINK R460_header rule: header="TP-LINK R460" - name: NSFOCUS SG安全网关_header rule: header="NSFOCUS SG安全网关" - name: Kedacom-Redundant-Arrays-of-Independent-Drives(RAID)_body rule: body="href=\"kstormon.exe" - name: HFS_body rule: body="hfs/\">httpfileserver" && body="
    httpfileserver 2.3g" - name: HFS_header rule: header="hfs_sid_=" && header="HFS_SID_=" && header="Server:FHFS" && header="Server:HFS" - name: SchoolCMS学校管理系统_header rule: header="SchoolCMS学校管理系统" - name: Hsycms(好生意CMS)_body rule: body="Hsycms" && body="好生意CMS" - name: jabberd_header rule: 'header="server: jabberd"' - name: PCPIN-Chat_body rule: body="title=\"powered by pcpin chat" && body="onclick=\"document.loginform.register.value=0; document.loginform.lostpassword.value=0" && body="window.appname_='pcpin_chat'" - name: NETGEAR WNDR4300_header rule: header="NETGEAR WNDR4300" - name: Gravatar_header rule: header="Gravatar" - name: SmartCDS_header rule: header="smartcds version" && header="x-smartcds-error" - name: TP-LINK Wireless WR742N_header rule: header="TP-LINK Wireless WR742N" - name: Apache Roller_header rule: header="Apache Roller" - name: Azure CDN_header rule: header="Azure CDN" - name: YUNEASY EPX3000配置管理系统_header rule: header="YUNEASY EPX3000配置管理系统" - name: D-Link Internet Camera_header rule: header="D-Link Internet Camera" - name: 协众 OA_icon_hash rule: icon_hash="2828293835" - name: HP-J4812A_header rule: header="realm=\"hp j4812a" - name: ANECMS_body rule: body="content=\"erwin aligam - ealigam@gmail.com" && body="content=\"Erwin Aligam - ealigam@gmail.com" - name: rack-cache_header rule: header="X-Rack-Cache" - name: Quanterra-Q330_body rule: body="name=\"pwr\" value=\"turn on baler power" - name: Panasonic-Maintenance-Utility_body rule: body="panasonic_logo.gif" - name: OPMS管理系统_header rule: header="OPMS管理系统" - name: Spring env_body rule: body="servletContextInitParams" && body="logback" - name: Linksys WRVS4400N_header rule: header="Linksys WRVS4400N" - name: Linksys WAP200_header rule: header="Linksys WAP200" - name: HUAWEI-USG6350_header rule: header="huawei usg6350" - name: TP-LINK R490_header rule: header="TP-LINK R490" - name: FreePBX_header rule: header="realm=\"freepbx" && header="freepbx" && header="FreePBX" - name: NSFOCUS NIDS_header rule: header="NSFOCUS NIDS" - name: Mautic (Open Source Marketing Automation)_icon_hash rule: icon_hash="1273982002" - name: WS-server_body rule: body="websocket servers index.html" - name: 网御网络审计系统_header rule: header="网御网络审计系统" - name: McAfee-IntruShield_body rule: body="intrushield" && body="intruvert" - name: 智慧校园管理系统_body rule: body="DC_Login/QYSignUp" - name: Apache-Struts2_body rule: body="struts problem report" && body="there is no action mapped for namespace" && body="no result defined for action and result input" && body="" && body="n1124t-on" - name: CAYIN-SMP_body rule: body="/cgi-bin/wizard_index.cgi" - name: TimeLink_body rule: body="link international corp. all rights reserved" && body="" - name: Zidesoft-E6_body rule: body="src=\"/static/images/login/btn-login.gif\"" - name: VAM-Product_body rule: body="id=\"mymodallabel\">login vam system" && body="powered by virtual airlines manager" && body="src=\"js/vam.js\"" && body="href=\"https://virtualairlinesmanager.net/\">virtual airlines manager" - name: BASrouter_header rule: header="BASrouter" - name: Duracast CMS_header rule: header="Duracast CMS" - name: PCITC-File-Management-System_body rule: body="js/scripts/common/easyui/jquery.easyui.min.js" - name: SafetyVision NVR_header rule: header="SafetyVision NVR" - name: 4images_body rule: body="Powered by 4images" && body="4homepages" && body="powered by 4images" - name: Linksys WAP54GPE_header rule: header="Linksys WAP54GPE" - name: DELL-N3048ET-ON_body rule: body="class=\"login_server_default\">n3048et-on" - name: 4images_header rule: header="4images_" - name: ColdFusion_body rule: body="/cfajax/" - name: ColdFusion_header rule: header="CFTOKEN" - name: VMedia_header rule: header="VMedia" - name: BigBangShop_header rule: header="BigBangShop" - name: Citrix Web PN Server_header rule: header="Citrix Web PN Server" - name: LPSE_header rule: header="/eproc/app" - name: TP-LINK WR720N_header rule: header="TP-LINK WR720N" - name: 莱克斯 Netoray SMB_header rule: header="莱克斯 Netoray SMB" - name: oscshop_header rule: header="oscshop" - name: Company's-product_header rule: header="realm=\"technicolor" - name: HUAWEI-ASG5530_body rule: body="('.huawei_title'.html('asg5530'" - name: YiChao-CRMReporting_body rule: body="href=\"/css/vendors~index.acfeb.css\"" - name: iGaming-CMS_body rule: body="http://www.igamingcms.com/" - name: 精迅CMS_body rule: body="精迅CMS" - name: ABO.CMS_header rule: header="abo.cms" && header="ABO.CMS" - name: SJSWPS-OiWPS_header rule: header="oracle-iplanet-proxy-server" - name: 联想网御VPN_header rule: header="联想网御VPN" - name: Taleo Web Server_header rule: header="Taleo Web Server" - name: NetworkResourcesAuxiliaryPlatform_body rule: body="网络资源综合支撑辅助平台" - name: PageUp-People_body rule: body="powered by pageup people" && body="class=\"pageuplink\" href=\"http://www.pageuppeople.com" - name: AM4SS_body rule: body="Powered by am4ss" && body="am4ss.css" - name: 西安金讯通_header rule: header="西安金讯通" - name: ThinkOX_body rule: body="powered by thinkox" && body="Powered By ThinkOX" && body="thinkox" - name: Canon-iP7200-series_body rule: body="nowrap>canon ip7200 series" - name: TRENDnet-TEW-730APO_body rule: body="login to the tew-730apo" - name: Safe3 IIS防火墙_header rule: header="Safe3 IIS防火墙" - name: Santach-I-Cameras-and-Surveillance_body rule: 'body="visibility: inherit; width: 200px; z-index: 2\">" && body="//切换iframe 函数0-视频、录像;1-参数、日志"' - name: Etano_body rule: body="Powered by
    " && body="swagger-ui.css" && body="swagger-ui.js" - name: yadongsoft-FS3_body rule: body="神盾fs3文档安全共享系统v2.0
    " - name: 国微CMS政府网站系统_县市门户版_body rule: body="国微CMS政府网站系统_县市门户版" - name: Redaxscript_header rule: header="Redaxscript" - name: Linksys FW_header rule: header="Linksys FW" - name: TP-LINK Wireless WDR6510_header rule: header="TP-LINK Wireless WDR6510" - name: Datum-TymServe_body rule: body="

    datum tymserve" && body="

    Datum TymServe" - name: AV-TECH AV787 Video Web Server_header rule: header="AV-TECH AV787 Video Web Server" - name: Barracuda-Backup-Server_header rule: header="backup_local_locale" && header="BACKUP_LOCAL_LOCALE" - name: Dahua-Cameras-and-Surveillance_header rule: 'header="server: dahua drs"' - name: tyxdgroup-Monitor_body rule: body="login.ashx?mode=valid" - name: ValleyCMS_body rule: body="href=\"viewcmscac.do" && body="href=\"/viewcmscac.do" - name: zoomnetcom-WLAN_body rule: body="var url=\"resetwebsvr.php?act=reset\";" && body="中太数据 - 集中无线控制器" - name: MaxSite CMS_header rule: header="MaxSite CMS" - name: Avaya Media Server_header rule: header="Avaya Media Server" - name: Cisco-IOS-XR_header rule: header="cisco ios-xr" - name: Dahua-Cameras-and-Surveillance_body rule: body="id=\"search_card_label\" for=\"search_plateenable\">车牌号码" && body="dahuartsp" && body="var g_isdeviceinited = true" && body="widget/js/jquery.ui.widget.js" && body="title::com_menu.title_setup" && body="css/playbackindex.css" && body="class=\"j_content j_min_width\"" && body="j_sub_con j_loginbox" && body="overflow:hidden;background-color" && body="js/urlparser.js" && body="id=\"lab_loading\" class=\"j_load_p" && body="src=\"/cap.js\"" && body="'nav_margin'.style.visibility = 'visible" && body="web service" && body="/css/oem.css" && body="loginfoot\">web视频监控系统" && body="webapp.ability.getwebcap('showgb28181client'" && body="class=\"ui-tip-container\" id=\"remark_modu\"" && body="class=\"login_inputbox ui-input fn-width163\"" && body="tl(\"huazhonghua\"" && body="var g_isdeviceinited = true" && body="widget/js/jquery.ui.widget.js" && body="title::com_menu.title_setup" && body="css/playbackindex.css" && body="class=\"j_content j_min_width\"" && body="j_sub_con j_loginbox" && body="overflow:hidden;background-color" && body="js/urlparser.js" && body="id=\"lab_loading\" class=\"j_load_p" && body="src=\"/cap.js\"" && body="'nav_margin'.style.visibility = 'visible" && body="web service" && body="/css/oem.css" && body="loginfoot\">web视频监控系统" && body="webapp.ability.getwebcap('showgb28181client'" && body="class=\"ui-tip-container\" id=\"remark_modu\"" && body="class=\"login_inputbox ui-input fn-width163\"" && body="tl(\"huazhonghua\"" - name: HuaWei-Secoway-Firewall_header rule: header="secoway" - name: CodePush-server_body rule: body="content=\"codepush service is hotupdate services" - name: Jira_body rule: body="jira.webresources" && body="com.atlassian.plugins" && body="jira.webresources" && body="ams-build-number" && body="com.atlassian.plugins" && body="content=\"jira" && body="href=\"/secure/AboutPage.jspa\">About JIRA" && body="" - name: Metabase_title rule: title="Metabase" - name: PegaRULES_body rule: body="unable to logon to the pegarules system" && body="href=\"images/pzpegaicon.ico" - name: Intellinet-IP-Camera_body rule: body="copyright © intellinet network solutions" && body="http://www.intellinet-network.com/driver/netcam.exe" && body="Copyright © INTELLINET NETWORK SOLUTIONS" && body="http://www.intellinet-network.com/driver/NetCam.exe" - name: Advanced-Electron-Forum_body rule: body="powered by aef" - name: Yonyou-ERP_body rule: body="login_main_bg" && body="login_owner" - name: faqrobot_body rule: body="content=\"faq客服机器人" && body="南京云问网络技术有限公司" - name: Sogou-Webmaster-Platform_body rule: body="sogou_site_verification" - name: Foswiki_header rule: header="Foswiki" - name: TP-LINK Wireless WR340G_header rule: header="TP-LINK Wireless WR340G" - name: Riskified_header rule: header="Riskified" - name: SONY-BRC-H800_header rule: header="realm=\"brc-h800" - name: Splunk_body rule: body="splunk.util.normalizeboolean" - name: TOTO_LINK-N200RS+_body rule: body="src =\"/images/login_back_n200rs.gif\"" - name: WatchGuard-Firewall_header rule: header="basic realm=\"watchguard" && header="digest realm=\"watchguard" - name: Jobsite CMS_header rule: header="Jobsite CMS" - name: Company's-product_body rule: body="辽宁瑞思科技有限公司    版权所有" - name: JEUS_header rule: header="Jeus WebContainer" - name: Mashery-Proxy_header rule: 'header="server: mashery proxy" && header="x-mashery-"' - name: GeoNode_body rule: body="powered by bpm" - name: javashop_body rule: body="易族智汇javashop" && body="javashop微信公众号" && body="content=\"JavaShop" - name: Daisy_header rule: header="x-daisy-version" - name: IP-CAMERA_body rule: body="classid='clsid:67f77f18-5272-4875-b983-c7e8af5517e4' codebase='/ocxctrlsvac.cab" && body="#max{background:url(svac.png;width:121px;float:right}" && body="clientbin/vimicro.silverlight.video.xap" - name: D-Link (Network)_icon_hash rule: icon_hash="-2031183903" && icon_hash="1081719753" - name: WiseGrid慧敏应用交付网关_icon_hash rule: icon_hash="910523681" - name: 泛微 OA_icon_hash rule: icon_hash="1578525679" && icon_hash="1578525679" - name: Linksys-CIT400_header rule: header="Linksys-CIT400" - name: TP-LINK R480T_header rule: header="TP-LINK R480T" - name: PegaRULES_header rule: header="pega-rules=" - name: TSM_body rule: body="var url = getcontextname( + \"?service=ajaxdirect/1/" - name: Alcatel_Lucent-OS9900_body rule: body="device os9900" - name: DzzOffice-Product_body rule: body="dzz/system/scripts/jquery.jstree.min.js" && body="dzz/scripts/dzz_min.js" && body=" 通过管理员分配的密码使用紧急入口。

    " - name: Play-Framework_header rule: header="play! framework" && header="Play! Framework" - name: EdgePrism_header rule: header="EdgePrism" && header="EdgePrismSSL" - name: CrushFTP_icon_hash rule: icon_hash="-1022206565" - name: Evo-Cam_body rule: body="value=\"evocam.jar" && body="iscom3048g" - name: Venustech-TianQing-Application-Security-Gateway_body rule: body="v2/global/vendor/modernizr/modernizr.js" && body="天清web应用安全网关" - name: MagicInfo Premium Server_header rule: header="MagicInfo Premium Server" - name: JAMIA AL HIND_header rule: header="JAMIA AL HIND" - name: Apache-Solr_body rule: body="SolrCore Initialization Failures" && body="ng-app=\"solrAdminApp\"" - name: Inout web Portal_header rule: header="Inout web Portal" - name: LifeSize-Video-Conferencing_body rule: body="src=\"js/swfobject.js" && body="src=\"js/lsjavascript.js" - name: 1039家校通_header rule: header="1039家校通" - name: D_Link-DSR-150N_body rule: 'body="
    product page: dsr-150n"' - name: 华为_HUAWEI_SRG1220_header rule: header="HUAWEI SRG1220" - name: 快网CDN_header rule: header="快网CDN" - name: 将博CMS(JumboTCMS)_body rule: body="将博CMS" && body="JumboTCMS" - name: ZyXEL VMG1312-B10D_header rule: header="ZyXEL VMG1312-B10D" - name: BITMAIN-antminer_header rule: header="realm=\"antminer" - name: 将博CMS(JumboTCMS)_header rule: header="将博CMS" && header="JumboTCMS" - name: SuperSalon-POS_header rule: header="realm=\"supersalon pos" - name: SimpleHTTP_header rule: header="SimpleHTTP" - name: Gridea_body rule: body="Gridea" - name: 昆石网络 VOS2009_header rule: header="昆石网络 VOS2009" - name: 牛NIUCMS本地O2O系统_header rule: header="牛NIUCMS本地O2O系统" - name: WebCTRL_header rule: header="WebCTRL" - name: H3C-5900-G3_body rule: body="5900-g3" - name: H3C-5900-G3_header rule: header="5900-g3" - name: ShareTech-NU-860H_body rule: body="sharetech information co., ltd" - name: shanshanes-System_body rule: body="杉杉储能监控平台" && body="amap.mousetool,amap.districtsearch" && body="/dist/libs/layui/css/layui.css" - name: Hanwha-SND-7084_body rule: body="var defaultfilename = \"snd-7084\"" - name: UBNT_UniFi系列路由_body rule: body="
    " - name: 同为数码网络摄像头_header rule: header="同为数码网络摄像头" - name: Polymer_header rule: header="Polymer" - name: AutoIndex-PHP-Script_body rule: body="title=\"autoindex default" && body="autoindex.sourceforge.net/" - name: AirLink-modem_header rule: header="modem@airlink.com" - name: NetGear WNHD3004v2_header rule: header="NetGear WNHD3004v2" - name: Linksys BEFSR41C-JP_header rule: header="Linksys BEFSR41C-JP" - name: 用友-UFIDA-NC_body rule: body="nc.sfbase.applet.NCApplet.class" - name: cradlepoint-IBR1150LP6_body rule: body="cplogin.model = \"ibr1150lp6\";" - name: GoCDN_header rule: header="gocdn" - name: SumlyCMS_header rule: header="SumlyCMS" - name: SAMSUNG-Wireless-Enterprise_body rule: body="

    wireless enterprise manager

    " - name: 璐华RuvarHRM_header rule: header="璐华RuvarHRM" - name: Ghost (CMS)_icon_hash rule: icon_hash="-1015932800" && icon_hash="-1231681737" - name: EFM-Networks-ipTIME-N604plus-i_body rule: body="src=\"/images2/login_title.n604pi.gif\"" - name: Tiandy-Cameras-and-Surveillance_body rule: body="name=\"tiandyvideo\" id=\"nvsvideo\"" && body="" && body="refresh\" content=\"0;url=http:" && body="/index.html\"> " - name: ZTE-IAD_body rule: body="/image/banner_I532.jpg" && body="/image/I202.gif" - name: NETGEAR DGN2200M_header rule: header="NETGEAR DGN2200M" - name: phpwind_body rule: body="content=\"phpwind" && body="phpwind" - name: HuaWei-Enterprise-proxy-server_body rule: body="huawei technologies co., ltd." && body="" - name: Linksys WAG120N_header rule: header="Linksys WAG120N" - name: 博华网龙信息安全一体机_title rule: title="博华网龙信息安全一体机" - name: DAVOLINK-Router_header rule: 'header="set-cookie: acookie="' - name: Norton-Cloud-Connect_body rule: 'body="

    norton cloud connect

    "' - name: HOPERUN-HR_body rule: body="src=./static/js/manifest" && body="考核评测系统" - name: NetScaler(Citrix Systems)_body rule: body="NetScaler" && body="Citrix Systems" - name: TOPSEC-VPN_body rule: body="window.location=\"/portal_default/index.html\";" && body="window.location.href=\"/vone/pub/pda.html\";" - name: TOPSEC-VPN_header rule: header="topsecsvportalname=" - name: Apache HBase_header rule: header="Apache HBase" - name: Airform_header rule: header="Airform" - name: phpwms_header rule: header="phpwms" - name: RAISECOM-Router_body rule: body="var lang = document.getelementsbyname(\"sradioindex\"" - name: 耶恩内容管理系统(yeencms)_header rule: header="耶恩内容管理系统" && header="yeencms" - name: 华测监测预警系统_icon_hash rule: icon_hash="3666737803" - name: Hanwha-SRN-4000_body rule: body="$.nvr.model_name=\"srn-4000\"" - name: TweenMax_header rule: header="TweenMax" - name: hphu-System_body rule: body="id='psssdiv'" && body="src='kss_inc/js/jquery.1.3.2.pack.js'" - name: NETGEAR-R6400_body rule: body="netgear r6400" && body="content=\"r6400\"" - name: NETGEAR-R6400_header rule: header="netgear r6400" - name: PHPWEB_body rule: body="pdv_pagename" - name: Novell-Sentinel-Log-Manager_body rule: body="title=\"novell sentinel log manager" && body="content=\"0;url=/novelllogmanager\">" - name: EDIMAX_body rule: body="content=\"Edimax" - name: Orchard CMS_header rule: header="Orchard CMS" - name: HUAWEI MCU_header rule: header="HUAWEI MCU" - name: Ericsson-TV-Web-Server_header rule: 'header="server : ericsson television web server" && header="Ericsson Television Web server"' - name: 列目录_body rule: body="Index of /" && body=" - /" - name: Alcatel_Lucent-7250_header rule: header="realm=\"alcatel-lucent 7250" - name: APC-UPS-Management-Card_body rule: body="class=\"apclogo\"" && body="class=\"apclogo\"" - name: APC-UPS-Management-Card_header rule: header="apc management card" && header="network management card" && header="APC Management Card" - name: FormMail_body rule: body="href=\"http://www.worldwidemart.com/scripts/formmail.shtml" && body="/FormMail.pl" && body="href=\"http://www.worldwidemart.com/scripts/formmail.shtml" - name: IntelligentWarehouseManagementSystem_body rule: body="name=\"toolkitscriptmanager1_hiddenfield\"" && body="class=\"headernav\"" && body="event.srcelement.type!='reset" - name: phpBB_header rule: 'header="set-cookie: phpbb3_" && header="httponly, phpbb3_"' - name: MacroSAN_header rule: header="MacroSAN" - name: ZTE (Network)_icon_hash rule: icon_hash="1427976651" - name: 南方数据_body rule: body="/SouthidcKeFu.js" && body="CONTENT=\"Copyright 2003-2015 - Southidc.net" && body="/Southidcj2f.Js" - name: 5k-CRM_body rule: body="/public/js/5kcrm.js" - name: Scholica_header rule: header="Scholica" - name: WEBrick_header rule: header="webrick" - name: QuiXplorer_body rule: body="href=\"http://quixplorer.sourceforge.net\" target=" && body="target=\"_blank\">the quix project" - name: DD WRT (DD-WRT milli_httpd)_icon_hash rule: icon_hash="252728887" - name: TP-LINK MR13U_header rule: header="TP-LINK MR13U" - name: QuiXplorer_header rule: header="QuiXplorer" - name: mariadb_header rule: header="mariadb" - name: CushyCMS_body rule: body="Powered by CushyCMS" - name: hanweb_body rule: 'body="Use the correct document accordingly" && body="BORDER-RIGHT: #e6e6e6"' - name: ashnews_body rule: body="ashnews" - name: Huawei (Network)_icon_hash rule: icon_hash="-884776764" && icon_hash="987967490" - name: LoudBlog_header rule: header="LoudBlog" - name: moxa VPort 36-1MP IP Camera_header rule: header="moxa VPort 36-1MP IP Camera" - name: NUUO 摄像头_title rule: title="Network Video Recorder Login" - name: 客客出品专业威客系统KPPW_header rule: header="客客出品专业威客系统KPPW" - name: Ruijie-NBR-Router_body rule: body="ruijie - nbr" && body="support.ruijie.com.cn" && body="

    系统负荷过高,导致网络拥塞,建议降低系统负荷或重启路由器" && body="class=\"line resource\" id=\"nbr_1\"" - name: Runpu-Embedded-telephone-recording-system_body rule: body="润普嵌入式网络电话录音系统" - name: LG-HU80KA-KR_body rule: body="hu80ka-kr" - name: 禾翔 UTM_header rule: header="禾翔 UTM" - name: GNU Gatekeeper_header rule: header="GNU Gatekeeper" - name: 鑫考网上阅卷系统_header rule: header="鑫考网上阅卷系统" - name: Mercury-Router_header rule: header="mw4530r" && header="mac1200r" - name: D-Link-DIR_600_body rule: body="

    dir-600" && body="var mmc = {" && body="dlink-dir600" - name: NETGEAR wnr2000v4_header rule: header="NETGEAR wnr2000v4" - name: Cdn Cache_header rule: header="Cdn Cache" - name: SJSWPS_ OiWPS_header rule: header="Sun-Java-System-Web-Proxy-Server" && header="Oracle-iPlanet-Proxy-Server" - name: ContentBox_header rule: header="ContentBox" - name: ASUS-R7000_body rule: body="
    r7000" - name: SEnginx_header rule: header="SEnginx" - name: Blesta_header rule: header="Blesta" - name: Crow-Force-portal-CMS_body rule: body="中企动力提供技术支持" - name: DELL-PCT7024_body rule: body="class=\"login_server_default\">pct7024" - name: DELL-PCT7048_body rule: body="class=\"login_server_default\">pct7048" - name: haohan_body rule: body="D27CDB6E-AE6D-11cf-96B8-444553540000" - name: dreambox_header rule: header="dreambox" - name: OSS_body rule: body="src=\"/uf/login/login.jsp\" >" - name: XuanNiao-Traffic-management-platform_body rule: body="玄鸟流量管理平台" - name: Semaphore_body rule: body="www.smartlogic.com" && body="alt=\"powered by semaphore\"" - name: Leadsec-SOC_body rule: body="/leadsec-soc" && body="action=\"/leadsec-soc/signin" - name: pagespeed_header rule: header="X-Page-Speed" && header="X-Mod-Pagespeed" - name: 佰仕佳CMS_body rule: body="佰仕佳CMS" - name: Serv-U ftpd_header rule: header="Serv-U ftpd" - name: 耶恩内容管理系统(yeencms)_body rule: body="耶恩内容管理系统" && body="yeencms" - name: ZyXEL-EMG2306-R10A_body rule: body="class=\"modelname\">emg2306-r10a" - name: Maipu--ISG1000-Security-gateway_body rule: body="/php/common/checknum_creat.php?module=config_authnum" - name: JUCI_body rule: body="src=\"/js/50-juci-event.js\"" - name: LG-OLED55E8PLA_body rule: body="oled55e8pla" - name: Wordpress Under Construction Icon_icon_hash rule: icon_hash="191654058" - name: Slingbox_header rule: header="Slingbox" - name: 深圳竹云统一认证_header rule: header="深圳竹云统一认证" - name: ShopNC_body rule: body="powered by shopnc" && body="copyright 2007-2014 shopnc inc" && body="content=\"shopnc" - name: Mynetcap_header rule: header="Mynetcap" - name: EFM-Networks-ipTIME-N604V_body rule: body="src =\"/images2/login_title.n604v.gif\"" && body="src=\"/images2/login_title.n604vlg.gif\"" - name: Sablog-X_header rule: header="Sablog-X" - name: Runpu-Embedded-telephone-recording-system_header rule: 'header="/login.lgi?orgurl=/" && header="set-cookie: orgurl=/"' - name: TP-LINK TD-8840T_header rule: header="TP-LINK TD-8840T" - name: layerbb_header rule: header="layerbb" - name: NETGEAR D6400_header rule: header="NETGEAR D6400" - name: WHOLETON-Employee-Internet-Management_body rule: body="updateloginpswd.php" && body="passroedele" && body="下一代防火墙" && body="classid=\"clsid:81be1f16-9d88-48cc-8d3e-cb8e37b71fee" - name: 纵横通 监控系统_header rule: header="纵横通 监控系统" - name: 慧点科技 OA 协同办公系统_body rule: body="/dojo/smartdot/css/dojo_smartdot.css" - name: WP Rocket_header rule: header="WP Rocket" - name: DELL-PCM6220_body rule: body="class=\"login_server_default\">pcm6220" - name: 魅课OM视频会议系统_title rule: title="OMeeting视频会议" && title="OM视频会议" && title="OM免费网络视频会议系统" - name: VigLink_header rule: header="VigLink" - name: SpiderControl iniNet_header rule: header="SpiderControl iniNet" - name: TP-LINK R860_header rule: header="TP-LINK R860" - name: Seafile_icon_hash rule: icon_hash="-12700016" - name: Seafile_body rule: body=""' - name: Nagios XI_body rule: body="Nagios XI" && body="nagiosxi" && body="Nagios" - name: TP-LINK MR6400_header rule: header="TP-LINK MR6400" - name: 360-SecFox_body rule: 'body="id=mtokenplugin width=0 height=0 style=\"position: absolute;left: 0px; top: 0px\"" && body="type=application/x-xtx-axhost" && body="document.getelementbyid(''pic''.src" && body="class=\"secfox-login-browser-continue\"" && body="

    欢迎您使用网神secfox日志收集与分析系统"' - name: HUAWEI-Wireless-LAN_body rule: body="cloud access point" && body="access controller" - name: jobberBase_body rule: body="http://www.jobberbase.com" && body="Jobber.PerformSearch" && body="content=\"Jobberbase" - name: 上海领健信息 e看牙消息平台_header rule: header="上海领健信息 e看牙消息平台" - name: 地平线CMS_body rule: body="labelOppInforStyle" && body="frmsearch" - name: ADVA-FSP_body rule: body="var gtitle = 'adva fsp " - name: Apache-Oozie-Web-Console_body rule: body="oozie-console" && body="href=\"/oozie\">oozie console" - name: Tenda-CH22_body rule: body="var sys_target = \"ch22\"" - name: TOTO_LINK-N500R_body rule: body="src =\"/images/login_back_n500r.gif\"" - name: mblog_header rule: header="mblog" - name: uyan_body rule: body="uyan.cc/code/uyan.js" - name: busybox_header rule: header="busybox" - name: Raritan-Company's-product_body rule: body="" && body="

    "' - name: Gigaset-VOIP_body rule: body="onclick=\"javascript:open_gigaset_help_window" && body="gigaset communications" - name: 深信服ssl-vpn_body rule: body="login_psw.csp" - name: AZADMIN CMS_header rule: header="AZADMIN CMS" - name: CMScout_body rule: body="Powered by CMScout" - name: PB-CMS_body rule: body="Powered by s5100" - name: Moment Timezone_header rule: header="Moment Timezone" - name: PxPlus-WebServer_header rule: header="PxPlus-WebServer" - name: Citrix ADC_header rule: header="Citrix ADC" - name: ZCMS_body rule: body="_zcms_shownewmessage" && body="zcms_skin" && body="app=zcms" && body="_ZCMS_ShowNewMessage" && body="zcms_skin" - name: gocdn_header rule: header="GOCDN" - name: wemall商城_header rule: header="wemall商城" - name: Alienvault_icon_hash rule: icon_hash="-1779611449" - name: ZEBRA-TLP-2824-Plus_body rule: body="ztc tlp 2824 plus" - name: LG-55UM7800BNA_body rule: body="55um7800bna" - name: BroadWin-WebAccess_body rule: 'body="" && body=""' - name: WatchGuard_icon_hash rule: icon_hash="15831193" - name: ADVANTECH-WISE-3610_body rule: body="/advantech/advantech/css/main.css" - name: eTicket_body rule: body="powered by eticket" && body="" && body="/eticket/eticket.css" && body="Powered by eTicket" && body="" && body="/eticket/eticket.css" - name: SnomPhone_body rule: body="snom ag
    " && body="" - name: nitc企业模版免费下载_body rule: body="NITC Web Marketing Service" && body="/images/nitc1.png" - name: NetPresenz_header rule: 'header="server: netpresenz"' - name: ZKAccess 门禁管理系统_body rule: body="/logoZKAccess_zh-cn.jpg" - name: wuzhicms(五指cms网站管理系统)_body rule: body="wuzhicms" && body="Powered by wuzhicms" && body="content=\"wuzhicms" - name: Apache Spark_header rule: header="Apache Spark" - name: wuzhicms(五指cms网站管理系统)_header rule: header="wuzhicms" - name: CETHIK-Reader-Configuration-System_body rule: body="if (suser == \"admin\" && spass == \"cetc52\" {" && body="rfid/content/superuser" - name: EFM-Networks-ipTIME-A2004_body rule: body="src=\"/images2/login_title.a2004.gif\"" - name: SONY-Video-Network-Station_body rule: body="sony snt-v304 video network station" - name: GridSite_body rule: body="gridsite" && body="gridsite-admin.cgi?cmd" && body="GridSite" && body="gridsite-admin.cgi?cmd" - name: 翼起飞YunGou_CMS_header rule: header="翼起飞YunGou_CMS" - name: 亿邮_header rule: header="eYouWS" && header="EMPHPSID" - name: SATO-Network-Printing_body rule: body="welcome to sato network printing" - name: Project-Management-System_body rule: body="var right = regexp.rightcontext" && body="window.top.location = \"login.aspx?url=\" + right\"" - name: Tumblr_body rule: body=""], "case-insensitive": true}]}], "_source_file": "00_unknown\\vehiclemonitoringcloudplatform.yaml"}, {"id": "veritas-netbackup", "info": {"name": "veritas-netbackup", "author": "cn-kali-team", "tags": "detect,tech,veritas-netbackup", "severity": "info", "metadata": {"product": "veritas-netbackup", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"/opscenter/features/common/images/favicon.ico\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\veritas-netbackup.yaml"}, {"id": "vertiv-system", "info": {"name": "vertiv-system", "author": "cn-kali-team", "tags": "detect,tech,vertiv-system", "severity": "info", "metadata": {"product": "vertiv-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["var port = \"9528"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vertiv-system.yaml"}, {"id": "vertx", "info": {"name": "vertx", "author": "cn-kali-team", "tags": "detect,tech,vertx", "severity": "info", "metadata": {"product": "vertx", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["set-cookie: vertx-web.session"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\vertx.yaml"}, {"id": "vhsoft-vhplot", "info": {"name": "vhsoft-vhplot", "author": "cn-kali-team", "tags": "detect,tech,vhsoft-vhplot", "severity": "info", "metadata": {"product": "vhsoft-vhplot", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/vhplot/webresource.axd"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vhsoft-vhplot.yaml"}, {"id": "victorysoft-performance-management-system", "info": {"name": "victorysoft-performance-management-system", "author": "cn-kali-team", "tags": "detect,tech,victorysoft-performance-management-system", "severity": "info", "metadata": {"product": "victorysoft-performance-management-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["casui/themes/siam/login.css", "class=\"row fl-controls-left"], "case-insensitive": true}]}], "_source_file": "00_unknown\\victorysoft-performance-management-system.yaml"}, {"id": "victorysoft", "info": {"name": "victorysoft", "author": "cn-kali-team", "tags": "detect,tech,victorysoft", "severity": "info", "metadata": {"product": "victorysoft", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"webstyles/webstyle1/style1/css.css\"", "value=\"style2012/style1/scripts/expressinstall.swf\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\victorysoft.yaml"}, {"id": "videosoon", "info": {"name": "videosoon", "author": "cn-kali-team", "tags": "detect,tech,videosoon", "severity": "info", "metadata": {"product": "videosoon", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"skin/anysoondefault/anystyles.css", "power by linksoon - videosoon"], "case-insensitive": true}]}], "_source_file": "00_unknown\\videosoon.yaml"}, {"id": "videosurveillancemanagementplatform", "info": {"name": "videosurveillancemanagementplatform", "author": "cn-kali-team", "tags": "detect,tech,videosurveillancemanagementplatform", "severity": "info", "metadata": {"product": "videosurveillancemanagementplatform", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" 平台采用最新图像化展现技术"], "case-insensitive": true}]}], "_source_file": "00_unknown\\videosurveillancemanagementplatform.yaml"}, {"id": "viewgood-streammedia", "info": {"name": "viewgood-streammedia", "author": "cn-kali-team", "tags": "detect,tech,viewgood-streammedia", "severity": "info", "metadata": {"product": "viewgood-streammedia", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location.href", "var webvirtualdiretory = 'viewgood';"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["fgetquery", "src='/viewgood/pc/", "viewgood"], "case-insensitive": true}]}], "_source_file": "00_unknown\\viewgood-streammedia.yaml"}, {"id": "violation-outreach-monitoring-system", "info": {"name": "violation-outreach-monitoring-system", "author": "cn-kali-team", "tags": "detect,tech,violation-outreach-monitoring-system", "severity": "info", "metadata": {"product": "violation-outreach-monitoring-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "window.location='login.action';", "欢迎登录违规外联平台"], "case-insensitive": true}]}], "_source_file": "00_unknown\\violation-outreach-monitoring-system.yaml"}, {"id": "virtualmin", "info": {"name": "virtualmin", "author": "cn-kali-team", "tags": "detect,tech,virtualmin", "severity": "info", "metadata": {"product": "virtualmin", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    forgot your virtualmin password?
    "], "case-insensitive": true}]}], "_source_file": "00_unknown\\virtualmin.yaml"}, {"id": "visualware-myconnection-server", "info": {"name": "visualware-myconnection-server", "author": "cn-kali-team", "tags": "detect,tech,visualware-myconnection-server", "severity": "info", "metadata": {"product": "visualware-myconnection-server", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [""], "case-insensitive": true}]}], "_source_file": "00_unknown\\visualware-myconnection-server.yaml"}, {"id": "vmedia-multimedia-publishing-platform", "info": {"name": "vmedia-multimedia-publishing-platform", "author": "cn-kali-team", "tags": "detect,tech,vmedia-multimedia-publishing-platform", "severity": "info", "metadata": {"product": "vmedia-multimedia-publishing-platform", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"video_00\"", "function toggle(targetid)"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmedia-multimedia-publishing-platform.yaml"}, {"id": "vmware-aria-operations-for-logs", "info": {"name": "vmware-aria-operations-for-logs", "author": "cn-kali-team", "tags": "detect,tech,vmware-aria-operations-for-logs", "severity": "info", "metadata": {"product": "vmware-aria-operations-for-logs", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["vrealize log insight -"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmware-aria-operations-for-logs.yaml"}, {"id": "vmware-esx", "info": {"name": "vmware-esx", "author": "cn-kali-team", "tags": "detect,tech,vmware-esx", "severity": "info", "metadata": {"product": "vmware-esx", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<meta http-equiv=\"refresh\" content=\"0;url='/ui'\"/>", "content=\"vmware esx ", "content=\"vmware esxi", "document.write(\"<title>\" + id_eesx_welcome + \"\");", "document.write(id_esx_viclientdesc);"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmware-esx.yaml"}, {"id": "vmware-server-2", "info": {"name": "vmware-server-2", "author": "cn-kali-team", "tags": "detect,tech,vmware-server-2", "severity": "info", "metadata": {"product": "vmware-server-2", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"vmware server is virtual"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmware-server-2.yaml"}, {"id": "vmware-site-recovery-manager", "info": {"name": "vmware-site-recovery-manager", "author": "cn-kali-team", "tags": "detect,tech,vmware-site-recovery-manager", "severity": "info", "metadata": {"product": "vmware-site-recovery-manager", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    vsphere web client"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmware-vsphere-web-client.yaml"}, {"id": "vmware-vsphere", "info": {"name": "vmware-vsphere", "author": "cn-kali-team", "tags": "detect,tech,vmware-vsphere", "severity": "info", "metadata": {"product": "vmware-vsphere", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["vmware view portal"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vmwareview.yaml"}, {"id": "vnc-enterprise", "info": {"name": "vnc-enterprise-", "author": "cn-kali-team", "tags": "detect,tech,vnc-enterprise-", "severity": "info", "metadata": {"product": "vnc-enterprise-", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: vnc server enterprise edition"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\vnc-enterprise-.yaml"}, {"id": "vnc", "info": {"name": "vnc", "author": "cn-kali-team", "tags": "detect,tech,vnc", "severity": "info", "metadata": {"product": "vnc", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["微信数字投票", "content=\"微平台投票管理系统"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["content=\"微平台投票系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\votemanager.yaml"}, {"id": "vp-asp", "info": {"name": "vp-asp", "author": "cn-kali-team", "tags": "detect,tech,vp-asp", "severity": "info", "metadata": {"product": "vp-asp", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "shopdisplayproducts.asp?id=", "src=\"vs350.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vp-asp.yaml"}, {"id": "vpn358system", "info": {"name": "vpn358system", "author": "cn-kali-team", "tags": "detect,tech,vpn358system", "severity": "info", "metadata": {"product": "vpn358system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"form-actions j_add_ip_actions\"", "href=\"/lib/bootstrap/ico/favicon.ico\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\vpn358system.yaml"}, {"id": "vrv-desktop-application-system", "info": {"name": "vrv-desktop-application-system", "author": "cn-kali-team", "tags": "detect,tech,vrv-desktop-application-system", "severity": "info", "metadata": {"product": "vrv-desktop-application-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["vrv", "var vver = $('#hidverify').val();"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vrv-desktop-application-system.yaml"}, {"id": "vrv-im", "info": {"name": "vrv-im", "author": "cn-kali-team", "tags": "detect,tech,vrv-im", "severity": "info", "metadata": {"product": "vrv-im", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["

    连豆豆pc客户端

    ", "class=\"loginusername\" value=\"\" placeholder=\"连豆豆账号/邮箱/手机号", "class=\"wj-text wj-title\">下载信源豆豆

    ", "href=\"http://im.vrv.cn/server-securitycenter/password/goretrieval.vrv"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vrv-im.yaml"}, {"id": "vrv-nac", "info": {"name": "vrv-nac", "author": "cn-kali-team", "tags": "detect,tech,vrv-nac", "severity": "info", "metadata": {"product": "vrv-nac", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["localstorage.setitem('doctitle','北信源网络接入控制系统')", "欢迎登录北信源网络接入控制系统"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["id=\"modal_delay\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\vrv-nac.yaml"}, {"id": "vts-cms", "info": {"name": "vts-cms", "author": "cn-kali-team", "tags": "detect,tech,vts-cms", "severity": "info", "metadata": {"product": "vts-cms", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["errmag"], "case-insensitive": true}]}], "_source_file": "00_unknown\\vts-cms.yaml"}, {"id": "w3-total-cache", "info": {"name": "w3-total-cache", "author": "cn-kali-team", "tags": "detect,tech,w3-total-cache", "severity": "info", "metadata": {"product": "w3-total-cache", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "http://websidestory.com", "websidestory code", "websidestory,inc. all rights reserved. u.s.patent no. 6,393,479b1"], "case-insensitive": true}]}], "_source_file": "00_unknown\\websidestory.yaml"}, {"id": "websocket", "info": {"name": "websocket", "author": "cn-kali-team", "tags": "detect,tech,websocket", "severity": "info", "metadata": {"product": "websocket", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["websockets request was expected", "not a websocket handshake", "ws://", "wss://"], "case-insensitive": true}]}], "_source_file": "00_unknown\\websocket.yaml"}, {"id": "webtrust-cert", "info": {"name": "webtrust-cert", "author": "cn-kali-team", "tags": "detect,tech,webtrust-cert", "severity": "info", "metadata": {"product": "webtrust-cert", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["https://cert.webtrust.org/viewseal"], "case-insensitive": true}]}], "_source_file": "00_unknown\\webtrust-cert.yaml"}, {"id": "webuploader", "info": {"name": "webuploader", "author": "cn-kali-team", "tags": "detect,tech,webuploader", "severity": "info", "metadata": {"product": "webuploader", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/webuploader.css\" rel=\"stylesheet", "/webuploader.js\">", "/webuploader.min.js\">"], "case-insensitive": true}]}], "_source_file": "00_unknown\\webuploader.yaml"}, {"id": "weisha-learningsystem", "info": {"name": "weisha-learningsystem", "author": "cn-kali-team", "tags": "detect,tech,weisha-learningsystem", "severity": "info", "metadata": {"product": "weisha-learningsystem", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/utility/corescripts/widget.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\weisha-learningsystem.yaml"}, {"id": "wellcare-health-management-system", "info": {"name": "wellcare-health-management-system", "author": "cn-kali-team", "tags": "detect,tech,wellcare-health-management-system", "severity": "info", "metadata": {"product": "wellcare-health-management-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"/web/vfyphrmedical\">健康档案
    ", "www.wellcare.cn"], "case-insensitive": true}]}], "_source_file": "00_unknown\\wellcare-health-management-system.yaml"}, {"id": "weonlydo-product", "info": {"name": "weonlydo-product", "author": "cn-kali-team", "tags": "detect,tech,weonlydo-product", "severity": "info", "metadata": {"product": "weonlydo-product", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: weonlydo"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\weonlydo-product.yaml"}, {"id": "werkzeug", "info": {"name": "werkzeug", "author": "cn-kali-team", "tags": "detect,tech,werkzeug", "severity": "info", "metadata": {"product": "werkzeug", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: werkzeug"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\werkzeug.yaml"}, {"id": "westell-secure", "info": {"name": "westell-secure", "author": "cn-kali-team", "tags": "detect,tech,westell-secure", "severity": "info", "metadata": {"product": "westell-secure", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: wstl cpe"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\westell-secure.yaml"}, {"id": "whatweb", "info": {"name": "whatweb", "author": "cn-kali-team", "tags": "detect,tech,whatweb", "severity": "info", "metadata": {"product": "whatweb", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    ", "network card access password: "], "case-insensitive": true}]}], "_source_file": "00_unknown\\whatweb.yaml"}, {"id": "whfst-cms", "info": {"name": "whfst-cms", "author": "cn-kali-team", "tags": "detect,tech,whfst-cms", "severity": "info", "metadata": {"product": "whfst-cms", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["武汉富思特"], "case-insensitive": true}]}], "_source_file": "00_unknown\\whfst-cms.yaml"}, {"id": "whir-ezoffice", "info": {"name": "whir-ezoffice", "author": "cn-kali-team", "tags": "detect,tech,whir-ezoffice", "severity": "info", "metadata": {"product": "whir-ezoffice", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/defaultroot/js/cookie.js", "ezofficeusername", "whirrootpath"], "case-insensitive": true}]}], "_source_file": "00_unknown\\whir-ezoffice.yaml"}, {"id": "whir-flexoffice", "info": {"name": "whir-flexoffice", "author": "cn-kali-team", "tags": "detect,tech,whir-flexoffice", "severity": "info", "metadata": {"product": "whir-flexoffice", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["var flexofficepath=\"\\/flexoffice\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\whir-flexoffice.yaml"}, {"id": "whir", "info": {"name": "whir", "author": "cn-kali-team", "tags": "detect,tech,whir", "severity": "info", "metadata": {"product": "whir", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["css/css_whir.css"], "case-insensitive": true}]}], "_source_file": "00_unknown\\whir.yaml"}, {"id": "whmcs", "info": {"name": "whmcs", "author": "cn-kali-team", "tags": "detect,tech,whmcs", "severity": "info", "metadata": {"product": "whmcs", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    please login or register
    ", "powered by wifi安全终端设备管理"], "case-insensitive": true}]}], "_source_file": "00_unknown\\wifi安全终端设备管理.yaml"}, {"id": "wildfly-server", "info": {"name": "wildfly-server", "author": "cn-kali-team", "tags": "detect,tech,wildfly-server", "severity": "info", "metadata": {"product": "wildfly-server", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["wildfly project"], "case-insensitive": true}]}], "_source_file": "00_unknown\\wildfly-server.yaml"}, {"id": "willfar-interface-management-tool", "info": {"name": "willfar-interface-management-tool", "author": "cn-kali-team", "tags": "detect,tech,willfar-interface-management-tool", "severity": "info", "metadata": {"product": "willfar-interface-management-tool", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["alt=\"接口应用管理工具\"", "the wasion software foundation"], "case-insensitive": true}]}], "_source_file": "00_unknown\\willfar-interface-management-tool.yaml"}, {"id": "windows-business-server", "info": {"name": "windows-business-server", "author": "cn-kali-team", "tags": "detect,tech,windows-business-server", "severity": "info", "metadata": {"product": "windows-business-server", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"/remote\">remote web workplace", "src=\"images/sbslogo.gif"], "case-insensitive": true}]}], "_source_file": "00_unknown\\windows-business-server.yaml"}, {"id": "windriver", "info": {"name": "windriver", "author": "cn-kali-team", "tags": "detect,tech,windriver", "severity": "info", "metadata": {"product": "windriver", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: windriver-webserver"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\windriver.yaml"}, {"id": "wing-ftp-server", "info": {"name": "wing-ftp-server", "author": "cn-kali-team", "tags": "detect,tech,wing-ftp-server", "severity": "info", "metadata": {"product": "wing-ftp-server", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: wing ftp server"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\wing-ftp-server.yaml"}, {"id": "winiis-isp-access-resource-management-system", "info": {"name": "winiis-isp-access-resource-management-system", "author": "cn-kali-team", "tags": "detect,tech,winiis-isp-access-resource-management-system", "severity": "info", "metadata": {"product": "winiis-isp-access-resource-management-system", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["winisp.gif"], "case-insensitive": true}]}], "_source_file": "00_unknown\\winiis-isp-access-resource-management-system.yaml"}, {"id": "winmail-server", "info": {"name": "winmail-server", "author": "cn-kali-team", "tags": "detect,tech,winmail-server", "severity": "info", "metadata": {"product": "winmail-server", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["encryptpwd", "sessid"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["f_theme", "pwdplaceholder"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["(build ", "background=\"customer/winmail_bg11.jpg"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["amax information technologies inc.", "pop3,smtp server: ", "src=\"customer/index_winmail_new.gif", "src=\"themes/default/images/mail_pic.jpg", "winmail mail server"], "case-insensitive": true}]}], "_source_file": "00_unknown\\winmail-server.yaml"}, {"id": "winwebmail", "info": {"name": "winwebmail", "author": "cn-kali-team", "tags": "detect,tech,winwebmail", "severity": "info", "metadata": {"product": "winwebmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "href=\"images\\hwem.css\"", "images/owin.css", "type=\"hidden\" name=\"secex\"", "winwebmail server"], "case-insensitive": true}]}], "_source_file": "00_unknown\\winwebmail.yaml"}, {"id": "wireless-access-point-controller", "info": {"name": "wireless-access-point-controller", "author": "cn-kali-team", "tags": "detect,tech,wireless-access-point-controller", "severity": "info", "metadata": {"product": "wireless-access-point-controller", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "北京中科网威"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\中科网威-防火墙.yaml"}, {"id": "zhong-tengoa", "info": {"name": "中腾oa", "author": "cn-kali-team", "tags": "detect,tech,中腾oa", "severity": "info", "metadata": {"product": "中腾oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["login", "systemaction", "zt_webframe"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\中腾oa.yaml"}, {"id": "zhong-yuan-qi-liniaudit-bao-lei-ji", "info": {"name": "中远麒麟iaudit堡垒机", "author": "cn-kali-team", "tags": "detect,tech,中远麒麟iaudit堡垒机", "severity": "info", "metadata": {"product": "中远麒麟iaudit堡垒机", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["(atype==\"fingersecauth\"||atype==\"localfingersecauth\")", "www.tosec.com.cn/doc"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\中远麒麟iaudit堡垒机.yaml"}, {"id": "zhong-tie-xin-an-ke-bo-an-quan-ge-li-yu-xin-xi-dan-xiang-dao-ru-xi-tong", "info": {"name": "中铁信安-科博安全隔离与信息单向导入系统", "author": "cn-kali-team", "tags": "detect,tech,中铁信安-科博安全隔离与信息单向导入系统", "severity": "info", "metadata": {"product": "中铁信安-科博安全隔离与信息单向导入系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["科博安全隔离与信息交换系统", "科博安全隔离与信息单向导入系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\中铁信安-科博安全隔离与信息单向导入系统.yaml"}, {"id": "feng-yuan-xin-ke-ji-fang-huo-qiang", "info": {"name": "丰源芯科技-防火墙", "author": "cn-kali-team", "tags": "detect,tech,丰源芯科技-防火墙", "severity": "info", "metadata": {"product": "丰源芯科技-防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" technology, inc.", "深圳市丰源芯科技产业控股有限公司"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\丰源芯科技-防火墙.yaml"}, {"id": "jiu-si-xie-tong-ban-gong-xi-tong", "info": {"name": "九思协同办公系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "九思协同办公系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /jsoa/login.jsp"], "part": "header", "case-insensitive": true}, {"type": "favicon", "hash": ["fc171c32d6d99f006b1ade860753a9db"]}, {"type": "word", "words": ["location.href=\"/jsoa/login.jsp\";"], "case-insensitive": true}]}], "_source_file": "00_unknown\\九思协同办公系统.yaml"}, {"id": "qian-xing-oa-qi-ye-zhi-neng-ban-gong-zi-dong-hua-xi-tong", "info": {"name": "乾星-oa企业智能办公自动化系统", "author": "cn-kali-team", "tags": "detect,tech,乾星-oa企业智能办公自动化系统", "severity": "info", "metadata": {"product": "乾星-oa企业智能办公自动化系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["input name=\"s1\" type=image"], "case-insensitive": true}]}], "_source_file": "00_unknown\\乾星-oa企业智能办公自动化系统.yaml"}, {"id": "yun-shi-kong-she-hui-hua-shang-ye-erp-xi-tong", "info": {"name": "云时空社会化商业erp系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "云时空社会化商业erp系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["set-cookie: emscm.session.id"], "part": "header", "case-insensitive": true}, {"type": "word", "words": [" 云时空社会化商业erp系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\云时空社会化商业erp系统.yaml"}, {"id": "yun-shen-hu-lian-hong-xin-an-quan-guan-kong-ping-tai", "info": {"name": "云深互联-红芯安全管控平台", "author": "cn-kali-team", "tags": "detect,tech,云深互联-红芯安全管控平台", "severity": "info", "metadata": {"product": "云深互联-红芯安全管控平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["红芯安全管控平台"], "case-insensitive": true}]}], "_source_file": "00_unknown\\云深互联-红芯安全管控平台.yaml"}, {"id": "ya-dong-ke-ji-shen-dunfs3-wen-dang-an-quan-gong-xiang", "info": {"name": "亚东科技-神盾fs3文档安全共享", "author": "cn-kali-team", "tags": "detect,tech,亚东科技-神盾fs3文档安全共享", "severity": "info", "metadata": {"product": "亚东科技-神盾fs3文档安全共享", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["神盾fs3文档安全共享系统v2.0", "神盾fs3文档安全共享系统v2.0"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\亚东科技-神盾fs3文档安全共享.yaml"}, {"id": "yi-sai-tong--dian-zi-wen-dang-an-quan-guan-li-xi-tong", "info": {"name": "亿赛通-电子文档安全管理系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "亿赛通-电子文档安全管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cdgserver3"], "case-insensitive": true}]}], "_source_file": "00_unknown\\亿赛通-电子文档安全管理系统.yaml"}, {"id": "ren-zi-xing-net110-wang-luo-an-quan-shen-ji-xi-tong", "info": {"name": "任子行-net110网络安全审计系统", "author": "cn-kali-team", "tags": "detect,tech,任子行-net110网络安全审计系统", "severity": "info", "metadata": {"product": "任子行-net110网络安全审计系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["net110网络安全审计系统", "simplemodal.1.4.1.min.js"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\任子行-net110网络安全审计系统.yaml"}, {"id": "ren-zi-xing-ssl-vpn", "info": {"name": "任子行-ssl-vpn", "author": "cn-kali-team", "tags": "detect,tech,任子行-ssl-vpn", "severity": "info", "metadata": {"product": "任子行-ssl-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["src=\"/javascript/validation/sslvpnlogin.js", "surfilter"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\任子行-ssl-vpn.yaml"}, {"id": "ren-zi-xing-surfnx-an-quan-wang-guan", "info": {"name": "任子行-surfnx安全网关", "author": "cn-kali-team", "tags": "detect,tech,任子行-surfnx安全网关", "severity": "info", "metadata": {"product": "任子行-surfnx安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["lib/templates/surfilter/images/logo_big.png", "安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\任子行-surfnx安全网关.yaml"}, {"id": "ren-zi-xing-xia-yi-dai-fang-huo-qiang", "info": {"name": "任子行-下一代防火墙", "author": "cn-kali-team", "tags": "detect,tech,任子行-下一代防火墙", "severity": "info", "metadata": {"product": "任子行-下一代防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["任子行下一代防火墙"], "case-insensitive": true}]}], "_source_file": "00_unknown\\任子行-下一代防火墙.yaml"}, {"id": "ren-wo-xingcrm", "info": {"name": "任我行crm", "author": "cn-kali-team", "tags": "detect,tech,任我行crm", "severity": "info", "metadata": {"product": "任我行crm", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["crm_lastloginuserkey"], "case-insensitive": true}]}], "_source_file": "00_unknown\\任我行crm.yaml"}, {"id": "ren-wo-xing-dian-shang", "info": {"name": "任我行电商", "author": "cn-kali-team", "tags": "detect,tech,任我行电商", "severity": "info", "metadata": {"product": "任我行电商", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"366ec"], "case-insensitive": true}]}], "_source_file": "00_unknown\\任我行电商.yaml"}, {"id": "qi-wang-zhi-zao-erp-xi-tong", "info": {"name": "企望制造erp系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "企望制造erp系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/javascript/js/witfunctions.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\企望制造erp系统.yaml"}, {"id": "you-shi-kang-wang-guan", "info": {"name": "优仕康-网关", "author": "cn-kali-team", "tags": "detect,tech,优仕康-网关", "severity": "info", "metadata": {"product": "优仕康-网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"ipxweb/login.html"], "case-insensitive": true}]}], "_source_file": "00_unknown\\优仕康-网关.yaml"}, {"id": "you-you-mailgard-webmail", "info": {"name": "佑友-mailgard-webmail", "author": "cn-kali-team", "tags": "detect,tech,佑友-mailgard-webmail", "severity": "info", "metadata": {"product": "佑友-mailgard-webmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["mailgard webmail", "window.open('http://www.hechen.com')"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\佑友-mailgard-webmail.yaml"}, {"id": "you-you-you-you-fang-huo-qiang", "info": {"name": "佑友-佑友防火墙", "author": "cn-kali-team", "tags": "detect,tech,佑友-佑友防火墙", "severity": "info", "metadata": {"product": "佑友-佑友防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"inputsize2\"", "src=\"./js/jquery.validate.js\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\佑友-佑友防火墙.yaml"}, {"id": "xin-xi-an-quan-guan-li-xi-tong", "info": {"name": "信息安全管理系统", "author": "cn-kali-team", "tags": "detect,tech,信息安全管理系统", "severity": "info", "metadata": {"product": "信息安全管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["id=\"lblmsg_container\"", "src=\"js/piwik.js\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\信息安全管理系统.yaml"}, {"id": "quan-xi-ruo-hai-cang-chu-ban-gong-fu-zhu-guan-li-xi-tong", "info": {"name": "全息若海-仓储办公辅助管理系统", "author": "cn-kali-team", "tags": "detect,tech,全息若海-仓储办公辅助管理系统", "severity": "info", "metadata": {"product": "全息若海-仓储办公辅助管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["src=\"/scripts/easyui/jquery.easyui.min.js\"", "广州全息若海信息科技有限公司"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\全息若海-仓储办公辅助管理系统.yaml"}, {"id": "guan-qun-jin-chen-kill-you-jian-an-quan-wang-guan", "info": {"name": "冠群金辰-kill邮件安全网关", "author": "cn-kali-team", "tags": "detect,tech,冠群金辰-kill邮件安全网关", "severity": "info", "metadata": {"product": "冠群金辰-kill邮件安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["background=\"skins/default/images/login_ksgm.jpg", "kill邮件安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\冠群金辰-kill邮件安全网关.yaml"}, {"id": "lie-mu-lu", "info": {"name": "列目录", "author": "cn-kali-team", "tags": "detect,tech,列目录", "severity": "info", "metadata": {"product": "列目录", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["

    index of /", "index of /"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["<h1>directory listing for /", "<title>directory listing for /"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\列目录.yaml"}, {"id": "qian-yan-wen-dang-an-quan-guan-li-ruan-jian", "info": {"name": "前沿文档安全管理软件", "author": "cn-kali-team", "tags": "detect,tech,前沿文档安全管理软件", "severity": "info", "metadata": {"product": "前沿文档安全管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["前沿文档安全管理软件"], "case-insensitive": true}]}], "_source_file": "00_unknown\\前沿文档安全管理软件.yaml"}, {"id": "li-da-ke-xun-ldt-an-quan-wang-guan", "info": {"name": "力达科讯-ldt安全网关", "author": "cn-kali-team", "tags": "detect,tech,力达科讯-ldt安全网关", "severity": "info", "metadata": {"product": "力达科讯-ldt安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<body onload=\"chkversion();setlanguage();loading()\" onkeydown=\"keylogin(event);\">", "湖北力达科讯"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\力达科讯-ldt安全网关.yaml"}, {"id": "ban-gong-ping-tai", "info": {"name": "办公平台", "author": "cn-kali-team", "tags": "detect,tech,办公平台", "severity": "info", "metadata": {"product": "办公平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" href=\"xbsj/css/login.css\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\办公平台.yaml"}, {"id": "hua-yu-shu-an-shi-pin-zong-he-an-quan-wang-guan", "info": {"name": "华域数安-视频综合安全网关", "author": "cn-kali-team", "tags": "detect,tech,华域数安-视频综合安全网关", "severity": "info", "metadata": {"product": "华域数安-视频综合安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<div class=\"sys-name\">视频综合安全网关</div>", "华域数安"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\华域数安-视频综合安全网关.yaml"}, {"id": "hua-tian-dong-li-xie-tongoa-ban-gong-xi-tong", "info": {"name": "华天动力协同oa办公系统", "author": "cn-kali-team", "tags": "detect,tech,华天动力协同oa办公系统", "severity": "info", "metadata": {"product": "华天动力协同oa办公系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/oaapp/webobjects/oaapp.woa"], "case-insensitive": true}]}], "_source_file": "00_unknown\\华天动力协同oa办公系统.yaml"}, {"id": "hua-yu-an-quan-wang-guan", "info": {"name": "华御-安全网关", "author": "cn-kali-team", "tags": "detect,tech,华御-安全网关", "severity": "info", "metadata": {"product": "华御-安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["copy_right = {cn : \"\", en ", "var opzoon_ver"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\华御-安全网关.yaml"}, {"id": "hua-qing-xin-an-tong-yi-an-quan-fang-yu-ping-tai", "info": {"name": "华清信安-统一安全防御平台", "author": "cn-kali-team", "tags": "detect,tech,华清信安-统一安全防御平台", "severity": "info", "metadata": {"product": "华清信安-统一安全防御平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"华清信安统一安全防御平台", "window.dmsdefaultlanguage"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\华清信安-统一安全防御平台.yaml"}, {"id": "hua-lei-ke-ji-wu-liu-xin-xi-xi-tong", "info": {"name": "华磊科技物流信息系统", "author": "cn-kali-team", "tags": "detect,tech,华磊科技物流信息系统", "severity": "info", "metadata": {"product": "华磊科技物流信息系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"华磊科技", "erp对接", "快递系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\华磊科技物流信息系统.yaml"}, {"id": "xie-zhongoa", "info": {"name": "协众oa", "author": "cn-kali-team", "tags": "detect,tech,协众oa", "severity": "info", "metadata": {"product": "协众oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: index.php?app=main&func=passport&action=login", "set-cookie: cnoaoasessid="], "part": "header", "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\协众oa.yaml"}, {"id": "xie-tong-ban-gong-xi-tong", "info": {"name": "协同办公系统", "author": "cn-kali-team", "tags": "detect,tech,协同办公系统", "severity": "info", "metadata": {"product": "协同办公系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["id=\"ckbisaday\" type=\"checkbox\" name=\"ckbisaday\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\协同办公系统.yaml"}, {"id": "xie-daoa", "info": {"name": "协达oa", "author": "cn-kali-team", "tags": "detect,tech,协达oa", "severity": "info", "metadata": {"product": "协达oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["img.style.height=(bodyh-84-100)"], "case-insensitive": true}]}], "_source_file": "00_unknown\\协达oa.yaml"}, {"id": "he-zhong-shu-ju-wai-wang-an-quan-shu-ju-jiao-huan-xi-tong", "info": {"name": "合众数据-外网安全数据交换系统", "author": "cn-kali-team", "tags": "detect,tech,合众数据-外网安全数据交换系统", "severity": "info", "metadata": {"product": "合众数据-外网安全数据交换系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/unimas/", "外网安全数据交换系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\合众数据-外网安全数据交换系统.yaml"}, {"id": "he-zhong-shu-ju-shi-pin-an-quan-jie-ru-yong-hu-ren-zheng-xi-tong", "info": {"name": "合众数据-视频安全接入用户认证系统", "author": "cn-kali-team", "tags": "detect,tech,合众数据-视频安全接入用户认证系统", "severity": "info", "metadata": {"product": "合众数据-视频安全接入用户认证系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["txtpasswordcssclass", "视频安全接入用户认证系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\合众数据-视频安全接入用户认证系统.yaml"}, {"id": "he-zheng-ruan-jian--wang-zhan-qun-nei-rong-guan-li-xi-tong-hzcms", "info": {"name": "合正软件-网站群内容管理系统-hzcms", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "合正软件-网站群内容管理系统-hzcms", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["produced by cms 网站群内容管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\合正软件-网站群内容管理系统-hzcms.yaml"}, {"id": "he-fei-yi-yong-xin-xi-ke-ji-you-xian-gong-sicrm-xi-tong", "info": {"name": "合肥易用信息科技有限公司crm系统", "author": "cn-kali-team", "tags": "detect,tech,合肥易用信息科技有限公司crm系统", "severity": "info", "metadata": {"product": "合肥易用信息科技有限公司crm系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["2e7ead236832180553dab45ba77db6b7"]}]}], "_source_file": "00_unknown\\合肥易用信息科技有限公司crm系统.yaml"}, {"id": "ji-da-zheng-yuan-shen-fen-ren-zheng-wang-guan", "info": {"name": "吉大正元-身份认证网关", "author": "cn-kali-team", "tags": "detect,tech,吉大正元-身份认证网关", "severity": "info", "metadata": {"product": "吉大正元-身份认证网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/jit_pnx_portal/", "吉大正元身份认证网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\吉大正元-身份认证网关.yaml"}, {"id": "tong-cheng-duo-yong-hu-shang-cheng", "info": {"name": "同城多用户商城", "author": "cn-kali-team", "tags": "detect,tech,同城多用户商城", "severity": "info", "metadata": {"product": "同城多用户商城", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/style_chaoshi/"], "case-insensitive": true}]}], "_source_file": "00_unknown\\同城多用户商城.yaml"}, {"id": "qi-ming-xing-chen-tian-qingweb-ying-yong-an-quan-wang-guan", "info": {"name": "启明星辰-天清web应用安全网关", "author": "cn-kali-team", "tags": "detect,tech,启明星辰-天清web应用安全网关", "severity": "info", "metadata": {"product": "启明星辰-天清web应用安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["v2/global/vendor/modernizr/modernizr.js", "天清web应用安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\启明星辰-天清web应用安全网关.yaml"}, {"id": "qi-ming-xing-chen-tian-yue-wang-luo-an-quan-shen-ji", "info": {"name": "启明星辰-天玥网络安全审计", "author": "cn-kali-team", "tags": "detect,tech,启明星辰-天玥网络安全审计", "severity": "info", "metadata": {"product": "启明星辰-天玥网络安全审计", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天玥网络安全审计"], "case-insensitive": true}]}], "_source_file": "00_unknown\\启明星辰-天玥网络安全审计.yaml"}, {"id": "qi-ming-xing-chen-tai-he-xin-xi-an-quan-yun-ying-zhong-xin", "info": {"name": "启明星辰-泰合信息安全运营中心", "author": "cn-kali-team", "tags": "detect,tech,启明星辰-泰合信息安全运营中心", "severity": "info", "metadata": {"product": "启明星辰-泰合信息安全运营中心", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["泰合信息安全运营中心"], "case-insensitive": true}]}], "_source_file": "00_unknown\\启明星辰-泰合信息安全运营中心.yaml"}, {"id": "qi-ming-xing-chen-tian-qing-han-mausg-fang-huo-qiang", "info": {"name": "启明星辰天清汉马usg防火墙", "author": "cn-kali-team", "tags": "detect,tech,启明星辰天清汉马usg防火墙", "severity": "info", "metadata": {"product": "启明星辰天清汉马usg防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["venusense", "天清汉马usg防火墙"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/cgi-bin/webui?op=get_product_model", "天清汉马usg"], "case-insensitive": true}]}], "_source_file": "00_unknown\\启明星辰天清汉马usg防火墙.yaml"}, {"id": "qi-ming-xing-chen-tian-yue-yun-wei-an-quan-wang-guan", "info": {"name": "启明星辰天玥运维安全网关", "author": "cn-kali-team", "tags": "detect,tech,启明星辰天玥运维安全网关", "severity": "info", "metadata": {"product": "启明星辰天玥运维安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["checklocalservicestatus", "天玥运维安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\启明星辰天玥运维安全网关.yaml"}, {"id": "he-xin-xia-yi-dai-yun-zhuo-mianvesystem", "info": {"name": "和信下一代云桌面vesystem", "author": "cn-kali-team", "tags": "detect,tech,和信下一代云桌面vesystem", "severity": "info", "metadata": {"product": "和信下一代云桌面vesystem", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["url=/vesystem"], "case-insensitive": true}]}], "_source_file": "00_unknown\\和信下一代云桌面vesystem.yaml"}, {"id": "guo-biaosip-ping-tai-wang-guan", "info": {"name": "国标sip平台网关", "author": "cn-kali-team", "tags": "detect,tech,国标sip平台网关", "severity": "info", "metadata": {"product": "国标sip平台网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<h5><a href=\"config.htm?file=config.htm\">start page</a></h5>\"???*#e?<?q", "sippuaccessserverctx"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\国标sip平台网关.yaml"}, {"id": "guo-biao-wang-guan-guan-li-xi-tong", "info": {"name": "国标网关管理系统", "author": "cn-kali-team", "tags": "detect,tech,国标网关管理系统", "severity": "info", "metadata": {"product": "国标网关管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["title>国标网关管理系统</title"], "case-insensitive": true}]}], "_source_file": "00_unknown\\国标网关管理系统.yaml"}, {"id": "guo-mai-dian-zi-an-quan-wen-dang-guan-li-xi-tong", "info": {"name": "国迈电子安全文档管理系统", "author": "cn-kali-team", "tags": "detect,tech,国迈电子安全文档管理系统", "severity": "info", "metadata": {"product": "国迈电子安全文档管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["</span>国迈安全私有云部. <span>all rights reserved", "国迈安全私有云部 all rights reserved"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\国迈电子安全文档管理系统.yaml"}, {"id": "tu-chuang-ruan-jian-tu-shu-guan-zhan-qun-guan-li-xi-tong", "info": {"name": "图创软件-图书馆站群管理系统", "author": "cn-kali-team", "tags": "detect,tech,图创软件-图书馆站群管理系统", "severity": "info", "metadata": {"product": "图创软件-图书馆站群管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/interlib/common/"], "case-insensitive": true}]}], "_source_file": "00_unknown\\图创软件-图书馆站群管理系统.yaml"}, {"id": "sheng-bo-run-lansecs-di-er-dai-fang-huo-qiang", "info": {"name": "圣博润-lansecs第二代防火墙", "author": "cn-kali-team", "tags": "detect,tech,圣博润-lansecs第二代防火墙", "severity": "info", "metadata": {"product": "圣博润-lansecs第二代防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["lansecs第二代防火墙"], "case-insensitive": true}]}], "_source_file": "00_unknown\\圣博润-lansecs第二代防火墙.yaml"}, {"id": "da-hua-zhi-neng-wu-lian-icc-zong-he-guan-li-ping-tai", "info": {"name": "大华智能物联icc综合管理平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "大华智能物联icc综合管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["*客户端会小于800*", "/authlogin"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\大华智能物联icc综合管理平台.yaml"}, {"id": "tian-qing-han-mavpn", "info": {"name": "天清汉马vpn", "author": "cn-kali-team", "tags": "detect,tech,天清汉马vpn", "severity": "info", "metadata": {"product": "天清汉马vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/vpn/common/js/leadsec.js", "/vpn/user/common/custom/auth_home.css"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天清汉马vpn.yaml"}, {"id": "tian-rong-xin-vpn", "info": {"name": "天融信-vpn", "author": "cn-kali-team", "tags": "detect,tech,天融信-vpn", "severity": "info", "metadata": {"product": "天融信-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["window.location.href=\"/vone/pub/pda.html\";", "window.location=\"/portal_default/index.html\";</script>"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-vpn.yaml"}, {"id": "tian-rong-xin-web-ying-yong-an-quan-wang-guan", "info": {"name": "天融信-web应用安全网关", "author": "cn-kali-team", "tags": "detect,tech,天融信-web应用安全网关", "severity": "info", "metadata": {"product": "天融信-web应用安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["this.src='/style/images/rand.php?update=1'", "天融信web应用安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-web应用安全网关.yaml"}, {"id": "tian-rong-xin-web-ying-yong-an-quan-fang-hu-xi-tong", "info": {"name": "天融信-web应用安全防护系统", "author": "cn-kali-team", "tags": "detect,tech,天融信-web应用安全防护系统", "severity": "info", "metadata": {"product": "天融信-web应用安全防护系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"logintop\"", "web应用安全防护系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-web应用安全防护系统.yaml"}, {"id": "tian-rong-xin-web-ying-yong-fang-huo-qiang", "info": {"name": "天融信-web应用防火墙", "author": "cn-kali-team", "tags": "detect,tech,天融信-web应用防火墙", "severity": "info", "metadata": {"product": "天融信-web应用防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["evpng.fix('div, ul, img, li, input'); //evpng.fix('pngid1, pngid2')", "web user login"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-web应用防火墙.yaml"}, {"id": "tian-rong-xin-ru-qin-fang-yu-xi-tongtopidp", "info": {"name": "天融信-入侵防御系统topidp", "author": "cn-kali-team", "tags": "detect,tech,天融信-入侵防御系统topidp", "severity": "info", "metadata": {"product": "天融信-入侵防御系统topidp", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天融信入侵防御系统topidp"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-入侵防御系统topidp.yaml"}, {"id": "tian-rong-xin-an-quan-shen-ji", "info": {"name": "天融信-安全审计", "author": "cn-kali-team", "tags": "detect,tech,天融信-安全审计", "severity": "info", "metadata": {"product": "天融信-安全审计", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<p>安全审计</p>", "<title>topsec单点登录系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-安全审计.yaml"}, {"id": "tian-rong-xin-an-quan-guan-li-xi-tong", "info": {"name": "天融信-安全管理系统", "author": "cn-kali-team", "tags": "detect,tech,天融信-安全管理系统", "severity": "info", "metadata": {"product": "天融信-安全管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天融信安全管理"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-安全管理系统.yaml"}, {"id": "tian-rong-xin-shu-ju-an-quan-guan-li-xi-tong", "info": {"name": "天融信-数据安全管理系统", "author": "cn-kali-team", "tags": "detect,tech,天融信-数据安全管理系统", "severity": "info", "metadata": {"product": "天融信-数据安全管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天融信数据安全管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-数据安全管理系统.yaml"}, {"id": "tian-rong-xin-shu-ju-an-quan-xi-tongsbu", "info": {"name": "天融信-数据安全系统sbu", "author": "cn-kali-team", "tags": "detect,tech,天融信-数据安全系统sbu", "severity": "info", "metadata": {"product": "天融信-数据安全系统sbu", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天融信数据安全系统sbu"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-数据安全系统sbu.yaml"}, {"id": "tian-rong-xin-wang-luo-wei-shi-guo-lü-wang-guan", "info": {"name": "天融信-网络卫士过滤网关", "author": "cn-kali-team", "tags": "detect,tech,天融信-网络卫士过滤网关", "severity": "info", "metadata": {"product": "天融信-网络卫士过滤网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["天融信网络卫士过滤网关"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信-网络卫士过滤网关.yaml"}, {"id": "tian-rong-xintopapp_lb-fu-zai-jun-heng-xi-tong", "info": {"name": "天融信topapp_lb负载均衡系统", "author": "cn-kali-team", "tags": "detect,tech,天融信topapp_lb负载均衡系统", "severity": "info", "metadata": {"product": "天融信topapp_lb负载均衡系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["<title>天融信 topapp"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信topapp_lb负载均衡系统.yaml"}, {"id": "tian-rong-xin-shu-ju-fang-xie-lou-xi-tong", "info": {"name": "天融信数据防泄漏系统", "author": "cn-kali-team", "tags": "detect,tech,天融信数据防泄漏系统", "severity": "info", "metadata": {"product": "天融信数据防泄漏系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["topdlp_show", "天融信数据防泄漏系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天融信数据防泄漏系统.yaml"}, {"id": "tian-xing-wang-an-an-quan-dan-xiang-dao-ru-xi-tong", "info": {"name": "天行网安-安全单向导入系统", "author": "cn-kali-team", "tags": "detect,tech,天行网安-安全单向导入系统", "severity": "info", "metadata": {"product": "天行网安-安全单向导入系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "天行安全单向导入系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天行网安-安全单向导入系统.yaml"}, {"id": "tian-xing-wang-an-shi-pin-tu-xiang-an-quan-jian-kong-jie-ru-xi-tong", "info": {"name": "天行网安-视频图像安全监控接入系统", "author": "cn-kali-team", "tags": "detect,tech,天行网安-视频图像安全监控接入系统", "severity": "info", "metadata": {"product": "天行网安-视频图像安全监控接入系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "天行视频图像安全监控接入系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天行网安-视频图像安全监控接入系统.yaml"}, {"id": "tian-mai-ke-ji-wang-luo-shi-pin-jian-kong-xi-tong", "info": {"name": "天迈科技网络视频监控系统", "author": "cn-kali-team", "tags": "detect,tech,天迈科技网络视频监控系统", "severity": "info", "metadata": {"product": "天迈科技网络视频监控系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["jsessionid", "天迈科技", "网络视频监控系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\天迈科技网络视频监控系统.yaml"}, {"id": "tian-wen-wu-ye-erp-xi-tong", "info": {"name": "天问物业erp系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "天问物业erp系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["www.tw369.com", "天问互联"], "case-insensitive": true}]}], "_source_file": "00_unknown\\天问物业erp系统.yaml"}, {"id": "tai-yi-xing-chen-xia-yi-dai-fang-huo-qiang", "info": {"name": "太一星晨-下一代防火墙", "author": "cn-kali-team", "tags": "detect,tech,太一星晨-下一代防火墙", "severity": "info", "metadata": {"product": "太一星晨-下一代防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["t-force下一代防火墙"], "case-insensitive": true}]}], "_source_file": "00_unknown\\太一星晨-下一代防火墙.yaml"}, {"id": "qi-an-xin-ngsoc", "info": {"name": "奇安信-ngsoc", "author": "cn-kali-team", "tags": "detect,tech,奇安信-ngsoc", "severity": "info", "metadata": {"product": "奇安信-ngsoc", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ngsoc关联规则引擎", "ngsoc日志采集探针"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-ngsoc.yaml"}, {"id": "qi-an-xin-vpn", "info": {"name": "奇安信-vpn", "author": "cn-kali-team", "tags": "detect,tech,奇安信-vpn", "severity": "info", "metadata": {"product": "奇安信-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["qianxinvpn", "卸载奇安信vpn"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["4cf31d7e53197f79b435b66cc8cb3098"]}]}], "_source_file": "00_unknown\\奇安信-vpn.yaml"}, {"id": "qi-an-xin-dai-ma-wei-shi", "info": {"name": "奇安信-代码卫士", "author": "cn-kali-team", "tags": "detect,tech,奇安信-代码卫士", "severity": "info", "metadata": {"product": "奇安信-代码卫士", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360代码卫士", "baseurl : 'app', //配置模块根路径到静态资源根目录"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-代码卫士.yaml"}, {"id": "qi-an-xin-qi-ye-an-quan-bu-shu", "info": {"name": "奇安信-企业安全部署", "author": "cn-kali-team", "tags": "detect,tech,奇安信-企业安全部署", "severity": "info", "metadata": {"product": "奇安信-企业安全部署", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360企业安全部署"], "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-企业安全部署.yaml"}, {"id": "qi-an-xin-qi-ye-ban-kong-zhi-zhong-xin", "info": {"name": "奇安信-企业版控制中心", "author": "cn-kali-team", "tags": "detect,tech,奇安信-企业版控制中心", "severity": "info", "metadata": {"product": "奇安信-企业版控制中心", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360企业版控制中心"], "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-企业版控制中心.yaml"}, {"id": "qi-an-xin-tian-qing", "info": {"name": "奇安信-天擎", "author": "cn-kali-team", "tags": "detect,tech,奇安信-天擎", "severity": "info", "metadata": {"product": "奇安信-天擎", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360新天擎", "appid\":\"skylar6"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-天擎.yaml"}, {"id": "qi-an-xin-tian-ji-guan-li-zhong-xin", "info": {"name": "奇安信-天机管理中心", "author": "cn-kali-team", "tags": "detect,tech,奇安信-天机管理中心", "severity": "info", "metadata": {"product": "奇安信-天机管理中心", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360天机管理中心", "src=\"/resource/img/login/logo_403.png\" alt=\"360天机\"/>\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-天机管理中心.yaml"}, {"id": "qi-an-xin-tian-yan", "info": {"name": "奇安信-天眼", "author": "cn-kali-team", "tags": "detect,tech,奇安信-天眼", "severity": "info", "metadata": {"product": "奇安信-天眼", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360天眼"], "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-天眼.yaml"}, {"id": "qi-an-xin-shu-ju-tuo-min-xi-tong", "info": {"name": "奇安信-数据脱敏系统", "author": "cn-kali-team", "tags": "detect,tech,奇安信-数据脱敏系统", "severity": "info", "metadata": {"product": "奇安信-数据脱敏系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["360网神数据脱敏系统 "], "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信-数据脱敏系统.yaml"}, {"id": "qi-an-xin-zhong-duan-an-quan-guan-li-xi-tongqax-tian-qing", "info": {"name": "奇安信终端安全管理系统qax天擎", "author": "cn-kali-team", "tags": "detect,tech,奇安信终端安全管理系统qax天擎", "severity": "info", "metadata": {"product": "奇安信终端安全管理系统qax天擎", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["id=\"rsapubkey\"", "奇安信新天擎"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\奇安信终端安全管理系统qax天擎.yaml"}, {"id": "qi-yue-suo-dian-zi-qian-zhang-xi-tong", "info": {"name": "契约锁电子签章系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "契约锁电子签章系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["qyswebapp", "电子签署平台"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["p3p: cp=cao psa our"], "part": "header", "case-insensitive": true}, {"type": "favicon", "hash": ["ad17b1fc5025ca47f743f7e69c956b26"]}]}], "_source_file": "00_unknown\\契约锁电子签章系统.yaml"}, {"id": "ao-wei-ya-shi-ping-yun-ping-tai", "info": {"name": "奥威亚视屏云平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "奥威亚视屏云平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["lickandshowsignupmodal", "clickandshowloginmodal"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/css/newtontheme/assets/app.css"], "case-insensitive": true}]}], "_source_file": "00_unknown\\奥威亚视屏云平台.yaml"}, {"id": "hao-shi-tong-fastmeeting", "info": {"name": "好视通-fastmeeting", "author": "cn-kali-team", "tags": "detect,tech,好视通-fastmeeting", "severity": "info", "metadata": {"product": "好视通-fastmeeting", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["login/createqrcode.do", "resources/commonimage/favicon.ico", "用户登录"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\好视通-fastmeeting.yaml"}, {"id": "fu-meng-yun", "info": {"name": "孚盟云", "author": "cn-kali-team", "tags": "detect,tech,孚盟云", "severity": "info", "metadata": {"product": "孚盟云", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["fumasoft", "孚盟云"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\孚盟云.yaml"}, {"id": "ning-dun-yi-ti-hua-an-quan-ren-zheng-ping-tai", "info": {"name": "宁盾-一体化安全认证平台", "author": "cn-kali-team", "tags": "detect,tech,宁盾-一体化安全认证平台", "severity": "info", "metadata": {"product": "宁盾-一体化安全认证平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["id=\"dynamicpasswordwithmobile\">"], "case-insensitive": true}]}], "_source_file": "00_unknown\\宁盾-一体化安全认证平台.yaml"}, {"id": "yu-shi-vs-isc5000-e", "info": {"name": "宇视vs-isc5000-e", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "宇视vs-isc5000-e", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: page/login/"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\宇视vs-isc5000-e.yaml"}, {"id": "an-bo-tong-ying-yong-wang-guan", "info": {"name": "安博通应用网关", "author": "cn-kali-team", "tags": "detect,tech,安博通应用网关", "severity": "info", "metadata": {"product": "安博通应用网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["安博通应用网关"], "case-insensitive": true}]}], "_source_file": "00_unknown\\安博通应用网关.yaml"}, {"id": "an-heng-yun-bao-lei-ji", "info": {"name": "安恒云堡垒机", "author": "cn-kali-team", "tags": "detect,tech,安恒云堡垒机", "severity": "info", "metadata": {"product": "安恒云堡垒机", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dbappsecurity", "安恒云堡垒机"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒云堡垒机.yaml"}, {"id": "an-heng-xin-xi-ming-yuweb-ying-yong-fang-huo-qiang", "info": {"name": "安恒信息-明御web应用防火墙", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明御web应用防火墙", "severity": "info", "metadata": {"product": "安恒信息-明御web应用防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["scripts/app.waf.system.login.js", "明御web应用防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明御web应用防火墙.yaml"}, {"id": "an-heng-xin-xi-ming-yu-an-quan-wang-guan", "info": {"name": "安恒信息-明御安全网关", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明御安全网关", "severity": "info", "metadata": {"product": "安恒信息-明御安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["明御安全网关"], "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明御安全网关.yaml"}, {"id": "an-heng-xin-xi-ming-yu-shu-ju-ku-shen-ji-yu-feng-xian-kong-zhi-xi-tong", "info": {"name": "安恒信息-明御数据库审计与风险控制系统", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明御数据库审计与风险控制系统", "severity": "info", "metadata": {"product": "安恒信息-明御数据库审计与风险控制系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["明御数据库审计"], "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明御数据库审计与风险控制系统.yaml"}, {"id": "an-heng-xin-xi-ming-yu-zong-he-ri-zhi-shen-ji", "info": {"name": "安恒信息-明御综合日志审计", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明御综合日志审计", "severity": "info", "metadata": {"product": "安恒信息-明御综合日志审计", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["明御", "综合日志审计分析平台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明御综合日志审计.yaml"}, {"id": "an-heng-xin-xi-ming-yu-yun-wei-shen-ji-yu-feng-xian-kong-zhi-xi-tong", "info": {"name": "安恒信息-明御运维审计与风险控制系统", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明御运维审计与风险控制系统", "severity": "info", "metadata": {"product": "安恒信息-明御运维审计与风险控制系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["明御运维审计"], "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明御运维审计与风险控制系统.yaml"}, {"id": "an-heng-xin-xi-ming-jian-wang-zhan-an-quan-jian-ce-ping-tai", "info": {"name": "安恒信息-明鉴网站安全监测平台", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-明鉴网站安全监测平台", "severity": "info", "metadata": {"product": "安恒信息-明鉴网站安全监测平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["网站安全检测平台", "网站安全监测平台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-明鉴网站安全监测平台.yaml"}, {"id": "an-heng-xin-xi-fang-huo-qiang", "info": {"name": "安恒信息-防火墙", "author": "cn-kali-team", "tags": "detect,tech,安恒信息-防火墙", "severity": "info", "metadata": {"product": "安恒信息-防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dbapp security", "scripts/web-common.js"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安恒信息-防火墙.yaml"}, {"id": "an-wang-ke-ji-zhi-neng-lu-you-xi-tong", "info": {"name": "安网科技-智能路由系统", "author": "cn-kali-team", "tags": "detect,tech,安网科技-智能路由系统", "severity": "info", "metadata": {"product": "安网科技-智能路由系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["安网科技-智能路由系统", "var save_time=72;//小时数"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安网科技-智能路由系统.yaml"}, {"id": "an-da-tong-tpn-wang-guan-kong-zhi-tai-deng-lu-xi-tong", "info": {"name": "安达通-tpn网关控制台登陆系统", "author": "cn-kali-team", "tags": "detect,tech,安达通-tpn网关控制台登陆系统", "severity": "info", "metadata": {"product": "安达通-tpn网关控制台登陆系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["$('#submitid').bind('click',checksubmitfn);\"", "tpn-2g网关控制台管理员登录"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安达通-tpn网关控制台登陆系统.yaml"}, {"id": "an-da-tong-vpn", "info": {"name": "安达通-vpn", "author": "cn-kali-team", "tags": "detect,tech,安达通-vpn", "severity": "info", "metadata": {"product": "安达通-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["$('#submitid').bind('click',checksubmitfn);\"", "sjw74 vpn网关控制台管理员登录"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安达通-vpn.yaml"}, {"id": "an-you-an-quan-you-jian", "info": {"name": "安邮-安全邮件", "author": "cn-kali-team", "tags": "detect,tech,安邮-安全邮件", "severity": "info", "metadata": {"product": "安邮-安全邮件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" 客服邮箱support@suremail.cn", "content=\"北京国信安邮科技有限公司"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\安邮-安全邮件.yaml"}, {"id": "shan-shi-wang-ke-fang-huo-qiang", "info": {"name": "山石网科防火墙", "author": "cn-kali-team", "tags": "detect,tech,山石网科防火墙", "severity": "info", "metadata": {"product": "山石网科防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["global_config.js", "hillstone", "licenseaggrement"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\山石网科防火墙.yaml"}, {"id": "gong-kong-an-quan-yin-huan-zhi-li-xiang-mu-xi-tong", "info": {"name": "工控安全隐患治理项目系统", "author": "cn-kali-team", "tags": "detect,tech,工控安全隐患治理项目系统", "severity": "info", "metadata": {"product": "工控安全隐患治理项目系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"qyxt.html\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\工控安全隐患治理项目系统.yaml"}, {"id": "fan-ruan-bao-biao", "info": {"name": "帆软报表", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "帆软报表", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["=fs", "reportserver"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["content=\"finereport--web reporting tool\"", "finereport/decision"], "case-insensitive": true}]}], "_source_file": "00_unknown\\帆软报表.yaml"}, {"id": "fan-ruan-shu-ju-jue-ce-xi-tong", "info": {"name": "帆软数据决策系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "帆软数据决策系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["webroot/decision/file?path="], "case-insensitive": true}]}], "_source_file": "00_unknown\\帆软数据决策系统.yaml"}, {"id": "guang-lian-da-oa", "info": {"name": "广联达oa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "广联达oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /services/identification/login.ashx?returnurl=%2f"], "part": "header", "case-insensitive": true}, {"type": "word", "words": ["gtptdt.aspx"], "case-insensitive": true}]}], "_source_file": "00_unknown\\广联达oa.yaml"}, {"id": "wei-san-yun-guan-li-xi-tong", "info": {"name": "微三云管理系统", "author": "cn-kali-team", "tags": "detect,tech,微三云管理系统", "severity": "info", "metadata": {"product": "微三云管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    管理系统 management system
    "], "case-insensitive": true}]}], "_source_file": "00_unknown\\微三云管理系统.yaml"}, {"id": "wei-hong-oa", "info": {"name": "微宏oa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "微宏oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /wh/serverlogin.jsp"], "part": "header", "case-insensitive": true}, {"type": "word", "words": ["/wh/servlet/mainserver"], "case-insensitive": true}]}], "_source_file": "00_unknown\\微宏oa.yaml"}, {"id": "hui-er-dun-e-di-tongvpn", "info": {"name": "惠尔顿-e地通vpn", "author": "cn-kali-team", "tags": "detect,tech,惠尔顿-e地通vpn", "severity": "info", "metadata": {"product": "惠尔顿-e地通vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["images/l_name.jpg", "jtpsoft style1"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\惠尔顿-e地通vpn.yaml"}, {"id": "hui-er-dun-xia-yi-dai-fang-huo-qiang", "info": {"name": "惠尔顿-下一代防火墙", "author": "cn-kali-team", "tags": "detect,tech,惠尔顿-下一代防火墙", "severity": "info", "metadata": {"product": "惠尔顿-下一代防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/base/img/login_logo_ngaf.jpg", "惠尔顿下一代防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\惠尔顿-下一代防火墙.yaml"}, {"id": "hui-dian-oa", "info": {"name": "慧点oa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "慧点oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["www/mobile-version.txt"], "case-insensitive": true}]}], "_source_file": "00_unknown\\慧点oa.yaml"}, {"id": "hui-dun-an-quan-shi-pin-he-xin-an-quan-wang-guan", "info": {"name": "慧盾安全-视频核心安全网关", "author": "cn-kali-team", "tags": "detect,tech,慧盾安全-视频核心安全网关", "severity": "info", "metadata": {"product": "慧盾安全-视频核心安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["id=\"view-login\"", "title').text('视频会议安全系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\慧盾安全-视频核心安全网关.yaml"}, {"id": "ji-teng-ying-yong-an-quan-wang-guan", "info": {"name": "技腾-应用安全网关", "author": "cn-kali-team", "tags": "detect,tech,技腾-应用安全网关", "severity": "info", "metadata": {"product": "技腾-应用安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["webui/images/basic/login/main_logo.gif", "应用安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\技腾-应用安全网关.yaml"}, {"id": "hu-wei-shen-wang-zhan-an-quan-xi-tong", "info": {"name": "护卫神-网站安全系统", "author": "cn-kali-team", "tags": "detect,tech,护卫神-网站安全系统", "severity": "info", "metadata": {"product": "护卫神-网站安全系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["护卫神.网站安全系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\护卫神-网站安全系统.yaml"}, {"id": "tuo-er-si-mas", "info": {"name": "拓尔思-mas", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "拓尔思-mas", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["x-mas-server: ", "location: /mas/"], "part": "header", "case-insensitive": true}, {"type": "favicon", "hash": ["ea5d31497e6f1304cdf4f4660a9b86df"]}]}], "_source_file": "00_unknown\\拓尔思-mas.yaml"}, {"id": "tuo-er-si-sso", "info": {"name": "拓尔思sso", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "拓尔思sso", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /ids/"], "part": "header", "case-insensitive": true}, {"type": "word", "words": ["/ids/admin/js/oslib"], "case-insensitive": true}]}], "_source_file": "00_unknown\\拓尔思sso.yaml"}, {"id": "tuo-er-si-was", "info": {"name": "拓尔思was", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "拓尔思was", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["trs_web_style.css"], "case-insensitive": true}]}], "_source_file": "00_unknown\\拓尔思was.yaml"}, {"id": "zhi-zhang-yi", "info": {"name": "指掌易", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "指掌易", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: zzy_web"], "part": "header", "case-insensitive": true}, {"type": "word", "words": ["build/framework/js/download.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\指掌易.yaml"}, {"id": "jie-shun-jielink-zhi-neng-zhong-duan-cao-zuo-ping-tai", "info": {"name": "捷顺 jielink智能终端操作平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "捷顺 jielink智能终端操作平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["2f809c4759399cae458a29f24490a114"]}, {"type": "word", "words": ["/resources/images/jielink_logo.png"], "case-insensitive": true}]}], "_source_file": "00_unknown\\捷顺 jielink智能终端操作平台.yaml"}, {"id": "jie-ru-wang-guan-guan-li-ping-tai", "info": {"name": "接入网关管理平台", "author": "cn-kali-team", "tags": "detect,tech,接入网关管理平台", "severity": "info", "metadata": {"product": "接入网关管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["edp-web/login.jsp"], "case-insensitive": true}]}], "_source_file": "00_unknown\\接入网关管理平台.yaml"}, {"id": "min-xun-ke-ji-eqmail", "info": {"name": "敏讯科技-eqmail", "author": "cn-kali-team", "tags": "detect,tech,敏讯科技-eqmail", "severity": "info", "metadata": {"product": "敏讯科技-eqmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"eqmail.ico", "powered by eqmail!"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\敏讯科技-eqmail.yaml"}, {"id": "min-xun-ke-ji-spammark-you-jian-xin-xi-an-quan-wang-guan", "info": {"name": "敏讯科技-spammark邮件信息安全网关", "author": "cn-kali-team", "tags": "detect,tech,敏讯科技-spammark邮件信息安全网关", "severity": "info", "metadata": {"product": "敏讯科技-spammark邮件信息安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/cgi-bin/spammark?empty=1", "spammark邮件信息安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\敏讯科技-spammark邮件信息安全网关.yaml"}, {"id": "shu-zi-hua-xiao-yuan-zong-he-guan-li-xi-tong", "info": {"name": "数字化校园综合管理系统", "author": "cn-kali-team", "tags": "detect,tech,数字化校园综合管理系统", "severity": "info", "metadata": {"product": "数字化校园综合管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["\"../../dc_login/qysignup\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\数字化校园综合管理系统.yaml"}, {"id": "wen-wang-yi-lian-wen-wang-wei-shi-an-quan-lu-you-qi", "info": {"name": "文网亿联-文网卫士安全路由器", "author": "cn-kali-team", "tags": "detect,tech,文网亿联-文网卫士安全路由器", "severity": "info", "metadata": {"product": "文网亿联-文网卫士安全路由器", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["文网卫士安全路由器"], "case-insensitive": true}]}], "_source_file": "00_unknown\\文网亿联-文网卫士安全路由器.yaml"}, {"id": "xin-wang-hu-lian-zhun-xun-you-jian-xi-tong", "info": {"name": "新网互联-准讯邮件系统", "author": "cn-kali-team", "tags": "detect,tech,新网互联-准讯邮件系统", "severity": "info", "metadata": {"product": "新网互联-准讯邮件系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/webmail//cssv2/tamail.css\"", "src=\"cgijson/getloginimg.php?img=logo"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\新网互联-准讯邮件系统.yaml"}, {"id": "fang-biao-csmail", "info": {"name": "方标-csmail", "author": "cn-kali-team", "tags": "detect,tech,方标-csmail", "severity": "info", "metadata": {"product": "方标-csmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [""], "case-insensitive": true}]}], "_source_file": "00_unknown\\方标-csmail.yaml"}, {"id": "shi-kong-zhi-you-qi-ye-xin-xi-guan-li", "info": {"name": "时空智友企业信息管理", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "时空智友企业信息管理", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["您的账号已在另一台设备登录,继续登录将挤掉原登录设备,是否继续登录", "时空智友"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["2464cbce5dd2681dd4fb62d055520d78"]}]}], "_source_file": "00_unknown\\时空智友企业信息管理.yaml"}, {"id": "ming-yuan-yunerp", "info": {"name": "明源云erp", "author": "cn-kali-team", "tags": "detect,tech,明源云erp", "severity": "info", "metadata": {"product": "明源云erp", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["明源云erp"], "case-insensitive": true}]}], "_source_file": "00_unknown\\明源云erp.yaml"}, {"id": "yi-you-zhi-neng-fan-la-ji-you-jian-xi-tong", "info": {"name": "易邮-智能反垃圾邮件系统", "author": "cn-kali-team", "tags": "detect,tech,易邮-智能反垃圾邮件系统", "severity": "info", "metadata": {"product": "易邮-智能反垃圾邮件系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/ymail/default/js/menu.js", "ymail's 智能反垃圾邮件系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\易邮-智能反垃圾邮件系统.yaml"}, {"id": "jing-yun-wang-luo-fang-bing-du-xi-tong", "info": {"name": "景云网络防病毒系统", "author": "cn-kali-team", "tags": "detect,tech,景云网络防病毒系统", "severity": "info", "metadata": {"product": "景云网络防病毒系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["login_form", "styles/images/logo.png", "防病毒"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\景云网络防病毒系统.yaml"}, {"id": "jie-si-an-quan-lie-ying-zhu-ji-an-quan-xiang-ying-xi-tong", "info": {"name": "杰思安全-猎鹰主机安全响应系统", "author": "cn-kali-team", "tags": "detect,tech,杰思安全-猎鹰主机安全响应系统", "severity": "info", "metadata": {"product": "杰思安全-猎鹰主机安全响应系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["majorsec"], "case-insensitive": true}]}], "_source_file": "00_unknown\\杰思安全-猎鹰主机安全响应系统.yaml"}, {"id": "suo-zi-yu-la-ji-you-jian-fang-huo-qiang", "info": {"name": "梭子鱼垃圾邮件防火墙", "author": "cn-kali-team", "tags": "detect,tech,梭子鱼垃圾邮件防火墙", "severity": "info", "metadata": {"product": "梭子鱼垃圾邮件防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["梭子鱼垃圾邮件防火墙"], "case-insensitive": true}]}], "_source_file": "00_unknown\\梭子鱼垃圾邮件防火墙.yaml"}, {"id": "zheng-tong-hui-feng-shi-li-kong-zhi-tai-oa", "info": {"name": "正通慧丰实例控制台-oa", "author": "cn-kali-team", "tags": "detect,tech,正通慧丰实例控制台-oa", "severity": "info", "metadata": {"product": "正通慧丰实例控制台-oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["f07d5960a56ea44c35496bf1dea9a015"]}]}], "_source_file": "00_unknown\\正通慧丰实例控制台-oa.yaml"}, {"id": "yong-zhongdcs", "info": {"name": "永中dcs", "author": "cn-kali-team", "tags": "detect,tech,永中dcs", "severity": "info", "metadata": {"product": "永中dcs", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["永中文档在线预览dcs"], "case-insensitive": true}]}], "_source_file": "00_unknown\\永中dcs.yaml"}, {"id": "han-de-srm-yun-ping-tai", "info": {"name": "汉得srm云平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "汉得srm云平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/component/font-awesome-3.2.1/css/font-awesome-ie7.min.css", "first_login_alter_pwd.screen"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["汉得srm云平台"], "case-insensitive": true}]}], "_source_file": "00_unknown\\汉得srm云平台.yaml"}, {"id": "fan-wei-oa-e-cology8", "info": {"name": "泛微-oa e-cology8", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "泛微-oa e-cology8", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/js/ecology8/lang/weaver_lang_7_wev8.js", "/js/jquery/plugins/client/jquery.client_wev8.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\泛微-oa e-cology8.yaml"}, {"id": "fan-wei-e-mobile-yi-dong-guan-li-ping-tai-xiao-xi-fu-wu", "info": {"name": "泛微e-mobile 移动管理平台消息服务", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "泛微e-mobile 移动管理平台消息服务", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["ef1091afecc18200b9322cceb5c683fa"]}, {"type": "word", "words": ["emessage 管理界面"], "case-insensitive": true}]}], "_source_file": "00_unknown\\泛微e-mobile 移动管理平台消息服务.yaml"}, {"id": "fan-pu-jian-zhu-gong-cheng-shi-gong-oa", "info": {"name": "泛普建筑工程施工oa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "泛普建筑工程施工oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dwr/interface/loginservice.js", "dwr/interface/loginservice.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\泛普建筑工程施工oa.yaml"}, {"id": "tai-xin-tmailer-you-jian-xi-tong", "info": {"name": "泰信tmailer邮件系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "泰信tmailer邮件系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["set-cookie: tm_test=true", "server: theproxy"], "part": "header", "case-insensitive": true}, {"type": "favicon", "hash": ["9f99176691d4caf44367865e2602f555"]}]}], "_source_file": "00_unknown\\泰信tmailer邮件系统.yaml"}, {"id": "zhe-da-en-te-ke-hu-zi-yuan-guan-li-xi-tong--entercrm", "info": {"name": "浙大恩特客户资源管理系统- entercrm", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "浙大恩特客户资源管理系统- entercrm", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["entercrm", "欢迎使用浙大恩特客户资源管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\浙大恩特客户资源管理系统- entercrm.yaml"}, {"id": "lang-chao-fu-wu-qilpmi-guan-li-kou", "info": {"name": "浪潮服务器lpmi管理口", "author": "cn-kali-team", "tags": "detect,tech,浪潮服务器lpmi管理口", "severity": "info", "metadata": {"product": "浪潮服务器lpmi管理口", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["management system", "img/inspur_logo.png"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\浪潮服务器lpmi管理口.yaml"}, {"id": "hai-xia-xin-xi-hei-dun-wang-luo-an-quan-shen-ji-xi-tong", "info": {"name": "海峡信息-黑盾网络安全审计系统", "author": "cn-kali-team", "tags": "detect,tech,海峡信息-黑盾网络安全审计系统", "severity": "info", "metadata": {"product": "海峡信息-黑盾网络安全审计系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["technology, inc.", "福建省海峡信息技术有限公司"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\海峡信息-黑盾网络安全审计系统.yaml"}, {"id": "hai-xia-xin-xi-hei-dun-yun-wei-an-quan-wang-guan", "info": {"name": "海峡信息-黑盾运维安全网关", "author": "cn-kali-team", "tags": "detect,tech,海峡信息-黑盾运维安全网关", "severity": "info", "metadata": {"product": "海峡信息-黑盾运维安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["黑盾运维安全网关(hd-sgs/v4.0)"], "case-insensitive": true}]}], "_source_file": "00_unknown\\海峡信息-黑盾运维安全网关.yaml"}, {"id": "hai-kang-wei-shi-liu-mei-ti-guan-li-fu-wu-qi", "info": {"name": "海康威视流媒体管理服务器", "author": "cn-kali-team", "tags": "detect,tech,海康威视流媒体管理服务器", "severity": "info", "metadata": {"product": "海康威视流媒体管理服务器", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["mshtml", "login", "流媒体管理服务器"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\海康威视流媒体管理服务器.yaml"}, {"id": "hai-xiang-yun-ping-tai", "info": {"name": "海翔云平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "海翔云平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["登录海翔", "./css/seafly/login.css"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\海翔云平台.yaml"}, {"id": "shen-xin-fuwaf", "info": {"name": "深信服waf", "author": "cn-kali-team", "tags": "detect,tech,深信服waf", "severity": "info", "metadata": {"product": "深信服waf", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["commonfunction.js", "rsa.js"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/loginout.php", "redirect to..."], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服waf.yaml"}, {"id": "shen-xin-fuweb-fang-cuan-gai-guan-li-xi-tong", "info": {"name": "深信服web防篡改管理系统", "author": "cn-kali-team", "tags": "detect,tech,深信服web防篡改管理系统", "severity": "info", "metadata": {"product": "深信服web防篡改管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["web防篡改", "cgi-bin/tamper_admin.cgi"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服web防篡改管理系统.yaml"}, {"id": "shen-xin-fu-shang-wang-xing-wei-guan-li-xi-tong", "info": {"name": "深信服上网行为管理系统", "author": "cn-kali-team", "tags": "detect,tech,深信服上网行为管理系统", "severity": "info", "metadata": {"product": "深信服上网行为管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["document.write(wrfwwcsfbxmigkrkhxfj", "utccjfaewjb = function(str, key)"], "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服上网行为管理系统.yaml"}, {"id": "shen-xin-fu-xia-yi-dai-fang-huo-qiang-ngaf", "info": {"name": "深信服下一代防火墙-ngaf", "author": "cn-kali-team", "tags": "detect,tech,深信服下一代防火墙-ngaf", "severity": "info", "metadata": {"product": "深信服下一代防火墙-ngaf", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ngaf", "sangfor", "login"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服下一代防火墙-ngaf.yaml"}, {"id": "shen-xin-fu-an-quan-gan-zhi-ping-tai", "info": {"name": "深信服安全感知平台", "author": "cn-kali-team", "tags": "detect,tech,深信服安全感知平台", "severity": "info", "metadata": {"product": "深信服安全感知平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["apps", "login.js", "安全感知平台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服安全感知平台.yaml"}, {"id": "shen-xin-fu-ying-yong-jiao-fu-bao-biao-xi-tong", "info": {"name": "深信服应用交付报表系统", "author": "cn-kali-team", "tags": "detect,tech,深信服应用交付报表系统", "severity": "info", "metadata": {"product": "深信服应用交付报表系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/reportcenter/index.php?cls_mode=cluster_mode_others"], "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服应用交付报表系统.yaml"}, {"id": "shen-xin-fu-ying-yong-jiao-fu-guan-li-xi-tong", "info": {"name": "深信服应用交付管理系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "深信服应用交付管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["欢迎登录", "/report/report.php"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["98128e625a3b98546a206c2170fb5eb3"]}]}], "_source_file": "00_unknown\\深信服应用交付管理系统.yaml"}, {"id": "shen-xin-fu-xing-wei-gan-zhi-xi-tong", "info": {"name": "深信服行为感知系统", "author": "cn-kali-team", "tags": "detect,tech,深信服行为感知系统", "severity": "info", "metadata": {"product": "深信服行为感知系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["loading...", "location.href = \"./ui/\";"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\深信服行为感知系统.yaml"}, {"id": "dian-qingmis-guan-li-xin-xi-xi-tong", "info": {"name": "点晴mis管理信息系统", "author": "cn-kali-team", "tags": "detect,tech,点晴mis管理信息系统", "severity": "info", "metadata": {"product": "点晴mis管理信息系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["837f7af9a5509a71122fe77505e4451c"]}]}], "_source_file": "00_unknown\\点晴mis管理信息系统.yaml"}, {"id": "ai-ban-gong-oa", "info": {"name": "爱办公-oa", "author": "cn-kali-team", "tags": "detect,tech,爱办公-oa", "severity": "info", "metadata": {"product": "爱办公-oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    爱办公app", "id=\"foot_version\">厦门容能科技有限公司"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\爱办公-oa.yaml"}, {"id": "lie-ying-an-quan-jin-shanv8-zhong-duan-an-quan-xi-tong", "info": {"name": "猎鹰安全-金山v8终端安全系统", "author": "cn-kali-team", "tags": "detect,tech,猎鹰安全-金山v8终端安全系统", "severity": "info", "metadata": {"product": "猎鹰安全-金山v8终端安全系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"anouncetext\">为了更好的保障企业内网的安全公司决定从即日起全面部署金山企业安全终端防护优化系统", "在线安装-v8+终端安全系统web控制台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\猎鹰安全-金山v8终端安全系统.yaml"}, {"id": "lie-ying-an-quan-jin-shan-du-ba-qi-ye-ban", "info": {"name": "猎鹰安全-金山毒霸企业版", "author": "cn-kali-team", "tags": "detect,tech,猎鹰安全-金山毒霸企业版", "severity": "info", "metadata": {"product": "猎鹰安全-金山毒霸企业版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"title\">关于全网部署金山毒霸企业版", "金山毒霸企业版"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\猎鹰安全-金山毒霸企业版.yaml"}, {"id": "lie-ying-an-quan-jin-shan-zhong-duan-an-quan-xi-tong", "info": {"name": "猎鹰安全-金山终端安全系统", "author": "cn-kali-team", "tags": "detect,tech,猎鹰安全-金山终端安全系统", "severity": "info", "metadata": {"product": "猎鹰安全-金山终端安全系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["数据库连接异常您可"], "case-insensitive": true}]}], "_source_file": "00_unknown\\猎鹰安全-金山终端安全系统.yaml"}, {"id": "rui-you-ying-yong-xu-ni-hua-xi-tong", "info": {"name": "瑞友应用虚拟化系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "瑞友应用虚拟化系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/client/caswebclient.exe", "casmain.xgi"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["瑞友天翼-应用虚拟化系统", "瑞友应用虚拟化系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\瑞友应用虚拟化系统.yaml"}, {"id": "rui-zhi-kang-cheng-vpn", "info": {"name": "瑞智康诚-vpn", "author": "cn-kali-team", "tags": "detect,tech,瑞智康诚-vpn", "severity": "info", "metadata": {"product": "瑞智康诚-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"col-md-12 col-xs-12 col-lg-12 external_signin_links\"", "class=\"no-js\">请先启用javascript"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\瑞智康诚-vpn.yaml"}, {"id": "yong-you-fe-xie-zuo-ban-gong-ping-tai", "info": {"name": "用友-fe协作办公平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "用友-fe协作办公平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["v_hedden", "v_show"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\用友-fe协作办公平台.yaml"}, {"id": "yong-you-u8+oa-xie-tong-guan-li-ruan-jian", "info": {"name": "用友u8+oa协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "用友u8+oa协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["用友u8+oa协同管理软件"], "case-insensitive": true}]}], "_source_file": "00_unknown\\用友u8+oa协同管理软件.yaml"}, {"id": "yong-you-u8+oa-ji-chu-ban", "info": {"name": "用友u8+oa基础版", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "用友u8+oa基础版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["b730edbe9bc850ae9f35dce11edd2c2d"]}, {"type": "word", "words": ["用友u8-oa"], "case-insensitive": true}]}], "_source_file": "00_unknown\\用友u8+oa基础版.yaml"}, {"id": "yong-you-zhi-yuan-a6-xie-tong-ban-gong-ruan-jian", "info": {"name": "用友致远a6协同办公软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "用友致远a6协同办公软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["images/login/a6flash.swf", "辅助程序安装"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["用友致远a6协同办公软件", "辅助程序安装"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\用友致远a6协同办公软件.yaml"}, {"id": "hao-feng-tong-xun-zhi-neng-fang-huo-qiang", "info": {"name": "皓峰通讯-智能防火墙", "author": "cn-kali-team", "tags": "detect,tech,皓峰通讯-智能防火墙", "severity": "info", "metadata": {"product": "皓峰通讯-智能防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" ", "皓峰防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\皓峰通讯-智能防火墙.yaml"}, {"id": "rui-feng-wang-yun-fang-huo-qiang", "info": {"name": "睿峰网云-防火墙", "author": "cn-kali-team", "tags": "detect,tech,睿峰网云-防火墙", "severity": "info", "metadata": {"product": "睿峰网云-防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["睿峰网云防火墙"], "case-insensitive": true}]}], "_source_file": "00_unknown\\睿峰网云-防火墙.yaml"}, {"id": "shi-hua-ying-ke-ssl-vpn-yuan-cheng-jie-ru-xi-tong", "info": {"name": "石化盈科-ssl-vpn-远程接入系统", "author": "cn-kali-team", "tags": "detect,tech,石化盈科-ssl-vpn-远程接入系统", "severity": "info", "metadata": {"product": "石化盈科-ssl-vpn-远程接入系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["src=\"new_style/placeholderfriend.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\石化盈科-ssl-vpn-远程接入系统.yaml"}, {"id": "diao-bao-bao-lei-ji-chan-pin", "info": {"name": "碉堡堡垒机-产品", "author": "cn-kali-team", "tags": "detect,tech,碉堡堡垒机-产品", "severity": "info", "metadata": {"product": "碉堡堡垒机-产品", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["碉堡堡垒机"], "case-insensitive": true}]}], "_source_file": "00_unknown\\碉堡堡垒机-产品.yaml"}, {"id": "ke-xin-ruan-jian-kxmail", "info": {"name": "科信软件-kxmail", "author": "cn-kali-team", "tags": "detect,tech,科信软件-kxmail", "severity": "info", "metadata": {"product": "科信软件-kxmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powered by #username  ", "nfr=\"true\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\科来-网络全流量安全分析系统.yaml"}, {"id": "ke-rong-aio", "info": {"name": "科荣 aio", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "科荣 aio", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/loginaction.do", "www.krrj.cn"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["494d1a9cf585c0b6b45462a224fccd90"]}]}], "_source_file": "00_unknown\\科荣 aio.yaml"}, {"id": "yi-dong-ban-gongoa", "info": {"name": "移动办公oa", "author": "cn-kali-team", "tags": "detect,tech,移动办公oa", "severity": "info", "metadata": {"product": "移动办公oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"pad-0 pt-2 pb-2 text-center tc-gray mt-1\"", "qccodewidth1 = document.getelementbyid(\"divqrcode\")"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\移动办公oa.yaml"}, {"id": "yi-dong-ban-gong-ji-gong-zuo-du-ban-xi-tong", "info": {"name": "移动办公及工作督办系统", "author": "cn-kali-team", "tags": "detect,tech,移动办公及工作督办系统", "severity": "info", "metadata": {"product": "移动办公及工作督办系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"icon iconxinan\"", "class=\"icon-container wrapper\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\移动办公及工作督办系统.yaml"}, {"id": "yi-dong-ban-gong-xi-tong", "info": {"name": "移动办公系统", "author": "cn-kali-team", "tags": "detect,tech,移动办公系统", "severity": "info", "metadata": {"product": "移动办公系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["window.location.href = '/ui/html/login.html';", "移动办公系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\移动办公系统.yaml"}, {"id": "jian-wang-ke-ji-fang-huo-qiang", "info": {"name": "简网科技-防火墙", "author": "cn-kali-team", "tags": "detect,tech,简网科技-防火墙", "severity": "info", "metadata": {"product": "简网科技-防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["action=\"/logincheck\"", "class=\"login-head clearfix\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\简网科技-防火墙.yaml"}, {"id": "zi-guang-dang-an-guan-li-xi-tong", "info": {"name": "紫光档案管理系统", "author": "cn-kali-team", "tags": "detect,tech,紫光档案管理系统", "severity": "info", "metadata": {"product": "紫光档案管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["3e2ee25dc73811fe2a697deefe447017"]}, {"type": "word", "words": ["紫光档案管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\紫光档案管理系统.yaml"}, {"id": "zi-guang-ji-tuan-zi-guang-fang-huo-qiang", "info": {"name": "紫光集团-紫光防火墙", "author": "cn-kali-team", "tags": "detect,tech,紫光集团-紫光防火墙", "severity": "info", "metadata": {"product": "紫光集团-紫光防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["name=\"adminlogin\" action=\"/cgi-bin/manageaccount\">", "紫光防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\紫光集团-紫光防火墙.yaml"}, {"id": "hong-fanioffice", "info": {"name": "红帆ioffice", "author": "cn-kali-team", "tags": "detect,tech,红帆ioffice", "severity": "info", "metadata": {"product": "红帆ioffice", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ioffice.net"], "case-insensitive": true}]}], "_source_file": "00_unknown\\红帆ioffice.yaml"}, {"id": "zhong-duan-an-quan-guan-li-xi-tong-bao-biao-xi-tong", "info": {"name": "终端安全管理系统报表系统", "author": "cn-kali-team", "tags": "detect,tech,终端安全管理系统报表系统", "severity": "info", "metadata": {"product": "终端安全管理系统报表系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["src=\"loadprogress.gif\" alt=\"loading\""], "case-insensitive": true}]}], "_source_file": "00_unknown\\终端安全管理系统报表系统.yaml"}, {"id": "zong-he-ban-gong-xi-tong", "info": {"name": "综合办公系统", "author": "cn-kali-team", "tags": "detect,tech,综合办公系统", "severity": "info", "metadata": {"product": "综合办公系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["var right = document.getelementbyid(\"irmmain\")"], "case-insensitive": true}]}], "_source_file": "00_unknown\\综合办公系统.yaml"}, {"id": "zong-he-an-fang-guan-li-ping-tai-hikvision-isecure-center", "info": {"name": "综合安防管理平台 hikvision-isecure-center", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "综合安防管理平台 hikvision-isecure-center", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/portal/conf/icon/logo.png", "nginxservice/v1/download/installrootcert.exe"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/portal/ui/static/favicon.ico", "/portal/ui/static/js/chunk-"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/isecure/ui/static/favicon.ico", "/isecure/ui/static/js/chunk-"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["/isecure/ui/favicon.ico", "/isecure/ui/static/js/"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["4209fe52e5c15345d0a1250f68a14d1e", "288e14bff231111157309a4cdf3d545e"]}, {"type": "word", "words": ["综合安防管理平台", "0x26e11001", "/portal/lida-icon/lidaicon.css"], "case-insensitive": true}]}], "_source_file": "00_unknown\\综合安防管理平台 hikvision-isecure-center.yaml"}, {"id": "wang-kang-ke-ji-ns-asg-an-quan-wang-guan", "info": {"name": "网康科技-ns-asg安全网关", "author": "cn-kali-team", "tags": "detect,tech,网康科技-ns-asg安全网关", "severity": "info", "metadata": {"product": "网康科技-ns-asg安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["400-678-3600", "client/thickbox.css"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网康科技-ns-asg安全网关.yaml"}, {"id": "wang-kang-ke-ji-xia-yi-dai-fang-huo-qiang", "info": {"name": "网康科技-下一代防火墙", "author": "cn-kali-team", "tags": "detect,tech,网康科技-下一代防火墙", "severity": "info", "metadata": {"product": "网康科技-下一代防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/images/dashboard/dashboard.png", "网康下一代防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网康科技-下一代防火墙.yaml"}, {"id": "wang-kang-ke-ji-hu-lian-wang-kong-zhi-wang-guan", "info": {"name": "网康科技-互联网控制网关", "author": "cn-kali-team", "tags": "detect,tech,网康科技-互联网控制网关", "severity": "info", "metadata": {"product": "网康科技-互联网控制网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["网康互联网控制网关", "网康科技互联网控制网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网康科技-互联网控制网关.yaml"}, {"id": "wang-xin-yun-she-bei", "info": {"name": "网心云设备", "author": "cn-kali-team", "tags": "detect,tech,网心云设备", "severity": "info", "metadata": {"product": "网心云设备", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["favicon.png", "网心云设备"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网心云设备.yaml"}, {"id": "wang-shen-vpn", "info": {"name": "网神-vpn", "author": "cn-kali-team", "tags": "detect,tech,网神-vpn", "severity": "info", "metadata": {"product": "网神-vpn", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["admin/js/virtual_keyboard.js", "src=\"images/login_logo.gif\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网神-vpn.yaml"}, {"id": "wang-shen-fang-huo-qiang", "info": {"name": "网神防火墙", "author": "cn-kali-team", "tags": "detect,tech,网神防火墙", "severity": "info", "metadata": {"product": "网神防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["3600防火墙", "网神secgate"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["resources/image/logo_header.png", "网神防火墙系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\网神防火墙.yaml"}, {"id": "lao-ban-you-ju-bossmail", "info": {"name": "老板邮局-bossmail", "author": "cn-kali-team", "tags": "detect,tech,老板邮局-bossmail", "severity": "info", "metadata": {"product": "老板邮局-bossmail", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powered by bossmail", "href=\"http://apps.microsoft.com/windows/zh-cn/app/bossmail/24f4bdb3-1bca-467e-9dd9-15a5d278aec6"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\老板邮局-bossmail.yaml"}, {"id": "lian-ruanit-an-quan-yun-wei-guan-li-xi-tong", "info": {"name": "联软it安全运维管理系统", "author": "cn-kali-team", "tags": "detect,tech,联软it安全运维管理系统", "severity": "info", "metadata": {"product": "联软it安全运维管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["联软it安全运维管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\联软it安全运维管理系统.yaml"}, {"id": "lian-ruan-zhun-ru", "info": {"name": "联软准入", "author": "cn-kali-team", "tags": "detect,tech,联软准入", "severity": "info", "metadata": {"product": "联软准入", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["leagsoft", "redirect", "网络准入"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\联软准入.yaml"}, {"id": "lian-ruan-ke-ji-it-an-quan-yun-wei-guan-li-xi-tong", "info": {"name": "联软科技-it安全运维管理系统", "author": "cn-kali-team", "tags": "detect,tech,联软科技-it安全运维管理系统", "severity": "info", "metadata": {"product": "联软科技-it安全运维管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["action=\"/manager/logincontroller.htm?act=login", "联软it安全运维管理系统"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\联软科技-it安全运维管理系统.yaml"}, {"id": "lian-tong-shi-ke-xin-xi-an-quan-zong-he-guan-li-ping-tai", "info": {"name": "联通时科-信息安全综合管理平台", "author": "cn-kali-team", "tags": "detect,tech,联通时科-信息安全综合管理平台", "severity": "info", "metadata": {"product": "联通时科-信息安全综合管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ccaq_kf@unisk.cn", "信息安全综合管理平台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\联通时科-信息安全综合管理平台.yaml"}, {"id": "zhi-yuan-a6+-xie-tong-guan-li-ruan-jian", "info": {"name": "致远a6+协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a6+协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/common/images/a6/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a6+协同管理软件.yaml"}, {"id": "zhi-yuan-a6-m-xie-tong-guan-li-ruan-jian", "info": {"name": "致远a6-m协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a6-m协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/yyoa/seeyonoa/common/js/jquery/jquery.js", "辅助程序安装"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["seeyonoa/ui/images/login/a6_s_name.png", "辅助安装程序"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["致远a6-m协同管理软件", "辅助安装程序"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a6-m协同管理软件.yaml"}, {"id": "zhi-yuan-a6-s-xie-tong-guan-li-ruan-jian", "info": {"name": "致远a6-s协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a6-s协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["致远a6-s协同管理软件", "/seeyon/common/images/a6s/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a6-s协同管理软件.yaml"}, {"id": "zhi-yuan-a6-v5-xie-tong-guan-li-ruan-jian-.a6u8-v12.5", "info": {"name": "致远a6-v5协同管理软件.a6u8 v12.5", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a6-v5协同管理软件.a6u8 v12.5", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/common/images/a6/faviconu8.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a6-v5协同管理软件.a6u8 v12.5.yaml"}, {"id": "zhi-yuan-a6s-xie-tong-guan-li-ruan-jian", "info": {"name": "致远a6s协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a6s协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["致远a6s协同管理软件"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a6s协同管理软件.yaml"}, {"id": "zhi-yuan-a8+-ji-tuan-ban", "info": {"name": "致远a8+集团版", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a8+集团版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["v8_0sp2_211020_2025240"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a8+集团版.yaml"}, {"id": "zhi-yuan-a8-m-qi-ye-ji-tuan-ban", "info": {"name": "致远a8-m企业集团版", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a8-m企业集团版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/user-data/images/login/login.gif", "/seeyon/common/skin/default/images/login.gif"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a8-m企业集团版.yaml"}, {"id": "zhi-yuan-a8-v5-xie-tong-guan-li-ruan-jian", "info": {"name": "致远a8-v5协同管理软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a8-v5协同管理软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["https://weixin.seeyon.com/mobilehelp.jsp?random=", "a8+集团版"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["common/js/passwdcheck.js?v=v5_6", "/seeyon/common/images/a8/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a8-v5协同管理软件.yaml"}, {"id": "zhi-yuan-a8n", "info": {"name": "致远a8n", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远a8n", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/common/images/a8n/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远a8n.yaml"}, {"id": "zhi-yuan-g6-n-duo-zu-zhi-ban", "info": {"name": "致远g6-n多组织版", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远g6-n多组织版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/common/images/g6n/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远g6-n多组织版.yaml"}, {"id": "zhi-yuan-g6-sc-duo-zu-zhi-ban", "info": {"name": "致远g6-sc多组织版", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远g6-sc多组织版", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/seeyon/common/images/g6sc/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远g6-sc多组织版.yaml"}, {"id": "zhi-yuan-m3-server-v2.0", "info": {"name": "致远m3 server v2.0", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远m3 server v2.0", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/mobile_portal/api/m3/core/server/service", "m3 server v2.0"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远m3 server v2.0.yaml"}, {"id": "zhi-yuan-oa-(-wei-zhi-ban-ben-)", "info": {"name": "致远oa (未知版本)", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远oa (未知版本)", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["seeyon.ui.core-debug.js", "common/js/jquery.json-debug.js"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["weixin.seeyon.com/mobilehelp.jsp?random=", "/seeyon/common/js/passwdcheck.js?v="], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\致远oa (未知版本).yaml"}, {"id": "zhi-yuan-ufida-nc-xie-tong-oa-v5.71", "info": {"name": "致远ufida nc协同-oa v5.71", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远ufida nc协同-oa v5.71", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["v3_20sp1_2011-12-31", "/seeyon/common/js/v3x.js"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\致远ufida nc协同-oa v5.71.yaml"}, {"id": "zhi-yuan-xie-chuang-a6-xie-tong-ban-gong-ruan-jian", "info": {"name": "致远协创a6协同办公软件", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远协创a6协同办公软件", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["致远协创a6协同办公软件"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远协创a6协同办公软件.yaml"}, {"id": "zhi-yuan-xie-tong-ban-gong-ping-tai-v6.0", "info": {"name": "致远协同办公平台 v6.0", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "致远协同办公平台 v6.0", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/qiyun/common/images/q5/favicon.ico"], "case-insensitive": true}]}], "_source_file": "00_unknown\\致远协同办公平台 v6.0.yaml"}, {"id": "lan-lingeis-zhi-hui-xie-tong-ping-tai", "info": {"name": "蓝凌eis智慧协同平台", "author": "cn-kali-team", "tags": "detect,tech,蓝凌eis智慧协同平台", "severity": "info", "metadata": {"product": "蓝凌eis智慧协同平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/scripts/jquery.landray.common.js", "蓝凌软件"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\蓝凌eis智慧协同平台.yaml"}, {"id": "lan-hai-zhuo-yue-ji-fei-guan-li-xi-tong", "info": {"name": "蓝海卓越计费管理系统", "author": "cn-kali-team", "tags": "detect,tech,蓝海卓越计费管理系统", "severity": "info", "metadata": {"product": "蓝海卓越计费管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [""], "case-insensitive": true}]}], "_source_file": "00_unknown\\蓝海卓越计费管理系统.yaml"}, {"id": "lan-dun-wen-dang-an-quan-guan-li-xi-tong", "info": {"name": "蓝盾-文档安全管理系统", "author": "cn-kali-team", "tags": "detect,tech,蓝盾-文档安全管理系统", "severity": "info", "metadata": {"product": "蓝盾-文档安全管理系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["蓝盾文档安全管理系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\蓝盾-文档安全管理系统.yaml"}, {"id": "lan-dun-fang-huo-qiang", "info": {"name": "蓝盾-防火墙", "author": "cn-kali-team", "tags": "detect,tech,蓝盾-防火墙", "severity": "info", "metadata": {"product": "蓝盾-防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["class=\"banquan\">蓝盾信息安全技术股份有限公司", "防火墙"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\蓝盾-防火墙.yaml"}, {"id": "feng-wang-qi-ye-liu-kong-yun-lu-you-qi", "info": {"name": "蜂网企业流控云路由器", "author": "cn-kali-team", "tags": "detect,tech,蜂网企业流控云路由器", "severity": "info", "metadata": {"product": "蜂网企业流控云路由器", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ifw8", "login", "企业级流控云路由器"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\蜂网企业流控云路由器.yaml"}, {"id": "rong-zhi-xing-hua-wu-lian-wang-wang-guan", "info": {"name": "融智兴华-物联网网关", "author": "cn-kali-team", "tags": "detect,tech,融智兴华-物联网网关", "severity": "info", "metadata": {"product": "融智兴华-物联网网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["物联网网关-北京融智兴华科技有限公司"], "case-insensitive": true}]}], "_source_file": "00_unknown\\融智兴华-物联网网关.yaml"}, {"id": "zi-chan-deng-ta-xi-tong", "info": {"name": "资产灯塔系统", "author": "cn-kali-team", "tags": "detect,tech,资产灯塔系统", "severity": "info", "metadata": {"product": "资产灯塔系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["资产灯塔系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\资产灯塔系统.yaml"}, {"id": "ruan-jiao-huan-fang-huo-qiang", "info": {"name": "软交换防火墙", "author": "cn-kali-team", "tags": "detect,tech,软交换防火墙", "severity": "info", "metadata": {"product": "软交换防火墙", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["name=\"secretkey\" id=\"secretkey\"", "name=\"token_code\"placeholder=\"令牌口令\""], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\软交换防火墙.yaml"}, {"id": "ruan-hong-oa", "info": {"name": "软虹oa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "软虹oa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["2012 ruaho 版权所有:北京软虹科技.", "user_passwords"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["5d01f90a8f3fed7c83152bfce0403c2f"]}]}], "_source_file": "00_unknown\\软虹oa.yaml"}, {"id": "da-guan-rpa", "info": {"name": "达观rpa", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "达观rpa", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["e2e2ba13339c2fea220f8b4fa6c32c0d"]}, {"type": "word", "words": ["rpa"], "case-insensitive": true}]}], "_source_file": "00_unknown\\达观rpa.yaml"}, {"id": "yun-wei-an-quan-guan-li-ping-tai", "info": {"name": "运维安全管理平台", "author": "cn-kali-team", "tags": "detect,tech,运维安全管理平台", "severity": "info", "metadata": {"product": "运维安全管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["usm", "运维安全管理平台"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\运维安全管理平台.yaml"}, {"id": "dao-er-yun--yi-lian-tong-zhi-hui-guan-li-ping-tai", "info": {"name": "道尔云 一脸通智慧管理平台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "道尔云 一脸通智慧管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ashxrequest/systemindex/systemlogin.ashx", "view/userreserved/userreservedtest.aspx"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["当前密码安全性不好,请修改密码!", "view/systemmng/pwdchanges.aspx"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["location: /login.aspx?returnurl=%2f"], "part": "header", "case-insensitive": true}]}], "_source_file": "00_unknown\\道尔云 一脸通智慧管理平台.yaml"}, {"id": "jiu-dian-kuan-dai-yun-ying-xi-tong", "info": {"name": "酒店宽带运营系统", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "酒店宽带运营系统", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /manager/login.php"], "part": "header", "case-insensitive": true}, {"type": "favicon", "hash": ["af545cc70432a9945c33314e9b6546e7"]}, {"type": "word", "words": ["酒店宽带运营系统"], "case-insensitive": true}]}], "_source_file": "00_unknown\\酒店宽带运营系统.yaml"}, {"id": "jin-he-xie-tong-guan-li-ping-tai", "info": {"name": "金和协同管理平台", "author": "cn-kali-team", "tags": "detect,tech,金和协同管理平台", "severity": "info", "metadata": {"product": "金和协同管理平台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["jhsoft.web.login", "password.aspx"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["c6/jhsoft.web.login", "closewindownoask"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["jinher network", "js/passwordcommon.js", "js/passwordnew.js"], "case-insensitive": true}]}], "_source_file": "00_unknown\\金和协同管理平台.yaml"}, {"id": "jin-shantimeon-yun-sha-du", "info": {"name": "金山timeon云杀毒", "author": "cn-kali-team", "tags": "detect,tech,金山timeon云杀毒", "severity": "info", "metadata": {"product": "金山timeon云杀毒", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["timeon", "iepngfix/iepngfix_tilebg.js"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\金山timeon云杀毒.yaml"}, {"id": "jin-pan-tu-shu-guan-wei-xin-guan-li-hou-tai", "info": {"name": "金盘图书馆微信管理后台", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "金盘图书馆微信管理后台", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["vendor/modules/angular-file-upload/angular-file-upload.js", "js/config.js"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["0488faca4c19046b94d07c3ee83cf9d6"]}]}], "_source_file": "00_unknown\\金盘图书馆微信管理后台.yaml"}, {"id": "jin-die-apusic-ying-yong-fu-wu-qi", "info": {"name": "金蝶apusic应用服务器", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "金蝶apusic应用服务器", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: apusic application server"], "part": "header", "case-insensitive": true}, {"type": "word", "words": ["

    "], "case-insensitive": true}]}], "_source_file": "00_unknown\\金蝶apusic应用服务器.yaml"}, {"id": "jin-die-yun-xing-kong", "info": {"name": "金蝶云星空", "author": "cn-kali-team", "tags": "detect,tech,金蝶云星空", "severity": "info", "metadata": {"product": "金蝶云星空", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/clientbin/kingdee.bos.xpf.app.xap", "html5/content/themes/kdcss.min.css"], "case-insensitive": true}]}], "_source_file": "00_unknown\\金蝶云星空.yaml"}, {"id": "ming-fei-mcms", "info": {"name": "铭飞mcms", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "铭飞mcms", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/mcms/search.do\" method=", "static/plugins/ms/1.0.0/ms.js", "铭飞mcms", "/mdiy/formdata/save.do"], "case-insensitive": true}]}], "_source_file": "00_unknown\\铭飞mcms.yaml"}, {"id": "rui-jie-rg-ew1200g", "info": {"name": "锐捷-rg-ew1200g", "author": "cn-kali-team", "tags": "detect,tech,锐捷-rg-ew1200g", "severity": "info", "metadata": {"product": "锐捷-rg-ew1200g", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/js/app", "/static/img/title.ico", "锐捷"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\锐捷-rg-ew1200g.yaml"}, {"id": "a-li-ba-baotter-manager", "info": {"name": "阿里巴巴otter-manager", "author": "cn-kali-team", "tags": "detect,tech,阿里巴巴otter-manager", "severity": "info", "metadata": {"product": "阿里巴巴otter-manager", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["otter manager", "channellist"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\阿里巴巴otter-manager.yaml"}, {"id": "fei-yu-xing-xia-yi-dai-fang-huo-qiang-an-quan-wang-guan", "info": {"name": "飞鱼星-下一代防火墙安全网关", "author": "cn-kali-team", "tags": "detect,tech,飞鱼星-下一代防火墙安全网关", "severity": "info", "metadata": {"product": "飞鱼星-下一代防火墙安全网关", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["href=\"/css/cover_admin.css\"", "下一代防火墙安全网关"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\飞鱼星-下一代防火墙安全网关.yaml"}, {"id": "fei-yu-xing-an-quan-she-bei", "info": {"name": "飞鱼星-安全设备", "author": "cn-kali-team", "tags": "detect,tech,飞鱼星-安全设备", "severity": "info", "metadata": {"product": "飞鱼星-安全设备", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cgi-bin/login", "languagechange"], "condition": "and", "case-insensitive": true}]}], "_source_file": "00_unknown\\飞鱼星-安全设备.yaml"}, {"id": "123solar", "info": {"name": "123solar", "author": "cn-kali-team", "tags": "detect,tech,123solar", "severity": "info", "metadata": {"fofa-query": ["title=\"123solar\""], "product": "123solar", "shodan-query": ["title:\"123solar\""], "vendor": "123solar", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>123solar.*?"]}]}], "_source_file": "123solar\\123solar.yaml"}, {"id": "3cx", "info": {"name": "3cx", "author": "cn-kali-team", "tags": "detect,tech,3cx", "severity": "info", "metadata": {"product": "3cx", "shodan-query": ["http.title:\"3cx phone system management console\""], "vendor": "3cx", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>3cx phone system management console.*?"]}]}], "_source_file": "3cx\\3cx.yaml"}, {"id": "74cms", "info": {"name": "74cms", "author": "cn-kali-team", "tags": "detect,tech,74cms", "severity": "info", "metadata": {"product": "74cms", "vendor": "74cms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/templates/default/css/common.css", "content=\"74cms.com", "content=\"74cms.com\"", "content=\"骑士cms", "powered by ]*>caseaware.*?"]}]}], "_source_file": "a360inc\\caseaware.yaml"}, {"id": "wordpress_toolbar", "info": {"name": "wordpress_toolbar", "author": "cn-kali-team", "tags": "detect,tech,wordpress_toolbar", "severity": "info", "metadata": {"fofa-query": ["body=/wp-content/plugins/wordpress-toolbar/"], "product": "wordpress_toolbar", "shodan-query": ["http.html:/wp-content/plugins/wordpress-toolbar/"], "vendor": "abhinavsingh", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wp-content/plugins/wordpress-toolbar/"], "case-insensitive": true}]}], "_source_file": "abhinavsingh\\wordpress_toolbar.yaml"}, {"id": "acmailer,acmailer_db", "info": {"name": "acmailer,acmailer_db", "author": "cn-kali-team", "tags": "detect,tech,acmailer,acmailer_db", "severity": "info", "metadata": {"fofa-query": ["title=\"acmailer4.0\""], "product": "acmailer,acmailer_db", "shodan-query": ["title=\"acmailer4.0\""], "vendor": "acmailer", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["title=\"acmailer4.0"]}, {"type": "regex", "regex": ["(?mi)]*>acmailer4.0.*?"]}]}], "_source_file": "acmailer\\acmailer,acmailer_db.yaml"}, {"id": "mautic", "info": {"name": "mautic", "author": "cn-kali-team", "tags": "detect,tech,mautic", "severity": "info", "metadata": {"fofa-query": ["title=\"mautic\""], "google-query": ["intitle:\"mautic\""], "product": "mautic", "shodan-query": ["title:\"mautic\"", "http.title:\"mautic\""], "vendor": "acquia", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>mautic.*?"]}]}], "_source_file": "acquia\\mautic.yaml"}, {"id": "camera_firmware", "info": {"name": "camera_firmware", "author": "cn-kali-team", "tags": "detect,tech,camera_firmware", "severity": "info", "metadata": {"fofa-query": ["app=\"acti-视频监控\""], "product": "camera_firmware", "shodan-query": ["title:\"web configurator\""], "vendor": "acti", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>web configurator.*?"]}]}], "_source_file": "acti\\camera_firmware.yaml"}, {"id": "adiscon-loganalyzer", "info": {"name": "adiscon-loganalyzer", "author": "cn-kali-team", "tags": "detect,tech,adiscon-loganalyzer", "severity": "info", "metadata": {"product": "loganalyzer", "vendor": "adiscon", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["adiscon gmbh"], "case-insensitive": true}]}], "_source_file": "adiscon\\loganalyzer.yaml"}, {"id": "adminer", "info": {"name": "adminer", "author": "cn-kali-team", "tags": "detect,tech,adminer", "severity": "info", "metadata": {"product": "adminer", "vendor": "adminer", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["://www.adminer.org/' target=\"_blank\" rel=\"noreferrer"], "case-insensitive": true}]}], "_source_file": "adminer\\adminer.yaml"}, {"id": "coldfusion", "info": {"name": "coldfusion", "author": "cn-kali-team", "tags": "detect,tech,coldfusion", "severity": "info", "metadata": {"fofa-query": ["app=\"adobe-coldfusion\"", "title=\"coldfusion administrator login\""], "google-query": ["intitle:\"coldfusion administrator login\""], "product": "coldfusion", "shodan-query": ["http.component:\"adobe coldfusion\"", "http.title:\"coldfusion administrator login\"", "cpe:\"cpe:2.3:a:adobe:coldfusion\""], "vendor": "adobe", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>coldfusion administrator login.*?"]}]}], "_source_file": "adobe\\coldfusion.yaml"}, {"id": "commerce", "info": {"name": "commerce", "author": "cn-kali-team", "tags": "detect,tech,commerce", "severity": "info", "metadata": {"product": "commerce", "shodan-query": ["x-magento-tags"], "vendor": "adobe", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["x-magento-tags"], "case-insensitive": true}]}], "_source_file": "adobe\\commerce.yaml"}, {"id": "adobe-connect", "info": {"name": "adobe-connect", "author": "cn-kali-team", "tags": "detect,tech,adobe-connect", "severity": "info", "metadata": {"product": "connect", "vendor": "adobe", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/common/scripts/showcontent.js"], "case-insensitive": true}]}], "_source_file": "adobe\\connect.yaml"}, {"id": "experience_manager", "info": {"name": "experience_manager", "author": "cn-kali-team", "tags": "detect,tech,experience_manager", "severity": "info", "metadata": {"fofa-query": ["title=\"aem sign in\""], "google-query": ["intitle:\"aem sign in\""], "product": "experience_manager", "shodan-query": ["http.title:\"aem sign in\"", "http.component:\"adobe experience manager\"", "cpe:\"cpe:2.3:a:adobe:experience_manager\""], "vendor": "adobe", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>aem sign in.*?"]}]}], "_source_file": "adobe\\experience_manager.yaml"}, {"id": "experience_manager_cloud_service", "info": {"name": "experience_manager_cloud_service", "author": "cn-kali-team", "tags": "detect,tech,experience_manager_cloud_service", "severity": "info", "metadata": {"product": "experience_manager_cloud_service", "shodan-query": ["http.title:\"aem sign in\"", "http.component:\"adobe experience manager\""], "vendor": "adobe", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>aem sign in.*?"]}]}], "_source_file": "adobe\\experience_manager_cloud_service.yaml"}, {"id": "adobe-magento", "info": {"name": "adobe-magento", "author": "cn-kali-team", "tags": "detect,tech,adobe-magento", "severity": "info", "metadata": {"product": "adobe-magento", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/skin/frontend/", "blank_img"], "case-insensitive": true}]}], "_source_file": "adobe\\magento.yaml"}, {"id": "r-seenet", "info": {"name": "r-seenet", "author": "cn-kali-team", "tags": "detect,tech,r-seenet", "severity": "info", "metadata": {"fofa-query": ["body=\"r-seenet\""], "product": "r-seenet", "shodan-query": ["http.html:\"r-seenet\""], "vendor": "advantech", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["r-seenet"], "case-insensitive": true}]}], "_source_file": "advantech\\r-seenet.yaml"}, {"id": "afterlogic-aurora-&-webmail", "info": {"name": "afterlogic aurora & webmail", "author": "cn-kali-team", "tags": "detect,tech,afterlogic aurora & webmail", "severity": "info", "metadata": {"fofa-query": ["x-server: afterlogicdavserver"], "product": "afterlogic aurora & webmail", "vendor": "afterlogic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["x-server: afterlogicdavserver"], "case-insensitive": true}]}], "_source_file": "afterlogic\\afterlogic aurora & webmail.yaml"}, {"id": "aurora", "info": {"name": "aurora", "author": "cn-kali-team", "tags": "detect,tech,aurora", "severity": "info", "metadata": {"fofa-query": ["x-server: afterlogicdavserver"], "product": "aurora", "vendor": "afterlogic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["x-server: afterlogicdavserver"], "case-insensitive": true}]}], "_source_file": "afterlogic\\aurora.yaml"}, {"id": "cockpit", "info": {"name": "cockpit", "author": "cn-kali-team", "tags": "detect,tech,cockpit", "severity": "info", "metadata": {"fofa-query": ["icon_hash=688609340", "body=\"cockpit\""], "product": "cockpit", "shodan-query": ["http.favicon.hash:688609340", "http.html:\"cockpit\"", "html:\"cockpit\""], "vendor": "agentejo", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cockpit"], "case-insensitive": true}, {"type": "favicon", "hash": ["688609340"]}]}], "_source_file": "agentejo\\cockpit.yaml"}, {"id": "post-timeline", "info": {"name": "post-timeline", "author": "cn-kali-team", "tags": "detect,tech,post-timeline", "severity": "info", "metadata": {"fofa-query": ["body=\"wp-content/plugins/post-timeline/\""], "product": "post-timeline", "shodan-query": ["http.html:\"wp-content/plugins/post-timeline/\""], "vendor": "agilelogix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["wp-content/plugins/post-timeline/"], "case-insensitive": true}]}], "_source_file": "agilelogix\\post-timeline.yaml"}, {"id": "aim", "info": {"name": "aim", "author": "cn-kali-team", "tags": "detect,tech,aim", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-1047157256\""], "product": "aim", "vendor": "aimstack", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1047157256"]}]}], "_source_file": "aimstack\\aim.yaml"}, {"id": "cloudtest", "info": {"name": "cloudtest", "author": "cn-kali-team", "tags": "detect,tech,cloudtest", "severity": "info", "metadata": {"product": "cloudtest", "shodan-query": ["html:\"akamai cloudtest\""], "vendor": "akamai", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["akamai cloudtest"], "case-insensitive": true}]}], "_source_file": "akamai\\cloudtest.yaml"}, {"id": "omnipcx", "info": {"name": "omnipcx", "author": "cn-kali-team", "tags": "detect,tech,omnipcx", "severity": "info", "metadata": {"fofa-query": ["app=\"alcatel_lucent-omnipcx-enterprise\"", "title=\"omnipcx for enterprise\""], "google-query": ["intitle:\"omnipcx for enterprise\""], "product": "omnipcx", "shodan-query": ["title:\"omnipcx for enterprise\"", "http.title:\"omnipcx for enterprise\""], "vendor": "alcatel-lucent", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>omnipcx for enterprise.*?"]}]}], "_source_file": "alcatel-lucent\\omnipcx.yaml"}, {"id": "alibaba-fastjson", "info": {"name": "alibaba-fastjson", "author": "cn-kali-team", "tags": "detect,tech,alibaba-fastjson", "severity": "info", "metadata": {"product": "fastjson", "vendor": "alibaba", "verified": true}}, "http": [{"method": "POST", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["fastjson", "version"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["com.alibaba.fastjson.jsonexception", "illegal identifier : @pos 1, json : {@type:java.lang.autocloseable", "js/base/fastjson", "syntax error, expect {, actual error, pos 0", "unclosed string", "var json = json.parse"], "case-insensitive": true}]}], "_source_file": "alibaba\\fastjson.yaml"}, {"id": "alibaba-nacos", "info": {"name": "alibaba-nacos", "author": "cn-kali-team", "tags": "detect,tech,alibaba-nacos", "severity": "info", "metadata": {"product": "nacos", "vendor": "alibaba", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/", "{{BaseURL}}/nacos/"], "matchers": [{"type": "word", "words": ["nacos"], "case-insensitive": true}]}], "_source_file": "alibaba\\nacos.yaml"}, {"id": "opencms", "info": {"name": "opencms", "author": "cn-kali-team", "tags": "detect,tech,opencms", "severity": "info", "metadata": {"fofa-query": ["title=\"opencms\""], "google-query": ["intitle:\"opencms\""], "product": "opencms", "shodan-query": ["/opencms/", "http.title:\"opencms\"", "cpe:\"cpe:2.3:a:alkacon:opencms\"", "title:\"opencms\""], "vendor": "alkacon", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/opencms/"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*>opencms.*?"]}]}], "_source_file": "alkacon\\opencms.yaml"}, {"id": "ipm-721s_firmware", "info": {"name": "ipm-721s_firmware", "author": "cn-kali-team", "tags": "detect,tech,ipm-721s_firmware", "severity": "info", "metadata": {"fofa-query": ["amcrest", "body=\"amcrest\""], "product": "ipm-721s_firmware", "shodan-query": ["html:\"amcrest\"", "http.html:\"amcrest\""], "vendor": "amcrest", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["amcrest"], "case-insensitive": true}]}], "_source_file": "amcrest\\ipm-721s_firmware.yaml"}, {"id": "aj-report", "info": {"name": "aj-report", "author": "cn-kali-team", "tags": "detect,tech,aj-report", "severity": "info", "metadata": {"fofa-query": ["title=\"aj-report\""], "product": "aj-report", "vendor": "anji-plus", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>aj-report.*?"]}]}], "_source_file": "anji-plus\\aj-report.yaml"}, {"id": "report", "info": {"name": "report", "author": "cn-kali-team", "tags": "detect,tech,report", "severity": "info", "metadata": {"fofa-query": ["app=\"aj-report\""], "product": "report", "shodan-query": ["http.title:\"aj-report\""], "vendor": "anji-plus", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>aj-report.*?"]}]}], "_source_file": "anji-plus\\report.yaml"}, {"id": "apache-activemq", "info": {"name": "apache-activemq", "author": "cn-kali-team", "tags": "detect,tech,apache-activemq", "severity": "info", "metadata": {"product": "activemq", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["apache activemq"], "case-insensitive": true}]}], "_source_file": "apache\\activemq.yaml"}, {"id": "activemq_apollo", "info": {"name": "activemq_apollo", "author": "cn-kali-team", "tags": "detect,tech,activemq_apollo", "severity": "info", "metadata": {"product": "activemq_apollo", "shodan-query": ["title:\"apache apollo\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>apache apollo.*?"]}]}], "_source_file": "apache\\activemq_apollo.yaml"}, {"id": "apache-airflow", "info": {"name": "apache-airflow", "author": "cn-kali-team", "tags": "detect,tech,apache-airflow", "severity": "info", "metadata": {"product": "airflow", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["airflow", "airflow", "src=\"/static/pin_100.png\""], "case-insensitive": true}]}], "_source_file": "apache\\airflow.yaml"}, {"id": "apache-ambari", "info": {"name": "apache-ambari", "author": "cn-kali-team", "tags": "detect,tech,apache-ambari", "severity": "info", "metadata": {"product": "ambari", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["\"/licenses/notice.txt\"", "ambari"], "condition": "and", "case-insensitive": true}]}], "_source_file": "apache\\ambari.yaml"}, {"id": "apache-apisix", "info": {"name": "apache-apisix", "author": "cn-kali-team", "tags": "detect,tech,apache-apisix", "severity": "info", "metadata": {"product": "apisix", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content-type: text/plain", "server: nginx"], "part": "header", "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["content-type: text/plain", "server: openresty"], "part": "header", "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["content-type: text/plain", "server: tengine"], "part": "header", "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["{\"error_msg\":\"404 route not found\"}"], "case-insensitive": true}, {"type": "word", "words": ["server: apisix"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\apisix.yaml"}, {"id": "apache-axis2", "info": {"name": "apache-axis2", "author": "cn-kali-team", "tags": "detect,tech,apache-axis2", "severity": "info", "metadata": {"product": "axis2", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["axis2-admin", "axis2-web"], "condition": "and", "case-insensitive": true}]}], "_source_file": "apache\\axis2.yaml"}, {"id": "cloudstack", "info": {"name": "cloudstack", "author": "cn-kali-team", "tags": "detect,tech,cloudstack", "severity": "info", "metadata": {"fofa-query": ["app=\"apache-cloudstack\""], "product": "cloudstack", "shodan-query": ["http.title:\"apache cloudstack\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>apache cloudstack.*?"]}]}], "_source_file": "apache\\cloudstack.yaml"}, {"id": "apache-cocoon", "info": {"name": "apache-cocoon", "author": "cn-kali-team", "tags": "detect,tech,apache-cocoon", "severity": "info", "metadata": {"product": "cocoon", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["x-cocoon-version:"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\cocoon.yaml"}, {"id": "apache-couchdb", "info": {"name": "apache-couchdb", "author": "cn-kali-team", "tags": "detect,tech,apache-couchdb", "severity": "info", "metadata": {"product": "couchdb", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: couchdb", "x-couchdb-body-time: 0"], "part": "header", "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["2ab2aae806e8393b70970b2eaace82e0"]}]}], "_source_file": "apache\\couchdb.yaml"}, {"id": "dolphinscheduler", "info": {"name": "dolphinscheduler", "author": "cn-kali-team", "tags": "detect,tech,dolphinscheduler", "severity": "info", "metadata": {"product": "dolphinscheduler", "shodan-query": ["http.title:\"dolphinscheduler\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>dolphinscheduler.*?"]}]}], "_source_file": "apache\\dolphinscheduler.yaml"}, {"id": "doris", "info": {"name": "doris", "author": "cn-kali-team", "tags": "detect,tech,doris", "severity": "info", "metadata": {"fofa-query": ["icon_hash=24048806"], "product": "doris", "shodan-query": ["http.favicon.hash:\"24048806\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["24048806"]}]}], "_source_file": "apache\\doris.yaml"}, {"id": "apache-druid", "info": {"name": "apache-druid", "author": "cn-kali-team", "tags": "detect,tech,apache-druid", "severity": "info", "metadata": {"product": "druid", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"apache druid console\""], "case-insensitive": true}]}], "_source_file": "apache\\druid.yaml"}, {"id": "apache-dubbo", "info": {"name": "apache-dubbo", "author": "cn-kali-team", "tags": "detect,tech,apache-dubbo", "severity": "info", "metadata": {"product": "dubbo", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["www-authenticate: basic realm=\"dubbo\""], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\dubbo.yaml"}, {"id": "apache-flink", "info": {"name": "apache-flink", "author": "cn-kali-team", "tags": "detect,tech,apache-flink", "severity": "info", "metadata": {"product": "flink", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["\"apacheapache flink web dashboard"], "case-insensitive": true}]}], "_source_file": "apache\\flink.yaml"}, {"id": "apache-hadoop", "info": {"name": "apache-hadoop", "author": "cn-kali-team", "tags": "detect,tech,apache-hadoop", "severity": "info", "metadata": {"product": "hadoop", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/static/hadoop-st.png", "parsehadoopprogress"], "condition": "and", "case-insensitive": true}]}], "_source_file": "apache\\hadoop.yaml"}, {"id": "apache-http", "info": {"name": "apache-http", "author": "cn-kali-team", "tags": "detect,tech,apache-http", "severity": "info", "metadata": {"product": "http_server", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: apache"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\http_server.yaml"}, {"id": "hugegraph", "info": {"name": "hugegraph", "author": "cn-kali-team", "tags": "detect,tech,hugegraph", "severity": "info", "metadata": {"fofa-query": ["title=\"hugegraph\""], "product": "hugegraph", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>hugegraph.*?"]}]}], "_source_file": "apache\\hugegraph.yaml"}, {"id": "inlong", "info": {"name": "inlong", "author": "cn-kali-team", "tags": "detect,tech,inlong", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"1155196680\""], "product": "inlong", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["1155196680"]}]}], "_source_file": "apache\\inlong.yaml"}, {"id": "kafka_connect", "info": {"name": "kafka_connect", "author": "cn-kali-team", "tags": "detect,tech,kafka_connect", "severity": "info", "metadata": {"fofa-query": ["body=\"apache druid\""], "product": "kafka_connect", "shodan-query": ["html:\"apache druid\"", "http.html:\"apache druid\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["apache druid"], "case-insensitive": true}]}], "_source_file": "apache\\kafka_connect.yaml"}, {"id": "karaf", "info": {"name": "karaf", "author": "cn-kali-team", "tags": "detect,tech,karaf", "severity": "info", "metadata": {"product": "karaf", "shodan-query": ["realm=\"karaf\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["realm=\"karaf"], "case-insensitive": true}]}], "_source_file": "apache\\karaf.yaml"}, {"id": "apache-kylin", "info": {"name": "apache-kylin", "author": "cn-kali-team", "tags": "detect,tech,apache-kylin", "severity": "info", "metadata": {"product": "kylin", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "href=\"/kylin/\""], "case-insensitive": true}]}], "_source_file": "apache\\kylin.yaml"}, {"id": "apache-mesos", "info": {"name": "apache-mesos", "author": "cn-kali-team", "tags": "detect,tech,apache-mesos", "severity": "info", "metadata": {"product": "mesos", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["\"apache"], "case-insensitive": true}]}], "_source_file": "apache\\mesos.yaml"}, {"id": "nifi", "info": {"name": "nifi", "author": "cn-kali-team", "tags": "detect,tech,nifi", "severity": "info", "metadata": {"product": "nifi", "shodan-query": ["title:\"nifi\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>nifi.*?"]}, {"type": "word", "words": ["/nifi"], "case-insensitive": true}]}], "_source_file": "apache\\nifi.yaml"}, {"id": "apache-ofbiz", "info": {"name": "apache-ofbiz", "author": "cn-kali-team", "tags": "detect,tech,apache-ofbiz", "severity": "info", "metadata": {"product": "ofbiz", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powered by ofbiz"], "case-insensitive": true}]}], "_source_file": "apache\\ofbiz.yaml"}, {"id": "ranger", "info": {"name": "ranger", "author": "cn-kali-team", "tags": "detect,tech,ranger", "severity": "info", "metadata": {"product": "ranger", "shodan-query": ["http.title:\"ranger - sign in\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>ranger - sign in.*?"]}, {"type": "word", "words": ["\"ranger"], "case-insensitive": true}]}], "_source_file": "apache\\ranger.yaml"}, {"id": "shardingsphere_elasticjob-ui", "info": {"name": "shardingsphere_elasticjob-ui", "author": "cn-kali-team", "tags": "detect,tech,shardingsphere_elasticjob-ui", "severity": "info", "metadata": {"fofa-query": ["icon_hash=816588900"], "product": "shardingsphere_elasticjob-ui", "shodan-query": ["http.favicon.hash:816588900"], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["816588900"]}]}], "_source_file": "apache\\shardingsphere_elasticjob-ui.yaml"}, {"id": "apache-shiro", "info": {"name": "apache-shiro", "author": "cn-kali-team", "tags": "detect,tech,apache-shiro", "severity": "info", "metadata": {"product": "shiro", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "headers": {"Cookie": "rememberMe=admin;rememberMe-K=admin"}, "cookie-reuse": true, "matchers": [{"type": "word", "words": [" shiro"], "case-insensitive": true}, {"type": "word", "words": ["set-cookie: rememberme"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\shiro.yaml"}, {"id": "apache-skywalking", "info": {"name": "apache-skywalking", "author": "cn-kali-team", "tags": "detect,tech,apache-skywalking", "severity": "info", "metadata": {"product": "skywalking", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["sorry but skywalking doesn't work"], "case-insensitive": true}]}], "_source_file": "apache\\skywalking.yaml"}, {"id": "apache-solr", "info": {"name": "apache-solr", "author": "cn-kali-team", "tags": "detect,tech,apache-solr", "severity": "info", "metadata": {"product": "solr", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["location: /solr/"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\solr.yaml"}, {"id": "spark", "info": {"name": "spark", "author": "cn-kali-team", "tags": "detect,tech,spark", "severity": "info", "metadata": {"fofa-query": ["body=\"/apps/imt/html/\"", "title=\"spark master at\""], "google-query": ["intitle:\"spark master at\""], "product": "spark", "shodan-query": ["title:\"spark master at\"", "http.html:\"/apps/imt/html/\"", "http.title:\"spark master at\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/apps/imt/html/"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*>spark master at.*?"]}]}], "_source_file": "apache\\spark.yaml"}, {"id": "streampark", "info": {"name": "streampark", "author": "cn-kali-team", "tags": "detect,tech,streampark", "severity": "info", "metadata": {"product": "streampark", "shodan-query": ["title:\"apache streampark\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>apache streampark.*?"]}]}], "_source_file": "apache\\streampark.yaml"}, {"id": "streampipes", "info": {"name": "streampipes", "author": "cn-kali-team", "tags": "detect,tech,streampipes", "severity": "info", "metadata": {"fofa-query": ["title=\"apache streampipes\""], "product": "streampipes", "shodan-query": ["http.title:\"apache streampipes\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>apache streampipes.*?"]}]}], "_source_file": "apache\\streampipes.yaml"}, {"id": "apache-struts", "info": {"name": "apache-struts", "author": "cn-kali-team", "tags": "detect,tech,apache-struts", "severity": "info", "metadata": {"product": "struts", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["superset", "src=\"/static/assets/images/superset-logo-"], "case-insensitive": true}]}], "_source_file": "apache\\superset.yaml"}, {"id": "apache-tomcat", "info": {"name": "apache-tomcat", "author": "cn-kali-team", "tags": "detect,tech,apache-tomcat", "severity": "info", "metadata": {"product": "tomcat", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/manager/html", "/manager/status"], "condition": "and", "case-insensitive": true}, {"type": "favicon", "hash": ["4644f2d45601037b8423d45e13194c93"]}, {"type": "word", "words": ["

    apache tomcat", "apache tomcat/", "href=\"tomcat.css", "this is the default tomcat home page"], "case-insensitive": true}, {"type": "word", "words": ["server: apache-coyote/", "x-powered-by: tomcat"], "part": "header", "case-insensitive": true}]}], "_source_file": "apache\\tomcat.yaml"}, {"id": "tomcat_jk_connector", "info": {"name": "tomcat_jk_connector", "author": "cn-kali-team", "tags": "detect,tech,tomcat_jk_connector", "severity": "info", "metadata": {"fofa-query": ["title=\"apache tomcat\""], "google-query": ["intitle:\"apache tomcat\""], "product": "tomcat_jk_connector", "shodan-query": ["title:\"apache tomcat\"", "http.title:\"apache tomcat\""], "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)<title[^>]*>apache tomcat.*?"]}]}], "_source_file": "apache\\tomcat_jk_connector.yaml"}, {"id": "apache-unomi", "info": {"name": "apache-unomi", "author": "cn-kali-team", "tags": "detect,tech,apache-unomi", "severity": "info", "metadata": {"product": "unomi", "vendor": "apache", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["logo apache unomi"], "case-insensitive": true}]}], "_source_file": "apache\\unomi.yaml"}, {"id": "central_authentication_service", "info": {"name": "central_authentication_service", "author": "cn-kali-team", "tags": "detect,tech,central_authentication_service", "severity": "info", "metadata": {"fofa-query": ["title='cas - central authentication service'"], "google-query": ["intitle:'cas - central authentication service'"], "product": "central_authentication_service", "shodan-query": ["http.title:'cas - central authentication service'"], "vendor": "apereo", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cas - central authentication service.*?"]}]}], "_source_file": "apereo\\central_authentication_service.yaml"}, {"id": "appcms", "info": {"name": "appcms", "author": "cn-kali-team", "tags": "detect,tech,appcms", "severity": "info", "metadata": {"product": "appcms", "vendor": "appcms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powerd by appcms"], "case-insensitive": true}]}], "_source_file": "appcms\\appcms.yaml"}, {"id": "appspace", "info": {"name": "appspace", "author": "cn-kali-team", "tags": "detect,tech,appspace", "severity": "info", "metadata": {"fofa-query": ["title=\"appspace\""], "google-query": ["intitle:\"appspace\""], "product": "appspace", "shodan-query": ["title:\"appspace\"", "http.title:\"appspace\""], "vendor": "appspace", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>appspace.*?"]}]}], "_source_file": "appspace\\appspace.yaml"}, {"id": "appwrite", "info": {"name": "appwrite", "author": "cn-kali-team", "tags": "detect,tech,appwrite", "severity": "info", "metadata": {"product": "appwrite", "vendor": "appwrite", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["sign in - appwrite"], "case-insensitive": true}]}], "_source_file": "appwrite\\appwrite.yaml"}, {"id": "energy_communication_unit_firmware", "info": {"name": "energy_communication_unit_firmware", "author": "cn-kali-team", "tags": "detect,tech,energy_communication_unit_firmware", "severity": "info", "metadata": {"fofa-query": ["title=\"altenergy power control software\""], "google-query": ["intitle:\"altenergy power control software\""], "product": "energy_communication_unit_firmware", "shodan-query": ["title:\"altenergy power control software\"", "http.title:\"altenergy power control software\""], "vendor": "apsystems", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>altenergy power control software.*?"]}]}], "_source_file": "apsystems\\energy_communication_unit_firmware.yaml"}, {"id": "controller", "info": {"name": "controller", "author": "cn-kali-team", "tags": "detect,tech,controller", "severity": "info", "metadata": {"product": "controller", "shodan-query": ["html:\"aquatronica\""], "vendor": "aquatronica", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["aquatronica"], "case-insensitive": true}]}], "_source_file": "aquatronica\\controller.yaml"}, {"id": "udp", "info": {"name": "udp", "author": "cn-kali-team", "tags": "detect,tech,udp", "severity": "info", "metadata": {"product": "udp", "shodan-query": ["http.favicon.hash:-1889244460"], "vendor": "arcserve", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1889244460"]}]}], "_source_file": "arcserve\\udp.yaml"}, {"id": "argo_cd", "info": {"name": "argo_cd", "author": "cn-kali-team", "tags": "detect,tech,argo_cd", "severity": "info", "metadata": {"product": "argo_cd", "shodan-query": ["html:\"argo cd\""], "vendor": "argoproj", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["argo cd"], "case-insensitive": true}]}], "_source_file": "argoproj\\argo_cd.yaml"}, {"id": "dvr", "info": {"name": "dvr", "author": "cn-kali-team", "tags": "detect,tech,dvr", "severity": "info", "metadata": {"fofa-query": ["title=\"web viewer for samsung dvr\""], "google-query": ["intitle:\"web viewer for samsung dvr\""], "product": "dvr", "shodan-query": ["http.title:\"web viewer for samsung dvr\""], "vendor": "argussurveillance", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>web viewer for samsung dvr.*?"]}]}], "_source_file": "argussurveillance\\dvr.yaml"}, {"id": "pandora_fms", "info": {"name": "pandora_fms", "author": "cn-kali-team", "tags": "detect,tech,pandora_fms", "severity": "info", "metadata": {"fofa-query": ["title=\"pandora fms\""], "google-query": ["intitle:\"pandora fms\""], "product": "pandora_fms", "shodan-query": ["http.title:\"pandora fms\""], "vendor": "artica", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>pandora fms.*?"]}]}], "_source_file": "artica\\pandora_fms.yaml"}, {"id": "artica_proxy", "info": {"name": "artica_proxy", "author": "cn-kali-team", "tags": "detect,tech,artica_proxy", "severity": "info", "metadata": {"fofa-query": ["body=\"artica\""], "product": "artica_proxy", "shodan-query": ["http.html:\"artica\""], "vendor": "articatech", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["artica"], "case-insensitive": true}]}], "_source_file": "articatech\\artica_proxy.yaml"}, {"id": "aruba-instant-access-point", "info": {"name": "aruba-instant-access-point", "author": "cn-kali-team", "tags": "detect,tech,aruba-instant-access-point", "severity": "info", "metadata": {"fofa-query": ["body=\"jscripts/third_party/raphael-treemap.min.js\" || body=\"jscripts/third_party/highcharts.src.js\""], "product": "aruba-instant-access-point", "shodan-query": ["title:\"aruba\""], "vendor": "aruba", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["jscripts/third_party/highcharts.src.js", "jscripts/third_party/raphael-treemap.min.js"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*>aruba.*?"]}]}], "_source_file": "aruba\\aruba-instant-access-point.yaml"}, {"id": "aruba_instant", "info": {"name": "aruba_instant", "author": "cn-kali-team", "tags": "detect,tech,aruba_instant", "severity": "info", "metadata": {"fofa-query": ["body=\"jscripts/third_party/raphael-treemap.min.js\" || body=\"jscripts/third_party/highcharts.src.js\""], "product": "aruba_instant", "vendor": "arubanetworks", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["jscripts/third_party/highcharts.src.js", "jscripts/third_party/raphael-treemap.min.js"], "case-insensitive": true}]}], "_source_file": "arubanetworks\\aruba_instant.yaml"}, {"id": "high_cms", "info": {"name": "high_cms", "author": "cn-kali-team", "tags": "detect,tech,high_cms", "severity": "info", "metadata": {"fofa-query": ["title=\"highmail\""], "google-query": ["intitle:\"highmail\""], "product": "high_cms", "shodan-query": ["title:\"highmail\"", "http.title:\"highmail\""], "vendor": "aryanic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>highmail.*?"]}]}], "_source_file": "aryanic\\high_cms.yaml"}, {"id": "rt-n16", "info": {"name": "rt-n16", "author": "cn-kali-team", "tags": "detect,tech,rt-n16", "severity": "info", "metadata": {"product": "rt-n16", "shodan-query": ["rt-n16"], "vendor": "asus", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["rt-n16"], "case-insensitive": true}]}], "_source_file": "asus\\rt-n16.yaml"}, {"id": "asustor-data-master", "info": {"name": "asustor-data-master", "author": "cn-kali-team", "tags": "detect,tech,asustor-data-master", "severity": "info", "metadata": {"fofa-query": ["body=\"asustor\" && icon_hash=\"1678170702\""], "product": "asustor-data-master", "shodan-query": ["http.html:\"asustor\""], "vendor": "asustor", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["asustor"], "case-insensitive": true}, {"type": "favicon", "hash": ["1678170702"]}]}], "_source_file": "asustor\\asustor-data-master.yaml"}, {"id": "atlassian-jira", "info": {"name": "atlassian-jira", "author": "cn-kali-team", "tags": "detect,tech,atlassian-jira", "severity": "info", "metadata": {"product": "jira", "vendor": "atlassian", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ams-build-number", "com.atlassian.jira", "jira.webresources"], "case-insensitive": true}, {"type": "word", "words": ["location: /secure/setupmode!default.jspa"], "part": "header", "case-insensitive": true}]}], "_source_file": "atlassian\\jira.yaml"}, {"id": "atmail", "info": {"name": "atmail", "author": "cn-kali-team", "tags": "detect,tech,atmail", "severity": "info", "metadata": {"product": "atmail", "vendor": "atmail", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/index.php/mail/auth/processlogin", "]*>audiocodes.*?"]}]}], "_source_file": "audiocodes\\device_manager_express.yaml"}, {"id": "compact_5500r_firmware", "info": {"name": "compact_5500r_firmware", "author": "cn-kali-team", "tags": "detect,tech,compact_5500r_firmware", "severity": "info", "metadata": {"fofa-query": ["\"auerswald\""], "product": "compact_5500r_firmware", "vendor": "auerswald", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["auerswald"], "case-insensitive": true}]}], "_source_file": "auerswald\\compact_5500r_firmware.yaml"}, {"id": "candidats", "info": {"name": "candidats", "author": "cn-kali-team", "tags": "detect,tech,candidats", "severity": "info", "metadata": {"fofa-query": ["body=\"candidats\""], "product": "candidats", "shodan-query": ["http.html:\"candidats\""], "vendor": "auieo", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["candidats"], "case-insensitive": true}]}], "_source_file": "auieo\\candidats.yaml"}, {"id": "webctrl", "info": {"name": "webctrl", "author": "cn-kali-team", "tags": "detect,tech,webctrl", "severity": "info", "metadata": {"fofa-query": ["body=\"/_common/lvl5/dologin.jsp\""], "product": "webctrl", "shodan-query": ["html:\"/_common/lvl5/dologin.jsp\"", "http.html:\"/_common/lvl5/dologin.jsp\""], "vendor": "automatedlogic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/_common/lvl5/dologin.jsp"], "case-insensitive": true}]}], "_source_file": "automatedlogic\\webctrl.yaml"}, {"id": "automation_360", "info": {"name": "automation_360", "author": "cn-kali-team", "tags": "detect,tech,automation_360", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-1005691603\""], "product": "automation_360", "shodan-query": ["http.favicon.hash:-1005691603"], "vendor": "automationanywhere", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1005691603"]}]}], "_source_file": "automationanywhere\\automation_360.yaml"}, {"id": "avantfax", "info": {"name": "avantfax", "author": "cn-kali-team", "tags": "detect,tech,avantfax", "severity": "info", "metadata": {"product": "avantfax", "vendor": "avantfax", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["src=\"images/avantfax-big.png\" border=\"0\" alt=\"avantfax"], "case-insensitive": true}]}], "_source_file": "avantfax\\avantfax.yaml"}, {"id": "aura_device_services", "info": {"name": "aura_device_services", "author": "cn-kali-team", "tags": "detect,tech,aura_device_services", "severity": "info", "metadata": {"fofa-query": ["body=\"avaya aura® utility services\""], "product": "aura_device_services", "shodan-query": ["html:\"avaya aura® utility services\""], "vendor": "avaya", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["avaya aura", "nbsp;utility services"], "case-insensitive": true}]}], "_source_file": "avaya\\aura_device_services.yaml"}, {"id": "aura_utility_services", "info": {"name": "aura_utility_services", "author": "cn-kali-team", "tags": "detect,tech,aura_utility_services", "severity": "info", "metadata": {"product": "aura_utility_services", "shodan-query": ["html:\"avaya aura\""], "vendor": "avaya", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["avaya aura"], "case-insensitive": true}]}], "_source_file": "avaya\\aura_utility_services.yaml"}, {"id": "intouch_access_anywhere", "info": {"name": "intouch_access_anywhere", "author": "cn-kali-team", "tags": "detect,tech,intouch_access_anywhere", "severity": "info", "metadata": {"fofa-query": ["body=\"intouch access anywhere\""], "product": "intouch_access_anywhere", "shodan-query": ["http.html:\"intouch access anywhere\""], "vendor": "aveva", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["intouch access anywhere"], "case-insensitive": true}]}], "_source_file": "aveva\\intouch_access_anywhere.yaml"}, {"id": "controller", "info": {"name": "controller", "author": "cn-kali-team", "tags": "detect,tech,controller", "severity": "info", "metadata": {"fofa-query": ["title=\"aviatrix cloud controller\""], "google-query": ["intitle:\"aviatrix cloud controller\""], "product": "controller", "shodan-query": ["http.title:\"aviatrix cloud controller\""], "vendor": "aviatrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>aviatrix cloud controller.*?"]}]}], "_source_file": "aviatrix\\controller.yaml"}, {"id": "simple_job_board", "info": {"name": "simple_job_board", "author": "cn-kali-team", "tags": "detect,tech,simple_job_board", "severity": "info", "metadata": {"fofa-query": ["body=\"/wp-content/plugins/simple-job-board\""], "product": "simple_job_board", "vendor": "awsm", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wp-content/plugins/simple-job-board"], "case-insensitive": true}]}], "_source_file": "awsm\\simple_job_board.yaml"}, {"id": "axigen_mobile_webmail", "info": {"name": "axigen_mobile_webmail", "author": "cn-kali-team", "tags": "detect,tech,axigen_mobile_webmail", "severity": "info", "metadata": {"fofa-query": ["icon_hash=-1247684400"], "product": "axigen_mobile_webmail", "shodan-query": ["http.favicon.hash:-1247684400"], "vendor": "axigen", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1247684400"]}]}], "_source_file": "axigen\\axigen_mobile_webmail.yaml"}, {"id": "webmail", "info": {"name": "webmail", "author": "cn-kali-team", "tags": "detect,tech,webmail", "severity": "info", "metadata": {"fofa-query": ["title=\"axigen\""], "product": "webmail", "shodan-query": ["title:\"axigen\""], "vendor": "axigen", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>axigen.*?"]}]}], "_source_file": "axigen\\webmail.yaml"}, {"id": "azkaban", "info": {"name": "azkaban", "author": "cn-kali-team", "tags": "detect,tech,azkaban", "severity": "info", "metadata": {"product": "azkaban", "shodan-query": ["http.title:\"azkaban web client\""], "vendor": "azkaban_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>azkaban web client.*?"]}]}], "_source_file": "azkaban_project\\azkaban.yaml"}, {"id": "b2evolution", "info": {"name": "b2evolution", "author": "cn-kali-team", "tags": "detect,tech,b2evolution", "severity": "info", "metadata": {"product": "b2evolution", "vendor": "b2evolution", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/powered-by-b2evolution-150t.gif", "content=\"b2evolution", "powered by b2evolution"], "case-insensitive": true}]}], "_source_file": "b2evolution\\b2evolution.yaml"}, {"id": "ueditor", "info": {"name": "ueditor", "author": "cn-kali-team", "tags": "detect,tech,ueditor", "severity": "info", "metadata": {"product": "ueditor", "shodan-query": ["html:\"ueditor\""], "vendor": "baidu", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ueditor"], "case-insensitive": true}]}], "_source_file": "baidu\\ueditor.yaml"}, {"id": "clickshare_cs-100_huddle_firmware", "info": {"name": "clickshare_cs-100_huddle_firmware", "author": "cn-kali-team", "tags": "detect,tech,clickshare_cs-100_huddle_firmware", "severity": "info", "metadata": {"product": "clickshare_cs-100_huddle_firmware", "shodan-query": ["clicksharesession"], "vendor": "barco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["clicksharesession"], "case-insensitive": true}]}], "_source_file": "barco\\clickshare_cs-100_huddle_firmware.yaml"}, {"id": "datagerry", "info": {"name": "datagerry", "author": "cn-kali-team", "tags": "detect,tech,datagerry", "severity": "info", "metadata": {"product": "datagerry", "shodan-query": ["http.title:\"datagerry\""], "vendor": "becon", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>datagerry.*?"]}]}], "_source_file": "becon\\datagerry.yaml"}, {"id": "bentoml", "info": {"name": "bentoml", "author": "cn-kali-team", "tags": "detect,tech,bentoml", "severity": "info", "metadata": {"fofa-query": ["body=\"bentoml\""], "product": "bentoml", "shodan-query": ["html:\"bentoml\""], "vendor": "bentoml", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["bentoml"], "case-insensitive": true}]}], "_source_file": "bentoml\\bentoml.yaml"}, {"id": "beyondtrust", "info": {"name": "beyondtrust", "author": "cn-kali-team", "tags": "detect,tech,beyondtrust", "severity": "info", "metadata": {"google-query": ["intext:\"beyondtrust\" \"redistribution prohibited\""], "product": "beyondtrust", "shodan-query": ["html:\"beyondtrust\""], "vendor": "beyondtrust", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["beyondtrust"], "case-insensitive": true}]}], "_source_file": "beyondtrust\\beyondtrust.yaml"}, {"id": "remote_support", "info": {"name": "remote_support", "author": "cn-kali-team", "tags": "detect,tech,remote_support", "severity": "info", "metadata": {"google-query": ["intext:\"beyondtrust\" \"redistribution prohibited\""], "product": "remote_support", "shodan-query": ["html:\"beyondtrust\""], "vendor": "beyondtrust", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["beyondtrust"], "case-insensitive": true}]}], "_source_file": "beyondtrust\\remote_support.yaml"}, {"id": "bibliopac", "info": {"name": "bibliopac", "author": "cn-kali-team", "tags": "detect,tech,bibliopac", "severity": "info", "metadata": {"fofa-query": ["title=\"bibliopac\""], "google-query": ["intitle:\"bibliopac\""], "product": "bibliopac", "shodan-query": ["title:\"bibliopac\"", "http.title:\"bibliopac\""], "vendor": "bibliosoft", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>bibliopac.*?"]}]}], "_source_file": "bibliosoft\\bibliopac.yaml"}, {"id": "bigant_server", "info": {"name": "bigant_server", "author": "cn-kali-team", "tags": "detect,tech,bigant_server", "severity": "info", "metadata": {"fofa-query": ["body=\"bigant\""], "product": "bigant_server", "shodan-query": ["http.html:\"bigant\""], "vendor": "bigantsoft", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["bigant"], "case-insensitive": true}]}], "_source_file": "bigantsoft\\bigant_server.yaml"}, {"id": "larecipe", "info": {"name": "larecipe", "author": "cn-kali-team", "tags": "detect,tech,larecipe", "severity": "info", "metadata": {"fofa-query": ["body=\"/binarytorch/larecipe/\""], "product": "larecipe", "vendor": "binarytorch", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/binarytorch/larecipe/"], "case-insensitive": true}]}], "_source_file": "binarytorch\\larecipe.yaml"}, {"id": "bitrix24", "info": {"name": "bitrix24", "author": "cn-kali-team", "tags": "detect,tech,bitrix24", "severity": "info", "metadata": {"fofa-query": ["body=\"/bitrix/\""], "product": "bitrix24", "shodan-query": ["html:\"/bitrix/\"", "http.html:\"/bitrix/\""], "vendor": "bitrix24", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/bitrix/"], "case-insensitive": true}]}], "_source_file": "bitrix24\\bitrix24.yaml"}, {"id": "blogengine.net", "info": {"name": "blogengine.net", "author": "cn-kali-team", "tags": "detect,tech,blogengine.net", "severity": "info", "metadata": {"fofa-query": ["body=\"blogengine.net\""], "product": "blogengine.net", "shodan-query": ["http.html:\"blogengine.net\""], "vendor": "blogengine", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["blogengine.net"], "case-insensitive": true}]}], "_source_file": "blogengine\\blogengine.net.yaml"}, {"id": "bloofox", "info": {"name": "bloofox", "author": "cn-kali-team", "tags": "detect,tech,bloofox", "severity": "info", "metadata": {"fofa-query": ["powered by bloofoxcms"], "product": "bloofox", "vendor": "bloofox", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powered by bloofoxcms"], "case-insensitive": true}]}], "_source_file": "bloofox\\bloofox.yaml"}, {"id": "bloofoxcms", "info": {"name": "bloofoxcms", "author": "cn-kali-team", "tags": "detect,tech,bloofoxcms", "severity": "info", "metadata": {"fofa-query": ["powered by bloofoxcms"], "product": "bloofoxcms", "vendor": "bloofox", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["powered by bloofoxcms"], "case-insensitive": true}]}], "_source_file": "bloofox\\bloofoxcms.yaml"}, {"id": "bludit", "info": {"name": "bludit", "author": "cn-kali-team", "tags": "detect,tech,bludit", "severity": "info", "metadata": {"fofa-query": ["title=\"bludit\""], "google-query": ["intitle:\"bludit\""], "product": "bludit", "shodan-query": ["title:\"bludit\"", "http.title:\"bludit\""], "vendor": "bludit", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>bludit.*?"]}]}], "_source_file": "bludit\\bludit.yaml"}, {"id": "boa", "info": {"name": "boa", "author": "cn-kali-team", "tags": "detect,tech,boa", "severity": "info", "metadata": {"fofa-query": ["server: boa/0.94.13"], "product": "boa", "shodan-query": ["server: boa/0.94.13"], "vendor": "boa", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: boa/0.94.13"], "case-insensitive": true}]}], "_source_file": "boa\\boa.yaml"}, {"id": "siteengine", "info": {"name": "siteengine", "author": "cn-kali-team", "tags": "detect,tech,siteengine", "severity": "info", "metadata": {"fofa-query": ["body=\"siteengine\""], "product": "siteengine", "shodan-query": ["html:\"siteengine\"", "http.html:\"siteengine\""], "vendor": "boka", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["siteengine"], "case-insensitive": true}]}], "_source_file": "boka\\siteengine.yaml"}, {"id": "bonita", "info": {"name": "bonita", "author": "cn-kali-team", "tags": "detect,tech,bonita", "severity": "info", "metadata": {"fofa-query": ["title=\"bonita\" || header=\"server: bonita\""], "product": "bonita", "shodan-query": ["http.title:\"bonita\" || \"server: bonita\""], "vendor": "bonitasoft", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>\"server: bonita.*?", "(?mi)]*>bonita\".*?", "(?mi)]*>bonita.*?"]}]}], "_source_file": "bonitasoft\\bonita.yaml"}, {"id": "broken_link_notifier", "info": {"name": "broken_link_notifier", "author": "cn-kali-team", "tags": "detect,tech,broken_link_notifier", "severity": "info", "metadata": {"fofa-query": ["body=\"blnotifier_front_end\""], "product": "broken_link_notifier", "vendor": "broken_link_notifier_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["blnotifier_front_end"], "case-insensitive": true}]}], "_source_file": "broken_link_notifier_project\\broken_link_notifier.yaml"}, {"id": "quicklancer", "info": {"name": "quicklancer", "author": "cn-kali-team", "tags": "detect,tech,quicklancer", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"1099370896\""], "product": "quicklancer", "shodan-query": ["http.favicon.hash:1099370896"], "vendor": "bylancer", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["1099370896"]}]}], "_source_file": "bylancer\\quicklancer.yaml"}, {"id": "smart_s210_firmware", "info": {"name": "smart_s210_firmware", "author": "cn-kali-team", "tags": "detect,tech,smart_s210_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"smart管理平台\""], "product": "smart_s210_firmware", "vendor": "byzoro", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["smart管理平台"], "case-insensitive": true}]}], "_source_file": "byzoro\\smart_s210_firmware.yaml"}, {"id": "cacti", "info": {"name": "cacti", "author": "cn-kali-team", "tags": "detect,tech,cacti", "severity": "info", "metadata": {"product": "cacti", "vendor": "cacti", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/plugins/jqueryskin/include/login.css"], "case-insensitive": true}, {"type": "word", "words": ["set-cookie: cacti="], "part": "header", "case-insensitive": true}]}], "_source_file": "cacti\\cacti.yaml"}, {"id": "calibre", "info": {"name": "calibre", "author": "cn-kali-team", "tags": "detect,tech,calibre", "severity": "info", "metadata": {"fofa-query": ["server: calibre"], "product": "calibre", "shodan-query": ["html:\"calibre\""], "vendor": "calibre-ebook", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["calibre", "server: calibre"], "case-insensitive": true}]}], "_source_file": "calibre-ebook\\calibre.yaml"}, {"id": "pcoweb_card_firmware", "info": {"name": "pcoweb_card_firmware", "author": "cn-kali-team", "tags": "detect,tech,pcoweb_card_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"pcoweb\""], "product": "pcoweb_card_firmware", "shodan-query": ["http.html:\"pcoweb\""], "vendor": "carel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["pcoweb"], "case-insensitive": true}]}], "_source_file": "carel\\pcoweb_card_firmware.yaml"}, {"id": "car_rental_management_system", "info": {"name": "car_rental_management_system", "author": "cn-kali-team", "tags": "detect,tech,car_rental_management_system", "severity": "info", "metadata": {"fofa-query": ["body=\"car rental management system\""], "product": "car_rental_management_system", "shodan-query": ["http.html:\"car rental management system\""], "vendor": "car_rental_management_system_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["car rental management system"], "case-insensitive": true}]}], "_source_file": "car_rental_management_system_project\\car_rental_management_system.yaml"}, {"id": "casbin", "info": {"name": "casbin", "author": "cn-kali-team", "tags": "detect,tech", "severity": "info", "metadata": {"product": "casbin", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["casdoor", "casdoor/manifest.json"], "condition": "and", "case-insensitive": true}]}], "_source_file": "casbin\\casbin.yaml"}, {"id": "casdoor", "info": {"name": "casdoor", "author": "cn-kali-team", "tags": "detect,tech,casdoor", "severity": "info", "metadata": {"fofa-query": ["title=\"casdoor\""], "google-query": ["intitle:\"casdoor\""], "product": "casdoor", "shodan-query": ["http.title:\"casdoor\""], "vendor": "casbin", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)<title[^>]*>casdoor.*?"]}]}], "_source_file": "casbin\\casdoor.yaml"}, {"id": "xc1000_firmware", "info": {"name": "xc1000_firmware", "author": "cn-kali-team", "tags": "detect,tech,xc1000_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"cassia bluetooth gateway management platform\""], "product": "xc1000_firmware", "shodan-query": ["html:\"cassia bluetooth gateway management platform\"", "http.html:\"cassia bluetooth gateway management platform\""], "vendor": "cassianetworks", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cassia bluetooth gateway management platform"], "case-insensitive": true}]}], "_source_file": "cassianetworks\\xc1000_firmware.yaml"}, {"id": "caucho-resin", "info": {"name": "caucho-resin", "author": "cn-kali-team", "tags": "detect,tech,caucho-resin", "severity": "info", "metadata": {"product": "resin", "vendor": "caucho", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: resin"], "part": "header", "case-insensitive": true}]}], "_source_file": "caucho\\resin.yaml"}, {"id": "arc", "info": {"name": "arc", "author": "cn-kali-team", "tags": "detect,tech,arc", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"163538942\""], "product": "arc", "shodan-query": ["http.favicon.hash:163538942", "http.favicon.hash:\"163538942\""], "vendor": "cdata", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["163538942"]}]}], "_source_file": "cdata\\arc.yaml"}, {"id": "cdata", "info": {"name": "cdata", "author": "cn-kali-team", "tags": "detect,tech,cdata", "severity": "info", "metadata": {"product": "cdata", "shodan-query": ["title:\"cdata connect\"", "title:\"cdata sync\"", "title:\"cdata - api server\"", "title:\"cdata arc\""], "vendor": "cdata", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cdata - api server.*?", "(?mi)]*>cdata arc.*?", "(?mi)]*>cdata connect.*?", "(?mi)]*>cdata sync.*?"]}]}], "_source_file": "cdata\\cdata.yaml"}, {"id": "ez-net_portal", "info": {"name": "ez-net_portal", "author": "cn-kali-team", "tags": "detect,tech,ez-net_portal", "severity": "info", "metadata": {"fofa-query": ["eznet_"], "product": "ez-net_portal", "shodan-query": ["eznet_"], "vendor": "cedargate", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["eznet_"], "case-insensitive": true}]}], "_source_file": "cedargate\\ez-net_portal.yaml"}, {"id": "nvt_web_server", "info": {"name": "nvt_web_server", "author": "cn-kali-team", "tags": "detect,tech,nvt_web_server", "severity": "info", "metadata": {"fofa-query": ["body=\"/viewer/viewer.html\" && header=\"lighttpd\" && country=\"kr\""], "product": "nvt_web_server", "vendor": "cellinx", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/viewer/viewer.html"], "case-insensitive": true}]}], "_source_file": "cellinx\\nvt_web_server.yaml"}, {"id": "crywolf", "info": {"name": "crywolf", "author": "cn-kali-team", "tags": "detect,tech,crywolf", "severity": "info", "metadata": {"fofa-query": ["false alarm reduction website"], "product": "crywolf", "vendor": "centralsquare", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["false alarm reduction website"], "case-insensitive": true}]}], "_source_file": "centralsquare\\crywolf.yaml"}, {"id": "centreon", "info": {"name": "centreon", "author": "cn-kali-team", "tags": "detect,tech,centreon", "severity": "info", "metadata": {"product": "centreon", "vendor": "centreon", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["generator\" content=\"centreon - copyright"], "case-insensitive": true}]}], "_source_file": "centreon\\centreon.yaml"}, {"id": "cgit", "info": {"name": "cgit", "author": "cn-kali-team", "tags": "detect,tech,cgit", "severity": "info", "metadata": {"fofa-query": ["title=\"git repository browser\""], "google-query": ["intitle:\"git repository browser\""], "product": "cgit", "shodan-query": ["http.title:\"git repository browser\""], "vendor": "cgit_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>git repository browser.*?"]}]}], "_source_file": "cgit_project\\cgit.yaml"}, {"id": "cachet", "info": {"name": "cachet", "author": "cn-kali-team", "tags": "detect,tech,cachet", "severity": "info", "metadata": {"fofa-query": ["icon_hash=-1606065523"], "product": "cachet", "shodan-query": ["http.favicon.hash:-1606065523"], "vendor": "chachethq", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1606065523"]}]}], "_source_file": "chachethq\\cachet.yaml"}, {"id": "chamilo", "info": {"name": "chamilo", "author": "cn-kali-team", "tags": "detect,tech,chamilo", "severity": "info", "metadata": {"product": "chamilo", "vendor": "chamilo", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["]*>chatgpt个人专用版.*?"]}]}], "_source_file": "chanzhaoyu\\chatgpt_web.yaml"}, {"id": "quantum_security_gateway", "info": {"name": "quantum_security_gateway", "author": "cn-kali-team", "tags": "detect,tech,quantum_security_gateway", "severity": "info", "metadata": {"fofa-query": ["body=\"check point ssl network\""], "product": "quantum_security_gateway", "shodan-query": ["html:\"check point ssl network\"", "http.html:\"check point ssl network\""], "vendor": "checkpoint", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["check point ssl network"], "case-insensitive": true}]}], "_source_file": "checkpoint\\quantum_security_gateway.yaml"}, {"id": "cherokee", "info": {"name": "cherokee", "author": "cn-kali-team", "tags": "detect,tech,cherokee", "severity": "info", "metadata": {"product": "cherokee", "vendor": "cherokee", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: cherokee"], "part": "header", "case-insensitive": true}]}], "_source_file": "cherokee\\cherokee.yaml"}, {"id": "churchcrm", "info": {"name": "churchcrm", "author": "cn-kali-team", "tags": "detect,tech,churchcrm", "severity": "info", "metadata": {"fofa-query": ["app=\"churchcrm\""], "product": "churchcrm", "shodan-query": ["title:\"churchcrm\""], "vendor": "churchcrm", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>churchcrm.*?"]}]}], "_source_file": "churchcrm\\churchcrm.yaml"}, {"id": "adaptive-security-appliance-software", "info": {"name": "adaptive-security-appliance-software", "author": "cn-kali-team", "tags": "detect,tech,adaptive-security-appliance-software", "severity": "info", "metadata": {"product": "adaptive-security-appliance-software", "shodan-query": ["html:\"/+cscoe+/logon.html\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/+cscoe+/logon.html"], "case-insensitive": true}]}], "_source_file": "cisco\\adaptive-security-appliance-software.yaml"}, {"id": "evolved_programmable_network_manager", "info": {"name": "evolved_programmable_network_manager", "author": "cn-kali-team", "tags": "detect,tech,evolved_programmable_network_manager", "severity": "info", "metadata": {"fofa-query": ["title=\"prime infrastructure\""], "google-query": ["intitle:\"prime infrastructure\""], "product": "evolved_programmable_network_manager", "shodan-query": ["http.title:\"prime infrastructure\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>prime infrastructure.*?"]}]}], "_source_file": "cisco\\evolved_programmable_network_manager.yaml"}, {"id": "identity_services_engine", "info": {"name": "identity_services_engine", "author": "cn-kali-team", "tags": "detect,tech,identity_services_engine", "severity": "info", "metadata": {"fofa-query": ["title=\"identity services engine\""], "google-query": ["intitle:\"identity services engine\""], "product": "identity_services_engine", "shodan-query": ["\"set-cookie: appsessionid=\" \"path=/admin\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>identity services engine.*?"]}]}], "_source_file": "cisco\\identity_services_engine.yaml"}, {"id": "rv110w_firmware", "info": {"name": "rv110w_firmware", "author": "cn-kali-team", "tags": "detect,tech,rv110w_firmware", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-646322113\""], "product": "rv110w_firmware", "shodan-query": ["http.favicon.hash:\"-646322113\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-646322113"]}]}], "_source_file": "cisco\\rv110w_firmware.yaml"}, {"id": "rv160_firmware", "info": {"name": "rv160_firmware", "author": "cn-kali-team", "tags": "detect,tech,rv160_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"cisco rv340\""], "product": "rv160_firmware", "shodan-query": ["http.html:\"cisco rv340\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cisco rv340"], "case-insensitive": true}]}], "_source_file": "cisco\\rv160_firmware.yaml"}, {"id": "sg200-50_firmware", "info": {"name": "sg200-50_firmware", "author": "cn-kali-team", "tags": "detect,tech,sg200-50_firmware", "severity": "info", "metadata": {"product": "sg200-50_firmware", "shodan-query": ["/config/log_off_page.htm"], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/config/log_off_page.htm"], "case-insensitive": true}]}], "_source_file": "cisco\\sg200-50_firmware.yaml"}, {"id": "unified_communications_domain_manager", "info": {"name": "unified_communications_domain_manager", "author": "cn-kali-team", "tags": "detect,tech,unified_communications_domain_manager", "severity": "info", "metadata": {"product": "unified_communications_domain_manager", "shodan-query": ["title:\"cisco unified\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cisco unified.*?"]}]}], "_source_file": "cisco\\unified_communications_domain_manager.yaml"}, {"id": "webex_meetings_online", "info": {"name": "webex_meetings_online", "author": "cn-kali-team", "tags": "detect,tech,webex_meetings_online", "severity": "info", "metadata": {"product": "webex_meetings_online", "shodan-query": ["title:\"cisco webex\""], "vendor": "cisco", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cisco webex.*?"]}]}], "_source_file": "cisco\\webex_meetings_online.yaml"}, {"id": "opencti", "info": {"name": "opencti", "author": "cn-kali-team", "tags": "detect,tech,opencti", "severity": "info", "metadata": {"product": "opencti", "shodan-query": ["http.html:\"opencti\""], "vendor": "citeum", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["opencti"], "case-insensitive": true}]}], "_source_file": "citeum\\opencti.yaml"}, {"id": "gateway", "info": {"name": "gateway", "author": "cn-kali-team", "tags": "detect,tech,gateway", "severity": "info", "metadata": {"fofa-query": ["title=\"citrix gateway\""], "google-query": ["intitle:\"citrix gateway\""], "product": "gateway", "shodan-query": ["http.favicon.hash:-1292923998,-1166125415", "title:\"citrix gateway\"", "http.title:\"citrix gateway\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1166125415", "-1292923998"]}, {"type": "regex", "regex": ["(?mi)]*>citrix gateway.*?"]}]}], "_source_file": "citrix\\gateway.yaml"}, {"id": "citrix-netscaler", "info": {"name": "citrix-netscaler", "author": "cn-kali-team", "tags": "detect,tech,citrix-netscaler", "severity": "info", "metadata": {"product": "netscaler", "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["netscape/firefox/opera"], "case-insensitive": true}, {"type": "word", "words": ["set-cookie: citrix_ns_id"], "part": "header", "case-insensitive": true}]}], "_source_file": "citrix\\netscaler.yaml"}, {"id": "netscaler_application_delivery_controller", "info": {"name": "netscaler_application_delivery_controller", "author": "cn-kali-team", "tags": "detect,tech,netscaler_application_delivery_controller", "severity": "info", "metadata": {"fofa-query": ["title=\"citrix gateway\" || title:\"netscaler gateway\""], "google-query": ["intitle:\"citrix gateway\" || title:\"netscaler gateway\""], "product": "netscaler_application_delivery_controller", "shodan-query": ["title:\"citrix gateway\" || title:\"netscaler gateway\"", "http.title:\"citrix gateway\" || title:\"netscaler gateway\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*> title:\"netscaler gateway.*?", "(?mi)]*>citrix gateway\" .*?"]}]}], "_source_file": "citrix\\netscaler_application_delivery_controller.yaml"}, {"id": "netscaler_gateway", "info": {"name": "netscaler_gateway", "author": "cn-kali-team", "tags": "detect,tech,netscaler_gateway", "severity": "info", "metadata": {"product": "netscaler_gateway", "shodan-query": ["http.favicon.hash:-1292923998,-1166125415"], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1166125415", "-1292923998"]}]}], "_source_file": "citrix\\netscaler_gateway.yaml"}, {"id": "netscaler_sd-wan", "info": {"name": "netscaler_sd-wan", "author": "cn-kali-team", "tags": "detect,tech,netscaler_sd-wan", "severity": "info", "metadata": {"fofa-query": ["title=\"citrix sd-wan\""], "google-query": ["intitle:\"citrix sd-wan\""], "product": "netscaler_sd-wan", "shodan-query": ["http.title:\"citrix sd-wan\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>citrix sd-wan.*?"]}]}], "_source_file": "citrix\\netscaler_sd-wan.yaml"}, {"id": "sharefile_storage_zones_controller", "info": {"name": "sharefile_storage_zones_controller", "author": "cn-kali-team", "tags": "detect,tech,sharefile_storage_zones_controller", "severity": "info", "metadata": {"fofa-query": ["title=\"sharefile storage server\""], "google-query": ["intitle:\"sharefile storage server\""], "product": "sharefile_storage_zones_controller", "shodan-query": ["title:\"sharefile storage server\"", "http.title:\"sharefile storage server\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>sharefile storage server.*?"]}]}], "_source_file": "citrix\\sharefile_storage_zones_controller.yaml"}, {"id": "xenapp", "info": {"name": "xenapp", "author": "cn-kali-team", "tags": "detect,tech,xenapp", "severity": "info", "metadata": {"product": "xenapp", "shodan-query": ["html:\"/citrix/xenapp\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/citrix/xenapp"], "case-insensitive": true}]}], "_source_file": "citrix\\xenapp.yaml"}, {"id": "xenmobile_server", "info": {"name": "xenmobile_server", "author": "cn-kali-team", "tags": "detect,tech,xenmobile_server", "severity": "info", "metadata": {"product": "xenmobile_server", "shodan-query": ["title:\"xenmobile\""], "vendor": "citrix", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>xenmobile.*?"]}]}], "_source_file": "citrix\\xenmobile_server.yaml"}, {"id": "cliniccases", "info": {"name": "cliniccases", "author": "cn-kali-team", "tags": "detect,tech,cliniccases", "severity": "info", "metadata": {"fofa-query": ["title=\"cliniccases\",html:\"/cliniccases/\""], "google-query": ["intitle:\"cliniccases\",html:\"/cliniccases/\""], "product": "cliniccases", "shodan-query": ["http.title:\"cliniccases\",html:\"/cliniccases/\""], "vendor": "cliniccases", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cliniccases\",html:\"/cliniccases/.*?"]}]}], "_source_file": "cliniccases\\cliniccases.yaml"}, {"id": "citrix_storefront", "info": {"name": "citrix_storefront", "author": "cn-kali-team", "tags": "detect,tech,citrix_storefront", "severity": "info", "metadata": {"fofa-query": ["body=\"/citrix/storeweb\""], "product": "citrix_storefront", "shodan-query": ["html:\"/citrix/storeweb\"", "http.html:\"/citrix/storeweb\""], "vendor": "cloud", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/citrix/storeweb"], "case-insensitive": true}]}], "_source_file": "cloud\\citrix_storefront.yaml"}, {"id": "hue", "info": {"name": "hue", "author": "cn-kali-team", "tags": "detect,tech,hue", "severity": "info", "metadata": {"product": "hue", "shodan-query": ["title:\"hue - welcome to hue\""], "vendor": "cloudera", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>hue - welcome to hue.*?"]}]}], "_source_file": "cloudera\\hue.yaml"}, {"id": "cmseasy", "info": {"name": "cmseasy", "author": "cn-kali-team", "tags": "detect,tech,cmseasy", "severity": "info", "metadata": {"product": "cmseasy", "vendor": "00_unknown", "verified": false}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"cmseasy"], "case-insensitive": true}]}], "_source_file": "cmseasy\\cmseasy.yaml"}, {"id": "cobbler", "info": {"name": "cobbler", "author": "cn-kali-team", "tags": "detect,tech,cobbler", "severity": "info", "metadata": {"fofa-query": ["title=\"cobbler web interface\""], "google-query": ["intitle:\"cobbler web interface\""], "product": "cobbler", "shodan-query": ["http.title:\"cobbler web interface\""], "vendor": "cobblerd", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cobbler web interface.*?"]}]}], "_source_file": "cobblerd\\cobbler.yaml"}, {"id": "cobbler", "info": {"name": "cobbler", "author": "cn-kali-team", "tags": "detect,tech,cobbler", "severity": "info", "metadata": {"fofa-query": ["title=\"cobbler web interface\""], "google-query": ["intitle:\"cobbler web interface\""], "product": "cobbler", "shodan-query": ["http.title:\"cobbler web interface\""], "vendor": "cobbler_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cobbler web interface.*?"]}]}], "_source_file": "cobbler_project\\cobbler.yaml"}, {"id": "wp_go_maps", "info": {"name": "wp_go_maps", "author": "cn-kali-team", "tags": "detect,tech,wp_go_maps", "severity": "info", "metadata": {"fofa-query": ["body=\"/wp-content/plugins/wp-google-maps\""], "product": "wp_go_maps", "vendor": "codecabin", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wp-content/plugins/wp-google-maps"], "case-insensitive": true}]}], "_source_file": "codecabin\\wp_go_maps.yaml"}, {"id": "itop", "info": {"name": "itop", "author": "cn-kali-team", "tags": "detect,tech,itop", "severity": "info", "metadata": {"fofa-query": ["body=\"itop login\""], "product": "itop", "shodan-query": ["html:\"itop login\""], "vendor": "combodo", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["itop login"], "case-insensitive": true}]}], "_source_file": "combodo\\itop.yaml"}, {"id": "ruckus_vriot", "info": {"name": "ruckus_vriot", "author": "cn-kali-team", "tags": "detect,tech,ruckus_vriot", "severity": "info", "metadata": {"product": "ruckus_vriot", "shodan-query": ["html:\"riot controller\""], "vendor": "commscope", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["riot controller"], "case-insensitive": true}]}], "_source_file": "commscope\\ruckus_vriot.yaml"}, {"id": "commvault", "info": {"name": "commvault", "author": "cn-kali-team", "tags": "detect,tech,commvault", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"1209838013\""], "product": "commvault", "vendor": "commvault", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["1209838013"]}]}], "_source_file": "commvault\\commvault.yaml"}, {"id": "discuz!", "info": {"name": "discuz!", "author": "cn-kali-team", "tags": "detect,tech,discuz!", "severity": "info", "metadata": {"fofa-query": ["title=\"discuz!\""], "product": "discuz!", "shodan-query": ["title:\"discuz!\""], "vendor": "comsenz", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>discuz!.*?"]}]}], "_source_file": "comsenz\\discuz!.yaml"}, {"id": "screenconnect", "info": {"name": "screenconnect", "author": "cn-kali-team", "tags": "detect,tech,screenconnect", "severity": "info", "metadata": {"fofa-query": ["app=\"screenconnect-remote-support-software\"", "icon_hash=-82958153"], "hunter-query": ["app.name=\"connectwise screenconnect software\""], "product": "screenconnect", "shodan-query": ["http.favicon.hash:-82958153"], "vendor": "connectwise", "verified": true, "zoomeye-query": ["app:\"screenconnect remote management software\""]}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-82958153"]}]}], "_source_file": "connectwise\\screenconnect.yaml"}, {"id": "contao", "info": {"name": "contao", "author": "cn-kali-team", "tags": "detect,tech,contao", "severity": "info", "metadata": {"fofa-query": ["body=\"contao open source cms\"", "title=\"contao\""], "google-query": ["intitle:\"contao\""], "product": "contao", "shodan-query": ["title:\"contao\"", "http.title:\"contao\"", "http.html:\"contao open source cms\"", "cpe:\"cpe:2.3:a:contao:contao\""], "vendor": "contao", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["contao open source cms"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*>contao.*?"]}]}], "_source_file": "contao\\contao.yaml"}, {"id": "solarview_compact", "info": {"name": "solarview_compact", "author": "cn-kali-team", "tags": "detect,tech,solarview_compact", "severity": "info", "metadata": {"product": "solarview_compact", "shodan-query": ["http.favicon.hash:\"-244067125\"", "cpe:\"cpe:2.3:h:contec:solarview_compact\"", "http.html:\"solarview compact\""], "vendor": "contec", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["solarview compact"], "case-insensitive": true}, {"type": "favicon", "hash": ["-244067125"]}]}], "_source_file": "contec\\solarview_compact.yaml"}, {"id": "solarview_compact_firmware", "info": {"name": "solarview_compact_firmware", "author": "cn-kali-team", "tags": "detect,tech,solarview_compact_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"solarview compact\" && title=\"top\"", "icon_hash=\"-244067125\"", "body=\"solarview compact\""], "product": "solarview_compact_firmware", "shodan-query": ["http.html:\"solarview compact\"", "http.favicon.hash:\"-244067125\"", "cpe:\"cpe:2.3:o:contec:solarview_compact_firmware\""], "vendor": "contec", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" title=\"top", "solarview compact", "solarview compact\" "], "case-insensitive": true}, {"type": "favicon", "hash": ["-244067125"]}]}], "_source_file": "contec\\solarview_compact_firmware.yaml"}, {"id": "sv-cpt-mc310_firmware", "info": {"name": "sv-cpt-mc310_firmware", "author": "cn-kali-team", "tags": "detect,tech,sv-cpt-mc310_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"solarview compact\""], "product": "sv-cpt-mc310_firmware", "shodan-query": ["http.html:\"solarview compact\""], "vendor": "contec", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["solarview compact"], "case-insensitive": true}]}], "_source_file": "contec\\sv-cpt-mc310_firmware.yaml"}, {"id": "sidekiq", "info": {"name": "sidekiq", "author": "cn-kali-team", "tags": "detect,tech,sidekiq", "severity": "info", "metadata": {"fofa-query": ["title=\"sidekiq\""], "google-query": ["intitle:\"sidekiq\""], "product": "sidekiq", "shodan-query": ["http.title:\"sidekiq\"", "title:\"sidekiq\""], "vendor": "contribsys", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>sidekiq.*?"]}]}], "_source_file": "contribsys\\sidekiq.yaml"}, {"id": "webpanel", "info": {"name": "webpanel", "author": "cn-kali-team", "tags": "detect,tech,webpanel", "severity": "info", "metadata": {"fofa-query": ["title=\"login | control webpanel\""], "google-query": ["intitle:\"login | control webpanel\""], "product": "webpanel", "shodan-query": ["http.title:\"login | control webpanel\""], "vendor": "control-webpanel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>login .*?"]}]}], "_source_file": "control-webpanel\\webpanel.yaml"}, {"id": "webpanel", "info": {"name": "webpanel", "author": "cn-kali-team", "tags": "detect,tech,webpanel", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-356182173\""], "product": "webpanel", "vendor": "control_webpanel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-356182173"]}]}], "_source_file": "control_webpanel\\webpanel.yaml"}, {"id": "copyparty", "info": {"name": "copyparty", "author": "cn-kali-team", "tags": "detect,tech,copyparty", "severity": "info", "metadata": {"fofa-query": ["title=\"copyparty\""], "google-query": ["intitle:\"copyparty\""], "product": "copyparty", "shodan-query": ["title:\"copyparty\"", "http.title:\"copyparty\""], "vendor": "copyparty_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>copyparty.*?"]}]}], "_source_file": "copyparty_project\\copyparty.yaml"}, {"id": "cpanel", "info": {"name": "cpanel", "author": "cn-kali-team", "tags": "detect,tech,cpanel", "severity": "info", "metadata": {"product": "cpanel", "vendor": "cpanel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cpanel_magic_revision", "go.cpanel.net"], "condition": "and", "case-insensitive": true}]}], "_source_file": "cpanel\\cpanel.yaml"}, {"id": "cms", "info": {"name": "cms", "author": "cn-kali-team", "tags": "detect,tech,cms", "severity": "info", "metadata": {"fofa-query": ["icon_hash=-47932290", "body=craftcms"], "product": "cms", "shodan-query": ["http.html:\"craftcms\"", "http.favicon.hash:\"-47932290\""], "vendor": "craftcms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["craftcms"], "case-insensitive": true}, {"type": "favicon", "hash": ["-47932290"]}]}], "_source_file": "craftcms\\cms.yaml"}, {"id": "craft_cms", "info": {"name": "craft_cms", "author": "cn-kali-team", "tags": "detect,tech,craft_cms", "severity": "info", "metadata": {"fofa-query": ["body=craftcms", "icon_hash=-47932290"], "product": "craft_cms", "shodan-query": ["cpe:\"cpe:2.3:a:craftcms:craft_cms\"", "http.html:\"craftcms\"", "http.favicon.hash:\"-47932290\"", "x-powered-by: craft cms", "http.html:craftcms", "http.favicon.hash:-47932290"], "vendor": "craftcms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["craftcms"], "case-insensitive": true}, {"type": "favicon", "hash": ["-47932290"]}]}], "_source_file": "craftcms\\craft_cms.yaml"}, {"id": "craftercms", "info": {"name": "craftercms", "author": "cn-kali-team", "tags": "detect,tech,craftercms", "severity": "info", "metadata": {"fofa-query": ["body=\"craftercms\""], "product": "craftercms", "shodan-query": ["http.html:\"craftercms\""], "vendor": "craftercms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["craftercms"], "case-insensitive": true}]}], "_source_file": "craftercms\\craftercms.yaml"}, {"id": "cratedb", "info": {"name": "cratedb", "author": "cn-kali-team", "tags": "detect,tech,cratedb", "severity": "info", "metadata": {"fofa-query": ["title=\"cratedb\""], "product": "cratedb", "vendor": "cratedb", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>cratedb.*?"]}]}], "_source_file": "cratedb\\cratedb.yaml"}, {"id": "contact-form-generator", "info": {"name": "contact-form-generator", "author": "cn-kali-team", "tags": "detect,tech,contact-form-generator", "severity": "info", "metadata": {"fofa-query": ["body=\"/wp-content/plugins/contact-form-generator\""], "product": "contact-form-generator", "vendor": "creative-solutions", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wp-content/plugins/contact-form-generator"], "case-insensitive": true}]}], "_source_file": "creative-solutions\\contact-form-generator.yaml"}, {"id": "academy_learning_management_system", "info": {"name": "academy_learning_management_system", "author": "cn-kali-team", "tags": "detect,tech,academy_learning_management_system", "severity": "info", "metadata": {"fofa-query": ["body=\"study any topic, anytime\""], "google-query": ["intext:\"study any topic, anytime\""], "product": "academy_learning_management_system", "shodan-query": ["http.html:\"study any topic, anytime\""], "vendor": "creativeitem", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["study any topic, anytime"], "case-insensitive": true}]}], "_source_file": "creativeitem\\academy_learning_management_system.yaml"}, {"id": "academy_lms", "info": {"name": "academy_lms", "author": "cn-kali-team", "tags": "detect,tech,academy_lms", "severity": "info", "metadata": {"fofa-query": ["body=\"academy lms\""], "product": "academy_lms", "shodan-query": ["http.html:\"academy lms\"", "html:\"academy lms\""], "vendor": "creativeitem", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["academy lms"], "case-insensitive": true}]}], "_source_file": "creativeitem\\academy_lms.yaml"}, {"id": "crestron-device", "info": {"name": "crestron-device", "author": "cn-kali-team", "tags": "detect,tech,crestron-device", "severity": "info", "metadata": {"product": "crestron-device", "shodan-query": ["html:\"airmedia\""], "vendor": "crestron", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["airmedia"], "case-insensitive": true}]}], "_source_file": "crestron\\crestron-device.yaml"}, {"id": "listingpro", "info": {"name": "listingpro", "author": "cn-kali-team", "tags": "detect,tech,listingpro", "severity": "info", "metadata": {"fofa-query": ["body=\"/wp-content/plugins/listingpro\""], "product": "listingpro", "vendor": "cridio", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wp-content/plugins/listingpro"], "case-insensitive": true}]}], "_source_file": "cridio\\listingpro.yaml"}, {"id": "crmeb", "info": {"name": "crmeb", "author": "cn-kali-team", "tags": "detect,tech,crmeb", "severity": "info", "metadata": {"fofa-query": ["title=\"crmeb\""], "product": "crmeb", "vendor": "crmeb", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>crmeb.*?"]}, {"type": "favicon", "hash": ["699adaf4da1b0dc76ea5464df13755d7"]}, {"type": "word", "words": ["

    crmeb

    "], "case-insensitive": true}]}], "_source_file": "crmeb\\crmeb.yaml"}, {"id": "crushftp", "info": {"name": "crushftp", "author": "cn-kali-team", "tags": "detect,tech,crushftp", "severity": "info", "metadata": {"fofa-query": ["body=\"crushftp\""], "product": "crushftp", "shodan-query": ["html:\"crushftp\"", "http.html:\"crushftp\""], "vendor": "crushftp", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["crushftp"], "case-insensitive": true}]}], "_source_file": "crushftp\\crushftp.yaml"}, {"id": "apollo", "info": {"name": "apollo", "author": "cn-kali-team", "tags": "detect,tech,apollo", "severity": "info", "metadata": {"product": "apollo", "shodan-query": ["http.favicon.hash:11794165"], "vendor": "ctrip", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["11794165"]}]}], "_source_file": "ctrip\\apollo.yaml"}, {"id": "thinfinity_virtualui", "info": {"name": "thinfinity_virtualui", "author": "cn-kali-team", "tags": "detect,tech,thinfinity_virtualui", "severity": "info", "metadata": {"fofa-query": ["title=\"thinfinity virtualui\""], "google-query": ["intitle:\"thinfinity virtualui\""], "product": "thinfinity_virtualui", "shodan-query": ["http.title:\"thinfinity virtualui\""], "vendor": "cybelesoft", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>thinfinity virtualui.*?"]}]}], "_source_file": "cybelesoft\\thinfinity_virtualui.yaml"}, {"id": "thinvnc", "info": {"name": "thinvnc", "author": "cn-kali-team", "tags": "detect,tech,thinvnc", "severity": "info", "metadata": {"fofa-query": ["icon_hash=-1414548363"], "product": "thinvnc", "shodan-query": ["http.favicon.hash:-1414548363"], "vendor": "cybelsoft", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1414548363"]}]}], "_source_file": "cybelsoft\\thinvnc.yaml"}, {"id": "cyberpanel", "info": {"name": "cyberpanel", "author": "cn-kali-team", "tags": "detect,tech,cyberpanel", "severity": "info", "metadata": {"fofa-query": ["app=\"cyberpanel\""], "product": "cyberpanel", "shodan-query": ["html:\"cyberpanel\""], "vendor": "cyberpanel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["cyberpanel"], "case-insensitive": true}]}], "_source_file": "cyberpanel\\cyberpanel.yaml"}, {"id": "d-link", "info": {"name": "d-link", "author": "cn-kali-team", "tags": "detect,tech,d-link", "severity": "info", "metadata": {"product": "d-link", "vendor": "d-link", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["d-link systems, inc"], "case-insensitive": true}]}], "_source_file": "d-link\\d-link.yaml"}, {"id": "dh-ipc-hdbw23a0rn-zs_firmware", "info": {"name": "dh-ipc-hdbw23a0rn-zs_firmware", "author": "cn-kali-team", "tags": "detect,tech,dh-ipc-hdbw23a0rn-zs_firmware", "severity": "info", "metadata": {"fofa-query": ["icon_hash=2019488876"], "product": "dh-ipc-hdbw23a0rn-zs_firmware", "shodan-query": ["http.favicon.hash:2019488876"], "vendor": "dahuasecurity", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["2019488876"]}]}], "_source_file": "dahuasecurity\\dh-ipc-hdbw23a0rn-zs_firmware.yaml"}, {"id": "smart_parking_management", "info": {"name": "smart_parking_management", "author": "cn-kali-team", "tags": "detect,tech,smart_parking_management", "severity": "info", "metadata": {"fofa-query": ["body=\"/wpms/asset\""], "product": "smart_parking_management", "shodan-query": ["html:\"/wpms/asset\"", "http.html:\"/wpms/asset\""], "vendor": "dahuasecurity", "verified": true, "zoomeye-query": ["/wpms/asset"]}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/wpms/asset"], "case-insensitive": true}]}], "_source_file": "dahuasecurity\\smart_parking_management.yaml"}, {"id": "danswer", "info": {"name": "danswer", "author": "cn-kali-team", "tags": "detect,tech,danswer", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"484766002\""], "product": "danswer", "vendor": "danswer-ai", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["484766002"]}]}], "_source_file": "danswer-ai\\danswer.yaml"}, {"id": "request-baskets", "info": {"name": "request-baskets", "author": "cn-kali-team", "tags": "detect,tech,request-baskets", "severity": "info", "metadata": {"fofa-query": ["body=\"request-baskets\""], "product": "request-baskets", "shodan-query": ["http.html:\"request-baskets\""], "vendor": "darklynx", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["request-baskets"], "case-insensitive": true}]}], "_source_file": "darklynx\\request-baskets.yaml"}, {"id": "dataease", "info": {"name": "dataease", "author": "cn-kali-team", "tags": "detect,tech,dataease", "severity": "info", "metadata": {"fofa-query": ["body=\"dataease\""], "product": "dataease", "shodan-query": ["http.html:\"dataease\""], "vendor": "dataease", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dataease"], "case-insensitive": true}]}], "_source_file": "dataease\\dataease.yaml"}, {"id": "dataease", "info": {"name": "dataease", "author": "cn-kali-team", "tags": "detect,tech,dataease", "severity": "info", "metadata": {"product": "dataease", "shodan-query": ["html:\"dataease\""], "vendor": "dataease_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dataease"], "case-insensitive": true}]}], "_source_file": "dataease_project\\dataease.yaml"}, {"id": "datahub", "info": {"name": "datahub", "author": "cn-kali-team", "tags": "detect,tech,datahub", "severity": "info", "metadata": {"product": "datahub", "shodan-query": ["http.title:\"datahub\""], "vendor": "datahub_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>datahub.*?"]}]}], "_source_file": "datahub_project\\datahub.yaml"}, {"id": "data_science_studio", "info": {"name": "data_science_studio", "author": "cn-kali-team", "tags": "detect,tech,data_science_studio", "severity": "info", "metadata": {"product": "data_science_studio", "shodan-query": ["title:\"dataiku\""], "vendor": "dataiku", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>dataiku.*?"]}]}], "_source_file": "dataiku\\data_science_studio.yaml"}, {"id": "datart", "info": {"name": "datart", "author": "cn-kali-team", "tags": "detect,tech,datart", "severity": "info", "metadata": {"fofa-query": ["title=\"datart\""], "hunter-query": ["web.title=\"datart\""], "product": "datart", "shodan-query": ["title:\"datart\""], "vendor": "datart", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>datart.*?"]}]}], "_source_file": "datart\\datart.yaml"}, {"id": "dt80_dex_firmware", "info": {"name": "dt80_dex_firmware", "author": "cn-kali-team", "tags": "detect,tech,dt80_dex_firmware", "severity": "info", "metadata": {"fofa-query": ["title=\"datataker\""], "google-query": ["intitle:\"datataker\""], "product": "dt80_dex_firmware", "shodan-query": ["http.title:\"datataker\""], "vendor": "datataker", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>datataker.*?"]}]}], "_source_file": "datataker\\dt80_dex_firmware.yaml"}, {"id": "debian", "info": {"name": "debian", "author": "cn-kali-team", "tags": "detect,tech,debian", "severity": "info", "metadata": {"product": "debian", "vendor": "debian", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["

    welcome to nginx on debian!

    "], "case-insensitive": true}]}], "_source_file": "debian\\debian.yaml"}, {"id": "dedecms", "info": {"name": "dedecms", "author": "cn-kali-team", "tags": "detect,tech,dedecms", "severity": "info", "metadata": {"product": "dedecms", "vendor": "dedecms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/templets/default/style/dedecms.css", "dedecms"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["name=\"dede_fields", "name=\"dede_fieldshash"], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["", "name=\"q\""], "condition": "and", "case-insensitive": true}, {"type": "word", "words": ["power by dedecms", "

    dedecms error warning!

    ", "content=\"order by dede58.com\" />", "http://www.dedecms.com/", "power by dedecms"], "case-insensitive": true}]}], "_source_file": "dedecms\\dedecms.yaml"}, {"id": "dse855", "info": {"name": "dse855", "author": "cn-kali-team", "tags": "detect,tech,dse855", "severity": "info", "metadata": {"fofa-query": ["deep sea electronics"], "product": "dse855", "vendor": "deep sea electronics", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["deep sea electronics"], "case-insensitive": true}]}], "_source_file": "Deep Sea Electronics\\dse855.yaml"}, {"id": "emc_avamar,emc_integrated_data_protection_appliance", "info": {"name": "emc_avamar,emc_integrated_data_protection_appliance", "author": "cn-kali-team", "tags": "detect,tech,emc_avamar,emc_integrated_data_protection_appliance", "severity": "info", "metadata": {"product": "emc_avamar,emc_integrated_data_protection_appliance", "shodan-query": ["title:\"avamar\""], "vendor": "dell", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>avamar.*?"]}]}], "_source_file": "dell\\emc_avamar,emc_integrated_data_protection_appliance.yaml"}, {"id": "huemagic", "info": {"name": "huemagic", "author": "cn-kali-team", "tags": "detect,tech,huemagic", "severity": "info", "metadata": {"fofa-query": ["title=\"node-red\""], "google-query": ["intitle:\"node-red\""], "product": "huemagic", "shodan-query": ["title:\"node-red\"", "http.title:\"node-red\""], "vendor": "dgtl", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>node-red.*?"]}]}], "_source_file": "dgtl\\huemagic.yaml"}, {"id": "drawio", "info": {"name": "drawio", "author": "cn-kali-team", "tags": "detect,tech,drawio", "severity": "info", "metadata": {"fofa-query": ["title=\"flowchart maker\""], "google-query": ["intitle:\"flowchart maker\""], "product": "drawio", "shodan-query": ["http.title:\"flowchart maker\""], "vendor": "diagrams", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>flowchart maker.*?"]}]}], "_source_file": "diagrams\\drawio.yaml"}, {"id": "hoteldruid", "info": {"name": "hoteldruid", "author": "cn-kali-team", "tags": "detect,tech,hoteldruid", "severity": "info", "metadata": {"fofa-query": ["title=\"hoteldruid\"", "icon_hash=-1521640213"], "google-query": ["intitle:\"hoteldruid\""], "product": "hoteldruid", "shodan-query": ["http.title:\"hoteldruid\"", "http.favicon.hash:-1521640213", "title:\"hoteldruid\""], "vendor": "digitaldruid", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1521640213"]}, {"type": "regex", "regex": ["(?mi)]*>hoteldruid.*?"]}]}], "_source_file": "digitaldruid\\hoteldruid.yaml"}, {"id": "central_wifimanager", "info": {"name": "central_wifimanager", "author": "cn-kali-team", "tags": "detect,tech,central_wifimanager", "severity": "info", "metadata": {"product": "central_wifimanager", "shodan-query": ["html:\"d-link central wifimanager\""], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["d-link central wifimanager"], "case-insensitive": true}]}], "_source_file": "dlink\\central_wifimanager.yaml"}, {"id": "d-view_8", "info": {"name": "d-view_8", "author": "cn-kali-team", "tags": "detect,tech,d-view_8", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-1317621215\""], "product": "d-view_8", "shodan-query": ["http.favicon.hash:-1317621215", "http.favicon.hash:\"-1317621215\""], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1317621215"]}]}], "_source_file": "dlink\\d-view_8.yaml"}, {"id": "dar-8000-10_firmware", "info": {"name": "dar-8000-10_firmware", "author": "cn-kali-team", "tags": "detect,tech,dar-8000-10_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"dar-8000-10\" && title=\"d-link\""], "product": "dar-8000-10_firmware", "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": [" title=\"d-link", "dar-8000-10\" "], "case-insensitive": true}]}], "_source_file": "dlink\\dar-8000-10_firmware.yaml"}, {"id": "dir-605l_firmware", "info": {"name": "dir-605l_firmware", "author": "cn-kali-team", "tags": "detect,tech,dir-605l_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"l_tb>dir-605\""], "product": "dir-605l_firmware", "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["l_tb>dir-605"], "case-insensitive": true}]}], "_source_file": "dlink\\dir-605l_firmware.yaml"}, {"id": "dir-615", "info": {"name": "dir-615", "author": "cn-kali-team", "tags": "detect,tech,dir-615", "severity": "info", "metadata": {"product": "dir-615", "shodan-query": ["http.title:\"roteador wireless\"", "cpe:\"cpe:2.3:h:dlink:dir-615\""], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>roteador wireless.*?"]}]}], "_source_file": "dlink\\dir-615.yaml"}, {"id": "dir-816l_firmware", "info": {"name": "dir-816l_firmware", "author": "cn-kali-team", "tags": "detect,tech,dir-816l_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"dir-816l\""], "product": "dir-816l_firmware", "shodan-query": ["html:\"dir-816l\"", "http.html:\"dir-816l\""], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dir-816l"], "case-insensitive": true}]}], "_source_file": "dlink\\dir-816l_firmware.yaml"}, {"id": "dir-845l", "info": {"name": "dir-845l", "author": "cn-kali-team", "tags": "detect,tech,dir-845l", "severity": "info", "metadata": {"product": "dir-845l", "shodan-query": ["dir-845l"], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dir-845l"], "case-insensitive": true}]}], "_source_file": "dlink\\dir-845l.yaml"}, {"id": "dlink", "info": {"name": "dlink", "author": "cn-kali-team", "tags": "detect,tech,dlink", "severity": "info", "metadata": {"fofa-query": ["title=\"ac集中管理平台\" && body=\"d-link路由器管理页\"", "body=\"text:in order to access the sharecenter\""], "product": "dlink", "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["text:in order to access the sharecenter"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*> body=\"d-link路由器管理页.*?", "(?mi)]*>ac集中管理平台\" .*?"]}]}], "_source_file": "dlink\\dlink.yaml"}, {"id": "dns-320l", "info": {"name": "dns-320l", "author": "cn-kali-team", "tags": "detect,tech,dns-320l", "severity": "info", "metadata": {"fofa-query": ["body=\"text:in order to access the sharecenter\""], "product": "dns-320l", "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["text:in order to access the sharecenter"], "case-insensitive": true}]}], "_source_file": "dlink\\dns-320l.yaml"}, {"id": "dns-320_firmware", "info": {"name": "dns-320_firmware", "author": "cn-kali-team", "tags": "detect,tech,dns-320_firmware", "severity": "info", "metadata": {"fofa-query": ["body=\"sharecenter\""], "product": "dns-320_firmware", "shodan-query": ["http.html:\"sharecenter\"", "html:\"sharecenter\""], "vendor": "dlink", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["sharecenter"], "case-insensitive": true}]}], "_source_file": "dlink\\dns-320_firmware.yaml"}, {"id": "dotnetnuke", "info": {"name": "dotnetnuke", "author": "cn-kali-team", "tags": "detect,tech,dotnetnuke", "severity": "info", "metadata": {"fofa-query": ["app=\"dotnetnuke\"", "set-cookie: dnn_ismobile", "icon_hash=\"-1465479343\""], "product": "dotnetnuke", "shodan-query": ["set-cookie: dnn_ismobile", "http.favicon.hash:-1465479343"], "vendor": "dnnsoftware", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["set-cookie: dnn_ismobile"], "case-insensitive": true}, {"type": "favicon", "hash": ["-1465479343"]}]}], "_source_file": "dnnsoftware\\dotnetnuke.yaml"}, {"id": "document_locator", "info": {"name": "document_locator", "author": "cn-kali-team", "tags": "detect,tech,document_locator", "severity": "info", "metadata": {"fofa-query": ["title=\"document locator - webtools\""], "google-query": ["intitle:\"document locator - webtools\""], "product": "document_locator", "shodan-query": ["title:\"document locator - webtools\"", "http.title:\"document locator - webtools\""], "vendor": "documentlocator", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>document locator - webtools.*?"]}]}], "_source_file": "documentlocator\\document_locator.yaml"}, {"id": "dogtagpki", "info": {"name": "dogtagpki", "author": "cn-kali-team", "tags": "detect,tech,dogtagpki", "severity": "info", "metadata": {"fofa-query": ["title=\"identity management\"", "title=\"identity management\" html:\"freeipa\""], "google-query": ["intitle:\"identity management\" html:\"freeipa\""], "product": "dogtagpki", "shodan-query": ["title:\"identity management\" html:\"freeipa\"", "http.title:\"identity management\" html:\"freeipa\""], "vendor": "dogtagpki", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>identity management\" html:\"freeipa.*?", "(?mi)]*>identity management.*?"]}]}], "_source_file": "dogtagpki\\dogtagpki.yaml"}, {"id": "dokuwiki", "info": {"name": "dokuwiki", "author": "cn-kali-team", "tags": "detect,tech,dokuwiki", "severity": "info", "metadata": {"product": "dokuwiki", "vendor": "dokuwiki", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["
    ]*>dotcms.*?"]}]}], "_source_file": "dotcms\\dotcms.yaml"}, {"id": "blogengine.net", "info": {"name": "blogengine.net", "author": "cn-kali-team", "tags": "detect,tech,blogengine.net", "severity": "info", "metadata": {"fofa-query": ["body=\"blogengine.net\""], "product": "blogengine.net", "shodan-query": ["http.html:\"blogengine.net\""], "vendor": "dotnetblogengine", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["blogengine.net"], "case-insensitive": true}]}], "_source_file": "dotnetblogengine\\blogengine.net.yaml"}, {"id": "vigor", "info": {"name": "vigor", "author": "cn-kali-team", "tags": "detect,tech,vigor", "severity": "info", "metadata": {"fofa-query": ["\"excanvas.js\" && \"lang == \\\"zh-cn\\\"\" && \"detectlang\" && server==\"dws\""], "product": "vigor", "vendor": "draytek", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["detectlang", "excanvas.js"], "case-insensitive": true}]}], "_source_file": "draytek\\vigor.yaml"}, {"id": "vigor300b", "info": {"name": "vigor300b", "author": "cn-kali-team", "tags": "detect,tech,vigor300b", "severity": "info", "metadata": {"fofa-query": ["\"excanvas.js\" && \"lang == \\\"zh-cn\\\"\" && \"detectlang\" && server==\"dws\""], "product": "vigor300b", "vendor": "draytek", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["detectlang", "excanvas.js"], "case-insensitive": true}]}], "_source_file": "draytek\\vigor300b.yaml"}, {"id": "vigorconnect", "info": {"name": "vigorconnect", "author": "cn-kali-team", "tags": "detect,tech,vigorconnect", "severity": "info", "metadata": {"fofa-query": ["body=\"vigorconnect\""], "product": "vigorconnect", "shodan-query": ["http.html:\"vigorconnect\""], "vendor": "draytek", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["vigorconnect"], "case-insensitive": true}]}], "_source_file": "draytek\\vigorconnect.yaml"}, {"id": "opendreambox", "info": {"name": "opendreambox", "author": "cn-kali-team", "tags": "detect,tech,opendreambox", "severity": "info", "metadata": {"fofa-query": ["title=\"dreambox webcontrol\""], "google-query": ["intitle:\"dreambox webcontrol\""], "product": "opendreambox", "shodan-query": ["title:\"dreambox webcontrol\"", "http.title:\"dreambox webcontrol\""], "vendor": "dreambox", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>dreambox webcontrol.*?"]}]}], "_source_file": "dreambox\\opendreambox.yaml"}, {"id": "drupal", "info": {"name": "drupal", "author": "cn-kali-team", "tags": "detect,tech,drupal", "severity": "info", "metadata": {"product": "drupal", "vendor": "drupal", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/misc/drupal.js", "/sites/all/modules/", "/sites/all/themes/", "/sites/default/files/", "drupal.settings", "powered by drupal", "jquery.extend(drupal.settings"], "case-insensitive": true}]}], "_source_file": "drupal\\drupal.yaml"}, {"id": "spectrum_server_firmware", "info": {"name": "spectrum_server_firmware", "author": "cn-kali-team", "tags": "detect,tech,spectrum_server_firmware", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"868509217\""], "product": "spectrum_server_firmware", "shodan-query": ["http.favicon.hash:868509217", "http.favicon.hash:\"868509217\""], "vendor": "dw", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["868509217"]}]}], "_source_file": "dw\\spectrum_server_firmware.yaml"}, {"id": "dzzoffice", "info": {"name": "dzzoffice", "author": "cn-kali-team", "tags": "detect,tech,dzzoffice", "severity": "info", "metadata": {"product": "dzzoffice", "shodan-query": ["http.html:\"dzzoffice\""], "vendor": "dzzoffice", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["dzzoffice"], "case-insensitive": true}]}], "_source_file": "dzzoffice\\dzzoffice.yaml"}, {"id": "zentao", "info": {"name": "zentao", "author": "cn-kali-team", "tags": "detect,tech,zentao", "severity": "info", "metadata": {"fofa-query": ["zentao"], "product": "zentao", "shodan-query": ["http.title:\"zentao\""], "vendor": "easycorp", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["zentao"], "case-insensitive": true}]}], "_source_file": "easycorp\\zentao.yaml"}, {"id": "mojarra", "info": {"name": "mojarra", "author": "cn-kali-team", "tags": "detect,tech,mojarra", "severity": "info", "metadata": {"fofa-query": ["body=\"javax.faces.viewstate\"", "body=\"javax.faces.resource\""], "product": "mojarra", "shodan-query": ["html:\"javax.faces.resource\"", "http.html:\"javax.faces.viewstate\"", "http.html:\"javax.faces.resource\""], "vendor": "eclipse", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["javax.faces.resource", "javax.faces.viewstate"], "case-insensitive": true}]}], "_source_file": "eclipse\\mojarra.yaml"}, {"id": "ectouch", "info": {"name": "ectouch", "author": "cn-kali-team", "tags": "detect,tech,ectouch", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"127711143\""], "product": "ectouch", "vendor": "ectouch", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["127711143"]}]}], "_source_file": "ectouch\\ectouch.yaml"}, {"id": "open_edx", "info": {"name": "open_edx", "author": "cn-kali-team", "tags": "detect,tech,open_edx", "severity": "info", "metadata": {"fofa-query": ["body=\"open edx\""], "product": "open_edx", "shodan-query": ["http.html:\"open edx\""], "vendor": "edx", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["open edx"], "case-insensitive": true}]}], "_source_file": "edx\\open_edx.yaml"}, {"id": "timetrax", "info": {"name": "timetrax", "author": "cn-kali-team", "tags": "detect,tech,timetrax", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-661694518\""], "product": "timetrax", "vendor": "efrotech", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-661694518"]}]}], "_source_file": "efroTech\\timetrax.yaml"}, {"id": "elastic", "info": {"name": "elastic", "author": "cn-kali-team", "tags": "detect,tech,elastic", "severity": "info", "metadata": {"product": "elastic", "vendor": "elastic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["7d0688b40ba64da737b12a3257e6c7b3"]}, {"type": "word", "words": ["elastic"], "case-insensitive": true}, {"type": "word", "words": ["kbn-license-sig:"], "part": "header", "case-insensitive": true}]}], "_source_file": "elastic\\elastic.yaml"}, {"id": "elasticsearch", "info": {"name": "elasticsearch", "author": "cn-kali-team", "tags": "detect,tech,elasticsearch", "severity": "info", "metadata": {"fofa-query": ["index_not_found_exception"], "product": "elasticsearch", "vendor": "elastic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["index_not_found_exception"], "case-insensitive": true}]}], "_source_file": "elastic\\elasticsearch.yaml"}, {"id": "kibana", "info": {"name": "kibana", "author": "cn-kali-team", "tags": "detect,tech,kibana", "severity": "info", "metadata": {"fofa-query": ["title=\"kibana\""], "google-query": ["intitle:\"kibana\""], "product": "kibana", "shodan-query": ["http.title:\"kibana\""], "vendor": "elastic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>kibana.*?"]}]}], "_source_file": "elastic\\kibana.yaml"}, {"id": "logstash", "info": {"name": "logstash", "author": "cn-kali-team", "tags": "detect,tech,logstash", "severity": "info", "metadata": {"product": "logstash", "shodan-query": ["html:\"logstash\""], "vendor": "elastic", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["logstash"], "case-insensitive": true}]}], "_source_file": "elastic\\logstash.yaml"}, {"id": "elasticsearch", "info": {"name": "elasticsearch", "author": "cn-kali-team", "tags": "detect,tech,elasticsearch", "severity": "info", "metadata": {"product": "elasticsearch", "vendor": "elasticsearch", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["6177bfb75b498e0bb356223ed76ffe43"]}, {"type": "word", "words": [" \"tagline\" : \"you know, for search\""], "case-insensitive": true}]}], "_source_file": "elasticsearch\\elasticsearch.yaml"}, {"id": "eleanor_cms", "info": {"name": "eleanor_cms", "author": "cn-kali-team", "tags": "detect,tech,eleanor_cms", "severity": "info", "metadata": {"fofa-query": ["body=\"eleanor\""], "product": "eleanor_cms", "shodan-query": ["html:\"eleanor\"", "http.html:\"eleanor\"", "cpe:\"cpe:2.3:a:eleanor-cms:eleanor_cms\""], "vendor": "eleanor-cms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["eleanor"], "case-insensitive": true}]}], "_source_file": "eleanor-cms\\eleanor_cms.yaml"}, {"id": "elgg", "info": {"name": "elgg", "author": "cn-kali-team", "tags": "detect,tech,elgg", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"413602919\""], "product": "elgg", "vendor": "elgg", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["413602919"]}]}], "_source_file": "elgg\\elgg.yaml"}, {"id": "ethos_identity", "info": {"name": "ethos_identity", "author": "cn-kali-team", "tags": "detect,tech,ethos_identity", "severity": "info", "metadata": {"fofa-query": ["body=\"ellucian company\""], "google-query": ["login with ellucian ethos identity"], "product": "ethos_identity", "shodan-query": ["html:\"ellucian company\"", "http.html:\"ellucian company\""], "vendor": "ellucian", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["ellucian company"], "case-insensitive": true}]}], "_source_file": "ellucian\\ethos_identity.yaml"}, {"id": "embedthis-appweb", "info": {"name": "embedthis-appweb", "author": "cn-kali-team", "tags": "detect,tech,embedthis-appweb", "severity": "info", "metadata": {"product": "appweb", "vendor": "embedthis", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: embedthis-appweb"], "part": "header", "case-insensitive": true}]}], "_source_file": "embedthis\\appweb.yaml"}, {"id": "emby", "info": {"name": "emby", "author": "cn-kali-team", "tags": "detect,tech,emby", "severity": "info", "metadata": {"product": "emby", "vendor": "emby", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"emby server\""], "case-insensitive": true}]}], "_source_file": "emby\\emby.yaml"}, {"id": "emlog", "info": {"name": "emlog", "author": "cn-kali-team", "tags": "detect,tech,emlog", "severity": "info", "metadata": {"fofa-query": ["title=\"emlog\""], "product": "emlog", "vendor": "emlog", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>emlog.*?"]}]}], "_source_file": "emlog\\emlog.yaml"}, {"id": "episerver", "info": {"name": "episerver", "author": "cn-kali-team", "tags": "detect,tech,episerver", "severity": "info", "metadata": {"product": "episerver", "vendor": "episerver", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/javascript/episerverscriptmanager.js", "content=\"episerver"], "case-insensitive": true}]}], "_source_file": "episerver\\episerver.yaml"}, {"id": "scoold", "info": {"name": "scoold", "author": "cn-kali-team", "tags": "detect,tech,scoold", "severity": "info", "metadata": {"product": "scoold", "shodan-query": ["html:\"scoold-wrapper\""], "vendor": "erudika", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["scoold-wrapper"], "case-insensitive": true}]}], "_source_file": "erudika\\scoold.yaml"}, {"id": "erxes", "info": {"name": "erxes", "author": "cn-kali-team", "tags": "detect,tech,erxes", "severity": "info", "metadata": {"fofa-query": ["title=\"erxes\""], "google-query": ["intitle:\"erxes\""], "product": "erxes", "shodan-query": ["http.title:\"erxes\""], "vendor": "erxes", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>erxes.*?"]}]}], "_source_file": "erxes\\erxes.yaml"}, {"id": "cdg", "info": {"name": "cdg", "author": "cn-kali-team", "tags": "detect,tech,cdg", "severity": "info", "metadata": {"fofa-query": ["title=\"电子文档安全管理系统\",body=\"cdgserver3/\"", "esafenet"], "product": "cdg", "vendor": "esafenet", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["esafenet"], "case-insensitive": true}, {"type": "regex", "regex": ["(?mi)]*>电子文档安全管理系统\",body=\"cdgserver3/.*?"]}]}], "_source_file": "esafenet\\cdg.yaml"}, {"id": "electronic_document_security_management_system", "info": {"name": "electronic_document_security_management_system", "author": "cn-kali-team", "tags": "detect,tech,electronic_document_security_management_system", "severity": "info", "metadata": {"fofa-query": ["title=\"电子文档安全管理系统\",body=\"cdgserver3/\"", "title=\"电子文档安全管理系统\""], "hunter-query": ["web.title=\"电子文档安全管理系统\",web.body=\"cdgserver3/\""], "product": "electronic_document_security_management_system", "vendor": "esafenet", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>电子文档安全管理系统\",body=\"cdgserver3/.*?", "(?mi)]*>电子文档安全管理系统.*?"]}]}], "_source_file": "esafenet\\electronic_document_security_management_system.yaml"}, {"id": "esafenet", "info": {"name": "esafenet", "author": "cn-kali-team", "tags": "detect,tech,esafenet", "severity": "info", "metadata": {"fofa-query": ["title=\"电子文档安全管理系统\",body=\"cdgserver3/\""], "product": "esafenet", "vendor": "esafenet", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>电子文档安全管理系统\",body=\"cdgserver3/.*?"]}]}], "_source_file": "esafenet\\esafenet.yaml"}, {"id": "reliance", "info": {"name": "reliance", "author": "cn-kali-team", "tags": "detect,tech,reliance", "severity": "info", "metadata": {"fofa-query": ["body=\"etq reliance\""], "product": "reliance", "shodan-query": ["html:\"etq reliance\""], "vendor": "etq", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["etq reliance"], "case-insensitive": true}]}], "_source_file": "etq\\reliance.yaml"}, {"id": "etl3100", "info": {"name": "etl3100", "author": "cn-kali-team", "tags": "detect,tech,etl3100", "severity": "info", "metadata": {"fofa-query": ["body=\"etl3100\""], "product": "etl3100", "shodan-query": ["html:\"etl3100\""], "vendor": "eurotel", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["etl3100"], "case-insensitive": true}]}], "_source_file": "eurotel\\etl3100.yaml"}, {"id": "eventum", "info": {"name": "eventum", "author": "cn-kali-team", "tags": "detect,tech,eventum", "severity": "info", "metadata": {"fofa-query": ["icon_hash=305412257"], "product": "eventum", "shodan-query": ["http.favicon.hash:305412257"], "vendor": "eventum_project", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["305412257"]}]}], "_source_file": "eventum_project\\eventum.yaml"}, {"id": "extplorer", "info": {"name": "extplorer", "author": "cn-kali-team", "tags": "detect,tech,extplorer", "severity": "info", "metadata": {"product": "extplorer", "vendor": "extplorer", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/extplorer.ico"], "case-insensitive": true}]}], "_source_file": "extplorer\\extplorer.yaml"}, {"id": "extreme_management_center", "info": {"name": "extreme_management_center", "author": "cn-kali-team", "tags": "detect,tech,extreme_management_center", "severity": "info", "metadata": {"fofa-query": ["title=\"extreme management center\""], "google-query": ["intitle:\"extreme management center\""], "product": "extreme_management_center", "shodan-query": ["title:\"extreme management center\"", "http.title:\"extreme management center\""], "vendor": "extremenetworks", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>extreme management center.*?"]}]}], "_source_file": "extremenetworks\\extreme_management_center.yaml"}, {"id": "eyesofnetwork", "info": {"name": "eyesofnetwork", "author": "cn-kali-team", "tags": "detect,tech,eyesofnetwork", "severity": "info", "metadata": {"fofa-query": ["title=\"eyesofnetwork\""], "product": "eyesofnetwork", "shodan-query": ["html:\"eyesofnetwork\""], "vendor": "eyesofnetwork", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["eyesofnetwork"], "case-insensitive": true}]}], "_source_file": "eyesofnetwork\\eyesofnetwork.yaml"}, {"id": "eyoucms", "info": {"name": "eyoucms", "author": "cn-kali-team", "tags": "detect,tech,eyoucms", "severity": "info", "metadata": {"product": "eyoucms", "vendor": "eyoucms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["name=\"generator\" content=\"eyoucms", "powered by eyoucms"], "case-insensitive": true}]}], "_source_file": "eyoucms\\eyoucms.yaml"}, {"id": "f5-big-ip", "info": {"name": "f5-big-ip", "author": "cn-kali-team", "tags": "detect,tech,f5-big-ip", "severity": "info", "metadata": {"product": "big-ip", "vendor": "f5", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["content=\"f5 networks, inc.\""], "case-insensitive": true}, {"type": "word", "words": ["set-cookie: bigipserverpool"], "part": "header", "case-insensitive": true}]}], "_source_file": "f5\\big-ip.yaml"}, {"id": "big-ip_access_policy_manager", "info": {"name": "big-ip_access_policy_manager", "author": "cn-kali-team", "tags": "detect,tech,big-ip_access_policy_manager", "severity": "info", "metadata": {"fofa-query": ["title=\"big-ip®-+redirect\" +\"server\""], "google-query": ["intitle:\"big-ip®-+redirect\" +\"server\""], "product": "big-ip_access_policy_manager", "shodan-query": ["http.title:\"big-ip®-+redirect\" +\"server\""], "vendor": "f5", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>big-ip.*?"]}]}], "_source_file": "f5\\big-ip_access_policy_manager.yaml"}, {"id": "nginx", "info": {"name": "nginx", "author": "cn-kali-team", "tags": "detect,tech,nginx", "severity": "info", "metadata": {"product": "nginx", "vendor": "f5", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["server: nginx"], "part": "header", "case-insensitive": true}], "extractors": [{"name": "version", "part": "header", "type": "regex", "regex": ["(?x)nginx\\/(\\d+\\.\\d+\\.\\d+)"]}]}], "_source_file": "f5\\nginx.yaml"}, {"id": "fastadmin", "info": {"name": "fastadmin", "author": "cn-kali-team", "tags": "detect,tech,fastadmin", "severity": "info", "metadata": {"fofa-query": ["app=\"fastadmin-框架\"", "icon_hash=\"-1036943727\""], "product": "fastadmin", "vendor": "fastadmin", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1036943727"]}]}], "_source_file": "fastadmin\\fastadmin.yaml"}, {"id": "fastbee", "info": {"name": "fastbee", "author": "cn-kali-team", "tags": "detect,tech,fastbee", "severity": "info", "metadata": {"fofa-query": ["fastbee"], "product": "fastbee", "vendor": "fastbee", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["fastbee"], "case-insensitive": true}]}], "_source_file": "fastbee\\fastbee.yaml"}, {"id": "vec40g", "info": {"name": "vec40g", "author": "cn-kali-team", "tags": "detect,tech,vec40g", "severity": "info", "metadata": {"fofa-query": ["title=\"飞鱼星企业级智能上网行为管理系统\""], "product": "vec40g", "vendor": "feiyuxing", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>飞鱼星企业级智能上网行为管理系统.*?"]}]}], "_source_file": "feiyuxing\\vec40g.yaml"}, {"id": "fieldpopupnewsletter", "info": {"name": "fieldpopupnewsletter", "author": "cn-kali-team", "tags": "detect,tech,fieldpopupnewsletter", "severity": "info", "metadata": {"fofa-query": ["body=\"fieldpopupnewsletter\""], "product": "fieldpopupnewsletter", "shodan-query": ["html:\"fieldpopupnewsletter\"", "http.html:\"fieldpopupnewsletter\""], "vendor": "fieldthemes", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["fieldpopupnewsletter"], "case-insensitive": true}]}], "_source_file": "fieldthemes\\fieldpopupnewsletter.yaml"}, {"id": "finecms", "info": {"name": "finecms", "author": "cn-kali-team", "tags": "detect,tech,finecms", "severity": "info", "metadata": {"product": "finecms", "vendor": "finecms", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["/statics/js/dayrui.js", "copyright\" content=\"finecms", "dayrui@gmail.com", "powered by finecms"], "case-insensitive": true}]}], "_source_file": "finecms\\finecms.yaml"}, {"id": "1panel", "info": {"name": "1panel", "author": "cn-kali-team", "tags": "detect,tech,1panel", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"1300107149\" || icon_hash=\"1453309674\" || cert.issuer.cn=\"1panel intermediate ca\""], "product": "1panel", "vendor": "fit2cloud", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["1300107149", "1453309674"]}]}], "_source_file": "fit2cloud\\1panel.yaml"}, {"id": "jumpserver", "info": {"name": "jumpserver", "author": "cn-kali-team", "tags": "detect,tech,jumpserver", "severity": "info", "metadata": {"fofa-query": ["title=\"jumpserver\""], "product": "jumpserver", "vendor": "fit2cloud", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>jumpserver.*?"]}]}], "_source_file": "fit2cloud\\jumpserver.yaml"}, {"id": "kubeoperator", "info": {"name": "kubeoperator", "author": "cn-kali-team", "tags": "detect,tech,kubeoperator", "severity": "info", "metadata": {"fofa-query": ["app=\"kubeoperator\"", "body=\"kubeoperator\""], "product": "kubeoperator", "shodan-query": ["html:\"kubeoperator\"", "http.html:\"kubeoperator\""], "vendor": "fit2cloud", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["kubeoperator"], "case-insensitive": true}]}], "_source_file": "fit2cloud\\kubeoperator.yaml"}, {"id": "kubepi", "info": {"name": "kubepi", "author": "cn-kali-team", "tags": "detect,tech,kubepi", "severity": "info", "metadata": {"fofa-query": ["kubepi", "body=\"kubepi\""], "product": "kubepi", "shodan-query": ["html:\"kubepi\"", "http.html:\"kubepi\""], "vendor": "fit2cloud", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["kubepi"], "case-insensitive": true}]}], "_source_file": "fit2cloud\\kubepi.yaml"}, {"id": "flatpress", "info": {"name": "flatpress", "author": "cn-kali-team", "tags": "detect,tech,flatpress", "severity": "info", "metadata": {"fofa-query": ["body=\"flatpress\"", "icon_hash=-1189292869"], "product": "flatpress", "shodan-query": ["http.favicon.hash:-1189292869", "http.html:\"flatpress\""], "vendor": "flatpress", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["flatpress"], "case-insensitive": true}, {"type": "favicon", "hash": ["-1189292869"]}]}], "_source_file": "flatpress\\flatpress.yaml"}, {"id": "flexnet_publisher", "info": {"name": "flexnet_publisher", "author": "cn-kali-team", "tags": "detect,tech,flexnet_publisher", "severity": "info", "metadata": {"product": "flexnet_publisher", "shodan-query": ["title:\"flexnet\""], "vendor": "flexera", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>flexnet.*?"]}]}], "_source_file": "flexera\\flexnet_publisher.yaml"}, {"id": "ax8", "info": {"name": "ax8", "author": "cn-kali-team", "tags": "detect,tech,ax8", "severity": "info", "metadata": {"fofa-query": ["app=\"flir-ax8\""], "product": "ax8", "shodan-query": ["title:\"flir\""], "vendor": "flir", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>flir.*?"]}]}], "_source_file": "flir\\ax8.yaml"}, {"id": "flowise", "info": {"name": "flowise", "author": "cn-kali-team", "tags": "detect,tech,flowise", "severity": "info", "metadata": {"fofa-query": ["title=\"flowise\""], "product": "flowise", "shodan-query": ["title:\"flowise\""], "vendor": "flowiseai", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>flowise.*?"]}]}], "_source_file": "flowiseai\\flowise.yaml"}, {"id": "flowpaper", "info": {"name": "flowpaper", "author": "cn-kali-team", "tags": "detect,tech,flowpaper", "severity": "info", "metadata": {"fofa-query": ["title=\"flexpaper\""], "product": "flowpaper", "shodan-query": ["title:\"flexpaper\""], "vendor": "flowpaper", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>flexpaper.*?"]}]}], "_source_file": "flowpaper\\flowpaper.yaml"}, {"id": "fogproject", "info": {"name": "fogproject", "author": "cn-kali-team", "tags": "detect,tech,fogproject", "severity": "info", "metadata": {"fofa-query": ["icon_hash=\"-1952619005\""], "product": "fogproject", "vendor": "fogproject", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "favicon", "hash": ["-1952619005"]}]}], "_source_file": "fogproject\\fogproject.yaml"}, {"id": "am", "info": {"name": "am", "author": "cn-kali-team", "tags": "detect,tech,am", "severity": "info", "metadata": {"fofa-query": ["title=\"openam\""], "google-query": ["intitle:\"openam\""], "product": "am", "shodan-query": ["http.title:\"openam\""], "vendor": "forgerock", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>openam.*?"]}]}], "_source_file": "forgerock\\am.yaml"}, {"id": "openam", "info": {"name": "openam", "author": "cn-kali-team", "tags": "detect,tech,openam", "severity": "info", "metadata": {"fofa-query": ["title=\"openam\""], "google-query": ["intitle:\"openam\""], "product": "openam", "shodan-query": ["http.title:\"openam\""], "vendor": "forgerock", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "regex", "regex": ["(?mi)]*>openam.*?"]}]}], "_source_file": "forgerock\\openam.yaml"}, {"id": "fortinet-fortimail", "info": {"name": "fortinet-fortimail", "author": "cn-kali-team", "tags": "detect,tech,fortinet-fortimail", "severity": "info", "metadata": {"product": "fortimail", "vendor": "fortinet", "verified": true}}, "http": [{"method": "GET", "path": ["{{BaseURL}}/"], "matchers": [{"type": "word", "words": ["", "is_equal": true }] }, { "name": "TwonkyServer", "logic": "a||b||c||d|| (e&&f)", "rule": [{ "label": "a", "feature": "TwonkyMedia server media browser", "is_equal": true }, { "label": "b", "feature": "TwonkyServer Media Browser", "is_equal": true }, { "label": "c", "feature": "TwonkyMedia UPnP", "is_equal": true }, { "label": "d", "feature": "TwonkyMedia UPnP", "is_equal": true }, { "label": "e", "feature": "", "is_equal": true }, { "label": "f", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "TMAILER_SUITE-TMAILER Mail System", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Tmailer", "is_equal": true }, { "label": "b", "feature": "content=\\\"Tmailer", "is_equal": true }, { "label": "c", "feature": "href=\\\"/tmailer/img/logo/favicon.ico", "is_equal": true }] }, { "name": "PHPDisk", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by PHPDisk", "is_equal": true }, { "label": "b", "feature": "content=\\\"PHPDisk", "is_equal": true }] }, { "name": "Storage System", "logic": "a", "rule": [{ "label": "a", "feature": "\u5173\u4e8e\u5168\u7f51\u90e8\u7f72\u91d1\u5c71\u6bd2\u9738\u4f01\u4e1a\u7248", "is_equal": true }] }, { "name": "Kedacom-SXMS trial system", "logic": "a||b", "rule": [{ "label": "a", "feature": "titlename = \\\"SXMS\u5ba1\u8baf\u4e1a\u52a1\u7ba1\u7406\u7cfb\u7edf\\\";", "is_equal": true }, { "label": "b", "feature": "classid=\\\"clsid:01DFB4B4-0E07-4e3f-8B7A-98FD6BFF153F\\\" codebase=\\\"files/ofctnewclsid.cab", "is_equal": true }] }, { "name": "Vacron-NVR", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "DVR_NETRA", "is_equal": true }, { "label": "b", "feature": "name=\\\"vacron nvr login", "is_equal": true }, { "label": "c", "feature": "Vacron NVR", "is_equal": true }, { "label": "d", "feature": "VACRON", "is_equal": true }] }, { "name": "ZyWALL-USG-300", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZyWALL USG 300", "is_equal": true }, { "label": "b", "feature": "ZyWALL USG 300", "is_equal": true }] }, { "name": "ZyWALL-USG-200", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZyWALL USG 200", "is_equal": true }, { "label": "b", "feature": "ZyWALL USG 200", "is_equal": true }] }, { "name": "ZyXEL-ZyWALL-310", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZyWALL 310", "is_equal": true }, { "label": "b", "feature": "ZyWALL 310", "is_equal": true }] }, { "name": "ZyXEL-ZyWALL-USG-20W", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZyWALL USG 20W", "is_equal": true }, { "label": "b", "feature": "ZyWALL USG 20W", "is_equal": true }] }, { "name": "ZyXEL-ZyWALL-USG-1000", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "ZyWALL USG 1000", "is_equal": true }, { "label": "b", "feature": "ZyWALL USG 1000", "is_equal": true }, { "label": "c", "feature": "USG 1000", "is_equal": true }] }, { "name": "ZyXEL-ZYWALL-1100", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZYWALL 1100", "is_equal": true }, { "label": "b", "feature": "ZyWALL 1100", "is_equal": true }] }, { "name": "ZyWALL-USG100-PLUS", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZyWALL USG100-PLUS", "is_equal": true }, { "label": "b", "feature": "USG100-PLUS", "is_equal": true }] }, { "name": "Soffice", "logic": "a", "rule": [{ "label": "a", "feature": "Soffice", "is_equal": true }] }, { "name": "H3C-SecBlade-Firewall", "logic": "a||b", "rule": [{ "label": "a", "feature": "H3C Firewall SecBlade", "is_equal": true }, { "label": "b", "feature": "H3C SecBlade FW", "is_equal": true }] }, { "name": "UBB-Forum", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by UBB.classic&trade", "is_equal": true }] }, { "name": "H3C-SR8803-X-S", "logic": "a", "rule": [{ "label": "a", "feature": "H3C SR8803-X-S", "is_equal": true }] }, { "name": "Terminal feature acquisition control system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "\u7ec8\u7aef\u7279\u5f81\u91c7\u96c6\u7ba1\u63a7\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "/Home/PkiBindUser?subjectname=", "is_equal": true }] }, { "name": "H3C-Series-Router-MSR900", "logic": "a", "rule": [{ "label": "a", "feature": "H3C Series Router MSR900", "is_equal": true }] }, { "name": "H3C-Series-Router-MSR26-00", "logic": "a", "rule": [{ "label": "a", "feature": "H3C Series Router MSR26-00", "is_equal": true }] }, { "name": "H3C-Switch-S5120-28P-HPWR-SI", "logic": "a", "rule": [{ "label": "a", "feature": "H3C Switch S5120-28P-HPWR-SI", "is_equal": true }] }, { "name": "Hassan Software - Company Products", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "\u6c49\u7801\u8f6f\u4ef6", "is_equal": true }, { "label": "b", "feature": "alt=\\\"\u6c49\u7801\u8f6f\u4ef6LOGO", "is_equal": true }, { "label": "c", "feature": "content=\\\"\u6c49\u7801\u8f6f\u4ef6", "is_equal": true }] }, { "name": "winwebmail", "logic": "a||b||c|| (d&&e) || (f&&g) || (h&&i) ||j", "rule": [{ "label": "a", "feature": "winwebmail", "is_equal": true }, { "label": "b", "feature": "WinWebMail Server", "is_equal": true }, { "label": "c", "feature": "images/owin.css", "is_equal": true }, { "label": "d", "feature": "smtp", "is_equal": true }, { "label": "e", "feature": "WinWebMail", "is_equal": true }, { "label": "f", "feature": "

    ", "is_equal": true }, { "label": "g", "feature": "onclick=\\\"this.style.behavior='url(#default#homepage)';this.setHomePage", "is_equal": true }, { "label": "h", "feature": "type=\\\"hidden\\\" name=\\\"SecEx\\\"", "is_equal": true }, { "label": "i", "feature": "href=\\\"images\\\\hwem.css\\\"", "is_equal": true }, { "label": "j", "feature": "on WinWebMail", "is_equal": true }] }, { "name": "Shop_Builder-shopbuilder", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "content=\\\"ShopBuilder", "is_equal": true }, { "label": "b", "feature": "Powered by ShopBuilder", "is_equal": true }, { "label": "c", "feature": "ShopBuilder\u7248\u6743\u6240\u6709", "is_equal": true }] }, { "name": "HuaWei-U2000", "logic": "a", "rule": [{ "label": "a", "feature": "o=Huawei Technologies, ou=U2000", "is_equal": true }] }, { "name": "H3C-iMC", "logic": "(a&&b) ||c||d||e||f||g||h||i", "rule": [{ "label": "a", "feature": "iMC\u6765\u5bbe\u63a5\u5165\u81ea\u52a9\u7ba1\u7406\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "login_logo_h3c.png.jsf", "is_equal": true }, { "label": "c", "feature": "com_h3c_imc_usr_usermgr_alluser_overlaydiv", "is_equal": true }, { "label": "d", "feature": "action=\\\"/imc/login.jsf", "is_equal": true }, { "label": "e", "feature": "src=\\\"/imc/javax.faces.resource/images/login_logo_h3c.png.jsf?ln=primefaces-imc-new-webui", "is_equal": true }, { "label": "f", "feature": "H3C \u667a\u80fd\u7ba1\u7406\u4e2d\u5fc3", "is_equal": true }, { "label": "g", "feature": "src=\\\"/imc/faces/extensionResource/com.h3c.imc.component.util.ExtensionResourceLoader/", "is_equal": true }, { "label": "h", "feature": "H3C 智能管理中心", "is_equal": true }, { "label": "i", "feature": "href=\\\"/selfservice/javax.faces.resource/theme.css.xhtml?ln=primefaces-imc-classic-blue\\\"", "is_equal": true }] }, { "name": "dahua-DHI-XVR5216AN", "logic": "a", "rule": [{ "label": "a", "feature": "DHI-XVR5216AN", "is_equal": true }] }, { "name": "With -isum420g3 disk array", "logic": "a", "rule": [{ "label": "a", "feature": "iSUM420G3", "is_equal": true }] }, { "name": "Head data-external security data exchange system", "logic": "(a&&b) || (c&&d)", "rule": [{ "label": "a", "feature": "\u5916\u7f51\u5b89\u5168\u6570\u636e\u4ea4\u6362\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "/unimas/", "is_equal": true }, { "label": "c", "feature": "o=unimas", "is_equal": true }, { "label": "d", "feature": "cn=test/emailaddress=gjw@unimassystem.com", "is_equal": true }] }, { "name": "paloalto-VMware", "logic": "a", "rule": [{ "label": "a", "feature": "l=Palo Alto, ou=VMware", "is_equal": true }] }, { "name": "dahua-DHI-XVR7104H", "logic": "a", "rule": [{ "label": "a", "feature": "DHI-XVR7104H", "is_equal": true }] }, { "name": "dahua-DH-NVR4108HS-8P-HDS2", "logic": "a", "rule": [{ "label": "a", "feature": "DH-NVR4108HS-8P-HDS2", "is_equal": true }] }, { "name": "HuaWei-anyoffice", "logic": "(a&&b&&c) || (d||e) ||f||g||h", "rule": [{ "label": "a", "feature": "mdmserver", "is_equal": true }, { "label": "b", "feature": "onclick=\\\"changeLanguage", "is_equal": true }, { "label": "c", "feature": "cancelChangePWBtn", "is_equal": true }, { "label": "d", "feature": "o=HUAWEI, ou=AnyOffice", "is_equal": true }, { "label": "e", "feature": "cn=HUAWEI AnyOffice ROOT CA", "is_equal": true }, { "label": "f", "feature": "web client plugin.\\\")", "is_equal": true }] }, { "name": "NETGEAR-R6220", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "NETGEAR R6220", "is_equal": true }, { "label": "b", "feature": "NETGEAR R6220", "is_equal": true }, { "label": "c", "feature": "NETGEAR Router R6220 ", "is_equal": true }] }, { "name": "NETGEAR-R6400", "logic": "a|| (b&&c) || (d&&e) ||f||g", "rule": [{ "label": "a", "feature": "NETGEAR R6400", "is_equal": true }, { "label": "b", "feature": "var mmc = {", "is_equal": true }, { "label": "c", "feature": "Netgear R6400", "is_equal": true }, { "label": "d", "feature": "content=\\\"R6400\\\"", "is_equal": true }, { "label": "e", "feature": "Organization: NETGEAR", "is_equal": true }, { "label": "f", "feature": "Netgear R6400", "is_equal": true }, { "label": "g", "feature": "NETGEAR R6400", "is_equal": true }] }, { "name": "NETGEAR-R8000", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "NETGEAR R8000", "is_equal": true }, { "label": "b", "feature": "NETGEAR R8000", "is_equal": true }, { "label": "c", "feature": "Netgear R8000", "is_equal": true }, { "label": "d", "feature": "Netgear-R8000", "is_equal": true }] }, { "name": "Technical Supervision and Management Information System", "logic": "a", "rule": [{ "label": "a", "feature": "/EnterpriseServer/BZHGL/ADindex.htm", "is_equal": true }] }, { "name": "Information acquisition system", "logic": "(a||b) &&c", "rule": [{ "label": "a", "feature": "\u4fe1\u606f\u91c7\u96c6\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "LDAR\u6570\u636e\u91c7\u96c6\u7cfb\u7edf", "is_equal": true }, { "label": "c", "feature": "You need to enable JavaScript to run this app.", "is_equal": true }] }, { "name": "M & W-centralized payment system", "logic": "a", "rule": [{ "label": "a", "feature": "\u6284\u8868\u5668\u9a71\u52a8TP1100M", "is_equal": true }] }, { "name": "Puhua Technology -PowerPMS", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "AppHub.server.registerToHub(qrcodeid)", "is_equal": true }, { "label": "b", "feature": "/App_Themes/Default/assets/css/style.min.css", "is_equal": true }, { "label": "c", "feature": "/Scripts/boot.js", "is_equal": false }] }, { "name": "Goonie-network public opinion monitoring system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "alert(\\\"\u83dc\u5355\u5c42\u6570\u91cf\u548c\u5185\u5bb9\u5c42\u6570\u91cf\u4e0d\u4e00\u6837!\\\")", "is_equal": true }, { "label": "b", "feature": "\u7f51\u7edc\u8206\u60c5\u76d1\u63a7\u7cfb\u7edf", "is_equal": true }] }, { "name": "Vehicle management system", "logic": "a||b", "rule": [{ "label": "a", "feature": "url(/_layouts/images/ywgk/yanzhengbg.gif)", "is_equal": true }, { "label": "b", "feature": "background-image: url('IMAGE/bg-snippet1.png')", "is_equal": true }] }, { "name": "Logo - Company Products", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"btn btn-primary form-btn form-btn-login pull-right\\\"", "is_equal": true }] }, { "name": "Command dispatch management platform", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "action=\\\"/app/structure/departments.php", "is_equal": true }, { "label": "b", "feature": "id=\\\"formError\\\"", "is_equal": true }, { "label": "c", "feature": "\u6307\u6325\u8c03\u5ea6\u7ba1\u7406\u5e73\u53f0", "is_equal": true }] }, { "name": "IBM-TS3310", "logic": "a", "rule": [{ "label": "a", "feature": "HTTP-equiv=\\\"REFRESH\\\" content=\\\"0; url=/main_login.htm\\\"", "is_equal": true }] }, { "name": "Hitachi- Virtual Storage Platform", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/cgiSmrySet/SmrySet.cgi/CLK\\\"", "is_equal": true }] }, { "name": "Qianxin-Secfox", "logic": "(a&&b&&c) ||d||e||f|| (g&&h) ||i", "rule": [{ "label": "a", "feature": "id=mTokenPlugin width=0 height=0 style=\\\"position: absolute;LEFT: 0px; TOP: 0px\\\"", "is_equal": true }, { "label": "b", "feature": "type=application/x-xtx-axhost", "is_equal": true }, { "label": "c", "feature": "Organization: 360\u4f01\u4e1a\u5b89\u5168\u96c6\u56e2", "is_equal": true }, { "label": "d", "feature": "\u7f51\u795eSecFox\u5b89\u5168\u5ba1\u8ba1\u7cfb\u7edf", "is_equal": true }, { "label": "e", "feature": "SecFox-LAS-BH", "is_equal": true }, { "label": "f", "feature": "SecFox", "is_equal": true }, { "label": "g", "feature": "document.getElementById('pic').src", "is_equal": true }, { "label": "h", "feature": "class=\\\"secfox-login-browser-continue\\\"", "is_equal": true }, { "label": "i", "feature": "

    \u6b22\u8fce\u60a8\u4f7f\u7528\u7f51\u795eSecfox\u65e5\u5fd7\u6536\u96c6\u4e0e\u5206\u6790\u7cfb\u7edf", "is_equal": true }] }, { "name": "Kedacom-SVR2816", "logic": "a||b", "rule": [{ "label": "a", "feature": "SVR2816\u5ba2\u6237\u7aef\u4e0b\u8f7d", "is_equal": true }, { "label": "b", "feature": "", "is_equal": true }, { "label": "b", "feature": "\u78c1\u76d8\u9635\u5217\u7ba1\u7406\u7cfb\u7edf", "is_equal": true }] }, { "name": "Green Night Network-HSSE Information Management System", "logic": "a", "rule": [{ "label": "a", "feature": "Hsse \u7cfb\u7edf", "is_equal": true }] }, { "name": "Office platform", "logic": "a", "rule": [{ "label": "a", "feature": " href=\\\"XBSJ/css/login.css\\\"", "is_equal": true }] }, { "name": "Mobile office and work supervision system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "class=\\\"icon-container wrapper\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"icon iconXiNan\\\"", "is_equal": true }] }, { "name": "TMG165", "logic": "a&&b", "rule": [{ "label": "a", "feature": "TMG165", "is_equal": true }, { "label": "b", "feature": "TMG165.SINOPEC.LOCAL", "is_equal": true }] }, { "name": "Hibernating-Rhinos-RavenDB", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Raven.Studio", "is_equal": true }, { "label": "b", "feature": "alt=\\\"RavenDB\\\"", "is_equal": true }] }, { "name": "Intelligent paperless management system", "logic": "a", "rule": [{ "label": "a", "feature": "\u667a\u80fd\u65e0\u7eb8\u5316\u7ba1\u7406\u7cfb\u7edf", "is_equal": true }] }, { "name": "Special information -527 light conference", "logic": "a&&b", "rule": [{ "label": "a", "feature": "527meeting", "is_equal": true }, { "label": "b", "feature": "\u8f7b\u4f1a\u8bae", "is_equal": true }] }, { "name": "D_Link-DSL-2650U", "logic": "a", "rule": [{ "label": "a", "feature": "DSL-2650U", "is_equal": true }] }, { "name": "Mobile office OA", "logic": "a&&b", "rule": [{ "label": "a", "feature": "class=\\\"pad-0 pt-2 pb-2 text-center tc-gray mt-1\\\"", "is_equal": true }, { "label": "b", "feature": "qccodewidth1 = document.getElementById(\\\"divQrcode\\\")", "is_equal": true }] }, { "name": "Newgrand-Project Management System", "logic": "a&&b", "rule": [{ "label": "a", "feature": "UIA\u767b\u5f55", "is_equal": true }, { "label": "b", "feature": "src=\\\"../images/right.jpg\\\" alt=\\\"\u7248\u6743\u4fe1\u606f\\\"", "is_equal": true }] }, { "name": "Dell-NetWorker-Management-Console", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Welcome to NetWorker Management Console", "is_equal": true }, { "label": "b", "feature": "EMC Corporation", "is_equal": true }] }, { "name": "Zhongdi Digital-Mapgis", "logic": "a", "rule": [{ "label": "a", "feature": "MapGIS Server Manager", "is_equal": true }] }, { "name": "Windon - Internet Behavior Management System", "logic": "(a&&b&&c) ||d||e", "rule": [{ "label": "a", "feature": "updateLoginPswd.php", "is_equal": true }, { "label": "b", "feature": "PassroedEle", "is_equal": true }, { "label": "c", "feature": "\u4e0b\u4e00\u4ee3\u9632\u706b\u5899", "is_equal": false }, { "label": "d", "feature": "\u60e0\u5c14\u987f\u4e0a\u7f51\u884c\u4e3a\u7ba1\u7406", "is_equal": true }, { "label": "e", "feature": "classid=\\\"clsid:81BE1F16-9D88-48CC-8D3E-CB8E37B71FEE", "is_equal": true }] }, { "name": "Integrated transaction management system", "logic": "a", "rule": [{ "label": "a", "feature": "window.location='/app/plus3c.do/login'", "is_equal": true }] }, { "name": "XYCMS", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by XYCMS", "is_equal": true }, { "label": "b", "feature": "advfile/ad12.js", "is_equal": true }] }, { "name": "Synology-photo-station", "logic": "a||b|| (c&&d) || (e&&f)", "rule": [{ "label": "a", "feature": "photo_new/syno_photo_main.js", "is_equal": true }, { "label": "b", "feature": "content=\\\"Photo Station 6\\\"", "is_equal": true }, { "label": "c", "feature": "content=\\\"service_not_available\\\"", "is_equal": false }, { "label": "d", "feature": "Photo Station 6", "is_equal": true }, { "label": "e", "feature": "content=\\\"Photo Station", "is_equal": true }, { "label": "f", "feature": "content=\\\"album", "is_equal": true }] }, { "name": "Mai Did-commercial Wi-Fi equipment", "logic": "(a&&b&&c&&d) ||e", "rule": [{ "label": "a", "feature": "http-equiv=\\\"refresh\\\" content=\\\"0; url=/cgi-bin/luci\\\"", "is_equal": true }, { "label": "b", "feature": "Tx-Server: MiXr", "is_equal": true }, { "label": "c", "feature": "\u5c0f\u7c73\u8def\u7531\u5668", "is_equal": false }, { "label": "d", "feature": "Micgi", "is_equal": false }, { "label": "e", "feature": "\u8fc8\u5916\u8fea\u5546\u4e1aWi-Fi\u8bbe\u5907\u7ba1\u7406\u540e\u53f0", "is_equal": true }] }, { "name": "10,000 network -CMS", "logic": "a", "rule": [{ "label": "a", "feature": "css/css_whir.css", "is_equal": true }] }, { "name": "ExtMail", "logic": "a||b", "rule": [{ "label": "a", "feature": "\u6b22\u8fce\u4f7f\u7528ExtMail", "is_equal": true }, { "label": "b", "feature": "setCookie('extmail_username", "is_equal": true }] }, { "name": "Salien- Equipment Integrity Management System", "logic": "a&&b", "rule": [{ "label": "a", "feature": "rmsie = /(msie\\\\s|trident.*rv:)([\\\\w.]+)/", "is_equal": true }, { "label": "b", "feature": "VerCheck", "is_equal": true }] }, { "name": "HanWei-integrated business platform", "logic": "(a&&b) || (c&&d) ||e|| (f) ||g", "rule": [{ "label": "a", "feature": "\u7cfb\u7edf\u9700\u8981.net\u6846\u67b62.0\uff0c\u8bf7\u70b9\u51fb\u5b89\u88c5!", "is_equal": true }, { "label": "b", "feature": "onclick=\\\"window.navigate(this.fName);enableSetup();\\\"", "is_equal": true }, { "label": "c", "feature": "\u4e1c\u8425\u6c49\u5a01\u77f3\u6cb9\u6280\u672f\u5f00\u53d1\u6709\u9650\u516c\u53f8", "is_equal": true }, { "label": "d", "feature": "content=\\\"Microsoft Visual Studio .NET 7.1\\\"", "is_equal": true }, { "label": "e", "feature": "id=\\\"loginpwdcontiner\\\"", "is_equal": true }, { "label": "f", "feature": "window.location.href=\\\"/\u6e90\u5934\u6570\u636e\u8d44\u6e90\u7ba1\u7406/default/default.aspx\\\"", "is_equal": true }, { "label": "g", "feature": "directlink = \\\"ProgramStartup.application\\\"", "is_equal": true }] }, { "name": "Catalytic device EDOS system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "href=\\\"javascripts/ligerUI/skins/Aqua/css/ligerui-all.css\\\"", "is_equal": true }, { "label": "b", "feature": "\u50ac\u5316\u88c5\u7f6eEDOS\u7cfb\u7edf\u2014\u80fd\u91cf\u8bca\u65ad\u4e0e\u4f18\u5316", "is_equal": true }] }, { "name": "Production real-time application system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "", "is_equal": true }, { "label": "b", "feature": "

    ", "is_equal": true }] }, { "name": "Han Yuan - Wanfa Fax Server", "logic": "a&&b", "rule": [{ "label": "a", "feature": "background=\\\"images/centerfax0.gif\\\"", "is_equal": true }, { "label": "b", "feature": "background-image:url(images/bgfax0.jpg);", "is_equal": true }] }, { "name": "ZyXEL-VMG3625-T20A", "logic": "a", "rule": [{ "label": "a", "feature": "VMG3625-T20A", "is_equal": true }] }, { "name": "ZyXEL-VMG4825-B10A", "logic": "a", "rule": [{ "label": "a", "feature": "VMG4825-B10A", "is_equal": true }] }, { "name": "ZyXEL-VMG1312-B10D", "logic": "a||b", "rule": [{ "label": "a", "feature": "VMG1312-B10D", "is_equal": true }, { "label": "b", "feature": "Zyxel VMG1312-B10D", "is_equal": true }] }, { "name": "ASUS-DSL-AC51", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "DSL-AC51", "is_equal": true }, { "label": "b", "feature": "

    DSL-AC51", "is_equal": true }, { "label": "c", "feature": "DSL-AC51", "is_equal": true }] }, { "name": "\u4e07\u6237\u7f51\u7edc-ezOFFICE", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "ezOFFICE", "is_equal": true }, { "label": "b", "feature": "EZOFFICEUSERNAME", "is_equal": true }, { "label": "c", "feature": "\u4e07\u6237OA", "is_equal": true }, { "label": "d", "feature": "whirRootPath", "is_equal": true }, { "label": "e", "feature": "/defaultroot/js/cookie.js", "is_equal": true }, { "label": "f", "feature": "LocLan", "is_equal": true }] }, { "name": "ZyXEL-VMG8924-B10A", "logic": "a||b", "rule": [{ "label": "a", "feature": "var modelname= '(VMG8924-B10A)';", "is_equal": true }, { "label": "b", "feature": "Welcome toVMG8924-B10A", "is_equal": true }] }, { "name": "TP_LINK- Management System", "logic": "a", "rule": [{ "label": "a", "feature": "directlink = \\\"EAFC.application\\\";", "is_equal": true }] }, { "name": "upvel-UR-309BN", "logic": "a", "rule": [{ "label": "a", "feature": "UR-309BN", "is_equal": true }] }, { "name": "Heng Yitong - Electronic Attendance System", "logic": "a", "rule": [{ "label": "a", "feature": "", "is_equal": true }] }, { "name": "Avaya-Tenor-FTP", "logic": "a", "rule": [{ "label": "a", "feature": "Tenor Multipath Switch FTP", "is_equal": true }] }, { "name": "poly-VSX-7000A", "logic": "a||b", "rule": [{ "label": "a", "feature": "VSX 7000A", "is_equal": true }, { "label": "b", "feature": "VSX 7000A", "is_equal": true }] }, { "name": "Reserve management system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "name=\\\"EOSOperator/userID\\\"", "is_equal": true }, { "label": "b", "feature": "src=\\\"/fbrole/main/js/png.js\\\">", "is_equal": true }] }, { "name": "Ruvar-OA", "logic": "a|| (b&&c&& (d||e))", "rule": [{ "label": "a", "feature": "", "is_equal": true }] }, { "name": "Sophos-UTM-Web-Protection", "logic": "a", "rule": [{ "label": "a", "feature": "Powered by UTM Web Protection", "is_equal": true }] }, { "name": "F5-TrafficShield", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "asinfo=", "is_equal": true }, { "label": "b", "feature": "F5-TrafficShield", "is_equal": true }, { "label": "c", "feature": "asinfo=", "is_equal": true }, { "label": "d", "feature": "F5-TrafficShield", "is_equal": true }] }, { "name": "Alibaba - Ali Cloud - Yundu", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Server: YUNDUN", "is_equal": true }, { "label": "b", "feature": "Set-Cookie: yundun_404", "is_equal": true }, { "label": "c", "feature": "Server: YUNDUN", "is_equal": true }, { "label": "d", "feature": "Set-Cookie: yundun_404", "is_equal": true }] }, { "name": "Wallarm-WAF", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: nginx-wallarm", "is_equal": true }, { "label": "b", "feature": "Server: nginx-wallarm", "is_equal": true }] }, { "name": "Newdefend-WAF", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: newdefend", "is_equal": true }, { "label": "b", "feature": "Server: newdefend", "is_equal": true }] }, { "name": "Radware-AppWall", "logic": "a||b", "rule": [{ "label": "a", "feature": "X-SL-CompState", "is_equal": true }, { "label": "b", "feature": "

    Unauthorized Activity Has Been Detected", "is_equal": true }] }, { "name": "ASP.NET-RequestValidationMode", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "HTTP/1.1 500", "is_equal": true }, { "label": "b", "feature": "HttpRequestValidationException", "is_equal": true }, { "label": "c", "feature": "Request Validation has detected a potentially dangerous client input value", "is_equal": true }] }, { "name": "Scalix-mail system", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Scalix IMAP", "is_equal": true }, { "label": "b", "feature": "Scalix POP3", "is_equal": true }, { "label": "c", "feature": "Scalix SMTP", "is_equal": true }] }, { "name": "paloalto-PA-820", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "PA-820", "is_equal": true }, { "label": "b", "feature": "PA-820", "is_equal": true }, { "label": "c", "feature": "id=\\\"heading\\\">GlobalProtect Portal

    ", "is_equal": true }] }, { "name": "HARBOR", "logic": "a||b", "rule": [{ "label": "a", "feature": "harbor.app", "is_equal": true }, { "label": "b", "feature": "Harbor", "is_equal": true }] }, { "name": "Microsoft-ISA-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "The ISA Server denied the specified Uniform Resource Locator", "is_equal": true }, { "label": "b", "feature": "The server denied the specified Uniform Resource Locator (URL). Contact the server administrator", "is_equal": true }] }, { "name": "Tenda-N6", "logic": "a&&b", "rule": [{ "label": "a", "feature": "var sys_target = \\\"N6\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"loagin_title\\\">TENDA N6", "is_equal": true }] }, { "name": "Tenda-TEI602", "logic": "a", "rule": [{ "label": "a", "feature": "var sys_target = \\\"TEI602\\\"", "is_equal": true }] }, { "name": "Tenda-W1800R", "logic": "a", "rule": [{ "label": "a", "feature": "var sys_target = \\\"W1800R\\\"", "is_equal": true }] }, { "name": "HuaWei-iBMC", "logic": "a||b||c|| (d&&e)", "rule": [{ "label": "a", "feature": "iBMC Login", "is_equal": true }, { "label": "b", "feature": "/bmc/php/getmultiproperty.php", "is_equal": true }, { "label": "c", "feature": "/bmc/resources/css/cmn.css", "is_equal": true }, { "label": "d", "feature": "pn", "is_equal": true }, { "label": "e", "feature": "iBMC", "is_equal": true }] }, { "name": "Ou Co Software", "logic": "a||b||c||d|| (e&&f)", "rule": [{ "label": "a", "feature": "\u6c5f\u82cf\u6b27\u7d22\u8f6f\u4ef6\u6709\u9650\u516c\u53f8", "is_equal": true }, { "label": "b", "feature": "/ocensoftComm.js", "is_equal": true }, { "label": "c", "feature": "\u6280\u672f\u652f\u6301\uff1a", "is_equal": true }, { "label": "d", "feature": "Aspx/CaseCenter/ACaseCenter.aspx?pagetype=sxcx&casetype=sscs&casename=", "is_equal": true }, { "label": "e", "feature": "href=\\\"/e/action/ListInfo/?", "is_equal": true }, { "label": "f", "feature": "\u6c5f\u82cf\u6b27\u7d22", "is_equal": true }] }, { "name": "Tenda-CH21", "logic": "a", "rule": [{ "label": "a", "feature": "var sys_target = \\\"CH21\\\"", "is_equal": true }] }, { "name": "ARRIS-Home-Media-Gateway", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "Arris Whole Home Solution Media Gateway", "is_equal": true }] }, { "name": "Pivot-\u4ea7\u54c1", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered byPivot", "is_equal": true }, { "label": "b", "feature": "href=\\\"http://www.pivotlog.net/?ver=Pivot", "is_equal": true }] }, { "name": "phxEventManager", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "
    ", "is_equal": true }] }, { "name": "DELL-POWEREDGE-T30", "logic": "a||b", "rule": [{ "label": "a", "feature": "POWEREDGE-T30", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-T30", "is_equal": true }] }, { "name": "WatersSSLVPN", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Waters SSL VPN", "is_equal": true }, { "label": "b", "feature": "welcome.cgi?p=logo&signinid=url_default", "is_equal": true }] }, { "name": "FourSeasonsVPN", "logic": "a&&b", "rule": [{ "label": "a", "feature": "FS VPN", "is_equal": true }, { "label": "b", "feature": "imgs/FS-Black-Box.jpg", "is_equal": true }] }, { "name": "ZTE-ZXSEC unified security gateway", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "\u5b89\u5168\u7f51\u5173", "is_equal": true }, { "label": "b", "feature": "Welcome to Login Gateway System", "is_equal": true }, { "label": "c", "feature": "ZTE", "is_equal": true }] }, { "name": "WindowsCE", "logic": "((a||b||c) &&d&&e&&f) || ((g||h) &&i&&j)", "rule": [{ "label": "a", "feature": "Microsoft-WinCE", "is_equal": true }, { "label": "b", "feature": "Windows CE", "is_equal": true }, { "label": "c", "feature": "WindowsCE", "is_equal": true }, { "label": "d", "feature": "couchdb", "is_equal": false }, { "label": "e", "feature": "drupal", "is_equal": false }, { "label": "f", "feature": "X-Powered-By: ThinkPHP", "is_equal": false }, { "label": "g", "feature": "Microsoft Windows CE", "is_equal": true }, { "label": "h", "feature": "Primary Domain : Windows CE", "is_equal": true }, { "label": "i", "feature": "couchdb", "is_equal": false }, { "label": "j", "feature": "drupal", "is_equal": false }] }, { "name": "Fuji_Xerox-printer", "logic": "(((a&&b) ||c||d||e||f||g||h||i||j||k) &&l) || ((m||n||o|| (p&&q) || (r&&s) || (t&&u) ||v||w||x||y) &&z)", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "FUJI XEROX Docu", "is_equal": true }, { "label": "c", "feature": "Xerox WorkCentre", "is_equal": true }, { "label": "d", "feature": "XEROX DocuCentre", "is_equal": true }, { "label": "e", "feature": "FUJI XEROX DocuCentre", "is_equal": true }, { "label": "f", "feature": "XEROX DocuPrint", "is_equal": true }, { "label": "g", "feature": "FUJI XEROX ApeosPort", "is_equal": true }, { "label": "h", "feature": "FUJI XEROX Document Centre", "is_equal": true }, { "label": "i", "feature": "FUJI XEROX Color", "is_equal": true }, { "label": "j", "feature": "FX DocuPrint ", "is_equal": true }, { "label": "k", "feature": "FUJI XEROX Versant ", "is_equal": true }, { "label": "l", "feature": "couchdb", "is_equal": false }, { "label": "m", "feature": "DocuPrint ", "is_equal": true }, { "label": "n", "feature": "", "is_equal": true }, { "label": "q", "feature": "Epson", "is_equal": false }, { "label": "r", "feature": "var jtpath = '/jt/cgi-bin/';", "is_equal": true }, { "label": "s", "feature": "Fuji Xerox", "is_equal": true }, { "label": "t", "feature": "Internet Services", "is_equal": true }, { "label": "u", "feature": "frames[2].window.location.href=jtPath + loc;", "is_equal": true }, { "label": "v", "feature": "properties/aboutprinter.html", "is_equal": true }, { "label": "w", "feature": "Phaser 6250DP", "is_equal": true }, { "label": "x", "feature": "Phaser 6250N", "is_equal": true }, { "label": "y", "feature": "Phaser 4500DT", "is_equal": true }, { "label": "z", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "DELL-poweredge-r410", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "poweredge-r410", "is_equal": true }, { "label": "b", "feature": "poweredge-r410", "is_equal": true }, { "label": "c", "feature": "poweredge-r410", "is_equal": true }] }, { "name": "DELL-POWEREDGE-T440", "logic": "a||b", "rule": [{ "label": "a", "feature": "POWEREDGE-T440", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-T440", "is_equal": true }] }, { "name": "DELL-PowerEdge-T320", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "PowerEdge T320", "is_equal": true }, { "label": "b", "feature": "id=\\\"serverinfo\\\"> PowerEdge T320", "is_equal": true }, { "label": "c", "feature": "PowerEdge T320", "is_equal": true }] }, { "name": "digitalchina - Camera", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Server: IPCamera-Webs", "is_equal": true }, { "label": "b", "feature": "\u795e\u5dde\u6570\u7801", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R430", "logic": "a", "rule": [{ "label": "a", "feature": "POWEREDGE-R430", "is_equal": true }] }, { "name": "DELL-POWEREDGE-T20", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "POWEREDGE-T20", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-T20", "is_equal": true }, { "label": "c", "feature": "POWEREDGE-T20", "is_equal": true }] }, { "name": "DELL-PowerEdge-T640", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-T640", "is_equal": true }, { "label": "b", "feature": "PowerEdge-T640", "is_equal": true }] }, { "name": "Yisheng-SurfNx security gateway", "logic": "(a&&b) ||c||d||e", "rule": [{ "label": "a", "feature": "\u5b89\u5168\u7f51\u5173", "is_equal": true }, { "label": "b", "feature": "lib/templates/surfilter/images/logo_big.png", "is_equal": true }, { "label": "c", "feature": "/lib/templates/surfilter/css/", "is_equal": true }, { "label": "d", "feature": "SURFNX", "is_equal": true }, { "label": "e", "feature": "SURF-NGSA login", "is_equal": true }] }, { "name": "FortiAnalyzer", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "FortiAnalyzer", "is_equal": true }, { "label": "b", "feature": "FortiAnalyzer", "is_equal": true }, { "label": "c", "feature": "jumbotron warning", "is_equal": true }] }, { "name": "FORTINET-Fortigate-100D", "logic": "a||b", "rule": [{ "label": "a", "feature": "Fortigate 100D", "is_equal": true }, { "label": "b", "feature": "Fortigate100D", "is_equal": true }] }, { "name": "FortiGate-60D", "logic": "a||b", "rule": [{ "label": "a", "feature": "FortiGate 60D", "is_equal": true }, { "label": "b", "feature": "Fortigate60D", "is_equal": true }] }, { "name": "Fluke companies products", "logic": "a", "rule": [{ "label": "a", "feature": "Fluke Networks", "is_equal": true }] }, { "name": "CommScope-netopia-router", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Netopia-", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Netopia-", "is_equal": true }, { "label": "c", "feature": "netopia-payments.", "is_equal": true }, { "label": "d", "feature": "Netopia Router", "is_equal": true }] }, { "name": "\u5b89\u6052\u4fe1\u606f-\u660e\u5fa1\u8fd0\u7ef4\u5ba1\u8ba1\u4e0e\u98ce\u9669\u63a7\u5236\u7cfb\u7edf", "logic": "a", "rule": [{ "label": "a", "feature": "\u660e\u5fa1\u8fd0\u7ef4\u5ba1\u8ba1", "is_equal": true }] }, { "name": "Xerox-CentreWare", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"CentreWare_IS_Admin", "is_equal": true }, { "label": "b", "feature": "realm=\\\"CentreWare Internet Services", "is_equal": true }, { "label": "c", "feature": "realm=\\\"CentreWare_IS_Admin", "is_equal": true }, { "label": "d", "feature": "realm=\\\"CentreWare Internet Services", "is_equal": true }] }, { "name": "Compact-Router", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "realm=\\\"Compact Router", "is_equal": true }, { "label": "b", "feature": "snmp", "is_equal": true }, { "label": "c", "feature": "Compact Router", "is_equal": true }] }, { "name": "DELL-PowerEdge-R310", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge R310", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R230", "logic": "a||b", "rule": [{ "label": "a", "feature": "POWEREDGE-R230", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-R230", "is_equal": true }] }, { "name": "DELL-PowerEdge-R720", "logic": "a||b", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R720", "is_equal": true }, { "label": "b", "feature": "PowerEdge R720", "is_equal": true }] }, { "name": "DELL-PowerEdge-R520", "logic": "a||b", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R520", "is_equal": true }, { "label": "b", "feature": "PowerEdge R520", "is_equal": true }] }, { "name": "DELL-PowerEdge-R720xd", "logic": "a||b", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R720xd", "is_equal": true }, { "label": "b", "feature": "PowerEdge R720xd", "is_equal": true }] }, { "name": "DELL-PowerEdge-T420", "logic": "a||b", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge T420", "is_equal": true }, { "label": "b", "feature": "PowerEdge T420", "is_equal": true }] }, { "name": "DELL-PowerEdge-R320", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R320", "is_equal": true }, { "label": "b", "feature": "PowerEdge R320", "is_equal": true }, { "label": "c", "feature": "PowerEdge R320", "is_equal": true }] }, { "name": "DELL-PowerEdge-R620", "logic": "a||b", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R620", "is_equal": true }, { "label": "b", "feature": "PowerEdge R620", "is_equal": true }] }, { "name": "DELL-PowerEdge-R820", "logic": "a", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> PowerEdge R820", "is_equal": true }] }, { "name": "Arcor-DSL-Modem", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Arcor-DSL WLAN-Modem", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Arcor-DSL WLAN-Modem", "is_equal": true }] }, { "name": "ucftpd", "logic": "a", "rule": [{ "label": "a", "feature": "ucftpd", "is_equal": true }] }, { "name": "Aztech-D140W", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"AZ-D140W", "is_equal": true }, { "label": "b", "feature": "realm=\\\"AZ-D140W", "is_equal": true }] }, { "name": "AirLive-Firmware&Driver", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "airlive AirMax5", "is_equal": true }, { "label": "b", "feature": "realm=\\\"AirLive WHA-", "is_equal": true }, { "label": "c", "feature": "airlive AirMax2", "is_equal": true }, { "label": "d", "feature": "airlive AirMax5", "is_equal": true }, { "label": "e", "feature": "realm=\\\"AirLive WHA-", "is_equal": true }, { "label": "f", "feature": "airlive AirMax2", "is_equal": true }] }, { "name": "AirLive-Modem", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"airlive ARM-", "is_equal": true }, { "label": "b", "feature": "realm=\\\"AirLive ARM201", "is_equal": true }, { "label": "c", "feature": "realm=\\\"airlive ARM-", "is_equal": true }, { "label": "d", "feature": "realm=\\\"AirLive ARM201", "is_equal": true }] }, { "name": "ZyXEL-Gateway", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"AMG1001-", "is_equal": true }, { "label": "b", "feature": "realm=\\\"AMG1001-", "is_equal": true }] }, { "name": "EDIMAX-Modem", "logic": "a||b||c||d||e||f||g||h||i||j", "rule": [{ "label": "a", "feature": "realm=\\\"AR-7182WnA", "is_equal": true }, { "label": "b", "feature": "realm=\\\"AR-7186WnA", "is_equal": true }, { "label": "c", "feature": "realm=\\\"AR-7188WnA", "is_equal": true }, { "label": "d", "feature": "realm=\\\"AR-7286WnA", "is_equal": true }, { "label": "e", "feature": "realm=\\\"AR-7286WnB", "is_equal": true }, { "label": "f", "feature": "realm=\\\"AR-7182WnA", "is_equal": true }, { "label": "g", "feature": "realm=\\\"AR-7186WnA", "is_equal": true }, { "label": "h", "feature": "realm=\\\"AR-7188WnA", "is_equal": true }, { "label": "i", "feature": "realm=\\\"AR-7286WnA", "is_equal": true }, { "label": "j", "feature": "realm=\\\"AR-7286WnB", "is_equal": true }] }, { "name": "Riak-DB", "logic": "a", "rule": [{ "label": "a", "feature": "riak", "is_equal": true }] }, { "name": "PostgreSQL", "logic": "a", "rule": [{ "label": "a", "feature": "postgres", "is_equal": true }] }, { "name": "MemCache", "logic": "a", "rule": [{ "label": "a", "feature": "memcache", "is_equal": true }] }, { "name": "cassandra", "logic": "a", "rule": [{ "label": "a", "feature": "cassandra", "is_equal": true }] }, { "name": "Oracle companies", "logic": "a||b", "rule": [{ "label": "a", "feature": "oracle", "is_equal": true }, { "label": "b", "feature": "[OracleException]: ORA-", "is_equal": true }] }, { "name": "SAP-Sybase", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Server: AdaptiveServerAnywhere", "is_equal": true }, { "label": "b", "feature": "Server: AdaptiveServerAnywhere", "is_equal": true }, { "label": "c", "feature": "Server: SQLAnywhere", "is_equal": true }, { "label": "d", "feature": "Server: SQLAnywhere", "is_equal": true }] }, { "name": "IBM-DB2 database", "logic": "a", "rule": [{ "label": "a", "feature": "db2", "is_equal": true }] }, { "name": "Muratec-mfx printer", "logic": "a||b", "rule": [{ "label": "a", "feature": "Muratec MFX", "is_equal": true }, { "label": "b", "feature": "MFX-", "is_equal": true }] }, { "name": "Maipu-MyPower-OS", "logic": "a", "rule": [{ "label": "a", "feature": "MyPower (R) Operating System Software", "is_equal": true }] }, { "name": "DELL-DCS2210", "logic": "a", "rule": [{ "label": "a", "feature": "id=\\\"serverinfo\\\"> DCS2210", "is_equal": true }] }, { "name": "HUAWEI-9008-V5", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/9008 V5", "is_equal": true }] }, { "name": "HUAWEI-CH242-V5", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/CH242 V5", "is_equal": true }] }, { "name": "3COM-Baseline-Switch", "logic": "a||b", "rule": [{ "label": "a", "feature": "3Com Baseline Switch", "is_equal": true }, { "label": "b", "feature": "Baseline Switch ", "is_equal": true }] }, { "name": "HUAWEI-5288-V3", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/5288 V3", "is_equal": true }] }, { "name": "3COM-Switch-5500G", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Switch 5500G", "is_equal": true }, { "label": "b", "feature": "3com", "is_equal": true }] }, { "name": "HUAWEI-CloudIVS-3000S", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/CloudIVS 3000S", "is_equal": true }] }, { "name": "HP-Switch", "logic": "(a&&b) || (c&&d)", "rule": [{ "label": "a", "feature": "Switch Software Version", "is_equal": true }, { "label": "b", "feature": "Hewlett-Packard Development Company", "is_equal": true }, { "label": "c", "feature": "HP 1820", "is_equal": true }, { "label": "d", "feature": "switch", "is_equal": true }] }, { "name": "HUAWEI-RH2288H-V3", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/RH2288H V3", "is_equal": true }] }, { "name": "LevelOne-11g-Wireless-Router", "logic": "a", "rule": [{ "label": "a", "feature": "11g Wireless Broadband Router", "is_equal": true }] }, { "name": "HUAWEI-2488H-V5", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/2488H V5", "is_equal": true }] }, { "name": "uniview-VM2500", "logic": "a", "rule": [{ "label": "a", "feature": "\u8f6f\u4ef6\u7248\u672c\uff1a VM2500", "is_equal": true }] }, { "name": "LG-43UK6470PLC", "logic": "a", "rule": [{ "label": "a", "feature": "43UK6470PLC", "is_equal": true }] }, { "name": "HUAWEI-RH1288-V3", "logic": "a", "rule": [{ "label": "a", "feature": "ProductName/RH1288 V3", "is_equal": true }] }, { "name": "LG-32LM630BPSB", "logic": "a", "rule": [{ "label": "a", "feature": "32LM630BPSB", "is_equal": true }] }, { "name": "LG-65UM7800HNA", "logic": "a", "rule": [{ "label": "a", "feature": "65UM7800HNA", "is_equal": true }] }, { "name": "\u667a\u80fd\u5e73\u53f0\u7ba1\u7406\u63a5\u53e3", "logic": "a", "rule": [{ "label": "a", "feature": "ipmi", "is_equal": true }] }, { "name": "Huawei-Secoway Firewall", "logic": "a||b", "rule": [{ "label": "a", "feature": "Secoway", "is_equal": true }, { "label": "b", "feature": "Secoway", "is_equal": true }] }, { "name": "legendsec - firewall", "logic": "a|| (b&&c) || ((d||e) &&f) ||g||h||i||j||k", "rule": [{ "label": "a", "feature": "secgate 3600", "is_equal": true }, { "label": "b", "feature": "snmp", "is_equal": true }, { "label": "c", "feature": "SecOS ", "is_equal": true }, { "label": "d", "feature": "css/lsec/login.css", "is_equal": true }, { "label": "e", "feature": "src=\\\"?g=login_captcha", "is_equal": true }, { "label": "f", "feature": "content=\\\"\u4e0a\u6d77\u6590\u8baf\u6570\u636e\u901a\u4fe1\u6280\u672f\u6709\u9650\u516c\u53f8\\\"", "is_equal": false }, { "label": "g", "feature": "SecGate3600", "is_equal": true }, { "label": "h", "feature": "var __permission = \\\"360\u7f51\u795e\u9632\u706b\u5899\u7cfb\u7edfNSG", "is_equal": true }, { "label": "i", "feature": "var __permission = \\\"360\u7f51\u795e\u9632\u706b\u5899\u7cfb\u7edf\\\"", "is_equal": true }, { "label": "j", "feature": "var __permission = \\\"\u7f51\u795e\u9632\u706b\u5899\\\"", "is_equal": true }, { "label": "k", "feature": "var __permission = \\\"\u7f51\u795eSecGate3600 \u9632\u706b\u5899\\\"", "is_equal": true }] }, { "name": "MikroTik-CCR1036", "logic": "a", "rule": [{ "label": "a", "feature": "RouterOS CCR1036", "is_equal": true }] }, { "name": "TrafSys-People-Counting", "logic": "a", "rule": [{ "label": "a", "feature": "Automatic People Counting Device", "is_equal": true }] }, { "name": "Neo4j", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "content=\\\"Neo4j", "is_equal": true }, { "label": "b", "feature": "ng-show=\\\"neo4j.enterpriseEdition", "is_equal": true }, { "label": "c", "feature": "play-topic=\\\"neo4j-sync", "is_equal": true }, { "label": "d", "feature": "{{ neo4j.version | neo4jDeveloperDoc }}/", "is_equal": true }, { "label": "e", "feature": "Neo4j", "is_equal": true }] }, { "name": "LG-OLED55E8PLA", "logic": "a", "rule": [{ "label": "a", "feature": "OLED55E8PLA", "is_equal": true }] }, { "name": "LG-75UM7570PUD", "logic": "a", "rule": [{ "label": "a", "feature": "75UM7570PUD", "is_equal": true }] }, { "name": "LG-65UH6550-UB", "logic": "a", "rule": [{ "label": "a", "feature": "65UH6550-UB", "is_equal": true }] }, { "name": "LG-OLED55C9CNA", "logic": "a", "rule": [{ "label": "a", "feature": "OLED55C9CNA", "is_equal": true }] }, { "name": "LG-55SM8100PSA", "logic": "a", "rule": [{ "label": "a", "feature": "55SM8100PSA", "is_equal": true }] }, { "name": "LG-43UM7800BNA", "logic": "a", "rule": [{ "label": "a", "feature": "43UM7800BNA", "is_equal": true }] }, { "name": "ZyXEL-DSLAM", "logic": "a||b||c||d||e||f||g", "rule": [{ "label": "a", "feature": "realm=\\\"AAM1212-", "is_equal": true }, { "label": "b", "feature": "realm=\\\"IES-612", "is_equal": true }, { "label": "c", "feature": "realm=\\\"IES-1000", "is_equal": true }, { "label": "d", "feature": "AAM1212-", "is_equal": true }, { "label": "e", "feature": "realm=\\\"IES-612", "is_equal": true }, { "label": "f", "feature": "realm=\\\"IES-1000", "is_equal": true }, { "label": "g", "feature": "realm=IES-1000", "is_equal": true }] }, { "name": "LG-65UM6900PUA", "logic": "a", "rule": [{ "label": "a", "feature": "65UM6900PUA", "is_equal": true }] }, { "name": "GE-NX590", "logic": "a", "rule": [{ "label": "a", "feature": "(GE-Interlogix) / NX590", "is_equal": true }] }, { "name": "HP-IP-Switch", "logic": "a", "rule": [{ "label": "a", "feature": "HP IP Console Switch", "is_equal": true }] }, { "name": "LG-55UM7100PLB", "logic": "a", "rule": [{ "label": "a", "feature": "55UM7100PLB", "is_equal": true }] }, { "name": "LG-43UM7510PSB", "logic": "a", "rule": [{ "label": "a", "feature": "43UM7510PSB", "is_equal": true }] }, { "name": "LG-OLED55C8FNA", "logic": "a", "rule": [{ "label": "a", "feature": "OLED55C8FNA", "is_equal": true }] }, { "name": "LG-49UK6820ENF", "logic": "a", "rule": [{ "label": "a", "feature": "49UK6820ENF", "is_equal": true }] }, { "name": "LG-OLED65B7K-N", "logic": "a", "rule": [{ "label": "a", "feature": "OLED65B7K-N", "is_equal": true }] }, { "name": "Openvox-Wireless-Gateway", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Openvox-Wireless-Gateway", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Openvox-Wireless-Gateway", "is_equal": true }] }, { "name": "ZyXEL-NBG-416N", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"NBG-416N N-lite Home Router", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NBG-418N N Home Router", "is_equal": true }, { "label": "c", "feature": "realm=\\\"NBG-416N N-lite Home Router", "is_equal": true }, { "label": "d", "feature": "realm=\\\"NBG-418N N Home Router", "is_equal": true }] }, { "name": "leadsec Nebula - Security Gateway", "logic": "a||b||c||d||e||f|| (g&&h&&i&&j)", "rule": [{ "label": "a", "feature": "\u8054\u60f3\u7f51\u5fa1 \u5b89\u5168\u7f51\u5173", "is_equal": true }, { "label": "b", "feature": "SAG\u7cfb\u7edf", "is_equal": true }, { "label": "c", "feature": "var cookiename = \\\"sagLoginFailTimes\\\";", "is_equal": true }, { "label": "d", "feature": "", "is_equal": true }, { "label": "i", "feature": "content=\\\"\u5317\u4eac\u542f\u660e\u661f\u8fb0\u4fe1\u606f\u5b89\u5168\u6280\u672f\u6709\u9650\u516c\u53f8\\\"", "is_equal": false }, { "label": "j", "feature": "txt_username\\\").val()==\\\"administrator\\\"", "is_equal": true }] }, { "name": "LG-49UH603V-ZE", "logic": "a", "rule": [{ "label": "a", "feature": "49UH603V-ZE", "is_equal": true }] }, { "name": "LG-75UK6570AUA", "logic": "a", "rule": [{ "label": "a", "feature": "75UK6570AUA", "is_equal": true }] }, { "name": "Maipu-VPN3005", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"MPSec VPN3005C", "is_equal": true }, { "label": "b", "feature": "VPN3005C", "is_equal": true }] }, { "name": "nusoft System - Multi-Homing-Gateway", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Multi-Homing Gateway", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Wi-Fi Multi-Homing", "is_equal": true }] }, { "name": "Hillstone-SR-320", "logic": "a", "rule": [{ "label": "a", "feature": "CommonName: SR-320", "is_equal": true }] }, { "name": "CISCO-RV220W", "logic": "a", "rule": [{ "label": "a", "feature": "RV220W", "is_equal": true }] }, { "name": "LG-OLED55B8GNA", "logic": "a", "rule": [{ "label": "a", "feature": "OLED55B8GNA", "is_equal": true }] }, { "name": "SOPHOS-UTM220", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "UTM220", "is_equal": true }, { "label": "b", "feature": "var OWN_STATUS", "is_equal": true }] }, { "name": "paloalto-PA-500", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "PA-500", "is_equal": true }, { "label": "b", "feature": "PA-500", "is_equal": true }, { "label": "c", "feature": "id=\\\"heading\\\">GlobalProtect Portal", "is_equal": true }] }, { "name": "Tenda-W20E", "logic": "a", "rule": [{ "label": "a", "feature": "var sys_target = \\\"W20E\\\"", "is_equal": true }] }, { "name": "CISCO-ASR-9010", "logic": "a", "rule": [{ "label": "a", "feature": "ASR9010", "is_equal": true }] }, { "name": "Eaton-EX-2200", "logic": "a", "rule": [{ "label": "a", "feature": "EX 2200", "is_equal": true }] }, { "name": "ExtremeWare-XOS", "logic": "a||b", "rule": [{ "label": "a", "feature": "ExtremeWare XOS", "is_equal": true }, { "label": "b", "feature": "ExtremeXOS", "is_equal": true }] }, { "name": "Extron-ShareLink", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "Extron Electronics ShareLink", "is_equal": true }] }, { "name": "RLE-Environmental-Monitor", "logic": "a", "rule": [{ "label": "a", "feature": "Environmental Monitor by RLE Technologies", "is_equal": true }] }, { "name": "Sagemcom-FAST3890V2", "logic": "a&&b", "rule": [{ "label": "a", "feature": "FAST3890V2 Wireless Voice Gateway", "is_equal": true }, { "label": "b", "feature": "SAGEMCOM", "is_equal": true }] }, { "name": "pexip", "logic": "(a&&b) || (c&&d)", "rule": [{ "label": "a", "feature": "

    Pexip Infinity

    ", "is_equal": true }, { "label": "b", "feature": "

    \u4f1a\u8bae\u5e73\u53f0

    ", "is_equal": true }, { "label": "c", "feature": "Pexip Infinity", "is_equal": true }, { "label": "d", "feature": "pex-app", "is_equal": true }] }, { "name": "Digifort", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "content=\\\"digifort", "is_equal": true }, { "label": "b", "feature": "href=\\\"http://www.digifort.jp/\\\">", "is_equal": true }, { "label": "c", "feature": "", "is_equal": true }, { "label": "d", "feature": "PowerCreator ", "is_equal": true }] }, { "name": "UIN-Cloud Conference", "logic": "a", "rule": [{ "label": "a", "feature": "UIN.plist", "is_equal": true }] }, { "name": "Cloud House - Network Conference", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/companyImage/agents/SDK-LOGO.png\\\"", "is_equal": true }] }, { "name": "Movision-Movie Yunxun Cloud", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "class=\\\"meeting movision\\\"", "is_equal": true }, { "label": "b", "feature": "document.title=\\\"\u767b\u5f55-\u6469\u4e91\u89c6\u8baf\\\"", "is_equal": true }, { "label": "c", "feature": "", "is_equal": true }] }, { "name": "Intelbras-Roteador-ACtion-R1200", "logic": "a", "rule": [{ "label": "a", "feature": "Roteador ACtion R1200

    ", "is_equal": true }] }, { "name": "Intelbras-WiseFi", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"btn btn-wisefi\\\" id=\\\"access_wisefi\\\"", "is_equal": true }] }, { "name": "H3C-5900-G3", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "5900-G3", "is_equal": true }, { "label": "b", "feature": "5900-G3", "is_equal": true }, { "label": "c", "feature": "5900-G3", "is_equal": true }] }, { "name": "intelbras-Roteador-RF-1200", "logic": "a", "rule": [{ "label": "a", "feature": "id=\\\"product\\\">Roteador ACtion RF 1200", "is_equal": true }] }, { "name": "ramptel-SansCord-Router", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "name=Username value=\\\"ywrtaw4=\\\"", "is_equal": true }, { "label": "b", "feature": "href=\\\"http://www.ramptel.com/\\\"", "is_equal": true }] }, { "name": "NSFOCUS-WVSS", "logic": "a||b", "rule": [{ "label": "a", "feature": "url:'/accounts/treaty/'", "is_equal": true }, { "label": "b", "feature": "NSFOCUS WVSS", "is_equal": true }] }, { "name": "Novell-ZENworks", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "/zenworks/js/dojo", "is_equal": true }, { "label": "b", "feature": "Novell ZENworks", "is_equal": true }, { "label": "c", "feature": "managementZoneName", "is_equal": true }] }, { "name": "NLNETLABS-NLnet-NSD", "logic": "a||b||c|| (d&&e)", "rule": [{ "label": "a", "feature": "Basic realm=\\\"NSD\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"NSD\\\"", "is_equal": true }, { "label": "c", "feature": "NSD Demo Server", "is_equal": true }, { "label": "d", "feature": "dns", "is_equal": true }, { "label": "e", "feature": "NSD", "is_equal": true }] }, { "name": "KJ65N Coal Mine Remote Monitoring Safety Early Warning System", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "images/login/top002.gif", "is_equal": true }, { "label": "b", "feature": "WorldDesktop/WebForm1.aspx", "is_equal": true }, { "label": "c", "feature": "KJ65N", "is_equal": true }] }, { "name": "BenQ-W3000", "logic": "a", "rule": [{ "label": "a", "feature": "W3000", "is_equal": true }] }, { "name": "TOSHIBA-MT200", "logic": "a", "rule": [{ "label": "a", "feature": "MT200 FTP", "is_equal": true }] }, { "name": "LG-HU80KA-KR", "logic": "a", "rule": [{ "label": "a", "feature": "HU80KA-KR", "is_equal": true }] }, { "name": "SHARP-XG-C435X", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "XG-C435X", "is_equal": true }, { "label": "b", "feature": "realm=\\\"XG-C435X", "is_equal": true }, { "label": "c", "feature": "SHARP XG-C435X", "is_equal": true }] }, { "name": "BenQ-W1070", "logic": "a", "rule": [{ "label": "a", "feature": "W1070", "is_equal": true }] }, { "name": "Intelbras-IWR-3000N", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Intelbras", "is_equal": true }, { "label": "b", "feature": "class='bg-image blur'", "is_equal": true }] }, { "name": "Polycom-ViewStation", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "frame name=\\\"showMyPCFrame\\\"", "is_equal": true }, { "label": "b", "feature": "X-Powered-By: RealPresence Resource Platform", "is_equal": true }, { "label": "c", "feature": "Welcome to ViewStation", "is_equal": true }] }, { "name": "IMO-Cloud Office", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "/server/page_download/", "is_equal": true }, { "label": "b", "feature": "download/imo_setup.exe", "is_equal": true }, { "label": "c", "feature": "imo\u4e91\u529e\u516c\u5ba4", "is_equal": true }, { "label": "d", "feature": "title=\\\"imo\u4e91\u529e\u516c\u5ba4\\\" href=\\\"http://imoffice.com", "is_equal": true }, { "label": "e", "feature": "/server/page_download/", "is_equal": true }] }, { "name": "Zenutech-mail", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Enter your Zenutech Account ID and Password:", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Enter your Zenutech Account ID and Password:", "is_equal": true }] }, { "name": "McAfee-Cloud-Protection", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"McAfee Cloud Web Protection", "is_equal": true }, { "label": "b", "feature": "realm=\\\"McAfee Cloud Web Protection", "is_equal": true }] }, { "name": "SONY-SNC-ER550", "logic": "a||b", "rule": [{ "label": "a", "feature": "Sony Network Camera SNC-ER550", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Sony Network Camera SNC-ER550", "is_equal": true }] }, { "name": "SONY-SNC-ER585", "logic": "a||b", "rule": [{ "label": "a", "feature": "Sony Network Camera SNC-ER585", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Sony Network Camera SNC-ER585", "is_equal": true }] }, { "name": "NSFOCUS-NIPS", "logic": "a", "rule": [{ "label": "a", "feature": "/login_logo_nips_zh_CN.png", "is_equal": true }] }, { "name": "MULTILASER-Roteador-Wireless-N300", "logic": "a||b", "rule": [{ "label": "a", "feature": "rel=\\\"shortcut icon\\\" href=\\\"./multi_icone.ico\\\"", "is_equal": true }, { "label": "b", "feature": "rel=\\\"shortcut icon\\\" href=\\\"/multi_icone.ico\\\"", "is_equal": true }] }, { "name": "NSFOCUS-ADS", "logic": "a||b|| (c&&d) ||e", "rule": [{ "label": "a", "feature": "NSFOCUS ADS", "is_equal": true }, { "label": "b", "feature": "/login_logo_ads_en_US.png", "is_equal": true }, { "label": "c", "feature": "NSFOCUS ADS", "is_equal": true }, { "label": "d", "feature": "nsfocus.png", "is_equal": true }, { "label": "e", "feature": "Nsfocus ADS", "is_equal": true }] }, { "name": "NSFOCUS-SG\u5b89\u5168\u7f51\u5173", "logic": "a", "rule": [{ "label": "a", "feature": "/login_logo_sg_zh_CN.png", "is_equal": true }] }, { "name": "IQinVision-IQeye711", "logic": "a||b", "rule": [{ "label": "a", "feature": "IQeye711", "is_equal": true }, { "label": "b", "feature": "IQinVision IQeye711", "is_equal": true }] }, { "name": "IQinVision-IQeye811", "logic": "a||b", "rule": [{ "label": "a", "feature": "IQeye811", "is_equal": true }, { "label": "b", "feature": "IQeye811", "is_equal": true }] }, { "name": "New point OA", "logic": "a||b", "rule": [{ "label": "a", "feature": "\u65b0\u70b9\u534f\u540c\u529e\u516c\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "\u8bf7\u5b89\u88c5\u65b0\u70b9", "is_equal": true }] }, { "name": "IQinVision-IQeye753", "logic": "a||b", "rule": [{ "label": "a", "feature": "IQeye753", "is_equal": true }, { "label": "b", "feature": "IQeye753", "is_equal": true }] }, { "name": "IQinVision-IQeye701", "logic": "a", "rule": [{ "label": "a", "feature": "IQeye701", "is_equal": true }] }, { "name": "IQinVision-IQeye710D", "logic": "a", "rule": [{ "label": "a", "feature": "IQeye710D", "is_equal": true }] }, { "name": "IQinVision-IQA15N", "logic": "a||b", "rule": [{ "label": "a", "feature": "IQA15N", "is_equal": true }, { "label": "b", "feature": "IQinVision IQA15N", "is_equal": true }] }, { "name": "IQinVision-IQA12S", "logic": "a", "rule": [{ "label": "a", "feature": "IQA12S", "is_equal": true }] }, { "name": "ThinkPHP-YFCMF", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "YFCMF", "is_equal": true }, { "label": "b", "feature": "/public/others/maxlength.js", "is_equal": true }, { "label": "c", "feature": "/yfcmf/yfcmf.js", "is_equal": true }] }, { "name": "Super Technology - Machinery Monitoring System", "logic": "a&&b", "rule": [{ "label": "a", "feature": "src=\\\"images/logo/logo40.png\\\"", "is_equal": true }, { "label": "b", "feature": "\u76d1\u63a7\u7cfb\u7edf", "is_equal": true }] }, { "name": "IQinVision-IQeye3", "logic": "a||b", "rule": [{ "label": "a", "feature": "IQeye3", "is_equal": true }, { "label": "b", "feature": "IQeye3", "is_equal": true }] }, { "name": "S-CMS", "logic": "a||b||c||d||e||f||g||h||i", "rule": [{ "label": "a", "feature": "class=\\\"scms_container w1200\\\"", "is_equal": true }, { "label": "b", "feature": "

    Powered by S:CMS - Copyright \u00a9", "is_equal": true }, { "label": "c", "feature": "SCMS", "is_equal": true }, { "label": "d", "feature": "", "is_equal": true }, { "label": "e", "feature": "www.smartlogic.com", "is_equal": true }, { "label": "f", "feature": "/media/20151019095214828.png", "is_equal": true }, { "label": "g", "feature": "

    \u95ea\u7075CMS\u5efa\u7ad9\u7cfb\u7edf

    ", "is_equal": true }, { "label": "h", "feature": "type=news&s_id=", "is_equal": true }, { "label": "i", "feature": "type=newsinfo&s_id=", "is_equal": true }] }, { "name": "Strait Information - Black Shield Operation and Safety Gateway", "logic": "a", "rule": [{ "label": "a", "feature": "\u9ed1\u76fe\u8fd0\u7ef4\u5b89\u5168\u7f51\u5173(HD-SGS/V4.0)", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6900-T20", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6900-T20", "is_equal": true }] }, { "name": "ASUS-RT-AX88U", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "realm=\\\"RT-AX88U", "is_equal": true }, { "label": "b", "feature": "realm=\\\"RT-AX88U", "is_equal": true }, { "label": "c", "feature": "
    RT-AX88U
    ", "is_equal": true }, { "label": "d", "feature": "var product_name='RT-AX88U'", "is_equal": true }, { "label": "e", "feature": "\\\"model_name\\\":\\\"RT-AX88U\\\"", "is_equal": true }] }, { "name": "kubernetes", "logic": "a||b||c||d||e||f||g||h|| ((i||j) &&k&&l)", "rule": [{ "label": "a", "feature": "Kubernetes dashboard", "is_equal": true }, { "label": "b", "feature": "href=\\\"assets/images/kubernetes-logo.png", "is_equal": true }, { "label": "c", "feature": "
    KUBERNETES listening", "is_equal": true }, { "label": "e", "feature": "value=\\\"kubernetes", "is_equal": true }, { "label": "f", "feature": "realm=\\\"kubernetes", "is_equal": true }, { "label": "g", "feature": "realm=\\\"kubernetes", "is_equal": true }, { "label": "h", "feature": "Kubernetes CI", "is_equal": true }, { "label": "i", "feature": "/healthz", "is_equal": true }, { "label": "j", "feature": "/metrics", "is_equal": true }, { "label": "k", "feature": "paths", "is_equal": true }, { "label": "l", "feature": "application/json", "is_equal": true }] }, { "name": "vocetelecomWIFI", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"vocetelecomWIFI", "is_equal": true }, { "label": "b", "feature": "realm=\\\"vocetelecomWIFI", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6900-T40", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6900-T40", "is_equal": true }] }, { "name": "D_Link-DSR-1000AC", "logic": "a||b", "rule": [{ "label": "a", "feature": "Unified Services Router - DSR-1000AC ", "is_equal": true }, { "label": "b", "feature": " DSR-1000AC", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6900-X20", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6900-X20", "is_equal": true }] }, { "name": "ASUS-TUF-AX3000", "logic": "a||b", "rule": [{ "label": "a", "feature": "document.getElementsByClassName(\\\"model-name\\\")[0].innerhtml = \\\"TUF-AX3000\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"prod_madelName\\\">TUF-AX3000", "is_equal": true }] }, { "name": "D_Link-DSR-500AC", "logic": "a||b", "rule": [{ "label": "a", "feature": "DSR-500AC", "is_equal": true }, { "label": "b", "feature": "Unified Services Router - DSR-500AC ", "is_equal": true }] }, { "name": "PMWAY-E5", "logic": "a&&b", "rule": [{ "label": "a", "feature": "tip_BrowserTooLow:\\\"\u60a8\u5f53\u524d\u4f7f\u7528\u7684\u6d4f\u89c8\u5668\u7248\u672c\u6216\u6a21\u5f0f\u592a\u4f4e\uff0c\u9e4f\u4e3aE5\u4e3a\u4e86\u60a8\u66f4\u597d\u7684\u4f53\u9a8c\uff0c\u8bf7\u5347\u7ea7\u60a8\u7684IE\u7248\u672c\u81f38.0\u6216\u4ee5\u4e0a\u3002\\\"", "is_equal": true }, { "label": "b", "feature": "\u9e4f\u4e3a\u8f6f\u4ef6 E6", "is_equal": false }] }, { "name": "TENDA-wireless extension", "logic": "a&&b", "rule": [{ "label": "a", "feature": "alt=\\\"Tenda LOGO\\\"", "is_equal": true }, { "label": "b", "feature": "Extender", "is_equal": true }] }, { "name": "CMailServer", "logic": "a|| (b&&c) ||d|| (e&&f)", "rule": [{ "label": "a", "feature": "cmailserver", "is_equal": true }, { "label": "b", "feature": "Mail Server WebMail - ", "is_equal": true }, { "label": "c", "feature": "Username ( Contatto Email )", "is_equal": true }, { "label": "d", "feature": "CMailServer ", "is_equal": true }, { "label": "e", "feature": "\u7ecf\u7406", "is_equal": true }] }, { "name": "Zhigao-Yiwai E-Link", "logic": "a", "rule": [{ "label": "a", "feature": "document.writeln(\\\"\uff08\u6e29\u99a8\u63d0\u793a\uff1a\u6b64\u5904\u4e3a\u5fd7\u9ad8\u7f8e\u840d\u5206\u652f\u673a\u6784\u8054\u7cfb\u65b9\u5f0f\uff0c\u5fd7\u9ad8\u7f8e\u840d\u603b\u90e8\u8054\u7cfb\u65b9\u5f0f\u8bf7\u70b9\u51fb\u591a\u53ef\u7535\u5b50\u6863\u6848\u7ba1\u7406\u7cfb\u7edf", "is_equal": true }, { "label": "c", "feature": "href='https://sourceforge.net/projects/ipcop/", "is_equal": true }, { "label": "d", "feature": "href='http://sf.net/projects/ipcop/", "is_equal": true }] }, { "name": "Honeywell-Intermec-EasyLAN", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: XCD WebAdmin", "is_equal": true }, { "label": "b", "feature": "Server: XCD WebAdmin", "is_equal": true }, { "label": "c", "feature": "color=\\\"BLACK\\\" size=\\\"5\\\">Intermec EasyLAN", "is_equal": true }] }, { "name": "ASUS-AiCloud", "logic": "a", "rule": [{ "label": "a", "feature": "href=\\\"/smb/css/startup.png\\\"", "is_equal": true }] }, { "name": "MULTIABNLE-M18", "logic": "a", "rule": [{ "label": "a", "feature": "", "is_equal": true }] }, { "name": "InterRed", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"InterRed", "is_equal": true }, { "label": "b", "feature": "Created with InterRed", "is_equal": true }] }, { "name": "AXIS-MegapixelIPCamera", "logic": "a|| (b) ||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"MegapixelIPCamera", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Megapixel IP Camera", "is_equal": true }, { "label": "c", "feature": "realm=\\\"Megapixel_IP_Camera", "is_equal": true }, { "label": "d", "feature": "Mega-Pixel Network Camera", "is_equal": true }] }, { "name": "Shang Bo Xin - Internet Marketing Platform", "logic": "a", "rule": [{ "label": "a", "feature": "/sunbox/assets/js/ace.min.js", "is_equal": true }] }, { "name": "Infinet-Wireless-Router", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "content=\\\"InfiNet", "is_equal": true }, { "label": "b", "feature": "Server: WANFlex HTTP Daemon", "is_equal": true }, { "label": "c", "feature": "Server: WANFlex HTTP Daemon", "is_equal": true }] }, { "name": "Infomaster-product", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "/MasterView.css", "is_equal": true }, { "label": "b", "feature": "/masterView.js", "is_equal": true }, { "label": "c", "feature": "/MasterView/MPLeftNavStyle/PanelBar.MPIFMA.css", "is_equal": true }] }, { "name": "Indico", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "MAKACSESSION", "is_equal": true }, { "label": "b", "feature": "MAKACSESSION", "is_equal": true }, { "label": "c", "feature": "href=\\\"http://cern.ch/indico", "is_equal": true }] }, { "name": "ImpressPages-CMS", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"ImpressPages CMS", "is_equal": true }] }, { "name": "HP-iLO", "logic": "((a||b||c||d) &&e&&f) || ((g||h) &&i&&j)", "rule": [{ "label": "a", "feature": "href=\\\"http://www.hp.com/go/ilo", "is_equal": true }, { "label": "b", "feature": "HP Integrated Lights-Out", "is_equal": true }, { "label": "c", "feature": "js/iLO.js", "is_equal": true }, { "label": "d", "feature": "Server: HP-iLO-Server", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "drupal", "is_equal": false }, { "label": "g", "feature": "Server: HP-iLO-Server", "is_equal": true }, { "label": "h", "feature": "Management Processor (MP) for HP Integrity Servers", "is_equal": true }, { "label": "i", "feature": "couchdb", "is_equal": false }, { "label": "j", "feature": "drupal", "is_equal": false }] }, { "name": "IMGallery", "logic": "a", "rule": [{ "label": "a", "feature": "href=\\\"http://www.imgallery.zor.pl\\\">IMGallery", "is_equal": true }] }, { "name": "Ikonboard", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"Ikonboard", "is_equal": true }, { "label": "b", "feature": "Powered by TENDA N60", "is_equal": true }, { "label": "b", "feature": "tenda-N60", "is_equal": true }, { "label": "c", "feature": "realm=\\\"Tenda N60", "is_equal": true }, { "label": "d", "feature": "realm=\\\"Tenda N60", "is_equal": true }] }, { "name": "TP-LINK-TD-W8970", "logic": "a||b||c||d||e||f||g||h||i||j", "rule": [{ "label": "a", "feature": "TP-LINK 300Mbps Wireless N Gigabit ADSL2+ Modem Router TD-W8970", "is_equal": true }, { "label": "b", "feature": "0.6.0 1.2 v000c.0 Build 130201 Rel.54921n", "is_equal": true }, { "label": "c", "feature": "0.6.0 2.1 v000c.0 Build 130415 Rel.34164n", "is_equal": true }, { "label": "d", "feature": "0.6.0 2.12 v000c.0 Build 140613 Rel.31066n", "is_equal": true }, { "label": "e", "feature": "0.6.0 2.13 v000c.0 Build 140919 Rel.52310n", "is_equal": true }, { "label": "f", "feature": "0.6.0 2.8 v000c.0 Build 130828 Rel.38099n", "is_equal": true }, { "label": "g", "feature": "0.6.0 2.9 v000c.0 Build 131114 Rel.33362n", "is_equal": true }, { "label": "h", "feature": "0.9.1 0.1 v0035.0 Build 141010 Rel.53828n", "is_equal": true }, { "label": "i", "feature": "0.9.1 1.1 v0035.0 Build 141212 Rel.33999n", "is_equal": true }, { "label": "j", "feature": "0.9.1 1.2 v0035.0 Build 150427 Rel.63930n", "is_equal": true }] }, { "name": "PMWAY-E6", "logic": "a", "rule": [{ "label": "a", "feature": "\u9e4f\u4e3a\u8f6f\u4ef6 E6", "is_equal": true }] }, { "name": "Futong World -ERP", "logic": "a", "rule": [{ "label": "a", "feature": "

    \u5bcc\u901a\u5929\u4e0bERP

    ", "is_equal": true }] }, { "name": "You Shikang-EC-Fax", "logic": "a&&b", "rule": [{ "label": "a", "feature": " href=\\\"web/css/faxcss.css\\\"", "is_equal": true }, { "label": "b", "feature": "src=\\\"web/img/log/logo-faxlogin.gif\\\"", "is_equal": true }] }, { "name": "Youyou - Youyou Firewall", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "src=\\\"./js/jquery.validate.js\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"inputSize2\\\"", "is_equal": true }, { "label": "c", "feature": "\u9632\u706b\u5899", "is_equal": false }] }, { "name": "Bihewei Technology-Company Products", "logic": "a", "rule": [{ "label": "a", "feature": "href='http://www.bithighway.com' target=_blank>\u5317\u4eac\u78a7\u6d77\u5a01\u79d1\u6280\u6709\u9650\u516c\u53f8<", "is_equal": true }] }, { "name": "InfoGuard-Airlock", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "al_sess=", "is_equal": true }, { "label": "b", "feature": "al_lb=", "is_equal": true }, { "label": "c", "feature": "al_sess=", "is_equal": true }, { "label": "d", "feature": "al_lb=", "is_equal": true }] }, { "name": "Song Xun Technology - Intelligent Cache", "logic": "a&&b", "rule": [{ "label": "a", "feature": "src=\\\"/Public/sec/assets/js/libs/jquery.placeholder.min.js\\\">", "is_equal": true }, { "label": "b", "feature": " href=\\\"http://www.dwcache.com\\\"", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6865-U12X", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6865-U12X", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6865-P16X", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6865-P16X", "is_equal": true }] }, { "name": "IBM-WebSphere-DataPower", "logic": "(a&&b&&c) || (d&&e)", "rule": [{ "label": "a", "feature": "x-backside-transport", "is_equal": true }, { "label": "b", "feature": "28ZE", "is_equal": false }, { "label": "c", "feature": "360 web server", "is_equal": false }, { "label": "d", "feature": "x-backside-transport", "is_equal": true }, { "label": "e", "feature": "360 web server", "is_equal": false }] }, { "name": "Alcatel_Lucent-OS6860E-P24", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6860E-P24", "is_equal": true }] }, { "name": "ostec-firebox", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "background-image: url('/icones/fundo_firebox.png')", "is_equal": true }, { "label": "b", "feature": "http://colorzilla.com/", "is_equal": true }, { "label": "c", "feature": "OSTEC FireBox", "is_equal": true }] }, { "name": "inseego-Skyus-E", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"img/Skyus_E_fpos.png\\\"", "is_equal": true }] }, { "name": "cradlepoint-IBR350LPE", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR350LPE", "is_equal": true }] }, { "name": "cradlepoint-IBR1100LP3", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR1100LP3", "is_equal": true }] }, { "name": "cradlepoint-IBR1150LP3", "logic": "a", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"IBR1150LP3\\\"", "is_equal": true }] }, { "name": "cradlepoint-AER1600LP4", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"AER1600LP4\\\"", "is_equal": true }, { "label": "b", "feature": "AER1600LP4", "is_equal": true }, { "label": "c", "feature": "Cradlepoint AER1600LP4", "is_equal": true }] }, { "name": "cradlepoint-IBR600C-150M-D", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR600C-150M-D", "is_equal": true }] }, { "name": "cradlepoint-AER3100", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: AER3100", "is_equal": true }, { "label": "b", "feature": "AER3100", "is_equal": true }] }, { "name": "cradlepoint-IBR900LPE", "logic": "a", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"IBR900LPE\\\"", "is_equal": true }] }, { "name": "cradlepoint-AER1650LP4", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: AER1650LP4", "is_equal": true }] }, { "name": "cradlepoint-IBR650E", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR650E", "is_equal": true }] }, { "name": "cradlepoint-AER2200-600M", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: AER2200-600M", "is_equal": true }, { "label": "b", "feature": "cplogin.model = \\\"AER2200-FIPS-600M\\\";", "is_equal": true }] }, { "name": "cradlepoint-IBR1700-600M", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR1700-600M", "is_equal": true }] }, { "name": "cradlepoint-AER1650LPE", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: AER1650LPE", "is_equal": true }] }, { "name": "cradlepoint-IBR650CLPE", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR650CLPE", "is_equal": true }] }, { "name": "cradlepoint-IBR900-600M", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR900-600M", "is_equal": true }] }, { "name": "cradlepoint-IBR650C-150M-D", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR650C-150M-D", "is_equal": true }] }, { "name": "cradlepoint-IBR600CLPE", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR600CLPE", "is_equal": true }] }, { "name": "cradlepoint-MBR1400v2", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: MBR1400v2", "is_equal": true }, { "label": "b", "feature": "MBR1400v2", "is_equal": true }] }, { "name": "Icecast", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "icecast", "is_equal": true }, { "label": "b", "feature": "Server: Icecast", "is_equal": true }, { "label": "c", "feature": "EZStream", "is_equal": true }, { "label": "d", "feature": "Icecast", "is_equal": true }] }, { "name": "IBM-Web-Traffic-Express-Caching-Proxy", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "IBM-PROXY-WTE", "is_equal": true }, { "label": "b", "feature": "IBM-PROXY-WTE", "is_equal": true }, { "label": "c", "feature": "/admin-bin/webexec/wte.html", "is_equal": true }] }, { "name": "i-Catcher-Console", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: i-Catcher", "is_equal": true }, { "label": "b", "feature": "Server: i-Catcher", "is_equal": true }, { "label": "c", "feature": "by i-Catcher Console", "is_equal": true }] }, { "name": "NAVER-MW-5150AP", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"MW-5150AP", "is_equal": true }, { "label": "b", "feature": "MW-5150AP", "is_equal": true }] }, { "name": "NAVER-MW-6300AP", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"MW-6300AP", "is_equal": true }, { "label": "b", "feature": "MW-6300AP", "is_equal": true }] }, { "name": "NAVER-MW-6345AP", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"MW-6345AP", "is_equal": true }, { "label": "b", "feature": "MW-6345AP", "is_equal": true }] }, { "name": "cradlepoint-IBR600LE", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: IBR600LE", "is_equal": true }, { "label": "b", "feature": "Cradlepoint IBR600LE", "is_equal": true }] }, { "name": "cradlepoint-IBR900LP6", "logic": "a", "rule": [{ "label": "a", "feature": "Login :: IBR900LP6", "is_equal": true }] }, { "name": "netcore-NW705P", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "realm=\\\"NW705P", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Netcore NW705P", "is_equal": true }, { "label": "c", "feature": "realm=\\\"NetcoreNW705P", "is_equal": true }, { "label": "d", "feature": "realm=\\\"NW705P", "is_equal": true }, { "label": "e", "feature": "realm=\\\"Netcore NW705P", "is_equal": true }, { "label": "f", "feature": "realm=\\\"NetcoreNW705P", "is_equal": true }] }, { "name": "netcore-NetcoreNW711", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NetcoreNW711", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NetcoreNW711", "is_equal": true }] }, { "name": "NETGEAR-C7000v2", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR C7000v2", "is_equal": true }, { "label": "b", "feature": "NETGEAR Gateway C7000v2", "is_equal": true }, { "label": "c", "feature": "realm=\\\"NETGEAR C7000v2", "is_equal": true }] }, { "name": "NETGEAR-DG834G", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR DG834G", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR DG834G", "is_equal": true }] }, { "name": "cradlepoint-IBR200-10M", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: IBR200-10M", "is_equal": true }, { "label": "b", "feature": "cplogin.model = \\\"IBR200-10M\\\";", "is_equal": true }] }, { "name": "Oracle-JAVA", "logic": "a||b||c||d||e||f||g|| (h&&i&&j) || (k&&l&&m) ||n|| (o&&p&&q&&r) || (s&&t&&u&&v)", "rule": [{ "label": "a", "feature": "Set-Cookie: JSESSIONID", "is_equal": true }, { "label": "b", "feature": "Set-Cookie: JSESSIONID", "is_equal": true }, { "label": "c", "feature": "

    Struts Problem Report

    ", "is_equal": true }, { "label": "d", "feature": "There is no Action mapped for namespace", "is_equal": true }, { "label": "e", "feature": "No result defined for action and result input", "is_equal": true }, { "label": "f", "feature": "X-Powered-By: Servlet", "is_equal": true }, { "label": "g", "feature": "X-Powered-By: Servlet", "is_equal": true }, { "label": "h", "feature": "JBoss", "is_equal": true }, { "label": "i", "feature": "X-Powered-By", "is_equal": true }, { "label": "j", "feature": "Router", "is_equal": false }, { "label": "k", "feature": "JBoss", "is_equal": true }, { "label": "l", "feature": "X-Powered-By", "is_equal": true }, { "label": "m", "feature": "Router", "is_equal": false }, { "label": "n", "feature": "index.jsp", "is_equal": true }, { "label": "o", "feature": "360 web server", "is_equal": false }, { "label": "p", "feature": "Docker", "is_equal": false }, { "label": "q", "feature": "jsp", "is_equal": true }, { "label": "r", "feature": "X-Powered-By", "is_equal": true }, { "label": "s", "feature": "360 web server", "is_equal": false }, { "label": "t", "feature": "Docker", "is_equal": false }, { "label": "u", "feature": "jsp", "is_equal": true }, { "label": "v", "feature": "X-Powered-By", "is_equal": true }] }, { "name": "cradlepoint-IBR600BLP4", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login :: IBR600BLP4", "is_equal": true }, { "label": "b", "feature": "IBR600BLP4", "is_equal": true }] }, { "name": "TOTO_LINK-N151RT", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"TOTOLINK N151RT", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TOTOLINK N151RT", "is_equal": true }, { "label": "c", "feature": "realm=\\\"TOTOLINK N151RT", "is_equal": true }, { "label": "d", "feature": "realm=\\\"TOTOLINK N151RT", "is_equal": true }] }, { "name": "cradlepoint-IBR650LPE", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"IBR650LPE\\\"", "is_equal": true }, { "label": "b", "feature": "Cradlepoint IBR650LPE", "is_equal": true }, { "label": "c", "feature": "Login :: IBR650LPE", "is_equal": true }] }, { "name": "cradlepoint-AER1600", "logic": "a||b", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"AER1600\\\"", "is_equal": true }, { "label": "b", "feature": "Cradlepoint AER1600", "is_equal": true }] }, { "name": "cradlepoint-AER1600LPE", "logic": "a||b", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"AER1600LPE\\\"", "is_equal": true }, { "label": "b", "feature": "Cradlepoint AER1600LPE", "is_equal": true }] }, { "name": "Cradlepoint-CBA850", "logic": "a", "rule": [{ "label": "a", "feature": "cplogin.model = \\\"CBA850\\\"", "is_equal": true }] }, { "name": "ABUS-TVIP10001", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP10001", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP10001", "is_equal": true }] }, { "name": "ABUS-TVIP10500", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP10500", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP10500", "is_equal": true }] }, { "name": "ABUS-TVIP20000", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP20000", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP20000", "is_equal": true }] }, { "name": "ABUS-TVIP21502", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP21502", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP21502", "is_equal": true }] }, { "name": "ABUS-TVIP21550", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP21550", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP21550", "is_equal": true }] }, { "name": "ABUS-TVIP21551", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP21551", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP21551", "is_equal": true }] }, { "name": "ABUS-TVIP21552", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP21552", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP21552", "is_equal": true }] }, { "name": "ABUS-TVIP62000", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP62000", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP62000", "is_equal": true }] }, { "name": "ABUS-TVIP71501", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP71501", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP71501", "is_equal": true }] }, { "name": "ABUS-TVIP71551", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP71551", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP71551", "is_equal": true }] }, { "name": "ABUS-TVIP72500", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TVIP72500", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TVIP72500", "is_equal": true }] }, { "name": "Alcatel_Lucent-OmniVista-Cirrus", "logic": "a", "rule": [{ "label": "a", "feature": "/help/en-us/others/OV-Cirrus_CookiePolicy.html", "is_equal": true }] }, { "name": "HostBill", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by
    HostBill", "is_equal": true }] }, { "name": "HP-LaserJet-Printer", "logic": "((a||b||c||d) &&e) ||f||g|| (h&&i)", "rule": [{ "label": "a", "feature": "HP-ChaiSOE", "is_equal": true }, { "label": "b", "feature": "HP Color LaserJet", "is_equal": true }, { "label": "c", "feature": "hp LaserJet", "is_equal": true }, { "label": "d", "feature": "HP » 设备状态", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "LaserJet", "is_equal": true }, { "label": "g", "feature": "HP Color LaserJet", "is_equal": true }, { "label": "h", "feature": "Location: /SSI/index.htm", "is_equal": true }, { "label": "i", "feature": "Server: Mrvl-R1_0", "is_equal": true }] }, { "name": "CTOP - Collaborative Office OA", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "/ctop/index.jsp", "is_equal": true }, { "label": "b", "feature": "/software/jinstall.exe", "is_equal": true }, { "label": "c", "feature": "src=\\\"images/logo-ctop.gif", "is_equal": true }, { "label": "d", "feature": "src=\\\"images/ctop_logo.gif", "is_equal": true }] }, { "name": "Docker-product", "logic": "a||b||c||d||e||f|| (g&&h&&i) || (j&&k&&l)", "rule": [{ "label": "a", "feature": "X-Docker-Registry-Version", "is_equal": true }, { "label": "b", "feature": "X-Docker: PRODUCTION", "is_equal": true }, { "label": "c", "feature": "X-Docker-Container: nginx", "is_equal": true }, { "label": "d", "feature": "X-Docker-Registry-Version", "is_equal": true }, { "label": "e", "feature": "X-Docker: PRODUCTION", "is_equal": true }, { "label": "f", "feature": "X-Docker-Container: nginx", "is_equal": true }, { "label": "g", "feature": "Server: Docker/", "is_equal": true }, { "label": "h", "feature": "couchdb", "is_equal": false }, { "label": "i", "feature": "drupal", "is_equal": false }, { "label": "j", "feature": "Server: Docker/", "is_equal": true }, { "label": "k", "feature": "couchdb", "is_equal": false }, { "label": "l", "feature": "drupal", "is_equal": false }] }, { "name": "\u6cdb\u5fae-EMobile", "logic": "a|| (b&&c) ||d|| (e&&f)", "rule": [{ "label": "a", "feature": "content=\\\"Weaver E-mobile\\\"", "is_equal": true }, { "label": "b", "feature": "E-Mobile ", "is_equal": true }, { "label": "c", "feature": "action=\\\"/verifyLogin.do", "is_equal": true }, { "label": "d", "feature": "/images/login_logo@2x.png", "is_equal": true }, { "label": "e", "feature": "window.apiprifix = \\\"/emp\\\";", "is_equal": true }, { "label": "f", "feature": "\u79fb\u52a8\u7ba1\u7406\u5e73\u53f0", "is_equal": true }] }, { "name": "Panmine-E-Weaver", "logic": "((a&&b) || (c&&d))", "rule": [{ "label": "a", "feature": "szFeatures", "is_equal": true }, { "label": "b", "feature": "redirectUrl", "is_equal": true }, { "label": "c", "feature": "rndData", "is_equal": true }, { "label": "d", "feature": "isdx", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS9900", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS9900", "is_equal": true }] }, { "name": "NSP-NAS-FTP", "logic": "a", "rule": [{ "label": "a", "feature": "NSP-NAS FTP service", "is_equal": true }] }, { "name": "Alcatel_Lucent-OS6560-24X4", "logic": "a", "rule": [{ "label": "a", "feature": "Device OS6560-24X4", "is_equal": true }] }, { "name": "HP-ProCurve-Switch", "logic": "(a&& (b||c||d)) ||e|| (f&&g) ||h|| (i&&j)", "rule": [{ "label": "a", "feature": "Server: eHTTP", "is_equal": true }, { "label": "b", "feature": "ProCurve ", "is_equal": true }, { "label": "c", "feature": "ProCurve ", "is_equal": true }, { "label": "d", "feature": "Hewlett Packard Enterprise Development LP", "is_equal": true }, { "label": "e", "feature": "ProCurve Switch", "is_equal": true }, { "label": "f", "feature": "HP ", "is_equal": true }, { "label": "g", "feature": "ProCurve Switch", "is_equal": true }, { "label": "h", "feature": "HP ProCurve 1810G", "is_equal": true }, { "label": "i", "feature": "ProCurve", "is_equal": true }, { "label": "j", "feature": "switch", "is_equal": true }] }, { "name": "ZTE-ZXSEC-US", "logic": "a||b", "rule": [{ "label": "a", "feature": "class=\\\"login_main_text\\\">ZXSEC US", "is_equal": true }, { "label": "b", "feature": "ZXSEC US", "is_equal": true }] }, { "name": "NetComm-WiFi-VoIP-Gateway", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NetComm WiFi Data and VoIP Gateway", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NetComm WiFi Data and VoIP Gateway", "is_equal": true }] }, { "name": "3MP-Network-Camera", "logic": "a", "rule": [{ "label": "a", "feature": "3MP Network Camera", "is_equal": true }] }, { "name": "Weaning -RP system", "logic": "a", "rule": [{ "label": "a", "feature": "/javascript/js/WITFunctions.js", "is_equal": true }] }, { "name": "Kafka-Manager", "logic": "a||b||c||d||e||f||g||h", "rule": [{ "label": "a", "feature": "Kafka admin", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Kafka-Manager", "is_equal": true }, { "label": "c", "feature": "realm=\\\"Kafka Manager", "is_equal": true }, { "label": "d", "feature": "Kafka Manager", "is_equal": true }, { "label": "e", "feature": "/vassets/dataTables/stylesheets", "is_equal": true }, { "label": "f", "feature": "vassets/images/2af62f58ee2baf495c9b3a9a1c30ce03-favicon.png", "is_equal": true }, { "label": "g", "feature": "realm=\\\"Kafka-Manager", "is_equal": true }, { "label": "h", "feature": "realm=\\\"Kafka Manager", "is_equal": true }] }, { "name": "WebRay-Situation Perception", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"disclaimer\\\" style=\\\"color: #FFFFFF\\\">\u300a\u76db\u90a6\u5b89\u5168\u7f51\u7ad9\u76d1\u63a7\u9884\u8b66\u5e73\u53f0\u670d\u52a1\u534f\u8bae\u300b", "is_equal": true }] }, { "name": "HP-SiteScope", "logic": "((a||b||c||d) &&e) || ((f||g||h) &&i)", "rule": [{ "label": "a", "feature": "SiteScope Login", "is_equal": true }, { "label": "b", "feature": "Server: SiteScope", "is_equal": true }, { "label": "c", "feature": "Path=/SiteScope", "is_equal": true }, { "label": "d", "feature": "realm=\\\"SiteScope", "is_equal": true }, { "label": "e", "feature": "Server: couchdb", "is_equal": false }, { "label": "f", "feature": "Server: SiteScope", "is_equal": true }, { "label": "g", "feature": "Path=/SiteScope", "is_equal": true }, { "label": "h", "feature": "realm=\\\"SiteScope", "is_equal": true }, { "label": "i", "feature": "couchdb", "is_equal": false }] }, { "name": "gee-HiWiFi", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "\u6b64\u65b9\u6cd5\u4e0eHiWiFi\u4e2d\u7684\u65b9\u6cd5\u4fdd\u6301\u4e00\u81f4", "is_equal": true }, { "label": "b", "feature": "Server: HiWiFi", "is_equal": true }, { "label": "c", "feature": "Server: HiWiFi", "is_equal": true }] }, { "name": "VOS-VOS2009", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"VOS2009, VoIP, VoIP\u8fd0\u8425\u652f\u6491\u7cfb\u7edf, \u8f6f\u4ea4\u6362\\\"", "is_equal": true }] }, { "name": "NOMADIX-AG-5800", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "realm=\\\"AG 5800", "is_equal": true }, { "label": "b", "feature": "AG 5800: Login", "is_equal": true }, { "label": "c", "feature": "AG 5800", "is_equal": true }] }, { "name": "Ai Run - Smart Parking Management System", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/static/img/allstar.png\\\"", "is_equal": true }] }, { "name": "Utorrent-product", "logic": "a||b||c|| (d&&e&&f) || (g&&h&&i)", "rule": [{ "label": "a", "feature": "Basic realm=\\\"uTorrent\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"uTorrent\\\"", "is_equal": true }, { "label": "c", "feature": "www-authenticate Basic realm=\\\"uTorrent", "is_equal": true }, { "label": "d", "feature": "HTTP/1.1 300 ERROR", "is_equal": true }, { "label": "e", "feature": "Content-Length: 15", "is_equal": true }, { "label": "f", "feature": "invalid request", "is_equal": true }, { "label": "g", "feature": "HTTP/1.1 300 ERROR", "is_equal": true }, { "label": "h", "feature": "Content-Length: 15", "is_equal": true }, { "label": "i", "feature": "invalid request", "is_equal": true }] }, { "name": "NexG-VForce", "logic": "a", "rule": [{ "label": "a", "feature": "var lurl = \\\"VOS.shtml\\\"", "is_equal": true }] }, { "name": "ACTi-NVR", "logic": "a&&b", "rule": [{ "label": "a", "feature": "var szproductbrand = 'ACTi'", "is_equal": true }, { "label": "b", "feature": "var szproducttype = 'NVR'", "is_equal": true }] }, { "name": "MOBOTIX-M25", "logic": "a", "rule": [{ "label": "a", "feature": "MOBOTIXM25", "is_equal": true }] }, { "name": "MOBOTIX-M24", "logic": "a", "rule": [{ "label": "a", "feature": "M24", "is_equal": true }] }, { "name": "MOBOTIX-M26", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"bold featurestypeinfo\\\">M26", "is_equal": true }] }, { "name": "reolink-NVR", "logic": "a||b", "rule": [{ "label": "a", "feature": "Balanced", "is_equal": true }, { "label": "b", "feature": "Reolink", "is_equal": true }] }, { "name": "LOREX-NVR", "logic": "a", "rule": [{ "label": "a", "feature": "
    ", "is_equal": true }] }, { "name": "CP_PLUS-NVR", "logic": "a", "rule": [{ "label": "a", "feature": "CPPLUS NVR \u2013Web View", "is_equal": true }] }, { "name": "HP-StorageWorks", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "HP StorageWorks", "is_equal": true }, { "label": "b", "feature": "snmp", "is_equal": true }, { "label": "c", "feature": "HP StorageWorks ", "is_equal": true }] }, { "name": "NETPOSA-Social Resource Access Management Service System", "logic": "a&&b", "rule": [{ "label": "a", "feature": "\u793e\u4f1a\u8d44\u6e90\u63a5\u5165\u7ba1\u7406\u670d\u52a1\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "netposa", "is_equal": true }] }, { "name": "HP-J4110A", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"HP J4110A", "is_equal": true }, { "label": "b", "feature": "HP J4110A", "is_equal": true }] }, { "name": "HP-J4812A", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"HP J4812A", "is_equal": true }, { "label": "b", "feature": "HP J4812A", "is_equal": true }] }, { "name": "Avaya-ERS-8810", "logic": "a", "rule": [{ "label": "a", "feature": "ERS-8810", "is_equal": true }] }, { "name": "TRENDnet-TEW-740APBO", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "TEW-740APBO
    ", "is_equal": true }, { "label": "b", "feature": "TEW-740APBO", "is_equal": true }, { "label": "c", "feature": "Etag: \\\"2009-6\\\"", "is_equal": true }] }, { "name": "Ganglia", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "Ganglia:: Cluster Report", "is_equal": true }, { "label": "b", "feature": "onchange=\\\"ganglia_form.submit();", "is_equal": true }, { "label": "c", "feature": "name=\\\"ganglia_form", "is_equal": true }, { "label": "d", "feature": "gs=unspecified", "is_equal": true }, { "label": "e", "feature": "gs=unspecified", "is_equal": true }] }, { "name": "PCLinuxOS", "logic": "a||b", "rule": [{ "label": "a", "feature": "PCLinuxOS", "is_equal": true }, { "label": "b", "feature": "PCLinuxOS", "is_equal": true }] }, { "name": "MontaVista-linux", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "MontaVista", "is_equal": true }, { "label": "b", "feature": "MontaVista Software", "is_equal": true }, { "label": "c", "feature": "Server: MontaVista/", "is_equal": true }] }, { "name": "MNG6200", "logic": "a", "rule": [{ "label": "a", "feature": "MNG6200", "is_equal": true }] }, { "name": "Gearhost-Company Products", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Hosted-With: GearHost", "is_equal": true }, { "label": "b", "feature": "Hosted-By: GearHost", "is_equal": true }, { "label": "c", "feature": "Hosted-With: GearHost", "is_equal": true }, { "label": "d", "feature": "Hosted-By: GearHost", "is_equal": true }] }, { "name": "GateQuest-PHP-Site-Recommender", "logic": "a", "rule": [{ "label": "a", "feature": "GateQuest", "is_equal": true }] }, { "name": "Enhydra-Application-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "Enhydra", "is_equal": true }, { "label": "b", "feature": "Enhydra", "is_equal": true }] }, { "name": "Dell-Remote-Access-Device", "logic": " (a&&b) &&c", "rule": [{ "label": "a", "feature": "SetEMClientInfo", "is_equal": true }, { "label": "b", "feature": "src=\\\"/initparams?emclientinfo", "is_equal": true }, { "label": "c", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "Qianxin - code guard", "logic": "a||b", "rule": [{ "label": "a", "feature": "360\u4ee3\u7801\u536b\u58eb", "is_equal": true }, { "label": "b", "feature": "baseUrl : 'app', //\u914d\u7f6e\u6a21\u5757\u6839\u8def\u5f84\u5230\u9759\u6001\u8d44\u6e90\u6839\u76ee\u5f55\u3002", "is_equal": true }] }, { "name": "TRENDnet-TEW-823DRU", "logic": "a||b", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-823DRU\\\"", "is_equal": true }, { "label": "b", "feature": "TEW-823DRU", "is_equal": true }] }, { "name": "EPiServer", "logic": "((a||b||c) &&d) ||e", "rule": [{ "label": "a", "feature": "content=\\\"EPiServer", "is_equal": true }, { "label": "b", "feature": "/javascript/episerverscriptmanager.js", "is_equal": true }, { "label": "c", "feature": "Server: EpiServer", "is_equal": true }, { "label": "d", "feature": "Server: couchdb", "is_equal": false }, { "label": "e", "feature": "Server: EpiServer", "is_equal": true }] }, { "name": "Enigma2", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "href=\\\"/web/movielist.rss?tag", "is_equal": true }, { "label": "b", "feature": "Enigma2 WebControl", "is_equal": true }, { "label": "c", "feature": "Server: enigma2", "is_equal": true }] }, { "name": "TRENDnet-TEW-825DAP", "logic": "a", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-825DAP\\\"", "is_equal": true }] }, { "name": "Ericsson-TV-Web-Server", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "Server : Ericsson Television Web server", "is_equal": true }, { "label": "b", "feature": "Server: Ericsson Television Web server", "is_equal": true }, { "label": "c", "feature": "Server :Ericsson Television Web server", "is_equal": true }, { "label": "d", "feature": "Server : Ericsson Television Web server", "is_equal": true }, { "label": "e", "feature": "Server: Ericsson Television Web server", "is_equal": true }, { "label": "f", "feature": "Server :Ericsson Television Web server", "is_equal": true }] }, { "name": "Eserv", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: Eserv", "is_equal": true }, { "label": "b", "feature": "content=\\\"Eserv", "is_equal": true }, { "label": "c", "feature": "Server: Eserv", "is_equal": true }] }, { "name": "H3C-ICG1800", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "realm=\\\"H3C ICG 1800", "is_equal": true }, { "label": "b", "feature": "realm=\\\"H3C ICG1800", "is_equal": true }, { "label": "c", "feature": "H3C ICG 1800", "is_equal": true }, { "label": "d", "feature": "H3C ICG1800", "is_equal": true }] }, { "name": "esoTalk", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "generated by esoTalk", "is_equal": true }, { "label": "b", "feature": "Powered by esoTalk", "is_equal": true }, { "label": "c", "feature": "/js/esotalk.js", "is_equal": true }] }, { "name": "TRENDnet-TEW-755AP", "logic": "a", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-755AP\\\"", "is_equal": true }] }, { "name": "TRENDnet-TEW-810DR", "logic": "a", "rule": [{ "label": "a", "feature": "TEW-810DR pre-test", "is_equal": true }] }, { "name": "TRENDnet-TEW-822DRE", "logic": "a&&b", "rule": [{ "label": "a", "feature": "TEW-822DRE", "is_equal": true }, { "label": "b", "feature": "lang_obj.write(\\\"product_description\\\")", "is_equal": true }] }, { "name": "TRENDnet-TEW-821DAP", "logic": "a", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-821DAP\\\"", "is_equal": true }] }, { "name": "TRENDnet-TEW-827DRU", "logic": "a", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-827DRU\\\"", "is_equal": true }] }, { "name": "TRENDnet-TEW-824DRU", "logic": "a||b", "rule": [{ "label": "a", "feature": "var model = \\\"TEW-824DRU\\\"", "is_equal": true }, { "label": "b", "feature": "Capture(status_router.sys_model)Trendnet TEW824DRU", "is_equal": true }] }, { "name": "DLink-DI-808HV", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DI-808HV", "is_equal": true }, { "label": "b", "feature": "DI-808HV", "is_equal": true }] }, { "name": "DLink-DI-824VUP", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DI-824VUP", "is_equal": true }, { "label": "b", "feature": "DI-824VUP", "is_equal": true }] }, { "name": "DLink-DI-LB604", "logic": "a||b", "rule": [{ "label": "a", "feature": "DI-LB604", "is_equal": true }, { "label": "b", "feature": "DI-LB604", "is_equal": true }] }, { "name": "Tiandy-NVR", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "id=\\\"maintaince_dialog_ok\\\"", "is_equal": true }, { "label": "b", "feature": "Playback
    ", "is_equal": true }, { "label": "c", "feature": "if(GetDiscription(\\\"application/x-rs-sclient-v3", "is_equal": true }] }, { "name": "Dell-Printer", "logic": "a||b|| (c&&d)", "rule": [{ "label": "a", "feature": "Dell Laser Printer", "is_equal": true }, { "label": "b", "feature": "Dell Laser Printer", "is_equal": true }, { "label": "c", "feature": "EWS-NIC5", "is_equal": true }, { "label": "d", "feature": "\u5ba2\u6237\u7aef", "is_equal": true }] }, { "name": "LG-SuperSign", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/ssw/js/user/index.js", "is_equal": true }] }, { "name": "MAiPU-MP1800X-50", "logic": "(a&&b&&c) ||d", "rule": [{ "label": "a", "feature": "/assets/css/ui-dialog.css", "is_equal": true }, { "label": "b", "feature": "/form/formUserLogin", "is_equal": true }, { "label": "c", "feature": "Hardware Model", "is_equal": false }, { "label": "d", "feature": "MP1800X-50", "is_equal": true }] }, { "name": "RethinkDB", "logic": "a", "rule": [{ "label": "a", "feature": "RethinkDB Administration", "is_equal": true }] }, { "name": "SMARTBI", "logic": "a", "rule": [{ "label": "a", "feature": "gcfutil = jsloader.resolve('smartbi.gcf.gcfutil')", "is_equal": true }] }, { "name": "H3C-CR16004", "logic": "a", "rule": [{ "label": "a", "feature": "CR16004", "is_equal": true }] }, { "name": "H3C-CR16008-X", "logic": "a||b", "rule": [{ "label": "a", "feature": "H3C-CR16008-X", "is_equal": true }, { "label": "b", "feature": "H3C CR16008-X", "is_equal": true }] }, { "name": "uniview-VM5.0", "logic": "a", "rule": [{ "label": "a", "feature": "VM5.0", "is_equal": true }] }, { "name": "uniview-VM9500", "logic": "a", "rule": [{ "label": "a", "feature": "\u8f6f\u4ef6\u7248\u672c\uff1a VM9500", "is_equal": true }] }, { "name": "uniview-TMS8500", "logic": "a", "rule": [{ "label": "a", "feature": "TMS8500-IMOS110", "is_equal": true }] }, { "name": "D-link-850L", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "target=\\\"_blank\\\">DIR-850L", "is_equal": true }, { "label": "b", "feature": "modelname\\\">DIR-850L", "is_equal": true }, { "label": "c", "feature": ">\u7522\u54c1\u9801\u9762 : DIR-850L", "is_equal": true }] }, { "name": "uniview-EZclould", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"images/pag-logo.png\\\"", "is_equal": true }] }, { "name": "uniview-NVR308-32-IN", "logic": "a", "rule": [{ "label": "a", "feature": "NVR308-32-IN", "is_equal": true }] }, { "name": "VOS3000", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "VOS3000", "is_equal": true }, { "label": "b", "feature": "content=\\\"VOS3000", "is_equal": true }, { "label": "c", "feature": "images/vos3000.ico", "is_equal": true }] }, { "name": "uniview-ISC2500-SCT-E", "logic": "a", "rule": [{ "label": "a", "feature": "ISC2500-SCT-E", "is_equal": true }] }, { "name": "uniview-ISC2500-SP", "logic": "a", "rule": [{ "label": "a", "feature": "ISC2500-SP", "is_equal": true }] }, { "name": "uniview-ISC3500-SL", "logic": "a", "rule": [{ "label": "a", "feature": "ISC3500-SL", "is_equal": true }] }, { "name": "DokuWiki", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "powered by DokuWiki", "is_equal": true }, { "label": "b", "feature": "content=\\\"DokuWiki", "is_equal": true }, { "label": "c", "feature": "
    ", "is_equal": true }] }, { "name": "Delegate- product", "logic": "a||b", "rule": [{ "label": "a", "feature": "DeleGate", "is_equal": true }, { "label": "b", "feature": "Server: DeleGate", "is_equal": true }] }, { "name": "DD_WRT-product", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "style/pwc/ddwrt.css", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"DD-WRT", "is_equal": true }, { "label": "c", "feature": "Server: DD-WRT", "is_equal": true }, { "label": "d", "feature": "Basic realm=\\\"DD-WRT", "is_equal": true }, { "label": "e", "feature": "Server: DD-WRT", "is_equal": true }] }, { "name": "DVWA", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Damn Vulnerable Web App (DVWA) - Login", "is_equal": true }, { "label": "b", "feature": "dvwa/css/login.css", "is_equal": true }, { "label": "c", "feature": "dvwa/images/login_logo.png", "is_equal": true }] }, { "name": "ZEBRA-ZM400-200dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC ZM400-200dpi ZPL", "is_equal": true }] }, { "name": "ZEBRA-ZM400-300dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC ZM400-300dpi ZPL", "is_equal": true }] }, { "name": "RemObjects-DXSock", "logic": "(a&&b&&c) ||d||e||f|| (g&&h&&i)", "rule": [{ "label": "a", "feature": "RemObjects", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "drupal", "is_equal": false }, { "label": "d", "feature": "ERLib - RemObjects", "is_equal": true }, { "label": "e", "feature": "content=\\\"RemObjects SDK", "is_equal": true }, { "label": "f", "feature": "RemObjects Software, LLC.", "is_equal": true }, { "label": "g", "feature": "RemObjects", "is_equal": true }, { "label": "h", "feature": "couchdb", "is_equal": false }, { "label": "i", "feature": "drupal", "is_equal": false }] }, { "name": "ZEBRA-S4M-300dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC S4M-300dpi ZPL", "is_equal": true }] }, { "name": "ZEBRA-S4M-200dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC S4M-200dpi ZPL", "is_equal": true }] }, { "name": "Easy-File-Sharing-Web-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Easy File Sharing Web Server", "is_equal": true }, { "label": "b", "feature": "Server: Easy File Sharing Web Server", "is_equal": true }] }, { "name": "eBuilding-Network-Controller", "logic": "a", "rule": [{ "label": "a", "feature": "eBuilding Web", "is_equal": true }] }, { "name": "ZEBRA-105SLPlus-203dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC 105SLPlus-203dpi ZPL", "is_equal": true }] }, { "name": "ZEBRA-105SLPlus-300dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC 105SLPlus-300dpi ZPL", "is_equal": true }] }, { "name": "ZEBRA-RZ600-200dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC RZ600-200dpi ZPL", "is_equal": true }] }, { "name": "ZEBRA-110Xi4-203dpi-ZPL", "logic": "a", "rule": [{ "label": "a", "feature": "ZTC 110Xi4-203dpi ZPL", "is_equal": true }] }, { "name": "EdiMAX-Company Products", "logic": "a||b", "rule": [{ "label": "a", "feature": "EDIMAX Technology", "is_equal": true }, { "label": "b", "feature": "content=\\\"Edimax", "is_equal": true }] }, { "name": "EdgePrism-CDN", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "EdgePrism", "is_equal": true }, { "label": "b", "feature": "EdgePrismSSL", "is_equal": true }, { "label": "c", "feature": "Server: EdgePrism", "is_equal": true }, { "label": "d", "feature": "Server: EdgePrismSSL", "is_equal": true }] }, { "name": "DSpace", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"DSpace", "is_equal": true }, { "label": "b", "feature": "DSpace Software", "is_equal": true }] }, { "name": "Drugpak companies products", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by DrugPak", "is_equal": true }, { "label": "b", "feature": "/dplimg/DPSTYLE.CSS", "is_equal": true }] }, { "name": "Dradis-Framework", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "_dradis_session=", "is_equal": true }, { "label": "b", "feature": "

    Dradis", "is_equal": true }, { "label": "c", "feature": "_dradis_session=", "is_equal": true }] }, { "name": "IBM-OpenAdmin_Tool", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"oat oneui\\\"", "is_equal": true }] }, { "name": "DLink-DI-524", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DI-524", "is_equal": true }, { "label": "b", "feature": "DI-524", "is_equal": true }] }, { "name": "SangFor- behavior perception system", "logic": "a&&b", "rule": [{ "label": "a", "feature": "haovuytkjlnvxpuhsecmbljplpvjz = function(str, key) ", "is_equal": true }, { "label": "b", "feature": "X-Frame-Options: SAMEORIGIN", "is_equal": true }] }, { "name": "LANCOM-WIRELESS equipment", "logic": "a&&b", "rule": [{ "label": "a", "feature": "LANCOM ", "is_equal": true }, { "label": "b", "feature": " Wireless", "is_equal": true }] }, { "name": "Barracuda-NG-Firewall", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Barracuda NG Firewall", "is_equal": true }, { "label": "b", "feature": "Barracuda NG Firewall", "is_equal": true }, { "label": "c", "feature": "Server: Barracuda/NGFirewall", "is_equal": true }, { "label": "d", "feature": "Server: Barracuda/NGFirewall", "is_equal": true }] }, { "name": "DLink-DI-504", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DI-504", "is_equal": true }, { "label": "b", "feature": "DI-504", "is_equal": true }] }, { "name": "RAISECOM-ISCOM2648G", "logic": "a", "rule": [{ "label": "a", "feature": "color=\\\"#000000\\\">ISCOM2648G", "is_equal": true }] }, { "name": "RAISECOM-ISCOM2608G", "logic": "a", "rule": [{ "label": "a", "feature": "color=\\\"#000000\\\">ISCOM2608G", "is_equal": true }] }, { "name": "BDES - Grid Environment VOCS Online Monitoring System", "logic": "a", "rule": [{ "label": "a", "feature": "src=/static/ipconfig/ip.js", "is_equal": true }] }, { "name": "Oracle-OPERA", "logic": "a||b", "rule": [{ "label": "a", "feature": "MICROS Systems Inc., OPERA", "is_equal": true }, { "label": "b", "feature": "OperaLogin/Welcome.do", "is_equal": true }] }, { "name": "Tong Soft Network Technology - Smart Campus Information Management Platform", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/Animation/images/teacher_2.png\\\"", "is_equal": true }] }, { "name": "apex-LiveBPM", "logic": "a", "rule": [{ "label": "a", "feature": "href=\\\"/plug-in/login/fixed/css/login.css\\\"", "is_equal": true }] }, { "name": "New Morning Sunshine - Academic Office Management Platform", "logic": "a", "rule": [{ "label": "a", "feature": ">Digital Anywhere Platform", "is_equal": true }] }, { "name": "SANGFOR-M5100", "logic": "a", "rule": [{ "label": "a", "feature": "value=\\\"M5100-Q-4.0", "is_equal": true }] }, { "name": "SANGFOR-P5100", "logic": "a&&b", "rule": [{ "label": "a", "feature": "\u6df1\u4fe1\u670d\u79d1\u6280\u7248\u6743\u6240\u6709", "is_equal": true }, { "label": "b", "feature": "P5100", "is_equal": true }] }, { "name": "DataflexViNE-VoIP-IAD", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: DataflexViNE-Webserver", "is_equal": true }, { "label": "b", "feature": "Server: DataflexViNE-Webserver", "is_equal": true }] }, { "name": "SANGFOR-M5X00", "logic": "a", "rule": [{ "label": "a", "feature": "M5X00-Sinfor--SG", "is_equal": true }] }, { "name": "VICIdial", "logic": "a||b", "rule": [{ "label": "a", "feature": "url=/vicidial/welcome.php", "is_equal": true }, { "label": "b", "feature": "Server: ViciDial", "is_equal": true }] }, { "name": "DataNet", "logic": "a", "rule": [{ "label": "a", "feature": "href='/scada'>DataNet Scada Interface", "is_equal": true }] }, { "name": "SANGFOR-M5000-AC", "logic": "a", "rule": [{ "label": "a", "feature": "value=\\\"M5000-AC", "is_equal": true }] }, { "name": "SANGFOR-M5500", "logic": "a||b", "rule": [{ "label": "a", "feature": "value=\\\"M5500-SC", "is_equal": true }, { "label": "b", "feature": "value=\\\"M5500-Q", "is_equal": true }] }, { "name": "CISCO-M100V", "logic": "a||b", "rule": [{ "label": "a", "feature": "alt=\\\"Cisco M100V\\\"", "is_equal": true }, { "label": "b", "feature": "Cisco Content Security Management Virtual Appliance M100V", "is_equal": true }] }, { "name": "NetApp-Data-ONTAP", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Data ONTAP", "is_equal": true }, { "label": "b", "feature": "Server: Data ONTAP", "is_equal": true }] }, { "name": "DataLife-Engine", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"DataLife Engine", "is_equal": true }, { "label": "b", "feature": "dle_", "is_equal": true }] }, { "name": "Datum-TymServe", "logic": "(a&&b) ||c||d", "rule": [{ "label": "a", "feature": "

    Datum TymServe", "is_equal": true }, { "label": "b", "feature": "Server: couchdb", "is_equal": false }, { "label": "c", "feature": "Server: DATM", "is_equal": true }, { "label": "d", "feature": "Server: DATM", "is_equal": true }] }, { "name": "CISCO-M1070", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "alt=\\\"Cisco M1070\\\"", "is_equal": true }, { "label": "b", "feature": "Cisco Content Security Management Appliance M1070", "is_equal": true }, { "label": "c", "feature": "Cisco IronPort M1070", "is_equal": true }] }, { "name": "CISCO-M660", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "alt=\\\"Cisco M660\\\"", "is_equal": true }, { "label": "b", "feature": "Cisco IronPort M660", "is_equal": true }, { "label": "c", "feature": "Cisco Content Security Management Appliance M660", "is_equal": true }] }, { "name": "CISCO-M680", "logic": "a||b", "rule": [{ "label": "a", "feature": "alt=\\\"Cisco M680\\\"", "is_equal": true }, { "label": "b", "feature": "Cisco Content Security Management Appliance M680", "is_equal": true }] }, { "name": "\u5927\u534e-DHI-NVR2104HS", "logic": "a", "rule": [{ "label": "a", "feature": "NVR2104HS", "is_equal": true }] }, { "name": "ASUS-RT-AC68U", "logic": "a||b||c||d||e||f||g||h||i|| (j&&k)", "rule": [{ "label": "a", "feature": "RT-AC68U", "is_equal": true }, { "label": "b", "feature": "RT-AC68U", "is_equal": true }, { "label": "c", "feature": "var product_name='RT-AC68U'", "is_equal": true }, { "label": "d", "feature": "Capture(status_router.sys_model)

    Asus RT-AC68U", "is_equal": true }, { "label": "e", "feature": "Capture(status_router.sys_model) Asus RT-AC68U ", "is_equal": true }, { "label": "f", "feature": "
    RT-AC68U", "is_equal": true }, { "label": "g", "feature": "class=\\\"prod_madelName\\\">JRS Eco 100 on Asus RT-AC68U
    ", "is_equal": true }, { "label": "h", "feature": "class=\\\"prod_madelName\\\" style=\\\"margin-left:78px;\\\">RT-AC68U", "is_equal": true }, { "label": "i", "feature": "Asus RT-AC68U", "is_equal": true }, { "label": "j", "feature": "var mmc = {", "is_equal": true }, { "label": "k", "feature": "Asus RT-AC68U", "is_equal": true }] }, { "name": "Cisco-CSCSSM", "logic": "a||b", "rule": [{ "label": "a", "feature": "Proxy-Agent: CSCSSM", "is_equal": true }, { "label": "b", "feature": "Proxy-Agent: CSCSSM", "is_equal": true }] }, { "name": "\u5927\u534e-DH-NVR4216", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "DH-NVR4216", "is_equal": true }, { "label": "b", "feature": "CommonName: dhi-nvr4216", "is_equal": true }, { "label": "c", "feature": "dhi-nvr4216", "is_equal": true }] }, { "name": "\u5927\u534e-DHI-NVR4208", "logic": "a", "rule": [{ "label": "a", "feature": "NVR4208", "is_equal": true }] }, { "name": "\u5927\u534e-DHI-NVR4232", "logic": "a", "rule": [{ "label": "a", "feature": "NVR4232", "is_equal": true }] }, { "name": "dahua-DHI-HCVR5116HS", "logic": "a", "rule": [{ "label": "a", "feature": "HCVR5116HS", "is_equal": true }] }, { "name": "teradici-PCoIP-Zero-Client", "logic": "a&&b", "rule": [{ "label": "a", "feature": "PCoIP® Zero Client", "is_equal": true }, { "label": "b", "feature": "password_value", "is_equal": true }] }, { "name": "Honeywell-IP-AK2", "logic": "a", "rule": [{ "label": "a", "feature": "class=\\\"ak2word\\\">IP-AK2", "is_equal": true }] }, { "name": "uniview-NVR208-16", "logic": "a", "rule": [{ "label": "a", "feature": "NVR208-16 login:", "is_equal": true }] }, { "name": "TRENDnet-TV-IP851WIC", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "src=\\\"descript.gif?cidx=TV-IP851WIC1.022014-03-31\\\"", "is_equal": true }, { "label": "b", "feature": "TV-IP851WIC", "is_equal": true }, { "label": "c", "feature": "realm=\\\"TV-IP851WIC", "is_equal": true }] }, { "name": "ContentXXL", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"contentXXL", "is_equal": true }] }, { "name": "Solvonet-Device(VoIP)", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"SOLVONET\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"SOLVONET\\\"", "is_equal": true }] }, { "name": "Eaton-ConnectUPSX", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "Server: UPS_Server/", "is_equal": true }, { "label": "b", "feature": "Server: UPS_Server/", "is_equal": true }, { "label": "c", "feature": "UPS Firmware version", "is_equal": true }, { "label": "d", "feature": "ConnectUPS Web/SNMP Card", "is_equal": true }, { "label": "e", "feature": "Powerware ConnectUPS", "is_equal": true }] }, { "name": "ConfTool", "logic": "a||b", "rule": [{ "label": "a", "feature": "

    ConfTool Conference Administration", "is_equal": true }, { "label": "b", "feature": "Conference Management Software", "is_equal": true }] }, { "name": "Synaptics-EmWeb", "logic": "(a&&b&&c) || (d&&e&&f)", "rule": [{ "label": "a", "feature": "Server: Virata-EmWeb", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "drupal", "is_equal": false }, { "label": "d", "feature": "Server: Virata-EmWeb", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "drupal", "is_equal": false }] }, { "name": "CommonSpot", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"CommonSpot", "is_equal": true }] }, { "name": "CrushFTP", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: CrushFTP HTTP Server", "is_equal": true }, { "label": "b", "feature": "Server: CrushFTP HTTP Server", "is_equal": true }, { "label": "c", "feature": "CrushFTP WebInterface", "is_equal": true }] }, { "name": "Covalent-Enterprise-Ready-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "CovalentSNMP", "is_equal": true }, { "label": "b", "feature": "CovalentSNMP", "is_equal": true }] }, { "name": "CougarConference- Video Conference", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Cougar", "is_equal": true }, { "label": "b", "feature": "Server: Cougar", "is_equal": true }] }, { "name": "TRENDnet-TV-IP751WIC", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "TV-IP751WIC", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TV-IP751WIC", "is_equal": true }, { "label": "c", "feature": "

    TV-IP751WIC", "is_equal": true }, { "label": "d", "feature": "src=\\\"descript.gif?cidx=TV-IP751WIC1.022014-03-31", "is_equal": true }] }, { "name": "TornadoServer", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: TornadoServer", "is_equal": true }, { "label": "b", "feature": "Server: TornadoServer", "is_equal": true }] }, { "name": "TP-LINK-VPN", "logic": "(a&&b) || (c&&d&&e)", "rule": [{ "label": "a", "feature": "TP-LINK", "is_equal": true }, { "label": "b", "feature": "VPN", "is_equal": true }, { "label": "c", "feature": "TP-LINK", "is_equal": true }, { "label": "d", "feature": "VPN", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }] }, { "name": "Proxicast-Enterprise-3G/4G-Router", "logic": "a||b", "rule": [{ "label": "a", "feature": "Proxicast LAN-Cell", "is_equal": true }, { "label": "b", "feature": "WAN-Proxicast LAN-Cell", "is_equal": true }] }, { "name": "TRENDnet-TV-IP551WI", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "TV-IP551WI", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TV-IP551WI", "is_equal": true }, { "label": "c", "feature": "(TV-IP551WI)", "is_equal": true }] }, { "name": "TRENDnet-TV-IP551W", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "TV-IP551W", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TV-IP551W", "is_equal": true }, { "label": "c", "feature": "(TV-IP551W)", "is_equal": true }] }, { "name": "BrewBlogger", "logic": "a", "rule": [{ "label": "a", "feature": "developed by ", "is_equal": true }, { "label": "c", "feature": "

    Actiontec MI424WR", "is_equal": true }] }, { "name": "jabberd", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: jabberd", "is_equal": true }, { "label": "b", "feature": "Server: jabberd", "is_equal": true }] }, { "name": "ShareTech-NU-860H", "logic": "a&&b", "rule": [{ "label": "a", "feature": "NU-860H", "is_equal": true }, { "label": "b", "feature": "ShareTech Information Co., LTD", "is_equal": true }] }, { "name": "FutureSystems-WeGuardia-SSLplus", "logic": "a&&b", "rule": [{ "label": "a", "feature": "id=\\\"TSGSSL\\\"", "is_equal": true }, { "label": "b", "feature": "sslplus", "is_equal": true }] }, { "name": "HUAWEI-USG6306", "logic": "a||b", "rule": [{ "label": "a", "feature": "Huawei USG6306", "is_equal": true }, { "label": "b", "feature": "Huawei USG6306", "is_equal": true }] }, { "name": "LINKSYS-E900", "logic": "a||b||c||d||e|| (f&&g)", "rule": [{ "label": "a", "feature": "Linksys E900", "is_equal": true }, { "label": "b", "feature": "LinksysE900", "is_equal": true }, { "label": "c", "feature": "Linksys_E900", "is_equal": true }, { "label": "d", "feature": "Linksys E900", "is_equal": true }, { "label": "e", "feature": "Linksys E900", "is_equal": true }, { "label": "f", "feature": "var mmc = {", "is_equal": true }, { "label": "g", "feature": "Linksys E900", "is_equal": true }] }, { "name": "LINKSYS-BEFSR41", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Linksys BEFSR41", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Linksys BEFSR41", "is_equal": true }] }, { "name": "HUAWEI-USG6350", "logic": "a||b", "rule": [{ "label": "a", "feature": "Huawei USG6350", "is_equal": true }, { "label": "b", "feature": "Huawei USG6350", "is_equal": true }] }, { "name": "NETGEAR-WNR1000v3", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR WNR1000v3", "is_equal": true }, { "label": "b", "feature": "NETGEAR Router WNR1000v3", "is_equal": true }, { "label": "c", "feature": "realm=\\\"NETGEAR WNR1000v3", "is_equal": true }] }, { "name": "NETGEAR-WNHD3004v2", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NetGear WNHD3004v2", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NetGear WNHD3004v2", "is_equal": true }] }, { "name": "Conversant-SwiftCDN", "logic": "a", "rule": [{ "label": "a", "feature": "SwiftCDN", "is_equal": true }] }, { "name": "Ruijie-RGOS", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: RGOS HTTP-Server", "is_equal": true }, { "label": "b", "feature": "Server: RGOS HTTP-Server", "is_equal": true }] }, { "name": "NETGEAR-WGR614v9", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR WGR614v9", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR WGR614v9", "is_equal": true }] }, { "name": "Mocana companies products", "logic": "a", "rule": [{ "label": "a", "feature": "-Mocana SSH", "is_equal": true }] }, { "name": "NETGEAR-JNR3210", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR JNR3210", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR JNR3210", "is_equal": true }] }, { "name": "NETGEAR-JNR1010v2", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR JNR1010v2", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR JNR1010v2", "is_equal": true }] }, { "name": "UniView-multimedia platform", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "Zhejiang Uniview Technologies Co.", "is_equal": true }, { "label": "c", "feature": "Uniview MultiMedia Plat", "is_equal": true }] }, { "name": "NETGEAR-EVG1500", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Netgear EVG1500", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Netgear EVG1500", "is_equal": true }] }, { "name": "CISCO-ASA-5520", "logic": "a&& (b||c)", "rule": [{ "label": "a", "feature": "ASA5520", "is_equal": true }, { "label": "b", "feature": "SSL VPN Service", "is_equal": true }, { "label": "c", "feature": "Cisco ASDM 7.6(1)", "is_equal": true }] }, { "name": "NETGEAR-DG834PN", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR DG834PN", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR DG834PN", "is_equal": true }] }, { "name": "NETGEAR-D6220", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR D6220", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NETGEAR D6220", "is_equal": true }] }, { "name": "Intel-IXDP425", "logic": "a&&b", "rule": [{ "label": "a", "feature": "IXDP425 Demo", "is_equal": true }, { "label": "b", "feature": "Intel(R)", "is_equal": true }] }, { "name": "NETGEAR-D6400", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR D6400", "is_equal": true }, { "label": "b", "feature": "content=\\\"D6400\\\"", "is_equal": true }, { "label": "c", "feature": "Organization: NETGEAR", "is_equal": true }] }, { "name": "NETGEAR-R6900", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"NETGEAR R6900", "is_equal": true }, { "label": "b", "feature": "NETGEAR Router R6900", "is_equal": true }] }, { "name": "Memotec-CX-U1280", "logic": "a", "rule": [{ "label": "a", "feature": "CX-U1280 RAN Gateway", "is_equal": true }] }, { "name": "netentsec Technology - Network Acceleration Equipment", "logic": "a", "rule": [{ "label": "a", "feature": "\u7f51\u5eb7\u5e7f\u57df\u7f51\u52a0\u901f\u7f51\u5173", "is_equal": true }] }, { "name": "Cisco-Broadband-Access-Center", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Cisco_CCSP_CWMP_TCPCR", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Cisco_CCSP_CWMP_TCPCR", "is_equal": true }] }, { "name": "AirLink-WL-2600CAM", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"WL-2600CAM", "is_equal": true }, { "label": "b", "feature": "realm=\\\"WL-2600CAM", "is_equal": true }] }, { "name": "3D people integrated data doors", "logic": "a||b", "rule": [{ "label": "a", "feature": "\u6b22\u8fce\u4f7f\u7528\u4e09\u7ef4\u4eba\u50cf\u7efc\u5408\u6570\u636e\u95e8!", "is_equal": true }, { "label": "b", "feature": "", "is_equal": true }] }, { "name": "Tongyang Technology - Environmental Monitoring System", "logic": "a", "rule": [{ "label": "a", "feature": "/Content/tongyang-login.css", "is_equal": true }] }, { "name": "ZXTD-management system", "logic": "a", "rule": [{ "label": "a", "feature": "action=\\\"whichLogin.jsp\\\"", "is_equal": true }] }, { "name": "Wisedu- Smart Campus Platform", "logic": "a&&b", "rule": [{ "label": "a", "feature": "portal/js/plugins/changeSkin.js", "is_equal": true }, { "label": "b", "feature": "\u524d\u7aef\u914d\u7f6e\u6587\u4ef6", "is_equal": true }] }, { "name": "legendsec - data automatic import system", "logic": "a", "rule": [{ "label": "a", "feature": "document.myform.btn_login.disabled = true;", "is_equal": true }] }, { "name": "HikVision - Video Cloud", "logic": "a||b|| (c&&d&&e)", "rule": [{ "label": "a", "feature": "Server: FACE-Webs", "is_equal": true }, { "label": "b", "feature": "Server: FACE-Webs", "is_equal": true }, { "label": "c", "feature": "placeholder=\\\"{{oLan.password}}", "is_equal": true }, { "label": "d", "feature": "oCheckUser.szPassWd", "is_equal": true }, { "label": "e", "feature": "/ui/css/style.css", "is_equal": false }] }, { "name": "CCTV-Cameras", "logic": "a&&b&&c&&d", "rule": [{ "label": "a", "feature": "style=\\\"font-size:24px;float:left;\\\">Network video client", "is_equal": true }, { "label": "b", "feature": "Partizan Web Surveillance", "is_equal": false }, { "label": "c", "feature": "thttpd/", "is_equal": true }, { "label": "d", "feature": "esee", "is_equal": false }] }, { "name": "Synchronet-BBS", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "Server: Synchronet BBS ", "is_equal": true }, { "label": "b", "feature": "Server: Synchronet BBS ", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }] }, { "name": "Spiceworks-product", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "", "is_equal": true }, { "label": "b", "feature": "\\\"Spiceworks\\\"
    \\\"Simbix
    ", "is_equal": true }, { "label": "e", "feature": "Server: couchdb", "is_equal": false }, { "label": "f", "feature": "X-Powered-By: Simbix Framework", "is_equal": true }] }, { "name": "Hirschmann-Security-Device", "logic": "a", "rule": [{ "label": "a", "feature": "Hirschmann EAGLE Security Device", "is_equal": true }] }, { "name": "Hirschmann-MACH", "logic": "a||b", "rule": [{ "label": "a", "feature": "Hirschmann MACH", "is_equal": true }, { "label": "b", "feature": "Hirschmann MACH100", "is_equal": true }] }, { "name": "SilverStripe", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "framework/javascript/HtmlEditorField.js", "is_equal": true }, { "label": "b", "feature": "content=\\\"SilverStripe", "is_equal": true }, { "label": "c", "feature": "Set-Cookie: PastVisitor", "is_equal": true }, { "label": "d", "feature": "Set-Cookie: PastVisitor", "is_equal": true }] }, { "name": "siteGENIUS", "logic": "a", "rule": [{ "label": "a", "feature": "var portalbrowser = window.open('popup.php?page_type='+page_type+'&lang=", "is_equal": true }] }, { "name": "SitePlayer", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Server: SitePlayer Telnet", "is_equal": true }, { "label": "b", "feature": "Server: SitePlayer Telnet", "is_equal": true }, { "label": "c", "feature": "realm=\\\"SitePlayer Telnet Configuration", "is_equal": true }, { "label": "d", "feature": "realm=\\\"SitePlayer Telnet Configuration", "is_equal": true }] }, { "name": "Sitecom-NAS", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"SITECOM LOGIN Enter Password (default is sitecom)", "is_equal": true }, { "label": "b", "feature": "realm=\\\"SITECOM LOGIN Enter Password (default is sitecom)", "is_equal": true }] }, { "name": "HuaWei-IAD", "logic": "a", "rule": [{ "label": "a", "feature": "Huawei TERMINAL Multi-service", "is_equal": true }] }, { "name": "HuaWei-VCT", "logic": "((a||b|| (c&&d) ||e) &&f) ||g", "rule": [{ "label": "a", "feature": "vct inner web", "is_equal": true }, { "label": "b", "feature": "src=\\\"system/ressrv/zh-CN.js", "is_equal": true }, { "label": "c", "feature": "Huawei Inner Web", "is_equal": true }, { "label": "d", "feature": "Loading SIMSWeb, please wait.....

    ", "is_equal": true }] }, { "name": "SonicWALL-SSL-VPN", "logic": "(a&&b&&c) || (d&&e&&f&&g) ||h||i||j", "rule": [{ "label": "a", "feature": "Server: SonicWALL SSL-VPN", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "drupal", "is_equal": false }, { "label": "d", "feature": "SonicWALL SSL-VPN ", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "drupal", "is_equal": false }, { "label": "g", "feature": "ReeCam IP Camera", "is_equal": false }, { "label": "h", "feature": "javascript/aventail.js", "is_equal": true }, { "label": "i", "feature": "SonicWall SSL VPN", "is_equal": true }, { "label": "j", "feature": "SonicWall - SSL VPN", "is_equal": true }] }, { "name": "SONY-Projector", "logic": "a||b|| ((c||d) &&e)", "rule": [{ "label": "a", "feature": "realm=\\\"Projector", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Projector", "is_equal": true }, { "label": "c", "feature": "", "is_equal": true }, { "label": "d", "feature": "", "is_equal": true }, { "label": "e", "feature": "server: couchdb", "is_equal": false }] }, { "name": "SONY-Video-Network-Station", "logic": "((a||b) &&c)", "rule": [{ "label": "a", "feature": "SONY SNT-V304 Video Network Station", "is_equal": true }, { "label": "b", "feature": "SONY Video Network Station", "is_equal": true }, { "label": "c", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "SourceBans", "logic": "a ||b", "rule": [{ "label": "a", "feature": "
    Version(", "is_equal": true }, { "label": "b", "feature": "http://www.sourcebans.net\\\" target=\\\"_blank\\\">snom AG
    ", "is_equal": true }, { "label": "b", "feature": "
    troy serial server
    邮局管理员可自行分配邮箱!管理apusic应用服务器\u90ae\u5c40\u7ba1\u7406\u5458\u53ef\u81ea\u884c\u5206\u914d\u90ae\u7bb1\uff01
    \u8003\u6838\u8bc4\u6d4b\u7cfb\u7edf", "is_equal": true }] }, { "name": "Delivery application", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "\u4ea4\u4ed8\u5e94\u7528", "is_equal": true }, { "label": "b", "feature": "src=\\\"http://res.wx.qq.com/open/js/jweixin", "is_equal": true }] }, { "name": "CodePush-server", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"CodePush service is hotupdate services", "is_equal": true }] }, { "name": "Marine shipping system", "logic": "a", "rule": [{ "label": "a", "feature": "\u6d77\u4e8b\u9009\u8239\u7cfb\u7edf", "is_equal": true }] }, { "name": "phpSysInfo", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "var stargeturl = \\\"index.php?disp=dynamic", "is_equal": true }, { "label": "b", "feature": "content=\\\"phpSysInfo", "is_equal": true }, { "label": "c", "feature": "phpSysInfo - ", "is_equal": true }, { "label": "d", "feature": "href=\\\"http://phpsysinfo.sourceforge.net/\\\">phpSysInfo", "is_equal": true }, { "label": "e", "feature": "/templates/phpsysinfo.css", "is_equal": true }] }, { "name": "phpLDAPadmin", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "phpLDAPadmin - ", "is_equal": true }, { "label": "b", "feature": "href=\\\"http://phpldapadmin.sourceforge.net/Documentation\\\" onclick", "is_equal": true }, { "label": "c", "feature": "src=\\\"images/default/logo.png\\\" title=\\\"phpLDAPadmin logo", "is_equal": true }] }, { "name": "PHP-Link-Directory", "logic": "a||b", "rule": [{ "label": "a", "feature": "powered by phpLinkDirectory", "is_equal": true }, { "label": "b", "feature": "content=\\\"PHP Link Directory", "is_equal": true }] }, { "name": "phpMumbleAdmin", "logic": "a||b", "rule": [{ "label": "a", "feature": "phpmumbleadmin_session=", "is_equal": true }, { "label": "b", "feature": "phpmumbleadmin_session=", "is_equal": true }] }, { "name": "phpMoneyBooks", "logic": "a", "rule": [{ "label": "a", "feature": "href='http://phpMoneyBooks.com'>phpMoneyBooks", "is_equal": true }] }, { "name": "PHP_LIVE- Product", "logic": "a||b", "rule": [{ "label": "a", "feature": "Knowledge BASE (FAQ)", "is_equal": true }, { "label": "b", "feature": "Powered by phpRemoteView", "is_equal": true }] }, { "name": "PHP-Support-Tickets", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "title=\\\"php support tickets\\\">PHP Support Tickets", "is_equal": true }, { "label": "b", "feature": "PHP Support Tickets", "is_equal": true }, { "label": "c", "feature": "content=\\\"Triangle Solutions Ltd", "is_equal": true }] }, { "name": "Jin Sanli - Video Monitoring", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "cn=santachi", "is_equal": true }, { "label": "b", "feature": "VISIBILITY: inherit; WIDTH: 200px; Z-INDEX: 2\\\">", "is_equal": true }, { "label": "c", "feature": "//\u5207\u6362iFrame \u51fd\u65700-\u89c6\u9891\u3001\u5f55\u50cf\uff1b1-\u53c2\u6570\u3001\u65e5\u5fd7", "is_equal": true }] }, { "name": "New Jingxiang - Media Activity Management Platform", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "swiper/swiper.min.css", "is_equal": true }, { "label": "b", "feature": "src=\\\"/kaptcha\\\" id=\\\"kaptcha\\\"", "is_equal": true }] }, { "name": "Crocus", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "for=\\\"inp_verification\\\"", "is_equal": true }, { "label": "b", "feature": "src=\\\"Images/logo.png\\\"", "is_equal": false }] }, { "name": "Enterprise login management system", "logic": "(a&&b&&c)", "rule": [{ "label": "a", "feature": "Themes/Scripts/FunctionJS.js", "is_equal": true }, { "label": "b", "feature": "txtUserName\\\").focus(); //\u9ed8\u8ba4\u7126\u70b9", "is_equal": true }, { "label": "c", "feature": "id=\\\"cp\\\"", "is_equal": true }] }, { "name": "phpMyBible", "logic": "a", "rule": [{ "label": "a", "feature": "
    ", "is_equal": true }] }, { "name": "phpMyRealty", "logic": "a||b", "rule": [{ "label": "a", "feature": "", "is_equal": true }, { "label": "b", "feature": "Powered by secondary_nodes", "is_equal": true }] }, { "name": "ULTIMUS-BPM", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "content=\\\"Ultimus BPM", "is_equal": true }, { "label": "b", "feature": "class=\\\"toptitle\\\">BPM", "is_equal": true }] }, { "name": "TP-LINK-Archer-D20", "logic": "a||b", "rule": [{ "label": "a", "feature": "0.8.0 1.1 v0049.0 Build 150728 Rel.33681n", "is_equal": true }, { "label": "b", "feature": "1.2.0 0.8.0 v0049.0 Build 160216 Rel.60153n", "is_equal": true }] }, { "name": "D-Link-DSL-6850U", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DSL-6850U", "is_equal": true }, { "label": "b", "feature": "DSL-6850U", "is_equal": true }] }, { "name": "HUAWEI-NE5000E", "logic": "a", "rule": [{ "label": "a", "feature": "HUAWEI NE5000E", "is_equal": true }] }, { "name": "\u4e00\u6240-\u7f51\u9632G01\u65b0\u7248\u672c", "logic": "(a&&b) || (c&&d) || (e&&f)", "rule": [{ "label": "a", "feature": "security_session_verify", "is_equal": true }, { "label": "b", "feature": "yunsuo_session_verify", "is_equal": false }, { "label": "c", "feature": "href=\\\"http://bbs.yunsuo.com.cn", "is_equal": false }, { "label": "d", "feature": "BPM", "is_equal": true }, { "label": "b", "feature": "class=\\\"logo-element\\\">AGILE-BPM", "is_equal": true }] }, { "name": "Interactive virtual ship display system", "logic": "a", "rule": [{ "label": "a", "feature": "\u4ea4\u4e92\u5f0f\u865a\u62df\u8239\u8236\u5c55\u793a\u7cfb\u7edf", "is_equal": true }] }, { "name": "Baoli-Bio-Lims", "logic": "a&&b", "rule": [{ "label": "a", "feature": "/lims/js/login.js", "is_equal": true }, { "label": "b", "feature": "/lims/dist/css/font-awesome.min.css", "is_equal": true }] }, { "name": "Zhongke Henglun - Identification Self-Service System", "logic": "a", "rule": [{ "label": "a", "feature": "iAUS/media/js/login/login.js", "is_equal": true }] }, { "name": "H3C-SSL-VPN", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "Keep me signed in", "is_equal": true }, { "label": "b", "feature": "Welcome to SSL VPN", "is_equal": true }, { "label": "c", "feature": "H3C SSL VPN", "is_equal": true }] }, { "name": "Alibaba-Ali Monitoring System", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "\u963f\u91cc\u96c6\u56e2\u76d1\u63a7\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "/monitor/css/monitor.css", "is_equal": true }, { "label": "c", "feature": "href=\\\"/monitor/monitoritem/monitorItemList.htm", "is_equal": true }] }, { "name": "DLink-DSL-Gateway", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DSL Gateway", "is_equal": true }, { "label": "b", "feature": "realm=\\\"DSL Gateway", "is_equal": true }] }, { "name": "D_Link-DSL-2640T", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"DSL-2640T", "is_equal": true }, { "label": "b", "feature": "DSL-2640T", "is_equal": true }] }, { "name": "Smart City Construction Project Management System", "logic": "a", "rule": [{ "label": "a", "feature": "id=\\\"sitenametitle\\\">\u667a\u6167\u57ce\u5efa\u9879\u76ee\u7ba1\u7406\u7cfb\u7edf\u6b22\u8fce\u4f7f\u7528E-Cash\u7cfb\u7edf", "is_equal": true }] }, { "name": "Intelligent Warehouse Management System", "logic": "(a&&b&&c)", "rule": [{ "label": "a", "feature": "name=\\\"ToolkitScriptManager1_HiddenField\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"headerNav\\\"", "is_equal": true }, { "label": "c", "feature": "event.srcElement.type!='reset", "is_equal": true }] }, { "name": "Hongye Technology - Supply Chain System", "logic": "a", "rule": [{ "label": "a", "feature": "src=\\\"/images/hyscm.jpg", "is_equal": true }] }, { "name": "Sub-energy-energy storage and monitoring platform", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "\u6749\u6749\u50a8\u80fd\u76d1\u63a7\u5e73\u53f0", "is_equal": true }, { "label": "b", "feature": "AMap.MouseTool,AMap.DistrictSearch", "is_equal": true }, { "label": "c", "feature": "/dist/libs/layui/css/layui.css", "is_equal": true }] }, { "name": "Haig Logistics-4PL Management System", "logic": "a", "rule": [{ "label": "a", "feature": "document.cookie=\\\"4pl07username=\\\"+ArrayStr", "is_equal": true }] }, { "name": "phpCollab", "logic": "a||b", "rule": [{ "label": "a", "feature": "", "is_equal": true }, { "label": "b", "feature": "MailEnable - Webmail", "is_equal": true }, { "label": "c", "feature": "class=\\\"loginPanel_botLeft_div", "is_equal": true }, { "label": "d", "feature": "smtp", "is_equal": true }, { "label": "e", "feature": "MailEnable", "is_equal": true }, { "label": "f", "feature": "MailEnable POP3 Server", "is_equal": true }] }, { "name": "Mailman", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Delivered by Mailman", "is_equal": true }, { "label": "b", "feature": "/images/mailman", "is_equal": true }, { "label": "c", "feature": "href=\\\"http://www.gnu.org/software/mailman/index.html", "is_equal": true }, { "label": "d", "feature": "MailMan", "is_equal": true }] }, { "name": "mailsite-Express", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "MailSite Express", "is_equal": true }, { "label": "b", "feature": "MailSite Express", "is_equal": true }, { "label": "c", "feature": "onsubmit=\\\"OpenExpress(document.ExpressLogin)", "is_equal": true }, { "label": "d", "feature": "Rockliffe systems, Inc.", "is_equal": true }, { "label": "e", "feature": "MailSite POP3 Server", "is_equal": true }, { "label": "f", "feature": "MailSite ESMTP Receiver", "is_equal": true }] }, { "name": "Sierra-Uplink- Products", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "UP-LINK", "is_equal": true }, { "label": "b", "feature": "UP-LINK Systems, Inc.", "is_equal": true }] }, { "name": "FiberHome-\u516c\u53f8\u4ea7\u54c1", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "FIBERHOME", "is_equal": true }, { "label": "b", "feature": "FIBERHOME Systems, Inc.", "is_equal": true }, { "label": "c", "feature": "scos_fx@fiberhome.com ", "is_equal": true }] }, { "name": "SmartLink-Company Products", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Smartlink", "is_equal": true }, { "label": "b", "feature": "Smartlink Network Systems LTD.", "is_equal": true }] }, { "name": "HUAWEI-CE6850-48S4Q-EI", "logic": "a", "rule": [{ "label": "a", "feature": "CE6850-48S4Q-EI", "is_equal": true }] }, { "name": "H3C-CR19000", "logic": "a", "rule": [{ "label": "a", "feature": "H3C CR19000", "is_equal": true }] }, { "name": "CNWAY-ILIMS", "logic": "a&&b", "rule": [{ "label": "a", "feature": "src=\\\"/extjs/adapter/ext/ext-base-js", "is_equal": true }, { "label": "b", "feature": "/js/AllPageFunction.js", "is_equal": true }] }, { "name": "Wavlink-WiFi-Repeater", "logic": "a", "rule": [{ "label": "a", "feature": "WiFi Repeater Web Server", "is_equal": true }] }, { "name": "Juniper-DX", "logic": "a||b|| (c&&d)", "rule": [{ "label": "a", "feature": "Juniper DX", "is_equal": true }, { "label": "b", "feature": "\\\"\\\"", "is_equal": true }, { "label": "c", "feature": "content=\\\"AdiMoney.Com Mobile Advertisement Network. ", "is_equal": true }] }, { "name": "Siemens-SCALANCE-X", "logic": "a||b", "rule": [{ "label": "a", "feature": "SCALANCE X Management", "is_equal": true }, { "label": "b", "feature": "href=\\\"/doc/XSpecial.css\\\"", "is_equal": true }] }, { "name": "Annea-reimbursement system", "logic": "a|| (b&& (c||d))", "rule": [{ "label": "a", "feature": "
    Mibew Messenger", "is_equal": true }] }, { "name": "Mac-OSX-Server", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Mac OS X Server", "is_equal": true }, { "label": "b", "feature": "page_footer_appversion\\\">Mac OS X Server", "is_equal": true }, { "label": "c", "feature": "realm=\\\"Mac OS X Server", "is_equal": true }, { "label": "d", "feature": "realm=\\\"Mac OS X Server", "is_equal": true }] }, { "name": "Ubiquiti-UNMS", "logic": "a&&b", "rule": [{ "label": "a", "feature": "content=\\\"UNMS\\\"", "is_equal": true }, { "label": "b", "feature": "unms", "is_equal": true }] }, { "name": "Technicolor-TG582n", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "var headertext = 'Technicolor TG582n'", "is_equal": true }, { "label": "b", "feature": "var headertext = 'Technicolor TG582n'", "is_equal": true }, { "label": "c", "feature": "Technicolor TG582n", "is_equal": true }] }, { "name": "Mason", "logic": "a||b", "rule": [{ "label": "a", "feature": "X-Powered-By: HTML::Mason", "is_equal": true }, { "label": "b", "feature": "X-Powered-By: HTML::Mason", "is_equal": true }] }, { "name": "Mathopd", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Mathopd", "is_equal": true }, { "label": "b", "feature": "Server: Mathopd", "is_equal": true }] }, { "name": "McAfee-ePolicy-Orchestrator", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: Undefined", "is_equal": true }, { "label": "b", "feature": "Server: Undefined", "is_equal": true }, { "label": "c", "feature": "ePolicy Orchestrator", "is_equal": true }] }, { "name": "McAfee-Secure", "logic": "a", "rule": [{ "label": "a", "feature": "www.mcafeesecure.com/RatingVerify?ref=", "is_equal": true }] }, { "name": "MeetingPlaza", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "MeetingPlaza HTTP Tunneling", "is_equal": true }, { "label": "b", "feature": "InterSpace HTTP Tunneling", "is_equal": true }, { "label": "c", "feature": "InterSpace HTTP Tunneling", "is_equal": true }] }, { "name": "meitrack-products", "logic": "a||b", "rule": [{ "label": "a", "feature": "action=\\\"trackerlogin.aspx", "is_equal": true }, { "label": "b", "feature": "_TrackerMain_GTVTSeries", "is_equal": true }] }, { "name": "E-FAX", "logic": "a||b", "rule": [{ "label": "a", "feature": "- E-Fax - Login", "is_equal": true }, { "label": "b", "feature": "content=\\\"E-FAX ", "is_equal": true }] }, { "name": "AvantFAX-ICTFax", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "- ICTFax - Login", "is_equal": true }, { "label": "b", "feature": "\\\"ICTFax",\u6b22\u8fce\u4f7f\u7528VPN\u5b89\u5168\u7f51\u5173

    ", "is_equal": true }, { "label": "d", "feature": "\u5317\u4eac\u7f51\u5fa1\u661f\u4e91", "is_equal": true }] }, { "name": "H3C-SecPath-F1000-A-EI", "logic": "a", "rule": [{ "label": "a", "feature": "H3C Firewall SecPath F1000-A-EI", "is_equal": true }] }, { "name": "H3C-SecPath-U200-M", "logic": "a||b", "rule": [{ "label": "a", "feature": "H3C Firewall SecPath U200-M", "is_equal": true }, { "label": "b", "feature": "H3C Series Firewall SecPath U200-M", "is_equal": true }] }, { "name": "CWP- Virtual Host Control Panel", "logic": "a||b", "rule": [{ "label": "a", "feature": "href=\\\"/login/cwp_theme/original/img/ico/favicon.ico\\\"", "is_equal": true }, { "label": "b", "feature": "src=\\\"/login/cwp_theme/original/img/new_logo_small.png\\\"", "is_equal": true }] }, { "name": "intelbras-RF-301K", "logic": "a", "rule": [{ "label": "a", "feature": "RF 301K", "is_equal": true }] }, { "name": "Motorola-SBG6782-AC", "logic": "a", "rule": [{ "label": "a", "feature": "id=\\\"thisModelNumberIs\\\">SBG6782-AC", "is_equal": true }] }, { "name": "H3C-B5", "logic": "a||b", "rule": [{ "label": "a", "feature": "var product_type = \\\"B5\\\"", "is_equal": true }, { "label": "b", "feature": "B5 \u8bbe\u5907\u767b\u5f55", "is_equal": true }] }, { "name": "H3C-B365", "logic": "a||b", "rule": [{ "label": "a", "feature": "var product_type = \\\"B365\\\"", "is_equal": true }, { "label": "b", "feature": "B365 \u8def\u7531\u5668\u767b\u5f55", "is_equal": true }] }, { "name": "A10-ACOS network operating system", "logic": "(a&&b) || (c&&d)", "rule": [{ "label": "a", "feature": "Server: A10WS", "is_equal": true }, { "label": "b", "feature": "boa", "is_equal": false }, { "label": "c", "feature": "Server: A10WS", "is_equal": true }, { "label": "d", "feature": "boa", "is_equal": false }] }, { "name": "LineRunner-SHDSL-Router", "logic": "a", "rule": [{ "label": "a", "feature": "DEVICE: LineRunner SHDSL Router; ", "is_equal": true }] }, { "name": "Abilis-CPX", "logic": "a", "rule": [{ "label": "a", "feature": "Abilis CPX - ", "is_equal": true }] }, { "name": "Abus-corporate product", "logic": "a", "rule": [{ "label": "a", "feature": "ABUS company products", "is_equal": true }] }, { "name": "Accton-24port-Switch", "logic": "a", "rule": [{ "label": "a", "feature": "Accton 24 port Cheetah Switch", "is_equal": true }] }, { "name": "Acano-Server", "logic": "a", "rule": [{ "label": "a", "feature": "Acano Server", "is_equal": true }] }, { "name": "Sunnada-centralized wireless controller", "logic": "a||b", "rule": [{ "label": "a", "feature": "AC-Sunnada-Access ", "is_equal": true }, { "label": "b", "feature": "\u4e09\u5143\u8fbe\u901a\u8baf - \u96c6\u4e2d\u65e0\u7ebf\u63a7\u5236\u5668'", "is_equal": true }] }, { "name": "grentech - PowerCN-Access", "logic": "a", "rule": [{ "label": "a", "feature": "AC-Powercn-Access", "is_equal": true }] }, { "name": "HONG.TEC-Access", "logic": "a", "rule": [{ "label": "a", "feature": "AC-HONG.TEC-Access ", "is_equal": true }] }, { "name": "Aruba-Wireless-Controller", "logic": "a", "rule": [{ "label": "a", "feature": "Aruba-Wireless-Controller", "is_equal": true }] }, { "name": "Array-Company Products", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Array Networks WebUI", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Array Networks WebUI", "is_equal": true }] }, { "name": "Motorola-DCT-6412", "logic": "a&&b", "rule": [{ "label": "a", "feature": "VENDOR: Motorola Corporation;", "is_equal": true }, { "label": "b", "feature": "DCT-6412", "is_equal": true }] }, { "name": "Ericsson-LG Company Products", "logic": "a", "rule": [{ "label": "a", "feature": "Ericsson-LG Enterprise Co.,Ltd.", "is_equal": true }] }, { "name": "H3C-MC101", "logic": "a", "rule": [{ "label": "a", "feature": "MC101 \u8def\u7531\u5668\u767b\u5f55", "is_equal": true }] }, { "name": "Ruijie companies", "logic": "((a||b) &&c&&d) || ((e||f||g||h||i||j) &&k&&l) ||m", "rule": [{ "label": "a", "feature": "Server: Ruijie Servrer", "is_equal": true }, { "label": "b", "feature": "Server: RG/Device", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }, { "label": "d", "feature": "drupal", "is_equal": false }, { "label": "e", "feature": "Server: Ruijie Servrer", "is_equal": true }, { "label": "f", "feature": "Server: RG/Device", "is_equal": true }, { "label": "g", "feature": "Ruijie login:", "is_equal": true }, { "label": "h", "feature": "Vendor: Ruijie General Operation System", "is_equal": true }, { "label": "i", "feature": "Vendor: Ruijie", "is_equal": true }, { "label": "j", "feature": "RGOS_SSH", "is_equal": true }, { "label": "k", "feature": "couchdb", "is_equal": false }, { "label": "l", "feature": "drupal", "is_equal": false }, { "label": "m", "feature": "Organization: Ruijie", "is_equal": true }] }, { "name": "ENGENIUS-switch", "logic": "a&&b", "rule": [{ "label": "a", "feature": "conner_basic conner_GDL", "is_equal": true }, { "label": "b", "feature": "egs-logo.png", "is_equal": true }] }, { "name": "Planet-NVR-915", "logic": "a||b", "rule": [{ "label": "a", "feature": "NVR-915 login:", "is_equal": true }, { "label": "b", "feature": "realm=\\\"NVR-915", "is_equal": true }] }, { "name": "ICP_DAS-Ethernet controller", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Server: 7188E", "is_equal": true }, { "label": "b", "feature": "Server: 7188E", "is_equal": true }, { "label": "c", "feature": "7188E3", "is_equal": true }] }, { "name": "OpenSSH", "logic": "a", "rule": [{ "label": "a", "feature": "OpenSSH", "is_equal": true }] }, { "name": "Maipu-RM1800", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"RM1800", "is_equal": true }, { "label": "b", "feature": "RM1800", "is_equal": true }] }, { "name": "ZLAN-corporate product", "logic": "a", "rule": [{ "label": "a", "feature": "href=\\\"http://www.zlmcu.com\\\">ZLAN", "is_equal": true }] }, { "name": "Konk Hotel-C2000-Turbo", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "C2000 TURBO", "is_equal": true }, { "label": "b", "feature": "name=\\\"sublog", "is_equal": true }, { "label": "c", "feature": "name=\\\"version", "is_equal": true }] }, { "name": "Cisco-Wireless-LAN-Controller", "logic": "(((a&&b&&c) ||d) &&e) ||f", "rule": [{ "label": "a", "feature": "action=\\\"/main_login.html", "is_equal": true }, { "label": "b", "feature": "Cisco Systems", "is_equal": true }, { "label": "c", "feature": "onclick=\\\"loginAction()", "is_equal": true }, { "label": "d", "feature": "Cisco Systems Login", "is_equal": true }, { "label": "e", "feature": "Server: couchdb", "is_equal": false }, { "label": "f", "feature": "CISCO_WLC", "is_equal": true }] }, { "name": "LifeType", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"lifetype", "is_equal": true }, { "label": "b", "feature": "title=\\\"Install LifeType", "is_equal": true }] }, { "name": "H3C-Magic-B3", "logic": "a||b", "rule": [{ "label": "a", "feature": "var product_type = \\\"B3\\\"", "is_equal": true }, { "label": "b", "feature": "Magic B3 \u8def\u7531\u5668\u767b\u5f55", "is_equal": true }] }, { "name": "H3C-N12", "logic": "a", "rule": [{ "label": "a", "feature": "N12 \u8bbe\u5907\u767b\u5f55", "is_equal": true }] }, { "name": "HUAWEI-ASG5530", "logic": "a||b", "rule": [{ "label": "a", "feature": "('.huawei_title').html('ASG5530')", "is_equal": true }, { "label": "b", "feature": "Huawei ASG5530", "is_equal": true }] }, { "name": "H3C-Magic-R160", "logic": "a", "rule": [{ "label": "a", "feature": "Magic R160 \u8def\u7531\u5668\u767b\u5f55", "is_equal": true }] }, { "name": "MacHTTP", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: MacHTTP", "is_equal": true }, { "label": "b", "feature": "Server: MacHTTP", "is_equal": true }] }, { "name": "Liferay", "logic": "a||b||c||d||e||f||g", "rule": [{ "label": "a", "feature": "Powered by Liferay Portal", "is_equal": true }, { "label": "b", "feature": "Liferay Portal", "is_equal": true }, { "label": "c", "feature": "Liferay Portal", "is_equal": true }, { "label": "d", "feature": "guest_language_id=", "is_equal": true }, { "label": "e", "feature": "guest_language_id=", "is_equal": true }, { "label": "f", "feature": "Liferay.AUI", "is_equal": true }, { "label": "g", "feature": "Liferay.currentURL", "is_equal": true }] }, { "name": "LifeSize-Control", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "/LifeSizeControl/ASP/index.html", "is_equal": true }, { "label": "b", "feature": "LifeSizeControl", "is_equal": true }, { "label": "c", "feature": "Liferay Portal", "is_equal": true }] }, { "name": "M2Soft-RDServer", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "M2Soft Report Designer Server", "is_equal": true }, { "label": "b", "feature": "Server: RDServer", "is_equal": true }, { "label": "c", "feature": "Server: RDServer", "is_equal": true }] }, { "name": "Lusca-Web-Proxy-Cache", "logic": "a||b", "rule": [{ "label": "a", "feature": "Lusca", "is_equal": true }, { "label": "b", "feature": "Lusca", "is_equal": true }] }, { "name": "Lussumo-Vanilla", "logic": "a||b", "rule": [{ "label": "a", "feature": "X-Powered-By: Lussumo Vanilla", "is_equal": true }, { "label": "b", "feature": "X-Powered-By: Lussumo Vanilla", "is_equal": true }] }, { "name": "LuxCal", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "content=\\\"LuxCal", "is_equal": true }, { "label": "b", "feature": "class='footLB'>Lux", "is_equal": true }, { "label": "c", "feature": "content=\\\"Roel Buining", "is_equal": true }] }, { "name": "CISCO-IOx", "logic": "a||b", "rule": [{ "label": "a", "feature": "Cisco IOx Local Manager", "is_equal": true }, { "label": "b", "feature": "var g_url_version = \\\"/iox/api/v2\\\"", "is_equal": true }] }, { "name": "N2WS-Company products", "logic": "a", "rule": [{ "label": "a", "feature": "static/style/cpm_style.css", "is_equal": true }] }, { "name": "honey jar", "logic": "(a&&b&&c) || (d&&e) ||f|| (g&&h&&i) || (j&&k) || (l&&m&&n) || (o&&p) ||q|| (r&&s&&t)", "rule": [{ "label": "a", "feature": "apache", "is_equal": true }, { "label": "b", "feature": "Tomcat", "is_equal": true }, { "label": "c", "feature": "Jboss", "is_equal": true }, { "label": "d", "feature": "uc-httpd 1.0.0", "is_equal": true }, { "label": "e", "feature": "JBoss-5.0", "is_equal": true }, { "label": "f", "feature": "Apache,Tomcat,Jboss,weblogic,phpstudy,struts", "is_equal": true }, { "label": "g", "feature": "apache", "is_equal": true }, { "label": "h", "feature": "Tomcat", "is_equal": true }, { "label": "i", "feature": "Jboss", "is_equal": true }, { "label": "j", "feature": "

    My Resource

    ", "is_equal": true }, { "label": "k", "feature": "

    Blog Comments

    ", "is_equal": true }, { "label": "l", "feature": "apache", "is_equal": true }, { "label": "m", "feature": "Tomcat", "is_equal": true }, { "label": "n", "feature": "Jboss", "is_equal": true }, { "label": "o", "feature": "uc-httpd 1.0.0", "is_equal": true }, { "label": "p", "feature": "JBoss-5.0", "is_equal": true }, { "label": "q", "feature": "Apache,Tomcat,Jboss,weblogic,phpstudy,struts", "is_equal": true }, { "label": "r", "feature": "apache", "is_equal": true }, { "label": "s", "feature": "Tomcat", "is_equal": true }, { "label": "t", "feature": "Jboss", "is_equal": true }] }, { "name": "CISCO-Prime-Network-Registrar", "logic": "a", "rule": [{ "label": "a", "feature": "productname=\\\"Network Registrar", "is_equal": true }] }, { "name": "APACHE-kylin", "logic": "a&&b", "rule": [{ "label": "a", "feature": "href=\\\"/kylin/\\\"", "is_equal": true }, { "label": "b", "feature": "to you under the Apache License", "is_equal": true }] }, { "name": "CheckPoint-Connectra-Portal", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Connectra Portal", "is_equal": true }, { "label": "b", "feature": "if (document.loginForm.LaunchSWS.checked)", "is_equal": true }] }, { "name": "Schneider-Quantumn", "logic": "a", "rule": [{ "label": "a", "feature": "Schneider Electric Telecontrol - Industrial Web Control", "is_equal": true }] }, { "name": "Secnet - Smart Routing System", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "\u5b89\u7f51-\u667a\u80fd\u8def\u7531\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "\u667a\u80fd\u8def\u7531\u7cfb\u7edf", "is_equal": true }, { "label": "c", "feature": "\u5b89\u7f51\u79d1\u6280-\u667a\u80fd\u8def\u7531\u7cfb\u7edf", "is_equal": true }] }, { "name": "Guard God - Host Master", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"\u62a4\u536b\u795e\u00b7\u4e3b\u673a\u5927\u5e08 \u524d\u53f0\u7ba1\u7406\u767b\u5f55\\\"", "is_equal": true }] }, { "name": "H3C-Series-Router-MSR30", "logic": "a", "rule": [{ "label": "a", "feature": "H3C Series Router MSR30", "is_equal": true }] }, { "name": "SGP-management system", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "/static/all/img/logo/sgp", "is_equal": true }, { "label": "b", "feature": "SGP", "is_equal": true }] }, { "name": "ZIRION-Network-Card", "logic": "a", "rule": [{ "label": "a", "feature": "ZIRION Network Card", "is_equal": true }] }, { "name": "Radware-LinkProof-Switch", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "LinkProof OnDemand Switch", "is_equal": true }, { "label": "b", "feature": "LinkProof - Entry Level", "is_equal": true }, { "label": "c", "feature": "LinkProof Application Switch", "is_equal": true }, { "label": "d", "feature": "LinkProof Branch", "is_equal": true }] }, { "name": "Hanwha-SNP-6321H", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SNP-6321H\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-6084", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-6084\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-6084R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-6084R\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-L5083R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-L5083R\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-L5013", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-L5013\\\"", "is_equal": true }] }, { "name": "DZS-Zhone-Company Products", "logic": "a", "rule": [{ "label": "a", "feature": "VENDOR: Zhone Technologies Inc.;", "is_equal": true }] }, { "name": "Hanwha-SND-L6012", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-L6012\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-L6013R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-L6013R\\\"", "is_equal": true }] }, { "name": "Hanwha-SNP-6230RH", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SNP-6230RH\\\"", "is_equal": true }] }, { "name": "Hanwha-QRN-410", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"QRN-410\\\"", "is_equal": true }] }, { "name": "Hanwha-QRN-810", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"QRN-810\\\"", "is_equal": true }] }, { "name": "Hanwha-XRN-410S", "logic": "a||b", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"XRN-410S\\\"", "is_equal": true }, { "label": "b", "feature": "XRN-410S", "is_equal": true }] }, { "name": "LK-IHC-Controller", "logic": "a||b", "rule": [{ "label": "a", "feature": "LK IHC controller forside", "is_equal": true }, { "label": "b", "feature": "/images/bg_image_LK.jpg", "is_equal": true }] }, { "name": "Lotus-Notes-Traveler", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "realm=\\\"Lotus Notes Traveler", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Lotus Notes Traveler", "is_equal": true }, { "label": "c", "feature": "IBM Lotus Notes Traveler", "is_equal": true }] }, { "name": "LPSE", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "href=\\\"/eproc/assets/application.css", "is_equal": true }, { "label": "b", "feature": "/eproc/app", "is_equal": true }, { "label": "c", "feature": "/eproc/app", "is_equal": true }] }, { "name": "Network Direction - Flow Control Master", "logic": "a||b", "rule": [{ "label": "a", "feature": "Netzone", "is_equal": true }, { "label": "b", "feature": "\u6d41\u63a7\u5927\u5e08", "is_equal": true }] }, { "name": "MacbookAIR", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "MACBOOK-AIR", "is_equal": true }, { "label": "b", "feature": "MACBOOKAIR", "is_equal": true }, { "label": "c", "feature": "macbook-air", "is_equal": true }] }, { "name": "Byzoro-Smart", "logic": "a||b", "rule": [{ "label": "a", "feature": "Smart S150 \u7cfb\u7edf\u767b\u5f55", "is_equal": true }, { "label": "b", "feature": "Smart--\u7ba1\u7406\u5e73\u53f0", "is_equal": true }] }, { "name": "Hanwha-XRN-810S", "logic": "a||b", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"XRN-810S\\\"", "is_equal": true }, { "label": "b", "feature": "XRN-810S", "is_equal": true }] }, { "name": "Hanwha-XRN-1610", "logic": "a||b", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"XRN-1610\\\"", "is_equal": true }, { "label": "b", "feature": "XRN-1610", "is_equal": true }] }, { "name": "Hanwha-SRN-473S", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"SRN-473S\\\"", "is_equal": true }] }, { "name": "Hanwha-SRN-873S", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"SRN-873S\\\"", "is_equal": true }] }, { "name": "Hanwha-SRN-K3470S", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"SRN-K3470S\\\"", "is_equal": true }] }, { "name": "Hanwha-SRN-4000", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"SRN-4000\\\"", "is_equal": true }, { "label": "b", "feature": "Wisenet NVR", "is_equal": false }, { "label": "c", "feature": "SAMSUNG", "is_equal": false }] }, { "name": "Hanwha-SRN-K3370S", "logic": "a", "rule": [{ "label": "a", "feature": "$.nvr.model_name=\\\"SRN-K3370S\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-K2083R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-K2083R\\\"", "is_equal": true }] }, { "name": "Hanwha-SND-K2013R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-K2013R\\\"", "is_equal": true }] }, { "name": "Hanwha-SNO-K2013R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SNO-K2013R\\\"", "is_equal": true }] }, { "name": "Hanwha-SNO-S202R", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SNO-S202R\\\"", "is_equal": true }] }, { "name": "SONY-SNC-DH110T", "logic": "a||b", "rule": [{ "label": "a", "feature": "Sony Network Camera SNC-DH110T", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Sony Network Camera SNC-DH110T", "is_equal": true }] }, { "name": "SONY-SNC-VM772R", "logic": "a||b", "rule": [{ "label": "a", "feature": "SNC-VM772R", "is_equal": true }, { "label": "b", "feature": "realm=\\\"SNC-VM772R", "is_equal": true }] }, { "name": "SONY-BRC-H800", "logic": "a||b", "rule": [{ "label": "a", "feature": "BRC-H800", "is_equal": true }, { "label": "b", "feature": "realm=\\\"BRC-H800", "is_equal": true }] }, { "name": "SONY-SNC-CX600W", "logic": "a||b", "rule": [{ "label": "a", "feature": "SNC-CX600W", "is_equal": true }, { "label": "b", "feature": "realm=\\\"SNC-CX600W", "is_equal": true }] }, { "name": "Hanwha-Video Monitoring", "logic": "a", "rule": [{ "label": "a", "feature": "css/techwin.css", "is_equal": true }] }, { "name": "Hanwha-SPE-101", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SPE-101\\\"", "is_equal": true }] }, { "name": "Hanwha-SPE-400", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SPE-400\\\"", "is_equal": true }] }, { "name": "Hua Yu - Security Gateway", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "copy_right = {CN : \\\"\\\", EN ", "is_equal": true }, { "label": "b", "feature": "var opzoon_ver", "is_equal": true }] }, { "name": "Fang Zheng Group - Security Gateway", "logic": "a", "rule": [{ "label": "a", "feature": "Organization: www.foundersec.com", "is_equal": true }] }, { "name": "Hanwha-SND-S302", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-S302\\\"", "is_equal": true }] }, { "name": "SONY-SNC-WR630", "logic": "a||b", "rule": [{ "label": "a", "feature": "SNC-WR630", "is_equal": true }, { "label": "b", "feature": "realm=\\\"SNC-WR630", "is_equal": true }] }, { "name": "SONY-SNC-WR600", "logic": "a||b", "rule": [{ "label": "a", "feature": "SNC-WR600", "is_equal": true }, { "label": "b", "feature": "realm=\\\"SNC-WR600", "is_equal": true }] }, { "name": "SONY-SNC-EP521", "logic": "a||b", "rule": [{ "label": "a", "feature": "Sony Network Camera SNC-EP521", "is_equal": true }, { "label": "b", "feature": "Sony Network Camera SNC-EP521", "is_equal": true }] }, { "name": "LISTSERV", "logic": "a||b", "rule": [{ "label": "a", "feature": "Powered by the LISTSERV Email List Manager", "is_equal": true }, { "label": "b", "feature": "Welcome to LISTSERV", "is_equal": true }] }, { "name": "D_Link-DSL-2600U", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "DSL-2600U", "is_equal": true }, { "label": "b", "feature": "DSL-2600U", "is_equal": true }, { "label": "c", "feature": "DSL-2600U", "is_equal": true }] }, { "name": "iNovo-IB8120", "logic": "a", "rule": [{ "label": "a", "feature": "iNovo IB-8120-W21", "is_equal": true }] }, { "name": "apereo-CAS", "logic": "a", "rule": [{ "label": "a", "feature": "CAS – Central Authentication Service", "is_equal": true }] }, { "name": "\u5e06\u8f6f-FineReport", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"FineReport--Web Reporting Tool\\\"", "is_equal": true }] }, { "name": "Margatek -Journalx", "logic": "a", "rule": [{ "label": "a", "feature": "journalx/authorLogOn.action?mag_Id", "is_equal": true }] }, { "name": "LimeSurvey", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "content=\\\"LimeSurvey", "is_equal": true }, { "label": "b", "feature": "href=\\\"http://www.limesurvey.org\\\" target=\\\"_blank", "is_equal": true }, { "label": "c", "feature": "LimeSurvey", "is_equal": true }] }, { "name": "Koha", "logic": "a||b", "rule": [{ "label": "a", "feature": "content=\\\"Koha ", "is_equal": true }, { "label": "b", "feature": "name=\\\"koha_login_context", "is_equal": true }] }, { "name": "Linksys-USB-HDD", "logic": "a||b", "rule": [{ "label": "a", "feature": "Network Storage Link for USB 2.0 Disks", "is_equal": true }, { "label": "b", "feature": "href=\\\"Management/setup.cgi?next_file=lan.htm", "is_equal": true }] }, { "name": "Linksys-Print-Server", "logic": "a&&b", "rule": [{ "label": "a", "feature": "PRINT_SERVER WEB", "is_equal": true }, { "label": "b", "feature": "Print Server for USB with 4-Port Switch", "is_equal": true }] }, { "name": "NetComm-GURNV5", "logic": "a", "rule": [{ "label": "a", "feature": "GURNV5", "is_equal": true }] }, { "name": "iball-iB-WRA300N3G", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "realm=\\\"iB-WRA300N3G", "is_equal": true }, { "label": "b", "feature": "iB-WRA300N3GT", "is_equal": true }, { "label": "c", "feature": "realm=\\\"iB-WRA300N3G", "is_equal": true }] }, { "name": "Kolab-product", "logic": "a||b", "rule": [{ "label": "a", "feature": "Kolab Groupware login", "is_equal": true }, { "label": "b", "feature": "content=\\\"Kolab", "is_equal": true }] }, { "name": "Adobe-Experience-Manager", "logic": "(a&&b) ||(c&&d)", "rule": [{ "label": "a", "feature": "Adobe Experience Manager", "is_equal": true }, { "label": "b", "feature": " class=\\\"coral-Heading coral-Heading--1\\\"", "is_equal": true }, { "label": "c", "feature": "AEM \u767b\u5f55", "is_equal": true }, { "label": "d", "feature": "Adobe", "is_equal": true }] }, { "name": "Zyxel-USG20W", "logic": "(a&& (b||c)) ||d", "rule": [{ "label": "a", "feature": "USG20W-VPN", "is_equal": true }, { "label": "b", "feature": " class=\\\"usg_icon\\\"", "is_equal": true }, { "label": "c", "feature": "zyFunction.js", "is_equal": true }, { "label": "d", "feature": "USG20W-VPN", "is_equal": true }] }, { "name": "ASUS-GT-AC2900", "logic": "a||b", "rule": [{ "label": "a", "feature": "ASUS Wireless Router GT-AC2900", "is_equal": true }, { "label": "b", "feature": "document.getElementsByClassName(\\\"model-name\\\")[0].innerhtml = \\\"GT-AC2900\\\"", "is_equal": true }] }, { "name": "ASUS-GT-AC2900_SH", "logic": "a", "rule": [{ "label": "a", "feature": "document.getElementsByClassName(\\\"model-name\\\")[0].innerhtml = \\\"GT-AC2900_SH\\\"", "is_equal": true }] }, { "name": "NETGEAR-GS724Tv3", "logic": "a", "rule": [{ "label": "a", "feature": "GS724Tv3", "is_equal": true }] }, { "name": "NETGEAR-GS724TS", "logic": "a", "rule": [{ "label": "a", "feature": "GS724TS", "is_equal": true }] }, { "name": "GSM-RF-gateway", "logic": "a", "rule": [{ "label": "a", "feature": "GSM/GPRS RF gateway", "is_equal": true }] }, { "name": "Trendnet-GreenNet-Switch", "logic": "a||b", "rule": [{ "label": "a", "feature": "GreenNet Ethernet Switch", "is_equal": true }, { "label": "b", "feature": "GreenNet Switch", "is_equal": true }] }, { "name": "NETGEAR-GS108Tv2", "logic": "a", "rule": [{ "label": "a", "feature": "GS108Tv2", "is_equal": true }] }, { "name": "NETGEAR-GS716Tv2", "logic": "a", "rule": [{ "label": "a", "feature": "GS716Tv2", "is_equal": true }] }, { "name": "NETGEAR-GS724TP", "logic": "a", "rule": [{ "label": "a", "feature": "GS724TP", "is_equal": true }] }, { "name": "D-Link-DSL-2730E", "logic": "a", "rule": [{ "label": "a", "feature": "Product Page</span>: DSL-2730E", "is_equal": true }] }, { "name": "Fortinet-FWN200B", "logic": "a", "rule": [{ "label": "a", "feature": "FWN200B", "is_equal": true }] }, { "name": "Fortinet-FWN1000B", "logic": "a", "rule": [{ "label": "a", "feature": "FWN1000B", "is_equal": true }] }, { "name": "Yamaha-FWX120", "logic": "a", "rule": [{ "label": "a", "feature": "FWX120", "is_equal": true }] }, { "name": "Koala-Web-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Koala Web Server", "is_equal": true }, { "label": "b", "feature": "Server: Koala Web Server", "is_equal": true }] }, { "name": "KodiTV", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "Kodi", "is_equal": true }, { "label": "b", "feature": "title=\\\"Kodi Library", "is_equal": true }, { "label": "c", "feature": "<title>Kodi", "is_equal": true }] }, { "name": "LetoDMS", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "letoDMS free document management system", "is_equal": true }, { "label": "b", "feature": "out/out.ViewFolder.php", "is_equal": true }, { "label": "c", "feature": "out/out.ViewFolder.php", "is_equal": true }] }, { "name": "Hanwha-SND-7084", "logic": "a", "rule": [{ "label": "a", "feature": "var defaultfilename = \\\"SND-7084\\\"", "is_equal": true }] }, { "name": "TrendMicro-S3020F", "logic": "a", "rule": [{ "label": "a", "feature": "S3020F", "is_equal": true }] }, { "name": "TrendMicro-S8005F", "logic": "a", "rule": [{ "label": "a", "feature": "S8005F", "is_equal": true }] }, { "name": "TrendMicro-S8010F", "logic": "a", "rule": [{ "label": "a", "feature": "S8010F", "is_equal": true }] }, { "name": "TrendMicro-IWSA5000", "logic": "a", "rule": [{ "label": "a", "feature": "IWSA5000", "is_equal": true }] }, { "name": "naxsi", "logic": "a||b", "rule": [{ "label": "a", "feature": "X-Data-Origin: naxsi", "is_equal": true }, { "label": "b", "feature": "X-Data-Origin: naxsi", "is_equal": true }] }, { "name": "open-Dreambox", "logic": "a||b", "rule": [{ "label": "a", "feature": "src=\\\"/web-data/img\\\"", "is_equal": true }, { "label": "b", "feature": "Dreambox WebControl", "is_equal": true }] }, { "name": "TrendMicro-S1050F", "logic": "a", "rule": [{ "label": "a", "feature": "CommonName: N-S1050F-50R4-3018", "is_equal": true }] }, { "name": "Level_one-router", "logic": "a", "rule": [{ "label": "a", "feature": "Wireless Broadband NAT Router Web-Console", "is_equal": true }] }, { "name": "Netgear-Wireless-Modem", "logic": "a", "rule": [{ "label": "a", "feature": "Netgear Wireless Cable Modem", "is_equal": true }] }, { "name": "Bnmux-BCW710J", "logic": "a&&b", "rule": [{ "label": "a", "feature": "BCW710J ", "is_equal": true }, { "label": "b", "feature": "VENDOR: Bnmux", "is_equal": true }] }, { "name": "Motorola-SVG1202", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "motorola", "is_equal": true }, { "label": "b", "feature": "SVG1202", "is_equal": true }, { "label": "c", "feature": "MODEL: SVG1202", "is_equal": true }] }, { "name": "Openfire", "logic": "a|| (b&&c) ||d||e", "rule": [{ "label": "a", "feature": "background: transparent url(images/login_logo.gif) no-repeat", "is_equal": true }, { "label": "b", "feature": "class=\\\"row justify-content-center\\\"", "is_equal": true }, { "label": "c", "feature": "Openfire \u7ba1\u7406\u754c\u9762", "is_equal": true }, { "label": "d", "feature": "Openfire Admin Console", "is_equal": true }, { "label": "e", "feature": "Openfire HTTP Binding Service", "is_equal": true }] }, { "name": "ARRIS-DOCSIS", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "ARRIS ", "is_equal": true }, { "label": "c", "feature": "DOCSIS ", "is_equal": true }] }, { "name": "Technicolor-BFC-cablemodem", "logic": "a&&b", "rule": [{ "label": "a", "feature": "BFC cablemodem", "is_equal": true }, { "label": "b", "feature": "VENDOR: Technicolor", "is_equal": true }] }, { "name": "Lasso-Web-Data-Engine", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Lasso", "is_equal": true }, { "label": "b", "feature": "Server: Lasso", "is_equal": true }] }, { "name": "Hitron-Router", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "Hitron Technologies", "is_equal": true }, { "label": "b", "feature": "Common Router", "is_equal": true }, { "label": "c", "feature": "Hitron Common Router", "is_equal": true }] }, { "name": "CastleNet-CBW383G4J", "logic": "a&&b", "rule": [{ "label": "a", "feature": "CBW383G4J", "is_equal": true }, { "label": "b", "feature": "CastleNet", "is_equal": true }] }, { "name": "DX-1821", "logic": "a&&b&&c", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "DAX NETWORKS", "is_equal": true }, { "label": "c", "feature": "DX-1821", "is_equal": true }] }, { "name": "ZyXEL-P-660R-D1", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"P-660R-D1 ", "is_equal": true }, { "label": "b", "feature": "P-660R-D1", "is_equal": true }] }, { "name": "ZyXEL-P-660R-T1", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"P-660R-T1", "is_equal": true }, { "label": "b", "feature": "P-660R-T1", "is_equal": true }] }, { "name": "ZyXEL-P-660R-T3", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"P-660R-T3", "is_equal": true }, { "label": "b", "feature": "P-660R-T3", "is_equal": true }] }, { "name": "ZyXEL-P-660RU-T1", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"P-660RU-T1", "is_equal": true }, { "label": "b", "feature": "P-660RU-T1", "is_equal": true }] }, { "name": "POLY-DST-MCS-Video Conference", "logic": "a", "rule": [{ "label": "a", "feature": "document.location.href=\\\"/cgi-bin/cgiServer?_dstp_functionid=HOMEPAGE&language_type=", "is_equal": true }] }, { "name": "TP_LINK-TD-8811", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-8811", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-8811", "is_equal": true }] }, { "name": "TP_LINK-TD-8816", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-8816", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-8816", "is_equal": true }] }, { "name": "TP_LINK-TD-8817", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-8817", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-8817", "is_equal": true }] }, { "name": "Chiyu-fingerprint machine", "logic": "a", "rule": [{ "label": "a", "feature": "cmdbar.htm", "is_equal": true }] }, { "name": "White Hat - Vulfocus", "logic": "a", "rule": [{ "label": "a", "feature": "vulfocus", "is_equal": true }] }, { "name": "TP_LINK-TD-W8101G", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8101G", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8101G", "is_equal": true }] }, { "name": "TP_LINK-TD-W8151N", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8151N", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8151N", "is_equal": true }] }, { "name": "TP_LINK-TD-W8901GB", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8901GB", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8901GB", "is_equal": true }] }, { "name": "Shiji - West Soft Cloud XMS", "logic": "a||b", "rule": [{ "label": "a", "feature": "href=\\\"xmsenv.exe\\\">\u7cfb\u7edf\u8fd0\u884c\u73af\u5883", "is_equal": true }, { "label": "b", "feature": "\u897f\u8f6f\u4e91XMS", "is_equal": true }] }, { "name": "TP_LINK-TD-W8951ND", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8951ND", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8951ND", "is_equal": true }] }, { "name": "TP_LINK-TD-W8961ND", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8961ND", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8961ND", "is_equal": true }] }, { "name": "TP_LINK-TD-W8961N", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"TD-W8961N", "is_equal": true }, { "label": "b", "feature": "realm=\\\"TD-W8961N", "is_equal": true }] }, { "name": "Sangfor-Data Center", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "acloglogin.php", "is_equal": true }, { "label": "b", "feature": "SANGFOR \u6570\u636e\u4e2d\u5fc3", "is_equal": true }, { "label": "c", "feature": "Location: ./src/acloglogin.php", "is_equal": true }, { "label": "d", "feature": "Location: ./src/acloglogin.php", "is_equal": true }] }, { "name": "Zeroshell-Firewall", "logic": "a||b", "rule": [{ "label": "a", "feature": "ZeroShell", "is_equal": true }, { "label": "b", "feature": "ZeroShell", "is_equal": true }] }, { "name": "KYOCERA-IB-110", "logic": "a", "rule": [{ "label": "a", "feature": "KYOCERA Print System IB-110", "is_equal": true }] }, { "name": "Lantronix companies products", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Lantronix ThinWeb Manager", "is_equal": true }, { "label": "b", "feature": "alt=\\\"Lantronix ThinWeb Manager", "is_equal": true }, { "label": "c", "feature": "Gordian Embedded", "is_equal": true }, { "label": "d", "feature": "Lantronix ", "is_equal": true }] }, { "name": "motionEye", "logic": "a||b", "rule": [{ "label": "a", "feature": "static/img/motioneye-logo.svg", "is_equal": true }, { "label": "b", "feature": "Motioneye", "is_equal": true }] }, { "name": "SAMSUNG-SNB-2000", "logic": "(a&&b) || (c&&d)", "rule": [{ "label": "a", "feature": "must-revalidate", "is_equal": true }, { "label": "b", "feature": "Digest realm=\\\"NET-i\\\", nonce", "is_equal": true }, { "label": "c", "feature": "Digest realm=\\\"NET-i\\\", nonce", "is_equal": true }, { "label": "d", "feature": "must-revalidate", "is_equal": true }] }, { "name": "Heavenly Letter-TopApp-load balancing", "logic": "a", "rule": [{ "label": "a", "feature": "TopApp", "is_equal": true }] }, { "name": "NETGEAR-FS728TPv2", "logic": "a", "rule": [{ "label": "a", "feature": "FS728TPv2", "is_equal": true }] }, { "name": "SAMSUNG-SmartCam", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "Server: HSS Web Server", "is_equal": true }, { "label": "b", "feature": "Server: HSS Web Server", "is_equal": true }, { "label": "c", "feature": "pages/camera_login.php?login=true", "is_equal": true }, { "label": "d", "feature": "Server: SmartCamWebService", "is_equal": true }, { "label": "e", "feature": "Server: SmartCamWebService", "is_equal": true }] }, { "name": "HUACAM-Cyclops-IP-camera", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Please update your documents to reflect the new location", "is_equal": true }, { "label": "b", "feature": "GS-Webs", "is_equal": true }] }, { "name": "AXIS-754648-Camera", "logic": "a", "rule": [{ "label": "a", "feature": "AXIS 754648", "is_equal": true }] }, { "name": "zmodo-camera", "logic": "a||b", "rule": [{ "label": "a", "feature": "top.frames.frmResource.location = getXMLUrl", "is_equal": true }, { "label": "b", "feature": "name=\\\"mainFrame\\\" frameborder=\\\"0\\\" src=\\\"play.html\\\"", "is_equal": true }] }, { "name": "WebServer(IPCamera_Logo)", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "Server: WebServer(IPCamera_Logo)", "is_equal": true }, { "label": "b", "feature": "Server: WebServer(IPCamera_Logo)", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }] }, { "name": "Magento-Swann-DVR8-2600", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "self.location = \\\"play.html\\\"", "is_equal": true }, { "label": "b", "feature": "if(navigator.userAgent.indexOf(\\\"Safari\\\")", "is_equal": true }] }, { "name": "FLIR-DVTEL-Video Monitoring", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "class=\\\"loginleft displaynone\\\"", "is_equal": true }, { "label": "b", "feature": "class=\\\"footer\\\">DVTEL INC", "is_equal": true }] }, { "name": "AVIOSYS-IP-Camera", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Copyright AVIOSYS", "is_equal": true }, { "label": "b", "feature": "View Log", "is_equal": true }] }, { "name": "D_Link-web-camera", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Administrator or User\\\"", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Administrator or User\\\"", "is_equal": true }] }, { "name": "ACTi-ACM-1231", "logic": "a", "rule": [{ "label": "a", "feature": "url=/cgi-bin/videoconfiguration.cgi", "is_equal": true }] }, { "name": "QualityView-Ipcam", "logic": "a", "rule": [{ "label": "a", "feature": "Welcome to QualityView Ipcam", "is_equal": true }] }, { "name": "IP-Video-embedded-camera", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"Camera Server\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"Camera Server\\\"", "is_equal": true }] }, { "name": "AirLive-POE-HDwebcam", "logic": "a", "rule": [{ "label": "a", "feature": "js/variable_6.js", "is_equal": true }] }, { "name": "MASPRO-webcam", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "href=\\\"/keitai/index.html\\\"", "is_equal": true }, { "label": "b", "feature": "href=\\\"/mobile/index.html\\\"", "is_equal": true }] }, { "name": "XonTel-Network-Camera", "logic": "a", "rule": [{ "label": "a", "feature": "XonTel Network Camera", "is_equal": true }] }, { "name": "WebGate companies products", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"WebGateInc\\\"", "is_equal": true }] }, { "name": "Video Surveillance", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=Camera Name", "is_equal": true }, { "label": "b", "feature": "Basic realm=Camera Name ", "is_equal": true }] }, { "name": "D_Link-DCS-kabinet", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"DCS-kabinet\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"DCS-kabinet\\\"", "is_equal": true }] }, { "name": "D_Link-DCS-d", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"DCS-d\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"DCS-d\\\"", "is_equal": true }] }, { "name": "EasyN-TAS-Tech-IPCam", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "Server: TAS-Tech IPCam", "is_equal": true }, { "label": "b", "feature": "Server: TAS-Tech IPCam", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }] }, { "name": "AXIS-240", "logic": "a", "rule": [{ "label": "a", "feature": "AXIS 240 Camera Server", "is_equal": true }] }, { "name": "GoPro-HERO3-camera", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: GoPro Web Server", "is_equal": true }, { "label": "b", "feature": "Server: GoPro Web Server", "is_equal": true }] }, { "name": "VIVOTEK-3102", "logic": "a", "rule": [{ "label": "a", "feature": "Welcome to Network Camera telnet daemon", "is_equal": true }] }, { "name": "LG-Smart-IP-Camera", "logic": "a", "rule": [{ "label": "a", "feature": "IPCam_Streamer.RunElevatedWeb(window.location.href)", "is_equal": true }] }, { "name": "EverFocus-PowerPlex-eDR400", "logic": "a", "rule": [{ "label": "a", "feature": "Welcome to eDR400", "is_equal": true }] }, { "name": "Gadspot-NC1000-L10", "logic": "(a&& (b||c))", "rule": [{ "label": "a", "feature": "content=\\\"ChenXiaohui\\\"", "is_equal": true }, { "label": "b", "feature": "src=\\\"/Jpeg/CamImg.jpg\\\"", "is_equal": true }, { "label": "c", "feature": "Video Server", "is_equal": true }] }, { "name": "Gadspot-DVR", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "content=\\\"ChenXiaohui\\\"", "is_equal": true }, { "label": "b", "feature": "name=\\\"configPtz\\\"", "is_equal": true }] }, { "name": "Ben_Software-SecuritySpy-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "SecuritySpy Web Server", "is_equal": true }] }, { "name": "AVer-DVR", "logic": "a", "rule": [{ "label": "a", "feature": "var isexist = Get_Cookie(\\\"OCX\\\")", "is_equal": true }] }, { "name": "Panasonic-Ethernet-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "content=\\\"NCS G 2062\\\"", "is_equal": true }] }, { "name": "SONY-Network-Camera-SNC-f", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"Sony Network Camera SNC-f\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"Sony Network Camera SNC-f\\\"", "is_equal": true }] }, { "name": "D_Link-DCS-5220bed", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"DCS-5220bed\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"DCS-5220bed\\\"", "is_equal": true }] }, { "name": "YAWCAM-webcam", "logic": "(a&& (b||c))", "rule": [{ "label": "a", "feature": "Yawcam", "is_equal": true }, { "label": "b", "feature": "div.menu", "is_equal": true }, { "label": "c", "feature": "It's a webcam!", "is_equal": true }] }, { "name": "grandtec-wifi-webcam", "logic": "a||b", "rule": [{ "label": "a", "feature": "Basic realm=\\\"Welcome to IPCam !\\\"", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"Welcome to IPCam !\\\"", "is_equal": true }] }, { "name": "SANYO-NETWORK-CAMERA", "logic": "a||b", "rule": [{ "label": "a", "feature": "SANYO NETWORK CAMERA", "is_equal": true }, { "label": "b", "feature": "SANYO NETWORK CAMERA", "is_equal": true }] }, { "name": "DVR-Systems-webcam", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Your client does not have permission to get URL /index.htm from this server.", "is_equal": true }, { "label": "b", "feature": "Basic realm=\\\"server", "is_equal": true }] }, { "name": "CP_PLUS-webcam", "logic": "a|| (b&&c&&d)", "rule": [{ "label": "a", "feature": "CPPLUS Remote \u2013 Web View", "is_equal": true }, { "label": "b", "feature": "dhvideowhmode", "is_equal": true }, { "label": "c", "feature": "platformHtm", "is_equal": true }, { "label": "d", "feature": "cpplus_bottom", "is_equal": true }] }, { "name": "TTIC-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "TTiC WebServer Client", "is_equal": true }] }, { "name": "D_Link-DCS-5220PUERTA", "logic": "a", "rule": [{ "label": "a", "feature": "Basic realm=\\\"DCS-5220PUERTA\\\"", "is_equal": true }] }, { "name": "Broadcom-Foundry-Networks products", "logic": "a", "rule": [{ "label": "a", "feature": "Foundry Networks, Inc. ", "is_equal": true }] }, { "name": "Kyocera-printer", "logic": "a||b||c||d|| (e&&f) || (g&&h) || (i&&j&&k)", "rule": [{ "label": "a", "feature": "Server: KM-MFP-http", "is_equal": true }, { "label": "b", "feature": "Server: KM-MFP-http", "is_equal": true }, { "label": "c", "feature": "Kyocera Command Center", "is_equal": true }, { "label": "d", "feature": "var modelname=\\\"FS-", "is_equal": true }, { "label": "e", "feature": "var currentpage=\\\"\\\";", "is_equal": true }, { "label": "f", "feature": "var modelname=", "is_equal": true }, { "label": "g", "feature": "snmp", "is_equal": true }, { "label": "h", "feature": "KYOCERA Printer", "is_equal": true }, { "label": "i", "feature": "220", "is_equal": true }, { "label": "j", "feature": " FTP server.", "is_equal": true }, { "label": "k", "feature": "214- FTPD supported commands(RFC959 subset):", "is_equal": true }] }, { "name": "Ciena-5160-Switch", "logic": "a", "rule": [{ "label": "a", "feature": "5160 Service Aggregation Switch", "is_equal": true }] }, { "name": "Ciena-5410-Switch", "logic": "a", "rule": [{ "label": "a", "feature": "5410 Service Aggregation Switch", "is_equal": true }] }, { "name": "Ciena-6500-REARELEC", "logic": "a&&b", "rule": [{ "label": "a", "feature": "6500 REARELEC", "is_equal": true }, { "label": "b", "feature": "Ciena (R) Corporation", "is_equal": true }] }, { "name": "Enterasys-Networks-Firmware", "logic": "a", "rule": [{ "label": "a", "feature": "Enterasys Networks Firmware", "is_equal": true }] }, { "name": "Router product", "logic": "a", "rule": [{ "label": "a", "feature": "802.11n Wireless ADSL 2/2+ Router", "is_equal": true }] }, { "name": "8860-ADSL", "logic": "a", "rule": [{ "label": "a", "feature": "8860-C1. H/W: ADSL-M", "is_equal": true }] }, { "name": "AXIS-video server", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Video Server", "is_equal": true }, { "label": "b", "feature": "axis", "is_equal": true }] }, { "name": "Thomson-CableHome-Gateway", "logic": "a", "rule": [{ "label": "a", "feature": "Thomson CableHome Gateway ", "is_equal": true }] }, { "name": "Hitron-Cable-Gateway", "logic": "(a&&b)", "rule": [{ "label": "a", "feature": "Hitron Technologies", "is_equal": true }, { "label": "b", "feature": "Cable Gateway", "is_equal": true }] }, { "name": "Cisco-Docsis Gateway", "logic": "(a&& (b||c)) || (d&&e)", "rule": [{ "label": "a", "feature": "Cisco ", "is_equal": true }, { "label": "b", "feature": "DOCSIS", "is_equal": true }, { "label": "c", "feature": "EuroDOCSIS", "is_equal": true }, { "label": "d", "feature": "showXHead('Cisco ", "is_equal": true }, { "label": "e", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "CISCO-TelePresence\u89c6\u9891\u4f1a\u8bae", "logic": "a", "rule": [{ "label": "a", "feature": "Cisco TelePresence ", "is_equal": true }] }, { "name": "4Port-ADSL", "logic": "a||b", "rule": [{ "label": "a", "feature": "4 Port ADSL IAD", "is_equal": true }, { "label": "b", "feature": "4 Port ADSL IAD", "is_equal": true }] }, { "name": "Honeywell-450TC module", "logic": "a||b", "rule": [{ "label": "a", "feature": "450TC1", "is_equal": true }, { "label": "b", "feature": "450TC2", "is_equal": true }] }, { "name": "CGEZ-48-Router", "logic": "a", "rule": [{ "label": "a", "feature": "48 FE Ports Routing Switch(CGEZ-48)", "is_equal": true }] }, { "name": "Ciena-5142-Switch", "logic": "a", "rule": [{ "label": "a", "feature": "5142 Service Aggregation Switch", "is_equal": true }] }, { "name": "HISILICON-Hi3518E", "logic": "a", "rule": [{ "label": "a", "feature": "The products of network camera", "is_equal": true }] }, { "name": "LabVIEW", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: LabVIEW", "is_equal": true }, { "label": "b", "feature": "Server: LabVIEW", "is_equal": true }] }, { "name": "Kordil-EDMS", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "kordil_edms", "is_equal": true }, { "label": "b", "feature": "kordil_edms", "is_equal": true }, { "label": "c", "feature": ">Kordil EDMS", "is_equal": true }] }, { "name": "Dahua-DVR", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "dahua", "is_equal": true }, { "label": "b", "feature": "snmp", "is_equal": true }, { "label": "c", "feature": "Dahuatech DVR", "is_equal": true }] }, { "name": "Coffinkary News", "logic": "a", "rule": [{ "label": "a", "feature": "hw_type=\\\"iMX100AG", "is_equal": true }] }, { "name": "ZTE-Super Convention Center", "logic": "(a||b) &&c", "rule": [{ "label": "a", "feature": "href='./zxms80.css", "is_equal": true }, { "label": "b", "feature": "href=\\\"zxms80.css", "is_equal": true }, { "label": "c", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "Serial port server Eth2232x", "logic": "a", "rule": [{ "label": "a", "feature": "\u4e32\u53e3\u670d\u52a1\u5668---eth2232X", "is_equal": true }] }, { "name": "iSpy-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "Access this server via http://www.ispyconnect.com", "is_equal": true }] }, { "name": "PLANET-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "PLANET IP Surveillance", "is_equal": true }] }, { "name": "UMEYE Case-WebCAM", "logic": "a", "rule": [{ "label": "a", "feature": "name=\\\"utbd_v\\\"", "is_equal": true }] }, { "name": "ISS-webcam", "logic": "a", "rule": [{ "label": "a", "feature": "WEB interface of Inspector", "is_equal": true }] }, { "name": "ISC-BIND-DNS", "logic": "(((a||b) &&c) &&d)", "rule": [{ "label": "a", "feature": "yamutech-bind", "is_equal": true }, { "label": "b", "feature": "BIND server", "is_equal": true }, { "label": "c", "feature": "this is not a 'bind' server", "is_equal": false }, { "label": "d", "feature": "dns", "is_equal": true }] }, { "name": "Sympa-mailing-list-server", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "sympa_session=", "is_equal": true }, { "label": "b", "feature": "sympa_session=", "is_equal": true }, { "label": "c", "feature": "content=\\\"Sympa", "is_equal": true }, { "label": "d", "feature": "alt=\\\"SYMPA logo", "is_equal": true }] }, { "name": "Microsoft-DNS", "logic": "a&&b", "rule": [{ "label": "a", "feature": "dns", "is_equal": true }, { "label": "b", "feature": "Windows", "is_equal": true }] }, { "name": "NLNETLABS-UNBOUND", "logic": "a&&b", "rule": [{ "label": "a", "feature": "dns", "is_equal": true }, { "label": "b", "feature": "Unbound", "is_equal": true }] }, { "name": "Kong", "logic": "a|| (b&&c&&d) || (e&&f&&g)", "rule": [{ "label": "a", "feature": "Kong Dashboard", "is_equal": true }, { "label": "b", "feature": "Server: kong", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }, { "label": "d", "feature": "drupal", "is_equal": false }, { "label": "e", "feature": "Server: kong", "is_equal": true }, { "label": "f", "feature": "couchdb", "is_equal": false }, { "label": "g", "feature": "drupal", "is_equal": false }] }, { "name": "SAP-System", "logic": "a||b", "rule": [{ "label": "a", "feature": "realm=\\\"Sap-System", "is_equal": true }, { "label": "b", "feature": "realm=\\\"Sap-System", "is_equal": true }] }, { "name": "easyPress", "logic": "a||b", "rule": [{ "label": "a", "feature": "Easypress-Platform", "is_equal": true }, { "label": "b", "feature": "Easypress-Platform", "is_equal": true }] }, { "name": "IBM-Watchfire", "logic": "a||b", "rule": [{ "label": "a", "feature": "Set-Cookie: WatchfireSessionID", "is_equal": true }, { "label": "b", "feature": "Set-Cookie: WatchfireSessionID", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M4S", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M4S", "is_equal": true }] }, { "name": "CISCO-UCSC-C240-M5L", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C240-M5L", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M3S", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M3S", "is_equal": true }] }, { "name": "CISCO-UCSC-C22-M3L", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C22-M3L", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M5L", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M5L", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M3L", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M3L", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M4L", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M4L", "is_equal": true }] }, { "name": "CISCO-UCSC-C220-M5SN", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C220-M5SN", "is_equal": true }] }, { "name": "CISCO-UCSC-C480-M5", "logic": "a", "rule": [{ "label": "a", "feature": "PID:UCSC-C480-M5", "is_equal": true }] }, { "name": "NetApp- Storage", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "Server: NetApp", "is_equal": true }, { "label": "b", "feature": "snmp", "is_equal": true }, { "label": "c", "feature": "NetApp", "is_equal": true }] }, { "name": "microHttp", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: microHttp", "is_equal": true }, { "label": "b", "feature": "server: microHttp", "is_equal": true }] }, { "name": "Hisilicon-module", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "UPnP devices", "is_equal": true }, { "label": "b", "feature": "Hisilicon Technologies", "is_equal": true }, { "label": "c", "feature": "Server: Hisilicon Streaming Media Server", "is_equal": true }] }, { "name": "WAP", "logic": "a&&b", "rule": [{ "label": "a", "feature": "UPnP devices", "is_equal": true }, { "label": "b", "feature": "window.location = 'wap.htm'", "is_equal": true }] }, { "name": "MiniServ", "logic": "(a&&b&&c&&d) || (e&&f&&g)", "rule": [{ "label": "a", "feature": "Server: miniserv", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "drupal", "is_equal": false }, { "label": "d", "feature": "couchdb", "is_equal": false }, { "label": "e", "feature": "server: miniserv", "is_equal": true }, { "label": "f", "feature": "couchdb", "is_equal": false }, { "label": "g", "feature": "drupal", "is_equal": false }] }, { "name": "Fusion-Embedded\u2122-FTP", "logic": "a", "rule": [{ "label": "a", "feature": "FUSION FTP", "is_equal": true }] }, { "name": "Huawei- server", "logic": "((a||b|| (c&&d)) &&e) ||f", "rule": [{ "label": "a", "feature": "Server: Huawei-BMC", "is_equal": true }, { "label": "b", "feature": "iMana 200 Login", "is_equal": true }, { "label": "c", "feature": "src=\\\"custom/logo.gif\\\"", "is_equal": true }, { "label": "d", "feature": "control/images/about.gif", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "Server: Huawei-BMC", "is_equal": true }] }, { "name": "Xlight-FTP", "logic": "a", "rule": [{ "label": "a", "feature": "Xlight FTP", "is_equal": true }] }, { "name": "NetMind-product", "logic": "a||b", "rule": [{ "label": "a", "feature": "Netmindsessionid", "is_equal": true }, { "label": "b", "feature": "Netmindsessionid", "is_equal": true }] }, { "name": "FUJITSU-PRIMERGY-tx200", "logic": "a", "rule": [{ "label": "a", "feature": "PRIMERGY-tx200", "is_equal": true }] }, { "name": "FUJITSU-PRIMERGY-TX100", "logic": "a||b", "rule": [{ "label": "a", "feature": "PRIMERGY-TX100", "is_equal": true }, { "label": "b", "feature": "PRIMERGY-TX100", "is_equal": true }] }, { "name": "3Com-Router-5012", "logic": "a", "rule": [{ "label": "a", "feature": "3Com Router 5012", "is_equal": true }] }, { "name": "3Com-Switch-4500", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "3Com Switch 4500", "is_equal": true }, { "label": "b", "feature": "3Com Switch 4500G", "is_equal": true }, { "label": "c", "feature": "Switch 4500", "is_equal": true }] }, { "name": "3Com-Switch-4800G", "logic": "a", "rule": [{ "label": "a", "feature": "3Com Switch 4800G", "is_equal": true }] }, { "name": "HP-Proliant-DL980R07i", "logic": "a", "rule": [{ "label": "a", "feature": "Proliant DL980R07i", "is_equal": true }] }, { "name": "FUJITSU-PRIMERGY-TX1310-M1", "logic": "a||b", "rule": [{ "label": "a", "feature": "PRIMERGY-TX1310-M1", "is_equal": true }, { "label": "b", "feature": "PRIMERGY-TX1310-M1", "is_equal": true }] }, { "name": "HP-DL320e-Gen8", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL320e-Gen8", "is_equal": true }, { "label": "b", "feature": "DL320e-Gen8", "is_equal": true }] }, { "name": "HP-ML310-G5", "logic": "a", "rule": [{ "label": "a", "feature": "ML310-G5", "is_equal": true }] }, { "name": "HP-DL160-G5", "logic": "a", "rule": [{ "label": "a", "feature": "DL160-G5", "is_equal": true }] }, { "name": "HP-PROLIANT-DL380G", "logic": "a", "rule": [{ "label": "a", "feature": "PROLIANT-DL380G", "is_equal": true }] }, { "name": "HP-Integrity-rx2800", "logic": "a||b", "rule": [{ "label": "a", "feature": "rx2800", "is_equal": true }, { "label": "b", "feature": "class=\\\"loginTitleSub\\\">HPE Integrity rx2800", "is_equal": true }] }, { "name": "thttpd", "logic": "(a&&b&&c) || (d&&e&&f)", "rule": [{ "label": "a", "feature": "server: thttpd", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "drupal", "is_equal": false }, { "label": "d", "feature": "server: thttpd", "is_equal": true }, { "label": "e", "feature": "couchdb", "is_equal": false }, { "label": "f", "feature": "drupal", "is_equal": false }] }, { "name": "\u5929\u878d\u4fe1-\u516c\u53f8\u4ea7\u54c1", "logic": "(a&&b&&c) ||d||e||f||g", "rule": [{ "label": "a", "feature": "Server: TOPSEC", "is_equal": true }, { "label": "b", "feature": "couchdb", "is_equal": false }, { "label": "c", "feature": "content=\\\"JnSec Web UI\\\"", "is_equal": false }, { "label": "d", "feature": "Topsec Network Security Technology", "is_equal": true }, { "label": "e", "feature": "Server: topsecos", "is_equal": true }, { "label": "f", "feature": "Server: topsecos", "is_equal": true }, { "label": "g", "feature": "Beijing Topsec Network Security Technology Co.,Ltd", "is_equal": true }] }, { "name": "HUAWEI-Tecal-RH2288H", "logic": "a", "rule": [{ "label": "a", "feature": "Tecal-RH2288H", "is_equal": true }] }, { "name": "Inspur-NF5270M3", "logic": "a", "rule": [{ "label": "a", "feature": "NF5270M3", "is_equal": true }] }, { "name": "Inspur-NF5270M4", "logic": "a", "rule": [{ "label": "a", "feature": "NF5270M4", "is_equal": true }] }, { "name": "Inspur-NF5280M4", "logic": "a||b", "rule": [{ "label": "a", "feature": "NF5280M4", "is_equal": true }, { "label": "b", "feature": "NF5280M4", "is_equal": true }] }, { "name": "IBM-x3650", "logic": "a||b", "rule": [{ "label": "a", "feature": "IBM System x3650", "is_equal": true }, { "label": "b", "feature": "IBM System x3650", "is_equal": true }] }, { "name": "DELL-PowerEdge-R930", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R930", "is_equal": true }] }, { "name": "DELL-PowerEdge-T300", "logic": "a", "rule": [{ "label": "a", "feature": "POWEREDGE-T300", "is_equal": true }] }, { "name": "H3C-OfficeConnect", "logic": "a", "rule": [{ "label": "a", "feature": "3Com Router 3031", "is_equal": true }] }, { "name": "DELL-PowerEdge-1800", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-1800", "is_equal": true }, { "label": "b", "feature": "PowerEdge-1800", "is_equal": true }] }, { "name": "3Com-Router-3040", "logic": "a", "rule": [{ "label": "a", "feature": "3Com Router 3040", "is_equal": true }] }, { "name": "NSFOCUS-\u516c\u53f8\u4ea7\u54c1", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "Server: NSFOCUS", "is_equal": true }, { "label": "b", "feature": "Server: NSFOCUS", "is_equal": true }, { "label": "c", "feature": "couchdb", "is_equal": false }] }, { "name": "DB2-FTP", "logic": "a", "rule": [{ "label": "a", "feature": "db2 FTP server", "is_equal": true }] }, { "name": "IBM-WebSphere", "logic": "a||b||c|| (d&& (e||f) ) ||g", "rule": [{ "label": "a", "feature": "Server: WebSphere", "is_equal": true }, { "label": "b", "feature": "Server: WebSphere", "is_equal": true }, { "label": "c", "feature": "
    IBM WebSphere Application Server", "is_equal": true }, { "label": "d", "feature": "IBM HTTP Server", "is_equal": true }, { "label": "e", "feature": "websphere", "is_equal": true }, { "label": "f", "feature": "com.ibm.websphere.ihs.doc", "is_equal": true }, { "label": "g", "feature": "content=\\\"WebSphere Application Server", "is_equal": true }] }, { "name": "Rtsp-Server", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Rtsp Server", "is_equal": true }, { "label": "b", "feature": "Server: Rtsp Server", "is_equal": true }] }, { "name": "Windows-Management-Instrumentation\uff08WMI\uff09", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "Server: WMI v3", "is_equal": true }, { "label": "b", "feature": "Server: WMI v3", "is_equal": true }, { "label": "c", "feature": "Server: WMI v5", "is_equal": true }, { "label": "d", "feature": "Server: WMI v5", "is_equal": true }] }, { "name": "DELL-PowerEdge-4400", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge 4400", "is_equal": true }] }, { "name": "DELL-PowerEdge-2850", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge 2850", "is_equal": true }, { "label": "b", "feature": "PowerEdge 2850", "is_equal": true }] }, { "name": "Cisco-Codian Video Conference", "logic": "(a&&b) ||c||d||e||f||g", "rule": [{ "label": "a", "feature": "rtsp", "is_equal": true }, { "label": "b", "feature": "Server: Codian MCU ", "is_equal": true }, { "label": "c", "feature": "Codian IP ", "is_equal": true }, { "label": "d", "feature": "Codian ISDN ", "is_equal": true }, { "label": "e", "feature": "Codian MCU ", "is_equal": true }, { "label": "f", "feature": "Codian MCU", "is_equal": true }, { "label": "g", "feature": "Codian MSE ", "is_equal": true }] }, { "name": "DELL-PowerEdge-T100", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-T100", "is_equal": true }] }, { "name": "DELL-PowerEdge-SC1425", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-SC1425", "is_equal": true }, { "label": "b", "feature": "PowerEdge-SC1425", "is_equal": true }] }, { "name": "HP-DL380-GEN10", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL380-GEN10", "is_equal": true }, { "label": "b", "feature": "DL380-GEN10", "is_equal": true }] }, { "name": "HP-DL180-G6", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL180-G6", "is_equal": true }, { "label": "b", "feature": "DL180-G6", "is_equal": true }] }, { "name": "HP-ProLiant-MicroServer-Gen8", "logic": "a||b", "rule": [{ "label": "a", "feature": "PROLIANT-MICROSERVER-GEN8", "is_equal": true }, { "label": "b", "feature": "PROLIANT-MICROSERVER-GEN8", "is_equal": true }] }, { "name": "HP-ML30-GEN9", "logic": "a||b", "rule": [{ "label": "a", "feature": "ML30-GEN9", "is_equal": true }, { "label": "b", "feature": "ML30-GEN9", "is_equal": true }] }, { "name": "HP-DL380-G5", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL380-G5", "is_equal": true }, { "label": "b", "feature": "DL380-G5", "is_equal": true }] }, { "name": "HP-DL380-GEN9", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL380-GEN9", "is_equal": true }, { "label": "b", "feature": "DL380-GEN9", "is_equal": true }] }, { "name": "HP-DL380p-Gen8", "logic": "a", "rule": [{ "label": "a", "feature": "DL380p-Gen8", "is_equal": true }] }, { "name": "HP-ProLiant-ML350", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "PROLIANT-ML350", "is_equal": true }, { "label": "b", "feature": "PROLIANT-ML350", "is_equal": true }, { "label": "c", "feature": "PROLIANT-ML350", "is_equal": true }] }, { "name": "HP-ML310e-Gen8", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "ML310e-Gen8", "is_equal": true }, { "label": "b", "feature": "ML310e-Gen8", "is_equal": true }, { "label": "c", "feature": "ML310e-Gen8", "is_equal": true }] }, { "name": "FortiMail", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "FortiMail", "is_equal": true }, { "label": "b", "feature": "fortimail login", "is_equal": true }, { "label": "c", "feature": "FortiMail Server.", "is_equal": true }] }, { "name": "Cisco-meraki network equipment", "logic": "a|| ((b||c) &&d)", "rule": [{ "label": "a", "feature": "Meraki ", "is_equal": true }, { "label": "b", "feature": "alt=\\\"Cisco Meraki\\\" src=\\\"img/cisco-meraki.png\\\"", "is_equal": true }, { "label": "c", "feature": "src=\\\"images/cisco-meraki.png\\\"", "is_equal": true }, { "label": "d", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "H3C-switch", "logic": "(a&&b) ||c||d||e||f|| (g&&h&&i) ||j||k|| (l&&m) || (n&& (o||p)) || (q&&r) || (s&&t&&u)", "rule": [{ "label": "a", "feature": "snnp", "is_equal": true }, { "label": "b", "feature": "H3C S3600V2", "is_equal": true }, { "label": "c", "feature": "H3C S5500", "is_equal": true }, { "label": "d", "feature": "H3C S5500EI", "is_equal": true }, { "label": "e", "feature": "H3C S9508E", "is_equal": true }, { "label": "f", "feature": "H3C S5800", "is_equal": true }, { "label": "g", "feature": "Web user login", "is_equal": true }, { "label": "h", "feature": "nLanguageSupported", "is_equal": true }, { "label": "i", "feature": "Lanswitch", "is_equal": false }, { "label": "j", "feature": "H3C S5560-", "is_equal": true }, { "label": "k", "feature": "h3c httpd", "is_equal": true }, { "label": "l", "feature": "window.location = \\\"/wcn/banner?lang=", "is_equal": true }, { "label": "m", "feature": "style=\\\"background-color: #E1E9F5;\\\" onload=\\\"onBodyLoad()", "is_equal": true }, { "label": "n", "feature": "window.location = sLang + \\\"/login.html\\\";", "is_equal": true }, { "label": "o", "feature": "Switch", "is_equal": true }, { "label": "p", "feature": "Web user login", "is_equal": true }, { "label": "q", "feature": "window.location = \\\"en/login.html\\\";", "is_equal": true }, { "label": "r", "feature": "switch", "is_equal": true }, { "label": "s", "feature": "window.location = \\\"/web/device/login?lang=\\\"+sLang;", "is_equal": true }, { "label": "t", "feature": "Web user login", "is_equal": true }, { "label": "u", "feature": "

    Web\u7f51\u7ba1\u4e2d", "is_equal": true }] }, { "name": "Dell-EMC-DS switch", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "EMC DS-", "is_equal": true }] }, { "name": "HP-ML110-GEN9", "logic": "a||b", "rule": [{ "label": "a", "feature": "ML110-GEN9", "is_equal": true }, { "label": "b", "feature": "ML110-GEN9", "is_equal": true }] }, { "name": "HP-PROLIANT-ML35", "logic": "a", "rule": [{ "label": "a", "feature": "PROLIANT-ML35", "is_equal": true }] }, { "name": "HP-ML110-G5", "logic": "a||b", "rule": [{ "label": "a", "feature": "ML110-G5", "is_equal": true }, { "label": "b", "feature": "ML110-G5", "is_equal": true }] }, { "name": "HP-ML110-G7", "logic": "a||b", "rule": [{ "label": "a", "feature": "ML110-G7", "is_equal": true }, { "label": "b", "feature": "ML110-G7", "is_equal": true }] }, { "name": "ZLG-single chip microcomputer", "logic": "a||b", "rule": [{ "label": "a", "feature": "Zlgmcu Corporation", "is_equal": true }, { "label": "b", "feature": "Zlgmcu Corporation", "is_equal": true }] }, { "name": "Bosch-flexidome-ip-camera", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "FLEXIDOME IP", "is_equal": true }] }, { "name": "Bosch-dinion_ip camera", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "DINION IP", "is_equal": true }] }, { "name": "Lenovo-printer", "logic": "a|| (b&&c) ||d||e|| (f&&g)", "rule": [{ "label": "a", "feature": "Lenovo CS", "is_equal": true }, { "label": "b", "feature": "pjl", "is_equal": true }, { "label": "c", "feature": "Lenovo", "is_equal": true }, { "label": "d", "feature": "Lenovo CS2010DW", "is_equal": true }, { "label": "e", "feature": "Lenovo Network Printer", "is_equal": true }, { "label": "f", "feature": "PrintServer HomePage", "is_equal": true }, { "label": "g", "feature": "", "is_equal": true }] }, { "name": "Konica_Minolta-printer", "logic": "(a&&b) || ((c||d|| (e&&f) || (g&&h)) &&i)", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "KONICA MINOLTA ", "is_equal": true }, { "label": "c", "feature": "LPC Http Server", "is_equal": true }, { "label": "d", "feature": "KONICA MINOLTA", "is_equal": true }, { "label": "e", "feature": "vlink=\\\"#000000\\\" onload=\\\"location.replace('/wcd/index.html');\\\" >", "is_equal": true }, { "label": "f", "feature": "", "is_equal": true }, { "label": "g", "feature": "En", "is_equal": true }, { "label": "h", "feature": "", "is_equal": true }, { "label": "i", "feature": "Server: couchdb", "is_equal": false }] }, { "name": "HuaWei-S12708", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "S12708 ", "is_equal": true }, { "label": "b", "feature": "S12708", "is_equal": true }, { "label": "c", "feature": "Server: Huawei-S12708", "is_equal": true }, { "label": "d", "feature": "Server: Huawei-S12708", "is_equal": true }] }, { "name": "HuaWei-S5728C", "logic": "a||b", "rule": [{ "label": "a", "feature": "S5728C ", "is_equal": true }, { "label": "b", "feature": "S5728C ", "is_equal": true }] }, { "name": "HP-PROLIANT-ML10", "logic": "a||b", "rule": [{ "label": "a", "feature": "PROLIANT-ML10", "is_equal": true }, { "label": "b", "feature": "PROLIANT-ML10", "is_equal": true }] }, { "name": "HP-DL380-G7", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL380-G7", "is_equal": true }, { "label": "b", "feature": "DL380-G7", "is_equal": true }] }, { "name": "NETPOSA-PVG video system", "logic": "a||b|| (c&&d) ||e", "rule": [{ "label": "a", "feature": "\u4e1c\u65b9\u7f51\u529bPVG\u89c6\u9891\u7cfb\u7edf", "is_equal": true }, { "label": "b", "feature": "Power Video Gateway", "is_equal": true }, { "label": "c", "feature": "snmp", "is_equal": true }, { "label": "d", "feature": "PVG-IPSAN", "is_equal": true }, { "label": "e", "feature": "\u4e1c\u65b9\u7f51\u529bPVG_OCX_Demo", "is_equal": true }] }, { "name": "Netposa companies products", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "

    \u4e07\u89e3 - \u4e1c\u65b9\u7f51\u529b:

    ", "is_equal": true }, { "label": "b", "feature": "\u4e1c\u65b9\u7f51\u529b\u79d1\u6280\u80a1\u4efd\u6709\u9650\u516c\u53f8", "is_equal": true }, { "label": "c", "feature": "\u5173\u4e8e\u6211\u4eec", "is_equal": true }, { "label": "d", "feature": "\u4e1c\u65b9\u7f51\u529b\u79d1\u6280\u80a1\u4efd\u6709\u9650\u516c\u53f8", "is_equal": true }] }, { "name": "ISPY-video surveillance", "logic": "a", "rule": [{ "label": "a", "feature": "vipcam.cn login:", "is_equal": true }] }, { "name": "Visit Data - Company Products", "logic": "a", "rule": [{ "label": "a", "feature": "Subject: c=cn, st=Some-State, l=Beijing, o=WisData, cn=wisdata.com.cn", "is_equal": true }] }, { "name": "Huawei-camera", "logic": "a||b||c|| (d&&e) ||f||g", "rule": [{ "label": "a", "feature": "ou=Enterprise UC&C ProductLine Video Surveillance PDU", "is_equal": true }, { "label": "b", "feature": "o=Huawei, ou=Enterprise UC&C ProductLine, ou=Collaborative Applicantion PDU", "is_equal": true }, { "label": "c", "feature": "Huawei IPC", "is_equal": true }, { "label": "d", "feature": "o=Huawei", "is_equal": true }, { "label": "e", "feature": "cn=HUAWEI IPC", "is_equal": true }, { "label": "f", "feature": "HUAWEI SDC", "is_equal": true }, { "label": "g", "feature": "HoloSens SDC", "is_equal": true }] }, { "name": "HP-DL385-G7", "logic": "a", "rule": [{ "label": "a", "feature": "DL385-G7", "is_equal": true }] }, { "name": "HP-Compaq-ProLiant-5500", "logic": "a", "rule": [{ "label": "a", "feature": "ProLiant 5500", "is_equal": true }] }, { "name": "HP-DL380-G6", "logic": "a", "rule": [{ "label": "a", "feature": "DL380-G6", "is_equal": true }] }, { "name": "HP-DL360-G5", "logic": "a||b", "rule": [{ "label": "a", "feature": "DL360-G5", "is_equal": true }, { "label": "b", "feature": "DL360-G5", "is_equal": true }] }, { "name": "DELL-PowerEdge-R710", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R710", "is_equal": true }] }, { "name": "DELL-idrac-FCZXMW1", "logic": "a", "rule": [{ "label": "a", "feature": "var tmphn = \\\"idrac-FCZXMW1\\\"", "is_equal": true }] }, { "name": "DELL-PowerEdge-T430", "logic": "a||b||c||d", "rule": [{ "label": "a", "feature": "poweredge-t430", "is_equal": true }, { "label": "b", "feature": "poweredge-t430", "is_equal": true }, { "label": "c", "feature": "https://user-PowerEdge-T430:10000", "is_equal": true }, { "label": "d", "feature": "PowerEdge-T430", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R220", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "POWEREDGE-R220", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-R220", "is_equal": true }, { "label": "c", "feature": "POWEREDGE-R220", "is_equal": true }] }, { "name": "DELL-PowerEdge-R630", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R630", "is_equal": true }] }, { "name": "DELL-PowerEdge-R610", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R610", "is_equal": true }] }, { "name": "DELL-PowerEdge-400SC", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-400SC", "is_equal": true }, { "label": "b", "feature": "PowerEdge-400SC", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R510", "logic": "a||b", "rule": [{ "label": "a", "feature": "POWEREDGE-R510", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-R510", "is_equal": true }] }, { "name": "DELL-PowerEdge-2950", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-2950", "is_equal": true }, { "label": "b", "feature": "PowerEdge-2950", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R540", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "PowerEdge-R540", "is_equal": true }, { "label": "b", "feature": "PowerEdge-R540", "is_equal": true }, { "label": "c", "feature": "PowerEdge-R540", "is_equal": true }] }, { "name": "DELL-PowerEdge-2650", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge 2650", "is_equal": true }] }, { "name": "DELL-PowerEdge-2900", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-2900", "is_equal": true }] }, { "name": "DELL-PowerEdge-T105", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-T105", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R730XD", "logic": "a||b", "rule": [{ "label": "a", "feature": "POWEREDGE-R730XD", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-R730XD", "is_equal": true }] }, { "name": "DELL-PowerEdge-R200", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R200", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R300", "logic": "a", "rule": [{ "label": "a", "feature": "POWEREDGE-R300", "is_equal": true }] }, { "name": "DELL-PowerEdge-1950", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "PowerEdge-1950", "is_equal": true }, { "label": "b", "feature": "PowerEdge-1950", "is_equal": true }, { "label": "c", "feature": "POWEREDGE--1950/cgi-bin/sicweb.exe", "is_equal": true }] }, { "name": "DELL-poweredge-c6100", "logic": "a", "rule": [{ "label": "a", "feature": "poweredge-c6100", "is_equal": true }] }, { "name": "DELL-PowerEdge-T140", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-T140", "is_equal": true }] }, { "name": "DELL-PowerEdge-R530", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "PowerEdge-R530", "is_equal": true }, { "label": "b", "feature": "PowerEdge-R530", "is_equal": true }, { "label": "c", "feature": "PowerEdge-R530", "is_equal": true }] }, { "name": "DELL-PowerEdge-750", "logic": "a||b", "rule": [{ "label": "a", "feature": "poweredge-750", "is_equal": true }, { "label": "b", "feature": "poweredge-750", "is_equal": true }] }, { "name": "DELL-PowerEdge-R740xd", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R740xd", "is_equal": true }] }, { "name": "DELL-PowerEdge-R740", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R740", "is_equal": true }] }, { "name": "DELL-PowerEdge-T610", "logic": "a||b", "rule": [{ "label": "a", "feature": "PowerEdge-T610", "is_equal": true }, { "label": "b", "feature": "PowerEdge-T610", "is_equal": true }] }, { "name": "DELL-PowerEdge-R910", "logic": "a", "rule": [{ "label": "a", "feature": "PowerEdge-R910", "is_equal": true }] }, { "name": "DELL-POWEREDGE-R210", "logic": "a||b||c", "rule": [{ "label": "a", "feature": "POWEREDGE-R210", "is_equal": true }, { "label": "b", "feature": "POWEREDGE-R210", "is_equal": true }, { "label": "c", "feature": "poweredge-r210-ii

    Error

    403 - Directory browsing not allowed


    SMART-SOFT VCard HTTP/SSL server", "is_equal": true }, { "label": "d", "feature": "exception Directory%20browsing%20not%20allowed", "is_equal": true }] }, { "name": "SmarterMail", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "
    SmarterMail", "is_equal": true }, { "label": "b", "feature": "Login - SmarterMail", "is_equal": true }, { "label": "c", "feature": "UTC SmarterMail Enterprise", "is_equal": true }, { "label": "d", "feature": "SmarterMail Professional", "is_equal": true }, { "label": "e", "feature": "SmarterMail Pro", "is_equal": true }] }, { "name": "SmartCDS", "logic": "a||b||c||d||e||f", "rule": [{ "label": "a", "feature": "smartcds Version", "is_equal": true }, { "label": "b", "feature": "Server: smartcds", "is_equal": true }, { "label": "c", "feature": "X-SmartCDS-Error", "is_equal": true }, { "label": "d", "feature": "smartcds Version", "is_equal": true }, { "label": "e", "feature": "Server: smartcds", "is_equal": true }, { "label": "f", "feature": "X-SmartCDS-Error", "is_equal": true }] }, { "name": "SmartThumbs", "logic": "a", "rule": [{ "label": "a", "feature": "POWERED BY SMART THUMBS", "is_equal": true }] }, { "name": "SmarterStats", "logic": "a||b", "rule": [{ "label": "a", "feature": "Login - SmarterStats", "is_equal": true }, { "label": "b", "feature": "
    SmarterStats", "is_equal": true }] }, { "name": "Broadcom-brocade- switch", "logic": "a|| (b&&c)", "rule": [{ "label": "a", "feature": "/switchExplorer.html", "is_equal": true }, { "label": "b", "feature": "originalurl=\\\"/switchExplorer.html\\\"", "is_equal": true }, { "label": "c", "feature": "com.brocade.web.secsan.LoginApplet", "is_equal": true }] }, { "name": "Police wings - company products", "logic": "a", "rule": [{ "label": "a", "feature": "

    \u6280\u672f\u652f\u6301 \u6df1\u5733\u8b66\u7ffc\u6570\u7801\u79d1\u6280\u6709\u9650\u516c\u53f8", "is_equal": true }] }, { "name": "Avaya-Application-Enablement-Services", "logic": "a&&b", "rule": [{ "label": "a", "feature": "Application Enablement Services ", "is_equal": true }, { "label": "b", "feature": "avaya", "is_equal": true }] }, { "name": "Middle Complex Technology - Products", "logic": "a||b", "rule": [{ "label": "a", "feature": "Copyright(C) 2005-2009\u3000\u3000EmsysChina Co.,Ltd.", "is_equal": true }, { "label": "b", "feature": "", "is_equal": true }, { "label": "b", "feature": "index_title", "is_equal": true }, { "label": "c", "feature": "Huawei Integrated Access Software", "is_equal": true }] }, { "name": "HuaWei-VPP-EWS", "logic": "a||b", "rule": [{ "label": "a", "feature": "Server: Huawei VPP EWS", "is_equal": true }, { "label": "b", "feature": "Server: Huawei VPP EWS", "is_equal": true }] }, { "name": "AxNet-Video Monitoring", "logic": "a||b", "rule": [{ "label": "a", "feature": "clsid:4AADB758-F0B9-48DC-945B-F4C4F2ACCD42", "is_equal": true }, { "label": "b", "feature": "codebase=\\\"../axnet.cab", "is_equal": true }] }, { "name": "H3C-Comware", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "ssh", "is_equal": true }, { "label": "b", "feature": "COMWARE", "is_equal": true }, { "label": "c", "feature": "H3C Comware", "is_equal": true }] }, { "name": "armv5tejl", "logic": "a", "rule": [{ "label": "a", "feature": "armv5tejl", "is_equal": true }] }, { "name": "HP-UX products", "logic": "(a&&b) ||c", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "HP-UX", "is_equal": true }, { "label": "c", "feature": "HP-UX", "is_equal": true }] }, { "name": "Lorex-Video Monitoring", "logic": "a", "rule": [{ "label": "a", "feature": "href=\\\"/Lorex_webplugin.exe", "is_equal": true }] }, { "name": "Infortrend-Company Products", "logic": "a&&b", "rule": [{ "label": "a", "feature": "snmp", "is_equal": true }, { "label": "b", "feature": "Infortrend SNMP", "is_equal": true }] }, { "name": "VxWorks", "logic": "a", "rule": [{ "label": "a", "feature": "VxWorks", "is_equal": true }] }, { "name": "SugarCRM", "logic": "a||b||c||d||e", "rule": [{ "label": "a", "feature": "Support", "is_equal": true }, { "label": "b", "feature": "Powered By SugarCRM", "is_equal": true }, { "label": "c", "feature": "", "is_equal": true }] },{ "name": "长亭谛听蜜罐", "logic": "a", "rule": [{ "label": "a", "feature": "", "is_equal": true }] }] }] ================================================ FILE: backend/fingerprints/wappalyzer.json ================================================ { "apps": { "1C-Bitrix": { "cats": [ 1, 6 ], "cookies": { "bitrix_sm_guest_id": "", "bitrix_sm_last_ip": "", "bitrix_sm_sale_uid": "" }, "headers": { "set-cookie": "bitrix_", "x-powered-cms": "bitrix site manager" }, "scriptSrc": [ "bitrix(?:\\.info/|/js/main/core)" ], "implies": [ "PHP" ], "description": "1C-Bitrix is a system of web project management, universal software for the creation, support and successful development of corporate websites and online stores.", "website": "https://www.1c-bitrix.ru" }, "2B Advice": { "cats": [ 67 ], "js": [ "bbcookiecontroler" ], "scriptSrc": [ "2badvice-cdn\\.azureedge\\.net" ], "description": "2B Advice provides a plug-in to manage GDPR cookie consent.", "website": "https://www.2b-advice.com/en/data-privacy-software/cookie-consent-plugin/" }, "30namaPlayer": { "cats": [ 14 ], "description": "30namaPlayer is a modified version of Video.js to work with videos on HTML using javascript.", "website": "https://30nama.com/" }, "33Across": { "cats": [ 36 ], "js": [ "tynt" ], "scriptSrc": [ "\\.33across\\.com/", "\\.tynt\\.com/" ], "description": "33Across is a technology company focused on solving the challenge of consumer attention for automated advertising.", "website": "https://www.33across.com" }, "34SP.com": { "cats": [ 88 ], "description": "34SP.com specialises in website hosting, discount domain names, low cost VPS servers and dedicated servers.", "website": "https://www.34sp.com" }, "4-Tell": { "cats": [ 76 ], "cookies": { "4tell": "", "4tellcart": "", "4tellsession": "" }, "js": [ "_4tellboost" ], "scriptSrc": [ "4tellcdn\\.azureedge\\.net" ], "description": "4-Tell is an ecommerce software company for retailers with AI-powered personalisation and recommendations products.", "website": "https://4-tell.com" }, "42stores": { "cats": [ 6 ], "headers": { "powered-by": "^42stores$" }, "description": "42stores is a French SaaS ecommerce solution that was established in 2008. It offers a range of features such as monitoring, customer support, and regular updates. The platform is known for its flexibility and modularity, making it possible to integrate with various ERP systems.", "website": "https://www.42stores.com" }, "51.LA": { "cats": [ 10 ], "js": [ "la.config.ck" ], "description": "51.LA is a Chinese based website visitor counter.", "website": "https://www.51.la" }, "5centsCDN": { "cats": [ 31 ], "headers": { "x-cdn": "^5centscdn$" }, "scriptSrc": [ "\\.5centscdn\\.com/" ], "description": "5centsCDN is a content delivery networks service provider.", "website": "https://www.5centscdn.net" }, "6sense": { "cats": [ 32, 76 ], "headers": { "content-security-policy": "\\.6sc\\.co/" }, "scriptSrc": [ "\\.6sc\\.co/" ], "description": "6sense is a B2B predictive intelligence platform for marketing and sales.", "website": "https://6sense.com" }, "8base": { "cats": [ 3, 62 ], "description": "8base is a low-code development platform for building and running enterprise-grade digital products including SaaS solutions, marketplaces and other go-to-market applications.", "website": "https://8base.com" }, "\u003cmodel-viewer\u003e": { "cats": [ 105 ], "scriptSrc": [ "/model-viewer/dist/model-viewer\\.min\\.js" ], "description": "\u003cmodel-viewer\u003e is an open-source web component developed by Google and maintained through GitHub. \u003cmodel-viewer\u003e aims at putting 3D content on the web easily with a few lines of HTML code. This was first introduced with Chrome 72 in July 2019 and enables users to view 3D in the browser and mobile devices.", "website": "https://modelviewer.dev" }, "@sulu/web": { "cats": [ 59 ], "js": [ "web.startcomponents" ], "website": "https://github.com/sulu/web-js" }, "A-Frame": { "cats": [ 25 ], "js": [ "aframe.version" ], "html": [ "\u003ca-scene[^\u003c\u003e]*\u003e" ], "scriptSrc": [ "/?([\\d.]+)?/aframe(?:\\.min)?\\.js\\;version:\\1" ], "implies": [ "Three.js" ], "website": "https://aframe.io" }, "A8.net": { "cats": [ 71 ], "js": [ "a8sales", "a8salescookierepository", "map_a8" ], "scriptSrc": [ "statics\\.a8\\.net" ], "description": " A8.net is an affiliate marketing network.", "website": "https://www.a8.net" }, "AB Tasty": { "cats": [ 74 ], "js": [ "_abtasty", "abtasty", "loadabtasty" ], "scriptSrc": [ "try\\.abtasty\\.com" ], "description": "AB Tasty is a customer experience optimisation company. AB Tasty offers AI-driven experimentation, personalisation, and product optimisation platforms for user testing.", "website": "https://www.abtasty.com" }, "ABOUT YOU Commerce Suite": { "cats": [ 6 ], "description": "ABOUT YOU Commerce Suite is an enterprise ready infrastructure solution designed for ecommerce companies.", "website": "https://commercesuite.aboutyou.com" }, "ABP Framework": { "cats": [ 18 ], "js": [ "abp.timing.timezone", "abp.version" ], "implies": [ "Microsoft ASP.NET" ], "description": "ABP Framework is a complete infrastructure to create modern web applications by following the best practices and conventions of software development.", "website": "https://abp.io/" }, "AD EBiS": { "cats": [ 36, 32 ], "js": [ "ebis.c.pageurl" ], "scriptSrc": [ "\\.ebis\\.ne\\.jp/" ], "description": "AD EBiS is an advertising and marketing platform that offers advertisement effectiveness measurement, access and user analysis.", "website": "https://www.ebis.ne.jp" }, "ADAPT": { "cats": [ 6 ], "meta": { "image": [ "assets\\.adapt\\.ws/" ] }, "description": "ADAPT is a subscription-based app that allows anyone to create video focused online store in minutes on their phone.", "website": "https://adapt.ws" }, "ADFOX": { "cats": [ 36 ], "js": [ "adfox_getcodescript", "adfoxasyncparams", "adfoxbiddersmap", "adfoxparams", "site.adfoxparams" ], "description": "ADFOX is an advertising management platform for media publishers.", "website": "https://adfox.yandex.ru" }, "AFThemes CoverNews": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/covernews(?:-pro)?/" ], "description": "AFThemes CoverNews is a clean and elegant free WordPress theme that is perfect for online blog and magazine.", "website": "https://afthemes.com/products/covernews" }, "ALL-INKL": { "cats": [ 88 ], "description": "ALL-INKL is a German-based web hosting provider that promises to offer high-performance services for fair prices.", "website": "https://all-inkl.com" }, "AMP": { "cats": [ 12 ], "html": [ "\u003chtml[^\u003e]* (?:amp|⚡)[^-]", "\u003clink rel=\"amphtml\"" ], "description": "AMP, originally created by Google, is an open-source HTML framework developed by the AMP open-source Project. AMP is designed to help webpages load faster.", "website": "https://www.amp.dev" }, "AMP for WordPress": { "cats": [ 87 ], "meta": { "generator": [ "^amp plugin v(\\d+\\.\\d+.*)$\\;version:\\1" ] }, "implies": [ "AMP" ], "description": "AMP for WordPress automatically adds Accelerated Mobile Pages (Google AMP Project) functionality to your WordPress site.", "website": "https://amp-wp.org" }, "AOLserver": { "cats": [ 22 ], "headers": { "server": "aolserver/?([\\d.]+)?\\;version:\\1" }, "website": "https://aolserver.com", "cpe": "cpe:2.3:a:aol:aolserver:*:*:*:*:*:*:*:*" }, "AOS": { "cats": [ 59 ], "js": [ "aos.init", "aos.refresh", "aos.refreshhard" ], "scriptSrc": [ "/typo3conf/ext/udem_vendor/resources/public/aos-([\\d\\.]+)\\;version:\\1", "unpkg\\.com/aos@([\\d\\.]+)/dist/aos\\.js\\;version:\\1" ], "description": "JavaScript library to animate elements on your page as you scroll.", "website": "https://michalsnik.github.io/aos/" }, "APC": { "cats": [ 99 ], "description": "APC offers door-to-door parcel and mail delivery.", "website": "https://www.apc-pli.com" }, "ARI Network Services": { "cats": [ 6 ], "scriptSrc": [ "\\.ari-secure\\.com/" ], "description": "ARI Network Services provides website, software, and data solutions to help dealers, distributors, and OEMs improve their selling process.", "website": "https://arinet.com" }, "ASP.NET Boilerplate": { "cats": [ 18 ], "js": [ "abp.aspnetboilerplate.version", "abp.timing.utcclockprovider" ], "implies": [ "Microsoft ASP.NET" ], "description": "ASP.NET Boilerplate is a general purpose application framework especially designed for new modern web applications. It uses already familiar tools and implements best practices around them to provide you a SOLID development experience.", "website": "https://www.aspnetboilerplate.com" }, "AT Internet Analyzer": { "cats": [ 10 ], "js": [ "atinternet", "xtsite" ], "website": "https://atinternet.com/en" }, "AT Internet XiTi": { "cats": [ 10 ], "js": [ "xt_click" ], "scriptSrc": [ "xiti\\.com/hit\\.xiti" ], "website": "https://atinternet.com/en" }, "ATSHOP": { "cats": [ 6 ], "scriptSrc": [ "\\.atshop\\.io" ], "description": "ATSHOP is an all-in-one ecommerce platform.", "website": "https://atshop.io" }, "AWIN": { "cats": [ 71 ], "cookies": { "_aw_xid": "", "bagawin": "" }, "js": [ "awin.tracking" ], "scriptSrc": [ "dwin1\\.com" ], "description": "AWIN is a global affiliate marketing network.", "website": "https://www.awin.com" }, "AWS Certificate Manager": { "cats": [ 70 ], "implies": [ "Amazon Web Services" ], "description": "AWS Certificate Manager is a service that lets you easily provision, manage, and deploy public and private Secure Sockets Layer/Transport Layer Security (SSL/TLS) certificates for use with AWS services and your internal connected resources.", "website": "https://aws.amazon.com/certificate-manager/" }, "AWS WAF Captcha": { "cats": [ 16 ], "headers": { "x-amzn-waf-action": "^captcha$" }, "scriptSrc": [ "captcha\\.awswaf\\.com/" ], "implies": [ "Amazon Web Services" ], "description": "AWS WAF Captcha helps block unwanted bot traffic by requiring users to successfully complete challenges before their web request are allowed to reach AWS WAF protected resources.", "website": "https://docs.aws.amazon.com/waf/latest/developerguide/waf-captcha.html" }, "AWStats": { "cats": [ 10 ], "meta": { "generator": [ "awstats ([\\d.]+(?: \\(build [\\d.]+\\))?)\\;version:\\1" ] }, "implies": [ "Perl" ], "website": "https://awstats.sourceforge.net", "cpe": "cpe:2.3:a:laurent_destailleur:awstats:*:*:*:*:*:*:*:*" }, "AbhiCMS": { "cats": [ 1 ], "meta": { "generator": [ "abhicms\\s([\\d\\.]+)\\;version:\\1" ] }, "implies": [ "MySQL", "PHP" ], "description": "AbhiCMS is a lesser-known content management system that may not have a significant user base or active development community.", "website": "https://website999.org" }, "Abicart": { "cats": [ 6 ], "meta": { "generator": [ "abicart", "textalk webshop" ] }, "description": "Abicart is an ecommerce platform developed by the Swedish company Abicart AB.", "website": "https://abicart.com/" }, "Absorb": { "cats": [ 21 ], "cookies": { "_absorb_ui_session": "" }, "js": [ "absorblms" ], "description": "Absorb is a cloud-based learning management system.", "website": "https://www.absorblms.com" }, "Accentuate Custom Fields": { "cats": [ 100 ], "scripts": [ "\\.accentuate\\.io/" ], "description": "Accentuate Custom Fields is the professional and de facto solution to easily extend your Shopify store with your own custom fields such multi-language text fields, images, checkboxes, dates, selection list and custom JSON objects.", "website": "https://www.accentuate.io" }, "AccessTrade": { "cats": [ 71 ], "scriptSrc": [ "accesstrade\\.net/js/", "click\\.accesstra\\.de/js/nct/lp\\.js" ], "description": "AccessTrade is an affiliate marketing platform based on the CPA model developed by Interspace Co.", "website": "https://accesstrade.global/" }, "AccessiBe": { "cats": [ 68 ], "js": [ "acsb", "acsbjs" ], "scriptSrc": [ "acsbapp?\\.com/.*/acsb\\.js" ], "description": "AccessiBe is an accessibility overlay which claims to provide ADA and WCAG compliance. The system scans and analyzes a website, and applies adjustments which they claim make your website ADA and WCAG 2.1 compliant.", "website": "https://accessibe.com" }, "Accessibility Toolbar Plugin": { "cats": [ 68 ], "js": [ "micaccesstool.prototype.opencloseboxkeyboard" ], "description": "Accessibility Toolbar Plugin is an accessibility component without dependencies (clean javascript), including a variety of tools.", "website": "https://webworks.ga/acc_toolbar" }, "Accessible360": { "cats": [ 68 ], "scriptSrc": [ "/accessible360/accessible-slick/slick/slick\\.min\\.js\\?v=([\\d\\.]+)\\;version:\\1", "/npm/@accessible360/accessible-slick@([\\d\\.]+)/\\;version:\\1" ], "description": "Accessible360 is a web accessibility company based in Edina, Minnesota.", "website": "https://accessible360.com" }, "Accessibly": { "cats": [ 68 ], "js": [ "accessibilitywidget.name" ], "scriptSrc": [ "accessibly\\.onthemapmarketing\\.com" ], "description": "Accessibly is an app which is designed to assist with meeting certain requirements of WCAG 2.1 using an overlay solution.", "website": "https://www.onthemapmarketing.com/accessibly/" }, "Accesso": { "cats": [ 6, 72 ], "js": [ "accesso" ], "scriptSrc": [ "/embed/accesso\\.js" ], "description": "Accesso provides ticketing, ecommerce and Point-of-Sale (PoS) solutions.", "website": "https://accesso.com/" }, "Acconsento.click": { "cats": [ 67 ], "js": [ "acconsentoapi", "acconsentocreateelement" ], "description": "Acconsento.click is a software solution designed to assist users in achieving cookie policy compliance for their websites.", "website": "https://shop.acconsento.click" }, "AccuWeather": { "cats": [ 5 ], "description": "AccuWeather provides weather forecasts and warnings and additional weather products and services.", "website": "https://partners.accuweather.com" }, "Ace": { "cats": [ 24 ], "js": [ "ace.editor", "ace.editsession", "ace.version" ], "description": "Ace is an embeddable code editor written in JavaScript.", "website": "https://github.com/ajaxorg/ace" }, "Ackee": { "cats": [ 10 ], "js": [ "ackeetracker" ], "description": "Ackee is a self-hosted, Node.js based analytics tool with a focus on privacy.", "website": "https://ackee.electerious.com" }, "Acoustic Experience Analytics": { "cats": [ 10 ], "js": [ "tealeaf", "tlt.config.core.modules.tlcookie", "tlt_version" ], "description": "Acoustic Experience Analytics (Tealeaf), formerly known as IBM Tealeaf Customer Experience on Cloud, is a SaaS-based analytics solution that delivers Tealeaf core capabilities in an managed cloud environment. Tealeaf captures and manages each visitor interaction on your website and mobile applications.", "website": "https://acoustic.com/tealeaf" }, "Acquia Campaign Factory": { "cats": [ 32 ], "scriptSrc": [ "maestro\\.mautic\\.com", "mautic\\.net" ], "implies": [ "Mautic" ], "description": "Acquia Campaign Factory is centralized marketing management system powered by Mautic.", "website": "https://www.acquia.com/products/marketing-cloud/campaign-factory" }, "Acquia Cloud IDE": { "cats": [ 47 ], "scriptSrc": [ "https?:\\/\\/.+\\.web\\.ahdev\\.cloud" ], "implies": [ "Acquia Cloud Platform" ], "description": "Acquia Cloud IDE is a browser-based source code editor and a Drupal development stack running on the Acquia Cloud Platform.", "website": "https://www.acquia.com/products/drupal-cloud/cloud-ide" }, "Acquia Cloud Platform": { "cats": [ 62 ], "headers": { "x-ah-environment": "^(next)?.*$\\;version:\\1?next:" }, "implies": [ "Amazon Web Services" ], "description": "Acquia Cloud Platform is a Drupal-tuned application lifecycle management suite with an infrastructure to support Drupal deployment workflow processes.", "website": "https://www.acquia.com/products/drupal-cloud/cloud-platform" }, "Acquia Cloud Platform CDN": { "cats": [ 31 ], "headers": { "via": "acquia platform cdn (.+)\\;version:\\1" }, "implies": [ "Acquia Cloud Platform" ], "website": "https://docs.acquia.com/cloud-platform/platformcdn/" }, "Acquia Cloud Site Factory": { "cats": [ 88 ], "scriptSrc": [ "sites\\/g\\/files" ], "implies": [ "Acquia Cloud Platform", "Drupal Multisite" ], "description": "Acquia Site Factory is a multisite platform for Drupal.", "website": "https://www.acquia.com/products/drupal-cloud/site-factory" }, "Acquia Content Hub": { "cats": [ 19 ], "headers": { "content-security-policy": "content-hub\\.acquia\\.com" }, "scriptSrc": [ "content-hub\\.acquia\\.com" ], "implies": [ "Acquia Cloud Platform" ], "description": "Acquia Content Hub is a cloud-based, centralized content distribution and syndication service.", "website": "https://www.acquia.com/products/drupal-cloud/content-hub" }, "Acquia Customer Data Platform": { "cats": [ 97 ], "js": [ "$a1", "$a1config", "agiloneobject" ], "scriptSrc": [ "^https?:\\/\\/.+\\.agilone\\.com", "^https?:\\/\\/scripts\\.agilone\\.com\\/latest\\/a1.js" ], "description": "Acquia Customer Data Platform (formerly AgilOne) is a customer data platform for Drupal.", "website": "https://www.acquia.com/products/marketing-cloud/customer-data-platform" }, "Acquia Personalization": { "cats": [ 10, 76 ], "js": [ "_tcaq", "acquialift" ], "scriptSrc": [ "lift\\.acquia\\.com" ], "implies": [ "Acquia Cloud Platform\\;confidence:95" ], "description": "Acquia Personalization (formerly Acquia Lift) lets you track customers' behavior throughout your website.", "website": "https://www.acquia.com/products/marketing-cloud/personalization" }, "Acquia Site Studio": { "cats": [ 51 ], "scriptSrc": [ "sites/\\w*/files/cohesion" ], "implies": [ "Acquia Cloud Platform" ], "description": "Site Studio (formerly Cohesion) is a low-code, Drupal add-on page builder.", "website": "https://www.acquia.com/products/drupal-cloud/site-studio" }, "Acquire Cobrowse": { "cats": [ 19, 103 ], "js": [ "acquirecobrowsertc", "acquirecobrowsesettings", "acquireconfignodeserver" ], "scriptSrc": [ "\\.acquire\\.io/cobrowse/" ], "description": "Acquire Cobrowse is a safe and secure method of interacting with a customer's browser without downloading any additional software.", "website": "https://acquire.io/co-browsing" }, "Acquire Live Chat": { "cats": [ 52 ], "js": [ "_acquire_init_config", "acquire" ], "scriptSrc": [ "\\.acquire\\.io/(?!cobrowse)" ], "description": "Acquire is a multi-channel customer support platform designed to provide real-time customer support to customers.", "website": "https://acquire.io" }, "Act-On": { "cats": [ 32 ], "js": [ "acton" ], "scriptSrc": [ "/cdnr/\\d+/acton/bn/tracker/\\d+" ], "description": "Act-On is a cloud-based SaaS product for marketing automation.", "website": "https://act-on.com" }, "ActBlue": { "cats": [ 111 ], "js": [ "actblue.__configuration" ], "description": "ActBlue is an online fundraising platform that facilitates secure donations to Democratic candidates and progressive causes, streamlining the process of processing and distributing campaign contributions.", "website": "https://secure.actblue.com" }, "Actito": { "cats": [ 32, 76 ], "cookies": { "smartfocus": "" }, "js": [ "_actgoal", "smartfocus" ], "scriptSrc": [ "\\.advisor\\.smartfocus\\.com", "cdn\\.actito\\.be" ], "description": "Actito is an agile SaaS marketing automation platform.", "website": "https://www.actito.com" }, "ActiveCampaign": { "cats": [ 32, 75 ], "js": [ "acenabletracking" ], "scriptSrc": [ "\\.ac-page\\.com", "\\.activehosted\\.com", "\\.app-us1\\.com", "plugins/activecampaign-subscription-forms/site_tracking\\.js" ], "description": "ActiveCampaign is email and marketing automation software.", "website": "https://www.activecampaign.com" }, "Acuity Scheduling": { "cats": [ 72 ], "js": [ "acuity_modal_init" ], "scriptSrc": [ "\\.acuityscheduling\\.com" ], "description": "Acuity Scheduling is a cloud-based appointment scheduling software solution.", "website": "https://acuityscheduling.com" }, "AcuityAds": { "cats": [ 36 ], "js": [ "acuityadseventqueue", "acuityadspixelkey" ], "headers": { "content-security-policy": "\\.acuityplatform\\.com" }, "description": "AcuityAds offers automatic solutions to marketers willing to connect through clients across mobile, social, and online display advertising campaigns.", "website": "https://www.acuityads.com" }, "Ad Lightning": { "cats": [ 36 ], "scriptSrc": [ "\\.adlightning\\.com" ], "description": "Ad Lightning is an programmatic ads monitoring and audit service.", "website": "https://www.adlightning.com" }, "AdBridg": { "cats": [ 36 ], "js": [ "adbridg.cmd" ], "description": "AdBridg is a bidding solutions provider for publishers looking to maximize their programmatic revenues.", "website": "https://www.adbridg.com" }, "AdInfinity": { "cats": [ 36 ], "scriptSrc": [ "adinfinity\\.com\\.au" ], "website": "https://adinfinity.com.au" }, "AdOcean": { "cats": [ 36 ], "js": [ "ado.master", "ado.placement", "ado.slave" ], "scriptSrc": [ "adocean\\.pl/files/js/ado\\.js", "adocean\\.pl\\;confidence:80" ], "implies": [ "Gemius" ], "website": "https://adocean-global.com" }, "AdOpt": { "cats": [ 67 ], "js": [ "adopt_website_code", "adoptapp.domain" ], "scriptSrc": [ "tag\\.goadopt\\.io/" ], "implies": [ "Svelte" ], "description": "AdOpt is a consent tool that prioritises privacy and usability towards the LGPD.", "website": "https://goadopt.io" }, "AdRecover": { "cats": [ 36 ], "js": [ "adrecover.ap" ], "description": "AdRecover is a tool that helps online publishers monetise their Adblock inventory.", "website": "https://www.adrecover.com" }, "AdRiver": { "cats": [ 36 ], "js": [ "adfoxbiddersmap.adriver", "adriver", "adrivercounter", "adriverprebid" ], "scriptSrc": [ "\\.adriver\\.ru/" ], "description": "AdRiver is a company which provide internet advertising management and audit software.", "website": "https://adriver.ru" }, "AdRoll": { "cats": [ 36, 77 ], "js": [ "adroll_adv_id", "adroll_pix_id", "adroll_version" ], "scriptSrc": [ "(?:a|s)\\.adroll\\.com" ], "description": "AdRoll is a digital marketing technology platform that specializes in retargeting.", "website": "https://adroll.com" }, "AdRoll CMP System": { "cats": [ 67 ], "js": [ "__adroll_consent", "__adroll_consent_is_gdpr" ], "description": "AdRoll CMP System is a consent management solution.", "website": "https://www.adroll.com/features/consent-management" }, "AdScale": { "cats": [ 36 ], "js": [ "_adscale", "adscaleaddtocart", "adscaleviewproduct" ], "scriptSrc": [ "\\.adscale\\.com/" ], "description": "AdScale is a cloud-based, AI-powered performance optimisation platform which utilises machine learning to automate and optimise AdWords campaigns across Google Search, Google Shopping, Google Display, and YouTube.", "website": "https://www.adscale.com" }, "AdThrive": { "cats": [ 36 ], "js": [ "adthrive", "adthrivevideosinjected" ], "scriptSrc": [ "ads\\.adthrive\\.com" ], "description": "AdThrive is an online advertising network aka ad provider for bloggers for blog monetisation.", "website": "https://www.adthrive.com" }, "Ada": { "cats": [ 52 ], "js": [ "__adaembedconstructor", "adaembed" ], "scriptSrc": [ "\\.ada\\.support" ], "description": "Ada is an automated customer experience company that provides chat bots used in customer support.", "website": "https://www.ada.cx" }, "AdaSiteCompliance": { "cats": [ 68 ], "js": [ "adaschelper", "adastoolboxappstate" ], "description": "AdaSiteCompliance is a web accessibility solution, making websites compliant and accessible to WCAG 2.1 and section 508 compliance standards.", "website": "https://adasitecompliance.com" }, "Adabra": { "cats": [ 32 ], "js": [ "adabra_version_panel", "adabra_version_track", "adabrapreview" ], "scriptSrc": [ "track\\.adabra\\.com" ], "description": "Adabra is a SaaS omnichannel marketing automation platform to help boost sales. Adabra allows you to manage user segmentation, create workflow and campaigns through email, social, SMS and more.", "website": "https://www.adabra.com" }, "Adally": { "cats": [ 68 ], "scriptSrc": [ "cloudfront\\.net/.*/adally\\.js" ], "website": "https://adally.com/" }, "Adalyser": { "cats": [ 36 ], "js": [ "adalysermodules" ], "scriptSrc": [ "c5\\.adalyser\\.com" ], "description": "Adalyser is an online platform offering the tools needed to get up and running with TV advertising.", "website": "https://adalyser.com/" }, "Adcash": { "cats": [ 36 ], "js": [ "ac_bgclick_url", "ct_nopp", "ct_nsuurl", "ct_siteunder", "ct_tag", "suloaded", "suurl" ], "scriptSrc": [ "^[^\\/]*//(?:[^\\/]+\\.)?adcash\\.com/(?:script|ad)/" ], "website": "https://adcash.com" }, "AddEvent": { "cats": [ 72 ], "scriptSrc": [ "//addevent\\.com/" ], "description": "AddEvent is used to Add to Calendar and event tools for websites and newsletters.", "website": "https://www.addevent.com" }, "AddShoppers": { "cats": [ 5, 10 ], "scriptSrc": [ "(?:cdn\\.)?shop\\.pe/widget/" ], "description": "AddShoppers is the social media marketing command center for small-medium online retailers.", "website": "https://www.addshoppers.com" }, "AddThis": { "cats": [ 5 ], "js": [ "addthis" ], "scriptSrc": [ "addthis\\.com/js/" ], "description": "AddThis is a social bookmarking service that can be integrated into a website with the use of a web widget.", "website": "https://www.addthis.com" }, "AddToAny": { "cats": [ 5 ], "js": [ "a2apage_init" ], "scriptSrc": [ "addtoany\\.com/menu/page\\.js" ], "description": "AddToAny is a universal sharing platform that can be integrated into a website by use of a web widget or plugin.", "website": "https://www.addtoany.com" }, "AddToAny Share Buttons": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/add-to-any/addtoany\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "AddToAny" ], "description": "AddToAny Share Buttons plugin for WordPress increases traffic and engagement by helping people share your posts and pages to any service.", "website": "https://github.com/projectestac/wordpress-add-to-any" }, "Addi": { "cats": [ 91 ], "scriptSrc": [ "s3\\.amazonaws\\.com/widgets\\.addi\\.com/bundle\\.min\\.js" ], "description": "Addi is a service that allows users to make purchases and pay for them in installments over time", "website": "https://co.addi.com/" }, "Addsearch": { "cats": [ 29 ], "js": [ "addsearchclient", "addsearchui" ], "scriptSrc": [ "//addsearch\\.com/js/" ], "description": "Addsearch is a site search solution for small and large websites.", "website": "https://www.addsearch.com/" }, "Adform": { "cats": [ 36 ], "scriptSrc": [ "\\.adform\\.net/" ], "description": "Adform is an all-in-one platform for digital advertising.", "website": "https://site.adform.com" }, "Adjust": { "cats": [ 10 ], "js": [ "adjust.initsdk" ], "description": "Adjust is the mobile marketing analytics platform.", "website": "https://www.adjust.com" }, "Adloox": { "cats": [ 36 ], "scriptSrc": [ "\\.adlooxtracking\\.com/" ], "description": "Adloox is a European-born buy-side ad verification and insights company.", "website": "https://www.adloox.com" }, "Adminer": { "cats": [ 3 ], "html": [ "adminer\u003c/a\u003e \u003cspan class=\"version\"\u003e([\\d.]+)\u003c/span\u003e\\;version:\\1", "onclick=\"bodyclick\\(event\\);\" onload=\"verifyversion\\('([\\d.]+)'\\);\"\u003e\\;version:\\1" ], "implies": [ "PHP" ], "website": "https://www.adminer.org", "cpe": "cpe:2.3:a:adminer:adminer:*:*:*:*:*:*:*:*" }, "Admiral": { "cats": [ 19 ], "js": [ "admiral" ], "scripts": [ "admiral(?:-engaged|:enabled)" ], "description": "Admiral is a Visitor Relationship Management (VRM) platform.", "website": "https://www.getadmiral.com" }, "Admitad": { "cats": [ 71 ], "js": [ "admitad", "admitad" ], "scriptSrc": [ "artfut\\.com/static/(?:tracking|crossdevice)\\.min\\.js", "cdn\\.admitad\\.com" ], "description": "Admitad is an affiliate network that acts as an intermediary between advertisers and publishers.", "website": "https://www.admitad.com" }, "Admixer": { "cats": [ 36 ], "js": [ "admixerads", "admixerml" ], "scriptSrc": [ "\\.admixer\\.net/" ], "description": "Admixer is an independent adtech company developing an ecosystem of full-stack programmatic solutions.", "website": "https://admixer.com" }, "Admo.tv": { "cats": [ 36 ], "js": [ "admo_config", "admo_tt" ], "description": "Admo.tv is a company developing a TV and radio analytics platform.", "website": "https://www.admo.tv" }, "Adnegah": { "cats": [ 36 ], "headers": { "x-advertising-by": "adnegah\\.net" }, "scriptSrc": [ "\\.adnegah\\.net/" ], "description": "Adnegah is a digital marketing and internet advertising agency.", "website": "https://adnegah.net" }, "Adobe Analytics": { "cats": [ 10 ], "js": [ "s_c_il.0._c", "s_c_il.0.constructor.name", "s_c_il.1._c", "s_c_il.1.constructor.name", "s_c_il.2._c", "s_c_il.2.constructor.name", "s_c_il.3._c", "s_c_il.3.constructor.name", "s_c_il.4._c", "s_c_il.4.constructor.name", "s_c_il.5._c", "s_c_il.5.constructor.name" ], "description": "Adobe Analytics is a web analytics, marketing and cross-channel analytics application.", "website": "https://www.adobe.com/analytics/adobe-analytics.html" }, "Adobe Audience Manager": { "cats": [ 86 ], "cookies": { "aam_uuid": "", "demdex": "" }, "description": "Adobe Audience Manager is a versatile audience data management platform.", "website": "https://business.adobe.com/products/audience-manager/adobe-audience-manager.html" }, "Adobe Client Data Layer": { "cats": [ 12 ], "js": [ "adobedatalayer.version" ], "description": "Adobe Client Data Layer is a framework of JavaScript objects on your site that contains all variable values used in your implementation.", "website": "https://github.com/adobe/adobe-client-data-layer" }, "Adobe ColdFusion": { "cats": [ 18 ], "js": [ "_cfemails" ], "headers": { "cookie": "cftoken=" }, "html": [ "\u003c!-- start headertags\\.cfm" ], "scriptSrc": [ "/cfajax/" ], "implies": [ "CFML" ], "website": "https://adobe.com/products/coldfusion-family.html", "cpe": "cpe:2.3:a:adobe:coldfusion:*:*:*:*:*:*:*:*" }, "Adobe DTM": { "cats": [ 42 ], "js": [ "_satellite.builddate" ], "description": "Dynamic Tag Management (DTM) is a tag management solution for Adobe Experience Cloud applications and others.", "website": "https://marketing.adobe.com/resources/help/en_US/dtm/c_overview.html" }, "Adobe Dynamic Media Classic": { "cats": [ 95 ], "headers": { "content-security-policy": "\\.scene7\\.com" }, "description": "Adobe Dynamic Media Classic is a platform that enables customers to manage, enhance, publish, and deliver dynamic rich media content and personal experiences to consumers across all channels and devices, including web, print material, email campaigns, desktops, social, and mobile.", "website": "https://business.adobe.com/uk/products/experience-manager/scene7-login.html" }, "Adobe Experience Manager": { "cats": [ 1 ], "html": [ "\u003cdiv class=\"[^\"]*aem-grid", "\u003cdiv class=\"[^\"]*parbase", "\u003cdiv[^\u003e]+data-component-path=\"[^\"+]jcr:" ], "scripts": [ "aem-(?:gridcolumn|apps/)" ], "scriptSrc": [ "/etc/clientlibs/", "/etc/designs/", "/etc\\.clientlibs/" ], "implies": [ "Java" ], "description": "Adobe Experience Manager (AEM) is a content management solution for building websites, mobile apps and forms.", "website": "https://www.adobe.com/marketing/experience-manager.html", "cpe": "cpe:2.3:a:adobe:experience_manager:*:*:*:*:*:*:*:*" }, "Adobe Experience Manager Franklin": { "cats": [ 1 ], "scriptSrc": [ "^.+/scripts/lib-franklin\\.js$" ], "description": "Adobe Experience Manager Franklin, also known as Project Helix or Composability, is a new way to publish AEM pages using Google Drive or Microsoft Office via Sharepoint. Instead of components, Franklin uses blocks to build pages. Blocks are pieces of a document that will be transformed into web page content.", "website": "https://www.hlx.live", "cpe": "cpe:2.3:a:adobe:experience_manager:*:*:*:*:*:*:*:*" }, "Adobe Experience Platform Identity Service": { "cats": [ 97 ], "js": [ "s_c_il.0._c", "s_c_il.1._c", "s_c_il.2._c", "s_c_il.3._c", "s_c_il.4._c", "s_c_il.5._c" ], "description": "Adobe Experience Platform Identity Service creates identity graphs that hold customer profiles and the known identifiers that belong to individual consumers.", "website": "https://docs.adobe.com/content/help/en/id-service/using/home.html" }, "Adobe Experience Platform Launch": { "cats": [ 42 ], "js": [ "_satellite.buildinfo" ], "description": "Adobe Experience Cloud Launch is an extendable tag management solution for Adobe Experience Cloud, Adobe Experience Platform, and other applications.", "website": "https://docs.adobelaunch.com/getting-started" }, "Adobe Flash": { "cats": [ 27 ], "description": "Adobe Flash is a multimedia software platform used for production of animations, rich web applications and embedded web browser video players.", "website": "https://www.adobe.com/products/flashplayer", "cpe": "cpe:2.3:a:adobe:flash:*:*:*:*:*:*:*:*" }, "Adobe GoLive": { "cats": [ 20 ], "meta": { "generator": [ "adobe golive(?:\\s([\\d.]+))?\\;version:\\1" ] }, "description": "Adobe GoLive is a WYSIWYG HTML editor and web site management application.", "website": "https://www.adobe.com/products/golive", "cpe": "cpe:2.3:a:adobe:golive:*:*:*:*:*:*:*:*" }, "Adobe Portfolio": { "cats": [ 51 ], "meta": { "twitter:site": [ "@adobeportfolio" ] }, "description": "Adobe Portfolio is an Adobe platform that allows you to create a web page where you can show your projects, creations, and the services you offer.", "website": "https://portfolio.adobe.com" }, "Adobe RoboHelp": { "cats": [ 4 ], "js": [ "gbwhlang", "gbwhmsg", "gbwhproxy", "gbwhutil", "gbwhver" ], "scriptSrc": [ "(?:wh(?:utils|ver|proxy|lang|topic|msg)|ehlpdhtm)\\.js" ], "meta": { "generator": [ "^adobe robohelp(?: ([\\d]+))?\\;version:\\1" ] }, "description": "Adobe RoboHelp is a Help Authoring Tool (HAT) that allows you to create help systems, e-learning content and knowledge bases.", "website": "https://adobe.com/products/robohelp.html", "cpe": "cpe:2.3:a:adobe:robohelp:*:*:*:*:*:*:*:*" }, "Adobe Target": { "cats": [ 74, 76 ], "js": [ "adobe.target", "adobe.target.version" ], "description": "Adobe Target is an A/B testing, multi-variate testing, personalisation, and optimisation application", "website": "https://www.adobe.com/marketing/target.html" }, "AdonisJS": { "cats": [ 18 ], "cookies": { "adonis-session": "", "adonis-session-values": "" }, "implies": [ "Node.js" ], "website": "https://adonisjs.com" }, "Advally": { "cats": [ 36 ], "js": [ "advally" ], "scriptSrc": [ "cdn\\.adligature\\.com/.+/advally-([\\d.]+)\\.js\\;version:\\1" ], "description": "Advally is an advertising platform for publishers.", "website": "https://www.advally.com" }, "Advanced Custom Fields": { "cats": [ 87 ], "js": [ "acf", "acfl10n" ], "scriptSrc": [ "/wp-content/plugins/advanced-custom-fields(?:-pro)?/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Advanced Custom Fields is a WordPress plugin which allows you to add extra content fields to your WordPress edit screens.", "website": "https://www.advancedcustomfields.com" }, "Advert Stream": { "cats": [ 36 ], "js": [ "advst_is_above_the_fold" ], "scriptSrc": [ "(?:ad\\.advertstream\\.com|adxcore\\.com)" ], "website": "https://www.advertstream.com" }, "Adverticum": { "cats": [ 36 ], "scriptSrc": [ "\\.adverticum\\.net/" ], "description": "Adverticum is the developer and operator of Hungary's market leading online ad serving solution, the Adverticum AdServer.", "website": "https://adverticum.net" }, "Adyen": { "cats": [ 41 ], "js": [ "adyen.encrypt.version" ], "description": "Adyen allows businesses to accept ecommerce, mobile, and point-of-sale payments.", "website": "https://www.adyen.com" }, "Aegea": { "cats": [ 11 ], "headers": { "x-powered-by": "^(?:e2\\s)?aegea\\s(?:v)?([\\d\\.]+)\\;version:\\1" }, "implies": [ "PHP", "jQuery" ], "description": "Aegea is a blog engine created by Ilya Birman.", "website": "https://blogengine.ru" }, "Aero Commerce": { "cats": [ 6 ], "js": [ "aeroevents.on" ], "description": "Aero Commerce is a performance-based platform designed with the evolving needs of retailers in mind.", "website": "https://www.aerocommerce.com" }, "Affilae": { "cats": [ 71 ], "scriptSrc": [ "static\\.affilae\\.com/(?:.+v([\\d\\.]+)|.+)?\\.js\\;version:\\1" ], "description": "Affilae is an affiliate marketing platform that enables brands to connect, collaborate with influencers and affiliates.", "website": "https://affilae.com" }, "Affiliate B": { "cats": [ 71, 36 ], "scriptSrc": [ "t\\.afi-b\\.com" ], "description": "Affiliate B is an advertising system that allows site operators (HP, blogs, e-mail newsletters, etc.) to place advertiser advertisements on their own sites.", "website": "https://affiliate-b.com" }, "Affiliate Future": { "cats": [ 71 ], "scriptSrc": [ "tags\\.affiliatefuture\\.com" ], "description": "Affiliate Future is a provider of advertisers with marketing solution through its affiliate network and tools.", "website": "https://affiliatefuture.com" }, "Affiliatly": { "cats": [ 71 ], "scriptSrc": [ "static\\.affiliatly\\.com/" ], "description": "Affiliatly is an affiliate marketing software for ecommerce store owners.", "website": "https://www.affiliatly.com" }, "Affilio": { "cats": [ 71 ], "js": [ "affilio.widget" ], "description": "Affilio is an Iranian affiliate marketing platform.", "website": "https://affilio.ir" }, "Affilo": { "cats": [ 71, 100 ], "scriptSrc": [ "//affilo\\.io/" ], "description": "Affilo is an all-in-one solution for referrals and affiliate marketing.", "website": "https://affilo.io" }, "Affirm": { "cats": [ 41, 91 ], "js": [ "_affirm_config", "affirm.rollbar" ], "scriptSrc": [ "\\.affirm\\.com/js/v([\\d\\.]+)/affirm\\.js\\;version:\\1" ], "description": "Affirm is a loan company that allows users to buy goods or services offered by online merchants and pay off those purchases in fixed monthly payments.", "website": "https://www.affirm.com" }, "Afosto": { "cats": [ 6 ], "headers": { "x-powered-by": "afosto saas bv\\;version:2.0" }, "website": "https://afosto.com" }, "AfterBuy": { "cats": [ 6 ], "js": [ "afterbuystring" ], "scriptSrc": [ "\\.afterbuy\\.de/" ], "description": "AfterBuy is a software company that specialises in ecommerce software for small to enterprise level businesses.", "website": "https://www.afterbuy.de" }, "AfterShip": { "cats": [ 107 ], "js": [ "aftership.__version__" ], "description": "AfterShip provides automated shipment tracking as a service.", "website": "https://www.aftership.com" }, "AfterShip Returns Center": { "cats": [ 102 ], "description": "AfterShip Returns Center is an interactive self-service return solution.", "website": "https://www.aftership.com/returns" }, "Afterpay": { "cats": [ 41, 91 ], "js": [ "afterpay", "afterpay.version", "afterpay_product", "afterpayattractwidget", "afterpaygenericerrorhtml", "afterpaywidgethtml", "checkout.enabledpayments.afterpay" ], "scriptSrc": [ "afterpay-products\\.min\\.js", "js\\.stripe\\.com/v3/fingerprinted/js/elements-afterpay-clearpay-message-.+\\.js", "portal\\.afterpay\\.com", "present-afterpay\\.js", "static\\.afterpay\\.com" ], "description": "Afterpay is a 'buy now, pay later' platform that makes it possible to pay off purchased goods in fortnightly instalments.", "website": "https://www.afterpay.com/", "cpe": "cpe:2.3:a:afterpay:afterpay:*:*:*:*:*:*:*:*" }, "Ahoy": { "cats": [ 10 ], "cookies": { "ahoy_track": "", "ahoy_visit": "", "ahoy_visitor": "" }, "js": [ "ahoy" ], "implies": [ "Ruby on Rails" ], "description": "Ahoy is a Ruby gem that provides simple and powerful analytics for Ruby on Rails applications.", "website": "https://github.com/ankane/ahoy" }, "Ahrefs": { "cats": [ 54, 10 ], "meta": { "ahrefs-site-verification": [] }, "description": "Ahrefs is an online toolset utilised for search engine optimisation (SEO) and competitor analysis, which permits users to analyse their website's performance, track keyword rankings, identify backlink opportunities, and research competitors' websites, among other features.", "website": "https://ahrefs.com" }, "AiSpeed": { "cats": [ 92, 100 ], "js": [ "aispeed_init" ], "scriptSrc": [ "aispeed\\.js" ], "implies": [ "Shopify" ], "description": "AiSpeed is a shopify app focused on improving site speed.", "website": "https://apps.shopify.com/aispeed" }, "Aimtell": { "cats": [ 32 ], "js": [ "_aimtellload", "_aimtellpushtoken", "_aimtellwebhook" ], "scriptSrc": [ "cdn\\.aimtell\\.\\w+/" ], "description": "Aimtell is a cloud-hosted marketing platform that allows digital marketers and businesses to deliver web-based push notifications.", "website": "https://aimtell.com" }, "Air360": { "cats": [ 10 ], "js": [ "air360.sdk_version" ], "description": "Air360 is a technology company that specialises in performance-enhancing, mobile and ecommerce experience analytics.", "website": "https://www.air360.io" }, "AirRobe": { "cats": [ 5 ], "js": [ "airrobe.app_id" ], "description": "AirRobe partners with brands and retailers to power the circular fashion economy.", "website": "https://airrobe.com" }, "Aircall": { "cats": [ 52 ], "scriptSrc": [ "^https?://cdn\\.aircall\\.io/" ], "description": "Aircall is a cloud-based phone system for customer support and sales teams.", "website": "https://aircall.io" }, "Airee": { "cats": [ 31 ], "headers": { "server": "^airee" }, "website": "https://xn--80aqc2a.xn--p1ai" }, "Airform": { "cats": [ 110 ], "description": "Airform is a functional HTML forms for front-end developers.", "website": "https://airform.io" }, "Airship": { "cats": [ 32, 10 ], "scriptSrc": [ "urbanairship\\.\\w+/notify/v([\\d.]+)\\;version:\\1" ], "description": "Airship is an American company that provides marketing and branding services. Airship allows companies to generate custom messages to consumers via push notifications, SMS messaging, and similar, and provides customer analytics services.", "website": "https://www.airship.com" }, "Airtable": { "cats": [ 5 ], "description": "Airtable is a low-code platform for building collaborative apps.", "website": "https://www.airtable.com" }, "Akamai": { "cats": [ 31 ], "headers": { "x-akamai-transformed": "", "x-edgeconnect-midmile-rtt": "", "x-edgeconnect-origin-mex-latency": "" }, "description": "Akamai is global content delivery network (CDN) services provider for media and software delivery, and cloud security solutions.", "website": "https://akamai.com" }, "Akamai Bot Manager": { "cats": [ 16 ], "cookies": { "ak_bmsc": "", "bm_sv": "", "bm_sz": "" }, "implies": [ "Akamai" ], "description": "Akamai Bot Manager detect bots using device fingerprinting bot signatures.", "website": "https://www.akamai.com/us/en/products/security/bot-manager.jsp" }, "Akamai Web Application Protector": { "cats": [ 16 ], "js": [ "aksb" ], "scriptSrc": [ "aksb\\.min\\.js\\;confidence:50", "ds-aksb-a\\.akamaihd\\.net/aksb.min.js" ], "implies": [ "Akamai" ], "description": "Akamai Web Application Protector is designed for companies looking for a more automated approach to web application firewall (WAF) and distributed denial-of-service (DDoS) security.", "website": "https://www.akamai.com/us/en/products/security/web-application-protector-enterprise-waf-firewall-ddos-protection.jsp" }, "Akamai mPulse": { "cats": [ 78 ], "cookies": { "akaas_ab-testing": "" }, "js": [ "boomr_api_key" ], "html": [ "\u003cscript\u003e[\\s\\s]*?go-mpulse\\.net\\/boomerang[\\s\\s]*?\u003c/script\u003e" ], "implies": [ "Boomerang" ], "description": "Akamai mPulse is a real user monitoring (RUM) solution that enables companies to monitor, find, and fix website and application performance issues.", "website": "https://developer.akamai.com/akamai-mpulse-real-user-monitoring-solution" }, "Akaunting": { "cats": [ 55 ], "headers": { "x-akaunting": "^free accounting software$" }, "html": [ "\u003clink[^\u003e]+akaunting-green\\.css", "powered by akaunting: \u003ca [^\u003e]*href=\"https?://(?:www\\.)?akaunting\\.com[^\u003e]+\u003e" ], "implies": [ "Laravel" ], "description": "Akaunting is a free and online accounting software.", "website": "https://akaunting.com" }, "Akilli Ticaret": { "cats": [ 6 ], "js": [ "akillitel" ], "scriptSrc": [ "\\.akilliticaret\\.com/" ], "description": "Akilli Ticaret is an all-in-one ecommerce platform from Turkey.", "website": "https://akilliticaret.com" }, "Akinon": { "cats": [ 6 ], "scriptSrc": [ "cdn-mgsm\\.akinon\\.net/" ], "description": "Akinon is a cloud-based headless commerce platform with an integrated application suite including omnichannel and marketplace capabilities, mobile and in-store solutions, and an OMS.", "website": "https://www.akinon.com/" }, "Akismet": { "cats": [ 87 ], "js": [ "ak_js.checkvalidity" ], "scriptSrc": [ "/wp-content/plugins/akismet/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Akismet is a service that filters spam from comments, trackbacks, and contact form messages.", "website": "https://akismet.com" }, "Akka HTTP": { "cats": [ 18, 22 ], "headers": { "server": "akka-http(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://akka.io", "cpe": "cpe:2.3:a:lightbend:akka_http:*:*:*:*:*:*:*:*" }, "Aklamio": { "cats": [ 94 ], "headers": { "content-security-policy": "\\.aklamio\\.com" }, "scriptSrc": [ "\\.aklamio\\.com/" ], "description": "Aklamio is a solution for enterprise level referral marketing and customer incentivisation.", "website": "https://www.aklamio.com" }, "Aksara CMS": { "cats": [ 1 ], "implies": [ "Bootstrap", "CodeIgniter", "MySQL", "OpenLayers", "PHP", "jQuery" ], "description": "Aksara CMS is a CodeIgniter based CRUD toolkit.", "website": "https://aksaracms.com" }, "Albacross": { "cats": [ 10, 77 ], "js": [ "_nqsv" ], "scriptSrc": [ "\\.albacross\\.com" ], "description": "Albacross is a lead generation and account intelligence platform. It helps marketing and sales teams identify their ideal customers visiting their website and gives them the insights they need to generate more qualified leads, make prospecting more efficient and close more deals.", "website": "https://albacross.com" }, "AlertifyJS": { "cats": [ 12 ], "js": [ "alertify.defaults.autoreset" ], "scriptSrc": [ "/alertify/alertify\\.min\\.js" ], "description": "AlertifyJS is a javascript framework for developing browser dialogs and notifications.", "website": "https://alertifyjs.com" }, "Alexa Certified Site Metrics": { "cats": [ 10 ], "js": [ "_atrk_opts.domain" ], "scriptSrc": [ "\\.cloudfront\\.net/atrk\\.js" ], "description": "Alexa Certified Site Metrics is an analytics service wich monitors and analyses web traffic and can be used to keep track of user behavior.", "website": "https://support.alexa.com/hc/en-us/sections/200063374" }, "Algolia": { "cats": [ 29 ], "cookies": { "_algolia": "" }, "js": [ "__algolia", "__algolia.algoliasearch.version", "__global__.algolia", "__next_data__.props.pageprops.appsettings.algolia_app_id", "algolia_insights_src", "algoliasearch", "algoliasearch.version" ], "headers": { "content-security-policy": "\\.algolia" }, "description": "Algolia offers a hosted web search product delivering real-time results.", "website": "https://www.algolia.com" }, "Algolia DocSearch": { "cats": [ 5 ], "js": [ "docsearch.version" ], "implies": [ "Algolia" ], "description": "Algolia DocSearch is a search widget specifically designed for documentation websites.", "website": "https://docsearch.algolia.com" }, "Ali Reviews": { "cats": [ 90, 100 ], "js": [ "alireviews_tags" ], "description": "Ali reviews is a shopify app to collect reviews from customers.", "website": "https://apps.shopify.com/ali-reviews" }, "Alibaba Cloud CDN": { "cats": [ 31 ], "scriptSrc": [ "\\.alicdn\\.com/" ], "description": "Alibaba Cloud CDN is a global network of servers designed to deliver high-performance, low-latency content to users around the world. It is a cloud-based service provided by Alibaba Cloud, a subsidiary of the Alibaba Group, that enables businesses to accelerate the delivery of their web content, including images, videos, and static files, to end-users.", "website": "https://www.alibabacloud.com/product/content-delivery-network" }, "Alibaba Cloud Object Storage Service": { "cats": [ 63 ], "headers": { "x-oss-object-type": "", "x-oss-request-id": "", "x-oss-storage-class": "" }, "description": "Alibaba Cloud Object Storage Service (OSS) is a cloud-based object storage service provided by Alibaba Cloud, which allows users to store and access large amounts of data in the cloud.", "website": "https://www.alibabacloud.com/product/object-storage-service" }, "Alibaba Cloud Verification Code": { "cats": [ 16 ], "scriptSrc": [ "cf\\.aliyun\\.com/" ], "description": "Alibaba Cloud Verification Code is a security feature provided by Alibaba Cloud to help protect user accounts from unauthorised access.", "website": "https://help.aliyun.com/document_detail/193141.html" }, "All in One SEO Pack": { "cats": [ 54, 87 ], "html": [ "\u003c!-- all in one seo pack ([\\d.]+) \\;version:\\1" ], "description": "All in One SEO plugin optimizes WordPress website and its content for search engines.", "website": "https://aioseo.com", "cpe": "cpe:2.3:a:aioseo:all_in_one_seo:*:*:*:*:*:wordpress:*:*" }, "Alli": { "cats": [ 54 ], "scriptSrc": [ "\\.alliai\\.com/" ], "description": "Alli is artificial intelligence for search engine optimisation.", "website": "https://www.alliai.com" }, "Alliance Auth": { "cats": [ 69 ], "implies": [ "Bootstrap", "Django", "Font Awesome", "Python", "jQuery" ], "description": "Alliance Auth is an access management platform designed for Eve Online groups. It controls access to applications and services based on in-game memberships.", "website": "https://gitlab.com/allianceauth/allianceauth" }, "AlloyUI": { "cats": [ 12 ], "js": [ "aui" ], "scriptSrc": [ "^https?://cdn\\.alloyui\\.com/" ], "implies": [ "Bootstrap", "YUI" ], "website": "https://www.alloyui.com" }, "Allyable": { "cats": [ 68 ], "scriptSrc": [ "portal\\.allyable\\.com/" ], "description": "Allyable is an automated web accessibility solution with an AI engine.", "website": "https://allyable.com" }, "AlmaLinux": { "cats": [ 28 ], "headers": { "server": "almalinux" }, "description": "AlmaLinux is an open-source, community-driven Linux operating system that fills the gap left by the discontinuation of the CentOS Linux stable release.", "website": "https://almalinux.org" }, "Alpine Linux": { "cats": [ 28 ], "headers": { "x-powered-by": "alpine" }, "description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.", "website": "https://www.alpinelinux.org", "cpe": "cpe:2.3:o:alpinelinux:alpine_linux:*:*:*:*:*:*:*:*" }, "Alpine.js": { "cats": [ 12 ], "js": [ "alpine.version" ], "html": [ "\u003c[^\u003e]+[^\\w-]x-data[^\\w-][^\u003c]+\\;confidence:75" ], "scriptSrc": [ "/alpine(?:\\.min)?\\.js" ], "website": "https://github.com/alpinejs/alpine" }, "AlternC": { "cats": [ 9 ], "scriptSrc": [ "js/alternc\\.js" ], "description": "AlternC is a set of software management on Linux shared hosting.", "website": "https://alternc.com" }, "AlumnIQ": { "cats": [ 111 ], "cookies": { "alumniq-online-giving": "" }, "description": "AlumnIQ is a set of services to manage events, giving, email, volunteers, class agents, and more, all designed to work with your database of record.", "website": "https://www.alumniq.com/platform/" }, "AlvandCMS": { "cats": [ 1 ], "meta": { "generator": [ "alvandcms\\s([\\d\\.]+)\\;version:\\1" ] }, "implies": [ "MySQL", "PHP" ], "description": "AlvandCMS is a PHP-based content management system that is commonly used in Iran.", "website": "https://alvandcms.ir" }, "Amaya": { "cats": [ 20 ], "meta": { "generator": [ "amaya(?: v?([\\d.]+[a-z]))?\\;version:\\1" ] }, "description": "Amaya is an open-source web browser editor to create and update documents on the web.", "website": "https://www.w3.org/Amaya" }, "Amazon ALB": { "cats": [ 65 ], "cookies": { "awsalb": "", "awsalbcors": "" }, "implies": [ "Amazon Web Services" ], "description": "Amazon Application Load Balancer (ALB) distributes incoming application traffic to increase availability and support content-based routing.", "website": "https://aws.amazon.com/elasticloadbalancing/" }, "Amazon Advertising": { "cats": [ 36 ], "scriptSrc": [ "\\.amazon-adsystem\\.com" ], "description": "Amazon Advertising (formerly AMS or Amazon Marketing Services) is a service that works in a similar way to pay-per-click ads on Google.", "website": "https://advertising.amazon.com" }, "Amazon Associates": { "cats": [ 71 ], "scriptSrc": [ "\\.associates-amazon\\.com" ], "description": "Amazon Associates is an affiliate marketing program that allows website owners and bloggers to create links and earn referral fees when customers click through and buy products from Amazon.", "website": "https://affiliate-program.amazon.com" }, "Amazon Aurora": { "cats": [ 34 ], "implies": [ "Amazon Web Services" ], "description": "Amazon Aurora is a relational database service developed and offered by Amazon Web Services.", "website": "https://aws.amazon.com/rds/aurora" }, "Amazon CloudFront": { "cats": [ 31 ], "headers": { "via": "\\(cloudfront\\)$", "x-amz-cf-id": "" }, "implies": [ "Amazon Web Services" ], "description": "Amazon CloudFront is a fast content delivery network (CDN) service that securely delivers data, videos, applications, and APIs to customers globally with low latency, high transfer speeds.", "website": "https://aws.amazon.com/cloudfront/" }, "Amazon CloudWatch RUM": { "cats": [ 78 ], "js": [ "awsrum", "awsrumclient", "awsrumclient.v", "awsrumconfig" ], "description": "Amazon CloudWatch RUM is a real-user monitoring capability that helps you identify and debug issues in the client-side on web applications and enhance end user's digital experience.", "website": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM.html" }, "Amazon Cognito": { "cats": [ 69 ], "implies": [ "Amazon Web Services" ], "description": "Amazon Cognito lets you add user sign-up, sign-in, and access control to your web and mobile apps. Amazon Cognito supports sign-in with social identity providers, such as Apple, Facebook, Google, and Amazon, and enterprise identity providers via SAML 2.0 and OpenID Connect.", "website": "https://aws.amazon.com/cognito/" }, "Amazon EC2": { "cats": [ 22 ], "headers": { "server": "\\(amazon\\)" }, "implies": [ "Amazon Web Services" ], "description": "Amazon Elastic Compute Cloud is a part of Amazon.com's cloud-computing platform, Amazon Web Services, that allows users to rent virtual computers on which to run their own computer applications.", "website": "https://aws.amazon.com/ec2/" }, "Amazon ECS": { "cats": [ 63 ], "headers": { "server": "^ecs" }, "implies": [ "Amazon Web Services", "Docker" ], "website": "https://aws.amazon.com/ecs/" }, "Amazon EFS": { "cats": [ 48 ], "implies": [ "Amazon Web Services" ], "description": "Amazon Elastic File System is a cloud storage service provided by Amazon Web Services.", "website": "https://aws.amazon.com/efs/" }, "Amazon ELB": { "cats": [ 65 ], "cookies": { "awselb": "" }, "headers": { "server": "awselb" }, "implies": [ "Amazon Web Services" ], "description": "AWS ELB is a network load balancer service provided by Amazon Web Services for distributing traffic across multiple targets, such as Amazon EC2 instances, containers, IP addresses, and Lambda functions.", "website": "https://aws.amazon.com/elasticloadbalancing/" }, "Amazon Pay": { "cats": [ 41 ], "js": [ "amazonpayments", "enableamazonpay", "offamazonpayments", "onamazonpaymentsready" ], "scriptSrc": [ "/amazonpayments(?:\\.min)?\\.js", "\\.payments-amazon\\.com/" ], "meta": { "id": [ "amazon-payments-metadata" ] }, "description": "Amazon Pay is an online payments processing service that is owned by Amazon. It lets you use the payment methods associated with your Amazon account to make payments for goods and services.", "website": "https://pay.amazon.com" }, "Amazon S3": { "cats": [ 31 ], "headers": { "content-security-policy": "s3[^ ]*amazonaws\\.com", "content-security-policy-report-only": "s3[^ ]*\\.amazonaws\\.com", "server": "^amazons3$" }, "scriptSrc": [ "s3[^ ]*\\.amazonaws\\.com/" ], "implies": [ "Amazon Web Services" ], "description": "Amazon S3 or Amazon Simple Storage Service is a service offered by Amazon Web Services (AWS) that provides object storage through a web service interface.", "website": "https://aws.amazon.com/s3/" }, "Amazon SES": { "cats": [ 75 ], "implies": [ "Amazon Web Services" ], "description": "Amazon Simple Email Service (SES) is an email service that enables developers to send mail from within any application.", "website": "https://aws.amazon.com/ses/" }, "Amazon Web Services": { "cats": [ 62 ], "headers": { "x-amz-delete-marker": "", "x-amz-err-code": "", "x-amz-err-message": "", "x-amz-id-2": "", "x-amz-req-time-micros": "", "x-amz-request-id": "", "x-amz-rid": "", "x-amz-version-id": "" }, "description": "Amazon Web Services (AWS) is a comprehensive cloud services platform offering compute power, database storage, content delivery and other functionality.", "website": "https://aws.amazon.com/" }, "Amazon Webstore": { "cats": [ 6 ], "js": [ "amzn" ], "description": "Amazon Webstore is an all-in-one hosted ecommerce website solution.", "website": "https://aws.amazon.com/marketplace/pp/Amazon-Web-Services-Amazon-Webstore/B007NLVI2S" }, "Ambassador": { "cats": [ 94 ], "js": [ "_mbsy.integrations" ], "scriptSrc": [ "cdn\\.getambassador\\.com/" ], "description": "Ambassador is a marketer-friendly software that simplifies referral marketing and helps automating the enrolment, tracking, rewarding and management process.", "website": "https://www.getambassador.com" }, "Amber": { "cats": [ 18, 22 ], "headers": { "x-powered-by": "^amber$" }, "website": "https://amberframework.org" }, "American Express": { "cats": [ 41 ], "description": "American Express, also known as Amex, facilitates electronic funds transfers throughout the world, most commonly through branded credit cards, debit cards and prepaid cards.", "website": "https://www.americanexpress.com" }, "Ametys": { "cats": [ 1 ], "scriptSrc": [ "ametys\\.js" ], "meta": { "generator": [ "(?:ametys|anyware technologies)" ] }, "implies": [ "Java" ], "website": "https://ametys.org" }, "Amex Express Checkout": { "cats": [ 41 ], "scriptSrc": [ "aexp-static\\.com" ], "description": "Amex Express Checkout is a service that simplifies the checkout experience by auto-filling necessary cardholder payment data into merchant checkout fields.", "website": "https://www.americanexpress.com/us/express-checkout/" }, "Amiro.CMS": { "cats": [ 1 ], "meta": { "generator": [ "amiro" ] }, "implies": [ "MySQL", "PHP" ], "description": "Amiro.CMS is a commercial content management system developed and distributed by the Russian company Amiro. Written in PHP and uses MySQL as a database.", "website": "https://www.amiro.ru" }, "Amobee": { "cats": [ 36 ], "description": "Amobee is a cloud-based advertising and data management platform.", "website": "https://www.amobee.com" }, "Amplience": { "cats": [ 1 ], "js": [ "ampliancetemplates" ], "description": "Amplience is an API-first, headless content management platform for enterprise retail.", "website": "https://amplience.com" }, "Amplitude": { "cats": [ 10 ], "js": [ "__amplitude__", "amplitude_key", "amplitudeclient" ], "scriptSrc": [ "cdn\\.(?:segment.+)?amplitude(?:\\.com|-plugins)" ], "description": "Amplitude is a web and mobile analytics solution with cross-platform user journey tracking, user behavior analysis and segmentation capabilities.", "website": "https://amplitude.com" }, "Analysys Ark": { "cats": [ 10 ], "cookies": { "ark_id": "" }, "js": [ "analysysagent" ], "scriptSrc": [ "analysysfangzhou_js_sdk\\.min\\.js\\?v=([\\d.]+)\\;version:\\1" ], "website": "https://ark.analysys.cn" }, "Analyzee": { "cats": [ 10 ], "js": [ "analyzee._session", "analyzee._sessionextend" ], "scriptSrc": [ "cdn\\.analyzee\\.io/sdk/(.*)\\.js" ], "description": "Analyzee is an analytics tool that allows you to gain insights into visitor behavior and optimise your website's user experience using heatmaps and other analytics features.", "website": "https://analyzee.io" }, "AndersNoren Baskerville": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/baskerville(?:-2)?/" ], "description": "AndersNoren Baskerville is a responsive and retina-ready masonry WordPress theme for hoarders.", "website": "https://andersnoren.se/teman/baskerville-wordpress-theme" }, "AndersNoren Fukasawa": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/fukasawa/" ], "description": "AndersNoren Fukasawa is a minimal masonry style blog WordPress theme for photographers and collectors.", "website": "https://andersnoren.se/teman/fukasawa-wordpress-theme" }, "AndersNoren Hemingway": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/hemingway/" ], "description": "AndersNoren Hemingway is a clean and beautiful two-column WordPress theme for bloggers.", "website": "https://andersnoren.se/teman/hemingway-wordpress-theme" }, "AndersNoren Hitchcock": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/hitchcock/" ], "description": "AndersNoren Hitchcock is a portfolio WordPress theme for designers, photographers and other creatives.", "website": "https://andersnoren.se/teman/hitchcock-wordpress-theme" }, "AndersNoren Lovecraft": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/lovecraft/" ], "description": "AndersNoren Lovecraft is a beautiful two-column WordPress theme for bloggers.", "website": "https://andersnoren.se/teman/lovecraft-wordpress-theme" }, "Anetwork": { "cats": [ 36 ], "scriptSrc": [ "static-cdn\\.anetwork\\.ir/" ], "website": "https://www.anetwork.ir" }, "Angie": { "cats": [ 22 ], "headers": { "server": "^angie(?:/([\\d\\.]+))?$\\;version:\\1" }, "implies": [ "C", "Perl" ], "description": "Angie is a drop-in replacement for the Nginx web server aiming to extend the functionality of the original version.", "website": "https://angie.software/en/" }, "Angular": { "cats": [ 12 ], "js": [ "ng.coretokens", "ng.probe" ], "implies": [ "TypeScript" ], "description": "Angular is a TypeScript-based open-source web application framework led by the Angular Team at Google.", "website": "https://angular.io", "cpe": "cpe:2.3:a:angularjs:angular:*:*:*:*:*:*:*:*" }, "Angular Material": { "cats": [ 66 ], "js": [ "ngmaterial" ], "scriptSrc": [ "/([\\d.rc-]+)?/angular-material(?:\\.min)?\\.js\\;version:\\1" ], "implies": [ "AngularJS" ], "description": "Angular Material is a UI component library for Angular JS developers. Angular Material components assist in constructing attractive, consistent, and functional web pages and web applications.", "website": "https://material.angularjs.org" }, "AngularDart": { "cats": [ 18 ], "js": [ "ngtestabilityregistries" ], "implies": [ "Dart" ], "website": "https://webdev.dartlang.org/angular/" }, "AngularJS": { "cats": [ 12 ], "js": [ "angular", "angular.version.full" ], "html": [ "\u003c(?:div|html)[^\u003e]+ng-app=", "\u003cng-app" ], "scriptSrc": [ "(?!angular\\.io)\\bangular.{0,32}\\.js", "/([\\d.]+(?:-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", "angular[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "description": "AngularJS is a JavaScript-based open-source web application framework led by the Angular Team at Google.", "website": "https://angularjs.org", "cpe": "cpe:2.3:a:angularjs:angular.js:*:*:*:*:*:*:*:*" }, "Animate.css": { "cats": [ 66 ], "description": "Animate.css is a ready-to-use library collection of CSS3 animation effects.", "website": "https://animate.style" }, "Aniview Ad Server": { "cats": [ 36 ], "scriptSrc": [ "^(?!.*player).*aniview\\.com/" ], "description": "Aniview Ad Server is a technology developed by Aniview, a company that specialises in providing video advertising solutions. The Aniview Ad Server is a platform designed to manage and serve video ads to publishers, advertisers, and agencies.", "website": "https://aniview.com/video-ad-servers/" }, "Aniview Video Ad Player": { "cats": [ 14 ], "scriptSrc": [ "player\\.aniview\\.com/script/([\\d\\.]+)/\\;version:\\1" ], "implies": [ "Aniview Ad Server" ], "description": "Aniview Video Ad Player is a video player technology developed by Aniview, a company that specialises in providing video advertising solutions.", "website": "https://aniview.com/video-ad-player/" }, "AnswerDash": { "cats": [ 5 ], "js": [ "answerdash", "answerdash.__plugin" ], "scriptSrc": [ "\\.answerdash\\.com/" ], "description": "AnswerDash is a question and answer platform that serves business customers thereby reducing support costs and revealing customer needs.", "website": "https://www.answerdash.com" }, "Ant Design": { "cats": [ 66 ], "js": [ "antd.version" ], "html": [ "\u003c[^\u003e]*class=\"ant-(?:btn|col|row|layout|breadcrumb|menu|pagination|steps|select|cascader|checkbox|calendar|form|input-number|input|mention|rate|radio|slider|switch|tree-select|time-picker|transfer|upload|avatar|badge|card|carousel|collapse|list|popover|tooltip|table|tabs|tag|timeline|tree|alert|modal|message|notification|progress|popconfirm|spin|anchor|back-top|divider|drawer)", "\u003ci class=\"anticon anticon-" ], "description": "Ant Design is a UI library that can be used with data flow solutions and application frameworks in any React ecosystem.", "website": "https://ant.design" }, "AntV G2": { "cats": [ 25 ], "js": [ "g2.chart", "g2.version" ], "description": "AntV G2 is a highly interactive data-driven visualisation grammar for statistical charts.", "website": "https://g2plot.antv.vision" }, "AntV G6": { "cats": [ 25 ], "js": [ "g6.graph", "g6.version" ], "description": "AntV G6 is a graph visualisation framework in JavaScript.", "website": "https://g6.antv.vision" }, "Antee IPO": { "cats": [ 1 ], "js": [ "ipo.api.hidespinner" ], "meta": { "author": [ "antee\\ss\\.r\\.o\\." ] }, "description": "Antee is a Czech company that will make a custom-made website for you, then you manage it in CMS IPO.", "website": "https://ipo.antee.cz" }, "Anthology Encompass": { "cats": [ 53 ], "description": "Anthology Encompass is a constituent engagement management provider or educational institutions that provides modules to help you manage events, websites and content, data, and more.", "website": "https://www.anthology.com/products/lifecycle-engagement/alumni-and-advancement/anthology-encompass" }, "AntiBot.Cloud": { "cats": [ 16 ], "scriptSrc": [ "/antibot8/static/peel\\.js" ], "meta": { "generator": [ "antibot\\.cloud\\sv\\.\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "AntiBot.Cloud is a PHP script and cloud service to protect websites from bots and junk traffic.", "website": "https://antibot.cloud" }, "Antsomi CDP 365": { "cats": [ 97 ], "scriptSrc": [ "\\.cdp\\.asia/" ], "description": "Antsomi CDP 365 is a AI-enabled customer data platform from Southeast Asia.", "website": "https://www.antsomi.com" }, "AnyClip": { "cats": [ 36 ], "js": [ "anyclip" ], "scriptSrc": [ "\\.anyclip\\.com" ], "description": "AnyClip is a video engagement platform that uses an AI-driven content analysis engine to analyze and categorize video content in real-time to create personalised video feeds.", "website": "https://www.anyclip.com" }, "Apache APISIX": { "cats": [ 22 ], "headers": { "server": "^apisix(?:/([\\d\\.]+))?$\\;version:\\1", "x-apisix-upstream-status": "" }, "description": "Apache APISIX is an open-source, cloud-native API gateway developed by the Apache Software Foundation. It provides a scalable and high-performance solution for managing and securing API traffic.", "website": "https://apisix.apache.org", "cpe": "cpe:2.3:a:apache:apisix:*:*:*:*:*:*:*:*" }, "Apache HTTP Server": { "cats": [ 22 ], "headers": { "server": "(?:apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)httpd)\\;version:\\1" }, "description": "Apache is a free and open-source cross-platform web server software.", "website": "https://httpd.apache.org/", "cpe": "cpe:2.3:a:apache:http_server:*:*:*:*:*:*:*:*" }, "Apache JSPWiki": { "cats": [ 8 ], "html": [ "\u003chtml[^\u003e]* xmlns:jspwiki=" ], "scriptSrc": [ "jspwiki" ], "implies": [ "Apache Tomcat" ], "description": "Apache JSPWiki is an open-source Wiki engine, built around standard JEE components (Java, servlets, JSP).", "website": "https://jspwiki.org", "cpe": "cpe:2.3:a:apache:jspwiki:*:*:*:*:*:*:*:*" }, "Apache Tomcat": { "cats": [ 22 ], "headers": { "server": "^apache-coyote", "x-powered-by": "\\btomcat\\b(?:-([\\d.]+))?\\;version:\\1" }, "implies": [ "Java" ], "description": "Apache Tomcat is an open-source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and WebSocket technologies.", "website": "https://tomcat.apache.org", "cpe": "cpe:2.3:a:apache:tomcat:*:*:*:*:*:*:*:*" }, "Apache Traffic Server": { "cats": [ 22 ], "headers": { "server": "ats/?([\\d.]+)?\\;version:\\1" }, "description": "Apache Traffic Server is an open-source caching and proxying server that serves as an HTTP/1.1 and HTTP/2 reverse proxy with caching capabilities, load balancing, request routing, SSL termination, and support for advanced HTTP features.", "website": "https://trafficserver.apache.org/", "cpe": "cpe:2.3:a:apache:traffic_server:*:*:*:*:*:*:*:*" }, "Apache Wicket": { "cats": [ 18 ], "js": [ "wicket" ], "implies": [ "Java" ], "description": "Apache Wicket is an open-source Java web application framework for building scalable and maintainable web applications.", "website": "https://wicket.apache.org", "cpe": "cpe:2.3:a:apache:wicket:*:*:*:*:*:*:*:*" }, "Apereo CAS": { "cats": [ 69 ], "implies": [ "Java", "PHP" ], "description": "Apereo CAS is an open and well-documented authentication protocol. The primary implementation of the protocol is an open-source Java server component by the same name hosted here, with support for a plethora of additional authentication protocols and features.", "website": "https://www.apereo.org/projects/cas" }, "ApexCharts.js": { "cats": [ 25 ], "js": [ "apexcharts" ], "description": "ApexCharts is a modern JavaScript charting library that empowers developers to build interactive data visualizations for commercial and non-commercial projects.", "website": "https://apexcharts.com" }, "ApexChat": { "cats": [ 52 ], "js": [ "apexchat", "apexchat_dompopup_chatwindow_client" ], "description": "ApexChat is a company that provides businesses with live chat software and services to facilitate real-time customer engagement, support, lead generation, and enhanced online interactions.", "website": "https://www.apexchat.com" }, "ApexPages": { "cats": [ 51 ], "headers": { "x-powered-by": "salesforce\\.com apexpages" }, "implies": [ "Salesforce" ], "website": "https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_intro.htm" }, "Apigee": { "cats": [ 4, 19 ], "scriptSrc": [ "/profiles/apigee" ], "description": "Apigee is an API gateway management tool to exchange data across cloud services and applications", "website": "https://cloud.google.com/apigee/" }, "Apisearch": { "cats": [ 29 ], "scriptSrc": [ "static\\.apisearch\\.cloud" ], "description": "Apisearch is a real-time search platform for ecommerce.", "website": "https://apisearch.io" }, "Aplazame": { "cats": [ 41, 91 ], "js": [ "aplazame" ], "scriptSrc": [ "aplazame\\.com/static/aplazame\\.js", "cdn\\.aplazame\\.com/aplazame\\.js" ], "description": "Aplazame is a consumer credit company that provides instant financing service for online purchases. It combines an overtime payment method integrated at the ecommerce checkout with marketing tools to enable ecommerce to use financing as a promotional lever to boost sales.", "website": "https://aplazame.com" }, "Apollo": { "cats": [ 59 ], "js": [ "__apollo_client__", "__apollo_client__.version", "__next_data__.props.pageprops.__apollo_state__" ], "implies": [ "GraphQL", "TypeScript\\;confidence:50" ], "description": "Apollo is a fully-featured caching GraphQL client with integrations for React, Angular, and more.", "website": "https://www.apollographql.com" }, "Apollo13Themes Rife": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/rife(?:-free)?/(?:.+script\\.min\\.js(?:\\?ver=([\\d\\.]+)))?\\;version:\\1" ], "description": "Apollo13Themes Rife is a great portfolio and photography WordPress theme with 7 ready-to-use demo layouts.", "website": "https://apollo13themes.com/rife" }, "ApostropheCMS": { "cats": [ 1 ], "js": [ "apos.csrfcookiename", "apos_dialogs.dialogattributes" ], "implies": [ "Node.js" ], "description": "ApostropheCMS is a powerful website builder platform built on an enterprise open source CMS.", "website": "https://apostrophecms.com" }, "AppDynamics": { "cats": [ 10, 78 ], "js": [ "adrum.conf.agentver" ], "scriptSrc": [ "adrum" ], "description": "AppDynamics is an application performance management (APM) and IT operations analytics (ITOA) company based in San Francisco.", "website": "https://appdynamics.com" }, "AppNexus": { "cats": [ 36 ], "js": [ "appnexus", "appnexusvideo" ], "scriptSrc": [ "adnxs\\.(?:net|com)" ], "description": "AppNexus is a cloud-based software platform that enables and optimizes programmatic online advertising.", "website": "https://appnexus.com" }, "Appcues": { "cats": [ 58 ], "js": [ "appcues" ], "scriptSrc": [ "fast\\.appcues\\.com" ], "description": "Appcues is a solution for measuring and improving product adoption.", "website": "https://www.appcues.com/" }, "Appian": { "cats": [ 62 ], "js": [ "_appian_proxies_initialized", "appian", "appian", "webpackjsonpappian" ], "scriptSrc": [ "tempo/ui/sail-client/embeddedbootstrap\\.nocache\\.js" ], "description": "Appian is an enterprise low-code application platform.", "website": "https://www.appian.com" }, "Apple Business Chat": { "cats": [ 52 ], "js": [ "applebusinesschat.version" ], "scriptSrc": [ "/apple_business_chat_commerce/.+/apple_message_button_v([\\d\\.]+)\\.js\\;version:\\1" ], "description": "Apple Business Chat is a service from Apple that allows your organization to directly chat with your customers using the Messages app.", "website": "https://developer.apple.com/documentation/businesschat" }, "Apple MapKit JS": { "cats": [ 35 ], "js": [ "mapkit._tileprovider" ], "headers": { "content-security-policy": "\\.apple-mapkit\\.com" }, "scriptSrc": [ "//cdn\\.apple-mapkit\\.com/mk/([\\d\\.\\w]+)\\;version:\\1" ], "description": "Apple MapKit JS lets you embed interactive maps directly into your websites across platforms and operating systems, including iOS and Android.", "website": "https://developer.apple.com/maps/web/" }, "Apple Pay": { "cats": [ 41 ], "js": [ "applepay", "applepaybuttonclicked", "braintree.applepay", "checkout.enabledpayments.applepay", "dw.applepay", "enableapplepay" ], "description": "Apple Pay is a mobile payment and digital wallet service by Apple that allows users to make payments in person, in iOS apps, and on the web.", "website": "https://www.apple.com/apple-pay" }, "Apple Sign-in": { "cats": [ 69 ], "js": [ "appleid" ], "scriptSrc": [ "appleid\\.auth\\.js" ], "meta": { "appleid-signin-client-id": [] }, "description": "Apple Sign-in is based on OAuth 2.0 and OpenID Connect, and provides a privacy-friendly way for users to sign in to websites and apps.", "website": "https://developer.apple.com/sign-in-with-apple/" }, "Apple iCloud Mail": { "cats": [ 30 ], "description": "Apple iCloud Mail is a webmail service provided by Apple, Inc.", "website": "https://www.apple.com/icloud/" }, "ApplicantStack": { "cats": [ 101 ], "scriptSrc": [ "\\.applicantstack\\.com/" ], "description": "ApplicantStack is a full-service applicant tracking system that automates and streamlines all stages of the hiring process.", "website": "https://www.applicantstack.com" }, "Application Request Routing": { "cats": [ 65 ], "headers": { "x-powered-by": "^arr/([\\d\\.]+)$\\;version:\\1" }, "implies": [ "IIS" ], "description": "Application Request Routing (ARR) is an extension to Internet Information Server (IIS), which enables an IIS server to function as a load balancer.", "website": "https://www.iis.net/downloads/microsoft/application-request-routing" }, "Appointy": { "cats": [ 72 ], "description": "Appointy is a cloud-based scheduling solution that helps professionals and businesses to manage their appointment scheduling activities and routines.", "website": "https://www.appointy.com/" }, "Appsflyer": { "cats": [ 10 ], "js": [ "appsflyersdkobject" ], "scriptSrc": [ "websdk\\.appsflyer\\.com" ], "description": "AppsFlyer is a SaaS mobile marketing analytics and attribution platform.", "website": "https://www.appsflyer.com/" }, "Apptus": { "cats": [ 76 ], "cookies": { "apptus.customerkey": "", "apptus.sessionkey": "" }, "js": [ "apptusconfig", "apptusdebug", "apptusesales" ], "scriptSrc": [ "cdn\\.esales\\.apptus\\.com.+(?:apptus-esales-api-([\\d.]+))\\.min\\.js\\;version:\\1" ], "description": "Apptus is an AI-powered ecommerce optimisation software provider.", "website": "https://www.apptus.com" }, "Aprimo": { "cats": [ 95 ], "description": "Aprimo is a United States-based company that develops and sells marketing automation software and digital asset management technology.", "website": "https://www.aprimo.com" }, "AptusShop": { "cats": [ 6 ], "meta": { "generator": [ "^aptusshop\\.pl$" ] }, "description": "AptusShop is proprietary online store software created from scratch and developed by Aptus.pl.", "website": "https://www.aptusshop.pl" }, "AquilaCMS": { "cats": [ 1 ], "meta": { "powered-by": [ "aquilacms" ] }, "implies": [ "Amazon Web Services", "MongoDB", "Next.js", "Node.js", "React" ], "description": "AquilaCMS is a fullstack, headless CMS written in JavaScript.", "website": "https://www.aquila-cms.com/" }, "Arastta": { "cats": [ 6 ], "headers": { "arastta": "^(.+)$\\;version:\\1", "x-arastta": "" }, "scriptSrc": [ "arastta\\.js" ], "implies": [ "PHP" ], "description": "Arastta is a free and open-source project with contributors from all over the world.", "website": "https://arastta.org", "cpe": "cpe:2.3:a:arastta:ecommerce:*:*:*:*:*:*:*:*" }, "Arc": { "cats": [ 31 ], "js": [ "arc.p2pclient", "arcwidgetjsonp" ], "scriptSrc": [ "arc\\.io/widget\\.js" ], "description": "Arc is a peer-to-peer CDN that pays site owners for using it. Instead of expensive servers in distant datacenters, Arc's network is comprised of browsers.", "website": "https://arc.io" }, "Arc XP": { "cats": [ 1, 95 ], "js": [ "fusion.arcsite" ], "description": "Arc XP is a cloud-based digital experience platform that helps enterprise companies, retail brands and media and entertainment organization create and distribute content, drive digital commerce, and deliver powerful experiences.", "website": "https://www.arcxp.com" }, "ArcGIS API for JavaScript": { "cats": [ 35 ], "scriptSrc": [ "basemaps\\.arcgis\\.com", "js\\.arcgis\\.com" ], "description": "ArcGIS API for JavaScript is a tool used to embed maps and tasks in web applications.", "website": "https://developers.arcgis.com/javascript/" }, "Arena": { "cats": [ 5 ], "js": [ "arenahub.arenaidentify", "arenaim.initializeliveblog", "arenaliveblog" ], "description": "Arena widget is an embeddable widget provided by the Arena platform, which allows users to embed live blogs directly on their website.", "website": "https://arena.im" }, "Arreva": { "cats": [ 111 ], "scriptSrc": [ "/arreva-onlinedonations-portlet/" ], "description": "Arreva is a fundraising software that provides the ability to mobilise constituents using the donor tracking system.", "website": "https://www.arreva.com" }, "Arsys Domain Parking": { "cats": [ 109 ], "description": "Arsys is a Spanish domain registrar.", "website": "https://www.arsys.es" }, "Artifactory": { "cats": [ 47 ], "js": [ "artifactoryupdates" ], "html": [ "\u003cspan class=\"version\"\u003eartifactory(?: pro)?(?: power pack)?(?: ([\\d.]+))?\\;version:\\1" ], "scriptSrc": [ "wicket/resource/org\\.artifactory\\." ], "website": "https://jfrog.com/open-source/#os-arti", "cpe": "cpe:2.3:a:jfrog:artifactory:*:*:*:*:*:*:*:*" }, "Artifactory Web Server": { "cats": [ 22 ], "headers": { "server": "artifactory(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Artifactory" ], "website": "https://jfrog.com/open-source/#os-arti", "cpe": "cpe:2.3:a:jfrog:artifactory:*:*:*:*:*:*:*:*" }, "Aruba.it": { "cats": [ 88, 62 ], "headers": { "x-servername": "\\.aruba\\.it" }, "description": "Aruba.it is an Italian company mainly active in the web hosting and domain registration businesses.", "website": "https://www.aruba.it" }, "ArvanCloud": { "cats": [ 31 ], "js": [ "arvancloud" ], "headers": { "server": "arvancloud" }, "description": "ArvanCloud is a cloud services provider, offering a wide range of incorporated cloud services including CDN, DDoS mitigation, Cloud Managed DNS, Cloud Security, VoD/AoD Streaming, Live Streaming, Cloud Compute, Cloud Object Storage, and PaaS.", "website": "https://www.arvancloud.ir" }, "Arya CMS": { "cats": [ 1 ], "js": [ "aryacms" ], "description": "Arya CMS is a lesser-known content management system that may not have a significant user base or active development community.", "website": "https://sndigitalhub.com" }, "Asana": { "cats": [ 13 ], "description": "Asana is a web and mobile application designed to help teams organize, track, and manage their work.", "website": "https://asana.com" }, "AsciiDoc": { "cats": [ 1, 20, 27 ], "js": [ "asciidoc" ], "meta": { "generator": [ "^asciidoc ([\\d.]+)\\;version:\\1" ] }, "description": "AsciiDoc is a text document format for writing documentation, slideshows, web pages, man pages and blogs. AsciiDoc files can be translated to many formats including HTML, PDF, EPUB, man page.", "website": "https://www.methods.co.nz/asciidoc" }, "Asciidoctor": { "cats": [ 4 ], "meta": { "generator": [ "^asciidoctor\\s([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Ruby" ], "description": "Asciidoctor is an open-source text processor and publishing toolchain, written in Ruby, for converting AsciiDoc content to HTML 5, DocBook 5, and other formats.", "website": "https://github.com/asciidoctor/asciidoctor" }, "Asciinema": { "cats": [ 14 ], "js": [ "asciinema", "asciinemaplayer" ], "html": [ "\u003casciinema-player" ], "scriptSrc": [ "asciinema\\.org/" ], "description": "Asciinema is a free and open-source solution for recording terminal sessions and sharing them on the web.", "website": "https://asciinema.org/" }, "Asendia": { "cats": [ 99 ], "description": "Asendia is an international mail joint venture of French La Poste and Swiss Post.", "website": "https://www.asendia.com" }, "Asgaros Forum": { "cats": [ 87, 2 ], "scriptSrc": [ "/wp-content/plugins/asgaros-forum/" ], "description": "Asgaros Forum is a lightweight and simple forum plugin for WordPress.", "website": "https://www.asgaros.de" }, "Assertive Yield": { "cats": [ 36 ], "js": [ "assertive.predict" ], "description": "Assertive Yield is a SaaS company that specialises in helping SSPs (Supply-Side Platforms), publishers, and ad networks optimise their advertising revenue through real-time attribution and yield optimisation strategies.", "website": "https://www.assertiveyield.com" }, "Astra": { "cats": [ 80 ], "scriptSrc": [ "themes/astra\\s*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "Astra is a fast, lightweight, and highly customizable WordPress Theme.", "website": "https://wpastra.com/" }, "Astra Widgets": { "cats": [ 87, 5 ], "description": "Astra Widgets is a handy little free plugin that lets you display address, list icons or social profiles within the Astra Theme.", "website": "https://wpastra.com/did-you-know-astra-is-widget-ready" }, "Astro": { "cats": [ 57, 12 ], "js": [ "astro" ], "meta": { "generator": [ "^astro\\sv([\\d\\.]+)$\\;version:\\1" ] }, "description": "Astro is a new JavaScript-based static site builder.", "website": "https://astro.build" }, "Astute Solutions": { "cats": [ 53 ], "scriptSrc": [ "\\.iperceptions\\.com" ], "description": "Astute Solutions is a customer engagement software.", "website": "https://astutesolutions.com" }, "Atatus": { "cats": [ 78, 13 ], "js": [ "atatus.version" ], "scriptSrc": [ "/atatus\\.js" ], "description": "Atatus is a full-stack observability tool that let you identify the performance bottlenecks and helps you optimise your application at the right time.", "website": "https://www.atatus.com" }, "Athena Search": { "cats": [ 29 ], "scriptSrc": [ "wp-content/plugins/athena-search" ], "description": "Athena Search is a customizable autocomplete, feature-rich dashboard, smart predictions, real-time reports search engine developed from scratch by Syncit Group’s.", "website": "https://www.athenasearch.io" }, "Atlassian Bitbucket": { "cats": [ 47 ], "js": [ "bitbucket" ], "html": [ "\u003cli\u003eatlassian bitbucket \u003cspan title=\"[a-z0-9]+\" id=\"product-version\" data-commitid=\"[a-z0-9]+\" data-system-build-number=\"[a-z0-9]+\"\u003e v([\\d.]+)\u003c\\;version:\\1" ], "meta": { "application-name": [ "bitbucket" ] }, "implies": [ "Python" ], "description": "Bitbucket is a web-based version control repository hosting service for source code and development projects that use either Mercurial or Git revision control systems.", "website": "https://www.atlassian.com/software/bitbucket/overview/", "cpe": "cpe:2.3:a:atlassian:bitbucket:*:*:*:*:*:*:*:*" }, "Atlassian Confluence": { "cats": [ 8 ], "headers": { "x-confluence-request-time": "" }, "meta": { "confluence-request-time": [] }, "implies": [ "Java" ], "description": "Atlassian Confluence is a web-based collaboration wiki tool.", "website": "https://www.atlassian.com/software/confluence/overview/team-collaboration-software", "cpe": "cpe:2.3:a:atlassian:confluence:*:*:*:*:*:*:*:*" }, "Atlassian FishEye": { "cats": [ 47 ], "cookies": { "fesessionid": "" }, "html": [ "\u003ctitle\u003e(?:log in to )?fisheye (?:and crucible )?([\\d.]+)?\u003c/title\u003e\\;version:\\1" ], "website": "https://www.atlassian.com/software/fisheye/overview/", "cpe": "cpe:2.3:a:atlassian:fisheye:*:*:*:*:*:*:*:*" }, "Atlassian Jira": { "cats": [ 13 ], "js": [ "jira.id" ], "meta": { "application-name": [ "jira" ], "data-version": [ "([\\d.]+)\\;version:\\1\\;confidence:0" ] }, "implies": [ "Java" ], "website": "https://www.atlassian.com/software/jira/overview/", "cpe": "cpe:2.3:a:atlassian:jira:*:*:*:*:*:*:*:*" }, "Atlassian Jira Issue Collector": { "cats": [ 13, 47 ], "scriptSrc": [ "atlassian\\.jira\\.collector\\.plugin", "jira-issue-collector-plugin" ], "description": "Atlassian Jira Issue Collector is a tool used to download a list of websites using with email addresses, phone numbers and LinkedIn profiles.", "website": "https://www.atlassian.com/software/jira/overview/" }, "Atlassian Statuspage": { "cats": [ 13, 62 ], "headers": { "x-statuspage-skip-logging": "", "x-statuspage-version": "" }, "html": [ "\u003ca[^\u003e]*href=\"https?://(?:www\\.)?statuspage\\.io/powered-by[^\u003e]+\u003e" ], "description": "Statuspage is a status and incident communication tool.", "website": "https://www.atlassian.com/software/statuspage" }, "Atome": { "cats": [ 91 ], "js": [ "atomewidget" ], "scriptSrc": [ "gateway\\.apaylater\\.com/" ], "description": "Atome is a brand that allows users to purchase products online and pay for them in monthly installments.", "website": "https://www.atome.sg/" }, "Attentive": { "cats": [ 76 ], "js": [ "__attentive", "__attentive_domain", "attn_email_save" ], "scriptSrc": [ "cdn\\.attn\\.tv" ], "description": "Attentive is a personalised mobile messaging platform that helps retail \u0026 ecommerce brands acquire, retain, and interact with mobile shoppers.", "website": "https://www.attentivemobile.com" }, "Attraqt": { "cats": [ 29, 76 ], "js": [ "_attraqt" ], "scriptSrc": [ "cdn\\.attraqt\\.io" ], "description": "Attraqt provides AI-driven search, merchandising and personalisation solutions.", "website": "https://www.attraqt.com/" }, "AudioEye": { "cats": [ 68 ], "js": [ "$ae.attrhooks", "window.audioeye.version" ], "scriptSrc": [ "(?:\\.)?audioeye\\.com/(?:ae\\.js)?" ], "description": "AudioEye is an accessibility overlay which claims to provide ADA and WCAG accessibility compliance.", "website": "https://www.audioeye.com" }, "Audiohook": { "cats": [ 36 ], "description": "Audiohook specializes in programmatic audio advertising.", "website": "https://www.audiohook.com" }, "Aument": { "cats": [ 75, 98 ], "description": "Aument is an ecommerce toolbox with easy to use marketing actions and workflows.", "website": "https://aument.io" }, "Aura": { "cats": [ 66 ], "js": [ "aura.app" ], "description": "Aura is an open-source UI framework built by Salesforce for developing dynamic web apps for mobile and desktop devices.", "website": "https://github.com/forcedotcom/aura" }, "Aurelia": { "cats": [ 12 ], "js": [ "_aureliaconfiguremoduleloader", "localaurelia" ], "scriptSrc": [ "/aurelia[\\d\\w\\-\\.]+\\.js" ], "description": "Aurelia is an open-source UI JavaScript framework designed to create single page applications.", "website": "https://aurelia.io" }, "Auryc": { "cats": [ 10 ], "js": [ "aurycjslibconfig.base.code_version" ], "scriptSrc": [ "cdn\\.auryc\\.com/" ], "description": "Auryc is a client-side journey intelligence platform that surfaces real-time insights.", "website": "https://www.auryc.com" }, "Australia Post": { "cats": [ 99 ], "description": "Australia Post is the government business enterprise that provides postal services in Australia.", "website": "https://auspost.com.au" }, "Auth0": { "cats": [ 69 ], "headers": { "x-auth0-requestid": "" }, "scriptSrc": [ "/auth0(?:-js)?/([\\d.]+)/auth0(?:.min)?\\.js\\;version:\\1", "/auth0-js@([\\d.]+)/([a-z]+)/auth0\\.min\\.js\\;version:\\1" ], "description": "Auth0 provides authentication and authorisation as a service.", "website": "https://auth0.github.io/auth0.js/index.html", "cpe": "cpe:2.3:a:auth0:auth0.js:*:*:*:*:*:node.js:*:*" }, "Auth0 Lock": { "cats": [ 69 ], "scriptSrc": [ "/lock/([\\d.]+)/lock(?:.min)?\\.js\\;version:\\1" ], "implies": [ "Auth0" ], "description": "Auth0 Lock enables you to easily add social identity providers, so that your users can log in seamlessly using any desired provider.", "website": "https://auth0.com/docs/libraries/lock" }, "Autoketing": { "cats": [ 32 ], "description": "Autoketing is a marketing automation platform.", "website": "https://autoketing.com" }, "Autoketing Product Reviews": { "cats": [ 100, 90 ], "js": [ "autoketingproduct_reivew" ], "implies": [ "Autoketing", "Shopify" ], "description": "Autoketing Product Reviews is an application that allows shop owners to manage the product review section on their website.", "website": "https://apps.shopify.com/product-reviews-autoketing" }, "Automatad": { "cats": [ 36 ], "scriptSrc": [ "//go\\.automatad\\.com/" ], "description": "Automatad is a digital media products company that provides a suite of programmatic monetisation solutions.", "website": "https://automatad.com/" }, "Automatic.css": { "cats": [ 66, 87 ], "description": "Automatic.css is a CSS framework for WordPress page builders.", "website": "https://automaticcss.com" }, "Automizely": { "cats": [ 32 ], "js": [ "am_consent_sdk.product", "amstorefrontkit.hrequesteventtarget", "automizelyconversions" ], "scriptSrc": [ "\\.automizely\\.com/" ], "description": "Automizely creates and manages enterprise-level marketing automation systems including contact and CRM mappings, lead funnels, email nurture, lead-generating pages, and blog posts, and website integrations.", "website": "https://www.automizely.com/marketing" }, "Autopilot": { "cats": [ 32, 74, 75 ], "js": [ "autopilot", "autopilotanywhere" ], "description": "Autopilot is a visual marketing software that enables users to create marketing campaigns and manage lead conversions. ", "website": "https://www.autopilothq.com" }, "Autoptimize": { "cats": [ 87, 92 ], "scriptSrc": [ "/wp-content/plugins/autoptimize/.+\\.js(?:\\?ao_version=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Autoptimize is a WordPress plugin that optimises website performance by aggregating, minifying, and compressing HTML, CSS, and JavaScript files.", "website": "https://autoptimize.com" }, "Avada AVASHIP": { "cats": [ 100 ], "js": [ "avada_fsb.bars" ], "scriptSrc": [ "freeshippingbar\\.apps\\.avada\\.io/" ], "description": "Avada AVASHIP is an order tracking Shopify app.", "website": "https://apps.shopify.com/avaship" }, "Avada Boost Sales": { "cats": [ 100, 5 ], "js": [ "avada_bs_last_update" ], "scriptSrc": [ "boostsales\\.apps\\.avada\\.io/" ], "description": "AVADA Boost Sales is a one-stop solution that is specially designed to increase your sales with countdown timer, trust badges, sales pop, sales boost and many more.", "website": "https://apps.shopify.com/avada-boost-sales" }, "Avada SEO": { "cats": [ 100, 54 ], "scriptSrc": [ "seo\\.apps\\.avada\\.io/" ], "description": "Avada SEO is a Shopify app built and designed following strict SEO practices.", "website": "https://apps.shopify.com/avada-seo-suite" }, "Avada Size Chart": { "cats": [ 100 ], "scriptSrc": [ "sizechart\\.apps\\.avada\\.io/" ], "description": "Avada Size Chart is a thoughtful app that helps online stores reduce return rates with useful size guides.", "website": "https://apps.shopify.com/avada-size-chart" }, "Avangate": { "cats": [ 6 ], "js": [ "__avng8_callbacks", "avacart.version", "avaslugify" ], "scriptSrc": [ "^https?://edge\\.avangate\\.net/" ], "implies": [ "Verifone 2Checkout" ], "description": "Avangate (2Checkout) is a digital ecommerce platform for businesses that sell physical goods or digital products.", "website": "https://www.2checkout.com" }, "Avanser": { "cats": [ 10 ], "js": [ "avansercore", "avanserjs", "avanseroptions" ], "description": "Avanser allow you to track every call and enable your business to make better-informed decisions based on your phone calls.", "website": "https://www.avanser.com" }, "Avasize": { "cats": [ 5 ], "scriptSrc": [ "^https?://cdn\\.avasize\\.com/" ], "website": "https://www.avasize.com" }, "Avis Verifies": { "cats": [ 90 ], "js": [ "avisverifies" ], "scriptSrc": [ "\\.avis-verifies\\.com/" ], "description": "Avis Verifies is a complete solution for managing your customer reviews.", "website": "https://www.netreviews.com" }, "Aweber": { "cats": [ 32, 75 ], "js": [ "awt_analytics" ], "scriptSrc": [ "\\.aweber\\.com/" ], "description": "AWeber is an email marketing service.", "website": "https://www.aweber.com" }, "Awesomplete": { "cats": [ 29 ], "js": [ "awesomplete" ], "html": [ "\u003clink[^\u003e]+href=\"[^\u003e]*awesomplete(?:\\.min)?\\.css" ], "scriptSrc": [ "/awesomplete\\.js(?:$|\\?)" ], "description": "Awesomplete is a tool in the Javascript UI Libraries category of a tech stack.", "website": "https://leaverou.github.io/awesomplete/" }, "Axeptio": { "cats": [ 67 ], "js": [ "axeptiosdk", "axeptiosettings" ], "description": "Axeptio is a trusted third party that collects and archive users' consent in a GDPR compliant fashion.", "website": "https://www.axeptio.eu" }, "Axios": { "cats": [ 59 ], "js": [ "axios.get" ], "scriptSrc": [ "/axios(@|/)([\\d.]+)(?:/[a-z]+)?/axios(?:.min)?\\.js\\;version:\\2" ], "description": "Promise based HTTP client for the browser and node.js", "website": "https://github.com/axios/axios" }, "Azion": { "cats": [ 31 ], "headers": { "server": "^azion " }, "website": "https://www.azion.com/" }, "Azko CMS": { "cats": [ 1 ], "scriptSrc": [ "//js\\.fw\\.azko\\.fr/" ], "description": "Azko CMS is a content management system developed by Azko (Septeo Group) specifically launched for lawyers in France.", "website": "https://www.azko.fr" }, "Azoya": { "cats": [ 6, 106 ], "js": [ "image_cdn_host" ], "headers": { "x-azoya-webisteid": "" }, "description": "Azoya helps international brands and retailers sell directly to Chinese consumers through cross-border ecommerce.", "website": "https://www.azoyagroup.com" }, "Azure": { "cats": [ 62 ], "cookies": { "arraffinity": "", "tipmix": "" }, "headers": { "azure-regionname": "", "azure-sitename": "", "azure-slotname": "", "azure-version": "", "server": "^windows-azure", "x-ms-client-request-id": "", "x-ms-correlation-request-id": "", "x-ms-gateway-requestid": "" }, "description": "Azure is a cloud computing service for building, testing, deploying, and managing applications and services through Microsoft-managed data centers.", "website": "https://azure.microsoft.com" }, "Azure AD B2C": { "cats": [ 69 ], "implies": [ "Azure" ], "description": "Azure Active Directory B2C is a customer identity access management (CIAM) solution.", "website": "https://azure.microsoft.com/en-us/services/active-directory/external-identities/b2c/" }, "Azure CDN": { "cats": [ 31, 23 ], "headers": { "server": "^(?:ecacc|ecs|ecd)", "x-ec-debug": "" }, "implies": [ "Azure" ], "description": "Azure Content Delivery Network (CDN) reduces load times, save bandwidth and speed responsiveness.", "website": "https://azure.microsoft.com/en-us/services/cdn/" }, "Azure Edge Network": { "cats": [ 19 ], "headers": { "content-security-policy": "\\.azureedge\\.net" }, "scriptSrc": [ "\\.azureedge\\.net/" ], "description": "Azure Edge Network is a global network infrastructure provided by Microsoft Azure. It is designed to deliver content, applications, and services to end-users with low latency and high performance. The Azure Edge Network consists of a combination of Azure Content Delivery Network (CDN), Azure Front Door, and Azure Traffic Manager.", "website": "https://learn.microsoft.com/en-us/azure/cdn/cdn-overview" }, "Azure Front Door": { "cats": [ 65 ], "cookies": { "aslbsa": "", "aslbsacors": "" }, "headers": { "x-azure-ref": "" }, "implies": [ "Azure" ], "description": "Azure Front Door is a scalable and secure entry point for fast delivery of your global web applications.", "website": "https://docs.microsoft.com/en-us/azure/frontdoor/" }, "Azure Monitor": { "cats": [ 10, 92 ], "headers": { "content-security-policy": "js\\.monitor\\.azure\\.com" }, "scriptSrc": [ "js\\.monitor\\.azure\\.com/" ], "implies": [ "Azure" ], "description": "Azure Monitor collects monitoring telemetry from a variety of on-premises and Azure sources. Azure Monitor helps you maximise the availability and performance of your applications and services.", "website": "https://azure.microsoft.com/en-us/services/monitor" }, "B2C Europe": { "cats": [ 99 ], "description": "B2C Europe offers logistic solutions for your ecommerce businesses.", "website": "https://www.b2ceurope.eu/" }, "BEM": { "cats": [ 12 ], "html": [ "\u003c[^\u003e]+data-bem" ], "description": "BEM (Block, Element, Modifier) is a naming convention for classes in HTML and CSS what was developed by Yandex.", "website": "https://en.bem.info" }, "BIGACE": { "cats": [ 1 ], "meta": { "generator": [ "bigace ([\\d.]+)\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Bigace is a free open-source content management developed in PHP and JavaScript that uses a MySQL or ADOdb environment.", "website": "https://github.com/bigace" }, "BON Loyalty": { "cats": [ 84, 100 ], "js": [ "bonshopinfo.appearance" ], "scriptSrc": [ "app\\.bonloyalty\\.com/" ], "description": "BON Loyalty is a free rewards and referrals app that helps merchants increase customer engagement with captivating points, rewards \u0026 referral program.", "website": "https://bonloyalty.com" }, "BOOM": { "cats": [ 1 ], "headers": { "x-supplied-by": "mana" }, "meta": { "generator": [ "^boom site builder$" ] }, "implies": [ "WordPress" ], "website": "https://manaandisheh.com" }, "BRT": { "cats": [ 99 ], "description": "BRT, also known as Bartolini, is an Italian-based logistics service provider.", "website": "https://www.brt.it" }, "BSmart": { "cats": [ 6 ], "cookies": { "bsmartstate": "" }, "js": [ "bsgetbsmartstock", "bsmartconfirmwindow", "bsmartpricelist" ], "description": "BSmart is an ecommerce platform, programmed by Microline.", "website": "https://www.bsmart.co.il/?utm_source=wappalyzer\u0026utm_medium=referral" }, "Babel": { "cats": [ 19 ], "js": [ "_babelpolyfill" ], "description": "Babel is a free and open-source transcompiler for writing next generation JavaScript.", "website": "https://babeljs.io" }, "Bablic": { "cats": [ 89 ], "js": [ "bablic" ], "description": "Bablic is a localisation solution to translate your website.", "website": "https://www.bablic.com/" }, "Babylist": { "cats": [ 5 ], "scriptSrc": [ "babylist\\.com/" ], "description": "Babylist is a universal wish list.", "website": "https://www.babylist.com" }, "Babylon.js": { "cats": [ 25 ], "js": [ "babylon.addressmode" ], "description": "Babylon.js is a real time 3D engine using a JavaScript library for displaying 3D graphics in a web browser via HTML5. The source code is available on GitHub and distributed under the Apache License 2.0.", "website": "https://www.babylonjs.com/" }, "Back In Stock": { "cats": [ 100 ], "scriptSrc": [ "app\\.backinstock\\.org/" ], "description": "Back In Stock lets your customers choose restock alerts for specific variant combinations, including size, colour or style.", "website": "https://backinstock.org" }, "Backbone.js": { "cats": [ 12 ], "js": [ "backbone", "backbone.version" ], "scriptSrc": [ "backbone.*\\.js" ], "implies": [ "Underscore.js" ], "description": "BackboneJS is a JavaScript library that allows to develop and structure the client side applications that run in a web browser.", "website": "https://backbonejs.org", "cpe": "cpe:2.3:a:backbone_project:backbone:*:*:*:*:*:*:*:*" }, "Backdrop": { "cats": [ 1 ], "js": [ "backdrop" ], "headers": { "x-backdrop-cache": "", "x-generator": "^backdrop cms(?:\\s([\\d.]+))?\\;version:\\1" }, "meta": { "generator": [ "^backdrop cms(?:\\s([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Backdrop is an open-source content management system (CMS) derived from Drupal 7, offering a user-friendly interface, customisable content types, taxonomies, views, theming capabilities, extensibility through modules, and regular security updates.", "website": "https://backdropcms.org", "cpe": "cpe:2.3:a:backdropcms:backdrop:*:*:*:*:*:*:*:*" }, "Baidu Analytics (百度统计)": { "cats": [ 10 ], "scriptSrc": [ "hm\\.baidu\\.com/hm?\\.js" ], "description": "Baidu Analytics (百度统计) is a free tool for tracking and reporting traffic data of users visiting your site.", "website": "https://tongji.baidu.com/" }, "Baidu Maps": { "cats": [ 35 ], "js": [ "bmap.version", "bmap_api_version" ], "description": "Baidu Maps is a desktop and mobile web mapping service application and technology provided by Baidu, offering satellite imagery, street maps, street view and indoor view perspectives, as well as functions such as a route planner for traveling by foot, car, or with public transportation.", "website": "https://map.baidu.com" }, "BambooHR": { "cats": [ 101 ], "js": [ "scrolltobamboohr" ], "headers": { "content-security-policy": "\\.bamboohr\\.com" }, "scriptSrc": [ "\\.bamboohr\\.com/" ], "description": "BambooHR is an American technology company that provides human resources software as a service.", "website": "https://www.bamboohr.com" }, "Bambuser": { "cats": [ 103 ], "js": [ "_bambuser", "bambuserliveshopping" ], "scriptSrc": [ "\\.bambuser\\.com/" ], "description": "Bambuser is a SaaS company based in Stockholm that provides live video shopping technology.", "website": "https://bambuser.com" }, "BandsInTown Events Widget": { "cats": [ 5 ], "scriptSrc": [ "widget\\.bandsintown\\.com/" ], "description": "Bandsintown Events Widget is a free widget which makes it simple to embed your event listings and allow fans to buy tickets, RSVP, follow you and join your Email \u0026 SMS lists.", "website": "https://artists.bandsintown.com/support/events-widget" }, "Banshee": { "cats": [ 1, 18 ], "headers": { "x-powered-by": "banshee php framework v([\\d\\.]+)\\;version:\\1" }, "meta": { "generator": [ "banshee php" ] }, "implies": [ "PHP" ], "description": "Banshee is a PHP website framework with a main focus on security. Banshee is protected against common attacks like SQL injection, cross-site scripting, cross-site request forgery and session hijacking.", "website": "https://www.banshee-php.org" }, "Barba.js": { "cats": [ 59 ], "js": [ "barba.version" ], "description": "Barba.js is a small and easy-to-use javascript library that helps you creating fluid and smooth transitions between your website's pages.", "website": "https://barba.js.org" }, "Barilliance": { "cats": [ 76, 98 ], "scriptSrc": [ "\\.barilliance\\.net/" ], "description": "Barilliance is an ecommerce personalisation tools including cart abandonment emails, personalised product recommendations, onsite personalisation, and live notifications.", "website": "https://www.barilliance.com" }, "Base": { "cats": [ 6 ], "js": [ "base.app.open_nav", "base_api.shop_id" ], "scriptSrc": [ "thebase\\.in/js" ], "meta": { "base-theme-name": [ "\\;confidence:50" ], "base-theme-version": [ "\\d+\\;confidence:50" ] }, "description": "Base is a hosted ecommerce platform that allows business owners to set up an online store and sell their products online.", "website": "https://thebase.in" }, "Basic": { "cats": [ 16 ], "headers": { "www-authenticate": "^basic" }, "description": "Basic is an authetication method used by some web servers.", "website": "https://tools.ietf.org/html/rfc7617" }, "Basil.css": { "cats": [ 66 ], "description": "Basil.css is a responsive and customizable UI framework.", "website": "https://basilcss.com" }, "Basis Technologies": { "cats": [ 36 ], "scriptSrc": [ "cdn01\\.basis\\.net" ], "description": "Basis Technologies, formerly ‘Centro,’ provides cloud-based workflow automation and business intelligence software for marketing.", "website": "https://basis.net/" }, "Batflat": { "cats": [ 1 ], "meta": { "generator": [ "^batflat$" ] }, "implies": [ "PHP", "SQLite" ], "description": "Batflat is a lightweight CMS for free.", "website": "https://batflat.org" }, "Bazaarvoice Curation": { "cats": [ 96 ], "scriptSrc": [ "cdn\\.curalate\\.com", "edge\\.curalate\\.com" ], "description": "Bazaarvoice Curation is a content curation service Bazaarvoice provides post it's acquisition of Curalate.", "website": "https://www.bazaarvoice.com/products/visual-and-social-content/" }, "Bazaarvoice Reviews": { "cats": [ 90 ], "js": [ "bv.api" ], "scriptSrc": [ "apps\\.bazaarvoice\\.com" ], "description": "Bazaarvoice is a provider of user-generated content solutions like ratings and reviews and Q\u0026A.", "website": "https://www.bazaarvoice.com/products/ratings-and-reviews/" }, "Beam AfterSell": { "cats": [ 100 ], "js": [ "aftersell.hooks" ], "scriptSrc": [ "\\.aftersell\\.app/" ], "implies": [ "Shopify" ], "description": "AfterSell is a Shopify app by Beam which helps brands create powerful post purchase offers.", "website": "https://www.aftersell.com" }, "Beam OutSell": { "cats": [ 100 ], "js": [ "outsellairecommendationsisenabled", "outsellapp" ], "scriptSrc": [ "//outsellapp\\.com/" ], "implies": [ "Shopify" ], "description": "OutSell is a Shopify app by Beam. Frequently Bought Together, Discounted Upsell, Also Bought.", "website": "https://apps.shopify.com/outsell" }, "Beamer": { "cats": [ 85 ], "js": [ "_beamer_url", "beamer.enabled" ], "description": "Beamer is a feature management platform that allows businesses to manage and share new product releases, feature updates, and bug fixes with their customers.", "website": "https://www.getbeamer.com" }, "Beans": { "cats": [ 84 ], "js": [ "beans3" ], "scriptSrc": [ "cdn\\.trybeans\\.com" ], "description": "Beans is a provider of ecommerce loyalty programs.", "website": "https://www.trybeans.com/" }, "Beehiiv": { "cats": [ 11 ], "description": "Beehiiv is a relatively young, hosted newsletter platform built for businesses and creators.", "website": "https://www.beehiiv.com" }, "Beehiiv RSS feed": { "cats": [ 49 ], "description": "Beehiiv RSS feed is a feature of the Beehiiv. Beehiiv is a relatively young, hosted newsletter platform built for businesses and creators.", "website": "https://www.beehiiv.com" }, "Beeketing": { "cats": [ 32 ], "js": [ "beeketinganalyticsparams", "beeketingsdkloaded" ], "scriptSrc": [ "sdk\\.beeketing\\.com/" ], "description": "Beeketing is a suite of marketing apps for ecommerce shop owners.", "website": "https://beeketing.com" }, "Beeswax": { "cats": [ 36 ], "scriptSrc": [ "segment\\.prod\\.bidr\\.io" ], "description": "Beeswax offers Bidder-as-a-Service solution.", "website": "https://www.beeswax.com/" }, "Bentobox": { "cats": [ 1, 93 ], "js": [ "bentoanalytics" ], "scriptSrc": [ "\\.getbento\\.com/" ], "description": "Bentobox is a restaurant website platform that handles menus, reservations, gift cards and more.", "website": "https://getbento.com" }, "Better Price": { "cats": [ 100 ], "js": [ "fc_metafield_betterprice.betterpricesuccess" ], "scriptSrc": [ "/shopify-apps//js/betterprice/betterprice\\.js" ], "implies": [ "Shopify" ], "description": "Better Price is a Shopify app which provide coupons to real leads only when discounted price is requested build by Architechpro.", "website": "https://apps.shopify.com/better-price" }, "Better Stack": { "cats": [ 13 ], "scriptSrc": [ "//(?:uptime\\.)?(?:betteruptime|betterstack)\\.com/" ], "description": "Better Stack is the all-in-one infrastructure monitoring platform for your incident management, uptime monitoring, and status pages.", "website": "https://betterstack.com/uptime" }, "BetterDocs": { "cats": [ 4 ], "js": [ "betterdocs.feedback", "betterdocs_pro.feedback", "betterdocspublic.post_id" ], "description": "BetterDocs is an advanced documentation and knowledge base plugin for WordPress and Shopify.", "website": "https://betterdocs.co" }, "BetterDocs plugin": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/betterdocs(?:-pro)?/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "BetterDocs" ], "description": "BetterDocs plugin is an advanced documentation and knowledge base plugin for WordPress.", "website": "https://betterdocs.co/docs/wordpress" }, "Betty Blocks": { "cats": [ 47, 62 ], "meta": { "description": [ "^made with betty blocks$" ] }, "implies": [ "React" ], "description": "Betty Blocks is a cloud-based application development solution featuring a no-code, drag-and-drop interface for developing business applications.", "website": "https://www.bettyblocks.com" }, "Beyable": { "cats": [ 76 ], "cookies": { "beyable-cart": "", "beyable-cartd": "" }, "js": [ "beyable", "beyabledomain", "beyablekey" ], "scriptSrc": [ "msecnd\\.net/api/beyablejsv(\\d+)\\;version:\\1" ], "description": "Beyable is a suite of tools that analyze website traffic to understand visitors' behaviors in real-time, through multi-channel in order to optimise conversion rate.", "website": "https://beyable.com" }, "BeyondMenu": { "cats": [ 51, 93 ], "scriptSrc": [ "static\\.beyondmenu\\.com/" ], "description": "BeyondMenu is an online food ordering service.", "website": "https://www.beyondmenu.com/contactus.aspx" }, "Big Cartel": { "cats": [ 6 ], "meta": { "generator": [ "big cartel" ] }, "description": "Big Cartel is a cloud-hosted ecommerce platform.", "website": "https://www.bigcartel.com" }, "BigCommerce": { "cats": [ 6 ], "js": [ "bigcommerce_config", "bigcommerce_i18n" ], "scripts": [ "bigcommerceproductid" ], "scriptSrc": [ "(?:\\.|plugins/)?bigcommerce(?:\\.com)?/(?:assets)?" ], "description": "BigCommerce is a hosted ecommerce platform that allows business owners to set up an online store and sell their products online.", "website": "https://www.bigcommerce.com" }, "BigCommerce B2B Edition": { "cats": [ 6 ], "js": [ "bundleb2b.text.tpa", "bundleb2bfeatureflags" ], "scriptSrc": [ "cdn\\.bundleb2b\\.net/" ], "description": "BigCommerce B2B Edition is a specialised version of the BigCommerce ecommerce platform tailored for B2B companies, offering features such as custom pricing, catalogues, bulk ordering, quote requests, multi-user accounts, PO processing, and advanced reporting.", "website": "https://www.bundleb2b.com" }, "BigDataCloud IP Geolocation": { "cats": [ 79 ], "scriptSrc": [ "bigdatacloud\\.net" ], "description": "BigDataCloud IP Geolocation API provides detailed and accurate locality and security metrics of an IP address.", "website": "https://www.bigdatacloud.com/packages/ip-geolocation" }, "BigTree CMS": { "cats": [ 1 ], "js": [ "bigtree.growling", "bigtreematrix", "bigtreetagadder" ], "implies": [ "MySQL", "PHP" ], "description": "BigTree CMS is an extremely extensible open-source CMS built on PHP and MySQL.", "website": "https://www.bigtreecms.org", "cpe": "cpe:2.3:a:bigtreecms:bigtree_cms:*:*:*:*:*:*:*:*" }, "Bigin": { "cats": [ 53 ], "js": [ "bigin._checkdatasize", "bigin_sdk_api", "bigin_search", "bigincafe24disableoptions" ], "scriptSrc": [ "sdk\\.bigin\\.io/" ], "description": "Bigin is a cloud-based customer relationship management (CRM) software.", "website": "https://en.bigin.io" }, "Bigware": { "cats": [ 6 ], "cookies": { "bigwadminid": "", "bigwarecsid": "" }, "html": [ "(?:diese \u003ca href=[^\u003e]+bigware\\.de|\u003ca href=[^\u003e]+/main_bigware_\\d+\\.php)" ], "implies": [ "PHP" ], "website": "https://bigware.de", "cpe": "cpe:2.3:a:bigware:bigware_shop:*:*:*:*:*:*:*:*" }, "Bikayi": { "cats": [ 6 ], "scriptSrc": [ "assets\\.bikayi\\.com/" ], "description": "Bikayi is a WhatsApp-integrated ecommerce store.", "website": "https://bikayi.com" }, "Billbee": { "cats": [ 99 ], "description": "Billbee is an order processing and inventory management solution.", "website": "https://www.billbee.io/" }, "Binance Pay": { "cats": [ 41 ], "description": "Binance Pay is a contactless, borderless, and secure cryptocurrency payment technology designed by Binance.", "website": "https://pay.binance.com" }, "Birdeye": { "cats": [ 32, 5 ], "js": [ "bfiframe" ], "scriptSrc": [ "birdeye\\.com", "birdeye\\.com/embed" ], "description": "Birdeye is an all-in-one customer experience platform.", "website": "https://birdeye.com" }, "Bitcoin": { "cats": [ 41 ], "description": "Bitcoin is a decentralized digital currency, without a central bank or single administrator, that can be sent from user to user on the peer-to-peer bitcoin network without the need for intermediaries.", "website": "https://en.wikipedia.org/wiki/Bitcoin" }, "BiteSpeed": { "cats": [ 100, 98 ], "scripts": [ "app\\.bitespeed\\.co/" ], "scriptSrc": [ "cdn\\.bitespeed\\.co/" ], "description": "BiteSpeed is an all-in-one Shopify marketing app which helps ecommerce brands recover revenue.", "website": "https://www.bitespeed.co" }, "Bitrix24": { "cats": [ 53 ], "js": [ "b24tracker", "bitrix24formloader", "bitrix24formobject" ], "scriptSrc": [ "\\.bitrix24\\..+/bitrix/js/crm/form_loader\\.js", "cdn\\.bitrix24\\.com" ], "description": "Bitrix24 is a set of tools for the organization and management of business processes.", "website": "https://www.bitrix24.com" }, "BittAds": { "cats": [ 36 ], "js": [ "bitt" ], "scriptSrc": [ "bittads\\.com/js/bitt\\.js$" ], "website": "https://bittads.com" }, "Bizweb": { "cats": [ 6 ], "js": [ "bizweb" ], "website": "https://www.bizweb.vn" }, "Blackbaud CRM": { "cats": [ 111 ], "js": [ "blackbaud", "don_premium_map" ], "scriptSrc": [ "js/convio/modules\\.js" ], "description": "Blackbaud CRM gathers fundraising, online applications, actionable prospect research and analytics, and multichannel direct marketing into one platform.", "website": "https://www.blackbaud.com" }, "Blade": { "cats": [ 18, 22 ], "headers": { "x-powered-by": "blade-([\\w.]+)?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://lets-blade.com" }, "Blazor": { "cats": [ 18 ], "scriptSrc": [ "blazor\\.host\\.min\\.js", "blazor\\.server\\.js", "blazor\\.webassembly\\.js" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor" }, "Blessing Skin": { "cats": [ 7 ], "js": [ "blessing.version" ], "implies": [ "Laravel" ], "description": "Blessing Skin is a plubin that brings your custom skins back in offline Minecraft servers.", "website": "https://github.com/bs-community/blessing-skin-server" }, "Blesta": { "cats": [ 6 ], "cookies": { "blesta_sid": "" }, "website": "https://www.blesta.com" }, "Blitz": { "cats": [ 92 ], "js": [ "blitz", "blitzreplace" ], "headers": { "x-powered-by": "^blitz$" }, "html": [ "\u003c!-- cached by blitz on" ], "implies": [ "Craft CMS" ], "description": "Blitz provides intelligent static page caching for creating lightning-fast sites with Craft CMS.", "website": "https://putyourlightson.com/plugins/blitz" }, "Blitz.js": { "cats": [ 18 ], "js": [ "__blitz_middleware_hooks", "__blitz_suspense_enabled" ], "headers": { "x-powered-by": "^blitz\\.js?([0-9.]+)?\\;version:\\1" }, "implies": [ "Next.js" ], "description": "Blitz.js is a web development framework that uses Next.js and React and includes features for authentication, authorization, and database integration to simplify the creation of high-performance and scalable web applications.", "website": "https://blitzjs.com" }, "Blocksy": { "cats": [ 80 ], "js": [ "blocksyjsonp", "blocksyresponsivemenucache" ], "scriptSrc": [ "/wp-content/themes/blocksy/(?:.+main\\.js(?:\\?ver=([\\d\\.]+)))?\\;version:\\1" ], "description": "Blocksy is a modern and lightweight WordPress theme designed for a variety of websites, including blogs, portfolios, ecommerce stores, and business websites.", "website": "https://creativethemes.com/blocksy" }, "Blocksy Companion": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/blocksy-companion(?:-pro)?/" ], "implies": [ "Blocksy" ], "description": "Blocksy Companion is a WordPress plugin that provides additional functionality and features for the Blocksy theme.", "website": "https://creativethemes.com/blocksy/companion/" }, "Blogger": { "cats": [ 11 ], "meta": { "generator": [ "^blogger$" ] }, "implies": [ "Python" ], "description": "Blogger is a blog-publishing service that allows multi-user blogs with time-stamped entries.", "website": "https://www.blogger.com" }, "Bloomreach": { "cats": [ 1 ], "html": [ "\u003c[^\u003e]+/binaries/(?:[^/]+/)*content/gallery/" ], "website": "https://developers.bloomreach.com" }, "Bloomreach Discovery": { "cats": [ 29, 74 ], "js": [ "br_data.acct_id", "brtrk.scriptversion" ], "scriptSrc": [ "\\.brcdn\\.com/", "\\.brsrvr\\.com/" ], "description": "Bloomreach Discovery is a powerful combination of AI-powered site search, SEO, recommendations, and product merchandising.", "website": "https://www.bloomreach.com/en/products/discovery" }, "Blossom Travel": { "cats": [ 80 ], "js": [ "blossom_travel_data", "blossom_travel_pro_data" ], "scriptSrc": [ "/wp-content/themes/blossom-travel(?:-pro)?/.+custom\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Blossom Travel is a free WordPress theme which allows you to create various types of feminine blogs such as travel blog, personal blog, fashion blog, beauty blog, and many more.", "website": "https://blossomthemes.com/wordpress-themes/blossom-travel" }, "Blotout EdgeTag": { "cats": [ 32 ], "js": [ "edgetag", "edgetagproviders" ], "description": "Blotout EdgeTag is a technology provided by Blotout that tackles the effects of privacy changes on C-API signals by reconstructing signals around a lifetime ID, allowing for real-time remarketing of site visits.", "website": "https://blotout.io" }, "Blue": { "cats": [ 77 ], "js": [ "bluecpy_id", "blueproductid" ], "scriptSrc": [ "\\.getblue\\.io" ], "description": "Blue is a ecommerce data marketing, lead generation, real time bidding and recommendation solutions.", "website": "https://web.getblue.io/en/" }, "Blue Triangle": { "cats": [ 16, 78 ], "js": [ "_bttutil.version" ], "scriptSrc": [ "\\.btttag\\.com/btt\\.js" ], "description": "Blue Triangle is a connected view of marketing, web performance, and third-party tag analytics while constantly monitoring website code for security vulnerabilities.", "website": "https://bluetriangle.com" }, "BlueConic": { "cats": [ 97 ], "js": [ "blueconicclient", "blueconicengagement", "blueconicprelisteners", "loadvaluesfromblueconic" ], "description": "BlueConic is the advanced customer data platform that liberates companies' first-party data from disparate systems.", "website": "https://www.blueconic.com" }, "Bluecore": { "cats": [ 32, 75 ], "js": [ "_bluecoretrack", "bluecore_action_trigger", "triggermail", "triggermail_email_address" ], "scriptSrc": [ "\\.bluecore\\.com" ], "description": "Bluecore is a retail marketing technology that uses data gained from direct marketing like email, social media, site activity.", "website": "https://www.bluecore.com" }, "Bluefish": { "cats": [ 20 ], "meta": { "generator": [ "bluefish(?:\\s([\\d.]+))?\\;version:\\1" ] }, "description": "Bluefish is a free software text editor with a variety of tools for programming in general and the development of websites.", "website": "https://sourceforge.net/projects/bluefish" }, "Bluehost": { "cats": [ 88 ], "headers": { "host-header": "c2hhcmvklmjsdwvob3n0lmnvbq==" }, "description": "Bluehost is a large web host known for its WordPress expertise, variety of “one-stop-shop” services, and bargain prices.", "website": "https://www.bluehost.com" }, "Blueknow": { "cats": [ 76 ], "js": [ "blueknow", "blueknowtracker" ], "scriptSrc": [ "\\.blueknow\\.com" ], "description": "Blueknow is a ecommerce personalisation software designed to serve enterprises, SMEs.", "website": "https://www.blueknow.com" }, "Blueshift": { "cats": [ 10 ], "scriptSrc": [ "cdn.getblueshift.com/" ], "description": "Blueshift offers the SmartHub CDP, which helps brands deliver relevant and connected experiences across every customer interaction.", "website": "https://blueshift.com/" }, "Bluestone PIM": { "cats": [ 95 ], "description": "Bluestone PIM is primarily a product information management (PIM) solution, which is focused on managing and distributing product data across multiple channels. However, it also includes some features that are typically associated with digital asset management (DAM), such as the ability to manage and store product images, videos, and other digital assets.", "website": "https://www.bluestonepim.com" }, "Boats Group": { "cats": [ 51 ], "description": "Boats Group is a website platform for boat dealers and brokers.", "website": "https://www.boatsgroup.com/websites" }, "Boba.js": { "cats": [ 59 ], "scriptSrc": [ "boba(?:\\.min)?\\.js" ], "implies": [ "Google Analytics" ], "website": "https://boba.space150.com" }, "BoidCMS": { "cats": [ 1 ], "headers": { "x-powered-by": "boidcms" }, "implies": [ "PHP" ], "description": "BoidCMS is a free and open-source flat file CMS for building simple websites and blogs in seconds, developed using PHP and uses JSON as a database.", "website": "https://boidcms.github.io" }, "Bokeh": { "cats": [ 25 ], "js": [ "bokeh", "bokeh.version" ], "scriptSrc": [ "bokeh.*\\.js" ], "implies": [ "Python" ], "website": "https://bokeh.org" }, "Bokun": { "cats": [ 5, 72 ], "js": [ "__bokunwidgets", "bokunbookingchanneluuid", "bokunsessionid", "bokunwidgetembedder" ], "description": "Bokun is a cloud-based booking management solution which enables small to large travel and tourism businesses manage reservations, products content, images, categorisation, pricing, inventory, and payments.", "website": "https://www.bokun.io" }, "Bold Brain": { "cats": [ 100 ], "js": [ "bold.brain" ], "scriptSrc": [ "brain-assets\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Brain help customers discover more products and add more to their cart with dynamic recommendations for Shopify and use advanced analytics.", "website": "https://boldcommerce.com/bold-brain" }, "Bold Bundles": { "cats": [ 100 ], "js": [ "bold.bundles" ], "scriptSrc": [ "bundles\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Bundles Shopify app is designed to present recommended product widgets to cross-sell your products.", "website": "https://boldcommerce.com/bundles" }, "Bold Chat": { "cats": [ 52 ], "scriptSrc": [ "^https?://vmss\\.boldchat\\.com/aid/\\d{18}/bc\\.vms4/vms\\.js" ], "description": "BoldChat is a live chat platform.", "website": "https://www.boldchat.com/" }, "Bold Commerce": { "cats": [ 76 ], "scriptSrc": [ "\\.boldapps\\.net/", "\\.boldcommerce\\.com" ], "description": "Bold Commerce is a software company that specialises in ecommerce websites and app development.", "website": "https://boldcommerce.com" }, "Bold Custom Pricing": { "cats": [ 100 ], "js": [ "bold.csp.version" ], "scriptSrc": [ "cp.\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Custom Pricing is an app that makes it easy to create a tiered pricing structure for your customers.", "website": "https://boldcommerce.com/custom-pricing" }, "Bold Motivator": { "cats": [ 100 ], "scriptSrc": [ "motivate\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Motivator motivate customers to spend more on your store with free shipping and gifts using a customisable banner that counts down how much more they have to buy.", "website": "https://boldcommerce.com/motivator" }, "Bold Page Builder": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/bold-page-builder/" ], "description": "Bold Page Builder is a plugin or a theme component that allows users to structure and design responsive pages.", "website": "https://wordpress.org/plugins/bold-page-builder" }, "Bold Product Options": { "cats": [ 100 ], "js": [ "bold.options.version" ], "scriptSrc": [ "option\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Product Options is a Shopify app which allows customers to customise products with unlimited custom options built by Bold.", "website": "https://boldcommerce.com/product-options" }, "Bold Subscriptions": { "cats": [ 100 ], "js": [ "bold.subscriptions" ], "scriptSrc": [ "sub\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Subscriptions provides powerful, API-driven customisation options to build and scale a subscription service that fits your business.", "website": "https://boldcommerce.com/shopify-subscription-app" }, "Bold Themes": { "cats": [ 80 ], "js": [ "boldthemes_theme_loaded", "boldthemesuri" ], "implies": [ "WordPress" ], "description": "Bold Themes is a powerful and easy to use premium WordPress themes.", "website": "https://bold-themes.com/wordpress-themes-plugins/" }, "Bold Upsell": { "cats": [ 100 ], "js": [ "bold.upsell" ], "scriptSrc": [ "upsells\\.boldapps\\.net/" ], "implies": [ "Bold Commerce", "Shopify" ], "description": "Bold Upsell allows the substitution or attachment of products to the customers' carts.", "website": "https://boldcommerce.com/upsell" }, "BoldGrid": { "cats": [ 1, 11, 87 ], "html": [ "\u003clink rel=[\"']stylesheet[\"'] [^\u003e]+boldgrid", "\u003clink rel=[\"']stylesheet[\"'] [^\u003e]+post-and-page-builder", "\u003clink[^\u003e]+s\\d+\\.boldgrid\\.com" ], "scriptSrc": [ "/wp-content/plugins/post-and-page-builder" ], "description": "BoldGrid is a free website builder for WordPress websites.", "website": "https://boldgrid.com" }, "Bolt CMS": { "cats": [ 1 ], "meta": { "generator": [ "bolt" ] }, "implies": [ "PHP" ], "website": "https://bolt.cm", "cpe": "cpe:2.3:a:bolt:bolt:*:*:*:*:*:*:*:*" }, "Bolt Payments": { "cats": [ 41 ], "js": [ "bolt_callbacks", "boltcheckout", "boltpopup", "bolttrack" ], "scriptSrc": [ "account\\.bolt\\.com/", "connect\\.bolt\\.com/" ], "description": "Bolt powers a checkout experience designed to convert shoppers.", "website": "https://www.bolt.com/" }, "Bonfire": { "cats": [ 18 ], "cookies": { "bf_session": "" }, "html": [ "powered by \u003ca[^\u003e]+href=\"https?://(?:www\\.)?cibonfire\\.com[^\u003e]*\u003ebonfire v([^\u003c]+)\\;version:\\1" ], "implies": [ "CodeIgniter" ], "website": "https://cibonfire.com" }, "BookDinners": { "cats": [ 93 ], "scriptSrc": [ "bookdinners\\.nl/widget\\.js" ], "description": "BookDinners is a restaurant table booking widget.", "website": "https://www.bookdinners.nl" }, "BookStack": { "cats": [ 4 ], "cookies": { "bookstack_session": "" }, "implies": [ "Laravel", "MySQL", "PHP" ], "description": "BookStack is a simple, open-source, self-hosted, easy-to-use platform for organising and storing information.", "website": "https://www.bookstackapp.com", "cpe": "cpe:2.3:a:bookstackapp:bookstack:*:*:*:*:*:*:*:*" }, "BookThatApp": { "cats": [ 100, 72 ], "js": [ "bookthatapp" ], "scriptSrc": [ "\\.bookthatapp\\.com/" ], "implies": [ "Shopify" ], "description": "BookThatApp is a Shopify appointment booking, product rental and class booking app.", "website": "https://www.bookthatapp.com" }, "BookVisit": { "cats": [ 72 ], "scriptSrc": [ "online\\.bookvisit\\.com/" ], "description": "BookVisit is an IT services and IT consulting, recreation, and hotel company located in Goteborg,Sweden.", "website": "https://bookvisit.com" }, "Bookatable": { "cats": [ 93 ], "scriptSrc": [ "bda\\.bookatable\\.com/deploy/lbui\\.direct\\.min\\.js" ], "description": "Bookatable is a restaurant table booking widget.", "website": "https://www.bookatable.co.uk" }, "Bookeo": { "cats": [ 72 ], "js": [ "bookeo_start", "bookeo_startmobilelabel" ], "description": "Bookeo is a cloud-based booking and reservation solution that caters to tour operators, travel agencies, schools, therapists, photographers and event organizers.", "website": "https://www.bookeo.com" }, "Bookero": { "cats": [ 72 ], "js": [ "bookero_config" ], "scriptSrc": [ "cdn\\.bookero\\.pl" ], "description": "Bookero is online booking system for you website or Facebook page.", "website": "https://www.bookero.org" }, "Booking.com": { "cats": [ 71 ], "scriptSrc": [ "aff\\.bstatic\\.com/" ], "description": "Booking.com is one of the largest ecommerce travel companies in the world. As an affiliate member, you can make up to 40% commission.", "website": "https://www.booking.com/affiliate-program/v2/selfmanaged.html" }, "Booking.com widget": { "cats": [ 5 ], "scriptSrc": [ "q\\.bstatic\\.com/" ], "implies": [ "Booking.com" ], "description": "Booking.com is one of the largest ecommerce travel companies in the world. As an affiliate member, you can make up to 40% commission.", "website": "https://www.booking.com/affiliate-program/v2/selfmanaged.html" }, "Bookingkit": { "cats": [ 5, 72 ], "js": [ "bookingkitapp" ], "description": "Bookingkit is an online booking management solution. Bookingkit helps its users generate PDF invoices, manage day-to-day scheduling operations, and automatically sync availabilities in real time.", "website": "https://bookingkit.net/" }, "Bookly": { "cats": [ 72, 87 ], "js": [ "bookly", "booklycustomerprofile", "booklyl10n.daysshort" ], "scriptSrc": [ "/wp-content/plugins/bookly-responsive-appointment-booking-tool/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Bookly is a WordPress scheduling plugin that allows you to accept online reservations on your website and automate your booking system.", "website": "https://www.booking-wp-plugin.com" }, "Booksy": { "cats": [ 5, 72 ], "js": [ "booksy" ], "scriptSrc": [ "booksy\\.com/widget/code\\.js" ], "description": "Booksy is a booking system for people looking to schedule appointments for health and beauty services.", "website": "https://booksy.com/" }, "Boomerang": { "cats": [ 59, 78 ], "js": [ "boomr", "boomr_lstart", "boomr_mq" ], "description": "boomerang is a JavaScript library that measures the page load time experienced by real users, commonly called RUM (Real User Measurement).", "website": "https://akamai.github.io/boomerang" }, "Boost Commerce": { "cats": [ 29, 100 ], "js": [ "bcsffilterconfig.api.filterurl", "boostpfsappconfig.api.filterurl" ], "description": "Boost Commerce provides beautiful and advanced product filter and smart site search for Shopify stores to boost sales.", "website": "https://boostcommerce.net" }, "Booster Page Speed Optimizer": { "cats": [ 100, 92 ], "scriptSrc": [ "/assets/booster-page-speed-optimizer\\.js" ], "description": "The Page Speed Optimizer is a Shopify app built by BoosterApps.", "website": "https://apps.shopify.com/page-speed-optimizer" }, "Bootic": { "cats": [ 6 ], "js": [ "bootic.assetshost" ], "meta": { "autor": [ "^bootic$" ] }, "description": "Bootic is an all-in-one ecommerce platform from Chile.", "website": "https://www.bootic.io" }, "Bootstrap": { "cats": [ 66 ], "js": [ "bootstrap.alert.version", "jquery.fn.tooltip.constructor.version" ], "html": [ "\u003clink[^\u003e]* href=[^\u003e]*?bootstrap(?:[^\u003e]*?([0-9a-fa-f]{7,40}|[\\d]+(?:.[\\d]+(?:.[\\d]+)?)?)|)[^\u003e-]*?(?:\\.min)?\\.css\\;version:\\1", "\u003cstyle\u003e\\s+/\\*!\\s+\\* bootstrap v(\\d\\.\\d\\.\\d)\\;version:\\1" ], "scriptSrc": [ "bootstrap(?:[^\u003e]*?([0-9a-fa-f]{7,40}|[\\d]+(?:.[\\d]+(?:.[\\d]+)?)?)|)[^\u003e]*?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Bootstrap is a free and open-source CSS framework directed at responsive, mobile-first front-end web development. It contains CSS and JavaScript-based design templates for typography, forms, buttons, navigation, and other interface components.", "website": "https://getbootstrap.com", "cpe": "cpe:2.3:a:getbootstrap:bootstrap:*:*:*:*:*:*:*:*" }, "Bootstrap Icons": { "cats": [ 17 ], "description": "Bootstrap Icons is a growing library of SVG icons that are designed by @mdo and maintained by the Bootstrap Team.", "website": "https://icons.getbootstrap.com" }, "Bootstrap Table": { "cats": [ 59 ], "html": [ "\u003clink[^\u003e]+href=\"[^\u003e]*bootstrap-table(?:\\.min)?\\.css" ], "scriptSrc": [ "bootstrap-table(?:\\.min)?\\.js" ], "implies": [ "Bootstrap", "jQuery" ], "website": "https://bootstrap-table.wenzhixin.net.cn/" }, "Booxi": { "cats": [ 72 ], "js": [ "booxi", "booxicontroller", "bxe_core" ], "scriptSrc": [ "/bxe_core\\.js" ], "description": "Booxi is a cloud-based appointment management platform for small to midsize businesses.", "website": "https://www.booxi.com" }, "Borderfree": { "cats": [ 106 ], "cookies": { "bfx.apikey:": "^[\\w\\d-]+$", "bfx.country:": "^\\w+$", "bfx.language": "^\\w+$", "bfx.loglevel": "^\\w+$" }, "js": [ "bfx._apikey", "bfx._brand" ], "scriptSrc": [ "bfx-objects\\.prd\\.borderfree\\.com", "global\\.prd\\.borderfree\\.com", "wm\\.prd\\.borderfree\\.com" ], "description": "Borderfree is an cross-border ecommerce solutions provider.", "website": "https://www.borderfree.com" }, "Borlabs Cookie": { "cats": [ 67, 87 ], "js": [ "borlabscookieconfig" ], "description": "Borlabs Cookie is a GDPR cookie consent plugin for WordPress.", "website": "https://borlabs.io/borlabs-cookie/" }, "Botble CMS": { "cats": [ 1, 6 ], "cookies": { "botble_session": "" }, "headers": { "cms-version": "^(.+)$\\;version:\\1\\;confidence:0" }, "implies": [ "Laravel" ], "website": "https://botble.com" }, "Boutiq": { "cats": [ 100, 103 ], "js": [ "caazamapp" ], "description": "Boutiq is a personal video shopping solution.", "website": "https://www.getboutiq.com" }, "BowNow": { "cats": [ 32 ], "cookies": { "bownow_act": "", "bownow_aid": "", "bownow_cid": "", "bownow_mbid": "" }, "js": [ "_bownow_ts" ], "description": "BowNow is a marketing automation tool with business card management, sales support, analysis, and email magazine functions.", "website": "https://bow-now.jp" }, "Boxtal": { "cats": [ 99 ], "description": "Boxtal is a cloud-based multi-carrier shipping solution.", "website": "https://www.boxtal.com" }, "Bpost": { "cats": [ 99 ], "description": "Bpost, also known as the Belgian Post Group, is the Belgian company responsible for the delivery of national and international mail.", "website": "https://www.bpost.be" }, "BrainSINS": { "cats": [ 76 ], "js": [ "brainsins", "brainsins_token", "brainsinsrecommender", "launchbrainsins" ], "scriptSrc": [ "cloudfront\\.net/brainsins(?:_v)?(\\d+)\\.js\\;version:\\1", "mw\\.brainsins\\.com" ], "description": "BrainSINS is a personalisation technology and ecommerce analytics services to online retailers.", "website": "https://brainsins.com" }, "Braintree": { "cats": [ 41 ], "js": [ "braintree", "braintree.version" ], "scriptSrc": [ "js\\.braintreegateway\\.com" ], "description": "Braintree, a division of PayPal, specializes in mobile and web payment systems for ecommerce companies. Braintree provides clients with a merchant account and a payment gateway.", "website": "https://www.braintreepayments.com" }, "Branch": { "cats": [ 32, 10 ], "js": [ "branch.setbranchviewdata", "branch_callback__0" ], "scriptSrc": [ "app\\.link/_r\\?sdk=web([\\d.]+)\\;version:\\1", "cdn\\.branch\\.io" ], "description": "Branch is a mobile deep linking system to increase engagement and retention.", "website": "https://branch.io" }, "Brandfolder": { "cats": [ 95 ], "js": [ "brandfolder.account" ], "scriptSrc": [ "cdn\\.brandfolder\\.com/" ], "description": "Brandfolder is a cloud-based digital asset management platform.", "website": "https://brandfolder.com" }, "Braze": { "cats": [ 32, 10 ], "js": [ "appboy", "appboyqueue" ], "scriptSrc": [ "js\\.appboycdn\\.com/web-sdk/([\\d.]+)\\;version:\\1" ], "description": "Braze is a customer engagement platform that delivers messaging experiences across push, email, in-product, and more.", "website": "https://www.braze.com" }, "Bread": { "cats": [ 41, 91 ], "js": [ "bread.apphost", "breadcalc", "breaderror", "breadloaded", "breadshopify" ], "scriptSrc": [ "\\.getbread\\.com" ], "description": "Bread is a buy now, pay later platform for ecommerce websites.", "website": "https://www.breadpayments.com" }, "Breadcrumb NavXT": { "cats": [ 87 ], "html": [ "\u003c!-- breadcrumb navxt ([\\d\\.]+)\\;version:\\1" ], "description": "Breadcrumb NavXT is a WordPress plugin compatible with WordPress versions 4.9 and up.", "website": "https://github.com/mtekk/Breadcrumb-NavXT" }, "Breakdance": { "cats": [ 51 ], "js": [ "breakdancefrontend", "breakdanceheaderbuilder", "breakdanceswiper" ], "description": "Breakdance is a page builder that features a drag-and-drop interface for users to create pages using full site editing functionality.", "website": "https://breakdance.com" }, "Breinify": { "cats": [ 76 ], "js": [ "breinify.version" ], "description": "Breinify is a powerful personalisation engine that enables brands to create personalised digital experiences at an individual level across web, e-mail, SMS and app channels.", "website": "https://home.breinify.ai" }, "Bricks": { "cats": [ 51, 80 ], "scriptSrc": [ "/wp-content/themes/bricks/assets/" ], "description": "Bricks is a premium WordPress theme that lets you visually build performant WordPress sites.", "website": "https://bricksbuilder.io" }, "Bricksite": { "cats": [ 51 ], "js": [ "bricksite.common.apiurls.base" ], "meta": { "generator": [ "^bricksite$" ] }, "description": "Bricksite is a free website online tool where clients can create free accounts with various themes and features.", "website": "https://bricksite.io" }, "BrightEdge": { "cats": [ 54 ], "js": [ "_bright3.version", "be_sdk_options", "bejssdk.client_version" ], "scriptSrc": [ "\\.brightedge\\.com/" ], "description": "BrightEdge is an SEO solution and content performance marketing platform.", "website": "https://www.brightedge.com" }, "BrightInfo": { "cats": [ 32, 74 ], "js": [ "_bi_", "_biq", "bijsurl" ], "scriptSrc": [ "app\\.brightinfo\\.com" ], "description": "BrightInfo is an automated content personalisation solution.", "website": "https://www.brightinfo.com" }, "Brightcove": { "cats": [ 14 ], "scripts": [ "players\\.brightcove\\.net/" ], "description": "Brightcove is a cloud-based online video platform.", "website": "https://www.brightcove.com" }, "Brightspot": { "cats": [ 1 ], "headers": { "x-powered-by": "^brightspot$" }, "implies": [ "Java" ], "website": "https://www.brightspot.com" }, "Brilliant Web-to-Lead": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/salesforce-wordpress-to-lead/" ], "implies": [ "Salesforce" ], "description": "Brilliant Web-to-Lead plugin facilitates the technical integration between WordPress installations and Salesforce CRM accounts, enabling the exchange and synchronization of data.", "website": "https://brilliantplugins.com/downloads/salesforce/" }, "Brimble": { "cats": [ 62 ], "headers": { "server": "^brimble$", "x-brimble-id": "" }, "description": "Brimble is a cloud platform for deploying frontend web applications.", "website": "https://brimble.io" }, "Broadstreet": { "cats": [ 36 ], "js": [ "broadstreet" ], "scriptSrc": [ "cdn\\.broadstreetads\\.com" ], "description": "Broadstreet is an ad manager that caters specifically to the needs of direct, digital ad sales.", "website": "https://broadstreetads.com" }, "Bronto": { "cats": [ 32, 75 ], "js": [ "bronto.versions.sca", "brontocookieconsent", "brontoshopify" ], "scriptSrc": [ "(?:snip|cdn)\\.bronto\\.com" ], "description": "Bronto is a cloud-based email marketing automation software.", "website": "https://bronto.com" }, "Brownie": { "cats": [ 1, 6 ], "headers": { "x-powered-by": "brownie" }, "scriptSrc": [ "assets\\.youthsrl\\.com/brownie" ], "implies": [ "Amazon Web Services", "Bootstrap", "MySQL", "PHP", "jQuery" ], "description": "Brownie is a framework, CMS, ecommerce and ERP omni-channel platform to manage your entire business in one cloud solution.", "website": "https://www.browniesuite.com" }, "Browser-Update.org": { "cats": [ 5, 59 ], "js": [ "$bu_.version", "$bu_getbrowser" ], "description": "Browser-update.org is a tool to unobtrusively notify visitors that they should update their web browser in order to use your website.", "website": "https://browser-update.org" }, "BrowserCMS": { "cats": [ 1 ], "meta": { "generator": [ "browsercms ([\\d.]+)\\;version:\\1" ] }, "implies": [ "Ruby" ], "website": "https://browsercms.org" }, "Bsale": { "cats": [ 6 ], "cookies": { "_bsalemarket_session": "" }, "js": [ "bsale.version" ], "meta": { "autor": [ "bsale" ], "generator": [ "bsale" ] }, "implies": [ "Nginx" ], "description": "Bsale is an store management solution for retail businesses that sell both in store and online.", "website": "https://www.bsale.cl" }, "Bubble": { "cats": [ 51, 18 ], "js": [ "_bubble_page_load_data", "bubble_environment", "bubble_hostname_modifier", "bubble_version" ], "headers": { "x-bubble-capacity-limit": "", "x-bubble-capacity-used": "", "x-bubble-perf": "" }, "implies": [ "Node.js" ], "description": "Bubble is a no-code platform that lets anyone build web apps without writing any code.", "website": "https://bubble.io" }, "Budbee": { "cats": [ 99 ], "description": "Budbee is a tech company that operates a logistics service for ecommerce.", "website": "https://app.budbee.com/" }, "BuddyPress": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/buddypress/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "BuddyPress is designed to allow schools, companies, sports teams, or any other niche community to start their own social network or communication tool.", "website": "https://buddypress.org" }, "BugHerd": { "cats": [ 13 ], "js": [ "bugherdconfig" ], "scriptSrc": [ "\\.bugherd\\.com/" ], "description": "BugHerd is a cloud-based feedback collection and bug management tool.", "website": "https://bugherd.com" }, "BugSnag": { "cats": [ 10, 13 ], "js": [ "bugsnag", "bugsnag", "bugsnagclient" ], "scriptSrc": [ "/bugsnag.*\\.js" ], "description": "Bugsnag is a cross-platform error monitoring, reporting, and resolution software.", "website": "https://bugsnag.com" }, "Bugcrowd": { "cats": [ 16 ], "description": "Bugcrowd is a crowdsourced cybersecurity platform.", "website": "https://www.bugcrowd.com" }, "Bugzilla": { "cats": [ 13 ], "cookies": { "bugzilla_login_request_cookie": "" }, "js": [ "bugzilla" ], "html": [ "\u003ca href=\"https?://www\\.bugzilla\\.org/docs/([0-9.]+)/[^\u003e]+\u003ehelp\u003c\\;version:\\1", "\u003cmain id=\"bugzilla-body\"", "\u003cspan id=\"information\" class=\"header_addl_info\"\u003eversion ([\\d.]+)\u003c\\;version:\\1", "href=\"enter_bug\\.cgi\"\u003e" ], "meta": { "generator": [ "bugzilla ?([\\d.]+)?\\;version:\\1" ] }, "implies": [ "Perl" ], "website": "https://www.bugzilla.org", "cpe": "cpe:2.3:a:mozilla:bugzilla:*:*:*:*:*:*:*:*" }, "Builder.io": { "cats": [ 1 ], "description": "Builder.io is a headless CMS with a powerful drag-and-drop visual editor that lets you build and optimize digital experiences with speed and flexibility. ", "website": "https://builder.io" }, "Buildertrend": { "cats": [ 19 ], "website": "https://buildertrend.com" }, "Bulma": { "cats": [ 66 ], "js": [ "bulma.version" ], "description": "Bulma is a free class-based framework for CSS.", "website": "https://bulma.io" }, "Bump": { "cats": [ 4 ], "description": "Bump is an API contract management platform that helps document and track APIs by identifying changes in API structure, and keeping developers informed through an elegant documentation.", "website": "https://bump.sh" }, "Bunny": { "cats": [ 31 ], "headers": { "server": "^bunnycdn" }, "website": "https://bunny.net" }, "Bunny Fonts": { "cats": [ 17 ], "implies": [ "Bunny" ], "description": "Bunny Fonts is an open-source, privacy-first web font platform designed to put privacy back into the internet.", "website": "https://fonts.bunny.net" }, "Business Catalyst": { "cats": [ 1 ], "html": [ "\u003c!-- bc_obnw --\u003e" ], "scriptSrc": [ "catalystscripts" ], "website": "https://businesscatalyst.com" }, "Business Website Builder": { "cats": [ 1 ], "website": "https://businesswebsites.google.com/welcome" }, "ButterCMS": { "cats": [ 1 ], "description": "ButterCMS is a cloud-based headless content management system.", "website": "https://buttercms.com" }, "Buttonizer": { "cats": [ 5 ], "js": [ "buttonizer" ], "scriptSrc": [ "cdn\\.buttonizer\\.io/", "wp-content/plugins/buttonizer-multifunctional-button/" ], "description": "Buttonizer is a widget that enables website owners to incorporate custom and attention-grabbing call-to-action (CTA) buttons into their website design.", "website": "https://buttonizer.pro" }, "Buy me a coffee": { "cats": [ 5, 111 ], "scriptSrc": [ "cdnjs\\.buymeacoffee\\.com/([\\d.]+)\\;version:\\1" ], "description": "Buy me a coffee is a service for online content creators that they may use to receive tips and donations to support their work.", "website": "https://www.buymeacoffee.com" }, "Buy with Prime": { "cats": [ 19 ], "js": [ "bwp.sku" ], "scriptSrc": [ "code\\.buywithprime\\.amazon\\.com/" ], "implies": [ "Amazon Pay" ], "description": "Buy with Prime is a feature offered by Amazon that allows Amazon Prime members to make purchases with the benefits associated with their Prime membership.", "website": "https://buywithprime.amazon.com" }, "BuySellAds": { "cats": [ 36 ], "js": [ "_bsa", "_bsap", "_bsap_serving_callback", "_bsapro" ], "scriptSrc": [ "^https?://s\\d\\.buysellads\\.com/", "servedby-buysellads\\.com/monetization(?:\\.[\\w\\d]+)?\\.js" ], "website": "https://buysellads.com" }, "Buyapowa": { "cats": [ 94 ], "js": [ "buyapowa.canarycheck" ], "scriptSrc": [ "cdn\\.co-buying\\.com/" ], "description": "Buyapowa is a scalable referral marketing and advocacy platform designed for all industries.", "website": "https://www.buyapowa.com" }, "BySide": { "cats": [ 32, 76 ], "js": [ "byside", "bysidewebcare_banner" ], "scriptSrc": [ "webcare\\.byside\\.com/" ], "description": "BySide is a personalisation and marketing automation platform.", "website": "https://byside.com" }, "Bynder": { "cats": [ 95 ], "cookies": { "bynder": "^[\\da-z]+-[\\da-z]+-[\\da-z]+-[\\da-z]+$" }, "js": [ "bynder.cloudfront" ], "description": "Bynder is a cloud-based marketing platform where brands create, find, and use all their digital content.", "website": "https://www.bynder.com" }, "C": { "cats": [ 27 ], "description": "C is a general-purpose, procedural computer programming language supporting structured programming, lexical variable scope, and recursion, with a static type system.", "website": "https://www.open-std.org/jtc1/sc22/wg14/" }, "CCV Shop": { "cats": [ 6 ], "scriptSrc": [ "/website/javascript/vertoshop\\.js" ], "website": "https://ccvshop.be" }, "CDN77": { "cats": [ 31 ], "headers": { "server": "^cdn77-turbo$" }, "description": "CDN77 is a content delivery network (CDN).", "website": "https://www.cdn77.com" }, "CEMax": { "cats": [ 52 ], "description": "CEMax is a premium customer engagement platform.", "website": "https://cemax.ai" }, "CFML": { "cats": [ 27 ], "description": "ColdFusion Markup Language (CFML), is a scripting language for web development that runs on the JVM, the .NET framework, and Google App Engine.", "website": "https://adobe.com/products/coldfusion-family.html" }, "CIVIC": { "cats": [ 67 ], "scriptSrc": [ "cc\\.cdn\\.civiccomputing\\.com" ], "description": "Civic provides cookie control for user consent and the use of cookies.", "website": "https://www.civicuk.com/cookie-control" }, "CJDropshipping app": { "cats": [ 100 ], "scriptSrc": [ "app\\.cjdropshipping\\.com/" ], "description": "CJDropshipping is a dropshipping supplier and fulfillment service from China.", "website": "https://apps.shopify.com/cucheng" }, "CKEditor": { "cats": [ 24 ], "js": [ "apex.libversions.ckeditor5", "ckeditor", "ckeditor.version", "ckeditor_basepath", "ckeditor_version" ], "description": "CKEditor is a WYSIWYG rich text editor which enables writing content directly inside of web pages or online applications. Its core code is written in JavaScript and it is developed by CKSource. CKEditor is available under open-source and commercial licenses.", "website": "https://ckeditor.com", "cpe": "cpe:2.3:a:ckeditor:ckeditor:*:*:*:*:*:*:*:*" }, "CMS Made Simple": { "cats": [ 1 ], "cookies": { "cmssessid": "" }, "meta": { "generator": [ "cms made simple" ] }, "implies": [ "PHP" ], "website": "https://cmsmadesimple.org", "cpe": "cpe:2.3:a:cmsmadesimple:cms_made_simple:*:*:*:*:*:*:*:*" }, "CMSimple": { "cats": [ 1 ], "meta": { "generator": [ "cmsimple( [\\d.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://www.cmsimple.org/en", "cpe": "cpe:2.3:a:cmsimple:cmsimple:*:*:*:*:*:*:*:*" }, "CNZZ": { "cats": [ 10 ], "js": [ "cnzz_protocol" ], "scriptSrc": [ "//[^./]+\\.cnzz\\.com/(?:z_stat.php|core)\\?" ], "website": "https://web.umeng.com/" }, "CPABuild": { "cats": [ 71 ], "js": [ "cpabuildlock" ], "description": "CPABuild is a next generation CPA network with integrated template building and sharing functionality.", "website": "https://cpabuild.com" }, "CPG Dragonfly": { "cats": [ 1 ], "headers": { "x-powered-by": "^dragonfly cms" }, "meta": { "generator": [ "cpg dragonfly" ] }, "implies": [ "PHP" ], "website": "https://dragonflycms.org" }, "CRM+": { "cats": [ 53 ], "implies": [ "MariaDB", "Sentry", "Vtiger", "amCharts" ], "description": "CRM+ is a German CRM software product building on Vtiger with GDPR-compliant extensions and improvements.", "website": "https://www.brainformatik.com" }, "CS Cart": { "cats": [ 6 ], "js": [ "fn_buy_together_apply_discount", "fn_calculate_total_shipping", "fn_compare_strings" ], "scriptSrc": [ "var/cache/misc/assets/js/tygh/scripts-(?:[\\d\\w]+)\\.js" ], "implies": [ "PHP" ], "description": "CS Cart is a turnkey ecommerce shopping cart software solution.", "website": "https://www.cs-cart.com" }, "CSSIgniter Olsen Light": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/olsen-light/.+scripts(?:\\.min)?\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "CSSIgniter Olsen Light is a clean, minimal, stylish and elegant WordPress blog theme, perfect for lifestyle, food, cooking, fashion, travel, wedding, health \u0026 fitness, photography and beauty blogging.", "website": "https://www.cssigniter.com/themes/olsen-light" }, "CTT": { "cats": [ 99 ], "description": "CTT operates as the national postal service of Portugal.", "website": "https://www.ctt.pt" }, "Caast.tv": { "cats": [ 5 ], "js": [ "caast.open", "caastinstance" ], "scriptSrc": [ "cdn\\.caast\\.tv/" ], "description": "Caast.tv is a digital commercial animation solution integrated into the ecommerce customer journey.", "website": "https://en.caast.tv" }, "CacheFly": { "cats": [ 31 ], "headers": { "server": "^cfs ", "x-cf1": "", "x-cf2": "" }, "description": "CacheFly is a content delivery network (CDN) which offers CDN service that relies solely on IP anycast for routing, rather than DNS based global load balancing.", "website": "https://www.cachefly.com" }, "Cachet": { "cats": [ 13 ], "js": [ "cachet.notifier" ], "implies": [ "PHP" ], "description": "Cachet is the free and open-source status page for your API, service or company.", "website": "https://cachethq.io" }, "CactiveCloud": { "cats": [ 22 ], "headers": { "server": "^cactive$" }, "description": "CactiveCloud is a freemium based cloud provider and web server for static deployments of websites with HTML builds and serverless functions.", "website": "https://cactivecloud.com" }, "Caddy": { "cats": [ 22 ], "headers": { "server": "^caddy$" }, "website": "https://caddyserver.com", "cpe": "cpe:2.3:a:caddyserver:caddy:*:*:*:*:*:*:*:*" }, "Cafe24": { "cats": [ 6 ], "js": [ "ec_global_datetime", "ec_global_info", "ec_root_domain" ], "description": "Cafe24 is a global ecommerce platform that provides everything people need to build an online DTC store in one stop.", "website": "https://www.cafe24.com/en/" }, "Caisy": { "cats": [ 1 ], "description": "Caisy is a headless CMS platform providing flexible content management, seamless integration with various devices and channels, and API access for structured content delivery.", "website": "https://caisy.io" }, "CakePHP": { "cats": [ 18 ], "cookies": { "cakephp": "" }, "meta": { "application-name": [ "cakephp" ] }, "implies": [ "PHP" ], "description": "CakePHP is an open-source web framework. It follows the model–view–controller (MVC) approach and is written in PHP.", "website": "https://cakephp.org", "cpe": "cpe:2.3:a:cakephp:cakephp:*:*:*:*:*:*:*:*" }, "Caldera Forms": { "cats": [ 87, 110 ], "js": [ "calderaforms" ], "scriptSrc": [ "/wp-content/plugins/caldera-forms/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Caldera Forms is the free WordPress form builder plugin.", "website": "https://calderaforms.com" }, "CalendarHero": { "cats": [ 72 ], "js": [ "zoomai.vars" ], "description": "CalendarHero (formerly Zoom.ai) is meeting scheduling software that helps you book meetings automatically.", "website": "https://calendarhero.com" }, "Calendly": { "cats": [ 72 ], "js": [ "calendly" ], "scriptSrc": [ "assets\\.calendly\\.com/" ], "description": "Calendly is an app for scheduling appointments, meetings, and events.", "website": "https://calendly.com/" }, "CallRail": { "cats": [ 10 ], "js": [ "calltrk", "calltrkswap", "crwpver" ], "description": "CallRail is a service that tracks and manages your phone leads, helping businesses to determine which marketing campaigns are driving quality leads.", "website": "https://www.callrail.com" }, "CallTrackingMetrics": { "cats": [ 10 ], "js": [ "__ctm.numbers", "__ctm_tracked_numbers" ], "description": "CallTrackingMetrics is a call tracking and marketing attribution solution for contact centers and agencies.", "website": "https://www.calltrackingmetrics.com" }, "Callbell": { "cats": [ 52 ], "js": [ "callbell", "callbellsettings" ], "scriptSrc": [ "\\.callbell\\.eu/" ], "description": "Callbell is a web-based live chat solution designed to help businesses manage team collaboration via multiple communication channels.", "website": "https://www.callbell.eu" }, "Campaign Monitor": { "cats": [ 32, 75 ], "scriptSrc": [ "\\.createsend1\\.com/" ], "description": "Campaign Monitor is a global technology company that provides an email marketing platform.", "website": "https://www.campaignmonitor.com" }, "Candid Themes Fairy": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/fairy(?:-premium)?/.+custom\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Fairy is a free and minimal WordPress blog theme by Candid Themes.", "website": "https://www.candidthemes.com/themes/fairy" }, "Canny": { "cats": [ 13 ], "js": [ "canny" ], "headers": { "content-security-policy": "//canny\\.io" }, "description": "Canny is a cloud-based solution that helps small to large businesses collect, analyse, prioritise and track user feedback to make informed product decisions.", "website": "https://canny.io" }, "Canto": { "cats": [ 95 ], "description": "Canto is a digital asset management solution.", "website": "https://www.canto.com" }, "Canva": { "cats": [ 51 ], "js": [ "canva_debounceresize", "canva_scriptexecutor" ], "description": "Canva is an online graphic design platform that allows users to create various visual content using pre-designed templates and a library of elements.", "website": "https://www.canva.com" }, "Canvas LMS": { "cats": [ 21 ], "js": [ "webpackchunkcanvas_lms" ], "headers": { "x-canvas-meta": "login/canvas" }, "implies": [ "React", "Ruby on Rails" ], "description": "Canvas LMS is a web-based learning management system, or LMS.", "website": "https://www.instructure.com/canvas" }, "CanvasJS": { "cats": [ 25 ], "js": [ "canvasjs.chart", "canvasjs.chart.version" ], "description": "CanvasJS charts is a data visualisation library that runs across multiple devices and browsers.", "website": "https://canvasjs.com" }, "Captch Me": { "cats": [ 16, 36 ], "js": [ "captchme" ], "scriptSrc": [ "^https?://api\\.captchme\\.net/" ], "website": "https://captchme.com" }, "Captivate.fm": { "cats": [ 5 ], "js": [ "captivate_player_app_url" ], "description": "Captivate.fm is a podcast hosting and analytics platform that provides tools for creating, hosting, and distributing podcasts.", "website": "https://www.captivate.fm" }, "Carbon Ads": { "cats": [ 36 ], "js": [ "_carbonads", "_carbonads_go" ], "scriptSrc": [ "\\.carbonads\\.com/" ], "description": "Carbon Ads is an ad tech company, that connects advertisers to users through targeted verticals called Circles.", "website": "https://carbonads.net" }, "CareCart": { "cats": [ 98, 100 ], "scriptSrc": [ "app\\.carecart\\.io/api/abandoned-cart/" ], "implies": [ "Shopify" ], "description": "CareCart is a smart app to recover big value carts on all sizes of shopify stores.", "website": "https://carecart.io/abandoned-cart-recovery-app" }, "CareCart Sales Pop Up": { "cats": [ 100, 5 ], "scriptSrc": [ "sales-pop\\.carecart\\.io/" ], "implies": [ "Shopify" ], "description": "CareCart Sales Pop Up is a stock countdown timer, recent sales notifications, live sales pop up widget.", "website": "https://carecart.io/sales-pop-up-app" }, "Cargo": { "cats": [ 51 ], "js": [ "__cargo_js_ver__", "cargo.config" ], "scriptSrc": [ "(?\u003c!elo\\.io)/cargo\\." ], "meta": { "cargo_title": [] }, "implies": [ "PHP" ], "description": "Cargo is a professional site building platform for designers and artists.", "website": "https://cargo.site" }, "Carrd": { "cats": [ 51 ], "scripts": [ "\\(\\!section\\s\\|\\|\\ssection\\.tagname\\s\\!\\=\\s\\'section\\'\\)" ], "description": "Carrd is a platform for building simple, responsive, one-page sites.", "website": "https://carrd.co" }, "Carro": { "cats": [ 100 ], "scriptSrc": [ "/carro\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1", "\\.getcarro\\.com/" ], "implies": [ "Shopify" ], "description": "Carro connects participating Shopify stores together to enable cross-store selling or the ability for like-minded partners to directly sell each other products without the need for inventory, managing returns, or minimum order quantities.", "website": "https://getcarro.com" }, "Carrot quest": { "cats": [ 10, 52 ], "js": [ "carrotquest" ], "headers": { "content-security-policy": "\\.carrotquest\\.app" }, "description": "Carrot quest is a customer engagement and communication platform that aids businesses in improving interactions with users and customers through targeted messaging, in-app messaging, live chat, email campaigns, and user behavior tracking.", "website": "https://www.carrotquest.io" }, "Cart Functionality": { "cats": [ 6 ], "js": [ "google_tag_params.ecomm_pagetype" ], "scriptSrc": [ "googlecommerce\\.com/trustedstores/api/js" ], "description": "Websites that have a shopping cart or checkout page, either using a known ecommerce platform or a custom solution.", "website": "https://www.wappalyzer.com/technologies/ecommerce/cart-functionality" }, "Cart.com": { "cats": [ 6 ], "js": [ "ac.storedomain" ], "scriptSrc": [ "\\.americommerce\\.com/" ], "description": "Cart.com is an ecommerce platform built for high volume online stores and complex products with features such as multi-store management.", "website": "https://www.americommerce.com" }, "Cart.js": { "cats": [ 59 ], "scriptSrc": [ "(?:shopify-cartjs/([\\d\\.]+)|assets)/rivets-cart\\.min\\.js\\;version:\\1" ], "implies": [ "Shopify" ], "description": "Cart.js is a very small open-source Javascript library that makes the addition of powerful Ajax cart functionality to your Shopify theme a breeze.", "website": "https://cartjs.org" }, "CartKit": { "cats": [ 32 ], "scriptSrc": [ "\\.cartkitcdn\\.com/" ], "description": "CartKit build apps from fuss-free multi-channel marketing automation and campaigns to social proof popups and user session recording.", "website": "https://www.cartkit.com" }, "CartStack": { "cats": [ 98 ], "js": [ "_cartstack" ], "scriptSrc": [ "api\\.cartstack\\.\\w+" ], "description": "CartStack is a SaaS solution that allows any company with an ecommerce site or reservation system to increase revenue through reminding/encouraging consumers to return to their abandoned cart and complete their purchase.", "website": "https://www.cartstack.com" }, "Carts Guru": { "cats": [ 32, 75 ], "scriptSrc": [ "cdn\\.cartsguru\\.io/" ], "description": "Carts Guru is the all-in-one marketing automation tool for ecommerce stores.", "website": "https://www.carts.guru" }, "Catberry.js": { "cats": [ 12, 18 ], "js": [ "catberry", "catberry.version" ], "headers": { "x-powered-by": "catberry" }, "implies": [ "Node.js" ], "website": "https://catberry.github.io/" }, "Catch": { "cats": [ 41 ], "js": [ "catch" ], "description": "Catch is a payment solution which allows merchants to use payments via bank payments instead of credit/debit cards.", "website": "https://www.getcatch.com/" }, "Catch Themes Catch Box": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/catch-box(?:-pro)?/" ], "description": "Catch Box is a lightweight, box shaped, clean responsive WordPress theme by Catch Themes.", "website": "https://catchthemes.com/themes/catch-box" }, "Catch Themes Fotografie": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/fotografie(?:-pro)?/" ], "description": "Fotografie is a modern photography WordPress theme that comes with high-quality features and minimal design by Catch Themes.", "website": "https://catchthemes.com/themes/fotografie" }, "Cecil": { "cats": [ 57 ], "meta": { "generator": [ "^cecil(?: ([0-9.]+))?$\\;version:\\1" ] }, "description": "Cecil is a CLI application, powered by PHP, that merge plain text files (written in Markdown), images and Twig templates to generate a static website.", "website": "https://cecil.app" }, "Celeritas": { "cats": [ 99 ], "description": "Celeritas offers transportation logistics services for package deliveries.", "website": "https://celeritastransporte.com" }, "Celum": { "cats": [ 95 ], "description": "Celum is a software developer that specialises in enterprise digital asset management and marketing content management systems.", "website": "https://www.celum.com" }, "Cendyn": { "cats": [ 1 ], "headers": { "x-powered-by": "^nextguest cms" }, "description": "Cendyn (formerly NextGuest) is a hospitality focused content management system.", "website": "https://www.cendyn.com" }, "Censhare": { "cats": [ 95 ], "description": "Censhare is a commercial digital experience platform in the form of an enterprise content management system.", "website": "https://www.censhare.com" }, "CentOS": { "cats": [ 28 ], "headers": { "server": "centos", "x-powered-by": "centos" }, "description": "CentOS is a Linux distribution that provides a free, community-supported computing platform functionally compatible with its upstream source, Red Hat Enterprise Linux (RHEL).", "website": "https://centos.org", "cpe": "cpe:2.3:o:centos:centos:*:*:*:*:*:*:*:*" }, "Centminmod": { "cats": [ 22 ], "headers": { "x-powered-by": "centminmod" }, "implies": [ "CentOS", "Nginx", "PHP" ], "website": "https://centminmod.com" }, "Centra": { "cats": [ 6 ], "js": [ "centra_image_sizes" ], "headers": { "content-security-policy": "\\.centra(?:cdn)?\\.(?:com|net)" }, "scripts": [ "centracheckoutscript" ], "description": "Centra is the headless ecommerce platform.", "website": "https://centra.com" }, "Chabokan": { "cats": [ 62 ], "headers": { "ch-powered-by": "chabokan\\s\\(chabokan\\.net\\)" }, "description": "Chabokan is a cloud services provider, offering a wide range of incorporated cloud services including Cloud Object Storage, DBaaS, BaaS, and PaaS.", "website": "https://chabokan.net" }, "Chakra UI": { "cats": [ 66 ], "scriptSrc": [ "\\.chakra-ui\\." ], "implies": [ "React" ], "description": "Chakra UI is a simple, modular and accessible component library that gives you the building blocks you need to build your React applications.", "website": "https://chakra-ui.com" }, "Chameleon": { "cats": [ 58 ], "js": [ "chmln.snippet.urls.fast", "chmlndata.organizationattributes" ], "scriptSrc": [ "\\.trychameleon\\.com/" ], "description": "Chameleon is a sophisticated no-code platform for product success, empowering SaaS teams to build self-service user onboarding, feature adoption, and feedback collection.", "website": "https://www.trychameleon.com" }, "Chameleon system": { "cats": [ 1, 6 ], "meta": { "generator": [ "chameleon cms/shop system" ] }, "description": "Chameleon system is an ecommerce and content management system all-in-one, capable of being integrated straight from the manufacturer.", "website": "https://www.chameleon-system.de" }, "Chamilo": { "cats": [ 21 ], "headers": { "x-powered-by": "chamilo ([\\d.]+)\\;version:\\1" }, "meta": { "generator": [ "chamilo ([\\d.]+)\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Chamilo is an open-source learning management and collaboration system.", "website": "https://www.chamilo.org", "cpe": "cpe:2.3:a:chamilo:chamilo_lms:*:*:*:*:*:*:*:*" }, "Channel.io": { "cats": [ 52, 53 ], "js": [ "channelio" ], "description": "Channel.io is an all-in-one business communication platform that helps businesses connect with customers.", "website": "https://channel.io" }, "ChannelAdvisor": { "cats": [ 10, 32 ], "scriptSrc": [ "\\.channeladvisor\\.com/" ], "description": "ChannelAdvisor is a provider of cloud-based solutions to ecommerce companies.", "website": "https://www.channeladvisor.com" }, "ChannelApe": { "cats": [ 6 ], "description": "ChannelApe is an ecommerce and inventory management solution for the footwear and apparel industry.", "website": "https://www.channelape.com" }, "Chaport": { "cats": [ 52 ], "js": [ "chaport", "chaportconfig" ], "scriptSrc": [ "\\.chaport\\.com" ], "description": "Chaport is a multi-channel live chat and chatbot software for business.", "website": "https://www.chaport.com" }, "ChargeAfter": { "cats": [ 41, 91 ], "js": [ "chargeafter" ], "scriptSrc": [ "cdn\\.chargeafter\\.com" ], "description": "ChargeAfter is a platform that connects retailers and lenders to offer consumers personalized Point of Sale Financing options at checkout from multiple lenders. ", "website": "https://chargeafter.com/" }, "Chargebee": { "cats": [ 41 ], "js": [ "chargebee", "chargebeetrackfunc" ], "scriptSrc": [ "js\\.chargebee\\.com/v([\\d.]+)\\;version:\\1" ], "description": "Chargebee is a PCI Level 1 certified recurring billing platform for SaaS and subscription-based businesses.", "website": "https://www.chargebee.com" }, "Chart.js": { "cats": [ 25 ], "js": [ "chart", "chart.ctx.beziercurveto", "chart.defaults.doughnut" ], "scriptSrc": [ "/chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:75", "cdn\\.jsdelivr\\.net/(?:npm|gh/chartjs)/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/chart.*\\.js\\;version:\\1", "cdnjs\\.cloudflare\\.com/ajax/libs/chart\\.js/([\\d.]+(?:-[^/]+)?)/chart.*\\.js\\;version:\\1", "chartjs\\.org/dist/([\\d.]+(?:-[^/]+)?|master|latest)/chart.*\\.js\\;version:\\1" ], "description": "Chart.js is an open-source JavaScript library that allows you to draw different types of charts by using the HTML5 canvas element.", "website": "https://www.chartjs.org" }, "Chartbeat": { "cats": [ 10 ], "js": [ "_sf_async_config", "_sf_endpt" ], "scriptSrc": [ "chartbeat\\.js" ], "website": "https://chartbeat.com" }, "ChatStack": { "cats": [ 52 ], "js": [ "chatstack.chatstate", "chatstack.server" ], "description": "ChatStack is a self-hosted live chat software for websites.", "website": "https://www.chatstack.com" }, "Chatango": { "cats": [ 5 ], "scriptSrc": [ "st\\.chatango\\.com" ], "description": "Chatango is a website used for connecting to a large selection of users.", "website": "https://chatango.com" }, "Chatra": { "cats": [ 52 ], "js": [ "chatraid", "chatrasetup" ], "scriptSrc": [ "call\\.chatra\\.io/chatra\\.js" ], "description": "Chatra is a cloud-based live chat platform aimed at small businesses and ecommerce retailers.", "website": "https://chatra.com" }, "Chatwoot": { "cats": [ 52 ], "js": [ "$chatwoot", "chatwootsdk" ], "description": "Chatwoot is a customer support tool for instant messaging channels.", "website": "https://www.chatwoot.com" }, "Checkfront": { "cats": [ 5, 72 ], "scriptSrc": [ "\\.checkfront\\.com/" ], "description": "Checkfront is a cloud-based booking management application and ecommerce platform.", "website": "https://www.checkfront.com" }, "Checkly": { "cats": [ 13 ], "js": [ "__nuxt__.config.public.apiurl" ], "description": "Checkly is the API and E2E monitoring platform for the modern stack: programmable, flexible and loving JavaScript.", "website": "https://www.checklyhq.com" }, "Checkout.com": { "cats": [ 41 ], "scriptSrc": [ "cdn\\.checkout\\.com/js/.+js(?:\\?ver=)?([\\d\\.]+)?\\;version:\\1" ], "description": "Checkout.com is an international payment platform that processes different payment methods across a variety of currencies.", "website": "https://www.checkout.com" }, "Chekkit": { "cats": [ 52 ], "js": [ "chekkitsettings.togglechat" ], "description": "Chekkit is an all-in-one review, messaging, and lead inbox software.", "website": "https://www.chekkit.io" }, "Cherokee": { "cats": [ 22 ], "headers": { "server": "^cherokee(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://www.cherokee-project.com", "cpe": "cpe:2.3:a:cherokee-project:cherokee:*:*:*:*:*:*:*:*" }, "CherryPy": { "cats": [ 22 ], "headers": { "server": "cherrypy(?:/([\\d.]+))?\\;version:\\1" }, "description": "CherryPy is an object-oriented web application framework using the Python programming language.", "website": "https://cherrypy.org/" }, "Chevereto": { "cats": [ 7, 19 ], "js": [ "chevereto.version" ], "scriptSrc": [ "/chevereto\\.js" ], "meta": { "generator": [ "chevereto\\s(?:[\\d\\.]+)" ] }, "implies": [ "PHP" ], "description": "Chevereto is an image hosting software that allows you to create a full-featured image hosting website on your own server.", "website": "https://chevereto.com" }, "Chicago Boss": { "cats": [ 18 ], "cookies": { "_boss_session": "" }, "implies": [ "Erlang" ], "description": "Chicago Boss is a web framework for Erlang.", "website": "https://github.com/ChicagoBoss/ChicagoBoss" }, "Chili Piper": { "cats": [ 72 ], "js": [ "chilipiper" ], "scriptSrc": [ "js\\.chilipiper\\.com/marketing\\.js" ], "description": "Chili Piper is a suite of automated scheduling tools that help revenue teams convert leads.", "website": "https://www.chilipiper.com/" }, "Chimpmatic": { "cats": [ 87 ], "implies": [ "Contact Form 7", "MailChimp" ], "description": "Chimpmatic is a premium Contact Form 7 and Mailchimp integration plugin.", "website": "https://chimpmatic.com" }, "Chinese Menu Online": { "cats": [ 51, 93 ], "description": "Chinese Menu Online is an online food ordering service.", "website": "https://www.chinesemenuonline.com" }, "Chitika": { "cats": [ 36 ], "js": [ "ch_client", "ch_color_site_link" ], "scriptSrc": [ "scripts\\.chitika\\.net/" ], "website": "https://chitika.com" }, "Choices": { "cats": [ 59 ], "js": [ "choices" ], "scriptSrc": [ "/modules/choices/js/choices\\.js", "choices\\.js(?:@|/)?([\\d\\.]+)?.+choices\\.min\\.js\\;version:\\1" ], "description": "Choices.js is a lightweight, configurable select box/text input plugin.", "website": "https://github.com/Choices-js/Choices" }, "Chord": { "cats": [ 52, 103 ], "js": [ "chordconnect", "chordconnect.__esmodule" ], "scriptSrc": [ "chord\\.us/embeddable/client-([\\d\\.]+)\\.min\\.js\\;version:\\1" ], "description": "Chord is a video-enabled social community and communication platform completely customised to your brand.", "website": "https://m.chord.us" }, "Chorus": { "cats": [ 1 ], "cookies": { "_chorus_geoip_continent": "", "chorus_preferences": "" }, "js": [ "chorus.addscript", "chorusads.beforeadsrequested", "choruscampaigns.recordclickurl" ], "description": "Chorus is the only all-in-one publishing, audience, and revenue platform built for modern media companies.", "website": "https://getchorus.voxmedia.com" }, "Chronofresh": { "cats": [ 99 ], "description": "Chronofresh is an express transport service for food products.", "website": "https://www.chronofresh.fr" }, "Chronopost": { "cats": [ 99 ], "description": "Chronopost provides a domestic and international express shipping and delivery service.", "website": "https://www.chronopost.fr" }, "ChurnZero": { "cats": [ 97 ], "js": [ "churnzero", "churnzero.version" ], "description": "ChurnZero is a real-time customer success platform that helps subscription businesses fight customer churn.", "website": "https://churnzero.net" }, "CitrusPay": { "cats": [ 41 ], "scriptSrc": [ "checkout-static\\.citruspay\\.com/" ], "description": "CitrusPay provides payement gateway and wallet services.", "website": "https://consumers.citruspay.com/" }, "City Hive": { "cats": [ 6 ], "js": [ "cityhivesites", "cityhivewebsitename" ], "description": "City Hive's all in one ecommerce platform for wine and spirit shops.", "website": "https://www.cityhive.net" }, "CityMail": { "cats": [ 99 ], "description": "CityMail is a private postal organisation operating in Sweden.", "website": "https://www.citymail.se" }, "CiviCRM": { "cats": [ 53 ], "description": "CiviCRM is a web-based suite of internationalised open-source software for constituency relationship management.", "website": "https://civicrm.org" }, "CiviCRM plugins": { "cats": [ 87 ], "scriptSrc": [ "wp-content/plugins/(?:[\\w\\-]+)?civicrm(?:[\\w\\-]+)?/" ], "implies": [ "CiviCRM" ], "description": "CiviCRM is a web-based suite of internationalised open-source software for constituency relationship management.", "website": "https://wordpress.org/plugins/search/civicrm/" }, "CivicTheme": { "cats": [ 66 ], "description": "CivicTheme is an open source, inclusive and component-based design system. It was created so governments and corporations can rapidly assemble modern, consistent and compliant digital experiences.", "website": "https://www.civictheme.io/" }, "Ckan": { "cats": [ 1 ], "headers": { "access-control-allow-headers": "x-ckan-api-key", "link": "\u003chttp://ckan\\.org/\u003e; rel=shortlink" }, "meta": { "generator": [ "^ckan ?([0-9.]+)$\\;version:\\1" ] }, "implies": [ "Java", "PostgreSQL", "Python", "Solr" ], "website": "https://ckan.org/" }, "Clarip": { "cats": [ 67 ], "js": [ "claripcdnhost", "clariphost", "pagedata.claripconsentjsurl" ], "scriptSrc": [ "//cdn\\.clarip\\.com/" ], "description": "Clarip is an enterprise data privacy and risk management platform.", "website": "https://www.clarip.com" }, "Claris FileMaker": { "cats": [ 34 ], "description": "Claris FileMaker is a cross-platform relational database application from Claris International.", "website": "https://www.claris.com/filemaker" }, "Clarity": { "cats": [ 66 ], "js": [ "clarityicons" ], "scriptSrc": [ "clr-angular(?:\\.umd)?(?:\\.min)?\\.js" ], "implies": [ "Angular" ], "description": "Clarity is an open-source design system that brings together UX guidelines, an HTML/CSS framework, and Angular components.", "website": "https://clarity.design" }, "Classeh": { "cats": [ 21 ], "meta": { "author": [ "^fanavar\\.org$" ] }, "implies": [ "PHP", "Python", "React" ], "description": "Classeh is a LMS that allows user to participate in webinars and also use LMS options like messanger,finances,homework,quiz and some extra options like sending messages and more.", "website": "https://fanavar.org" }, "Classy": { "cats": [ 111 ], "js": [ "classy.clientid" ], "scripts": [ "classy\\.org" ], "description": "Classy is an online fundraising platform.", "website": "https://www.classy.org/" }, "ClearSale": { "cats": [ 10 ], "js": [ "csdm" ], "scriptSrc": [ "device\\.clearsale\\.com\\.br" ], "description": "ClearSale offers fraud management and chargeback protection services.", "website": "https://www.clear.sale/" }, "Clearbit Reveal": { "cats": [ 10 ], "scriptSrc": [ "reveal\\.clearbit\\.com/v[(0-9)]/" ], "description": "Clearbit Reveal identifies anonymous visitors to websites.", "website": "https://clearbit.com/reveal" }, "Clerk": { "cats": [ 69 ], "js": [ "clerk.authenticatewithmetamask", "clerk.opensignin", "clerk.version" ], "description": "Clerk is a user management platform.", "website": "https://clerk.dev" }, "Clerk.io": { "cats": [ 76 ], "js": [ "__clerk_cb_0", "__clerk_q" ], "scriptSrc": [ "\\.clerk\\.io/" ], "description": "Clerk.io is an all-in-one ecommerce personalisation platform.", "website": "https://clerk.io" }, "CleverTap": { "cats": [ 32, 10 ], "js": [ "clevertap" ], "description": "CleverTap is a SaaS based customer lifecycle management and mobile marketing company headquartered in Mountain View, California.", "website": "https://clevertap.com" }, "Cleverbridge": { "cats": [ 6 ], "js": [ "cbcartproductselection" ], "scriptSrc": [ "static-cf\\.cleverbridge\\.\\w+/js/shop\\.js" ], "description": "Cleverbridge is a all-in-one ecommerce and subscription billing solution for software, (SaaS) and digital goods.", "website": "https://www.cleverbridge.com" }, "Click \u0026 Pledge": { "cats": [ 111 ], "scriptSrc": [ "\\.clickandpledge\\.com/" ], "description": "Click \u0026 Pledge is an all-in-one digital fundraising platform.", "website": "https://clickandpledge.com" }, "ClickCease": { "cats": [ 16 ], "scriptSrc": [ "\\.clickcease\\.com/monitor/" ], "description": "ClickCease is an ad fraud and click-fraud detection and protection service software.", "website": "https://www.clickcease.com" }, "ClickDimensions": { "cats": [ 32 ], "js": [ "clickdimensions" ], "scriptSrc": [ "analytics\\.clickdimensions\\.com/" ], "description": "ClickDimensions is a SaaS marketing automation platform built on the Microsoft Windows Azure platform.", "website": "https://clickdimensions.com" }, "ClickFunnels": { "cats": [ 32, 51 ], "js": [ "cfaddpolyfill", "cfappdomain", "cfsurveyparticipantid", "clickfunnels" ], "meta": { "cf:app_domain:": [ "app\\.clickfunnels\\.com" ] }, "description": "ClickFunnels is an online sales funnel builder that helps businesses market, sell, and deliver their products online.", "website": "https://www.clickfunnels.com" }, "ClickHeat": { "cats": [ 10 ], "js": [ "clickheatserver" ], "scriptSrc": [ "clickheat.*\\.js" ], "implies": [ "PHP" ], "website": "https://www.labsmedia.com/clickheat/index.html" }, "ClickOnce": { "cats": [ 47 ], "css": [ "\\.ClickOnceInfoText" ], "description": "ClickOnce is a Microsoft .NET deployment technology that enables the creation of self-updating Windows-based applications that can be installed and run with minimal user interaction.", "website": "https://learn.microsoft.com/en-us/visualstudio/deployment/clickonce-security-and-deployment" }, "ClickTale": { "cats": [ 10 ], "js": [ "clicktale", "clicktaleevent", "clicktaleglobal", "clicktalestarteventsignal" ], "scriptSrc": [ "\\.clicktale\\.net" ], "description": "ClickTale is a SaaS solution enabling organisations to gain visual in-page analytics.", "website": "https://www.clicktale.com" }, "Clickbank": { "cats": [ 71 ], "js": [ "cbtb" ], "scriptSrc": [ "r\\.wdfl\\.co" ], "website": "https://www.clickbank.com/" }, "Clicky": { "cats": [ 10 ], "js": [ "clicky" ], "scriptSrc": [ "static\\.getclicky\\.com" ], "description": "Clicky is web an analytics tool which helps you to get real-time analysis including spy view.", "website": "https://getclicky.com" }, "ClientJS": { "cats": [ 59, 83 ], "js": [ "clientjs" ], "scriptSrc": [ "/clientjs/(?:(\\d.*?)/)?\\;version:\\1", "/clientjs@(\\d.*?)/\\;version:\\1" ], "description": "ClientJS is a JavaScript library for generating browser fingerprints, exposing all the browser data-points.", "website": "https://clientjs.org" }, "ClientXCMS": { "cats": [ 1 ], "js": [ "clientxcmscurrency" ], "description": "ClientXCMS is a content management system that provides a drag-and-drop interface, customisable templates, user and media management, and website analytics to help businesses manage their website content.", "website": "https://clientxcms.com" }, "Clinch": { "cats": [ 76 ], "scriptSrc": [ "cdn\\.clinch\\.co" ], "description": "Clinch delivers hyper-personalized creative experiences and consumer intelligence across all channels.", "website": "https://clinch.co/" }, "Clipboard.js": { "cats": [ 59 ], "scriptSrc": [ "clipboard(?:-([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://clipboardjs.com/" }, "Clockwork": { "cats": [ 47 ], "headers": { "x-clockwork-version": "^([\\d\\.]+)$\\;version:\\1" }, "implies": [ "PHP" ], "description": "Clockwork is a development tool for PHP available right in your browser.", "website": "https://github.com/underground-works/clockwork-app" }, "Closure Library": { "cats": [ 59 ], "description": "Closure Library is a JavaScript library developed by Google for building robust web applications, offering utilities for DOM manipulation, event handling, data structures, and more.", "website": "https://github.com/google/closure-library" }, "CloudCart": { "cats": [ 6 ], "scriptSrc": [ "/cloudcart-(?:assets|storage)/" ], "meta": { "author": [ "^cloudcart llc$" ] }, "website": "https://cloudcart.com" }, "CloudSuite": { "cats": [ 6 ], "cookies": { "cs_secure_session": "" }, "website": "https://cloudsuite.com" }, "Cloudbeds": { "cats": [ 72 ], "js": [ "cloudbeds_widget" ], "scriptSrc": [ "\\.cloudbeds\\.com/" ], "description": "Cloudbeds is a cloud-based hotel management platform which includes tools for managing reservations, availability, rates, distribution channels, payments, guests, housekeeping, and more.", "website": "https://www.cloudbeds.com" }, "Cloudera": { "cats": [ 34 ], "headers": { "server": "cloudera" }, "description": "Cloudera is a software platform for data engineering, data warehousing, machine learning and analytics that runs in the cloud or on-premises.", "website": "https://www.cloudera.com" }, "Cloudflare": { "cats": [ 31 ], "cookies": { "__cfduid": "" }, "js": [ "cloudflare" ], "headers": { "cf-cache-status": "", "cf-ray": "", "server": "^cloudflare$" }, "meta": { "image": [ "//cdn\\.cloudflare" ] }, "description": "Cloudflare is a web-infrastructure and website-security company, providing content-delivery-network services, DDoS mitigation, Internet security, and distributed domain-name-server services.", "website": "https://www.cloudflare.com" }, "Cloudflare Bot Management": { "cats": [ 16 ], "cookies": { "__cf_bm": "" }, "implies": [ "Cloudflare" ], "description": "Cloudflare bot management solution identifies and mitigates automated traffic to protect websites from bad bots.", "website": "https://www.cloudflare.com/en-gb/products/bot-management/" }, "Cloudflare Browser Insights": { "cats": [ 10, 78 ], "js": [ "__cfbeaconcustomtag" ], "scriptSrc": [ "static\\.cloudflareinsights\\.com/beacon(?:\\.min)?\\.js" ], "description": "Cloudflare Browser Insights is a tool that measures the performance of websites from the perspective of users.", "website": "https://www.cloudflare.com" }, "Cloudflare Rocket Loader": { "cats": [ 92 ], "js": [ "__cfqr.done", "__cfrlunblockhandlers" ], "description": "Cloudflare Rocket Loader is responsible for prioritising over website's content by delaying the loading of Javascript until rendering.", "website": "https://support.cloudflare.com/hc/en-us/articles/200168056-Understanding-Rocket-Loader" }, "Cloudflare Stream": { "cats": [ 14, 103 ], "description": "Cloudflare Stream is a serverless live and on-demand video streaming platform.", "website": "https://www.cloudflare.com/products/cloudflare-stream" }, "Cloudflare Turnstile": { "cats": [ 16 ], "js": [ "turnstile" ], "description": "Turnstile is Cloudflare's smart CAPTCHA alternative.", "website": "https://www.cloudflare.com/products/turnstile" }, "Cloudflare Workers": { "cats": [ 62 ], "implies": [ "Cloudflare" ], "description": "Cloudflare Workers is a serverless execution environment that allows you to create entirely new applications or augment existing ones without configuring or maintaining infrastructure.", "website": "https://workers.cloudflare.com" }, "Cloudflare Zaraz": { "cats": [ 92 ], "js": [ "zaraz", "zarazdata" ], "description": "Cloudflare Zaraz gives you complete control over third-party tools and services for your website, and allows you to offload them to Cloudflare’s edge, improving the speed and security of your website.", "website": "https://www.cloudflare.com/products/zaraz/" }, "Cloudify.store": { "cats": [ 6, 93 ], "cookies": { "cloudify_session": "" }, "implies": [ "MySQL", "PHP", "React" ], "description": "Cloudify.store is a subscription-based platform that allows anyone to set up a hyperlocal quick commerce business.", "website": "https://cloudify.store" }, "Cloudimage": { "cats": [ 31, 95 ], "js": [ "ciresponsive.config.domain" ], "description": "Cloudimage automates the transformation and optimisation of images on the fly and accelerates their distribution via the Content Delivery Network (CDN).", "website": "https://www.cloudimage.io" }, "Cloudinary": { "cats": [ 31, 95 ], "js": [ "_cloudinary" ], "headers": { "content-security-policy": "player\\.cloudinary\\.com" }, "description": "Cloudinary is an end-to-end image- and video-management solution for websites and mobile apps, covering everything from image and video uploads, storage, manipulations, optimisations to delivery.", "website": "https://cloudinary.com" }, "Cloudrexx": { "cats": [ 1 ], "meta": { "generator": [ "^cloudrexx$" ] }, "implies": [ "MySQL", "PHP" ], "description": "Cloudrexx is a proprietary content management system that provides customisable templates and built-in modules for managing content, ecommerce, events, newsletters, and more, along with tools for SEO, social media integration, and multilingual support.", "website": "https://www.cloudrexx.com" }, "Cloudways": { "cats": [ 62 ], "headers": { "cache-provider": "cloudways-cache-de" }, "description": "Cloudways offers managed cloud-hosting services for WordPress sites on a cloud server where multiple copies of your content will be replicated throughout your chosen data center.", "website": "https://www.cloudways.com" }, "Cloverly": { "cats": [ 5 ], "js": [ "removecloverly" ], "scriptSrc": [ "apps\\.cloverly\\.com/" ], "description": "Cloverly is an API integration for ethical ecommerce brands to help their customers offset the carbon footprint of their online transactions.", "website": "https://www.cloverly.com" }, "Cluep": { "cats": [ 36 ], "scriptSrc": [ "cas\\.cluep\\.com" ], "description": "Cluep's artificially intelligent mobile ad platform targets people based on what they are sharing, how they are feeling and where they go in the physical world.", "website": "https://cluep.com/" }, "ClustrMaps Widget": { "cats": [ 35 ], "scriptSrc": [ "clustrmaps\\.com" ], "description": "ClustrMaps widget is a visitor tracker, designed for general web and blog use.", "website": "https://clustrmaps.com/" }, "Clutch": { "cats": [ 90, 5 ], "scriptSrc": [ "//widget\\.clutch\\.co/" ], "description": "Clutch review widgets are stand-alone applications that you can embed on your website to show your dynamic ratings and reviews.", "website": "https://clutch.co/content/add-review-widget-your-website" }, "CoConstruct": { "cats": [ 19 ], "website": "https://www.coconstruct.com" }, "CoRover": { "cats": [ 52 ], "js": [ "corover_tag" ], "scriptSrc": [ "\\.corover\\.mobi/" ], "description": "CoRover is a conversational AI chatbot platform with proprietary cognitive AI technology.", "website": "https://corover.ai" }, "Coaster CMS": { "cats": [ 1 ], "meta": { "generator": [ "^coaster cms v([\\d.]+)$\\;version:\\1" ] }, "implies": [ "Laravel" ], "website": "https://www.coastercms.org", "cpe": "cpe:2.3:a:web-feet:coaster_cms:*:*:*:*:*:*:*:*" }, "Cococart": { "cats": [ 6 ], "description": "Cococart is an ecommerce platform.", "website": "https://www.cococart.co" }, "CoconutSoftware": { "cats": [ 5, 72 ], "cookies": { "coconut_calendar": "" }, "description": "Coconut is a cloud-based appointment scheduling solution designed for enterprise financial services organisations such as credit unions, retail banks and more.", "website": "https://www.coconutsoftware.com/" }, "Cocos2d": { "cats": [ 19 ], "js": [ "cocosengine" ], "description": "Cocos2d is a mature open source cross-platform game development framework.", "website": "https://www.cocos.com/en/cocos2dx" }, "CodeIgniter": { "cats": [ 18 ], "cookies": { "ci_csrf_token": "^(.+)$\\;version:\\1?2+:", "ci_session": "", "exp_last_activity": "", "exp_tracker": "" }, "html": [ "\u003cinput[^\u003e]+name=\"ci_csrf_token\"\\;version:2+" ], "implies": [ "PHP" ], "website": "https://codeigniter.com", "cpe": "cpe:2.3:a:codeigniter:codeigniter:*:*:*:*:*:*:*:*" }, "CodeMirror": { "cats": [ 20 ], "js": [ "codemirror", "codemirror.version" ], "description": "CodeMirror is a JavaScript component that provides a code editor in the browser.", "website": "https://codemirror.net" }, "CodeSandbox": { "cats": [ 5, 20 ], "description": "CodeSandbox is an online code editor and prototyping tool that makes creating and sharing web apps faster.", "website": "https://codesandbox.io/" }, "Coin Currency Converter": { "cats": [ 100 ], "scriptSrc": [ "/apps/coin/coin\\.js.+\\.myshopify\\.com" ], "implies": [ "Shopify" ], "description": "Coin Currency Converter is an automatic currency conversion app for Shopify.", "website": "https://apps.shopify.com/coin" }, "CoinHive": { "cats": [ 56 ], "js": [ "coinhive" ], "scriptSrc": [ "\\/(?:coinhive|(authedmine))(?:\\.min)?\\.js\\;version:\\1?opt-in:", "coinhive\\.com/lib" ], "description": "Coinhive is a cryptocurrency mining service.", "website": "https://coinhive.com" }, "CoinHive Captcha": { "cats": [ 16, 56 ], "scriptSrc": [ "https?://authedmine\\.com/(?:lib/captcha|captcha)" ], "description": "Coinhive Captcha provides captcha service that is simple to integrate, where your users’ devices need to solve a number of hashes, adjustable by you, in order to login or post a comment to your site.", "website": "https://coinhive.com" }, "Coinbase Commerce": { "cats": [ 41 ], "description": "Coinbase Commerce is a platform that enables merchants to accept cryptocurrency payments.", "website": "https://commerce.coinbase.com/" }, "Coinhave": { "cats": [ 56 ], "scriptSrc": [ "https?://coin-have\\.com/c/[0-9a-za-z]{4}\\.js" ], "description": "CoinHave is a cryptocurrency mining service.", "website": "https://coin-have.com/" }, "Coinimp": { "cats": [ 56 ], "js": [ "client.anonymous" ], "scriptSrc": [ "https?://www\\.hashing\\.win/scripts/min\\.js" ], "description": "CoinImp is a cryptocurrency mining service.", "website": "https://www.coinimp.com" }, "Colbass": { "cats": [ 5 ], "js": [ "colbassrunning" ], "description": "Colbass is AI System that transforms text into real-human voiceovers.", "website": "https://colbass.com" }, "Colibri WP": { "cats": [ 80, 51 ], "js": [ "colibri", "colibridata", "colibrifrontenddata" ], "scriptSrc": [ "/wp-content/plugins/colibri-page-builder.+\\.js(?:.+ver=([\\d\\.\\-\\w]+))?\\;version:\\1" ], "description": "Colibri WP is a drag-and-drop WordPress website builder.", "website": "https://colibriwp.com" }, "Colis Privé": { "cats": [ 99 ], "description": "Colis Privé is a private parcel delivery service provider specialised in last-mile delivery.", "website": "https://www.colisprive.fr" }, "Colissimo": { "cats": [ 99 ], "description": "Colissimo is a 'drop off' parcel delivery service.", "website": "https://www.colissimo.entreprise.laposte.fr" }, "ColorMag": { "cats": [ 80 ], "scriptSrc": [ "themes/colormag.*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "ColorMag theme is for creating news, magazine, newspaper and other kinds of publishing sites. Compatible with Elementor.", "website": "https://themegrill.com/themes/colormag/" }, "ColorMeShop": { "cats": [ 6 ], "js": [ "colorme" ], "description": "ColorMeShop is an ecommerce platform from Japan.", "website": "https://shop-pro.jp" }, "Colorlib Activello": { "cats": [ 80 ], "js": [ "activelloismobile" ], "scriptSrc": [ "/wp-content/themes/activello/" ], "description": "Colorlib Activello is a clean, minimal multipurpose WordPress blog theme developer using the Bootstrap frontend framework making it fully responsive and mobile-friendly.", "website": "https://colorlib.com/wp/themes/activello" }, "Colorlib Illdy": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/illdy/" ], "description": "Colorlib Illdy is a stunning multipurpose WordPress theme built based on Bootstrap frontend framework making it fully responsive and mobile friendly.", "website": "https://colorlib.com/wp/themes/illdy" }, "Colorlib Shapely": { "cats": [ 80 ], "js": [ "shapelyadminobject" ], "scriptSrc": [ "/wp-content/themes/shapely/" ], "description": "Colorlib Shapely is considered as a powerful, clean and beautiful full-width free WordPress theme.", "website": "https://colorlib.com/wp/themes/shapely" }, "Colorlib Sparkling": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/sparkling/" ], "description": "Colorlib Sparkling is a clean, modern, flat design WordPress theme developed using Bootstrap.", "website": "https://colorlib.com/wp/themes/sparkling" }, "Colorlib Travelify": { "cats": [ 80 ], "js": [ "travelify_slider_value" ], "scriptSrc": [ "/wp-content/themes/travelify/" ], "description": "Colorlib Travelify is a responsive, free, travel WordPress theme.", "website": "https://colorlib.com/wp/themes/travelify" }, "Combahton FlowShield": { "cats": [ 16 ], "cookies": { "flowproxy-origin": "" }, "headers": { "server": "antiddos/flowproxy", "x-flowproxy-author": "" }, "description": "Combahton FlowShield is a network security solution designed to protect networks and servers from various cyber threats, including DDoS attacks, malware, and other types of malicious traffic.", "website": "https://combahton.net" }, "Combeenation": { "cats": [ 76 ], "description": "Combeenation is a powerful cloud-based configurator platform.", "website": "https://www.combeenation.com" }, "Combodo iTop": { "cats": [ 13, 19 ], "description": "Combodo iTop is an open-source IT service management (ITSM) and IT operations management (ITOM) platform developed by Combodo, a software company based in France.", "website": "https://www.combodo.com/itop-193" }, "Comeet": { "cats": [ 5, 101 ], "js": [ "comeet", "comeetinit" ], "description": "Comeet is an Collaborative Recruiting, and Applicant Tracking System.", "website": "https://www.comeet.com" }, "Comm100": { "cats": [ 52 ], "js": [ "comm100_chatbutton", "comm100_livechat_open_link", "comm100api" ], "description": "Comm100 is a provider of customer service and communication products.", "website": "https://www.comm100.com" }, "Commanders Act TagCommander": { "cats": [ 42 ], "js": [ "tc_vars" ], "scriptSrc": [ "\\.tagcommander\\.com" ], "description": "Commanders Act TagCommander is a European company providing a tag management product designed to handle website tags.", "website": "https://www.commandersact.com/en/solutions/tagcommander/" }, "Commanders Act TrustCommander": { "cats": [ 67 ], "scriptSrc": [ "\\.trustcommander\\.net/privacy/.+_v([\\d]+)_([\\d]+)\\.js\\;version:\\1.\\2" ], "description": "Commanders Act TrustCommander is a consent management platform (CMP) which allows you to comply with the general data protection regulation (GDPR) regulation in terms of collecting consent.", "website": "https://www.commandersact.com/en/solutions/trustcommander/" }, "Commerce Server": { "cats": [ 6 ], "headers": { "commerce-server-software": "" }, "implies": [ "Microsoft ASP.NET" ], "website": "https://commerceserver.net", "cpe": "cpe:2.3:a:microsoft:commerce_server:*:*:*:*:*:*:*:*" }, "Commerce.js": { "cats": [ 6 ], "js": [ "commercejsspace" ], "headers": { "chec-version": ".*", "x-powered-by": "commerce.js" }, "scriptSrc": [ "cdn\\.chec\\.io/v(\\d+)/commerce\\.js\\;version:\\1", "chec/commerce\\.js" ], "description": "Commerce.js is an API-first ecommerce platform for developers and businesses.", "website": "https://www.commercejs.com" }, "Commerce7": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.commerce7\\.com" ], "description": "Commerce7 is an ecommerce platform for wineries.", "website": "https://commerce7.com" }, "Commercelayer": { "cats": [ 6 ], "description": "Commercelayer is a headless ecommerce platform that permits businesses to create customisable and scalable online shopping experiences via an API-first architecture that allows developers to use any programming language or framework for building ecommerce sites and applications.", "website": "https://commercelayer.io" }, "Community Funded": { "cats": [ 111 ], "scriptSrc": [ "//give\\.communityfunded\\.com/" ], "description": "Community Funded is a digital fundraising and engagement platform.", "website": "https://www.communityfunded.com" }, "Complianz": { "cats": [ 74, 67, 87 ], "js": [ "complianz.version" ], "scriptSrc": [ "wp-content/plugins/complianz-gdpr-premium" ], "description": "Complianz is a GDPR/CCPA Cookie Consent plugin that supports GDPR, DSGVO, CCPA and PIPEDA with a conditional Cookie Notice and customized Cookie Policy based on the results of the built-in Cookie Scan.", "website": "https://complianz.io" }, "Concrete CMS": { "cats": [ 1 ], "cookies": { "concrete5": "" }, "js": [ "ccm_image_path", "concrete" ], "scriptSrc": [ "/concrete/js/" ], "meta": { "generator": [ "^concrete5(?: - ([\\d.]+)$)?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://www.concretecms.com/", "cpe": "cpe:2.3:a:concrete5:concrete5:*:*:*:*:*:*:*:*" }, "Conekta": { "cats": [ 41 ], "scriptSrc": [ "cdn\\.conekta\\.\\w+/js/(?:v([\\d.]+)|)\\;version:\\1", "conektaapi/v([\\d.]+)\\;version:\\1" ], "description": "Conekta is a Mexican payment platform.", "website": "https://conekta.com" }, "Confer With": { "cats": [ 103 ], "scriptSrc": [ "\\.conferwith\\.io/" ], "description": "Confer With triggers live streaming video calls between shoppers and instore experts from a website, or outside a store.", "website": "https://conferwith.io" }, "Confiant": { "cats": [ 16 ], "js": [ "confiant" ], "description": "Confiant is a cybersecurity company specialising in ad security and ad quality assurance for digital publishers, programmatic platforms, and advertisers.", "website": "https://www.confiant.com" }, "Congressus": { "cats": [ 1 ], "cookies": { "_gat_congressus_analytics": "", "congressus_session": "" }, "meta": { "generator": [ "^congressus\\s-\\s.+$" ] }, "description": "Congressus is a Dutch-language online application for member administration, financial management, communication and a linked website with webshop.", "website": "https://congressus.nl" }, "Conjured": { "cats": [ 100 ], "scriptSrc": [ "app\\.conjured\\.co/" ], "description": "Conjured provides Shopify brands with Shopify apps and custom development.", "website": "https://conjured.co" }, "Connectif": { "cats": [ 76, 32 ], "js": [ "connectif.version", "connectifinfo.store" ], "scriptSrc": [ "cdn\\.connectif\\.cloud/" ], "description": "Connectif is a marketing automation and personalisation data-first action platform, powered by AI.", "website": "https://connectif.ai" }, "Constant Contact": { "cats": [ 32, 75 ], "js": [ "_ctct_m", "ctctonloadcallback" ], "scriptSrc": [ "\\.ctctcdn\\.com/" ], "description": "Constant Contact is a marketing automation and email marketing solution.", "website": "https://www.constantcontact.com" }, "Contabo": { "cats": [ 88 ], "description": "Contabo is a German hosting provider, previously known by the name Giga-International.", "website": "https://contabo.com" }, "Contact Form 7": { "cats": [ 87, 110 ], "js": [ "wpcf7" ], "scriptSrc": [ "/wp-content/plugins/contact-form-7/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Contact Form 7 is an WordPress plugin which can manage multiple contact forms. The form supports Ajax-powered submitting, CAPTCHA, Akismet spam filtering.", "website": "https://contactform7.com" }, "Container Media Group": { "cats": [ 36 ], "scriptSrc": [ "\\.containermedia\\.net/" ], "description": "Container Media Group offers technical solutions for agencies and brands to plan, execute, optimise, and report on advertising campaigns. They specialise in creating engaging custom creatives and utilise advanced tracking pixels to monitor user advertising activity across media channels.", "website": "https://containermedia.net" }, "Contao": { "cats": [ 1 ], "meta": { "generator": [ "^contao open source cms$" ] }, "implies": [ "PHP" ], "description": "Contao is an open source CMS that allows you to create websites and scalable web applications.", "website": "https://contao.org", "cpe": "cpe:2.3:a:contao:contao_cms:*:*:*:*:*:*:*:*" }, "Contenido": { "cats": [ 1 ], "meta": { "generator": [ "contenido ([\\d.]+)\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://contenido.org/en", "cpe": "cpe:2.3:a:contenido:contendio:*:*:*:*:*:*:*:*" }, "Contensis": { "cats": [ 1 ], "meta": { "generator": [ "contensis cms version ([\\d.]+)\\;version:\\1" ] }, "implies": [ "CFML", "Java" ], "website": "https://zengenti.com/en-gb/products/contensis" }, "ContentBox": { "cats": [ 1, 11 ], "meta": { "generator": [ "contentbox powered by coldbox" ] }, "implies": [ "Adobe ColdFusion" ], "website": "https://www.gocontentbox.org" }, "ContentStudio": { "cats": [ 96 ], "description": "ContentStudio is an integrated cloud-based social media management and content marketing solution.", "website": "https://contentstudio.io" }, "Contentful": { "cats": [ 1 ], "headers": { "x-contentful-request-id": "" }, "html": [ "\u003c[^\u003e]+(?:assets|downloads|images|videos)\\.(?:ct?fassets\\.net|contentful\\.com)" ], "description": "Contentful is an API-first content management platform to create, manage and publish content on any digital channel.", "website": "https://www.contentful.com" }, "Contently": { "cats": [ 96 ], "js": [ "_contently.siteid" ], "description": "Contently is a SaaS content marketing platform from the company of the same name headquartered in New York.", "website": "https://contently.com" }, "Contentsquare": { "cats": [ 10, 74 ], "js": [ "cs_conf.trackerdomain" ], "scriptSrc": [ "\\.contentsquare\\.net/" ], "description": "Contentsquare is an enterprise-level UX optimisation platform.", "website": "https://contentsquare.com" }, "Contentstack": { "cats": [ 1 ], "description": "Contentstack is a headless CMS software designed to help businesses deliver personalised content experiences to audiences via multiple channels.", "website": "https://www.contentstack.com" }, "Contlo": { "cats": [ 90, 32 ], "js": [ "contlo_env" ], "scriptSrc": [ "\\.contlo\\.com/" ], "description": "Contlo is an AI powered marketing software.", "website": "https://www.contlo.com" }, "Conversant Consent Tool": { "cats": [ 67 ], "js": [ "conversant" ], "scriptSrc": [ "cdn\\.conversant\\.mgr\\.consensu\\.org/" ], "description": "Conversant Consent Tool is a free tool to gain GDPR and ePD compliant consent for digital advertising.", "website": "https://www.conversantmedia.eu/consent-tool" }, "Conversio": { "cats": [ 10 ], "js": [ "conversio.settings" ], "scriptSrc": [ "\\.conversio\\.com/" ], "description": "Conversio is an optimisation and analytics agency.", "website": "https://conversio.com" }, "Conversio App": { "cats": [ 100 ], "scriptSrc": [ "\\.conversio\\.com/.+\\.myshopify\\.com" ], "implies": [ "Conversio" ], "description": "Conversio App is an optimisation and analytics app for Shopify stores.", "website": "https://apps.shopify.com/conversio" }, "Convert": { "cats": [ 74 ], "js": [ "convert", "convert_temp", "convertdata" ], "scriptSrc": [ "\\.convertexperiments\\.com/js" ], "description": "Convert Experiences is an enterprise A/B testing and personalisation solution for conversion optimisation and data-driven decisions in high-traffic websites.", "website": "https://www.convert.com" }, "ConvertFlow": { "cats": [ 10, 74 ], "js": [ "convertflow" ], "scriptSrc": [ "(?:app|js)\\.convertflow\\.co" ], "description": "ConvertFlow is the all-in-one conversion marketing platform.", "website": "https://www.convertflow.com" }, "ConvertKit": { "cats": [ 32, 75 ], "scriptSrc": [ "\\.convertkit\\.com" ], "description": "ConvertKit is an email marketing tool built for content creators.", "website": "https://convertkit.com" }, "Convertcart": { "cats": [ 32 ], "scriptSrc": [ "cdn\\.convertcart\\.com" ], "description": "ConvertCart helps online businesses deliver outstanding experiences to customers throughout their journey.", "website": "https://www.convertcart.com/" }, "Convertr": { "cats": [ 6 ], "meta": { "author": [ "^convertr commerce$" ] }, "implies": [ "Amazon Web Services", "MySQL", "Nuxt.js", "PHP", "Vue.js" ], "description": "Convertr is a Brazilian ecommerce platform, fashion specialist.", "website": "https://convertr.com.br" }, "Convertri": { "cats": [ 51 ], "js": [ "convertri_constants", "convertrianalytics", "convertriparameters" ], "scriptSrc": [ "cdn\\.convertri\\.com/" ], "description": "Convertri is a sales funnel building solution.", "website": "https://www.convertri.com" }, "ConveyThis": { "cats": [ 89 ], "scriptSrc": [ "cdn\\.conveythis\\.com" ], "description": "ConveyThis is a website translation service.", "website": "https://www.conveythis.com/" }, "Conviva": { "cats": [ 14, 103 ], "js": [ "conviva", "conviva.client", "conviva.client.version" ], "description": "Conviva is a census, continuous measurement and engagement platform for streaming media.", "website": "https://www.conviva.com" }, "Cookie Information": { "cats": [ 67 ], "js": [ "cookieinformation.config.cdnurl" ], "description": "Cookie Information is a privacy tech company that develops software that helps making company websites and mobile apps GDPR and ePrivacy compliant.", "website": "https://cookieinformation.com" }, "Cookie Information plugin": { "cats": [ 87, 67 ], "scriptSrc": [ "/wp-content/plugins/wp-gdpr-compliance/" ], "implies": [ "Cookie Information" ], "description": "Cookie Information plugin helps your website stay compliant with GDPR using a free cookie pop-up, consent log, and more.", "website": "https://wordpress.org/plugins/wp-gdpr-compliance" }, "Cookie Notice": { "cats": [ 67, 87 ], "scriptSrc": [ "/wp-content/plugins/cookie-notice/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Cookie Notice provides a simple, customizable website banner that can be used to help your website comply with certain cookie consent requirements under the EU GDPR cookie law and CCPA regulations and includes seamless integration with Cookie Compliance to help your site comply with the latest updates to existing consent laws.", "website": "https://wordpress.org/plugins/cookie-notice" }, "Cookie Script": { "cats": [ 67 ], "scriptSrc": [ "\\.cookie-script\\.com/" ], "description": "Cookie-Script automatically scans, categorizes and adds description to all cookies found on your website.", "website": "https://cookie-script.com" }, "CookieFirst": { "cats": [ 67 ], "js": [ "cookiefirst_show_settings" ], "scriptSrc": [ "consent\\.cookiefirst\\.com/" ], "description": "CookieFirst is an GDPR and CCPA compliant consent management platform.", "website": "https://cookiefirst.com" }, "CookieHub": { "cats": [ 67 ], "scriptSrc": [ "cookiehub\\.net/.*\\.js" ], "website": "https://www.cookiehub.com" }, "CookieYes": { "cats": [ 67 ], "js": [ "cookieyes" ], "scriptSrc": [ "/wp-content/plugins/cookie-law-info/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1", "app\\.cookieyes\\.com/client_data/", "cdn-cookieyes\\.com/client_data/" ], "website": "https://www.cookieyes.com/" }, "Cookiebot": { "cats": [ 67 ], "js": [ "cookiebot.version" ], "scriptSrc": [ "consent\\.cookiebot\\.com" ], "description": "Cookiebot is a cloud-driven solution that automatically controls cookies and trackers, enabling full GDPR/ePrivacy and CCPA compliance for websites.", "website": "https://www.cookiebot.com" }, "Cooladata": { "cats": [ 97 ], "js": [ "cooladata" ], "scriptSrc": [ "cdn\\.cooladata\\.com/" ], "description": "Cooladata is a data warehouse and behavioral analytics platform designed for gaming, elearning, ecommerce, SaaS, and media companies.", "website": "https://www.cooladata.com" }, "Coppermine": { "cats": [ 7 ], "html": [ "\u003c!--coppermine photo gallery ([\\d.]+)\\;version:\\1" ], "implies": [ "PHP" ], "description": "Coppermine is an open-source image gallery application.", "website": "https://coppermine-gallery.net", "cpe": "cpe:2.3:a:coppermine-gallery:coppermine_photo_gallery:*:*:*:*:*:*:*:*" }, "CopyPoison": { "cats": [ 19 ], "scriptSrc": [ "copypoison\\.com/cp\\.js" ], "description": "Copypoison is a plagarism protection tool that protects content by replacing text with symbols that are visually similar.", "website": "https://copypoison.com/" }, "CoreMedia Content Cloud": { "cats": [ 1, 95 ], "meta": { "coremedia_content_id": [], "generator": [ "^coremedia c(?:ontent cloud|ms)$" ] }, "description": "CoreMedia Content Cloud is an agile content management and digital asset management platform.", "website": "https://www.coremedia.com" }, "CoreUI": { "cats": [ 66 ], "js": [ "coreui" ], "scripts": [ "webpackjsonp@coreui/coreui" ], "description": "CoreUI provides cloud hosting, web and mobile design, animations, wireframes, and UX testing services.", "website": "https://coreui.io" }, "Corebine": { "cats": [ 1 ], "js": [ "corebine" ], "description": "Corebine is a content management system designed for Sports", "website": "https://corebine.com" }, "Correos": { "cats": [ 99 ], "description": "Correos is a state-owned company responsible for providing postal service in Spain.", "website": "https://www.correos.es" }, "Correos Ecommerce": { "cats": [ 6 ], "js": [ "comandia" ], "scriptSrc": [ "\\.mycorreosecommerce\\.com/" ], "description": "Correos Ecommerce is an ecommerce platfrom from Spain.", "website": "https://www.correosecommerce.com" }, "Cosmic": { "cats": [ 1 ], "description": "Cosmic is a cloud-based CMS that provides developers with an API and web interface for content management, enabling the creation of custom content types, relationship definitions, and webhooks for actions based on content changes.", "website": "https://www.cosmicjs.com" }, "Cosmoshop": { "cats": [ 6 ], "scriptSrc": [ "cosmoshop_functions\\.js" ], "website": "https://cosmoshop.de", "cpe": "cpe:2.3:a:cosmoshop:cosmoshop:*:*:*:*:*:*:*:*" }, "Cotonti": { "cats": [ 1 ], "meta": { "generator": [ "cotonti" ] }, "implies": [ "PHP" ], "website": "https://www.cotonti.com", "cpe": "cpe:2.3:a:cotonti:cotonti_siena:*:*:*:*:*:*:*:*" }, "CouchDB": { "cats": [ 22 ], "headers": { "server": "couchdb/([\\d.]+)\\;version:\\1" }, "website": "https://couchdb.apache.org", "cpe": "cpe:2.3:a:apache:couchdb:*:*:*:*:*:*:*:*" }, "Countly": { "cats": [ 10 ], "js": [ "countly" ], "website": "https://count.ly" }, "Coureon": { "cats": [ 99 ], "description": "Coureon is a digital logistics carrier for international shipping.", "website": "https://www.coureon.com" }, "Coveo": { "cats": [ 29, 76 ], "js": [ "coveo" ], "scriptSrc": [ "static\\.cloud\\.coveo\\.com" ], "description": "Coveo designs enterprise search and predictive insights platforms for businesses.", "website": "https://www.coveo.com/" }, "CoverManager": { "cats": [ 93 ], "scriptSrc": [ "\\.covermanager\\.com/" ], "description": "CoverManager is a restaurant table booking widget.", "website": "https://www.covermanager.com" }, "Covet.pics": { "cats": [ 96, 100 ], "scriptSrc": [ "\\.covet\\.pics/" ], "description": "Covet.pics is a customizable Shopify app for Instagram and Lookbook shoppable galleries.", "website": "https://covet.pics" }, "Cowboy": { "cats": [ 22 ], "headers": { "server": "^cowboy$" }, "implies": [ "Erlang" ], "description": "Cowboy is a small, fast, modular HTTP server written in Erlang.", "website": "https://github.com/ninenines/cowboy" }, "Cozy AntiTheft": { "cats": [ 100 ], "js": [ "cozyecoadnsua" ], "scriptSrc": [ "cdncozyantitheft\\.addons\\.business/" ], "implies": [ "Shopify" ], "description": "Cozy AntiTheft helps you to protect your store content, images and texts from being stolen with a few simple clicks.", "website": "https://apps.shopify.com/cozy-antitheft-for-images-and-more" }, "CppCMS": { "cats": [ 1 ], "headers": { "x-powered-by": "^cppcms/([\\d.]+)$\\;version:\\1" }, "website": "https://cppcms.com" }, "Craft CMS": { "cats": [ 1 ], "cookies": { "craftsessionid": "" }, "headers": { "x-powered-by": "\\bcraft cms\\b" }, "implies": [ "Yii" ], "description": "Craft CMS is a content management system for building bespoke websites.", "website": "https://craftcms.com/", "cpe": "cpe:2.3:a:craftcms:craft_cms:*:*:*:*:*:*:*:*" }, "Craft Commerce": { "cats": [ 6 ], "headers": { "x-powered-by": "\\bcraft commerce\\b" }, "implies": [ "Craft CMS" ], "website": "https://craftcommerce.com" }, "Craftum": { "cats": [ 51 ], "meta": { "generator": [ "^craftum cms$" ] }, "description": "Craftum is an Russian website builder.", "website": "https://craftum.com" }, "Cratejoy": { "cats": [ 1, 6 ], "cookies": { "cratejoy_muffin42": "", "statjoy_metrics": "" }, "js": [ "statjoyserver" ], "description": "Cratejoy is a brand new ecommerce platform with a focus on subscription payments.", "website": "https://www.cratejoy.com" }, "Crazy Egg": { "cats": [ 10 ], "js": [ "ce2" ], "scriptSrc": [ "script\\.crazyegg\\.com/pages/scripts/\\d+/\\d+\\.js" ], "website": "https://crazyegg.com" }, "CreateJS": { "cats": [ 31 ], "scriptSrc": [ "code\\.createjs\\.com/" ], "description": "CreateJS is a suite of modular libraries and tools which work together or independently to enable interactive content on open web technologies via HTML5.", "website": "https://code.createjs.com" }, "Creatium": { "cats": [ 51 ], "meta": { "generator": [ "^creatium$" ] }, "description": "Creatium is a website builder developed in Russia that provides a user-friendly drag-and-drop interface and a variety of customisation options for creating websites without coding knowledge.", "website": "https://creatium.io" }, "Creativ.eMail": { "cats": [ 87, 75 ], "scriptSrc": [ "/wp-content/plugins/creative-mail-by-constant-contact/" ], "description": "Creativ.eMail is a email editor WordPress plugin which simplifies email marketing campaign creation and pulls your WordPress blog posts, website images and WooCommerce products right into your email content.", "website": "https://www.creativemail.com" }, "Crikle": { "cats": [ 52 ], "js": [ "crikle.contactid", "crikle.openconvertwidget" ], "description": "Crikle is a multichannel customer engagement software.", "website": "https://www.crikle.com" }, "Crisp Live Chat": { "cats": [ 52 ], "js": [ "$__crisp_included", "$crisp", "crisp_website_id" ], "scriptSrc": [ "client\\.crisp\\.chat/" ], "description": "Crisp Live Chat is a live chat solution with free and paid options.", "website": "https://crisp.chat/" }, "Criteo": { "cats": [ 36, 77 ], "js": [ "criteo", "criteo_pubtag", "criteo_q" ], "scriptSrc": [ "//(?:cas\\.criteo\\.com|(?:[^/]\\.)?criteo\\.net)/", "//static\\.criteo\\.net/js/ld/ld\\.js" ], "description": "Criteo provides personalised retargeting that works with Internet retailers to serve personalised online display advertisements to consumers who have previously visited the advertiser's website.", "website": "https://criteo.com" }, "Crobox": { "cats": [ 5 ], "js": [ "crobox" ], "scriptSrc": [ "cdn\\.crobox\\.com" ], "website": "https://crobox.com/" }, "Crocoblock JetElements": { "cats": [ 87 ], "js": [ "jetelements" ], "description": "Crocoblock JetElements is an addon for Elementor that adds additional customisation options to the page builder.", "website": "https://crocoblock.com/plugins/jetelements" }, "Cross Pixel": { "cats": [ 77 ], "js": [ "cp_c4w1ldn2d9pmvrkn" ], "scriptSrc": [ "tag\\.crsspxl\\.com" ], "description": "Cross Pixel is an advertising platform through which advertisers can leverage the marriage of partner audience synergies with the power of retargeting.", "website": "https://crosspixel.net" }, "Cross Sell": { "cats": [ 76 ], "scriptSrc": [ "load\\.csell\\.co" ], "implies": [ "Cart Functionality", "Shopify" ], "description": "Cross Sell provide recommendations solution for Shopify based sites.", "website": "https://csell.io/" }, "CrossBox": { "cats": [ 30 ], "headers": { "server": "cbx-ws" }, "description": "CrossBox is a webmail client.", "website": "https://crossbox.io" }, "CrownPeak": { "cats": [ 1, 19 ], "js": [ "crownpeakautocomplete", "crownpeaksearch" ], "scripts": [ "crownpeak\\.net" ], "scriptSrc": [ "js/crownpeak\\." ], "description": "CrownPeak is a cloud-based Digital Experience Platform (DXP).", "website": "https://www.crownpeak.com" }, "Cryout Creations Bravada": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/bravada(?:-plus)?/.+frontend\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Bravada is an unparalleled fullscreen WordPress theme created by Cryout Creations.", "website": "https://www.cryoutcreations.eu/wordpress-themes/bravada" }, "Cryout Creations Fluida": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/fluida(?:-plus)?/.+frontend\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Fluida is a modern, crystal clear and squeaky clean WordPress theme by Cryout Creations.", "website": "https://www.cryoutcreations.eu/wordpress-themes/fluida" }, "Cryout Creations Mantra": { "cats": [ 80 ], "js": [ "mantra_mobilemenu_init", "mantra_onload", "mantra_options" ], "scriptSrc": [ "/wp-content/themes/mantra(?:-plus)?/.+frontend\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Mantra is a do-it-yourself WordPress theme, featuring a pack of over 100 customization option created by Cryout Creations.", "website": "https://www.cryoutcreations.eu/wordpress-themes/mantra" }, "Cryout Creations Parabola": { "cats": [ 80 ], "js": [ "parabola_mobilemenu_init", "parabola_settings" ], "scriptSrc": [ "/wp-content/themes/parabola/.+frontend\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Parabola is an fully responsive, clean and elegant design WordPress theme created by Cryout Creations.", "website": "https://www.cryoutcreations.eu/wordpress-themes/parabola" }, "Crypto-Loot": { "cats": [ 56 ], "js": [ "crlt.config.asmjs_name", "cryptoloot" ], "scriptSrc": [ "/crlt\\.js\\;confidence:75", "^/crypto-loot\\.com/lib/", "^/cryptoloot\\.pro/", "^/webmine\\.pro/" ], "description": "Crypto-Loot is a browser based web miner for the uPlexa Blockchain.", "website": "https://crypto-loot.com/" }, "Crystallize": { "cats": [ 6 ], "js": [ "__crystallizeconfig.api_url" ], "description": "Crystallize is an ecommerce platform that offers a headless ecommerce solution for businesses.", "website": "https://crystallize.com" }, "CubeCart": { "cats": [ 6 ], "meta": { "generator": [ "cubecart" ] }, "implies": [ "PHP" ], "description": "CubeCart is a free ecommerce platform that businesses can use to build, manage, and market their online stores.", "website": "https://www.cubecart.com", "cpe": "cpe:2.3:a:cubecart:cubecart:*:*:*:*:*:*:*:*" }, "Cubyn": { "cats": [ 99 ], "description": "Cubyn is B2B logistics company headquartered in France.", "website": "https://www.cubyn.com" }, "Cufon": { "cats": [ 17 ], "js": [ "cufon" ], "scriptSrc": [ "cufon-yui\\.js" ], "description": "Cufon is a tool used to overlap real text with an image.", "website": "https://cufon.shoqolate.com" }, "Custom Fonts": { "cats": [ 87, 17 ], "scriptSrc": [ "/wp-content/plugins/custom-fonts/" ], "description": "Custom Fonts plugin helps you easily embed custom fonts files (woff2, woff, ttf, svg, eot, otf) easily in your WordPress website.", "website": "https://github.com/brainstormforce/custom-fonts" }, "Customer.io": { "cats": [ 32 ], "scriptSrc": [ "assets\\.customer\\.io" ], "description": "Customer.io is an automated messaging platform for marketers.", "website": "https://customer.io/" }, "Customily": { "cats": [ 76 ], "js": [ "customily.sticky" ], "scriptSrc": [ "(?:cdn|app)\\.customily\\.com/" ], "description": "Customily is an online product personalisation software.", "website": "https://www.customily.com" }, "Cwicly": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/cwicly/" ], "implies": [ "Gutenberg" ], "description": "Cwicly is an advanced professional design and block toolkit that integrates directly with the WordPress editor.", "website": "https://cwicly.com" }, "Cxense": { "cats": [ 76, 86 ], "scriptSrc": [ "\\.cxense\\.com/" ], "meta": { "cxenseparse:itm-meta-keywords": [], "cxenseparse:pageclass": [], "cxenseparse:publishtime": [], "cxenseparse:url": [] }, "description": "Cxense was an AI-powered data management and intelligent personalisation platform.", "website": "https://www.cxense.com" }, "CyberChimps Responsive": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/responsive(?:pro)?/" ], "description": "CyberChimps Responsive is a modern, lightweight, fully customizable, fast and responsive WordPress theme.", "website": "https://cyberchimps.com/responsive" }, "Cybersource": { "cats": [ 41 ], "scriptSrc": [ "cybersource\\..+\\.js" ], "description": "Cybersource is an ecommerce credit card payment system solution.", "website": "https://www.cybersource.com/" }, "Czater": { "cats": [ 52 ], "js": [ "$czater", "$czatermethods" ], "scriptSrc": [ "\\.czater\\.pl" ], "description": "Czater is an live chat solution with extended CRM and videochat features.", "website": "https://www.czater.pl" }, "D3": { "cats": [ 25 ], "js": [ "d3.version" ], "scriptSrc": [ "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js" ], "description": "D3.js is a JavaScript library for producing dynamic, interactive data visualisations in web browsers.", "website": "https://d3js.org", "cpe": "cpe:2.3:a:d3.js_project:d3.js:*:*:*:*:*:*:*:*" }, "DDoS-Guard": { "cats": [ 16 ], "headers": { "server": "^ddos-guard$" }, "description": "DDoS-Guard is a Russian Internet infrastructure company which provides DDoS protection, content delivery network services, and web hosting services.", "website": "https://ddos-guard.net" }, "DERAK.CLOUD": { "cats": [ 31 ], "cookies": { "__derak_auth": "", "__derak_user": "" }, "js": [ "derakcloud.init" ], "headers": { "derak-umbrage": "", "server": "^derak\\.cloud$" }, "website": "https://derak.cloud" }, "DHL": { "cats": [ 99 ], "description": "DHL is an international courier, package delivery and express mail service, which is a division of the German logistics firm Deutsche Post.", "website": "https://www.dhl.com" }, "DHTMLX": { "cats": [ 59 ], "js": [ "dhtmldraganddropobject", "dhtmlxtreeitemobject" ], "scriptSrc": [ "/dhtmlxcommon\\.js" ], "description": "DHTMLX specialises in building JavaScript UI libraries for project management, event planning, big data visualisation, and reporting.", "website": "https://dhtmlx.com" }, "DM Polopoly": { "cats": [ 1 ], "implies": [ "Java" ], "description": "DM Polopoly is a web content management solution focused on enhancing the user experience built by Atex.", "website": "https://www.atex.com/products/dm-polopoly" }, "DNN": { "cats": [ 1 ], "cookies": { "dotnetnukeanonymous": "" }, "js": [ "dnn.apiversion", "dotnetnuke" ], "headers": { "cookie": "dnn_ismobile=", "dnnoutputcache": "", "x-compressed-by": "dotnetnuke" }, "html": [ "\u003c!-- by dotnetnuke corporation", "\u003c!-- dnn platform" ], "scriptSrc": [ "/js/dnn\\.js", "/js/dnncore\\.js" ], "meta": { "generator": [ "dotnetnuke" ] }, "implies": [ "Microsoft ASP.NET" ], "website": "https://www.dnnsoftware.com/", "cpe": "cpe:2.3:a:dnnsoftware:dotnetnuke:*:*:*:*:*:*:*:*" }, "DPD": { "cats": [ 99 ], "description": "DPD is an international parcel delivery service for sorter compatible parcels.", "website": "https://www.dpd.com" }, "DPlayer": { "cats": [ 14 ], "js": [ "dplayer", "dplayer.version" ], "scriptSrc": [ "/dplayer\\.js" ], "description": "DPlayer is an HTML 5 video player that supports pop-up.", "website": "https://dplayer.js.org" }, "DTScout": { "cats": [ 36 ], "scriptSrc": [ "\\.dtscout\\.com/" ], "description": "DTScout is a marketing data intelligence software.", "website": "https://www.dtscout.com" }, "DX": { "cats": [ 99 ], "description": "DX (also known as DX Freight) is a British mail, courier and logistics company.", "website": "https://www.dxdelivery.com" }, "DX1": { "cats": [ 53 ], "js": [ "dx1.dnn" ], "scriptSrc": [ "\\.dx1app\\.com/" ], "description": "DX1 is an entirely cloud-based dealership management system for the motorcycle and powersports industry. Offering DMS, website, CRM and marketing tools.", "website": "https://www.dx1app.com" }, "Dachser": { "cats": [ 99 ], "description": "Dachser is a German freight company.", "website": "https://www.dachser.com" }, "Daily Deals": { "cats": [ 5 ], "js": [ "ddaddtocheckout", "ddaddtoorder" ], "scriptSrc": [ "assets\\.dailydeals\\.ai/" ], "description": "Daily Deals is a flash sale, limited-time discounts, countdown timers, and sales analytics solution.", "website": "https://dailydeals.ai" }, "DailyKarma": { "cats": [ 5 ], "js": [ "dk_widget", "dkwidgetinit" ], "scriptSrc": [ "assets\\.dailykarma\\.io/" ], "description": "DailyKarma is a turnkey cause marketing solutions for ecommerce merchants.", "website": "https://www.dailykarma.com" }, "Dailymotion": { "cats": [ 14 ], "meta": { "name": [ "dailymotion-domain-verification" ] }, "description": "Dailymotion is a French video-sharing technology platform.", "website": "https://www.dailymotion.com" }, "Dancer": { "cats": [ 18 ], "headers": { "server": "perl dancer ([\\d.]+)\\;version:\\1", "x-powered-by": "perl dancer ([\\d.]+)\\;version:\\1" }, "implies": [ "Perl" ], "description": "Mono.net delivers the a Software-as-a-Service (SaaS) platform to build and sell websites and other digital products.", "website": "https://perldancer.org" }, "Danneo CMS": { "cats": [ 1 ], "headers": { "x-powered-by": "cms danneo ([\\d.]+)\\;version:\\1" }, "meta": { "generator": [ "danneo cms ([\\d.]+)\\;version:\\1" ] }, "implies": [ "Apache HTTP Server", "PHP" ], "website": "https://danneo.com" }, "Daphne": { "cats": [ 22 ], "headers": { "server": "daphne" }, "implies": [ "Python", "TwistedWeb", "Zope" ], "website": "https://github.com/django/daphne" }, "Darkmode.js": { "cats": [ 59 ], "js": [ "darkmode" ], "scriptSrc": [ "darkmode-js@([\\d\\.]+)/lib/darkmode-js\\.min\\.js\\;version:\\1" ], "description": "Darkmode.js is a JavaScript library that enables an HTML element to switch between CSS themes.", "website": "https://github.com/sandoche/Darkmode.js" }, "Dart": { "cats": [ 27 ], "js": [ "$__dart_deferred_initializers__", "___dart__$dart_dartobject_zxyxx_0_", "___dart_dispatch_record_zxyxx_0_" ], "scriptSrc": [ "/(?:\\.)?(?:dart)(?:\\.js)?/" ], "description": "Dart is an open-source, general-purpose, object-oriented programming language developed by Google.", "website": "https://dart.dev" }, "Darwin": { "cats": [ 28 ], "headers": { "server": "darwin", "x-powered-by": "darwin" }, "description": "Darwin is the open-source operating system from Apple that forms the basis for macOS.", "website": "https://opensource.apple.com" }, "DataDome": { "cats": [ 16 ], "cookies": { "datadome": "", "datadome-_zldp": "", "datadome-_zldt": "" }, "headers": { "server": "^datadome$", "x-datadome": "", "x-datadome-cid": "" }, "scriptSrc": [ "^https://ct\\.datadome\\.co/[a-z]\\.js$" ], "description": "DataDome is a cybersecurity platform that specialises in bot protection and mitigation, offering advanced solutions to safeguard websites and mobile applications against malicious bot traffic, credential stuffing, scraping, and other automated threats.", "website": "https://datadome.co" }, "DataLife Engine": { "cats": [ 1 ], "js": [ "dle_root" ], "meta": { "generator": [ "datalife engine" ] }, "implies": [ "Apache HTTP Server", "PHP" ], "website": "https://dle-news.ru", "cpe": "cpe:2.3:a:dleviet:datalife_engine:*:*:*:*:*:*:*:*" }, "DataMilk": { "cats": [ 10, 19 ], "js": [ "datamilkmagicaiexecuted" ], "description": "DataMilk is an AI tool which autonomously optimises customer UI for ecommerce customers in order to increase conversions.", "website": "https://www.datamilk.ai" }, "DataTables": { "cats": [ 59 ], "js": [ "$.fn.datatable.version", "jquery.fn.datatable.version" ], "scriptSrc": [ "datatables.*\\.js" ], "implies": [ "jQuery" ], "description": "DataTables is a plug-in for the jQuery Javascript library adding advanced features like pagination, instant search, themes, and more to any HTML table.", "website": "https://datatables.net", "cpe": "cpe:2.3:a:datatables:datatables.net:*:*:*:*:*:*:*:*" }, "Datadog": { "cats": [ 78, 10 ], "js": [ "dd_logs", "dd_rum" ], "scriptSrc": [ "www\\.datadoghq-browser-agent\\.com" ], "description": "Datadog is a SaaS-based monitoring and analytics platform for large-scale applications and infrastructure.", "website": "https://www.datadoghq.com" }, "Datatrics": { "cats": [ 97 ], "js": [ "datatricsclick", "datatricsevents" ], "description": "Datatrics is a data-driven marketing platform that provides businesses with advanced tools and analytics to optimise customer experiences, personalise marketing campaigns, and drive engagement through data-driven insights and automation.", "website": "https://datatrics.com" }, "DatoCMS": { "cats": [ 1 ], "headers": { "content-security-policy": "\\.datocms-assets\\.com" }, "description": "DatoCMS is a cloud-based headless Content as a service (CaaS) platform created to work with static websites, mobile apps and server-side applications of any kind.", "website": "https://www.datocms.com" }, "Day.js": { "cats": [ 59 ], "js": [ "dayjs" ], "website": "https://github.com/iamkun/dayjs" }, "Dealer Spike": { "cats": [ 36, 32 ], "scriptSrc": [ "cdn\\.dealerspike\\.com" ], "description": "Dealer Spike is a digital marketing and advertising company focused that helps dealers grow their business.", "website": "https://www.dealerspike.com" }, "Debian": { "cats": [ 28 ], "headers": { "server": "debian", "x-powered-by": "(?:debian|dotdeb|(potato|woody|sarge|etch|lenny|squeeze|wheezy|jessie|stretch|buster|sid))\\;version:\\1" }, "description": "Debian is a Linux software which is a free open-source software.", "website": "https://debian.org", "cpe": "cpe:2.3:o:debian:debian_linux:*:*:*:*:*:*:*:*" }, "Decibel": { "cats": [ 10, 74 ], "js": [ "decibelinsight", "decibelinsightlayer" ], "scriptSrc": [ "cdn\\.decibelinsight\\.net" ], "description": "Decibel is a behavioral analysis solution that helps users gain actionable insights about their digital audience.", "website": "https://decibel.com" }, "DedeCMS": { "cats": [ 1 ], "js": [ "dedecontainer" ], "scriptSrc": [ "dedeajax" ], "implies": [ "PHP" ], "website": "https://dedecms.com", "cpe": "cpe:2.3:a:dedecms:dedecms:*:*:*:*:*:*:*:*" }, "Delacon": { "cats": [ 10 ], "js": [ "dela_247_call", "delaconphonenums" ], "description": "Delacon provides Australian businesses with Call Tracking, Call Management and Speech Analytics solutions.", "website": "https://www.delacon.com.au" }, "Delivengo": { "cats": [ 99 ], "description": "Delivengo is an international shipping service powered by La Poste.", "website": "https://mydelivengo.laposte.fr/" }, "Deliverr": { "cats": [ 107 ], "js": [ "deliverrscript" ], "scriptSrc": [ "fast-tags\\.deliverr\\.com" ], "implies": [ "Cart Functionality" ], "description": "Deliverr is a fulfilment service that facilitates shipping services for ecommerce businesses.", "website": "https://deliverr.com" }, "Demandbase": { "cats": [ 10, 76 ], "js": [ "demandbase", "demandbase.version" ], "scriptSrc": [ "tag.demandbase.com" ], "description": "Demandbase is a targeting and personalization platform for business-to-business companies.", "website": "https://www.demandbase.com" }, "Deno": { "cats": [ 22 ], "description": "A modern runtime for JavaScript and TypeScript.", "website": "https://deno.land" }, "Deno Deploy": { "cats": [ 62 ], "headers": { "server": "^deno/*" }, "implies": [ "Deno" ], "description": "Deno Deploy is a distributed system that runs JavaScript, TypeScript, and WebAssembly at the edge, worldwide.", "website": "https://deno.land/" }, "Depict": { "cats": [ 76 ], "description": "Depict is an ecommerce personalisation solution for fashion.", "website": "https://depict.ai" }, "DeskPro": { "cats": [ 1, 53 ], "meta": { "generator": [ "^deskpro.+$" ] }, "description": "DeskPro is multi channel helpdesk software for managing customer and citizen requests via email, forms, chat, social and voice.", "website": "https://www.deskpro.com", "cpe": "cpe:2.3:a:deskpro:deskpro:*:*:*:*:*:*:*:*" }, "DeskPro Chat": { "cats": [ 52 ], "js": [ "deskpro_widget_options.chat" ], "description": "DeskPro is multi channel helpdesk software for managing customer and citizen requests via email, forms, chat, social and voice.", "website": "https://www.deskpro.com/product/chat" }, "Deta": { "cats": [ 62 ], "headers": { "server": "^deta$" }, "description": "Deta is a cloud platform for building and deploying apps.", "website": "https://deta.sh" }, "Detectify": { "cats": [ 16 ], "description": "Detectify is an automated scanner that checks your web application for vulnerabilities.", "website": "https://detectify.com/" }, "Deutsche Post": { "cats": [ 99 ], "description": "Deutsche Post is a German multinational package delivery and supply chain management company in Germany.", "website": "https://www.deutschepost.de" }, "DiamondCDN": { "cats": [ 31 ], "headers": { "server": "^diamondcdn$" }, "description": "DiamondCDN is a CDN with DDoS mitigation for free.", "website": "https://diamondcdn.com" }, "Dianomi": { "cats": [ 36 ], "scriptSrc": [ "\\.dianomi\\.com/" ], "description": "Dianomi is an advertiser campaign management software for financial services, premium lifestyle, technology and corporate sectors.", "website": "https://www.dianomi.com" }, "Didomi": { "cats": [ 67 ], "scriptSrc": [ "sdk\\.privacy-center\\.org/.*/loader\\.js" ], "description": "Didomi is a consent management platform helping brands and businesses collect, store and leverage their customer consents.", "website": "https://www.didomi.io/en/consent-preference-management" }, "Digest": { "cats": [ 16 ], "headers": { "www-authenticate": "^digest" }, "description": "Digest is an authentication method based on a MD5 hash used by web servers.", "website": "https://tools.ietf.org/html/rfc7616" }, "DigiCert": { "cats": [ 70 ], "website": "https://www.digicert.com/" }, "Digismoothie Candy Rack": { "cats": [ 100 ], "js": [ "candyrack_document_listener", "candyrackenabledebug" ], "implies": [ "Shopify" ], "description": "Digismoothie Candy Rack is an upsell app for Shopify which allow merchants to offer custom services or bundle products.", "website": "https://www.digismoothie.com/apps/candy-rack" }, "Digistore24": { "cats": [ 71 ], "js": [ "digistore_link_id_key", "digistore_vendorkey", "getthesourcefordigistorelinks" ], "scriptSrc": [ "digistore/digistore\\.js", "www\\.digistore24\\.com" ], "description": "Digistore24 is a German digital reselling and affiliate marketing platform.", "website": "https://www.digistore24.com" }, "Digital Showroom": { "cats": [ 6 ], "description": "Digital Showroom is an ecommerce platform.", "website": "https://digitalshowroom.in" }, "DigitalOcean Spaces": { "cats": [ 31, 63 ], "description": "DigitalOcean Spaces is a cloud-based object storage service provided by DigitalOcean, a cloud infrastructure provider. It allows users to store and retrieve large amounts of data, such as images, videos, audio files, backups, and logs, using a simple RESTful API or a web-based graphical user interface (GUI).", "website": "https://www.digitalocean.com/products/spaces" }, "DigitalRiver": { "cats": [ 6, 41 ], "cookies": { "x-dr-shopper-ets": "", "x-dr-theme": "^\\d+$" }, "js": [ "digitalriver" ], "scriptSrc": [ "\\.digitalriver\\.com/" ], "description": "Digital River provides global ecommerce, payments and marketing services.", "website": "https://www.digitalriver.com" }, "DirectAdmin": { "cats": [ 9 ], "headers": { "server": "directadmin daemon v([\\d.]+)\\;version:\\1" }, "html": [ "\u003ca[^\u003e]+\u003edirectadmin\u003c/a\u003e web control panel" ], "implies": [ "Apache HTTP Server", "PHP" ], "description": "DirectAdmin is a graphical web-based web hosting control panel designed to make administration of websites easier.", "website": "https://www.directadmin.com", "cpe": "cpe:2.3:a:directadmin:directadmin:*:*:*:*:*:*:*:*" }, "Directus": { "cats": [ 1 ], "headers": { "x-powered-by": "^directus$" }, "implies": [ "TinyMCE", "Vue.js", "core-js" ], "description": "Directus is a free and open-source headless CMS framework for managing custom SQL-based databases.", "website": "https://directus.io" }, "Discourse": { "cats": [ 2 ], "js": [ "discourse" ], "meta": { "generator": [ "discourse(?: ?/?([\\d.]+\\d))?\\;version:\\1" ] }, "implies": [ "Ruby on Rails" ], "description": "Discourse is an open-source internet forum and mailing list management software application.", "website": "https://discourse.org" }, "Discuz! X": { "cats": [ 2 ], "js": [ "discuz_uid", "discuzcode", "discuzversion" ], "meta": { "generator": [ "discuz! x([\\d\\.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Discuz! X is an internet forum software written in PHP and supports MySQL and PostgreSQL databases.", "website": "https://www.discuz.net" }, "Disqus": { "cats": [ 15 ], "js": [ "disqus", "disqus_shortname", "disqus_url" ], "scriptSrc": [ "disqus_url" ], "description": "Disqus is a worldwide blog comment hosting service for web sites and online communities that use a networked platform.", "website": "https://disqus.com", "cpe": "cpe:2.3:a:disqus:disqus_comment_system:*:*:*:*:*:*:*:*" }, "Distributor": { "cats": [ 87 ], "headers": { "x-distributor": "yes" }, "scriptSrc": [ "/wp-content/plugins/distributor" ], "description": "Distributor is a WordPress plugin that helps distribute and reuse content across your websites.", "website": "https://distributorplugin.com" }, "District M": { "cats": [ 36 ], "description": "District M is a programmatic advertising exchange.", "website": "https://districtm.net" }, "Dito": { "cats": [ 53 ], "js": [ "dito.appsettings" ], "scriptSrc": [ "storage\\.googleapis\\.com/dito/sdk\\.js" ], "description": "Dito is a tool that centralizes and manages the relationship between brands and their customers.", "website": "https://www.dito.com.br" }, "Divi": { "cats": [ 51, 80, 87 ], "js": [ "divi" ], "scriptSrc": [ "divi/js/custom\\.(?:min|unified)\\.js\\?ver=([\\d.]+)\\;version:\\1" ], "meta": { "generator": [ "divi(?:\\sv\\.([\\d\\.]+))?\\;version:\\1" ] }, "description": "Divi is a WordPress Theme and standalone WordPress plugin from Elegant themes that allows users to build websites using the visual drag-and-drop Divi page builder.", "website": "https://www.elegantthemes.com/gallery/divi" }, "DivideBuy": { "cats": [ 41, 91 ], "js": [ "display_dividebuy_modal" ], "description": "Dividebuy provides retailer financing solutions.", "website": "https://dividebuy.co.uk/" }, "Divido": { "cats": [ 41, 91 ], "scriptSrc": [ "cdn\\.divido\\.com" ], "description": "Divio is a Buy now pay later solution. Divido provided whitelabel platform connects lenders, retailers and channel partners at the point of sale", "website": "https://www.divido.com/" }, "Django": { "cats": [ 18 ], "cookies": { "django_language": "" }, "js": [ "__admin_media_prefix__", "django" ], "html": [ "(?:powered by \u003ca[^\u003e]+\u003edjango ?([\\d.]+)?\u003c\\/a\u003e|\u003cinput[^\u003e]*name=[\"']csrfmiddlewaretoken[\"'][^\u003e]*\u003e)\\;version:\\1" ], "implies": [ "Python" ], "description": "Django is a Python-based free and open-source web application framework.", "website": "https://djangoproject.com", "cpe": "cpe:2.3:a:djangoproject:django:*:*:*:*:*:*:*:*" }, "Django CMS": { "cats": [ 1 ], "scriptSrc": [ "/djangocms_" ], "implies": [ "Django", "PostgreSQL", "Python" ], "description": "Django CMS is a free and open source content management system platform for publishing content on the World Wide Web and intranets.", "website": "https://www.django-cms.org" }, "DocFX": { "cats": [ 4 ], "meta": { "docfx:navrel": [ "toc.html" ], "docfx:tocrel": [ "toc.html" ], "generator": [ "docfx\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "DocFX is a tool for building and publishing API documentation for .NET projects.", "website": "https://github.com/dotnet/docfx" }, "Docker": { "cats": [ 60 ], "html": [ "\u003c!-- this comment is expected by the docker healthcheck --\u003e" ], "description": "Docker is a tool designed to make it easier to create, deploy, and run applications by using containers.", "website": "https://www.docker.com/", "cpe": "cpe:2.3:a:docker:engine:*:*:*:*:*:*:*:*" }, "Docsify": { "cats": [ 4 ], "js": [ "docsify.version", "docsifycompiler" ], "description": "Docsify is an open-source documentation generator for creating user-friendly documentation websites.", "website": "https://docsify.js.org" }, "DocuSign": { "cats": [ 19 ], "description": "DocuSign allows organisations to manage electronic agreements.", "website": "https://www.docusign.com" }, "Docusaurus": { "cats": [ 4, 57 ], "js": [ "__docusaurus_insert_baseurl_banner", "docusaurus", "search.indexname" ], "meta": { "docusaurus_locale": [], "docusaurus_tag": [], "generator": [ "^docusaurus(?: v(.+))?$\\;version:\\1" ] }, "implies": [ "React", "Webpack" ], "description": "Docusaurus is a tool for teams to publish documentation websites.", "website": "https://docusaurus.io/" }, "Dojo": { "cats": [ 59 ], "js": [ "dojo", "dojo.version.major" ], "scriptSrc": [ "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1" ], "website": "https://dojotoolkit.org", "cpe": "cpe:2.3:a:dojotoolkit:dojo:*:*:*:*:*:*:*:*" }, "Dokan": { "cats": [ 6 ], "js": [ "dokan" ], "description": "Dokan offers a multi-vendor marketplace solution built on top of wordpress and woocommerce.", "website": "https://wedevs.com/dokan" }, "Dokeos": { "cats": [ 21 ], "headers": { "x-powered-by": "dokeos" }, "html": [ "(?:portal \u003ca[^\u003e]+\u003edokeos|@import \"[^\"]+dokeos_blue)" ], "meta": { "generator": [ "dokeos" ] }, "implies": [ "PHP", "Xajax", "jQuery" ], "description": "Dokeos is an e-learning and course management web application.", "website": "https://dokeos.com" }, "DokuWiki": { "cats": [ 8 ], "cookies": { "dokuwiki": "" }, "js": [ "doku_edit_text_content", "doku_tpl" ], "meta": { "generator": [ "^dokuwiki( release [\\d-]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "DokuWiki is a free open-source wiki software.", "website": "https://www.dokuwiki.org", "cpe": "cpe:2.3:a:dokuwiki:dokuwiki:*:*:*:*:*:*:*:*" }, "DomainFactory": { "cats": [ 88 ], "description": "DomainFactory has been operating as a web hosting company. It is owned by GoDaddy and targets businesses in Austria and Germany.", "website": "https://www.df.eu" }, "Dominate WooCommerce": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/iwd-checkout-connector/" ], "description": "Dominate WooCommerce is a cloud-based checkout-page which supports PayPal Smart buttons for Venmo, PayPal Credit, and other payment methods.", "website": "https://www.dominate.co/woocommerce" }, "DonorPerfect": { "cats": [ 111 ], "scriptSrc": [ "\\.donorperfect\\.net/" ], "description": "DonorPerfect is a fundraising management software.", "website": "https://www.donorperfect.com" }, "Donorbox": { "cats": [ 111 ], "js": [ "donorbox", "donorbox", "donorbox_check_donation_period" ], "description": "Donorbox is a US-based technology company. It offers an online fundraising software that allows individuals and nonprofit organisations to receive donations over the Internet.", "website": "https://donorbox.org" }, "Doofinder": { "cats": [ 29 ], "js": [ "doofinder.classic.version" ], "scriptSrc": [ "cdn\\.doofinder\\.com/" ], "description": "Doofinder is a search site solution that enables users to include advanced and smart search engine capabilities in their ecommerce website.", "website": "https://www.doofinder.com" }, "Doppler": { "cats": [ 75 ], "scriptSrc": [ "//(?:hub|cdn)\\.fromdoppler\\.com/" ], "description": "Doppler is an email marketing and transactional email service.", "website": "https://www.fromdoppler.com" }, "Doppler Forms": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/doppler-form/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Doppler" ], "description": "The Doppler Forms plugin allows you to create fully customised subscription forms that you can add to your website or blog.", "website": "https://wordpress.org/plugins/doppler-form/" }, "Doppler for WooCommerce": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/doppler-for-woocommerce/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Doppler" ], "description": "The Doppler for WooCommerce plugin adds submit your WooCommerce customers and buyers to a Doppler List.", "website": "https://wordpress.org/plugins/doppler-for-woocommerce/" }, "Dotclear": { "cats": [ 1 ], "headers": { "x-dotclear-static-cache": "" }, "implies": [ "PHP" ], "website": "https://dotclear.org", "cpe": "cpe:2.3:a:dotclear:dotclear:*:*:*:*:*:*:*:*" }, "Dotdigital": { "cats": [ 32, 10 ], "js": [ "dm_insight_id", "dmpt", "dmtrackingobjectname" ], "scriptSrc": [ "js/_dmptv([\\d.]+)\\.js\\;version:\\1" ], "description": "Dotdigital is an all-in-one cloud-based customer engagement multichannel marketing platform.", "website": "https://dotdigital.com" }, "Dotdigital Chat": { "cats": [ 52 ], "js": [ "_ddgchatconfig.urlbase" ], "implies": [ "Dotdigital" ], "description": "Dotdigital Chat is a smart, customisable widget that makes it easy for shoppers to communicate in real-time with members of your team.", "website": "https://dotdigital.com" }, "Doteasy": { "cats": [ 88 ], "description": "Doteasy is a web hosting company that provides web hosting services, domain registration, and other related services for businesses and individuals. The company was founded in 2000 and is based in Vancouver, Canada.", "website": "https://www.doteasy.com" }, "Doteasy Website Builder": { "cats": [ 51 ], "js": [ "fsdata.fs" ], "implies": [ "Doteasy" ], "description": "Doteasy Website Builder is a tool provided by Doteasy, a web hosting company that enables users to create and personalise their own websites without necessitating any technical knowledge or expertise in website design.", "website": "https://www.doteasy.com/website-builder/" }, "DoubleClick Ad Exchange (AdX)": { "cats": [ 36 ], "scriptSrc": [ "googlesyndication\\.com.*abg\\.js", "googlesyndication\\.com/pagead/show_ads\\.js", "tpc\\.googlesyndication\\.com/safeframe" ], "description": "DoubleClick Ad Exchange is a real-time marketplace to buy and sell display advertising space.", "website": "https://www.doubleclickbygoogle.com/solutions/digital-marketing/ad-exchange/" }, "DoubleClick Campaign Manager (DCM)": { "cats": [ 36 ], "scriptSrc": [ "2mdn\\.net" ], "website": "https://www.doubleclickbygoogle.com/solutions/digital-marketing/campaign-manager/" }, "DoubleClick Floodlight": { "cats": [ 36 ], "scriptSrc": [ "https?://fls\\.doubleclick\\.net" ], "website": "https://support.google.com/ds/answer/6029713?hl=en" }, "DoubleClick for Publishers (DFP)": { "cats": [ 36 ], "scriptSrc": [ "googletagservices\\.com/tag/js/gpt(?:_mobile)?\\.js" ], "description": "DoubleClick for Publishers (DFP) is a hosted ad serving platform that streamlines your ad management.", "website": "https://www.google.com/dfp" }, "DoubleVerify": { "cats": [ 36, 10 ], "description": "DoubleVerify is a software platform for digital media measurement, data, and analytics.", "website": "https://doubleverify.com" }, "Dovetale": { "cats": [ 71 ], "js": [ "dovetale" ], "scriptSrc": [ "dttrk\\.com" ], "description": "Dovetale (Acquired by Shopify) helps e-commerce stores recruit, manage, \u0026 grow their sales with communities of people who love their products.", "website": "https://dovetale.com/" }, "Download Monitor": { "cats": [ 87 ], "js": [ "dlm_xhr_download", "dlmxhr.prevent_duplicates" ], "meta": { "dlm-version": [ "^([\\d\\.]+)$\\;version:\\1" ] }, "description": "Download Monitor is a plugin for selling, uploading and managing downloads, tracking downloads and displaying links.", "website": "https://www.download-monitor.com" }, "Doxygen": { "cats": [ 4 ], "html": [ "(?:\u003c!-- generated by doxygen ([\\d.]+)|\u003clink[^\u003e]+doxygen\\.css)\\;version:\\1" ], "meta": { "generator": [ "doxygen ([\\d.]+)\\;version:\\1" ] }, "description": "Doxygen is a documentation generator, a tool for writing software reference documentation.", "website": "https://www.doxygen.nl/", "cpe": "cpe:2.3:a:doxygen:doxygen:*:*:*:*:*:*:*:*" }, "Draft.js": { "cats": [ 20 ], "scriptSrc": [ "draft-js(@|/)([\\d.]+)\\;version:\\2" ], "description": "Draft.js is a JavaScript rich text editor framework, built for React.", "website": "https://draftjs.org/" }, "Draftpress HFCM": { "cats": [ 87 ], "html": [ "\u003c!--[^\u003e]*hfcm\\sby\\s99\\srobots" ], "description": "Header Footer Code Manager by Draftpress is a easy interface to add snippets to the header or footer or above or below the content of your page.", "website": "https://draftpress.com/products/header-footer-code-manager-pro/" }, "Dragon": { "cats": [ 27 ], "headers": { "x-powered-by": "dragon native ([\\d.]+)\\;version:\\1" }, "implies": [ "Apache HTTP Server" ], "description": "Dragon is a general-purpose programming language.", "website": "https://dragon-lang.org" }, "Drapr": { "cats": [ 76 ], "js": [ "drapr_data", "drapr_deferloading" ], "scriptSrc": [ "draprpubsubtest\\.firebaseapp\\.com/" ], "description": "Drapr is an ecommerce startup and online application based on technology that enables customers to quickly create 3D avatars and virtually try on clothing.", "website": "https://www.drapr.com" }, "DreamApply": { "cats": [ 101, 19 ], "scriptSrc": [ "app\\.cdn\\.dreamapply\\.com/" ], "implies": [ "Facebook Login", "Google Sign-in", "Linkedin Sign-in" ], "description": "DreamApply is a specialised student application management system designed with and for education institutions.", "website": "https://dreamapply.com" }, "DreamHost": { "cats": [ 88 ], "description": "DreamHost is a Los Angeles-based web hosting provider and domain name registrar.", "website": "https://www.dreamhost.com" }, "DreamWeaver": { "cats": [ 20 ], "js": [ "mm_preloadimages", "mm_showhidelayers", "mm_showmenu" ], "html": [ "\u003c!-- #begintemplate\\s\"[\\d_\\w/]+\\.dwt", "\u003c!--[^\u003e]*(?:instancebegineditable|dreamweaver([^\u003e]+)target|dwlayoutdefaulttable)\\;version:\\1" ], "description": "Dreamweaver is a development tool for creating, publishing, and managing websites and mobile content.", "website": "https://www.adobe.com/products/dreamweaver.html", "cpe": "cpe:2.3:a:adobe:dreamweaver:*:*:*:*:*:*:*:*" }, "Dreamdata": { "cats": [ 32, 10 ], "js": [ "bizible", "biztrackinga" ], "scriptSrc": [ "\\.bizible\\.com/" ], "description": "Dreamdata is a B2B revenue attribution platform.", "website": "https://dreamdata.io" }, "Drift": { "cats": [ 52 ], "js": [ "drift", "driftt" ], "description": "Drift is a conversational marketing platform.", "website": "https://www.drift.com/" }, "Drip": { "cats": [ 32 ], "scriptSrc": [ "\\.getdrip\\.com/" ], "description": "Drip is a marketing automation platform built for ecommerce.", "website": "https://www.drip.com" }, "Drop A Hint": { "cats": [ 100 ], "js": [ "dropahint.baseurl", "dropahinttypeproduct" ], "description": "Drop A Hint is an Shopify app which help share hints via email, SMS, WhatsApp and messengers.", "website": "https://apps.shopify.com/drop-a-hint-v2" }, "DropInBlog": { "cats": [ 11 ], "scriptSrc": [ "\\.dropinblog\\.com/" ], "description": "DropInBlog is a remotely hosted, cloud based platform that is designed to embed a blog into your html site.", "website": "https://dropinblog.com" }, "Dropbox": { "cats": [ 95 ], "website": "https://www.dropbox.com" }, "Dropzone": { "cats": [ 59 ], "js": [ "dropzone", "dropzone.version" ], "description": "Dropzone is a JavaScript library that turns any HTML element into a dropzone.", "website": "https://www.dropzone.dev" }, "Droxit": { "cats": [ 68 ], "cookies": { "droxit_a11y_state": "" }, "scriptSrc": [ "/droxit-a11y/js/activator\\.js" ], "description": "Droxit is an automated web accessibility solution.", "website": "https://www.droxit.com" }, "Droz Bot": { "cats": [ 52 ], "scriptSrc": [ "chat-app\\.meudroz\\.com/" ], "description": "Droz Bot is a multi-channel, customisable chatbot designed to help brands provide customer service across commonly used social apps.", "website": "https://meudroz.com/droz-bot/" }, "Drubbit": { "cats": [ 6 ], "meta": { "generator": [ "^drubbit commerce$" ] }, "implies": [ "MySQL", "Node.js" ], "description": "Drubbit is an ecommerce platform with a Content Management System (CMS) for creating product pages, managing checkout processes, facilitating payments, and handling shipping.", "website": "https://drubbit.com" }, "Drupal": { "cats": [ 1 ], "js": [ "drupal" ], "headers": { "expires": "19 nov 1978", "x-drupal-cache": "", "x-generator": "^drupal(?:\\s([\\d.]+))?\\;version:\\1" }, "html": [ "\u003c(?:link|style)[^\u003e]+\"/sites/(?:default|all)/(?:themes|modules)/" ], "scripts": [ "drupal_internal__nid" ], "scriptSrc": [ "drupal\\.js" ], "meta": { "generator": [ "^drupal(?:\\s([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Drupal is a free and open-source web content management framework.", "website": "https://www.drupal.org/", "cpe": "cpe:2.3:a:drupal:drupal:*:*:*:*:*:*:*:*" }, "Drupal Commerce": { "cats": [ 6 ], "html": [ "\u003c[^\u003e]+(?:id=\"block[_-]commerce[_-]cart[_-]cart|class=\"commerce[_-]product[_-]field)" ], "scriptSrc": [ "/modules/(?:contrib/)?commerce/js/conditions\\.js\\;confidence:50", "/profiles/commerce_kickstart/modules/contrib/commerce/modules/checkout/commerce_checkout\\.js\\;confidence:50", "/sites/(?:all|default)/modules/(?:contrib/)?commerce/modules/checkout/commerce_checkout\\.js\\;confidence:50" ], "implies": [ "Drupal" ], "description": "Drupal Commerce is open-source ecommerce software that augments the content management system Drupal.", "website": "https://drupalcommerce.org", "cpe": "cpe:2.3:a:commerceguys:commerce:*:*:*:*:*:*:*:*" }, "Drupal Multisite": { "cats": [ 88 ], "scriptSrc": [ "/sites/(?!(?:default|all)/).*/(?:files|themes|modules)/" ], "description": "Drupal Multisite enables separate, independent sites to be served from a single codebase.", "website": "https://www.drupal.org/docs/multisite-drupal" }, "Duda": { "cats": [ 1, 51 ], "js": [ "d_version", "systemid" ], "scriptSrc": [ "dd-cdn\\.multiscreensite\\.com/" ], "description": "Duda is a user-friendly website builder and CMS platform that enables businesses and individuals to create responsive, mobile-friendly websites without extensive coding knowledge.", "website": "https://www.duda.co" }, "Duel": { "cats": [ 71 ], "cookies": { "_duelcsrf": "" }, "js": [ "duel.apiurl" ], "scriptSrc": [ "\\.duel\\.me/" ], "implies": [ "Angular", "MongoDB", "Node.js" ], "description": "Duel is a customer advocacy marketing platform.", "website": "https://www.duel.tech" }, "Dukaan": { "cats": [ 6 ], "scriptSrc": [ "apps\\.mydukaan\\.io/" ], "meta": { "apple-mobile-web-app-title": [ "^mydukaan$" ] }, "description": "Dukaan is a hosted ecommerce solution made in India.", "website": "https://mydukaan.io" }, "Duopana": { "cats": [ 1, 11, 51 ], "scriptSrc": [ "\\.beracode\\.com/" ], "description": "Duopana is a platform for creating online communities, blogs and managing collaborative content.", "website": "https://duopana.com" }, "Dynamic Yield": { "cats": [ 74, 76 ], "cookies": { "_dy_geo": "", "_dy_ses_load_seq": "" }, "js": [ "_dy_memstore", "dy.addetection", "dyexps.sectionconfig" ], "scriptSrc": [ "cdn(?:-eu)?\\.dynamicyield\\.\\w+/" ], "description": "Dynamic Yield is a provider of automated conversion optimisation tools for marketers and retailers.", "website": "https://www.dynamicyield.com" }, "Dynamicweb": { "cats": [ 1, 6 ], "cookies": { "dynamicweb": "" }, "meta": { "generator": [ "dynamicweb ([\\d.]+)\\;version:\\1" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Dynamicweb is a all-in-one platform for content management, ecommerce, digital marketing​, product information management (PIM) and integration.", "website": "https://www.dynamicweb.dk" }, "Dynatrace": { "cats": [ 10 ], "cookies": { "dtcookie1": "" }, "js": [ "dtrum" ], "description": "Dynatrace is a technology company that produces a software intelligence platform based on artificial intelligence to monitor and optimise application performance and development, IT infrastructure, and user experience for businesses and government agencies throughout the world.", "website": "https://www.dynatrace.com" }, "Dynatrace RUM": { "cats": [ 78 ], "scriptSrc": [ "/ruxitagentjs_(?:.+)_(?:.+)\\.js" ], "implies": [ "Dynatrace" ], "description": "Dynatrace RUM is a AI powered, full stack, automated real user monutoring platform built by Dynatrace.", "website": "https://www.dynatrace.com/platform/real-user-monitoring" }, "Dyte": { "cats": [ 103 ], "css": [ "\\.dyte-client-selfVideo" ], "js": [ "triggerdyterecording" ], "implies": [ "WebRTC" ], "description": "Dyte is a developer-friendly, real-time audio and video communication software development kit (SDK).", "website": "https://dyte.io" }, "E-Com Plus": { "cats": [ 108 ], "js": [ "ecompassport.storagekey" ], "meta": { "generator": [ "^e-com\\splus\\sstorefront$" ] }, "implies": [ "TypeScript", "Vue.js" ], "description": "E-Com Plus is an open fair-code ecommerce platform designed to be used with headless commerce APIs.", "website": "https://www.ecomplus.io" }, "E-monsite": { "cats": [ 1 ], "meta": { "generator": [ "^e-monsite\\s\\(e-monsite\\.com\\)$" ] }, "implies": [ "MySQL", "Symfony" ], "description": "E-monsite is a web-based platform that allows users to create and customise their own websites using a range of templates and features, without requiring coding or technical skills.", "website": "https://www.e-monsite.com" }, "EC-CUBE": { "cats": [ 6 ], "scriptSrc": [ "eccube\\.js", "win_op\\.js" ], "implies": [ "PHP" ], "description": "EC-CUBE is an open source package used to build ecommerce sites.", "website": "https://www.ec-cube.net", "cpe": "cpe:2.3:a:lockon:ec-cube:*:*:*:*:*:*:*:*" }, "ECharts": { "cats": [ 25 ], "scriptSrc": [ "/echarts(?:\\.simple)?(?:\\.esm)?(?:\\.common)?(?:\\.min)?\\.js", "/echarts\\.min\\.[a-za-z0-9]*\\.js", "cdn\\.jsdelivr\\.net/(?:npm|gh/apache)/echarts@([\\d.]+(?:-[^/]+)?|latest)/dist/echarts.*\\.js\\;version:\\1" ], "description": "ECharts is an open-source JavaScript visualisation library.", "website": "https://echarts.apache.org/" }, "EKM": { "cats": [ 6 ], "cookies": { "ekmpowershop": "" }, "js": [ "_ekmpinpoint" ], "description": "EKM is an all-in-one online store builder, with the company based in the UK.", "website": "https://www.ekm.com" }, "ELOG": { "cats": [ 19 ], "html": [ "\u003ctitle\u003eelog logbook selection\u003c/title\u003e" ], "website": "https://midas.psi.ch/elog" }, "ELOG HTTP": { "cats": [ 22 ], "headers": { "server": "elog http ?([\\d.-]+)?\\;version:\\1" }, "implies": [ "ELOG" ], "website": "https://midas.psi.ch/elog" }, "EPrints": { "cats": [ 19 ], "js": [ "epjs_menu_template", "eprints" ], "meta": { "generator": [ "eprints ([\\d.]+)\\;version:\\1" ] }, "implies": [ "Perl" ], "website": "https://www.eprints.org" }, "ERPNext": { "cats": [ 1 ], "js": [ "erpnext.shopping_cart", "erpnext.subscribe_to_newsletter" ], "implies": [ "Frappe" ], "description": "ERPNext is a free and open-source integrated Enterprise Resource Planning (ERP) software developed by Frappe Technologies.", "website": "https://erpnext.com", "cpe": "cpe:2.3:a:frappe:erpnext:*:*:*:*:*:*:*:*" }, "ESW": { "cats": [ 106 ], "js": [ "eshopworld", "eswretailerdisplayconfiguration" ], "scriptSrc": [ "eswhooks\\.js" ], "description": "ESW (eShopWorld) is a company providing payments, shipping, and delivery services focusing on cross-border ecommerce.", "website": "https://esw.com" }, "EWWW Image Optimizer": { "cats": [ 87, 92 ], "js": [ "ewww_webp_supported" ], "scriptSrc": [ "/wp-content/plugins/ewww-image-optimizer/" ], "description": "EWWW Image Optimizer is an image optimisation WordPress plugin designed to improve the performance of your website.", "website": "https://github.com/nosilver4u/ewww-image-optimizer" }, "EX.CO": { "cats": [ 5 ], "js": [ "__exco", "__exco_integration_type", "excopixelurl" ], "scriptSrc": [ "\\.ex\\.co", "\\.playbuzz\\.com" ], "description": "EX.CO (formerly Playbuzz) is an online publishing platform for publishers, brand agencies, and individual content creators to create content in interactive formats such as polls, quizzes, lists, video snippets, slideshows, and countdowns.", "website": "https://ex.co" }, "EZproxy": { "cats": [ 22, 64 ], "headers": { "server": "^ezproxy$" }, "description": "EZproxy is a web server and a reverse proxy that is usually used by libraries as a reverse proxy in front of electronic educational resources databases (e.g.: Scopus, PubMed, or Web of Science) in order to provide authentication and protect privacy.", "website": "https://www.oclc.org/en/ezproxy.html" }, "Easy Hide PayPal": { "cats": [ 100 ], "scriptSrc": [ "easyhide\\.herculesapps\\.com/" ], "implies": [ "Shopify" ], "description": "Easy Hide PayPal hides PayPal button from product page, cart and checkout but keep PayPal as payment option in checkout.", "website": "https://apps.shopify.com/easyhide" }, "Easy Orders": { "cats": [ 6 ], "implies": [ "Go", "Node.js", "PostgreSQL" ], "description": "Easy Orders is an ecommerce platform that offers a pricing plan where users can create their online store and pay a fee of 0.5 EGP per order.", "website": "https://www.easy-orders.net" }, "Easy Redirects": { "cats": [ 100 ], "scriptSrc": [ "easy-redirects\\..+/redirect-app\\.js" ], "implies": [ "Shopify" ], "description": "Easy Redirects is a Shopify app built by Eastside, and part of the best Shopify Apps collection.", "website": "https://apps.shopify.com/easyredirects" }, "EasyDigitalDownloads": { "cats": [ 6, 87 ], "meta": { "generator": [ "^easy digital downloads v(.*)$\\;version:\\1" ] }, "description": "Easy Digital Downloads is a WordPress ecommerce plugin that focuses purely on digital products.", "website": "https://easydigitaldownloads.com" }, "EasyEngine": { "cats": [ 47, 9 ], "headers": { "x-powered-by": "^easyengine (.*)$\\;version:\\1" }, "implies": [ "Docker" ], "description": "EasyEngine is a command-line tool for the Nginx web servers to manage WordPress sites that are running on the LEMP Stack.", "website": "https://easyengine.io" }, "EasyGift": { "cats": [ 100 ], "js": [ "easygift.nontargetingrules", "easygiftscriptloaded" ], "description": "EasyGift is a tool that automates the addition of free gifts or products to the cart based on custom rules, allowing for upsells, BOGO (Buy 1 Get 1) offers, and the creation of rules based on cart value or specific products, with the ability to schedule start times for offer activation.", "website": "https://apps.shopify.com/gifter-cart-auto-include" }, "EasyStore": { "cats": [ 6 ], "js": [ "easystore" ], "scriptSrc": [ "\\.easystore\\.co/" ], "description": "EasyStore is a multi sales channel ecommerce platform.", "website": "https://www.easystore.co" }, "Easylog": { "cats": [ 99 ], "description": "EasyLog is a logistics company based in Brazil.", "website": "https://www.easylog.com.br" }, "Ebasnet": { "cats": [ 1 ], "scriptSrc": [ "cdnebasnet\\.com/" ], "meta": { "author": [ "^ebasnet web solutions$" ] }, "implies": [ "MySQL", "PHP", "Symfony", "Varnish" ], "description": "Ebasnet is a web project creation and management platform in the cloud. It allows anyone to set up an online store or corporate website without prior IT knowledge.", "website": "https://ebasnet.com" }, "EcForce": { "cats": [ 6 ], "js": [ "ecforce.models", "ecforce.models.shop" ], "implies": [ "Nginx", "Ruby", "Ruby on Rails" ], "description": "EcForce is an all-in-one ecommerce platform with all the functions necessary for ecommerce, from landing-page creation to order and customer data management analysis.", "website": "https://ec-force.com" }, "Ecovium": { "cats": [ 99 ], "description": "Ecovium is an end-to-end logistics company in Germany.", "website": "https://ecovium.com" }, "Ecwid": { "cats": [ 6 ], "js": [ "ecwid", "ecwidcart" ], "scriptSrc": [ "https://app\\.ecwid\\.com/script\\.js", "https://app\\.multiscreenstore\\.com/script\\.js" ], "description": "Ecwid is a shopping cart plugin that turns any existing website into an online store.", "website": "https://www.ecwid.com/" }, "EdgeCast": { "cats": [ 31 ], "headers": { "server": "^ecd\\s\\(\\s+\\)" }, "description": "EdgeCast is a content delivery network (CDN) that accelerated and delivers static content to users around the world.", "website": "https://www.edgecast.com" }, "Edgio": { "cats": [ 31, 62 ], "cookies": { "layer0_bucket": "", "layer0_destination": "", "layer0_eid": "" }, "js": [ "layer0.metrics" ], "headers": { "x-0-status": "", "x-0-t": "", "x-0-version": "^\\d+ ([\\d.]+) \\;version:\\1" }, "scriptSrc": [ "/__layer0__/cache-manifest\\.js" ], "description": "Edgio is an integrated suite of Edge services, from Delivery to Compute.", "website": "https://edg.io" }, "Editor.js": { "cats": [ 24 ], "js": [ "editorjs" ], "description": "Editor.js is a Javascript library which allows developers to implement a block base text editor with plugins on their page.", "website": "https://editorjs.io" }, "Efilli": { "cats": [ 67 ], "js": [ "efilli", "efilli.__cookieblocker", "efilli_global_options" ], "description": "Efilli is a tool used to manage cookies on websites, providing users with data privacy control through GDPR compliance.", "website": "https://efilli.com" }, "Eggplant": { "cats": [ 78 ], "headers": { "content-security-policy": "\\.eggplant\\.cloud" }, "scriptSrc": [ "\\.eggplant\\.cloud/" ], "description": "Eggplant is a software testing and monitoring company.", "website": "https://www.eggplantsoftware.com" }, "Ektron CMS": { "cats": [ 1 ], "js": [ "ektron" ], "scriptSrc": [ "/ektron\\.javascript\\.ashx" ], "implies": [ "Microsoft ASP.NET" ], "description": "Ektron CMS is developed on the Microsoft .NET framework and is 100% ASP.NET. In 2015 Ektron merged with EPiServer.", "website": "https://www.optimizely.com/ektron-cms", "cpe": "cpe:2.3:a:ektron:ektron_content_management_system:*:*:*:*:*:*:*:*" }, "Elastic APM": { "cats": [ 10, 13, 78 ], "js": [ "elasticapm" ], "implies": [ "Elasticsearch" ], "description": "Elastic APM offers free and open application performance monitoring.", "website": "https://www.elastic.co/apm" }, "ElasticPress": { "cats": [ 87 ], "headers": { "x-elasticpress-query": "" }, "implies": [ "Elasticsearch" ], "description": "ElasticPress is a hosting service that connects your WordPress site to search hosting.", "website": "https://www.elasticpress.io/" }, "ElasticSuite": { "cats": [ 29 ], "cookies": { "stuid": "\\;confidence:50", "stvid": "\\;confidence:50" }, "js": [ "smiletracker" ], "scriptSrc": [ "/smile_elasticsuitetracker/" ], "implies": [ "Elasticsearch", "PHP" ], "description": "ElasticSuite is a merchandising suite for Magento and OroCommerce.", "website": "https://elasticsuite.io" }, "Elasticsearch": { "cats": [ 29 ], "description": "Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents.", "website": "https://www.elastic.co", "cpe": "cpe:2.3:a:elastic:elasticsearch:*:*:*:*:*:*:*:*" }, "Elcodi": { "cats": [ 6 ], "headers": { "x-elcodi": "" }, "implies": [ "PHP", "Symfony" ], "website": "https://elcodi.io" }, "Elcom": { "cats": [ 1 ], "meta": { "generator": [ "^elcomcms" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "The Elcom Platform is a web content management and intranet portal software written in Microsoft ASP.NET and SQL Server by Elcom Technology.", "website": "https://www.elcom.com.au/" }, "Eleanor CMS": { "cats": [ 1 ], "meta": { "generator": [ "eleanor" ] }, "implies": [ "PHP" ], "website": "https://eleanor-cms.ru", "cpe": "cpe:2.3:a:eleanor-cms:eleanor_cms:*:*:*:*:*:*:*:*" }, "Element": { "cats": [ 52 ], "meta": { "application-name": [ "^element$" ] }, "description": "Element is a Matrix-based end-to-end encrypted messenger and secure collaboration app.", "website": "https://element.io" }, "Element UI": { "cats": [ 66 ], "description": "Element UI is an open-source component library specifically designed for Vue.js, offering a collection of pre-designed UI components such as buttons, forms, tables, and modals.", "website": "https://element.eleme.io/" }, "Elementor": { "cats": [ 51, 87 ], "js": [ "elementorfrontend.getelements", "elementorfrontendconfig.version" ], "scriptSrc": [ "/wp-content/plugins/elementor(?:-pro)?/.+frontend-modules\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "meta": { "generator": [ "^elementor\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "Elementor is a website builder platform for professionals on WordPress.", "website": "https://elementor.com" }, "Elementor Cloud": { "cats": [ 88 ], "headers": { "x-powered-by": "elementor cloud" }, "implies": [ "Elementor", "WordPress" ], "description": "Elementor Cloud is a platform for creating and hosting WordPress websites with Elementor.", "website": "https://elementor.com" }, "Elementor Header \u0026 Footer Builder": { "cats": [ 87 ], "implies": [ "Elementor" ], "description": "Elementor Header \u0026 Footer Builder is a simple yet powerful WordPress plugin that allows you to create a layout with Elementor and set it as.", "website": "https://github.com/brainstormforce/header-footer-elementor" }, "ElementsKit": { "cats": [ 87 ], "js": [ "elementskit", "elementskit_helper" ], "description": "ElementsKit is an addon for Elementor that adds additional customisation options to the page builder.", "website": "https://wpmet.com/plugin/elementskit" }, "Elevar": { "cats": [ 10 ], "js": [ "elevar_gtm_errors", "elevargtmsuite", "webpackchunkelevar_gtm_suite_scripts" ], "description": "Elevar is an official Shopify Plus Partner data collection and marketing monitoring tool.", "website": "https://www.getelevar.com" }, "Eleventy": { "cats": [ 57 ], "meta": { "generator": [ "^eleventy\\sv([\\d\\.]+)$\\;version:\\1" ] }, "description": "Eleventy (11ty) a simpler static site generator.", "website": "https://www.11ty.dev" }, "Elfsight": { "cats": [ 5 ], "scriptSrc": [ "\\.elfsight\\.com/" ], "description": "Elfsight is an all-in-one platform offering 70+ customisable widgets for websites.", "website": "https://elfsight.com" }, "Elixir": { "cats": [ 27 ], "implies": [ "Erlang" ], "description": "Elixir is a dynamic, functional language designed for building scalable and maintainable applications.", "website": "https://elixir-lang.org" }, "ElkArte": { "cats": [ 2 ], "js": [ "elk_forum_action", "elk_iso_case_folding" ], "implies": [ "MySQL" ], "description": "ElkArte is an open-source PHP-based forum software with MySQL integration, offering features such as user authentication, topic categorisation, post formatting, private messaging, moderation tools, and customisable themes and extensions.", "website": "https://www.elkarte.net" }, "Ellucian CRM Recruit": { "cats": [ 53, 101 ], "js": [ "ellucian.recruit", "ellucianaddresschooselabel" ], "description": "Ellucian CRM Recruit is a comprehensive solution that supports your entire recruiting and admissions lifecycle.", "website": "https://www.ellucian.com/solutions/ellucian-crm-recruit" }, "Elm": { "cats": [ 27, 12 ], "js": [ "elm.main.embed", "elm.main.init" ], "description": "Elm is a statically typed functional programming language created by Evan Czaplicki in 2012 for building web applications.", "website": "https://elm-lang.org/" }, "Elm-ui": { "cats": [ 66 ], "html": [ "\u003cstyle\u003e[\\s\\s]*\\.explain \u003e \\.s[\\s\\s]*\\.explain \u003e \\.ctr \u003e \\.s" ], "implies": [ "Elm" ], "description": "Elm-UI is a library for creating user interfaces in Elm programming language. It provides a set of functions and abstractions for building responsive and reusable UI components, such as buttons, forms, and layouts, in a declarative and type-safe way.", "website": "https://github.com/mdgriffith/elm-ui" }, "Eloomi": { "cats": [ 21 ], "scriptSrc": [ "//cdn\\.eloomi\\.com/" ], "description": "Eloomi is a cloud-based learning management system (LMS) and performance management platform.", "website": "https://eloomi.com" }, "Eloqua": { "cats": [ 32 ], "cookies": { "eloqua": "" }, "js": [ "_elq", "_elqq", "eloqcontactdata", "eloquaactionsettings", "elq_global", "elqcookievalue", "elqcuresite", "elqload", "elqsiteid" ], "scriptSrc": [ "elqcfg\\.js" ], "description": "Eloqua is a Software-as-a-Service (SaaS) platform for marketing automation offered that aims to help B2B marketers and organisations manage marketing campaigns and sales lead generation.", "website": "https://eloqua.com" }, "EmailJS": { "cats": [ 75 ], "js": [ "emailjs.sendform" ], "scriptSrc": [ "([\\d\\.]+)?(?:/dist)?/email\\.min\\.js\\;version:\\1" ], "description": "EmailJS is a cloud-based email delivery service that allows you to send emails directly from your client-side JavaScript code without the need for a server-side implementation.", "website": "https://www.emailjs.com" }, "Emarsys": { "cats": [ 32, 97 ], "js": [ "scarab", "scarabqueue" ], "scriptSrc": [ "(?:static|cdn)\\.scarabresearch\\.com" ], "description": "Emarsys is a cloud-based B2C marketing platform.", "website": "https://emarsys.com/" }, "Ematic Solutions": { "cats": [ 32 ], "js": [ "ematicapikey", "ematics", "ematicsobject", "ematicssubscribe" ], "description": "Ematic Solutions is part of Ematic Group and started to revolve around transforming email marketing into an ROI machine.", "website": "https://www.ematicsolutions.com" }, "EmbedPlus": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/youtube-embed-plus(?:-pro)?/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "EmbedPlus is a WordPress plugin for YouTube allows you to embed gallery, channel, playlist, or even live stream on your webpage.", "website": "https://www.embedplus.com" }, "EmbedSocial": { "cats": [ 5 ], "js": [ "embedsocialhashtag", "embedsocialiframelightbox" ], "scriptSrc": [ "embedsocial\\.com/" ], "description": "EmbedSocial is a social media management platform.", "website": "https://embedsocial.com" }, "EmbedThis Appweb": { "cats": [ 22 ], "headers": { "server": "mbedthis-appweb(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://embedthis.com/appweb", "cpe": "cpe:2.3:a:embedthis:appweb:*:*:*:*:*:*:*:*" }, "Embedly": { "cats": [ 5 ], "js": [ "embedly" ], "scriptSrc": [ "cdn\\.embedly\\.com/" ], "description": "Embedly is a service that allows developers to convert URLs into rich previews and embeddable content.", "website": "https://embed.ly" }, "Ember.js": { "cats": [ 12 ], "js": [ "ember", "ember.version", "emberenv" ], "scripts": [ "@overview\\s+ember -[\\s\\s]+@version\\s+(.+)\\;version:\\1" ], "website": "https://emberjs.com", "cpe": "cpe:2.3:a:emberjs:ember.js:*:*:*:*:*:*:*:*" }, "Emotion": { "cats": [ 12, 47 ], "description": "Emotion is a library designed for writing CSS styles with JavaScript.", "website": "https://emotion.sh" }, "Emotive": { "cats": [ 32 ], "js": [ "emotivepopupinitializing" ], "scriptSrc": [ "emotivecdn\\.io/" ], "description": "Emotive is a computer software company that provides SaaS, Mobile Marketing, NLP, machine learning, and B2B.", "website": "https://emotive.io" }, "Empretienda": { "cats": [ 6 ], "headers": { "set-cookie": "^empretienda_session" }, "description": "Empretienda is a platform that allows you to create and manage your own online store.", "website": "https://www.empretienda.com" }, "Enable": { "cats": [ 68 ], "js": [ "enable_toolbar.is_premium" ], "scriptSrc": [ "cdn\\.enable\\.co\\.il/" ], "description": "Enable is a web accessibility plugin by uPress.", "website": "https://www.enable.co.il" }, "Endurance Page Cache": { "cats": [ 87, 23 ], "headers": { "x-endurance-cache-level": "" }, "description": "Endurance Page Cache adds basic file-based caching to WordPress.", "website": "https://github.com/bluehost/endurance-page-cache" }, "Engagio": { "cats": [ 10 ], "scriptSrc": [ "web-analytics\\.engagio\\.com/api/", "web-analytics\\.engagio\\.com/js/ei\\.js" ], "website": "https://www.engagio.com/" }, "Engintron": { "cats": [ 33 ], "headers": { "x-server-powered-by": "^engintron$" }, "description": "Engintron is a plugin that integrates Nginx to cPanel/WHM server.", "website": "https://github.com/engintron/engintron" }, "Enigma": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/enigma/" ], "description": "Enigma is the popular superfine multipurpose responsive WordPress theme from Infigo Software.", "website": "https://wordpress.org/themes/enigma" }, "Enjin CMS": { "cats": [ 1 ], "js": [ "enjin_core_storage_cache", "enjin_ui" ], "scriptSrc": [ "\\.enjin\\.com/" ], "description": "Enjin CMS is a content management system which focused creation of websites for gaming guilds, clans, Minecraft servers, or fan communities.", "website": "https://www.enjin.com" }, "Enlistly": { "cats": [ 100 ], "scriptSrc": [ "cdn\\.enlistly\\.com/" ], "implies": [ "Shopify" ], "description": "Enlistly tracks referral orders in realtime. Orders that are partially refunded, refunded, or cancelled update on the fly.", "website": "https://enlistly.com" }, "Ensi": { "cats": [ 6 ], "headers": { "x-ensi-platform": "" }, "meta": { "generator": [ "ensi platform" ] }, "description": "Ensi is an open source ecommerce platform based on service oriented architecture.", "website": "https://ensi.tech" }, "Ensighten": { "cats": [ 42 ], "scriptSrc": [ "//nexus\\.ensighten\\.com/" ], "description": "Ensighten is a solution that enables secure management, implementation and control of website technologies.", "website": "https://success.ensighten.com/hc/en-us" }, "Envialia": { "cats": [ 99 ], "website": "https://www.envialia.com" }, "Envo Shop": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/envo-shop/.+customscript\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Envo Shop is a fast, clean and modern-looking responsive free WooCommerce WordPress theme by Envo Themes.", "website": "https://envothemes.com/free-envo-shop" }, "Envo Storefront": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/envo-storefront/.+customscript\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Envo Storefront is a fast, clean and modern-looking responsive WooCommerce theme for WordPress.", "website": "https://envothemes.com/free-envo-storefront" }, "Envo eCommerce": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/envo-ecommerce/.+customscript\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Envo eCommerce is a fast, clean and modern-looking responsive free WooCommerce theme for WordPress.", "website": "https://envothemes.com/free-envo-ecommerce/" }, "Envoy": { "cats": [ 64 ], "headers": { "server": "^envoy$", "x-envoy-upstream-service-time": "" }, "description": "Envoy is an open-source edge and service proxy, designed for cloud-native applications.", "website": "https://www.envoyproxy.io/", "cpe": "cpe:2.3:a:envoyproxy:envoy:*:*:*:*:*:*:*:*" }, "Envybox": { "cats": [ 5, 52 ], "js": [ "envywidget" ], "scriptSrc": [ "static\\.saas-support\\.com/" ], "description": "Envybox is a multiservice for increasing sales.", "website": "https://envybox.io" }, "Enyo": { "cats": [ 12, 26 ], "js": [ "enyo" ], "scriptSrc": [ "enyo\\.js" ], "description": "Enyo is an open-source JavaScript framework for cross-platform for mobile, desktop, TV and web applications.", "website": "https://enyojs.com" }, "Epoch": { "cats": [ 25 ], "html": [ "\u003clink[^\u003e]+?href=\"[^\"]+epoch(?:\\.min)?\\.css" ], "scriptSrc": [ "epoch(?:\\.min)?\\.js" ], "implies": [ "D3" ], "website": "https://fastly.github.io/epoch" }, "Epom": { "cats": [ 36 ], "js": [ "epomcustomparams" ], "website": "https://epom.com" }, "EqualWeb": { "cats": [ 68 ], "scriptSrc": [ "cdn\\.equalweb\\.com.*\\.js" ], "description": "EqualWeb provides a web accessibility overlay, and helps some people with disabilities access digital information.", "website": "https://www.equalweb.com/" }, "EraofEcom Cartroids": { "cats": [ 100 ], "js": [ "cartroids.appbase" ], "implies": [ "Shopify" ], "description": "EraofEcom Cartroids makes it easy for you to create highly targeted upsells, cross-sells and bundle offers.", "website": "https://eraofecom.org/collections/tech/products/cartroids" }, "EraofEcom MTL": { "cats": [ 100 ], "scriptSrc": [ "mtl\\.eraofecom\\.org" ], "implies": [ "Shopify" ], "description": "EraofEcom MTL is a Shopify pop up app that enables you to catch your website visitors.", "website": "https://eraofecom.org/collections/tech/products/milk-the-leads" }, "EraofEcom WinAds": { "cats": [ 100 ], "js": [ "win_ads.baseurl" ], "implies": [ "Shopify" ], "description": "EraofEcom WinAds is an all-in-one Facebook pixel app for Shopify.", "website": "https://eraofecom.org/collections/tech/products/win-ads-manager" }, "Erlang": { "cats": [ 27 ], "headers": { "server": "erlang( otp/(?:[\\d.abr-]+))?\\;version:\\1" }, "description": "Erlang is a general-purpose, concurrent, functional programming language, and a garbage-collected runtime system.", "website": "https://www.erlang.org", "cpe": "cpe:2.3:a:erlang:erlang%2fotp:*:*:*:*:*:*:*:*" }, "Errorception": { "cats": [ 10 ], "js": [ "_errs" ], "description": "Errorception is a error reporting service for client-side in-browser JavaScript errors.", "website": "https://errorception.com" }, "Essent SiteBuilder Pro": { "cats": [ 1, 6 ], "meta": { "generator": [ "^essent® sitebuilder pro$" ] }, "description": "Essent SiteBuilder Pro is a fully-integrated web-based website design system, content management and ecommerce system.", "website": "https://www.essent.com/SiteBuilderPro.html" }, "Essential Addons for Elementor": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/uploads/essential-addons-elementor/" ], "description": "Essential Addons for Elementor gives you 70+ creative elements and extensions to help you extend the stock features of Elementor page builder.", "website": "https://essential-addons.com/elementor/" }, "Essential JS 2": { "cats": [ 12, 59 ], "html": [ "\u003c[^\u003e]+ class ?= ?\"(?:e-control|[^\"]+ e-control)(?: )[^\"]* e-lib\\b" ], "website": "https://www.syncfusion.com/javascript-ui-controls" }, "Estore Compare": { "cats": [ 74 ], "scriptSrc": [ "cdn\\d+\\.estore\\.jp/" ], "description": "Estore Compare is a website optimisation software that offers A/B testing, CVR and LTV measuring tools.", "website": "https://estore.co.jp/estorecompare/" }, "Estore Shopserve": { "cats": [ 6 ], "scriptSrc": [ "cart\\d+\\.shopserve\\.jp/" ], "description": "Estore Shopserve is an all-in-one payment processing and ecommerce solution.", "website": "https://estore.co.jp/shopserve" }, "Etherpad": { "cats": [ 24 ], "js": [ "padeditbar", "padimpexp" ], "headers": { "server": "^etherpad" }, "scriptSrc": [ "/ep_etherpad-lite/" ], "implies": [ "Node.js" ], "description": "Etherpad is an open-source, web-based collaborative real-time editor, allowing authors to simultaneously edit a text document, and see all of the participants' edits in real-time, with the ability to display each author's text in their own colour.", "website": "https://etherpad.org", "cpe": "cpe:2.3:a:etherpad:etherpad:*:*:*:*:*:*:*:*" }, "Ethers": { "cats": [ 59 ], "js": [ "_ethers" ], "description": "Ethers is a complete, tiny and simple Ethereum library.", "website": "https://ethers.org/" }, "EthicalAds": { "cats": [ 36 ], "scriptSrc": [ "media\\.ethicalads\\.io" ], "description": "EthicalAds is a privacy-preserving ad network targeting developers.", "website": "https://www.ethicalads.io/" }, "Eticex": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.eticex\\.com/" ], "implies": [ "MySQL", "PHP", "React" ], "description": "Eticex is as an ecommerce infrastructure provider that offers ecommerce packages and customisable high-performance ecommerce solutions.", "website": "https://www.eticex.com" }, "Etix": { "cats": [ 104 ], "js": [ "etix.javacontext" ], "description": "Etix is an international web-based ticketing service provider for the entertainment, travel, and sports industries.", "website": "https://hello.etix.com" }, "Etracker": { "cats": [ 10, 74 ], "js": [ "_etracker" ], "scriptSrc": [ "\\.etracker\\.com" ], "description": "Etracker is a web optimisation solution.", "website": "https://www.etracker.com" }, "EventOn": { "cats": [ 72, 87 ], "description": "EventON is event calendar for WordPress.", "website": "https://www.myeventon.com" }, "Everflow": { "cats": [ 10 ], "scriptSrc": [ "everflow\\.js" ], "description": "Everflow is a partner marketing analytics platform.", "website": "https://www.everflow.io" }, "EveryAction": { "cats": [ 111 ], "scriptSrc": [ "\\.everyaction\\.com/" ], "description": "EveryAction provides fundraising software, donor management software, and CRM software to nonprofit organisations.", "website": "https://www.everyaction.com" }, "Eveve": { "cats": [ 5, 72 ], "html": [ "\u003ciframe[^\u003e]*[\\w]+\\.eveve\\.com" ], "implies": [ "PHP" ], "description": "Eveve is a restaurant table booking widget.", "website": "https://www.eveve.com" }, "Evidon": { "cats": [ 67 ], "js": [ "eb.evidonconsent", "evidon" ], "scriptSrc": [ "\\.evidon\\.com/" ], "description": "Evidon is a transparency company that helps organizations educate consumers on how and why data is collected, as well as provide consumers with the ability to give and withdraw consent to their data being used.", "website": "https://www.evidon.com" }, "ExactMetrics": { "cats": [ 87, 10 ], "js": [ "exactmetrics", "exactmetrics_frontend" ], "scriptSrc": [ "/wp-content/plugins/google-analytics-dashboard-for-wp/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "ExactMetrics (formerly Google Analytics Dashboard for WP) plugin helps you properly setup all the powerful Google Analytics tracking features without writing any code or hiring a developer.", "website": "https://www.exactmetrics.com" }, "Exemptify": { "cats": [ 106, 100 ], "js": [ "exemptifytriggerupdate", "m4u_ex_vat_postfix_txt" ], "scriptSrc": [ "\\.modules4u\\.biz/shopify/exemptify" ], "implies": [ "Shopify" ], "description": "Exemptify allows you to conduct proper EU B2B transactions by validating EU VAT IDs.", "website": "https://modules4u.biz/exemptify" }, "Exhibit": { "cats": [ 25 ], "js": [ "exhibit", "exhibit.version" ], "scriptSrc": [ "exhibit.*\\.js" ], "website": "https://simile-widgets.org/exhibit/" }, "ExitIntel": { "cats": [ 32 ], "js": [ "exitintel.version", "exitintelaccount", "exitintelconfig" ], "scriptSrc": [ "(?:get.)?exitintel\\.com" ], "description": "ExitIntel is a full service conversion optimisation agency that focuses on ecommerce companies.", "website": "https://exitintelligence.com" }, "ExoClick": { "cats": [ 36 ], "scriptSrc": [ "\\.exoclick\\.com/" ], "meta": { "exoclick-site-verification": [] }, "description": "ExoClick is a Barcelona-based online advertising company, which provides online advertising services to both advertisers and publishers.", "website": "https://www.exoclick.com" }, "ExpertRec": { "cats": [ 29 ], "js": [ "_er_config" ], "scriptSrc": [ "expertrec\\.com/api/js/ci_common\\.js\\?id=.*" ], "description": "ExpertRec is a collaborative Web search engine, which allows users share search histories through a web browser.", "website": "https://www.expertrec.com/" }, "Expivi": { "cats": [ 105 ], "js": [ "expivi", "expivicomponent" ], "scriptSrc": [ "\\.expivi\\.(?:com|net)/" ], "description": "Expivi specialises in 3D visualisation technology for ecommerce stores.", "website": "https://www.expivi.com" }, "Exponea": { "cats": [ 97 ], "js": [ "exponea.version" ], "scriptSrc": [ "(?:\\.exponea\\.com)?/js/exponea\\.min\\.js" ], "description": "Exponea is a cloud-based marketing analysis platform suitable for large and midsize organisations in a variety of industries.", "website": "https://go.exponea.com" }, "Express": { "cats": [ 18, 22 ], "headers": { "x-powered-by": "^express(?:$|,)" }, "implies": [ "Node.js" ], "description": "Express is a web application framework for Node.js, released as free and open-source software under the MIT License. It is designed for building web applications and APIs.", "website": "https://expressjs.com", "cpe": "cpe:2.3:a:expressjs:express:*:*:*:*:*:*:*:*" }, "ExpressionEngine": { "cats": [ 1 ], "cookies": { "exp_csrf_token": "", "exp_last_activity": "", "exp_tracker": "" }, "implies": [ "PHP" ], "description": "ExpressionEngine is a free and open-source CMS.", "website": "https://expressionengine.com/", "cpe": "cpe:2.3:a:ellislab:expressionengine:*:*:*:*:*:*:*:*" }, "ExtJS": { "cats": [ 12 ], "js": [ "ext", "ext.version", "ext.versions.extjs.version" ], "scriptSrc": [ "ext-base\\.js" ], "website": "https://www.sencha.com", "cpe": "cpe:2.3:a:sencha:ext_js:*:*:*:*:*:*:*:*" }, "ExtendThemes Calliope": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/calliope/" ], "description": "ExtendThemes Calliope is an flexible, multipurpose WordPress child theme of Colibri WP.", "website": "https://wordpress.org/themes/calliope" }, "ExtendThemes EmpowerWP": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/empowerwp(?:-pro)?/" ], "description": "ExtendThemes EmpowerWP is an flexible, multipurpose WordPress theme.", "website": "https://extendthemes.com/empowerwp" }, "ExtendThemes Highlight": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/highlight(?:-pro)?/" ], "description": "ExtendThemes Highlight is an flexible, multipurpose WordPress theme.", "website": "https://extendthemes.com/highlight" }, "ExtendThemes Materialis": { "cats": [ 80 ], "js": [ "materialis_theme_pro_settings", "materialissetheadertopspacing", "materialistheme" ], "scriptSrc": [ "/wp-content/themes/materialis(?:-pro)?/" ], "description": "ExtendThemes Materialis is an flexible, multipurpose WordPress theme.", "website": "https://extendthemes.com/materialis" }, "ExtendThemes Mesmerize": { "cats": [ 80 ], "js": [ "mesmerizedomready", "mesmerizefooterparalax", "mesmerizekube", "mesmerizemenusticky" ], "scriptSrc": [ "/wp-content/themes/mesmerize(?:-pro)?/" ], "description": "ExtendThemes Mesmerize is an flexible, multipurpose WordPress theme.", "website": "https://extendthemes.com/mesmerize" }, "Extole": { "cats": [ 94, 84 ], "js": [ "extole.version" ], "scriptSrc": [ "\\.(?:extole|xtlo)\\.(?:com|net)/" ], "description": "Extole is an online marketing platform that enables brands and businesses to get new customers through loyalty and referral programs.", "website": "https://www.extole.com" }, "Ezoic": { "cats": [ 10, 36 ], "js": [ "ezoica", "ezoicbanger", "ezoictestactive" ], "scriptSrc": [ "\\.ezo(?:js|ic|dn)\\.(?:com|net)" ], "description": "Ezoic is a website optimisation platform for digital publishers and website owners powered by machine learning.", "website": "https://www.ezoic.com" }, "F5 BigIP": { "cats": [ 64 ], "cookies": { "f5_fullwt": "", "f5_ht_shrinked": "", "f5_st": "", "lastmrh_session": "", "mrhsequence": "", "mrhsession": "", "mrhshint": "", "tin": "" }, "headers": { "server": "^big-?ip$" }, "description": "F5's BIG-IP is a family of products covering software and hardware designed around application availability, access control, and security solutions.", "website": "https://www.f5.com/products/big-ip-services", "cpe": "cpe:2.3:a:f5:big-ip:*:*:*:*:*:*:*:*" }, "FARFETCH Black \u0026 White": { "cats": [ 6 ], "scriptSrc": [ "cdn-static\\.farfetch-contents.com\\.js" ], "description": "Farfetch Platform Solutions is a full service platform and agency providing end-to-end, multichannel e-commerce solutions for luxury fashion brands under the name Farfetch Black \u0026 White.", "website": "https://www.farfetchplatformsolutions.com/" }, "FAST ESP": { "cats": [ 29 ], "html": [ "\u003cform[^\u003e]+id=\"fastsearch\"" ], "description": "FAST ESP is a service-oriented architecture development platform which is geared towards production searchable indexes. It provided a flexible framework for creating ETL applications for efficient indexing of searchable content.", "website": "https://microsoft.com/enterprisesearch" }, "FAST Search for SharePoint": { "cats": [ 29 ], "html": [ "\u003cinput[^\u003e]+ name=\"parametricsearch" ], "implies": [ "Microsoft ASP.NET", "Microsoft SharePoint" ], "description": "FAST Search for SharePoint is the search engine for Microsoft's SharePoint collaboration platform. Its purpose is helping SharePoint users locate and retrieve stored enterprise content.", "website": "https://sharepoint.microsoft.com/en-us/product/capabilities/search/Pages/Fast-Search.aspx" }, "FUDforum": { "cats": [ 2 ], "js": [ "fud_msg_focus", "fud_tree_msg_focus" ], "implies": [ "PHP", "Perl" ], "description": "FUDforum is a discussion forum software with support for posts, topics, polls and attachments.", "website": "https://github.com/fudforum/FUDforum", "cpe": "cpe:2.3:a:fudforum:fudforum:*:*:*:*:*:*:*:*" }, "Fabric": { "cats": [ 6 ], "meta": { "powered-by": [ "fabricinc" ] }, "description": "Fabric is a headless commerce platform helping direct-to-consumer and B2B brands utilize an ecommerce platform designed for their needs.", "website": "https://fabric.inc" }, "Facebook Ads": { "cats": [ 36 ], "description": "Facebook Ads is an online advertising platform developed by Facebook.", "website": "https://www.facebook.com/business/ads" }, "Facebook Chat Plugin": { "cats": [ 52 ], "js": [ "facebookchatsettings" ], "scriptSrc": [ "connect\\.facebook\\.net/.+\\.customerchat\\.js" ], "description": "Facebook Chat Plugin is a website plugin that businesses with a Facebook Page can install on their website.", "website": "https://developers.facebook.com/docs/messenger-platform/discovery/facebook-chat-plugin/" }, "Facebook Login": { "cats": [ 69 ], "js": [ "fb.getloginstatus" ], "description": "Facebook Login is a way for people to create accounts and log into your app across multiple platforms.", "website": "https://developers.facebook.com/docs/facebook-login/" }, "Facebook Pay": { "cats": [ 41 ], "description": "Facebook pay is a payment solution which can be used on any site or app outside Facebook ecosystem.", "website": "https://pay.facebook.com/" }, "Facebook Pixel": { "cats": [ 10 ], "js": [ "_fbq" ], "scriptSrc": [ "connect\\.facebook.\\w+/signals/config/\\d+\\?v=([\\d\\.]+)\\;version:\\1", "connect\\.facebook\\.\\w+/.+/fbevents\\.js" ], "description": "Facebook pixel is an analytics tool that allows you to measure the effectiveness of your advertising.", "website": "https://facebook.com" }, "Facil-iti": { "cats": [ 68 ], "scriptSrc": [ "ws\\.facil-iti\\.com/tag/faciliti-tag\\.min\\.js" ], "description": "Facil-iti is a web accessibility overlay which provides support for some people with disabilities and seniors.", "website": "https://www.facil-iti.com/" }, "Fact Finder": { "cats": [ 29 ], "html": [ "\u003c!-- factfinder" ], "scriptSrc": [ "suggest\\.ff" ], "description": "Fact Finder is a platform which, combines search, navigation, and merchandising solutions to streamline online search and power sales.", "website": "https://fact-finder.com" }, "FalguniThemes Nisarg": { "cats": [ 80 ], "js": [ "nisargpro_script_vars" ], "scriptSrc": [ "/wp-content/themes/nisarg(?:pro)?/" ], "description": "FalguniThemes Nisarg is a new fully responsive and translation ready WordPress theme.", "website": "https://www.falgunithemes.com/downloads/nisarg" }, "FameThemes OnePress": { "cats": [ 80 ], "js": [ "onepress_js_settings", "onepress_plus", "onepressismobile" ], "description": "FameThemes OnePress is a free portfolio one page WordPress theme suited for an individual or digital agency.", "website": "https://www.famethemes.com/themes/onepress" }, "FameThemes Screenr": { "cats": [ 80 ], "js": [ "screenr.autoplay", "screenr_plus" ], "description": "FameThemes Screenr is a fullscreen parallax WordPress theme suited for business, portfolio, digital agency, freelancers.", "website": "https://www.famethemes.com/themes/screenr" }, "FancyBox": { "cats": [ 59 ], "js": [ "$.fancybox.version", "fancybox.version", "jquery.fancybox.version" ], "scriptSrc": [ "jquery\\.fancybox(?:\\.pack|\\.min)?\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1" ], "implies": [ "jQuery" ], "description": "FancyBox is a tool for displaying images, html content and multi-media in a Mac-style 'lightbox' that floats overtop of web page.", "website": "https://fancyapps.com/fancybox" }, "Fanplayr": { "cats": [ 76 ], "js": [ "fanplayr.platform.version" ], "scriptSrc": [ "cdn\\.fanplayr\\.com/.+/([\\d\\.]+)\\;version:\\1" ], "description": "Fanplayr is a real-time insights platform that provides website optimisation and personalisation solutions for businesses.", "website": "https://fanplayr.com" }, "FaraPy": { "cats": [ 1 ], "html": [ "\u003c!-- powered by farapy." ], "implies": [ "Python" ], "website": "https://faral.tech" }, "FareHarbor": { "cats": [ 5, 72 ], "html": [ "\u003ciframe[^\u003e]+fareharbor" ], "scriptSrc": [ "fareharbor\\.com/embeds/api/" ], "description": "FareHarbor is an booking and schedule management solution intended for tour and activity companies.", "website": "https://fareharbor.com" }, "Fast Bundle": { "cats": [ 100 ], "js": [ "fastbundleconf.bundlebox", "fastbundleconf.cartinfo.app_version" ], "scriptSrc": [ "api\\.fastbundle\\.co/" ], "implies": [ "Shopify" ], "description": "Fast Bundle gives you the ability to create product bundle offers with discounts.", "website": "https://fastbundle.co" }, "Fast Checkout": { "cats": [ 6 ], "js": [ "fast.events", "fast_version" ], "scriptSrc": [ "js\\.fast\\.co/" ], "description": "Fast Checkout is a one-click purchases for buyers without requiring a password to log in.", "website": "https://www.fast.co" }, "FastComet": { "cats": [ 88 ], "description": "FastComet is a hosting service company from San Francisco, California.", "website": "https://www.fastcomet.com" }, "Fastcommerce": { "cats": [ 6 ], "meta": { "generator": [ "^fastcommerce" ] }, "website": "https://www.fastcommerce.com.br" }, "Fasterize": { "cats": [ 92 ], "js": [ "fstrz" ], "description": "Fasterize is a website accelerator service.", "website": "https://www.fasterize.com/" }, "Fastly": { "cats": [ 31 ], "headers": { "fastly-debug-digest": "", "server": "fastly", "vary": "fastly-ssl", "x-fastly-origin": "", "x-fastly-request-id": "", "x-via-fastly:": "" }, "description": "Fastly is a cloud computing services provider. Fastly's cloud platform provides a content delivery network, Internet security services, load balancing, and video \u0026 streaming services.", "website": "https://www.fastly.com" }, "Fastspring": { "cats": [ 6 ], "html": [ "\u003ca [^\u003e]*href=\"https?://sites\\.fastspring\\.com", "\u003cform [^\u003e]*action=\"https?://sites\\.fastspring\\.com" ], "website": "https://fastspring.com" }, "Fat Zebra": { "cats": [ 41 ], "html": [ "\u003c(?:iframe)[^\u003e]+fatzebraframe", "\u003c(?:iframe|img|form)[^\u003e]+paynow\\.pmnts\\.io" ], "scriptSrc": [ "paynow\\.pmnts\\.io" ], "description": "Fat Zebra provides a process of accepting credit card payments online.", "website": "https://www.fatzebra.com/" }, "Fat-Free Framework": { "cats": [ 18 ], "headers": { "x-powered-by": "^fat-free framework$" }, "implies": [ "PHP" ], "website": "https://fatfreeframework.com" }, "FatherShops": { "cats": [ 6 ], "scriptSrc": [ "fathershop/view/theme/fs/" ], "description": "FatherShops is an ecommerce platform.", "website": "https://fathershops.com" }, "Fathom": { "cats": [ 10 ], "js": [ "fathom.blocktrackingforme" ], "scriptSrc": [ "cdn\\.usefathom\\.com/" ], "description": "Fathom is easy-yet-powerful website analytics that protects digital privacy.", "website": "https://usefathom.com" }, "Fbits": { "cats": [ 6 ], "js": [ "fbits" ], "website": "https://www.traycorp.com.br" }, "FeatherX": { "cats": [ 90 ], "js": [ "featherx.clientid" ], "description": "FeatherX captures content from all major reviews and social media channels.", "website": "https://featherx.ai" }, "FedEx": { "cats": [ 99 ], "description": "FedEx is an American multinational company which focuses on transportation, ecommerce and business services.", "website": "https://www.fedex.com" }, "Fedora": { "cats": [ 28 ], "headers": { "server": "fedora" }, "description": "Fedora is a free open-source Linux-based operating system.", "website": "https://fedoraproject.org", "cpe": "cpe:2.3:o:fedoraproject:fedora:*:*:*:*:*:*:*:*" }, "Feedback Fish": { "cats": [ 13 ], "scriptSrc": [ "^https://feedback\\.fish/ff\\.js" ], "description": "Feedback Fish is a widget for collecting website feedback from users.", "website": "https://feedback.fish" }, "Feefo": { "cats": [ 90 ], "js": [ "feefotracker", "feefowidget" ], "scriptSrc": [ "\\.feefo\\.com/" ], "description": "Feefo is a cloud-based consumer review and rating management software.", "website": "https://www.feefo.com" }, "Fenicio": { "cats": [ 6 ], "js": [ "_fn.validadortelefono", "fnecommerce.micompravisto", "fnwishlist.cargarinfoarticulos" ], "description": "Fenicio is a cloud platform that handles all aspects of ecommerce sales channel operation and management.", "website": "https://fenicio.io" }, "Fera": { "cats": [ 90 ], "js": [ "fera" ], "scriptSrc": [ "cdn\\.fera\\.ai" ], "description": "Fera is a product review and social proof application for ecommerce websites.", "website": "https://fera.ai/" }, "Fera Product Reviews App": { "cats": [ 100 ], "js": [ "ferajsurl" ], "implies": [ "Fera", "Shopify" ], "description": "Fera Product Reviews App is a product review and social proof app for Shopify.", "website": "https://apps.shopify.com/fera" }, "FilePond": { "cats": [ 59 ], "js": [ "filepond", "filepond.create", "filepond.setoptions" ], "scriptSrc": [ "filepond.js" ], "description": "FilePond is a JavaScript library for file uploads.", "website": "https://pqina.nl/filepond/" }, "FinanceAds": { "cats": [ 71 ], "description": "FinanceAds is a performance marketing agency that has grown affiliate network for the financial sector.", "website": "https://www.financeads.com" }, "Findify": { "cats": [ 29, 76 ], "js": [ "findify", "findifyanalytics" ], "scriptSrc": [ "@findify/bundle@([\\d.]+)/dist/.+\\.js\\;version:\\1" ], "description": "Findify is an intelligent ecommerce search, navigation and personalisation solution.", "website": "https://www.findify.io" }, "Findmeashoe": { "cats": [ 76 ], "js": [ "fmasgendersizetextvariantidcollection", "fmasjavascript", "fmasuniversalwidgetjsfilename" ], "description": "Findmeashoe is a footwear recommendation portal that aims to improve shopping efficiency and experience of footwear shoppers.", "website": "https://findmeashoe.com" }, "Fing": { "cats": [ 62 ], "headers": { "server": "^fing" }, "description": "Fing is a cloud service to deploy and manage your applications without being worried about your infrastructure and environment.", "website": "https://fing.ir" }, "FingerprintJS": { "cats": [ 59, 83 ], "js": [ "fingerprint", "fingerprint2", "fingerprint2.version", "fingerprintjs" ], "scriptSrc": [ "fingerprint(?:/fp)?(\\d)?(?:\\.min)?\\.js\\;version:\\1", "fingerprintjs(?:\\-pro|2)?(?:@|/)(\\d.*?)?/\\;version:\\1" ], "description": "FingerprintJS is a browser fingerprinting library that queries browser attributes and computes a hashed visitor identifier from them.", "website": "https://fingerprintjs.com" }, "FintechOS": { "cats": [ 58 ], "js": [ "ftos.core.getb2cculture", "ftoschat" ], "meta": { "ftos-app-version": [ "\\sv([\\d\\.]+)\\s\\;version:\\1" ] }, "description": "FintechOS is a low-code platform for banking and insurance.", "website": "https://fintechos.com" }, "FireApps Ali Reviews": { "cats": [ 100, 90 ], "scriptSrc": [ "//alireviews\\.fireapps\\.io/" ], "description": "FireApps Ali Reviews is an all-in-one solution that helps to collect, showcase, and manage impactful reviews.", "website": "https://apps.shopify.com/ali-reviews" }, "Firebase": { "cats": [ 34, 47 ], "js": [ "firebase.sdk_version" ], "headers": { "vary": "x-fh-requested-host" }, "scripts": [ "\\.gstatic\\.com/firebasejs/([\\d\\.]+)/\\;version:\\1", "firebase(?:config|io\\.com)" ], "scriptSrc": [ "/(?:([\\d.]+)/)?firebase(?:\\.min)?\\.js\\;version:\\1", "/firebasejs/([\\d.]+)/firebase\\;version:\\1" ], "description": "Firebase is a Google-backed application development software that enables developers to develop iOS, Android and Web apps.", "website": "https://firebase.google.com", "cpe": "cpe:2.3:a:google:firebase_cloud_messaging:*:*:*:*:*:*:*:*" }, "Fireblade": { "cats": [ 31 ], "headers": { "server": "fbs" }, "website": "https://fireblade.com" }, "Firepush": { "cats": [ 32, 100 ], "scriptSrc": [ "cdn\\.firepush\\.\\w+", "fpcdn\\.me/.+shopify" ], "implies": [ "Shopify" ], "description": "Firepush is an omnichannel marketing app that helps Shopify stores to drive sales with automated web push, email and SMS campaigns.", "website": "https://getfirepush.com" }, "FirstHive": { "cats": [ 97 ], "scriptSrc": [ "firsthive\\.com/engage/" ], "description": "FirstHive is a full-stack customer data platform that enables consumer marketers and brands to take control of their first-party data from all sources.", "website": "https://firsthive.com" }, "FirstImpression.io": { "cats": [ 36 ], "js": [ "fi.options", "fiprebidanalyticshandler" ], "scriptSrc": [ "\\.firstimpression\\.io" ], "description": "FirstImpression.io is a customized ad placements for publisher websites on their platform, with zero technical work.", "website": "https://www.firstimpression.io" }, "FirstPromoter": { "cats": [ 71 ], "js": [ "firstpromoterapi", "fprom_obj_" ], "scriptSrc": [ "cdn\\.firstpromoter\\.com/" ], "description": "FirstPromoter is a software platform that helps businesses to create, manage and track their affiliate marketing programs.", "website": "https://firstpromoter.com" }, "Fit Analytics": { "cats": [ 76 ], "js": [ "_fitanalytics", "fitanalyticswidget" ], "scriptSrc": [ "\\.fitanalytics\\.com" ], "description": "Fit Analytics is a platform that provides clothing size recommendations for online customers by measuring individual dimensions via webcams.", "website": "https://www.fitanalytics.com" }, "FlagSmith": { "cats": [ 85 ], "js": [ "flagsmith" ], "scriptSrc": [ "cdn\\.flagsmith\\.com/" ], "description": "FlagSmith is an open-source, fully supported feature flag \u0026 remote configuration solution, which provides hosted API to help deployment to a private cloud or on-premises environment.", "website": "https://flagsmith.com" }, "Flarum": { "cats": [ 2 ], "js": [ "app.cache.discussionlist", "app.forum.freshness" ], "html": [ "\u003cdiv id=\"flarum-loading\"" ], "implies": [ "MySQL", "PHP" ], "description": "Flarum is a discussion platform.", "website": "https://flarum.org/", "cpe": "cpe:2.3:a:flarum:flarum:*:*:*:*:*:*:*:*" }, "Flask": { "cats": [ 18, 22 ], "headers": { "server": "werkzeug/?([\\d\\.]+)?\\;version:\\1" }, "implies": [ "Python" ], "description": "Flask is a Python micro web framework ideal for rapidly constructing web applications, offering minimalism, flexibility, and modularity.", "website": "https://github.com/pallets/flask/", "cpe": "cpe:2.3:a:palletsprojects:flask:*:*:*:*:*:*:*:*" }, "Flat UI": { "cats": [ 66 ], "html": [ "\u003clink[^\u003e]* href=[^\u003e]+flat-ui(?:\\.min)?\\.css" ], "implies": [ "Bootstrap" ], "website": "https://designmodo.github.io/Flat-UI/" }, "Flazio": { "cats": [ 1, 51 ], "js": [ "_exaudiflazio", "flazio_global_conversion" ], "scriptSrc": [ "//flazio\\.org/" ], "description": "Flazio is an Italian website builder.", "website": "https://flazio.com" }, "Fleksa": { "cats": [ 93 ], "implies": [ "Next.js", "Node.js" ], "description": "Fleksa is an online ordering system for restaurants and delivery.", "website": "https://fleksa.com" }, "FlexCMP": { "cats": [ 1 ], "headers": { "x-flex-lang": "", "x-powered-by": "flexcmp.+\\[v\\. ([\\d.]+)\\;version:\\1" }, "html": [ "\u003c!--[^\u003e]+flexcmp[^\u003ev]+v\\. ([\\d.]+)\\;version:\\1" ], "meta": { "generator": [ "^flexcmp" ] }, "website": "https://www.flexcmp.com/cms/home" }, "FlexSlider": { "cats": [ 5 ], "scriptSrc": [ "jquery\\.flexslider(?:\\.min)?\\.js$" ], "implies": [ "jQuery" ], "description": "FlexSlider is a free jQuery slider plugin.", "website": "https://woocommerce.com/flexslider/" }, "Flickity": { "cats": [ 59 ], "js": [ "flickity" ], "scriptSrc": [ "flickity(?:/|@)([\\d\\.]+).+flickity(?:\\.pkgd)?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Flickity is a JavaScript slider library, built by David DeSandro of Metafizzy fame.", "website": "https://flickity.metafizzy.co" }, "FlippingBook": { "cats": [ 5 ], "js": [ "__flippingbook_csrf__" ], "scriptSrc": [ "online\\.flippingbook\\.com/" ], "description": "FlippingBook is a web-based software platform that enables users to create, publish, and share digital publications such as magazines, brochures, catalogs, and presentations.", "website": "https://flippingbook.com" }, "Flits": { "cats": [ 100 ], "js": [ "flitsobjects.accountpage" ], "implies": [ "Shopify" ], "description": "Flits is a customer account pages that get all your shopper data in one place.", "website": "https://getflits.com" }, "Flocktory": { "cats": [ 94, 84 ], "js": [ "flocktory", "flocktorypurchase" ], "scriptSrc": [ "\\.flocktory\\.com/" ], "description": "Flocktory is a social referral marketing platform that enables users to share personalised offers via social networks.", "website": "https://www.flocktory.com" }, "Flow": { "cats": [ 106 ], "js": [ "flow.cart", "flow.countrypicker", "flow_cart_localize" ], "scriptSrc": [ "(?:shopify-)?cdn\\.flow\\.io/" ], "description": "Flow is an ecommerce platform that enables brands and retailers to sell their merchandise to customers internationally by creating localized shopping experiences.", "website": "https://www.flow.io/" }, "Flowbite": { "cats": [ 66 ], "scriptSrc": [ "/flowbite(?:@([\\d\\.]+)/|\\.bundle\\.js)\\;version:\\1" ], "implies": [ "Tailwind CSS" ], "description": "Flowbite is an open-source library of UI components based on the utility-first Tailwind CSS framework featuring dark mode support, a Figma design system, and more.", "website": "https://github.com/themesberg/flowbite" }, "Flowplayer": { "cats": [ 14 ], "js": [ "flowplayer", "flowplayer.version" ], "description": "Flowplayer is a scalable, performance-first HTML 5 video player and platform hosting solution for publishers, broadcasters and digital media.", "website": "https://flowplayer.com" }, "Flutter": { "cats": [ 66 ], "js": [ "_flutter.loader", "_flutter_web_set_location_strategy", "fluttercanvaskit" ], "meta": { "id": [ "^flutterweb-theme$" ] }, "implies": [ "Dart" ], "description": "Flutter is an open source framework by Google for building beautiful, natively compiled, multi-platform applications from a single codebase.", "website": "https://flutter.dev" }, "FluxBB": { "cats": [ 2 ], "html": [ "\u003cp id=\"poweredby\"\u003e[^\u003c]+\u003ca href=\"https?://fluxbb\\.org/\"\u003e" ], "implies": [ "PHP" ], "website": "https://fluxbb.org", "cpe": "cpe:2.3:a:fluxbb:fluxbb:*:*:*:*:*:*:*:*" }, "Fly.io": { "cats": [ 62 ], "cookies": { "_fly": "" }, "headers": { "fly-request-id": "", "server": "^fly/[\\w]+\\s\\(.*\\)$", "via": "^.*\\sfly\\.io$" }, "description": "Fly is a platform for running full stack apps and databases.", "website": "https://fly.io" }, "Flying Analytics": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/flying-analytics/" ], "description": "Flying Analytics is a performance optimisation plugin for WordPress websites designed to reduce page load times and improve the user experience.", "website": "https://wordpress.org/plugins/flying-analytics/" }, "Flying Images": { "cats": [ 87 ], "js": [ "flyingimages" ], "description": "Flying Images is a performance optimisation plugin for WordPress websites designed to reduce page load times and improve the user experience.", "website": "https://wordpress.org/plugins/nazy-load/" }, "Flying Pages": { "cats": [ 87, 92 ], "js": [ "flyingpages" ], "scriptSrc": [ "/wp-content/plugins/flying-pages/.+\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Flying Pages is a performance optimisation plugin for WordPress websites designed to reduce page load times and improve the user experience.", "website": "https://wordpress.org/plugins/flying-pages/" }, "FlyingPress": { "cats": [ 87, 92 ], "scriptSrc": [ "/wp-content/plugins/flying-press/" ], "description": "FlyingPress is a WordPress plugin that helps to improve website performance by optimising various aspects of a WordPress site. The plugin offers a range of features, including caching, image optimisation, lazy loading, database optimisation, and more.", "website": "https://flying-press.com" }, "Flyspray": { "cats": [ 13 ], "cookies": { "flyspray_project": "" }, "html": [ "(?:\u003ca[^\u003e]+\u003epowered by flyspray|\u003cmap id=\"projectsearchform)" ], "implies": [ "PHP" ], "website": "https://flyspray.org" }, "Flywheel": { "cats": [ 62, 88 ], "headers": { "x-fw-hash": "", "x-fw-serve": "", "x-fw-server": "^flywheel(?:/([\\d.]+))?\\;version:\\1", "x-fw-static": "", "x-fw-type": "" }, "implies": [ "WordPress" ], "website": "https://getflywheel.com" }, "Fomo": { "cats": [ 32 ], "js": [ "fomo.version" ], "scriptSrc": [ "fomo\\.com/api/v" ], "description": "Fomo is a social proof marketing platform.", "website": "https://fomo.com" }, "Font Awesome": { "cats": [ 17 ], "js": [ "___font_awesome___", "fontawesomecdnconfig" ], "scriptSrc": [ "(?:f|f)o(?:n|r)t-?(?:a|a)wesome(?:.*?([0-9a-fa-f]{7,40}|[\\d]+(?:.[\\d]+(?:.[\\d]+)?)?)|)", "\\.fontawesome\\.com/([0-9a-z]+).js" ], "description": "Font Awesome is a font and icon toolkit based on CSS and Less.", "website": "https://fontawesome.com/" }, "FontServer": { "cats": [ 17 ], "description": "FontServer is a online font delivery network service-provider for websites.", "website": "https://fontserver.ir" }, "Fontify": { "cats": [ 100 ], "scriptSrc": [ "fontify\\.nitroapps\\.co/" ], "description": "Fontify allows you to utilise any font without having to alter code.", "website": "https://apps.shopify.com/fontify-change-customize-font-for-your-store" }, "FooPlugins FooGallery": { "cats": [ 87, 7 ], "js": [ "foogallery" ], "description": "FooPlugins FooGallery is a great image gallery plugin for WordPress.", "website": "https://fooplugins.com/foogallery-wordpress-gallery-plugin" }, "Food-Ordering.co.uk": { "cats": [ 6, 93 ], "js": [ "disablecollection", "disabledelivery", "getorderacceptfor", "storetoc" ], "description": "Food-Ordering.co.uk is a multi-lingual food ordering system for several hospitality scenarios including online ordering for delivery/takeout, in-store ordering (order at table, room service, self ordering kiosk), telephone ordering with callerID, and table booking.", "website": "https://www.food-ordering.co.uk" }, "FoodBooking": { "cats": [ 93 ], "scriptSrc": [ "\\.(?:fbgcdn|foodbooking)\\.com/" ], "implies": [ "GloriaFood" ], "description": "FoodBooking is a virtual food court based on a curated list of restaurants that use the GloriaFood ordering system.", "website": "https://www.foodbooking.com" }, "Foodomaa": { "cats": [ 93 ], "cookies": { "foodomaa_session": "" }, "description": "Foodomaa is a multi-restaurant food ordering and restaurant membership system.", "website": "https://foodomaa.com" }, "Forethought Solve": { "cats": [ 5 ], "scriptSrc": [ "solve-widget\\.forethought\\.ai/" ], "description": "Forethought Solve is a live-chat widget that uses generative AI to automate responses for common questions across all channels.", "website": "https://forethought.ai/platform/solve/" }, "Fork Awesome": { "cats": [ 17 ], "description": "Fork Awesome is now a community effort based on Font Awesome by Dave Gandy.", "website": "https://forkaweso.me" }, "Fork CMS": { "cats": [ 1 ], "meta": { "generator": [ "^fork cms$" ] }, "implies": [ "Symfony" ], "description": "Fork CMS is an open-source content management system.", "website": "https://www.fork-cms.com", "cpe": "cpe:2.3:a:fork-cms:fork_cms:*:*:*:*:*:*:*:*" }, "FormAssembly": { "cats": [ 110 ], "js": [ "wforms.version" ], "description": "FormAssembly is a platform that enables to collection of data and processing via workflow.", "website": "https://www.formassembly.com" }, "FormBold": { "cats": [ 110 ], "description": "FormBold is a complete web forms solution for static websites that allows you to create forms, collect data, and send notifications.", "website": "https://formbold.com" }, "Formaloo": { "cats": [ 110 ], "scriptSrc": [ "//formaloo\\.net/" ], "description": "Formaloo is a no-code collaboration platform that helps businesses create custom data-driven business applications and internal tools, automate their processes and engage their audience.", "website": "https://www.formaloo.com" }, "Formidable Form": { "cats": [ 87, 73, 110 ], "description": "Formidable Forms is a WordPress plugin that enables you to create quizzes, surveys, calculators, timesheets, multi-page application forms.", "website": "https://formidableforms.com" }, "Formitable": { "cats": [ 93 ], "scriptSrc": [ "cdn\\.formitable\\.com", "formitable\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1" ], "description": "Formitable is an reservation management system for restaurants.", "website": "https://formitable.com" }, "Formli": { "cats": [ 110 ], "scriptSrc": [ "(?:app|cdn)\\.(?:formli|humanagency)\\.(?:com|org)/" ], "description": "Formli is a web-based form builder service that permits users to produce and personalise online forms for different purposes, including surveys, feedback forms, event registrations, and others.", "website": "https://formli.com" }, "ForoshGostar": { "cats": [ 6 ], "cookies": { "aws.customer": "" }, "meta": { "generator": [ "^forosh\\s?gostar.*|arsina webshop.*$" ] }, "implies": [ "Microsoft ASP.NET" ], "website": "https://www.foroshgostar.com" }, "Forte": { "cats": [ 41 ], "scriptSrc": [ "checkout\\.forte\\.net" ], "description": "Forte, a CSG Company offers merchants and partners a broad range of payment solutions.", "website": "https://www.forte.net" }, "Forter": { "cats": [ 16 ], "cookies": { "fortertoken": "" }, "js": [ "ftr__startscriptload" ], "scriptSrc": [ "forter\\.com" ], "description": "Forter is a SaaS company that provides fraud prevention technology for online retailers and marketplaces.", "website": "https://www.forter.com" }, "Fortinet FortiGate": { "cats": [ 16 ], "cookies": { "fgtserver": "" }, "description": "Fortinet FortiGate is a family of network security appliances that provide firewall, VPN, intrusion prevention, antivirus, web filtering, and other security features to protect and secure networks and data.", "website": "https://www.fortinet.com/products/next-generation-firewall" }, "Fortune3": { "cats": [ 6 ], "html": [ "(?:\u003clink [^\u003e]*href=\"[^\\/]*\\/\\/www\\.fortune3\\.com\\/[^\"]*siterate\\/rate\\.css|powered by \u003ca [^\u003e]*href=\"[^\"]+fortune3\\.com)" ], "scriptSrc": [ "cartjs\\.php\\?(?:.*\u0026)?s=[^\u0026]*myfortune3cart\\.com" ], "website": "https://fortune3.com" }, "Foswiki": { "cats": [ 8 ], "cookies": { "foswikistrikeone": "", "sfoswikisid": "" }, "js": [ "foswiki" ], "headers": { "x-foswikiaction": "", "x-foswikiuri": "" }, "html": [ "\u003cdiv class=\"foswiki(?:copyright|page|main)\"\u003e" ], "meta": { "foswiki.servertime": [], "foswiki.wikiname": [] }, "implies": [ "Perl" ], "description": "Foswiki is a free open-source collaboration platform.", "website": "https://foswiki.org", "cpe": "cpe:2.3:a:foswiki:foswiki:*:*:*:*:*:*:*:*" }, "Four": { "cats": [ 41, 91 ], "js": [ "four" ], "scriptSrc": [ "scripts\\.paywithfour\\.com" ], "description": "Pay with four is a Buy now pay later solution.", "website": "https://paywithfour.com/" }, "Foursixty": { "cats": [ 96 ], "js": [ "foursixtyembed" ], "scriptSrc": [ "foursixty\\.com" ], "description": "Foursixty is a widget which turns Instagram content and user-generated content into shoppable galleries.", "website": "https://foursixty.com/" }, "Fourthwall": { "cats": [ 6 ], "js": [ "fourthwallanalytics", "fourthwalltheme" ], "scriptSrc": [ "\\.fourthwall\\.com" ], "meta": { "version": [ "^(.+)$\\;version:\\1\\;confidence:0" ] }, "description": "Fourthwall helps to create and launch a branded website.", "website": "https://fourthwall.com/" }, "Foxy.io": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.foxycart\\.com" ], "description": "Foxy’s hosted cart \u0026 payment page allow you to sell anything, using your existing website or platform.", "website": "https://www.foxy.io" }, "Framer Sites": { "cats": [ 51 ], "js": [ "__framer_importfrompackage", "framer", "framer.animatable", "framer.version" ], "scriptSrc": [ "framerusercontent\\.com" ], "implies": [ "React" ], "description": "Framer is primarily a design and prototyping tool. It allows you to design interactive prototypes of websites and applications using production components and real data.", "website": "https://framer.com/sites" }, "Frames": { "cats": [ 87 ], "description": "Frames is a tool that allows you to create wireframes in real time, design and develop systems, and access a library of components to help you build custom websites quickly and easily, without any restrictions on your creative input.", "website": "https://getframes.io" }, "France Express": { "cats": [ 99 ], "description": "France Express is a delivery service based in France.", "website": "https://www.france-express.com" }, "Frappe": { "cats": [ 18 ], "js": [ "frappe.avatar" ], "meta": { "generator": [ "^frappe$" ] }, "implies": [ "MariaDB", "Python" ], "description": "Frappe is a full stack, batteries-included, web framework written in Python and Javascript.", "website": "https://frappeframework.com" }, "FraudLabs Pro": { "cats": [ 16 ], "js": [ "fraudlabsproagent" ], "scriptSrc": [ "\\.fraudlabspro\\.com/" ], "description": "FraudLabs Pro is a fraud prevention service offered by the company FraudLabs Pro, which specialises in online fraud detection and risk management for businesses.", "website": "https://www.fraudlabspro.com" }, "FreakOut": { "cats": [ 36 ], "js": [ "_fout_jsurl", "_fout_queue", "fout" ], "scriptSrc": [ "\\.fout\\.jp/" ], "description": "FreakOut is a marketing technology company with programmatic solutions (DSP,SSP) that delivers in-feed display and video formats across global publishers.", "website": "https://www.fout.co.jp" }, "FreeBSD": { "cats": [ 28 ], "headers": { "server": "freebsd(?: ([\\d.]+))?\\;version:\\1" }, "description": "FreeBSD is a free and open-source Unix-like operating system.", "website": "https://freebsd.org", "cpe": "cpe:2.3:o:freebsd:freebsd:*:*:*:*:*:*:*:*" }, "FreeTextBox": { "cats": [ 24 ], "js": [ "ftb_addevent", "ftb_api" ], "html": [ "\u003c!-- \\* freetextbox v\\d \\((\\d+\\.\\d+\\.\\d+)\\;version:\\1" ], "implies": [ "Microsoft ASP.NET" ], "description": "FreeTextBox is a free open-source HTML Editor.", "website": "https://freetextbox.com" }, "Freespee": { "cats": [ 10 ], "scriptSrc": [ "analytics\\.freespee\\.com/js/external/fs\\.(?:min\\.)?js" ], "website": "https://www.freespee.com" }, "Frequenceo": { "cats": [ 99 ], "description": "Frequenceo is a fixed-rate postage service in France.", "website": "https://www.laposte.fr/entreprise/produit-entreprise/frequenceo" }, "Frequently Bought Together": { "cats": [ 100 ], "scriptSrc": [ "\\.codeblackbelt\\.com/js/modules/frequently-bought-together/" ], "description": "Frequently Bought Together is a Shopify app which add Amazon-like 'Customers Who Bought This Item Also Bought' product recommendations to your store.", "website": "https://www.codeblackbelt.com" }, "Fresco": { "cats": [ 59 ], "js": [ "fresco.version" ], "description": "Fresco is a responsive lightbox. Fresco comes with thumbnail support, fullscreen zoom, Youtube and Vimeo integration for HTML5 video and a powerful Javascript API.", "website": "https://github.com/staaky/fresco" }, "Fresh": { "cats": [ 18, 22 ], "implies": [ "Deno", "Preact" ], "description": "Fresh is a full stack modern web framework for JavaScript and TypeScript developers, designed to make it trivial to create high-quality, performant, and personalized web applications.", "website": "https://fresh.deno.dev" }, "Freshchat": { "cats": [ 52 ], "js": [ "freshbots" ], "scriptSrc": [ "wchat\\.freshchat\\.com/js/widget\\.js" ], "description": "Freshchat is a cloud-hosted live messaging and engagement application.", "website": "https://www.freshworks.com/live-chat-software/" }, "Freshop": { "cats": [ 6 ], "js": [ "freshop", "freshopinitialized" ], "scriptSrc": [ "asset(?:cdn)?\\.freshop\\.com/" ], "meta": { "author": [ "^freshop, inc\\.$" ] }, "description": "Freshop is an online platform for grocers.", "website": "https://www.freshop.com" }, "Freshteam": { "cats": [ 101 ], "scriptSrc": [ "assets\\.freshteam\\.com/" ], "description": "Freshteam is a cloud-based HR and applicant tracking solution offered by Freshworks.", "website": "https://www.freshworks.com/hrms/" }, "Freshworks CRM": { "cats": [ 53, 32, 74 ], "js": [ "zarget", "zargetapi", "zargetform" ], "scriptSrc": [ "cdn\\.freshmarketer\\.com", "cdn\\.zarget\\.com" ], "description": "Freshworks CRM is a cloud-based customer relationship management (CRM) solution. Key features include one-click phone, sales lead tracking, sales management, event tracking and more.", "website": "https://www.freshworks.com/crm" }, "Friendbuy": { "cats": [ 94 ], "js": [ "friendbuy", "friendbuyapi.merchantid" ], "scriptSrc": [ "\\.cloudfront\\.net/js/friendbuy\\.min\\.js", "static\\.fbot\\.me/friendbuy\\.js" ], "description": "Friendbuy is a cloud-based referral marketing solution designed to help ecommerce businesses of all sizes.", "website": "https://www.friendbuy.com" }, "Friendly Captcha": { "cats": [ 16 ], "scripts": [ "x-frc-client\",\"js-(\\d+(\\.\\d+)+)\\;version:\\1" ], "description": "Friendly Captcha is a proof-of-work based solution in which the user’s device does all the work.", "website": "https://friendlycaptcha.com" }, "Frizbit": { "cats": [ 32 ], "js": [ "frizbit.configurationmanager", "frizbit.remoteconfigs" ], "scriptSrc": [ "cdn\\.frizbit\\.com/" ], "description": "Frizbit is a marketing tool that helps digital marketeers increase web traffic and revenue by combining web push notification.", "website": "https://frizbit.com" }, "Froala Editor": { "cats": [ 24 ], "js": [ "froalaeditor.version" ], "implies": [ "Font Awesome", "jQuery" ], "description": "Froala Editor is a WYSIWYG HTML Editor written in Javascript that enables rich text editing capabilities for applications.", "website": "https://froala.com/wysiwyg-editor" }, "Front Chat": { "cats": [ 52 ], "js": [ "frontchat" ], "scriptSrc": [ "//chat-assets\\.frontapp\\.com/" ], "description": "Front Chat is the live website chat solution that you can manage straight from your inbox.", "website": "https://front.com" }, "Front-Commerce": { "cats": [ 108 ], "implies": [ "GraphQL", "Node.js", "PWA", "React", "Webpack" ], "description": "Front-Commerce is a React-based ecommerce framework that provides a development environment and tools for building online stores, offering seamless integration with backend systems through GraphQL and supporting popular platforms like Adobe Commerce, BigCommerce, OpenMage, Contentful or Prismic.", "website": "https://front-commerce.com" }, "FrontPage": { "cats": [ 20 ], "meta": { "generator": [ "microsoft frontpage(?:\\s((?:express )?[\\d.]+))?\\;version:\\1" ], "progid": [ "^frontpage\\." ] }, "description": "FrontPage is a program for developing and maintaining websites.", "website": "https://office.microsoft.com/frontpage", "cpe": "cpe:2.3:a:microsoft:frontpage:*:*:*:*:*:*:*:*" }, "Frontastic": { "cats": [ 51 ], "headers": { "frontastic-request-id": "" }, "description": "Frontastic is a Commerce Frontend Platform that unites business and development teams to build commerce sites on headless.", "website": "https://www.frontastic.cloud/" }, "Frontify": { "cats": [ 95 ], "description": "Frontify is a cloud-based brand management platform for creators and collaborators of brands.", "website": "https://www.frontify.com" }, "Frontity": { "cats": [ 12, 18 ], "meta": { "generator": [ "^frontity" ] }, "implies": [ "React", "Webpack", "WordPress" ], "description": "Frontity is a React open-source framework focused on WordPress.", "website": "https://frontity.org" }, "Frosmo": { "cats": [ 32, 74 ], "js": [ "_frosmo", "frosmo" ], "scriptSrc": [ "frosmo\\.easy\\.js" ], "description": "Frosmo is a SaaS company which provides AI-driven personalisation products.", "website": "https://frosmo.com" }, "FullCalendar": { "cats": [ 5 ], "js": [ "fullcalendar.version" ], "scriptSrc": [ "/fullcalendar\\.min\\.js" ], "implies": [ "TypeScript" ], "description": "FullCalendar is a full-sized drag and drop JavaScript event calendar.", "website": "https://fullcalendar.io" }, "FullContact": { "cats": [ 10 ], "js": [ "fullcontact" ], "scriptSrc": [ "tags\\.fullcontact\\.com/" ], "description": "FullContact is a privacy-safe Identity Resolution company building trust between people and brands.", "website": "https://www.fullcontact.com" }, "FullStory": { "cats": [ 10 ], "js": [ "fs.clearusercookie" ], "scriptSrc": [ "\\.fullstory\\.com/" ], "description": "FullStory is a web-based digital intelligence system that helps optimize the client experience.", "website": "https://www.fullstory.com" }, "FunCaptcha": { "cats": [ 16 ], "description": "FunCaptcha is a type of CAPTCHA, which is a security measure used to protect websites and online services from spam, bots, and other forms of automated abuse.", "website": "https://www.arkoselabs.com/arkose-matchkey/" }, "Fundiin": { "cats": [ 91 ], "js": [ "websiteenablesuggestfundiin", "websitemaximumsuggestfundiinwithprediction" ], "description": "Fundiin is the BNPL leader in Vietnam in providing zero-cost buy-now-pay-later facilities.", "website": "https://fundiin.vn" }, "Funding Choices": { "cats": [ 67 ], "js": [ "__googlefc" ], "scriptSrc": [ "fundingchoicesmessages\\.google\\.com" ], "description": "Funding Choices is a messaging tool that can help you comply with the EU General Data Protection Regulation (GDPR), and recover lost revenue from ad blocking users.", "website": "https://developers.google.com/funding-choices" }, "Fundraise Up": { "cats": [ 111 ], "js": [ "fundraiseup" ], "scriptSrc": [ "\\.fundraiseup\\.com/" ], "description": "Fundraise Up is a platform for online donations.", "website": "https://fundraiseup.com" }, "FunnelCockpit": { "cats": [ 32 ], "scriptSrc": [ "\\.funnelcockpit\\.com/" ], "description": "FunnelCockpit is an all-in-one funnel builder.", "website": "https://funnelcockpit.com" }, "Funnelish": { "cats": [ 51 ], "js": [ "funnelish" ], "description": "Funnelish is a software tool that helps businesses create and optimise sales funnels for their websites to increase their conversion rates and revenue. Funnelish page builder is a funnel builder focused on building ecommerce funnels.", "website": "https://funnelish.com" }, "Funraise": { "cats": [ 111 ], "js": [ "fr.image_base_url" ], "description": "Funraise is a nonprofit fundraising platform that enables organisations to build fundraising websites as well as manage donations and campaigns.", "website": "https://funraise.org" }, "FurnitureDealer": { "cats": [ 6 ], "scriptSrc": [ "\\.furnituredealer\\.net/" ], "description": "FurnitureDealer is the internet partner of more than 100 leading local full service brick and mortar furniture retailers.", "website": "https://www.furnituredealer.net" }, "Fusion Ads": { "cats": [ 36 ], "js": [ "_fusion" ], "scriptSrc": [ "^[^\\/]*//[ac]dn\\.fusionads\\.net/(?:api/([\\d.]+)/)?\\;version:\\1" ], "website": "https://fusionads.net" }, "FusionCharts": { "cats": [ 25 ], "js": [ "fusioncharts", "fusionchartsdataformats", "fusionmaps" ], "description": "FusionCharts is a comprehensive charting solution for websites.", "website": "https://www.fusioncharts.com/charts" }, "Future Shop": { "cats": [ 6 ], "scriptSrc": [ "future-shop.*\\.js" ], "website": "https://www.future-shop.jp" }, "Futurio": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/futurio/.+customscript\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Futurio is a lightweight and customizable multi-purpose and WooCommerce WordPress theme.", "website": "https://futuriowp.com" }, "Fynd Platform": { "cats": [ 6 ], "js": [ "__fyndaction" ], "implies": [ "Vue.js" ], "description": "Fynd Platform is a subscription based software as a service where brands can mange their catalog, send marketing sms/emailers and sell their products.", "website": "https://platform.fynd.com" }, "GEODIS": { "cats": [ 99 ], "description": "GEODIS is a global transport and logistics company.", "website": "https://geodis.com" }, "GEOvendas": { "cats": [ 6 ], "description": "GEOvendas is an ecommerce platform with analytics, sales force, B2B and B2C products.", "website": "https://www.geovendas.com" }, "GLPI": { "cats": [ 18, 53 ], "js": [ "glpiunsavedformchanges" ], "scriptSrc": [ "//.*glpi.+common\\.min\\.js\\?v=(\\d+\\.\\d+\\.\\d+)\\;version:\\1" ], "meta": { "glpi:csrf_token": [] }, "implies": [ "PHP" ], "description": "GLPI is an open-source IT Asset Management, issue tracking and service desk system.", "website": "https://glpi-project.org", "cpe": "cpe:2.3:a:glpi-project:glpi:*:*:*:*:*:*:*:* " }, "GLS": { "cats": [ 99 ], "description": "GLS offers parcel, logistics and express services, throughout Europe as well as in the US and in Canada.", "website": "https://gls-group.eu" }, "GOV.UK Elements": { "cats": [ 66 ], "html": [ "\u003cdiv[^\u003e]+govuk-box-highlight\\;confidence:25", "\u003cdiv[^\u003e]+phase-banner-alpha\\;confidence:25", "\u003cdiv[^\u003e]+phase-banner-beta\\;confidence:25", "\u003clink[^\u003e]+elements-page[^\u003e\"]+css\\;confidence:25" ], "implies": [ "GOV.UK Toolkit" ], "website": "https://github.com/alphagov/govuk_elements/" }, "GOV.UK Frontend": { "cats": [ 66 ], "js": [ "govukfrontend" ], "html": [ "\u003ca[^\u003e]+govuk-link\\;confidence:10", "\u003cbody[^\u003e]+govuk-template__body\\;confidence:80", "\u003clink[^\u003e]* href=[^\u003e]*?govuk-frontend(?:[^\u003e]*?([0-9a-fa-f]{7,40}|[\\d]+(?:.[\\d]+(?:.[\\d]+)?)?)|)[^\u003e]*?(?:\\.min)?\\.css\\;version:\\1" ], "scriptSrc": [ "govuk-frontend(?:[^\u003e]*?([0-9a-fa-f]{7,40}|[\\d]+(?:.[\\d]+(?:.[\\d]+)?)?)|)[^\u003e]*?(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://design-system.service.gov.uk/" }, "GOV.UK Template": { "cats": [ 66 ], "js": [ "govuk" ], "html": [ "\u003clink[^\u003e]+govuk-template-ie6[^\u003e\"]+css", "\u003clink[^\u003e]+govuk-template-ie7[^\u003e\"]+css", "\u003clink[^\u003e]+govuk-template-ie8[^\u003e\"]+css", "\u003clink[^\u003e]+govuk-template-print[^\u003e\"]+css", "\u003clink[^\u003e]+govuk-template[^\u003e\"]+css" ], "scriptSrc": [ "govuk-template\\.js" ], "website": "https://github.com/alphagov/govuk_template/" }, "GOV.UK Toolkit": { "cats": [ 66 ], "js": [ "govuk.details", "govuk.modules", "govuk.primarylinks" ], "website": "https://github.com/alphagov/govuk_frontend_toolkit" }, "GPT AI Power": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/gpt3-ai-content-generator/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "GPT AI Power is a WordPress plugin that offers a comprehensive AI package.", "website": "https://gptaipower.com" }, "GSAP": { "cats": [ 12 ], "js": [ "gsap.version", "gsapversions", "tweenlite.version", "tweenmax.version" ], "scriptSrc": [ "tweenmax(?:\\.min)?\\.js" ], "description": "GSAP is an animation library that allows you to create animations with JavaScript.", "website": "https://greensock.com/gsap" }, "GTranslate": { "cats": [ 87, 89 ], "description": "GTranslate is a website translator which can translate any website to any language automatically.", "website": "https://gtranslate.io" }, "GTranslate app": { "cats": [ 100, 89 ], "scriptSrc": [ "gtranslate\\.io/shopify/" ], "description": "GTranslate app is a website translator which can translate any website to any language automatically.", "website": "https://apps.shopify.com/multilingual-shop-by-gtranslate" }, "GX WebManager": { "cats": [ 1 ], "html": [ "\u003c!--\\s+powered by gx" ], "meta": { "generator": [ "gx webmanager(?: ([\\d.]+))?\\;version:\\1" ] }, "website": "https://www.gxsoftware.com/en/products/web-content-management.htm" }, "Gallery": { "cats": [ 7 ], "js": [ "$.fn.gallery_valign", "galleryauthtoken" ], "html": [ "\u003ca href=\"http://gallery\\.sourceforge\\.net\"\u003e\u003cimg[^\u003e]+powered by gallery\\s*(?:(?:v|version)\\s*([0-9.]+))?\\;version:\\1", "\u003cdiv id=\"gsnavbar\" class=\"gcborder1\"\u003e" ], "description": "Gallery is an open-source web based photo album organiser.", "website": "https://galleryproject.org/" }, "Gambio": { "cats": [ 6 ], "js": [ "gambio" ], "html": [ "(?:\u003clink[^\u003e]* href=\"templates/gambio/|\u003ca[^\u003e]content\\.php\\?coid=\\d|\u003c!-- gambio eof --\u003e|\u003c!--[\\s=]+shopsoftware by gambio gmbh \\(c\\))" ], "scriptSrc": [ "gm_javascript\\.js\\.php" ], "implies": [ "PHP" ], "description": "Gambio is an all-in-one shopping cart solution for small to medium sized businesses.", "website": "https://gambio.de" }, "Gameball": { "cats": [ 84 ], "js": [ "gbreferralcodeinput", "gbsdk.settings.shop" ], "scriptSrc": [ "assets\\.gameball\\.co/" ], "description": "Gameball is a loyalty \u0026 retention platform that offers gamified customer engagement tools for customers such as rewards, points, and referrals.", "website": "https://www.gameball.co" }, "Gatsby": { "cats": [ 57, 12 ], "meta": { "generator": [ "^gatsby(?: ([0-9.]+))?$\\;version:\\1" ] }, "implies": [ "React", "Webpack" ], "description": "Gatsby is a React-based open-source framework with performance, scalability and security built-in.", "website": "https://www.gatsbyjs.org/" }, "Gatsby Cloud Image CDN": { "cats": [ 31 ], "description": "Image CDN is a new feature of hosting on Gatsby Cloud. Instead of processing images at build time, Image CDN defers and offloads image processing to the edge.", "website": "https://www.gatsbyjs.com/products/cloud/image-cdn" }, "Gauges": { "cats": [ 10 ], "cookies": { "_gauges_": "" }, "js": [ "_gauges" ], "website": "https://get.gaug.es" }, "GeeTest": { "cats": [ 16 ], "headers": { "content-security-policy": "\\.geetest\\.com" }, "scriptSrc": [ "\\.geetest\\.com/" ], "description": "GeeTest is a CAPTCHA and bot management provider, protects websites, mobile apps, and APIs from automated bot-driven attacks, like ATO, credential stuffing, web scalping, etc.", "website": "https://www.geetest.com" }, "GemPages": { "cats": [ 100, 51 ], "js": [ "gemstore", "gemvendor" ], "scriptSrc": [ "/files/gempagev\\d+\\.js" ], "implies": [ "Shopify" ], "description": "GemPages is a powerful Shopify landing page buidler that empowers SMEs, agency, and freelancers to build their brands and sell online.", "website": "https://gempages.net" }, "Gemius": { "cats": [ 10 ], "js": [ "gemius_hit", "gemius_init", "gemius_pending", "pp_gemius_hit" ], "html": [ "\u003ca [^\u003e]*onclick=\"gemius_hit" ], "scriptSrc": [ "hit\\.gemius\\.pl/xgemius\\.js", "hit\\.gemius\\.pl\\;confidence:80", "xgemius\\.js\\;confidence:30" ], "website": "https://www.gemius.com" }, "GeneXus": { "cats": [ 27 ], "js": [ "gx.gxversion" ], "html": [ "\u003clink[^\u003e]+?id=\"gxtheme_css_reference\"" ], "scriptSrc": [ "/static/gxgral\\.js", "/static/gxtimezone\\.js" ], "website": "https://www.genexus.com/" }, "GenerateBlocks": { "cats": [ 87, 51 ], "description": "GenerateBlocks is a WordPress plugin that has the trappings of a page builder.", "website": "https://generateblocks.com" }, "GeneratePress": { "cats": [ 80 ], "js": [ "generatepressmenu", "generatepressnavsearch" ], "scriptSrc": [ "themes/generatepress\\s*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "GeneratePress is a lightweight WordPress theme that focuses on speed, stability, and accessibility", "website": "https://generatepress.com" }, "GeneratePress GP Premium": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/gp-premium/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "GeneratePress" ], "description": "GP Premium is a premium add-on plugin for the GeneratePress WordPress theme.", "website": "https://docs.generatepress.com/article/installing-gp-premium/" }, "Genesis theme": { "cats": [ 80 ], "js": [ "genesis_responsive_menu", "genesisblocksshare" ], "scriptSrc": [ "/wp-content/themes/genesis/lib/js/" ], "description": "Genesis theme is a WordPress theme that has been developed using the Genesis Framework from Studiopress.", "website": "https://www.studiopress.com/themes/genesis" }, "Genesys Cloud": { "cats": [ 32, 5, 75 ], "js": [ "purecloud_webchat_frame_config" ], "scriptSrc": [ "apps\\.mypurecloud\\.\\w+", "apps\\.mypurecloud\\.\\w+/widgets/([\\d.]+)\\;version:\\1" ], "description": "Genesys Cloud is an all-in-one cloud-based contact center software built to improve the customer experience.", "website": "https://www.genesys.com" }, "Geniee": { "cats": [ 36 ], "scriptSrc": [ "\\.gsspcln\\.jp/" ], "description": "Geniee is an ad technology company.", "website": "https://geniee.co.jp" }, "Gentoo": { "cats": [ 28 ], "headers": { "x-powered-by": "gentoo" }, "description": "Gentoo is a free operating system based on Linux.", "website": "https://www.gentoo.org", "cpe": "cpe:2.3:o:gentoo:linux:*:*:*:*:*:*:*:*" }, "Geo Targetly": { "cats": [ 79 ], "scriptSrc": [ "geotargetly\\.co/" ], "description": "Geo Targetly is a website geo personalisation software.", "website": "https://geotargetly.com" }, "Gerrit": { "cats": [ 47 ], "js": [ "gerrit", "gerrit_ui" ], "html": [ "\u003c(?:div|style) id=\"gerrit_", "\u003egerrit code review\u003c/a\u003e\\s*\"\\s*\\(([0-9.]+)\\)\\;version:\\1" ], "scriptSrc": [ "^gerrit_ui/gerrit_ui" ], "meta": { "title": [ "^gerrit code review$" ] }, "implies": [ "Java", "git" ], "website": "https://www.gerritcodereview.com" }, "Get Satisfaction": { "cats": [ 13 ], "js": [ "gsfn" ], "website": "https://getsatisfaction.com/corp/" }, "GetButton": { "cats": [ 5, 52 ], "scriptSrc": [ "\\.getbutton\\.io/" ], "description": "The chat button by GetButton takes website visitor directly to the messaging app such as Facebook Messenger or WhatsApp and allows them to initiate a conversation with you.", "website": "https://getbutton.io" }, "GetFeedback": { "cats": [ 13 ], "js": [ "usabilla_live" ], "description": "GetFeedback (formerly Usabilla) is a user feedback solution for collecting qualitative and quantitative user feedback across digital channels including websites, apps and emails.", "website": "https://www.getfeedback.com" }, "GetMeAShop": { "cats": [ 6 ], "js": [ "gmas_base_url", "search_api_base_uri" ], "description": "GetMeAShop is a cloud-based ecommerce solution for small and midsize businesses across industries such as retail and manufacturing.", "website": "https://www.getmeashop.com" }, "GetResponse": { "cats": [ 32, 75 ], "js": [ "grapp", "grwf2" ], "scriptSrc": [ "\\.getresponse\\.com/" ], "description": "GetResponse is an email marketing app that allows you to create a mailing list and capture data onto it.", "website": "https://www.getresponse.com" }, "GetSimple CMS": { "cats": [ 1 ], "meta": { "generator": [ "getsimple" ] }, "implies": [ "PHP" ], "website": "https://get-simple.info", "cpe": "cpe:2.3:a:get-simple:getsimple_cms:*:*:*:*:*:*:*:*" }, "GetSocial": { "cats": [ 69, 10 ], "js": [ "getsocial_version" ], "scriptSrc": [ "api\\.at\\.getsocial\\.io" ], "description": "GetSocial is a social analytics and publishing platform.", "website": "https://getsocial.io" }, "GetYourGuide": { "cats": [ 72 ], "scriptSrc": [ "\\.getyourguide\\.com/" ], "description": "GetYourGuide is a Berlin-based online travel agency and online marketplace for tour guides and excursions.", "website": "https://partner.getyourguide.com" }, "Getintent": { "cats": [ 36 ], "description": "Getintent is an adtech company that offers AI-powered programmatic suite for agencies, publishers, broadcasters and content owners.", "website": "https://getintent.com" }, "Getsitecontrol": { "cats": [ 5, 73 ], "scriptSrc": [ "\\.getsitecontrol\\.com/" ], "description": "Getsitecontrol is a form and popup builder.", "website": "https://getsitecontrol.com" }, "Ghost": { "cats": [ 1, 11 ], "headers": { "x-ghost-cache-status": "" }, "meta": { "generator": [ "ghost(?:\\s([\\d.]+))?\\;version:\\1" ] }, "implies": [ "Node.js" ], "description": "Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content.", "website": "https://ghost.org" }, "Gigalixir": { "cats": [ 62 ], "description": "Gigalixir is a PaaS focused on deployments of Elixir and Phoenix web apps", "website": "https://gigalixir.com/" }, "Gist": { "cats": [ 52 ], "js": [ "gist.setappid " ], "description": "Gist is email marketing automation, live chat, and helpdesk software.", "website": "https://getgist.com/live-chat" }, "Gist Giftship": { "cats": [ 100 ], "scriptSrc": [ "assets/js/giftship\\.([\\d\\.]+)\\.js\\;version:\\1" ], "description": "Gist Giftship is a gifting app on Shopify that allows your customers to complete all of their gift shopping at once.", "website": "https://gist-apps.com/giftship" }, "GitBook": { "cats": [ 4 ], "js": [ "__gitbook_initial_props__", "__gitbook_initial_state__", "__gitbook_lazy_modules__" ], "meta": { "generator": [ "gitbook ([\\d.]+)?\\;version:\\1" ] }, "description": "GitBook is a command-line tool for creating documentation using Git and Markdown.", "website": "https://www.gitbook.com" }, "GitHub Pages": { "cats": [ 62 ], "headers": { "server": "^github\\.com$", "x-github-request-id": "" }, "description": "GitHub Pages is a static site hosting service.", "website": "https://pages.github.com/" }, "GitLab": { "cats": [ 13, 47 ], "cookies": { "_gitlab_session": "" }, "js": [ "gitlab", "gl.dashboardoptions" ], "html": [ "\u003cheader class=\"navbar navbar-fixed-top navbar-gitlab with-horizontal-nav\"\u003e", "\u003cmeta content=\"https?://[^/]+/assets/gitlab_logo-" ], "meta": { "og:site_name": [ "^gitlab$" ] }, "implies": [ "Ruby on Rails", "Vue.js" ], "description": "GitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and continuous integration and deployment pipeline features, using an open-source license.", "website": "https://about.gitlab.com", "cpe": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:*:*:*:*" }, "GitLab CI/CD": { "cats": [ 44, 47 ], "meta": { "description": [ "gitlab ci/cd is a tool built into gitlab for software development through continuous methodologies." ] }, "implies": [ "Ruby on Rails" ], "website": "https://about.gitlab.com/gitlab-ci" }, "Gitea": { "cats": [ 47 ], "cookies": { "i_like_gitea": "" }, "html": [ "\u003cdiv class=\"ui left\"\u003e\\n\\s+© gitea version: ([\\d.]+)\\;version:\\1" ], "meta": { "keywords": [ "^go,git,self-hosted,gitea$" ] }, "implies": [ "Go" ], "description": "Gitea is an open-source forge software package for hosting software development version control using Git as well as other collaborative features like bug tracking, wikis and code review. It supports self-hosting but also provides a free public first-party instance hosted on DiDi's cloud.", "website": "https://gitea.io", "cpe": "cpe:2.3:a:gitea:gitea:*:*:*:*:*:*:*:*" }, "Gitiles": { "cats": [ 47 ], "html": [ "powered by \u003ca href=\"https://gerrit\\.googlesource\\.com/gitiles/\"\u003egitiles\u003c" ], "implies": [ "Java", "git" ], "website": "https://gerrit.googlesource.com/gitiles/" }, "GiveCampus": { "cats": [ 111 ], "meta": { "author": [ "^givecampus$" ] }, "description": "GiveCampus is a fundraising platform for nonprofit educational institutions.", "website": "https://go.givecampus.com" }, "GiveSmart": { "cats": [ 111 ], "scriptSrc": [ "\\.givesmart\\.com/" ], "description": "GiveSmart is an event fund gathering technology that offers customisable event size, mobile bidding, text-to-donate, enhanced dashboard and reporting, seating arrangement, and more.", "website": "https://www.givesmart.com" }, "GiveWP": { "cats": [ 111, 87 ], "js": [ "give.donor", "giveapisettings" ], "scriptSrc": [ "/wp-content/plugins/give/.+give\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "GiveWP is a donation plugin for WordPress.", "website": "https://givewp.com" }, "GivingFuel": { "cats": [ 111 ], "scriptSrc": [ "\\.givingfuel\\.com/" ], "description": "GivingFuel is a fundraising software solution.", "website": "https://www.givingfuel.com" }, "Gladly": { "cats": [ 52, 53 ], "js": [ "gladly" ], "scriptSrc": [ "cdn\\.gladly\\.com" ], "description": "Gladly is a customer service platform.", "website": "https://www.gladly.com" }, "GlassFish": { "cats": [ 22 ], "headers": { "server": "glassfish(?: server)?(?: open source edition)?(?: ?/?([\\d.]+))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://glassfish.java.net", "cpe": "cpe:2.3:a:oracle:glassfish_server:*:*:*:*:*:*:*:*" }, "Glassbox": { "cats": [ 10 ], "js": [ "sessioncamconfiguration", "sessioncamrecorder" ], "scriptSrc": [ "cdn\\.glassboxcdn\\.com/" ], "description": "Glassbox is an Israeli software company. It sells session-replay analytics software and services.", "website": "https://www.glassbox.com" }, "Glassix": { "cats": [ 52 ], "js": [ "glassixwidgetclient" ], "description": "Glassix is an omnichannel messaging platform for service, sales, and support centers.", "website": "https://glassix.co.il" }, "Glide.js": { "cats": [ 59 ], "js": [ "glide" ], "scriptSrc": [ "/@glidejs/glide(?:@([\\d\\.]+))?\\;version:\\1" ], "description": "Glide.js is a dependency-free JavaScript ES6 slider and carousel.", "website": "https://glidejs.com" }, "Glider.js": { "cats": [ 59 ], "scriptSrc": [ "(?:/|@)?([\\d\\.]{2,})?/glider\\.min\\.js\\;version:\\1" ], "description": "Glider.js is a fast, lightweight, responsive, dependency-free scrollable list with customisable paging controls.", "website": "https://nickpiscitelli.github.io/Glider.js" }, "Glitch": { "cats": [ 62 ], "description": "Glitch is a collaborative programming environment that lives in your browser and deploys code as you type.", "website": "https://glitch.com" }, "Global-e": { "cats": [ 106 ], "cookies": { "globale_ct_data": "", "globale_data": "", "globale_supportthirdpartcookies": "" }, "js": [ "globale", "globale_engine_config" ], "scriptSrc": [ "\\.global-e\\.com" ], "description": "Global-e is a provider of cross-border ecommerce solutions.", "website": "https://www.global-e.com" }, "GlobalShopex": { "cats": [ 106 ], "js": [ "gsxminicheckout", "gsxpreviewcheckout" ], "scriptSrc": [ "//globalshopex\\.com/" ], "description": "GlobalShopex offers a logistics ecommerce solution easy to integrate, which helps online businesses to sell in over 200 countries.", "website": "https://www.globalshopex.com" }, "Globo Also Bought": { "cats": [ 100 ], "scriptSrc": [ "assets/globo\\.alsobought\\.js" ], "implies": [ "Shopify" ], "description": "Also Bought is a conversion Shopify app by Globo.", "website": "https://apps.shopify.com/globo-related-products" }, "Globo Color Swatch": { "cats": [ 100 ], "scriptSrc": [ "assets/globo\\.swatch\\.data\\.js" ], "implies": [ "Shopify" ], "description": "Globo Color Swatch app gives you an easy-to-use tool to display product variants on both collection page, homepage and product page creatively as a means to enhance customers' experience and stimulate them to purchase.", "website": "https://apps.shopify.com/globo-related-products" }, "Globo Form Builder": { "cats": [ 100, 110 ], "scriptSrc": [ "/assets/globo\\.formbuilder\\.init\\.js" ], "implies": [ "Shopify" ], "description": "Form Builder is a Shopify form builder app for contact form built by Globo.", "website": "https://apps.shopify.com/form-builder-contact-form" }, "Globo Pre-Order": { "cats": [ 100 ], "js": [ "globopreorderparams" ], "implies": [ "Shopify" ], "description": "Globo Pre-Order is a Shopify app for building pre-order functionality on Shopify stores.", "website": "https://apps.shopify.com/pre-order-pro" }, "Glopal": { "cats": [ 106 ], "scriptSrc": [ "\\.glopal\\.com/" ], "description": "Glopal provides advanced international marketing solutions for ecommerce retailers and brands seeking to grow their businesses' globally.", "website": "https://www.glopal.com" }, "GloriaFood": { "cats": [ 93 ], "js": [ "glfbindbuttons", "glfwidget" ], "description": "GloriaFood is an online ordering and food delivery platform that helps restaurant owners manage orders and streamline point-of-sale operations.", "website": "https://www.gloriafood.com" }, "Glyphicons": { "cats": [ 17 ], "html": [ "(?:\u003clink[^\u003e]* href=[^\u003e]+glyphicons(?:\\.min)?\\.css|\u003cimg[^\u003e]* src=[^\u003e]+glyphicons)" ], "description": "Glyphicons are icon fonts which you can use in your web projects.", "website": "https://glyphicons.com" }, "Gnuboard": { "cats": [ 1 ], "js": [ "g4_bbs_img", "g4_is_admin", "g5_is_admin", "g5_js_ver" ], "implies": [ "MySQL", "PHP" ], "description": "Gnuboard is an open-source bulletin board system or CMS from South Korea.", "website": "https://github.com/gnuboard" }, "Go": { "cats": [ 27 ], "website": "https://golang.org", "cpe": "cpe:2.3:a:golang:go:*:*:*:*:*:*:*:*" }, "Go Instore": { "cats": [ 103 ], "js": [ "gisapp.videojsctrl", "gisapplib.postrobot" ], "headers": { "content-security-policy": "\\.goinstore\\.com" }, "scriptSrc": [ "//gis\\.goinstore\\.com/" ], "description": "Go Instore uses high-definition live video to connect online customers with in-store product experts.", "website": "https://goinstore.com" }, "GoAffPro": { "cats": [ 71 ], "js": [ "gfp_api_server" ], "scriptSrc": [ "api\\.goaffpro\\.com/loader\\.js" ], "description": "Goaffpro is an affiliate marketing solution for ecommerce stores.", "website": "https://goaffpro.com/" }, "GoAhead": { "cats": [ 22 ], "headers": { "server": "goahead" }, "website": "https://embedthis.com/products/goahead/index.html", "cpe": "cpe:2.3:a:embedthis:goahead:*:*:*:*:*:*:*:*" }, "GoAnywhere": { "cats": [ 19 ], "js": [ "appcontainer" ], "headers": { "server": "goanywhere" }, "description": "GoAnywhere by HelpSystems is a Managed File Transfer (MFT) system with sharing and collaboration features", "website": "https://www.goanywhere.com/" }, "GoCache": { "cats": [ 31 ], "headers": { "server": "^gocache$", "x-gocache-cachestatus": "" }, "description": "GoCache is an in-memory key:value store/cache similar to memcached that is suitable for applications running on a single machine.", "website": "https://www.gocache.com.br/" }, "GoCertify": { "cats": [ 5 ], "cookies": { "_gocertify_session": "" }, "scriptSrc": [ "assets\\.gocertify\\.me/" ], "description": "GoCertify is a conversion-focused and cost-effective way to verify students, key workers, under-26s, over-60s, military and more for exclusive discounts.", "website": "https://www.gocertify.me" }, "GoDaddy": { "cats": [ 88 ], "description": "GoDaddy is used as a web host and domain registrar.", "website": "https://www.godaddy.com" }, "GoDaddy CoBlocks": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/coblocks/" ], "description": "GoDaddy CoBlocks is a suite of professional page building content blocks for the WordPress Gutenberg block editor.", "website": "https://github.com/godaddy-wordpress/coblocks" }, "GoDaddy Domain Parking": { "cats": [ 109 ], "scripts": [ "wsimg\\.com/parking-lander" ], "description": "GoDaddy is used as a web host and domain registrar.", "website": "https://www.godaddy.com" }, "GoDaddy Escapade": { "cats": [ 80 ], "description": "GoDaddy Escapade is a GoDaddy Primer child theme with a unique sidebar navigation.", "website": "https://github.com/godaddy-wordpress/primer-child-escapade" }, "GoDaddy Go": { "cats": [ 80 ], "js": [ "gofrontend.openmenuonhover" ], "scriptSrc": [ "/wp-content/themes/go/.+frontend\\.min\\.js(?:.+ver=([\\d\\.]+))?\\;version:\\1" ], "description": "GoDaddy Go is a flexible Gutenberg-first WordPress theme built for go-getters everywhere.", "website": "https://github.com/godaddy-wordpress/go" }, "GoDaddy Lyrical": { "cats": [ 80 ], "description": "GoDaddy Lyrical is a GoDaddy Primer child theme with a focus on photography and beautiful fonts.", "website": "https://github.com/godaddy-wordpress/primer-child-lyrical" }, "GoDaddy Online Store": { "cats": [ 6 ], "headers": { "via": "^1\\.1 mysimplestore\\.com$" }, "website": "https://www.godaddy.com/en-uk/websites/online-store" }, "GoDaddy Primer": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/primer/.+navigation\\.min\\.js(?:.+ver=([\\d\\.]+))?\\;version:\\1" ], "description": "GoDaddy Primer is a powerful theme that brings clarity to your content in a fresh design. This is the parent for all themes in the GoDaddy Primer theme family.", "website": "https://github.com/godaddy-wordpress/primer" }, "GoDaddy Uptown Style": { "cats": [ 80 ], "description": "GoDaddy Uptown Style is a GoDaddy Primer child theme with elegance and class.", "website": "https://github.com/godaddy-wordpress/primer-child-uptownstyle" }, "GoDaddy Website Builder": { "cats": [ 1 ], "cookies": { "dps_site_id": "" }, "meta": { "generator": [ "go daddy website builder (.+)\\;version:\\1" ] }, "website": "https://www.godaddy.com/websites/website-builder" }, "GoJS": { "cats": [ 25 ], "js": [ "go.graphobject", "go.version" ], "website": "https://gojs.net/" }, "GoKwik": { "cats": [ 19 ], "js": [ "gokwikbuynow", "gokwikcheckoutapp", "gokwiksdk" ], "description": "GoKwik is a platform for solving shopping experience problems on ecommerce websites on the internet.", "website": "https://www.gokwik.co" }, "GoMage": { "cats": [ 108 ], "js": [ "gomage_navigation_loadinfo_text", "gomage_navigation_urlhash", "gomagenavigation", "gomagenavigationclass", "gomagespinnermodal" ], "implies": [ "Magento\\;version:2", "PWA" ], "description": "GoMage is a Magento development company with 10 years of experience.", "website": "https://www.gomage.com/magento-2-pwa" }, "GoStats": { "cats": [ 10 ], "js": [ "_go_track_src", "_gostatsrun", "go_msie" ], "website": "https://gostats.com/" }, "GoatCounter": { "cats": [ 10 ], "scriptSrc": [ "gc\\.zgo\\.at/count\\.js" ], "description": "GoatCounter is an open source web analytics platform available as a hosted service (free for non-commercial use) or self-hosted app. It aims to offer easy to use and meaningful privacy-friendly web analytics as an alternative to Google Analytics or Matomo.", "website": "https://www.goatcounter.com/" }, "Goftino": { "cats": [ 52 ], "js": [ "goftino.setwidget", "goftino_1", "goftino_geturl", "goftinoremoveload" ], "scriptSrc": [ "\\.goftino\\.com/" ], "description": "Goftino is an online chat service for web users.", "website": "https://www.goftino.com" }, "Gogs": { "cats": [ 47 ], "cookies": { "i_like_gogits": "" }, "html": [ "\u003cbutton class=\"ui basic clone button\" id=\"repo-clone-ssh\" data-link=\"gogs@", "\u003cdiv class=\"ui left\"\u003e\\n\\s+© \\d{4} gogs version: ([\\d.]+) page:\\;version:\\1" ], "scriptSrc": [ "js/gogs\\.js" ], "meta": { "keywords": [ "go, git, self-hosted, gogs" ] }, "implies": [ "Go", "Macaron" ], "description": "Gogs is a self-hosted Git service written in Go.", "website": "https://gogs.io", "cpe": "cpe:2.3:a:gogs:gogs:*:*:*:*:*:*:*:*" }, "Gomag": { "cats": [ 6 ], "js": [ "$gomagconfig", "gomagform" ], "headers": { "author": "^gomag$" }, "description": "Gomag is a B2B and B2C ecommerce platform from Romania.", "website": "https://www.gomag.ro" }, "Google AdSense": { "cats": [ 36 ], "js": [ "__google_ad_urls", "adsbygoogle", "goog_adsense_", "goog_adsense_osdadapter", "google_ad_" ], "scriptSrc": [ "2mdn\\.net", "ad\\.ca\\.doubleclick\\.net", "ad\\.ca\\.doubleclick\\.net", "googlesyndication\\.com/" ], "description": "Google AdSense is a program run by Google through which website publishers serve advertisements that are targeted to the site content and audience.", "website": "https://www.google.com/adsense/start/" }, "Google Ads": { "cats": [ 36 ], "description": "Google Ads is an online advertising platform developed by Google.", "website": "https://ads.google.com" }, "Google Ads Conversion Tracking": { "cats": [ 10 ], "js": [ "google_trackconversion" ], "scripts": [ "gtag\\([^)]+'(aw-)" ], "scriptSrc": [ "\\.googleadservices\\.com/pagead/conversion_async\\.js" ], "implies": [ "Google Ads" ], "description": "Google Ads Conversion Tracking is a free tool that shows you what happens after a customer interacts with your ads.", "website": "https://support.google.com/google-ads/answer/1722022" }, "Google Analytics": { "cats": [ 10 ], "cookies": { "__utma": "", "_ga": "", "_ga_*": "\\;version:ga4", "_gat": "\\;version:ua" }, "js": [ "gaglobal", "googleanalyticsobject" ], "scripts": [ "gtag\\([^)]+'(g-)\\;version:\\1?ga4:", "gtag\\([^)]+'(ua-)\\;version:\\1?ua:" ], "scriptSrc": [ "google-analytics\\.com/(?:ga|urchin|analytics)\\.js", "googletagmanager\\.com/gtag/js" ], "description": "Google Analytics is a free web analytics service that tracks and reports website traffic.", "website": "https://google.com/analytics" }, "Google Analytics Enhanced eCommerce": { "cats": [ 10 ], "js": [ "gaplugins.ec" ], "scriptSrc": [ "google-analytics\\.com\\/plugins\\/ua\\/(?:ec|ecommerce)\\.js" ], "implies": [ "Cart Functionality", "Google Analytics" ], "description": "Google analytics enhanced ecommerce is a plug-in which enables the measurement of user interactions with products on ecommerce websites.", "website": "https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce" }, "Google App Engine": { "cats": [ 22 ], "website": "https://cloud.google.com/appengine" }, "Google Call Conversion Tracking": { "cats": [ 10 ], "js": [ "_googcalltrackingimpl", "google_wcc_status" ], "scriptSrc": [ "gstatic\\.com/call-tracking/.+\\.js" ], "description": "Google Call Conversion Tracking is conversion tracking that shows which search keywords are driving the most calls.", "website": "https://support.google.com/google-ads/answer/6100664" }, "Google Charts": { "cats": [ 25 ], "js": [ "__googlevisualizationabstractrendererelementscount__", "__gvizguard__" ], "description": "Google Charts is an interactive web service that creates graphical charts from user-supplied information.", "website": "https://developers.google.com/chart/" }, "Google Cloud": { "cats": [ 63 ], "description": "Google Cloud is a suite of cloud computing services.", "website": "https://cloud.google.com", "cpe": "cpe:2.3:a:google:cloud_platform:*:*:*:*:*:*:*:*" }, "Google Cloud CDN": { "cats": [ 31 ], "headers": { "via": "^1\\.1 google$" }, "implies": [ "Google Cloud" ], "description": "Cloud CDN uses Google's global edge network to serve content closer to users.", "website": "https://cloud.google.com/cdn" }, "Google Cloud Storage": { "cats": [ 19 ], "headers": { "x-goog-storage-class": "^\\w+$" }, "implies": [ "Google Cloud" ], "description": "Google Cloud Storage allows world-wide storage and retrieval of any amount of data at any time.", "website": "https://cloud.google.com/storage" }, "Google Cloud Trace": { "cats": [ 92 ], "headers": { "x-cloud-trace-context": "" }, "implies": [ "Google Cloud" ], "description": "Google Cloud Trace is a distributed tracing system that collects latency data from applications and displays it in the Google Cloud Console.", "website": "https://cloud.google.com/trace" }, "Google Code Prettify": { "cats": [ 19 ], "js": [ "prettyprint" ], "website": "https://code.google.com/p/google-code-prettify" }, "Google Customer Reviews": { "cats": [ 90 ], "description": "Google Customer Reviews is a badge on your site that can help users identify your site with the Google brand and can be placed on any page of your site.", "website": "https://support.google.com/merchants/answer/7105655?hl=en" }, "Google Font API": { "cats": [ 17 ], "js": [ "webfonts" ], "scriptSrc": [ "googleapis\\.com/.+webfont" ], "description": "Google Font API is a web service that supports open-source font files that can be used on your web designs.", "website": "https://google.com/fonts" }, "Google Forms": { "cats": [ 110 ], "description": "Google Forms is a free online form builder that allows you to create and publish online forms, surveys, quizzes, order forms, and more.", "website": "https://www.google.com/forms/about/" }, "Google Hosted Libraries": { "cats": [ 31 ], "scriptSrc": [ "ajax\\.googleapis\\.com/ajax/libs/" ], "description": "Google Hosted Libraries is a stable, reliable, high-speed, globally available content distribution network for the most popular, open-source JavaScript libraries.", "website": "https://developers.google.com/speed/libraries" }, "Google Maps": { "cats": [ 35 ], "js": [ "googlemap", "googlemapsconfig" ], "scriptSrc": [ "(?:maps\\.google\\.com/maps\\?file=api(?:\u0026v=([\\d.]+))?|maps\\.google\\.com/maps/api/staticmap)\\;version:api v\\1", "//maps\\.google(?:apis)?\\.com/maps/api/js" ], "description": "Google Maps is a web mapping service. It offers satellite imagery, aerial photography, street maps, 360° interactive panoramic views of streets, real-time traffic conditions, and route planning for traveling by foot, car, bicycle and air, or public transportation.", "website": "https://maps.google.com" }, "Google My Business": { "cats": [ 1 ], "website": "https://www.google.com/business/website-builder" }, "Google Optimize": { "cats": [ 74 ], "js": [ "google_optimize" ], "scriptSrc": [ "googleoptimize\\.com/optimize\\.js" ], "description": "Google Optimize allows you to test variants of web pages and see how they perform.", "website": "https://optimize.google.com" }, "Google PageSpeed": { "cats": [ 23, 33, 92 ], "headers": { "x-mod-pagespeed": "([\\d.]+)\\;version:\\1", "x-page-speed": "(.+)\\;version:\\1" }, "description": "Google PageSpeed is a family of tools designed to help websites performance optimisations.", "website": "https://developers.google.com/speed/pagespeed/mod" }, "Google Pay": { "cats": [ 41 ], "scriptSrc": [ "pay\\.google\\.com/([a-z/]+)/pay\\.js" ], "description": "Google Pay is a digital wallet platform and online payment system developed by Google to power in-app and tap-to-pay purchases on mobile devices, enabling users to make payments with Android phones, tablets or watches.", "website": "https://pay.google.com" }, "Google Publisher Tag": { "cats": [ 36 ], "scriptSrc": [ "googletagservices\\.com/tag/js/gpt\\.js", "pagead2\\.googlesyndication\\.com/tag/js/gpt\\.js", "securepubads\\.g\\.doubleclick.net/tag/js/gpt\\.js" ], "description": "Google Publisher Tag (GPT) is an ad tagging library for Google Ad Manager which is used to dynamically build ad requests.", "website": "https://developers.google.com/publisher-tag/guides/get-started" }, "Google Sign-in": { "cats": [ 69 ], "scriptSrc": [ "accounts\\.google\\.com/gsi/client" ], "meta": { "google-signin-client_id": [], "google-signin-scope": [] }, "description": "Google Sign-In is a secure authentication system that reduces the burden of login for users, by enabling them to sign in with their Google account.", "website": "https://developers.google.com/identity/sign-in/web" }, "Google Sites": { "cats": [ 1 ], "website": "https://sites.google.com" }, "Google Tag Manager": { "cats": [ 42 ], "js": [ "googletag" ], "html": [ "\u003c!-- (?:end )?google tag manager --\u003e", "googletagmanager\\.com/ns\\.html[^\u003e]+\u003e\u003c/iframe\u003e" ], "scriptSrc": [ "googletagmanager\\.com/gtm\\.js" ], "description": "Google Tag Manager is a tag management system (TMS) that allows you to quickly and easily update measurement codes and related code fragments collectively known as tags on your website or mobile app.", "website": "https://www.google.com/tagmanager" }, "Google Tag Manager for WordPress": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/duracelltomi-google-tag-manager/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Google Tag Manager" ], "description": "Google Tag Manager for WordPress plugin places the GTM container code snippets onto your wordpress website so that you do not need to add this manually.", "website": "https://gtm4wp.com" }, "Google Wallet": { "cats": [ 41 ], "scriptSrc": [ "checkout\\.google\\.com", "wallet\\.google\\.com" ], "website": "https://wallet.google.com" }, "Google Web Server": { "cats": [ 22 ], "headers": { "server": "gws" }, "website": "https://en.wikipedia.org/wiki/Google_Web_Server", "cpe": "cpe:2.3:a:google:web_server:*:*:*:*:*:*:*:*" }, "Google Web Toolkit": { "cats": [ 18 ], "js": [ "__gwt_", "__gwt_activemodules", "__gwt_getmetaproperty", "__gwt_isknownpropertyvalue", "__gwt_stylesloaded", "__gwtlistener" ], "meta": { "gwt:property": [] }, "implies": [ "Java" ], "description": "Google Web Toolkit (GWT) is an open-source Java software development framework that makes writing AJAX applications.", "website": "https://developers.google.com/web-toolkit", "cpe": "cpe:2.3:a:google:web_toolkit:*:*:*:*:*:*:*:*" }, "Google Workspace": { "cats": [ 30, 75 ], "description": "Google Workspace, formerly G Suite, is a collection of cloud computing, productivity and collaboration tools.", "website": "https://workspace.google.com/" }, "Gorgias": { "cats": [ 52 ], "js": [ "gorgiaschat" ], "description": "Gorgias is a helpdesk and chat solution designed for ecommerce stores.", "website": "https://www.gorgias.com/" }, "GotiPath": { "cats": [ 31 ], "headers": { "x-cache": "\\.swiftserve\\.com" }, "description": "GotiPath is a content delivery network (CDN) provider that is associated with telecom giant Telekom Malaysia Berhad.", "website": "https://gotipath.com" }, "Govalo": { "cats": [ 100 ], "js": [ "govalo.meta" ], "scriptSrc": [ "cdn\\.shopify\\.com/extensions/.+/([\\d\\.]+)/assets/govalo\\.min\\.js\\;version:\\1" ], "implies": [ "Shopify" ], "description": "Govalo is a software startup company that builds a Shopify app.", "website": "https://govalo.com" }, "Grab Pay Later": { "cats": [ 41, 91 ], "js": [ "grab_widget_money_format", "grabwidget" ], "scriptSrc": [ "grab-paylater\\.js" ], "description": "Grab Pay Later is a buy now pay later solution offered by Grab.", "website": "https://www.grab.com/sg/finance/pay-later/" }, "Grafana": { "cats": [ 10 ], "js": [ "__grafana_public_path__" ], "scripts": [ ".+latestversion\":\"[\\d\\.\\w\\-]+\"\\,\"version\":\"([\\d\\.]+)\\;version:\\1\\;confidence:75" ], "scriptSrc": [ "grafana\\..+\\.com/public/build/" ], "implies": [ "Go", "Macaron" ], "description": "Grafana is a multi-platform open source analytics and interactive visualisation web application.", "website": "https://grafana.com" }, "Graffiti CMS": { "cats": [ 1 ], "cookies": { "graffitibot": "" }, "scriptSrc": [ "/graffiti\\.js" ], "meta": { "generator": [ "graffiti cms ([^\"]+)\\;version:\\1" ] }, "implies": [ "Microsoft ASP.NET" ], "website": "https://graffiticms.codeplex.com" }, "GrandNode": { "cats": [ 6 ], "cookies": { "grand.customer": "" }, "html": [ "(?:\u003c!--grandnode |\u003ca[^\u003e]+grandnode - powered by |powered by: \u003ca[^\u003e]+nopcommerce)" ], "meta": { "generator": [ "grandnode" ] }, "implies": [ "Microsoft ASP.NET" ], "website": "https://grandnode.com" }, "Granim.js": { "cats": [ 59 ], "js": [ "granim" ], "description": "Granim.js is a lightweight javascript library to create fluid and interactive gradients animations.", "website": "https://sarcadass.github.io/granim.js" }, "GrapesJS": { "cats": [ 51, 18 ], "js": [ "grapesjs.version" ], "description": "GrapesJS is an open-source, multi-purpose page builder which combines different plugins and intuitive drag and drop interface.", "website": "https://grapesjs.com", "cpe": "cpe:2.3:a:grapesjs:grapesjs:*:*:*:*:*:node.js:*:*" }, "GraphCMS": { "cats": [ 1 ], "implies": [ "Go", "GraphQL", "PostgreSQL", "TypeScript" ], "description": "GraphCMS is a GraphQL headless CMS for content federation and omnichannel headless content management.", "website": "https://graphcms.com" }, "GraphQL": { "cats": [ 27 ], "meta": { "store-config": [ "graphqlmethod" ] }, "description": "GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.", "website": "https://graphql.org" }, "Graphene": { "cats": [ 80 ], "js": [ "graphenegetinfscrollbtnlbl", "graphenejs.templateurl" ], "scriptSrc": [ "/wp-content/themes/graphene(?:-plus)?/.+graphene\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Graphene is a WordPress theme created by Graphene Themes.", "website": "https://www.graphene-theme.com/graphene-theme" }, "Grasp": { "cats": [ 52 ], "js": [ "casengo.widget", "casengo_inline_cookie", "casengoupdatewidget" ], "description": "Grasp is a customer support software company that offers a cloud-based helpdesk and live chat solution for businesses of all sizes.", "website": "https://www.getgrasp.com" }, "Grav": { "cats": [ 1 ], "meta": { "generator": [ "gravcms(?:\\s([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://getgrav.org" }, "Gravatar": { "cats": [ 19 ], "js": [ "gravatar" ], "html": [ "\u003c[^\u003e]+gravatar\\.com/avatar/" ], "description": "Gravatar is a service for providing globally unique avatars.", "website": "https://gravatar.com" }, "Gravitec": { "cats": [ 5 ], "js": [ "gravitec", "gravitecwebpackjsonp" ], "scriptSrc": [ "(?:cdn|id)\\.gravitec\\.(?:media|net)" ], "description": "Gravitec is a push notification tool.", "website": "https://gravitec.net" }, "Gravity Forms": { "cats": [ 87, 110 ], "html": [ "\u003cdiv class=(?:\"|')[^\u003e]*gform_body", "\u003cdiv class=(?:\"|')[^\u003e]*gform_wrapper", "\u003clink [^\u003e]*href=(?:\"|')[^\u003e]*wp-content/plugins/gravityforms/css/", "\u003cul [^\u003e]*class=(?:\"|')[^\u003e]*gform_fields" ], "scriptSrc": [ "/wp-content/plugins/gravityforms/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1" ], "website": "https://gravityforms.com" }, "GreatPages": { "cats": [ 51 ], "scriptSrc": [ "\\.greatpages\\.com\\.br/" ], "description": "GreatPages is a multi-purpose page builder software developed in Brazil.", "website": "https://www.greatpages.com.br" }, "Green Valley CMS": { "cats": [ 1 ], "html": [ "\u003cimg[^\u003e]+/dsresource\\?objectid=" ], "meta": { "dc.identifier": [ "/content\\.jsp\\?objectid=" ] }, "implies": [ "Apache Tomcat" ], "website": "https://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, "Greenhouse": { "cats": [ 101 ], "js": [ "populategreenhousejobs" ], "scriptSrc": [ "\\.greenhouse\\.io/" ], "description": "Greenhouse is an applicant tracking and hiring tool. Greenhouse features automated workflow, recruitment analytics, CRM, and onboarding.", "website": "https://www.greenhouse.io" }, "Griddo": { "cats": [ 1 ], "meta": { "generator": [ "^griddo$" ] }, "implies": [ "Gatsby", "React" ], "description": "Griddo is an Martech Experience Platform for creating custom digital experiences.", "website": "https://griddo.io" }, "Gridsome": { "cats": [ 57 ], "meta": { "generator": [ "^gridsome v([\\d.]+)$\\;version:\\1" ] }, "implies": [ "Vue.js" ], "description": "Gridsome is a free and open-source Vue-powered static site generator for building static websites.", "website": "https://gridsome.org" }, "Grin": { "cats": [ 32 ], "js": [ "grin" ], "scriptSrc": [ "grin-sdk\\.js" ], "description": "Grin is a influence marketing platform.", "website": "https://grin.co/" }, "GrocerKey": { "cats": [ 6 ], "scriptSrc": [ "\\.grocerywebsite\\.com/", "grocerkey-widget\\.s3\\.amazonaws\\.com/" ], "description": "GrocerKey is an ecommerce platform that helps grocery stores build an online store.", "website": "https://grocerkey.com" }, "GroupBy": { "cats": [ 29 ], "scriptSrc": [ "cdn\\.groupbycloud\\.com" ], "description": "GroupBy is a search enging for eCommerce sites.", "website": "https://groupbyinc.com/" }, "Growave": { "cats": [ 32, 69 ], "scriptSrc": [ "\\.socialshopwave\\.com/" ], "description": "Growave is the all-in-one app: social login and sharing, reviews, wishlists, instagram feed, automated emails and more.", "website": "https://growave.io" }, "GrowingIO": { "cats": [ 10 ], "cookies": { "gr_user_id": "", "grwng_uid": "" }, "scriptSrc": [ "assets\\.growingio\\.com/([\\d.]+)/gio\\.js\\;version:\\1" ], "website": "https://www.growingio.com/" }, "Guestonline": { "cats": [ 93 ], "scriptSrc": [ "ib\\.guestonline\\.\\w+" ], "description": "Guestonline is a restaurant table booking widget.", "website": "https://www.guestonline.io" }, "GuideIT": { "cats": [ 88 ], "headers": { "platform": "^guideit$" }, "description": "GuideIT is a cloud hosting provider.", "website": "https://guideit.uk" }, "GumGum": { "cats": [ 36 ], "description": "GumGum is a technology and media company specializing in contextual intelligence.", "website": "https://gumgum.com" }, "Gumlet": { "cats": [ 92 ], "js": [ "gumlet" ], "scriptSrc": [ "cdn\\.gumlet\\.com" ], "description": "Gumlet is a solution to optimize images.", "website": "https://www.gumlet.com/" }, "Gumroad": { "cats": [ 6 ], "cookies": { "_gumroad_app_session": "", "_gumroad_guid": "" }, "js": [ "creategumroadoverlay", "gumroadoverlay" ], "scriptSrc": [ "gumroad\\.com/js/gumroad-embed\\.js", "gumroad\\.com/js/gumroad\\.js", "gumroad\\.com/packs/js/" ], "description": "Gumroad is a self-publishing digital marketplace platform to sell digital services such as books, memberships, courses and other digital services.", "website": "https://gumroad.com" }, "Gumstack": { "cats": [ 5 ], "js": [ "gumstack" ], "scriptSrc": [ "w\\.gumstack\\.com" ], "description": "Gumstack provides a live video shopping solution for eCommerce.", "website": "https://gumstack.com/" }, "Gutenberg": { "cats": [ 87, 20 ], "scriptSrc": [ "/wp-content/plugins/gutenberg/" ], "description": "Gutenberg is the code name for the new block based editor introduced in WordPress 5.", "website": "https://github.com/WordPress/gutenberg" }, "H2O": { "cats": [ 22 ], "cookies": { "h2o_casper": "" }, "headers": { "server": "^h2o(?:/)?([\\d\\.]+)?\\;version:\\1" }, "implies": [ "C", "HTTP/2" ], "description": "H2O is a fast and secure HTTP/2 server written in C by Kazuho Oku.", "website": "https://github.com/h2o/h2o" }, "HCL Commerce": { "cats": [ 6 ], "scripts": [ "/webapp/wcs/" ], "implies": [ "Java" ], "description": "HCL Commerce is a software platform framework for ecommerce, including marketing, sales, customer and order processing functionality.", "website": "https://www.hcltechsw.com/commerce" }, "HCL Digital Experience": { "cats": [ 1 ], "js": [ "ibmcfg.themeconfig.moduleswebappbaseuri" ], "headers": { "ibm-web2-location": "", "itx-generated-timestamp": "" }, "implies": [ "Java" ], "description": "HCL Digital Experience software empowers you to create, manage and deliver engaging omni-channel digital experiences to virtually all audiences.", "website": "https://www.hcltechsw.com/dx", "cpe": "cpe:2.3:a:ibm:websphere_portal:*:*:*:*:*:*:*:*" }, "HCL Domino": { "cats": [ 22 ], "headers": { "server": "^lotus-domino$" }, "implies": [ "Java" ], "description": "HCL Domino, formerly called IBM Domino (1995) and Lotus Domino (1989), is an enterprise server application development platform.", "website": "https://www.hcltechsw.com/domino", "cpe": "cpe:2.3:a:ibm:lotus_domino:*:*:*:*:*:*:*:*" }, "HHVM": { "cats": [ 22 ], "headers": { "x-powered-by": "hhvm/?([\\d.]+)?\\;version:\\1" }, "implies": [ "PHP\\;confidence:75" ], "website": "https://hhvm.com", "cpe": "cpe:2.3:a:facebook:hhvm:*:*:*:*:*:*:*:*" }, "HP Compact Server": { "cats": [ 22 ], "headers": { "server": "hp_compact_server(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://hp.com" }, "HP iLO": { "cats": [ 22, 46 ], "headers": { "server": "hp-ilo-server(?:/([\\d.]+))?\\;version:\\1" }, "description": "HP iLO is a tool that provides multiple ways to configure, update, monitor, and run servers remotely.", "website": "https://hp.com", "cpe": "cpe:2.3:h:hp:integrated_lights-out:*:*:*:*:*:*:*:*" }, "HSTS": { "cats": [ 16 ], "headers": { "strict-transport-security": "" }, "description": "HTTP Strict Transport Security (HSTS) informs browsers that the site should only be accessed using HTTPS.", "website": "https://www.rfc-editor.org/rfc/rfc6797#section-6.1" }, "HTTP/2": { "cats": [ 19 ], "headers": { "alt-svc": "h2", "x-firefox-spdy": "h2" }, "description": "HTTP/2 (originally named HTTP/2.0) is a major revision of the HTTP network protocol used by the World Wide Web.", "website": "https://http2.github.io" }, "HTTP/3": { "cats": [ 19 ], "headers": { "alt-svc": "h3", "x-firefox-http3": "h3" }, "description": "HTTP/3 is the third major version of the Hypertext Transfer Protocol used to exchange information on the World Wide Web.", "website": "https://httpwg.org/" }, "Haddock": { "cats": [ 4 ], "html": [ "\u003cp\u003eproduced by \u003ca href=\"http://www\\.haskell\\.org/haddock/\"\u003ehaddock\u003c/a\u003e version ([0-9.]+)\u003c/p\u003e\\;version:\\1" ], "scriptSrc": [ "haddock-util\\.js" ], "description": "Haddock is a tool for automatically generating documentation from annotated Haskell source code.", "website": "https://www.haskell.org/haddock/" }, "Halo": { "cats": [ 1, 11 ], "meta": { "generator": [ "halo ([\\d.]+)?\\;version:\\1" ] }, "implies": [ "Java" ], "website": "https://halo.run" }, "Hamechio": { "cats": [ 18 ], "meta": { "generator": [ "hamech\\.io/" ] }, "implies": [ "PHP" ], "description": "Hamechio is a web application framework.", "website": "https://hamech.io" }, "Hammer.js": { "cats": [ 59 ], "js": [ "ha.version", "hammer", "hammer.version" ], "scriptSrc": [ "hammer(?:\\.min)?\\.js" ], "website": "https://hammerjs.github.io" }, "Handlebars": { "cats": [ 12 ], "js": [ "handlebars", "handlebars.version" ], "scriptSrc": [ "handlebars(?:\\.runtime)?(?:-v([\\d.]+?))?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Handlebars is a JavaScript library used to create reusable webpage templates.", "website": "https://handlebarsjs.com", "cpe": "cpe:2.3:a:handlebars.js_project:handlebars.js:*:*:*:*:*:*:*:*" }, "Handtalk": { "cats": [ 68 ], "js": [ "handtalk" ], "scriptSrc": [ "api\\.handtalk\\.me" ], "description": "Handtalk is an accessiblity plug-in which uses sign language to make sites accessible.", "website": "https://www.handtalk.me/" }, "Hansel": { "cats": [ 58 ], "js": [ "hansel", "hanselpx" ], "scriptSrc": [ "\\.hansel\\.io/web/([\\d\\.]+)/\\;version:\\1" ], "description": "Hansel is a B2B enterprise software that deploys real-time Nudges to drive feature adoption and address user drop-offs, at scale.", "website": "https://hansel.io" }, "Happy Returns": { "cats": [ 102 ], "description": "Happy Returns is a return software and reverse logistics company, provides a packaging-free, in-person way for customers to return an online purchase for an immediate refund.", "website": "https://happyreturns.com" }, "HappyFox Helpdesk": { "cats": [ 53 ], "scriptSrc": [ "\\.happyfox\\.com/media/" ], "description": "HappyFox is a help desk ticketing system that is hosted on cloud, supporting multiple customer support channels like email, voice and live chat.", "website": "https://www.happyfox.com/customer-service-software/" }, "HappyFox Live Chat": { "cats": [ 52 ], "js": [ "happyfoxchatobject" ], "scriptSrc": [ "\\.happyfoxchat\\.com/" ], "description": "HappyFox is a help desk ticketing system that is hosted on cloud, supporting multiple customer support channels like email, voice and live chat.", "website": "https://www.happyfox.com/live-chat" }, "Haptik": { "cats": [ 52 ], "js": [ "haptik", "haptikinitsettings", "haptiksdk" ], "scriptSrc": [ "\\.haptikapi\\.com/" ], "description": "Haptik is an Indian enterprise conversational AI platform founded in August 2013, and acquired by Reliance Industries Limited in 2019.", "website": "https://www.haptik.ai" }, "Haravan": { "cats": [ 6 ], "js": [ "haravan" ], "scriptSrc": [ "haravan.*\\.js" ], "description": "Haravan is a multi-channel ecommerce services provider from Vietnam.", "website": "https://www.haravan.com" }, "Harbor": { "cats": [ 60 ], "implies": [ "Go" ], "description": "Harbor is an open-source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted.", "website": "https://goharbor.io" }, "HashThemes Total": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/(?:t|t)otal(?:-plus)?/" ], "description": "HashThemes Total is the powerful and creative multipurpose WordPress theme.", "website": "https://hashthemes.com/wordpress-theme/total" }, "Hashnode": { "cats": [ 11 ], "scriptSrc": [ "hashnode\\.com" ], "description": "Hashnode is a free developer blogging platform that allows you to publish articles on your own domain and helps you stay connected with a global developer community.", "website": "https://hashnode.com/" }, "Hashtag Labs": { "cats": [ 36 ], "js": [ "htlbid.cmd" ], "description": "Hashtag Labs is a full-service digital ad operations company.", "website": "https://hashtag-labs.com" }, "Haskell": { "cats": [ 27 ], "website": "https://wiki.haskell.org/Haskell" }, "Hatena Blog": { "cats": [ 1, 11 ], "scriptSrc": [ "cdn\\.blog\\.st-hatena\\.com/" ], "description": "Hatena Blog is one of the traditional blog platforms in Japan.", "website": "https://hatenablog.com" }, "HeadJS": { "cats": [ 59 ], "js": [ "head.browser.name" ], "html": [ "\u003c[^\u003e]*data-headjs-load" ], "scriptSrc": [ "head\\.(?:core|load)(?:\\.min)?\\.js" ], "website": "https://headjs.com" }, "Header Bidding Ai": { "cats": [ 36 ], "scriptSrc": [ "\\.headerbidding\\.ai/" ], "description": "Header Bidding Ai is a provider of an automated and managed header bidding solution. Header bidding cutting-edge technique where publishers offer their ad inventory to many ad exchanges.", "website": "https://headerbidding.ai" }, "Headless UI": { "cats": [ 66 ], "description": "Headless UI is an unstyled component library for either React.js or Vue.js from the same people that created Tailwind CSS.", "website": "https://headlessui.dev" }, "Heap": { "cats": [ 10 ], "js": [ "heap.version.heapjsversion" ], "scriptSrc": [ "cdn\\.heapanalytics\\.com", "heap-\\d+\\.js" ], "description": "Heap is an analytics platform.", "website": "https://heap.io" }, "Heartland Payment Systems": { "cats": [ 41 ], "scriptSrc": [ "\\.heartlandportico\\.com" ], "description": "Heartland Payment Systems is a US-based payment processing and technology provider.", "website": "https://www.heartlandpaymentsystems.com" }, "Helhost": { "cats": [ 88 ], "headers": { "x-powered-by": "helhost" }, "description": "Helhost is a web hosting provider and internet domain registrar from Democratic Republic of Congo.", "website": "https://www.helhost.com" }, "HeliumWeb": { "cats": [ 18 ], "js": [ "helium.js" ], "headers": { "x-powered-by": "adrikikicp development" }, "scriptSrc": [ "helium/src/helium.js/helium_web.js", "http://maven.enriquitomcfh.ml/helium.js/helium_web.js", "http://maven.enriquitomcfh.ml/helium.js/helium_web.min.js" ], "implies": [ "PHP" ], "description": "HeliumWeb is a server-side (backend) web framework written in PHP \u0026 JavaScript", "website": "https://heliumweb.adrikikicp-development.ml" }, "Helix Ultimate": { "cats": [ 18 ], "implies": [ "Joomla" ], "description": "Helix Ultimate a free template framework for Joomla.", "website": "https://www.joomshaper.com/joomla-templates/helixultimate" }, "Helixo UFE": { "cats": [ 100 ], "js": [ "ufe.funneldata", "ufestore.carttotal" ], "implies": [ "Shopify" ], "description": "Helixo UFE is a lightweight Shopify upsell sales funnel app.", "website": "https://helixo.co/upsell-funnel-engine/" }, "Hello Bar": { "cats": [ 5 ], "js": [ "hellobar", "hellobarsitesettings" ], "scriptSrc": [ "\\.?hellobar\\.(?:com|js)" ], "description": "Hello Bar is a customizable notification bar that draws visitors to an important call to action on the website.", "website": "https://hellobar.com" }, "Hello Elementor": { "cats": [ 80 ], "implies": [ "Elementor" ], "description": "Hello Elementor is a WordPress theme built for the Elementor website builder platform. It uses minimal styling and scripts for maximum speed and design freedom.", "website": "https://elementor.com/hello-theme/" }, "Help Scout": { "cats": [ 13, 52 ], "js": [ "__onbeacondestroy", "beaconstore" ], "scriptSrc": [ "\\.helpscout\\.net/" ], "description": "Help Scout is a customer service platform including email, a knowledge base tool and live chat.", "website": "https://www.helpscout.com" }, "HelpDocs": { "cats": [ 4 ], "js": [ "hd_instant_search", "hdanalytics", "hdutils" ], "scriptSrc": [ "cdn\\.helpdocs\\.io" ], "description": "HelpDocs is an knowledge management system.", "website": "https://www.helpdocs.io" }, "Here": { "cats": [ 35 ], "js": [ "h.buildinfo", "h.geo", "h.util" ], "description": "HERE is a PaaS for creating custom maps, visualize location datasets, gather insights and buy and sell location assets.", "website": "https://www.here.com" }, "Hermes": { "cats": [ 99 ], "description": "Hermes offers integrated solutions along the supply chain and partners with national and international trading companies.", "website": "https://www.hermesworld.com" }, "Hero": { "cats": [ 103 ], "js": [ "herowebpluginsettings" ], "scriptSrc": [ "cdn\\.usehero\\.com" ], "implies": [ "Cart Functionality" ], "description": "Hero is a virtual shopping platform for ecommerce and retail stores.", "website": "https://www.usehero.com/" }, "Heroku": { "cats": [ 62 ], "headers": { "via": "[\\d.-]+ vegur$" }, "description": "Heroku is a cloud platform as a service (PaaS) supporting several programming languages.", "website": "https://www.heroku.com/" }, "Hestia": { "cats": [ 80 ], "scriptSrc": [ "themes/hestia.*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "Hestia is a modern WordPress theme for professionals a multipurpose one-page design, widgetized footer, blog/news page, and a clean look.", "website": "https://themeisle.com/themes/hestia/" }, "HetrixTools": { "cats": [ 13 ], "js": [ "htoolz" ], "headers": { "content-security-policy": "\\.hetrixtools\\.com" }, "scriptSrc": [ "\\.hetrixtools\\.com/" ], "description": "HetrixTools is an uptime and blacklist monitoring platform.", "website": "https://hetrixtools.com" }, "Hetzner": { "cats": [ 88, 62 ], "headers": { "server": "heray", "x-powered-by": "hetzner" }, "description": "Hetzner provides dedicated hosting, shared web hosting, virtual private servers, managed servers, domain names, SSL certificates, storage boxes, and cloud.", "website": "https://www.hetzner.com" }, "Hexo": { "cats": [ 57 ], "html": [ "powered by \u003ca href=\"https?://hexo\\.io/?\"[^\u003e]*\u003ehexo\u003c/" ], "meta": { "generator": [ "hexo(?: v?([\\d.]+))?\\;version:\\1" ] }, "implies": [ "Node.js" ], "description": "Hexo is a blog framework powered by Node.js.", "website": "https://hexo.io" }, "Hextom Free Shipping Bar": { "cats": [ 100 ], "scriptSrc": [ "\\.hextom\\.com/js/freeshippingbar\\.js" ], "implies": [ "Shopify" ], "description": "Free Shipping Bar is a Shopify app built by Hextom. Free Shipping Bar help promote free shipping with progressive messages to motivate customers to buy more.", "website": "https://hextom.com/case_study/free-shipping-bar" }, "Hextom Ultimate Sales Boost": { "cats": [ 100 ], "js": [ "hextom_usb", "ht_usb.isloaded" ], "scriptSrc": [ "\\.hextom\\.com/js/ultimatesalesboost\\.js" ], "implies": [ "Shopify" ], "description": "Ultimate Sales Boost by Hextom is an app designed to help you drive more sales by creating a sense of urgency, scarcity and trust.", "website": "https://hextom.com/case_study/ultimate-sales-boost" }, "Hi Platform": { "cats": [ 53 ], "scriptSrc": [ "\\.hiplatform\\.com/" ], "description": "Hi Platform provider of an online customer relationship platform.", "website": "https://www.hiplatform.com" }, "Hiawatha": { "cats": [ 22 ], "headers": { "server": "hiawatha v([\\d.]+)\\;version:\\1" }, "website": "https://hiawatha-webserver.org" }, "HighLevel": { "cats": [ 32, 53 ], "js": [ "leadconnector.chatwidget" ], "scriptSrc": [ "\\.leadconnectorhq\\.com/" ], "description": "HighLevel is an all-in-one marketing and automation platform designed for marketing agencies and small businesses to manage CRM, marketing campaigns, sales funnels, appointment scheduling, and more.", "website": "https://www.gohighlevel.com" }, "HighStore": { "cats": [ 6 ], "meta": { "generator": [ "^highstore\\.ir$" ], "hs:version": [ "^([\\d\\.]+)$\\;version:\\1\\;confidence:50" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "HighStore is an ecommerce platform from Iran.", "website": "https://digitalserver.ir" }, "Highcharts": { "cats": [ 25 ], "js": [ "highcharts", "highcharts.version" ], "html": [ "\u003csvg[^\u003e]*\u003e\u003cdesc\u003ecreated with highcharts ([\\d.]*)\\;version:\\1" ], "scriptSrc": [ "highcharts.*\\.js" ], "description": "Highcharts is a charting library written in pure JavaScript, for adding interactive charts to a website or web application. Highcharts meets accessibility standards and works with Python, Angular, React, iOS, Android, and more.", "website": "https://www.highcharts.com" }, "Highlight.js": { "cats": [ 59 ], "js": [ "hljs.highlightblock", "hljs.listlanguages" ], "scriptSrc": [ "/(?:([\\d.])+/)?highlight(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://highlightjs.org/" }, "Highstock": { "cats": [ 25 ], "html": [ "\u003csvg[^\u003e]*\u003e\u003cdesc\u003ecreated with highstock ([\\d.]*)\\;version:\\1" ], "scriptSrc": [ "highstock[.-]?([\\d\\.]*\\d).*\\.js\\;version:\\1" ], "website": "https://highcharts.com/products/highstock" }, "HikeOrders": { "cats": [ 68 ], "scriptSrc": [ "hikeorders\\.com/main/assets/js/hko-accessibility\\.min\\.js" ], "description": "HikeOrders is a web accessibility overlay that claims to make your site disability friendly.", "website": "https://hikeorders.com/" }, "Hinza Advanced CMS": { "cats": [ 1, 6 ], "meta": { "generator": [ "hinzacms" ] }, "implies": [ "Laravel" ], "website": "https://hinzaco.com" }, "Hireology": { "cats": [ 101 ], "description": "Hireology is a staffing and hiring platform for the franchise and retail-automotive industries.", "website": "https://hireology.com" }, "Hirschmann HiOS": { "cats": [ 28 ], "description": "Hirschmann HiOS is an operating system for industrial network equipment.", "website": "https://hirschmann.com/", "cpe": "cpe:2.3:o:belden:hirschmann_hios:*:*:*:*:*:*:*:*" }, "Histats": { "cats": [ 10 ], "js": [ "histats.ver" ], "description": "Histats is a simple website visitor analysis and tracking tool.", "website": "https://www.histats.com" }, "History": { "cats": [ 19 ], "scriptSrc": [ "/history(@|/)([\\d.]+)(?:/[a-z]+)?/history(?:(.production|.development))?(?:.min)?\\.js\\;version:\\2" ], "description": "Manage session history with JavaScript", "website": "https://github.com/ReactTraining/history" }, "HockeyStack": { "cats": [ 10 ], "js": [ "hockeystack" ], "description": "HockeyStack is a San Francisco-based analytics and attribution tool for B2B companies.", "website": "https://hockeystack.com" }, "Hoefler\u0026Co": { "cats": [ 17 ], "description": "Hoefler\u0026Co is a digital type foundry (font design studio) in Woburn, Massachusetts (formerly New York City), founded by type designer Jonathan Hoefler. Hoefler\u0026Co designs typefaces for clients and for retail on its website.", "website": "https://www.typography.com" }, "Hogan.js": { "cats": [ 12 ], "js": [ "hogan" ], "scriptSrc": [ "([\\d.]+)/hogan(?:\\.min)?\\.js\\;version:\\1", "hogan-[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "website": "https://twitter.github.io/hogan.js/" }, "Homerr": { "cats": [ 99 ], "description": "Homerr is a logistics company operating in the Netherlands and Belgium.", "website": "https://www.homerr.com" }, "Homestead": { "cats": [ 51 ], "meta": { "generator": [ "^homestead sitebuilder$" ] }, "description": "Homestead is a website builder.", "website": "https://www.homestead.com" }, "Honeybadger": { "cats": [ 13 ], "js": [ "honeybadger", "inithoneybadger" ], "description": "Honeybadger provides exception and uptime monitoring to keep your web apps error-free.", "website": "https://www.honeybadger.io" }, "Hono": { "cats": [ 18 ], "headers": { "x-powered-by": "hono" }, "description": "Hono is a small, simple, and ultrafast web framework for the Edge.", "website": "https://hono.dev" }, "HostEurope": { "cats": [ 88 ], "description": "HostEurope is a European website hosting, email and domain name registrar company headquartered Hayes, West London.", "website": "https://www.hosteurope.de" }, "Hostens": { "cats": [ 88 ], "description": "Hostens is a web hosting company specialising in hosting services, virtual private server hosting, and the domain name or transition.", "website": "https://www.hostens.com" }, "Hostgator": { "cats": [ 88 ], "description": "HostGator is a Houston-based provider of shared, reseller, virtual private server, and dedicated web hosting with an additional presence in Austin, Texas.", "website": "https://www.hostgator.com" }, "Hosting Ukraine": { "cats": [ 88 ], "description": "Hosting Ukraine is a web hosting provider and internet domain registrar.", "website": "https://www.ukraine.com.ua" }, "Hostinger": { "cats": [ 88 ], "headers": { "platform": "hostinger" }, "description": "Hostinger is an employee-owned Web hosting provider and internet domain registrar.", "website": "https://www.hostinger.com" }, "Hostinger CDN": { "cats": [ 31 ], "headers": { "server": "hcdn" }, "description": "Hostinger Content Delivery Network (CDN).", "website": "https://www.hostinger.com" }, "Hostinger Website Builder": { "cats": [ 51 ], "scriptSrc": [ "userapp\\.zyrosite\\.com/" ], "meta": { "generator": [ "hostinger website builder" ] }, "implies": [ "Vue.js" ], "description": "Hostinger Website Builder is a web-based platform that allows users to create and design websites without needing to write code or have extensive technical knowledge.", "website": "https://www.hostinger.com" }, "Hostiq": { "cats": [ 88 ], "description": "Hostiq is a web hosting provider and internet domain registrar.", "website": "https://hostiq.ua" }, "Hostmeapp": { "cats": [ 93, 72 ], "scriptSrc": [ "tables\\.hostmeapp\\.com" ], "description": "Hostmeapp is an restaurant software. Includes reservation, waitlist, guestbook and marketing tools.", "website": "https://www.hostmeapp.com" }, "Hostpoint": { "cats": [ 88 ], "description": "Hostpoint is a Switzerland-based web hosting company.", "website": "https://www.hostpoint.ch" }, "Hotaru CMS": { "cats": [ 1 ], "cookies": { "hotaru_mobile": "" }, "meta": { "generator": [ "hotaru cms" ] }, "implies": [ "PHP" ], "website": "https://hotarucms.org" }, "Hotjar": { "cats": [ 10 ], "js": [ "hj.apiurlbase", "hotleadcontroller", "hotleadfactory" ], "scriptSrc": [ "//static\\.hotjar\\.com/" ], "description": "Hotjar is a suite of analytic tools to assist in the gathering of qualitative data, providing feedback through tools such as heatmaps, session recordings, and surveys.", "website": "https://www.hotjar.com" }, "Hotjar Incoming Feedback": { "cats": [ 73 ], "scriptSrc": [ "\\.hotjar\\.com/preact-incoming-feedback" ], "description": "Hotjar Incoming Feedback is a widget that sits at the edge of a page.", "website": "https://www.hotjar.com" }, "Howler.js": { "cats": [ 59 ], "js": [ "howler", "howlerglobal" ], "scriptSrc": [ "howler/([\\d.]+)/howler(?:\\.core)?\\.min\\.js\\;version:\\1", "howler@([\\d.]+)/dist/howler\\.min\\.js\\;version:\\1" ], "description": "Howler.js is an audio library with support for the Web Audio API and a fallback mechanism for HTML5 Audio.", "website": "https://howlerjs.com" }, "HrFlow.ai": { "cats": [ 101 ], "scriptSrc": [ "\\.hrflow\\.ai" ], "description": "HrFlow.ai is an HR data automation API platform.", "website": "https://hrflow.ai" }, "Htmx": { "cats": [ 59 ], "js": [ "htmx" ], "scriptSrc": [ "/htmx\\.org@([\\d\\.]+)\\;version:\\1" ], "description": "Htmx is a JavaScript library for performing AJAX requests, triggering CSS transitions, and invoking WebSocket and server-sent events directly from HTML elements.", "website": "https://htmx.org" }, "HubSpot": { "cats": [ 32 ], "js": [ "_hsq", "hubspot" ], "html": [ "\u003c!-- start of async hubspot" ], "description": "HubSpot is a marketing and sales software that helps companies attract visitors, convert leads, and close customers.", "website": "https://www.hubspot.com" }, "HubSpot Analytics": { "cats": [ 10 ], "scriptSrc": [ "js\\.hs-analytics\\.net/analytics" ], "description": "HubSpot is a marketing and sales software that helps companies attract visitors, convert leads, and close customers.", "website": "https://www.hubspot.com/products/marketing/analytics" }, "HubSpot CMS Hub": { "cats": [ 1 ], "headers": { "x-hs-hub-id": "", "x-powered-by": "hubspot" }, "meta": { "generator": [ "hubspot" ] }, "implies": [ "HubSpot" ], "description": "CMS Hub is a content management platform by HubSpot for marketers to manage, optimize, and track content performance on websites, blogs, and landing pages.", "website": "https://www.hubspot.com/products/cms" }, "HubSpot Chat": { "cats": [ 52 ], "js": [ "hubspotconversations" ], "scriptSrc": [ "js\\.usemessages\\.com" ], "description": "HubSpot Chat is a tool where you can view, manage, and reply to incoming messages from multiple channels.", "website": "https://www.hubspot.com/products/crm/live-chat" }, "HubSpot Cookie Policy Banner": { "cats": [ 67 ], "description": "HubSpot Cookie Policy banner is a cookie compliance functionality from HubSpot.", "website": "https://knowledge.hubspot.com/reports/customize-your-cookie-tracking-settings-and-privacy-policy-alert" }, "HubSpot WordPress plugin": { "cats": [ 87 ], "js": [ "leadin_wordpress.leadinpluginversion" ], "implies": [ "HubSpot", "HubSpot Analytics" ], "description": "HubSpot is a platform with all the tools and integrations you need for marketing, sales, and customer service. HubSpot WordPress plugin allows you to manage contacts (CRM), engage visitors with live chat and chatbots, add beautiful forms to pages, create engaging email marketing campaigns, and more.", "website": "https://wordpress.org/plugins/leadin/" }, "Hubalz": { "cats": [ 10 ], "js": [ "hubalz.getclickdetails", "hubalz_script.noinputtracking" ], "description": "Hubalz is an all-in-one analytics and marketing tool.", "website": "https://www.hubalz.com" }, "Huberway": { "cats": [ 1 ], "cookies": { "huberway_session": "" }, "implies": [ "MySQL", "PHP" ], "description": "Huberway is a content management system, based on PHP and JavaScript, used to create advanced sales portals oriented towards industrialization 4.0.", "website": "https://www.huberway.com" }, "Huberway Analytics": { "cats": [ 10 ], "scriptSrc": [ "analytics\\.huberway\\.com/pixel/" ], "description": "Huberway Analytics is a free web analytics service that tracks and reports website traffic.", "website": "https://www.huberway.com/analytics-software" }, "Huddle": { "cats": [ 21 ], "js": [ "huddleevent", "huddleuser" ], "description": "Huddle is a digital product agency based in Amsterdam, Netherlands, specialising in developing and designing custom software solutions for startups and enterprises, including e-learning products, community platforms, and mobile applications.", "website": "https://www.thehuddle.nl" }, "Hugo": { "cats": [ 57 ], "meta": { "generator": [ "hugo ([\\d.]+)?\\;version:\\1" ] }, "description": "Hugo is an open-source static site generator written in Go.", "website": "https://gohugo.io" }, "HulkApps Age Verification": { "cats": [ 100 ], "scriptSrc": [ "age-verification\\.hulkapps\\.com/" ], "implies": [ "Shopify" ], "description": "HulkApps Age Verification allow your customers to certify their age before they land in your store.", "website": "https://www.hulkapps.com/products/age-verification-shopify" }, "HulkApps Form Builder": { "cats": [ 73, 100, 110 ], "scriptSrc": [ "formbuilder\\.hulkapps\\.com/" ], "implies": [ "Shopify" ], "description": "HulkApps Form Builder is an application that creates customizable, job-specific forms for unit needs.", "website": "https://www.hulkapps.com/products/form-builder-shopify" }, "HulkApps GDPR/CCPA Compliance Manager": { "cats": [ 67, 100 ], "js": [ "hulksetcookie" ], "scriptSrc": [ "cookiebar\\.hulkapps\\.com/hulk_cookie_bar\\.js" ], "implies": [ "Shopify" ], "description": "HulkApps GDPR/CCPA Compliance Manager is a consent management solution.", "website": "https://www.hulkapps.com/products/gdpr-ccpa-cookie-manager-shopify-app" }, "HulkApps Infinite Product Options": { "cats": [ 76, 100 ], "js": [ "hulkapps.po_url" ], "implies": [ "Shopify" ], "description": "HulkApps Infinite Product Options is a unlimited custom options for products. Display variant options as buttons, color and image swatches, and more.", "website": "https://www.hulkapps.com/products/infinite-product-options-shopify" }, "HulkApps Product Reviews": { "cats": [ 90, 100 ], "js": [ "hulkappsproductreview", "hulkappsreviews" ], "implies": [ "Shopify" ], "description": "HulkApps Product Reviews is a customer product reviews app for building social proof for store.", "website": "https://www.hulkapps.com/products/product-reviews-shopify" }, "Human Presence": { "cats": [ 16 ], "scriptSrc": [ "/.*\\.humanpresence\\.(?:io|app)/" ], "description": "Human Presence is a bot detection and spam protection software for WordPress and Shopify.", "website": "https://www.humanpresence.io" }, "Humm": { "cats": [ 91 ], "js": [ "checkout.enabledpayments.humm" ], "scriptSrc": [ "/wp-content/plugins/oxipay-payment-gateway/", "widgets\\.shophumm\\.com" ], "description": "Humm (formerly Flexigroup) is a buy now pay later service operating in Australia.", "website": "https://www.shophumm.com" }, "Hund.io": { "cats": [ 13 ], "scriptSrc": [ "\\.hund\\.io/" ], "description": "Hund.io is an automated status pages with monitoring.", "website": "https://hund.io" }, "Hushly": { "cats": [ 32 ], "js": [ "__hly_widget_object" ], "scriptSrc": [ "\\.hushly\\.com/" ], "description": "Hushly is an all-in-one B2B marketing software platform.", "website": "https://www.hushly.com" }, "Hydra-Shield": { "cats": [ 64 ], "headers": { "server": "^hydra-shield\\sv([\\d\\.]+)$\\;version:\\1" }, "description": "Hydra-Shield is an anti-DDoS protection reverse proxy that filters and mitigates malicious traffic to safeguard servers from distributed denial-of-service attacks.", "website": "https://hydra-shield.fr" }, "Hydrogen": { "cats": [ 12 ], "headers": { "powered-by": "^shopify-hydrogen$" }, "implies": [ "React", "Shopify", "Vite" ], "description": "Hydrogen is a front-end web development framework used for building Shopify custom storefronts.", "website": "https://hydrogen.shopify.dev" }, "Hypercorn": { "cats": [ 22 ], "headers": { "server": "hypercorn" }, "implies": [ "Python" ], "website": "https://pgjones.gitlab.io/hypercorn/" }, "Hyperspeed": { "cats": [ 92, 100 ], "js": [ "hyperscripts" ], "scriptSrc": [ "cdn\\.shopify\\.com/.+/assets/hs-(?:instantload|lazysizes)\\.min\\.js" ], "implies": [ "Instant.Page", "Shopify" ], "description": "Hyperspeed is the most advanced speed booster for Shopify.", "website": "https://www.hyperspeed.me" }, "Hypervisual Page Builder": { "cats": [ 51, 100 ], "js": [ "hypervisualpreflight" ], "scriptSrc": [ "cdn\\.gethypervisual\\.com/" ], "description": "Hypervisual Page Builder is a page builder for Shopify.", "website": "https://gethypervisual.com" }, "Hypestyle CSS": { "cats": [ 66 ], "implies": [ "Sass" ], "description": "Hypestyle CSS is a small CSS library build on utility classes and components.", "website": "https://www.hypestylecss.xyz" }, "Hyros": { "cats": [ 10 ], "scriptSrc": [ "/v1/lst/universal-script\\?ph\\=" ], "description": "Hyros is a marketing analytics and optimisation platform.", "website": "https://hyros.com" }, "Hyva Themes": { "cats": [ 108 ], "headers": { "x-built-with": "^hyva themes$" }, "implies": [ "Alpine.js", "Magento\\;version:2", "Tailwind CSS" ], "description": "Hyva Themes is a performance-optimised theme for Magento 2 which eliminated the third-party libraries and having only two dependencies Alpine.js and Tailwind CSS.", "website": "https://hyva.io" }, "IBM Coremetrics": { "cats": [ 10 ], "scriptSrc": [ "cmdatatagutils\\.js" ], "website": "https://ibm.com/software/marketing-solutions/coremetrics" }, "IBM DataPower": { "cats": [ 64 ], "headers": { "x-backside-transport": "", "x-global-transaction-id": "" }, "description": "IBM DataPower Gateway is a single multi-channel gateway designed to help provide security, control, integration and optimized access to a full range of mobile, web, application programming interface (API), service-oriented architecture (SOA), B2B and cloud workloads.", "website": "https://www.ibm.com/products/datapower-gateway", "cpe": "cpe:2.3:a:ibm:datapower_gateway:*:*:*:*:*:*:*:*" }, "IBM HTTP Server": { "cats": [ 22 ], "headers": { "server": "ibm_http_server(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://ibm.com/software/webservers/httpservers", "cpe": "cpe:2.3:a:ibm:http_server:*:*:*:*:*:*:*:*" }, "ID5": { "cats": [ 36 ], "cookies": { "id5": "" }, "js": [ "__id5_instances", "id5._version" ], "scriptSrc": [ "^https://(?:cdn\\.)?id5-sync\\.com/" ], "description": "ID5 is a company that offers an identity solution for digital advertising, providing a Universal ID that enables privacy-compliant user recognition and tracking across websites without relying on personal information or third-party cookies.", "website": "https://id5.io/" }, "IIS": { "cats": [ 22 ], "headers": { "server": "^(?:microsoft-)?iis(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Windows Server" ], "description": "Internet Information Services (IIS) is an extensible web server software created by Microsoft for use with the Windows NT family.", "website": "https://www.iis.net", "cpe": "cpe:2.3:a:microsoft:internet_information_server:*:*:*:*:*:*:*:*" }, "INFOnline": { "cats": [ 10 ], "js": [ "iam_data", "szmvars" ], "scriptSrc": [ "^https?://(?:[^/]+\\.)?i(?:oam|v)wbox\\.de/" ], "website": "https://www.infonline.de" }, "IONOS": { "cats": [ 88 ], "description": "IONOS is the web hosting and cloud partner for small and medium-sized businesses.", "website": "https://www.ionos.com" }, "IP2Location.io": { "cats": [ 79 ], "cookies": { "ip2location_redirection_first_visit": "" }, "description": "IP2Location.io is a web service that provides geolocation data based on IP addresses through its API, allowing developers to integrate accurate physical location information into their applications.", "website": "https://www.ip2location.io" }, "IPB": { "cats": [ 2 ], "cookies": { "ipbwwlmodpids": "", "ipbwwlsession_id": "" }, "js": [ "ipb_var", "ipboard", "ipssettings" ], "html": [ "\u003clink[^\u003e]+ipb_[^\u003e]+\\.css" ], "scriptSrc": [ "jscripts/ips_" ], "implies": [ "MySQL", "PHP" ], "website": "https://invisioncommunity.com/" }, "IPFS": { "cats": [ 48 ], "headers": { "x-cf-ipfs-cache-status": "", "x-ipfs-datasize": "", "x-ipfs-gateway-host": "", "x-ipfs-lb-pop": "", "x-ipfs-path": "", "x-ipfs-pop": "", "x-ipfs-root": "", "x-ipfs-root-cid": "", "x-ipfs-roots": "" }, "description": "IPFS is a peer-to-peer hypermedia protocol that provides a distributed hypermedia web.", "website": "https://ipfs.tech/" }, "IPInfoDB": { "cats": [ 79 ], "description": "IPInfoDB is the API that returns the location of an IP address.", "website": "https://www.ipinfodb.com/" }, "IPinfo": { "cats": [ 79 ], "scriptSrc": [ "ipinfo\\.io/" ], "description": "IPinfo is an IP address data provider.", "website": "https://ipinfo.io" }, "ISAY": { "cats": [ 1 ], "description": "ISAY (Internet Pages Management) is a CMS service provided by the Turkish Ministry of Interior for governorships, district governorships and various official websites.", "website": "https://www.icisleri.gov.tr/internet-sayfalari-yonetimi-isay" }, "Iamport": { "cats": [ 41 ], "js": [ "imp.request_pay" ], "scriptSrc": [ "cdn\\.iamport\\.kr/js/iamport\\.payment-([\\d\\.]+)\\.js\\;version:\\1" ], "description": "Iamport is an information technology company based in South Korea.", "website": "https://www.iamport.kr" }, "Ibexa DXP ": { "cats": [ 1 ], "headers": { "x-powered-by": "^ibexa\\sexperience\\sv([\\d\\.]+)$\\;version:\\1" }, "meta": { "generator": [ "^ez platform" ] }, "implies": [ "PHP", "Symfony" ], "description": "Ibexa DXP is an open-source enterprise PHP content management system (CMS) and Digital Experience Platform (DXP) developed by the company Ibexa (known previously as eZ Systems).", "website": "https://www.ibexa.co" }, "Ideasoft": { "cats": [ 6 ], "scriptSrc": [ "\\.myideasoft\\.com/([\\d.]+)\\;version:\\1" ], "description": "Ideasoft is a Turkish software company providing web-based software solutions, software design, ecommerce solutions, and other services.", "website": "https://www.ideasoft.com.tr" }, "Identrust": { "cats": [ 70 ], "description": "denTrust is a digital identity authentication solution.", "website": "https://www.identrust.com/" }, "IdoSell Shop": { "cats": [ 6 ], "js": [ "iai_ajax" ], "description": "IdoSell Shop is a fully functional ecommerce software platform.", "website": "https://www.idosell.com" }, "Ikas": { "cats": [ 6 ], "js": [ "ikasevents.subscribe" ], "headers": { "server": "^ikas$", "x-powered-by": "^ikas$" }, "implies": [ "GraphQL", "MongoDB", "Next.js" ], "description": "Ikas is a new generation ecommerce platform designed for small businesses.", "website": "https://ikas.com" }, "Iluria": { "cats": [ 6, 63 ], "js": [ "iluria", "iluriashowpagination" ], "scriptSrc": [ "template-assets\\.iluria\\.com/commons/" ], "description": "Iluria is a hosted ecommerce platform from Brazil.", "website": "https://www.iluria.com.br" }, "Image Relay": { "cats": [ 95 ], "js": [ "imagerelay.accounts" ], "scriptSrc": [ "static\\.imagerelay\\.com/" ], "description": "Image Relay is a digital asset management system that allows organizations to upload, manage, organize, monitor and track their digital assets.", "website": "https://www.imagerelay.com" }, "ImageEngine": { "cats": [ 31, 92 ], "description": "ImageEngine is an intelligent image content delivery network. ImageEngine will resize your image content tailored to the end users device.", "website": "https://imageengine.io" }, "Imagely NextGEN Gallery": { "cats": [ 87, 7 ], "scriptSrc": [ "/wp-content/plugins/nextgen-gallery(?:-pro|-plus)?/" ], "description": "NextGEN Gallery is a WordPress gallery plugin maintained by Imagely.", "website": "https://www.imagely.com/wordpress-gallery-plugin" }, "Imber": { "cats": [ 52 ], "js": [ "$imber.getvisitor", "imber_id", "imber_socket" ], "description": "Imber is an all-in-one marketing automation platform built for customer support (live chat), sales, and marketing.", "website": "https://imber.live" }, "Imgix": { "cats": [ 31, 95 ], "description": "Imgix is a visual media platform for managing, processing, rendering, optimising and delivering your existing images.", "website": "https://imgix.com/" }, "Immutable.js": { "cats": [ 59 ], "js": [ "immutable", "immutable.version" ], "scriptSrc": [ "^immutable\\.(?:min\\.)?js$" ], "website": "https://facebook.github.io/immutable-js/" }, "Impact": { "cats": [ 71 ], "js": [ "impactradiusevent", "irevent" ], "scriptSrc": [ "d\\.impactradius-event\\.com" ], "description": "Impact helps businesses contract and pay partners.", "website": "https://impact.com/" }, "Imperva": { "cats": [ 16, 31 ], "headers": { "x-cdn": "^imperva", "x-iinfo": "" }, "scriptSrc": [ "/_incapsula_resource" ], "description": "Imperva is a cyber security software and services company for networking, data, and application security.", "website": "https://www.imperva.com/" }, "ImpressCMS": { "cats": [ 1 ], "cookies": { "icmssession": "", "impresscms": "" }, "scriptSrc": [ "include/linkexternal\\.js" ], "meta": { "generator": [ "impresscms" ] }, "implies": [ "PHP" ], "website": "https://www.impresscms.org", "cpe": "cpe:2.3:a:impresscms:impresscms:*:*:*:*:*:*:*:*" }, "ImpressPages": { "cats": [ 1 ], "meta": { "generator": [ "impresspages(?: cms)?( [\\d.]*)?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://impresspages.org", "cpe": "cpe:2.3:a:impresspages:impresspages_cms:*:*:*:*:*:*:*:*" }, "Imunify360": { "cats": [ 16 ], "headers": { "server": "imunify360-webshield/([\\d\\.]+)\\;version:\\1" }, "description": "Imunify360 is a comprehensive security platform for Linux web servers which utilises machine learning technology and other advanced techniques to provide protection against various types of cyber threats, such as malware, viruses, and other attacks.", "website": "https://www.imunify360.com" }, "Imweb": { "cats": [ 6 ], "js": [ "imweb_template" ], "scriptSrc": [ "vendor-cdn\\.imweb\\.me/" ], "description": "Imweb is a ecommerce website builder software.", "website": "https://imweb.me" }, "In Cart Upsell \u0026 Cross-Sell": { "cats": [ 100 ], "scriptSrc": [ "\\.incartupsell\\.com/" ], "description": "In Cart Upsell \u0026 Cross-Sell is a Shopify app built by InCart Upsell, provides targeted upsells and cross-sells directly in your cart and product page.", "website": "https://incartupsell.com" }, "InMoment": { "cats": [ 10, 73 ], "headers": { "content-security-policy": "\\.inmoment\\.com", "content-security-policy-report-only": "\\.inmoment\\.com" }, "scriptSrc": [ "\\.inmoment\\.com(?:\\.\\w+)?/" ], "description": "InMoment provides SaaS based customer survey and enterprise feedback management solutions.", "website": "https://inmoment.com" }, "InSyncai": { "cats": [ 52 ], "description": "InSyncai offers a conversational platform for enterprises to design and build chatbots having applications in customer support and services.", "website": "https://www.insyncai.com" }, "Incapsula": { "cats": [ 31 ], "headers": { "x-cdn": "incapsula" }, "description": "Incapsula is a cloud-based application delivery platform. It uses a global content delivery network to provide web application security, DDoS mitigation, content caching, application delivery, load balancing and failover services.", "website": "https://www.incapsula.com" }, "Includable": { "cats": [ 18 ], "headers": { "x-includable-version": "" }, "website": "https://includable.com" }, "Index Exchange": { "cats": [ 36 ], "description": "Index Exchange is a customizable exchange technology that enables sell side media firms to monetize ad inventories programmatically and in real time.", "website": "https://www.indexexchange.com" }, "Indexhibit": { "cats": [ 1 ], "html": [ "\u003c(?:link|a href) [^\u003e]+ndxz-studio" ], "meta": { "generator": [ "indexhibit" ] }, "implies": [ "Apache HTTP Server", "Exhibit", "PHP" ], "website": "https://www.indexhibit.org", "cpe": "cpe:2.3:a:indexhibit:indexhibit:*:*:*:*:*:*:*:*" }, "Indi": { "cats": [ 94 ], "js": [ "indi.formatstats", "indi_carousel.productcta", "indicountly.check_any_consent" ], "description": "Indi is a video social network where everyone - artists, brands, retailers, nonprofits, celebrities and individuals - can connect with fans and supporters to interact directly with your brand utilising exclusive Video Challenges and Video Threads tailor made by you.", "website": "https://indi.com" }, "Indico": { "cats": [ 1 ], "cookies": { "makacsession": "" }, "html": [ "powered by\\s+(?:cern )?\u003ca href=\"http://(?:cdsware\\.cern\\.ch/indico/|indico-software\\.org|cern\\.ch/indico)\"\u003e(?:cds )?indico( [\\d\\.]+)?\\;version:\\1" ], "website": "https://indico-software.org" }, "Indy": { "cats": [ 22 ], "headers": { "server": "indy(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://indyproject.org" }, "Inertia.js": { "cats": [ 12 ], "headers": { "vary": "x-inertia", "x-inertia": "" }, "description": "Inertia.js is a protocol for creating monolithic single-page applications.", "website": "https://inertiajs.com" }, "InfernoJS": { "cats": [ 12 ], "js": [ "inferno", "inferno.version" ], "website": "https://infernojs.org" }, "Infogram": { "cats": [ 5 ], "js": [ "infogramembeds" ], "description": "Infogram is a web-based data visualisation and infographics platform.", "website": "https://infogram.com" }, "Infolinks": { "cats": [ 36 ], "js": [ "infolinks_pid", "infolinks_wsid" ], "description": "Infolinks is an online advertising platform for publishers and advertisers.", "website": "https://www.infolinks.com" }, "Infomaniak": { "cats": [ 88 ], "description": "Infomaniak is a hosting company based in Geneva, Switzerland.", "website": "https://www.infomaniak.com" }, "InforUMobile": { "cats": [ 52 ], "description": "InforUMobile is a multi-channel system that enables digital communication with customers, offering various channels for interacting and engaging with users, developed by the Shamir Systems Group.", "website": "https://www.inforu.co.il" }, "Infoset": { "cats": [ 52, 53 ], "js": [ "infosetchat", "infosetroot" ], "description": "Infoset is an advanced communication and support solutions.", "website": "https://infoset.app" }, "Insider": { "cats": [ 97 ], "js": [ "insider" ], "scriptSrc": [ "api\\.useinsider\\.\\w+/" ], "description": "Insider is the first integrated Growth Management Platform helping digital marketers drive growth across the funnel, from Acquisition to Activation, Retention, and Revenue from a unified platform powered by Artificial Intelligence and Machine Learning.", "website": "https://useinsider.com" }, "Insightly CRM": { "cats": [ 53 ], "scriptSrc": [ "\\.insightly\\.services/" ], "description": "Insightly CRM is a cloud-based customer relationship management software, helps businesses manage leads, contacts, and opportunities, track customer interactions, create custom reports, automate workflows, and integrate with third-party applications, improving customer engagement and streamlining business processes.", "website": "https://www.insightly.com/crm/" }, "Inspectlet": { "cats": [ 10 ], "js": [ "__insp", "__inspld" ], "html": [ "\u003c!-- (?:begin|end) inspectlet embed code --\u003e" ], "scriptSrc": [ "cdn\\.inspectlet\\.com" ], "website": "https://www.inspectlet.com/" }, "Instabot": { "cats": [ 5, 10, 32, 52, 58 ], "js": [ "instabot" ], "scriptSrc": [ "/rokoinstabot\\.js" ], "description": "Instabot is a conversion chatbot that understands your users, and curates information, answers questions, captures contacts, and books meetings instantly.", "website": "https://instabot.io/" }, "Instafeed": { "cats": [ 100 ], "scriptSrc": [ "instafeed\\.nfcube\\.com/" ], "description": "Instafeed is an official Instagram app.", "website": "https://apps.shopify.com/instafeed" }, "Instamojo": { "cats": [ 41 ], "js": [ "initial_state.seller.avatar", "instamojo" ], "description": "Instamojo is a Bangalore-based company that provides a platform for selling digital goods and collecting payment online.", "website": "https://www.instamojo.com/" }, "Instana": { "cats": [ 10, 13, 78 ], "js": [ "ineum" ], "scriptSrc": [ "eum\\.instana\\.io" ], "description": "Instana is a Kubernetes-native APM tool which is built for new-stack including Microservices and lately Serverless but also supports the existing VM based stacks including several supported technologies.", "website": "https://www.instana.com" }, "Instant.Page": { "cats": [ 59, 92 ], "scriptSrc": [ "instant\\.page" ], "description": "Instant.Page is a JavaScript library which uses just-in-time preloading technique to make websites faster.", "website": "https://instant.page/" }, "InstantCMS": { "cats": [ 1 ], "cookies": { "instantcms[logdate]": "" }, "meta": { "generator": [ "instantcms" ] }, "implies": [ "PHP" ], "website": "https://www.instantcms.ru", "cpe": "cpe:2.3:a:instantcms:instantcms:*:*:*:*:*:*:*:*" }, "InstantClick": { "cats": [ 59, 92 ], "js": [ "instantclick" ], "scriptSrc": [ "instantclick\\.min\\.js" ], "description": "InstantClick is a JavaScript library that speeds up your website, making navigation faster.", "website": "https://instantclick.io/" }, "InstantGeo": { "cats": [ 59 ], "js": [ "geojs" ], "scriptSrc": [ "js\\.instantgeo\\.info", "script\\.instantgeo\\.info" ], "description": "InstantGeo is a service that provides IP geolocation to web pages", "website": "https://instantgeo.info" }, "Instapage": { "cats": [ 51, 74, 10 ], "js": [ "_instapagesnowplow", "instapagesp" ], "scriptSrc": [ "cdn\\.instapagemetrics\\.com", "heatmap-events-collector\\.instapage\\.com" ], "implies": [ "Lua", "Node.js" ], "description": "Instapage is a cloud-based landing page platform designed for marketing teams and agencies.", "website": "https://instapage.com" }, "Instatus": { "cats": [ 13 ], "description": "Instatus is a status and incident communication tool.", "website": "https://instatus.com" }, "Integral Ad Science": { "cats": [ 36 ], "scriptSrc": [ "\\.adsafeprotected\\.com/" ], "description": "Integral Ad Science is an American publicly owned technology company that analyses the value of digital advertising placements.", "website": "https://integralads.com" }, "Intel Active Management Technology": { "cats": [ 22, 46 ], "headers": { "server": "intel\\(r\\) active management technology(?: ([\\d.]+))?\\;version:\\1" }, "description": "Intel Active Management Technology (AMT) is a proprietary remote management and control system for personal computers with Intel CPUs.", "website": "https://intel.com", "cpe": "cpe:2.3:a:intel:active_management_technology:*:*:*:*:*:*:*:*" }, "IntenseDebate": { "cats": [ 15 ], "scriptSrc": [ "intensedebate\\.com" ], "description": "IntenseDebate is a blog commenting system that supports Typepad, Blogger and Wordpress blogs. The system allows blog owners to track and moderate comments from one place with features like threading, comment analytics, user reputation, and comment aggregation.", "website": "https://intensedebate.com" }, "Interact": { "cats": [ 5 ], "js": [ "interactapp.name", "interactpromotionobject" ], "scriptSrc": [ "\\.tryinteract\\.com/" ], "description": "Interact is a tool for creating online quizzes.", "website": "https://www.tryinteract.com" }, "Intercom": { "cats": [ 52, 53 ], "js": [ "intercom" ], "scriptSrc": [ "(?:api\\.intercom\\.io/api|static\\.intercomcdn\\.com/intercom\\.v1)" ], "description": "Intercom is an American software company that produces a messaging platform which allows businesses to communicate with prospective and existing customers within their app, on their website, through social media, or via email.", "website": "https://www.intercom.com" }, "Intercom Articles": { "cats": [ 4 ], "html": [ "\u003ca href=\"https://www.intercom.com/intercom-link[^\"]+solution=customer-support[^\u003e]+\u003ewe run on intercom" ], "description": "Intercom Articles is a tool to create, organise and publish help articles.", "website": "https://www.intercom.com/articles" }, "Internet Brands": { "cats": [ 36 ], "description": "Internet Brands is a technology company that operates a variety of web portals and online communities, providing information and services to consumers and businesses across a range of industries.", "website": "https://www.internetbrands.com" }, "Intersection Observer": { "cats": [ 92, 59 ], "scriptSrc": [ "/assets/(?:.+)?intersection-observer\\.[\\d\\w\\.]+\\.js", "cdn\\.jsdelivr\\.net/npm/intersection-observer@([\\d\\.]+)\\;version:\\1" ], "description": "Intersection Observer is a browser API that provides a way to observe the visibility and position of a DOM element relative to the containing root element or viewport.", "website": "https://www.w3.org/TR/intersection-observer" }, "Intershop": { "cats": [ 6 ], "html": [ "\u003cish-root" ], "scriptSrc": [ "(?:is-bin|intershop)" ], "description": "Intershop is an ecommerce platform, tailored to the needs of complex business processes and major organisations.", "website": "https://intershop.com" }, "Invenio": { "cats": [ 50 ], "cookies": { "inveniosession": "" }, "html": [ "(?:powered by|system)\\s+(?:cern )?\u003ca (?:class=\"footer\" )?href=\"http://(?:cdsware\\.cern\\.ch(?:/invenio)?|invenio-software\\.org|cern\\.ch/invenio)(?:/)?\"\u003e(?:cds )?invenio\u003c/a\u003e\\s*v?([\\d\\.]+)?\\;version:\\1" ], "description": "Invenio is an open-source software framework for large-scale digital repositories that provides the tools for management of digital assets in an institutional repository and research data management systems.", "website": "https://invenio-software.org" }, "Inventrue": { "cats": [ 6 ], "meta": { "author": [ "^inventrue, llc.$" ] }, "description": "Inventrue creates websites for RV, Motorsports and Trailer Dealerships.", "website": "https://www.inventrue.com" }, "Inveon": { "cats": [ 6 ], "cookies": { "inv.customer": "\\;confidence:50", "inveonsessionid": "" }, "js": [ "invapp", "invtagmanagerparams" ], "scriptSrc": [ "scripts/_app/inv(?:\\w+)\\.js\\?v=(.+)$\\;version:\\1" ], "description": "Inveon is a technology company that has been delivering ecommerce infrastructure software and mcommerce applications.", "website": "https://www.inveon.com" }, "Invoca": { "cats": [ 32, 10 ], "js": [ "invoca.pnapi.version", "invocatagid" ], "scriptSrc": [ "\\.dialogtech\\.com/" ], "description": "Invoca is an AI-powered call tracking and conversational analytics company.", "website": "https://www.invoca.com" }, "Ionic": { "cats": [ 18 ], "js": [ "ionic.config", "ionic.version" ], "description": "Ionic is an open-source framework that enables developers to create cross-platform mobile, web, and desktop applications using web technologies like HTML, CSS, and JavaScript.", "website": "https://ionicframework.com" }, "Ionicons": { "cats": [ 17 ], "description": "Ionicons is an open-source icon set crafted for web, iOS, Android, and desktop apps.", "website": "https://ionicons.com" }, "IrisLMS": { "cats": [ 21 ], "scriptSrc": [ "\\.irislms\\.ir/" ], "description": "IrisLMS comprehensive education management system, in order to support e-learning and provide suitable conditions for holding online and offline classes with all facilities.", "website": "https://irislms.ir" }, "Irroba": { "cats": [ 6 ], "html": [ "\u003ca[^\u003e]*href=\"https://www\\.irroba\\.com\\.br" ], "website": "https://www.irroba.com.br/" }, "Isotope": { "cats": [ 59 ], "js": [ "init_isotope", "isotope" ], "description": "Isotope.js is a JavaScript library that makes it easy to sort, filter, and add Masonry layouts to items on a webpage.", "website": "https://isotope.metafizzy.co" }, "Isso": { "cats": [ 15 ], "js": [ "isso.fetchcomments" ], "implies": [ "Python" ], "description": "Isso is a lightweight commenting server written in Python and JavaScript, referred to as \"Ich schrei sonst\" in German.", "website": "https://github.com/posativ/isso/" }, "Issuu": { "cats": [ 19, 5 ], "js": [ "issuupanel", "issuureaders" ], "scriptSrc": [ "\\.issuu\\.com/" ], "description": "Issuu is a digital discovery and publishing platform.", "website": "https://issuu.com" }, "Iterable": { "cats": [ 32 ], "js": [ "iterableanalytics" ], "scriptSrc": [ "js\\.iterable\\.com" ], "description": "Iterable is a cross-channel marketing platform that powers unified customer experiences.", "website": "https://iterable.com/" }, "Ivory Search": { "cats": [ 87 ], "js": [ "ivory_search_analytics", "ivorysearchvars" ], "scriptSrc": [ "/wp-content/plugins/add-search-to-menu/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Ivory Search is a WordPress search plugin that improves WordPress search by providing advanced options to extend search or exclude specific content from search.", "website": "https://ivorysearch.com" }, "Izooto": { "cats": [ 32, 5 ], "js": [ "_izooto", "izooto" ], "scriptSrc": [ "cdn\\.izooto\\.\\w+" ], "description": "iZooto is a user engagement and retention tool that leverages web push notifications to help business to drive repeat traffic, leads and sales.", "website": "https://www.izooto.com" }, "J2Store": { "cats": [ 6 ], "js": [ "j2storeurl" ], "implies": [ "Joomla" ], "description": "J2Store is a Joomla shopping cart and ecommerce extension.", "website": "https://www.j2store.org", "cpe": "cpe:2.3:a:j2store:j2store:*:*:*:*:*:joomla\\!:*:*" }, "JANet": { "cats": [ 71 ], "description": "JANet is an affiliate marketing network.", "website": "https://j-a-net.jp" }, "JAlbum": { "cats": [ 7 ], "meta": { "generator": [ "jalbum( [\\d.]+)?\\;version:\\1" ] }, "implies": [ "Java" ], "description": "jAlbum is across-platform photo website software for creating and uploading galleries from images and videos.", "website": "https://jalbum.net/en" }, "JBoss Application Server": { "cats": [ 22 ], "headers": { "x-powered-by": "jboss(?:-([\\d.]+))?\\;version:\\1" }, "website": "https://jboss.org/jbossas.html", "cpe": "cpe:2.3:a:redhat:jboss_application_server:*:*:*:*:*:*:*:*" }, "JBoss Web": { "cats": [ 22 ], "headers": { "x-powered-by": "jbossweb(?:-([\\d.]+))?\\;version:\\1" }, "implies": [ "JBoss Application Server" ], "website": "https://jboss.org/jbossweb", "cpe": "cpe:2.3:a:redhat:jbossweb:*:*:*:*:*:*:*:*" }, "JET Enterprise": { "cats": [ 6 ], "headers": { "powered": "jet-enterprise" }, "website": "https://www.jetecommerce.com.br/" }, "JS Charts": { "cats": [ 25 ], "js": [ "jschart" ], "scriptSrc": [ "jscharts.{0,32}\\.js" ], "website": "https://www.jscharts.com" }, "JSEcoin": { "cats": [ 56 ], "js": [ "jsemine" ], "scriptSrc": [ "^(?:https):?//load\\.jsecoin\\.com/load/" ], "description": "JSEcoin is a way to mine, receive payments for your goods or services and transfer cryptocurrency", "website": "https://jsecoin.com/" }, "JSS": { "cats": [ 12, 47 ], "description": "JSS is an authoring tool for CSS which allows you to use JavaScript to describe styles in a declarative, conflict-free and reusable way.", "website": "https://cssinjs.org/" }, "JShop": { "cats": [ 6 ], "js": [ "jss_1stepdeliverytype", "jss_1stepfillshipping" ], "description": "JShop is the ecommerce database solution marketed by Whorl Ltd. worldwide.", "website": "https://www.whorl.co.uk" }, "JTL Shop": { "cats": [ 6 ], "cookies": { "jtlshop": "" }, "html": [ "(?:\u003cinput[^\u003e]+name=\"jtlshop|\u003ca href=\"jtl\\.php)" ], "description": "JTL Shop is an ecommerce product created by JTL Software company.", "website": "https://www.jtl-software.de/online-shopsystem" }, "JUST": { "cats": [ 41 ], "scriptSrc": [ "checkout-button-.+/just-pay-button\\.js" ], "description": "JUST is a one-click payment solution for online business and online shoppers.", "website": "https://www.getjusto.com" }, "JW Player": { "cats": [ 14 ], "js": [ "jwdefaults", "jwplayer", "jwplayerapiurl", "webpackjsonpjwplayer" ], "scriptSrc": [ "\\.jwpcdn\\.com", "\\.jwplayer\\.com" ], "description": "JW Player is a online video player with video engagement analytics, custom video player skins, and live video streaming capability.", "website": "https://www.jwplayer.com" }, "Jahia DX": { "cats": [ 1, 47 ], "html": [ "\u003cscript id=\"staticassetaggregatedjavascrip" ], "website": "https://www.jahia.com/dx" }, "Jalios": { "cats": [ 1 ], "meta": { "generator": [ "jalios" ] }, "website": "https://www.jalios.com" }, "Java": { "cats": [ 27 ], "cookies": { "jsessionid": "" }, "description": "Java is a class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.", "website": "https://java.com", "cpe": "cpe:2.3:a:oracle:jre:*:*:*:*:*:*:*:*" }, "Java Servlet": { "cats": [ 18 ], "headers": { "x-powered-by": "servlet(?:\\/([\\d.]+))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://www.oracle.com/technetwork/java/index-jsp-135475.html" }, "JavaScript Infovis Toolkit": { "cats": [ 25 ], "js": [ "$jit", "$jit.version" ], "scriptSrc": [ "jit(?:-yc)?\\.js" ], "website": "https://philogb.github.io/jit/" }, "JavaServer Faces": { "cats": [ 18 ], "headers": { "x-powered-by": "jsf(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://javaserverfaces.java.net" }, "JavaServer Pages": { "cats": [ 18 ], "headers": { "x-powered-by": "jsp(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://www.oracle.com/technetwork/java/javaee/jsp/index.html" }, "Javadoc": { "cats": [ 4 ], "html": [ "\u003c!-- generated by javadoc --\u003e" ], "description": "Javadoc is a tool used for generating Java code documentation in HTML format from Java source code.", "website": "https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html" }, "Jekyll": { "cats": [ 57 ], "js": [ "simplejekyllsearch" ], "html": [ "\u003c!-- begin jekyll seo tag", "\u003c!-- created with jekyll now -", "powered by \u003ca href=\"https?://jekyllrb\\.com\"[^\u003e]*\u003ejekyll\u003c/" ], "meta": { "generator": [ "jekyll\\sv([\\d.]+)?\\;version:\\1" ] }, "implies": [ "Ruby" ], "description": "Jekyll is a blog-aware, static site generator for personal, project, or organisation sites.", "website": "https://jekyllrb.com", "cpe": "cpe:2.3:a:jekyllrb:jekyll:*:*:*:*:*:*:*:*" }, "Jenkins": { "cats": [ 44 ], "js": [ "jenkinsciglobal", "jenkinsrules" ], "headers": { "x-jenkins": "([\\d.]+)\\;version:\\1" }, "html": [ "\u003cspan class=\"jenkins_ver\"\u003e\u003ca href=\"https://jenkins\\.io/\"\u003ejenkins ver\\. ([\\d.]+)\\;version:\\1" ], "implies": [ "Java" ], "description": "Jenkins is an open-source automation tool written in Java with plugins built for Continuous Integration (CI) purposes.", "website": "https://jenkins.io/", "cpe": "cpe:2.3:a:jenkins:jenkins:*:*:*:*:*:*:*:*" }, "Jetpack": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/jetpack/" ], "description": "Jetpack is a popular WordPress plugin created by Automattic, the people behind WordPress.com.", "website": "https://jetpack.com" }, "Jetpack Boost": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/jetpack-boost/" ], "description": "Jetpack Boost – Website Speed, Performance and Critical CSS.", "website": "https://jetpack.com" }, "Jetshop": { "cats": [ 6 ], "js": [ "jetshopdata" ], "html": [ "\u003c(?:div|aside) id=\"jetshop-branding\"\u003e" ], "website": "https://jetshop.se" }, "Jetty": { "cats": [ 22 ], "headers": { "server": "jetty(?:\\(([\\d\\.]*\\d+))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://www.eclipse.org/jetty" }, "Jibres": { "cats": [ 6, 55 ], "cookies": { "jibres": "" }, "js": [ "jibres" ], "headers": { "x-powered-by": "jibres" }, "scriptSrc": [ "/jibres\\.js" ], "meta": { "generator": [ "jibres" ] }, "description": "Jibres is an ecommerce solution with an online store builder and Point-of-Sale (PoS) software.", "website": "https://jibres.com" }, "Jilt App": { "cats": [ 100, 98 ], "js": [ "jiltstorefrontparams.platform" ], "description": "Jilt App helps ecommerce store owners track and recover abandoned orders. Works seamlessly with Shopify and WooCommerce.", "website": "https://community.shopify.com/c/shopify-apps/jilt-is-over-what-app-to-use-for-abandoned-carts-now/td-p/1575095" }, "Jilt plugin": { "cats": [ 87, 98 ], "scriptSrc": [ "\\.jilt\\.com/.+/jilt\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Jilt plugin helps ecommerce store owners track and recover abandoned orders. Works seamlessly with Shopify and WooCommerce.", "website": "https://wordpress.org/plugins/jilt-for-woocommerce" }, "Jimdo": { "cats": [ 1 ], "js": [ "jimdodolphindata" ], "headers": { "x-jimdo-instance": "", "x-jimdo-wid": "" }, "description": "Jimdo is a website-builder and all-in-one hosting solution, designed to enable users to build their own websites.", "website": "https://www.jimdo.com" }, "Jirafe": { "cats": [ 10, 32 ], "js": [ "jirafe" ], "scriptSrc": [ "/jirafe\\.js" ], "website": "https://docs.jirafe.com" }, "Jitsi": { "cats": [ 52 ], "scriptSrc": [ "lib-jitsi-meet.*\\.js" ], "description": "Jitsi is a free and open-source multiplatform voice (VoIP), videoconferencing and instant messaging applications for the web platform.", "website": "https://jitsi.org" }, "Jive": { "cats": [ 19 ], "headers": { "x-jive-chrome-wrapped": "", "x-jive-flow-id": "", "x-jive-request-id": "", "x-jive-user-id": "", "x-jsl": "" }, "website": "https://www.jivesoftware.com" }, "JivoChat": { "cats": [ 52 ], "js": [ "jivo_api", "jivo_version" ], "scriptSrc": [ "\\.jivosite\\.com" ], "description": "JivoChat is a live chat solution for websites offering customizable web and mobile chat widgets.", "website": "https://www.jivosite.com" }, "Jivox": { "cats": [ 76 ], "scriptSrc": [ "\\.jivox\\.com/" ], "description": "Jivox is a cloud-based, data-driven platform for delivering personalised digital advertising and marketing experiences at scale.", "website": "https://jivox.com" }, "JobAdder": { "cats": [ 101 ], "scriptSrc": [ "\\.jobadder\\.com/" ], "description": "JobAdder is a cloud-based recruitment management platform for staffing agencies and in-house corporate hiring teams.", "website": "https://jobadder.com" }, "JobberBase": { "cats": [ 19, 101 ], "js": [ "jobber" ], "meta": { "generator": [ "jobberbase" ] }, "implies": [ "PHP" ], "description": "Jobberbase is an open-source job board platform that enables the creation of job sites.", "website": "https://www.jobberbase.com" }, "Jobvite": { "cats": [ 101 ], "js": [ "jobvite" ], "description": "Jobvite is an applicant tracking software and recruiting platform.", "website": "https://www.jobvite.com" }, "JoomShopping": { "cats": [ 6 ], "js": [ "joomshoppingvideohtml5" ], "scriptSrc": [ "/components/com_jshopping/" ], "implies": [ "Joomla" ], "description": "JoomShopping is an open-source ecommerce plugin for Joomla.", "website": "https://www.webdesigner-profi.de/joomla-webdesign/joomla-shop" }, "Joomla": { "cats": [ 1 ], "js": [ "jcomments", "joomla" ], "headers": { "x-content-encoded-by": "joomla! ([\\d.]+)\\;version:\\1" }, "html": [ "(?:\u003cdiv[^\u003e]+id=\"wrapper_r\"|\u003c(?:link|script)[^\u003e]+(?:feed|components)/com_|\u003ctable[^\u003e]+class=\"pill)\\;confidence:50" ], "meta": { "generator": [ "joomla!(?: ([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Joomla is a free and open-source content management system for publishing web content.", "website": "https://www.joomla.org/", "cpe": "cpe:2.3:a:joomla:joomla:*:*:*:*:*:*:*:*" }, "JouwWeb": { "cats": [ 1, 51 ], "js": [ "jouwweb" ], "scriptSrc": [ "(?:cdn)?\\.(?:jwwb|jouwweb)\\.nl/" ], "description": "JouwWeb is an online website builder that allows internet users to create own website.", "website": "https://www.jouwweb.nl" }, "JsObservable": { "cats": [ 59 ], "description": "JsObservable is integrated with JsViews and facilitates observable data manipulations that are immediately reflected in the data-bound templates. The library is developed and maintained by Microsoft employee Boris Moore and is used in projects such as Outlook.com and Windows Azure.", "website": "https://www.jsviews.com/#jsobservable" }, "JsRender": { "cats": [ 59 ], "scriptSrc": [ "([\\d\\.]+)?/jsrender(?:\\.min)?\\.js\\;version:\\1" ], "implies": [ "JsViews" ], "description": "JsRender is the template library. The library is developed and maintained by Microsoft employee Boris Moore and is used in projects such as Outlook.com and Windows Azure.", "website": "https://www.jsviews.com/#jsrender" }, "JsViews": { "cats": [ 59 ], "scriptSrc": [ "([\\d\\.]+)?/jsviews(?:\\.min)?\\.js\\;version:\\1" ], "implies": [ "JsObservable", "JsRender" ], "description": "JsViews is the MVVM library which provides two-way data binding for the template. The library is developed and maintained by Microsoft employee Boris Moore and is used in projects such as Outlook.com and Windows Azure.", "website": "https://www.jsviews.com/#jsviews" }, "Judge.me": { "cats": [ 90 ], "js": [ "judgeme" ], "scriptSrc": [ "cdn\\.judge\\.me" ], "description": "Judge.me is a reviews app that helps you collect and display product reviews and site reviews with photos, videos and Q\u0026A.", "website": "https://judge.me" }, "JuicyAds": { "cats": [ 36 ], "js": [ "adsbyjuicy" ], "meta": { "juicyads-site-verification": [] }, "description": "JuicyAds is a legitimate advertising network that specializes in adult content.", "website": "https://www.juicyads.com" }, "Jumbo": { "cats": [ 92 ], "scriptSrc": [ "mt\\.tryjumbo\\.com" ], "implies": [ "Shopify" ], "description": "Jumbo is a page speed optimizer app for Shopify based sites.", "website": "https://www.tryjumbo.com/" }, "Jumio": { "cats": [ 16 ], "description": "Jumio is an online mobile payments and identity verification company that provides card and ID scanning and validation products for mobile and web transactions.", "website": "https://www.jumio.com" }, "Jumpseller": { "cats": [ 6 ], "js": [ "jumpseller" ], "scriptSrc": [ "assets\\.jumpseller\\.\\w+/", "jumpseller-apps\\.herokuapp\\.\\w+/" ], "description": "Jumpseller is a cloud ecommerce solution for small businesses.", "website": "https://jumpseller.com" }, "June": { "cats": [ 10, 97 ], "cookies": { "_june_session": "" }, "scriptSrc": [ "static\\.june\\.so/analytics\\.js/" ], "description": "June is a product analytics for subscription businesses. It automatically generates graphs of the metrics users should track by connecting their segment account.", "website": "https://june.so" }, "Junip": { "cats": [ 90 ], "js": [ "juniploaded", "webpackchunkjunip_scripts" ], "scriptSrc": [ "\\.juniphq\\.com/" ], "description": "Junip provider of a ecommerce brand review platform designed to share customers' story, send review requests and display review content.", "website": "https://junip.co" }, "Juo": { "cats": [ 74 ], "scriptSrc": [ "cdn\\.juo\\.io/" ], "description": "Juo is a centralised experimentation platform for innovative marketing and product teams.", "website": "https://get.juo.io" }, "Juspay": { "cats": [ 41 ], "js": [ "juspay" ], "description": "Juspay is a developer of an online platform designed to be used for mobile-based payments.", "website": "https://juspay.in" }, "Justo": { "cats": [ 6 ], "scriptSrc": [ "\\.getjusto\\.com/" ], "description": "Justo is a subscription-based software that allows anyone to set up an online store and sell their products with delivery options.", "website": "https://www.getjusto.com" }, "Justuno": { "cats": [ 76, 98 ], "js": [ "justunoapp" ], "scriptSrc": [ "cdn\\.justuno\\.com", "my\\.jst\\.ai" ], "description": "Justuno is a visitor conversion optimisation platform.", "website": "https://www.justuno.com" }, "Justuno App": { "cats": [ 100 ], "scriptSrc": [ "//scripttags\\.justuno\\.com/shopify_justuno" ], "implies": [ "Justuno" ], "description": "Justuno is a premium conversion marketing and analytics platform that provides retailers with powerful tools to increase conversions.", "website": "https://apps.shopify.com/justuno-pop-ups-email-conversion" }, "K-Sup": { "cats": [ 1 ], "meta": { "generator": [ "^k-sup \\(([\\d.r]+)\\)$\\;version:\\1" ] }, "implies": [ "Java" ], "description": "K-Sup is an open-source CMS/portal solution dedicated to higher education and research created by Kosmos Education.", "website": "https://www.ksup.org/" }, "K2": { "cats": [ 19 ], "js": [ "k2ratingurl" ], "html": [ "\u003c!--(?: joomlaworks \"k2\"| start k2)" ], "implies": [ "Joomla" ], "website": "https://getk2.org" }, "KAMAR": { "cats": [ 21 ], "js": [ "kamar.has_address_ben_found" ], "description": "KAMAR is a Student Management System utilised by secondary schools.", "website": "https://kamar.nz" }, "KISSmetrics": { "cats": [ 10 ], "js": [ "km_cookie_domain" ], "website": "https://www.kissmetrics.com" }, "KMK": { "cats": [ 6 ], "description": "KMK is a company that offers ecommerce software technology in C2C, B2B, B2C areas.", "website": "https://www.kmk.net.tr" }, "KPHP": { "cats": [ 27 ], "headers": { "x-powered-by": "^kphp/([\\d\\.]+)$\\;version:\\1" }, "implies": [ "PHP" ], "description": "KPHP (kPHP or KittenPHP) is a free PHP-to- C++ source-to-source translator, developed by VKontakte.", "website": "https://vkcom.github.io/kphp" }, "KQS.store": { "cats": [ 6 ], "js": [ "kqs_box", "kqs_off" ], "description": "KQS.store is an ecommerce software.", "website": "https://www.kqs.pl" }, "KaTeX": { "cats": [ 25 ], "js": [ "katex", "katex.version" ], "scriptSrc": [ "katex(@|/)[0-9.]+(?:/dist)?/katex(?:\\.min)?\\.(mjs|js|css)\\;version:\\1" ], "description": "KaTeX is a cross-browser JavaScript library that displays mathematical notation in web browsers.", "website": "https://katex.org/" }, "Kadence WP Blocks": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/kadence-blocks/dist/.+/kb-form-block\\.min\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "implies": [ "Gutenberg" ], "description": "Kadence WP Blocks is a plugin for WordPress that provides a collection of custom blocks for the Gutenberg editor, allowing users to create custom layouts and designs for their website without needing to know how to code.", "website": "https://www.kadencewp.com/kadence-blocks/" }, "Kadence WP Kadence": { "cats": [ 80 ], "js": [ "kadence", "kadenceconfig" ], "scriptSrc": [ "/wp-content/themes/kadence/.+navigation\\.min\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Kadence WP Kadence is a multipurpose WordPress theme that is available for free download and also offers a pro version.", "website": "https://www.kadencewp.com/kadence-theme" }, "Kadence WP Virtue": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/virtue/.+main-min\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Kadence WP Virtue is a multipurpose WordPress theme that is available for free download and also offers a pro version.", "website": "https://www.kadencewp.com/product/virtue-free-theme" }, "Kaira Vogue": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/vogue(?:-child)?/" ], "description": "Vogue is a very easy to use multipurpose WordPress theme created by Kaira.", "website": "https://kairaweb.com/wordpress-theme/vogue" }, "Kajabi": { "cats": [ 6 ], "cookies": { "_kjb_session": "" }, "js": [ "kajabi" ], "website": "https://kajabi.com" }, "Kakao": { "cats": [ 19 ], "js": [ "kakao.version" ], "scriptSrc": [ "\\.kakao\\.com/" ], "description": "Kakao platform provides various services such as Kakao Talk, Kakao Talk Channel, Kakao Story as well as Kakao Pay, Kakao Commerce, Kakao Page provided by the subsidiaries. Users can use all Kakao platform services with a united account called Kakao Account.", "website": "https://developers.kakao.com/product" }, "Kaltura": { "cats": [ 14, 103 ], "js": [ "kalturaiframeembed", "kgetkalturaembedsettings", "kgetkalturaplayerlist", "kplayer", "restorekalturakdpcallback" ], "scripts": [ "kalturaplayer" ], "scriptSrc": [ "api\\.kaltura\\.(?:nordu\\.net|com)/" ], "description": "Kaltura is a video content management platform that allows users to upload, manage, share, publish, and stream videos.", "website": "https://corp.kaltura.com" }, "Kameleoon": { "cats": [ 74 ], "cookies": { "kameleoonvisitorcode": "" }, "js": [ "kameleoon.gatherer.script_version", "kameleoonendloadtime", "kameleoons" ], "scriptSrc": [ "\\.kameleoon\\.\\w+/kameleoon\\.js" ], "description": "Kameleoon is a personalisation technology platform for real-time omnichannel optimisation and conversion.", "website": "https://kameleoon.com/" }, "Kamva": { "cats": [ 6 ], "js": [ "kamva" ], "scriptSrc": [ "cdn\\.mykamva\\.ir" ], "meta": { "generator": [ "[ck]amva" ] }, "website": "https://kamva.ir" }, "Kapix Studio": { "cats": [ 51 ], "js": [ "__initial_state__", "kapixversion" ], "implies": [ "TypeScript", "Vite" ], "description": "Kapix Studio is a no-code platform that lets anyone build web apps without writing any code.", "website": "https://studio.kapix.fr" }, "Kapture CRM": { "cats": [ 52, 53 ], "js": [ "kap_chat_js", "kapchat" ], "scriptSrc": [ "\\.kapturecrm\\.com/.+\\?ver=([\\d\\.]+)\\;version:\\1" ], "description": "Kapture CRM is an enterprise-grade SaaS-based customer support automation platform.", "website": "https://www.kapturecrm.com" }, "Karma": { "cats": [ 59 ], "js": [ "karma.vars.version" ], "scriptSrc": [ "karma\\.mdpcdn\\.com" ], "implies": [ "Node.js" ], "description": "Karma is a test runner for JavaScript that runs on Node.js.", "website": "https://karma-runner.github.io" }, "Karte": { "cats": [ 74, 76 ], "js": [ "__karte_live", "__karte_loaded", "__karte_rewrite_admin_config", "__karte_tracker" ], "description": "Karte is a customer engagement and marketing automation platform that enables businesses to understand their customers, deliver personalised experiences, and optimise marketing strategies.", "website": "https://karte.io" }, "Kartra": { "cats": [ 32 ], "js": [ "init_kartra_tracking", "kartra_tracking_loaded" ], "scriptSrc": [ "app\\.kartra\\.com" ], "description": "Kartra is an online business platform that offers marketing and sales tools.", "website": "https://home.kartra.com" }, "Kasada": { "cats": [ 16 ], "cookies": { "kp_uidz": "" }, "js": [ "kpsdk.configure" ], "description": "Kasada is a cybersecurity company that provides a platform to protect websites and web applications from bot attacks and malicious activities.", "website": "https://www.kasada.io" }, "Keap": { "cats": [ 53 ], "scriptSrc": [ "\\.infusionsoft\\.com/" ], "description": "Keap offers an email marketing and sales platform for small businesses, including products to manage customers, customer relationship management, marketing, and ecommerce.", "website": "https://keap.com" }, "Keen Delivery": { "cats": [ 99 ], "description": "Keen Delivery is a Dutch shipping platform ", "website": "https://www.keendelivery.com" }, "Keen-Slider": { "cats": [ 59 ], "js": [ "keenslider" ], "description": "Keen-Slider is a free library agnostic touch slider with native touch/swipe behavior.", "website": "https://keen-slider.io" }, "Kemal": { "cats": [ 18, 22 ], "headers": { "x-powered-by": "kemal" }, "website": "https://kemalcr.com" }, "Kendo UI": { "cats": [ 66 ], "js": [ "kendo", "kendo.version" ], "html": [ "\u003clink[^\u003e]*\\s+href=[^\u003e]*styles/kendo\\.common(?:\\.min)?\\.css[^\u003e]*/\u003e" ], "implies": [ "jQuery" ], "description": "Kendo UI is a HTML5 user interface framework for building interactive and high-performance websites and applications.", "website": "https://www.telerik.com/kendo-ui" }, "Kentico CMS": { "cats": [ 1 ], "cookies": { "cmscookielevel": "", "cmspreferredculture": "" }, "js": [ "cms.application" ], "scriptSrc": [ "/cmspages/getresource\\.ashx", "/kentico\\.resource" ], "meta": { "generator": [ "kentico cms ([\\d.r]+ \\(build [\\d.]+\\))\\;version:\\1" ] }, "description": "Kentico CMS is a web content management system for building websites, online stores, intranets, and Web 2.0 community sites.", "website": "https://www.kentico.com", "cpe": "cpe:2.3:a:kentico:kentico_cms:*:*:*:*:*:*:*:*" }, "Keptify": { "cats": [ 98 ], "js": [ "_keptify.version", "keptify_base_url" ], "scriptSrc": [ "app\\.keptify\\.com/" ], "description": "Keptify helps ecommerce sites of any size to increase sales and conversion rates by providing visitors with a personalised shopping experience.", "website": "https://keptify.com" }, "Kerberos": { "cats": [ 16 ], "headers": { "www-authenticate": "^kerberos" }, "description": "Kerberos is an authentication method commonly used by Windows servers", "website": "https://tools.ietf.org/html/rfc4559" }, "Kestrel": { "cats": [ 22 ], "headers": { "server": "^kestrel" }, "implies": [ "Microsoft ASP.NET" ], "website": "https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel" }, "Ketch": { "cats": [ 67 ], "scriptSrc": [ "\\.ketchcdn\\.com/" ], "description": "Ketch is a data control platform that manages compliance with privacy regulations.", "website": "https://www.ketch.com" }, "Kevel": { "cats": [ 36 ], "js": [ "ados", "adosresults" ], "scriptSrc": [ "adzerk\\.net/" ], "description": "Kevel (formerly Adzerk) is a developer of ad-serving APIs to help developers build server-side ad platforms.", "website": "https://www.kevel.com" }, "KeyCDN": { "cats": [ 31 ], "headers": { "server": "^keycdn-engine$" }, "description": "KeyCDN is a content delivery network (CDN).", "website": "https://www.keycdn.com" }, "Keybase": { "cats": [ 16 ], "description": "Keybase is for keeping everyone's chats and files safe, from families to communities to companies. MacOS, Windows, Linux, iPhone, and Android.", "website": "https://keybase.io/" }, "Kibana": { "cats": [ 29, 25 ], "headers": { "kbn-name": "kibana", "kbn-version": "^([\\d.]+)$\\;version:\\1" }, "html": [ "\u003ctitle\u003ekibana\u003c/title\u003e" ], "implies": [ "Elasticsearch", "Node.js" ], "description": "Kibana is an open-source data visualisation dashboard for Elasticsearch. It provides visualisation capabilities on top of the content indexed on an Elasticsearch cluster. Users can create bar, line and scatter plots, or pie charts and maps on top of large volumes of data.", "website": "https://www.elastic.co/products/kibana", "cpe": "cpe:2.3:a:elasticsearch:kibana:*:*:*:*:*:*:*:*" }, "Kibo Commerce": { "cats": [ 6 ], "scriptSrc": [ "cdn-tp\\d+\\.mozu\\.com" ], "description": "Kibo Commerce is a enterprise ecommerce platform that offers a cloud-based, end-to-end commerce solution for retailers and branded manufacturers.", "website": "https://kibocommerce.com" }, "Kibo Personalization": { "cats": [ 76, 74 ], "js": [ "baynoteapi", "baynotejsversion", "certona.recommendations", "certonarecommendations" ], "scriptSrc": [ "\\.baynote\\.net", "\\.certona\\.net" ], "description": "Kibo Personalization is a omnichannel personalisation software powered by machine learning to deliver individualized customer experiences and powered by Monetate and Certona.", "website": "https://kibocommerce.com/personalization-software" }, "Kicksite": { "cats": [ 53 ], "cookies": { "_kicksite_session": "" }, "description": "Kicksite is a gym and martial arts member management software with attendance tracking, automated billing, free texting, lead capture forms and more.", "website": "https://kicksite.com" }, "Kiliba": { "cats": [ 32 ], "description": "Kiliba has developed a module that automates the marketing process from creating an email to distributing it.", "website": "https://en.kiliba.com" }, "Kindful": { "cats": [ 111 ], "js": [ "bloomerang.version", "bloomerangloadstarted", "kindful_gtag", "kindfulpaymentsconnect" ], "description": "Kindful is a cloud-based donor management and fundraising software and database designed for nonprofit organisations.", "website": "https://kindful.com" }, "KineticJS": { "cats": [ 25 ], "js": [ "kinetic", "kinetic.version" ], "scriptSrc": [ "kinetic(?:-v?([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://github.com/ericdrowell/KineticJS/" }, "Kinsta": { "cats": [ 62, 88 ], "headers": { "x-kinsta-cache": "" }, "implies": [ "WordPress" ], "website": "https://kinsta.com" }, "Kirki Customizer Framework": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/kirki/" ], "description": "Kirki Customizer Framework is a toolkit allowing WordPress developers to use the Customizer and take advantage of its advanced features and flexibility by abstracting the code.", "website": "https://kirki.org" }, "Kitcart": { "cats": [ 6 ], "implies": [ "Laravel", "PHP" ], "description": "KitCart is a cloud-based solution that helps businesses build ecommerce stores, manage inventory, and more.", "website": "https://kitcart.net" }, "Kiwi Sizing": { "cats": [ 76 ], "js": [ "kiwisizing" ], "scriptSrc": [ "cdn\\.static\\.kiwisizing\\.com/" ], "description": "Kiwi Sizing is a size chart and a recommender plugin on the Shopify platform.", "website": "https://www.kiwisizing.com" }, "Klarna Checkout": { "cats": [ 41, 91 ], "cookies": { "ku1-sid": "", "ku1-vid": "" }, "js": [ "_klarnacheckout", "klarnaonsiteservice" ], "headers": { "content-security-policy": "\\.klarna(?:cdn|services)\\.(?:net|com)" }, "scriptSrc": [ "\\.klarnaservices\\.com/lib\\.js" ], "description": "Klarna Checkout is a complete payment solution where Klarna handles a store's entire checkout.", "website": "https://www.klarna.com/international/" }, "Klaro": { "cats": [ 67 ], "js": [ "klaro", "klaroconfig" ], "description": "Klaro is a simple consent management platform and privacy tool.", "website": "https://heyklaro.com" }, "Klasha": { "cats": [ 41 ], "js": [ "klashaclient" ], "scriptSrc": [ "klasha-integration\\.js" ], "description": "Klasha is a payment solution provider that handles a store's entire checkout.", "website": "https://www.klasha.com/" }, "Klaviyo": { "cats": [ 32 ], "js": [ "klaviyo", "klaviyosubscribe" ], "scriptSrc": [ "klaviyo\\.com" ], "description": "Klaviyo is an email marketing platform for online businesses.", "website": "https://www.klaviyo.com/" }, "Klevu": { "cats": [ 29 ], "js": [ "klevu.version", "klevu_apikey", "klevu_layout", "klevu_sessionid" ], "scriptSrc": [ "js\\.klevu\\.\\w+/klevu-js-v([\\d.]+)\\;version:\\1" ], "description": "Klevu is a highly advanced AI-Powered search solution for ecommerce platforms.", "website": "https://www.klevu.com" }, "KlickPages": { "cats": [ 32, 51 ], "js": [ "klickart.analytics" ], "scriptSrc": [ "\\.klickpages\\.com\\.br/" ], "meta": { "klickart:url": [] }, "description": "KlickPages is a landing page management software designed to help businesses execute email marketing campaigns and capture leads.", "website": "https://klickpages.com.br" }, "Klickly": { "cats": [ 36 ], "scriptSrc": [ "analytics\\.klickly\\.com/pixel\\.js\\?v=([\\d\\.]+)\\;version:\\1" ], "description": "Klickly is an invite-only, commission-based advertising platform.", "website": "https://www.klickly.com" }, "Knak": { "cats": [ 75 ], "description": "Knak is a platform that provides customisable email and landing page templates to simplify the creation of visually appealing marketing campaigns.", "website": "https://knak.com" }, "Knockout.js": { "cats": [ 12 ], "js": [ "ko.version" ], "description": "Knockout.js is basically a library written in JavaScript, based on MVVM pattern that helps developers build rich and responsive websites.", "website": "https://knockoutjs.com" }, "Ko-fi": { "cats": [ 5, 111 ], "js": [ "kofiwidget2" ], "scriptSrc": [ "ko-fi\\.com/widgets" ], "description": "Ko-fi is an online platform that helps content creators get the financial support.", "website": "https://ko-fi.com" }, "Koa": { "cats": [ 18, 22 ], "headers": { "x-powered-by": "^koa$" }, "implies": [ "Node.js" ], "website": "https://koajs.com" }, "Koala": { "cats": [ 10, 53 ], "js": [ "koalasdk" ], "scriptSrc": [ "cdn\\.getkoala\\.com/" ], "description": "Koala is an analytical product with CRM features that helps businesses efficiently identify and track prospects, providing valuable insights and streamlining the sales process.", "website": "https://getkoala.com/" }, "Koala Framework": { "cats": [ 1, 18 ], "html": [ "\u003c!--[^\u003e]+this website is powered by koala web framework cms" ], "meta": { "generator": [ "^koala web framework cms" ] }, "implies": [ "PHP" ], "website": "https://koala-framework.org" }, "KobiMaster": { "cats": [ 6 ], "js": [ "kmgetsession", "kmpageinfo" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://www.kobimaster.com.tr" }, "Koha": { "cats": [ 50 ], "js": [ "koha" ], "html": [ "\u003ca href=\"/cgi-bin/koha/", "\u003cinput name=\"koha_login_context\" value=\"intranet\" type=\"hidden\"\u003e" ], "meta": { "generator": [ "^koha ([\\d.]+)$\\;version:\\1" ] }, "implies": [ "Perl" ], "description": "Koha is an open-source Integrated Library System (ILS).", "website": "https://koha-community.org/", "cpe": "cpe:2.3:a:koha:koha:*:*:*:*:*:*:*:*" }, "Kohana": { "cats": [ 18 ], "cookies": { "kohanasession": "" }, "headers": { "x-powered-by": "kohana framework ([\\d.]+)\\;version:\\1" }, "implies": [ "PHP" ], "website": "https://kohanaframework.org", "cpe": "cpe:2.3:a:kohanaframework:kohana:*:*:*:*:*:*:*:*" }, "Koken": { "cats": [ 1 ], "cookies": { "koken_referrer": "" }, "html": [ "\u003c!--\\s+koken debugging", "\u003chtml lang=\"en\" class=\"k-source-essays k-lens-essays\"\u003e" ], "scriptSrc": [ "koken(?:\\.js\\?([\\d.]+)|/storage)\\;version:\\1" ], "meta": { "generator": [ "koken ([\\d.]+)\\;version:\\1" ] }, "implies": [ "MySQL", "PHP" ], "website": "https://koken.me" }, "Komodo CMS": { "cats": [ 1 ], "meta": { "generator": [ "^komodo cms" ] }, "implies": [ "PHP" ], "website": "https://www.komodocms.com" }, "Konduto": { "cats": [ 16 ], "js": [ "getkondutoid", "konduto" ], "scriptSrc": [ "\\.k-analytix\\.com" ], "description": "Konduto is a fraud detection service for ecommerce.", "website": "https://www.konduto.com" }, "Kong": { "cats": [ 64 ], "headers": { "via": "^kong/([\\d\\.]+)(?:.+)?$\\;version:\\1" }, "description": "Kong is an open-source API gateway and platform that acts as middleware between compute clients and the API-centric applications.", "website": "https://konghq.com" }, "Kontent.ai": { "cats": [ 1 ], "headers": { "content-security-policy": "\\.kc-usercontent\\.com" }, "description": "Kontent.ai is a SaaS-based modular content platform.", "website": "https://kontent.ai" }, "Koobi": { "cats": [ 1 ], "html": [ "\u003c!--[^k\u003e-]+koobi ([a-z\\d.]+)\\;version:\\1" ], "meta": { "generator": [ "koobi" ] }, "website": "https://dream4.de/cms" }, "Kooboo CMS": { "cats": [ 1 ], "headers": { "x-kooboocms-version": "^(.+)$\\;version:\\1" }, "scriptSrc": [ "/kooboo" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://kooboo.com" }, "Kooomo": { "cats": [ 6 ], "meta": { "generator": [ "kooomo(?: v([\\d.]+))?\\;version:\\1" ] }, "implies": [ "MySQL", "PHP" ], "description": "Kooomo is a SaaS ecommerce platform with a focus on localisation and internationalisation.", "website": "https://www.kooomo.com" }, "Kotisivukone": { "cats": [ 1 ], "scriptSrc": [ "kotisivukone(?:\\.min)?\\.js" ], "website": "https://www.kotisivukone.fi" }, "Kotlin": { "cats": [ 27 ], "description": "Kotlin is a general purpose, free, open-source, statically typed “pragmatic” programming language initially designed for the JVM (Java Virtual Machine) and Android that combines object-oriented and functional programming features.", "website": "https://kotlinlang.org", "cpe": "cpe:2.3:a:jetbrains:kotlin:*:*:*:*:*:*:*:*" }, "Kount": { "cats": [ 10, 16 ], "js": [ "ka.clientsdk", "ka.collectdata" ], "scriptSrc": [ "shopify\\.kount\\.net/js" ], "description": "Kount is a suite of fraud detection and prevention solutions for ecommerce businesses.", "website": "https://kount.com" }, "Ktor": { "cats": [ 18 ], "headers": { "server": "^ktor/debug$", "x-engine": "^ktor$" }, "implies": [ "Kotlin" ], "description": "Ktor is a Kotlin framework that allow developers to write asynchronous clients and servers applications, in Kotlin.", "website": "https://ktor.io", "cpe": "cpe:2.3:a:jetbrains:ktor:*:*:*:*:*:*:*:*" }, "Kubernetes Dashboard": { "cats": [ 47 ], "website": "https://kubernetes.io/", "cpe": "cpe:2.3:a:kubernetes:kubernetes:*:*:*:*:*:*:*:*" }, "Kudobuzz": { "cats": [ 90 ], "js": [ "kudos.apiserver" ], "implies": [ "Svelte" ], "description": "Kudobuzz is a tool for collecting and managing customer reviews.", "website": "https://kudobuzz.com/" }, "KueskiPay": { "cats": [ 41, 91 ], "js": [ "kueskypushhead" ], "scriptSrc": [ "cdn\\.kueskipay\\.com" ], "implies": [ "Cart Functionality" ], "description": "KueskiPay is a buy-now-pay-later solution.", "website": "https://kueskipay.com/" }, "Kustomer": { "cats": [ 52, 53 ], "js": [ "kustomer" ], "scriptSrc": [ "cdn\\.kustomerapp\\.com" ], "description": "Kustomer is a CRM platform.", "website": "https://www.kustomer.com/" }, "Kwai pixel": { "cats": [ 10 ], "js": [ "kwaianalyticsobject", "kwaiq" ], "description": "Kwai is a social network for short videos and trends.", "website": "https://www.kwai.com" }, "LEPTON": { "cats": [ 1 ], "meta": { "generator": [ "lepton" ] }, "implies": [ "PHP" ], "website": "https://www.lepton-cms.org", "cpe": "cpe:2.3:a:lepton-cms:lepton:*:*:*:*:*:*:*:*" }, "LGC": { "cats": [ 1 ], "meta": { "generator": [ "^lgc$" ] }, "description": "LGC is a modern CMS designed to improve the management of your website.", "website": "https://luigigabrieleconti.com" }, "LINE Login": { "cats": [ 69 ], "js": [ "constants.authorization_request_url" ], "description": "LINE Login is an API that allows you to implement a login function into your services, regardless of whether they are web apps or native apps.", "website": "https://developers.line.biz/en/services/line-login/" }, "LKQD": { "cats": [ 36 ], "js": [ "lkqd_http_response", "lkqdcall", "lkqderrorcount", "lkqdsettings" ], "scriptSrc": [ "\\.lkqd\\.net" ], "description": "LKQD is a video advertising platform that enables publishers to serve video ads across multiple devices and formats.", "website": "https://wiki.lkqd.com" }, "LOU": { "cats": [ 58 ], "scriptSrc": [ "cdn\\.louassist\\.com*" ], "description": "LOU is a Digital Adoption Platform that streamlines user onboarding and training.", "website": "https://www.louassist.com" }, "Lagoon": { "cats": [ 62 ], "headers": { "x-lagoon": "" }, "description": "The Open Source Application Delivery Platform for Kubernetes.", "website": "https://lagoon.sh/" }, "Landbot": { "cats": [ 52 ], "js": [ "initlandbot", "landbotlivechat" ], "scriptSrc": [ "\\.landbot\\.io/.*-([\\d\\.]+)\\.js" ], "description": "Landbot is a no code conversational chatbots, conversational landing pages and website, interactive survey and lead generation bot.", "website": "https://landbot.io" }, "LandingPress": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/landingpress-wp/.+script\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "LandingPress is a WordPress theme.", "website": "https://landingpress.net" }, "LangShop": { "cats": [ 100, 89 ], "js": [ "langshop", "langshopconfig", "langshopsdk" ], "scriptSrc": [ "\\.langshop\\.app/" ], "implies": [ "Shopify" ], "description": "LangShop is an app for translating Shopify stores.", "website": "https://langshop.io" }, "Laravel": { "cats": [ 18 ], "cookies": { "laravel_session": "" }, "js": [ "laravel" ], "implies": [ "PHP" ], "description": "Laravel is a free, open-source PHP web framework.", "website": "https://laravel.com", "cpe": "cpe:2.3:a:laravel:laravel:*:*:*:*:*:*:*:*" }, "Laravel Echo": { "cats": [ 59 ], "js": [ "echo.connector", "echo.connector" ], "implies": [ "Laravel" ], "description": "Laravel Echo is a JavaScript library that makes it painless to subscribe to channels and listen for events broadcast by Laravel.", "website": "https://laravel.com/docs/broadcasting#client-side-installation" }, "Laterpay": { "cats": [ 41, 91 ], "scriptSrc": [ "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-za-z-]*/live/[\\w-]+\\.js\\;version:\\1" ], "meta": { "laterpay:connector:callbacks:on_user_has_access": [ "deobfuscatetext" ] }, "description": "Laterpay is a service that simplifies payments on the Internet. In addition to the classic immediate purchase option, Laterpay also allows you to buy digital content such as articles or videos now and pay later.", "website": "https://www.laterpay.net/" }, "LatitudePay": { "cats": [ 91 ], "js": [ "checkout.enabledpayments.latitudepay", "wc_ga_pro.available_gateways.latitudepay" ], "scriptSrc": [ "\\.latitudepayapps\\.com/" ], "description": "LatitudePay is an interest-free, buy now, pay later solution.", "website": "https://www.latitudepay.com" }, "LaunchDarkly": { "cats": [ 85 ], "js": [ "ddc.ws.state", "launchdarkly" ], "scriptSrc": [ "(?:\\.|\\-)launchdarkly(?:\\.com/|\\-sdk\\.)" ], "description": "LaunchDarkly is a continuous delivery and feature flags as a service platform that integrates into a company's current development cycle.", "website": "https://launchdarkly.com" }, "Launchrock": { "cats": [ 51, 75 ], "js": [ "lrignition", "lrignition", "lrloadedjs", "lrsiterenderingdata.apiendpoint", "lrsitesettingasboolean" ], "scriptSrc": [ "builder\\.launchrock\\.com" ], "description": "Launchrock is an online tool designed to help capture email addresses and create online product launching events.", "website": "https://www.launchrock.com" }, "LayBuy": { "cats": [ 91 ], "js": [ "checkout.enabledpayments.laybuy", "laybuyenablecart", "laybuyhelper", "laybuymoneyoverides", "wc_ga_pro.available_gateways.laybuy" ], "scriptSrc": [ "/wp-content/plugins/woo-laybuy/", "\\.laybuy\\.com/" ], "description": "Laybuy is a payment service that lets you receive your purchase now and spread the total cost over 6 weekly automatic payments interest free.", "website": "https://www.laybuy.com" }, "LayoutHub": { "cats": [ 100, 51 ], "scriptSrc": [ "app\\.layouthub\\.com/shopify/layouthub\\.js" ], "implies": [ "Shopify" ], "description": "LayoutHub is an easy page builder that helps merchants quickly set up an online store with any kind of page type by using our library of pre-designed layouts and blocks.", "website": "https://layouthub.com" }, "Layui": { "cats": [ 66 ], "js": [ "layui.v" ], "description": "Layui is an open-source modular front-end UI component library.", "website": "https://layui.gitee.io" }, "Lazada": { "cats": [ 6 ], "meta": { "aplus-auto-exp": [ "lzdhome\\.desktop\\." ] }, "description": "Lazada is a B2B2C marketplace model in which so-called merchants sell goods on their platform.", "website": "https://www.lazada.com" }, "LazySizes": { "cats": [ 59, 92 ], "js": [ "lazysizes", "lazysizesconfig" ], "description": "LazySizes is a JavaScript library used to delay the loading of images (iframes, scripts, etc) until they come into view.", "website": "https://github.com/aFarkas/lazysizes" }, "LazySizes unveilhooks plugin": { "cats": [ 59, 92 ], "scriptSrc": [ "ls\\.unveilhooks(?:\\.min)?\\.js" ], "description": "LazySizes unveilhooks plugin extends lazySizes to lazyload scripts/widgets, background images, styles and video/audio elements.", "website": "https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/unveilhooks" }, "LeadChat": { "cats": [ 53 ], "scriptSrc": [ "(?://|\\.)chatsystem\\.io/" ], "description": "LeadChat offers live-operators and CRM solutions that utilise LiveChat chat software to facilitate real-time engagement with website visitors for businesses.", "website": "https://www.leadchat.com" }, "Leadfeeder": { "cats": [ 10 ], "js": [ "ldfdr.gettracker" ], "headers": { "content-security-policy": "\\.(?:lfeeder|leadfeeder)\\.com" }, "scriptSrc": [ "\\.leadfeeder\\.com/" ], "description": "Leadfeeder is a B2B visitor identification software that tracks and identifies companies that visit your website.", "website": "https://www.leadfeeder.com" }, "Leadinfo": { "cats": [ 10 ], "js": [ "globalleadinfonamespace", "leadinfo" ], "scriptSrc": [ "cdn\\.leadinfo\\.net" ], "description": "Leadinfo is a lead generation software that enables you to recognise B2B website visitors.", "website": "https://www.leadinfo.com" }, "Leadster": { "cats": [ 52 ], "js": [ "neurolead.convoscript", "neurolead.elchatbot", "neuroleadlanguage" ], "description": "Leadster is a conversation marketing plataform based on chatbot.", "website": "https://leadster.com.br" }, "Leaflet": { "cats": [ 35 ], "js": [ "l.distancegrid", "l.posanimation", "l.version" ], "scriptSrc": [ "leaflet.{0,32}\\.js(?!.+shopify)" ], "description": "Leaflet is the open-source JavaScript library for mobile-friendly interactive maps.", "website": "https://leafletjs.com" }, "Leaflet platform": { "cats": [ 100, 74 ], "scriptSrc": [ "scripts\\.leaflet\\.co/" ], "implies": [ "Shopify" ], "description": "Leaflet is the price testing platform for Shopify.", "website": "https://join.leaflet.co" }, "Leanplum": { "cats": [ 32, 74 ], "js": [ "leanplum" ], "scriptSrc": [ "npm/leanplum-sdk\\@([\\d.]+)\\;version:\\1" ], "description": "Leanplum is a multi-channel messaging and campaign orchestration platform.", "website": "https://www.leanplum.com" }, "LearnDash": { "cats": [ 21, 87 ], "description": "LearnDash is a WordPress plugin that enables the creation and management of online courses, quizzes, and educational content within a website.", "website": "https://www.learndash.com" }, "LearnWorlds": { "cats": [ 21 ], "js": [ "lwclient.ebooks", "lwsettings.deactive_components" ], "scriptSrc": [ "cdn\\.mycourse\\.app/v([\\d\\.]+)/\\;version:\\1" ], "description": "LearnWorlds is a powerful yet lightweight, user-friendly, white-labeled cloud-based LMS ideal for versatile employee training.", "website": "https://www.learnworlds.com" }, "Leaseweb": { "cats": [ 63, 88 ], "description": "Leaseweb is an Infrastructure-as-a-Service (IaaS) provider offering dedicated servers, CDN, cloud hosting and hybrid cloud on a global network.", "website": "https://www.leaseweb.com" }, "Lede": { "cats": [ 1 ], "js": [ "ledechartbeatviews", "ledeengagement", "ledeengagementreset" ], "html": [ "\u003ca [^\u003e]*href=\"[^\"]+joinlede.com" ], "meta": { "og:image": [ "https?\\:\\/\\/lede-admin" ] }, "implies": [ "WordPress", "WordPress VIP" ], "description": "Lede is a publishing platform and growth program designed to support journalism startups and news media.", "website": "https://joinlede.com/" }, "Legal Monster": { "cats": [ 67 ], "js": [ "legal.__version__" ], "scriptSrc": [ "\\.legalmonster\\.com/" ], "description": "Legal Monster is a consent and privacy management solution, which helps businesses maintain compliance with ePrivacy, marketing requirements and General Data Protection Regulation (GDPR).", "website": "https://www.legalmonster.com" }, "Lemon Squeezy": { "cats": [ 41 ], "js": [ "lemonsqueezy", "lemonsqueezyaffiliateconfig" ], "description": "Lemon Squeezy is a platform designed for SaaS businesses, providing functionalities such as payment processing, subscription management, global tax compliance, fraud prevention, multi-currency support, failed payment recovery, and integration with PayPal, with the aim of facilitating the operational management of software businesses.", "website": "https://www.lemonsqueezy.com" }, "Lengow": { "cats": [ 19 ], "scriptSrc": [ "\\.lengow\\.com/" ], "description": "Lengow is an ecommerce automation solution that enables brands and retailers to integrate, structure and optimise their product content across all distribution channels: marketplaces, comparison shopping engines, affiliate platforms, display and retargeting.", "website": "https://www.lengow.com" }, "Lenis": { "cats": [ 59 ], "js": [ "lenisversion" ], "description": "Lenis is a smooth scroll library to normalise the scrolling experience across devices.", "website": "https://lenis.studiofreight.com" }, "Leptos": { "cats": [ 18 ], "js": [ "__leptos_pending_resources", "__leptos_resolved_resources", "__leptos_resource_resolvers" ], "html": [ "\u003c!--hk=_.*" ], "scripts": [ "export function microtask\\(f\\)\\;confidence:75" ], "implies": [ "Rust" ], "description": "Leptos is a full-stack, isomorphic Rust web framework leveraging fine-grained reactivity to build declarative user interfaces.", "website": "https://leptos.dev" }, "Less": { "cats": [ 19 ], "html": [ "\u003clink[^\u003e]+ rel=\"stylesheet/less\"" ], "website": "https://lesscss.org" }, "Let's Encrypt": { "cats": [ 70 ], "description": "Let's Encrypt is a free, automated, and open certificate authority.", "website": "https://letsencrypt.org/" }, "Letro": { "cats": [ 90, 96 ], "js": [ "__letrougcgadget", "letrougcset" ], "scriptSrc": [ "letro\\.jp/tags" ], "description": "Letro is a UGC and review tool for ecommerce platforms.", "website": "https://service.aainc.co.jp/product/letro/" }, "Levar": { "cats": [ 105 ], "js": [ "levar.session_info", "levar_onload_variant_id", "levaractivationhelper" ], "description": "Levar specialises in 3D visualisation technology for ecommerce stores.", "website": "https://levar.io" }, "Level 5": { "cats": [ 51 ], "js": [ "l5_inventory_url" ], "description": "Level 5 is a page builder constructed with WordPress and powered with WP Engine hosting featuring advanced caching and performance optimisation.", "website": "https://level5advertising.com/websites/" }, "Lever": { "cats": [ 101 ], "headers": { "content-security-policy": "\\.lever\\.co" }, "description": "Lever is a software company headquartered in San Francisco, California and Toronto, Canada that provides an applicant tracking system for hiring.", "website": "https://www.lever.co" }, "Lexity": { "cats": [ 10 ], "scriptSrc": [ "\\.lexity\\.com/" ], "description": "Lexity is the one-stop-shop of ecommerce services for SMBs.", "website": "https://lexity.com" }, "Liberapay": { "cats": [ 41 ], "scriptSrc": [ "//liberapay\\.com/" ], "description": "Liberapay is a non-profit organisation subscription payment platform.", "website": "https://liberapay.com/" }, "Libravatar": { "cats": [ 19 ], "description": "Libravatar is a service for fetching avatar images for e-mail addresses and OpenIDs in a privacy respecting way.", "website": "https://www.libravatar.org/" }, "Lieferando": { "cats": [ 1, 93 ], "js": [ "tealium.pagedata.country" ], "description": "Lieferando is an online portal for food orders.", "website": "https://www.lieferando.de" }, "Liferay": { "cats": [ 1 ], "js": [ "liferay" ], "headers": { "liferay-portal": "[a-z\\s]+([\\d.]+)\\;version:\\1" }, "implies": [ "Java" ], "description": "Liferay is an open-source company that provides free documentation and paid professional service to users of its software.", "website": "https://www.liferay.com/", "cpe": "cpe:2.3:a:liferay:liferay_portal:*:*:*:*:*:*:*:*" }, "Lift": { "cats": [ 18 ], "headers": { "x-lift-version": "(.+)\\;version:\\1" }, "implies": [ "Scala" ], "website": "https://liftweb.net", "cpe": "cpe:2.3:a:liftweb:lift:*:*:*:*:*:*:*:*" }, "LightMon Engine": { "cats": [ 1 ], "cookies": { "lm_online": "" }, "html": [ "\u003c!-- lightmon engine copyright lightmon" ], "meta": { "generator": [ "lightmon engine" ] }, "implies": [ "PHP" ], "website": "https://lightmon.ru" }, "Lightbox": { "cats": [ 59 ], "js": [ "lightbox.$lightbox", "lightbox.activeimage" ], "scriptSrc": [ "lightbox(?:-plus-jquery)?.{0,32}\\.js" ], "description": "Lightbox is small javascript library used to overlay images on top of the current page.", "website": "https://lokeshdhakar.com/projects/lightbox2/", "cpe": "cpe:2.3:a:lightbox_photo_gallery_project:lightbox_photo_gallery:*:*:*:*:*:*:*:*" }, "Lightning": { "cats": [ 80 ], "js": [ "lightningopt.header_scrool" ], "scriptSrc": [ "/wp-content/themes/lightning(?:-pro)?/.+lightning\\.min\\.js(?:.+ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Lightning is a very simple and easy to customize WordPress theme which is based on the Bootstrap.", "website": "https://lightning.vektor-inc.co.jp/en/" }, "Lightspeed eCom": { "cats": [ 6 ], "html": [ "\u003c!-- \\[start\\] 'blocks/head\\.rain' --\u003e" ], "scriptSrc": [ "http://assets\\.webshopapp\\.com" ], "website": "https://www.lightspeedhq.com/products/ecommerce/" }, "LimeChat": { "cats": [ 52 ], "scriptSrc": [ "\\.limechat\\.ai/" ], "description": "LimeChat is India's first level-3 AI chatbot company.", "website": "https://www.limechat.ai" }, "LimeSpot": { "cats": [ 76 ], "js": [ "limespot.cartitems", "limespot.recommendations" ], "scriptSrc": [ "\\.personalizer\\.io/" ], "description": "LimeSpot is an AI-powered personalisation platform for marketers and ecommerce professionals.", "website": "https://www.limespot.com" }, "Limepay": { "cats": [ 91 ], "js": [ "limepayidentity", "wc_ga_pro.available_gateways.limepay" ], "scriptSrc": [ "/limepay-installment-show\\.js", "/wp-content/plugins/limepay-v\\d+/" ], "description": "Limepay is a buy now, pay later platform that's fully integrated with the merchant's payment platform.", "website": "https://www.limepay.com.au" }, "Limit Login Attempts Reloaded": { "cats": [ 87, 16 ], "description": "Limit Login Attempts Reloaded stops brute-force attacks and optimizes your site performance by limiting the number of login attempts that are possible through the normal login as well as XMLRPC, Woocommerce and custom login pages.", "website": "https://www.limitloginattempts.com" }, "Linen": { "cats": [ 2 ], "js": [ "__next_data__.props.pageprops.currentcommunity.logourl" ], "implies": [ "Elixir", "TypeScript" ], "description": "Linen is a real-time chat platform built for communities.", "website": "https://www.linen.dev" }, "LinkMink": { "cats": [ 10, 71 ], "js": [ "linkmink" ], "scriptSrc": [ "cdn\\.linkmink\\.com/lm-js/([\\d\\.]+)/\\;version:\\1" ], "description": "LinkMink is an affiliate tracking and management for SaaS companies.", "website": "https://linkmink.com" }, "Linkedin Ads": { "cats": [ 36 ], "headers": { "content-security-policy": "px\\.ads\\.linkedin\\.com" }, "html": [ "\u003cimg [^\u003e]*src=\"[^/]*//[^/]*px\\.ads\\.linkedin\\.com" ], "description": "Linkedin Ads is a paid marketing tool that offers access to Linkedin social networks through various sponsored posts and other methods.", "website": "https://business.linkedin.com/marketing-solutions/ads" }, "Linkedin Insight Tag": { "cats": [ 10 ], "js": [ "_linkedin_data_partner_id", "_linkedin_partner_id", "oribi" ], "scripts": [ "_linkedin_partner_id" ], "scriptSrc": [ "cdn\\.oribi\\.io", "snap\\.licdn\\.com/li\\.lms-analytics/insight\\.min\\.js" ], "description": "LinkedIn Insight Tag is a lightweight JavaScript tag that powers conversion tracking, website audiences, and website demographics.", "website": "https://business.linkedin.com/marketing-solutions/insight-tag" }, "Linkedin Sign-in": { "cats": [ 69 ], "js": [ "onlinkedinauth", "onlinkedinload" ], "scriptSrc": [ "platform\\.linkedin\\.com/(?:.*)?in\\.js(?:\\?version)?([\\d.]+)?\\;version:\\1" ], "description": "Linkedin Sign-In is an authentication system that reduces the burden of login for users, by enabling them to sign in with their Linkedin account.", "website": "https://www.linkedin.com/developers" }, "Linx Commerce": { "cats": [ 6 ], "js": [ "ezgacfg.config.store", "ezgacfg.shopper", "linximpulse.config.integrationflags.platformprovider" ], "description": "Linx Commerce is an ecommerce platform, which provides seamless and personalised cross-channel solution that enables a true omni-channel shopping experience.", "website": "https://www.linx.com.br/linx-commerce" }, "Linx Impulse": { "cats": [ 77, 76 ], "js": [ "linx.banner", "linximpulse.config", "linximpulseinitialized" ], "description": "Linx Impulse is a personalisation, media and retargeting solutions built by Linx.", "website": "https://www.linx.com.br/linx-impulse" }, "Liquid Web": { "cats": [ 62, 88 ], "headers": { "x-lw-cache": "" }, "description": "Liquid Web is a US-based host offering premium managed web hosting solutions.", "website": "https://www.liquidweb.com" }, "List.js": { "cats": [ 59 ], "js": [ "list" ], "scriptSrc": [ "@([\\d.]+)/(?:/dist)?list\\.(?:min\\.)?js\\;version:\\1", "list\\.js/\\;confidence:50" ], "website": "https://listjs.com" }, "Listrak": { "cats": [ 32, 97 ], "js": [ "_ltksignup", "_ltksubscriber" ], "scriptSrc": [ "(?:cdn|s1)\\.listrakbi\\.com", "services\\.listrak\\.com" ], "description": "Listrak is a AI-based marketing automation and CRM solutions that unify, interpret and personalise data to engage customer across channels and devices.", "website": "https://www.listrak.com" }, "LiteSpeed": { "cats": [ 22 ], "headers": { "server": "^litespeed$" }, "description": "LiteSpeed is a high-scalability web server.", "website": "https://litespeedtech.com", "cpe": "cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*" }, "Litespeed Cache": { "cats": [ 23, 87 ], "headers": { "x-litespeed-cache": "", "x-turbo-charged-by": "litespeed" }, "description": "LiteSpeed Cache is an all-in-one site acceleration plugin for WordPress.", "website": "https://wordpress.org/plugins/litespeed-cache/" }, "Lithium": { "cats": [ 1 ], "cookies": { "lithiumvisitor": "" }, "js": [ "lithium" ], "html": [ " \u003ca [^\u003e]+powered by lithium" ], "implies": [ "PHP" ], "website": "https://www.lithium.com" }, "Littledata": { "cats": [ 100 ], "js": [ "littledatalayer", "littledatalayer.version" ], "implies": [ "Shopify" ], "description": "Littledata provides a seamless connection between your Shopify site, marketing channels, and Google Analytics.", "website": "https://www.littledata.io" }, "Live Story": { "cats": [ 1 ], "js": [ "livestory", "lshelpers" ], "website": "https://www.livestory.nyc/" }, "LiveAgent": { "cats": [ 52 ], "js": [ "liveagent" ], "description": "LiveAgent is an online live chat platform. The software provides a ticket management system.", "website": "https://www.liveagent.com" }, "LiveCanvas": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/livecanvas/" ], "implies": [ "Bootstrap" ], "description": "LiveCanvas is a Bootstrap 5 WordPress page builder.", "website": "https://livecanvas.com" }, "LiveChat": { "cats": [ 52 ], "js": [ "livechatwidget" ], "scriptSrc": [ "cdn\\.livechatinc\\.com/.*tracking\\.js" ], "description": "LiveChat is an online customer service software with online chat, help desk software, and web analytics capabilities.", "website": "https://www.livechat.com/" }, "LiveHelp": { "cats": [ 52, 53 ], "js": [ "lhready" ], "description": "LiveHelp is an online chat tool.", "website": "https://www.livehelp.it" }, "LiveIntent": { "cats": [ 75, 36 ], "js": [ "li.advertiserid" ], "scriptSrc": [ "\\.liadm\\.com" ], "description": "LiveIntent is an email ad monetization platform.", "website": "https://www.liveintent.com" }, "LiveJournal": { "cats": [ 11 ], "description": "LiveJournal is a social networking service where users can keep a blog, journal or diary.", "website": "https://www.livejournal.com" }, "LivePerson": { "cats": [ 52 ], "js": [ "lptag.chronos" ], "scriptSrc": [ "\\.(?:liveperson|contactatonce)?\\.(?:com|net|co\\.uk)/" ], "description": "LivePerson is a tool for conversational chatbots and messaging.", "website": "https://www.liveperson.com" }, "LiveRamp DPM": { "cats": [ 36 ], "js": [ "dpmcomscorevars" ], "scriptSrc": [ "c\\.tvpixel\\.com/js/current/dpm_pixel_min\\.js" ], "description": "LiveRamp DPM is a TV advertising metrics and analytics platform.", "website": "https://liveramp.com/data-plus-math" }, "LiveRamp PCM": { "cats": [ 67 ], "js": [ "wpjsonpliverampgdprcmp" ], "scriptSrc": [ "gdpr\\.privacymanager\\.io" ], "description": "LiveRamp PCM is a preference and consent management platform that enables comply with the ePrivacy Directive, GDPR, CCPA, and other data protection and privacy laws and regulations.", "website": "https://liveramp.com/our-platform/preference-consent-management" }, "LiveSession": { "cats": [ 10 ], "scriptSrc": [ "cdn\\.livesession\\.io" ], "description": "LiveSession helps increase conversion rates using session replays, and event-based product analytics.", "website": "https://livesession.io/" }, "LiveStreet CMS": { "cats": [ 1 ], "js": [ "livestreet_security_key" ], "headers": { "x-powered-by": "livestreet cms" }, "implies": [ "PHP" ], "website": "https://livestreetcms.com" }, "LiveZilla": { "cats": [ 52 ], "js": [ "lz_chat_execute", "lz_code_id", "lz_tracking_set_widget_visibility" ], "description": "LiveZilla is a web-based live support platform.", "website": "https://www.livezilla.net" }, "Livefyre": { "cats": [ 15 ], "js": [ "fyre", "fyreloader", "l.version", "lf.commentcount" ], "html": [ "\u003c[^\u003e]+(?:id|class)=\"livefyre" ], "scriptSrc": [ "livefyre_init\\.js" ], "description": "Livefyre is a platform that integrates with the social web to boost social interaction.", "website": "https://livefyre.com" }, "Liveinternet": { "cats": [ 10 ], "html": [ "\u003c!--/liveinternet--\u003e", "\u003c!--liveinternet counter--\u003e", "\u003ca href=\"http://www\\.liveinternet\\.ru/click\"", "\u003cscript [^\u003e]*\u003e[\\s\\s]*//counter\\.yadro\\.ru/hit" ], "website": "https://liveinternet.ru/rating/" }, "Livescale": { "cats": [ 100, 103 ], "scriptSrc": [ "\\.livescale\\.tv/" ], "implies": [ "Shopify" ], "description": "Livescale is a video platform that enables teams to transform content and ecommerce into a live shopping experience that reaches engages and monetizes audiences with LiveShopping.", "website": "https://www.livescale.tv" }, "Livewire": { "cats": [ 18, 19 ], "js": [ "livewire" ], "html": [ "\u003c[^\u003e]{1,512}\\bwire:" ], "scriptSrc": [ "livewire(?:\\.min)?\\.js" ], "implies": [ "Laravel" ], "description": "Livewire is a full-stack Laravel framework for building dynamic interfaces.", "website": "https://laravel-livewire.com" }, "LlamaLink Cloud Server": { "cats": [ 22 ], "headers": { "server": "^llamalink" }, "implies": [ "Nginx" ], "description": "LlamaLink Cloud Server is a custom dynamic web server based on Nginx Web server that load balance user traffic between hosting nodes and allows fast and cached experience to web and app users.", "website": "https://llamalink.net" }, "Loadable-Components": { "cats": [ 59 ], "js": [ "__loadable_loaded_chunks__" ], "description": "Loadable-Components is a library to solve the React code-splitting client-side and server-side.", "website": "https://github.com/gregberge/loadable-components" }, "Loadify": { "cats": [ 92, 100 ], "scriptSrc": [ "\\.loadifyapp\\.ninety9\\.dev" ], "implies": [ "Shopify" ], "description": "Loadify is a shopify app which helps merchants deploy performance techniques like loading screen, transitions \u0026 lazy Load.", "website": "https://apps.shopify.com/loadify" }, "LocalFocus": { "cats": [ 25 ], "html": [ "\u003ciframe[^\u003e]+\\blocalfocus\\b" ], "implies": [ "Angular", "D3" ], "website": "https://www.localfocus.nl/en/" }, "Localised": { "cats": [ 106 ], "description": "Localised is local-first ecommerce platform.", "website": "https://www.localised.com" }, "Locksmith": { "cats": [ 100 ], "js": [ "locksmith" ], "implies": [ "Shopify" ], "description": "Locksmith is a shopify app for adding access control capability on shopify stores.", "website": "https://apps.shopify.com/locksmith" }, "LocomotiveCMS": { "cats": [ 1 ], "html": [ "\u003clink[^\u003e]*/sites/[a-z\\d]{24}/theme/stylesheets" ], "implies": [ "MongoDB", "Ruby on Rails" ], "website": "https://www.locomotivecms.com" }, "Lodash": { "cats": [ 59 ], "js": [ "_.differenceby", "_.templatesettings.imports._.templatesettings.imports._.version", "_.version" ], "scriptSrc": [ "lodash.*\\.js" ], "description": "Lodash is a JavaScript library which provides utility functions for common programming tasks using the functional programming paradigm.", "website": "https://www.lodash.com", "cpe": "cpe:2.3:a:lodash:lodash:*:*:*:*:*:*:*:*" }, "LogRocket": { "cats": [ 10 ], "js": [ "logrocket._buffer" ], "scriptSrc": [ "cdn\\.(?:lr-ingest|logrocket)\\.(?:com|io)" ], "description": "LogRocket is a logging and session replay platform that helps developers identify and troubleshoot issues in web applications by recording and replaying user sessions, along with capturing logs and user interactions in real-time.", "website": "https://logrocket.com" }, "Loggly": { "cats": [ 10 ], "js": [ "logglytracker" ], "scriptSrc": [ "\\.loggly\\.com/" ], "description": "Loggly is a cloud-based log management service provider.", "website": "https://www.loggly.com" }, "LogiCommerce": { "cats": [ 6 ], "js": [ "logicommerceglobal" ], "meta": { "generator": [ "^logicommerce$" ], "logicommerce": [] }, "description": "LogiCommerce is the headless ecommerce platform.", "website": "https://www.logicommerce.com" }, "Login with Amazon": { "cats": [ 69 ], "js": [ "onamazonloginready" ], "description": "Login with Amazon allows you use your Amazon user name and password to sign into and share information with participating third-party websites or apps.", "website": "https://developer.amazon.com/apps-and-games/login-with-amazon" }, "LoginRadius": { "cats": [ 69 ], "js": [ "loginradius", "loginradiusdefaults", "loginradiussdk", "loginradiusutility" ], "scriptSrc": [ "\\.loginradius\\.com", "\\.lrcontent\\.com" ], "description": "LoginRadius is a cloud based SaaS Customer Identity Access Management platform based in Canada.", "website": "https://www.loginradius.com" }, "Loglib": { "cats": [ 10 ], "js": [ "llc", "lli" ], "description": "Loglib is a Open Source and Privacy-First web analytics that aims to provide simple yet can be powerful based on your needs.", "website": "https://www.loglib.io" }, "LogoiX": { "cats": [ 99 ], "description": "LogoiX is a German shipping company.", "website": "https://www.logoix.com" }, "Loja Integrada": { "cats": [ 6 ], "js": [ "loja_id" ], "headers": { "x-powered-by": "vtex-integrated-store" }, "website": "https://lojaintegrada.com.br/" }, "Loja Mestre": { "cats": [ 6 ], "scriptSrc": [ "lojamestre\\.\\w+\\.br" ], "meta": { "webmaster": [ "www\\.lojamestre\\.\\w+\\.br" ] }, "description": "Loja Mestre is an all-in-one ecommerce platform from Brazil.", "website": "https://www.lojamestre.com.br/" }, "Loja Virtual": { "cats": [ 6 ], "js": [ "id_loja_virtual", "link_loja_virtual", "loja_sem_dominio" ], "scriptSrc": [ "/js/ljvt_v(\\d+)/\\;version:\\1\\;confidence:20", "cdn1\\.solojavirtual\\.com" ], "description": "Loja Virtual is an all-in-one ecommerce platform from Brazil.", "website": "https://www.lojavirtual.com.br" }, "Loja2": { "cats": [ 6 ], "scriptSrc": [ "loja2\\.com\\.br" ], "description": "Loja2 is an all-in-one ecommerce platform from Brazil.", "website": "https://www.loja2.com.br" }, "Loom": { "cats": [ 103 ], "website": "https://www.loom.com" }, "Loop Returns": { "cats": [ 102 ], "js": [ "loop.config.variantparam", "looponstore" ], "description": "Loop Returns is a return portal that automated all the returns and refunds of products.", "website": "https://www.loopreturns.com" }, "Loop54": { "cats": [ 29, 76 ], "cookies": { "loop54user": "" }, "js": [ "loop54.config.libversion" ], "description": "Loop54 is a ecommerce search and navigation SaaS product.", "website": "https://www.loop54.com" }, "Lootly": { "cats": [ 84, 94 ], "js": [ "lootly.config", "lootlywidgetinit" ], "scriptSrc": [ "lootly\\.io/" ], "description": "Lootly is a loyalty and referral marketing automation software suite for ecommerce businesses.", "website": "https://lootly.io" }, "Loox": { "cats": [ 90 ], "js": [ "loox_global_hash" ], "scriptSrc": [ "loox\\.io/widget" ], "description": "Loox is a reviews app for Shopify that helps you gather reviews and user-generated photos from your customers.", "website": "https://loox.app" }, "Loqate": { "cats": [ 19 ], "js": [ "loqateaccountcode", "pca.platform.productlist" ], "description": "Loqate is an address verification solution.", "website": "https://www.loqate.com" }, "LottieFiles": { "cats": [ 19 ], "js": [ "lottie.version" ], "scriptSrc": [ "/dist/lottie-player\\.js", "/dist/tgs-player\\.js" ], "description": "LottieFiles is an open-source animation file format that's tiny, high quality, interactive, and can be manipulated at runtime.", "website": "https://lottiefiles.com" }, "LoyaltyLion": { "cats": [ 84 ], "js": [ "loyaltylion.version" ], "scriptSrc": [ "sdk\\.loyaltylion\\.net/" ], "description": "LoyaltyLion is a data-driven ecommerce loyalty and engagement platform.", "website": "https://loyaltylion.com" }, "Lozad.js": { "cats": [ 59, 92 ], "js": [ "lozad" ], "scripts": [ "/lozad\\.min\\.js" ], "description": "Lozad.js is a lightweight lazy-loading library that's just 535 bytes minified \u0026 gzipped.", "website": "https://apoorv.pro/lozad.js/" }, "Lua": { "cats": [ 27 ], "headers": { "x-powered-by": "\\blua(?: ([\\d.]+))?\\;version:\\1" }, "description": "Lua is a multi-paradigm programming language designed primarily for embedded use in applications.", "website": "https://www.lua.org", "cpe": "cpe:2.3:a:lua:lua:*:*:*:*:*:*:*:*" }, "Luana": { "cats": [ 18 ], "js": [ "luanaframework" ], "meta": { "generator": [ "^luana\\sframework\\s([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "PWA" ], "description": "Luana is a web framework that uses web browser APIs and features to make a cross-platform web app look like a Native one and bring the same experience.", "website": "https://luanaframework.github.io" }, "Lucene": { "cats": [ 34 ], "implies": [ "Java" ], "description": "Lucene is a free and open-source search engine software library.", "website": "https://lucene.apache.org/core/", "cpe": "cpe:2.3:a:apache:lucene:*:*:*:*:*:*:*:*" }, "Lucky Orange": { "cats": [ 10 ], "js": [ "__wtw_lucky_site_id" ], "scriptSrc": [ "\\.luckyorange\\.com/" ], "description": "Lucky Orange is a conversion optimisation tool with features including heatmaps, session recording, conversion funnels, form analytics, and chat.", "website": "https://www.luckyorange.com" }, "Luigi’s Box": { "cats": [ 10, 29 ], "js": [ "luigis" ], "website": "https://www.luigisbox.com" }, "Lume": { "cats": [ 57 ], "meta": { "generator": [ "^lume\\sv([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Deno" ], "description": "Lume is a static site generator based on Deno.", "website": "https://lume.land" }, "Luna": { "cats": [ 105 ], "js": [ "ditto.__esmodule", "dittoidlifetime", "globaldittokey", "globaldittoserver", "jstextmap.dittosdkurl" ], "headers": { "content-security-policy": "bsdk\\.api\\.ditto.com" }, "description": "Luna is a company that sells software that aids eyewear companies sell their products online using virtual fitting.", "website": "https://luna.io" }, "LyraThemes Kale": { "cats": [ 80 ], "js": [ "kale_responsive_videos" ], "scriptSrc": [ "/wp-content/themes/kale(?:-pro)?/" ], "description": "LyraThemes Kale is a charming and elegant, aesthetically minimal and uncluttered food blog WordPress theme.", "website": "https://www.lyrathemes.com/kale" }, "Lytics": { "cats": [ 97 ], "js": [ "__lytics__jstag__.version" ], "scriptSrc": [ "\\.lytics\\.io/" ], "description": "Lytics is a customer data platform built for marketing teams.", "website": "https://www.lytics.com" }, "MAAK": { "cats": [ 1 ], "meta": { "author": [ "^maak$" ] }, "description": "MAAK is a Laravel based CMS developed by Mahdi Akbari.", "website": "https://maak-code.ir" }, "MAJIN": { "cats": [ 32 ], "js": [ "ma.touch" ], "description": "MAJIN reads the hearts and minds of each customer using real-world data to automate optimal marketing processes.", "website": "https://ma-jin.jp" }, "MATORI.NET": { "cats": [ 64 ], "headers": { "x-powered-by": "matori.net" }, "implies": [ "OpenResty" ], "description": "MATORI.NET is a fully managed reverse proxy.", "website": "https://matori.net" }, "MDBootstrap": { "cats": [ 66 ], "js": [ "mdb.scrollspy" ], "scriptSrc": [ "(?:/mdbootstrap/([\\d\\.]+)/)?js/mdb\\.min\\.js\\;version:\\1" ], "implies": [ "Bootstrap" ], "description": "MDBootstrap (Material Design for Bootstrap) is a complete UI package that can be integrated with other frameworks such as Angular, React, Vue, etc. It is used to design a fully responsive and mobile-friendly layout using various components, plugins, animation.", "website": "https://mdbootstrap.com" }, "MDBootstrap WP theme": { "cats": [ 80 ], "implies": [ "MDBootstrap" ], "description": "MDBootstrap WP theme is a WordPress theme built on top of the MDBootstrap front-end UI library. It provides a set of pre-designed layouts, widgets, and components that can be easily customised and integrated into WordPress websites.", "website": "https://mdbgo.com/docs/projects/wordpress/" }, "MDS Brand": { "cats": [ 53 ], "description": "MDS Brand is a provider of website, CRM, vrtual BDC, SEO, PPC, and live chat solutions for Marine, RV, Powersports, and automotive industries.", "website": "https://mdsbrand.com" }, "MDUI": { "cats": [ 66 ], "js": [ "_mduieventid", "mdui.drawer" ], "description": "MDUI is a CSS Framework based on material design.", "website": "https://www.mdui.org" }, "MGID": { "cats": [ 36 ], "js": [ "mgsensor.mgqworker" ], "scriptSrc": [ "\\.mgid\\.com/" ], "description": "MGID is a programmatic advertising platform frequently used by misinformation websites.", "website": "https://www.mgid.com" }, "MGPanel": { "cats": [ 1 ], "scriptSrc": [ "\\.mgpanel\\.org/" ], "implies": [ "MySQL" ], "description": "MGPanel has it all, a content management system that gives programmers the freedom to create professional web pages from scratch, also providing their clients with a self-managing platform.", "website": "https://mgpanel.org" }, "MIYN Online Appointment": { "cats": [ 72 ], "js": [ "miynlive.settings" ], "description": "MIYN Online Appointment is an advanced cloud-based online appointment scheduling software.", "website": "https://miyn.app/online-appointment" }, "MODX": { "cats": [ 1 ], "js": [ "modx", "modx_media_path" ], "headers": { "x-powered-by": "^modx" }, "html": [ "\u003c!-- modx process time debug info --\u003e", "\u003c(?:link|script)[^\u003e]+assets/snippets/\\;confidence:20", "\u003ca[^\u003e]+\u003epowered by modx\u003c/a\u003e", "\u003cform[^\u003e]+id=\"ajaxsearch_form\\;confidence:20", "\u003cinput[^\u003e]+id=\"ajaxsearch_input\\;confidence:20" ], "scriptSrc": [ "/assets/components/templates/\\;confidence:50" ], "meta": { "generator": [ "modx[^\\d.]*([\\d.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "MODX (originally MODx) is an open source content management system and web application framework for publishing content on the World Wide Web and intranets.", "website": "https://modx.com/content-management-framework", "cpe": "cpe:2.3:a:modx:modx_revolution:*:*:*:*:*:*:*:*" }, "MRW": { "cats": [ 99 ], "description": "MRW is a Spanish courier company specialised in express national and international shipping services.", "website": "https://www.mrw.es" }, "MSHOP": { "cats": [ 6 ], "scriptSrc": [ "static\\.hotishop\\.com/" ], "description": "MSHOP is an all-in-one ecommerce platform.", "website": "https://hotishop.com" }, "MTCaptcha": { "cats": [ 16 ], "js": [ "mtcaptcha.getverifiedtoken", "mtcaptchaconfig.sitekey" ], "scriptSrc": [ "service(?:2)?\\.mtcaptcha\\.com/" ], "description": "MTCaptcha is a captcha service that is GDPR and WCAG compliant, providing the confidence of privacy and accessibility.", "website": "https://www.mtcaptcha.com" }, "MUI": { "cats": [ 66 ], "css": [ "\\.MuiPaper-root" ], "implies": [ "React" ], "description": "MUI(formerly Material UI) is a simple and customisable component library to build faster, beautiful, and more accessible React applications.", "website": "https://mui.com" }, "Macaron": { "cats": [ 18 ], "implies": [ "Go" ], "description": "Macaron is a high productive and modular web framework in Go.", "website": "https://go-macaron.com" }, "MachoThemes NewsMag": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/newsmag(?:-child)?/" ], "description": "MachoThemes Newsmag is a clean and modern magazine, news or blog WordPress theme.", "website": "https://www.machothemes.com/item/newsmag-lite" }, "MadAdsMedia": { "cats": [ 36 ], "js": [ "setmiframe", "setmrefurl" ], "scriptSrc": [ "^https?://(?:ads-by|pixel)\\.madadsmedia\\.com/" ], "website": "https://madadsmedia.com" }, "MadCap Software": { "cats": [ 96 ], "js": [ "madcap.accessibility", "madcap.debug" ], "description": "MadCap Software is a company that specialises in creating software tools for technical writers to author and publish various types of content, including user manuals, online help systems, and knowledge bases.", "website": "https://www.madcapsoftware.com" }, "Magazord": { "cats": [ 6 ], "meta": { "web-author": [ "^magazord$" ] }, "description": "Magazord is an all-in-one ecommerce platform.", "website": "https://www.magazord.com.br" }, "MageWorx Search Autocomplete": { "cats": [ 29 ], "scriptSrc": [ "mageworx_searchsuiteautocomplete" ], "description": "MageWorx Search Autocomplete extension offers an AJAX-based popup window that displays and updates relevant search results while a customer forms his or her query.", "website": "https://github.com/mageworx/search-suite-autocomplete" }, "Magento": { "cats": [ 6 ], "cookies": { "frontend": "\\;confidence:50", "mage-cache-storage": "", "mage-cache-storage-section-invalidation": "", "mage-translation-file-version": "", "mage-translation-storage": "", "x-magento-vary": "" }, "js": [ "mage", "varienform" ], "scriptSrc": [ "js/mage", "skin/frontend/(?:default|(enterprise))\\;version:\\1?1 (enterprise):1 (community)", "skin/frontend/\\;confidence:50\\;version:\\1", "static/_requirejs\\;confidence:50\\;version:2" ], "implies": [ "MySQL", "PHP" ], "description": "Magento is an open-source ecommerce platform written in PHP.", "website": "https://magento.com", "cpe": "cpe:2.3:a:magento:magento:*:*:*:*:*:*:*:*" }, "Magewire": { "cats": [ 19 ], "js": [ "magewire", "magewire.connection-author" ], "implies": [ "Laravel", "Livewire" ], "description": "Magewire is a Laravel Livewire port for Magento 2.", "website": "https://github.com/magewirephp/magewire" }, "Magisto": { "cats": [ 14 ], "js": [ "magisto_server", "magistoplayerframe" ], "scriptSrc": [ "\\.magisto\\.com/" ], "description": "Magisto is a video management solution designed to help marketing professionals, agencies, and businesses of all sizes.", "website": "https://www.magisto.com" }, "Magixite": { "cats": [ 68 ], "scriptSrc": [ "acc\\.magixite\\.com/" ], "description": "Magixite offers the Web Content Accessibility Guidelines (WCAG), a set of guidelines and requirements designed to help designers and developers improve the accessibility of web content, ensuring it can be effectively used by individuals with disabilities.", "website": "https://acc.magixite.com" }, "MailChimp": { "cats": [ 32, 75 ], "html": [ "\u003c!-- begin mailchimp signup form --\u003e", "\u003cinput [^\u003e]*id=\"mc-email\"\\;confidence:20" ], "scriptSrc": [ "cdn-images\\.mailchimp\\.com/[^\u003e]*\\.css", "chimpstatic\\.com/mcjs-connected", "s3\\.amazonaws\\.com/downloads\\.mailchimp\\.com/js/mc-validate\\.js" ], "description": "Mailchimp is a marketing automation platform and email marketing service.", "website": "https://mailchimp.com", "cpe": "cpe:2.3:a:thinkshout:mailchimp:*:*:*:*:*:*:*:*" }, "MailChimp for WooCommerce": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/mailchimp-for-woocommerce/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "MailChimp" ], "description": "MailChimp for WooCommerce gives you the ability to automatically sync customer purchase data to your MailChimp account.", "website": "https://mailchimp.com/integrations/woocommerce" }, "MailChimp for WordPress": { "cats": [ 87, 32 ], "js": [ "mc4wp" ], "scriptSrc": [ "/wp-content/plugins/mailchimp-for-wp/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "MailChimp" ], "description": "MailChimp for WordPress is an email marketing plugin that enables you to build subscriber lists.", "website": "https://www.mc4wp.com" }, "MailerLite": { "cats": [ 32 ], "js": [ "mailerliteobject" ], "scriptSrc": [ "\\.mailerlite\\.com/" ], "description": "MailerLite is an email marketing tool and website builder for businesses of all shapes and sizes.", "website": "https://www.mailerlite.com" }, "MailerLite Website Builder": { "cats": [ 51 ], "scriptSrc": [ "cdn\\.mailerlite\\.com/moment/moment\\.min\\.js" ], "description": "MailerLite Website Builder is a free drag \u0026 drop website builder with interactive blocks and ecommerce integrations.", "website": "https://www.mailerlite.com/features/website-builder" }, "MailerLite plugin": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/woo-mailerlite/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "MailerLite" ], "description": "The official MailerLite signup forms plugin makes it easy to grow your newsletter subscriber list from your WordPress blog or website. The plugin automatically integrates your WordPress form with your MailerLite email marketing account.", "website": "https://ru.wordpress.org/plugins/official-mailerlite-sign-up-forms/" }, "Mailgun": { "cats": [ 75 ], "description": "Mailgun is a transactional email API service for developers.", "website": "https://www.mailgun.com/" }, "Mailjet": { "cats": [ 75 ], "description": "Mailjet is an email delivery service for marketing and developer teams.", "website": "https://www.mailjet.com/" }, "Mailman": { "cats": [ 75 ], "scriptSrc": [ "/mailman\\d+/static/.+\\.js", "/static/(?:hyperkitty|django-mailman3)/.+\\.js" ], "implies": [ "Python" ], "description": "Mailman is free software for managing electronic mail discussion and e-newsletter lists. Mailman is integrated with the web, making it easy for users to manage their accounts and for list owners to administer their lists. Mailman supports built-in archiving, automatic bounce processing, content filtering, digest delivery, spam filters, and more.", "website": "https://list.org", "cpe": "cpe:2.3:a:gnu:mailman:*:*:*:*:*:*:*:*" }, "Mailmunch": { "cats": [ 75, 32 ], "js": [ "mailmunch", "mailmunchwidgets" ], "description": "Mailmunch is a lead generation tool that combines landing pages, forms, and email marketing.", "website": "https://www.mailmunch.com" }, "MainAd": { "cats": [ 36 ], "scriptSrc": [ "\\.mainadv\\.com/" ], "description": "MainAd is an international advertising technology company specialising in real-time bidding and programmatic ad retargeting.", "website": "https://www.mainad.com" }, "Make-Sense": { "cats": [ 68 ], "scriptSrc": [ "mk-sense\\.com/aweb\\?license" ], "website": "https://mk-sense.com/" }, "MakeShop": { "cats": [ 6 ], "js": [ "makeshop_ga_gtag", "makeshop_topsearch" ], "description": "MakeShop is a Japanese ecommerce platform.", "website": "https://www.makeshop.jp" }, "MakeShopKorea": { "cats": [ 6 ], "js": [ "makeshop", "makeshoploguniqueid" ], "description": "MakeShopKorea is a Korean hosting brand that focuses on building ecommerce stores.", "website": "https://www.makeshop.co.kr" }, "Malomo": { "cats": [ 107 ], "js": [ "malomo" ], "scriptSrc": [ "\\.gomalomo\\.com/" ], "description": "Malomo is a cloud-based shipment tracking solution that helps small to midsize eCommerce businesses provide customers with shipping updates via white-label package tracking pages.", "website": "https://gomalomo.com" }, "Mambo": { "cats": [ 1 ], "meta": { "generator": [ "mambo" ] }, "website": "https://mambo-foundation.org" }, "Mangeznotez": { "cats": [ 5, 72 ], "scriptSrc": [ "\\w+.mangeznotez\\.\\w+(?:.*\\?ver=([\\d.]+))?\\;version:\\1", "www\\.mangeznotez\\.\\w+" ], "description": "Mangeznotez is a restaurant table booking widget.", "website": "https://www.mangeznotez.com" }, "Mantine": { "cats": [ 66 ], "implies": [ "TypeScript" ], "description": "Mantine is an open-source UI framework and component library for React.", "website": "https://mantine.dev" }, "MantisBT": { "cats": [ 13 ], "implies": [ "MySQL" ], "description": "MantisBT is an open-source, web-based issue tracking system written in PHP with a MySQL database backend, designed to facilitate bug tracking and project management for software development teams.", "website": "https://www.mantisbt.org", "cpe": "cpe:2.3:a:mantisbt:mantisbt:*:*:*:*:*:*:*:*" }, "ManyChat": { "cats": [ 32, 52 ], "js": [ "mcwidget" ], "scriptSrc": [ "widget\\.manychat\\.com" ], "description": "ManyChat is a service that allows you to create chatbots for Facebook Messenger.", "website": "https://manychat.com/" }, "ManyContacts": { "cats": [ 32, 5 ], "scriptSrc": [ "\\.manycontacts\\.com" ], "description": "ManyContacts is an attention-grabbing contact form sitting on top of your website that helps to increase conversion by converting visitors into leads.", "website": "https://www.manycontacts.com" }, "MapLibre GL JS": { "cats": [ 35 ], "js": [ "apex.libversions.maplibre", "maplibregl", "rmap2.maplibreglcompare" ], "scriptSrc": [ "maplibre-gl@([\\d\\.]+)/dist/maplibre-gl\\.js\\;version:\\1" ], "description": "MapLibre GL JS is an open-source library for publishing maps on your websites.", "website": "https://github.com/maplibre/maplibre-gl-js" }, "Mapbox GL JS": { "cats": [ 35 ], "js": [ "mapboxgl.version" ], "scriptSrc": [ "mapbox-gl\\.js" ], "description": "Mapbox GL JS is a JavaScript library that uses WebGL to render interactive maps from vector tiles and Mapbox styles.", "website": "https://github.com/mapbox/mapbox-gl-js" }, "Mapbox.js": { "cats": [ 35 ], "scripts": [ "api\\.mapbox\\.com/mapbox\\.js/v([\\d\\.]+)/\\;version:\\1" ], "scriptSrc": [ "api\\.mapbox\\.com/mapbox\\.js/v([\\d\\.]+)/\\;version:\\1" ], "implies": [ "Leaflet" ], "description": "Mapbox.js is a JavaScript library provided by Mapbox for working with interactive maps and geospatial data.", "website": "https://github.com/mapbox/mapbox.js" }, "Mapp": { "cats": [ 10, 32 ], "js": [ "webtrekk", "webtrekkconfig", "webtrekkheatmapobjects", "webtrekklinktrackobjects", "webtrekkunloadobjects", "webtrekkv3", "webtrekkv3", "wt_tt", "wt_ttv2", "wtsmart" ], "description": "Mapp is designed specifically to help consumer-facing brands run highly personalised, cross-channel marketing campaigns powered by real-time customer data and generated insights.", "website": "https://mapp.com" }, "Mapplic": { "cats": [ 35 ], "scriptSrc": [ "/include/mapplic/mapplic\\.js", "wp-content/plugins/mapplic/" ], "description": "Mapplic is a plugin for creating interactive maps based on simple image (jpg, png) or vector (svg) files.", "website": "https://mapplic.com" }, "Maptalks": { "cats": [ 35 ], "js": [ "map._eventmap", "maptalks.geojson" ], "description": "Maptalks is a light and plugable JavaScript library for integrated 2D/3D maps.", "website": "https://maptalks.org" }, "Marchex": { "cats": [ 10 ], "scriptSrc": [ "\\.marchex\\.io/" ], "description": "Marchex is a B2B call and conversational analytics company.", "website": "https://www.marchex.com" }, "Marfeel": { "cats": [ 10, 36 ], "js": [ "marfeel" ], "scriptSrc": [ "\\.marfeel\\.com/", "\\.mrf\\.io/" ], "description": "Marfeel is a publisher platform that allows publishers to create, optimise and monetise their mobile websites.", "website": "https://www.marfeel.com" }, "MariaDB": { "cats": [ 34 ], "description": "MariaDB is an open-source relational database management system compatible with MySQL.", "website": "https://mariadb.org", "cpe": "cpe:2.3:a:mariadb_project:mariadb:*:*:*:*:*:*:*:*" }, "Marionette.js": { "cats": [ 12 ], "js": [ "marionette", "marionette.version" ], "scriptSrc": [ "backbone\\.marionette.*\\.js" ], "implies": [ "Backbone.js", "Underscore.js" ], "description": "Marionette is a composite application library for Backbone.js that aims to simplify the construction of large scale JavaScript applications. It is a collection of common design and implementation patterns found in applications.", "website": "https://marionettejs.com" }, "Marked": { "cats": [ 59 ], "js": [ "marked" ], "scriptSrc": [ "/marked(?:\\.min)?\\.js" ], "website": "https://marked.js.org", "cpe": "cpe:2.3:a:marked_project:marked:*:*:*:*:*:*:*:*" }, "Marker": { "cats": [ 13 ], "js": [ "markerconfig" ], "scriptSrc": [ "edge\\.marker\\.io" ], "description": "Marker.io is an issue tracker solution for Project Managers, QA Testers and Agency Clients to report feedback \u0026 bugs to developers.", "website": "https://marker.io" }, "Marketo": { "cats": [ 32 ], "js": [ "munchkin" ], "scriptSrc": [ "munchkin\\.marketo\\.\\w+/(?:([\\d.]+)/)?munchkin\\.js\\;version:\\1" ], "description": "Marketo develops and sells marketing automation software for account-based marketing and other marketing services and products including SEO and content creation.", "website": "https://www.marketo.com" }, "Marketo Forms": { "cats": [ 5, 110 ], "js": [ "formatmarketoform" ], "scriptSrc": [ "marketo\\.\\w+/js/forms(?:[\\d.]+)/js/forms([\\d.]+)\\.min\\.js\\;version:\\1", "v([\\d.]+)/js/marketo-alt-form\\.min\\.js\\;version:\\1" ], "description": "Marketo Forms help create web forms without programming knowledge. Forms can reside on Marketo landing pages and also be embedded on any page of website.", "website": "https://www.marketo.com" }, "Marketpath CMS": { "cats": [ 1 ], "cookies": { "_mp_permissions": "^session\\^" }, "implies": [ "Azure", "ZURB Foundation" ], "description": "Marketpath CMS is a hosted website content management system used by businesses, churches and schools.", "website": "https://www.marketpath.com" }, "Marko": { "cats": [ 18, 66 ], "js": [ "markocomponent", "markosections", "markovars" ], "scripts": [ "\\.marko(\\.js)?" ], "implies": [ "Node.js" ], "description": "Marko is HTML re-imagined as a language for building dynamic and reactive user interfaces.", "website": "https://markojs.com" }, "Master Slider": { "cats": [ 7 ], "js": [ "masterslider", "masterslider.version" ], "description": "Master Slider is an SEO friendly, responsive image and video slider.", "website": "https://www.masterslider.com" }, "Master Slider Plugin": { "cats": [ 87 ], "implies": [ "Master Slider" ], "description": "Master Slider Plugin is an SEO friendly, responsive image and video slider plugin for WordPress.", "website": "https://wordpress.org/plugins/master-slider" }, "Mastercard": { "cats": [ 41 ], "description": "MasterCard facilitates electronic funds transfers throughout the world, most commonly through branded credit cards, debit cards and prepaid cards.", "website": "https://www.mastercard.com" }, "MasterkinG32 Framework": { "cats": [ 18 ], "headers": { "x-powered-framework": "masterking(?:)" }, "meta": { "generator": [ "^masterking(?:)" ] }, "description": "MasterkinG32 framework.", "website": "https://masterking32.com" }, "Mastodon": { "cats": [ 2 ], "cookies": { "_mastodon_session": "" }, "headers": { "server": "^mastodon$" }, "description": "Mastodon is a free and open-source self-hosted social networking service.", "website": "https://joinmastodon.org" }, "Matajer": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.mapp\\.sa/" ], "description": "Matajer is an ecommerce platform from Saudi Arabia.", "website": "https://mapp.sa" }, "Material Design Lite": { "cats": [ 66 ], "js": [ "materialicontoggle" ], "html": [ "\u003clink[^\u003e]* href=\"[^\"]*material(?:\\.[\\w]+-[\\w]+)?(?:\\.min)?\\.css" ], "scriptSrc": [ "(?:/([\\d.]+))?/material(?:\\.min)?\\.js\\;version:\\1" ], "description": "Material Design Lite is a library of components for web developers.", "website": "https://getmdl.io" }, "Materialize CSS": { "cats": [ 66 ], "scriptSrc": [ "([\\d\\.]+)/.*/materialize\\.min\\.js\\;version:\\1" ], "description": "Materialize CSS is a front-end framework that helps developers create responsive and mobile-first web applications. It is based on Google's Material Design guidelines.", "website": "https://materializecss.com" }, "MathJax": { "cats": [ 25 ], "js": [ "mathjax", "mathjax.version" ], "scriptSrc": [ "([\\d.]+)?/mathjax\\.js\\;version:\\1" ], "description": "MathJax is a cross-browser JavaScript library that displays mathematical notation in web browsers, using MathML, LaTeX and ASCIIMathML markup.", "website": "https://www.mathjax.org" }, "Matomo Analytics": { "cats": [ 10 ], "cookies": { "piwik_sessid": "" }, "js": [ "_paq", "matomo", "piwik" ], "scriptSrc": [ "piwik\\.js|piwik\\.php" ], "meta": { "apple-itunes-app": [ "app-id=737216887" ], "generator": [ "(?:matomo|piwik) - open source web analytics" ], "google-play-app": [ "app-id=org\\.piwik\\.mobile2" ] }, "description": "Matomo Analytics is a free and open-source web analytics application, that runs on a PHP/MySQL web-server.", "website": "https://matomo.org", "cpe": "cpe:2.3:a:matomo:matomo:*:*:*:*:*:*:*:*" }, "Matomo Tag Manager": { "cats": [ 42 ], "js": [ "matomotagmanager" ], "description": "Matomo Tag Manager manages tracking and marketing tags.", "website": "https://developer.matomo.org/guides/tagmanager/introduction" }, "Mattermost": { "cats": [ 2 ], "js": [ "mm_config", "mm_current_user_id", "mm_license", "mm_user" ], "html": [ "\u003cnoscript\u003e to use mattermost, please enable javascript\\. \u003c/noscript\u003e" ], "implies": [ "Go", "React" ], "website": "https://about.mattermost.com", "cpe": "cpe:2.3:a:jenkins:mattermost:*:*:*:*:*:*:*:*" }, "Mautic": { "cats": [ 32 ], "js": [ "mauticformvalidations", "mauticsdk", "mautictrackingobject" ], "scriptSrc": [ "[^a-z]mtc.*\\.js" ], "description": "Mautic is a free and open-source marketing automation tool for Content Management, Social Media, Email Marketing, and can be used for the integration of social networks, campaign management, forms, questionnaires, reports, etc.", "website": "https://www.mautic.org/", "cpe": "cpe:2.3:a:mautic:mautic:*:*:*:*:*:*:*:*" }, "Mavo": { "cats": [ 59 ], "js": [ "mavo", "mavo.version" ], "description": "Mavo is a JavaScript library that enables web developers to turn regular HTML into reactive web applications without the need for writing custom JavaScript.", "website": "https://mavo.io" }, "MaxCDN": { "cats": [ 31 ], "headers": { "server": "^netdna", "x-cdn-forward": "^maxcdn$" }, "description": "MaxCDN is a content delivery network, which accelerates web-sites and decreases the server load.", "website": "https://www.maxcdn.com" }, "MaxMind": { "cats": [ 79, 83 ], "scriptSrc": [ "(?:device|js)\\.maxmind\\.com/", "geoip-js\\.com/.+/v([\\d\\.]+)/\\;version:\\1", "geoip\\.maxmind\\.min\\.js" ], "description": "MaxMind is a provider of geolocation and online fraud detection tools.", "website": "https://www.maxmind.com" }, "MaxSite CMS": { "cats": [ 1 ], "meta": { "generator": [ "maxsite cms" ] }, "implies": [ "PHP" ], "website": "https://max-3000.com" }, "Maxemail": { "cats": [ 32 ], "js": [ "mxm.basket", "mxm.formhandler", "mxm.tracker" ], "website": "https://maxemail.xtremepush.com" }, "MaxenceDEVCMS": { "cats": [ 1 ], "meta": { "author": [ "^maxencedev$" ] }, "implies": [ "MySQL", "PHP" ], "description": "MaxenceDEVCMS is a simple CMS for ecommerce, esport, landing page.", "website": "https://cms.maxencedev.fr" }, "Measured": { "cats": [ 10 ], "scriptSrc": [ "tag\\.measured\\.com" ], "description": "Measured is an analytics platform to measure efficiency of marketing channels.", "website": "https://www.measured.com" }, "Medallia": { "cats": [ 10, 13, 73 ], "cookies": { "k_visit": "" }, "js": [ "k_track", "kampyle", "kampyle_common" ], "scriptSrc": [ "cf\\.kampyle\\.com/k_button\\.js" ], "description": "Medallia (formerly Kampyle) is a complete customer feedback platform that helps digital enterprises listen, understand, and act across all digital touch-points.", "website": "https://www.medallia.com" }, "Media.net": { "cats": [ 36 ], "scriptSrc": [ "\\.media\\.net/" ], "description": "Media.net is an advertising company focused on providing monetization products to digital publishers.", "website": "https://www.media.net" }, "MediaElement.js": { "cats": [ 14 ], "js": [ "mejs", "mejs.version" ], "description": "MediaElement.js is a set of custom Flash plugins that mimic the HTML5 MediaElement API for browsers that don't support HTML5 or don't support the media codecs.", "website": "https://www.mediaelementjs.com" }, "MediaWiki": { "cats": [ 8 ], "js": [ "mw.util.toggletoc", "wgtitle", "wgversion" ], "html": [ "\u003c(?:a|img)[^\u003e]+\u003epowered by mediawiki\u003c/a\u003e", "\u003ca[^\u003e]+/special:whatlinkshere/", "\u003cbody[^\u003e]+class=\"mediawiki\"" ], "meta": { "generator": [ "^mediawiki ?(.+)$\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "MediaWiki is a free and open-source wiki engine.", "website": "https://www.mediawiki.org", "cpe": "cpe:2.3:a:mediawiki:mediawiki:*:*:*:*:*:*:*:*" }, "Mediavine": { "cats": [ 36 ], "cookies": { "mediavine_session": "" }, "js": [ "$mediavine.web" ], "scriptSrc": [ "\\.mediavine\\.com/" ], "description": "Mediavine is a full service ad management platform.", "website": "https://www.mediavine.com" }, "Medium": { "cats": [ 11 ], "headers": { "x-powered-by": "^medium$" }, "scriptSrc": [ "medium\\.com" ], "implies": [ "Node.js" ], "description": "Medium is an online publishing platform.", "website": "https://medium.com" }, "Meebo": { "cats": [ 5 ], "html": [ "(?:\u003ciframe id=\"meebo-iframe\"|meebo\\('domready'\\))" ], "website": "https://www.meebo.com" }, "Meeting Scheduler": { "cats": [ 5, 72 ], "scriptSrc": [ "bookmenow\\.info/(?:runtime|main).+\\.js" ], "description": "Meeting Scheduler is a schedule appointments widget.", "website": "https://bookmenow.info" }, "Megagroup CMS.S3": { "cats": [ 1 ], "js": [ "megacounter_key" ], "description": "Megagroup CMS.S3 management system is provided not as a “boxed product”, but as a separate service, that is, it works using SaaS technology. This means that you manage your site directly through your browser using an intuitive interface.", "website": "https://megagroup.ru/cms" }, "Meilisearch": { "cats": [ 29 ], "js": [ "ac_apsulis_meilisearch", "instantmeilisearch", "meilisearch", "meilisearchapierror", "meilisearchtimeouterror" ], "description": "Meilisearch is a search engine created by Meili, a software development company based in France.", "website": "https://www.meilisearch.com" }, "Melis Platform": { "cats": [ 1, 6, 11, 32 ], "html": [ "\u003c!-- rendered with melis cms v2", "\u003c!-- rendered with melis platform" ], "meta": { "generator": [ "^melis platform\\." ], "powered-by": [ "^melis cms\\." ] }, "implies": [ "Apache HTTP Server", "Laravel", "MySQL", "PHP", "Symfony", "Zend" ], "website": "https://www.melistechnology.com/", "cpe": "cpe:2.3:a:melisplatform:melisplatform:*:*:*:*:*:*:*:*" }, "MemberStack": { "cats": [ 1 ], "cookies": { "memberstack": "" }, "js": [ "memberstack" ], "scriptSrc": [ "memberstack\\.js" ], "description": "MemberStack is a no-code membership platform for Webflow.", "website": "https://www.memberstack.io" }, "Mention Me": { "cats": [ 94 ], "js": [ "mentionme" ], "scriptSrc": [ "\\.mention-me\\.com/" ], "description": "Mention Me is a referral marketing platform for conversion-obsessed ecommerce brands.", "website": "https://www.mention-me.com" }, "Menufy Online Ordering": { "cats": [ 93 ], "description": "Menufy is an online and mobile meal ordering service.", "website": "https://restaurant.menufy.com" }, "Menufy Website": { "cats": [ 51 ], "js": [ "views_website_layouts_footer_menufy" ], "scriptSrc": [ "sitecontent-menufycom\\.netdna-ssl\\.com/" ], "description": "Menufy is an online and mobile meal ordering service.", "website": "https://restaurant.menufy.com" }, "Mercado Shops": { "cats": [ 6 ], "cookies": { "_mshops_ga_gid": "" }, "scriptSrc": [ "frontend-assets/mshops-web-home/vendor" ], "description": "Mercado Shops is an all-in-one ecommerce platform.", "website": "https://www.mercadoshops.com" }, "Mermaid": { "cats": [ 25 ], "js": [ "mermaid" ], "html": [ "\u003cdiv [^\u003e]*class=[\"']mermaid[\"']\u003e\\;confidence:90" ], "scriptSrc": [ "/mermaid(?:\\.min)?\\.js" ], "website": "https://mermaidjs.github.io/" }, "MetaSlider": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/ml-slider(?:-pro)?/" ], "description": "MetaSlider is a WordPress plugin for adding responsive sliders and carousels to websites.", "website": "https://www.metaslider.com" }, "Meteor": { "cats": [ 12, 18 ], "js": [ "meteor", "meteor.release" ], "html": [ "\u003clink[^\u003e]+__meteor-css__" ], "implies": [ "MongoDB", "Node.js" ], "website": "https://www.meteor.com" }, "Methode": { "cats": [ 1 ], "html": [ "\u003c!-- methode uuid: \"[a-f\\d]+\" ?--\u003e" ], "meta": { "eomportal-id": [ "\\d+" ], "eomportal-instanceid": [ "\\d+" ], "eomportal-lastupdate": [], "eomportal-loid": [ "[\\d.]+" ], "eomportal-uuid": [ "[a-f\\d]+" ] }, "website": "https://www.eidosmedia.com/" }, "Metomic": { "cats": [ 67 ], "scriptSrc": [ "metomic\\.js" ], "website": "https://metomic.io" }, "Metrilo": { "cats": [ 10, 75 ], "js": [ "metrilo", "metrilobotregexp", "metrilocookie" ], "scriptSrc": [ "\\.metrilo\\.com/" ], "description": "Metrilo is an ecommerce analytics, email marketing software provider.", "website": "https://www.metrilo.com" }, "MetroUI": { "cats": [ 66 ], "js": [ "metro.version" ], "description": "MetroUI is an open-source frontend toolkit inspired by Microsoft Fluent (former Metro) design principles.", "website": "https://github.com/olton/Metro-UI-CSS" }, "Mews": { "cats": [ 72 ], "js": [ "mews" ], "scriptSrc": [ "\\.mews\\.li/" ], "description": "Mews is a hospitalitions service that enables hotels to track their bookings.", "website": "https://www.mews.com" }, "Microsoft 365": { "cats": [ 30, 75 ], "description": "Microsoft 365 is a line of subscription services offered by Microsoft as part of the Microsoft Office product line.", "website": "https://www.microsoft.com/microsoft-365" }, "Microsoft ASP.NET": { "cats": [ 18 ], "cookies": { "asp.net_sessionid": "", "aspsession": "" }, "headers": { "set-cookie": "\\.aspnetcore", "x-aspnet-version": "(.+)\\;version:\\1", "x-powered-by": "^asp\\.net" }, "html": [ "\u003cinput[^\u003e]+name=\"__viewstate" ], "description": "ASP.NET is an open-source, server-side web-application framework designed for web development to produce dynamic web pages.", "website": "https://www.asp.net", "cpe": "cpe:2.3:a:microsoft:asp.net:*:*:*:*:*:*:*:*" }, "Microsoft Advertising": { "cats": [ 36 ], "cookies": { "_uetsid": "\\w+", "_uetvid": "\\w+" }, "js": [ "uet", "uetq" ], "scriptSrc": [ "bat\\.bing\\.com/bat\\.js" ], "description": "Microsoft Advertising is an online advertising platform developed by Microsoft.", "website": "https://ads.microsoft.com" }, "Microsoft Ajax Content Delivery Network": { "cats": [ 31 ], "scriptSrc": [ "ajax\\.aspnetcdn\\.com/ajax/" ], "description": "Microsoft Ajax Content Delivery Network hosts popular third party JavaScript libraries such as jQuery and enables you to easily add them to your web applications.", "website": "https://docs.microsoft.com/en-us/aspnet/ajax/cdn/overview" }, "Microsoft Application Insights": { "cats": [ 78 ], "js": [ "appinsights.addtelemetryinitializer", "appinsights.severitylevel", "appinsightssdk" ], "description": "Microsoft Application Insights is a feature of Azure Monitor that provides extensible application performance management (APM) and monitoring for live web apps.", "website": "https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview" }, "Microsoft Authentication": { "cats": [ 69, 59 ], "js": [ "msal.authority", "msal.authorityinstance", "msalconfig.auth" ], "description": "The Microsoft Authentication Library for JavaScript enables both client-side and server-side JavaScript applications to authenticate users using Azure AD for work and school accounts (AAD), Microsoft personal accounts (MSA), and social identity providers like Facebook, Google, LinkedIn, Microsoft accounts, etc. through Azure AD B2C service.", "website": "https://github.com/AzureAD/microsoft-authentication-library-for-js" }, "Microsoft Azure Maps": { "cats": [ 35, 79 ], "meta": { "enabled-features": [ "geojson_azure_maps" ] }, "implies": [ "Azure" ], "description": "Microsoft Azure Maps is a cloud-based mapping and geospatial platform provided by Microsoft.", "website": "https://azure.microsoft.com/en-us/products/azure-maps/" }, "Microsoft Clarity": { "cats": [ 10 ], "js": [ "clarity" ], "scriptSrc": [ "www\\.clarity\\.ms/.+/([\\d.]+)/clarity\\.js\\;version:\\1" ], "description": "Microsoft's Clarity is a analytics tool which provides website usage statistics, session recording, and heatmaps.", "website": "https://clarity.microsoft.com" }, "Microsoft Dynamics 365 Commerce": { "cats": [ 6 ], "scriptSrc": [ "\\.dynamics365commerce\\.ms/" ], "description": "Microsoft Dynamics 365 Commerce, an omnichannel ecommerce solution that allows you to build a website, connect physical and digital stores, track customer behaviours and requirements, deliver personalised experiences.", "website": "https://dynamics.microsoft.com/commerce/overview" }, "Microsoft Excel": { "cats": [ 20 ], "html": [ "(?:\u003chtml [^\u003e]*xmlns:w=\"urn:schemas-microsoft-com:office:excel\"|\u003c!--\\s*(?:start|end) of output from excel publish as web page wizard\\s*--\u003e|\u003cdiv [^\u003e]*x:publishsource=\"?excel\"?)" ], "meta": { "generator": [ "microsoft excel( [\\d.]+)?\\;version:\\1" ], "progid": [ "^excel\\." ] }, "description": "Microsoft Excel is an electronic spreadsheet program used for storing, organizing, and manipulating data.", "website": "https://office.microsoft.com/excel", "cpe": "cpe:2.3:a:microsoft:excel:*:*:*:*:*:*:*:*" }, "Microsoft HTTPAPI": { "cats": [ 22 ], "headers": { "server": "microsoft-httpapi(?:/([\\d.]+))?\\;version:\\1" }, "description": "Microsoft HTTPAPI is a kernel-mode HTTP driver in the Windows operating system responsible for handling HTTP requests and responses with efficiency, scalability, and security.", "website": "https://learn.microsoft.com/en-us/windows/win32/http/http-api-start-page" }, "Microsoft PowerPoint": { "cats": [ 20 ], "html": [ "(?:\u003chtml [^\u003e]*xmlns:w=\"urn:schemas-microsoft-com:office:powerpoint\"|\u003clink rel=\"?presentation-xml\"? href=\"?[^\"]+\\.xml\"?\u003e|\u003co:presentationformat\u003e[^\u003c]+\u003c/o:presentationformat\u003e[^!]+\u003co:slides\u003e\\d+\u003c/o:slides\u003e(?:[^!]+\u003co:version\u003e([\\d.]+)\u003c/o:version\u003e)?)\\;version:\\1" ], "meta": { "generator": [ "microsoft powerpoint ( [\\d.]+)?\\;version:\\1" ], "progid": [ "^powerpoint\\." ] }, "description": "Microsoft PowerPoint is a tool to create presentations using simple drag and drop tools.", "website": "https://office.microsoft.com/powerpoint", "cpe": "cpe:2.3:a:microsoft:powerpoint:*:*:*:*:*:*:*:*" }, "Microsoft Publisher": { "cats": [ 20 ], "html": [ "(?:\u003chtml [^\u003e]*xmlns:w=\"urn:schemas-microsoft-com:office:publisher\"|\u003c!--[if pub]\u003e\u003cxml\u003e)" ], "meta": { "generator": [ "microsoft publisher( [\\d.]+)?\\;version:\\1" ], "progid": [ "^publisher\\." ] }, "description": "Microsoft Publisher is an application that allows you to create professional documents such as newsletters, postcards, flyers, invitations, brochures.", "website": "https://office.microsoft.com/publisher", "cpe": "cpe:2.3:a:microsoft:publisher:*:*:*:*:*:*:*:*" }, "Microsoft SharePoint": { "cats": [ 1 ], "js": [ "_spbodyonloadcalled", "spdesignerprogid" ], "headers": { "microsoftsharepointteamservices": "^(.+)$\\;version:\\1", "sharepointhealthscore": "", "sprequestguid": "", "x-sharepointhealthscore": "" }, "meta": { "generator": [ "microsoft sharepoint" ] }, "description": "SharePoint is a cloud-based collaborative platform to manage and share content.", "website": "https://sharepoint.microsoft.com", "cpe": "cpe:2.3:a:microsoft:sharepoint_server:*:*:*:*:*:*:*:*" }, "Microsoft Visual Studio": { "cats": [ 47 ], "meta": { "generator": [ "^microsoft\\svisual\\sstudio" ] }, "description": "Microsoft Visual Studio is an integrated development environment from Microsoft.", "website": "https://visualstudio.microsoft.com" }, "Microsoft Word": { "cats": [ 20 ], "html": [ "(?:\u003chtml [^\u003e]*xmlns:w=\"urn:schemas-microsoft-com:office:word\"|\u003cw:worddocument\u003e|\u003cdiv [^\u003e]*class=\"?wordsection1[\" \u003e]|\u003cstyle[^\u003e]*\u003e[^\u003e]*@page wordsection1)" ], "meta": { "generator": [ "microsoft word( [\\d.]+)?\\;version:\\1" ], "progid": [ "^word\\." ] }, "description": "MS Word is a word-processing program used primarily for creating documents.", "website": "https://office.microsoft.com/word", "cpe": "cpe:2.3:a:microsoft:word:*:*:*:*:*:*:*:*" }, "Miestro": { "cats": [ 6 ], "scriptSrc": [ "\\.miestro\\.com" ], "meta": { "base_url": [ ".+\\.miestro\\.com" ] }, "description": "Miestro is an all-in-one ecommerce platform wich allow create online course and membership sites.", "website": "https://miestro.com" }, "Mighty Network": { "cats": [ 2, 21 ], "js": [ "mighty.broadcastbotapp" ], "implies": [ "Ruby", "Ruby on Rails" ], "description": "Mighty Networks is a platform that facilitates the creation and management of online communities, offering customisable websites, discussion forums, member profiles, events, courses, and multimedia content sharing for individuals and organisations.", "website": "https://www.mightynetworks.com" }, "Milestone CMS": { "cats": [ 1 ], "meta": { "generator": [ "^milestone\\scms\\s([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Milestone CMS is a SEO-first CMS that offers built-in advanced schema markups and Core Web Vitals conformance for improved search performance.", "website": "https://www.milestoneinternet.com/products/milestone-cms" }, "Milligram": { "cats": [ 66 ], "html": [ "\u003clink[^\u003e]+?href=\"[^\"]+milligram(?:\\.min)?\\.css" ], "website": "https://milligram.io" }, "MinMaxify": { "cats": [ 100 ], "js": [ "minmaxify.checklimits", "minmaxify.shop" ], "implies": [ "Shopify" ], "description": "MinMaxify is an app that allows Shopify store owners to set minimum and maximum values for customer orders built by Intillium.", "website": "https://apps.shopify.com/order-limits-minmaxify" }, "MindBody": { "cats": [ 5, 72 ], "js": [ "healcodewidget" ], "scriptSrc": [ "\\w+\\.healcode\\.com" ], "description": "Mindbody is a (SaaS) company that provides cloud-based online scheduling and other business management software for the wellness services industry.", "website": "https://www.mindbodyonline.com" }, "Mindbox": { "cats": [ 32 ], "js": [ "mindbox", "mindboxbatchedmodulesinitialized", "mindboxendpointsettings" ], "description": "Mindbox is a marketing automation platform.", "website": "https://mindbox.ru" }, "Minero.cc": { "cats": [ 56 ], "scriptSrc": [ "//minero\\.cc/lib/minero(?:-miner|-hidden)?\\.min\\.js" ], "description": "Minero.cc is a bot that helps run crypto mining application.", "website": "https://minero.cc/" }, "MiniServ": { "cats": [ 22 ], "headers": { "server": "miniserv/([\\d\\.]+)\\;version:\\1" }, "implies": [ "Webmin" ], "website": "https://github.com/webmin/webmin/blob/master/miniserv.pl" }, "Mint": { "cats": [ 10 ], "js": [ "mint" ], "scriptSrc": [ "mint/\\?js" ], "description": "Mint is an extensible, self-hosted web site analytics program.", "website": "https://haveamint.com" }, "Mintlify": { "cats": [ 57, 4 ], "js": [ "__next_data__.props.pageprops.favicons.browserconfig" ], "description": "Mintlify is a platform that enables developers to create and maintain documentation for their projects using Markdown format and automatically generate and deploy static websites via a continuous integration and deployment system.", "website": "https://mintlify.com" }, "Miso": { "cats": [ 29, 76 ], "description": "Miso is a real-time personalisation APIs for search, recommendation, and marketing.", "website": "https://miso.ai" }, "Misskey": { "cats": [ 2 ], "html": [ "\u003c!-- thank you for using misskey! @syuilo --\u003e" ], "meta": { "application-name": [ "misskey" ] }, "description": "Misskey is a distributed microblogging platform.", "website": "https://join.misskey.page/" }, "Mittwald": { "cats": [ 88 ], "description": "Mittwald is a web hosting agency, established in 2003 in Espelkamp, Germany", "website": "https://www.mittwald.de" }, "Miva": { "cats": [ 6 ], "js": [ "mivajs", "mivajs.page", "mivajs.product_code", "mivajs.product_id", "mivajs.screen", "mivajs.store_code", "mivavm_api", "mivavm_version" ], "headers": { "content-disposition": "filename=(?:mvga\\.js|mivaevents\\.js)" }, "scriptSrc": [ "mvga\\.js" ], "description": "Miva is a privately owned ecommerce shopping cart software and hosting company with headquarters in San Diego.", "website": "https://www.miva.com" }, "Mixin": { "cats": [ 6 ], "meta": { "mixin_hash_id": [] }, "description": "Mixin is a highly-available ecommerce cloud.", "website": "https://mixin.ir" }, "Mixpanel": { "cats": [ 10 ], "js": [ "mixpanel" ], "scriptSrc": [ "api\\.mixpanel\\.com/track", "cdn\\.mxpnl\\.com/libs/mixpanel\\-([0-9.]+)\\.min\\.js\\;version:\\1" ], "description": "Mixpanel provides a business analytics service. It tracks user interactions with web and mobile applications and provides tools for targeted communication with them. Its toolset contains in-app A/B tests and user survey forms.", "website": "https://mixpanel.com" }, "MizbanCloud": { "cats": [ 31 ], "headers": { "server": "^mizbancloud$" }, "description": "MizbanCloud is a total cloud infrastructure solutions, CDN service provider and Cloud Computing Services, Cloud DNS, Cloud Security, VoD Streaming Service, Live Streaming, Cloud Object Storage.", "website": "https://mizbancloud.com" }, "MkDocs": { "cats": [ 4 ], "meta": { "generator": [ "^mkdocs-([\\d.]+)\\;version:\\1" ] }, "implies": [ "Python" ], "description": "MkDocs is a static site generator, used for building project documentation.", "website": "https://www.mkdocs.org/" }, "MoEngage": { "cats": [ 32, 10 ], "js": [ "downloadmoengage", "moengage", "moengage_api_key", "moengage_object" ], "scriptSrc": [ "cdn\\.moengage\\.\\w+" ], "description": "MoEngage is an intelligent customer engagement platform for the customer-obsessed marketer.", "website": "https://www.moengage.com" }, "MobX": { "cats": [ 59 ], "js": [ "__mobxglobal", "__mobxglobals", "__mobxinstancecount" ], "scriptSrc": [ "(?:/([\\d\\.]+))?/mobx(?:\\.[a-z]+){0,2}\\.js(?:$|\\?)\\;version:\\1" ], "website": "https://mobx.js.org" }, "Mobify": { "cats": [ 6, 26 ], "js": [ "mobify" ], "headers": { "x-powered-by": "mobify" }, "scriptSrc": [ "//a\\.mobify\\.com/", "//cdn\\.mobify\\.com/" ], "description": "Mobify is a web storefront platform for headless commerce.", "website": "https://www.mobify.com" }, "Mobirise": { "cats": [ 51 ], "html": [ "\u003c!-- site made with mobirise website builder v([\\d.]+)\\;version:\\1" ], "meta": { "generator": [ "^mobirise v([\\d.]+)\\;version:\\1" ] }, "description": "Mobirise is a free offline app for Windows and Mac to easily create small/medium websites, landing pages, online resumes and portfolios.", "website": "https://mobirise.com" }, "MochiKit": { "cats": [ 59 ], "js": [ "mochikit", "mochikit.mochikit.version" ], "scriptSrc": [ "mochikit(?:\\.min)?\\.js" ], "website": "https://mochi.github.io/mochikit/" }, "MochiWeb": { "cats": [ 22 ], "headers": { "server": "mochiweb(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://github.com/mochi/mochiweb", "cpe": "cpe:2.3:a:mochiweb_project:mochiweb:*:*:*:*:*:*:*:*" }, "Modernizr": { "cats": [ 59 ], "js": [ "modernizr._version" ], "scriptSrc": [ "([\\d.]+)?/modernizr(?:\\.([\\d.]+))?.*\\.js\\;version:\\1?\\1:\\2" ], "description": "Modernizr is a JavaScript library that detects the features available in a user's browser.", "website": "https://modernizr.com" }, "ModiFace": { "cats": [ 105 ], "js": [ "initmodiface" ], "headers": { "content-security-policy": "\\.modiface\\.com" }, "scriptSrc": [ "\\.modiface\\.com/" ], "description": "ModiFace is a provider of Augmented Reality technology for the beauty industry.", "website": "https://modiface.com" }, "Modified": { "cats": [ 6 ], "meta": { "generator": [ "\\(c\\) by modified ecommerce shopsoftware ------ http://www\\.modified-shop\\.org" ] }, "website": "https://www.modified-shop.org/" }, "Module Federation": { "cats": [ 19 ], "scripts": [ "container initialization failed as it has already been initialized with a different share scope", "data-webpack\\;confidence:50" ], "implies": [ "Webpack" ], "description": "Module Federation is a webpack technology for dynamically loading parts of other independently deployed builds.", "website": "https://webpack.js.org/concepts/module-federation/" }, "Moguta.CMS": { "cats": [ 1, 6 ], "html": [ "\u003clink[^\u003e]+href=[\"'][^\"]+mg-(?:core|plugins|templates)/" ], "scriptSrc": [ "mg-(?:core|plugins|templates)/" ], "implies": [ "PHP" ], "website": "https://moguta.ru" }, "MoinMoin": { "cats": [ 8 ], "cookies": { "moin_session": "" }, "js": [ "show_switch2gui" ], "scriptSrc": [ "moin(?:_static(\\d)(\\d)(\\d)|.+)/common/js/common\\.js\\;version:\\1.\\2.\\3" ], "implies": [ "Python" ], "description": "MoinMoin is a wiki engine implemented in Python.", "website": "https://moinmo.in", "cpe": "cpe:2.3:a:moinmo:moinmoin:*:*:*:*:*:*:*:*" }, "Mojolicious": { "cats": [ 18 ], "headers": { "server": "^mojolicious", "x-powered-by": "mojolicious" }, "implies": [ "Perl" ], "website": "https://mojolicio.us" }, "Mokka": { "cats": [ 41, 91 ], "scriptSrc": [ "revoiframe\\.js" ], "description": "Mokka is a Buy Now Pay Later solution that connects target customer acquisition and settlement costs through marketing and promotion.", "website": "https://mokka.ro" }, "Mollie": { "cats": [ 41 ], "js": [ "mollie" ], "scriptSrc": [ "/wp-content/plugins/mollie-payments-for-woocommerce/" ], "description": "Mollie is a payment provider for Belgium and the Netherlands, offering payment methods such as credit card, iDEAL, Bancontact/Mister cash, PayPal, SCT, SDD, and others.", "website": "https://www.mollie.com" }, "Mollom": { "cats": [ 16 ], "html": [ "\u003cimg[^\u003e]+\\.mollom\\.com" ], "scriptSrc": [ "mollom(?:\\.min)?\\.js" ], "website": "https://mollom.com", "cpe": "cpe:2.3:a:acquia:mollom:*:*:*:*:*:*:*:*" }, "Moment Timezone": { "cats": [ 59 ], "scriptSrc": [ "moment-timezone(?:-data)?(?:\\.min)?\\.js" ], "implies": [ "Moment.js" ], "website": "https://momentjs.com/timezone/" }, "Moment.js": { "cats": [ 59 ], "js": [ "moment", "moment.version" ], "scriptSrc": [ "moment(?:\\.min)?\\.js" ], "description": "Moment.js is a free and open-source JavaScript library that removes the need to use the native JavaScript Date object directly.", "website": "https://momentjs.com", "cpe": "cpe:2.3:a:momentjs:moment:*:*:*:*:*:*:*:*" }, "Monaco Editor": { "cats": [ 24 ], "css": [ "\\.monaco-editor" ], "js": [ "apex.libversions.monacoeditor", "monaco.editor", "monacoenvironment" ], "description": "Monaco Editor is the code editor that powers VS Code. Monaco Editor is a tool in the text editor category of a tech stack.", "website": "https://microsoft.github.io/monaco-editor/" }, "Mondial Relay": { "cats": [ 99 ], "description": "Mondial Relay is a parcel shipping and delivery service in Europe.", "website": "https://www.mondialrelay.com" }, "Mondo Media": { "cats": [ 6 ], "meta": { "generator": [ "mondo shop" ] }, "website": "https://mondo-media.de" }, "Moneris": { "cats": [ 41 ], "js": [ "initialserverdata.monerisconfiguration" ], "headers": { "content-security-policy": "\\.moneris\\.com" }, "description": "Moneris (formerly Moneris Solutions) is Canada's largest financial technology company that specialises in payment processing.", "website": "https://www.moneris.com" }, "Moneris Payment Gateway": { "cats": [ 87 ], "js": [ "wc_moneris_hosted_tokenization_params" ], "scriptSrc": [ "/wp-content/plugins/woocommerce-gateway-moneris/" ], "implies": [ "Moneris", "WooCommerce" ], "description": "Moneris is Canada’s leading processor of Debit and credit card payments. This WooCommerce extension automatically adds moneris payment gateway to your woocommerce website and allows you to keep the customer on your site for the checkout process.", "website": "https://wordpress.org/plugins/wc-moneris-payment-gateway" }, "Monetate": { "cats": [ 74, 76 ], "js": [ "monetate", "monetateq", "monetatet" ], "scriptSrc": [ "\\.monetate\\.net" ], "description": "Monetate is a company that specializes in providing personalisation and customer experience optimisation solutions to businesses.", "website": "https://monetate.com" }, "MongoDB": { "cats": [ 34 ], "description": "MongoDB is a document-oriented NoSQL database used for high volume data storage.", "website": "https://www.mongodb.org", "cpe": "cpe:2.3:a:mongodb:mongodb:*:*:*:*:*:*:*:*" }, "Mongrel": { "cats": [ 22 ], "headers": { "server": "mongrel" }, "implies": [ "Ruby" ], "website": "https://mongrel2.org", "cpe": "cpe:2.3:a:zed_shaw:mongrel:*:*:*:*:*:*:*:*" }, "Monkey HTTP Server": { "cats": [ 22 ], "headers": { "server": "monkey/?([\\d.]+)?\\;version:\\1" }, "website": "https://monkey-project.com" }, "Mono": { "cats": [ 18 ], "headers": { "x-powered-by": "mono" }, "website": "https://mono-project.com", "cpe": "cpe:2.3:a:mono:mono:*:*:*:*:*:*:*:*" }, "Mono.net": { "cats": [ 1 ], "js": [ "_monotracker" ], "scriptSrc": [ "monotracker(?:\\.min)?\\.js" ], "implies": [ "Matomo Analytics" ], "website": "https://www.mono.net/en" }, "Monsido": { "cats": [ 10, 67, 68 ], "js": [ "_monsido", "monsido_tracking" ], "description": "Monsido provides a website management platform that automates processes, ensures regulatory compliance, improves collaboration in web and marketing teams, and streamlines reporting.", "website": "https://monsido.com" }, "MonsterInsights": { "cats": [ 87, 10 ], "js": [ "monsterinsights", "monsterinsights_frontend" ], "scriptSrc": [ "/wp-content/plugins/google-analytics-for-wordpress/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "MonsterInsights is the most popular Google Analytics plugin for WordPress.", "website": "https://www.monsterinsights.com" }, "MooTools": { "cats": [ 12 ], "js": [ "mootools", "mootools.version" ], "scriptSrc": [ "mootools.*\\.js" ], "website": "https://mootools.net" }, "Moodle": { "cats": [ 21 ], "cookies": { "moodleid_": "", "moodlesession": "" }, "js": [ "m.core", "y.moodle" ], "html": [ "\u003cimg[^\u003e]+moodlelogo" ], "meta": { "keywords": [ "^moodle" ] }, "implies": [ "PHP" ], "description": "Moodle is a free and open-source Learning Management System (LMS) written in PHP and distributed under the GNU General Public License.", "website": "https://moodle.org", "cpe": "cpe:2.3:a:moodle:moodle:*:*:*:*:*:*:*:*" }, "Moon": { "cats": [ 12 ], "scriptSrc": [ "/moon(?:\\.min)?\\.js$" ], "website": "https://kbrsh.github.io/moon/" }, "Moove GDPR Consent": { "cats": [ 67, 87 ], "js": [ "moove_frontend_gdpr_scripts" ], "description": "Moove GDPR Consent is a GDPR Cookie Compliance plugin for Wordpress.", "website": "https://www.mooveagency.com/wordpress/gdpr-cookie-compliance-plugin" }, "Mopinion": { "cats": [ 13 ], "js": [ "pastease" ], "scriptSrc": [ "deploy\\.mopinion\\.com/" ], "description": "Mopinion is an all-in-one user feedback platform that helps digital enterprises listen, understand, and act across all digital touchpoints.", "website": "https://mopinion.com" }, "Moshimo": { "cats": [ 71 ], "scriptSrc": [ "\\.moshimo\\.com/af/" ], "description": "Moshimo is a free affiliate service for individuals.", "website": "https://af.moshimo.com" }, "Motherhost": { "cats": [ 88 ], "headers": { "platform": "^motherhost$" }, "description": "Motherhost is a web hosting company based in India that offers a range of hosting services, including shared hosting, VPS hosting, dedicated servers, and cloud hosting.", "website": "https://www.motherhost.com" }, "MotoCMS": { "cats": [ 1 ], "html": [ "\u003clink [^\u003e]*href=\"[^\u003e]*\\/mt-content\\/[^\u003e]*\\.css" ], "scriptSrc": [ "/mt-includes/js/website(?:assets)?\\.(?:min)?\\.js" ], "implies": [ "AngularJS", "PHP", "jQuery" ], "website": "https://motocms.com" }, "Mouse Flow": { "cats": [ 10 ], "js": [ "_mfq" ], "scriptSrc": [ "cdn\\.mouseflow\\.com" ], "website": "https://mouseflow.com/" }, "Movable Ink": { "cats": [ 76 ], "js": [ "movableinktrack" ], "description": "Movable Ink is a technology company that allows marketers to change emails after they have been sent out.", "website": "https://movableink.com" }, "Movable Type": { "cats": [ 1 ], "meta": { "generator": [ "movable type" ] }, "website": "https://movabletype.org", "cpe": "cpe:2.3:a:sixapart:movable_type:*:*:*:*:*:*:*:*" }, "Mozard Suite": { "cats": [ 1 ], "meta": { "author": [ "mozard" ] }, "website": "https://mozard.nl" }, "Mulberry": { "cats": [ 5 ], "js": [ "mulberry.cta", "mulberryshop" ], "scriptSrc": [ "\\.getmulberry\\.com/" ], "implies": [ "Cart Functionality" ], "description": "Mulberry is a developer of personalised product protection solutions used to help brands unlock additional revenue.", "website": "https://www.getmulberry.com" }, "Mura CMS": { "cats": [ 1, 11 ], "meta": { "generator": [ "mura\\scms\\s([\\d\\.]+)\\;version:\\1" ] }, "implies": [ "Adobe ColdFusion" ], "description": "Mura CMS is the cloud-based, API driven, content management platform.", "website": "https://www.getmura.com", "cpe": "cpe:2.3:a:blueriver:muracms:*:*:*:*:*:*:*:*" }, "Mustache": { "cats": [ 12 ], "js": [ "mustache.version" ], "scriptSrc": [ "mustache(?:\\.min)?\\.js" ], "description": "Mustache is a web template system.", "website": "https://mustache.github.io" }, "Muuri": { "cats": [ 59 ], "js": [ "muuri" ], "description": "Muuri is a JavaScript layout engine that allows you to build all kinds of layouts and make them responsive, sortable, filterable, draggable and/or animated.", "website": "https://muuri.dev" }, "My Flying Box": { "cats": [ 99 ], "description": "My Flying Box is an international parcel shipping company.", "website": "https://www.myflyingbox.com/" }, "My Food Link": { "cats": [ 6 ], "js": [ "myfoodlink", "myfoodlink" ], "description": "My Food Link provides a fully hosted specialist online supermarket ecommerce platform to supermarkets and grocers.", "website": "https://www.myfoodlink.com.au" }, "MyBB": { "cats": [ 2 ], "cookies": { "mybb[lastactive]": "", "mybb[lastvisit]": "" }, "js": [ "mybb", "mybbeditor" ], "implies": [ "PHP" ], "description": "MyBB is a free and open-source forum software written in PHP.", "website": "https://mybb.com", "cpe": "cpe:2.3:a:mybb:mybb:*:*:*:*:*:*:*:*" }, "MyBlogLog": { "cats": [ 5 ], "scriptSrc": [ "pub\\.mybloglog\\.com" ], "website": "https://www.mybloglog.com" }, "MyCashFlow": { "cats": [ 6 ], "headers": { "x-mcf-id": "" }, "website": "https://www.mycashflow.fi/" }, "MyFonts": { "cats": [ 17 ], "headers": { "content-security-policy": "\\.myfonts\\.net" }, "description": "MyFonts is a digital fonts distributor, based in Woburn, Massachusetts.", "website": "https://www.myfonts.com" }, "MyLiveChat": { "cats": [ 52 ], "js": [ "mylivechat.version" ], "scriptSrc": [ "mylivechat\\.com/" ], "description": "MyLiveChat is a live chat developed by CuteSoft.", "website": "https://mylivechat.com" }, "MyOnlineStore": { "cats": [ 6 ], "meta": { "generator": [ "mijnwebwinkel" ] }, "description": "MyOnlineStore is a web shop system in the Netherlands.", "website": "https://www.myonlinestore.com/ " }, "MySQL": { "cats": [ 34 ], "description": "MySQL is an open-source relational database management system.", "website": "https://mysql.com", "cpe": "cpe:2.3:a:mysql:mysql:*:*:*:*:*:*:*:*" }, "MySiteNow": { "cats": [ 51 ], "meta": { "app-platform": [ "^mysitenow$" ] }, "description": "MySiteNow provides cloud-based web development services, allowing users to create HTML5 websites and mobile sites.", "website": "https://mysitenow.gr" }, "MyWebsite": { "cats": [ 51 ], "js": [ "systemid" ], "meta": { "generator": [ "ionos mywebsite\\;version:8" ] }, "description": "MyWebsite is website builder designed for easy editing and fast results.", "website": "https://www.ionos.com" }, "MyWebsite Creator": { "cats": [ 51 ], "scriptSrc": [ "mywebsite-editor\\.com", "website-editor\\.net" ], "implies": [ "Duda" ], "description": "MyWebsite Creator is website builder designed for easy editing and fast results.", "website": "https://www.ionos.com" }, "MyWebsite Now": { "cats": [ 51 ], "meta": { "generator": [ "mywebsite now" ] }, "implies": [ "GraphQL", "Node.js", "React" ], "description": "MyWebsite Now is a website builder designed for getting online quickly.", "website": "https://www.ionos.com" }, "Myhkw player": { "cats": [ 5 ], "js": [ "myhk_player_songid", "myhkplayerlist" ], "description": "Myhkw player is a website music player.", "website": "https://myhkw.cn" }, "Mynetcap": { "cats": [ 1 ], "meta": { "generator": [ "mynetcap" ] }, "website": "https://www.netcap-creation.fr" }, "Mysitefy": { "cats": [ 51 ], "description": "Mysitefy is a digital platform for B2B enterprises. It provides companies with a closed-loop digital application system from website building to marketing, to customer and order management.", "website": "https://www.mysitefy.com" }, "MysteryThemes News Portal": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/news-portal(?:-pro)?/.+np-custom-scripts\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "News Portal is the ultimate magazine WordPress theme by MysteryThemes.", "website": "https://mysterythemes.com/wp-themes/news-portal" }, "MysteryThemes News Portal Lite": { "cats": [ 80 ], "description": "News Portal Lite is child theme of News Portal ultimate magazine WordPress theme by MysteryThemes.", "website": "https://mysterythemes.com/wp-themes/news-portal-lite" }, "MysteryThemes News Portal Mag": { "cats": [ 80 ], "description": "News Portal Mag is child theme of News Portal ultimate magazine WordPress theme by MysteryThemes.", "website": "https://mysterythemes.com/wp-themes/news-portal-mag" }, "NACEX": { "cats": [ 99 ], "description": "NACEX is an express courier company in Spain, Andorra and Portugal.", "website": "https://www.nacex.es" }, "NEO - Omnichannel Commerce Platform": { "cats": [ 6 ], "headers": { "powered": "jet-neo" }, "description": "NEO is an ecommerce software that manages multiple online stores.", "website": "https://www.jetecommerce.com.br" }, "NSW Design System": { "cats": [ 66 ], "js": [ "nsw.initsite" ], "website": "https://www.digital.nsw.gov.au/digital-design-system" }, "NTLM": { "cats": [ 16 ], "headers": { "www-authenticate": "^ntlm" }, "description": "NTLM is an authentication method commonly used by Windows servers", "website": "https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-ntht/" }, "NVD3": { "cats": [ 25 ], "js": [ "nv.addgraph", "nv.version" ], "html": [ "\u003clink[^\u003e]* href=[^\u003e]+nv\\.d3(?:\\.min)?\\.css" ], "scriptSrc": [ "nv\\.d3(?:\\.min)?\\.js" ], "implies": [ "D3" ], "description": "NVD3 is a JavaScript visualisation library that is a free open-source tool.", "website": "https://nvd3.org" }, "Nacelle": { "cats": [ 6 ], "js": [ "__next_data__.props.pageprops.page.nacelleentryid", "nacelleeventdata" ], "implies": [ "GraphQL" ], "description": "Nacelle is a headless ecommerce platform.", "website": "https://nacelle.com" }, "NagaCommerce": { "cats": [ 6 ], "meta": { "generator": [ "^nagacommerce$" ] }, "description": "NagaCommerce is an ecommerce platform provided as a service.", "website": "https://www.nagacommerce.com" }, "Nagich": { "cats": [ 68 ], "js": [ "interdeal.version" ], "scriptSrc": [ "\\.nagich\\.co(?:m|\\.il)/core/([\\d.]+)/accessibility\\.js\\;version:\\1" ], "description": "Nagich is a website accessibility overlay provider from Israel.", "website": "https://www.nagich.co.il" }, "NagishLi": { "cats": [ 68 ], "js": [ "$nagishli", "initnagishli", "nagishli_commons.version" ], "description": "NagishLi is a free accessibility plugin from Localize*, created to provide an equal oppurtunity for webmasters to make their website accessible and make the internet more accessible for people with disability.", "website": "https://www.nagish.li" }, "Naive UI": { "cats": [ 66 ], "implies": [ "TypeScript", "Vue.js" ], "description": "Naive UI is a Vue.js UI library written in TypeScript, offering more than 80 treeshakable components.", "website": "https://www.naiveui.com" }, "Najva": { "cats": [ 32 ], "js": [ "najva.identifyemailsubscriber" ], "scriptSrc": [ "app\\.najva\\.com/" ], "description": "Najva is a retention marketing solution that offers push notification and email marketing.", "website": "https://www.najva.com" }, "Narrativ": { "cats": [ 71 ], "scriptSrc": [ "static\\.narrativ\\.com/" ], "description": "Narrativ is a subscription technology platform for brands to acquire new customers through trusted creators.", "website": "https://narrativ.com/" }, "Narvar": { "cats": [ 102, 99 ], "js": [ "narvar", "narvarjs_url" ], "headers": { "content-security-policy": "\\.narvar\\.com" }, "description": "Narvar is a customer experience platform that helps retailers inspire long-term customer loyalty, at all steps of the post-purchase journey.", "website": "https://corp.narvar.com" }, "NationBuilder": { "cats": [ 1, 53 ], "js": [ "nb.fbappid", "nb.liquid" ], "description": "NationBuilder is a Los Angeles based technology start-up that develops content management and customer relationship management (CRM) software.", "website": "https://nationbuilder.com" }, "Nativo": { "cats": [ 36 ], "js": [ "ntvconfig" ], "scriptSrc": [ "\\.ntv\\.io/", "\\.postrelease\\.com/" ], "description": "Nativo is an advertising technology provider.", "website": "https://www.nativo.com" }, "Navegg": { "cats": [ 10 ], "scriptSrc": [ "tag\\.navdmp\\.com" ], "website": "https://www.navegg.com/" }, "Naver Analytics": { "cats": [ 10 ], "scriptSrc": [ "wcs\\.naver\\.net/wcslog\\.js" ], "meta": { "naver-site-verification": [] }, "description": "Naver Analytics is a Korean based analytics service.", "website": "https://analytics.naver.com" }, "Naver Maps": { "cats": [ 35 ], "js": [ "naver.maps" ], "scriptSrc": [ "openapi\\.map\\.naver\\.com/openapi/v([\\d\\.]+)\\;version:\\1" ], "description": "Naver Maps help develop location-based services which provided by Naver.", "website": "https://www.ncloud.com/product/applicationService/maps" }, "Naver RUA": { "cats": [ 92, 78 ], "scriptSrc": [ "rua-api\\.ncloud\\.com/" ], "description": "Naver RUA (Real User Analytics) collects performance data from real users to analyze the speed of your website by country, operating system, and browser.", "website": "https://analytics.naver.com" }, "Navidium Shipping Protection": { "cats": [ 5 ], "js": [ "nvdshop" ], "scriptSrc": [ "^.*/navidium-extension-checker\\.js$" ], "description": "Navidium is a shipping insurance company that covers packages that are lost, stolen, or damaged in transit. Navidium Shipping Protection is an optional shipping protection service where, in the event of an incident (the order is damaged, lost, or stolen during transit), we will immediately re-ship any damaged, lost, or stolen products.", "website": "https://navidiumapp.com" }, "Neat A/B testing": { "cats": [ 74, 100 ], "scriptSrc": [ "cdn\\.neatab\\.com/" ], "implies": [ "Shopify" ], "description": "Neat A/B Testing is a Shopify app built by NeatShift.", "website": "https://neatab.com" }, "Neon CRM": { "cats": [ 53, 111 ], "js": [ "_neoncrm_ga", "neoncrm_email_ajax_object", "neonpaycard" ], "description": "Neon CRM, a Neon One company, is a cloud-based customer relationship management (CRM) software suite for nonprofits of all sizes. Applications include fundraising management, donor management, membership management, event registration and management, customised reporting, and more.", "website": "https://neonone.com" }, "Neos CMS": { "cats": [ 1 ], "headers": { "x-flow-powered": "neos/?(.+)?$\\;version:\\1" }, "implies": [ "Neos Flow" ], "website": "https://neos.io" }, "Neos Flow": { "cats": [ 18 ], "headers": { "x-flow-powered": "flow/?(.+)?$\\;version:\\1" }, "implies": [ "PHP" ], "website": "https://flow.neos.io" }, "Nepso": { "cats": [ 1 ], "headers": { "x-powered-cms": "nepso" }, "website": "https://www.nepso.com" }, "Nestify": { "cats": [ 88 ], "headers": { "x-nestify-cache": "" }, "description": "Nestify is a fully managed WordPress hosting platform that runs on AWS graviton processors.", "website": "https://nestify.io" }, "NetSuite": { "cats": [ 6 ], "cookies": { "ns_ver": "" }, "website": "https://netsuite.com" }, "Netcore Cloud": { "cats": [ 97, 32 ], "scriptSrc": [ "\\.netcoresmartech\\.com/" ], "description": "Netcore Cloud is a globally recognised marketing technology SaaS company.", "website": "https://netcorecloud.com" }, "Netdeal": { "cats": [ 32 ], "js": [ "netdealbuildnumber", "netdealjs.paywall", "netdealstartsession" ], "description": "Netdeal is a marketing automation platform.", "website": "https://www.netdeal.com.br" }, "Netlify": { "cats": [ 62, 31 ], "headers": { "server": "^netlify", "x-nf-request-id": "" }, "description": "Netlify providers hosting and server-less backend services for web applications and static websites.", "website": "https://www.netlify.com/" }, "Netlify Forms": { "cats": [ 110 ], "implies": [ "Netlify" ], "description": "Netlify Forms is a serverless form handling solution for static websites.", "website": "https://www.netlify.com/products/forms" }, "Neto": { "cats": [ 6 ], "js": [ "neto" ], "scriptSrc": [ "jquery\\.neto.*\\.js" ], "description": "Neto is the only Australian B2B and multi-channel ecommerce platform that provides an all-in-one solution for ecommerce, POS, inventory management, order management, and shipping labelling.", "website": "https://www.neto.com.au" }, "Nette Framework": { "cats": [ 18 ], "cookies": { "nette-browser": "" }, "js": [ "nette", "nette.version" ], "headers": { "x-powered-by": "^nette framework" }, "html": [ "\u003cdiv[^\u003e]+id=\"snippet-", "\u003cinput[^\u003e]+data-nette-rules", "\u003cinput[^\u003e]+id=\"frm-" ], "implies": [ "PHP" ], "website": "https://nette.org" }, "Network for Good": { "cats": [ 111 ], "scriptSrc": [ "\\.networkforgood\\.com/" ], "description": "Network for Good is an American certified B Corporation software company that offers fundraising software and coaching for charities and non-profit organisations.", "website": "https://www.networkforgood.com" }, "Neve": { "cats": [ 80 ], "scriptSrc": [ "themes/neve\\s*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "Neve is a super-fast, easily customizable, multi-purpose theme that works perfectly with Gutenberg and the most popular page builders as well as WooCommerce", "website": "https://themeisle.com/themes/neve/" }, "New Relic": { "cats": [ 78 ], "js": [ "newrelic", "nreum" ], "description": "New Relic is a SaaS offering that focuses on performance and availability monitoring.", "website": "https://newrelic.com" }, "NewStore": { "cats": [ 19 ], "js": [ "highstreetbanner.config" ], "scriptSrc": [ "\\.api\\.highstreetapp\\.com/" ], "description": "NewStore is the only integrated platform offering omnichannel solutions for stores and consumers.", "website": "https://www.newstore.com" }, "Newspack": { "cats": [ 87 ], "description": "Newspack is an open-source publishing platform built on WordPress for small to medium sized news organizations. It is an “opinionated” platform that stakes out clear, best-practice positions on technology, design, and business practice for news publishers.", "website": "https://github.com/Automattic/newspack-plugin" }, "Newspack by Automattic": { "cats": [ 88 ], "headers": { "host-header": "newspack" }, "implies": [ "Newspack" ], "description": "Automattic's Newspack service is an all-in-one platform designed for small and medium-sized news organizations that simplifies publishing and drives audience and revenue right out of the box.", "website": "https://newspack.pub/" }, "Nexcess": { "cats": [ 62, 88 ], "headers": { "x-hostname": "nxcli\\.net$" }, "description": "Nexcess is a web hosting service.", "website": "https://www.nexcess.net" }, "Nexive": { "cats": [ 99 ], "description": "Nexive is a postal operator in Italy.", "website": "https://www.nexive.it" }, "Next Total": { "cats": [ 6 ], "js": [ "nextbasket.nextunlimited", "nextfavourites.busy", "nextfavourites.data.shoppinglists" ], "scriptSrc": [ "\\.nextdirect\\.com/" ], "description": "Next is leveraging the expertise, infrastructure and software it has developed for its own online business to provide a third-party ecommerce outsourcing service named Total Platform.", "website": "https://www.next.co.uk" }, "Next.js": { "cats": [ 12, 18, 22, 57 ], "js": [ "__next_data__", "next.version" ], "headers": { "x-powered-by": "^next\\.js ?([0-9.]+)?\\;version:\\1" }, "implies": [ "Node.js", "React", "Webpack" ], "description": "Next.js is a React framework for developing single page Javascript applications.", "website": "https://nextjs.org", "cpe": "cpe:2.3:a:zeit:next.js:*:*:*:*:*:*:*:*" }, "NextAuth.js": { "cats": [ 69 ], "cookies": { "__host-next-auth.csrf-token": "", "__secure-next-auth.callback-url": "" }, "description": "NextAuth.js is a complete open-source authentication solution for Next.js applications.", "website": "https://next-auth.js.org" }, "NextGEN Gallery": { "cats": [ 7, 87 ], "js": [ "nextgen_lightbox_settings.static_path" ], "html": [ "\u003c!-- \u003cmeta name=\"nextgen\" version=\"([\\d.]+)\" /\u003e --\u003e\\;version:\\1" ], "scriptSrc": [ "/nextgen-gallery/js/" ], "description": "NextGEN Gallery is a free open-source image management plugin for the WordPress content management system.", "website": "https://www.imagely.com/wordpress-gallery-plugin", "cpe": "cpe:2.3:a:imagely:nextgen_gallery:*:*:*:*:*:*:*:*" }, "NextUI": { "cats": [ 66 ], "css": [ "--nextui-(?:colors-accents1|colors-text|space-0|fonts-sans|fonts-mono)" ], "implies": [ "React", "Stitches" ], "description": "NextUI allows you to make beautiful, modern, and fast websites/applications regardless of your design experience, created with React.js and Stitches, based on React Aria and inspired by Vuesax.", "website": "https://nextui.org/" }, "Nextcloud": { "cats": [ 95, 19 ], "cookies": { " __host-nc_samesitecookielax": "", "__host-nc_samesitecookiestrict": "" }, "js": [ "oc_config.version" ], "implies": [ "PHP" ], "description": "Nextcloud is a suite of client-server software for creating and using file hosting services.", "website": "https://nextcloud.com", "cpe": "cpe:2.3:a:nextcloud:nextcloud:*:*:*:*:*:*:*:*" }, "Nextdoor Ads": { "cats": [ 36 ], "scriptSrc": [ "ads\\.nextdoor\\.com/" ], "description": "Nextdoor Ads is an easy-to-use expansion of Nextdoor’s proprietary self-serve campaign management platform, designed to help small and medium-sized businesses (SMBs) advertise on Nextdoor.", "website": "https://help.nextdoor.com/s/article/About-Neighborhood-Ad-Center-NAC-Conversion-Pixel" }, "Nextra": { "cats": [ 57 ], "js": [ "__nextra_internal__", "__nextra_pagecontext__" ], "description": "Nextra is Next.js based static site generator.", "website": "https://nextra.site/" }, "Nextsale": { "cats": [ 5, 32 ], "js": [ "nextsaleobject" ], "scriptSrc": [ "(?:api|sdk)\\.nextsale\\.io/" ], "description": "Nextsale is a conversion optimisation platform that provides social proof and urgency tools for ecommerce websites.", "website": "https://nextsale.io" }, "NexusPHP": { "cats": [ 1 ], "meta": { "generator": [ "^nexusphp$" ] }, "implies": [ "MySQL", "PHP", "Redis" ], "description": "NexusPHP is an open-sourced private tracker script written in PHP.", "website": "https://nexusphp.org", "cpe": "cpe:2.3:a:nexusphp:nexusphp:*:*:*:*:*:*:*:*" }, "NexusPIPE": { "cats": [ 16 ], "headers": { "server": "^nexuspipe.com" }, "description": "NexusPIPE is a ADC and DDoS mitigation Company.", "website": "https://nexuspipe.com" }, "Nginx": { "cats": [ 22, 64 ], "headers": { "server": "nginx(?:/([\\d.]+))?\\;version:\\1", "x-fastcgi-cache": "" }, "description": "Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache.", "website": "https://nginx.org/en", "cpe": "cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*" }, "Niagahoster": { "cats": [ 88 ], "headers": { "x-powered-by": "niagahoster" }, "implies": [ "Niagahoster" ], "description": "Niagahoster is a web hosting service for small and medium enterprises. It provides shared hosting, WordPress hosting, Virtual Private Server (VPS), and more.", "website": "https://niagahoster.co.id" }, "Nicepage": { "cats": [ 51 ], "js": [ "_npaccordioninit", "_npdialogsinit" ], "meta": { "generator": [ "nicepage\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "Nicepage is a free website building tool that requires no coding skills and integrates seamlessly with all leading CMS systems.", "website": "https://nicepage.com" }, "Nift": { "cats": [ 84 ], "js": [ "niftanalytics", "niftjs" ], "description": "Nift is a marketing program for pools of local businesses. Businesses give Nift gift cards to thank and reward their customers for taking actions, like signing up for a newsletter, referring a friend, or making a purchase.", "website": "https://www.gonift.com" }, "Ninja Forms": { "cats": [ 87, 110 ], "js": [ "nfforms" ], "scriptSrc": [ "/wp-content/plugins/ninja-forms/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Ninja Forms is the WordPress form builder.", "website": "https://ninjaforms.com" }, "NitroPack": { "cats": [ 23, 92 ], "meta": { "generator": [ "nitropack" ] }, "description": "NitroPack creates optimised HTML cache for fast page loading experience.", "website": "https://nitropack.io/" }, "NoFraud": { "cats": [ 16 ], "scriptSrc": [ "services\\.nofraud\\.com/" ], "description": "NoFraud is a fraud prevention solution for ecommerce businesses.", "website": "https://www.nofraud.com" }, "Noddus": { "cats": [ 10, 32 ], "scriptSrc": [ "noddus\\.com/" ], "description": "Noddus offers brands and agencies access to an advanced proprietary content marketing platform automating content production, distribution and analytics.", "website": "https://www.enterprise.noddus.com" }, "Node.js": { "cats": [ 27 ], "description": "Node.js is an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside a web browser.", "website": "https://nodejs.org", "cpe": "cpe:2.3:a:nodejs:node.js:*:*:*:*:*:*:*:*" }, "NodeBB": { "cats": [ 2 ], "headers": { "x-powered-by": "^nodebb$" }, "scriptSrc": [ "/nodebb\\.min\\.js\\?" ], "implies": [ "Node.js" ], "description": "NodeBB forum software is powered by Node.js and built on either a Redis or MongoDB database.", "website": "https://nodebb.org", "cpe": "cpe:2.3:a:nodebb:nodebb:*:*:*:*:*:*:*:*" }, "NodePing": { "cats": [ 13 ], "description": "NodePing is a tool in the Website Monitoring category of a tech stack. NodePing is an open source tool with GitHub stars and GitHub forks.", "website": "https://nodeping.com" }, "Nogin": { "cats": [ 19 ], "js": [ "nogin.wishlist" ], "scriptSrc": [ "\\.nogin\\.com/" ], "description": "Nogin is a platform operating as Commerce-as-a-Service (CaaS), offering cloud-based ecommerce functionalities and infrastructure for seamless integration and development of ecommerce solutions.", "website": "https://www.nogin.com" }, "Noibu": { "cats": [ 13 ], "js": [ "noibujs_config" ], "description": "Noibu helps ecommerce websites detect revenue-impacting errors on their websites and provides them with the information needed to resolve them.", "website": "https://noibu.com" }, "Norton Shopping Guarantee": { "cats": [ 16 ], "js": [ "do_norton_shopping" ], "scriptSrc": [ "nsg\\.symantec\\.com/" ], "implies": [ "Cart Functionality" ], "description": "Norton Shopping Guarantee offering a third-party shopping guarantee to customers provides added protection and validation that you are safe to buy from.", "website": "https://norton.buysafe.com" }, "Nosto": { "cats": [ 76, 74 ], "js": [ "nosto", "nostojs" ], "scriptSrc": [ "connect\\.nosto\\.\\w+/" ], "meta": { "nosto-version": [ "([\\d.]+)\\;version:\\1" ] }, "description": "Nosto is an ecommerce platform providing product recommendations based on individual behavioral data.", "website": "https://www.nosto.com" }, "Nosto Visual UGC": { "cats": [ 96 ], "js": [ "stackla", "stacklawidgetjsonp" ], "scriptSrc": [ "\\.stackla\\.com/" ], "description": "Nosto Visual UGC (Earlier known as Stackla) is a cloud-based content marketing platform that helps discover, curate, display and engage with user-generated content across all digital marketing platforms.", "website": "https://www.nosto.com/products/visual-ugc/" }, "Notion": { "cats": [ 51 ], "description": "Notion is a collaboration platform with modified Markdown support that integrates kanban boards, tasks, wikis, and database.", "website": "https://notion.so" }, "Nudgify": { "cats": [ 32 ], "js": [ "nudgify.cart" ], "scriptSrc": [ "\\.nudgify\\.com/", "cdn\\.convertize\\.com/nudgify-shopify\\.js" ], "description": "Nudgify is a Social Proof \u0026 Fomo App tool that integrates seamlessly with ecommerce platform such as Shopify, WooCommerce and Magento.", "website": "https://www.nudgify.com" }, "Nukeviet CMS": { "cats": [ 1 ], "js": [ "nv_digitalclock", "nv_is_change_act_confirm" ], "meta": { "generator": [ "nukeviet v([\\d.]+)\\;version:\\1" ] }, "description": "NukeViet CMS is a Vietnamese content management system.", "website": "https://nukeviet.vn/en/" }, "Nuqlium": { "cats": [ 76, 29 ], "js": [ "nuqliumobject" ], "scriptSrc": [ "\\.nuqlium\\.com/api" ], "description": "Nuqlium is an integrated cloud-based online merchandising platform.", "website": "https://www.nuqlium.com" }, "Nuvemshop": { "cats": [ 6 ], "js": [ "ls.store.url", "nuvemshopidproduct" ], "description": "Nuvemshop is a website builder with customizable layouts, product, shipping and payment management, marketing tools and a mobile app.", "website": "https://www.nuvemshop.com.br" }, "Nuxt.js": { "cats": [ 12, 18, 22, 57 ], "js": [ "$nuxt", "usenuxtapp" ], "html": [ "\u003cdiv [^\u003e]*id=\"__nuxt\"", "\u003cscript [^\u003e]*\u003ewindow\\.__nuxt__" ], "scriptSrc": [ "/_nuxt/" ], "implies": [ "Node.js", "Vue.js" ], "description": "Nuxt is a Vue framework for developing modern web applications.", "website": "https://nuxt.com" }, "OTYS": { "cats": [ 101 ], "js": [ "otys.siteid", "otysselect" ], "description": "OTYS is a Dutch company that specialises in providing recruitment and staffing agencies with software solutions to manage their workflows, including applicant tracking systems, job board integrations, and candidate sourcing tools.", "website": "https://www.otys.nl" }, "OVHcloud": { "cats": [ 62, 88 ], "description": "OVHcloud is a global, cloud provider delivering hosted private cloud, public cloud, and dedicated server solutions.", "website": "https://www.ovhcloud.com" }, "OWL Carousel": { "cats": [ 59 ], "html": [ "\u003clink [^\u003e]*href=\"[^\"]+owl\\.carousel(?:\\.min)?\\.css" ], "scriptSrc": [ "owl\\.carousel.*\\.js" ], "implies": [ "jQuery" ], "description": "OWL Carousel is an enabled jQuery plugin that lets you create responsive carousel sliders.", "website": "https://owlcarousel2.github.io/OwlCarousel2/" }, "OXID eShop": { "cats": [ 6 ], "cookies": { "sid_key": "oxid" }, "js": [ "oxcookienote", "oxinputvalidator", "oxloginbox", "oxminibasket", "oxmodalpopup", "oxtopmenu" ], "implies": [ "PHP" ], "description": "OXID eShop is a free, open source ecommerce solution built using object oriented programming and PHP.", "website": "https://www.oxid-esales.com" }, "OXID eShop Community Edition": { "cats": [ 6 ], "html": [ "\u003c!--[^-]*oxid eshop community edition, version (\\d+)\\;version:\\1" ], "implies": [ "PHP" ], "description": "OXID eShop Community Edition is a free, open source ecommerce solution built using object oriented programming and PHP.", "website": "https://www.oxid-esales.com" }, "OXID eShop Enterprise Edition": { "cats": [ 6, 62 ], "html": [ "\u003c!--[^-]*oxid eshop enterprise edition, version (\\d+)\\;version:\\1" ], "implies": [ "PHP" ], "description": "OXID eShop Enterprise Edition is a B2B or B2C ecommerce solution built using object oriented programming and PHP.", "website": "https://www.oxid-esales.com" }, "OXID eShop Professional Edition": { "cats": [ 6 ], "html": [ "\u003c!--[^-]*oxid eshop professional edition, version (\\d+)\\;version:\\1" ], "implies": [ "PHP" ], "description": "OXID eShop Professional Edition is an e-ommerce platform for both small start-up companies and experience online retailers with a wide range of functions, software maintenance and support.", "website": "https://exchange.oxid-esales.com/OXID-Products/OXID-eShop/OXID-eShop-Professional-Edition-6-Professional-Edition-6-Stable-PE-6-0-x.html" }, "Obsidian Incentivize": { "cats": [ 100 ], "js": [ "obsidian.incentiveapi" ], "scriptSrc": [ "cdn\\.shopify\\.com/extensions/.+/([\\.\\d]{3,})/assets/upsell\\.min\\.js\\;version:\\1" ], "description": "Obsidian Incentivize is designed to increase your average order size through in-cart upsells, cross sells and personalised product recommendations.", "website": "https://obsidianapps.co" }, "Obsidian Publish": { "cats": [ 4 ], "js": [ "siteinfo.host" ], "implies": [ "PIXIjs", "Prism" ], "description": "Obsidian Publish is an official, paid plugin for Obsidian that allows users to post selected notes to a directory on the publish.obsidian.md domain.", "website": "https://obsidian.md/publish" }, "Obviyo": { "cats": [ 100, 76 ], "js": [ "__hic.version" ], "scriptSrc": [ "deploy\\.hiconversion\\.com" ], "description": "Obviyo is an ecommerce intelligence platform helping merchants personalise and optimise shopping experience.", "website": "https://www.obviyo.com" }, "Occasion": { "cats": [ 72 ], "js": [ "occsn.stack", "occsnmerchanttoken" ], "scriptSrc": [ "app\\.getoccasion\\.com" ], "description": "Occasion is an online booking system.", "website": "https://www.getoccasion.com" }, "OceanWP": { "cats": [ 80 ], "scriptSrc": [ "themes/oceanwp\\s*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1" ], "description": "OceanWP is a fast-loading WordPress theme that has great support for third-party plugins and drag-and-drop page builders.", "website": "https://oceanwp.org" }, "Ochanoko": { "cats": [ 6 ], "js": [ "ocnkproducts" ], "scriptSrc": [ "ocnk-min\\.js" ], "description": "Ochanoko is a ecommerce online shopping cart solutions, ecommerce web site hosting.", "website": "https://www.ocnk.com" }, "Oct8ne": { "cats": [ 52 ], "js": [ "oct8ne.agentsavailable", "oct8neapi", "oct8nevars.pluginversion" ], "scriptSrc": [ "\\.oct8ne\\.com/" ], "description": "Oct8ne is a visual customer service software.", "website": "https://oct8ne.com" }, "Octane AI": { "cats": [ 5, 52 ], "js": [ "octaneconfig" ], "scriptSrc": [ "\\.octaneai\\.com/" ], "description": "Octane AI provides an all-in-one platform for engaging quizzes, data collection, and personalised Facebook Messenger and SMS automation.", "website": "https://www.octaneai.com" }, "October CMS": { "cats": [ 1 ], "cookies": { "october_session": "" }, "js": [ "ocjson" ], "meta": { "generator": [ "octobercms" ] }, "implies": [ "Laravel" ], "description": "October is a free, open-source, self-hosted CMS platform based on the Laravel PHP Framework.", "website": "https://octobercms.com" }, "Octopress": { "cats": [ 57 ], "html": [ "powered by \u003ca href=\"http://octopress\\.org\"\u003e" ], "scriptSrc": [ "/octopress\\.js" ], "meta": { "generator": [ "octopress" ] }, "implies": [ "Jekyll" ], "description": "Octopress is a static blogging framework.", "website": "https://octopress.org" }, "Ocuco FitMix": { "cats": [ 105 ], "js": [ "fitmix.widget_base_url" ], "description": "Ocuco is now offering its customers FittingBox's FitMix, a virtual frame try-on tool.", "website": "https://www.ocuco.com/fitmix" }, "Odoo": { "cats": [ 1 ], "js": [ "odoo.session_info" ], "html": [ "\u003clink[^\u003e]* href=[^\u003e]+/web/css/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25" ], "scriptSrc": [ "/web/js/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25" ], "meta": { "generator": [ "odoo" ] }, "implies": [ "Less", "PostgreSQL", "Python" ], "description": "Odoo is business management software which includes CRM, ecommerce, billing, accounting, manufacturing, warehouse, project management, and inventory management.", "website": "https://odoo.com", "cpe": "cpe:2.3:a:odoo:odoo:*:*:*:*:*:*:*:*" }, "Oh Dear": { "cats": [ 13 ], "js": [ "__next_data__.props.pageprops.config.useragent" ], "scriptSrc": [ "\\.ohdear\\.app/" ], "description": "The all-in-one monitoring tool for your entire website. Oh Dear monitors uptime, SSL certificates, broken links, scheduled tasks, application health, DNS, domain expiry and more.", "website": "https://ohdear.app" }, "Okendo": { "cats": [ 90, 100 ], "js": [ "okendoreviews", "okereviewswidgetoninit", "okewidgetcontrolinit" ], "implies": [ "Shopify" ], "description": "Okendo is a customer marketing platform with product ratings and reviews, customer photos and videos to help personalise experiences.", "website": "https://www.okendo.io" }, "Okta": { "cats": [ 69 ], "js": [ "isoktaenabled", "okta.cdnurlhostname", "okta.locale", "oktaauth", "oktacurrentsessionurl" ], "scriptSrc": [ "oktacdn\\.com/.+/([\\d.]+)/\\;version:\\1" ], "description": "Okta is a platform in the Identity-as-a-Service (IDaaS) category. Okta features include Provisioning, Single Sign-On (SSO), Active Directory (AD) and LDAP integration, the centralized de-provisioning of users, multi-factor authentication (MFA), mobile identity management.", "website": "https://developer.okta.com", "cpe": "cpe:2.3:a:okta:*:*:*:*:*:*:*:*:*" }, "Olapic": { "cats": [ 96 ], "js": [ "olapic", "olapic.version" ], "description": "Olapic is a content marketing tool specifically focused on visual marketing content.", "website": "https://www.olapic.com" }, "Olark": { "cats": [ 52 ], "js": [ "olark", "olarkuserdata" ], "scriptSrc": [ "\\.olark\\.com/" ], "description": "Olark is a cloud-based live chat solution.", "website": "https://www.olark.com/" }, "Omeka": { "cats": [ 1 ], "js": [ "omeka" ], "description": "Omeka is a free Content Management System (CMS) used by archives, historical societies, libraries, museums, and individual researchers for publishing digital collections.", "website": "https://omeka.org", "cpe": "cpe:2.3:a:omeka:omeka:*:*:*:*:*:*:*:*" }, "Ometria": { "cats": [ 32, 97 ], "cookies": { "ometria": "" }, "js": [ "addometriabasket", "addometriaidentify", "ometria" ], "scriptSrc": [ "cdn\\.ometria\\.com" ], "description": "Ometria is a customer insight and marketing automation platform.", "website": "https://ometria.com" }, "Omise": { "cats": [ 41 ], "js": [ "omise", "omisecard" ], "scriptSrc": [ "cdn\\.omise\\.co" ], "description": "Omise is a payment gateway for Thailand, Japan and Singapore. Providing both online and offline payment solutions to merchants.", "website": "https://www.omise.co" }, "Omni CMS": { "cats": [ 1 ], "description": "Omni CMS (formerly OU Campus) is a web content management system developed by Modern Campus. Modern Campus is a SaaS-based student lifecycle management software designed to manage continuing education and non-degree programs.", "website": "https://moderncampus.com/products/web-content-management.html" }, "Omniconvert": { "cats": [ 74 ], "js": [ "_omni" ], "scriptSrc": [ "cdn\\.omniconvert\\.com" ], "description": "Omniconvert is an award-winning conversion rate optimisation (CRO) software that can be used for A/B testing, online surveys, traffic segmentation.", "website": "https://www.omniconvert.com" }, "Omnisend": { "cats": [ 32, 75 ], "cookies": { "omnisendsessionid": "" }, "js": [ "_omnisend" ], "scriptSrc": [ "omnisrc\\.com" ], "meta": { "omnisend-site-verification": [] }, "description": "Omnisend is an ecommerce marketing automation platform that provides an omnichannel marketing strategy for businesses.", "website": "https://www.omnisend.com" }, "Omnisend Email Marketing \u0026 SMS": { "cats": [ 100 ], "scriptSrc": [ "omnis(?:nippet1|rc)\\.com/inshop/embed/shopify\\.js" ], "implies": [ "Omnisend" ], "description": "Omnisend Email Marketing \u0026 SMS is an omnichannel marketing automation channel that allows Shopify store owners to manage their SMS, web push notifications, WhatsApp, Facebook messenger, pop-ups, segmentation, and dynamic Facebook and Google ad integrations.", "website": "https://apps.shopify.com/omnisend" }, "Omny Studio": { "cats": [ 5 ], "description": "Omny Studio is a podcast hosting solution, which enables radio stations and enterprises to manage, monetize, publish, share, edit and analyze audio episodes.", "website": "https://omnystudio.com" }, "Omurga Sistemi": { "cats": [ 1 ], "meta": { "generator": [ "^os-omurga sistemi" ] }, "implies": [ "MySQL", "PHP" ], "website": "https://www.os.com.tr" }, "OnShop": { "cats": [ 6 ], "meta": { "generator": [ "onshop ecommerce" ] }, "implies": [ "PHP" ], "description": "OnShop is an ecommerce platform for online merchants.", "website": "https://onshop.asia" }, "OnUniverse": { "cats": [ 51 ], "description": "OnUniverse is the first website builder and commerce platform built for mobile devices.", "website": "https://onuniverse.com" }, "One.com": { "cats": [ 88 ], "description": "One.com is a Denmark-based company offering bargain-priced WordPress and shared web hosting plans.", "website": "https://www.one.com" }, "OneAPM": { "cats": [ 10 ], "js": [ "bweum" ], "website": "https://www.oneapm.com" }, "OneAll": { "cats": [ 69 ], "js": [ "oa_social_login" ], "scriptSrc": [ "api\\.oneall\\.com/socialize" ], "description": "OneAll is a social login solution enables your users to sign into their accounts on your website or mobile app using their login details from networking sites.", "website": "https://www.oneall.com" }, "OneCause": { "cats": [ 111 ], "scriptSrc": [ "\\.onecause\\.com/" ], "description": "OneCause is a fundraising platform designed for nonprofits to manage all types of fundraising campaigns.", "website": "https://www.onecause.com" }, "OnePage Express": { "cats": [ 80 ], "js": [ "one_page_express_settings" ], "scriptSrc": [ "/wp-content/themes/one-page-express(?:-pro)?/" ], "description": "OnePage Express is a beautiful WordPress theme that can be used to create a one page website in minutes by drag and drop.", "website": "https://onepageexpress.com" }, "OnePress Social Locker": { "cats": [ 87 ], "js": [ "__pandalockers", "bizpanda" ], "scriptSrc": [ "/wp-content/plugins/social-?locker(?:-next-premium)?/bizpanda/assets/" ], "description": "Social Locker locks your most valuable site content behind a set of social buttons until the visitor likes, shares, +1s or tweets your page.", "website": "https://wordpress.org/plugins/social-locker" }, "OneSignal": { "cats": [ 32, 74 ], "js": [ "__onesignalsdkloadcount", "onesignal" ], "scriptSrc": [ "cdn\\.onesignal\\.com" ], "description": "OneSignal is a customer engagement messaging solution.", "website": "https://onesignal.com" }, "OneStat": { "cats": [ 10 ], "js": [ "onestat_pageview" ], "website": "https://www.onestat.com" }, "OneTrust": { "cats": [ 67 ], "cookies": { "optanonconsent": "" }, "scriptSrc": [ "cdn\\.cookielaw\\.org", "cdn\\.cookielaw\\.org", "optanon\\.blob\\.core\\.windows\\.net", "optanon\\.blob\\.core\\.windows\\.net", "otsdkstub\\.js" ], "description": "OneTrust is a cloud-based data privacy management compliance platform.", "website": "https://www.onetrust.com" }, "Oney": { "cats": [ 91 ], "js": [ "isoneyactive", "oneymarketplace", "openoneylayer" ], "scriptSrc": [ "/modules/oney(?:/)?/views/js/front\\.js" ], "description": "Oney is an app that gives consumers back the power over their spending and makes split payments universal.", "website": "https://www.oney.com" }, "Onfido": { "cats": [ 16, 69 ], "headers": { "content-security-policy": "(?:api|sync)\\.onfido\\.com" }, "description": "Onfido is a technology company that helps businesses verify people's identities using a photo-based identity document, a selfie and artificial intelligence algorithms.", "website": "https://onfido.com" }, "Ookla Speedtest Custom": { "cats": [ 5 ], "headers": { "content-security-policy": "\\.speedtestcustom\\.com" }, "scriptSrc": [ "\\.speedtestcustom\\.com/" ], "description": "Speedtest Custom is a robust and accurate testing solution that is HTML5-based, Flash-free and supports both mobile and desktop browsers built by Ookla.", "website": "https://www.ookla.com/speedtest-custom" }, "Oopy": { "cats": [ 51 ], "js": [ "__oopy__" ], "implies": [ "Next.js", "Notion" ], "description": "Oopy provides you with a simple and easy way to turn your Notion page into a performant website.", "website": "https://oopy.us/" }, "Open AdStream": { "cats": [ 36 ], "js": [ "oas_ad" ], "website": "https://www.xaxis.com" }, "Open Classifieds": { "cats": [ 6 ], "meta": { "author": [ "open-classifieds\\.com" ], "copyright": [ "open classifieds ?([0-9.]+)?\\;version:\\1" ] }, "website": "https://open-classifieds.com", "cpe": "cpe:2.3:a:open-classifieds:open_classifieds:*:*:*:*:*:*:*:*" }, "Open Graph": { "cats": [ 19 ], "description": "Open Graph is a protocol that is used to integrate any web page into the social graph.", "website": "https://ogp.me" }, "Open Journal Systems": { "cats": [ 50 ], "cookies": { "ojssid": "" }, "meta": { "generator": [ "open journal systems(?: ([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Open Journal Systems (OJS) is an open-source software application for managing and publishing scholarly journals.", "website": "https://pkp.sfu.ca/ojs", "cpe": "cpe:2.3:a:public_knowledge_project:open_journal_systems:*:*:*:*:*:*:*:*" }, "Open Web Analytics": { "cats": [ 10 ], "js": [ "owa.config.baseurl", "owa_baseurl", "owa_cmds" ], "html": [ "\u003c!-- (?:start|end) open web analytics tracker --\u003e" ], "website": "https://www.openwebanalytics.com", "cpe": "cpe:2.3:a:openwebanalytics:open_web_analytics:*:*:*:*:*:*:*:*" }, "Open eShop": { "cats": [ 6 ], "meta": { "author": [ "open-eshop\\.com" ], "copyright": [ "open eshop ?([0-9.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://open-eshop.com/" }, "Open-Xchange App Suite": { "cats": [ 30, 75 ], "js": [ "ox.version" ], "implies": [ "Java" ], "description": "Open-Xchange is a web-based communication, collaboration and office productivity software suite.", "website": "https://www.open-xchange.com/", "cpe": "cpe:2.3:a:open-xchange:app_suite:*:*:*:*:*:*:*:*" }, "OpenBSD httpd": { "cats": [ 22 ], "headers": { "server": "^openbsd httpd" }, "website": "https://man.openbsd.org/httpd.8", "cpe": "cpe:2.3:a:openbsd:openbsd:*:*:*:*:*:*:*:*" }, "OpenCV": { "cats": [ 59 ], "js": [ "opencvisready" ], "implies": [ "WebAssembly" ], "description": "OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library.", "website": "https://opencv.org" }, "OpenCart": { "cats": [ 6 ], "cookies": { "ocsessid": "" }, "implies": [ "MySQL", "PHP" ], "description": "OpenCart is a free and open-source ecommerce platform used for creating and managing online stores. It is written in PHP and uses a MySQL database to store information.", "website": "https://www.opencart.com", "cpe": "cpe:2.3:a:opencart:opencart:*:*:*:*:*:*:*:*" }, "OpenCities": { "cats": [ 1 ], "js": [ "opencities" ], "description": "OpenCities is a content management system built for government organizations.", "website": "https://granicus.com/solution/govaccess/opencities/" }, "OpenCms": { "cats": [ 1 ], "headers": { "server": "opencms" }, "html": [ "\u003clink href=\"/opencms/" ], "scriptSrc": [ "opencms" ], "implies": [ "Java" ], "website": "https://www.opencms.org", "cpe": "cpe:2.3:a:alkacon:opencms:*:*:*:*:*:*:*:*" }, "OpenElement": { "cats": [ 1 ], "js": [ "oe.getools", "oeconfwemenu" ], "meta": { "generator": [ "openelement\\s\\(([\\d\\.]+)\\)\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "OpenElement is a free website building application with a WYSIWYG interface.", "website": "https://openelement.uk" }, "OpenGSE": { "cats": [ 22 ], "headers": { "server": "gse" }, "implies": [ "Java" ], "description": "OpenGSE is a test suite used for testing servlet compliance. It is deployed by using WAR files that are deployed on the server engine.", "website": "https://code.google.com/p/opengse" }, "OpenGrok": { "cats": [ 19 ], "cookies": { "opengrok": "" }, "meta": { "generator": [ "opengrok(?: v?([\\d.]+))?\\;version:\\1" ] }, "implies": [ "Java" ], "website": "https://hub.opensolaris.org/bin/view/Project+opengrok/WebHome" }, "OpenLayers": { "cats": [ 35 ], "js": [ "ol.canvasmap", "openlayers.version_number" ], "scriptSrc": [ "openlayers" ], "description": "OpenLayers is an open-source JavaScript library for displaying map data in web browser.", "website": "https://openlayers.org" }, "OpenNemas": { "cats": [ 1 ], "headers": { "x-powered-by": "opennemas" }, "meta": { "generator": [ "opennemas" ] }, "website": "https://www.opennemas.com" }, "OpenPay": { "cats": [ 41, 91 ], "scriptSrc": [ "openpay\\.com.\\au" ], "description": "Openpay is an innovative online and in-store payment solution enabling you to purchase now and pay later, with no interest.", "website": "https://www.openpay.com.au/" }, "OpenResty": { "cats": [ 22 ], "headers": { "server": "openresty(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Nginx" ], "description": "OpenResty is a web platform based on nginx which can run Lua scripts using its LuaJIT engine.", "website": "https://openresty.org" }, "OpenSSL": { "cats": [ 33 ], "headers": { "server": "openssl(?:/([\\d.]+[a-z]?))?\\;version:\\1" }, "description": "OpenSSL is a software library for applications that secure communications over computer networks against eavesdropping or need to identify the party at the other end.", "website": "https://openssl.org", "cpe": "cpe:2.3:a:openssl:openssl:*:*:*:*:*:*:*:*" }, "OpenStreetMap": { "cats": [ 35 ], "description": "OpenStreetMap is a free, editable map of the whole world that is being built by volunteers largely from scratch and released with an open-content license.", "website": "https://www.openstreetmap.org" }, "OpenSwoole": { "cats": [ 18 ], "headers": { "server": "openswoole(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "PHP" ], "description": "OpenSwoole is a high-performance, asynchronous, event-driven, coroutine-based PHP framework.", "website": "https://openswoole.com" }, "OpenTable": { "cats": [ 93 ], "description": "OpenTable is an online restaurant-reservation service company founded by Sid Gorham, Eric Moe and Chuck Templeton on 2 July 1998 and is based in San Francisco, California.", "website": "https://restaurant.opentable.com" }, "OpenText Web Solutions": { "cats": [ 1 ], "html": [ "\u003c!--[^\u003e]+published by open text web solutions" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://websolutions.opentext.com" }, "OpenUI5": { "cats": [ 12 ], "js": [ "sap.ui.version" ], "scriptSrc": [ "sap-ui-core\\.js" ], "website": "https://openui5.org/" }, "OpenWeb": { "cats": [ 36 ], "js": [ "spotim.initconversation" ], "meta": { "spotim-ads": [] }, "description": "OpenWeb is a social engagement platform that builds online communities around digital content.", "website": "https://www.openweb.com" }, "OpenX": { "cats": [ 36 ], "js": [ "openx.name" ], "scriptSrc": [ "https?://[^/]*\\.openx\\.net", "https?://[^/]*\\.servedbyopenx\\.com" ], "description": "OpenX is a programmatic advertising technology company.", "website": "https://openx.com", "cpe": "cpe:2.3:a:openx:openx:*:*:*:*:*:*:*:*" }, "OperateBeyond": { "cats": [ 53 ], "scriptSrc": [ "//dealer-cdn\\.com/" ], "description": "OperateBeyond is a software development company that offers website design, automated inventory management, CRM, dealer websites, and DMS.", "website": "https://operatebeyond.com/dealer-websites-marketing" }, "Opigno LMS": { "cats": [ 21 ], "scripts": [ "opigno_(?:commerce|wtp_app|scorm|learning_path)" ], "description": "Opigno LMS is an open-source Learning Management System (LMS) based on Drupal, designed for creating and delivering online courses and educational content.", "website": "https://www.opigno.org" }, "OpinionLab": { "cats": [ 73 ], "js": [ "ooo.browser", "ooo.version" ], "scriptSrc": [ "\\.foresee\\.com/code/([\\d.]+)-oo/oo_engine\\.min\\.js\\;version:\\1" ], "description": "OpinionLab is a omnichannel customer feedback solution provider.", "website": "https://www.opinionlab.com" }, "OptiMonk": { "cats": [ 98, 77 ], "scriptSrc": [ "\\.optimonk\\.com/" ], "description": "OptiMonk is an on-site message toolkit used to improve conversions using action-based popups ad bars.", "website": "https://www.optimonk.com" }, "Optimise": { "cats": [ 71, 36 ], "js": [ "omid" ], "scriptSrc": [ "track\\.omguk\\.com" ], "description": "Optimise Media Group is a UK-based performance advertising network.", "website": "https://www.optimisemedia.com" }, "Optimizely": { "cats": [ 74, 76 ], "cookies": { "optimizelyenduserid": "" }, "js": [ "optimizely", "optimizelyclient.clientversion", "optimizelysdk" ], "scriptSrc": [ "optimizely\\.com.*\\.js" ], "description": "Optimizely is an experimentation platform that helps developers build and run A/B tests on websites.", "website": "https://www.optimizely.com" }, "Optimizely Commerce": { "cats": [ 6 ], "cookies": { "epi:statemarker": "" }, "meta": { "generator": [ "episerver" ] }, "description": "Optimizely Commerce is a complete suite for digital ecommerce and content management that uses artificial intelligence to deliver personalised experiences, individualised search rankings and product recommendations.", "website": "https://www.optimizely.com/products/commerce/b2c/" }, "Optimizely Content Management": { "cats": [ 1 ], "cookies": { "epi:statemarker": "", "episerver": "", "episessionid": "", "epitrace": "" }, "js": [ "epi.episerver" ], "headers": { "content-security-policy": "\\.episerver\\.net" }, "scriptSrc": [ "\\.episerver.net/" ], "meta": { "generator": [ "episerver" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Optimizely Content Management (formerly EPiServer) is digital content, ecommerce, and marketing management solution designed for editors and marketers.", "website": "https://www.optimizely.com/products/content/", "cpe": "cpe:2.3:a:episerver:episerver:*:*:*:*:*:*:*:*" }, "Optimove": { "cats": [ 97 ], "js": [ "optimovesdk", "optimovesdkversion" ], "scriptSrc": [ "\\.optimove\\.net/.+v([\\d\\.]+)\\.js\\;version:\\1" ], "description": "Optimove is a relationship marketing hub powered by a combination of advanced customer modeling, predictive micro-segmentation and campaign automation technologies.", "website": "https://www.optimove.com" }, "OptinMonster": { "cats": [ 32 ], "js": [ "optinmonsterapp" ], "description": "OptinMonster is a conversion optimisation tool that allows you to grow your email list.", "website": "https://optinmonster.com" }, "OptinMonster plugin": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/optinmonster/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "OptinMonster" ], "description": "OptinMonster is a lead-generation plugin for WordPress.", "website": "https://optinmonster.com" }, "Oracle Application Express": { "cats": [ 51 ], "js": [ "apex.libversions", "apex_img_dir" ], "description": "Oracle Application Express (APEX) is an enterprise low-code development platform from Oracle Corporation. APEX is a fully supported no-cost feature of Oracle Database.", "website": "https://apex.oracle.com" }, "Oracle Application Server": { "cats": [ 22 ], "headers": { "server": "oracle[- ]application[- ]server(?: containers for j2ee)?(?:[- ](\\d[\\da-z./]+))?\\;version:\\1" }, "website": "https://www.oracle.com/technetwork/middleware/ias/overview/index.html", "cpe": "cpe:2.3:a:oracle:application_server:*:*:*:*:*:*:*:*" }, "Oracle BlueKai": { "cats": [ 86 ], "js": [ "bluekailoaded" ], "scriptSrc": [ "tags\\.(?:bluekai|bkrtx)\\.com/" ], "description": "Oracle BlueKai is a cloud-based big data platform that enables companies to personalise online, offline, and mobile marketing campaigns.", "website": "https://www.oracle.com/cx/marketing/data-management-platform" }, "Oracle Commerce": { "cats": [ 6 ], "headers": { "x-atg-version": "(?:atgplatform/([\\d.]+))?\\;version:\\1" }, "description": "Oracle Commerce is a unified B2B and B2C ecommerce platform.", "website": "https://www.oracle.com/applications/customer-experience/commerce/products/commerce-platform/index.html", "cpe": "cpe:2.3:a:oracle:commerce_platform:*:*:*:*:*:*:*:*" }, "Oracle Commerce Cloud": { "cats": [ 6 ], "headers": { "oraclecommercecloud-version": "^(.+)$\\;version:\\1" }, "description": "Oracle Commerce Cloud is a cloud-native, fully featured, extensible SaaS ecommerce solution, delivered in the Oracle Cloud, supporting B2C and B2B models in a single platform.", "website": "https://cloud.oracle.com/commerce-cloud" }, "Oracle Dynamic Monitoring Service": { "cats": [ 19 ], "headers": { "x-oracle-dms-ecid": "" }, "implies": [ "Oracle WebLogic Server" ], "description": "Oracle Dynamic Monitoring Service is a feature of Oracle WebLogic Server that provides real-time monitoring and diagnostic capabilities for Java applications running on the WebLogic Server.", "website": "https://oracle.com" }, "Oracle HTTP Server": { "cats": [ 22 ], "headers": { "server": "oracle-http-server(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://oracle.com", "cpe": "cpe:2.3:a:oracle:http_server:*:*:*:*:*:*:*:*" }, "Oracle Infinity": { "cats": [ 10 ], "scriptSrc": [ "c\\.oracleinfinity\\.io" ], "description": "Oracle Infinity is a digital analytics platform for tracking, measuring, and optimizing the performance and visitor behavior of enterprise websites and mobile apps.", "website": "https://www.oracle.com/cx/marketing/digital-intelligence/" }, "Oracle Maxymiser": { "cats": [ 74, 76 ], "js": [ "maxy", "mmsystem.getconfig" ], "scriptSrc": [ "service\\.maxymiser\\.net" ], "description": "Oracle Maxymiser is a real-time behavioral targeting, in-session personalisation, and product recommendations platform.", "website": "https://www.oracle.com/uk/cx/marketing/personalization-testing" }, "Oracle Moat Measurement": { "cats": [ 10 ], "scriptSrc": [ "moatads\\.com" ], "description": "Oracle Moat delivers solutions that are critical to measuring advertising effectiveness, including verification and attention, reach, and frequency as well as sales lift measurement.", "website": "https://www.oracle.com/cx/advertising/measurement/" }, "Oracle Recommendations On Demand": { "cats": [ 10 ], "scriptSrc": [ "atgsvcs.+atgsvcs\\.js" ], "website": "https://www.oracle.com/us/products/applications/commerce/recommendations-on-demand/index.html" }, "Oracle Web Cache": { "cats": [ 23 ], "headers": { "server": "oracle(?:as)?[- ]web[- ]cache(?:[- /]([\\da-z./]+))?\\;version:\\1" }, "description": "Oracle Web Cache is a browser and content management server, which improves the performance of web sites.", "website": "https://oracle.com", "cpe": "cpe:2.3:a:oracle:web_cache:*:*:*:*:*:*:*:*" }, "Oracle WebLogic Server": { "cats": [ 22 ], "implies": [ "Java" ], "description": "Oracle WebLogic Server is a Java-based application server that provides a platform for developing, deploying, and running enterprise-level Java applications.", "website": "https://www.oracle.com/java/weblogic/", "cpe": "cpe:2.3:a:bea:weblogic_server:*:*:*:*:*:*:*:*" }, "Orankl": { "cats": [ 90 ], "js": [ "orankl", "oranklinit" ], "scriptSrc": [ "www\\.orankl\\.com/" ], "description": "Orankl is a provider email marketing and review services.", "website": "https://www.orankl.com" }, "OrbitFox": { "cats": [ 87, 5 ], "description": "OrbitFox is a multi-featured WordPress plugin that works with the Elementor, Beaver Builder and Gutenberg site-building utilities by Themeisle.", "website": "https://themeisle.com/plugins/orbit-fox-companion" }, "Orchard Core": { "cats": [ 1 ], "headers": { "x-generator": "^orchard$", "x-powered-by": "orchardcore" }, "scriptSrc": [ "/orchardcore\\." ], "meta": { "generator": [ "orchard" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Orchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS).", "website": "https://orchardcore.net", "cpe": "cpe:2.3:a:orchardcore:orchard_core:*:*:*:*:*:*:*:*" }, "Orckestra": { "cats": [ 6 ], "headers": { "x-orckestra-commerce": ".net client", "x-powered-by": "orckestra" }, "meta": { "generator": [ "^c1 cms foundation - free open source from orckestra and https://github.com/orckestra/c1-cms-foundation$" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Orckestra is a provider of cloud-based digital unified and omnichannel commerce solutions for retail and manufacturing industries.", "website": "https://www.orckestra.com" }, "Order Deadline": { "cats": [ 100 ], "js": [ "orderdeadlineappbyeesl" ], "implies": [ "Shopify" ], "description": "Order Deadline is an estimated delivery, countdown timer, shipping date Shopify app.", "website": "https://apps.shopify.com/order-deadline" }, "OrderCast": { "cats": [ 6 ], "implies": [ "Python", "React" ], "description": "OrderCast is a B2B ecommerce platform focused on streamlining wholesale operations, offering SKU management, order handling, and customisable online store features for improved customer experience.", "website": "https://www.ordercast.io" }, "OrderLogic app": { "cats": [ 100 ], "js": [ "orderlogic.alerts_key", "orderlogic.cartdata", "orderlogic.default_money_format" ], "implies": [ "Shopify" ], "description": "OrderLogic app allows you to define minimum and maximum product quantities for all products in your Shopify store.", "website": "https://apps.shopify.com/orderlogic" }, "OrderYOYO": { "cats": [ 6 ], "js": [ "smartbanneroy" ], "description": "OrderYOYO is an online ordering, payment, and marketing software solution provider.", "website": "https://orderyoyo.com" }, "Ordergroove": { "cats": [ 41 ], "headers": { "content-security-policy": "\\.ordergroove\\.com" }, "scriptSrc": [ "\\.ordergroove\\.com/" ], "description": "Ordergroove provides a SaaS (Software as a Service) based subscription and membership commerce platform.", "website": "https://www.ordergroove.com/" }, "Ordersify Product Alerts": { "cats": [ 100 ], "js": [ "ordersify_bis.stockremainingsetting" ], "scriptSrc": [ "cdn\\.ordersify\\.com/sdk/productalerts-shopify\\.js" ], "implies": [ "Shopify" ], "description": "Ordersify Product Alerts is a Shopify app which detects automatically product stock and send email alerts to contact immediately after your products are restocked.", "website": "https://ordersify.com/products/product-alerts" }, "OroCommerce": { "cats": [ 6 ], "html": [ "\u003cscript [^\u003e]+data-requiremodule=\"oro/", "\u003cscript [^\u003e]+data-requiremodule=\"oroui/" ], "scriptSrc": [ "oro\\.min\\.js\\?version=([\\d.]+)\\;version:\\1" ], "implies": [ "MySQL", "PHP" ], "website": "https://oroinc.com" }, "Osano": { "cats": [ 67 ], "js": [ "osano" ], "scriptSrc": [ "cmp\\.osano\\.com/" ], "description": "Osano is a data privacy platform that helps your website become compliant with laws such as GDPR and CCPA.", "website": "https://www.osano.com" }, "Osterreichische Post": { "cats": [ 99 ], "description": "Österreichische Post is an Austrian logistics and postal services provider.", "website": "https://www.post.at" }, "OutSystems": { "cats": [ 47 ], "js": [ "outsystems", "outsystemsdebugger" ], "scriptSrc": [ "scripts/outsystems(?:[\\w]+)?\\.js" ], "implies": [ "IIS", "Windows Server" ], "description": "OutSystems is a low-code platform which provides tools for companies to develop, deploy and manage omnichannel enterprise applications.", "website": "https://www.outsystems.com" }, "OutTheBoxThemes Panoramic": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/panoramic/.+custom\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Panoramic is a fully responsive WordPress theme with a homepage slider by OutTheBoxThemes.", "website": "https://www.outtheboxthemes.com/wordpress-themes/panoramic" }, "Outbrain": { "cats": [ 5, 36 ], "js": [ "ob_adv_id", "ob_releasever", "obapi.version", "outbrainpermalink" ], "scriptSrc": [ "\\.outbrain\\.com/" ], "description": "Outbrain is a web advertising platform that displays boxes of links, known as chumboxes, to pages within websites.", "website": "https://www.outbrain.com" }, "Outlook Web App": { "cats": [ 30 ], "js": [ "isowapremiumbrowser" ], "headers": { "x-owa-version": "([\\d\\.]+)?\\;version:\\1" }, "html": [ "\u003clink[^\u003e]+/owa/auth/([\\d\\.]+)/themes/resources\\;version:\\1" ], "implies": [ "Microsoft ASP.NET" ], "description": "Outlook on the web is an information manager web app. It includes a web-based email client, a calendar tool, a contact manager, and a task manager.", "website": "https://help.outlook.com", "cpe": "cpe:2.3:a:microsoft:outlook_web_access:*:*:*:*:*:*:*:*" }, "Oxatis": { "cats": [ 6 ], "meta": { "generator": [ "^oxatis\\s\\(www\\.oxatis\\.com\\)$" ] }, "description": "Oxatis is a cloud-based ecommerce solution which enables users to create and manage their own online store websites.", "website": "https://www.oxatis.com/" }, "Oxi Social Login": { "cats": [ 69 ], "scriptSrc": [ "social-login\\.oxiapps\\.com" ], "description": "Oxi Social Login provides one click login with services like Facebook, Google and many more.", "website": "https://www.oxiapps.com/" }, "Oxygen": { "cats": [ 51, 87 ], "html": [ "\u003cbody class=(?:\"|')[^\"']*oxygen-body", "\u003clink [^\u003e]*href=(?:\"|')[^\u003e]*wp-content/plugins/oxygen/" ], "scriptSrc": [ "wp-content/plugins/oxygen" ], "description": "Oxygen Builder is a tool to build a WordPress website.", "website": "https://oxygenbuilder.com" }, "PCRecruiter": { "cats": [ 101 ], "js": [ "pcrbaseurl", "pcrdialog", "pcrframeoptions" ], "description": "PCRecruiter is an ATS/CRM hybrid SaaS solution for recruiting and sourcing professionals.", "website": "https://www.pcrecruiter.net" }, "PDF.js": { "cats": [ 19 ], "js": [ "_pdfjscompatibilitychecked", "pdfjs", "pdfjs.version", "pdfjsdistbuildpdf.version", "pdfjslib.version" ], "html": [ "\u003c\\/div\u003e\\s*\u003c!-- outercontainer --\u003e\\s*\u003cdiv\\s*id=\"printcontainer\"\u003e\u003c\\/div\u003e" ], "website": "https://mozilla.github.io/pdf.js/" }, "PHP": { "cats": [ 27 ], "cookies": { "phpsessid": "" }, "headers": { "server": "php/?([\\d.]+)?\\;version:\\1", "x-powered-by": "^php/?([\\d.]+)?\\;version:\\1" }, "description": "PHP is a general-purpose scripting language used for web development.", "website": "https://php.net", "cpe": "cpe:2.3:a:php:php:*:*:*:*:*:*:*:*" }, "PHP-Nuke": { "cats": [ 1 ], "html": [ "\u003c[^\u003e]+powered by php-nuke" ], "meta": { "generator": [ "php-nuke" ] }, "implies": [ "PHP" ], "website": "https://phpnuke.org", "cpe": "cpe:2.3:a:phpnuke:php-nuke:*:*:*:*:*:*:*:*" }, "PHPDebugBar": { "cats": [ 47 ], "js": [ "phpdebugbar", "phpdebugbar" ], "scriptSrc": [ "debugbar.*\\.js" ], "website": "https://phpdebugbar.com/" }, "PHPFusion": { "cats": [ 1 ], "headers": { "x-phpfusion": "(.+)$\\;version:\\1", "x-powered-by": "phpfusion (.+)$\\;version:\\1" }, "html": [ "powered by \u003ca href=\"[^\u003e]+php-fusion", "powered by \u003ca href=\"[^\u003e]+phpfusion" ], "implies": [ "MySQL", "PHP" ], "website": "https://phpfusion.com", "cpe": "cpe:2.3:a:phpfusion:phpfusion:*:*:*:*:*:*:*:*" }, "PIXIjs": { "cats": [ 25 ], "js": [ "pixi", "pixi.version", "pixi_webworker_url" ], "scriptSrc": [ "pixi(?:\\.min|-legacy)?\\.js$" ], "description": "PIXIjs is a free open-source 2D engine used to make animated websites and HTML5 games.", "website": "https://www.pixijs.com" }, "POLi Payment": { "cats": [ 41 ], "js": [ "wc_ga_pro.available_gateways.poli" ], "description": "POLi Payment(formerly known as Centricom) is an online payment service in Australia and New Zealand.", "website": "https://www.polipayments.com" }, "POWR": { "cats": [ 5 ], "js": [ "loadpowr", "powr_receivers" ], "scriptSrc": [ "www\\.powr\\.io/powr\\.js" ], "description": "POWR is a cloud-based system of plugins that work on almost any website.", "website": "https://www.powr.io" }, "PRONOTE": { "cats": [ 21 ], "headers": { "server": "^pronote\\s[\\d]{4}\\s-\\s([\\d\\.]+)\\;version:\\1" }, "meta": { "application-name": [ "^pronote$" ] }, "description": "PRONOTE is an information system created by Index Education, a French company, designed for deployment in approximately 7,400 schools to enable streamlined communication among administrative personnel, teachers, and families.", "website": "https://www.index-education.com/fr/logiciel-gestion-vie-scolaire.php" }, "PWA": { "cats": [ 19 ], "description": "Progressive Web Apps (PWAs) are web apps built and enhanced with modern APIs to deliver enhanced capabilities, reliability, and installability while reaching anyone, anywhere, on any device, all with a single codebase.", "website": "https://web.dev/progressive-web-apps/" }, "PWA Studio": { "cats": [ 108 ], "js": [ "__fetchlocaledata__", "fetchrootcomponent" ], "scripts": [ "rootcmp_cms_page" ], "description": "PWA Studio is a collection of tools that lets developers build complex Progressive Web Applications on top of Magento 2 or Adobe Commerce stores.", "website": "https://developer.adobe.com/commerce/pwa-studio/" }, "Pace": { "cats": [ 41, 91 ], "js": [ "pacepay", "rely_month_installment", "rely_shop_currency", "rely_shop_money_format" ], "scriptSrc": [ "pay\\.pacenow\\.co" ], "description": "PacePay offers a BNPL (Buy now pay later) solution for merchants.", "website": "https://pacenow.co/" }, "Packlink PRO": { "cats": [ 100, 99 ], "scriptSrc": [ "packlink-spf-pro\\.appspot\\.com/.+myshopify\\.com" ], "implies": [ "Shopify" ], "description": "Packlink PRO is a multicarrier shipping solutions for ecommerce and marketplaces.", "website": "https://apps.shopify.com/packlink-pro" }, "Paddle": { "cats": [ 41 ], "js": [ "paddle.checkout", "paddlescriptlocation" ], "scriptSrc": [ "cdn\\.paddle\\.com/paddle/paddle\\.js" ], "description": "Paddle is a billing and payment gateway for B2B SaaS companies.", "website": "https://paddle.com/" }, "PagSeguro": { "cats": [ 41 ], "js": [ "_pagsegurodirectpayment", "pagsegurodirectpayment" ], "scriptSrc": [ "\\.pagseguro\\.uol\\.com\\.br/" ], "description": "PagSeguro is an online or mobile payment-based ecommerce service for commercial operations.", "website": "https://pagseguro.uol.com.br" }, "Pagar.me": { "cats": [ 41 ], "js": [ "pagarme.balance", "pagarmecheckout" ], "scriptSrc": [ "assets\\.pagar\\.me/" ], "description": "Pagar.me is a Portuguese-language online payments solution for businesses in Brazil.", "website": "https://pagar.me" }, "Page Builder Framework": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/page-builder-framework/.+site-min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Page Builder Framework is a lightweight (less than 50kb on the frontend) and highly customizible WordPress theme.", "website": "https://wp-pagebuilderframework.com" }, "PageFly": { "cats": [ 51 ], "js": [ "__pagefly_setting__" ], "headers": { "x-powered-by": "pagefly" }, "scriptSrc": [ "cdn\\.pagefly\\.io" ], "description": "PageFly is an app for Shopify that allows you to build landing pages, product pages, blogs, and FAQs.", "website": "https://pagefly.io" }, "Pagefai CMS": { "cats": [ 1 ], "headers": { "x-powered-by": "pagefai cms" }, "description": "Pagefai is a cloud-based platform that offers software-as-a-service solutions to businesses, including the Pagefai CMS which provides ecommerce functionality and other business tools.", "website": "https://www.pagefai.com" }, "Pagekit": { "cats": [ 1 ], "meta": { "generator": [ "pagekit" ] }, "website": "https://pagekit.com", "cpe": "cpe:2.3:a:pagekit:pagekit:*:*:*:*:*:*:*:*" }, "Pagely": { "cats": [ 62, 88 ], "headers": { "server": "^pagely" }, "implies": [ "Amazon Web Services", "WordPress" ], "website": "https://pagely.com/" }, "Pagevamp": { "cats": [ 1 ], "js": [ "pagevamp" ], "headers": { "x-servedby": "pagevamp" }, "website": "https://www.pagevamp.com" }, "Paidy": { "cats": [ 41, 91 ], "js": [ "constants.paidy" ], "scriptSrc": [ "apps\\.paidy\\.com" ], "description": "Paidy is basically a two-sided payments service, acting as a middleman between consumers and merchants in Japan.", "website": "https://paidy.com" }, "Paloma": { "cats": [ 100 ], "js": [ "paloma.createcookie" ], "scriptSrc": [ "\\.getpaloma\\.com/" ], "description": "Paloma helps ecommerce businesses sell directly to customers in messaging channels, with automated personal shopping conversations.", "website": "https://www.getpaloma.com" }, "Panda CSS": { "cats": [ 66 ], "css": [ "--made-with-panda" ], "description": "Panda is a styling engine that generates styling primitives to author atomic CSS and recipes in a type-safe and readable manner.", "website": "https://panda-css.com/" }, "Panelbear": { "cats": [ 10, 13 ], "js": [ "panelbear" ], "description": "Panelbear is a simple website performance and traffic analytics tool.", "website": "https://panelbear.com" }, "Pantheon": { "cats": [ 62 ], "headers": { "server": "^pantheon", "x-pantheon-styx-hostname": "", "x-styx-req-id": "" }, "implies": [ "Fastly", "MariaDB", "Nginx", "PHP" ], "description": "Pantheon is a WebOps (Website Operations) and Management Platform for WordPress and Drupal.", "website": "https://pantheon.io/" }, "Paradox": { "cats": [ 101 ], "js": [ "_applybase", "oliviachatbaseurl" ], "description": "Paradox is an AI company that helps companies capture and screen candidates, improve conversions, and answer all candidate questions.", "website": "https://www.paradox.ai" }, "Parcelforce": { "cats": [ 99 ], "description": "Parcelforce is a courier and logistics service in the United Kingdom.", "website": "https://www.parcelforce.com" }, "ParkingCrew": { "cats": [ 19 ], "js": [ "pcrewadloaded" ], "scripts": [ "var\\slink\\s=\\s'www\\.parkingcrew\\.net'" ], "description": "ParkingCrew is a direct navigation monetisation provider.", "website": "https://www.parkingcrew.com" }, "Parmin Cloud": { "cats": [ 63 ], "headers": { "x-powered-by": "^parmincloud$" }, "description": "Parmin Cloud operates in the field of cloud services.", "website": "https://parmin.cloud" }, "Pars Elecom Portal": { "cats": [ 1 ], "headers": { "x-powered-by": "pars elecom portal" }, "meta": { "copyright": [ "pars elecom portal" ] }, "implies": [ "IIS", "Microsoft ASP.NET", "Windows Server" ], "website": "https://parselecom.net" }, "Parse.ly": { "cats": [ 10 ], "js": [ "parsely" ], "website": "https://www.parse.ly" }, "Partial.ly": { "cats": [ 41, 91 ], "js": [ "partiallybutton" ], "scriptSrc": [ "partial\\.ly" ], "description": "Partial.ly payment plan software lets businesses offer customizable payment plans to their customers.", "website": "https://partial.ly/" }, "Partnerize": { "cats": [ 71 ], "description": "Partnerize is the only partnership management solution for marketers seeking high quality, scalable subsidies to primary channels.", "website": "https://prf.hn" }, "Parttrap ONE": { "cats": [ 6 ], "js": [ "pt.analytics.additem", "pt.sections.checkout", "pt.translation.basketisempty" ], "implies": [ "Bootstrap", "Handlebars", "Microsoft ASP.NET" ], "description": "Parttrap ONE is a complete solution including PIM, CMS, business optimization and ERP integration.", "website": "https://www.parttrap.com" }, "Partytown": { "cats": [ 92 ], "js": [ "partytown" ], "description": "Partytown is a lazy-loaded library to help relocate resource intensive scripts into a web worker, and off of the main thread.", "website": "https://partytown.builder.io/" }, "Passage": { "cats": [ 69 ], "scriptSrc": [ "\\.1password\\.com/" ], "description": "Passage, a feature provided by 1Password, enables easy implementation of passwordless authentication methods on websites and apps.", "website": "https://passage.1password.com" }, "Paths.js": { "cats": [ 25 ], "scriptSrc": [ "paths(?:\\.min)?\\.js" ], "website": "https://github.com/andreaferretti/paths-js" }, "Patreon": { "cats": [ 5, 41 ], "scriptSrc": [ "patreon-connect/assets/.+ver=([\\d.]+)\\;version:\\1" ], "description": "Patreon is an American membership platform that provides business tools for content creators to run a subscription service.", "website": "https://www.patreon.com" }, "Pattern by Etsy": { "cats": [ 6 ], "js": [ "etsy" ], "description": "Pattern is an offering by Etsy to set up a website for Etsy sellers, in addition to Etsy shop.", "website": "https://www.etsy.com/pattern" }, "Pay It Later": { "cats": [ 91 ], "js": [ "payitlater" ], "scriptSrc": [ "/wp-content/plugins/payitlater-gateway-for-woocommerce/(?:.+\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Pay It Later collect payments in weekly instalments from you when you make a purchase online, so you can buy now and pay it later.", "website": "https://www.payitlater.com.au" }, "PayBright": { "cats": [ 41, 91 ], "js": [ "_paybright_config" ], "scriptSrc": [ "app\\.paybright\\.com" ], "description": "PayBright is a Canadian fintech company that offers short-term interest-free installment loans for online shopping to consumers at checkout.", "website": "https://paybright.com" }, "PayFast": { "cats": [ 41 ], "description": "PayFast is a payments processing service for South Africans \u0026 South African websites.", "website": "https://www.payfast.co.za/" }, "PayGreen": { "cats": [ 41 ], "js": [ "paygreenjs" ], "description": "PayGreen is a French payment processor.", "website": "https://www.paygreen.io" }, "PayJustNow": { "cats": [ 91 ], "scriptSrc": [ "\\.payjustnow\\.com/" ], "description": "PayJustNow is a buy now, pay later checkout option for ecommerce sites.", "website": "https://payjustnow.com" }, "PayKickStart": { "cats": [ 5, 71 ], "scriptSrc": [ "app\\.paykickstart\\.com" ], "description": "PayKickstart is an online shopping cart and affiliate management platform with built-in conversion enhancing features like one-click upsells for credit card/paypal, order bumps, custom checkout pages/widgets/embed forms, coupon management, auto-complete shipping fields, subscription saver sequences, and more.", "website": "https://paykickstart.com" }, "PayPal": { "cats": [ 41 ], "js": [ "__paypal_global__", "checkout.enabledpayments.paypal", "enablepaypal", "paypal", "paypal", "paypalclientid", "paypaljs", "wc_ga_pro.available_gateways.paypal" ], "headers": { "content-security-policy": "\\.paypal\\.com" }, "scriptSrc": [ "paypalobjects\\.com" ], "meta": { "id": [ "in-context-paypal-metadata" ] }, "description": "PayPal is an online payments system that supports online money transfers and serves as an electronic alternative to traditional paper methods like checks and money orders.", "website": "https://paypal.com", "cpe": "cpe:2.3:a:paypal:paypal:*:*:*:*:*:*:*:*" }, "PayPal Credit": { "cats": [ 91 ], "js": [ "paypalcreditpopover", "paypaloffersobject" ], "scriptSrc": [ "\\.paypalobjects\\.com/.+/smart-credit-message@([\\d\\.]+)\\.js\\;version:\\1" ], "implies": [ "PayPal" ], "description": "PayPal Credit is a reusable line of credit that lets you pay for online purchases over time.", "website": "https://www.paypal.com/uk/webapps/mpp/paypal-virtual-credit" }, "PayPal Marketing Solutions": { "cats": [ 10, 32 ], "scriptSrc": [ "\\.paypal\\.com/tagmanager/pptm\\.js", "\\.paypalobjects\\.com/muse/" ], "implies": [ "PayPal" ], "description": "PayPal Marketing Solutions enables merchants to see shopper insights and provide custom rewards for buyers with PayPal accounts.", "website": "https://developer.paypal.com/docs/marketing-solutions" }, "PayWhirl": { "cats": [ 41 ], "js": [ "paywhirlforshopifysettings" ], "description": "PayWhirl provides widgets and tools to handle recurring payments.", "website": "https://app.paywhirl.com/" }, "Payflex": { "cats": [ 41, 91 ], "scriptSrc": [ "partpayassets\\.blob\\.core\\.windows\\.net" ], "description": "Payflex offers an online payment gateway solution to South African merchants that allows shoppers to pay over 6 weeks, interest-free.", "website": "https://payflex.co.za/" }, "Payl8r": { "cats": [ 41, 91 ], "scriptSrc": [ "payl8r\\.com" ], "description": "PayL8r.com offers repayment plans and online finance which allow you to purchase products online.", "website": "https://payl8r.com/" }, "Paylocity": { "cats": [ 101 ], "description": "Paylocity is an American company which provides cloud-based payroll and human capital management software.", "website": "https://www.paylocity.com" }, "Paymenter": { "cats": [ 1, 6 ], "cookies": { "paymenter_session": "" }, "implies": [ "MySQL", "PHP", "Tailwind CSS" ], "description": "Paymenter is an open-source webshop solution for hosting companies.", "website": "https://paymenter.org" }, "Payplug": { "cats": [ 41 ], "js": [ "payplug.card", "payplug_ajax_url", "payplug_domain" ], "description": "Payplug is a French omnichannel payment solution dedicated to merchants.", "website": "https://www.payplug.com" }, "Paysafe": { "cats": [ 41 ], "js": [ "paysafe", "paysafe.checkout", "paysafe.fields", "paysafe.threedsecure" ], "scriptSrc": [ "/hosted\\.paysafe\\.com/" ], "description": "Paysafe is a payment platform that enables businesses and consumers to connect and transact by payment processing, digital wallet, and online cash solutions.", "website": "https://www.paysafe.com/en" }, "PebblePost": { "cats": [ 77 ], "scriptSrc": [ "cdn\\.pbbl\\.co/" ], "description": "PebblePost provides marketers a way to transform recent online data into intelligent direct mail programs that perform.", "website": "https://www.pebblepost.com" }, "Peek": { "cats": [ 5, 72 ], "js": [ "_peekconfig", "peek", "peekjsapi" ], "scriptSrc": [ "js\\.peek\\.\\w+" ], "description": "Peek is a online booking system for tour and activity providers.", "website": "https://www.peek.com/" }, "PeerBoard": { "cats": [ 2 ], "scriptSrc": [ "\\.peerboard\\.com/" ], "description": "PeerBoard is a plug-and-play community solution, which helps groups, clubs, startups, marketplaces and businesses create discussion forums.", "website": "https://peerboard.com" }, "PeerTube": { "cats": [ 2 ], "meta": { "og:platform": [ "^peertube$" ] }, "description": "PeerTube is a free and open-source, decentralized, federated video platform powered by ActivityPub and WebTorrent.", "website": "https://joinpeertube.org/" }, "Pelican": { "cats": [ 57 ], "html": [ "powered by \u003ca href=\"[^\u003e]+getpelican\\.com", "powered by \u003ca href=\"https?://pelican\\.notmyidea\\.org" ], "implies": [ "Python" ], "website": "https://blog.getpelican.com/" }, "PencilBlue": { "cats": [ 1, 11 ], "headers": { "x-powered-by": "pencilblue" }, "implies": [ "Node.js" ], "website": "https://github.com/pencilblue/pencilblue" }, "Pendo": { "cats": [ 10, 58 ], "js": [ "pendo.host", "pendo.version" ], "scriptSrc": [ "\\.pendo\\.io/" ], "description": "Pendo is a product analytics platform used in release to enrich the product experience and provide insights to the product management team.", "website": "https://www.pendo.io" }, "Pepperjam": { "cats": [ 71 ], "js": [ "pepperjam", "pepperjamtracking" ], "scriptSrc": [ "\\.pepperjam\\.com/" ], "description": "Pepperjam is an affiliate marketing solutions provider.", "website": "https://www.pepperjam.com" }, "Percona": { "cats": [ 34 ], "description": "Percona server is an opensource, fully compatible, enhanced drop-in replacement for MySQL, providing superior performance, scalability, and instrumentation.", "website": "https://www.percona.com" }, "Percussion": { "cats": [ 1 ], "html": [ "\u003c[^\u003e]+class=\"perc-region\"" ], "meta": { "generator": [ "(?:percussion|rhythmyx)" ] }, "website": "https://percussion.com" }, "PerfectApps Swift": { "cats": [ 100, 92 ], "js": [ "ps_apiuri", "ps_storeurl" ], "scriptSrc": [ "swift\\.perfectapps\\.io/" ], "description": "Swift is a page speed solution for ecommerce store owners built by PerfectApps.", "website": "https://apps.shopify.com/swift" }, "Perfex CRM": { "cats": [ 53 ], "scriptSrc": [ "/assets/themes/perfex/js/global\\.min\\.js(?:\\?v=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Perfex CRM is self hosted customer relationship management software that is a great fit for almost any company, freelancer or many other uses.", "website": "https://www.perfexcrm.com" }, "Perfmatters": { "cats": [ 87, 92 ], "scriptSrc": [ "/wp-content/(?:plugins|cache|uploads)/perfmatters/" ], "description": "Perfmatters is a performance optimisation plugin for WordPress websites.", "website": "https://perfmatters.io" }, "Performance Lab": { "cats": [ 87, 92 ], "meta": { "generator": [ "^performance lab ?([\\d.]+)?\\;version:\\1" ] }, "description": "Performance plugin from the WordPress Performance Group, which is a collection of standalone performance modules.", "website": "https://wordpress.org/plugins/performance-lab/" }, "PerimeterX": { "cats": [ 16 ], "cookies": { "_px3": "", "_pxff_cc": "", "_pxhd": "", "_pxvid": "" }, "js": [ "_pxappid" ], "scriptSrc": [ "client\\.a\\.pxi\\.pub/" ], "description": "PerimeterX is a provider of scalable, behavior-based threat protection technology for the web, cloud, and mobile.", "website": "https://www.perimeterx.com" }, "Periodic": { "cats": [ 72 ], "scriptSrc": [ "/integrations/embed/periodic-embed-resize\\.js" ], "description": "Periodic is a white-label scheduling system.", "website": "https://periodic.is" }, "Peripl": { "cats": [ 10 ], "description": "Peripl is a French software company that provides cloud-based software solutions for business management, including accounting, invoicing, payroll, and project management.", "website": "https://www.peripl.fr" }, "Perl": { "cats": [ 27 ], "headers": { "server": "\\bperl\\b(?: ?/?v?([\\d.]+))?\\;version:\\1" }, "description": "Perl is a family of two high-level, general-purpose, interpreted, dynamic programming languages.", "website": "https://perl.org", "cpe": "cpe:2.3:a:perl:perl:*:*:*:*:*:*:*:*" }, "Permutive": { "cats": [ 19 ], "js": [ "permutive" ], "scriptSrc": [ "cdn\\.permutive\\.com" ], "description": "Permutive is a publisher-focused data management platform.", "website": "https://permutive.com" }, "PersonaClick": { "cats": [ 76 ], "js": [ "personaclick", "personaclick_callback" ], "scriptSrc": [ "cdn\\.personaclick\\.com/v([\\d.]+)\\.js\\;version:\\1" ], "description": "PersonaClick is a provide personalisation, recommandation and multi channel services.", "website": "https://www.personaclick.com" }, "Personio": { "cats": [ 101 ], "scriptSrc": [ "\\.cdn\\.personio\\." ], "description": "Personio is the all-in-one HR software for small- and medium-sized companies with 10 to 2000 employees.", "website": "https://www.personio.com" }, "Personizely": { "cats": [ 76 ], "js": [ "personizely" ], "scriptSrc": [ "static\\.personizely\\.net/" ], "description": "Personizely is a conversion marketing toolkit which helps websites and ecommerce stores better engage with visitors using website widgets and personalisation.", "website": "https://www.personizely.net" }, "Perzonalization": { "cats": [ 76 ], "scriptSrc": [ "cdn\\.perzonalization\\.com" ], "description": "Perzonalization is a AI powered personalization engine for eCommerce", "website": "https://www.perzonalization.com/" }, "Phabricator": { "cats": [ 13, 47 ], "cookies": { "phsid": "" }, "html": [ "\u003c[^\u003e]+(?:class|id)=\"phabricator-" ], "scriptSrc": [ "/phabricator/[a-f0-9]{8}/rsrc/js/phui/[a-z-]+\\.js$" ], "implies": [ "PHP" ], "description": "Phabricator is a suite of web-based software development collaboration tools, including the Differential code review tool, the Diffusion repository browser, the Herald change monitoring tool, the Maniphest bug tracker and the Phriction wiki. Phabricator integrates with Git, Mercurial, and Subversion.", "website": "https://phacility.com" }, "Phaser": { "cats": [ 12 ], "js": [ "phaser", "phaser.version" ], "website": "https://phaser.io" }, "Phenomic": { "cats": [ 57 ], "html": [ "\u003c[^\u003e]+id=\"phenomic(?:root)?\"" ], "scriptSrc": [ "/phenomic\\.browser\\.[a-f0-9]+\\.js" ], "implies": [ "React" ], "description": "Phenomic is a modular website compiler.", "website": "https://phenomic.io/" }, "Philomena": { "cats": [ 2 ], "meta": { "generator": [ "^philomena$" ] }, "implies": [ "Elixir", "Erlang" ], "description": "Philomena is an imageboard software.", "website": "https://github.com/derpibooru/philomena" }, "Phlox": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/phlox(?:-pro)?/" ], "description": "Phlox is a modern, lightweight and customizable WordPress theme gratify for almost any type of website.", "website": "https://www.phlox.pro" }, "Phoenix": { "cats": [ 18 ], "meta": { "generator": [ "^phoenix" ] }, "implies": [ "Node.js", "React", "Webpack" ], "website": "https://github.com/Sazito/phoenix/" }, "Phoenix Framework": { "cats": [ 18 ], "js": [ "phoenix.channel" ], "implies": [ "Elixir" ], "description": "Phoenix Framework is an open-source web application framework built using the Elixir programming language.", "website": "https://www.phoenixframework.org" }, "Phoenix LiveView": { "cats": [ 18 ], "js": [ "livesocket.socket" ], "implies": [ "Phoenix Framework" ], "description": "Phoenix LiveView is a library that brings live, interactive, real-time user experiences to your Phoenix applications.", "website": "https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html" }, "Phoenix Site": { "cats": [ 1 ], "cookies": { "phoenix_p_session": "" }, "js": [ "phxsite.pages_version" ], "description": "Phoenix Site software has been developed by the Internet Marketing Union and is especially intended for entrepreneurs (without technical knowledge) who want to score better in Google (SEO) and get more leads and customers (conversion) from their website.", "website": "https://phoenixsite.nl" }, "Photo Gallery": { "cats": [ 87, 7 ], "scriptSrc": [ "/wp-content/plugins/photo-gallery/.+scripts\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Photo Gallery plugin is a feature-rich, yet easy-to-use WordPress tool, which lets you add mobile-friendly image galleries and gallery groups to your website by 10Web.", "website": "https://10web.io/plugins/wordpress-photo-gallery" }, "PhotoShelter": { "cats": [ 1, 6 ], "scriptSrc": [ "\\.psecn\\.photoshelter\\.com/" ], "implies": [ "MySQL", "PHP", "jQuery" ], "description": "PhotoShelter is a cloud storage service that doubles as a website and ecommerce platform for photographers.", "website": "https://www.photoshelter.com" }, "PhotoShelter for Brands": { "cats": [ 95 ], "description": "PhotoShelter for Brands is a cloud-based media management system for companies and organizations.", "website": "https://brands.photoshelter.com" }, "PhotoSwipe": { "cats": [ 7, 59 ], "js": [ "photoswipe", "photoswipeparsehash", "photoswipeui_default" ], "scriptSrc": [ "photoswipe/([\\d\\.]+)/photoswipe\\.min\\.js\\;version:\\1" ], "description": "PhotoSwipe is an open-source gallery to support JavaScript-based image zooming.", "website": "https://photoswipe.com" }, "Photoslurp": { "cats": [ 96 ], "js": [ "photoslurp", "photoslurp_script", "photoslurp_wdgts", "photoslurpwidgetsettings" ], "description": "Photoslurp is a visual commerce platform that collects photos and videos of customers using your products from across social networks.", "website": "https://hi.photoslurp.com" }, "Phusion Passenger": { "cats": [ 22 ], "headers": { "server": "phusion passenger ([\\d.]+)\\;version:\\1", "x-powered-by": "phusion passenger(?:\\(r\\))? ?([\\d.]+)?\\;version:\\1" }, "description": "Phusion Passenger is a free web server and application server with support for Ruby, Python and Node.js.", "website": "https://phusionpassenger.com", "cpe": "cpe:2.3:a:phusionpassenger:phusion_passenger:*:*:*:*:*:*:*:*" }, "Piano": { "cats": [ 76 ], "js": [ "gcidatapiano", "pianoespconfig" ], "scriptSrc": [ "\\.piano\\.io", "\\.tinypass\\.com" ], "description": "Piano is a enterprise SaaS company which specializing in advanced media business processes and ecommerce optimisation.", "website": "https://piano.io" }, "PickyStory": { "cats": [ 100 ], "js": [ "pickystory.overridestore" ], "scriptSrc": [ "cdn\\.pickystory\\.com/" ], "implies": [ "Shopify" ], "description": "PickyStory is the ecommerce conversion platform.", "website": "https://pickystory.com" }, "Pico": { "cats": [ 53 ], "js": [ "pico" ], "scriptSrc": [ "widget\\.pico\\.tools" ], "website": "https://trypico.com" }, "Pico CSS": { "cats": [ 66 ], "description": "Pico CSS is a minimal CSS framework for semantic HTML, without using classes.", "website": "https://picocss.com" }, "Picreel": { "cats": [ 77, 5 ], "js": [ "picreel" ], "scriptSrc": [ "\\.picreel\\.com" ], "description": "Picreel is a conversion optimisation software.", "website": "https://www.picreel.com" }, "Picturepark": { "cats": [ 95 ], "js": [ "pictureparkconfiguration" ], "description": "Picturepark is designed to facilitate your DAM policies by storing, tagging, searching and delivering files in an automated and controlled way.", "website": "https://picturepark.com" }, "Piman": { "cats": [ 68 ], "description": "Piman is an open-source accessibility UI framework create by Blueplanet Inc.", "website": "https://piman.cc" }, "Pimcore": { "cats": [ 1, 6 ], "headers": { "x-powered-by": "^pimcore$" }, "scriptSrc": [ "/pimcorecore/js/targeting\\.js" ], "implies": [ "PHP" ], "description": "Pimcore is an open-source digital platform that aggregates, enriches, and manages enterprise data and provides up-to-date, consistent, and personalised experiences to customers.", "website": "https://pimcore.com/en/digital-experience-platform", "cpe": "cpe:2.3:a:pimcore:pimcore:*:*:*:*:*:*:*:*" }, "Pin Payments": { "cats": [ 41 ], "scriptSrc": [ "api\\.pinpayments\\.com" ], "description": "Pin Payments is an all-in-one online payment system. It offers merchants a simple JSON API, secure credit card storage, multi-currency capabilities, bank account compatibility, onsite payment processing and automatic fund transfer to specified bank accounts.", "website": "https://www.pinpayments.com/" }, "Pingdom RUM": { "cats": [ 78 ], "js": [ "_prum" ], "scriptSrc": [ "rum-static\\.pingdom\\.net" ], "description": "Pingdom RUM(Real User Monitoring) is a feature of the Pingdom website monitoring and performance testing service. RUM enables you to collect and analyse data on how real users are experiencing your website.", "website": "https://www.pingdom.com/real-user-monitoring/" }, "Pingdom Uptime Monitoring": { "cats": [ 13 ], "meta": { "title": [ "^pingdom public reports overview$" ] }, "description": "Pingdom Uptime Monitoring is a feature provided by the Pingdom website monitoring and performance testing service. It allows you to monitor the uptime and availability of your website.", "website": "https://www.pingdom.com/product/uptime-monitoring/" }, "Pingoteam": { "cats": [ 1 ], "meta": { "designer": [ "pingoteam" ] }, "implies": [ "PHP" ], "website": "https://www.pingoteam.ir/" }, "PinnacleCart": { "cats": [ 6 ], "js": [ "user_delete_address", "user_delete_payment_profile" ], "description": "PinnacleCart is an ecommerce platform.", "website": "https://www.pinnaclecart.com" }, "Pinterest": { "cats": [ 5 ], "scriptSrc": [ "//assets\\.pinterest\\.com/js/pinit\\.js" ], "description": "Pinterest is an image sharing and social media service designed to enable saving and discovery of information.", "website": "https://pinterest.com" }, "Pinterest Ads": { "cats": [ 36 ], "description": "Pinterest Ads is an online advertising platform developed by Pinterest.", "website": "https://ads.pinterest.com/" }, "Pinterest Conversion Tag": { "cats": [ 10 ], "js": [ "pintrk" ], "description": "Pinterest Conversion Tag allows you to track actions people take on your website after viewing your Promoted Pin.", "website": "https://www.pinterest.com.au/business/" }, "Pipedrive": { "cats": [ 52, 53 ], "js": [ "leadbooster" ], "description": "Pipedrive is a cloud-based sales CRM.", "website": "https://www.pipedrive.com/" }, "Piwigo": { "cats": [ 7 ], "meta": { "generator": [ "^piwigo\\s" ] }, "implies": [ "MySQL" ], "description": "Piwigo is an open-source photo management software designed for creating and managing online photo galleries.", "website": "https://piwigo.com" }, "Piwik PRO Core": { "cats": [ 10 ], "scriptSrc": [ "\\.piwik\\.pro/" ], "description": "Piwik PRO Core is a free alternative to Google Analytics that is privacy \u0026 compliance focused.", "website": "https://piwik.pro" }, "Pixc": { "cats": [ 19 ], "scriptSrc": [ "//pixc\\.com/" ], "description": "Pixc is human powered image editing platform.", "website": "https://pixc.com" }, "PixelFed": { "cats": [ 2 ], "implies": [ "Laravel" ], "description": "PixelFed is an activitypub based image sharing platform.", "website": "https://pixelfed.org" }, "PixelYourSite": { "cats": [ 87, 10 ], "js": [ "pys.facebook", "pys_generate_token", "pysoptions" ], "scriptSrc": [ "/wp-content/plugins/pixelyoursite/" ], "description": "PixelyourSite is now probably the most complex tracking tool for WordPress, managing the Facebook Pixel, Google Analytics, Google Ads Remarketing, Pinterest Tag, Bing Tag, and virtually any other script.", "website": "https://www.pixelyoursite.com" }, "Pixieset Store": { "cats": [ 6 ], "js": [ "pixiesetproducteditor", "pixiesetproductoptionselection" ], "description": "Pixieset Store lets you sell professional print products, digital downloads, and other items directly from your galleries.", "website": "https://pixieset.com" }, "Pixieset Website": { "cats": [ 1, 51 ], "meta": { "generator": [ "^pixieset$" ] }, "description": "Pixieset Website is a space to create your own beautiful photography website.", "website": "https://pixieset.com" }, "Pixlee TurnTo": { "cats": [ 96 ], "js": [ "pixlee", "pixlee_analytics", "turnto", "turntoconfig" ], "scriptSrc": [ "assets\\.pixlee\\.com" ], "description": "Pixlee TurnTo is a social UGC, ratings and reviews, and influencer marketing platform for community-driven brands.", "website": "https://pixlee.com" }, "Pixnet": { "cats": [ 1 ], "js": [ "pix.mib" ], "description": "Pixnet is an Taiwanese mobile photo sharing, blogging, and social networking service.", "website": "https://www.pixnet.net" }, "PizzaNetz": { "cats": [ 1, 93 ], "description": "PizzaNetz is an ordering system and shop system for pizzerias, Chinese restaurant and kebabs.", "website": "https://www.pizzanetz.de" }, "Plaid": { "cats": [ 41, 19 ], "js": [ "plaid.version" ], "headers": { "content-security-policy": "cdn\\.plaid\\.com/" }, "scriptSrc": [ "\\.plaid\\.com/" ], "description": "Plaid is a fintech company that facilitates communication between financial services apps and users' banks and credit card providers.", "website": "https://plaid.com" }, "Planet": { "cats": [ 49 ], "meta": { "generator": [ "^planet(?:/([\\d.]+))?\\;version:\\1" ] }, "description": "Planet is a feed aggregator, which creates pages with entries from the original feeds in chronological order, most recent entries first.", "website": "https://planetplanet.org" }, "Plasmic": { "cats": [ 51 ], "js": [ "__next_data__.props.pageprops.plasmicdata" ], "description": "Plasmic is a visual, no-code headless page/content builder for any website or codebase.", "website": "https://www.plasmic.app" }, "Platform.sh": { "cats": [ 62 ], "headers": { "x-platform-cluster": "", "x-platform-processor": "", "x-platform-router": "", "x-platform-server": "" }, "website": "https://platform.sh" }, "PlatformOS": { "cats": [ 1, 62 ], "headers": { "x-powered-by": "^platformos$" }, "website": "https://www.platform-os.com" }, "Platforma LP": { "cats": [ 51 ], "scriptSrc": [ "\\.lpcdn\\.site/" ], "description": "Platforma LP is a web design and development platform that provides ready-to-use website templates for various industries and purposes. It is a collection of over 500 website templates that can be customised and edited according to user needs.", "website": "https://platformalp.ru" }, "PlatinMarket": { "cats": [ 6 ], "js": [ "platinmarket" ], "scriptSrc": [ "//platincdn\\.com/" ], "description": "PlatinMarket is an ecommerce platform that provides solutions for online businesses to create and manage their online stores.", "website": "https://www.platinmarket.com" }, "Plausible": { "cats": [ 10 ], "js": [ "plausible" ], "scriptSrc": [ "plausible\\.io/js/plausible\\.js" ], "description": "Plausible is an open-source alternative to Google Analytics.", "website": "https://plausible.io/" }, "Play": { "cats": [ 18 ], "cookies": { "play_session": "" }, "implies": [ "Scala" ], "website": "https://www.playframework.com", "cpe": "cpe:2.3:a:playframework:play_framework:*:*:*:*:*:*:*:*" }, "Plaza": { "cats": [ 103 ], "description": "Plaza is a ecommerce platform that allows brands and retailers to communicate with customers via live video.", "website": "https://www.useplaza.com" }, "Pleroma": { "cats": [ 2 ], "description": "Pleroma is a free, federated social networking server built on open protocols.", "website": "https://pleroma.social/" }, "Plesk": { "cats": [ 9 ], "js": [ "plesk.form" ], "headers": { "x-powered-by": "^plesk(?:l|w)in", "x-powered-by-plesk": "^plesk" }, "scriptSrc": [ "common\\.js\\?plesk" ], "meta": { "plesk-build": [] }, "description": "Plesk is a web hosting and server data centre automation software with a control panel developed for Linux and Windows-based retail hosting service providers.", "website": "https://www.plesk.com", "cpe": "cpe:2.3:a:parallels:parallels_plesk_panel:*:*:*:*:*:*:*:*" }, "Pligg": { "cats": [ 1 ], "js": [ "pligg_" ], "html": [ "\u003cspan[^\u003e]+id=\"xvotes-0" ], "meta": { "generator": [ "pligg" ] }, "website": "https://pligg.com", "cpe": "cpe:2.3:a:pligg:pligg_cms:*:*:*:*:*:*:*:*" }, "Plone": { "cats": [ 1 ], "scriptSrc": [ "^/\\+\\+resource\\+\\+" ], "meta": { "generator": [ "plone" ] }, "implies": [ "Python" ], "description": "Plone is a free and open source content management system (CMS) built on top of the Zope application server.", "website": "https://plone.org/", "cpe": "cpe:2.3:a:plone:plone:*:*:*:*:*:*:*:*" }, "Plotly": { "cats": [ 25 ], "js": [ "plotly.version" ], "scriptSrc": [ "https?://cdn\\.plot\\.ly/plotly" ], "implies": [ "D3" ], "website": "https://plot.ly/javascript/" }, "Plug\u0026Pay": { "cats": [ 6, 41 ], "cookies": { "plug_pay_session": "" }, "implies": [ "Laravel" ], "description": "Plug\u0026Pay is a payment processor that provides payment solutions for ecommerce businesses.", "website": "https://plugandpay.nl" }, "Plyr": { "cats": [ 14 ], "css": [ "--plyr-progress" ], "js": [ "plyr" ], "scriptSrc": [ "cdn\\.plyr\\.io/([0-9.]+)/.+\\.js\\;version:\\1" ], "description": "Plyr is a simple, lightweight, accessible and customizable HTML5, YouTube and Vimeo media player that supports modern browsers.", "website": "https://plyr.io" }, "Po.st": { "cats": [ 5 ], "js": [ "pwidget_config" ], "website": "https://www.po.st/" }, "Pocket": { "cats": [ 5 ], "scriptSrc": [ "widgets\\.getpocket\\.com/" ], "meta": { "pocket-site-verification'": [] }, "description": "Pocket is a social bookmarking service that can be integrated into a website with the use of a web widget.", "website": "https://getpocket.com" }, "Podia": { "cats": [ 21, 6 ], "cookies": { "_podia_storefront_visitor_id": "" }, "js": [ "podia.checkout" ], "scriptSrc": [ "cdn\\.podia\\.com" ], "description": "Podia is a platform to host and sell online courses, memberships, and digital downloads.", "website": "https://www.podia.com" }, "Podigee": { "cats": [ 5 ], "js": [ "podigeepodcastplayers" ], "description": "Podigee is an independent company for podcast publishers. Podigee offers hosting, distribution, analytics and monetisation of podcasts.", "website": "https://www.podigee.com" }, "Podium": { "cats": [ 5, 52 ], "js": [ "podiumwebchat", "podiumwebsitewidgetloaded" ], "scriptSrc": [ "\\.podium\\.com/" ], "description": "Podium is a customer communication platform for businesses who interact with customers on a local level.", "website": "https://www.podium.com" }, "Podsights": { "cats": [ 36 ], "scriptSrc": [ "cdn\\.pdst\\.fm" ], "description": "Podsights is attribution technology platform that brands and agencies use to measure and scale their podcast advertising", "website": "https://podsights.com/" }, "Pojo.me": { "cats": [ 68 ], "js": [ "pojoa11yoptions" ], "description": "Pojo.me provides a Accessibility overlay plug-in for any WordPress Theme or Page Builder.", "website": "https://pojo.me/plugins/accessibility/" }, "Poloriz": { "cats": [ 76 ], "scriptSrc": [ "widget\\.poloriz\\.com/" ], "description": "Poloriz's technology automatically creates a personalised, full-screen, mobile-first, cross-selling user experience for shoppers.", "website": "https://www.poloriz.com" }, "Polyfill": { "cats": [ 59 ], "scriptSrc": [ "polyfill\\.io/v([\\d\\.]+)\\;version:\\1" ], "description": "Polyfill is a service which accepts a request for a set of browser features and returns only the polyfills that are needed by the requesting browser.", "website": "https://polyfill.io" }, "Polylang": { "cats": [ 87, 89 ], "cookies": { "pll_language": "[a-z]{2}" }, "headers": { "x-redirected-by": "polylang(?: (pro))?\\;version:\\1" }, "description": "Polylang is a WordPress plugin which allows you to create multilingual WordPress site.", "website": "https://wordpress.org/plugins/polylang" }, "Polymer": { "cats": [ 12 ], "js": [ "polymer.version" ], "html": [ "(?:\u003cpolymer-[^\u003e]+|\u003clink[^\u003e]+rel=\"import\"[^\u003e]+/polymer\\.html\")" ], "scriptSrc": [ "polymer\\.js" ], "website": "https://polymer-project.org" }, "Popmenu": { "cats": [ 1, 93 ], "cookies": { "popmenu-token": "" }, "js": [ "popmenu_client", "popmenuhydrated" ], "implies": [ "Apollo", "React" ], "description": "Popmenu is a restaurant platform which offers CMS, online menus, ordering and delivery and marketing automation solutions.", "website": "https://get.popmenu.com" }, "Popper": { "cats": [ 19 ], "js": [ "createpopper", "popper.applystyles", "popper.defaults" ], "scriptSrc": [ "/popper(?:\\.min)?\\.js(?:/([0-9.]+))?\\;version:\\1", "popperjs(?:/|-)core(?:@|-)([\\d\\.]+)\\;version:\\1" ], "description": "Popper is a positioning engine, its purpose is to calculate the position of an element to make it possible to position it near a given reference element.", "website": "https://popper.js.org" }, "PopularFX": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/popularfx/.+\\?ver=([\\d\\.]+)\\;version:\\1" ], "description": "PopularFX is a fully customizable responsive WordPress theme. It comes with drag and drop page builder.", "website": "https://popularfx.com" }, "Popup Maker": { "cats": [ 87 ], "js": [ "pum_popups" ], "scriptSrc": [ "/wp-content/plugins/popup-maker/(?:.+site(?:\\.min)?\\.js\\?.+ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Popup Maker is a plugin that lets you create popup windows for your WordPress website.", "website": "https://wppopupmaker.com" }, "Post Affiliate Pro": { "cats": [ 71 ], "js": [ "postaffaction", "postaffcookie", "postaffinfo", "postafftracker" ], "scriptSrc": [ "(?:affiliate|associate)\\..+/scripts/trackjs\\.js", "postaffiliatepro\\.com/scripts/trackjs\\.js" ], "description": "Post Affiliate Pro is a software built for online stores and ecommerce websites that need to track and monitor their affiliate network.", "website": "https://www.postaffiliatepro.com" }, "PostHog": { "cats": [ 10 ], "js": [ "posthog" ], "scriptSrc": [ "app\\.posthog\\.com/" ], "description": "PostHog is the open-source, all-in-one product analytics platform.", "website": "https://posthog.com" }, "PostNL": { "cats": [ 99 ], "description": "PostNL (formerly TNT) is a mail, parcel and ecommerce corporation with operations in the Netherlands, Germany, Italy, Belgium, and the United Kingdom.", "website": "https://postnl.post" }, "Poste Italiane": { "cats": [ 99 ], "description": "Poste Italiane is the Italian postal service provider.", "website": "https://www.poste.it" }, "Posterous": { "cats": [ 1, 11 ], "js": [ "posterous" ], "html": [ "\u003cdiv class=\"posterous" ], "website": "https://posterous.com" }, "PostgreSQL": { "cats": [ 34 ], "description": "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.", "website": "https://www.postgresql.org/", "cpe": "cpe:2.3:a:postgresql:postgresql:*:*:*:*:*:*:*:*" }, "Postpay": { "cats": [ 91 ], "js": [ "postpay", "postpayjsconfig", "wc_postpay_init_params" ], "scriptSrc": [ "cdn\\.postpay\\.io/(?:.+\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Postpay is a payment solution that allows you to split your purchase amount into instalments.", "website": "https://postpay.io" }, "Postscript": { "cats": [ 32 ], "js": [ "postscript.getsubscriberid", "postscript.issubscriberinputchecked" ], "scriptSrc": [ "sdk\\.postscript\\.io/" ], "description": "Postscript is an SMS and MMS marketing platform for Shopify stores.", "website": "https://www.postscript.io" }, "Potions": { "cats": [ 76 ], "js": [ "potions.version" ], "scriptSrc": [ "\\.get-potions\\.com/" ], "description": "Potions is a personalisation technology for customising the ecommerce experience for site visitors without the use of cookies.", "website": "https://get-potions.com" }, "PowerReviews": { "cats": [ 90 ], "js": [ "powerreviews" ], "scriptSrc": [ "ui\\.powerreviews\\.com" ], "description": "Powerreviews is a provider of UGC solutions like ratings and reviews.", "website": "https://www.powerreviews.com/" }, "PowerSchool": { "cats": [ 21 ], "headers": { "content-security-policy": "\\.powerschool\\.com" }, "meta": { "application-name": [ "^powerschool$" ] }, "description": "PowerSchool is a widely used student information system (SIS) used by K-12 schools, districts, and other educational institutions to manage student data and information. The software is developed and marketed by PowerSchool Group LLC, which is based in California, USA.", "website": "https://www.powerschool.com" }, "Powerboutique": { "cats": [ 6 ], "scriptSrc": [ "powerboutique" ], "website": "https://www.powerboutique.com/" }, "Powergap": { "cats": [ 6 ], "html": [ "\u003ca[^\u003e]+title=\"powergap", "\u003cinput type=\"hidden\" name=\"shopid\"" ], "website": "https://powergap.de" }, "Preact": { "cats": [ 59 ], "description": "Preact is a JavaScript library that describes itself as a fast 3kB alternative to React with the same ES6 API.", "website": "https://preactjs.com" }, "Prebid": { "cats": [ 36 ], "js": [ "pbjs", "pbjs.version", "prebid_timeout" ], "scriptSrc": [ "/prebid\\.js", "adnxs\\.com/[^\"]*(?:prebid|/pb\\.js)" ], "description": "Prebid is an open-source header bidding wrapper. It forms the core of our Nucleus ad platform, helping maximize revenue and performance for publishers.", "website": "https://prebid.org" }, "Prediggo": { "cats": [ 76, 32 ], "js": [ "prediggo", "prediggosearchformexternalac" ], "scriptSrc": [ "js/prediggo/(?:[\\w]+)\\.js" ], "description": "Prediggo is an ecommerce personalisation and marketing automation software provider.", "website": "https://prediggo.com" }, "Prefix-Free": { "cats": [ 19 ], "js": [ "prefixfree" ], "scriptSrc": [ "prefixfree\\.js" ], "website": "https://leaverou.github.io/prefixfree/" }, "Preline UI": { "cats": [ 66 ], "scriptSrc": [ "/preline\\.js" ], "implies": [ "Tailwind CSS" ], "description": "Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.", "website": "https://preline.co" }, "Premio Chaty": { "cats": [ 87 ], "js": [ "chaty_settings.chaty_widgets", "chaty_settings.object_settings" ], "scriptSrc": [ "/wp-content/plugins/chaty/" ], "description": "Chat with your website visitors via their favorite channels with Chaty by Premio.", "website": "https://premio.io/downloads/chaty" }, "Prepr": { "cats": [ 1 ], "cookies": { "__prepr_uid": "" }, "scriptSrc": [ "\\.prepr\\.io/" ], "meta": { "prepr:id": [] }, "description": "Prepr is a headless CMS with data-driven capabilities.", "website": "https://prepr.io" }, "Press Customizr": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/customizr/.+js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Press Customizr is a multipurpose WordPress theme suitable for small businesses and ecommerce sites.", "website": "https://presscustomizr.com/customizr" }, "Press Hueman": { "cats": [ 80 ], "js": [ "huparams" ], "scriptSrc": [ "/wp-content/themes/hueman/.+scripts\\.min\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1" ], "description": "Press Hueman is a mobile friendly WordPress theme for blogs, magazines and business websites.", "website": "https://presscustomizr.com/hueman" }, "PressMaximum Customify": { "cats": [ 80 ], "js": [ "customify", "customify_is_mobile", "customify_js" ], "scriptSrc": [ "/wp-content/themes/customify/.+theme\\.min\\.js(?:.+ver=([\\d\\.]+))?\\;version:\\1" ], "description": "PressMaximum Customify is lightweight, responsive and flexible multipurpose WordPress theme.", "website": "https://pressmaximum.com/customify" }, "Pressable": { "cats": [ 62 ], "headers": { "host-header": "^pressable" }, "implies": [ "WordPress" ], "description": "Pressable is a managed hoting platform for WordPress.", "website": "https://pressable.com" }, "PrestaShop": { "cats": [ 6 ], "cookies": { "prestashop": "" }, "js": [ "freeproducttranslation", "prestashop", "pricedisplaymethod", "pricedisplayprecision", "rcanalyticsevents.eventprestashopcheckout" ], "headers": { "powered-by": "^prestashop$" }, "html": [ "\u003c!-- /block [a-z ]+ module (?:header|top)?\\s?--\u003e", "\u003c!-- /module block [a-z ]+ --\u003e", "powered by \u003ca\\s+[^\u003e]+\u003eprestashop" ], "meta": { "generator": [ "prestashop" ] }, "implies": [ "MySQL", "PHP" ], "description": "PrestaShop is a freemium, open-source ecommerce solution, written in the PHP programming language with support for the MySQL database management system.", "website": "https://www.prestashop.com", "cpe": "cpe:2.3:a:prestashop:prestashop:*:*:*:*:*:*:*:*" }, "Pretty Links": { "cats": [ 87, 71 ], "description": "Pretty Links is a WordPress plugin URL shortener, link cloaker, branded link, and QR code generator.", "website": "https://prettylinks.com" }, "PriceSpider": { "cats": [ 97 ], "js": [ "pricespider.version" ], "scriptSrc": [ "cdn\\.pricespider\\.com/" ], "description": "PriceSpider is an advanced retail data technology company that provides insights about consumer purchasing behavior.", "website": "https://www.pricespider.com" }, "PrimeNG": { "cats": [ 66 ], "css": [ "\\.p-(?:toast|calendar|dialog-mask|menuitem-text)(?:-content)?\\{" ], "description": "PrimeNG is a rich set of open-source UI Components for Angular.", "website": "https://www.primefaces.org" }, "PrimeReact": { "cats": [ 66 ], "css": [ "\\.p-(?:toast|calendar|dialog-mask|menuitem-text)(?:-content)?\\{" ], "description": "PrimeReact is a rich set of open-source UI Components for React.", "website": "https://www.primefaces.org" }, "PrimeVue": { "cats": [ 66 ], "css": [ "\\.p-(?:toast|calendar|dialog-mask|menuitem-text)(?:-content)?\\{" ], "description": "PrimeVue is a rich set of open-source UI Components for Vue.js.", "website": "https://www.primefaces.org" }, "Primis": { "cats": [ 36 ], "js": [ "sekindodisplayedplacement", "sekindoflowingplayeron", "sekindonativeskinapi" ], "scriptSrc": [ "\\.sekindo\\.com" ], "description": "Primis is a video discovery platform for publishers.", "website": "https://www.primis.tech" }, "Printful": { "cats": [ 76 ], "scriptSrc": [ "static\\.cdn\\.printful\\.com" ], "implies": [ "Cart Functionality" ], "description": "Printful offers print-on-demand drop shipping solution for ecommerce sites.", "website": "https://www.printful.com/" }, "Priority Hints": { "cats": [ 92 ], "description": "Priority Hints exposes a mechanism for developers to signal a relative priority for browsers to consider when fetching resources.", "website": "https://wicg.github.io/priority-hints/" }, "Prism": { "cats": [ 19 ], "js": [ "apex.libversions.prismjs", "prism" ], "scriptSrc": [ "prism\\.js" ], "description": "Prism is an extensible syntax highlighter.", "website": "https://prismjs.com" }, "Prismic": { "cats": [ 1 ], "scriptSrc": [ "\\.prismic\\.io/" ], "description": "Prismic is a headless CMS for Jamstack.", "website": "https://prismic.io" }, "Privy": { "cats": [ 32, 75 ], "js": [ "privy", "privysettings", "privywidget" ], "scriptSrc": [ "\\.privy\\.com/" ], "description": "Privy is a all-in-one marketing automation platform for ecommerce.", "website": "https://www.privy.com" }, "Privy App": { "cats": [ 100 ], "scriptSrc": [ "//shopify\\.privy\\.com/" ], "implies": [ "Privy" ], "description": "Privy App helps you improve your website conversion rate, grow your email list, automate your email marketing, drive repeat purchases and much more.", "website": "https://apps.shopify.com/privy" }, "ProcessWire": { "cats": [ 1 ], "js": [ "processwire" ], "headers": { "x-powered-by": "processwire cms" }, "implies": [ "PHP" ], "description": "ProcessWire is an open source content management system (CMS) and framework (CMF).", "website": "https://processwire.com/" }, "Product Hunt": { "cats": [ 19 ], "description": "Product Hunt is a community-based website that allows makers and marketers to launch their products or services and get in touch with their first real users.", "website": "https://www.producthunt.com" }, "Product Personalizer": { "cats": [ 100, 76 ], "scriptSrc": [ "/product-personalizer/pplr_common\\.js" ], "implies": [ "Shopify" ], "description": "Product Personalizer apps can help you to customise your products and offer a more personalised experience for your customers.", "website": "https://productpersonalizer.com" }, "ProfilePress": { "cats": [ 87 ], "cookies": { "ppwp_wp_session": "" }, "scriptSrc": [ "/wp-content/plugins/wp-user-avatar(?:-pro)?/.+frontend\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "ProfilePress is a WordPress registration plugin that lets you create login forms, registration forms, user profiles, and more.", "website": "https://profilepress.net" }, "Profitwell": { "cats": [ 10 ], "js": [ "profitwell" ], "scriptSrc": [ "profitwell\\.js" ], "website": "https://www.profitwell.com/" }, "Progress MOVEit": { "cats": [ 19 ], "headers": { "x-moveitisapi-version": "^(.+)$\\;version:\\1" }, "meta": { "apple-itunes-app": [ "app-id=1500056420" ], "google-play-app": [ "app-id=com\\.progress\\.moveit\\.transfer\\.dev\\.appid" ] }, "description": "Progress MOVEit is a managed file transfer solution that enables secure and compliant transfer of sensitive files while providing automation, central management, and auditing capabilities.", "website": "https://www.progress.com/moveit" }, "Progress Sitefinity": { "cats": [ 1 ], "js": [ "sfdataintell" ], "meta": { "generator": [ "^sitefinity\\s([\\s]{3,9})\\;version:\\1" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Progress Sitefinity is a content management system (CMS) that you use to create, store, manage, and present content on your website.", "website": "https://www.sitefinity.com", "cpe": "cpe:2.3:a:progress:sitefinity:*:*:*:*:*:*:*:*" }, "Progress WS_FTP": { "cats": [ 19 ], "scriptSrc": [ "/thinclient/(?:wtm|webresource)(?:\\.axd|/public)\\;confidence:60" ], "description": "Progress WS_FTP is a file transfer client software developed by Progress Software Corporation, supporting FTP, FTPS, SFTP, and HTTPS protocols with features like drag-and-drop support, file synchronization, and encrypted data transmission.", "website": "https://www.progress.com/ws_ftp", "cpe": "cpe:2.3:a:progress:ws_ftp_server:*:*:*:*:*:*:*:*" }, "Project Wonderful": { "cats": [ 36 ], "js": [ "pw_adloader" ], "html": [ "\u003cdiv[^\u003e]+id=\"pw_adbox_" ], "scriptSrc": [ "^https?://(?:www\\.)?projectwonderful\\.com/(?:pwa\\.js|gen\\.php)" ], "website": "https://projectwonderful.com" }, "Projesoft": { "cats": [ 6 ], "scriptSrc": [ "projesoft\\.js" ], "website": "https://www.projesoft.com.tr" }, "PromoBuilding": { "cats": [ 51 ], "cookies": { "promobuilding_session": "" }, "js": [ "promoapi", "promodomain", "promoisover", "promostart" ], "html": [ "\u003c!-- made with https://promobuilding\\.ru" ], "description": "PromoBuilding is a subscription-based website builder for optimising budgets for creating promotional campaigns.", "website": "https://promobuilding.ru" }, "Proton Mail": { "cats": [ 30 ], "description": "Proton Mail is the world’s largest secure email service with over 70 million users. Available on Web, iOS, Android, and desktop. Protected by Swiss privacy law.", "website": "https://proton.me/mail" }, "Prototype": { "cats": [ 12 ], "js": [ "prototype.version" ], "scriptSrc": [ "(?:prototype|protoaculous)(?:-([\\d.]*[\\d]))?.*\\.js\\;version:\\1" ], "description": "Prototype is a JavaScript Framework that aims to ease development of web applications.", "website": "https://www.prototypejs.org", "cpe": "cpe:2.3:a:prototypejs:prototype:*:*:*:*:*:*:*:*" }, "Protovis": { "cats": [ 25 ], "js": [ "protovis" ], "scriptSrc": [ "protovis.*\\.js" ], "website": "https://mbostock.github.io/protovis" }, "ProvenExpert": { "cats": [ 5 ], "scriptSrc": [ "provenexpert\\.\\w+/widget" ], "description": "ProvenExpert is a review based marketing platform that allows users to create customer surveys, provides aggregate reviews and ratings.", "website": "https://www.provenexpert.com" }, "Provide Support": { "cats": [ 52 ], "scriptSrc": [ "\\.providesupport\\.com" ], "description": "Provide Support is a SaaS for customer service that includes live chat, real-time website monitoring, chat statistics.", "website": "https://www.providesupport.com" }, "Proximis": { "cats": [ 5, 6 ], "scriptSrc": [ "widget-commerce(?:\\.min)?\\.js" ], "website": "https://www.proximis.com" }, "Proximis Unified Commerce": { "cats": [ 6, 1 ], "js": [ "__change" ], "html": [ "\u003chtml[^\u003e]+data-ng-app=\"rbschangeapp\"" ], "meta": { "generator": [ "proximis unified commerce" ] }, "implies": [ "AngularJS", "PHP" ], "website": "https://www.proximis.com" }, "Proxmox Mail Gateway": { "cats": [ 16 ], "js": [ "pmg-mail-tracker", "pmg-spam-archive" ], "description": "Proxmox Mail Gateway is a mail security and anti-spam solution designed to protect email servers and ensure secure and reliable email communication.", "website": "https://proxmox.com/en/proxmox-mail-gateway" }, "Proxmox VE": { "cats": [ 60 ], "headers": { "server": "pve-api-daemon/[\\d\\.]+" }, "description": "Proxmox VE is an open-source virtualisation and containerisation platform that provides a web-based management interface to manage virtual machines, containers, storage, and networking.", "website": "https://proxmox.com/en/proxmox-ve" }, "Pterodactyl Panel": { "cats": [ 9 ], "cookies": { "pterodactyl_session": "" }, "implies": [ "Go", "Laravel", "PHP", "React" ], "description": "Pterodactyl Panel is a free, open-source game server management panel built with PHP, React, and Go.", "website": "https://pterodactyl.io" }, "PubGuru": { "cats": [ 36 ], "js": [ "pg.version" ], "scriptSrc": [ "cdn\\.pubguru\\.com/" ], "description": "PubGuru is a header wrapper and ad ops platform.", "website": "https://pubguru.com" }, "PubLive": { "cats": [ 1 ], "description": "PubLive is a headless CMS for online publishers.", "website": "https://thepublive.com" }, "PubMatic": { "cats": [ 36 ], "scriptSrc": [ "https?://[^/]*\\.pubmatic\\.com" ], "description": "PubMatic is a company that develops and implements online advertising software and strategies for the digital publishing and advertising industry.", "website": "https://www.pubmatic.com/" }, "PubSubJS": { "cats": [ 59 ], "js": [ "pubsub", "pubsub.version" ], "description": "PubSubJS is a topic-based publish/subscribe library written in JavaScript.", "website": "https://github.com/mroderick/PubSubJS" }, "Public CMS": { "cats": [ 1 ], "cookies": { "publiccms_user": "" }, "headers": { "x-powered-publiccms": "^(.+)$\\;version:\\1" }, "implies": [ "Java" ], "website": "https://www.publiccms.com" }, "Pulse Secure": { "cats": [ 46 ], "cookies": { "dssignin": "" }, "description": "Pulse Secure allows to deploy VPNs to securely to your internal resources.", "website": "https://www.pulsesecure.net/products/remote-access-overview/", "cpe": "cpe:2.3:a:pulsesecure:pulse_connect_secure:*:*:*:*:*:*:*:*" }, "Pure CSS": { "cats": [ 66 ], "html": [ "\u003cdiv[^\u003e]+class=\"[^\"]*pure-u-(?:sm-|md-|lg-|xl-)?\\d-\\d", "\u003clink[^\u003e]+(?:([\\d.])+/)?pure(?:-min)?\\.css\\;version:\\1" ], "description": "Pure CSS is a set of small, responsive CSS modules that can be used in web projects.", "website": "https://purecss.io" }, "Pure Chat": { "cats": [ 52 ], "js": [ "pcwidget", "purechatapi" ], "scriptSrc": [ "app\\.purechat\\.com" ], "description": "Pure Chat is a live chat solution for small to mid-sized teams.", "website": "https://www.purechat.com" }, "PureCars": { "cats": [ 6 ], "js": [ "_purecars" ], "description": "PureCars is an automotive software and managed services company serving dealerships, advertising associations, and OEMs across the North American retail automotive industry.", "website": "https://www.purecars.com" }, "PurpleAds": { "cats": [ 36 ], "scriptSrc": [ "\\.purpleads\\.io/" ], "meta": { "purpleads-verification": [] }, "description": "PurpleAds is an online advertising solution that businesses use to promote their products and services on Google Search, YouTube and other sites across the web.", "website": "https://purpleads.io" }, "PushDaddy Whatsapp Chat": { "cats": [ 100, 98 ], "scriptSrc": [ "cdn\\.shopify\\.com/.+/pushdaddy_v([\\d\\.]+).*\\.js\\;version:\\1" ], "implies": [ "Shopify", "WhatsApp Business Chat" ], "description": "Whatsapp Chat is an live chat and abondoned cart solution built by PushDaddy.", "website": "https://apps.shopify.com/whatsapp-chat-for-support" }, "PushEngage": { "cats": [ 32 ], "scriptSrc": [ "clientcdn\\.pushengage\\.\\w+/core" ], "description": "PushEngage is a browser push notification platform that helps content website managers engage visitors by automatically segmenting and sending web push messages.", "website": "https://www.pushengage.com" }, "PushOwl": { "cats": [ 32 ], "js": [ "pushowl" ], "scriptSrc": [ "cdn\\.pushowl\\.com" ], "description": "PushOwl is a push notification platform for ecommerce stores.", "website": "https://pushowl.com" }, "PushOwl Web Push Notifications": { "cats": [ 98, 100 ], "scriptSrc": [ "/sdks/pushowl-shopify\\.js" ], "implies": [ "PushOwl" ], "description": "PushOwl Web Push Notifications are a Shopify app which helps recover abandoned carts and market better with web push.", "website": "https://apps.shopify.com/pushowl" }, "PushPushGo": { "cats": [ 32 ], "scriptSrc": [ "\\.pushpushgo\\.com/" ], "description": "PushPushGo is a GDPR-ready platform which enables startups, SMBs and corporations to create and send automatic web push notification campaigns on desktop and via mobile to manage various scenarios including abandoned carts, segmentation, cross-selling, customer engagement, and return rates.", "website": "https://pushpushgo.com" }, "Pushnami": { "cats": [ 32 ], "scriptSrc": [ "api\\.pushnami\\.com" ], "description": "Pushnami is an AI-powered messaging platform that uses intelligent analytics to deliver superior push, social, and email performance.", "website": "https://pushnami.com" }, "Pushpay": { "cats": [ 111 ], "scriptSrc": [ "//pushpay\\.com/" ], "description": "Pushpay is a digital giving and engagement platform designed to help churches manage processes related to donations and fundraising.", "website": "https://pushpay.com" }, "PyScript": { "cats": [ 19 ], "description": "PyScript is a python script that can be run in the browser using a mix of Python and standard HTML.", "website": "https://pyscript.net" }, "Pygments": { "cats": [ 19 ], "html": [ "\u003clink[^\u003e]+pygments\\.css[\"']" ], "website": "https://pygments.org", "cpe": "cpe:2.3:a:pygments:pygments:*:*:*:*:*:*:*:*" }, "PyroCMS": { "cats": [ 1 ], "cookies": { "pyrocms": "" }, "headers": { "x-streams-distribution": "pyrocms" }, "implies": [ "Laravel" ], "website": "https://pyrocms.com" }, "Python": { "cats": [ 27 ], "headers": { "server": "(?:^|\\s)python(?:/([\\d.]+))?\\;version:\\1" }, "description": "Python is an interpreted and general-purpose programming language.", "website": "https://python.org", "cpe": "cpe:2.3:a:python:python:*:*:*:*:*:*:*:*" }, "PythonAnywhere": { "cats": [ 62, 88 ], "headers": { "server": "^pythonanywhere$" }, "implies": [ "Python" ], "description": "PythonAnywhere is an online integrated development environment (IDE) and web hosting service (Platform as a service) based on the Python programming language.", "website": "https://www.pythonanywhere.com" }, "Q4": { "cats": [ 53 ], "js": [ "q4app.a11yannouncement", "q4defaults.fancysignup" ], "description": "Q4 is a SaaS platform that provides communication and intelligence solutions to investor relations professionals.", "website": "https://www.q4inc.com/products/investor-relations-websites/default.aspx" }, "Q4 Cookie Monster": { "cats": [ 5, 67 ], "scriptSrc": [ "widgets\\.q4app\\.com/widgets/q4\\.cookiemonster\\.([\\d\\.]+)\\.min\\.js\\;version:\\1" ], "description": "Q4 Cookie Monster is an cookie compliance widget built by Q4.", "website": "https://q4mobile.github.io/q4widgets-jquery-ui/doc_html/q4.cookieMonster.html" }, "QUIC.cloud": { "cats": [ 92, 23, 31 ], "description": "QUIC.cloud is a content delivery network (CDN) and optimisation service that uses the QUIC protocol, a next-generation internet transport protocol developed by Google, to deliver content faster and more securely over the internet.", "website": "https://www.quic.cloud" }, "Qgiv": { "cats": [ 111 ], "scriptSrc": [ "//secure\\.qgiv\\.com/" ], "description": "Qgiv is an online fundraising platform helping nonprofit, faith-based, healthcare, and education organisations raise funds.", "website": "https://www.qgiv.com" }, "Qikify": { "cats": [ 100 ], "scriptSrc": [ "sdk\\.qikify\\.com/" ], "description": "Qikify is a trusted Shopify Expert providing services for over 35,000 Shopify merchants through Shopify Apps or custom modifications.", "website": "https://qikify.com" }, "Qstomizer": { "cats": [ 76 ], "js": [ "jqueryqsmz", "loadscript_qsmz", "qstomizer_script" ], "scriptSrc": [ "/qsmz-scripttag/qstomizer_st(?:\\.min)?\\.js" ], "description": "Qstomizer app is the app for Shopify and Woocomerce that allows you to add a visual custom product designer to your shop.", "website": "https://www.qstomizer.com" }, "Qualaroo": { "cats": [ 73 ], "js": [ "qualaroo_dnt" ], "scriptSrc": [ "\\.qualaroo\\.com" ], "description": "Qualaroo provides surveys on websites and apps to get user feedback.", "website": "https://qualaroo.com" }, "Qualified": { "cats": [ 52, 32 ], "js": [ "qualifiedobject" ], "scriptSrc": [ "\\.qualified\\.com/" ], "description": "Qualified is a B2B marketer that allows buyers and sales reps to connect through real-time website conversations.", "website": "https://www.qualified.com" }, "Qualtrics": { "cats": [ 73 ], "js": [ "qsi.clientsidetargeting" ], "scriptSrc": [ "\\.qualtrics\\.com/" ], "description": "Qualtrics is an cloud-based platform for creating and distributing web-based surveys.", "website": "https://www.qualtrics.com" }, "Quanta": { "cats": [ 78, 10 ], "cookies": { "_qta_rum": "" }, "js": [ "quanta.app_id", "quantatagrumspeedindex" ], "scriptSrc": [ "\\.quanta\\.io/(?:.+/quanta-rum-v([\\d\\.]+)\\.min\\.js)?\\;version:\\1" ], "description": "Quanta is web performance management solution. Quanta offers the only analytics solution specifically designed to enable business and technical members of ecommerce teams to collaborate effectively with the end in mind: use web performance to directly impact online revenue at all times.", "website": "https://www.quanta.io" }, "Quantcast Choice": { "cats": [ 67 ], "scriptSrc": [ "quantcast\\.mgr\\.consensu\\.org" ], "description": "Quantcast Choice is a free consent management platform to meet key privacy requirements stemming from ePrivacy Directive, GDPR, and CCPA.", "website": "https://www.quantcast.com/products/choice-consent-management-platform" }, "Quantcast Measure": { "cats": [ 10 ], "js": [ "quantserve" ], "scriptSrc": [ "\\.quantserve\\.com/quant\\.js" ], "description": "Quantcast Measure is an audience insights and analytics tool.", "website": "https://www.quantcast.com/products/measure-audience-insights" }, "Quantum Metric": { "cats": [ 10 ], "scriptSrc": [ "cdn\\.quantummetric\\.com" ], "description": "Quantum Metric is a continuous product design platform that helps organizations build better products faster.", "website": "https://www.quantummetric.com/" }, "Quasar": { "cats": [ 12 ], "description": "Quasar is an open-source Vue.js based framework.", "website": "https://quasar.dev" }, "Qubit": { "cats": [ 74, 76 ], "js": [ "__qubit", "onqubitready" ], "scriptSrc": [ "static\\.goqubit\\.com" ], "description": "Qubit is a SaaS based persuasive personalisation at scale services.", "website": "https://www.qubit.com" }, "Question2Answer": { "cats": [ 15 ], "html": [ "\u003c!-- powered by question2answer" ], "scriptSrc": [ "\\./qa-content/qa-page\\.js\\?([0-9.]+)\\;version:\\1" ], "implies": [ "PHP" ], "description": "Question2Answer (Q2A) is a popular open-source Q\u0026A platform for PHP/MySQL.", "website": "https://www.question2answer.org" }, "Queue-it": { "cats": [ 92 ], "js": [ "queueit.javascript.version", "queueit_clientside_config" ], "scriptSrc": [ "\\.queue-it\\.net/" ], "description": "Queue-it is a virtual waiting room platform designed to protect your website and mobile app from slowdowns or crashes during end-user peaks.", "website": "https://queue-it.com" }, "Quick.CMS": { "cats": [ 1 ], "html": [ "\u003ca href=\"[^\u003e]+opensolution\\.org/\"\u003ecms by" ], "meta": { "generator": [ "quick\\.cms(?: v([\\d.]+))?\\;version:\\1" ] }, "website": "https://opensolution.org", "cpe": "cpe:2.3:a:opensolution:quick.cms:*:*:*:*:*:*:*:*" }, "Quick.Cart": { "cats": [ 6 ], "html": [ "\u003ca href=\"[^\u003e]+opensolution\\.org/\"\u003e(?:shopping cart by|sklep internetowy)" ], "meta": { "generator": [ "quick\\.cart(?: v([\\d.]+))?\\;version:\\1" ] }, "website": "https://opensolution.org" }, "QuickSell": { "cats": [ 6 ], "scriptSrc": [ "\\.quicksell\\.co/" ], "description": "QuickSell is a sales acceleration platform helping businesses transform conversations to conversions by leveraging personal commerce.", "website": "https://quicksell.co" }, "Quickbutik": { "cats": [ 6 ], "scriptSrc": [ "\\.quickbutik\\.com/" ], "meta": { "author": [ "^quickbutik$" ] }, "description": "Quickbutik is an all-in-one ecommerce platform from Sweden.", "website": "https://quickbutik.com" }, "Quicklink": { "cats": [ 59, 92 ], "js": [ "drupalsettings.quicklink", "quicklink" ], "scriptSrc": [ "quicklink@([\\d.]+)/dist/quicklink.*\\.js\\;version:\\1" ], "description": "Quicklink is a JS library which aims to be a drop-in solution for sites to prefetch links based on what is in the user's viewport.", "website": "https://getquick.link/" }, "Quicq": { "cats": [ 92 ], "description": "Quicq is an image optimisation tool by Afosto.", "website": "https://afosto.com/apps/quicq" }, "Quill": { "cats": [ 24 ], "js": [ "quill" ], "description": "Quill is a free open-source WYSIWYG editor.", "website": "https://quilljs.com" }, "Quintype": { "cats": [ 1 ], "cookies": { "qtype-session": "" }, "headers": { "link": "fea\\.assettype\\.com/quintype-ace" }, "description": "Quintype is a digital publishing platform that provides content management, audience engagement, and monetisation solutions for digital media organisations.", "website": "https://www.quintype.com" }, "Quora Pixel": { "cats": [ 10 ], "js": [ "qp.qp" ], "scriptSrc": [ "\\.quora\\.com/" ], "description": "Quora Pixel is a tool that is placed in your website code to track traffic and conversions.", "website": "https://quoraadsupport.zendesk.com/hc/en-us/categories/115001573928-Pixels-Tracking" }, "Qwik": { "cats": [ 18 ], "description": "Qwik is designed for the fastest possible page load time, by delivering pure HTML with near 0 JavaScript.", "website": "https://qwik.builder.io" }, "RBS Change": { "cats": [ 1, 6 ], "html": [ "\u003chtml[^\u003e]+xmlns:change=" ], "meta": { "generator": [ "rbs change" ] }, "implies": [ "PHP" ], "website": "https://www.rbschange.fr" }, "RCMS": { "cats": [ 1 ], "meta": { "generator": [ "^(?:rcms|reallycms)" ] }, "website": "https://www.rcms.fi" }, "RD Station": { "cats": [ 32 ], "js": [ "rdstation" ], "scriptSrc": [ "d335luupugsy2\\.cloudfront\\.net/js/loader-scripts/.*-loader\\.js" ], "description": "RD Station is a platform that helps medium and small businesses manage and automate their Digital Marketing strategy.", "website": "https://rdstation.com.br" }, "RDoc": { "cats": [ 4 ], "js": [ "rdoc_rel_prefix" ], "html": [ "\u003clink[^\u003e]+href=\"[^\"]*rdoc-style\\.css", "generated by \u003ca href=\"https:\\/\\/ruby\\.github\\.io\\/rdoc\\/\"\u003erdoc\u003c\\/a\u003e ([\\d.]*\\d)\\;version:\\1", "generated by \u003ca[^\u003e]+href=\"https?://rdoc\\.rubyforge\\.org[^\u003e]+\u003erdoc\u003c/a\u003e ([\\d.]*\\d)\\;version:\\1" ], "implies": [ "Ruby" ], "description": "RDoc produces HTML and command-line documentation for Ruby projects.", "website": "https://github.com/ruby/rdoc", "cpe": "cpe:2.3:a:dave_thomas:rdoc:*:*:*:*:*:*:*:*" }, "REDAXO": { "cats": [ 1 ], "js": [ "redaxo" ], "implies": [ "PHP" ], "description": "REDAXO is a content management system that provides business optimisation through web projects and output codes.", "website": "https://redaxo.org" }, "REG.RU": { "cats": [ 88 ], "description": "REG.RU is a web hosting provider and internet domain registrar.", "website": "https://www.reg.ru" }, "RND": { "cats": [ 6 ], "scriptSrc": [ "/scripts/plugins/rnd-mobilemenu/" ], "description": "RND is a software technology used for companies to set up ecommerce infrastructure.", "website": "https://www.rnd.com.tr/en/" }, "RSS": { "cats": [ 19 ], "description": "RSS is a family of web feed formats used to publish frequently updated works—such as blog entries, news headlines, audio, and video—in a standardized format.", "website": "https://www.rssboard.org/rss-specification" }, "RTB House": { "cats": [ 77 ], "description": "RTB House is a company that provides learning-powered retargeting solutions for brands and agencies.", "website": "https://www.rtbhouse.com" }, "RX Web Server": { "cats": [ 22 ], "headers": { "x-powered-by": "rx-web" }, "website": "https://developers.rokitax.co.uk/projects/rxweb" }, "RackCache": { "cats": [ 23 ], "headers": { "x-rack-cache": "" }, "implies": [ "Ruby" ], "description": "RackCache is a quick drop-in component to enable HTTP caching for Rack-based applications.", "website": "https://github.com/rtomayko/rack-cache" }, "Radix UI": { "cats": [ 66 ], "css": [ "--radix-accordion-content-height", "--radix-context-menu-content-available-height", "--radix-context-menu-content-transform-origin", "--radix-dropdown-menu-content-available-height", "--radix-dropdown-menu-content-transform-origin", "--radix-hover-card-content-transform-origin", "--radix-navigation-menu-viewport-height", "--radix-navigation-menu-viewport-width", "--radix-popover-content-transform-origin", "--radix-popover-trigger-width", "--radix-select-content-available-height", "--radix-select-content-transform-origin", "--radix-select-trigger-height", "--radix-select-trigger-width", "--radix-select-trigger-width", "--radix-toast-swipe-end-x", "--radix-toast-swipe-move-x", "--radix-tooltip-content-transform-origin" ], "description": "Radix UI is a React-based user interface component library that offers accessible, responsive, and customisable components for building web applications.", "website": "https://www.radix-ui.com" }, "Rain": { "cats": [ 6 ], "scriptSrc": [ "\\.rainpos\\.com/" ], "description": "Rain is a cloud-based point of sale (POS) system for small to midsized retailers.", "website": "https://www.rainpos.com" }, "RainLoop": { "cats": [ 30 ], "js": [ "rainloop", "rainloopi18n" ], "headers": { "server": "^rainloop" }, "html": [ "\u003clink[^\u003e]href=\"rainloop/v/([0-9.]+)/static/apple-touch-icon\\.png/\u003e\\;version:\\1" ], "scriptSrc": [ "^rainloop/v/([0-9.]+)/\\;version:\\1" ], "meta": { "rlappversion": [ "^([0-9.]+)$\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "RainLoop is a web-based email client.", "website": "https://www.rainloop.net/" }, "RaiseDonors": { "cats": [ 111 ], "meta": { "author": [ "^raisedonors$" ] }, "description": "RaiseDonors is for anyone raising money and cultivating donor relationships online.", "website": "https://explore.raisedonors.com" }, "Raisely": { "cats": [ 111 ], "js": [ "__raiselydebug", "raiselycomponents", "wpraisely" ], "description": "Raisely is a cloud-based fundraising platform that helps non-profits and charities drive fundraising campaigns and collect donations.", "website": "https://raisely.com" }, "Rakuten": { "cats": [ 71 ], "cookies": { "rakuten-source": "" }, "js": [ "rakutenranmid", "rakutensource" ], "scriptSrc": [ "\\.linksynergy\\.com", "tag\\.rmp\\.rakuten\\.com" ], "description": "Rakuten (formerly Ebates) allows you to earn cash-back rewards.", "website": "https://www.rakuten.com/" }, "Rakuten Advertising": { "cats": [ 36 ], "scriptSrc": [ "tag\\.rmp\\.rakuten\\.com" ], "website": "https://rakutenadvertising.com/" }, "Rakuten Digital Commerce": { "cats": [ 6 ], "js": [ "rakutenapplication" ], "website": "https://digitalcommerce.rakuten.com.br" }, "Ramda": { "cats": [ 59 ], "scriptSrc": [ "ramda.*\\.js" ], "website": "https://ramdajs.com" }, "RankMath SEO": { "cats": [ 87, 54 ], "scriptSrc": [ "/wp-content/plugins/seo-by-rank-math(?:-pro)?/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "RankMath SEO is a search engine optimisation plugin for WordPress.", "website": "https://rankmath.com" }, "Raphael": { "cats": [ 25 ], "js": [ "raphael.version" ], "scriptSrc": [ "raphael(?:-([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Raphael is a cross-browser JavaScript library that draws Vector graphics for websites.", "website": "https://dmitrybaranovskiy.github.io/raphael/" }, "RapidSec": { "cats": [ 16 ], "headers": { "content-security-policy": "\\.rapidsec\\.net", "content-security-policy-report-only": "\\.rapidsec\\.net", "report-to": "\\.rapidsec\\.net" }, "description": "RapidSec offers automated client-side security and monitoring.", "website": "https://rapidsec.com" }, "RapidSpike": { "cats": [ 13, 78 ], "js": [ "rspike_timing" ], "scriptSrc": [ "\\.rapidspike\\.com/" ], "description": "RapidSpike is an uptime and performance monitoring service for web sites and applications.", "website": "https://www.rapidspike.com" }, "Raptor": { "cats": [ 76 ], "js": [ "onraptorloaded", "raptor", "raptorbase64" ], "scriptSrc": [ "api\\.raptorsmartadvisor\\.com", "msecnd\\.net/script/raptor-([\\d.]+)\\.js\\;version:\\1" ], "description": "Raptor is a personalisation engine based on machine learning that analyses and learns about the user's behavior and unique browser history.", "website": "https://raptorsmartadvisor.com" }, "Raspbian": { "cats": [ 28 ], "headers": { "server": "raspbian", "x-powered-by": "raspbian" }, "description": "Raspbian is a free operating system for the Raspberry Pi hardware.", "website": "https://www.raspbian.org/" }, "RateParity": { "cats": [ 5 ], "scriptSrc": [ "code\\.rateparity\\.com/" ], "description": "RateParity is a conversion rate optimisation platform for hotels.", "website": "https://www.rateparity.com" }, "Rawabit": { "cats": [ 51 ], "cookies": { "rawabit_session": "" }, "meta": { "powered-by": [ "^rawabit$" ] }, "description": "Rawabit is a website builder that lets small businesses design landing pages, modify sections, and embed content links using a drag and drop editor.", "website": "https://www.rawabit.me" }, "Raychat": { "cats": [ 52 ], "js": [ "raychat" ], "scriptSrc": [ "app\\.raychat\\.io/scripts/js" ], "description": "Raychat is a free customer messaging platform.", "website": "https://raychat.io" }, "Raygun": { "cats": [ 78, 13 ], "js": [ "raygun", "raygunenabled", "raygunfactory" ], "scriptSrc": [ "\\.raygun\\.io" ], "description": "Raygun is a cloud-based networking monitoring and bug tracking application.", "website": "https://raygun.com" }, "Rayo": { "cats": [ 1 ], "js": [ "rayo" ], "meta": { "generator": [ "^rayo" ] }, "implies": [ "AngularJS", "Microsoft ASP.NET" ], "website": "https://www.rayo.ir" }, "Razorpay": { "cats": [ 41 ], "js": [ "razorpay" ], "scriptSrc": [ "checkout\\.razorpay\\.com" ], "description": "Razorpay is a provider of an online payment gateway that allows businesses to accept, process, and disburse payments.", "website": "https://razorpay.com/" }, "Re:amaze": { "cats": [ 52 ], "js": [ "reamaze.version" ], "scriptSrc": [ "\\.reamaze\\.com/" ], "description": "Re:amaze is a multi-brand customer service, live chat, and help desk solution.", "website": "https://www.reamaze.com" }, "ReCaptcha v2 for Contact Form 7": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/wpcf7-recaptcha/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Contact Form 7" ], "description": "Contact Form 7 v5.1 dropped support for reCaptcha v2 along with the [recaptcha] tag December 2018. This plugin brings that functionality back from Contact Form 7 5.0.5 and re-adds the [recaptcha] tag.", "website": "https://wordpress.org/plugins/wpcf7-recaptcha/" }, "ReConvert": { "cats": [ 100 ], "scriptSrc": [ "\\.stilyoapps\\.com/reconvert/assets/js/store_reconvert_node\\.js" ], "implies": [ "Shopify" ], "description": "ReConvert is a post-purchase upsell \u0026 thank you page.", "website": "https://www.reconvert.io" }, "ReDoc": { "cats": [ 4 ], "js": [ "redoc.version" ], "html": [ "\u003credoc " ], "scriptSrc": [ "/redoc\\.(?:min\\.)?js" ], "implies": [ "React" ], "description": "Redoc is an open-source tool that generates API documentation from OpenAPI specifications.", "website": "https://github.com/Rebilly/ReDoc" }, "React": { "cats": [ 12 ], "js": [ "__react_on_rails_event_handlers_ran_once__", "react.version", "reactonrails" ], "html": [ "\u003c[^\u003e]+data-react" ], "scriptSrc": [ "/([\\d\\.]+)/react(?:\\.min)?\\.js\\;version:\\1", "^react\\b.*\\.js", "react(?:-with-addons)?[.-](\\d+(?:\\.\\d+)+)[^/]*\\.js\\;version:\\1" ], "meta": { "description": [ "^web site created using create-react-app$" ] }, "description": "React is an open-source JavaScript library for building user interfaces or UI components.", "website": "https://reactjs.org", "cpe": "cpe:2.3:a:facebook:react:*:*:*:*:*:*:*:*" }, "React Bricks": { "cats": [ 1 ], "implies": [ "React" ], "description": "React Bricks is a visual editing CMS based on React components.", "website": "https://reactbricks.com" }, "React Redux": { "cats": [ 12 ], "scriptSrc": [ "/react-redux(@|/)([\\d.]+)(?:/[a-z]+)?/react-redux(?:.min)?\\.js\\;version:\\2" ], "implies": [ "React", "Redux" ], "description": "React Redux is the official React binding for Redux.", "website": "https://react-redux.js.org/" }, "React Router": { "cats": [ 12 ], "scriptSrc": [ "(?:/react-router(@|/)([\\d.]+)(?:/[a-z]+)?)?/react-router(?:\\.min)?\\.js\\;version:\\2" ], "implies": [ "React" ], "description": "React Router provides declarative routing for React.", "website": "https://reactrouter.com" }, "Reactive": { "cats": [ 1, 6 ], "meta": { "generator": [ "reactive" ] }, "implies": [ "Ruby on Rails" ], "description": "Reactive is a subscription-based software that allows you to set up an online store and website. It has a CMS and has been created to support retail, coffee bars, restaurants owners and accomodation properties such as hotels or villas. With Reactive one can sell products or accept reservations and online orders.", "website": "https://reactiveonline.io" }, "ReadAloud": { "cats": [ 5 ], "description": "The SiteSpeaker text-to-speech widget is embedded into your posts and give users an alternate way to consume your content as audio.", "website": "https://www.readaloudwidget.com" }, "ReadMe": { "cats": [ 4, 1 ], "scriptSrc": [ "/cdn\\.readme\\.io/js/" ], "meta": { "readme-deploy": [ "^[\\d\\.]+$" ], "readme-version": [ "^[\\d\\.]+$" ] }, "description": "ReadMe is a content management system that businesses use to create and manage technical or API documentation.", "website": "https://readme.com" }, "ReadSpeaker": { "cats": [ 5 ], "js": [ "readspeaker", "readspeaker.meta.version" ], "scriptSrc": [ "\\.readspeaker\\.com/" ], "description": "ReadSpeaker is an intuitive text-to-speech API that converts text into natural-sounding audio files for websites and applications.", "website": "https://www.readspeaker.com" }, "Readymag": { "cats": [ 51 ], "meta": { "generator": [ "^readymag$" ] }, "description": "Readymag is a browser-based design tool that helps create websites, portfolios and all kinds of online publications without coding.", "website": "https://readymag.com" }, "Really Simple CAPTCHA": { "cats": [ 87 ], "description": "Really Simple CAPTCHA does not work alone and is intended to work with other plugins. It is originally created for Contact Form 7, however, you can use it with your own plugin.", "website": "https://wordpress.org/plugins/really-simple-captcha" }, "RebelMouse": { "cats": [ 1 ], "headers": { "x-rebelmouse-cache-control": "", "x-rebelmouse-surrogate-control": "" }, "html": [ "\u003c!-- powered by rebelmouse\\." ], "website": "https://www.rebelmouse.com/" }, "Rebuy": { "cats": [ 76, 100 ], "js": [ "rebuyconfig" ], "scriptSrc": [ "rebuyengine\\.com" ], "implies": [ "Cart Functionality" ], "description": "Rebuy offers personlisation solutions for ecommerce sites.", "website": "https://rebuyengine.com/" }, "Recapture": { "cats": [ 98 ], "scriptSrc": [ "cdn\\.recapture\\.io/.+\\?v=\\d+(?:\u0026ver=([\\d\\.]+)?)?\\;version:\\1" ], "description": "Recapture is an abandoned cart recovery and email marketing solution.", "website": "https://recapture.io" }, "Recart": { "cats": [ 98 ], "js": [ "__recart", "recart" ], "scriptSrc": [ "api\\.recart\\.com" ], "description": "Recart is a tool to engage users who abandoned their shopping cart via Facebook Messenger.", "website": "https://recart.com/" }, "Recent Posts Widget With Thumbnails": { "cats": [ 87 ], "description": "Recent Posts Widget With Thumbnails is based on the well-known WordPress default widget 'Recent Posts' and extended to display more informations about the posts.", "website": "https://wordpress.org/plugins/recent-posts-widget-with-thumbnails/" }, "Recharge": { "cats": [ 41 ], "js": [ "rechargewidget" ], "scriptSrc": [ "\\.rechargecdn\\.com/", "rechargeassets-bootstrapheroes-rechargeapps\\.netdna-ssl\\.com" ], "implies": [ "Cart Functionality" ], "description": "Recharge is the a subscription payments platform designed for merchants to set up and manage dynamic recurring billing across web and mobile.", "website": "https://rechargepayments.com" }, "Recharts": { "cats": [ 25 ], "implies": [ "React" ], "description": "Recharts is a component-based charting library, which is exclusively built for React applications.", "website": "https://recharts.org/" }, "Recite Me": { "cats": [ 68 ], "scriptSrc": [ "api\\.reciteme\\.com/asset/js" ], "description": "Recite Me is a web accessibility overlay that claims to allow website visitors to customize a site in a way that works for them.", "website": "https://reciteme.com/" }, "Recomify": { "cats": [ 100 ], "scriptSrc": [ "app\\.recomify\\.com/" ], "implies": [ "Shopify" ], "description": "Recomify is a 1-click install, cost-effective smart product recommendation engine.", "website": "https://www.recomify.com" }, "RecoverMyCart": { "cats": [ 76, 100 ], "scriptSrc": [ "cdn\\.recovermycart\\.com" ], "implies": [ "Shopify" ], "description": "RecoverMyCart is a Shopify app for abandoned basket recovery.", "website": "https://app.recovermycart.com/" }, "Recruitee": { "cats": [ 101 ], "js": [ "rtapp.mapboxtoken" ], "description": "Recruitee is an integrated cloud-based recruitment management and applicant tracking system.", "website": "https://recruitee.com" }, "Recurate": { "cats": [ 19 ], "scripts": [ "\"(?:vendor|title)?\"\\:\"recurate\"" ], "description": "Recurate is a tech-enabled resale service that empowers brands \u0026 retailers to establish their own integrated resale platforms directly on their ecommerce sites.", "website": "https://www.recurate.com" }, "Recurly": { "cats": [ 41 ], "js": [ "recurly.version" ], "html": [ "\u003cinput[^\u003e]+data-recurly" ], "scriptSrc": [ "js\\.recurly\\.com" ], "description": "Recurly provides enterprise-class subscription billing and recurring payment management for thousands of businesses worldwide.", "website": "https://recurly.com" }, "Red Hat": { "cats": [ 28 ], "headers": { "server": "red hat", "x-powered-by": "red hat" }, "description": "Red Hat is an open-source Linux operating system.", "website": "https://www.redhat.com", "cpe": "cpe:2.3:o:redhat:linux:*:*:*:*:*:*:*:*" }, "Red Hat Gluster": { "cats": [ 48 ], "description": "Gluster is a free and open source scalable network filesystem.", "website": "https://www.gluster.org" }, "Red je Pakketje": { "cats": [ 99 ], "description": "Red je Pakketje is a Dutch company specialised in same-day-delivery.", "website": "https://redjepakketje.nl" }, "RedCart": { "cats": [ 6 ], "cookies": { "rc2c-erotica": "\\d+" }, "js": [ "rc_shop_id" ], "description": "RedCart is an all-in-one ecommerce platform from Poland.", "website": "https://redcart.pl" }, "RedShop": { "cats": [ 6 ], "implies": [ "Amazon S3", "Next.js", "React", "TypeScript" ], "description": "RedShop provides a platform for SMEs to manage their ecommerce business.", "website": "https://www.redshop.io" }, "Reddit": { "cats": [ 2 ], "js": [ "reddit" ], "html": [ "(?:\u003ca[^\u003e]+powered by reddit|powered by \u003ca[^\u003e]+\u003ereddit\u003c)" ], "implies": [ "Python" ], "website": "https://code.reddit.com" }, "Reddit Ads": { "cats": [ 36 ], "scriptSrc": [ "www\\.redditstatic\\.com" ], "description": "Reddit Ads is an online advertising offering from Reddit.", "website": "https://advertising.reddithelp.com/" }, "Redis": { "cats": [ 34 ], "description": "Redis is an in-memory data structure project implementing a distributed, in-memory key–value database with optional durability. Redis supports different kinds of abstract data structures, such as strings, lists, maps, sets, sorted sets, HyperLogLogs, bitmaps, streams, and spatial indexes.", "website": "https://redis.io", "cpe": "cpe:2.3:a:redislabs:redis:*:*:*:*:*:*:*:*" }, "Redis Object Cache": { "cats": [ 23 ], "html": [ "\u003c!--\\s+performance optimized by redis object cache" ], "implies": [ "Redis", "WordPress" ], "website": "https://wprediscache.com" }, "Redmine": { "cats": [ 13 ], "cookies": { "_redmine_session": "" }, "html": [ "powered by \u003ca href=\"[^\u003e]+redmine" ], "meta": { "description": [ "redmine" ] }, "implies": [ "Ruby on Rails" ], "description": "Redmine is a free and open-source, web-based project management and issue tracking tool.", "website": "https://www.redmine.org", "cpe": "cpe:2.3:a:redmine:redmine:*:*:*:*:*:*:*:*" }, "Redonner": { "cats": [ 84 ], "scriptSrc": [ "\\.redonner\\.fr/" ], "description": "This company promotes the collection and recycling of textiles by rewarding each donation of clothing made on its website with 'Re' points, allowing you to benefit from advantages and discounts at more than 70 partner brands.", "website": "https://www.redonner.fr" }, "Redux": { "cats": [ 12 ], "scriptSrc": [ "/redux(@|/)([\\d.]+)(?:/[a-z]+)?/redux(?:.min)?\\.js\\;version:\\2" ], "description": "Redux is a predictable state container for JavaScript applications.", "website": "https://redux.js.org" }, "Redux Framework": { "cats": [ 87 ], "meta": { "framework": [ "redux\\s([\\d\\.]+)\\;version:\\1" ], "generator": [ "redux\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "Redux Framework is a modular PHP library that allows developers to create customisable settings panels and controls for WordPress projects, providing a consistent user interface for managing options and settings.", "website": "https://redux.io" }, "RedwoodJS": { "cats": [ 12, 18 ], "implies": [ "GraphQL", "React", "TypeScript" ], "description": "RedwoodJS is a full-stack serverless web application framework built by Tom Preston Werner (co-founder of Github) et al.", "website": "https://redwoodjs.com" }, "Reelevant": { "cats": [ 76 ], "js": [ "reel.companyid" ], "headers": { "content-security-policy": "\\.reelevant\\.com" }, "description": "Reelevant is a visual content platform that helps businesses to create on-demand content for their viewers in order to increase conversion rates.", "website": "https://try.reelevant.com" }, "Reevoo": { "cats": [ 90 ], "js": [ "reevooaccesscode", "reevooapi", "reevooloader.tracking", "reevoourl" ], "scriptSrc": [ "\\.reevoo\\.com/" ], "description": "Reevoo is a provider of UGC solutions like reviews.", "website": "https://www.reevoo.com" }, "ReferralCandy": { "cats": [ 94, 84 ], "scriptSrc": [ "\\.referralcandy\\.com/" ], "description": "ReferralCandy is a marketing platform that gets shoppers to refer their friends.", "website": "https://www.referralcandy.com" }, "Refersion": { "cats": [ 71, 36 ], "scriptSrc": [ "\\.refersion\\.com" ], "description": "Refersion is an affiliate management app.", "website": "https://refersion.com" }, "Reflektion": { "cats": [ 76 ], "js": [ "rfk_deploy_time", "rfkparams" ], "scriptSrc": [ "\\.cloudfront\\.net/js/reflektion\\.js" ], "description": "Reflektion is a customer centric personalisation platform that optimizes customer experiences on an individual basis in real time.", "website": "https://reflektion.com" }, "Refundid": { "cats": [ 102 ], "js": [ "launchrefundidpopup" ], "description": "Refundid provides ecommerce customers instant refunds for their online returns.", "website": "https://refundid.com" }, "Regiondo": { "cats": [ 5, 72 ], "scriptSrc": [ "cdn\\.regiondo\\.net" ], "description": "Regiondo is a online booking system for tour and activity providers.", "website": "https://www.regiondo.com" }, "Reinvigorate": { "cats": [ 10 ], "js": [ "reinvigorate" ], "website": "https://www.reinvigorate.net" }, "Relais Colis": { "cats": [ 99 ], "description": "Relais Colis is a French parcel delivery network.", "website": "https://www.relaiscolis.com" }, "Relewise": { "cats": [ 76 ], "js": [ "relewiseconfig", "relewisetracking" ], "description": "Relewise is a platform that uses personalisation technology to provide customised online experiences through personalised search and recommendations.", "website": "https://relewise.com" }, "Remarkable Commerce": { "cats": [ 6 ], "js": [ "remarkable.basketitems" ], "description": "Remarkable Commerce is a technology and services company which provides a ecommerce platform for mid-sized retailers.", "website": "https://remarkable.net/" }, "Remix": { "cats": [ 18, 22 ], "js": [ "__remixcontext" ], "implies": [ "React" ], "description": "Remix is a React framework used for server-side rendering (SSR).", "website": "https://remix.run/" }, "Remixd": { "cats": [ 5 ], "scriptSrc": [ "tags\\.remixd\\.com/player" ], "description": "Remixd is a platform that enables podcast creators to efficiently produce and share their podcasts with a worldwide audience. The platform provides various tools and features to support podcast creation, hosting, and distribution, such as podcast hosting, analytics, monetisation, and social media integration.", "website": "https://www.remixd.com" }, "Render": { "cats": [ 62 ], "headers": { "x-render-origin-server": "render" }, "description": "Render is a cloud computing platform that provides a wide range of services, including web hosting, cloud computing, and application development. Render offers several hosting options, including static site hosting, web application hosting, and managed databases.", "website": "https://render.com" }, "Render Better": { "cats": [ 92, 100 ], "js": [ "renderbetter" ], "description": "Render Better is automated site speed and core web vital optimisation platform for Shopify.", "website": "https://www.renderbetter.com" }, "Replicache": { "cats": [ 12, 23 ], "headers": { "x-replicache-requestid": "" }, "description": "Replicache is a JavaScript framework for building high-performance, offline-capable, collaborative web apps.", "website": "https://replicache.dev/" }, "Replit": { "cats": [ 47 ], "headers": { "expect-ct": "\\.repl\\.it/", "replit-cluster": "" }, "description": "Replit is a platform for creating and sharing software.", "website": "https://replit.com" }, "Reputon": { "cats": [ 90, 100 ], "scriptSrc": [ "\\.reputon\\.com/" ], "description": "Reputon is an customer reviews Shopify app.", "website": "https://reputon.com" }, "RequireJS": { "cats": [ 12 ], "js": [ "requirejs.version" ], "scriptSrc": [ "require.*\\.js" ], "description": "RequireJS is a JavaScript library and file loader which manages the dependencies between JavaScript files and in modular programming.", "website": "https://requirejs.org" }, "ResDiary": { "cats": [ 93 ], "scriptSrc": [ "\\.resdiary\\.\\w+/" ], "description": "ResDiary, is a online reservation system for hospitality operators.", "website": "https://www.resdiary.com" }, "Resengo": { "cats": [ 93 ], "js": [ "wpjsonpresengoreservationwidget" ], "scriptSrc": [ "www\\.resengo\\.\\w+" ], "description": "Resengo is a restaurant table booking widget.", "website": "https://wwc.resengo.com" }, "Reserve In-Store": { "cats": [ 100, 93 ], "js": [ "reserveinstore.version", "reserveinstorejsurl" ], "implies": [ "Shopify" ], "description": "Reserve In-Store app will allow customers to reserve an item in your store online to come to pick it up or view the item before making the purchase.", "website": "https://www.reserveinstore.com" }, "Reservio": { "cats": [ 93, 72 ], "scriptSrc": [ "static\\.reservio\\.com" ], "description": "Reservio is a cloud-based appointment scheduling and online booking solution.", "website": "https://www.reservio.com" }, "Resin": { "cats": [ 22 ], "headers": { "server": "^resin(?:/(\\s*))?\\;version:\\1" }, "implies": [ "Java" ], "website": "https://caucho.com", "cpe": "cpe:2.3:a:caucho:resin:*:*:*:*:*:*:*:*" }, "Resmio": { "cats": [ 93 ], "js": [ "resmiobutton" ], "scriptSrc": [ "static\\.resmio\\.\\w+/static/" ], "description": "Resmio is a restaurant table booking widget.", "website": "https://www.resmio.com" }, "Resova": { "cats": [ 72 ], "js": [ "baseurl", "initresova" ], "description": "Resova is an online booking software.", "website": "https://resova.com" }, "Responsive Lightbox \u0026 Gallery": { "cats": [ 87, 7 ], "js": [ "rl_hide_image", "rl_view_image", "rlargs.activegalleries" ], "scriptSrc": [ "/wp-content/plugins/responsive-lightbox/.+front\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Responsive Lightbox \u0026 Gallery plugin is a lightweight WordPress gallery plugin by Digital Factory.", "website": "https://dfactory.eu/products/responsive-lightbox-gallery-extensions/" }, "ResponsiveVoice": { "cats": [ 19 ], "js": [ "responsivevoice.version" ], "description": "ResponsiveVoice is a Text-To-Speech API supported in 51 languages.", "website": "https://responsivevoice.org" }, "Resy": { "cats": [ 93 ], "js": [ "resywidget" ], "scriptSrc": [ "widgets\\.resy\\.\\w+" ], "description": "Resy is an technology and media company that provides an app and back-end management software for restaurant reservations.", "website": "https://resy.com" }, "Retail Rocket": { "cats": [ 76 ], "cookies": { "rr-testcookie": "testvalue", "rrpvid": "^\\d+$" }, "js": [ "retailrocket", "rraddtobasket", "rrapionready", "rrlibrary", "rrpartnerid" ], "scriptSrc": [ "cdn\\.retailrocket\\.net" ], "description": "Retail Rocket is a big data-based personalisation platform for ecommerce websites.", "website": "https://retailrocket.net" }, "Return Prime": { "cats": [ 100, 102 ], "scriptSrc": [ "//return-prime-proxy-prod\\.s3[^ ]*\\.amazonaws\\.com/" ], "description": "Return Prime is an application to manage returns for Shopify stores.", "website": "https://www.returnprime.com/" }, "ReturnGO": { "cats": [ 102 ], "js": [ "returngocanberun", "returngointegrationdata" ], "scriptSrc": [ "\\.returngo\\.ai/" ], "description": "ReturnGO's AI-driven returns management platform significantly improves customer lifetime value and post-purchase experience.", "website": "https://returngo.ai" }, "Returnly": { "cats": [ 102 ], "js": [ "returnly.containerswitcher", "returnly.internaleventtracker" ], "description": "Returnly is the provider of digital return experiences for direct-to-consumer brands.", "website": "https://returnly.com" }, "Retype": { "cats": [ 57 ], "meta": { "generator": [ "retype\\s([\\d\\.]+)?\\;version:\\1" ] }, "implies": [ "Node.js" ], "description": "Retype is an open-source static site generator built with Node.js that allows users to create and manage websites with ease using Markdown as the primary content format.", "website": "https://retype.com" }, "RevJet": { "cats": [ 36 ], "description": "RevJet is the first comprehensive Ad Experience Platform, for every audience, channel, format, inventory, and device.", "website": "https://www.revjet.com" }, "RevLifter": { "cats": [ 76 ], "cookies": { "revlifter": "" }, "js": [ "revlifter", "revlifterobject" ], "scriptSrc": [ "assets\\.revlifter\\.io" ], "description": "RevLifter is an AI-powered coupon technology which allows brands to offer personalised incentives to their customers based on real-time basket data.", "website": "https://www.revlifter.com" }, "Reveal.js": { "cats": [ 12 ], "js": [ "reveal.version" ], "scriptSrc": [ "(?:^|/)reveal(?:\\.min)?\\.js" ], "implies": [ "Highlight.js" ], "website": "https://lab.hakim.se/reveal-js" }, "Revel": { "cats": [ 18 ], "cookies": { "revel_flash": "", "revel_session": "" }, "implies": [ "Go" ], "website": "https://revel.github.io" }, "RevenueHunt": { "cats": [ 71 ], "scriptSrc": [ "admin\\.revenuehunt\\.com/" ], "description": "RevenueHunt is an affiliate marketing and advertising company specializing in paid surveys and cost per lead campaigns.", "website": "https://revenuehunt.com" }, "Revieve": { "cats": [ 76 ], "js": [ "revieve.__esmodule", "revieveconfig.onclickproduct" ], "description": "Revieve is a technology company delivering consumer-centric personalised digital brand experiences powered by AI/AR.", "website": "https://www.revieve.com" }, "ReviewSolicitors": { "cats": [ 90 ], "js": [ "rs.getwidgethtml" ], "scriptSrc": [ "\\.reviewsolicitors\\.co\\.uk/" ], "description": "ReviewSolicitors is a free and independent client-led review platform focusing on the UK legal market.", "website": "https://www.reviewsolicitors.co.uk" }, "Reviews.io": { "cats": [ 90 ], "js": [ "reviewsio_hasvoted", "reviewsio_sharelink" ], "description": "Reviews.io is a review collection tool for companies to collect merchant (company) \u0026 product reviews from genuine customers, then share these on Google.", "website": "https://www.reviews.io" }, "RevolverMaps": { "cats": [ 35 ], "scriptSrc": [ "\\.revolvermaps\\.com" ], "description": "RevolverMaps is a collection of real-time visitor statistics widgets for website or blog. Interactive visitor mappings to a globe rendered by the Revolver Engine.", "website": "https://www.revolvermaps.com" }, "Revv": { "cats": [ 111 ], "meta": { "revv-api-domain": [] }, "description": "Revv is a lead optimisation and donation platform.", "website": "https://revv.com" }, "Revy": { "cats": [ 100 ], "js": [ "revyapp", "revybundle", "revyupsell" ], "scriptSrc": [ "api\\.revy\\.io/" ], "description": "Revy is dedicated to build Shopify Apps to generate more sales for merchants.", "website": "https://revy.io" }, "Rewardful": { "cats": [ 71 ], "js": [ "rewardful" ], "scriptSrc": [ "r\\.wdfl\\.co" ], "description": "Rewardful is a way for SaaS companies to setup affiliate and referral programs with Stripe.", "website": "https://www.getrewardful.com/" }, "Rezdy": { "cats": [ 5, 72 ], "scriptSrc": [ "rezdy\\.\\w+/pluginjs" ], "description": "Rezdy is an online booking software for tours and attractions.", "website": "https://www.rezdy.com" }, "Rezgo": { "cats": [ 5, 72 ], "description": "Rezgo is a tour operator software that provides online booking system.", "website": "https://www.rezgo.com" }, "Rich Plugins Reviews": { "cats": [ 87, 90 ], "scriptSrc": [ "/wp-content/plugins/widget-google-reviews/" ], "description": "Rich Plugins Reviews is a WordPress plugin that integrates verified reviews from trusted sources such as Google and Facebook.", "website": "https://richplugins.com/business-reviews-bundle-wordpress-plugin" }, "RichRelevance": { "cats": [ 76 ], "js": [ "rr.u", "rr_v" ], "scriptSrc": [ "\\.richrelevance\\.com/" ], "description": "RichRelevance is a cloud-based omnichannel personalisation platform built to help Retailers, B2B, financial services, travel and hospitality, and branded manufacturers personalise their customer experiences.", "website": "https://richrelevance.com" }, "Richpanel": { "cats": [ 53 ], "js": [ "richpanel.plugin_api_url", "richpanel_messenger_url", "richpanelappproxy" ], "scriptSrc": [ "\\.richpanel\\.com/" ], "description": "Richpanel is a purpose-built CRM and customer support platform for ecommerce and DTC brands.", "website": "https://www.richpanel.com" }, "Rickshaw": { "cats": [ 25 ], "js": [ "rickshaw" ], "scriptSrc": [ "rickshaw(?:\\.min)?\\.js" ], "implies": [ "D3" ], "website": "https://code.shutterstock.com/rickshaw/" }, "RightJS": { "cats": [ 12 ], "js": [ "rightjs" ], "description": "RightJS is a modular JavaScript framework.", "website": "https://github.com/rightjs" }, "Riot": { "cats": [ 12 ], "js": [ "riot" ], "scriptSrc": [ "riot(?:\\+compiler)?(?:\\.min)?\\.js" ], "website": "https://riot.js.org/" }, "Ripple": { "cats": [ 12 ], "headers": { "x-sdp-app-type": "ripple" }, "implies": [ "Drupal", "Nuxt.js", "Vue.js" ], "description": "Ripple is the frontend framework for Single Digital Presence, delivered using Nuxt and Vue.js.", "website": "https://dpc-sdp.github.io/sdp-docs/ripple/" }, "Rise.ai": { "cats": [ 84, 94 ], "js": [ "rise.shop", "risestorefront" ], "scriptSrc": [ "strn\\.rise-ai\\.com/" ], "description": "Rise.ai is a strategic re-engagement solution that provides brands and retailers with a unique currency of their own.", "website": "https://rise.ai" }, "Riskified": { "cats": [ 10, 16 ], "js": [ "riskifiedbeaconload", "riskx" ], "headers": { "server": "riskified server" }, "html": [ "\u003c[^\u003e]*beacon\\.riskified\\.com", "\u003c[^\u003e]*c\\.riskified\\.com" ], "description": "Riskified is a privately held company that provides SaaS fraud and chargeback prevention technology.", "website": "https://www.riskified.com/" }, "RiteCMS": { "cats": [ 1 ], "meta": { "generator": [ "^ritecms(?: (.+))?\\;version:\\1" ] }, "implies": [ "PHP", "SQLite\\;confidence:80" ], "website": "https://ritecms.com" }, "Rive": { "cats": [ 25 ], "js": [ "rive.rive" ], "description": "Rive is a real-time interactive design and animation tool.", "website": "https://rive.app" }, "RoadRunner": { "cats": [ 22 ], "headers": { "server": "roadrunner" }, "implies": [ "PHP" ], "description": "RoadRunner is a high-performance PHP application server, load balancer, and process manager written in Golang.", "website": "https://roadrunner.dev" }, "Roadiz CMS": { "cats": [ 1, 11 ], "headers": { "x-powered-by": "roadiz cms" }, "meta": { "generator": [ "^roadiz ?(?:master|develop)? v?([0-9\\.]+)\\;version:\\1" ] }, "implies": [ "PHP", "Symfony" ], "website": "https://www.roadiz.io" }, "Robin": { "cats": [ 6 ], "js": [ "_robin_getrobinjs", "robin_settings", "robin_storage_settings" ], "website": "https://www.robinhq.com" }, "RockRMS": { "cats": [ 1, 11, 32 ], "meta": { "generator": [ "^rock v([0-9.]+)\\;version:\\1" ] }, "implies": [ "IIS", "Microsoft ASP.NET", "Windows Server" ], "description": "Rock RMS is a free, open-source Relationship Management System (RMS) built for churches and businesses.", "website": "https://www.rockrms.com" }, "Rockerbox": { "cats": [ 32 ], "js": [ "rb.source" ], "scriptSrc": [ "wxyz\\.rb\\.js" ], "description": "Rockerbox is a provider of multi-touch attribution software.", "website": "https://www.rockerbox.com" }, "Rocket.Chat": { "cats": [ 52 ], "js": [ "rocketchat.livechat" ], "description": "Rocket.Chat is a communication hub that facilitates team collaboration and organizes conversations.", "website": "https://rocket.chat" }, "Rocketfy": { "cats": [ 6, 51 ], "scriptSrc": [ "\\.rocketfy\\.mx/" ], "meta": { "generator": [ "^rocketfy\\smaker\\s-\\sv([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Next.js", "React" ], "description": "Rocketfy is a platform that allows users to build an online store and allows dropshipping at the same time.", "website": "https://rocketfy.mx" }, "Roistat": { "cats": [ 10, 74 ], "js": [ "roistathost", "roistatprojectid" ], "description": "Roistat is a marketing analytics system.", "website": "https://roistat.com/" }, "Rokt": { "cats": [ 76 ], "headers": { "content-security-policy": "\\.rokt\\.com" }, "scriptSrc": [ "\\.rokt\\.com/" ], "description": "Rokt is an ecommerce marketing technology that gives customers a personalised and relevant experience while buying online.", "website": "https://www.rokt.com" }, "Rollbar": { "cats": [ 13 ], "scriptSrc": [ "rollbar\\.js/([0-9.]+)\\;version:\\1" ], "website": "https://rollbar.com/" }, "Rosti": { "cats": [ 88 ], "headers": { "x-rosti": "" }, "description": "Rosti is a hosting service suitable for development and production deployment of web applications.", "website": "https://rosti.cz" }, "Rotic": { "cats": [ 52 ], "js": [ "rotic.setting" ], "description": "Rotic is a conversion chatbot that answers questions, captures contacts, and books meetings.", "website": "https://rotic.io" }, "RoundCube": { "cats": [ 30 ], "js": [ "rcmail", "roundcube" ], "html": [ "\u003ctitle\u003eroundcube" ], "implies": [ "PHP" ], "description": "RoundCube is free and open-source web-based IMAP email client.", "website": "https://roundcube.net", "cpe": "cpe:2.3:a:roundcube:webmail:*:*:*:*:*:*:*:*" }, "Route": { "cats": [ 107 ], "js": [ "routeapp" ], "scriptSrc": [ "//cdn.routeapp.io/" ], "description": "Route is a delivery and shipping tracking app", "website": "https://route.com/" }, "Royal Mail": { "cats": [ 99 ], "description": "Royal Mail is a British multinational postal service and courier company.", "website": "https://www.royalmail.com" }, "Rubedo": { "cats": [ 1 ], "js": [ "rubedoconfig" ], "implies": [ "Elasticsearch", "MongoDB", "PHP" ], "description": "Rubedo is an open-source PHP CMS powered by the Zend Framework, NoSQL MongoDB, Elasticsearch, and AngularJS, offering advanced features for content management and development.", "website": "https://github.com/WebTales/rubedo" }, "Rubicon Project": { "cats": [ 36 ], "scriptSrc": [ "https?://[^/]*\\.rubiconproject\\.com" ], "description": "Rubicon Project is an advertising automation platform enabling publishers to transact advertising brands.", "website": "https://rubiconproject.com/" }, "Ruby": { "cats": [ 27 ], "headers": { "server": "(?:mongrel|ruby(?:/([\\d\\.]+))?)\\;version:\\1" }, "description": "Ruby is an open-source object-oriented programming language.", "website": "https://ruby-lang.org", "cpe": "cpe:2.3:a:ruby-lang:ruby:*:*:*:*:*:*:*:*" }, "Ruby Receptionists": { "cats": [ 5 ], "js": [ "rubyapi" ], "scriptSrc": [ "chatwidget\\.ruby\\.com" ], "description": "Ruby Receptionists is a Portland, Oregon based virtual answering service for small businesses.", "website": "https://www.ruby.com" }, "Ruby on Rails": { "cats": [ 18 ], "cookies": { "_session_id": "\\;confidence:75" }, "js": [ "__react_on_rails_event_handlers_ran_once__", "_rails_loaded", "reactonrails" ], "headers": { "server": "mod_(?:rails|rack)", "x-powered-by": "mod_(?:rails|rack)" }, "scriptSrc": [ "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50" ], "meta": { "csrf-param": [ "^authenticity_token$\\;confidence:50" ] }, "implies": [ "Ruby" ], "description": "Ruby on Rails is a server-side web application framework written in Ruby under the MIT License.", "website": "https://rubyonrails.org", "cpe": "cpe:2.3:a:rubyonrails:rails:*:*:*:*:*:*:*:*" }, "Rudderstack": { "cats": [ 97 ], "js": [ "rudderanalytics" ], "scriptSrc": [ "cdn\\.rudderlabs\\.com" ], "description": "Rudderstack is a customer data platform (CDP) that helps you collect, clean, and control your customer data.", "website": "https://rudderstack.com/" }, "Rumble": { "cats": [ 14 ], "js": [ "rumble.gdpr", "rumble.resize" ], "description": "Rumble is a Canadian video-streaming platform that presents itself as an alternative to YouTube.", "website": "https://rumble.com" }, "Rust": { "cats": [ 27 ], "description": "Rust is a multi-paradigm, general-purpose programming language designed for performance and safety, especially safe concurrency.", "website": "https://www.rust-lang.org" }, "RxJS": { "cats": [ 12 ], "js": [ "rx.compositedisposable", "rx.symbol" ], "scriptSrc": [ "rx(?:\\.\\w+)?(?:\\.compat|\\.global)?(?:\\.min)?\\.js" ], "description": "RxJS is a reactive library used to implement reactive programming to deal with async implementation, callbacks, and event-based programs.", "website": "https://reactivex.io" }, "Ryviu": { "cats": [ 90 ], "js": [ "ryviu_global_settings" ], "scriptSrc": [ "cdn\\.ryviu\\.com" ], "description": "Ryviu is customer product reviews app for building social proof for store.", "website": "https://www.ryviu.com/" }, "SALESmanago": { "cats": [ 97, 32 ], "js": [ "salesmanagoobject" ], "scriptSrc": [ "\\.salesmanago\\.com/" ], "description": "SALESmanago is a no-code marketing automation and customer data platform designed for mid-sized buinesses and enterprises.", "website": "https://www.salesmanago.com" }, "SAP": { "cats": [ 53 ], "headers": { "server": "sap netweaver application server" }, "website": "https://sap.com", "cpe": "cpe:2.3:a:sap:netweaver_application_server:*:*:*:*:*:*:*:*" }, "SAP Commerce Cloud": { "cats": [ 6 ], "cookies": { "_hybris": "" }, "js": [ "acc.config.commonresourcepath", "acc.config.rootpath", "acc.config.themeresourcepath", "getproductattrfromhybris", "getproductavailabilityhybris", "hybrisid", "passlgdatatohybris", "smartedit" ], "html": [ "\u003c[^\u003e]+/(?:sys_master|hybr|_ui/(?:.*responsive/)?(?:desktop|common(?:/images|/img|/css|ico)?))/", "\u003cscript[^\u003e].*hybris.*.js" ], "implies": [ "Java" ], "description": "SAP Commerce Cloud is a cloud-native omnichannel commerce solution for B2B, B2C, and B2B2C companies.", "website": "https://www.sap.com/products/commerce-cloud.html", "cpe": "cpe:2.3:a:sap:commerce_cloud:*:*:*:*:*:*:*:*" }, "SAP Customer Data Cloud Sign-in": { "cats": [ 69 ], "scriptSrc": [ "\\.gigya\\.com/js/gigya\\.js" ], "website": "https://www.sap.com/uk/acquired-brands/what-is-gigya.html" }, "SAP Upscale Commerce": { "cats": [ 6 ], "description": "SAP Upscale Commerce is a SaaS solution for small-to-medium organizations selling directly to consumers.", "website": "https://www.sapstore.com/solutions/47000/SAP-Upscale-Commerce" }, "SDL Tridion": { "cats": [ 1 ], "html": [ "\u003cimg[^\u003e]+_tcm\\d{2,3}-\\d{6}\\." ], "website": "https://www.sdl.com/products/tridion" }, "SEMrush": { "cats": [ 32 ], "js": [ "semrush" ], "scriptSrc": [ "www\\.semrush\\.com" ], "description": "SEMrush is an all-in-one tool suite for improving online visibility and discovering marketing insights.", "website": "https://www.semrush.com" }, "SEOmatic": { "cats": [ 54 ], "meta": { "generator": [ "^seomatic$" ] }, "implies": [ "Craft CMS" ], "description": "SEOmatic facilitates modern SEO best practices \u0026 implementation for Craft CMS 3.", "website": "https://plugins.craftcms.com/seomatic" }, "SEUR": { "cats": [ 99 ], "description": "SEUR is a Spanish shipments and express transport company.", "website": "https://www.seur.com" }, "SHE Media": { "cats": [ 36 ], "js": [ "blogherads.adq", "shemedia" ], "description": "SHE Media is an ad network, which means that they basically serve as a coordinator between advertisers and publishers (bloggers).", "website": "https://www.shemedia.com" }, "SIDEARM Sports": { "cats": [ 1 ], "js": [ "sidearmcomponents", "sidearmsports" ], "implies": [ "Microsoft ASP.NET" ], "description": "SIDEARM Sports provides the software and technology that powers the websites, livestats, and video streaming for athletic programs North America.", "website": "https://sidearmsports.com/websites" }, "SIMsite": { "cats": [ 1 ], "scriptSrc": [ "/sim(?:site|core)/js" ], "meta": { "sim.medium": [] }, "website": "https://simgroep.nl/internet/portfolio-contentbeheer_41623/" }, "SNO Flex": { "cats": [ 80 ], "js": [ "sno_infographics_ajax_object" ], "description": "SNO Flex is a WordPress theme developed by SNO Sites. SNO Sites is a company that specialises in providing website solutions for schools and educational institutions.", "website": "https://snosites.com" }, "SOBI 2": { "cats": [ 19 ], "html": [ "(?:\u003c!-- start of sigsiu online business index|\u003cdiv[^\u003e]* class=\"sobi2)" ], "implies": [ "Joomla" ], "website": "https://www.sigsiu.net/sobi2.html" }, "SPDY": { "cats": [ 19 ], "headers": { "x-firefox-spdy": "\\d\\.\\d" }, "website": "https://chromium.org/spdy" }, "SPIP": { "cats": [ 1 ], "headers": { "composed-by": "spip ([\\d.]+) @\\;version:\\1", "x-spip-cache": "" }, "meta": { "generator": [ "(?:^|\\s)spip(?:\\s([\\d.]+(?:\\s\\[\\d+\\])?))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "SPIP is a content management system written in PHP that uses one or more databases like SQL, SQLite or PostgreSQL.", "website": "https://www.spip.net", "cpe": "cpe:2.3:a:spip:spip:*:*:*:*:*:*:*:*" }, "SPNEGO": { "cats": [ 16 ], "headers": { "www-authenticate": "^negotiate" }, "description": "SPNEGO is an authentication method commonly used in Windows servers to allow NTLM or Kerberos authentication.", "website": "https://tools.ietf.org/html/rfc4559" }, "SQL Buddy": { "cats": [ 3 ], "html": [ "(?:\u003ctitle\u003esql buddy\u003c/title\u003e|\u003c[^\u003e]+onclick=\"sidemainclick\\(\"home\\.php)" ], "implies": [ "PHP" ], "description": "SQL Buddy is an open-source web-based application written in PHP to handle the administration of MySQL and SQLite with the use of a Web browser.", "website": "https://www.sqlbuddy.com" }, "SQLite": { "cats": [ 34 ], "website": "https://www.sqlite.org", "cpe": "cpe:2.3:a:sqlite:sqlite:*:*:*:*:*:*:*:*" }, "STN Video": { "cats": [ 36, 14 ], "scripts": [ "embed\\.sendtonews\\.com/" ], "scriptSrc": [ "embed\\.sendtonews\\.com/" ], "description": "STN Video is a online video platform that solves digital video for publishers, content creators, and advertisers.", "website": "https://www.stnvideo.com" }, "STUDIO": { "cats": [ 51 ], "meta": { "generator": [ "^studio$" ] }, "implies": [ "Firebase", "Google Cloud", "Google Tag Manager", "Nuxt.js", "Vue.js" ], "description": "STUDIO is a Japan-based company and SaaS application for designing and hosting websites. The service includes a visual editor with built-in CMS and analytics.", "website": "https://studio.design" }, "SUSE": { "cats": [ 28 ], "headers": { "server": "suse(?:/?\\s?-?([\\d.]+))?\\;version:\\1", "x-powered-by": "suse(?:/?\\s?-?([\\d.]+))?\\;version:\\1" }, "description": "SUSE is a Linux-based server operating system.", "website": "https://suse.com" }, "SVG Support": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/svg-support/" ], "description": "SVG Support is a WordPress plugin which allows you to safely upload SVG files to your media library and use them like any other image.", "website": "https://github.com/wp-plugins/svg-support" }, "SWC": { "cats": [ 19 ], "description": "SWC is an extensible Rust-based platform for the next generation of fast developer tools.", "website": "https://swc.rs" }, "SWFObject": { "cats": [ 19 ], "js": [ "swfobject" ], "scriptSrc": [ "swfobject.*\\.js" ], "description": "SWFObject is an open-source JavaScript library used to embed Adobe Flash content onto web pages.", "website": "https://github.com/swfobject/swfobject" }, "SaaSquatch": { "cats": [ 94, 84 ], "js": [ "saasquatch_tenant_alias", "squatch.ctawidget", "squatchquery" ], "scriptSrc": [ "(?:\\.cloudfront\\.net/assets/javascripts/(?:v2/)?|/sas)squatch\\.min\\.js" ], "description": "SaaSquatch is a cloud-based loyalty, referral and rewards marketing platform.", "website": "https://www.saasquatch.com" }, "Saba.Host": { "cats": [ 88 ], "description": "Saba.Host is a total web-hosting solutions. It provides shared hosting, WordPress hosting, dedicated server, virtual private server (VPS), SSL and more.", "website": "https://saba.host" }, "SabaVision": { "cats": [ 36 ], "js": [ "__sabavision_get_add_timeout", "sabavisionelement", "sabavisionwebsiteid", "sabavisionwebsitepage" ], "meta": { "sabavision_zone": [] }, "description": "SabaVision, one of the core products of SabaIdea, is Iran's largest online advertising agency.", "website": "https://www.sabavision.com" }, "Saber": { "cats": [ 57 ], "html": [ "\u003cdiv [^\u003e]*id=\"_saber\"" ], "meta": { "generator": [ "^saber v([\\d.]+)$\\;version:\\1" ] }, "implies": [ "Vue.js" ], "description": "Saber is a framework for building static websites.", "website": "https://saber.land/" }, "Sails.js": { "cats": [ 18 ], "cookies": { "sails.sid": "" }, "headers": { "x-powered-by": "^sails(?:$|[^a-z0-9])" }, "implies": [ "Express" ], "website": "https://sailsjs.org" }, "Sailthru": { "cats": [ 32, 75, 76 ], "cookies": { "sailthru_pageviews": "" }, "js": [ "sailthru", "sailthruidentify", "sailthrunewsletterregistration", "tracksailthruuser" ], "scriptSrc": [ "ak\\.sail-horizon\\.com" ], "meta": { "sailthru.image.full": [], "sailthru.title": [] }, "description": "Sailthru is a marketing automation software and multi-channel personalisation tool that serves ecommerce and media brands.", "website": "https://www.sailthru.com" }, "Sakai": { "cats": [ 21 ], "cookies": { "sakaiid": "" }, "js": [ "sakai", "sakaiportalwindow", "sakaitutorialskin" ], "description": "Sakai is a robust open-source learning management system created by higher ed for higher ed.", "website": "https://www.sakailms.org", "cpe": "cpe:2.3:a:sakailms:sakai:*:*:*:*:*:*:*:*" }, "Sakura Internet": { "cats": [ 88 ], "description": "Sakura Internet is a web hosting provider that has been operating for almost 30 years.", "website": "https://www.sakura.ad.jp" }, "SaleCycle": { "cats": [ 76 ], "description": "SaleCycle is a UK based global behavioral marketing firm.", "website": "https://www.salecycle.com" }, "Saleor": { "cats": [ 6 ], "js": [ "___next_data__.runtimeconfig.saleor", "__next_data__.runtimeconfig.saleor" ], "implies": [ "GraphQL" ], "description": "Saleor is a headless, GraphQL ecommerce platform.", "website": "https://saleor.io" }, "SalesFire": { "cats": [ 76, 29 ], "js": [ "loadsalesfire" ], "scriptSrc": [ "cdn\\.salesfire\\.co\\.uk/" ], "description": "SalesFire is a SaaS company specialising in conversion rate optimisation, intelligent personalisation and on-site search solutions.", "website": "https://www.salesfire.co.uk" }, "SalesReps.io": { "cats": [ 10 ], "scriptSrc": [ "api\\.salesreps\\.io/" ], "description": "SalesReps.io is a sales representative performance and commission reporting software provider.", "website": "https://salesreps.io" }, "Salesfloor": { "cats": [ 5, 6 ], "js": [ "nmconfig.salesfloor_env", "salesfloorhost" ], "scriptSrc": [ "\\.salesfloor\\.net/" ], "description": "Salesfloor is a mobile clienteling and virtual selling platform designed for store associates to connect with customers-beyond the store and a mpos platform for frictionless in-store experiences.", "website": "https://salesfloor.net" }, "Salesforce": { "cats": [ 53 ], "cookies": { "com.salesforce": "" }, "js": [ "sfdcapp", "sfdccmp", "sfdcpage", "sfdcsessionvars" ], "html": [ "\u003c[^\u003e]+=\"brandquaternaryfgrs\"" ], "description": "Salesforce is a cloud computing service software (SaaS) that specializes in customer relationship management (CRM).", "website": "https://www.salesforce.com", "cpe": "cpe:2.3:a:salesforce:*:*:*:*:*:*:*:*:*" }, "Salesforce Audience Studio": { "cats": [ 86, 97 ], "js": [ "krux", "updatekruxcookie" ], "scriptSrc": [ "\\.krxd\\.net/" ], "description": "Salesforce Audience Studio is a customer data marketplace that only other platform users can access.", "website": "https://www.salesforce.com/products/marketing-cloud/data-management" }, "Salesforce Commerce Cloud": { "cats": [ 6 ], "cookies": { "dw_dnt": "", "dwsid": "" }, "js": [ "dwanalytics" ], "headers": { "server": "demandware ecommerce server" }, "scriptSrc": [ "/demandware\\.static/" ], "implies": [ "Salesforce" ], "description": "Salesforce Commerce Cloud is a cloud-based software-as-a-service (SaaS) ecommerce solution.", "website": "https://demandware.com" }, "Salesforce Desk": { "cats": [ 53 ], "scriptSrc": [ "^/s/sfsites/aurafw/" ], "description": "Salesforce Desk(Desk.com) is software as a service (SaaS) tool on the help desk.", "website": "https://www.salesforce.com/solutions/small-business-solutions/help-desk-software/" }, "Salesforce Interaction Studio": { "cats": [ 76, 86 ], "js": [ "evergage", "evergagehidesections" ], "scriptSrc": [ "cdn\\.evgnet\\.com" ], "description": "Salesforce Interaction Studio (formerly Evergage) is a cloud-based software that allows users to collect, analyze, and respond to user behavior on their websites and web applications in real-time.", "website": "https://www.salesforce.com/products/marketing-cloud/customer-interaction" }, "Salesforce Marketing Cloud Account Engagement": { "cats": [ 32 ], "js": [ "piaid", "picid", "pihostname", "piprotocol", "pitracker" ], "headers": { "x-pardot-lb": "", "x-pardot-route": "", "x-pardot-rsp": "" }, "description": "Salesforce Marketing Cloud Account Engagement (formerly known as Pardot) is an application specifically designed for B2B marketing automation.", "website": "https://www.salesforce.com/products/marketing-cloud/marketing-automation" }, "Salesforce Marketing Cloud Email Studio": { "cats": [ 75 ], "headers": { "content-security-policy": "\\.exacttarget\\.com/" }, "description": "Salesforce Marketing Cloud Email Studio is a powerful tool that allows you to build and send personalised emails.", "website": "https://www.salesforce.com/products/marketing-cloud/email-marketing" }, "Salesforce Service Cloud": { "cats": [ 52, 53 ], "js": [ "embedded_svc" ], "scriptSrc": [ "service\\.force\\.com" ], "implies": [ "Salesforce" ], "description": "Salesforce Service Cloud is a customer relationship management (CRM) platform for customer service and support.", "website": "https://www.salesforce.com/au/products/service-cloud/" }, "Salesloft": { "cats": [ 32 ], "js": [ "slscout", "slscoutobject" ], "description": "Salesloft is a cloud-based sales engagement platform.", "website": "https://salesloft.com" }, "Salesnauts": { "cats": [ 6 ], "description": "Salesnauts is a fashion ecommerce platform.", "website": "https://salesnauts.com" }, "Salla": { "cats": [ 6 ], "js": [ "salla.shop", "sallaapplepay" ], "headers": { "x-frame-options": "\\.salla\\.sa", "x-powered-by": "^salla$" }, "description": "Salla is an ecommerce platform specifically tailored to serve businesses and customers in Saudi Arabia.", "website": "https://salla.sa" }, "Salonist": { "cats": [ 72 ], "description": "Salonist is a salon management software.", "website": "https://salonist.io" }, "Salsify": { "cats": [ 95 ], "description": "Salsify is a product experience management platform which connects digital asset management, content syndication, and digital catalog capabilities.", "website": "https://www.salsify.com" }, "Saly": { "cats": [ 6 ], "meta": { "application-name": [ "^saly\\sb2b\\splatform$" ] }, "implies": [ "PHP", "Svelte" ], "description": "Saly is an enterprise-class B2B ecommerce platform. Dedicated to solving problems faced by manufacturers, wholesalers and distributors.", "website": "https://saly.pl" }, "Sana Commerce": { "cats": [ 6 ], "js": [ "sana.ui" ], "description": "Sana Commerce is an ecommerce platform for SAP and Microsoft Dynamics.", "website": "https://www.sana-commerce.com" }, "Sanity": { "cats": [ 1 ], "headers": { "content-security-policy": "cdn\\.sanity\\.io", "x-sanity-shard": "" }, "description": "Sanity is a platform for structured content. It comes with an open-source, headless CMS that can be customized with Javascript, a real-time hosted data store and an asset delivery pipeline.", "website": "https://www.sanity.io" }, "Sapper": { "cats": [ 18 ], "js": [ "__sapper__" ], "html": [ "\u003cscript[^\u003e]*\u003e__sapper__" ], "implies": [ "Node.js", "Svelte" ], "website": "https://sapper.svelte.dev" }, "Sapren": { "cats": [ 1 ], "meta": { "generator": [ "^saprenco.com website builder$" ] }, "implies": [ "Laravel", "MySQL", "PHP" ], "description": "Sapren is a CMS produced by PHP, Laravel framework and MySQL.", "website": "https://www.sapren.net" }, "Sarka-SPIP": { "cats": [ 1 ], "meta": { "generator": [ "sarka-spip(?:\\s([\\d.]+))?\\;version:\\1" ] }, "implies": [ "SPIP" ], "website": "https://sarka-spip.net" }, "Sass": { "cats": [ 27 ], "description": "Sass is an extension of CSS that enables you to use things like variables, nested rules, inline imports and more.", "website": "https://sass-lang.com" }, "Satori": { "cats": [ 32 ], "js": [ "satoriform" ], "scriptSrc": [ "satori\\.segs\\.jp/" ], "description": "Satori provides marketing automation software.", "website": "https://satori.marketing" }, "Satori Studio Bento": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/bento/" ], "description": "Satori Studio Bento is a powerful yet user-friendly free WordPress theme intended for use in the broadest range of web projects.", "website": "https://satoristudio.net/bento-free-wordpress-theme" }, "Sazito": { "cats": [ 6 ], "js": [ "sazito" ], "meta": { "generator": [ "^sazito" ] }, "website": "https://sazito.com" }, "Scala": { "cats": [ 27 ], "description": "Scala is a general-purpose programming language providing support for both object-oriented programming and functional programming.", "website": "https://www.scala-lang.org" }, "Scalapay": { "cats": [ 41, 91 ], "scriptSrc": [ "cdn\\.scalapay\\.com" ], "description": "Scalapay is a payment method for e-commerce merchants in Europe that allows customers to buy now and pay later (BNPL).", "website": "https://www.scalapay.com/" }, "Scalefast": { "cats": [ 6 ], "scriptSrc": [ "cdn-prod\\.scalefast\\.com/(?:.+\\.js\\?version=([\\d\\.]+))?\\;version:\\1" ], "description": "Scalefast is an outsourced ecommerce solution designed to build and manage global ecommerce for brands, with customer loyalty programs.", "website": "https://www.scalefast.com" }, "ScandiPWA": { "cats": [ 108 ], "implies": [ "Magento\\;version:2", "PWA", "React" ], "description": "ScandiPWA is the next generation Magento 2 PWA theme developed in React.", "website": "https://scandipwa.com", "cpe": "cpe:2.3:a:scandipwa:magento-scripts:*:*:*:*:*:node.js:*:*" }, "Schedule Engine": { "cats": [ 52 ], "scriptSrc": [ "webchat.scheduleengine.net" ], "description": "Schedule Engine is a customer support solution built for contractors.", "website": "https://www.scheduleengine.com/" }, "Scientific Linux": { "cats": [ 28 ], "headers": { "server": "scientific linux", "x-powered-by": "scientific linux" }, "description": "Scientific Linux (SL) is a free open-source operating system based on Red Hat Enterprise Linux.", "website": "https://scientificlinux.org" }, "Scissor Themes Writee": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/writee(?:-pro)?/" ], "description": "Writee is an elegant free personal WordPress blog theme and well suited for personal, food, travel, fashion, corporate, or any other amazing blog.", "website": "https://www.scissorthemes.com/themes/writee-free" }, "Scoop.it": { "cats": [ 96 ], "description": "Scoop.it is a content marketing software company based in San Francisco which provide content curation platform.", "website": "https://www.scoop.it" }, "Scorpion": { "cats": [ 1 ], "js": [ "process.userdata" ], "html": [ "\u003c[^\u003e]+id=\"hsscorpion" ], "scriptSrc": [ "cdn.cxc.scorpion.direct" ], "description": "Scorpion is a marketing and technology provider.", "website": "https://www.scorpion.co/" }, "Scrivito": { "cats": [ 1 ], "js": [ "scrivito", "scrivito" ], "meta": { "generator": [ "^scrivito\\sby\\sinfopark\\sag\\s\\(scrivito\\.com\\)$" ] }, "description": "Scrivito is a decoupled/headless enterprise web CMS.", "website": "https://www.scrivito.com" }, "ScrollMagic": { "cats": [ 59 ], "js": [ "scrollmagic", "scrollmagic.version" ], "implies": [ "GSAP", "jQuery" ], "description": "ScrollMagic is a jQuery plugin which essentially lets you use the scrollbar like a playback scrub control.", "website": "https://scrollmagic.io" }, "Scully": { "cats": [ 57 ], "js": [ "scullyio" ], "meta": { "generator": [ "^scully\\s([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Angular" ], "description": "Scully is a static site generator for Angular projects looking to embrace the Jamstack.", "website": "https://scully.io" }, "SeQura": { "cats": [ 91 ], "js": [ "sequra", "sequraconfiguration", "sequraproducts" ], "scriptSrc": [ "live\\.sequracdn\\.com/" ], "description": "SeQura is a FinTech company based in Barcelona, providing digital flexible payment solutions, with a geographical focus on Southern Europe and Latin America.", "website": "https://www.sequra.es" }, "Seal Subscriptions": { "cats": [ 100 ], "js": [ "sealsubs.checkout", "sealsubscriptions_settings_updated", "sealsubsloaded" ], "scriptSrc": [ "\\.sealsubscriptions\\.com/" ], "implies": [ "Shopify" ], "description": "Seal Subscriptions is a Shopify subscriptions app, packed with lots of features, such as automated product swaps, interval changes, payment calendar, Quick Checkout Wizard, and more.", "website": "https://www.sealsubscriptions.com" }, "SeamlessCMS": { "cats": [ 1 ], "meta": { "generator": [ "^seamless\\.?cms" ] }, "website": "https://www.seamlesscms.com" }, "SearchFit": { "cats": [ 6 ], "js": [ "sfui.checkout" ], "meta": { "generation-copyright": [ "by\\ssearchfit\\sshopping\\scart\\sv([\\d\\.]+)\\;version:\\1" ] }, "description": "Searchfit provides top ecommerce software, solutions and ecommerce website design for enterprise and mid-level retailers.", "website": "https://www.searchfit.com" }, "Searchanise": { "cats": [ 29 ], "js": [ "searchanise" ], "scriptSrc": [ "searchanise(?:-.+\\.kxcdn)?\\.com/" ], "description": "Searchanise is a complete search and filter solution for ecommerce.", "website": "https://start.searchanise.com" }, "SearchiQ": { "cats": [ 29 ], "js": [ "siq_version", "siqconfig.version" ], "description": "SearchiQ is a cloud-based search engine solution that can be integrated into a website.", "website": "https://www.searchiq.co" }, "Searchspring": { "cats": [ 29 ], "js": [ "searchspring", "searchspringconf", "searchspringinit" ], "scriptSrc": [ "cdn\\.searchspring\\.net" ], "description": "Searchspring is a site search and merchandising platform designed to help ecommerce.", "website": "https://searchspring.com" }, "Secomapp": { "cats": [ 100 ], "js": [ "secomapp" ], "scriptSrc": [ "cdn\\.secomapp\\.com/" ], "implies": [ "Shopify" ], "description": "Secomapp is a trusted Shopify Expert providing services through Shopify Apps.", "website": "https://www.secomapp.com" }, "Sectigo": { "cats": [ 70 ], "description": "Sectigo provides SSL certificate and computer security products.", "website": "https://sectigo.com/" }, "Section.io": { "cats": [ 31 ], "headers": { "section-io-id": "", "section-io-origin-status": "", "section-io-origin-time-seconds": "" }, "description": "Section.io is a Content Delivery Network (CDN).", "website": "https://www.section.io" }, "Sections.design Shopify App Optimization": { "cats": [ 92, 100 ], "implies": [ "Shopify" ], "description": "Sections.design Shopify App Optimization is a Shopify section written in liquid for the purpose of improving performance of Shopify stores by optimizing how Shopify app loads.", "website": "https://github.com/mirceapiturca/Sections/tree/master/App%20Optimization" }, "SeedProd Coming Soon": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/coming-soon/" ], "description": "SeedProd Coming Soon is a page builder allows you to add a new website under construction page to your WordPress site without hiring a developer.", "website": "https://www.seedprod.com/features/coming-soon-page-templates-for-wordpress" }, "Seers": { "cats": [ 67 ], "scriptSrc": [ "seersco.com/script/cb\\.js" ], "website": "https://www.seersco.com" }, "Segmanta": { "cats": [ 73 ], "js": [ "segmanta__dynamic_embed_config", "segmanta__user_metadata" ], "scriptSrc": [ "pge\\.segmanta\\.com/widget_embed_js(?:/widgetembed-v([\\d.]+)\\.min\\.js)?\\;version:\\1" ], "description": "Segmanta is a mobile-first survey platform designed for product feedback, brand awareness and concept testing research.", "website": "https://segmanta.com" }, "Segment": { "cats": [ 97 ], "js": [ "__segment_inspector__", "analytics.snippet_version", "analytics.version" ], "scriptSrc": [ "/segment-wrapper\\.min\\.js", "cdn\\.segment\\.com/analytics\\.js" ], "description": "Segment is a customer data platform (CDP) that helps you collect, clean, and control your customer data.", "website": "https://segment.com" }, "Segment Consent Manager ": { "cats": [ 67 ], "js": [ "consentmanager.version" ], "scriptSrc": [ "@segment/consent-manager@([\\d.]+)\\;version:\\1" ], "description": " Segment Consent Manager is a tool that automates the process of requesting consent for data usage, stores data on user privacy preferences, and updates these preferences when users request changes.", "website": "https://segment.com/blog/how-to-build-consent-management-into-your-site-in-less-than-a-week" }, "SegmentStream": { "cats": [ 10 ], "js": [ "segmentstream.version" ], "scriptSrc": [ "cdn\\.segmentstream\\.com" ], "description": "SegmentStream is a AI-powered marketing analytics platform built for data-driven CMOs, web analysts and performance marketing teams.", "website": "https://segmentstream.com" }, "Seko OmniReturns": { "cats": [ 102 ], "scriptSrc": [ "//cdn\\.omniparcelreturns\\.com/" ], "implies": [ "MySQL", "PHP" ], "description": "Seko OmniReturns is an online portal used on ecommerce websites for customers to create returns and shipping labels globally. Seko is a global logistics company offering both the technology and reverse logistics.", "website": "https://www.sekologistics.com/us/global-cross-border-returns" }, "Select2": { "cats": [ 59 ], "js": [ "jquery.fn.select2" ], "scriptSrc": [ "select2(?:\\.min|\\.full)?\\.js" ], "implies": [ "jQuery" ], "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.", "website": "https://select2.org/" }, "Selectize": { "cats": [ 59 ], "js": [ "selectize", "selectize" ], "implies": [ "jQuery" ], "description": "Selectize is an extensible jQuery-based custom \u003cselect\u003e UI control.", "website": "https://selectize.dev" }, "Sellacious": { "cats": [ 6 ], "js": [ "sellaciousviewcartaio" ], "implies": [ "Joomla" ], "description": "Sellacious is an open-source ecommerce and marketplace platform for integrated POS and online stores.", "website": "https://www.sellacious.com" }, "Selldone": { "cats": [ 6 ], "js": [ "webpackchunkselldone" ], "meta": { "selldone-capi": [], "selldone-cdn-id": [], "selldone-cdn-images": [], "selldone-iframe": [] }, "implies": [ "PHP", "Vue.js" ], "description": "Selldone is an all-in-one, ready-to-use ecommerce platform.", "website": "https://selldone.com" }, "SellersCommerce": { "cats": [ 6 ], "scriptSrc": [ "\\.sellerscommerce\\.com/" ], "description": "SellersCommerce is a medium ecommerce software company that provides b2b ecommerce platform to retail companies.", "website": "https://www.sellerscommerce.com" }, "Selless": { "cats": [ 6 ], "js": [ "__next_data__.assetprefix" ], "description": "Selless is an all-in-one, ready-to-use ecommerce platform.", "website": "https://selless.com" }, "Sellfy": { "cats": [ 6 ], "js": [ "_sellfy.version" ], "scriptSrc": [ "sellfy\\.com/js/" ], "description": "Sellfy is an ecommerce platform designed specifically for selling digital products, such as music, illustrations, photos, books or videos in digital files.", "website": "https://sellfy.com" }, "Sellingo": { "cats": [ 6 ], "js": [ "sellingoquantitycalc" ], "description": "Sellingo is a Polish ecommerce platform.", "website": "https://sellingo.pl" }, "Sellix": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.sellix\\.io/static/js/embed\\.js" ], "description": "Sellix is an ecommerce payment processor. It accepts PayPal, PerfectMoney and popular cryptocurrencies.", "website": "https://sellix.io/" }, "Sellsy": { "cats": [ 53 ], "js": [ "sellsysnippet" ], "scriptSrc": [ "\\.sellsy\\.com/" ], "description": "Sellsy is a cloud-based sales management solution for small to midsize businesses", "website": "https://go.sellsy.com" }, "Selly": { "cats": [ 6 ], "scriptSrc": [ "embed\\.selly\\.(?:gg|io)" ], "description": "Selly is an ecommerce platform for selling digital goods.", "website": "https://selly.io/" }, "Semantic UI": { "cats": [ 66 ], "html": [ "\u003clink[^\u003e]+semantic(?:\\.min)\\.css\"" ], "scriptSrc": [ "/semantic(?:-([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Semantic UI is a front-end development framework, powered by LESS and jQuery.", "website": "https://semantic-ui.com/" }, "Sematext Experience": { "cats": [ 78 ], "scriptSrc": [ "\\.sematext\\.com/experience\\.js" ], "description": "Sematext Experience for Real User Monitoring Analyze data collected from real-user sessions, detect anomalies, send alerts in real-time, and enhance overall customer digital experience.", "website": "https://sematext.com/experience" }, "Semplice": { "cats": [ 80, 51 ], "js": [ "semplice.template_dir" ], "scriptSrc": [ "/wp-content/themes/semplice(?:\\d+)?(?:-child)?(?:-theme)?/" ], "description": "Semplice is a Wordpress-based website builder made by designers for designers.", "website": "https://www.semplice.com" }, "Sencha Touch": { "cats": [ 12, 26 ], "scriptSrc": [ "sencha-touch.*\\.js" ], "description": "Sencha Touch is a user interface (UI) JavaScript library, or web framework, specifically built for the Mobile Web.", "website": "https://www.sencha.com/products/touch" }, "SendPulse": { "cats": [ 32, 75 ], "scriptSrc": [ "\\.sendpulse\\.com/" ], "description": "SendPulse is an email marketing platform with additional channels: SMS, web push notifications, Facebook and WhatsApp chatbots.", "website": "https://sendpulse.com" }, "Sendgrid": { "cats": [ 75 ], "description": "SendGrid is a cloud-based email delivery platform for transactional and marketing emails.", "website": "https://sendgrid.com/" }, "Sendinblue": { "cats": [ 32, 75 ], "js": [ "sendinblue" ], "scriptSrc": [ "sib(?:automation|forms)\\.com/" ], "description": "Sendinblue is an email marketing solution for small and medium-sized businesses that want to send and automate email marketing campaigns.", "website": "https://www.sendinblue.com" }, "Sensors Data": { "cats": [ 10 ], "cookies": { "sensorsdata2015jssdkcross": "", "sensorsdata2015session": "" }, "js": [ "sa.lib_version", "sensorsdata_app_js_bridge_call_js" ], "scriptSrc": [ "sensorsdata" ], "website": "https://www.sensorsdata.cn" }, "Sentry": { "cats": [ 13 ], "js": [ "__sentry__", "raven.config", "ravenoptions.whitelisturls", "sentry", "sentry.sdk_version" ], "html": [ "\u003cscript[^\u003e]*\u003e\\s*raven\\.config\\('[^']*', \\{\\s+release: '([0-9\\.]+)'\\;version:\\1", "\u003cscript[^\u003e]*src=\"[^\"]*browser\\.sentry\\-cdn\\.com/([0-9.]+)/bundle(?:\\.tracing)?(?:\\.min)?\\.js\\;version:\\1" ], "scriptSrc": [ "browser\\.sentry\\-cdn\\.com/([0-9.]+)/bundle(?:\\.tracing)?(?:\\.min)?\\.js\\;version:\\1" ], "description": "Sentry is an open-source platform for workflow productivity, aggregating errors from across the stack in real time.", "website": "https://sentry.io/" }, "Seravo": { "cats": [ 62, 88 ], "headers": { "x-powered-by": "^seravo" }, "implies": [ "WordPress" ], "website": "https://seravo.com" }, "Serendipity": { "cats": [ 1, 11 ], "meta": { "generator": [ "serendipity(?: v\\.([\\d.]+))?\\;version:\\1" ], "powered-by": [ "serendipity v\\.([\\d.]+)\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://s9y.org" }, "Service Management Group": { "cats": [ 73 ], "js": [ "smgetrackparams" ], "scriptSrc": [ "\\.smg\\.com/" ], "description": "Service Management Group offers customer experience measurement, employee engagement, social monitoring, publishing, and brand research services.", "website": "https://www.smg.com" }, "Service Provider Pro": { "cats": [ 41, 53 ], "cookies": { "spp_csrf": "\\;confidence:25", "spp_orderform": "", "spp_session": "\\;confidence:25" }, "js": [ "spporderform" ], "scriptSrc": [ "\\.spp\\.io/js/", "js/spp_clients\\.js\\;confidence:50" ], "meta": { "server": [ "app.spp.co" ] }, "description": "Service Provider Pro is a client management \u0026 billing software for productized service agencies.", "website": "https://spp.co" }, "ServiceNow": { "cats": [ 19 ], "description": "ServiceNow is a cloud computing platform to help companies manage digital workflows for enterprise operations.", "website": "https://www.servicenow.com" }, "Setmore": { "cats": [ 5, 72 ], "js": [ "setmorepopup" ], "scriptSrc": [ "/setmore-appointments/script/", "my\\.setmore\\.\\w+/" ], "description": "Setmore is a cloud-based appointment scheduling solution.", "website": "https://www.setmore.com" }, "SevenRooms": { "cats": [ 5, 72 ], "js": [ "sevenroomswidget" ], "scriptSrc": [ "sevenrooms\\.\\w+/widget/embed\\.js" ], "description": "SevenRooms is an fully-integrated reservation, seating and restaurant management system.", "website": "https://sevenrooms.com" }, "Sezzle": { "cats": [ 41, 91 ], "js": [ "awesomesezzle", "rendersezzleiframe", "sezzle_footer_images" ], "scriptSrc": [ "widget\\.sezzle\\.(?:in|com)" ], "meta": { "sezzle_cid": [] }, "description": "Sezzle offers a buy-now-pay-later solution.", "website": "https://sezzle.com/" }, "Shaka Player": { "cats": [ 14 ], "js": [ "shaka.player.version" ], "description": "Shaka Player is an open-source JavaScript library for adaptive media.", "website": "https://github.com/shaka-project/shaka-player" }, "Shanon": { "cats": [ 32 ], "scriptSrc": [ "\\.shanon-services\\.com" ], "description": "Shanon provides marketing automation software.", "website": "https://www.shanon.co.jp" }, "Shapecss": { "cats": [ 66 ], "js": [ "shapecss" ], "html": [ "\u003clink[^\u003e]* href=\"[^\"]*shapecss(?:\\.min)?\\.css" ], "scriptSrc": [ "/([\\d.]+)/shapecss(?:\\.min)?\\.js\\;version:\\1", "shapecss.*\\.js", "shapecss[-.]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "website": "https://shapecss.com" }, "ShareThis": { "cats": [ 5 ], "js": [ "__sharethis__docready", "sharethis" ], "scriptSrc": [ "\\.sharethis\\.com/" ], "description": "ShareThis provides free engagement and growth tools (e.g., share buttons, follow buttons, and reaction buttons) for site owners.", "website": "https://sharethis.com" }, "Shareaholic": { "cats": [ 5 ], "js": [ "shareaholic" ], "description": "Shareaholic is a all-in-one content amplification and monetisation platform.", "website": "https://www.shareaholic.com/" }, "Sharethrough": { "cats": [ 36 ], "scriptSrc": [ "\\.sharethrough\\.com/" ], "description": "Sharethrough is a software company that powers in-feed advertising for brands and publishers.", "website": "https://www.sharethrough.com" }, "Sharetribe": { "cats": [ 6 ], "scriptSrc": [ "\\.sharetribe\\.com/" ], "description": "Sharetribe is cloud-based platform for small to medium businesses, which helps businesses to create and manage custom online marketplaces.", "website": "https://www.sharetribe.com" }, "SharpSpring": { "cats": [ 32 ], "js": [ "sharpspring_tracking_installed" ], "scriptSrc": [ "\\.marketingautomation\\.services.+(?:ver=)([\\d.]+)\\;version:\\1" ], "description": "SharpSpring is a cloud-based marketing tool that offers customer relationship management, marketing automation, mobile and social marketing, sales team automation, customer service and more, all within one solution.", "website": "https://sharpspring.com" }, "SharpSpring Ads": { "cats": [ 77 ], "js": [ "_pa" ], "scriptSrc": [ "\\.perfectaudience\\.com" ], "description": "SharpSpring Ads is an all-in-one retargeting platform.", "website": "https://sharpspring.com/ads" }, "SheerID": { "cats": [ 19 ], "js": [ "sheerid", "sheerid" ], "headers": { "content-security-policy": "\\.sheerid\\.com", "content-security-policy-report-only": "\\.sheerid\\.com" }, "scripts": [ "\"sheeridendpoint\":" ], "description": "SheerID is a highly specialised solution offering online verification support for retailers, marketers and service providers.", "website": "https://www.sheerid.com/" }, "Shelf": { "cats": [ 33 ], "headers": { "server": "dart:io with shelf", "x-powered-by": "dart with package:shelf" }, "implies": [ "Dart" ], "description": "Shelf is a server framework for Dart.", "website": "https://pub.dev/packages/shelf" }, "ShellInABox": { "cats": [ 46 ], "js": [ "shellinabox" ], "html": [ "\u003ctitle\u003eshell in a box\u003c/title\u003e", "must be enabled for shellinabox\u003c/noscript\u003e" ], "description": "Shell In A Box implements a web server that can export arbitrary command line tools to a web based terminal emulator.", "website": "https://shellinabox.com" }, "Shift4Shop": { "cats": [ 1, 6 ], "cookies": { "3dvisit": "" }, "js": [ "_3d_cart.subtotal" ], "headers": { "x-powered-by": "3dcart" }, "scriptSrc": [ "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)" ], "description": "Shift4Shop, formerly known as 3Dcart, is an ecommerce software provider for online businesses.", "website": "https://www.shift4shop.com" }, "Shiny": { "cats": [ 18 ], "js": [ "shiny.addcustommessagehandler" ], "website": "https://shiny.rstudio.com" }, "ShinyStat": { "cats": [ 10 ], "js": [ "sssdk" ], "html": [ "\u003cimg[^\u003e]*\\s+src=['\"]?https?://www\\.shinystat\\.com/cgi-bin/shinystat\\.cgi\\?[^'\"\\s\u003e]*['\"\\s/\u003e]" ], "scriptSrc": [ "^https?://codice(?:business|ssl|pro|isp)?\\.shinystat\\.com/cgi-bin/getcod\\.cgi" ], "website": "https://shinystat.com" }, "ShipStation": { "cats": [ 99 ], "description": "ShipStation is a web-based shipping software designed to help ecommerce businesses streamline their shipping processes. It allows businesses to import, manage, and ship their orders from multiple sales channels, including marketplaces, shopping carts, and ecommerce platforms.", "website": "https://www.shipstation.com" }, "ShipTection": { "cats": [ 100 ], "scriptSrc": [ "app\\.shiptection\\.com/" ], "implies": [ "Shopify" ], "description": "ShipTection is the easiest way to offer shipping protection on your Shopify site.", "website": "https://wamapps.io/pages/shiptection-protection" }, "ShippyPro": { "cats": [ 102 ], "js": [ "shippyproreturnform" ], "description": "ShippyPro is the complete shipping software for ecommerce that helps worldwide merchants to ship, track, and manage returns for their orders.", "website": "https://www.shippypro.com" }, "Shoefitr.io": { "cats": [ 76 ], "description": "Shoefitr.io is data-based shoe size advice service where we measure the length, width, ball, and instep.", "website": "https://www.shoefitr.io" }, "Shogun Frontend": { "cats": [ 108 ], "description": "Shogun Frontend is an all-in-one ecommerce frontend platform. Shogun Frontend pairs with leading backends: Shopify, BigCommerce, Magento (Adobe Commerce), and more.", "website": "https://getshogun.com/frontend" }, "Shogun Landing Page Builder": { "cats": [ 100 ], "scriptSrc": [ "\\.getshogun\\.com/.+\\.myshopify\\.com" ], "implies": [ "Shogun Page Builder" ], "description": "Shogun Landing Page Builder is a drag and drop Shopify page builder for creating high-converting store pages.", "website": "https://apps.shopify.com/shogun" }, "Shogun Page Builder": { "cats": [ 51 ], "js": [ "shogunanalytics" ], "description": "Shogun is a page builder commonly used with headless implementations.", "website": "https://getshogun.com/page-builder" }, "Shop Pay": { "cats": [ 41 ], "js": [ "shopifypay.apihost" ], "scriptSrc": [ "cdn\\.shopify\\.com/shopifycloud/shopify_pay/" ], "description": "Shop Pay is an accelerated checkout that lets customers save their email address, credit card, and shipping and billing information so they can complete their transaction faster the next time they are directed to the Shopify checkout.", "website": "https://shop.app" }, "Shop Pay Installments": { "cats": [ 91 ], "implies": [ "Affirm", "Shop Pay" ], "description": "Shop Pay Installments allows customers to pay for orders between 50 USD and 3,000 USD in 4 interest-free installments.", "website": "https://shoppay.affirm.com" }, "ShopBase": { "cats": [ 6, 106 ], "js": [ "sbsdk.checkout.setenableabtestcustomer" ], "headers": { "content-security-policy": "(?:accounts|templates)\\.shopbase\\.com" }, "description": " ShopBase is a cross-border ecommerce platform for all Dropshipping/Print-on-Demand novices and experienced merchants.", "website": "https://www.shopbase.com" }, "ShopGold": { "cats": [ 6 ], "cookies": { "egold": "^\\w+$", "popup_shopgold": "", "popup_shopgold_time": "" }, "description": "ShopGold is an all-in-one payment processing and ecommerce solution.", "website": "https://www.shopgold.pl" }, "ShopPad Infinite Options": { "cats": [ 100 ], "js": [ "shoppad.apps.infiniteoptions" ], "implies": [ "Shopify" ], "description": "ShopPad Infinite Options allows you to create as many custom option fields for your product pages as you need.", "website": "https://apps.shopify.com/custom-options" }, "ShopWired": { "cats": [ 6 ], "scriptSrc": [ "\\.amazonaws\\.com/shopwired-theme-assets/" ], "description": "ShopWired is a UK based, fully hosted ecommerce platform that is focused on the UK market.", "website": "https://www.shopwired.co.uk" }, "Shopaholic": { "cats": [ 6 ], "cookies": { "shopaholic_cart_id": "" }, "js": [ "shopaholiccart" ], "description": "Shopaholic is an open-source ecosystem of plugins and themes for rapid ecommerce website development that allows building projects from small to large online shops.", "website": "https://shopaholic.one" }, "Shopapps": { "cats": [ 100 ], "js": [ "istockurl", "iwishurl" ], "scriptSrc": [ "cdn\\.myshopapps\\.com/" ], "implies": [ "Shopify" ], "description": "Shopapps is a trusted Shopify Expert providing services through Shopify Apps.", "website": "https://www.shopapps.in" }, "Shopatron": { "cats": [ 6 ], "js": [ "shpturl" ], "html": [ "\u003cbody class=\"shopatron", "\u003cimg[^\u003e]+mediacdn\\.shopatron\\.com\\;confidence:50" ], "scriptSrc": [ "mediacdn\\.shopatron\\.com" ], "meta": { "keywords": [ "shopatron" ] }, "website": "https://ecommerce.shopatron.com" }, "Shopcada": { "cats": [ 6 ], "js": [ "shopcada" ], "website": "https://shopcada.com" }, "Shoper": { "cats": [ 6 ], "js": [ "shoper" ], "website": "https://www.shoper.pl" }, "Shopery": { "cats": [ 6 ], "headers": { "x-shopery": "" }, "implies": [ "Elcodi", "PHP", "Symfony" ], "website": "https://shopery.com" }, "Shopfa": { "cats": [ 6 ], "js": [ "shopfa" ], "headers": { "x-powered-by": "^shopfa ([\\d.]+)$\\;version:\\1" }, "meta": { "generator": [ "^shopfa ([\\d.]+)$\\;version:\\1" ] }, "website": "https://shopfa.com" }, "ShopiMind": { "cats": [ 32 ], "js": [ "_spmq.id_cart", "_spmq.spm_ident" ], "description": "ShopiMind is a multi-channel marketing automation solution for all ecommerce activities.", "website": "https://www.shopimind.com" }, "Shopify": { "cats": [ 6 ], "cookies": { "_shopify_s": "", "_shopify_y": "" }, "js": [ "shopify", "shopify_api_base_url", "shopifyapi", "shopifycustomer" ], "headers": { "x-shopid": "\\;confidence:50", "x-shopify-stage": "" }, "scripts": [ "shopifytag" ], "scriptSrc": [ "cdn\\.shopify\\.com", "sdks\\.shopifycdn\\.com" ], "meta": { "shopify-checkout-api-token": [], "shopify-digital-wallet": [] }, "description": "Shopify is a subscription-based software that allows anyone to set up an online store and sell their products. Shopify store owners can also sell in physical locations using Shopify POS, a point-of-sale app and accompanying hardware.", "website": "https://shopify.com" }, "Shopify Buy Button": { "cats": [ 100 ], "js": [ "shopifybuy" ], "scriptSrc": [ "sdk\\. shopifycdn\\.com/buy-button/latest/" ], "description": "Shopify Buy Button is an app from Shopify which allows merchant to embed buy functionality for any product or collection into another website or blog.", "website": "https://apps.shopify.com/buy-button" }, "Shopify Chat": { "cats": [ 52, 100 ], "scriptSrc": [ "cdn\\.shopify\\.com/shopifycloud/shopify_chat/" ], "implies": [ "Shopify" ], "description": "Shopify Chat is Shopify's native live chat function that allows you to have real-time conversations with customers visiting your Shopify store.", "website": "https://www.shopify.com/inbox" }, "Shopify Consent Management": { "cats": [ 67, 100 ], "scriptSrc": [ "cookie_consent_shopify\\.js" ], "implies": [ "Shopify" ], "description": "Shopify Consent Management let's you create a tracking consent banner for EU customers.", "website": "https://apps.shopify.com/customer-privacy-banner" }, "Shopify Geolocation App": { "cats": [ 100, 79 ], "scriptSrc": [ "geolocation-recommendations\\.shopifycloud\\.com/" ], "implies": [ "Shopify" ], "description": "Shopify Geolocation App makes language and country recommendations to your customers based on their geographic location and browser or device language.", "website": "https://apps.shopify.com/geolocation" }, "Shopify Product Reviews": { "cats": [ 90, 100 ], "js": [ "spr" ], "scriptSrc": [ "productreviews\\.shopifycdn\\.com" ], "implies": [ "Shopify" ], "description": "Shopify Product reviews allows you to add a customer review feature to your products.", "website": "https://apps.shopify.com/product-reviews" }, "Shopistry": { "cats": [ 1 ], "description": "Shopistry is a data-driven, headless customer management system.", "website": "https://www.shopistry.com/" }, "Shoplazza": { "cats": [ 6 ], "cookies": { "shoplazza_source": "" }, "js": [ "shoplazza", "shoplazza" ], "description": "Shoplazza is a SaaS ecommerce platform.", "website": "https://www.shoplazza.com" }, "Shopline": { "cats": [ 6 ], "js": [ "shopline", "shoplytics" ], "description": "Shopline provides solutions for merchants to set up an online store.", "website": "https://shoplineapp.com/" }, "Shoplo": { "cats": [ 6 ], "js": [ "shoploajax" ], "scriptSrc": [ "cdn\\.shoplo\\.\\w+/" ], "description": "Shoplo is an all-in-one ecommerce platform.", "website": "https://www.shoplo.com" }, "Shopmatic": { "cats": [ 6 ], "meta": { "shopmatic-facebook-pixels-id": [] }, "description": "Shopmatic is an ecommerce website builder.", "website": "https://goshopmatic.com" }, "Shoporama": { "cats": [ 6 ], "meta": { "generator": [ "shoporama" ] }, "website": "https://www.shoporama.dk" }, "Shoppiko": { "cats": [ 6 ], "description": "Shoppiko is an ecommerce platform solution in India, which provides ecommerce website or ecommerce mobile application.", "website": "https://shoppiko.com" }, "ShoppingFeeder": { "cats": [ 19 ], "js": [ "sfdrorderdata", "sfdruniqid" ], "description": "ShoppingFeeder is a feed management solution for online retailers.", "website": "https://sfdr.co" }, "ShoppingGives": { "cats": [ 5 ], "js": [ "sgobservables.getcharities" ], "scriptSrc": [ "cdn\\.shoppinggives\\.com/" ], "description": "ShoppingGives is a B2B social ecommerce platform that allows companies of all sizes to make charitable donations through their customers' purchases.", "website": "https://shoppinggives.com" }, "Shoppub": { "cats": [ 6 ], "js": [ "shoppub.store" ], "meta": { "author": [ "^shoppub$" ] }, "description": "Shoppub is an ecommerce platform that focuses on implementing advanced business rules.", "website": "https://www.shoppub.com.br" }, "Shoppy": { "cats": [ 6 ], "js": [ "shoppy" ], "scriptSrc": [ "\\.shoppy\\.gg" ], "description": "Shoppy is an all-in-one payment processing and ecommerce solution.", "website": "https://shoppy.gg" }, "Shoprenter": { "cats": [ 6 ], "js": [ "shoprenter.customer" ], "scriptSrc": [ "\\.cdn\\.shoprenter\\.hu/" ], "description": "Shoprenter offers a platform for building and running an ecommerce store.", "website": "https://www.shoprenter.hu" }, "Shoprunner": { "cats": [ 107, 102 ], "js": [ "_shoprunner_com", "_shoprunner_com.version" ], "scriptSrc": [ "/shoprunner/shoprunner_init\\.js" ], "description": "ShopRunner is a service offering consumers free two-day shipping and returns on online orders placed with certain retailers.", "website": "https://www.shoprunner.com" }, "Shoptet": { "cats": [ 6 ], "js": [ "shoptet" ], "html": [ "\u003clink [^\u003e]*href=\"https?://cdn\\.myshoptet\\.com/" ], "scriptSrc": [ "^https?://cdn\\.myshoptet\\.com/" ], "meta": { "web_author": [ "^shoptet" ] }, "implies": [ "PHP" ], "description": "Shoptet is an ecommerce solutions from store builder, inventory management of online payments.", "website": "https://www.shoptet.cz" }, "Shopware": { "cats": [ 6 ], "js": [ "shopstudiogoogletagmanagercloudgtagcallback" ], "headers": { "sw-context-token": "^[\\w]{32}$\\;version:6", "sw-invalidation-states": "\\;version:6", "sw-language-id": "^[a-fa-f0-9]{32}$\\;version:6", "sw-version-id": "\\;version:6" }, "html": [ "\u003ctitle\u003eshopware ([\\d\\.]+) [^\u003c]+\\;version:\\1" ], "scriptSrc": [ "(?:(shopware)|/web/cache/[0-9]{10}_.+)\\.js\\;version:\\1?4:5", "/engine/shopware/", "/jquery\\.shopware\\.min\\.js" ], "meta": { "application-name": [ "shopware" ] }, "implies": [ "MySQL", "PHP", "Symfony", "jQuery" ], "description": "Shopware is an enterprise-level ecommerce platform.", "website": "https://www.shopware.com", "cpe": "cpe:2.3:a:shopware:shopware:*:*:*:*:*:*:*:*" }, "ShortPixel Image Optimizer": { "cats": [ 87, 92 ], "js": [ "sppictest" ], "description": "ShortPixel Image Optimizer is a lightweight WordPress plugin that can compress all of your site's images and PDF documents.", "website": "https://shortpixel.com" }, "Shortcodes Ultimate": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/shortcodes-ultimate/.+index\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Shortcodes Ultimate is a comprehensive collection of visual components for WordPress.", "website": "https://getshortcodes.com" }, "Shortly": { "cats": [ 100 ], "scriptSrc": [ "//shortly\\.shop/" ], "implies": [ "Shopify" ], "description": "Shortly help create short URLs for influencer-marketing, social media posts \u0026 email-marketing campaigns with your own store domain.", "website": "https://apps.shopify.com/shortly" }, "ShoutOut": { "cats": [ 71 ], "scriptSrc": [ "\\.shoutout\\.global/" ], "description": "ShoutOut is a multi-level marketing SaaS solution that allows tracking of affiliates.", "website": "https://www.shoutout.global" }, "Showit": { "cats": [ 51 ], "js": [ "showit.default.siteid" ], "scriptSrc": [ "lib\\.showit\\.co/engine/([\\d\\.]+)/\\;version:\\1" ], "description": "Showit is a drag-and-drop, no-code website builder for photographers and creative professionals.", "website": "https://showit.co" }, "Shuttle": { "cats": [ 1 ], "js": [ "shuttle.frontapp" ], "scriptSrc": [ "shuttle(?:-assets-new|-storage)\\.s3\\.amazonaws\\.com" ], "implies": [ "Amazon Web Services", "Laravel", "PHP" ], "description": "Shuttle is a website development platform.", "website": "https://www.devisto.com" }, "Sift": { "cats": [ 10, 16 ], "js": [ "__siftflashcb", "_sift" ], "scriptSrc": [ "cdn\\.sift(?:science)?\\.com/s\\.js" ], "description": "Sift is a CA-based fraud prevention company.", "website": "https://sift.com/" }, "Signal": { "cats": [ 32, 42 ], "js": [ "signaldata" ], "scriptSrc": [ "//s\\.btstatic\\.com/tag\\.js", "//s\\.thebrighttag\\.com/iframe\\?" ], "description": "Signal is a cross-platform encrypted messaging service.", "website": "https://www.signal.co/" }, "Signifyd": { "cats": [ 10, 16 ], "js": [ "signifyd_global" ], "scriptSrc": [ "\\.signifyd\\.com" ], "description": "Signifyd is a provider of an enterprise-grade fraud technology solution for ecommerce stores.", "website": "https://www.signifyd.com" }, "Silverstripe": { "cats": [ 1 ], "html": [ "powered by \u003ca href=\"[^\u003e]+silverstripe" ], "meta": { "generator": [ "^silverstripe" ] }, "implies": [ "PHP" ], "description": "Silverstripe CMS is a free and open source Content Management System and Framework for creating and maintaining websites and web applications.", "website": "https://www.silverstripe.org/" }, "Simbel": { "cats": [ 6 ], "headers": { "powered": "simbel" }, "website": "https://simbel.com.ar/" }, "Simon": { "cats": [ 97 ], "js": [ "simondata" ], "scriptSrc": [ "static\\.simonsignal\\.com" ], "description": "Simon is a customer data platform (CDP) that helps you collect, clean, and control your customer data.", "website": "https://www.simondata.com/" }, "Simpl": { "cats": [ 41, 91 ], "js": [ "simplsettings" ], "description": "Simpl is a fintech company that offers a cardless payment network with multiple solutions for merchants and consumers.", "website": "https://getsimpl.com" }, "Simple Analytics": { "cats": [ 10 ], "js": [ "sa_event" ], "scriptSrc": [ "simpleanalytics\\.com", "simpleanalytics\\.io", "simpleanalyticscdn\\.com" ], "description": "Simple Analytics is a privacy-friendly Google Analytics alternative.", "website": "https://simpleanalytics.com" }, "Simple Machines Forum": { "cats": [ 2 ], "js": [ "smf_avatarresize", "smf_default_theme_url", "smf_theme_url" ], "implies": [ "PHP" ], "description": "Simple Machines Forum is a free open-source software, used for community forums and is written in PHP.", "website": "https://www.simplemachines.org", "cpe": "cpe:2.3:a:simplemachines:simple_machine_forum:*:*:*:*:*:*:*:*" }, "SimpleHTTP": { "cats": [ 22 ], "headers": { "server": "simplehttp(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://example.com" }, "SimpleSAMLphp": { "cats": [ 69 ], "cookies": { "simplesaml": "", "simplesamlsessionid": "" }, "implies": [ "PHP" ], "description": "SimpleSAMLphp is an open-source PHP authentication application that provides support for SAML 2.0 as a Service Provider (SP) or Identity Provider (IdP).", "website": "https://simplesamlphp.org" }, "Simplero": { "cats": [ 32 ], "js": [ "simplero" ], "scriptSrc": [ "\\.simplero\\.com/" ], "description": "Simplero is an all-in-one marketing software.", "website": "https://simplero.com" }, "Simplero Websites": { "cats": [ 21 ], "cookies": { "_simplero_session_id": "" }, "implies": [ "Cart Functionality" ], "description": "Simplero Websites are a learning management system which suited for courses, coaching programs, memberships and digital products by Simplero.", "website": "https://simplero.com/websites" }, "Simpli.fi": { "cats": [ 36 ], "scriptSrc": [ "\\.simpli\\.fi" ], "description": "Simpli.fi is a programmatic advertising and agency management software.", "website": "https://simpli.fi/" }, "Simplio Upsells": { "cats": [ 100 ], "scriptSrc": [ "//upsell\\.simplio\\.app/" ], "implies": [ "Shopify" ], "description": "Simplio Upsells сreate more revenue with promotions and post purchase upsells.", "website": "https://apps.shopify.com/simple-promotions-and-upsells" }, "Simplo7": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.simplo7\\.\\w+/" ], "description": "Simplo7 is an all-in-one ecommerce product.", "website": "https://www.simplo7.com.br" }, "Simplébo": { "cats": [ 1 ], "headers": { "x-servedby": "simplebo" }, "website": "https://www.simplebo.fr" }, "Simvoly": { "cats": [ 51 ], "js": [ "simvoly" ], "description": "Simvoly is a drag-and-drop website builder for small and medium-sized businesses, agencies, and freelancers.", "website": "https://simvoly.com" }, "Sinatra": { "cats": [ 80 ], "js": [ "sinatra_vars.nonce", "sinatraslideup" ], "scriptSrc": [ "/wp-content/themes/sinatra/.+sinatra\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Sinatra is a lightweight and highly customizable multi-purpose WordPress theme.", "website": "https://try.sinatrawp.com" }, "Sirclo": { "cats": [ 6 ], "headers": { "x-powered-by": "sirclo" }, "scriptSrc": [ "template\\.sirclocdn\\.com/" ], "description": "Sirclo offers online business solutions.", "website": "https://sirclo.com/" }, "Sirdata": { "cats": [ 97, 67, 86 ], "js": [ "sddan.cmp", "sddan.cmploaded" ], "scriptSrc": [ "(?:choices|cache)\\.consentframework\\.com/", "js\\.sddan\\.com/" ], "description": "Sirdata is a self-service, third party data-collecting platform that specialises in the collection of behavioural data, predictive targeting and selling of audience segments.", "website": "https://www.sirdata.com" }, "Sirge": { "cats": [ 10, 100 ], "scriptSrc": [ "cdn\\.app\\.sirge\\.com/" ], "description": "Sirge is an analytics platform that tracks website visits, customer behavior, and provides insights to optimise return on ad spend (ROAS) and conversions.", "website": "https://www.sirge.com" }, "Sirvoy": { "cats": [ 72 ], "js": [ "sirvoybookingwidget" ], "description": "Sirvoy is a cloud-based hotel management software that streamlines various hotel operations, including reservation management, channel management, online booking, and property management.", "website": "https://sirvoy.com" }, "Site Kit": { "cats": [ 10, 87 ], "meta": { "generator": [ "^site kit by google ?([\\d.]+)?\\;version:\\1" ] }, "description": "Site Kit is a one-stop solution for WordPress users to use everything Google has to offer to make them successful on the web.", "website": "https://sitekit.withgoogle.com/" }, "Site Meter": { "cats": [ 10 ], "scriptSrc": [ "sitemeter\\.com/js/counter\\.js\\?site=" ], "website": "https://www.sitemeter.com" }, "Site Search 360": { "cats": [ 29 ], "js": [ "ss360config" ], "description": "Site Search 360 is a site search as a service solution.", "website": "https://www.sitesearch360.com/" }, "Site24x7": { "cats": [ 78 ], "js": [ "s247rum", "s247rumqueueimpl", "site24x7rum", "site24x7rumerror" ], "scriptSrc": [ "\\.site24x7rum\\.com" ], "description": "Site24x7 is a cloud-based website and server monitoring platform.", "website": "https://www.site24x7.com" }, "SiteEdit": { "cats": [ 1 ], "meta": { "generator": [ "siteedit" ] }, "website": "https://www.siteedit.ru" }, "SiteGround": { "cats": [ 62, 88 ], "headers": { "host-header": "192fc2e7e50945beb8231a492d6a8024|b7440e60b07ee7b8044761568fab26e8|624d5be7be38418a3e2a818cc8b7029b|6b7412fb82ca5edfd0917e3957f05d89" }, "description": "SiteGround is a web hosting service.", "website": "https://www.siteground.com" }, "SiteGuard WP Plugin": { "cats": [ 87, 16 ], "description": "SiteGurad WP Plugin is the plugin specialised for the protection against the attack to the management page and login.", "website": "https://www.jp-secure.com/siteguard_wp_plugin_en" }, "SiteJabber": { "cats": [ 90 ], "scriptSrc": [ "biz\\.sitejabber\\.com" ], "description": "Sitejabber is the leading destination for customer ratings and reviews of businesses. Consumers find ratings and read reviews to ensure they buy from the best companies.", "website": "https://www.sitejabber.com/" }, "SiteManager": { "cats": [ 1 ], "js": [ "sm_cookiesmodal", "sm_modal" ], "scriptSrc": [ "s\\d+\\.sitemn\\.gr/" ], "description": "SiteManager is a collaborative no-code/low-code web design platform for agencies and marketing teams.", "website": "https://www.sitemanager.io" }, "SiteMinder": { "cats": [ 5, 72 ], "scriptSrc": [ "widget\\.siteminder\\.com" ], "description": "SiteMinder is a appointment booking solution designed for hotels.", "website": "https://www.siteminder.com" }, "SiteOrigin Page Builder": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/siteorigin-panels/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Page Builder by SiteOrigin makes it easy to build responsive grid-based page content that adapts to mobile devices with pixel perfect accuracy.", "website": "https://siteorigin.com/page-builder" }, "SiteOrigin Vantage": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/vantage/" ], "description": "SiteOrigin Vantage is a response, multi-purpose theme carefully developed with seamless integration into an array of amazing third-party plugins.", "website": "https://siteorigin.com/theme/vantage" }, "SiteOrigin Widgets Bundle": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/so-widgets-bundle/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "SiteOrigin Widgets Bundle is a WordPress plugin that gives you all the elements you need to build modern, responsive, and engaging website pages.", "website": "https://siteorigin.com/widgets-bundle" }, "SitePad": { "cats": [ 57 ], "meta": { "generator": [ "^sitepad(?:\\s([\\d\\.]+))?$\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "SitePad is a WYSIWYG drag and drop website building and maintenance program.", "website": "https://sitepad.com" }, "SiteSpect": { "cats": [ 74 ], "js": [ "ss_dom_var" ], "scriptSrc": [ "/__ssobj/core\\.js" ], "description": "SiteSpect is the A/B testing and optimisation solution.", "website": "https://www.sitespect.com" }, "SiteVibes": { "cats": [ 10 ], "js": [ "sitevibesmanager" ], "scriptSrc": [ "app\\.sitevibes\\.com/" ], "description": "SiteVibes is a cloud-based user generated content and visual marketing platform.", "website": "https://sitevibes.com" }, "SiteW": { "cats": [ 51 ], "description": "SiteW is a French-based company that offers a website building service.", "website": "https://www.en.sitew.com" }, "Sitecore": { "cats": [ 1 ], "cookies": { "sc_analytics_global_cookie": "", "sc_expview": "", "sc_os_sessionid": "", "sxa_site": "" }, "js": [ "sitecoreutilities" ], "implies": [ "Microsoft ASP.NET" ], "description": "Sitecore provides web content management, and multichannel marketing automation software.", "website": "https://www.sitecore.com/", "cpe": "cpe:2.3:a:sitecore:*:*:*:*:*:*:*:*:*" }, "Sitecore Engagement Cloud": { "cats": [ 97 ], "scriptSrc": [ "/sitecore-engage-v\\.([\\d\\.]+)\\.min\\.js\\;version:\\1" ], "implies": [ "Sitecore" ], "description": "Sitecore Engagement Cloud is a cloud-based customer experience management platform offering content management, personalisation, marketing automation, analytics, and omni-channel delivery for enhancing digital marketing efforts and improving customer experiences.", "website": "https://www.sitecore.com/products/engagement-cloud" }, "Sitecore Experience Edge": { "cats": [ 23 ], "implies": [ "GraphQL", "Sitecore Experience Platform" ], "description": "Sitecore Experience Edge is a product that optimises content delivery by utilising edge computing and caching technologies to enhance website performance and user experience.", "website": "https://doc.sitecore.com/xp/en/developers/101/developer-tools/experience-edge-for-xm-apis.html" }, "Sitecore Experience Platform": { "cats": [ 1 ], "description": "Sitecore Experience Platform is a digital platform used by businesses to create, manage, and deliver personalised content and experiences to users across different channels.", "website": "https://www.sitecore.com/products/sitecore-experience-platform" }, "Siteglide": { "cats": [ 1, 53 ], "scriptSrc": [ "siteglide\\.js" ], "implies": [ "PlatformOS" ], "description": "SiteGlide is a Digital Experience Platform (DEP) for ecommerce stores, membership sites and customer portals.", "website": "https://www.siteglide.com" }, "Siteimprove": { "cats": [ 10 ], "js": [ "_sz.analytics.heatmap" ], "scriptSrc": [ "(?:\\.|//)siteimprove(?:analytics)?\\.com/js/siteanalyze" ], "description": "Siteimprove is a digital analytics and content QA platform.", "website": "https://www.siteimprove.com" }, "Sitepark IES": { "cats": [ 1 ], "meta": { "generator": [ "^sitepark\\sinformation\\senterprise\\sserver\\s-\\sies\\sgenerator\\sv([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "Lucene", "MySQL" ], "description": "Sitepark IES is a content management system written in PHP and paired with a MySQL database.", "website": "https://www.sitepark.com/oeffentlicher-sektor/produkte/cms-technologie.php", "cpe": "cpe:2.3:a:sitepark:information_enterprise_server:*:*:*:*:*:*:*:*" }, "Sitepark InfoSite": { "cats": [ 1 ], "meta": { "generator": [ "^infosite\\s([\\d\\.]+)\\s-\\ssitepark\\sinformation\\senterprise\\sserver$\\;version:\\1" ] }, "implies": [ "Sitepark IES" ], "description": "Sitepark InfoSite is a content management system and complete application of Sitepark IES which written in PHP and paired with a MySQL database.", "website": "https://www.sitepark.com/mittelstand/content-management-system/index.php" }, "Sitevision CMS": { "cats": [ 1 ], "cookies": { "sitevisionltm": "" }, "scriptSrc": [ "sitevision/system-resource/(?:[\\w\\d]+)/envision/envision\\.js\\;confidence:50", "sitevision/system-resource/(?:[\\w\\d]+)/js/appregistry\\.js\\;confidence:25", "sitevision/system-resource/(?:[\\w\\d]+)/js/docready-min\\.js\\;confidence:25", "sitevision/system-resource/(?:[\\w\\d]+)/webapps/webapp_sdk-min\\.js\\;confidence:50" ], "description": "Sitevision CMS is a platform for web publishing that consists of flexible and pre-made modules. Available as self-hosed software and Cloud SaaS.", "website": "https://www.sitevision.se" }, "Sivuviidakko": { "cats": [ 1 ], "meta": { "generator": [ "sivuviidakko" ] }, "website": "https://sivuviidakko.fi" }, "Sizebay": { "cats": [ 76 ], "js": [ "sizebay", "sizebayparams" ], "description": "Sizebay is a virtual fitting room that helps ecommerce and even brick-and-mortar stores provide their shoppers with a personalised shopping.", "website": "https://sizebay.com" }, "Sizmek": { "cats": [ 36 ], "html": [ "(?:\u003ca [^\u003e]*href=\"[^/]*//[^/]*serving-sys\\.com/|\u003cimg [^\u003e]*src=\"[^/]*//[^/]*serving-sys\\.com/)" ], "scriptSrc": [ "serving-sys\\.com/" ], "website": "https://sizmek.com" }, "Skai": { "cats": [ 10 ], "js": [ "ktag_constants" ], "scripts": [ "\\.xg4ken\\.com" ], "description": "Skai (formerly Kenshoo) is a marketing activation solution for brands and agencies.", "website": "https://skai.io" }, "Skedify": { "cats": [ 72 ], "js": [ "skedify.plugin.version" ], "scriptSrc": [ "plugin\\.skedify\\.io" ], "description": "Skedify is an appointment booking solution created for enterprises.", "website": "https://calendly.com/" }, "Skilldo": { "cats": [ 1 ], "headers": { "cms-name": "^skilldo$", "cms-version": "([\\d\\.]+)\\;version:\\1\\;confidence:0" }, "implies": [ "MySQL", "PHP" ], "description": "Skilldo is a content management system written in PHP and paired with a MySQL or MariaDB database.", "website": "https://developers.sikido.vn/docs/cms/" }, "Skilljar": { "cats": [ 21 ], "js": [ "skilljar_dashboard_globals", "skilljarcatalogpage", "skilljarthemeversionmajor", "skilljartranslate" ], "description": "Skilljar is a B2B customer training platform and learning management system.", "website": "https://www.skilljar.com/" }, "Skimlinks": { "cats": [ 71 ], "js": [ "__skim_js_global__", "addskimlinks", "skimlinksapi" ], "scriptSrc": [ "\\.skimresources\\.com" ], "description": "Skimlinks is a content monetization platform for online publishers.", "website": "https://skimlinks.com" }, "Skio": { "cats": [ 100 ], "scriptSrc": [ "cdn\\.skio\\.com/" ], "implies": [ "Shopify" ], "description": "Skio helps brands on Shopify sell subscriptions without ripping their hair out.", "website": "https://skio.com" }, "Skolengo": { "cats": [ 1, 21 ], "meta": { "generator": [ "skolengo" ], "version": [ "^([\\d\\.]+)$\\;version:\\1\\;confidence:0" ] }, "implies": [ "Apache Tomcat", "Java", "MariaDB" ], "description": "Skolengo is an Education Management Software developed by Kosmos Education.", "website": "https://www.skolengo.com" }, "Sky-Shop": { "cats": [ 6 ], "js": [ "l.continue_shopping" ], "meta": { "generator": [ "sky-shop" ] }, "implies": [ "Bootstrap", "PHP", "jQuery" ], "description": "Sky-Shop.pl is a platform for dropshipping an online sales on Allegro, eBay and Amazon.", "website": "https://sky-shop.pl" }, "SkyVerge": { "cats": [ 41 ], "js": [ "sv_wc_payment_gateway_payment_form_param" ], "scriptSrc": [ "sv-wc-payment-gateway-payment-form\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1" ], "implies": [ "WooCommerce" ], "description": "SkyVerge is a company which develop extension tools for WooCommerce stores.", "website": "https://www.skyverge.com" }, "Skyflow": { "cats": [ 16 ], "js": [ "skyflow.elementtype.card_number", "skyflow.validationruletype" ], "description": "Skyflow is a company that provides a secure data privacy platform and API.", "website": "https://www.skyflow.com" }, "Slate": { "cats": [ 53 ], "scriptSrc": [ "slate-technolutions-net\\.cdn\\.technolutions\\.net/" ], "description": "Slate is a CRM system designed specifically for higher education institutions, which helps them to manage student interactions, track admissions, and analyze student data in a flexible and user-friendly way.", "website": "https://technolutions.com" }, "Sleeknote": { "cats": [ 32 ], "js": [ "sleeknote.sleeknotes", "sleeknotemarketingconsent", "sleeknotescripttag", "sleeknotesitedata" ], "description": "Sleeknote is a cloud-based software that helps online businesses reach conversion goals through website popups.", "website": "https://sleeknote.com" }, "Sleekplan": { "cats": [ 13 ], "scriptSrc": [ "\\.sleekplan\\.com/" ], "description": "Sleekplan is a customer feedback and product management platform that enables businesses to collect, analyse, and act upon user feedback, prioritise feature requests, track bugs, and collaborate on product development.", "website": "https://sleekplan.com" }, "Slice": { "cats": [ 93 ], "description": "Slice is an online food ordering platform for independent pizzerias.", "website": "https://slicelife.com/owners" }, "Slick": { "cats": [ 59 ], "html": [ "\u003clink [^\u003e]+(?:/([\\d.]+)/)?slick-theme\\.css\\;version:\\1" ], "scriptSrc": [ "(?:/([\\d.]+))?/slick(?:\\.min)?\\.js\\;version:\\1" ], "implies": [ "jQuery" ], "website": "https://kenwheeler.github.io/slick" }, "SlickStack": { "cats": [ 47, 9 ], "headers": { "x-powered-by": "slickstack" }, "implies": [ "WordPress" ], "description": "SlickStack is a free LEMP stack automation script written in Bash designed to enhance and simplify WordPress provisioning, performance, and security.", "website": "https://slickstack.io" }, "Slider Captcha": { "cats": [ 16 ], "js": [ "slidercaptcha" ], "implies": [ "jQuery" ], "description": "Slider Captcha is a free service that helps protect websites from spam and abuse.", "website": "https://github.com/ArgoZhang/SliderCaptcha" }, "Slider Revolution": { "cats": [ 5, 7 ], "js": [ "revapi1", "revapi2", "revapi3", "revapi4", "revapi5", "revslider_showdoublejqueryerror", "rs_modules.main.version" ], "scriptSrc": [ "/wp-content/plugins/revslider/" ], "meta": { "generator": [ "powered\\sby\\sslider revolution\\s([\\d\\.]+)\\;version:\\1" ] }, "description": "Slider Revolution is a flexible and highly customisable slider.", "website": "https://www.sliderrevolution.com" }, "Slimbox": { "cats": [ 59 ], "html": [ "\u003clink [^\u003e]*href=\"[^/]*slimbox(?:-rtl)?\\.css" ], "scriptSrc": [ "slimbox\\.js" ], "implies": [ "MooTools" ], "website": "https://www.digitalia.be/software/slimbox" }, "Slimbox 2": { "cats": [ 59 ], "html": [ "\u003clink [^\u003e]*href=\"[^/]*slimbox2(?:-rtl)?\\.css" ], "scriptSrc": [ "slimbox2\\.js" ], "implies": [ "jQuery" ], "website": "https://www.digitalia.be/software/slimbox2" }, "Smart Ad Server": { "cats": [ 36 ], "js": [ "smartadserver" ], "scriptSrc": [ "\\.sascdn\\.com/" ], "description": "Smart Ad Server is an adserving and RTB platform.", "website": "https://smartadserver.com" }, "Smart Slider 3": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/smart-slider-3(?:-pro)?/" ], "description": "Smart Slider 3 is a responsive, SEO optimised WordPress plugin.", "website": "https://smartslider3.com" }, "SmartRecruiters": { "cats": [ 101 ], "scriptSrc": [ "\\.smartrecruiters\\.com/" ], "description": "SmartRecruiters is a web-based talent acquisition platform.", "website": "https://www.smartrecruiters.com" }, "SmartSite": { "cats": [ 1 ], "html": [ "\u003c[^\u003e]+/smartsite\\.(?:dws|shtml)\\?id=" ], "meta": { "author": [ "redacteur smartinstant" ] }, "website": "https://www.seneca.nl/pub/Smartsite/Smartsite-Smartsite-iXperion" }, "SmartWeb": { "cats": [ 6 ], "meta": { "generator": [ "^smartweb$" ] }, "description": "SmartWeb is an ecommerce platform from Denmark.", "website": "https://www.smartweb.dk" }, "Smarter Click": { "cats": [ 77 ], "js": [ "$smcinstall", "$smct5", "$smctdata" ], "scriptSrc": [ "\\.?smct\\.(?:io|co)/" ], "description": "Smarter Click is a marketing technology company.", "website": "https://smarterclick.com" }, "Smartling": { "cats": [ 89 ], "js": [ "populatesmartlingddl" ], "scriptSrc": [ "\\.smartling\\.com/" ], "description": "Smartling is a cloud-based translation management system.", "website": "https://www.smartling.com" }, "Smartlook": { "cats": [ 10 ], "js": [ "smartlook", "smartlook_key" ], "scriptSrc": [ "\\.smartlook\\.com/" ], "description": "Smartlook is a qualitative analytics solution for websites and mobile apps.", "website": "https://www.smartlook.com" }, "Smartstore": { "cats": [ 6 ], "cookies": { "smartstore.customer": "", "smartstore.visitor": "" }, "html": [ "\u003c!--powered by smart[ss]tore", "\u003cmeta property=\"sm:pagedata\"" ], "meta": { "generator": [ "^smart[ss]tore(.net)? (.+)$\\;version:\\2" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Smartstore is an open-source ecommerce system with CMS capabilities.", "website": "https://www.smartstore.com" }, "Smartstore Page Builder": { "cats": [ 1 ], "css": [ "\\.g-stage \\.g-stage-root" ], "html": [ "\u003csection[^\u003e]+class=\"g-stage" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://www.smartstore.com" }, "Smartstore biz": { "cats": [ 6 ], "scriptSrc": [ "smjslib\\.js" ], "website": "https://smartstore.com" }, "Smartsupp": { "cats": [ 52 ], "js": [ "$smartsupp.options.widgetversion", "smartsupp" ], "scriptSrc": [ "\\.smartsuppchat\\.com" ], "description": "Smartsupp is a live chat tool that offers visitor recording feature.", "website": "https://www.smartsupp.com" }, "Smash Balloon Instagram Feed": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/instagram-feed/" ], "description": "Instagram Feed displays Instagram posts from your Instagram accounts, either in the same single feed or in multiple different ones. Created by Smash Balloon.", "website": "https://smashballoon.com/instagram-feed" }, "Smile": { "cats": [ 84 ], "js": [ "smile.channel_key" ], "scriptSrc": [ "\\.(?:smile|sweettooth)\\.io/" ], "description": "Smile is a provider of ecommerce loyalty programs.", "website": "https://smile.io" }, "Smile App": { "cats": [ 100 ], "scriptSrc": [ "js\\.smile\\.io/.+smile-shopify\\.js" ], "implies": [ "Smile" ], "description": "Smile App offers a loyalty program for Shopify stores.", "website": "https://apps.shopify.com/smile-io" }, "SmtpJS": { "cats": [ 75 ], "scriptSrc": [ "/smtpjs\\.com/(?:v([\\d\\.]+)/)?smtp\\.js\\;version:\\1" ], "description": "SmtpJS is a free library you can use for sending emails from JavaScript.", "website": "https://smtpjs.com" }, "SmugMug": { "cats": [ 7 ], "js": [ "_smugsp" ], "headers": { "smug-cdn": "" }, "description": "SmugMug is a paid image sharing, image hosting service, and online video platform on which users can upload photos and videos.", "website": "https://www.smugmug.com" }, "Snap": { "cats": [ 18, 22 ], "headers": { "server": "snap/([.\\d]+)\\;version:\\1" }, "implies": [ "Haskell" ], "website": "https://snapframework.com" }, "Snap Pixel": { "cats": [ 36 ], "js": [ "__snappixel", "snaptr.pixelidlist" ], "scriptSrc": [ "intg\\.snapchat\\.com/" ], "description": "Snap Pixel is a piece of JavaScript code that helps advertisers measure the cross-device impact of campaigns.", "website": "https://businesshelp.snapchat.com/s/article/snap-pixel-about" }, "Snap.svg": { "cats": [ 59 ], "js": [ "snap.version" ], "scriptSrc": [ "snap\\.svg(?:-min)?\\.js" ], "website": "https://snapsvg.io" }, "SnapEngage": { "cats": [ 52 ], "js": [ "snapengage", "snapengage_mobile", "snapengagechat" ], "html": [ "\u003c!-- begin snapengage" ], "description": "SnapEngage is a live chat solution that caters to businesses across various industries.", "website": "https://snapengage.com/" }, "SnapWidget": { "cats": [ 5 ], "scriptSrc": [ "snapwidget\\.com/" ], "description": "SnapWidget is a set of interactive Instagram, Twitter and 500px widgets.", "website": "https://snapwidget.com" }, "Snipcart": { "cats": [ 6 ], "cookies": { "snipcart-cart": "" }, "scriptSrc": [ "https://cdn\\.snipcart\\.com/themes/v([\\w.]+)/default/snipcart\\.js\\;version:\\1" ], "description": "Snipcart is a shopping cart platform that can be integrated into any website with simple HTML and JavaScript.", "website": "https://snipcart.com" }, "SniperFast": { "cats": [ 29 ], "js": [ "sniper_search_key", "sniperenablesearch", "sniperfast_page_id" ], "scriptSrc": [ "\\.sniperfast\\.com" ], "description": "SniperFast is instant search system for ecommerce sites.", "website": "https://www.sniperfast.com" }, "Sniply": { "cats": [ 96 ], "js": [ "sniply.create_sniply_bar" ], "scriptSrc": [ "gosniply\\.com/" ], "description": "Sniply is a special URL shortener that allows to add a call-to-action to any landing page.", "website": "https://sniply.io" }, "Snoobi": { "cats": [ 10 ], "js": [ "snoobi" ], "scriptSrc": [ "snoobi\\.com/snoop\\.php" ], "website": "https://www.snoobi.com" }, "Snowplow Analytics": { "cats": [ 10, 63 ], "cookies": { "_sp_id": "", "sp": "\\;confidence:50" }, "js": [ "globalsnowplownamespace", "snowplow" ], "scriptSrc": [ "cdn\\.jsdelivr\\.net/gh/snowplow/sp-js-assets@(?:.+)/sp\\.js", "cdn\\.jsdelivr\\.net/npm/@snowplow/javascript-tracker@(?:.+)/dist/sp\\.js", "cdnjs\\.cloudflare\\.com/ajax/libs/snowplow/(?:.+)/sp.*\\.js", "d1fc8wv8zag5ca\\.cloudfront\\.net/.+/sp\\.js", "sp\\.js\\;confidence:50", "unpkg.com/@snowplow/javascript-tracker@(?:.+)/dist/sp.*\\.js" ], "description": "Snowplow is an open-source behavioral data management platform for businesses.", "website": "https://snowplowanalytics.com" }, "SobiPro": { "cats": [ 19 ], "js": [ "sobiprourl" ], "implies": [ "Joomla" ], "website": "https://sigsiu.net/sobipro.html" }, "Social9": { "cats": [ 5 ], "scriptSrc": [ "social9\\.com/.+\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1" ], "description": "Social9 is a social sharing widgets and plugins.", "website": "https://social9.com" }, "SocialJuice": { "cats": [ 90, 5 ], "description": "SocialJuice is a simple tool to collect video testimonials or textual testimonials from your clients.", "website": "https://socialjuice.io" }, "SocialLadder": { "cats": [ 32 ], "scriptSrc": [ "socialladder\\.rkiapps\\.com/" ], "description": "SocialLadder is a complete end-to-end creator management solution for brands looking to maximize and scale their brand ambassador, influencer, and affiliate marketing efforts.", "website": "https://socialladderapp.com" }, "Societe des Avis Garantis": { "cats": [ 87, 90 ], "scriptSrc": [ "/wp-content/plugins/ag-core/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Societe des Avis Garantis is a French company that provides customer review and rating services for businesses through its online platform.", "website": "https://www.societe-des-avis-garantis.fr" }, "Socket.io": { "cats": [ 12 ], "js": [ "io.socket", "io.version" ], "scriptSrc": [ "socket\\.io.*\\.js" ], "implies": [ "Node.js" ], "website": "https://socket.io" }, "SoftTr": { "cats": [ 6 ], "meta": { "author": [ "softtr e-ticaret sitesi yazılımı" ] }, "website": "https://www.softtr.com" }, "Softr": { "cats": [ 51 ], "description": "Softr is a tool designed to help users build custom websites, web apps, clients portals, or internal tools using Airtable or Google Sheets data.", "website": "https://www.softr.io" }, "Soisy": { "cats": [ 91 ], "scriptSrc": [ "cdn\\.soisy\\.it/" ], "description": "Soisy is a buy now, pay later solution provider.", "website": "https://www.soisy.it" }, "SolidJS": { "cats": [ 12 ], "js": [ "solid$$" ], "description": "SolidJS is a purely reactive library. It was designed from the ground up with a reactive core. It's influenced by reactive principles developed by previous libraries.", "website": "https://www.solidjs.com/" }, "SolidPixels": { "cats": [ 1, 6, 4 ], "scriptSrc": [ "^https?://cdn\\.solidpixels\\.net/" ], "meta": { "web_author": [ "^solidpixels" ] }, "implies": [ "React" ], "description": "Solidpixels is platform to build websites.", "website": "https://www.solidpixels.net" }, "SolidStart": { "cats": [ 18, 22 ], "js": [ "_$hy.init" ], "implies": [ "SolidJS" ], "description": "SolidStart is the Solid app framework.", "website": "https://start.solidjs.com" }, "Solodev": { "cats": [ 1 ], "headers": { "solodev_session": "" }, "html": [ "\u003cdiv class=[\"']dynamicdiv[\"'] id=[\"']dd\\.\\d\\.\\d(?:\\.\\d)?[\"']\u003e" ], "implies": [ "PHP" ], "website": "https://www.solodev.com" }, "Solr": { "cats": [ 34 ], "implies": [ "Lucene" ], "description": "Solr is an open-source enterprise-search platform, written in Java.", "website": "https://lucene.apache.org/solr/", "cpe": "cpe:2.3:a:apache:solr:*:*:*:*:*:*:*:*" }, "Solusquare OmniCommerce Cloud": { "cats": [ 6 ], "cookies": { "_solusquare": "" }, "meta": { "generator": [ "^solusquare$" ] }, "implies": [ "Adobe ColdFusion" ], "website": "https://www.solusquare.com" }, "Solve Media": { "cats": [ 16, 36 ], "js": [ "_acpuzzle", "_adcopy-puzzle-image-image", "acpuzzle", "adcopy-puzzle-image-image" ], "scriptSrc": [ "^https?://api\\.solvemedia\\.com/" ], "website": "https://solvemedia.com" }, "Solvemate": { "cats": [ 52 ], "js": [ "solvemate.config.solvematecdn", "solvematecli", "solvemateconfig" ], "description": "Solvemate is a customer service automation platform that enables brands to deliver quality customer service through meaningful conversations via chatbots.", "website": "https://www.solvemate.com" }, "Solvvy": { "cats": [ 52 ], "js": [ "solvvy" ], "scriptSrc": [ "cdn\\.solvvy\\.com/" ], "description": "Solvvy provides live chat and chatbot services.", "website": "https://solvvy.com/" }, "SonarQubes": { "cats": [ 47 ], "js": [ "sonarmeasures", "sonarrequest" ], "html": [ "\u003clink href=\"/css/sonar\\.css\\?v=([\\d.]+)\\;version:\\1", "\u003ctitle\u003esonarqube\u003c/title\u003e" ], "scriptSrc": [ "^/js/bundles/sonar\\.js?v=([\\d.]+)$\\;version:\\1" ], "meta": { "application-name": [ "^sonarqubes$" ] }, "implies": [ "Java" ], "description": "SonarQube is an open-source platform for the continuous inspection of code quality to perform automatic reviews with static analysis of code to detect bugs, code smells, and security vulnerabilities on 20+ programming languages.", "website": "https://www.sonarqube.org/" }, "Sonobi": { "cats": [ 36 ], "description": "Sonobi is an ad technology developer that designs advertising tools and solutions for the media publishers, brand advertisers and media agencies.", "website": "https://sonobi.com" }, "Sortable": { "cats": [ 36 ], "js": [ "deployads" ], "scriptSrc": [ "\\.deployads\\.com/" ], "description": "Sortable is a broad-spectrum platform that helps publishers unify demand partners, data, and tools.", "website": "https://sortable.com" }, "Sorted Return": { "cats": [ 102 ], "js": [ "clicksit_window_on_load" ], "scriptSrc": [ "return\\.clicksit\\.com/" ], "description": "Sorted is a global SaaS company that provides data-driven software for checkouts, warehouses, and shipping.", "website": "https://sorted.com/give-your-customers-a-5-returns-experience/" }, "SoteShop": { "cats": [ 6 ], "cookies": { "soteshop": "^\\w+$" }, "implies": [ "PHP" ], "description": "SoteShop is an e-shop management software.", "website": "https://www.soteshop.com/" }, "Sotel": { "cats": [ 1 ], "meta": { "generator": [ "sotel" ] }, "website": "https://www.soteledu.com/en/" }, "Sotoon": { "cats": [ 31 ], "headers": { "server": "^sotoon$" }, "description": "Sotoon is a CDN provider serving users specially in the MENA region.", "website": "https://sotoon.ir" }, "SoundCloud": { "cats": [ 5 ], "js": [ "sc.widget.events.play" ], "scriptSrc": [ "\\.sndcdn\\.com/" ], "description": "SoundCloud widget gives you the ability to upload, manage and share tracks.", "website": "https://developers.soundcloud.com/docs/api/html5-widget" }, "SoundManager": { "cats": [ 59 ], "js": [ "baconplayer", "soundmanager", "soundmanager.version" ], "website": "https://www.schillmania.com/projects/soundmanager2" }, "Sourcepoint": { "cats": [ 67 ], "cookies": { "_sp_enable_dfp_personalized_ads": "" }, "js": [ "tealium_sourcepoint" ], "scripts": [ "sourcepoint_mms_domain" ], "description": "Sourcepoint is the data privacy software company for the digital marketing ecosystem.", "website": "https://sourcepoint.com" }, "Sovrn": { "cats": [ 36 ], "js": [ "sovrn", "sovrn_render" ], "scriptSrc": [ "\\.(?:linksmart|lijit)\\.com/" ], "description": "Sovrn is a advertising products and services provider for publishers.", "website": "https://www.sovrn.com" }, "Sovrn//Commerce": { "cats": [ 71 ], "js": [ "vglnk", "vl_cb", "vl_disable" ], "scriptSrc": [ "(?:^[^/]*//[^/]*viglink\\.com/api/|vglnk\\.js)" ], "description": "Sovrn//Commerce is a content monetization tool for publishers.", "website": "https://www.sovrn.com/publishers/commerce/" }, "SparkPost": { "cats": [ 75 ], "description": "SparkPost is an email infrastructure provider.", "website": "https://www.sparkpost.com/" }, "Spatie Laravel Cookie Consent": { "cats": [ 67 ], "js": [ "laravelcookieconsent" ], "implies": [ "Laravel" ], "description": "Spatie Laravel Cookie Consent is a banner that is displayed on websites to ask visitors for consent for the use of cookies.", "website": "https://github.com/spatie/laravel-cookie-consent" }, "Spatie Media Library Pro": { "cats": [ 66 ], "scripts": [ "media\\-library\\-pro\\-core" ], "implies": [ "Laravel" ], "description": "Spatie Media Library Pro is a set of customizable UI components for Spatie Media Library.", "website": "https://medialibrary.pro" }, "Spatie Support Bubble": { "cats": [ 52 ], "implies": [ "Laravel", "Tailwind CSS" ], "description": "Spatie Support Bubble is a non-intrusive support form.", "website": "https://github.com/spatie/laravel-support-bubble" }, "Spectra": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/ultimate-addons-for-gutenberg/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Gutenberg" ], "description": "Spectra is a WordPress plugin that provides a collection of new and enhanced blocks for the Gutenberg editor.", "website": "https://wpspectra.com" }, "Speed Kit": { "cats": [ 92 ], "js": [ "speedkit" ], "description": "Speed Kit develops a performance add-on that uses caching algorithms to minimize loading times of ecommerce websites.", "website": "https://www.speedkit.com" }, "SpeedCurve": { "cats": [ 78 ], "js": [ "lux.version", "lux_t_end", "lux_t_start" ], "scriptSrc": [ "\\.speedcurve\\.com" ], "description": "SpeedCurve is a front-end performance monitoring service.", "website": "https://www.speedcurve.com" }, "SpeedSize": { "cats": [ 92 ], "scripts": [ "data-speedsize-(?:srcset|src|params)?" ], "scriptSrc": [ "/speedsize(?:-sw)?\\.js\\;confidence:90", "\\.speedsize\\.com/" ], "description": "SpeedSize is an AI-based media-compression technology that can auto-detect and compress all of a website's images and videos down to 99% of their original size without lowering the image quality.", "website": "https://speedsize.com" }, "Speedimize": { "cats": [ 92 ], "scriptSrc": [ "cdn\\.shopify\\.com/.+/assets/speedimize\\.js" ], "description": "Speedimize is a Shopify agency that focuses on website speed optimisation and performance issues.", "website": "https://speedimize.io" }, "Sphinx": { "cats": [ 4 ], "js": [ "documentation_options" ], "html": [ "created using \u003ca href=\"https?://(?:www\\.)?sphinx-doc\\.org/\"\u003esphinx\u003c/a\u003e ([0-9.]+)\\.\\;version:\\1" ], "description": "Sphinx is a tool that makes it easy to create documentation.", "website": "https://www.sphinx-doc.org/" }, "SpiceThemes SpicePress": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/spicepress(?:-pro)?/" ], "description": "SpicePress is a responsive and fully customizable business template by SpiceThemes.", "website": "https://spicethemes.com/spicepress-wordpress-theme" }, "Spin-a-Sale": { "cats": [ 100, 5 ], "scriptSrc": [ "client\\.spinasale\\.com/" ], "description": "Spin-a-Sale adds the intensity of gamification to your site. Spin-a-Sale overlay displays a special prize wheel for visitors that you can fully configure.", "website": "https://spinasale.com" }, "Spinnakr": { "cats": [ 10 ], "js": [ "_spinnakr_site_id" ], "description": "Spinnakr is a startup with a platform designed to personalise messages on blogs and websites.", "website": "https://www.spinnakr.com" }, "SpiritShop": { "cats": [ 6 ], "cookies": { "spiritshop_id": "" }, "implies": [ "MySQL", "PHP" ], "description": "SpiritShop is an ecommerce plataform.", "website": "https://spiritshop.com.br" }, "Splide": { "cats": [ 59 ], "js": [ "splide.name", "splide.states" ], "description": "Splide.js is a lightweight, responsive, and customizable slider and carousel library for JavaScript.", "website": "https://splidejs.com" }, "Split": { "cats": [ 85, 74 ], "js": [ "split_shopper_client", "split_visitor_client", "splitio", "splitio_api_key" ], "scriptSrc": [ "\\.split\\.io/(?:sdk/split-([\\d\\.]+)\\.min\\.js)?\\;version:\\1" ], "description": "Split is a feature delivery platform that powers feature flag management, software experimentation, and continuous delivery.", "website": "https://www.split.io" }, "SplitIt": { "cats": [ 41, 91 ], "js": [ "splitit", "wc_ga_pro.available_gateways.splitit" ], "scriptSrc": [ "\\.production\\.splitit\\.com/" ], "description": "SplitIt is a payment solution that divides a purchase into smaller monthly installments.", "website": "https://www.splitit.com" }, "Splitbee": { "cats": [ 10 ], "js": [ "splitbee" ], "scriptSrc": [ "^https://cdn\\.splitbee\\.io/sb\\.js" ], "website": "https://splitbee.io" }, "SplittyPay": { "cats": [ 91 ], "description": "SplittyPay is an alternative payment platform designed for group reservations and purchases.", "website": "https://www.splittypay.com" }, "Splunk RUM": { "cats": [ 78 ], "js": [ "plumbr._core.selfurl", "plumbr._core.version" ], "scriptSrc": [ "browser\\.plumbr\\.io/pa(?:-early)?\\.js" ], "description": "Splunk RUM is a real-time, front-end user monitoring and troubleshooting.", "website": "https://www.splunk.com/en_us/observability/real-user-monitoring.html" }, "Splunkd": { "cats": [ 19 ], "headers": { "server": "splunkd" }, "description": "Splunkd is the system process that handles indexing, searching, forwarding.", "website": "https://splunk.com" }, "SpotHopper": { "cats": [ 51, 32, 75 ], "js": [ "spothopper" ], "scriptSrc": [ "static\\.spotapps\\.co/" ], "description": "SpotHopper is an all-in-one marketing and online revenue platform for restaurants.", "website": "https://www.spothopperapp.com" }, "SpotX": { "cats": [ 36 ], "js": [ "spotx.version" ], "scriptSrc": [ "js\\.spotx\\.tv" ], "description": "SpotX is a video advertising platform.", "website": "https://www.spotx.tv" }, "Spotify Web API": { "cats": [ 19 ], "js": [ "getspotifydata", "spotify_tracks", "spotifyme" ], "description": "Spotify Web API endpoints return JSON metadata about music artists, albums, and tracks, directly from the Spotify Data Catalogue.", "website": "https://developer.spotify.com/documentation/web-api" }, "Spotify Widgets": { "cats": [ 5 ], "description": "Spotify Widgets provide an embeddable view of a track, artist, album, user, playlist, podcast or episode for use within your web project.", "website": "https://developer.spotify.com/documentation/widgets" }, "Spotii": { "cats": [ 41, 91 ], "js": [ "spotiiconfig" ], "scriptSrc": [ "widget\\.spotii\\.me" ], "description": "Spotii is a tech-enabled payments platform where anyone can Shop Now and Pay Later with absolutely zero interest or cost.", "website": "https://www.spotii.com/" }, "Spree": { "cats": [ 6 ], "html": [ "(?:\u003clink[^\u003e]*/assets/store/all-[a-z\\d]{32}\\.css[^\u003e]+\u003e|\u003cscript\u003e\\s*spree\\.(?:routes|translations|api_key))" ], "implies": [ "Ruby on Rails" ], "website": "https://spreecommerce.org" }, "Sprig": { "cats": [ 73, 10 ], "js": [ "userleap" ], "scriptSrc": [ "cdn\\.userleap\\.com/" ], "description": "Sprig is a UX analysis and management tool to understand what motivates customers to sign up, engage, and remain loyal to products.", "website": "https://sprig.com" }, "Sprig plugin": { "cats": [ 19 ], "description": "Sprig is a free plugin for Craft CMS that allows you to create reactive components from Twig templates ​or PHP classes.", "website": "https://putyourlightson.com/plugins/sprig" }, "Spring": { "cats": [ 18 ], "headers": { "x-application-context": "" }, "implies": [ "Java" ], "website": "https://spring.io/" }, "Spring for creators": { "cats": [ 6 ], "js": [ "webpackjsonpteespring-custom-storefront" ], "scriptSrc": [ "\\.creator-spring\\.com/" ], "description": "Spring for creators (formerly Teespring) is a creator-centric social ecommerce platform.", "website": "https://www.spri.ng" }, "SprintHub": { "cats": [ 32 ], "js": [ "sprinthub", "sprinthubloaded" ], "scriptSrc": [ "\\.sprinthub\\.io/" ], "description": "SprintHub is an all-in-one marketing platform.", "website": "https://lp.sprinthub.com" }, "SpriteSpin": { "cats": [ 59 ], "js": [ "spritespin" ], "description": "SpriteSpin is a JavaScript plugin that enables users to create 360-degree image spin animations on their websites.", "website": "https://github.com/giniedp/spritespin" }, "Spryker": { "cats": [ 6, 62 ], "js": [ "spryker.config" ], "meta": { "generator": [ "spryker" ] }, "description": "Spryker is a ecommerce technology platform that enables global enterprises to build transactional business models.", "website": "https://www.spryker.com" }, "SpurIT": { "cats": [ 5 ], "js": [ "spurit.global.version" ], "scriptSrc": [ "cdn-spurit\\.com/shopify-apps/" ], "implies": [ "Shopify" ], "description": "SpurIT is a team of certified Shopify experts which provide ecommerce software solutions.", "website": "https://spur-i-t.com" }, "SpurIT Abandoned Cart Reminder": { "cats": [ 98, 100 ], "js": [ "acr_spurit_params.foldercss" ], "scriptSrc": [ "cdn-spurit\\.com/shopify-apps/abandoned-cart-reminder/" ], "implies": [ "Shopify" ], "description": "SpurIT Abandoned Cart Reminder bring back your Shopify store visitors who moved to another tab by blinking your store tab.", "website": "https://spur-i-t.com/shopify-apps/abandoned-cart-reminder/" }, "SpurIT Loyalty App": { "cats": [ 84, 94, 100 ], "js": [ "spurit.loyaltypoints" ], "scriptSrc": [ "cdn-spurit\\.com/shopify-apps/loyaltypoints/" ], "implies": [ "Shopify" ], "description": "SpurIT Loyalty App is a turnkey solution allowing you to reward existing customers in a number of ways.", "website": "https://spur-i-t.com/shopify-apps/loyalty-points-manager" }, "SpurIT Partial Payments App": { "cats": [ 41, 100 ], "scriptSrc": [ "cdn-spurit\\.com/shopify-apps/split-payments/" ], "implies": [ "Shopify" ], "description": "SpurIT Partial Payments App allow your customers to pay for the order in several ways or to share a payment with other people.", "website": "https://spur-i-t.com/shopify-apps/split-partial-payments/" }, "SpurIT Recurring Payments App": { "cats": [ 41, 100 ], "js": [ "spurit.recurringinvoices" ], "scriptSrc": [ "cdn-spurit\\.com/shopify-apps/recurring-invoices/" ], "implies": [ "Shopify" ], "description": "SpurIT Recurring Payments App is a simple way to create a system of bill payment,subscriptions and invoicing.", "website": "https://spur-i-t.com/shopify-apps/recurring-order-subscription" }, "Sqreen": { "cats": [ 16, 19 ], "headers": { "x-protected-by": "^sqreen$" }, "description": "Sqreen is the application security platform for the modern enterprise. Acquired by Datadog in Apr 2021.", "website": "https://sqreen.io" }, "Squadata": { "cats": [ 77 ], "scriptSrc": [ "//asset\\.easydmp\\.net/" ], "description": "Squadata provides data based marketing and advertising solutions including email retargeting, CRM onboarding, data monetisation, data management platform.", "website": "https://www.squadata.net" }, "Squadded": { "cats": [ 5 ], "scriptSrc": [ "static\\.squadded\\.co" ], "implies": [ "Cart Functionality" ], "description": "Squadded is a social ecommerce solution that allows visitors to shop together with their friends and with other members of the brands online community.", "website": "https://www.squadded.co" }, "Square": { "cats": [ 41 ], "js": [ "__bootstrap_state__.storeinfo.square_application_id", "sqpaymentform", "square.analytics" ], "scriptSrc": [ "js\\.squareup\\.com" ], "description": "Square is a mobile payment company that offers business software, payment hardware products and small business services.", "website": "https://squareup.com/" }, "Square Online": { "cats": [ 6 ], "js": [ "app_origin" ], "implies": [ "Weebly" ], "description": "Square Online is a subscription based service that provides ecommerce solutions to small and medium sized businesses.", "website": "https://squareup.com/us/en/online-store" }, "Squarespace": { "cats": [ 1 ], "js": [ "squarespace", "static.squarespace_context.templateversion" ], "headers": { "server": "squarespace" }, "description": "Squarespace provides Software-as-a-Service (SaaS) for website building and hosting, and allows users to use pre-built website templates.", "website": "https://www.squarespace.com" }, "Squarespace Commerce": { "cats": [ 6 ], "js": [ "squarespace_rollups.squarespace-commerce", "static.squarespace_context.templateversion" ], "headers": { "server": "squarespace" }, "scriptSrc": [ "assets\\.squarespace\\.\\w+/universal/scripts-compressed/commerce-\\w+-min\\.[\\w+\\-]+\\.js" ], "implies": [ "Squarespace" ], "description": "Squarespace Commerce is an ecommerce platform designed to facilitate the creation of websites and online stores, with domain registration and web hosting included.", "website": "https://www.squarespace.com/ecommerce-website" }, "Squeezely": { "cats": [ 97 ], "js": [ "sqzlcommon.getvariantname", "sqzlpersonalization" ], "scriptSrc": [ "//squeezely\\.tech/" ], "description": "Squeezely is a customer data platform (CDP) that provides technical capabilities for data collection, segmentation, audience targeting, campaign orchestration, and analytics, empowering businesses to personalise customer experiences and optimise marketing efforts.", "website": "https://www.squeezely.tech" }, "SquirrelMail": { "cats": [ 30 ], "js": [ "squirrelmail_loginpage_onload" ], "html": [ "\u003csmall\u003esquirrelmail version ([.\\d]+)[^\u003c]*\u003cbr \\;version:\\1" ], "implies": [ "PHP" ], "description": "SquirrelMail is an open-source web-mail package that is based on PHP language. It provides a web-based-email client and a proxy server for IMAP protocol.", "website": "https://squirrelmail.org", "cpe": "cpe:2.3:a:squirrelmail:squirrelmail:*:*:*:*:*:*:*:*" }, "Squiz Matrix": { "cats": [ 1 ], "headers": { "x-powered-by": "squiz matrix" }, "html": [ "\u003c!--\\s+running (?:mysource|squiz) matrix" ], "scriptSrc": [ "/__data/assets/(js_file_folder|git_bridge|js_file)/" ], "meta": { "generator": [ "squiz matrix" ] }, "implies": [ "PHP" ], "description": "A flexible, low-code enterprise content management system designed to manage multiple sites with many editors.", "website": "https://www.squiz.net/matrix", "cpe": "cpe:2.3:a:squiz:matrix:*:*:*:*:*:*:*:*" }, "Stack Analytix": { "cats": [ 10 ], "js": [ "stackanalysis" ], "scriptSrc": [ "api\\.stackanalytix\\.com" ], "description": "Stack Analytix offers heatmaps, session recording, conversion analysis and user engagement tools.", "website": "https://www.stackanalytix.com" }, "StackCommerce": { "cats": [ 6 ], "js": [ "stacksonar" ], "description": "StackCommerce is a product discovery platform.", "website": "https://www.stackcommerce.com/" }, "StackPath": { "cats": [ 31 ], "headers": { "x-backend-server": "hosting\\.stackcp\\.net$", "x-provided-by": "^stackcdn(?: ([\\d.]+))?\\;version:\\1" }, "description": "StackPath is a cloud computing and services provider.", "website": "https://www.stackpath.com" }, "Stackable": { "cats": [ 87, 51 ], "js": [ "stackable.resturl", "stackableanimations" ], "implies": [ "Gutenberg" ], "description": "Stackable is a plugin for WordPress that offers a collection of blocks, templates, and other design tools to help users create custom, professional-looking websites.", "website": "https://wpstackable.com" }, "Stackbit": { "cats": [ 51 ], "js": [ "__next_data__.props.pageprops.withstackbit" ], "scriptSrc": [ "\\.stackbit\\.com" ], "description": "Stackbit is a visual experience platform for building decoupled websites.", "website": "https://www.stackbit.com" }, "StackerHQ": { "cats": [ 51 ], "js": [ "stacker.install_feature" ], "description": "StackerHQ is a tool in the low code platforms and application builders categories.", "website": "https://www.stackerhq.com" }, "Stackify": { "cats": [ 13, 78 ], "scriptSrc": [ "\\.stackify\\.com/" ], "description": "Stackify offers the only solution that fully integrates application performance monitoring with errors and logs.", "website": "https://stackify.com" }, "Stage Try": { "cats": [ 91 ], "js": [ "stage_cart_change_events", "stage_cart_total_price" ], "scriptSrc": [ "\\.stagetry\\.io/" ], "description": "Stage Try is an end-to-end ecommerce platform amplifying AOV and conversions of online stores.", "website": "https://stagetry.com" }, "Stamped": { "cats": [ 90 ], "js": [ "stampedfn" ], "scriptSrc": [ "\\.stamped\\.io/" ], "description": "Stamped is a provider of reviews and ratings solution.", "website": "https://stamped.io/" }, "Starhost": { "cats": [ 51, 62 ], "headers": { "cache-control": "starhost", "x-starhost": "" }, "description": "Starhost provides a Platform-as-a-Service (PaaS) for website building, web hosting, and domain registration.", "website": "https://starhost.verbosec.com" }, "Starlet": { "cats": [ 22 ], "headers": { "server": "^plack::handler::starlet" }, "implies": [ "Perl" ], "website": "https://metacpan.org/pod/Starlet" }, "Statamic": { "cats": [ 1 ], "js": [ "statamic" ], "headers": { "x-powered-by": "^statamic$" }, "implies": [ "Laravel", "PHP" ], "description": "Statamic is an open-source and self-hosted content management system based on the PHP programming language.", "website": "https://statamic.com", "cpe": "cpe:2.3:a:statamic:statamic:*:*:*:*:*:laravel:*:*" }, "Statcounter": { "cats": [ 10 ], "js": [ "_statcounter", "sc_project", "sc_security" ], "scriptSrc": [ "statcounter\\.com/counter/counter" ], "website": "https://www.statcounter.com" }, "Statically": { "cats": [ 31 ], "headers": { "server": "^statically$" }, "scriptSrc": [ "cdn\\.statically\\.io/" ], "description": "Statically is a free, fast and modern CDN for open-source projects, WordPress, images, and any static assets.", "website": "https://statically.io" }, "Statping": { "cats": [ 13 ], "description": "Statping is an open-source status monitoring tool that helps you to monitor and analyse the performance of your websites, applications, and services. It can monitor multiple endpoints such as HTTP, HTTPS, TCP, DNS, and more.", "website": "https://github.com/statping/statping" }, "Statsig": { "cats": [ 10, 85 ], "js": [ "statsig", "statsiginitialized", "statsigwww" ], "headers": { "x-statsig-region": "" }, "description": "Statsig is a modern product experimentation platform that helps product teams continuously measure impact of every single feature they launch.", "website": "https://statsig.com/" }, "Status.io": { "cats": [ 13 ], "scriptSrc": [ "static\\.status\\.io/" ], "description": "Status.io is a hosted system status page manager with features such as customised incident tracking, subscriber notifications, and more.", "website": "https://status.io" }, "StatusCast": { "cats": [ 13 ], "js": [ "statuscast.libs.datatables", "statuscast.ui" ], "description": "StatusCast is a hosted status page management software.", "website": "https://statuscast.com/status-page/" }, "Statuspal": { "cats": [ 13 ], "scriptSrc": [ "//statuspal\\.io/" ], "description": "Statuspal is a hosted status page and monitoring software for businesses of all kinds.", "website": "https://statuspal.io" }, "Staytus": { "cats": [ 13 ], "meta": { "generator": [ "^staytus/([\\d\\.]+)$\\;version:\\1" ] }, "description": "Staytus is a free, open-source status site that you can install on your own servers.", "website": "https://staytus.co" }, "SteelHouse": { "cats": [ 77 ], "scriptSrc": [ "\\.steelhousemedia\\.com/(?:spx\\?dxver=([\\d.]+))?\\;version:\\1" ], "description": "SteelHouse is an advertising software company which provides services for brands, agencies, and direct marketers.", "website": "https://steelhouse.com" }, "Stencil": { "cats": [ 18 ], "js": [ "stencil.inspect" ], "description": "Stenciljs is an open-source web component compiler that enables developers to create reusable, interoperable UI components that can work across different frameworks and platforms.", "website": "https://stenciljs.com" }, "Stimulus": { "cats": [ 12 ], "html": [ "\u003c[^\u003e]+data-controller" ], "description": "A modest JavaScript framework for the HTML you already have.", "website": "https://stimulusjs.org/" }, "StimulusReflex": { "cats": [ 18 ], "scripts": [ "\\.stimulate" ], "implies": [ "Ruby on Rails", "Stimulus" ], "description": "StimulusReflex lets you create reactive web interfaces with Ruby on Rails.", "website": "https://docs.stimulusreflex.com" }, "Stitches": { "cats": [ 12, 47 ], "meta": { "generator": [ "^c-[a-za-z]{5}$" ] }, "description": "Stitches is a is a CSS-in-JS styling framework with near-zero runtime, SSR, and multi-variant support.", "website": "https://stitches.dev" }, "StoreHippo": { "cats": [ 6 ], "description": "StoreHippo is a SaaS based ecommerce platform.", "website": "https://www.storehippo.com" }, "Storeden": { "cats": [ 6 ], "headers": { "x-powered-by": "storeden" }, "website": "https://www.storeden.com" }, "Storefront UI": { "cats": [ 66 ], "implies": [ "Vue.js" ], "description": "Storefront UI is an independent, Vue. js-based, library of UI components.", "website": "https://vuestorefront.io/storefront-ui" }, "Storeino": { "cats": [ 6 ], "js": [ "storeinoapp" ], "meta": { "platform": [ "^storeino$" ] }, "implies": [ "Express", "MongoDB", "Node.js" ], "description": "Storeino is an ecommerce platform that enables businesses and physical store owners to open a professional online store and sell products online regardless of their geographical location.", "website": "https://www.storeino.com" }, "Storeplum": { "cats": [ 6 ], "description": "Storeplum is a no-code ecommerce platform.", "website": "https://www.storeplum.com" }, "StorifyMe": { "cats": [ 5 ], "scriptSrc": [ "cdn\\.storifyme\\.com/" ], "description": "StorifyMe is a storytelling platform for creating and distributing web stories on social networks and the open web.", "website": "https://www.storifyme.com" }, "StoryStream": { "cats": [ 96 ], "scriptSrc": [ "apps\\.storystream\\.ai/" ], "description": "StoryStream is a content curation platform that specialises in user generated content.", "website": "https://storystream.ai" }, "Storyblok": { "cats": [ 1 ], "js": [ "storyblokbridge", "storyblokregisterevent" ], "headers": { "content-security-policy": "app\\.storyblok\\.com", "x-frame-options": "app\\.storyblok\\.com" }, "description": "Storyblok is a headless CMS with a visual editor for developers, marketers and content editors. Storyblok helps your team to manage content and digital experiences for every use-case from corporate websites, ecommerce, helpdesks, mobile apps, screen displays, and more.", "website": "https://www.storyblok.com" }, "Storybook": { "cats": [ 47, 66 ], "js": [ "__storybook_addons" ], "description": "Storybook is a frontend workshop for building UI components and pages in isolation.", "website": "https://storybook.js.org" }, "Strapdown.js": { "cats": [ 12 ], "scriptSrc": [ "strapdown\\.js" ], "implies": [ "Bootstrap", "Google Code Prettify" ], "website": "https://strapdownjs.com" }, "Strapi": { "cats": [ 1 ], "headers": { "x-powered-by": "^strapi" }, "description": "Strapi is an open-source headless CMS used for building fast and easily manageable APIs written in JavaScript.", "website": "https://strapi.io" }, "Strato": { "cats": [ 88, 62 ], "description": "Strato is an internet hosting service provider headquartered in Berlin, Germany which provide dedicated server hosting, a website builder and a cloud storage services.", "website": "https://www.strato.com" }, "Strato Website": { "cats": [ 1 ], "js": [ "strftime.configuration" ], "scriptSrc": [ "strato-editor\\.com/" ], "description": "Strato Website is a website builder by Strato hosting provider.", "website": "https://www.strato.de/homepage-baukasten" }, "Strattic": { "cats": [ 88 ], "headers": { "x-powered-by": "strattic" }, "implies": [ "WordPress" ], "description": "Strattic offers static and headless hosting for WordPress sites.", "website": "https://www.strattic.com/" }, "Strikingly": { "cats": [ 1 ], "html": [ "\u003c!-- powered by strikingly\\.com" ], "website": "https://strikingly.com" }, "Stripe": { "cats": [ 41 ], "cookies": { "__stripe_mid": "", "__stripe_sid": "" }, "js": [ "__next_data__.props.pageprops.appsettings.stripe_api_public_key", "checkout.enabledpayments.stripe", "stripe.version" ], "html": [ "\u003cinput[^\u003e]+data-stripe" ], "scriptSrc": [ "js\\.stripe\\.com" ], "description": "Stripe offers online payment processing for internet businesses as well as fraud prevention, invoicing and subscription management.", "website": "https://stripe.com" }, "StrutFit": { "cats": [ 76 ], "js": [ "rerenderstrutfit" ], "description": "StrutFit is an online sizing platform for footwear retailers.", "website": "https://www.strut.fit" }, "Stylitics": { "cats": [ 32 ], "js": [ "stylitics", "stylitics" ], "scriptSrc": [ "/stylitics/js/stylitics\\.js\\?ver=v([\\d.]+)\\;version:\\1", "\\.stylitics\\.com/v([\\d.]+)\\;version:\\1" ], "description": "Stylitics is a cloud-based SaaS platform for retailers to automate and distribute visual content at scale.", "website": "https://stylitics.com" }, "Sub2Tech": { "cats": [ 97 ], "js": [ "sub2.codebaseversion" ], "scriptSrc": [ "cdn\\.sub2tech\\.com/" ], "description": "Sub2Tech is combining real time customer data with industry-leading technology.", "website": "https://www.sub2tech.com" }, "Subbly": { "cats": [ 6 ], "js": [ "subblyproducturlbase" ], "scriptSrc": [ "static\\.subbly\\.me/assets/" ], "meta": { "generator": [ "^subbly$" ] }, "description": "Subbly is a web-based subscription ecommerce platform designed to help businesses build websites, enhance marketing automation, create coupon and discount codes and manage customers.", "website": "https://www.subbly.co" }, "Sublime": { "cats": [ 36 ], "js": [ "loadsublimeskinz" ], "scriptSrc": [ "\\.ayads\\.co/" ], "description": "Sublime (formerly Sublime Skinz) operator of an advertising agency intended to offer skin-based advertising services to clients.", "website": "https://www.sublime.xyz" }, "SublimeVideo": { "cats": [ 14 ], "js": [ "sublimevideo" ], "scriptSrc": [ "cdn\\.sublimevideo\\.net/js/[a-z\\d]+\\.js" ], "description": "SublimeVideo is a framework for HTML5 Video Player.", "website": "https://sublimevideo.net" }, "Subrion": { "cats": [ 1 ], "headers": { "x-powered-cms": "subrion cms" }, "meta": { "generator": [ "^subrion " ] }, "implies": [ "PHP" ], "website": "https://subrion.com" }, "Substack": { "cats": [ 11 ], "headers": { "x-cluster": "substack", "x-served-by": "substack" }, "description": "Substack is an American online platform that provides publishing, payment, analytics, and design infrastructure to support subscription newsletters.", "website": "https://substack.com/" }, "Sucuri": { "cats": [ 31, 16 ], "headers": { "x-sucuri-cache:": "", "x-sucuri-id": "" }, "description": "Sucuri is a cybersecurity company that provides website security solutions and services.", "website": "https://sucuri.net/" }, "Suiteshare": { "cats": [ 52 ], "scriptSrc": [ "static\\.suiteshare\\.com" ], "description": "Suiteshare powers conversational shopping experiences.", "website": "https://suiteshare.com/" }, "Sulu": { "cats": [ 1 ], "js": [ "sulu_config.suluversion" ], "headers": { "x-generator": "sulu/?(.+)?$\\;version:\\1" }, "implies": [ "Symfony" ], "description": "Sulu is the go-to CMS for back-end projects written within the PHP Symfony framework.", "website": "https://sulu.io" }, "SummerCart": { "cats": [ 6 ], "js": [ "scevents" ], "implies": [ "PHP" ], "description": "SummerCart is an ecommerce platform written in PHP.", "website": "https://www.summercart.com" }, "Summernote": { "cats": [ 20 ], "scriptSrc": [ "/(?:s|s)ummernote(?:\\.min)?\\.js", "/summernote(?:@|-)([\\d\\.]+)/\\;version:\\1" ], "description": "Summernote is an open-source JavaScript library that offers a feature-rich WYSIWYG editor for web applications, allowing users to create and edit formatted content in a familiar word processor-like interface.", "website": "https://summernote.org" }, "Sumo": { "cats": [ 5, 32 ], "js": [ "sumo", "sumome" ], "scriptSrc": [ "\\.sumo(?:me)?\\.com/" ], "description": "Sumo is a plugin offering set of marketing tools to automate a website's growth. These tools help drive extra traffic, engage visitors, increase email subscribers and build community.", "website": "https://sumo.com" }, "SunOS": { "cats": [ 28 ], "headers": { "server": "sunos( [\\d\\.]+)?\\;version:\\1", "servlet-engine": "sunos( [\\d\\.]+)?\\;version:\\1" }, "description": "SunOS is a Unix-branded operating system developed by Sun Microsystems for their workstation and server computer systems.", "website": "https://oracle.com/solaris", "cpe": "cpe:2.3:o:oracle:sunos:*:*:*:*:*:*:*:*" }, "Suncel": { "cats": [ 1 ], "js": [ "__next_data__.props.pageprops.suncel" ], "description": "Suncel is a powerful and versatile content platform with a simple visual builder for marketers and publishers.", "website": "https://suncel.io" }, "Supabase": { "cats": [ 47 ], "js": [ "__nuxt__.config.public.supabase", "__nuxt__.config.public.supabase_url" ], "implies": [ "PostgreSQL" ], "description": "Supabase is an open-source platform that offers a Postgres database, Authentication, APIs, Edge Functions, Realtime subscriptions, Storage, and Vector embeddings for project development.", "website": "https://supabase.com" }, "Super Builder": { "cats": [ 51 ], "implies": [ "Next.js", "Notion" ], "description": "Super Builder is a new tool for creating sleek landing pages right in Notion.", "website": "https://super.so" }, "Super Socializer": { "cats": [ 69, 87 ], "scriptSrc": [ "plugins/super-socializer/.+?ver=([\\d.]+)\\;version:\\1" ], "description": "Super Socializer is a multipurpose social media plugin for WordPress.", "website": "https://super-socializer-wordpress.heateor.com" }, "SuperLemon app": { "cats": [ 100 ], "scriptSrc": [ "/files/superlemon_.+\\.js" ], "implies": [ "WhatsApp Business Chat" ], "description": "SuperLemon app is an all-in-one WhatsApp plugin for Shopify stores.", "website": "https://apps.shopify.com/whatsapp-chat-button" }, "SuperPWA": { "cats": [ 87 ], "js": [ "superpwa_sw" ], "implies": [ "PWA", "WordPress" ], "description": "SuperPWA helps to easily convert your WordPress website into Progressive Web Apps instantly through our widely used PWA software without in coding.", "website": "https://superpwa.com" }, "Supersized": { "cats": [ 25 ], "scriptSrc": [ "supersized(?:\\.([\\d.]*[\\d]))?.*\\.js\\;version:\\1" ], "website": "https://buildinternet.com/project/supersized" }, "Superspeed": { "cats": [ 92 ], "scriptSrc": [ "superspeed\\.gadget-edge\\.com" ], "implies": [ "Shopify" ], "description": "Superspeed is a page speed optimizer app for Shopify based sites.", "website": "https://apps.shopify.com/superspeed-free-speed-boost" }, "Support Hero": { "cats": [ 4, 13 ], "js": [ "supporthero", "supportherowidget" ], "description": "Support Hero is a knowledge base solution to reduce inbound support requests.", "website": "https://www.supporthero.com/" }, "Survicate": { "cats": [ 73 ], "js": [ "survicate" ], "headers": { "content-security-policy": "api\\.survicate\\.com" }, "scriptSrc": [ "\\.survicate\\.com/" ], "description": "Survicate is an all-in-one customer feedback tool that allows you collect feedback.", "website": "https://survicate.com" }, "Svbtle": { "cats": [ 11 ], "meta": { "generator": [ "^svbtle\\.com$" ] }, "website": "https://www.svbtle.com" }, "Svelte": { "cats": [ 12 ], "description": "Svelte is a free and open-source front end compiler created by Rich Harris and maintained by the Svelte core team members.", "website": "https://svelte.dev" }, "SvelteKit": { "cats": [ 66 ], "meta": { "generator": [ "sveltekit" ] }, "implies": [ "Node.js", "Svelte", "Vite" ], "description": "SvelteKit is the official Svelte framework for building web applications with a flexible filesystem-based routing.", "website": "https://kit.svelte.dev" }, "Swagger UI": { "cats": [ 4 ], "js": [ "swaggeruibundle", "swaggeruistandalonepreset" ], "scriptSrc": [ "(?:/([\\d.]+))?/swagger-ui-bundle\\.js\\;version:\\1" ], "description": "Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate documentation from a Swagger-compliant API.", "website": "https://swagger.io/tools/swagger-ui" }, "Swagify": { "cats": [ 10 ], "js": [ "swagify" ], "scriptSrc": [ "api\\.swagifyapp\\.com/" ], "description": "Swagify allows you to upsell, cross-sell, and promote, by creating as many completely customizable offers as you want.", "website": "https://swagifyapp.com" }, "SweetAlert": { "cats": [ 59 ], "scriptSrc": [ "sweet(?:-)?alert(?:\\.min)?\\.js" ], "description": "SweetAlert is a JavaScript library that provides alternative alert and modal dialog boxes for web applications, with customisable features, aiming to improve the user interface of the default browser dialogs.", "website": "https://sweetalert.js.org" }, "SweetAlert2": { "cats": [ 59 ], "js": [ "sweetalert2" ], "scriptSrc": [ "/npm/sweetalert2@([\\d.]+)\\;version:\\1", "limonte-sweetalert2/([\\d.]+)/sweetalert2(?:\\.all)(?:\\.min)\\.js", "sweetalert2(?:\\.all)?(?:\\.min)?\\.js", "sweetalert2@([\\d.]+)/dist/sweetalert2(?:\\.all)(?:\\.min)\\.js" ], "description": "SweetAlert2 is a JavaScript library that provides customisable, visually appealing, and responsive alert and modal dialog boxes for web applications.", "website": "https://sweetalert2.github.io/" }, "Swell": { "cats": [ 6 ], "cookies": { "swell-session": "" }, "js": [ "swell.version" ], "description": "Swell is a headless ecommerce platform for modern brands, startups, and agencies.", "website": "https://www.swell.is" }, "Swiffy Slider": { "cats": [ 59 ], "scriptSrc": [ "/npm/swiffy-slider@([\\d\\.]+)/\\;version:\\1" ], "description": "Swiffy Slider is a wrapper defined in html with slides, navigation and indicators as its children.", "website": "https://swiffyslider.com" }, "Swiftype": { "cats": [ 29 ], "js": [ "swiftype" ], "scriptSrc": [ "swiftype\\.com/embed\\.js$" ], "description": "Swiftype provides search software for organisations, websites, and computer programs.", "website": "https://swiftype.com" }, "Swiper": { "cats": [ 59 ], "js": [ "swiper" ], "scriptSrc": [ "swiper(?:\\.min)?\\.js" ], "description": "Swiper is a JavaScript library that creates modern touch sliders with hardware-accelerated transitions.", "website": "https://swiperjs.com" }, "Swym Wishlist Plus": { "cats": [ 100 ], "js": [ "swappname", "swymcart.attributes" ], "implies": [ "Shopify" ], "description": "Swym Wishlist Plus enables your customers to bookmark their favorite products and pick up where they left off when they return.", "website": "https://swym.it/apps/wishlist/" }, "Sylius": { "cats": [ 6 ], "scriptSrc": [ "syliusgtmenhancedecommerceplugin", "syliusshop/script\\.js" ], "implies": [ "Symfony" ], "description": "Sylius is an open-source ecommerce framework based on Symfony full stack.", "website": "https://sylius.com" }, "Symfony": { "cats": [ 18 ], "cookies": { "sf_redirect": "" }, "js": [ "sfjs" ], "implies": [ "PHP" ], "description": "Symfony is a PHP web application framework and a set of reusable PHP components/libraries.", "website": "https://symfony.com", "cpe": "cpe:2.3:a:sensiolabs:symfony:*:*:*:*:*:*:*:*" }, "Sympa": { "cats": [ 30 ], "html": [ "\u003ca href=\"https?://www\\.sympa\\.org\"\u003e\\s*powered by sympa\\s*\u003c/a\u003e" ], "meta": { "generator": [ "^sympa$" ] }, "implies": [ "Perl" ], "description": "Sympa is an open-source mailing list management (MLM) software.", "website": "https://www.sympa.org/" }, "Syndeca": { "cats": [ 10, 76 ], "js": [ "syndecaanalyticsobject" ], "scriptSrc": [ "\\.syndeca\\.com/" ], "description": "Syndeca is a visual commerce platform that allows brands to quickly create engaging, actionable campaigns.", "website": "https://www.syndeca.com" }, "Synerise": { "cats": [ 10 ], "scriptSrc": [ "snrcdn\\.net/sdk/(3\\.0)/synerise-javascript-sdk\\.min\\.js\\;version:\\1" ], "website": "https://synerise.com/" }, "Synology DiskStation": { "cats": [ 48 ], "html": [ "\u003cnoscript\u003e\u003cdiv class='syno-no-script'" ], "scriptSrc": [ "webapi/entry\\.cgi\\?api=syno\\.(?:core|filestation)\\.desktop\\." ], "meta": { "application-name": [ "synology diskstation" ], "description": [ "^diskstation provides a full-featured network attached storage" ] }, "description": "DiskStation provides a full-featured network attached storage.", "website": "https://synology.com" }, "SyntaxHighlighter": { "cats": [ 19 ], "js": [ "syntaxhighlighter" ], "html": [ "\u003c(?:script|link)[^\u003e]*sh(?:core|brush|themedefault)" ], "website": "https://github.com/syntaxhighlighter" }, "Systeme.io": { "cats": [ 32 ], "scriptSrc": [ "//systeme\\.io/" ], "description": "Systeme.io is an all-in-one marketing platform that helps businesses create and launch sales funnels, affiliate programs, email marketing campaigns, online courses, blogs, and websites.", "website": "https://systeme.io" }, "Syte": { "cats": [ 76, 29 ], "js": [ "syteapi.getbinimagebb", "syteapp.analytics", "sytepixel" ], "scriptSrc": [ "cdn\\.syteapi\\.com/" ], "description": "Syte is a provider of visual AI technology that aims to improve retailers' site navigation, product discovery, and user experience by powering solutions that engage and convert shoppers.", "website": "https://www.syte.ai" }, "T-Soft": { "cats": [ 6 ], "html": [ "\u003ca href=\"http://www\\.tsoft\\.com\\.tr\" target=\"_blank\" title=\"t-soft e-ticaret sistemleri\"\u003e" ], "website": "https://www.tsoft.com.tr/" }, "T1 Comercios": { "cats": [ 19 ], "meta": { "generator": [ "^t1comercios$" ] }, "description": "T1 Comercios is an integrator platform with marketplaces(https://www.claroshop.com/,https://www.sears.com.mx/,https://www.sanborns.com.mx/).", "website": "https://www.t1comercios.com" }, "T1 Envios": { "cats": [ 99 ], "meta": { "generator": [ "^t1envios$" ] }, "description": "T1 Envios is a delivery solution, allows the business to select the best courier to send their packages.", "website": "https://t1envios.com" }, "T1 Paginas": { "cats": [ 6 ], "meta": { "generator": [ "^t1paginas$" ] }, "implies": [ "AngularJS", "MongoDB", "Node.js" ], "description": "T1 Paginas is an ecommerce platform.", "website": "https://t1paginas.com" }, "T1 Pagos": { "cats": [ 41 ], "meta": { "generator": [ "^t1pagos$" ] }, "description": "T1 Pagos is a payment processing platform.", "website": "https://www.t1pagos.com" }, "TCAdmin": { "cats": [ 9 ], "js": [ "tcadmin" ], "description": "TCAdmin is the game hosting control panel.", "website": "https://www.tcadmin.com" }, "TDesign": { "cats": [ 66 ], "scriptSrc": [ "tdesign\\.gtimg\\.com/" ], "description": "TDesign launched by Tencent contains rich and reusable design component resources, such as color system, text system, motion design, etc.", "website": "https://tdesign.tencent.com" }, "THG Ingenuity": { "cats": [ 6 ], "scriptSrc": [ "thehut-.*\\.js" ], "description": "THG Ingenuity is completely unique in that it's both a peer-to-peer ecommerce retailer and a service provider to global cross-border commerce operations.", "website": "https://www.thgingenuity.com" }, "THRON": { "cats": [ 95 ], "js": [ "thronhlsjs", "thronplayer" ], "description": "THRON is a digital asset management platform that provides a centralised hub for storing, organising, and distributing digital assets like images, videos, and documents.", "website": "https://www.thron.com" }, "TN Express Web": { "cats": [ 1 ], "cookies": { "tnew": "" }, "implies": [ "Tessitura" ], "description": "Tessitura is an enterprise application to manage activities in ticketing, fundraising, customer relationship management, and marketing.", "website": "https://www.tessituranetwork.com" }, "TNS Payments": { "cats": [ 41 ], "scriptSrc": [ "secure\\.ap\\.tnspayments\\.com" ], "description": "TNS Payments, is designed to deliver payment transaction information to banks, merchants, processors and other payment institutions.", "website": "https://tnsi.com/products/payments/" }, "TRISOshop": { "cats": [ 6 ], "description": "TRISOshop is an ecommerce platform.", "website": "https://www.trisoshop.pl" }, "TRUENDO": { "cats": [ 67 ], "js": [ "truendo", "truendocookiecontrolcallback" ], "scriptSrc": [ "cdn\\.priv\\.center/", "cdn\\.truendo\\.com/" ], "description": "TRUENDO is a GDPR compliance software.", "website": "https://truendo.com" }, "TVSquared": { "cats": [ 36 ], "js": [ "_tvq", "tv2track" ], "description": "TVSquared is a cross-platform TV ad measurement, analytics and optimisation platform.", "website": "https://www.tvsquared.com" }, "TWiki": { "cats": [ 8 ], "cookies": { "twikisid": "" }, "html": [ "\u003cimg [^\u003e]*(?:title|alt)=\"this site is powered by the twiki collaboration platform" ], "scriptSrc": [ "(?:twikijavascripts|twikilib(?:\\.min)?\\.js)" ], "implies": [ "Perl" ], "description": "TWiki is an open-source wiki and application platform.", "website": "https://twiki.org" }, "TYPO3 CMS": { "cats": [ 1 ], "scriptSrc": [ "^/?typo3(?:conf|temp)/" ], "meta": { "generator": [ "typo3\\s+(?:cms\\s+)?(?:[\\d.]+)?(?:\\s+cms)?" ] }, "implies": [ "PHP" ], "description": "TYPO3 is a free and open-source Web content management system written in PHP.", "website": "https://typo3.org/", "cpe": "cpe:2.3:a:typo3:typo3:*:*:*:*:*:*:*:*" }, "Tabarnapp": { "cats": [ 100 ], "js": [ "tabarnapp_loaded_ad" ], "scriptSrc": [ "cdn\\.tabarn\\.app/" ], "description": "Tabarnapp is a platform for Shopify apps and themes.", "website": "https://tabarnapp.com" }, "Tabby": { "cats": [ 41, 91 ], "js": [ "tabby", "tabbypromo" ], "scriptSrc": [ "checkout\\.tabby\\.ai" ], "description": "Tabby is a Buy now pay later solution from Middle East.", "website": "https://tabby.ai/" }, "TableBooker": { "cats": [ 93 ], "scriptSrc": [ "reservations\\.tablebooker\\.\\w+/" ], "description": "Tablebooker is an online reservation system for restaurants.", "website": "https://www.tablebooker.com" }, "TableCheck": { "cats": [ 93 ], "scriptSrc": [ "tc_widget\\.js" ], "description": "TableCheck is a restaurant table booking widget.", "website": "https://www.tablecheck.com" }, "TablePress": { "cats": [ 87 ], "description": "TablePress is a free and open source plugin for the WordPress publishing platform. It enables you to create and manage tables on your website, without any coding knowledge.", "website": "https://tablepress.org" }, "Taboola": { "cats": [ 36 ], "cookies": { "taboola_session_id": "" }, "js": [ "_taboola", "taboola_view_id", "trcimpl.global" ], "scriptSrc": [ "\\.taboola\\.com" ], "description": "Taboola is a content discovery \u0026 native advertising platform for publishers and advertisers.", "website": "https://www.taboola.com" }, "Tachyons": { "cats": [ 66 ], "js": [ "webpackchunkgatsby_starter_blog_tachyons" ], "description": "Tachyons is a functional CSS framework.", "website": "https://tachyons.io" }, "Tada": { "cats": [ 100 ], "scriptSrc": [ "cdn\\.trytada\\.com/" ], "implies": [ "Shopify" ], "description": "Tada offers interactive website popups that allow Shopify merchants to collect more emails and increase sales by engaging website visitors through gamification.", "website": "https://trytada.com" }, "TagPro": { "cats": [ 42 ], "js": [ "initadprotags" ], "scriptSrc": [ "tagpro\\.adpromedia\\.net/" ], "description": "TagPro is software that updates and allows you to manage tags within websites, identifying various types of variables to optimise loads for advertising.", "website": "https://tagpro.adpromedia.net" }, "Tagboard": { "cats": [ 96 ], "scriptSrc": [ "\\.tagboard\\.com/" ], "description": "Tagboard is a platform which allows users to aggregate data from major social networking websites and embed, repost and redisplay it on various media.", "website": "https://tagboard.com" }, "Tagembed": { "cats": [ 96, 5 ], "js": [ "tagembedwidget" ], "scriptSrc": [ "//widget\\.tagembed\\.com/" ], "description": "Tagembed is a social media aggregator that collects and displays engaging user-generated content from any social media network such as Instagram, Facebook, Twitter, Youtube, Tiktok, Google Reviews, Airbnb, and 18+ networks.", "website": "https://tagembed.com" }, "Taggbox": { "cats": [ 5 ], "js": [ "taggboxajaxurl" ], "scriptSrc": [ "\\.taggbox\\.com", "taggbox\\.com/app/js/embed\\.min\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1" ], "description": "Taggbox is an UGC platform to collect, curate, manage rights, and publish user-generated content marketing campaigns across multiple channels.", "website": "https://taggbox.com/" }, "Taiga": { "cats": [ 13 ], "js": [ "taigaconfig" ], "implies": [ "AngularJS", "Django" ], "website": "https://taiga.io" }, "Tail": { "cats": [ 97 ], "scriptSrc": [ "\\.tailtarget\\.com/" ], "description": "Tail is a customer data management platform.", "website": "https://www.tail.digital" }, "Tailwind CSS": { "cats": [ 66 ], "css": [ "--tw-(?:rotate|translate|space-x|text-opacity|border-opacity)" ], "js": [ "tailwind" ], "scriptSrc": [ "\\.tailwindcss(?:tailwind-config-cdn)?\\.(?:com|js)" ], "description": "Tailwind is a utility-first CSS framework.", "website": "https://tailwindcss.com/" }, "TakeDrop": { "cats": [ 6 ], "js": [ "webpackjsonptakedrop-react" ], "description": "TakeDrop is an ecommerce platform.", "website": "https://takedrop.pl" }, "Talkable": { "cats": [ 74, 84, 94 ], "js": [ "talkable.config.version" ], "description": "Talkable is a cloud-based referral marketing system that assists medium to large businesses with campaign creation and channel performance tracking.", "website": "https://www.talkable.com" }, "Tallentor": { "cats": [ 10 ], "scriptSrc": [ "tallentor\\.com/js/script_tracker\\.js" ], "description": "Tallentor is a subscription-based software website analytics, heatmap, channel chat intergration.", "website": "https://tallentor.com" }, "Tallentor Widget": { "cats": [ 52 ], "cookies": { "tallentor_widget": "" }, "description": "Tallentor is a subscription-based software website analytics, heatmap, channel chat intergration.", "website": "https://tallentor.com" }, "Tally": { "cats": [ 73 ], "js": [ "tally" ], "scriptSrc": [ "//tally\\.so/" ], "description": "Tally is the simplest way to create free forms \u0026 surveys. Create any type of form in seconds, without knowing how to code, and for free.", "website": "https://tally.so/" }, "Tamago": { "cats": [ 5 ], "html": [ "\u003clink [^\u003e]*href=\"http://tamago\\.temonalab\\.com" ], "website": "https://tamago.temonalab.com" }, "Tamara": { "cats": [ 41, 91 ], "js": [ "tamaraproductwidget" ], "scriptSrc": [ "cdn\\.tamara\\.co" ], "description": "Tamara ia a BNPL (Buy now pay later) provider in Saudi Arabia.", "website": "https://tamara.co/" }, "Tangled Network": { "cats": [ 88 ], "headers": { "x-hosting-provider": "tangled network" }, "description": "Tangled Network provides a managed services in website devleopment, web and database hosting and domain registration, with a focus on everything managed for small and medium sized businesses.", "website": "https://tanglednetwork.com" }, "Tapad": { "cats": [ 36 ], "description": "Tapad is a venture-funded startup company that develops and markets software and services for cross-device advertising and content delivery.", "website": "https://www.tapad.com" }, "Tapcart": { "cats": [ 19 ], "js": [ "tapcartwebbanner" ], "scriptSrc": [ "cdn\\.tapcart\\.com/" ], "description": "Tapcart is a mobile commerce SaaS platform that integrates directly with Shopify.", "website": "https://tapcart.com" }, "Tapfiliate": { "cats": [ 71 ], "js": [ "tapfiliateobject" ], "scriptSrc": [ "\\.tapfiliate\\.com/" ], "description": "Tapfiliate is a cloud-based affiliate marketing software that helps businesses to create, track, and optimise their own affiliate marketing programs.", "website": "https://tapfiliate.com" }, "Target2Sell": { "cats": [ 76 ], "scriptSrc": [ "static\\.target2sell\\.com" ], "description": "Target2Sell is a personalisation solution for ecommerce sites.", "website": "https://www.target2sell.com/" }, "Tatari": { "cats": [ 36 ], "js": [ "tatari" ], "description": "Tatari is a data and analytics company focused on buying and measuring ads across TV and streaming platforms.", "website": "https://www.tatari.tv" }, "Tawk.to": { "cats": [ 52 ], "cookies": { "tawkconnectiontime": "" }, "scriptSrc": [ "//embed\\.tawk\\.to" ], "description": "Tawk.to is a free messaging app to monitor and chat with the visitors to a website, mobile app.", "website": "https://tawk.to" }, "Teachable": { "cats": [ 21 ], "cookies": { "_gat_teachabletracker": "\\d+" }, "js": [ "isteachable", "teachableicons", "trackteachablegaevent" ], "scriptSrc": [ "\\.teachablecdn\\.com" ], "meta": { "asset_host": [ "\\.teachablecdn\\.com" ] }, "description": "Teachable is a learning management system or LMS platform.", "website": "https://teachable.com" }, "Teads": { "cats": [ 36 ], "scriptSrc": [ "teads\\.tv" ], "description": "Teads is a technology provider that sells ads on publisher websites.", "website": "https://www.teads.com" }, "Tealium": { "cats": [ 42, 97 ], "js": [ "tealiumenabled" ], "scriptSrc": [ "/tealium/utag\\.js$", "^(?:https?:)?//tags\\.tiqcdn\\.com/" ], "description": "Tealium provides a sales enterprise tag management system and marketing software.", "website": "https://tealium.com" }, "Tealium AudienceStream": { "cats": [ 86 ], "scriptSrc": [ "\\.tealiumiq\\.com" ], "description": "Tealium AudienceStream is an omnichannel customer segmentation and real-time action engine.", "website": "https://tealium.com/products/audiencestream" }, "Tealium Consent Management": { "cats": [ 67 ], "description": "Tealium Consent Management adds consent and data privacy support.", "website": "https://docs.tealium.com/platforms/getting-started/consent-management" }, "TeamBrain": { "cats": [ 5 ], "js": [ "teambrainexternalapp" ], "description": "TeamBrain is a knowledge management solution which allows to use a self-learning dynamic FAQ on a website or widget on the bottom right of any page.", "website": "https://www.teambrain.io" }, "TeamCity": { "cats": [ 44 ], "html": [ "\u003cspan class=\"versiontag\"\u003e\u003cspan class=\"vword\"\u003eversion\u003c/span\u003e ([\\d\\.]+)\\;version:\\1" ], "meta": { "application-name": [ "teamcity" ] }, "implies": [ "Apache Tomcat", "Java", "Moment.js", "Prototype", "React", "Underscore.js", "jQuery" ], "description": "TeamCity is a build management and continuous integration server from JetBrains.", "website": "https://www.jetbrains.com/teamcity/" }, "Teamtailor": { "cats": [ 101 ], "js": [ "teamtailor.ziggeo" ], "description": "Teamtailor is an applicant tracking system, career site and analytics dashboard combined, mobile friendly, and all-in-one recruitment platform.", "website": "https://www.teamtailor.com" }, "Tebex": { "cats": [ 6 ], "headers": { "tb-cache-country": "^\\w+$\\;confidence:50", "tb-cache-group": "^webstore$\\;confidence:50" }, "scripts": [ "\\.tebexlogin" ], "implies": [ "MySQL", "PHP", "Sass" ], "description": "Tebex specialises in providing gcommerce solutions for online games.", "website": "https://www.tebex.io" }, "Telescope": { "cats": [ 1 ], "js": [ "telescope" ], "implies": [ "Meteor", "React" ], "website": "https://telescopeapp.org" }, "Tencent Analytics (腾讯分析)": { "cats": [ 10 ], "scriptSrc": [ "tajs\\.qq\\.com/stats" ], "website": "https://ta.qq.com/" }, "Tencent Cloud": { "cats": [ 31, 62 ], "scriptSrc": [ "\\.tencent-cloud\\.(?:cn|com)/" ], "meta": { "copyright": [ "^.+tencent\\scloud\\.$" ] }, "description": "Tencent Cloud is China's leading public cloud service provider.", "website": "https://intl.cloud.tencent.com" }, "Tencent QQ": { "cats": [ 52 ], "description": "Tencent QQ also known as QQ, is an instant messaging software service and web portal developed by the Chinese tech giant Tencent.", "website": "https://im.qq.com" }, "Tencent Waterproof Wall": { "cats": [ 9, 16 ], "scriptSrc": [ "/tcaptcha\\.js", "captcha\\.qq\\.com/.*" ], "website": "https://007.qq.com/" }, "Tengine": { "cats": [ 22 ], "headers": { "server": "tengine" }, "description": "Tengine is a web server which is based on the Nginx HTTP server.", "website": "https://tengine.taobao.org" }, "Termly": { "cats": [ 67 ], "scriptSrc": [ "app\\.termly\\.io/embed\\.min\\.js" ], "description": "Termly provides free website policy resources and web-based policy creation software.", "website": "https://termly.io/" }, "Tern": { "cats": [ 100 ], "scriptSrc": [ "live\\.tern-returns\\.eastsideapps\\.io/" ], "description": "Tern is a plug and play ecommerce app, built for Shopify, that offers merchants the ability to provide a seamless trade-in service.", "website": "https://www.tern.eco" }, "TerriaJS": { "cats": [ 35 ], "description": "TerriaJS is an open-source framework for web-based geospatial catalogue explorers.", "website": "https://terria.io/" }, "Tessitura": { "cats": [ 53 ], "html": [ "\u003c!--[^\u003e]+tessitura version: (\\d*\\.\\d*\\.\\d*)?\\;version:\\1" ], "implies": [ "IIS", "Microsoft ASP.NET", "Windows Server" ], "website": "https://www.tessituranetwork.com" }, "TestFreaks": { "cats": [ 90 ], "js": [ "applytestfreaks", "testfreaks" ], "scriptSrc": [ "\\.testfreaks\\.com/" ], "description": "TestFreaks is an impartial source that provides product and seller review content for ecommerce websites.", "website": "https://www.testfreaks.com" }, "Texthelp": { "cats": [ 68 ], "scriptSrc": [ "browsealoud\\.com/.*/browsealoud\\.js" ], "description": "TextHelp is a literacy, accessibility and dyslexia software developer for people with reading and writing difficulties.", "website": "https://www.texthelp.com/en-gb/products/browsealoud/" }, "Textpattern CMS": { "cats": [ 1 ], "meta": { "generator": [ "textpattern" ] }, "implies": [ "MySQL", "PHP" ], "website": "https://textpattern.com" }, "The Arena Group": { "cats": [ 36 ], "meta": { "generator": [ "^tempest\\s-\\smaven\\.io$" ] }, "description": "The Arena Group is a media coalition of professional content destinations. It operates on a shared digital publishing, advertising, and distribution platform, providing a major media-scale alternative to news and information distributed on social platforms.", "website": "https://thearenagroup.net" }, "The Church Co": { "cats": [ 51 ], "meta": { "generator": [ "^thechurchco\\s([\\d\\.]+)$\\;version:\\1" ] }, "description": "The Church Co is a church-focused website development platform that provides tools and features specifically designed to support the growth and online presence of churches and religious organisations.", "website": "https://thechurchco.com" }, "The Events Calendar": { "cats": [ 87 ], "js": [ "tribe_l10n_datatables", "tribecalendar" ], "scriptSrc": [ "/wp-content/plugins/the-events-calendar(?:-pro)?/" ], "description": "The Events Calendar is a free event management plugin for WordPress.", "website": "https://theeventscalendar.com" }, "The Hotels Network": { "cats": [ 10, 76 ], "js": [ "thn.data.version" ], "headers": { "content-security-policy": "\\.thehotelsnetwork\\.com", "content-security-policy-report-only": "\\.thehotelsnetwork\\.com" }, "scriptSrc": [ "\\.thehotelsnetwork\\.com/" ], "description": "The Hotels Network provides a SaaS software that enhances hotelier websites with predictive marketing personalisation and user behavior analytics.", "website": "https://thehotelsnetwork.com" }, "The SEO Framework": { "cats": [ 54, 87 ], "html": [ "\u003c!--[^\u003e]+the seo framework by sybre waaijer" ], "description": "The SEO Framework is the only WordPress plugin that can intelligently generate critical SEO meta tags by reading your WordPress environment.", "website": "https://theseoframework.com" }, "The Theme Foundry Make": { "cats": [ 80 ], "js": [ "makedynamicstylesheet", "makefrontend" ], "scriptSrc": [ "/wp-content/themes/make(?:-child)?/.+frontend\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Make is a free, open-source builder WordPress theme by The Theme Foundry.", "website": "https://thethemefoundry.com/wordpress-themes/make" }, "The.com": { "cats": [ 18, 51 ], "scriptSrc": [ "the-dotcom-public-cdn\\.s3\\.amazonaws\\.com/" ], "implies": [ "Amazon S3", "React" ], "description": "The.com is a low-code website building platform with community-created components that you can share and own.", "website": "https://www.the.com" }, "Thefork": { "cats": [ 93 ], "description": "Thefork is a restaurant booking, managing system.", "website": "https://www.thefork.com" }, "Thelia": { "cats": [ 1, 6 ], "html": [ "\u003c(?:link|style|script)[^\u003e]+/assets/frontoffice/" ], "implies": [ "PHP", "Symfony" ], "website": "https://thelia.net" }, "Theme Freesia Edge": { "cats": [ 80 ], "js": [ "edge_slider_value" ], "scriptSrc": [ "/wp-content/themes/edge(?:-plus)?/" ], "description": "Edge is a responsive blogger WordPress theme by Theme Freesia.", "website": "https://themefreesia.com/themes/edge" }, "Theme Freesia Photograph": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/photograph(?:-plus)?/" ], "description": "Photograph is a WordPress theme exclusively built for photographer, blogger, portfolio, photography agency or photo studio websites.", "website": "https://themefreesia.com/themes/Photograph" }, "Theme Freesia ShoppingCart": { "cats": [ 80 ], "js": [ "shoppingcart_slider_value" ], "scriptSrc": [ "/wp-content/themes/shoppingcart(?:-plus)?/" ], "description": "ShoppingCart is a WordPress theme especially build for store and ecommerce by Theme Freesia.", "website": "https://themefreesia.com/themes/shoppingcart" }, "Theme Horse Attitude": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/attitude(?:-pro)?/" ], "description": "Attitude is a simple, clean and responsive retina ready WordPress theme by Theme Horse.", "website": "https://www.themehorse.com/themes/attitude" }, "Theme Horse NewsCard": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/newscard(?:-pro)?/" ], "description": "NewsCard is a multi-purpose magazine/news WordPress theme by Theme Horse.", "website": "https://www.themehorse.com/themes/newscard" }, "Theme Vision Agama": { "cats": [ 80 ], "js": [ "agama", "agama_pro" ], "scriptSrc": [ "/wp-content/themes/agama(?:-pro)?/.+functions\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Agama is a free multi-purpose WordPress theme by Theme Vision.", "website": "https://theme-vision.com/agama" }, "Theme4Press Evolve": { "cats": [ 80 ], "js": [ "evolve_js_local_vars" ], "scriptSrc": [ "/wp-content/themes/evolve(?:-plus)?/" ], "description": "Theme4Press Evolve is an multipurpose and minimal WordPress theme.", "website": "https://theme4press.com/evolve-multipurpose-wordpress-theme" }, "ThemeGrill Accelerate": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/accelerate(?:-pro)?/" ], "description": "ThemeGrill Accelerate is free minimal WordPress theme.", "website": "https://themegrill.com/themes/accelerate" }, "ThemeGrill Cenote": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/cenote(?:-pro)?/" ], "description": "ThemeGrill Cenote is a creative blogging WordPress theme, fully compatible with WooCommerce and popular page builders.", "website": "https://themegrill.com/themes/cenote" }, "ThemeGrill ColorMag": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/colormag(?:-pro)?/" ], "description": "ThemeGrill ColorMag is most popular magazine-newspaper style WordPress theme.", "website": "https://themegrill.com/themes/colormag" }, "ThemeGrill Flash": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/flash(?:-pro)?/" ], "description": "ThemeGrill Flash is one of the most flexible multipurpose WordPress themes.", "website": "https://themegrill.com/themes/flash" }, "ThemeGrill Radiate": { "cats": [ 80 ], "js": [ "radiatescriptparam" ], "scriptSrc": [ "/wp-content/themes/radiate(?:-pro)?/" ], "description": "ThemeGrill Radiate is a simple and minimal WordPress theme focused on blogging.", "website": "https://themegrill.com/themes/radiate" }, "ThemeGrill Spacious": { "cats": [ 80 ], "js": [ "spacious_slider_value" ], "scriptSrc": [ "/wp-content/themes/spacious(?:-pro)?/" ], "description": "ThemeGrill Spacious is beautiful small to medium business responsive WordPress theme.", "website": "https://themegrill.com/themes/spacious" }, "ThemeGrill eStore": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/e(?:s|s)tore(?:-pro)?/" ], "meta": { "generator": [ "estore v\\.([\\d\\.]+)\\;version:\\1" ] }, "implies": [ "Cart Functionality" ], "description": "ThemeGrill eStore is one of the most popular WooCommerce integrated WordPress themes.", "website": "https://themegrill.com/themes/estore" }, "ThemeIsle Menu Icons": { "cats": [ 87 ], "description": "ThemeIsle Menu Icons plugin gives you the ability to add icons to your menu items, similar to the look of the latest dashboard menu.", "website": "https://wordpress.org/plugins/menu-icons" }, "ThemeZee Donovan": { "cats": [ 80 ], "js": [ "donovan_menu_title", "donovanscreenreadertext" ], "scriptSrc": [ "/wp-content/themes/donovan/" ], "description": "ThemeZee Donovan is a flexible, yet easy-to-use blogging WordPress theme.", "website": "https://themezee.com/themes/donovan" }, "ThemeZee Poseidon": { "cats": [ 80 ], "js": [ "poseidonscreenreadertext" ], "scriptSrc": [ "/wp-content/themes/poseidon/" ], "description": "ThemeZee Poseidon is an elegant designed WordPress theme featuring a splendid fullscreen image slideshow.", "website": "https://themezee.com/themes/poseidon" }, "ThemeZee Wellington": { "cats": [ 80 ], "js": [ "wellingtonscreenreadertext" ], "scriptSrc": [ "/wp-content/themes/wellington/" ], "description": "Wellington is a clean and simple magazine WordPress theme by ThemeZee.", "website": "https://themezee.com/themes/wellington" }, "Themeansar Newsberg": { "cats": [ 80 ], "description": "Themeansar Newsberg is a fast, clean, modern-looking, responsive news magazine WordPress theme.", "website": "https://themeansar.com/free-themes/newsberg" }, "Themeansar Newsup": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/newsup(?:-pro)?/" ], "description": "Themeansar Newsup is a fast, clean, modern-looking responsive news magazine WordPress theme.", "website": "https://themeansar.com/free-themes/newsup" }, "Themebeez Cream Magazine": { "cats": [ 80 ], "js": [ "cream_magazine_script_obj" ], "description": "Cream Magazine is a news and magazine WordPress theme by Themebeez.", "website": "https://themebeez.com/themes/cream-magazine" }, "Themebeez Orchid Store": { "cats": [ 80 ], "js": [ "orchid_store_obj" ], "scriptSrc": [ "/wp-content/themes/orchid-store(?:-child)?/.+bundle\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Orchid Store is a clean, flexible, stylish and dynamic ecommerce WordPress theme by Themebeez.", "website": "https://themebeez.com/themes/orchid-store" }, "Themegraphy Graphy": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/graphy(?:-pro)?/" ], "description": "Themegraphy Graphy is now compatible with WordPress 5.0 and Gutenberg blog-oriented WordPress theme.", "website": "https://themegraphy.com/wordpress-themes/graphy" }, "Themes4Wp Bulk": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/bulk(?:-pro)?/.+customscript\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Themes4Wp Bulk is a modern and responsive multipurpose WordPress theme.", "website": "https://themes4wp.com/theme/bulk" }, "ThemezHut Bam": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/bam(?:-pro)?/" ], "description": "ThemezHut Bam is a great flexible WordPress theme for blogging sites.", "website": "https://themezhut.com/themes/bam" }, "ThemezHut HitMag": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/hitmag(?:-pro)?/" ], "description": "ThemezHut HitMag is a stylish and powerful WordPress theme crafted for magazines, newspapers or personal blogs.", "website": "https://themezhut.com/themes/hitmag" }, "Themonic Iconic One": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/iconic-one(?:-[\\w]+)?/" ], "description": "Themonic Iconic One is a premium quality WordPress theme with pixel perfect typography and responsiveness and is built for speed.", "website": "https://themonic.com/iconic-one" }, "Thesis": { "cats": [ 10 ], "js": [ "thix.history", "thix.t" ], "scriptSrc": [ "thix\\.ttsep\\.com/" ], "description": "Thesis is a conversion rate optimisation company.", "website": "https://www.thesistesting.com" }, "ThimPress Course Review": { "cats": [ 87 ], "description": "Course Review is a WordPress plugin by ThimPress. Course Review gives students the opportunity to evaluate and provide feedback in order to improve the course.", "website": "https://wordpress.org/plugins/learnpress-course-review" }, "ThimPress Course Wishlist": { "cats": [ 87 ], "description": "Course Wishlist is a WordPress plugin by ThimPress. Course Wishlist bring wishlist feature for LearnPress.", "website": "https://wordpress.org/plugins/learnpress-wishlist" }, "ThimPress Gradebook": { "cats": [ 87 ], "description": "Gradebook is a WordPress plugin by ThimPress. Gradebook add-on for LearnPress makes it easier to track the students learning progress and result.", "website": "https://thimpress.com/product/gradebook-add-on-for-learnpress" }, "ThimPress LearnPress": { "cats": [ 87, 21 ], "scriptSrc": [ "/wp-content/plugins/learnpress/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "LearnPress is a WordPress LMS plugin by ThimPress.", "website": "https://wordpress.org/plugins/learnpress" }, "Thimatic": { "cats": [ 90, 100 ], "scriptSrc": [ "thimatic-apps\\.com/product_review/.*?v=([\\d.]+)\\;version:\\1" ], "description": "Thimatic is a Shopify app for product reviews.", "website": "https://thimatic-apps.com/" }, "Think Up Themes Consulting": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/consulting(?:-pro)?/" ], "description": "Think Up Themes Consulting is a multipurpose WordPress theme that is available for free download and also offers a pro version.", "website": "https://www.thinkupthemes.com/themes/consulting" }, "Think Up Themes Minamaze": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/minamaze(?:-pro)?/" ], "description": "Think Up Themes Minamaze is a multipurpose WordPress theme that is available for free download and also offers a pro version.", "website": "https://www.thinkupthemes.com/themes/minamaze" }, "ThinkPHP": { "cats": [ 18 ], "cookies": { "thinkphp_show_page_trace": "" }, "headers": { "x-powered-by": "thinkphp" }, "implies": [ "PHP" ], "description": "ThinkPHP is an open-source PHP framework with MVC structure developed and maintained by Shanghai Topthink Company.", "website": "https://www.thinkphp.cn", "cpe": "cpe:2.3:a:thinkphp:thinkphp:*:*:*:*:*:*:*:*" }, "Thinkific": { "cats": [ 21 ], "cookies": { "_thinkific_session": "" }, "js": [ "thinkific", "thinkificanalytics" ], "scriptSrc": [ "cdn(?:-themes)?\\.thinkific\\.com" ], "description": "Thinkific is a software platform that enables entrepreneurs to create, market, sell, and deliver their own online courses.", "website": "https://www.thinkific.com" }, "ThreatMetrix": { "cats": [ 16, 83 ], "scriptSrc": [ "\\.online-metrix\\.net" ], "description": "LexisNexis ThreatMetrix is an enterprise solution for online risk and fraud protection ('digital identity intelligence and digital authentication').", "website": "https://risk.lexisnexis.com/products/threatmetrix" }, "Three.js": { "cats": [ 25 ], "js": [ "__three__", "three.revision" ], "scriptSrc": [ "three(?:\\.min)?\\.js" ], "description": "Three.js is a cross-browser JavaScript library and application programming interface used to create and display animated 3D computer graphics in a web browser using WebGL.", "website": "https://threejs.org" }, "Threekit": { "cats": [ 105, 95 ], "js": [ "threekit.configuratorform", "threekitar", "threekitplayer" ], "description": "Threekit is a visual customer experience solution that enables brands to create, manage and scale photorealistic images and 3D product visuals, all from a single design file.", "website": "https://www.threekit.com" }, "Thrive Apprentice": { "cats": [ 87, 21 ], "scriptSrc": [ "/wp-content/plugins/thrive-apprentice/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Apprentice is a WordPress plugin for creating online courses and also a membership plugin.", "website": "https://thrivethemes.com/apprentice/" }, "Thrive Architect": { "cats": [ 87, 51 ], "scriptSrc": [ "/wp-content/plugins/thrive-visual-editor/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Architect is the visual page builder for WordPress.", "website": "https://thrivethemes.com/architect/" }, "Thrive Comments": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/thrive-comments/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Comments plugin replaces the standard WordPress comments from your website.", "website": "https://thrivethemes.com/comments/" }, "Thrive Leads": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/thrive-leads/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Leads is an all-in-one email list building plugin for WordPress.", "website": "https://thrivethemes.com/leads/" }, "Thrive Quiz Builder": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/thrive-quiz-builder/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Quiz Builder is a powerful WordPress plugin that can help you to create quizzes for your website or blog.", "website": "https://thrivethemes.com/quizbuilder" }, "Thrive Ultimatum": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/thrive-ultimatum/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Thrive Ultimatum is a WordPress scarcity marketing plugin with built-in templates and campaign tracking tools from developer Thrive Themes.", "website": "https://thrivethemes.com/ultimatum/" }, "ThriveCart": { "cats": [ 6 ], "js": [ "thrivecart" ], "scriptSrc": [ "thrivecart\\.js" ], "description": "ThriveCart is a sales cart solution that lets you create checkout pages for your online products and services.", "website": "https://thrivecart.com" }, "Ticimax": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.ticimax\\.com/" ], "website": "https://www.ticimax.com" }, "Tictail": { "cats": [ 6 ], "html": [ "\u003clink[^\u003e]*tictail\\.com" ], "website": "https://tictail.com" }, "TiddlyWiki": { "cats": [ 1, 2, 4, 8 ], "js": [ "tiddler" ], "html": [ "\u003c[^\u003e]*type=[^\u003e]text\\/vnd\\.tiddlywiki" ], "meta": { "application-name": [ "^tiddlywiki$" ], "copyright": [ "^tiddlywiki created by jeremy ruston" ], "generator": [ "^tiddlywiki$" ], "tiddlywiki-version": [ "^(.+)$\\;version:\\1" ] }, "description": "TiddlyWiki is an open-source notebook for capturing, organising and sharing complex information.", "website": "https://tiddlywiki.com" }, "Tidio": { "cats": [ 52 ], "js": [ "tidiochatapi" ], "scriptSrc": [ "code\\.tidio\\.co" ], "description": "Tidio is a customer communication product. It provides multi-channel support so users can communicate with customers on the go. Live chat, messenger, or email are all supported.", "website": "https://www.tidio.com" }, "Tiendanube": { "cats": [ 6 ], "js": [ "ls.store.url" ], "description": "Tiendanube is an ecommerce platform.", "website": "https://www.tiendanube.com" }, "Tiiny Host": { "cats": [ 62 ], "scriptSrc": [ "(?://|\\.)tiiny\\.(?:host|site)/" ], "description": "Tiiny Host is a web hosting service for static sites with support for custom domains, SSL, password protection, and built-in analytics.", "website": "https://tiiny.host" }, "TikTok Pixel": { "cats": [ 10 ], "js": [ "tiktokanalyticsobject" ], "website": "https://ads.tiktok.com" }, "Tiki Wiki CMS Groupware": { "cats": [ 1, 2, 8, 11, 13 ], "scriptSrc": [ "(?:/|_)tiki" ], "meta": { "generator": [ "^tiki" ] }, "description": "Tiki Wiki is a free and open-source wiki-based content management system and online office suite written primarily in PHP.", "website": "https://tiki.org" }, "Tiktak Pro": { "cats": [ 6 ], "meta": { "author": [ "^tiktak-themes$" ] }, "description": "Tiktak Pro is an all-in-one ecommerce platform from Tunisia.", "website": "https://tiktakpro.tn" }, "Tilda": { "cats": [ 1 ], "html": [ "\u003clink[^\u003e]* href=[^\u003e]+tilda(?:cdn|\\.ws|-blocks)" ], "scriptSrc": [ "tilda(?:cdn|\\.ws|-blocks)" ], "description": "Tilda is a web design tool.", "website": "https://tilda.cc" }, "Tiledesk": { "cats": [ 52 ], "js": [ "tiledesk", "tiledesk", "tiledeskasyncinit", "tiledesksettings" ], "description": "Tiledesk is the full-stack open-source Live Chat with built-in Chatbots, written in Node.js and Angular.", "website": "https://tiledesk.com" }, "Timeplot": { "cats": [ 25 ], "js": [ "timeplot" ], "scriptSrc": [ "timeplot.*\\.js" ], "website": "https://www.simile-widgets.org/timeplot/" }, "Timify": { "cats": [ 72 ], "js": [ "timifywidget" ], "scriptSrc": [ "\\.timify\\.com/" ], "description": "Timify is an online scheduling and resource management software for small, medium and large businesses.", "website": "https://www.timify.com" }, "Tiny Slider": { "cats": [ 59 ], "scriptSrc": [ "(?:/([\\d\\.]+)/min/)?tiny-slider(?:\\.min)?\\.js\\;version:\\1" ], "description": "Tiny Slider is a vanilla javascript slider for all purposes.", "website": "https://github.com/ganlanyuan/tiny-slider" }, "TinyMCE": { "cats": [ 24 ], "js": [ "tinymce", "tinymce.majorversion" ], "scriptSrc": [ "/tiny_?mce(?:\\.min)?\\.js" ], "description": "TinyMCE is an online rich-text editor released as open-source software. TinyMCE is designed to integrate with JavaScript libraries, Vue.js, and AngularJS as well as content management systems such as Joomla!, and WordPress.", "website": "https://www.tiny.cloud/tinymce/", "cpe": "cpe:2.3:a:tiny:tinymce:*:*:*:*:*:*:*:*" }, "Tinybird": { "cats": [ 10 ], "js": [ "tinybird" ], "scriptSrc": [ "\\.tinybird.co/js/index\\.js" ], "description": "Tinybird is a cloud-native data processing platform that allows developers and data teams to build real-time data pipelines and perform complex data transformations and analysis at scale.", "website": "https://www.tinybird.co/" }, "Tippy.js": { "cats": [ 59 ], "js": [ "tippy.defaultprops" ], "scriptSrc": [ "/tippy\\.js(?:@|/)?([\\d\\.]+)?\\;version:\\1" ], "description": "Tippy.js is the complete tooltip, popover, dropdown, and menu solution for the web, powered by Popper.", "website": "https://atomiks.github.io/tippyjs" }, "Tipsa": { "cats": [ 99 ], "description": "TIPSA is a parcel delivery company in Spain, Portugal and Andorra.", "website": "https://www.tip-sa.com" }, "Tiqets": { "cats": [ 5, 71 ], "js": [ "__tiqets_loader_reinit" ], "description": "Tiqets provides a complete overview of a city - museums, attractions, zoos, canal cruises, concerts. Publishers joined to the Tiqets affiliate program can receive 6% commission during our 30-day cookie window from completed total bookings resulting from featuring links to Tiqets products and content across their brand: blog/website, social media, newsletters, etc.", "website": "https://www.tiqets.com/affiliate" }, "Tistory": { "cats": [ 1, 11 ], "js": [ "tistoryblog" ], "description": "Tistory is a South Korean blog-publishing service that allows private or multi-user blogs.", "website": "https://tistory.com" }, "Titan": { "cats": [ 36 ], "js": [ "titan", "titanenabled" ], "website": "https://titan360.com" }, "Tolt": { "cats": [ 71 ], "js": [ "tolt_referral", "toltapi", "toltio" ], "scriptSrc": [ "\\.tolt\\.io/" ], "description": "Tolt is an affiliate marketing software designed for SaaS startups.", "website": "https://tolt.io" }, "TomTom Maps": { "cats": [ 35 ], "js": [ "tomtom.map" ], "scriptSrc": [ "api\\.tomtom\\.com" ], "description": "TomTom Maps is a web mapping service.", "website": "https://www.tomtom.com" }, "TomatoCart": { "cats": [ 6 ], "js": [ "ajaxshoppingcart" ], "meta": { "generator": [ "tomatocart" ] }, "website": "https://tomatocart.com" }, "TornadoServer": { "cats": [ 22 ], "headers": { "server": "tornadoserver(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://tornadoweb.org" }, "TotalCode": { "cats": [ 6 ], "headers": { "x-powered-by": "^totalcode$" }, "website": "https://www.totalcode.com" }, "Totango": { "cats": [ 97 ], "js": [ "totango", "totangoloader" ], "scriptSrc": [ "\\.amazonaws\\.com/totango-cdn/totango\\d\\.js", "\\.totango\\.com/totango([\\d\\.]+)\\.js\\;version:\\1" ], "description": "Totango is a customer success platform that helps recurring revenue businesses simplify the complexities of customer success by connecting the dots of customer data, actively monitoring customer health changes, and driving proactive engagements.", "website": "https://www.totango.com" }, "Totara": { "cats": [ 21 ], "cookies": { "totarasession": "" }, "description": "Totara is a learning management system designed for businesses.", "website": "https://www.totaralearning.com" }, "Touch2Success": { "cats": [ 6 ], "meta": { "content": [ "^touch2success$" ] }, "description": "Touch2Success is a fully featured restaurant POS software designed to serve startups, enterprises.", "website": "https://www.touch2success.com" }, "TownNews": { "cats": [ 1 ], "js": [ "tncms", "tnstats_tracker", "tntracker" ], "headers": { "x-tncms": "" }, "description": "TownNews is a CMS platform built for local media organizations.", "website": "https://townnews.com/" }, "Trac": { "cats": [ 13 ], "html": [ "\u003ca id=\"tracpowered", "powered by \u003ca href=\"[^\"]*\"\u003e\u003cstrong\u003etrac(?:[ /]([\\d.]+))?\\;version:\\1" ], "implies": [ "Python" ], "website": "https://trac.edgewall.org" }, "TrackJs": { "cats": [ 10 ], "js": [ "trackjs", "trackjs" ], "scriptSrc": [ "cdn\\.trackjs\\.com" ], "description": "TrackJS is an error monitoring agent for production web sites and applications.", "website": "https://trackjs.com" }, "Trackify X": { "cats": [ 100, 10 ], "scriptSrc": [ "trackifyx\\.redretarget\\.com/" ], "implies": [ "Shopify" ], "description": "Trackify X is a pixel engine that helps merchants backup their pixel data and manage multiple pixels.", "website": "https://trackifyapp.com" }, "Tradedoubler": { "cats": [ 71 ], "scriptSrc": [ "swrap\\.tradedoubler\\.com" ], "description": "Tradedoubler is a global affiliate marketing network.", "website": "https://www.tradedoubler.com/" }, "TradingView": { "cats": [ 25 ], "description": "TradingView is used to show world chart, chats and trades markets.", "website": "https://www.tradingview.com" }, "Traek": { "cats": [ 10 ], "js": [ "traek" ], "description": "Traek is a website insights, analytics and lead generation tool.", "website": "https://www.traek.io" }, "TrafficStars": { "cats": [ 36 ], "scriptSrc": [ "\\.tsyndicate\\.com/" ], "description": "TrafficStars is a self-served ad network and ad exchange that operates mainly in adult-related verticals.", "website": "https://trafficstars.com" }, "Transcend": { "cats": [ 67 ], "js": [ "transcend" ], "description": "Transcend is data privacy management compliance platform.", "website": "https://www.transcend.io" }, "Transcy": { "cats": [ 89, 100 ], "js": [ "_transcy", "transcy_apiuri", "transcy_shopifylocales" ], "implies": [ "Shopify" ], "description": "Transcy is a Shopify translation app. Transcy allows you to translate your whole store content into target languages to reach different nation shoppers.", "website": "https://transcy.io" }, "Transifex": { "cats": [ 12 ], "js": [ "transifex.live.lib_version" ], "website": "https://www.transifex.com" }, "Transistor.fm": { "cats": [ 5 ], "description": "Transistor.fm is a podcast host, distribution and management platform.", "website": "https://transistor.fm" }, "Translate WordPress": { "cats": [ 87, 89 ], "scriptSrc": [ "/wp-content/plugins/google-language-translator/.+scripts\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Translate WordPress is a website translator plugin which can translate any website to any language automatically. Translate WordPress plugin is now a part of GTranslate family.", "website": "https://gtranslate.io" }, "Transmart": { "cats": [ 99 ], "description": "Transmart is a shipping company in Turkey.", "website": "https://transmartshipping.com" }, "Tray": { "cats": [ 6 ], "scriptSrc": [ "tcdn\\.com\\.br" ], "description": "Tray is an all-in-one ecommerce platform from Brazil.", "website": "https://www.tray.com.br" }, "Trbo": { "cats": [ 74, 76 ], "cookies": { "trbo_session": "^(?:[\\d]+)$", "trbo_usr": "^(?:[\\d\\w]+)$" }, "js": [ "_trbo", "_trbo_start", "_trboq" ], "scriptSrc": [ "\\.trbo\\.com" ], "description": "Trbo is a personalisation, recommendations, A/B testing platform from Germany.", "website": "https://www.trbo.com" }, "Treasure Data": { "cats": [ 97 ], "js": [ "treasure.version" ], "scriptSrc": [ "cdn\\.treasuredata\\.com/" ], "description": "Treasure Data is the only enterprise customer data platform.", "website": "https://www.treasuredata.com" }, "Trengo": { "cats": [ 52 ], "js": [ "trengo.eventbus" ], "scriptSrc": [ "\\.widget\\.trengo\\.eu/" ], "description": "Trengo is an omnichannel communication platform that unifies all messaging channels into one single view.", "website": "https://trengo.com" }, "Triggerbee": { "cats": [ 76, 10 ], "js": [ "triggerbee" ], "scriptSrc": [ "t\\.myvisitors\\.se" ], "description": "Triggerbee is an onsite personalisation platform that lets you use customer and behavioral data to build and launch personalised campaigns.", "website": "https://triggerbee.com" }, "Trinity Audio": { "cats": [ 5 ], "js": [ "trinity_display", "trinity_player" ], "scriptSrc": [ "//trinitymedia\\.ai/" ], "description": "Trinity Audio's AI-driven solutions help publishers and content creators create a world of smart audio experiences for their audiences, covering every stage of the audio journey from creation to distribution.", "website": "https://www.trinityaudio.ai" }, "Tripadviser.Widget": { "cats": [ 5 ], "scriptSrc": [ "tripadvisor\\.[\\w]+/widgetembed" ], "description": "Tripadvisor embed reviews widget.", "website": "https://www.tripadvisor.com/Widgets" }, "Triple Whale": { "cats": [ 10 ], "description": "The Triple Whale platform combines centralization, visualization, and attribution into a dashboard that presents and illustrates KPIs in an actionable way.", "website": "https://triplewhale.com/" }, "TripleLift": { "cats": [ 36 ], "description": "TripleLift is an advertising technology company providing native programmatic to buyers and sellers.", "website": "https://triplelift.com" }, "Tritac Katana Commerce": { "cats": [ 6 ], "meta": { "powered-by": [ "^katana\\scommerce$" ] }, "description": "Katana Commerce is Tritac's B2B and B2C ecommerce platform.", "website": "https://www.tritac.com/nl/producten/katana-commerce/" }, "Trix": { "cats": [ 24 ], "js": [ "trix.version" ], "description": "Trix is an open-source project from Basecamp, the creators of Ruby on Rails.", "website": "https://trix-editor.org" }, "Trove Recommerce": { "cats": [ 6 ], "headers": { "x-trove-app-name": "", "x-trove-country-code": "", "x-trove-order-uuid": "", "x-yerdle-app-name": "" }, "description": "Trove (formerly Yerdle) builds white-label technology and end-to-end operations for ecommerce platforms.", "website": "https://trove.co" }, "TruValidate": { "cats": [ 16, 83 ], "scriptSrc": [ "ci-mpsnare\\.iovation\\.com", "mpsnare\\.iesnare\\.com" ], "description": "TransUnion TruValidate (previously ReputationShield/IDVision from iovation) is an online risk and fraud detection platform.", "website": "https://www.transunion.com/solution/truvalidate" }, "True Fit": { "cats": [ 76 ], "scriptSrc": [ "cdn\\.truefitcorp\\.com/(?:.+/([\\d\\.]+))?\\;version:\\1" ], "description": "True Fit is a data-driven personalisation platform for footwear and apparel retailers.", "website": "https://www.truefit.com" }, "TrueCommerce": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.nexternal\\.com/" ], "description": "TrueCommerce is an eCommerce platform.", "website": "https://www.truecommerce.com" }, "Truepush": { "cats": [ 32 ], "js": [ "truepush", "truepushversioninfo.key" ], "description": "Truepush is web-based push notification service available for PWA, AMP, WordPress, and Shopify.", "website": "https://www.truepush.com" }, "Trumba": { "cats": [ 72 ], "js": [ "$trumba", "$trumba.version", "trumba" ], "description": "Trumba offers web-hosted event calendar software for publishing online, interactive, calendars of events.", "website": "https://www.trumba.com" }, "Trunkrs": { "cats": [ 99 ], "description": "Trunkrs is a Dutch parcel delivery service.", "website": "https://trunkrs.nl" }, "TrustArc": { "cats": [ 67 ], "scriptSrc": [ "consent\\.trustarc\\.com" ], "description": "TrustArc provides software and services to help corporations update their privacy management processes so they comply with government laws and best practices.", "website": "https://trustarc.com" }, "TrustYou": { "cats": [ 5 ], "description": "TrustYou is guest feedback and hotel reputation software company located in Germany.", "website": "https://www.trustyou.com" }, "Trusted Shops": { "cats": [ 90 ], "scriptSrc": [ "widgets\\.trustedshops\\.com/" ], "description": "Trusted Shops is a company that acts as a 3'rd party representing the common interests of both consumers and retailers.", "website": "https://www.trustedshops.co.uk" }, "Trustindex": { "cats": [ 90 ], "js": [ "trustindex" ], "description": "Trustindex is a review management tool that helps businesses effectively manage and monitor customer reviews.", "website": "https://www.trustindex.io" }, "Trustpilot": { "cats": [ 90 ], "js": [ "trustpilot" ], "scriptSrc": [ "\\.trustpilot\\.com" ], "description": "Trustpilot is a Danish consumer review website which provide embed stand-alone applications in your website to show your most recent reviews, TrustScore, and star ratings.", "website": "https://business.trustpilot.com" }, "Trustspot": { "cats": [ 90 ], "js": [ "trustspot_key" ], "scriptSrc": [ "trustspot\\.io" ], "description": "TrustSpot provides a solution to capture ratings \u0026 reviews, video testimonials, photos, social experiences, and product Q\u0026A.", "website": "https://trustspot.io/" }, "Trustvox": { "cats": [ 90 ], "js": [ "_trustvox", "_trustvox_colt", "_trustvox_shelf_rate", "trustvox_id", "trustvoxcertificatewidget", "trustvoxrateswidget" ], "description": "Trustvox collects reviews from customers who purchased ecommerce products and publishes them on product pages with Sincerity Seals.", "website": "https://site.trustvox.com.br" }, "TryNow": { "cats": [ 91 ], "js": [ "trynowcheckout", "trynowconfig" ], "scriptSrc": [ "\\.trynow\\.net/shopify/([\\d\\.]+)/\\;version:\\1" ], "description": "TryNow is an ecommerce platform designed to offer a try before you buy experience for shoppers.", "website": "https://www.trynow.io" }, "Tumblr": { "cats": [ 11 ], "headers": { "x-tumblr-user": "" }, "html": [ "\u003ciframe src=\"[^\u003e]+tumblr\\.com" ], "description": "Tumblr is a microblogging and social networking website. The service allows users to post multimedia and other content to a short-form blog.", "website": "https://www.tumblr.com" }, "Turbo": { "cats": [ 92 ], "js": [ "turbo" ], "description": "Turbo is a JavaScript framework for building fast web applications.", "website": "https://turbo.hotwired.dev/" }, "Turbolinks": { "cats": [ 92 ], "js": [ "turbolinks" ], "scriptSrc": [ "turolinks\\.js" ], "description": "Turbolinks is a Rails feature, available as a gem and enabled by default in new Rails apps. It is intended to speed up navigating between pages of your application.", "website": "https://github.com/turbolinks/turbolinks" }, "TurfJS": { "cats": [ 59 ], "js": [ "turf.feature", "turf.point", "turf.random" ], "scriptSrc": [ "(turf@[\\d.]+)?/?turf\\.min\\.js" ], "description": "Turf is a modular geospatial engine written in JavaScript.", "website": "https://turfjs.org/" }, "Twenty Eleven": { "cats": [ 80 ], "description": "Twenty Eleven is the default WordPress theme for 2011.", "website": "https://wordpress.org/themes/twentyeleven" }, "Twenty Fifteen": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentyfifteen/" ], "description": "Twenty Fifteen is the default WordPress theme for 2015.", "website": "https://wordpress.org/themes/twentyfifteen" }, "Twenty Fourteen": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentyfourteen/" ], "description": "Twenty Fourteen is the default WordPress theme for 2014.", "website": "https://wordpress.org/themes/twentyfourteen" }, "Twenty Nineteen": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentynineteen/" ], "description": "Twenty Nineteen is the default WordPress theme for 2019.", "website": "https://wordpress.org/themes/twentynineteen" }, "Twenty Seventeen": { "cats": [ 80 ], "js": [ "twentyseventeenscreenreadertext" ], "scriptSrc": [ "/wp-content/themes/twentyseventeen/" ], "description": "Twenty Seventeen is the default WordPress theme for 2017.", "website": "https://wordpress.org/themes/twentyseventeen" }, "Twenty Sixteen": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentysixteen/" ], "description": "Twenty Sixteen is the default WordPress theme for 2016.", "website": "https://wordpress.org/themes/twentysixteen" }, "Twenty Ten": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentyten/" ], "description": "Twenty Ten is the default WordPress theme for 2010.", "website": "https://wordpress.org/themes/twentyten" }, "Twenty Thirteen": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentythirteen/" ], "description": "Twenty Thirteen is the default WordPress theme for 2013.", "website": "https://wordpress.org/themes/twentythirteen" }, "Twenty Twelve": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/twentytwelve/" ], "description": "Twenty Twelve is the default WordPress theme for 2012.", "website": "https://wordpress.org/themes/twentytwelve" }, "Twenty Twenty": { "cats": [ 80 ], "js": [ "twentytwenty" ], "scriptSrc": [ "/wp-content/themes/twentytwenty/" ], "description": "Twenty Twenty is the default WordPress theme for 2020.", "website": "https://wordpress.org/themes/twentytwenty" }, "Twenty Twenty-One": { "cats": [ 80 ], "js": [ "twentytwentyonecollapsemenuonclickoutside", "twentytwentyoneresponsiveembeds" ], "scriptSrc": [ "/wp-content/themes/twentytwentyone/" ], "description": "Twenty Twenty-One is the default WordPress theme for 2021.", "website": "https://wordpress.org/themes/twentytwentyone" }, "Twenty Twenty-Three": { "cats": [ 80 ], "description": "Twenty Twenty-Three is the default WordPress theme for 2023.", "website": "https://wordpress.org/themes/twentytwentythree" }, "Twenty Twenty-Two": { "cats": [ 80 ], "description": "Twenty Twenty-Two is the default WordPress theme for 2022.", "website": "https://wordpress.org/themes/twentytwentytwo" }, "TwicPics": { "cats": [ 31, 59 ], "headers": { "server": "^twicpics/\\d+\\.\\d+\\.\\d+$" }, "scriptSrc": [ ".+\\.twic\\.pics" ], "description": "TwicPics offers on-demand responsive image generation.", "website": "https://www.twicpics.com" }, "Twik": { "cats": [ 76 ], "js": [ "twik_id" ], "scriptSrc": [ "cdn\\.twik\\.io" ], "description": "Twik provides a automated, no-configuration business intelligence \u0026 personalization automation engine.", "website": "https://www.twik.io/" }, "Twikoo": { "cats": [ 15 ], "js": [ "twikoo.version" ], "scriptSrc": [ "/twikoo/dist/twikoo\\.all\\.min\\.js" ], "description": "Twikoo is a simple, safe, free comment system.", "website": "https://twikoo.js.org" }, "Twilight CMS": { "cats": [ 1 ], "headers": { "x-powered-cms": "twilight cms" }, "website": "https://www.twilightcms.com" }, "Twilio Authy": { "cats": [ 69 ], "js": [ "authy" ], "description": "Twilio Authy provides Two-factor authentication (2FA) adds an additional layer of protection beyond passwords.", "website": "https://authy.com" }, "TwistPHP": { "cats": [ 18 ], "headers": { "x-powered-by": "twistphp" }, "implies": [ "PHP" ], "website": "https://twistphp.com" }, "TwistedWeb": { "cats": [ 22 ], "headers": { "server": "twistedweb(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://twistedmatrix.com/trac/wiki/TwistedWeb" }, "Twitch Player": { "cats": [ 14 ], "js": [ "twitch.player" ], "description": "Twitch is an American video live streaming service that focuses on video game live streaming, including broadcasts of esports competitions.", "website": "https://dev.twitch.tv/docs/embed/video-and-clips/" }, "Twitter": { "cats": [ 5 ], "scriptSrc": [ "//platform\\.twitter\\.com/widgets\\.js" ], "description": "Twitter is a 'microblogging' system that allows you to send and receive short posts called tweets.", "website": "https://twitter.com" }, "Twitter Ads": { "cats": [ 36 ], "js": [ "twttr" ], "scriptSrc": [ "static\\.ads-twitter\\.com/uwt\\.js" ], "description": "Twitter Ads is an advertising platform for Twitter 'microblogging' system.", "website": "https://ads.twitter.com" }, "Twitter Analytics": { "cats": [ 10 ], "scriptSrc": [ "analytics\\.twitter\\.com" ], "description": "Twitter Analytics is a built-in data-tracking platform that shows you insights specific to your Twitter account and activity.", "website": "https://analytics.twitter.com" }, "Twitter Emoji (Twemoji)": { "cats": [ 17 ], "js": [ "twemoji", "twemoji.base" ], "scriptSrc": [ "twemoji(?:\\.min)?\\.js" ], "description": "Twitter Emoji is a set of open-source emoticons and emojis for Twitter, TweetDeck, and also for Android and iOS versions of the application.", "website": "https://twitter.github.io/twemoji/" }, "Twitter Flight": { "cats": [ 12 ], "js": [ "flight" ], "implies": [ "jQuery" ], "website": "https://flightjs.github.io/" }, "Twitter typeahead.js": { "cats": [ 59 ], "js": [ "typeahead" ], "scriptSrc": [ "(?:typeahead|bloodhound)\\.(?:jquery|bundle)?(?:\\.min)?\\.js" ], "implies": [ "jQuery" ], "website": "https://twitter.github.io/typeahead.js" }, "TypeDoc": { "cats": [ 4 ], "implies": [ "TypeScript" ], "description": "TypeDoc is an API documentation generator for TypeScript projects.", "website": "https://typedoc.org" }, "TypePad": { "cats": [ 11 ], "meta": { "generator": [ "typepad" ] }, "description": "Typepad is a blog hosting service.", "website": "https://www.typepad.com" }, "TypeScript": { "cats": [ 27 ], "description": "TypeScript is an open-source language which builds on JavaScript by adding static type definitions.", "website": "https://www.typescriptlang.org" }, "Typecho": { "cats": [ 11 ], "js": [ "typechocomment" ], "meta": { "generator": [ "typecho( [\\d.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Typecho is a PHP Blogging Platform.", "website": "https://typecho.org/" }, "Typeform": { "cats": [ 73 ], "js": [ "tf.createpopover", "tf.createwidget" ], "scriptSrc": [ "embed\\.typeform\\.com/" ], "description": "Typeform is a Spanish online software as a service (SaaS) company that specialises in online form building and online surveys.", "website": "https://www.typeform.com" }, "Typekit": { "cats": [ 17 ], "js": [ "typekit.config.js" ], "html": [ "\u003clink [^\u003e]*href=\"[^\"]+use\\.typekit\\.(?:net|com)" ], "scriptSrc": [ "use\\.typekit\\.com" ], "description": "Typekit is an online service which offers a subscription library of fonts.", "website": "https://typekit.com" }, "Typof": { "cats": [ 6 ], "cookies": { "typof_session": "\\;confidence:50" }, "scriptSrc": [ "portal/js/typof\\.js\\;confidence:50" ], "description": "Typof is an ecommerce platform for artisans that allows to create a premium website and sell items directly to the consumer.", "website": "https://typof.com" }, "Tyslo EasySell": { "cats": [ 100 ], "js": [ "opentysloform", "tysloapplydiscount", "tysloconfigversion", "tysloeasysellconfig" ], "implies": [ "Shopify" ], "description": "Tyslo EasySell replaces default Shopify checkout process by embedding (or popup) a simple order form on the product or cart page.", "website": "https://tyslo.com" }, "U-KOMI": { "cats": [ 90 ], "js": [ "getukomislideriteminfo", "ukomiinstalikestep01" ], "description": "U-KOMI is a user generated content review marketing tool.", "website": "https://u-komi.com/en/" }, "UIKit": { "cats": [ 66 ], "html": [ "\u003c[^\u003e]+class=\"[^\"]*(?:uk-container|uk-section)" ], "scriptSrc": [ "uikit.*\\.js" ], "description": "UIKit is the framework used for developing iOS applications.", "website": "https://getuikit.com" }, "UK Mail": { "cats": [ 99 ], "description": "UK Mail is a postal service company operating in the United Kingdom.", "website": "https://www.ukmail.com" }, "UKFast": { "cats": [ 88, 62 ], "description": "UKFast is a business-to-business internet hosting company based in Manchester, UK.", "website": "https://www.ukfast.co.uk" }, "UMI.CMS": { "cats": [ 1 ], "headers": { "x-generated-by": "umi\\.cms" }, "implies": [ "PHP" ], "website": "https://www.umi-cms.ru" }, "UNIX": { "cats": [ 28 ], "headers": { "server": "unix" }, "description": "Unix is a family of multitasking, multiuser computer operating systems.", "website": "https://unix.org" }, "UPS": { "cats": [ 99 ], "description": "UPS is an American multinational shipping \u0026 receiving and supply chain management company.", "website": "https://www.ups.com" }, "USPS": { "cats": [ 99 ], "description": "The United States Postal Service (USPS) is an independent agency of the executive branch of the United States federal government responsible for providing postal service in the United States.", "website": "https://www.usps.com" }, "USWDS": { "cats": [ 66 ], "js": [ "uswdspresent" ], "scriptSrc": [ "\\buswds\\b" ], "description": "USWDS is a design system for the federal government.", "website": "https://designsystem.digital.gov" }, "Ubercart": { "cats": [ 6 ], "scriptSrc": [ "uc_cart/uc_cart_block\\.js" ], "implies": [ "Drupal" ], "website": "https://www.ubercart.org" }, "Ubiliz": { "cats": [ 5, 6 ], "js": [ "ubilizsettings" ], "description": "Ubiliz is a gift voucher ecommerce solution.", "website": "https://www.ubiliz.com" }, "Ubuntu": { "cats": [ 28 ], "headers": { "server": "ubuntu", "x-powered-by": "ubuntu" }, "description": "Ubuntu is a free and open-source operating system on Linux for the enterprise server, desktop, cloud, and IoT.", "website": "https://www.ubuntu.com/server", "cpe": "cpe:2.3:o:canonical:ubuntu_linux:*:*:*:*:*:*:*:*" }, "Ueeshop": { "cats": [ 6 ], "js": [ "ueeshop_config" ], "description": "Ueeshop is a ecommerce platform from China.", "website": "https://www.ueeshop.com" }, "Ultimate Addons for Elementor": { "cats": [ 87 ], "js": [ "uael_particles_script.particles_url" ], "implies": [ "Elementor" ], "description": "Ultimate Addons for Elementor is a plugin that adds new widgets and modules to the Elementor page builder for WordPress, providing additional design options and functionality.", "website": "https://ultimateelementor.com" }, "Ultimate Bulletin Board": { "cats": [ 2 ], "meta": { "generator": [ "^ubb\\.threads\\s([\\d\\.]+)$\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "Ultimate Bulletin Board is an internet forum software designed for online communities, offering features such as user registration, thread organisation, moderation tools, search functionality, and customisable design options to facilitate discussions and community engagement.", "website": "https://www.ubbcentral.com" }, "Ultimate GDPR \u0026 CCPA": { "cats": [ 67, 87 ], "js": [ "ct_ultimate_gdpr_cookie" ], "description": "Ultimate GDPR \u0026 CCPA is a compliance toolkit for WordPress by createIT", "website": "https://www.createit.com/gdpr" }, "UltimatelySocial": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/ultimate-social-media-icons/" ], "description": "Ultimately Social (Share Buttons \u0026 Sharing Icons) is a plugin that allows you to place fancy social media icons and buttons on your WordPress website.", "website": "https://www.ultimatelysocial.com" }, "UltraCart": { "cats": [ 6 ], "js": [ "uccatalog" ], "html": [ "\u003cform [^\u003e]*action=\"[^\"]*\\/cgi-bin\\/uceditor\\?(?:[^\"]*\u0026)?merchantid=[^\"]" ], "scriptSrc": [ "cgi-bin\\/ucjavascript\\?" ], "website": "https://ultracart.com" }, "Umami": { "cats": [ 10 ], "js": [ "umami" ], "scriptSrc": [ "umami\\.js" ], "description": "Umami is a self-hosted web analytics solution. It's goal is to provide a friendlier, privacy-focused alternative to Google Analytics and a free, open-sourced alternative to paid solutions.", "website": "https://umami.is/" }, "Umbraco": { "cats": [ 1 ], "cookies": { "merchello": "\\;version:7" }, "js": [ "item_info_service", "uc_image_service", "uc_item_info_service", "uc_settings", "umbraco" ], "headers": { "x-umbraco-version": "^(.+)$\\;version:\\1" }, "scripts": [ "/umbraco/api/" ], "meta": { "generator": [ "umbraco" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Umbraco is an open-source Microsoft ASP.NET based content management system.", "website": "https://umbraco.com/" }, "UmiJs": { "cats": [ 12 ], "js": [ "g_umi.version" ], "scriptSrc": [ "/umi(\\.[\\w\\d]{8})?\\.js" ], "implies": [ "Node.js" ], "description": "UmiJs is a scalable, enterprise-class frontend application framework that supports both configuration and conventional routing while maintaining functional completeness, such as dynamic routing, nested routing, and permission routing.", "website": "https://umijs.org" }, "Umso": { "cats": [ 51 ], "scripts": [ "ispriorblockingenabled\\;confidence:75" ], "description": "Umso is a website builder for Startups.", "website": "https://www.umso.com" }, "Unas": { "cats": [ 6 ], "cookies": { "unasid": "", "unasserviceproxyid": "" }, "js": [ "unas.shop", "unas_shop_url" ], "description": "Unas is an all-in-one ecommerce platform from Hungary.", "website": "https://unas.hu" }, "Unbounce": { "cats": [ 20, 51 ], "headers": { "x-unbounce-pageid": "" }, "scriptSrc": [ "ubembed\\.com" ], "description": "Unbounce is a tool to build landing pages.", "website": "https://unbounce.com" }, "Unbxd": { "cats": [ 76, 29 ], "js": [ "unbxd.version" ], "scriptSrc": [ "\\.cloudfront\\.net/unbxdanalytics\\.js", "unbxd\\.s\\d\\.amazonaws\\.com" ], "description": "Unbxd is an ecommerce product discovery platform that applies artificial intelligence and advanced data sciences to connect shoppers to the products they are most likely to buy.", "website": "https://unbxd.com" }, "Underscore.js": { "cats": [ 59 ], "js": [ "_.restarguments", "_.version" ], "scriptSrc": [ "underscore.*\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1" ], "description": "Underscore.js is a JavaScript library which provides utility functions for common programming tasks. It is comparable to features provided by Prototype.js and the Ruby language, but opts for a functional programming design instead of extending object prototypes.", "website": "https://underscorejs.org" }, "Understrap": { "cats": [ 80 ], "scriptSrc": [ "wp-content/themes/understrap(?:[masterchild-]+)?(?:[masterchild-]+)?/" ], "implies": [ "Bootstrap", "Underscore.js" ], "description": "Understrap is a renowned WordPress starter theme framework that combined Underscores and Bootstrap.", "website": "https://understrap.com" }, "UniFi OS": { "cats": [ 28 ], "js": [ "unificonstant.version" ], "description": "UniFi OS is the operating system for UniFi products, which provides a user interface.", "website": "https://www.ui.com/" }, "Uniconsent": { "cats": [ 67 ], "scriptSrc": [ "cmp\\.uniconsent\\.mgr\\.consensu\\.org/dfp\\.js" ], "website": "https://www.uniconsent.com/" }, "Unicorn Platform": { "cats": [ 1, 51 ], "js": [ "unicornplatform" ], "description": "Unicorn Platform is a drag and drop website and blog builder for startups, mobile apps, and SaaS.", "website": "https://unicornplatform.com" }, "UnoCSS": { "cats": [ 66 ], "css": [ "--un-(?:rotate|translate|space-x|text-opacity|border-opacity)" ], "description": "UnoCSS is instant on-demand Atomic CSS engine.", "website": "https://uno.antfu.me/" }, "Unpkg": { "cats": [ 31 ], "scriptSrc": [ "unpkg\\.com/" ], "description": "Unpkg is a content delivery network for everything on npm.", "website": "https://unpkg.com" }, "Unruly": { "cats": [ 36 ], "js": [ "unruly.native" ], "description": "Unruly is a video advertising platform.", "website": "https://unruly.co" }, "UpSellit": { "cats": [ 98 ], "js": [ "usi_analytics", "usi_app", "usi_commons", "usi_cookies" ], "scriptSrc": [ "www\\.upsellit\\.com/" ], "description": "UpSellit is a performance based lead and cart abandonment recovery solutions.", "website": "https://us.upsellit.com" }, "UpSolution Zephyr": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/zephyr/.+us\\.theme\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Zephyr is a WordPress theme developed by UpSolution, a software development company based in Ukraine that specialises in creating themes and plugins for WordPress.", "website": "https://zephyr.us-themes.com" }, "Upfluence": { "cats": [ 71 ], "scriptSrc": [ "\\.upfluence\\.co/" ], "description": "Upfluence is the all-in-one affiliate and influencer marketing platform for ecommerce and direct-to-consumer brands.", "website": "https://www.upfluence.com" }, "Uploadcare": { "cats": [ 31 ], "js": [ "uploadcare.version" ], "description": "Uploadcare is a complete file handling platform for online business. Receive files from you users via File Uploader or File Upload API, implement image optimization and transformations with Image CDN API, and get HIPAA-compliant storage.", "website": "https://uploadcare.com" }, "Upptime": { "cats": [ 13 ], "description": "Upptime is the open-source uptime monitor and status page, powered entirely by GitHub Actions, Issues, and Pages.", "website": "https://upptime.js.org" }, "Upserve": { "cats": [ 93 ], "scriptSrc": [ "app\\.upserve\\.com/" ], "description": "Upserve is a restaurant management solution featuring an Android or iOS-based point-of-sale system, online ordering, contactless payments, automated inventory management, sales analytics, and more.", "website": "https://onlineordering.upserve.com" }, "UptimeRobot": { "cats": [ 13 ], "headers": { "content-security-policy": "\\.uptimerobot\\.com" }, "scriptSrc": [ "\\.uptimerobot\\.com/" ], "description": "UptimeRobot is a web-based software that is designed to monitor the sites frequently to check whether any site is down owing to server problem or any bug in coding.", "website": "https://uptimerobot.com" }, "Uptrends": { "cats": [ 78, 13 ], "js": [ "utboomr.version" ], "scriptSrc": [ "\\.uptrendsdata\\.com/" ], "description": "Uptrends is a website and web performance monitoring solution.", "website": "https://www.uptrends.com" }, "Upvoty": { "cats": [ 47 ], "js": [ "upvoty" ], "implies": [ "PHP" ], "website": "https://upvoty.com" }, "UsableNet": { "cats": [ 68 ], "js": [ "enableusablenetassistive" ], "scriptSrc": [ "\\.usablenet\\.com/pt/" ], "description": "UsableNet is a technology for web accessibility and digital transformation, providing end-to-end services.", "website": "https://usablenet.com" }, "Uscreen": { "cats": [ 14 ], "js": [ "analyticshost" ], "description": "Uscreen is a CMS to monetize VOD and live content. They provide site hosting, video hosting, and a payment gateway for selling video based content.", "website": "https://uscreen.tv/" }, "User Accessibility": { "cats": [ 68 ], "scriptSrc": [ "//system\\.user-a\\.co\\.il/" ], "description": "User Accessibility is a solution incorporating automated site scanning and machine learning for future updates, while utilising JS to conform to WECAG standards for improved website and application accessibility.", "website": "https://user-a.co.il" }, "UserLike": { "cats": [ 52 ], "js": [ "__userlike_mount_guard__", "userlike", "userlikeinit" ], "scriptSrc": [ "//userlike-cdn-widgets\\.", "api\\.userlike\\.com", "userlike\\.min\\.js", "userlikelib\\.min\\.js" ], "description": "Userlike is a cloud-based live chat solution that can be integrated with existing websites.", "website": "https://userlike.com" }, "UserReport": { "cats": [ 13, 73 ], "scriptSrc": [ "\\.userreport\\.com/" ], "description": "UserReport is an online survey and feedback management platform.", "website": "https://www.userreport.com" }, "UserRules": { "cats": [ 13 ], "js": [ "_usrp" ], "website": "https://www.userrules.com" }, "UserVoice": { "cats": [ 13, 73 ], "js": [ "uservoice" ], "scriptSrc": [ "\\.uservoice\\.com/" ], "description": "UserVoice is a management to collect and analyse feedback from customers.", "website": "https://uservoice.com" }, "UserWay": { "cats": [ 68 ], "scriptSrc": [ "cdn\\.userway\\.org/widget.*\\.js" ], "description": "UserWay is a web accessibility overlay for websites that claims to improve compliance with accessibility standards.", "website": "https://userway.org/" }, "UserZoom": { "cats": [ 74, 10 ], "scriptSrc": [ "\\.userzoom\\.com/" ], "description": "UserZoom is a cloud-based user experience solution.", "website": "https://www.userzoom.com" }, "Usercentrics": { "cats": [ 67 ], "js": [ "usercentrics.appversion" ], "scriptSrc": [ "\\.usercentrics\\.eu/.+\\.js" ], "description": "Usercentrics is a SaaS enterprise solution for Consent Management (CMP) that helps enterprise customers to obtain, manage and document the user consent.", "website": "https://usercentrics.com" }, "Userflow": { "cats": [ 58 ], "js": [ "userflow.endallflows", "userflow.endchecklist", "userflowjs_queue" ], "scriptSrc": [ "\\.userflow\\.com/" ], "description": "Userflow is a user onboarding software for building product tours and onboarding checklists, tailored to your app and your users.", "website": "https://userflow.com" }, "Userpilot": { "cats": [ 58, 97 ], "js": [ "userpilot.triggerbyid", "userpilotinitiatorsdk", "userpilotpako" ], "description": "Userpilot is a cloud-based product experience platform designed for customer success and product teams to onboard users and increase product adoption through behavior-triggered experiences.", "website": "https://userpilot.com" }, "Ushahidi": { "cats": [ 1, 35 ], "cookies": { "ushahidi": "" }, "js": [ "ushahidi" ], "scriptSrc": [ "/js/ushahidi\\.js$" ], "implies": [ "MySQL", "OpenLayers", "PHP" ], "description": "Ushahidi is a tool that collects crowdsourced data and targeted survey responses from multiple data sources.", "website": "https://www.ushahidi.com" }, "Usizy": { "cats": [ 76 ], "js": [ "usizyuniversal" ], "scriptSrc": [ "static\\.usizy\\.es/" ], "description": "Usizy is the top size recommendation and prediction solution for ecommerce using machine learning, big data, and isomoprhic algorythms.", "website": "https://usizy.com" }, "Uvicorn": { "cats": [ 22 ], "headers": { "server": "uvicorn" }, "implies": [ "Python" ], "website": "https://www.uvicorn.org/" }, "Uvodo": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.uvo\\.do/" ], "implies": [ "MySQL", "PHP", "React" ], "description": "Uvodo is an ecommerce platform built with React, PHP, and MySQL, offering local and global payment integration, robust selling tools, and no additional expenses.", "website": "https://uvodo.com" }, "VAPTCHA": { "cats": [ 16 ], "js": [ "vaptcha" ], "scriptSrc": [ "\\.vaptcha\\.com/v([\\d\\.]+)\\.js\\;version:\\1" ], "description": "VAPTCHA is the abbreviation of (Variation Analysis based Public Turing Test to Tell Computers and Humans Apart), also known as gesture verification code, is a human-machine verification solution based on artificial intelligence and big data.", "website": "https://en.vaptcha.com" }, "VDX.tv": { "cats": [ 36 ], "scriptSrc": [ "\\.exponential\\.com", "\\.tribalfusion\\.com/" ], "description": "VDX.tv (formerly Exponential) is a global advertising technology company that is transforming the way brands connect with relevant audiences in today's converging video landscape.", "website": "https://vdx.tv" }, "VIVVO": { "cats": [ 1 ], "cookies": { "vivvosessionid": "" }, "js": [ "vivvo" ], "website": "https://vivvo.net" }, "VK Pixel": { "cats": [ 10 ], "scriptSrc": [ "vk\\.com/js/api/openapi\\.js" ], "description": "VK is a Russian online social media and social networking service.", "website": "https://vk.com/" }, "VKUI": { "cats": [ 66 ], "description": "VKUI is a set of React components with which you can create interfaces that are visually indistinguishable from our iOS and Android applications.", "website": "https://vkcom.github.io/VKUI" }, "VP-ASP": { "cats": [ 6 ], "html": [ "\u003ca[^\u003e]+\u003epowered by vp-asp shopping cart\u003c/a\u003e" ], "scriptSrc": [ "vs350\\.js" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://www.vpasp.com" }, "VTEX": { "cats": [ 6 ], "cookies": { "vtex_session": "", "vtexfingerprint": "", "vtexstoreversion": "", "vtexworkspace": "" }, "js": [ "vtex" ], "headers": { "powered": "vtex", "server": "^vtex io$" }, "description": "VTEX is an ecommerce software that manages multiple online stores.", "website": "https://vtex.com/" }, "VWO": { "cats": [ 10, 74 ], "js": [ "__vwo", "_vwo_code", "_vwo_settings_timer", "vwo" ], "scriptSrc": [ "/visual-website-optimizer/([\\d\\.])\\;version:\\1", "dev\\.visualwebsiteoptimizer\\.com/" ], "description": "VWO is a website testing and conversion optimisation platform.", "website": "https://vwo.com" }, "VWO Engage": { "cats": [ 32 ], "js": [ "_pushcrewdebuggingqueue" ], "scriptSrc": [ "cdn\\.pushcrew\\.\\w+" ], "description": "VWO Engage is a part of the VWO Platform, which is a web-based push notification platform used by SaaS and B2B marketers, online content publishers, and ecommerce store owners.", "website": "https://vwo.com/engage" }, "Vaadin": { "cats": [ 18 ], "js": [ "vaadin" ], "scriptSrc": [ "vaadinbootstrap\\.js(?:\\?v=([\\d.]+))?\\;version:\\1" ], "implies": [ "Java" ], "description": "Vaadin is an open-source framework for building user interfaces and single-page applications using Java and TypeScript.", "website": "https://vaadin.com" }, "ValueCommerce": { "cats": [ 71 ], "scriptSrc": [ "\\.valuecommerce\\.com" ], "description": "ValueCommerce is a pay-per-performance advertising affiliate marketing network.", "website": "https://www.valuecommerce.co.jp" }, "Vanco Payment Solutions": { "cats": [ 111, 41 ], "scriptSrc": [ "\\.eservicepayments\\.com/" ], "description": "Vanco Payment Solutions provides credit card processing to nonprofits.", "website": "https://www.vancopayments.com" }, "Vanilla": { "cats": [ 2 ], "headers": { "x-powered-by": "vanilla" }, "html": [ "\u003cbody id=\"(?:discussionspage|vanilla)" ], "implies": [ "PHP" ], "description": "Vanilla is a both a cloud-based (SaaS) open-source community forum software.", "website": "https://vanillaforums.org" }, "Vant": { "cats": [ 66 ], "js": [ "vant.version" ], "implies": [ "TypeScript" ], "description": "Vant is a lightweight, customisable Vue UI library for mobile web apps.", "website": "https://github.com/youzan/vant" }, "Varbase": { "cats": [ 1 ], "js": [ "drupalsettings.ajaxpagestate.libraries" ], "implies": [ "Drupal" ], "website": "https://www.vardot.com/solutions/varbase", "cpe": "cpe:2.3:a:vardot:varbase:*:*:*:*:*:*:*:*" }, "Variti": { "cats": [ 16 ], "headers": { "x-variti-ccr": "" }, "description": "Variti is a network security solutions firm that blocks bad bots, protects users from various automated abuse, attacks and fraud techniques.", "website": "https://variti.io" }, "Varnish": { "cats": [ 23 ], "headers": { "via": "varnish(?: \\(varnish/([\\d.]+)\\))?\\;version:\\1", "x-varnish": "", "x-varnish-action": "", "x-varnish-age": "", "x-varnish-cache": "", "x-varnish-hostname": "" }, "description": "Varnish is a reverse caching proxy.", "website": "https://www.varnish-cache.org", "cpe": "cpe:2.3:a:varnish-software:varnish_cache:*:*:*:*:*:*:*:*" }, "Ve Global": { "cats": [ 10 ], "js": [ "vetagdata.appsservicesurl" ], "description": "Ve Global, formerly known as Ve Interactive, is a global technology company that provides ecommerce businesses with a managed-service of proprietary marketing software and digital advertising solutions.", "website": "https://ve.com" }, "Vectary": { "cats": [ 105 ], "description": "Vectary is fully-featured 3D modeling tool with photorealistic real-time rendering, augmented reality, interactions and animations.", "website": "https://www.vectary.com" }, "Vendre": { "cats": [ 6 ], "js": [ "vendre_config", "vendremap.maps_loaded" ], "description": "Vendre is a module-based ecommerce system where you choose which functions your organisation needs.", "website": "https://vendre.io" }, "Venmo": { "cats": [ 41 ], "description": "Venmo is a mobile payment service owned by PayPal. Venmo account holders can transfer funds to others via a mobile phone app.", "website": "https://venmo.com" }, "VentraIP": { "cats": [ 88 ], "description": "VentraIP is the largest privately owned web host and domain name registrar in Australia.", "website": "https://ventraip.com.au" }, "VentryShield": { "cats": [ 16 ], "cookies": { "ventryshield_pre": "" }, "headers": { "x-ventryshield-cache-status": "no-cache", "x-ventryshield-sid": "" }, "description": "VentryShield offers DDoS Protected VPS and Web Hosting.", "website": "https://ventryshield.net" }, "Veoxa": { "cats": [ 36 ], "js": [ "vuveoxacontent" ], "html": [ "\u003cimg [^\u003e]*src=\"[^\"]+tracking\\.veoxa\\.com" ], "scriptSrc": [ "tracking\\.veoxa\\.com" ], "website": "https://veoxa.com" }, "Vercel": { "cats": [ 62 ], "headers": { "server": "^now|vercel$", "x-now-trace": "", "x-vercel-cache": "", "x-vercel-id": "" }, "description": "Vercel is a cloud platform for static frontends and serverless functions.", "website": "https://vercel.com" }, "Vercel Analytics": { "cats": [ 10 ], "js": [ "va" ], "scriptSrc": [ "/_vercel/insights/script\\.js", "/va/script\\.js" ], "website": "https://vercel.com/analytics" }, "Verifone 2Checkout": { "cats": [ 41 ], "scripts": [ "2checkout\\.com" ], "description": "Verifone is an American multinational corporation headquartered in Coral Springs, Florida, that provides technology for electronic payment transactions and value-added services at the point-of-sale.", "website": "https://www.2checkout.com" }, "VerifyPass": { "cats": [ 5, 76 ], "js": [ "verifypass_api_instantiator", "verifypass_is_loaded", "verifypass_popup" ], "scriptSrc": [ "cdn\\.id\\.services", "cdn\\.verifypass\\.com" ], "description": "VerifyPass is a company which provide secure identity proofing, authentication, and group affiliation verification for teachers and students.", "website": "https://verifypass.com" }, "Verizon Media": { "cats": [ 36 ], "scriptSrc": [ "\\.advertising\\.com", "\\.vidible\\.tv/" ], "description": "Verizon Media is a tech and media company with global assets for advertisers, consumers and media companies.", "website": "https://www.verizonmedia.com" }, "Verloop": { "cats": [ 52 ], "js": [ "verloop" ], "description": "Verloop is provider of conversational AI platform for customer support automation.", "website": "https://verloop.io/" }, "VerticalScope": { "cats": [ 36 ], "description": "VerticalScope is a Canadian-based technology company that owns and operates a network of online communities and discussion forums focused on a variety of interests and hobbies, such as cars, pets, sports, and technology. VerticalScope generates revenue primarily through advertising, including banner ads, sponsored content, and affiliate marketing.", "website": "https://www.verticalscope.com" }, "Very Good Security": { "cats": [ 16 ], "js": [ "vgscollect" ], "headers": { "content-security-policy": "\\.verygoodvault\\.com" }, "scriptSrc": [ "js\\.verygoodvault\\.com/" ], "description": "Very Good Security (VGS) is a data security and compliance platform that enables developers to securely handle sensitive data by encrypting, tokenising, and transmitting it through an intermediary service.", "website": "https://www.verygoodsecurity.com" }, "Vev": { "cats": [ 51 ], "js": [ "vev.app.compare", "vev.default_app_state" ], "scriptSrc": [ "\\.vev\\.design/" ], "description": "Vev is a cloud-based design and publishing platform that enables users to create interactive digital content without coding, using a drag-and-drop interface and built-in templates and integrations.", "website": "https://www.vev.design" }, "ViaBill": { "cats": [ 91 ], "js": [ "viabilloptions.state.subscriptions", "viabillpricetaginternal.conf.productsbylocale" ], "scriptSrc": [ "\\.viabill\\.com/" ], "description": "ViaBill is a cloud-based payment management solution designed to help small to midsize retailers and webshops.", "website": "https://viabill.com" }, "Viafoura": { "cats": [ 86 ], "js": [ "dfm_viafoura_options", "viafoura.bootstrap", "viafoura.core" ], "description": "Viafoura is an audience engagement and social monetisation platform.", "website": "https://viafoura.com" }, "Vidazoo": { "cats": [ 36 ], "js": [ "__vidazooplayer__", "vidazoo", "vidazoo.version" ], "scriptSrc": [ "\\.vidazoo\\.com" ], "description": "Vidazoo is a video content and yield management platform.", "website": "https://www.vidazoo.com" }, "Video Greet": { "cats": [ 100 ], "js": [ "__vg.video_greet_button_src" ], "description": "Video Greet lets your customers add a video message to gifts with QR codes.", "website": "https://apps.shopify.com/videogreet-gift-messages" }, "VideoJS": { "cats": [ 14 ], "css": [ "\\.video-js\\;confidence:25", "\\.vjs-big-play-button\\;confidence:75" ], "js": [ "videojs", "videojs", "videojs.version" ], "scriptSrc": [ "cdnjs\\.cloudflare\\.com\\/ajax\\/libs\\/video\\.js\\/([\\d\\.]+)\\/\\;version:\\1", "zencdn\\.net/c/video\\.js" ], "description": "Video.js is a JavaScript and CSS library that makes it easier to work with and build on HTML5 video.", "website": "https://videojs.com" }, "Vigbo": { "cats": [ 1 ], "cookies": { "_gphw_mode": "" }, "html": [ "\u003clink[^\u003e]* href=[^\u003e]+(?:\\.vigbo\\.com|\\.gophotoweb\\.com)" ], "scriptSrc": [ "(?:\\.vigbo\\.com|\\.gophotoweb\\.com)" ], "website": "https://vigbo.com" }, "Vigil": { "cats": [ 13 ], "implies": [ "Docker", "Rust" ], "description": "Vigil is a microservices status page. Monitors a distributed infrastructure and sends alerts (Slack, SMS, etc.).", "website": "https://github.com/valeriansaliou/vigil" }, "Vignette": { "cats": [ 1 ], "html": [ "\u003c[^\u003e]+=\"vgn-?ext" ], "website": "https://www.vignette.com" }, "Vimeo": { "cats": [ 14 ], "js": [ "vimeo.player", "vimeoplayer" ], "description": "Vimeo is a video hosting, sharing and services platform. Vimeo operation an ad-free basis by providing subscription plans.", "website": "https://vimeo.com" }, "Vimeo OTT": { "cats": [ 14 ], "js": [ "_vhx", "vhx.config" ], "implies": [ "Vimeo" ], "description": "Vimeo OTT allows brands and creators to launch their own white-label video subscription channels, where subscribers can access video content for free, as a rental, or for purchase.", "website": "https://vimeo.com/ott" }, "Viqeo": { "cats": [ 14 ], "js": [ "viqeo" ], "description": "Viqeo is a short video platform to make media and ecommerce more visual and interesting.", "website": "https://viqeo.tv" }, "Viral Loops": { "cats": [ 94 ], "scriptSrc": [ "app\\.viral-loops\\.com/" ], "description": "Viral Loops is a viral and referral marketing platform to launch ranking competitions, sweepstakes, pre-launch and referral programs.", "website": "https://viral-loops.com" }, "Virgool": { "cats": [ 11 ], "headers": { "x-powered-by": "^virgool$" }, "website": "https://virgool.io" }, "Virtooal": { "cats": [ 105 ], "scriptSrc": [ "\\.virtooal\\.com/" ], "description": "Virtooal allows shoppers to try on and combine decorative cosmetics, sunglasses, contact lenses, jewellery and fashion accessories using models, their own photo or a live webcam feed.", "website": "https://try.virtooal.com" }, "Virtuagym": { "cats": [ 53 ], "js": [ "open_vg_custom_modal", "trigger_vg_neutral_message", "vgtutorial" ], "description": "Virtuagym is a cloud-based membership management and coaching platform designed for personal trainers and fitness businesses of all sizes.", "website": "https://business.virtuagym.com" }, "Virtual Chat": { "cats": [ 52 ], "scriptSrc": [ "virtual-chat\\.co\\.il/" ], "description": "Virtual Chat is a live-chat service for web sites.", "website": "https://www.virtual-chat.co.il" }, "VirtualSpirits": { "cats": [ 52 ], "js": [ "vspiritbutton", "vspirits_chat_client", "vspiritsizeheight" ], "description": "VirtualSpirits is a chatbot and live-chat service for websites.", "website": "https://www.virtualspirits.com" }, "VirtueMart": { "cats": [ 6 ], "html": [ "\u003cdiv id=\"vmmainpage" ], "implies": [ "Joomla" ], "website": "https://virtuemart.net" }, "Virtuoso": { "cats": [ 34 ], "headers": { "server": "virtuoso/?([0-9.]+)?\\;version:\\1" }, "meta": { "copyright": [ "^copyright \u0026copy; \\d{4} openlink software" ], "keywords": [ "^openlink virtuoso sparql" ] }, "website": "https://virtuoso.openlinksw.com/" }, "Virtuous": { "cats": [ 111 ], "scriptSrc": [ "\\.virtuoussoftware\\.com/" ], "description": "Virtuous is the responsive fundraising software platform.", "website": "https://virtuous.org" }, "Virtusize": { "cats": [ 76 ], "scriptSrc": [ "\\.virtusize\\.jp/" ], "description": "Virtusize is a personalisation service that provides size and product recommendations specific to a user's size and trend preferences.", "website": "https://www.virtusize.com" }, "Visa": { "cats": [ 41 ], "js": [ "visaapi", "visaimage", "visasrc" ], "website": "https://www.visa.com" }, "Visa Checkout": { "cats": [ 41 ], "scriptSrc": [ "secure\\.checkout\\.visa\\.com" ], "description": "Visa facilitates electronic funds transfers throughout the world, most commonly through Visa-branded credit cards, debit cards and prepaid cards.", "website": "https://checkout.visa.com" }, "Visely": { "cats": [ 100, 76 ], "js": [ "visely.recommendationsapi", "viselycartproductids", "viselypage" ], "description": "Visely is a Shopify app which personalise product recommendations for Shopify sites.", "website": "https://visely.io" }, "Visual Composer": { "cats": [ 51 ], "meta": { "generator": [ "powered by visual composer website builder" ] }, "implies": [ "PHP", "WordPress" ], "description": "Visual Composer is an all-in-one web design tool for anyone who uses WordPress.", "website": "https://visualcomposer.com" }, "Visual Portfolio": { "cats": [ 87 ], "js": [ "vpdata.screensizes", "vpdata.version" ], "description": "Visual Portfolio is a plugin with a robust set of features, designed to help you create galleries that effectively display your creative projects.", "website": "https://visualportfolio.co" }, "Visual Quiz Builder": { "cats": [ 100 ], "scriptSrc": [ "//whai-cdn\\.nyc\\d\\.cdn\\.digitaloceanspaces\\.com/" ], "description": "Visual Quiz Builder is a Shopify app built by AskWhai.", "website": "https://apps.shopify.com/product-recommendation-quiz" }, "Visualsoft": { "cats": [ 6 ], "cookies": { "vscommerce": "" }, "meta": { "vs_status_checker_version": [ "\\d+" ], "vsvatprices": [] }, "description": "Visualsoft is an ecommerce agency that delivers web design, development and marketing services to online retailers.", "website": "https://www.visualsoft.co.uk/" }, "Visx": { "cats": [ 25 ], "description": "Visx is a collection of React-based data visualisation tools developed by Airbnb.", "website": "https://airbnb.io/visx/" }, "Vitals": { "cats": [ 100, 32 ], "js": [ "vitals", "vitals_app_cache_keys_v1", "vitals_country_code", "vitals_product_data" ], "scriptSrc": [ "//appsolve\\.io/" ], "description": "Vitals is an all-in-one Shopify marketing software.", "website": "https://vitals.co" }, "Vite": { "cats": [ 19 ], "js": [ "__vite_is_modern_browser" ], "description": "Vite is a rapid development tool for modern web projects.", "website": "https://vitejs.dev" }, "VitePress": { "cats": [ 57 ], "js": [ "__vp_hash_map__" ], "implies": [ "Vite", "Vue.js" ], "description": "VitePress is a Vite \u0026 Vue Powered Static Site Generator.", "website": "https://vitepress.vuejs.org/" }, "Vitrin.me": { "cats": [ 51 ], "scriptSrc": [ "\\.vitrin\\.me/" ], "implies": [ "Django", "Next.js", "Python", "React" ], "description": "Vitrin.me is a no-code platform that lets anyone build web apps without writing any code.", "website": "https://vitrin.me" }, "Vizury": { "cats": [ 32 ], "js": [ "safarivizury", "vizury_data" ], "scriptSrc": [ "\\.vizury\\.com" ], "description": "Vizury is a ecommerce marketing platform.", "website": "https://www.vizury.com" }, "Vnda": { "cats": [ 6 ], "js": [ "vnda.checkout", "vnda.loadcartpopup" ], "meta": { "image": [ "cdn\\.vnda\\.com\\.br/" ] }, "implies": [ "Amazon Web Services", "Node.js" ], "description": "Vnda is a omnichannel ecommerce platform.", "website": "https://www.vnda.com.br" }, "Vntana": { "cats": [ 105 ], "description": "Vntana (stylised as VNTANA) is an American social augmented reality company.", "website": "https://www.vntana.com" }, "Volusion": { "cats": [ 6 ], "js": [ "volusion" ], "html": [ "\u003cbody [^\u003e]*data-vn-page-name\\;version:2", "\u003clink [^\u003e]*href=\"[^\"]*/vspfiles/\\;version:1" ], "scriptSrc": [ "/volusion\\.js(?:\\?([\\d.]*))?\\;version:\\1" ], "description": "Volusion is a cloud-based, hosted ecommerce solution.", "website": "https://www.volusion.com" }, "Vonage Video API": { "cats": [ 103 ], "scriptSrc": [ "\\.opentok\\.com/" ], "description": "Vonage Video API platform makes it easy to embed real-time, high-quality interactive video, messaging, screen-sharing, and more into web and mobile apps.", "website": "https://www.vonage.com/communications-apis/video/" }, "Voog.com Website Builder": { "cats": [ 1, 6 ], "html": [ "\u003cscript [^\u003e]*src=\"[^\"]*voog\\.com/tracker\\.js" ], "scriptSrc": [ "voog\\.com/tracker\\.js" ], "website": "https://www.voog.com/" }, "Voracio": { "cats": [ 6 ], "cookies": { "voracio_csrf_token": "", "voracio_sessionid": "" }, "js": [ "voracio" ], "description": "Voracio is a cloud SaaS ecommerce platform powered by Microsoft .NET and built on the Microsoft Azure cloud framework.", "website": "https://www.voracio.co.uk" }, "Vtiger": { "cats": [ 53 ], "js": [ "vtiger", "vtiger_base_js", "vtiger_helper_js" ], "description": "Vtiger is a cloud-based suite of marketing, sales and help desk offerings, which can be deployed separately or as an integrated, all-in-one ecosystem.", "website": "https://www.vtiger.com", "cpe": "cpe:2.3:a:vtiger:vtiger_crm:*:*:*:*:*:*:*:*" }, "VuFind": { "cats": [ 29 ], "js": [ "vufind.defaultsearchbackend" ], "meta": { "generator": [ "^vufind\\s([\\d\\.]+)$\\;version:\\1" ] }, "description": "VuFind is a library resource portal designed and developed by Villanova University library.", "website": "https://vufind.org" }, "Vue Storefront": { "cats": [ 108 ], "scriptSrc": [ "vsf-layout\\;version:1" ], "meta": { "generator": [ "^vue storefront ([0-9.]+)?$\\;version:\\1" ] }, "implies": [ "Vue.js" ], "description": "Vue Storefront is a frontend platform for headless ecommerce.", "website": "https://www.vuestorefront.io/" }, "Vue.ai": { "cats": [ 76 ], "js": [ "getvueurlsegments", "vuex" ], "scriptSrc": [ "vue_ai\\.js", "vuex\\.vue\\.ai" ], "description": "Vue.ai is an AI-powered experience management suite which combines the power of product, customer and business intelligence using computer vision and NLP.", "website": "https://vue.ai" }, "Vue.js": { "cats": [ 12 ], "css": [ "\\.vue-notification-group" ], "js": [ "__vue__", "__vue_hot_map__", "vue", "vue.version", "vuedll", "vueroot" ], "html": [ "\u003c[^\u003e]+\\sdata-v(?:ue)?-" ], "scriptSrc": [ "(?:/([\\d.]+))?/vue(?:\\.min)?\\.js\\;version:\\1", "vue[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "description": "Vue.js is an open-source model–view–viewmodel JavaScript framework for building user interfaces and single-page applications.", "website": "https://vuejs.org" }, "Vue2-animate": { "cats": [ 19 ], "implies": [ "Animate.css", "Sass", "Vue.js" ], "description": "Vue2-animate is a Vue.js port of Animate.css.", "website": "https://github.com/asika32764/vue2-animate" }, "VuePress": { "cats": [ 57 ], "js": [ "__vuepress__.version" ], "meta": { "generator": [ "^vuepress(?: ([0-9.]+)(-[a-z]+.[0-9]+)?)?$\\;version:\\1" ] }, "implies": [ "Vue.js" ], "description": "VuePress is a static site generator with a Vue-powered theming system, and a default theme for writing technical documentation.", "website": "https://vuepress.vuejs.org/" }, "Vuetify": { "cats": [ 66 ], "css": [ "\\.v-application \\.d-block" ], "implies": [ "Vue.js" ], "description": "Vuetify is a reusable semantic component framework for Vue.js that aims to provide clean, semantic and reusable components.", "website": "https://vuetifyjs.com" }, "Vuex": { "cats": [ 59 ], "js": [ "vuex.version" ], "implies": [ "Vue.js" ], "description": "Vuex is a state management pattern + library for Vue.js applications.", "website": "https://vuex.vuejs.org/" }, "Vultr": { "cats": [ 62 ], "description": "Vultr is a cloud computing service provider.", "website": "https://www.vultr.com" }, "Vuukle": { "cats": [ 15 ], "js": [ "vuukle_config" ], "description": "Vuukle is an audience engagement and commenting platform.", "website": "https://vuukle.com" }, "W3 Total Cache": { "cats": [ 23, 87 ], "headers": { "x-powered-by": "w3 total cache(?:/([\\d.]+))?\\;version:\\1" }, "html": [ "\u003c!--[^\u003e]+w3 total cache" ], "description": "W3 Total Cache (W3TC) improves the SEO and increases website performance and reducing load times by leveraging features like content delivery network (CDN) integration and the latest best practices.", "website": "https://www.w3-edge.com/wordpress-plugins/w3-total-cache" }, "W3.CSS": { "cats": [ 66 ], "description": "W3.CSS is a CSS framework developed by the World Wide Web Consortium (W3C), the main international standards organisation for the World Wide Web.", "website": "https://www.w3schools.com/w3css/" }, "W3Counter": { "cats": [ 10 ], "scriptSrc": [ "w3counter\\.com/tracker\\.js" ], "website": "https://www.w3counter.com" }, "WEBDEV": { "cats": [ 20 ], "headers": { "webdevsrc": "" }, "html": [ "\u003c!-- [a-za-z0-9_]+ [\\d/]+ [\\d:]+ webdev \\d\\d ([\\d.]+) --\u003e\\;version:\\1" ], "meta": { "generator": [ "^webdev$" ] }, "description": "WEBDEV is a tool to develop internet and intranet sites and applications that support data and processes", "website": "https://www.windev.com/webdev/index.html" }, "WEBXPAY": { "cats": [ 41 ], "js": [ "webxpay" ], "description": "WEBXPAY is a specialised online payment gateway that expedites buying and selling in a highly secured environment.", "website": "https://webxpay.com" }, "WEBrick": { "cats": [ 22 ], "headers": { "server": "^webrick/([\\d\\.]+)\\;version:\\1" }, "description": "WEBrick is a lightweight HTTP server library in Ruby, included in the standard library, primarily used for local development and testing of Ruby web applications.", "website": "https://docs.ruby-lang.org/en/2.4.0/WEBrick.html", "cpe": "cpe:2.3:a:ruby-lang:webrick:*:*:*:*:*:*:*:*" }, "WEN Themes Education Hub": { "cats": [ 80 ], "js": [ "educationhubscreenreadertext" ], "scriptSrc": [ "/wp-content/themes/education-hub(?:-pro)?/" ], "description": "WEN Themes Education Hub is a clean and elegant WordPress education theme.", "website": "https://wenthemes.com/item/wordpress-themes/education-hub" }, "WEN Themes Signify Dark": { "cats": [ 80 ], "js": [ "signifyoptions" ], "description": "Signify Dark is a free dark blog and corporate WordPress theme that is trendy, responsive, and dynamic by WEN Themes.", "website": "https://wenthemes.com/item/wordpress-themes/signify-dark" }, "WHMCS": { "cats": [ 1 ], "js": [ "whmcs" ], "description": "WHMCS is an automation platform that simplifies and automates all aspects of operating an online web hosting and domain registrar business.", "website": "https://www.whmcs.com" }, "WP Automatic": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/wp-automatic/" ], "description": "WP Automatic is a WordPress plugin that automates the process of creating posts on your WordPress site by automatically fetching content from various sources like RSS feeds, Amazon, eBay, ClickBank, and more.", "website": "https://wpautomatic.com" }, "WP Engine": { "cats": [ 62, 88 ], "headers": { "wpe-backend": "", "x-pass-why": "", "x-powered-by": "wp engine", "x-wpe-loopback-upstream-addr": "" }, "implies": [ "WordPress" ], "description": "WP Engine is a website hosting provider.", "website": "https://wpengine.com" }, "WP Fastest Cache": { "cats": [ 87, 92 ], "js": [ "wpfcll" ], "scriptSrc": [ "/wp-content/cache/wpfc-minified/" ], "description": "WP Fastest Cache is one of a number of plugins for WordPress designed to accelerate the performance of your website.", "website": "https://www.wpfastestcache.com" }, "WP Featherlight": { "cats": [ 87 ], "scriptSrc": [ "/wpfeatherlight\\.pkgd\\.min\\.js" ], "description": "WP Featherlight is a WordPress lightbox plugin for adding a minimal, high-performance, responsive jQuery lightbox to your WordPress website.", "website": "https://wordpress.org/plugins/wp-featherlight" }, "WP Google Map Plugin": { "cats": [ 87, 35 ], "js": [ "wpgmp_local" ], "scriptSrc": [ "/wp-content/plugins/wp-google-map-plugin/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WP Google Map Plugin allows you to create google maps shortcodes to display responsive google maps on pages, widgets and custom templates.", "website": "https://www.wpmapspro.com" }, "WP Job Openings": { "cats": [ 87, 101 ], "js": [ "awsmjobs" ], "scriptSrc": [ "/wp-content/plugins/wp-job-openings/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WP Job Openings is a job listing and recruitment plugin for WordPress websites.", "website": "https://wpjobopenings.com" }, "WP Live Visitor Counter": { "cats": [ 87, 5 ], "description": "WP Live Visitor Counter is a WordPress plugin that displays the number of online visitors on a website in real-time.", "website": "https://wordpress.org/plugins/wp-visitors-widget/" }, "WP Maintenance Mode": { "cats": [ 87 ], "js": [ "wpmm_vars" ], "scriptSrc": [ "/wp-content/plugins/wp-maintenance-mode/.+wpmm\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WP Maintenance Mode is a WordPress plugin which add a maintenance page to your blog.", "website": "https://github.com/andrianvaleanu/WP-Maintenance-Mode" }, "WP Portfolio": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/astra-portfolio/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WP Portfolio is a premium standalone WordPress plugin designed for creating and showcasing portfolios.", "website": "https://wpportfolio.net" }, "WP Puzzle Basic": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/basic/" ], "description": "WP Puzzle Basic is fully responsive, clean and minimal WordPress theme.", "website": "https://wp-puzzle.com/basic" }, "WP Rocket": { "cats": [ 23, 87 ], "js": [ "rocket_lazy", "rocketlazyloadscripts", "rocketpreloadlinksconfig" ], "headers": { "x-powered-by": "wp rocket(?:/([\\d.]+))?\\;version:\\1", "x-rocket-nginx-bypass": "" }, "html": [ "\u003c!--[^\u003e]+wp rocket" ], "scriptSrc": [ "/wp-content/plugins/wp-rocket/" ], "description": "WP Rocket is a caching and performance optimisation plugin to improve the loading speed of WordPress websites.", "website": "https://wp-rocket.me" }, "WP-Optimize": { "cats": [ 87, 92 ], "html": [ "\u003c!--[^\u003e]+cached by wp-optimize" ], "description": "WP-Optimize is an all-in-one WordPress plugin that cleans your database, compresses your large images and caches your site.", "website": "https://getwpo.com" }, "WP-PageNavi": { "cats": [ 87 ], "description": "WP-PageNavi is a WordPress plugin which adds a more advanced paging navigation interface to your WordPress blog.", "website": "https://github.com/lesterchan/wp-pagenavi" }, "WP-Royal Ashe": { "cats": [ 80 ], "js": [ "ashepreloader", "ashestickysidebar" ], "scriptSrc": [ "/wp-content/themes/ashe(?:-pro-premium)?/" ], "description": "WP-Royal Ashe is a personal and multi-author WordPress blog theme.", "website": "https://wp-royal.com/themes/item-ashe-free" }, "WP-Royal Bard": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/bard(?:-pro-premium)?/" ], "description": "WP-Royal Bard is a personal and multi-author WordPress blog theme.", "website": "https://wp-royal.com/themes/item-bard-free" }, "WP-Statistics": { "cats": [ 10, 87 ], "js": [ "wp_statistics_http", "wps_statistics_object" ], "html": [ "\u003c!-- analytics by wp-statistics v([\\d\\.]+)\\;version:\\1" ], "description": "WP-Statistics is a WordPress plugin which allows you to know your website statistics.", "website": "https://wp-statistics.com" }, "WPCacheOn": { "cats": [ 23, 87 ], "headers": { "x-powered-by": "^optimized by wpcacheon" }, "description": "WPCacheOn is a caching and performance optimisation plugin, which improves the loading speed of WordPress websites.", "website": "https://wpcacheon.io" }, "WPForms": { "cats": [ 87, 110 ], "js": [ "wpforms", "wpforms_settings" ], "scriptSrc": [ "/wp-content/plugins/wpforms(?:-lite)?/.+(?:frontend\\.min|wpforms)\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WPForms is a drag and drop WordPress form builder.", "website": "https://wpforms.com" }, "WPML": { "cats": [ 87, 89 ], "cookies": { "wp-wpml_current_language": "" }, "scriptSrc": [ "/wp-content/plugins/sitepress-multilingual-cms/" ], "meta": { "generator": [ "^wpml\\sver\\:([\\d\\.]+)\\;version:\\1" ] }, "description": "WPML plugin makes it possible to build and run fully multilingual WordPress sites.", "website": "https://wpml.org/" }, "WPMU DEV Smush": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/wp-smushit(?:-pro)?/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WPMU DEV Smush is a WordPress plugin that allows you to optimise images without losing quality.", "website": "https://wpmudev.com/project/wp-smush-pro" }, "WPS Visitor Counter": { "cats": [ 87 ], "js": [ "wpspagevisit" ], "description": "WPS Visitor Counter is a plugin for WordPress that counts the number of visitors to a website.", "website": "https://wordpress.org/plugins/wps-visitor-counter/" }, "Wagtail": { "cats": [ 1 ], "implies": [ "Django", "Python" ], "description": "Wagtail is a Django content management system (CMS) focused on flexibility and user experience.", "website": "https://wagtail.org", "cpe": "cpe:2.3:a:torchbox:wagtail:*:*:*:*:*:*:*:*" }, "Wair": { "cats": [ 76, 5 ], "js": [ "predictv3.default.version", "predictwidget" ], "scriptSrc": [ "getwair\\.com" ], "description": "Wair is the widget to personalised fit.", "website": "https://getwair.com" }, "Waitlist": { "cats": [ 5 ], "js": [ "gw_backend_url", "gw_waitlist_name" ], "description": "Waitlist is a web-based tool that helps businesses to create a waitlist for their product or service.", "website": "https://www.getwaitlist.com" }, "Wakav Performance Monitoring": { "cats": [ 78 ], "scriptSrc": [ "rum\\.wakav\\.ir/" ], "description": "Wakav Performance Monitoring is a real user monitoring (RUM), Web/App performance and availability test platform.", "website": "https://www.wakav.ir" }, "WalkMe": { "cats": [ 58 ], "js": [ "_walkmeconfig", "walkmeapi" ], "description": "WalkMe is a cloud-based interactive guidance and engagement platform.", "website": "https://www.walkme.com" }, "Wangsu": { "cats": [ 31 ], "js": [ "__cdnroute", "playurl.wangsu" ], "description": "Wangsu is a China-based company that provides content delivery network and internet data center services.", "website": "https://en.wangsu.com" }, "Warp": { "cats": [ 22 ], "headers": { "server": "^warp/(\\d+(?:\\.\\d+)+)?$\\;version:\\1" }, "implies": [ "Haskell" ], "website": "https://www.stackage.org/package/warp" }, "Wask": { "cats": [ 10 ], "js": [ "wask_analytics" ], "description": "Wask is a platform that offers businesses a dedicated library code to analyse website visitors, track visitor behaviour, monitor website events, and gather retention cohort data effectively.", "website": "https://www.wask.co" }, "Waveform": { "cats": [ 5 ], "js": [ "waveform" ], "description": "Waveform is a media player that supports various media formats, including audio, video, Youtube, and Vimeo, and includes a waveform visualisation feature, utilising Web Audio API and HTML5 Canvas technologies.", "website": "https://music.flatfull.com/waveme/about/" }, "Waveme": { "cats": [ 80 ], "implies": [ "Gutenberg", "Waveform" ], "description": "Waveme is a WordPress theme that is suitable for individuals or businesses involved in the music industry, such as music producers, record labels, artist managers, or independent artists.", "website": "https://music.flatfull.com/waveme/about/" }, "WayForPay": { "cats": [ 41 ], "scriptSrc": [ "secure\\.wayforpay\\.com" ], "description": "WayForPay is a payment processing service provider based in Europe.", "website": "https://wayforpay.com" }, "Wazimo": { "cats": [ 36 ], "js": [ "wz.mmconfig.buildversion" ], "description": "Wazimo is a digital media company focused on combining engaging content with advanced real-time tendering (RTB) capabilities.", "website": "https://wazimo.com" }, "WeWeb": { "cats": [ 51 ], "js": [ "wwg_designinfo.wewebpreviewurl" ], "description": "WeWeb is a no-code front-end builder that allows customers to build on-top of any back-end.", "website": "https://www.weweb.io" }, "Weaver Xtreme": { "cats": [ 80 ], "js": [ "weaverxbottomfooter", "weaverxmonitorcontent", "weaverxonresize" ], "scriptSrc": [ "/wp-content/themes/weaver-xtreme/.+weaverxjslib-end\\.min\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Weaver Xtreme is the orginal options-based WordPress theme.", "website": "https://weavertheme.com" }, "Web Shop Manager": { "cats": [ 6 ], "js": [ "wsm.tracking", "wsm_catalogtabby", "wsm_chart_colors_opaque", "wsmhidehelpbox" ], "description": "Web Shop Manager is an ecommerce and search platform for the automotive industry and markets with complex product catalogs.", "website": "https://webshopmanager.com" }, "Web Stories": { "cats": [ 5 ], "implies": [ "AMP" ], "description": "Web Stories is a format for visual storytelling for the open web.", "website": "https://amp.dev/about/stories/" }, "Web Stories for WordPress": { "cats": [ 20, 87 ], "meta": { "amp-story-generator-name": [ "^web stories for wordpress$" ], "amp-story-generator-version": [ "^(.+)$\\;version:\\1" ] }, "implies": [ "Web Stories" ], "description": "Web Stories for WordPress is a visual editor for creating Web Stories.", "website": "https://wp.stories.google" }, "Web Wiz Forums": { "cats": [ 2 ], "meta": { "generator": [ "^web\\swiz\\sforums(?:\\s([\\d\\.]+))?$\\;version:\\1" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "Web Wiz Forums is a web-based forum software that enables developers to create and manage online discussion boards or forums for engaging user interactions and community building.", "website": "https://www.webwizforums.com" }, "Web2py": { "cats": [ 18 ], "headers": { "x-powered-by": "web2py" }, "scriptSrc": [ "web2py\\.js" ], "meta": { "generator": [ "^web2py" ] }, "implies": [ "Python", "jQuery" ], "website": "https://web2py.com" }, "WebAssembly": { "cats": [ 27 ], "js": [ "wasmbinary", "wasmbinaryfile" ], "headers": { "content-type": "application/wasm" }, "scriptSrc": [ "/wasm_exec\\.js" ], "description": "WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.", "website": "https://webassembly.org/" }, "WebEngage": { "cats": [ 32, 76 ], "js": [ "webengage.__v" ], "scriptSrc": [ "\\.webengage\\.co(?:m)?/" ], "description": "WebEngage is a customer data platform and marketing automation suite.", "website": "https://webengage.com" }, "WebFactory Maintenance": { "cats": [ 87 ], "js": [ "mtnc_front_options" ], "description": "WebFactory Maintenance is a WordPress plugin which allows you to create an maintenance page.", "website": "https://wordpress.org/plugins/maintenance" }, "WebFactory Under Construction": { "cats": [ 87 ], "description": "WebFactory Under Construction is a WordPress plugin which allows you to create an under construction page.", "website": "https://wordpress.org/plugins/under-construction-page" }, "WebGUI": { "cats": [ 1 ], "cookies": { "wgsession": "" }, "meta": { "generator": [ "^webgui ([\\d.]+)\\;version:\\1" ] }, "implies": [ "Perl" ], "website": "https://www.webgui.org" }, "WebHostUK": { "cats": [ 88 ], "description": "WebHostUK is a UK based web hosting company offering cheap yet reliable and secure web hosting solutions on both Linux and Windows servers.", "website": "https://www.webhostuk.co.uk" }, "WebMetric": { "cats": [ 10 ], "cookies": { "_wmuid": "" }, "js": [ "_wmid" ], "scriptSrc": [ "cdn\\.webmetric\\.ir" ], "website": "https://webmetric.ir/" }, "WebNode": { "cats": [ 1, 51 ], "cookies": { "_gat_wnd_header": "" }, "js": [ "wnd.$system" ], "meta": { "generator": [ "^webnode(?:\\s([\\d.]+))?$\\;version:\\1" ] }, "description": "Webnode is a drag-and-drop online website builder.", "website": "https://www.webnode.com" }, "WebRTC": { "cats": [ 19 ], "description": "WebRTC is an open-source project that enables real-time voice, text and video communications capabilities between web browsers and devices.", "website": "https://webrtc.org" }, "WebSite X5": { "cats": [ 20 ], "meta": { "generator": [ "incomedia website x5 (\\w+ [\\d.]+)\\;version:\\1" ] }, "description": "WebSite X5 is a tools to create and publish websites.", "website": "https://websitex5.com" }, "WebToffee Stripe Payment Plugin for WooCommerce": { "cats": [ 87 ], "implies": [ "Stripe", "WooCommerce" ], "description": "WebToffee Stripe Payment Plugin for WooCommerce is a software add-on that allows online retailers using the WooCommerce ecommerce platform to accept payments through the Stripe payment gateway.", "website": "https://www.webtoffee.com/product/woocommerce-stripe-payment-gateway/" }, "WebZi": { "cats": [ 1, 51 ], "js": [ "webzicart", "webzivalidate" ], "scriptSrc": [ "//webzi\\.ir/" ], "meta": { "generator": [ "^webzi\\.ir\\swebsite\\sbuilder$" ] }, "description": "WebZi is a professional website builder.", "website": "https://webzi.ir" }, "Webasyst Shop-Script": { "cats": [ 6 ], "js": [ "shop_cityselect.lib", "shopordercallconfigstaticurl" ], "implies": [ "MySQL", "PHP" ], "description": "Webasyst Shop-Script is a feature-rich PHP ecommerce framework and shopping cart solution.", "website": "https://www.shop-script.com" }, "Webeyez": { "cats": [ 10 ], "js": [ "___webeyez_cache", "___webeyez_register_error", "webeyez_wzpageentrykey", "webeyezstartall" ], "description": "Webeyez is an ecommerce monitoring and analytics solution designed to assist teams in identifying, alerting, prioritising, and resolving operational and technical issues for revenue recovery.", "website": "https://www.webeyez.com" }, "Webflow": { "cats": [ 51 ], "js": [ "webflow" ], "meta": { "generator": [ "webflow" ] }, "description": "Webflow is Software-as-a-Service (SaaS) for website building and hosting.", "website": "https://webflow.com" }, "Webflow Ecommerce": { "cats": [ 6 ], "js": [ "__webflow_currency_settings" ], "description": "Webflow is a zero-code visual website builder, with Webflow Ecommerce, you can build and design online stores.", "website": "https://webflow.com/ecommerce" }, "Webgains": { "cats": [ 71 ], "js": [ "itclkq" ], "scriptSrc": [ "analytics\\.webgains\\.io" ], "description": "Webgains is an affiliate marketing network.", "website": "https://www.webgains.com/" }, "Webix": { "cats": [ 12 ], "js": [ "webix" ], "scriptSrc": [ "\\bwebix\\.js" ], "website": "https://webix.com" }, "Weblication": { "cats": [ 1 ], "meta": { "generator": [ "^weblication® cms$" ] }, "implies": [ "PHP", "XSLT" ], "description": "Weblication is an enterprise-class website content management system developed by Scholl Communications AG in Germany.", "website": "https://weblication.de", "cpe": "cpe:2.3:a:weblication:cms_core_\u0026_grid:*:*:*:*:*:*:*:*" }, "Weblium": { "cats": [ 1, 6 ], "scriptSrc": [ "res2\\.weblium\\.site/common/core\\.min\\.js" ], "implies": [ "Node.js", "OpenResty", "React" ], "description": "Weblium let's you create a web site or online store without the need for a web developer or designer.", "website": "https://weblium.com" }, "Weblogic Server": { "cats": [ 22 ], "headers": { "server": "^weblogic\\sserver\\s([\\d\\.]+)?\\;version:\\1" }, "implies": [ "JavaServer Pages" ], "description": "WebLogic Server is an Application Server that runs on a middle tier, between back-end databases and related applications and browser-based thin clients.", "website": "https://www.oracle.com/java/weblogic" }, "Webmin": { "cats": [ 19 ], "implies": [ "Perl" ], "description": "Webmin is a free, open-source application for Linux server administration.", "website": "https://www.webmin.com" }, "Webolytics": { "cats": [ 10, 71 ], "js": [ "webolytics_site_tag", "webolytics_webhook_call" ], "description": "Webolytics is an open API platform designed to track return on advertising spend.", "website": "https://www.webolytics.com" }, "Webpack": { "cats": [ 19 ], "js": [ "webpackchunk", "webpackjsonp" ], "description": "Webpack is an open-source JavaScript module bundler.", "website": "https://webpack.js.org/" }, "Webpushr": { "cats": [ 32 ], "js": [ "webpushr.notificationcard", "webpushr_display_button" ], "scripts": [ "cdn\\.webpushr\\.com/app\\.min\\.js" ], "description": "Webpushr is a web push notification platform that supports mobile and desktop devices.", "website": "https://www.webpushr.com" }, "Webriti Busiprof": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/busiprof(?:-pro)?/" ], "description": "Busiprof is a fully responsive and translation-ready WordPress theme by Webriti.", "website": "https://webriti.com/busiprof-premium-wordpress-theme-1" }, "WebsPlanet": { "cats": [ 1 ], "meta": { "generator": [ "websplanet" ] }, "website": "https://websplanet.com" }, "Websale": { "cats": [ 6 ], "cookies": { "websale_ac": "" }, "website": "https://websale.de" }, "Website Creator": { "cats": [ 1 ], "meta": { "generator": [ "website creator by hosttech" ], "wsc_rendermode": [] }, "implies": [ "MySQL", "PHP", "Vue.js" ], "website": "https://www.hosttech.ch/websitecreator" }, "WebsiteBaker": { "cats": [ 1 ], "meta": { "generator": [ "websitebaker" ] }, "implies": [ "MySQL", "PHP" ], "website": "https://websitebaker2.org/en/home.php" }, "WebsiteBuilder": { "cats": [ 51 ], "js": [ "_site.urls.dataproxy" ], "description": "WebsiteBuilder is a page-builder for creating web pages without knowledge of programming languages.", "website": "https://www.websitebuilder.com" }, "Websocket": { "cats": [ 19 ], "html": [ "\u003c(?:link|a)[^\u003e]+href=[\"']wss?://", "\u003clink[^\u003e]+rel=[\"']web-socket[\"']" ], "website": "https://en.wikipedia.org/wiki/WebSocket" }, "Webtrends": { "cats": [ 10 ], "js": [ "webtrends", "wtoptimize" ], "html": [ "\u003cimg[^\u003e]+id=\"dcsimg\"[^\u003e]+webtrends" ], "website": "https://worldwide.webtrends.com" }, "Webx": { "cats": [ 6 ], "description": "Webx is a hosted ecommerce solution from Pakistan.", "website": "https://www.webx.pk" }, "Webzie": { "cats": [ 1, 6, 51 ], "meta": { "generator": [ "^webzie\\.com\\swebsite\\sbuilder$" ] }, "description": "Webzie is a website builder optimised for performance.", "website": "https://www.webzie.com/" }, "Weebly": { "cats": [ 1 ], "js": [ "_w.configdomain" ], "scriptSrc": [ "cdn\\d+\\.editmysite\\.com" ], "implies": [ "MySQL", "PHP" ], "description": "Weebly is a website and ecommerce service.", "website": "https://www.weebly.com" }, "Weglot": { "cats": [ 89 ], "headers": { "weglot-translated": "" }, "scriptSrc": [ "cdn\\.weglot\\.com", "wp-content/plugins/weglot" ], "website": "https://www.weglot.com" }, "Welcart": { "cats": [ 6, 87 ], "cookies": { "usces_cookie": "" }, "html": [ "\u003c!-- welcart version : v([\\d.]+)\\;version:\\1", "\u003clink[^\u003e]+?href=\"[^\"]+usces_default(?:\\.min)?\\.css" ], "scriptSrc": [ "uscesl10n" ], "description": "Welcart is a free ecommerce plugin for WordPress with top market share in Japan.", "website": "https://www.welcart.com", "cpe": "cpe:2.3:a:welcart:welcart:*:*:*:*:*:*:*:*" }, "WeltPixel Pearl Theme": { "cats": [ 19 ], "js": [ "pearl" ], "implies": [ "Magento\\;version:2" ], "description": "Pearl Theme for Magento 2 by WeltPixel. Pearl Theme is following the Magento architecture, layouts and best practice in order to assure highest compatibility with 3rd party extensions.", "website": "https://www.weltpixel.com/magento-2-theme-pearl" }, "Whatfix": { "cats": [ 58 ], "js": [ "_wfx_add_logger", "_wfx_settings", "wfx_is_playing__" ], "scriptSrc": [ "\\.whatfix\\.com/" ], "description": "Whatfix is a SaaS based platform which provides in-app guidance and performance support for web applications and software products.", "website": "https://whatfix.com" }, "WhatsApp Business Chat": { "cats": [ 52 ], "description": "WhatsApp Business is a free to download app available on Android and iPhone using which businesses can connect with their customers.", "website": "https://www.whatsapp.com/business" }, "Wheelio": { "cats": [ 5 ], "scriptSrc": [ "wheelioapp\\.azureedge\\.net" ], "description": "Wheelio is gamified pop-up/widget for ecommerce sites.", "website": "https://wheelio-app.com/" }, "Whistl": { "cats": [ 99 ], "description": "Whistl is a postal delivery company operating in the United Kingdom.", "website": "https://www.whistl.co.uk" }, "Whooshkaa": { "cats": [ 5 ], "html": [ "\u003ciframe src=\"[^\u003e]+whooshkaa\\.com" ], "website": "https://www.whooshkaa.com" }, "WideBundle": { "cats": [ 100 ], "scriptSrc": [ "//widebundle\\.com/" ], "implies": [ "Shopify" ], "description": "WideBundle is a Shopify application that allows a merchant to set up bundles on his store.", "website": "https://en.widebundle.com" }, "Widen": { "cats": [ 95 ], "js": [ "widensessiontimer", "widenui" ], "scriptSrc": [ "assets/\\d+-\\d+/stack/en/widenjs\\.js" ], "description": "Widen is a digital asset management and product information management solutions provider.", "website": "https://www.widen.com" }, "WidgetWhats": { "cats": [ 52 ], "js": [ "wwwa_loaded" ], "scriptSrc": [ "\\.widgetwhats\\.com/" ], "description": "WidgetWhats is a fully customizable chat widget with appearance, text, color, button style and position.", "website": "https://widgetwhats.com" }, "Wigzo": { "cats": [ 32 ], "js": [ "wigzo" ], "scriptSrc": [ "app\\.wigzo\\.com" ], "description": "Wigzo is e-commerce marketing automation platform that helps businesses of every size dig deeper into data to find opportunities to increase their sales and revenue.", "website": "https://www.wigzo.com/" }, "Wiki.js": { "cats": [ 4 ], "js": [ "wiki.$_apolloinitdata", "wiki.$apolloprovider" ], "implies": [ "Node.js" ], "description": "Wiki.js is a wiki engine running on Node.js and written in JavaScript.", "website": "https://js.wiki" }, "Wikinggruppen": { "cats": [ 6 ], "html": [ "\u003c!-- wikinggruppen" ], "website": "https://wikinggruppen.se/" }, "WikkaWiki": { "cats": [ 8 ], "html": [ "powered by \u003ca href=\"[^\u003e]+wikkawiki" ], "meta": { "generator": [ "wikkawiki" ] }, "description": "WikkaWiki is an open-source wiki application written in PHP.", "website": "https://wikkawiki.org" }, "WildJar": { "cats": [ 10 ], "scriptSrc": [ "trkcall\\.com/scripts" ], "description": "WildJar is a call tracking and intelligence platform which helps you understand where your leads are coming from, who is calling you, what your conversations are about and connect that data into other platforms.", "website": "https://www.wildjar.com" }, "Windows CE": { "cats": [ 28 ], "headers": { "server": "\\bwince\\b" }, "description": "Windows CE is an operating system designed for small footprint devices or embedded systems.", "website": "https://microsoft.com" }, "Windows Server": { "cats": [ 28 ], "headers": { "server": "win32|win64" }, "description": "Windows Server is a brand name for a group of server operating systems.", "website": "https://microsoft.com/windowsserver" }, "WineDirect": { "cats": [ 6 ], "js": [ "vin65.checkout", "vin65remote" ], "meta": { "generator": [ "^winedirect\\secommerce" ] }, "description": "WineDirect is an all-in-one ecommerce and POS (Point of Sale) platform that is specifically designed for wineries and wine retailers.", "website": "https://www.winedirect.com" }, "Wink": { "cats": [ 26, 12 ], "js": [ "wink.version" ], "scriptSrc": [ "(?:_base/js/base|wink).*\\.js" ], "description": "Wink Toolkit is a JavaScript toolkit used to build mobile web apps.", "website": "https://winktoolkit.org" }, "Winstone Servlet Container": { "cats": [ 22 ], "headers": { "server": "winstone servlet (?:container|engine) v?([\\d.]+)?\\;version:\\1", "x-powered-by": "winstone(?:\\/([\\d.]+))?\\;version:\\1" }, "website": "https://winstone.sourceforge.net" }, "Wirecard": { "cats": [ 41 ], "js": [ "wirecardhpp", "wirecardpaymentpage" ], "scriptSrc": [ "\\.wirecard\\.com/" ], "description": "Wirecard is a defunct German payment processor and financial services provider.", "website": "https://www.wirecard.com" }, "Wisepops": { "cats": [ 5, 32 ], "js": [ "wisepops._api", "wisepopsobject" ], "scriptSrc": [ "loader\\.wisepops\\.com/get-loader\\.js" ], "description": "Wisepops is an intelligent popup and marketing automation system that offers marketers a single platform from which to create and manage website popups.", "website": "https://wisepops.com" }, "Wishlist King": { "cats": [ 100 ], "js": [ "appmate.version", "appmate.wk" ], "description": "Wishlist King is a Shopify app which helps you to add your favorite products or share the wishlist with your friends built by Appmate.", "website": "https://appmate.io" }, "Wistia": { "cats": [ 14 ], "js": [ "wistia", "wistiaembeds", "wistiautils" ], "scriptSrc": [ "\\.wistia\\.com" ], "description": "Wistia is designed exclusively to serve companies using video on their websites for marketing, support, and sales.", "website": "https://wistia.com" }, "With Reach": { "cats": [ 106 ], "scriptSrc": [ "\\.rch\\.io/", "checkout\\.gointerpay\\.net" ], "description": "With Reach is a fintech/payments service provider that helps retailers connect with customers around the world.", "website": "https://www.withreach.com" }, "Wix": { "cats": [ 1, 11 ], "cookies": { "domain": "\\.wix\\.com" }, "js": [ "wixbisession", "wixperformancemeasurements" ], "headers": { "x-wix-renderer-server": "", "x-wix-request-id": "", "x-wix-server-artifact-id": "" }, "scriptSrc": [ "static\\.parastorage\\.com" ], "meta": { "generator": [ "wix\\.com website builder" ] }, "implies": [ "React" ], "description": "Wix provides cloud-based web development services, allowing users to create HTML5 websites and mobile sites.", "website": "https://www.wix.com" }, "Wix Answers": { "cats": [ 52 ], "scriptSrc": [ "\\.wixanswers\\.com/" ], "description": "Wix Answers is a cloud-based help desk software.", "website": "https://www.wixanswers.com" }, "Wix eCommerce": { "cats": [ 6 ], "implies": [ "Wix" ], "website": "https://www.wix.com/freesitebuilder/tae-store" }, "WiziShop": { "cats": [ 6 ], "js": [ "wiziblock_array", "wiziblocks_list", "wscfg.bnavajust" ], "headers": { "server": "^wiziserver$" }, "description": "WiziShop is an ecommerce solution provider.", "website": "https://wizishop.com" }, "Wizpay": { "cats": [ 91 ], "scriptSrc": [ "wp-content/plugins/creditcorp-wizardpay/.+\\?ver=([\\d\\.]+)\\;version:\\1" ], "description": "Wizpay is a buy now pay later solution.", "website": "https://www.wizpay.com.au" }, "Wolf CMS": { "cats": [ 1 ], "html": [ "(?:\u003ca href=\"[^\u003e]+wolfcms\\.org[^\u003e]+\u003ewolf cms(?:\u003c/a\u003e)? inside|thank you for using \u003ca[^\u003e]+\u003ewolf cms)" ], "implies": [ "PHP" ], "website": "https://www.wolfcms.org" }, "Woltlab Community Framework": { "cats": [ 1 ], "scriptSrc": [ "wcf\\..*\\.js" ], "implies": [ "PHP" ], "website": "https://www.woltlab.com" }, "WooCommerce": { "cats": [ 6, 87 ], "js": [ "woocommerce_params" ], "scriptSrc": [ "/woocommerce(?:\\.min)?\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1", "woocommerce" ], "meta": { "generator": [ "woocommerce ([\\d.]+)\\;version:\\1" ] }, "description": "WooCommerce is an open-source ecommerce plugin for WordPress.", "website": "https://woocommerce.com" }, "WooCommerce Blocks": { "cats": [ 87 ], "description": "WooCommerce Blocks offers a range of Gutenberg blocks you can use to build and customise your site.", "website": "https://github.com/woocommerce/woocommerce-gutenberg-products-block" }, "WooCommerce Multilingual": { "cats": [ 87, 89 ], "scriptSrc": [ "/wp-content/plugins/woocommerce-multilingual/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "WooCommerce Multilingual plugin makes it possible to run fully multilingual ecommerce sites using WooCommerce and WPML.", "website": "https://wordpress.org/plugins/woocommerce-multilingual" }, "WooCommerce PayPal Checkout Payment Gateway": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/woocommerce-gateway-paypal-express-checkout/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "PayPal" ], "description": "WooCommerce PayPal Checkout Payment Gateway is a WordPress plugin which allows you to securely sell your products and subscriptions online using in-context checkout.", "website": "https://github.com/woocommerce/woocommerce-gateway-paypal-express-checkout" }, "WooCommerce PayPal Payments": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/woocommerce-paypal-payments/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "PayPal" ], "description": "WooCommerce PayPal Payments is a latest WordPress plugin with most complete payment processing solution. Accept PayPal exclusives, credit/debit cards and local payment methods.", "website": "https://github.com/woocommerce/woocommerce-paypal-payments" }, "WooCommerce Stripe Payment Gateway": { "cats": [ 87 ], "scriptSrc": [ "/wp-content/plugins/woocommerce-gateway-stripe/" ], "implies": [ "Stripe" ], "description": "WooCommerce Stripe Payment Gateway plugin extends WooCommerce allowing you to take payments directly on your store via Stripe’s API.", "website": "https://woocommerce.com/products/stripe" }, "WooCommerce Subscriptions": { "cats": [ 87 ], "implies": [ "WooCommerce" ], "description": "WooCommerce Subscriptions primarily allows you to create and sell subscription products from your WooCommerce shop.", "website": "https://woocommerce.com/products/woocommerce-subscriptions" }, "Woopra": { "cats": [ 10 ], "scriptSrc": [ "static\\.woopra\\.com" ], "website": "https://www.woopra.com" }, "Woostify": { "cats": [ 80 ], "js": [ "woostify_woocommerce_general", "woostifyconditionscrolling" ], "scriptSrc": [ "/wp-content/themes/woostify/" ], "implies": [ "WooCommerce" ], "description": "Woostify is fast, lightweight, responsive and flexible WooCommerce theme built with SEO, speed, and usability in mind.", "website": "https://woostify.com" }, "WoowUp": { "cats": [ 53 ], "js": [ "wu._trackproductvtexfield" ], "scriptSrc": [ "assets-cdn\\.woowup\\.com/" ], "description": "WoowUp is a tool of CRM and predictive marketing.", "website": "https://www.woowup.com" }, "WordAds": { "cats": [ 36 ], "scriptSrc": [ "\\.pubmine\\.com/" ], "description": "WordAds is an advertising platform run by Automatic that allows bloggers and website owners to place advertisements on their blogs and websites.", "website": "https://wordads.co" }, "WordPress": { "cats": [ 1, 11 ], "js": [ "wp_username" ], "headers": { "link": "rel=\"https://api\\.w\\.org/\"", "x-pingback": "/xmlrpc\\.php$" }, "html": [ "\u003clink rel=[\"']stylesheet[\"'] [^\u003e]+/wp-(?:content|includes)/", "\u003clink[^\u003e]+s\\d+\\.wp\\.com" ], "scriptSrc": [ "/wp-(?:content|includes|admin)/", "wp-embed\\.min\\.js" ], "meta": { "generator": [ "^wordpress(?: ([\\d.]+))?\\;version:\\1" ], "shareaholic:wp_version": [] }, "implies": [ "MySQL", "PHP" ], "description": "WordPress is a free and open-source content management system written in PHP and paired with a MySQL or MariaDB database. Features include a plugin architecture and a template system.", "website": "https://wordpress.org", "cpe": "cpe:2.3:a:wordpress:wordpress:*:*:*:*:*:*:*:*" }, "WordPress Default": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/default/" ], "description": "WordPress Default is a default WordPress theme.", "website": "https://wordpress.org/themes/default" }, "WordPress Multisite": { "cats": [ 88 ], "description": "A multisite network is a collection of sites that all share the same WordPress installation core files. ", "website": "https://wordpress.org/documentation/article/create-a-network/" }, "WordPress Super Cache": { "cats": [ 23, 87 ], "headers": { "wp-super-cache": "" }, "html": [ "\u003c!--[^\u003e]+wp-super-cache" ], "description": "WordPress Super Cache is a static caching plugin for WordPress.", "website": "https://z9.io/wp-super-cache/" }, "WordPress VIP": { "cats": [ 62 ], "headers": { "x-powered-by": "^wordpress vip|wpvip\\.com" }, "implies": [ "WordPress" ], "description": "WordPress VIP is a managed hosting platform for WordPress.", "website": "https://wpvip.com" }, "WordPress.com": { "cats": [ 62 ], "headers": { "host-header": "wordpress\\.com" }, "implies": [ "WordPress" ], "description": "WordPress.com is a platform for self-publishing that is popular for blogging and other works.", "website": "https://wordpress.com" }, "Wordfence": { "cats": [ 87, 16 ], "js": [ "wordfenceajaxwatcher" ], "scriptSrc": [ "/wp-content/plugins/wordfence/.+admin\\.ajaxwatcher\\.\\d+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Wordfence is a security plugin for sites that use WordPress. Wordfence includes an endpoint firewall and malware scanner.", "website": "https://www.wordfence.com" }, "Wordfence Login Security": { "cats": [ 87, 16 ], "scriptSrc": [ "/wp-content/plugins/wordfence/.+login\\.\\d+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Wordfence Login Security contains a subset of the functionality found in the full Wordfence plugin: Two-factor Authentication, XML-RPC Protection and Login Page CAPTCHA.", "website": "https://www.wordfence.com" }, "Workable": { "cats": [ 101 ], "js": [ "webpackchunk_workable_candidate" ], "description": "Workable is the all-in-one hiring solution.", "website": "https://www.workable.com" }, "Workarea": { "cats": [ 6 ], "js": [ "weblinc.cartcount", "workarea" ], "implies": [ "Elasticsearch", "MongoDB", "Ruby on Rails" ], "description": "Workarea is a SaaS ecommerce platform for medium to large businesses.", "website": "https://www.workarea.com" }, "World4You": { "cats": [ 88 ], "description": "World4You operates homepage and domain solutions. World4Youu operates data centers in Austria and provides data protection.", "website": "https://www.world4you.com" }, "WorldPay": { "cats": [ 41 ], "description": "WorldPay is a merchant services and payment processing provider offering a payment gateway for online transactions.", "website": "https://online.worldpay.com" }, "WorldShopping": { "cats": [ 106 ], "scriptSrc": [ "checkout-api\\.worldshopping\\.jp/(v\\d+)?\\;version:\\1" ], "description": "WorldShopping makes online purchases in Japan easier for international visitors.", "website": "https://www.worldshopping.global/" }, "Worldz": { "cats": [ 5, 76 ], "scriptSrc": [ "\\.worldztool\\.com/" ], "description": "Worldz calculates the economic value of a user’s social popularity (qualitatively and quantitatively). In proportion to this value, it provides a personalised discount, which can be applied in exchange for a social sharing by the user on their Instagram or Facebook profile.", "website": "https://www.worldz-business.net" }, "Wowza Video Player": { "cats": [ 14 ], "js": [ "wowzaplayer", "wowzaplayer.jsplayer" ], "description": "Wowza Video Player is a robust, industry standard player that provides HTML5, HLS, MPEG-DASH, and LL-DASH playback.", "website": "https://www.wowza.com/video/player" }, "Wufoo": { "cats": [ 73 ], "description": "Wufoo is an online form builder that creates forms including contact forms, online payments, online surveys and event registrations.", "website": "https://www.wufoo.com" }, "Wuilt": { "cats": [ 1, 51 ], "implies": [ "Node.js", "React" ], "description": "Wuilt is the first Arab platform of its kind to help individuals and businesses create ready-made websites and ecommerce stores.", "website": "https://wuilt.com" }, "Wunderkind": { "cats": [ 32 ], "js": [ "bouncex" ], "headers": { "content-security-policy": "\\.smarterhq\\.io" }, "scriptSrc": [ "\\.bounceexchange\\.com", "\\.smarterhq\\.io/" ], "description": "Wunderkind (Formerly BounceX) is a software for behavioural marketing technologies, created to de-anonymise site visitors, analyse their digital behaviour and create relevant digital experiences regardless of channel or device.", "website": "https://www.wunderkind.co" }, "Wurfl": { "cats": [ 59 ], "js": [ "wurfl" ], "scriptSrc": [ "\\.wurfl\\.io" ], "description": "WURFL.js is JavaScript that detects device models of smartphones, tablets, smart TVs and game consoles accessing your website.", "website": "https://web.wurfl.io/" }, "WysiBB": { "cats": [ 24 ], "scriptSrc": [ "/jquery\\.wysibb\\.min\\.js" ], "implies": [ "jQuery" ], "description": "WysiBB very simple and functional open-source WYSIWYG BBCode editor based on jQuery.", "website": "https://wysibb.com" }, "X-Cart": { "cats": [ 6 ], "js": [ "xcart_web_dir", "xliteconfig" ], "meta": { "generator": [ "x-cart(?: (\\d+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": " X-Cart is an open source PHP shopping cart ecommerce software platform.", "website": "https://kb.x-cart.com" }, "X.ai": { "cats": [ 72 ], "js": [ "xdotaiaction", "xdotaibutton" ], "scriptSrc": [ "(?:cdn)?x\\.ai/.*/xdotai-embed\\.js" ], "description": "X.ai is a scheduling tool that organizes meeting times and improves lead conversion by adding embedded booking buttons to websites or within live chat applications.", "website": "https://x.ai" }, "XAMPP": { "cats": [ 22 ], "html": [ "\u003ctitle\u003exampp(?: version ([\\d\\.]+))?\u003c/title\u003e\\;version:\\1" ], "meta": { "author": [ "kai oswald seidler\\;confidence:10" ] }, "implies": [ "Apache HTTP Server", "MySQL", "PHP", "Perl" ], "website": "https://www.apachefriends.org/en/xampp.html" }, "XGen Ai": { "cats": [ 76 ], "scriptSrc": [ "//assets\\.xgen\\.dev/" ], "description": "XGen Ai is a cloud-based customer journey mapping tool that helps businesses manage product recommendations via artificial intelligence (AI).", "website": "https://xgen.ai" }, "XMB": { "cats": [ 2 ], "html": [ "\u003c!-- powered by xmb" ], "website": "https://www.xmbforum.com" }, "XOOPS": { "cats": [ 1 ], "js": [ "xoops" ], "meta": { "generator": [ "xoops" ] }, "implies": [ "PHP" ], "website": "https://xoops.org" }, "XRegExp": { "cats": [ 59 ], "js": [ "xregexp.version" ], "scriptSrc": [ "/([\\d.]+)/xregexp(?:\\.min)?\\.js\\;version:\\1", "xregexp.*\\.js", "xregexp[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "website": "https://xregexp.com" }, "XSLT": { "cats": [ 27 ], "html": [ "\u003cxsl[^\u003e]* version=\"(.+)\"\\;version:\\1" ], "description": "XSLT is designed for use as part of XSL, which is a stylesheet language for XML.", "website": "https://www.w3.org/TR/xslt-10" }, "XWiki": { "cats": [ 8 ], "html": [ "\u003chtml[^\u003e]data-xwiki-[^\u003e]\u003e" ], "meta": { "wiki": [ "xwiki" ] }, "implies": [ "Java\\;confidence:99" ], "description": "XWiki is a free wiki software platform written in Java.", "website": "https://www.xwiki.org" }, "Xajax": { "cats": [ 59 ], "scriptSrc": [ "xajax_core.*\\.js" ], "website": "https://xajax-project.org" }, "Xanario": { "cats": [ 6 ], "meta": { "generator": [ "xanario shopsoftware" ] }, "website": "https://xanario.de" }, "XenForo": { "cats": [ 2 ], "cookies": { "xf_csrf": "", "xf_session": "" }, "js": [ "xf.guestusername" ], "html": [ "(?:jquery\\.extend\\(true, xenforo|\u003ca[^\u003e]+\u003eforum software by xenforo™|\u003c!--xf:branding|\u003chtml[^\u003e]+id=\"xenforo\")", "\u003chtml id=\"xf\" " ], "implies": [ "MySQL", "PHP" ], "description": "XenForo is a PHP-based forum hosting program for communities that is designed to be deployed on a remote web server.", "website": "https://xenforo.com" }, "Xeora": { "cats": [ 18 ], "headers": { "server": "xeoraengine", "x-powered-by": "xeoracube" }, "html": [ "\u003cinput type=\"hidden\" name=\"_sys_bind_\\d+\" id=\"_sys_bind_\\d+\" /\u003e" ], "scriptSrc": [ "/_bi_sps_v.+\\.js" ], "implies": [ "Microsoft ASP.NET" ], "website": "https://www.xeora.org" }, "Xitami": { "cats": [ 22 ], "headers": { "server": "xitami(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://xitami.com" }, "Xonic": { "cats": [ 6 ], "html": [ "powered by \u003ca href=\"http://www\\.xonic-solutions\\.de/index\\.php\" target=\"_blank\"\u003exonic-solutions shopsoftware\u003c/a\u003e" ], "scriptSrc": [ "core/jslib/jquery\\.xonic\\.js\\.php" ], "meta": { "keywords": [ "xonic-solutions" ] }, "website": "https://www.xonic-solutions.de" }, "XpressEngine": { "cats": [ 1 ], "meta": { "generator": [ "xpressengine" ] }, "website": "https://www.xpressengine.com/" }, "Xpresslane": { "cats": [ 41 ], "scriptSrc": [ "apps\\.xpresslane\\.in/" ], "description": "Xpresslane is a checkout platform for ecommerce that focuses on increasing conversion during the checkout process.", "website": "https://www.xpresslane.in" }, "Xretail": { "cats": [ 6 ], "meta": { "author": [ "^xretail team$" ] }, "description": "Xretail is a subscription based product that enables the omni-channel ecommerce approach to its customers.", "website": "https://xretail.com" }, "Xserver": { "cats": [ 88 ], "description": "Xserver engages in web hosting, web application and internet-related services.", "website": "https://www.xserver.ne.jp" }, "Xtra": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/xtra/.+custom\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "Xtra is a creative, responsive, live drag and drop and easy-to-use WordPress theme for any kind of websites.", "website": "https://xtratheme.com" }, "Xtremepush": { "cats": [ 32 ], "js": [ "xtremepush" ], "description": "Xtremepush is a customer engagement, personalisation and data platform. It's purpose-built for multichannel and mobile marketing.", "website": "https://xtremepush.com" }, "YMQ Product Options Variant Option": { "cats": [ 100 ], "js": [ "ymq_option.v" ], "implies": [ "Shopify" ], "description": "YMQ Product Options Variant Option help add an unlimited number of product options to your items so you're not restricted by Shopify's limit of 3 options and 100 variants.", "website": "https://apps.shopify.com/ymq-options" }, "YNAP Ecommerce": { "cats": [ 6 ], "js": [ "ycookieapiurl", "ytos" ], "description": "YNAP provides a suite of B2B luxury services including online and mobile store development, omnichannel logistics, customer care, digital marketing, data-driven merchandising and global strategy development.", "website": "https://www.ynap.com/pages/about-us/what-we-do/monobrand/" }, "YUI": { "cats": [ 59 ], "js": [ "yahoo.version", "yui.version" ], "scriptSrc": [ "(?:/yui/|yui\\.yahooapis\\.com)" ], "description": "YUI is a JavaScript and CSS library with more than 30 unique components including low-level DOM utilities and high-level user-interface widgets.", "website": "https://clarle.github.io/yui3", "cpe": "cpe:2.3:a:yahoo:yui:*:*:*:*:*:*:*:*" }, "YUI Doc": { "cats": [ 4 ], "html": [ "(?:\u003chtml[^\u003e]* yuilibrary\\.com/rdf/[\\d.]+/yui\\.rdf|\u003cbody[^\u003e]+class=\"yui3-skin-sam)" ], "description": "UIDoc is a Node.js application used at build time to generate API documentation.", "website": "https://developer.yahoo.com/yui/yuidoc" }, "YaBB": { "cats": [ 2 ], "html": [ "powered by \u003ca href=\"[^\u003e]+yabbforum" ], "website": "https://www.yabbforum.com" }, "Yahoo Advertising": { "cats": [ 36, 77 ], "js": [ "adxinserthtml", "yahoo_retargeting_pv_id", "yahoo_ydn_conv_label", "yahoo_ydn_conv_transaction_id", "yahoocvload" ], "scriptSrc": [ "(?:adinterax|adserver\\.yahoo)\\.com" ], "description": "Yahoo Advertising includes a comprehensive suite of web, mobile, and video ad products across native, audience, and premium display, which are accessible through a new buying platform.", "website": "https://www.adtech.yahooinc.com" }, "Yahoo! Ecommerce": { "cats": [ 6 ], "js": [ "ystore" ], "headers": { "x-xrds-location": "/ystore/" }, "html": [ "\u003clink[^\u003e]+store\\.yahoo\\.net" ], "website": "https://smallbusiness.yahoo.com/ecommerce" }, "Yahoo! Tag Manager": { "cats": [ 42 ], "html": [ "\u003c!-- (?:end )?yahoo! tag manager --\u003e" ], "scriptSrc": [ "b\\.yjtag\\.jp/iframe" ], "website": "https://tagmanager.yahoo.co.jp/" }, "Yahoo! Web Analytics": { "cats": [ 10 ], "js": [ "ywa" ], "scriptSrc": [ "d\\.yimg\\.com/mi/ywa\\.js" ], "website": "https://web.analytics.yahoo.com" }, "YalinHost": { "cats": [ 88 ], "description": "YalinHost is a web hosting service provider.", "website": "https://yalinhost.com" }, "Yampi Checkout": { "cats": [ 41 ], "js": [ "yampicheckouturl" ], "description": "Yampi Checkout is an payment processor from Brazil.", "website": "https://www.yampi.com.br/checkout" }, "Yampi Virtual store": { "cats": [ 6 ], "js": [ "yampi.api_domain", "yampi.cart_token" ], "scriptSrc": [ "cdn\\.yampi\\.io/" ], "implies": [ "Yampi Checkout" ], "description": "Yampi Virtual store is an ecommerce platform from Brazil.", "website": "https://www.yampi.com.br/loja-virtual" }, "Yandex SmartCaptcha": { "cats": [ 16 ], "headers": { "x-yandex-captcha": "" }, "description": "Yandex SmartCaptcha is a service for verifying queries to identify user requests and block bots.", "website": "https://cloud.yandex.com/en/services/smartcaptcha" }, "Yandex.Cloud": { "cats": [ 62 ], "description": "Yandex.Cloud is a public cloud platform where companies can create and develop projects using Yandex's scalable computing power, advanced technologies, and infrastructure.", "website": "https://cloud.yandex.com/en/" }, "Yandex.Cloud CDN": { "cats": [ 31 ], "implies": [ "Yandex.Cloud" ], "description": "Yandex.Cloud CDN helps you streamline static content delivery for your web service.", "website": "https://cloud.yandex.com/en/services/cdn" }, "Yandex.Direct": { "cats": [ 36 ], "js": [ "yandex_ad_format", "yandex_partner_id" ], "html": [ "\u003cyatag class=\"ya-partner__ads\"\u003e" ], "scriptSrc": [ "https?://an\\.yandex\\.ru/" ], "description": "Yandex Direct is the platform designed for sponsored ad management.", "website": "https://partner.yandex.com" }, "Yandex.Messenger": { "cats": [ 5, 52 ], "js": [ "yandexchatwidget" ], "scriptSrc": [ "chat\\.s3\\.yandex\\.net/widget\\.js" ], "description": "Yandex.Messenger is an instant messaging application.", "website": "https://dialogs.yandex.ru" }, "Yandex.Metrika": { "cats": [ 10 ], "js": [ "yandex_metrika" ], "scriptSrc": [ "cdn\\.jsdelivr\\.net/npm/yandex\\-metrica\\-watch/watch\\.js", "mc\\.yandex\\.ru/metrika/(?:tag|watch)\\.js" ], "description": "Yandex.Metrica is a free web analytics service that tracks and reports website traffic.", "website": "https://metrika.yandex.com" }, "Yapla": { "cats": [ 111 ], "js": [ "yaplaconsent.cookiename" ], "meta": { "generator": [ "^yapla\\sv([\\d\\.]+)\\;version:\\1" ] }, "description": "Yapla is a web-based software platform that provides event management and fundraising solutions for non-profit organisations, associations, and event planners.", "website": "https://www.yapla.com" }, "Yaws": { "cats": [ 22 ], "headers": { "server": "yaws(?: ([\\d.]+))?\\;version:\\1" }, "description": "Yaws (Yet Another Web Server) is an open-source web server designed to deliver dynamic content efficiently. It was developed by Claes (klacke) Wikström and is written in Erlang, a functional programming language.", "website": "https://github.com/erlyaws/yaws" }, "Ycode": { "cats": [ 51 ], "description": "Ycode is a no-code development platform that allows users to create web and mobile applications without any coding skills.", "website": "https://www.ycode.com" }, "Yektanet": { "cats": [ 36 ], "js": [ "yektanet" ], "meta": { "yektanet_session_last_activity": [] }, "description": "Yektanet is the biggest and most advanced native advertising network in Iran.", "website": "https://www.yektanet.com" }, "Yelp Reservations": { "cats": [ 93 ], "description": "Yelp Reservations is a cloud-based restaurant management system.", "website": "https://yelp.com" }, "Yelp Review Badge": { "cats": [ 5 ], "scriptSrc": [ "yelp\\.com/biz_badge_js" ], "description": "Yelp Review Badges showcase business reviews from Yelp on websites.", "website": "https://yelp.com" }, "Yepcomm": { "cats": [ 6 ], "meta": { "author": [ "yepcomm tecnologia" ], "copyright": [ "yepcomm tecnologia" ] }, "website": "https://www.yepcomm.com.br" }, "Yett": { "cats": [ 67 ], "js": [ "yett_blacklist" ], "scriptSrc": [ "/yett@([\\d\\.]+)/dist/yett\\.min\\.js\\;version:\\1" ], "description": "Yett is a small webpage library to control the execution of (third party) scripts like analytics.", "website": "https://github.com/elbywan/yett" }, "Yext": { "cats": [ 29, 19 ], "js": [ "answers._analyticsreporterservice._baseurl", "yext.analytics", "yext.baseurl", "yext_analytics", "yextanalyticsenabled", "yextanalyticsobject" ], "description": "Yext is a technology company that provides a cloud-based platform for managing digital knowledge and online reputation.", "website": "https://www.yext.com" }, "Yieldify": { "cats": [ 76 ], "js": [ "_yieldify" ], "scriptSrc": [ "\\.yieldify\\.com" ], "description": "Yieldify is a customer journey optimisation platform that brings personalisation to the full customer journey.", "website": "https://www.yieldify.com" }, "Yieldlab": { "cats": [ 36 ], "scriptSrc": [ "^https?://(?:[^/]+\\.)?yieldlab\\.net/" ], "website": "https://yieldlab.de" }, "Yii": { "cats": [ 18 ], "cookies": { "yii_csrf_token": "" }, "html": [ "\u003c!\\[cdata\\[yii-block-(?:head|body-begin|body-end)\\]", "\u003cinput type=\"hidden\" value=\"[a-za-z0-9]{40}\" name=\"yii_csrf_token\" \\/\u003e", "powered by \u003ca href=\"http://www\\.yiiframework\\.com/\" rel=\"external\"\u003eyii framework\u003c/a\u003e" ], "scriptSrc": [ "/assets/[a-za-z0-9]{8}\\/yii\\.js$", "/yii\\.(?:validation|activeform)\\.js" ], "implies": [ "PHP" ], "description": "Yii is an open-source, object-oriented, component-based MVC PHP web application framework.", "website": "https://www.yiiframework.com" }, "Yoast Duplicate Post": { "cats": [ 87 ], "description": "Yoast Duplicate Post is a WordPress plugin which allows users to clone posts of any type, or copy them to new drafts for further editing.", "website": "https://wordpress.org/plugins/duplicate-post" }, "Yoast SEO": { "cats": [ 54, 87 ], "html": [ "\u003c!-- this site is optimized with the yoast (?:wordpress )?seo plugin v([^\\s]+) -\\;version:\\1", "\u003c!-- this site is optimized with the yoast seo premium plugin v(?:[^\\s]+) \\(yoast seo v([^\\s]+)\\) -\\;version:\\1" ], "implies": [ "WordPress" ], "description": "Yoast SEO is a search engine optimisation plugin for WordPress and other platforms.", "website": "https://yoast.com/wordpress/plugins/seo/" }, "Yoast SEO Premium": { "cats": [ 54 ], "html": [ "\u003c!-- this site is optimized with the yoast seo premium plugin v([^\\s]+) \\;version:\\1" ], "description": "Yoast SEO Premium is a search engine optimisation plugin for WordPress and other platforms.", "website": "https://yoast.com/wordpress/plugins/seo/" }, "Yoast SEO for Shopify": { "cats": [ 54, 100 ], "html": [ "\u003c!-- this site is optimized with yoast seo for shopify --\u003e" ], "implies": [ "Shopify" ], "description": "Yoast SEO for Shopify optimizes Shopify shops.", "website": "https://yoast.com/shopify/apps/yoast-seo/" }, "Yodel": { "cats": [ 99 ], "description": "Yodel is a delivery company for B2B and B2C orders in the United Kingdom.", "website": "https://www.yodel.co.uk/" }, "Yola": { "cats": [ 51 ], "scriptSrc": [ "\\.yola(?:cdn)?\\.(?:net|com)/" ], "description": "Yola is a website builder and website hosting company headquartered in San Francisco.", "website": "https://www.yola.com" }, "YooMoney": { "cats": [ 41 ], "headers": { "content-security-policy": "\\.yoomoney\\.ru" }, "scriptSrc": [ "\\.yoomoney\\.ru/" ], "description": "YooMoney is an IT company working with electronic payments on the Internet, creating and supporting financial services for individuals and businesses.", "website": "https://yoomoney.ru" }, "Yoori": { "cats": [ 6 ], "scripts": [ "console\\.log\\(\\'yoori-ecommerce" ], "implies": [ "Laravel", "MySQL", "PHP", "PWA", "Vue.js", "cPanel" ], "description": "Yoori is a multi-vendor PWA ecommerce CMS.", "website": "https://spagreen.net/yoori-ecommerce-solution" }, "Yotpo Loyalty \u0026 Referrals": { "cats": [ 84 ], "js": [ "swellapi", "swellconfig" ], "scriptSrc": [ "cdn(?:-loyalty)?\\.(?:swellrewards|yotpo)\\.com/" ], "description": "Yotpo is a user-generated content marketing platform.", "website": "https://www.yotpo.com/platform/loyalty/" }, "Yotpo Reviews": { "cats": [ 90 ], "js": [ "yotpo" ], "scriptSrc": [ "(?!cdn-loyalty)\\.yotpo\\.com/" ], "description": "Yotpo is a user-generated content marketing platform.", "website": "https://www.yotpo.com/platform/reviews/" }, "Yotpo SMSBump": { "cats": [ 32 ], "js": [ "smsbumpform" ], "description": "SMS Bump is a SMS marketing and automations app which was acquired by Yotpo.", "website": "https://www.yotpo.com/platform/smsbump-sms-marketing/" }, "Yottaa": { "cats": [ 42, 74, 92 ], "scriptSrc": [ "cdn\\.yottaa\\.\\w+/" ], "meta": { "x-yottaa-metrics": [], "x-yottaa-optimizations": [] }, "description": "Yottaa is an ecommerce optimisation platform that helps with conversions, performance and security.", "website": "https://www.yottaa.com" }, "YouCam Makeup": { "cats": [ 105 ], "js": [ "ymk.applymakeupbylook", "ymk.caldeltae" ], "scriptSrc": [ "plugins-media\\.(?:perfectcorp|makeupar)\\.com/" ], "description": "YouCam Makeup is a cross-platform virtual makeup solution for omnichannel ecommerce.", "website": "https://www.perfectcorp.com/business/products/virtual-makeup" }, "YouCan": { "cats": [ 6 ], "js": [ "ycpay" ], "headers": { "x-powered-by": "youcan\\.private\\.dc/" }, "implies": [ "Laravel", "MySQL", "PHP", "Redis" ], "description": "YouCan is an integrated platform specialised in ecommerce, offering a wide range of services needed by merchants and entrepreneurs.", "website": "https://youcan.shop" }, "YouPay": { "cats": [ 100 ], "js": [ "youpay.buttonwindow", "youpayready", "youpaystatus" ], "scriptSrc": [ "app\\.youpay\\.ai/" ], "implies": [ "Shopify" ], "description": "YouPay is an alternative method of payment that allows you to give someone else the ability to pay for your shopping cart with no fees or interest.", "website": "https://youpay.co" }, "YouTrack": { "cats": [ 13 ], "html": [ "data-reactid=\"[^\"]+\"\u003eyoutrack ([0-9.]+)\u003c\\;version:\\1", "no-title=\"youtrack\"\u003e", "type=\"application/opensearchdescription\\+xml\" title=\"youtrack\"/\u003e" ], "description": "YouTrack is a browser-based bug tracker, issue tracking system and project management software.", "website": "https://www.jetbrains.com/youtrack/" }, "YouTube": { "cats": [ 14 ], "html": [ "\u003c(?:param|embed|iframe)[^\u003e]+youtube(?:-nocookie)?\\.com/(?:v|embed)" ], "scriptSrc": [ "\\.youtube\\.com/" ], "description": "YouTube is a video sharing service where users can create their own profile, upload videos, watch, like and comment on other videos.", "website": "https://www.youtube.com" }, "YunoHost": { "cats": [ 28 ], "scriptSrc": [ "/ynh_portal\\.js" ], "implies": [ "Debian" ], "description": "YunoHost is a server operating system that is free and open-source, allowing users to host their own web applications, email services, and other online tools. It is based on Debian GNU/Linux.", "website": "https://yunohost.org", "cpe": "cpe:2.3:o:yunohost:yunohost:*:*:*:*:*:*:*:*" }, "ZK": { "cats": [ 18 ], "html": [ "\u003c!-- zk [.\\d\\s]+--\u003e" ], "scriptSrc": [ "zkau/" ], "implies": [ "Java" ], "website": "https://zkoss.org" }, "ZURB Foundation": { "cats": [ 66 ], "js": [ "foundation.version" ], "html": [ "\u003cdiv [^\u003e]*class=\"[^\"]*(?:small|medium|large)-\\d{1,2} columns", "\u003clink[^\u003e]+foundation[^\u003e\"]+css" ], "description": "Zurb Foundation is used to prototype in the browser. Allows rapid creation of websites or applications while leveraging mobile and responsive technology. The front end framework is the collection of HTML, CSS, and Javascript containing design patterns.", "website": "https://foundation.zurb.com" }, "Zabbix": { "cats": [ 19 ], "js": [ "zbxcallpostscripts" ], "html": [ "\u003cbody[^\u003e]+zbxcallpostscripts" ], "meta": { "author": [ "zabbix sia\\;confidence:70" ] }, "implies": [ "PHP" ], "website": "https://zabbix.com", "cpe": "cpe:2.3:a:zabbix:zabbix:*:*:*:*:*:*:*:*" }, "Zakeke": { "cats": [ 76 ], "js": [ "zakekeboot", "zakekecustomizelabel", "zakekeloading", "zakekeproductpage" ], "description": "Zakeke is a product customisation tool compatible with services and apps mostly used to manage ecommerce store.", "website": "https://www.zakeke.com" }, "Zakeke Interactive Product Designer": { "cats": [ 87, 76 ], "scriptSrc": [ "/wp-content/plugins/zakeke-interactive-product-designer/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "implies": [ "Zakeke" ], "description": "Zakeke Interactive Product Designer lets customers personalise any product and visualise how they’ll look before checking out.", "website": "https://www.zakeke.com" }, "Zakeke Visual Customizer": { "cats": [ 100, 76 ], "scriptSrc": [ "\\.zakeke\\.com/scripts/integration/shopify/" ], "implies": [ "Zakeke" ], "description": "Zakeke Visual Customizer is a cloud-connected visual ecommerce tool that allows brands and retailers to offer live, personalised, 2D, 3D, and augmented reality (AR) functionality for their products.", "website": "https://www.zakeke.com" }, "Zakra": { "cats": [ 80 ], "js": [ "zakrafrontend", "zakranavhelper.dimension" ], "scriptSrc": [ "/wp-content/themes/zakra/" ], "description": "Zakra is flexible, fast, lightweight and modern multipurpose WordPress theme that comes with many starter free sites.", "website": "https://zakratheme.com" }, "Zanox": { "cats": [ 36 ], "js": [ "zanox" ], "html": [ "\u003cimg [^\u003e]*src=\"[^\"]+ad\\.zanox\\.com" ], "scriptSrc": [ "zanox\\.com/scripts/zanox\\.js$" ], "website": "https://zanox.com" }, "Zeabur": { "cats": [ 62 ], "headers": { "x-zeabur-request-id": "" }, "description": "Zeabur is a platform for running full stack apps and databases.", "website": "https://zeabur.com" }, "Zeald": { "cats": [ 6 ], "cookies": { "zes_backend": "zeald" }, "description": "Zeald is a full-service website design and digital marketing company.", "website": "https://www.zeald.com" }, "Zeleris": { "cats": [ 99 ], "description": "Zeleris provides door to door shipment delivery to Ireland, UK and the EU.", "website": "https://www.zeleris.com" }, "Zen Cart": { "cats": [ 6 ], "meta": { "generator": [ "zen cart" ] }, "website": "https://www.zen-cart.com" }, "Zend": { "cats": [ 22 ], "cookies": { "zendserversessid": "" }, "headers": { "x-powered-by": "zend(?:server)?(?:[\\s/]?([0-9.]+))?\\;version:\\1" }, "website": "https://zend.com", "cpe": "cpe:2.3:a:zend:zend_server:*:*:*:*:*:*:*:*" }, "Zendesk": { "cats": [ 4, 13, 52 ], "cookies": { "_help_center_session": "", "_zendesk_cookie": "", "_zendesk_shared_session": "" }, "js": [ "zendesk" ], "headers": { "x-zendesk-user-id": "" }, "scriptSrc": [ "static\\.zdassets\\.com" ], "description": "Zendesk is a cloud-based help desk management solution offering customizable tools to build customer service portal, knowledge base and online communities.", "website": "https://zendesk.com" }, "Zendesk Chat": { "cats": [ 52 ], "scriptSrc": [ "v2\\.zopim\\.com" ], "description": "Zendesk Chat is a live chat and communication widget.", "website": "https://zopim.com" }, "Zendesk Sunshine Conversations": { "cats": [ 52 ], "scriptSrc": [ "cdn\\.smooch\\.io/" ], "implies": [ "Zendesk" ], "description": "Zendesk Sunshine Conversations lets you share a single, continuous conversation with every team in your business. With a unified API and native connectors to popular business applications like Zendesk and Slack, everyone in your organization can get access to a single view of the customer conversation.", "website": "https://www.zendesk.com/platform/conversations" }, "Zenfolio": { "cats": [ 7 ], "js": [ "zenfolio" ], "description": "Zenfolio is a photography website builder.", "website": "https://zenfolio.com" }, "Zeotap": { "cats": [ 97 ], "scriptSrc": [ "\\.zeotap\\.com" ], "description": "Zeotap is a customer intelligence platform that helps brands better understand their customers and predict behaviors.", "website": "https://zeotap.com" }, "Zepto": { "cats": [ 59 ], "js": [ "zepto" ], "scriptSrc": [ "zepto.*\\.js" ], "website": "https://zeptojs.com" }, "ZestMoney": { "cats": [ 91 ], "js": [ "zestbind", "zestmerchant", "zestmoneywidget" ], "description": "ZestMoney is a fintech company that uses digital EMI without the need for a credit card or a credit score.", "website": "https://www.zestmoney.in" }, "Zeus Technology": { "cats": [ 36 ], "js": [ "zeus.version", "zeusadunitpath" ], "description": "Zeus Technology is a media monetisation platform that levels the playing field for publishers and advertisers of all sizes.", "website": "https://www.zeustechnology.com" }, "Zid": { "cats": [ 6 ], "cookies": { "zid_catalog_session": "" }, "js": [ "zid.store", "zidtracking.sendgaproductremovefromcartevent" ], "description": "Zid is an ecommerce SaaS that allows merchants to build and manage their online stores.", "website": "https://zid.sa" }, "Ziggy": { "cats": [ 59 ], "js": [ "ziggy" ], "implies": [ "Inertia.js", "Laravel" ], "description": "Ziggy is a library that allows using Laravel named routes in JavaScript.", "website": "https://github.com/tighten/ziggy" }, "Zimbra": { "cats": [ 30 ], "cookies": { "zm_test": "true" }, "implies": [ "Java" ], "website": "https://www.zimbra.com/", "cpe": "cpe:2.3:a:zimbra:zimbra:*:*:*:*:*:*:*:*" }, "ZingChart": { "cats": [ 25 ], "js": [ "zingchart" ], "description": "ZingChart is a open-source and free JavaScript library for building interactive and intuitive charts.", "website": "https://www.zingchart.com" }, "Zinnia": { "cats": [ 11 ], "meta": { "generator": [ "zinnia" ] }, "implies": [ "Django" ], "description": "Zimbra is a is a collaborative software suite that includes an email server and a web client.", "website": "https://django-blog-zinnia.com" }, "Zinrelo": { "cats": [ 84 ], "js": [ "zrl_mi" ], "description": "Zinrelo is an enterprise-grade, loyalty rewards platform.", "website": "https://www.zinrelo.com" }, "Zip": { "cats": [ 41, 91 ], "js": [ "checkout.enabledpayments.zip", "quadpayid", "quadpayshopify" ], "scriptSrc": [ "quadpay\\.com", "static\\.zipmoney\\.com\\.au", "zip\\.co" ], "description": "Zip is a payment service that lets you receive your purchase now and spread the total cost over a interest-free payment schedule.", "website": "https://www.zip.co/" }, "Zipify OCU": { "cats": [ 100 ], "scriptSrc": [ "/zipify-oneclickupsell-vendor\\.js" ], "description": "Zipify OCU allows you to add upsells and cross-sells to your checkout sequence.", "website": "https://zipify.com/apps/ocu/" }, "Zipify Pages": { "cats": [ 100, 51 ], "js": [ "zipifypages" ], "implies": [ "Shopify" ], "description": "Zipify Pages the first landing page builder uniquely designed for ecommerce.", "website": "https://zipify.com/apps/pages/" }, "Zipkin": { "cats": [ 10 ], "headers": { "x-b3-flags": "", "x-b3-parentspanid": "", "x-b3-sampled": "", "x-b3-spanid": "", "x-b3-traceid": "" }, "website": "https://zipkin.io/" }, "Zmags Creator": { "cats": [ 95 ], "js": [ "__zmags" ], "scriptSrc": [ "c(?:reator)?\\.zmags\\.com/" ], "description": "Zmags Creator enables marketers to design and publish endless types of interactive digital experiences without coding.", "website": "https://www.creatorbyzmags.com" }, "Zocdoc": { "cats": [ 72 ], "scriptSrc": [ "offsiteschedule\\.zocdoc\\.com" ], "description": "Zocdoc is a New York City-based company offering an online service that allows people to find and book in-person or telemedicine appointments for medical or dental care.", "website": "https://www.zocdoc.com" }, "Zoey": { "cats": [ 6 ], "js": [ "zoey.developer", "zoey.module", "zoeydev" ], "scriptSrc": [ "cdna4\\.zoeysite\\.com" ], "implies": [ "MySQL", "PHP" ], "description": "Zoey is a cloud-based ecommerce platform for B2B and wholesale businesses.", "website": "https://www.zoey.com/" }, "Zoho": { "cats": [ 53 ], "description": "Zoho is a web-based online office suite.", "website": "https://www.zoho.com/" }, "Zoho Mail": { "cats": [ 75 ], "implies": [ "Zoho" ], "description": "Zoho Mail is an email hosting service for businesses.", "website": "https://www.zoho.com/mail/" }, "Zoho PageSense": { "cats": [ 74, 76 ], "js": [ "$pagesense", "pagesense" ], "scriptSrc": [ "\\.pagesense\\.(?:cn|io)?" ], "implies": [ "Zoho" ], "description": "Zoho PageSense is a conversion optimisation platform which combines the power of web analytics, A/B testing, and personalisation.", "website": "https://www.zoho.com/pagesense/" }, "Zoko": { "cats": [ 52 ], "js": [ "__zoko_app_version" ], "scriptSrc": [ "zoko-shopify-prod\\.web\\.app" ], "implies": [ "WhatsApp Business Chat" ], "description": "Zoko is an all-in-one system that leverages the WhatsApp API to help you do business, on WhatsApp", "website": "https://www.zoko.io/" }, "Zone.js": { "cats": [ 12 ], "js": [ "zone.root" ], "implies": [ "Angular" ], "website": "https://github.com/angular/angular/tree/master/packages/zone.js" }, "Zonos": { "cats": [ 106 ], "js": [ "zonos", "zonos", "zonoscheckout" ], "scriptSrc": [ "\\.zonos\\.com/" ], "description": "Zonos is a cross-border ecommerce software and app solution for companies with international business.", "website": "https://zonos.com" }, "ZoodPay": { "cats": [ 91 ], "scriptSrc": [ "wp-content/plugins/zoodpay/(?:.+\\?ver=([\\d\\.]+))?\\;version:\\1" ], "website": "https://www.zoodpay.com" }, "Zoominfo": { "cats": [ 10 ], "scriptSrc": [ "ws\\.zoominfo\\.com" ], "description": "ZoomInfo provides actionable B2B contact and company information for sales and marketing teams.", "website": "https://www.zoominfo.com/" }, "Zoominfo Chat": { "cats": [ 52 ], "scriptSrc": [ "madstreetden\\.widget\\.insent\\.ai" ], "description": "ZoomInfo chat is a live chat solution.", "website": "https://www.zoominfo.com/chat" }, "Zope": { "cats": [ 22 ], "headers": { "server": "^zope/" }, "website": "https://zope.org" }, "Zotabox": { "cats": [ 32 ], "js": [ "zotabox", "zotabox_init" ], "description": "Zotabox is marketing tool which includes popups, header bars, page/form builder, testimonial, live chat, etc.", "website": "https://info.zotabox.com" }, "Zozo": { "cats": [ 6 ], "scriptSrc": [ "zozo-main\\.min\\.js" ], "meta": { "generator": [ "zozo ecommerce" ] }, "implies": [ "MySQL", "PHP" ], "description": "Zozo is a multi-channel ecommerce services provider from Vietnam.", "website": "https://zozo.vn" }, "Zuppler": { "cats": [ 93 ], "description": "Zuppler is a complete and branded online ordering solution for restaurants and caterers with multi-locations.", "website": "https://www.zuppler.com" }, "_hyperscript ": { "cats": [ 59 ], "js": [ "_hyperscript" ], "scriptSrc": [ "//unpkg\\.com/hyperscript\\.org@([\\d\\.]+)\\;version:\\1" ], "description": "_​hyperscript is a scripting language for adding interactivity to the front-end.", "website": "https://hyperscript.org" }, "a-blog cms": { "cats": [ 1 ], "meta": { "generator": [ "a-blog cms" ] }, "implies": [ "PHP" ], "website": "https://www.a-blogcms.jp" }, "a3 Lazy Load": { "cats": [ 87, 92 ], "js": [ "a3_lazyload_extend_params", "a3_lazyload_params" ], "scriptSrc": [ "/wp-content/plugins/a3-lazy-load/.+\\.js(?:\\?ver=(\\d+(?:\\.\\d+)+))?\\;version:\\1" ], "description": "a3 Lazy Load is a mobile oriented, very simple to use plugin that will speed up sites page load speed.", "website": "https://a3rev.com/shop/a3-lazy-load/" }, "aThemes Airi": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/airi/" ], "description": "aThemes Airi is a powerful yet lightweight and flexible WordPress theme for organization or freelancer.", "website": "https://athemes.com/theme/airi" }, "aThemes Astrid": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/astrid/" ], "description": "aThemes Astrid is a powerful yet lightweight and flexible WordPress theme.", "website": "https://athemes.com/theme/astrid" }, "aThemes Hiero": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/hiero/" ], "description": "aThemes Hiero is an awesome magazine theme for your WordPress site feature bold colors and details to the content.", "website": "https://athemes.com/theme/hiero" }, "aThemes Moesia": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/moesia(?:-pro-ii)?/" ], "description": "aThemes Moesia is the business theme you need in order to build your presence on the Internet.", "website": "https://athemes.com/theme/moesia" }, "aThemes Sydney": { "cats": [ 80 ], "scriptSrc": [ "/wp-content/themes/sydney(?:-pro-ii)?/" ], "description": "aThemes Sydney is a powerful business WordPress theme that provides a fast way for companies or freelancers to create an online presence.", "website": "https://athemes.com/theme/sydney" }, "actionhero.js": { "cats": [ 18, 22 ], "js": [ "actionheroclient" ], "headers": { "x-powered-by": "actionhero api" }, "scriptSrc": [ "actionheroclient\\.js" ], "implies": [ "Node.js" ], "website": "https://www.actionherojs.com" }, "amCharts": { "cats": [ 25 ], "js": [ "amcharts" ], "html": [ "\u003csvg[^\u003e]*\u003e\u003cdesc\u003ejavascript chart by amcharts ([\\d.]*)\\;version:\\1" ], "scriptSrc": [ "amcharts.*\\.js" ], "description": "amCharts is a JavaScript-based interactive charts and maps programming library and tool.", "website": "https://amcharts.com" }, "amoCRM": { "cats": [ 53 ], "js": [ "amo_pixel_client", "amocrm", "amoformswidget", "amosocialbutton" ], "scriptSrc": [ "\\.amocrm\\.(?:ru|com)" ], "description": "amoCRM is a web-based customer relationship management software solution.", "website": "https://www.amocrm.com" }, "anime.js": { "cats": [ 25 ], "js": [ "anime.version" ], "description": "Anime.js (/ˈæn.ə.meɪ/) is a lightweight JavaScript animation library with a simple, yet powerful API.It works with CSS properties, SVG, DOM attributes and JavaScript Objects.", "website": "https://animejs.com/" }, "augmented-ui": { "cats": [ 66 ], "description": "augmented-ui is a UI framework inspired by cyberpunk and sci-fi.", "website": "https://augmented-ui.com" }, "authorize.net": { "cats": [ 41 ], "js": [ "config.authorizenet_public_client_key" ], "headers": { "content-security-policy": "\\.authorize\\.net\\s" }, "scriptSrc": [ "\\.authorize\\.net/" ], "description": "Authorize.net is a secure online payment gateway service that enables businesses to accept payments through various channels, such as ecommerce websites, mobile devices, and retail stores, providing a trusted platform for processing credit card and electronic cheque payments.", "website": "https://www.authorize.net" }, "autoComplete.js": { "cats": [ 59 ], "scriptSrc": [ "@tarekraafat/autocomplete\\.js@([\\d\\.]+)/\\;version:\\1" ], "description": "autoComplete.js is a simple, pure vanilla Javascript library.", "website": "https://tarekraafat.github.io/autoComplete.js" }, "bSecure": { "cats": [ 41 ], "js": [ "bsecure_js_object" ], "description": "bSecure is a one-click checkout solution for selling your products all across the globe instantly.", "website": "https://www.bsecure.pk" }, "basket.js": { "cats": [ 59 ], "js": [ "basket.isvaliditem" ], "website": "https://addyosmani.github.io/basket.js/" }, "bdok": { "cats": [ 6 ], "scriptSrc": [ "cdn\\.ibdok\\.ir/" ], "meta": { "bdok": [] }, "description": "bdok is a cloud-based platform which provides the capability to create and manage online stores with no technical knowledge.", "website": "https://bdok.ir" }, "cPanel": { "cats": [ 9 ], "cookies": { "cprelogin": "", "cpsession": "" }, "headers": { "server": "cpsrvd/([\\d.]+)\\;version:\\1" }, "html": [ "\u003c!-- cpanel" ], "description": "cPanel is a web hosting control panel. The software provides a graphical interface and automation tools designed to simplify the process of hosting a website.", "website": "https://www.cpanel.net", "cpe": "cpe:2.3:a:cpanel:cpanel:*:*:*:*:*:*:*:*" }, "cState": { "cats": [ 13 ], "meta": { "generator": [ "cstate v([\\d\\.]+)\\;version:\\1" ] }, "description": "cState is an open-source static (serverless) status page.", "website": "https://github.com/cstate/cstate" }, "cashew": { "cats": [ 91 ], "headers": { "content-security-policy": "\\.cashewpayments\\.com" }, "scriptSrc": [ "\\.cashewpayments\\.com/" ], "description": "Cashew is a buy now, pay later platform that allows its customers to shop now and pay later in equal monthly installments.", "website": "https://www.cashewpayments.com" }, "cdnjs": { "cats": [ 31 ], "scriptSrc": [ "cdnjs\\.cloudflare\\.com" ], "implies": [ "Cloudflare" ], "description": "cdnjs is a free distributed JS library delivery service.", "website": "https://cdnjs.com" }, "cgit": { "cats": [ 19 ], "meta": { "generator": [ "^cgit v([\\d.a-z-]+)$\\;version:\\1" ] }, "implies": [ "C", "git" ], "description": "cgit is a web interface (cgi) for Git repositories, written in C. licensed under GPLv2.", "website": "https://git.zx2c4.com/cgit" }, "clickio": { "cats": [ 67 ], "scriptSrc": [ "clickio\\.mgr\\.consensu\\.org/t/consent_[0-9]+\\.js" ], "description": "Clickio Consent Tool collects and communicates consent both to IAB Framework vendors and to Google Ads products.", "website": "https://www.gdpr.clickio.com/" }, "comScore": { "cats": [ 10 ], "js": [ "_comscore", "comscore" ], "scriptSrc": [ "\\.scorecardresearch\\.com/beacon\\.js|comscore\\.beacon" ], "description": "comScore is an American media measurement and analytics company providing marketing data and analytics to enterprises; media and advertising agencies; and publishers.", "website": "https://comscore.com" }, "commercetools": { "cats": [ 6 ], "js": [ "__next_data__.props.pageprops.commercetoolsentity", "commerce_tools_host_att", "commerce_tools_project_key_att" ], "implies": [ "GraphQL" ], "description": "commercetools is a headless commerce platform.", "website": "https://commercetools.com" }, "core-js": { "cats": [ 59 ], "js": [ "__core-js_shared__", "__core-js_shared__.versions.0.version", "_babelpolyfill", "core", "core.version" ], "description": "core-js is a modular standard library for JavaScript, with polyfills for cutting-edge ECMAScript features.", "website": "https://github.com/zloirock/core-js" }, "crypto-js": { "cats": [ 59 ], "js": [ "cryptojs.algo", "cryptojs.rabbit" ], "scriptSrc": [ "(?:/([\\d\\.-]+))?/crypto-js(?:\\.min)?\\.js\\;version:\\1" ], "description": "crypto-js is a JavaScript library of crypto standards.", "website": "https://github.com/brix/crypto-js" }, "daisyUI": { "cats": [ 66 ], "implies": [ "Tailwind CSS" ], "description": "daisyUI is a customisable Tailwind CSS component library that prevents verbose markup in frontend applications. With a focus on customising and creating themes for user interfaces, daisyUI uses pure CSS and Tailwind utility classes, allowing developers to write clean HTML.", "website": "https://daisyui.com" }, "db-ip": { "cats": [ 79 ], "js": [ "env.dbip" ], "scriptSrc": [ "cdn\\.db-ip\\.com" ], "description": "dbip is a geolocation API and database.", "website": "https://db-ip.com/" }, "decimal.js": { "cats": [ 59 ], "js": [ "decimal.round_half_floor" ], "scriptSrc": [ "/([\\d.]*\\d+)/decimal(?:\\.min)?\\.js\\;version:\\1", "decimal(?:\\.min)?\\.js(?:\\?ver(?:sion)?=([\\d.]*\\d+))?\\;version:\\1", "decimal[.-]([\\d.]*\\d+)(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://mikemcl.github.io/decimal.js/" }, "deepMiner": { "cats": [ 56 ], "js": [ "deepminer" ], "scriptSrc": [ "deepminer\\.js" ], "website": "https://github.com/deepwn/deepMiner" }, "e-Shop Commerce": { "cats": [ 6 ], "scriptSrc": [ "/template_inc/eshopstoresframework" ], "description": "e-Shop is a all-in-one Software-as-a-Service (SaaS) that allows Israeli customers to set up an online store and sell their products.", "website": "https://www.e-shop.co.il" }, "e-goi": { "cats": [ 32, 75 ], "js": [ "_egoiaq", "egoimmerce" ], "scriptSrc": [ "\\.e-goi\\.com/egoimmerce\\.js" ], "description": "e-goi is a multichannel marketing automation software for ecommerce.", "website": "https://www.e-goi.com" }, "e107": { "cats": [ 1 ], "cookies": { "e107_tz": "" }, "headers": { "x-powered-by": "e107" }, "scriptSrc": [ "[^a-z\\d]e107\\.js" ], "implies": [ "PHP" ], "website": "https://e107.org" }, "eBay Partner Network": { "cats": [ 71, 94 ], "scriptSrc": [ "epnt\\.ebay\\.com/" ], "description": "eBay Partner Network is an online referral program where eBay pays commissions to referrers on sales generated by customers they’ve referred.", "website": "https://partnernetwork.ebay.com" }, "eCaupo": { "cats": [ 6 ], "scriptSrc": [ "\\.ecaupo\\.(?:at|com)/" ], "description": "eCaupo is no delivery portal, but your own shop.", "website": "https://www.ecaupo.com" }, "eClass": { "cats": [ 1 ], "js": [ "fe_eclass", "fe_eclass_guest" ], "description": "eClass is an online learning platform.", "website": "https://www.eclass.com.hk" }, "eDokan": { "cats": [ 6 ], "implies": [ "Angular", "MongoDB", "Node.js" ], "description": "eDokan is hosted ecommerce platform with drag-drop template builder and zero programming knowledge.", "website": "https://edokan.co" }, "eKomi": { "cats": [ 5 ], "js": [ "ekomiwidgetmain" ], "description": "eKomi is a German supplier and product review service.", "website": "https://www.ekomi.de" }, "eNamad": { "cats": [ 19 ], "meta": { "enamad": [ "^\\d+$" ] }, "description": "eNamad is an electronic trust symbol.", "website": "https://enamad.ir/" }, "ePages": { "cats": [ 6 ], "js": [ "epages" ], "headers": { "x-epages-requestid": "" }, "description": "ePages is a provider of cloud-based online shop solutions.", "website": "https://www.epages.com/" }, "eSSENTIAL Accessibility": { "cats": [ 68 ], "description": "eSSENTIAL Accessibility is a digital accessibility-as-a-service platform.", "website": "https://www.essentialaccessibility.com" }, "eShopCRM": { "cats": [ 53 ], "scriptSrc": [ "eshopcrm\\.com/" ], "implies": [ "Shopify" ], "description": "eShopCRM is an ecommerce CRM for Shopify.", "website": "https://eshopcrm.com" }, "eSputnik": { "cats": [ 32, 97 ], "js": [ "essdk" ], "scriptSrc": [ "(?://|\\.)esputnik\\.com/" ], "description": "eSputnik is a marketing automation service for ecommerce.", "website": "https://esputnik.com" }, "eSyndiCat": { "cats": [ 1 ], "js": [ "esyndicat" ], "headers": { "x-drectory-script": "^esyndicat" }, "meta": { "generator": [ "^esyndicat " ] }, "implies": [ "PHP" ], "website": "https://esyndicat.com" }, "eWAY Payments": { "cats": [ 41 ], "html": [ "\u003cimg [^\u003e]*src=\"[^/]*//[^/]*eway\\.com" ], "scriptSrc": [ "secure\\.ewaypayments\\.com" ], "description": "eWAY is a global omnichannel payment provider. The company processes secure credit card payments for merchants. eWay works through eCommerce.", "website": "https://www.eway.com.au/" }, "eZ Publish": { "cats": [ 1, 6 ], "cookies": { "ezsessid": "" }, "headers": { "x-powered-by": "^ez publish" }, "meta": { "generator": [ "ez publish" ] }, "implies": [ "PHP" ], "website": "https://github.com/ezsystems/ezpublish-legacy", "cpe": "cpe:2.3:a:ez:ez_publish:*:*:*:*:*:*:*:*" }, "ebisumart": { "cats": [ 6 ], "js": [ "ebisu.fontchanger", "ebisu.fontchanger.map.l", "ebisu_conv" ], "description": "ebisumart is a cloud-based storefront system for developing and renewing high-quality ecommerce websites.", "website": "https://www.ebisumart.com" }, "ef.js": { "cats": [ 12 ], "js": [ "ef.version", "efcore" ], "scriptSrc": [ "/ef(?:-core)?(?:\\.min|\\.dev)?\\.js" ], "website": "https://ef.js.org" }, "emBlue": { "cats": [ 32, 75 ], "js": [ "emblueonsiteapp" ], "scriptSrc": [ "\\.embluemail\\.com/(?:library/([\\d.]+))?\\;version:\\1" ], "description": "emBlue is an email and marketing automation platform.", "website": "https://www.embluemail.com/en" }, "enduro.js": { "cats": [ 1 ], "headers": { "x-powered-by": "^enduro\\.js" }, "implies": [ "Node.js" ], "website": "https://endurojs.com" }, "etika": { "cats": [ 91 ], "js": [ "etikabannerinject", "etikaglobal", "etikaproductjshelper" ], "description": "etika is a fintech company based in Manchester which provide buy now pay later solution.", "website": "https://etika.com" }, "eucookie.eu": { "cats": [ 67 ], "scriptSrc": [ "eucookie\\.eu/public/gdpr-cookie-consent\\.js" ], "website": "https://www.eucookie.eu/" }, "experiencedCMS": { "cats": [ 1 ], "meta": { "generator": [ "^experiencedcms$" ] }, "implies": [ "PHP" ], "website": "https://experiencedcms.berkearas.de", "cpe": "cpe:2.3:a:experiencedcms:experiencedcms:*:*:*:*:*:*:*:*" }, "fullPage.js": { "cats": [ 59 ], "js": [ "fullpage_api.version" ], "scriptSrc": [ "/fullpage\\.js(?:/([\\d\\.]+)/)?\\;version:\\1" ], "implies": [ "jQuery" ], "description": "fullPage.js a jQuery and vanilla JavaScript plugin for fullscreen scrolling websites.", "website": "https://github.com/alvarotrigo/fullpage.js" }, "genezio": { "cats": [ 47 ], "headers": { "x-powered-by": "^genezio$" }, "description": "Genezio is a code generation tool that facilitates app logic focus, organises backend API code in deployable classes, autogenerates class interfaces with JSON-RPC for typesafe API calls, supports REST and Webhooks, enables simple API code deployment on pre-configured infrastructure using a shell command, and provides an SDK that eliminates the need to handle URLs, headers.", "website": "https://genez.io" }, "git": { "cats": [ 47 ], "meta": { "generator": [ "\\bgit/([\\d.]+\\d)\\;version:\\1" ] }, "website": "https://git-scm.com", "cpe": "cpe:2.3:a:git-scm:git:*:*:*:*:*:*:*:*" }, "gitlist": { "cats": [ 47 ], "html": [ "\u003cp\u003epowered by \u003ca[^\u003e]+\u003egitlist ([\\d.]+)\\;version:\\1" ], "implies": [ "PHP", "git" ], "website": "https://gitlist.org", "cpe": "cpe:2.3:a:gitlist:gitlist:*:*:*:*:*:*:*:*" }, "gitweb": { "cats": [ 47 ], "html": [ "\u003c!-- git web interface version ([\\d.]+)?\\;version:\\1" ], "scriptSrc": [ "static/gitweb\\.js$" ], "meta": { "generator": [ "gitweb(?:/([\\d.]+\\d))?\\;version:\\1" ] }, "implies": [ "Perl", "git" ], "website": "https://git-scm.com" }, "govCMS": { "cats": [ 1 ], "meta": { "generator": [ "drupal ([\\d]+) \\(http:\\/\\/drupal\\.org\\) \\+ govcms\\;version:\\1" ] }, "implies": [ "Drupal" ], "website": "https://www.govcms.gov.au" }, "gunicorn": { "cats": [ 22 ], "headers": { "server": "gunicorn(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Python" ], "website": "https://gunicorn.org" }, "h5ai": { "cats": [ 19 ], "scriptSrc": [ "/_h5ai/(?:public|client)/js/scripts\\.js" ], "implies": [ "PHP" ], "description": "h5ai is a modern HTTP web server index for Apache httpd, lighttpd, and nginx.", "website": "https://github.com/lrsjng/h5ai" }, "hCaptcha": { "cats": [ 16 ], "css": [ "#cf-hcaptcha-container" ], "js": [ "hcaptcha.getrespkey", "hcaptcha_sitekey", "hcaptchaonload" ], "headers": { "content-security-policy": "(?:\\.|//)hcaptcha\\.com" }, "scriptSrc": [ "hcaptcha\\.com/([\\d]+?)/api\\.js\\;version:\\1" ], "description": "hCaptcha is an anti-bot solution that protects user privacy and rewards websites.", "website": "https://www.hcaptcha.com" }, "hantana": { "cats": [ 10 ], "js": [ "hantana" ], "scriptSrc": [ "//hantana\\.org/widget" ], "website": "https://hantana.org/" }, "hoolah": { "cats": [ 91 ], "js": [ "hoolah" ], "scriptSrc": [ "merchant\\.cdn\\.hoolah\\.co/" ], "description": "hoolah is Asia's omni-channel buy now pay later platform.", "website": "https://www.hoolah.co" }, "i-MSCP": { "cats": [ 9 ], "meta": { "application-name": [ "^i-mscp$" ] }, "description": "i-MSCP (internet Multi Server Control Panel) is a software for shared hosting environments management on Linux servers.", "website": "https://github.com/i-MSCP/imscp" }, "i-mobile": { "cats": [ 36 ], "scriptSrc": [ "\\.i-mobile\\.co\\.jp/" ], "description": "i-mobile is a advertising platform for clients to advertise their product and for publishers to monetize their cyberspace.", "website": "https://www2.i-mobile.co.jp" }, "i30con": { "cats": [ 17 ], "description": "i30con is an icon toolkit based on CSS and JavaScript.", "website": "https://30nama.com/" }, "iAdvize": { "cats": [ 52 ], "scriptSrc": [ "\\.iadvize\\.com/" ], "description": "iAdvize is a conversational marketing platform that connects customers in need of advice with experts who are available 24/7 via messaging.", "website": "https://www.iadvize.com" }, "iEXExchanger": { "cats": [ 1 ], "cookies": { "iexexchanger_session": "" }, "meta": { "generator": [ "iexexchanger" ] }, "implies": [ "Angular", "Apache HTTP Server", "PHP" ], "website": "https://exchanger.iexbase.com" }, "iGoDigital": { "cats": [ 76 ], "scriptSrc": [ "\\.igodigital\\.com/" ], "description": "iGoDigital provides web-based commerce tools, personalisation, and product recommendations designed to increase customer interaction.", "website": "https://www.igodigital.com" }, "iHomefinder IDX": { "cats": [ 19 ], "js": [ "ihfjquery" ], "scriptSrc": [ "\\.idxhome\\.com/" ], "description": "iHomefinder provides IDX property search, built-in CRM, and marketing tools.", "website": "https://www.ihomefinder.com" }, "iPresta": { "cats": [ 6 ], "meta": { "designer": [ "ipresta" ] }, "implies": [ "PHP", "PrestaShop" ], "website": "https://ipresta.ir" }, "iSina Chat": { "cats": [ 52 ], "scriptSrc": [ "chat\\.isina\\.agency/" ], "description": "iSina Chat is a live chat service that provides online support and FAQ for customers.", "website": "https://isina.agency" }, "iThemes Security": { "cats": [ 87, 16 ], "scriptSrc": [ "/wp-content/plugins/better-wp-security/" ], "description": " iThemes Security(formerly known as Better WP Security) plugin enhances the security and protection of your WordPress website.", "website": "https://ithemes.com/security" }, "iWeb": { "cats": [ 20 ], "meta": { "generator": [ "^iweb( [\\d.]+)?\\;version:\\1" ] }, "description": "iWeb is a web site creation tool.", "website": "https://apple.com/ilife/iweb" }, "idCloudHost": { "cats": [ 88 ], "description": "idCloudHost is a local web service provider based in Indonesia that offer a wide range of services including domain name registration and cloud hosting.", "website": "https://idcloudhost.com" }, "ikiwiki": { "cats": [ 8 ], "html": [ "\u003ca href=\"/(?:cgi-bin/)?ikiwiki\\.cgi\\?do=", "\u003clink rel=\"alternate\" type=\"application/x-wiki\" title=\"edit this page\" href=\"[^\"]*/ikiwiki\\.cgi" ], "description": "ikiwiki is a free and open-source wiki application.", "website": "https://ikiwiki.info" }, "imperia CMS": { "cats": [ 1 ], "meta": { "generator": [ "^imperia\\s([\\d\\.\\_]+)\\;version:\\1" ], "x-imperia-live-info": [] }, "implies": [ "Perl" ], "description": "imperia CMS is a headless content management for large editorial.", "website": "https://www.pirobase-imperia.com/de/solutions/imperia-cms" }, "inSales": { "cats": [ 6 ], "js": [ "insales", "insalesgeocoderesults", "insalesui" ], "meta": { "insales-redefined-api-method": [] }, "description": "inSales is a SaaS ecommerce platform with multichannel integration.", "website": "https://www.insales.com" }, "inSided": { "cats": [ 97 ], "js": [ "insided", "insideddata" ], "description": "inSided is the only Customer Success Community Platform built to help SaaS companies improve customer success and retention.", "website": "https://www.insided.com" }, "ip-api": { "cats": [ 79 ], "website": "https://ip-api.com/" }, "ip-label": { "cats": [ 10 ], "js": [ "clobs" ], "scriptSrc": [ "clobs\\.js" ], "website": "https://www.ip-label.com" }, "ipapi": { "cats": [ 79 ], "description": "ipapi is a real-time geolocation and reverse IP lookup REST API.", "website": "https://ipapi.com" }, "ipapi.co": { "cats": [ 79 ], "description": "ipapi.co is a web analytics provider with IP address lookup and location API.", "website": "https://ipapi.co" }, "ipbase": { "cats": [ 79 ], "description": "ipbase offers an API that supports both IPv4 and IPv6 and provides precise location data from IP addresses.", "website": "https://ipbase.com" }, "ipdata": { "cats": [ 79 ], "description": "ipdata is a JSON IP Address Geolocation API that allows to lookup the location of both IPv4 and IPv6.", "website": "https://ipdata.co/" }, "ipgeolocation": { "cats": [ 79 ], "description": "ipgeolocation is an IP Geolocation API and Accurate IP Lookup Database.", "website": "https://ipgeolocation.co/" }, "ipify": { "cats": [ 79 ], "scriptSrc": [ "\\.ipify\\.org" ], "description": "ipify is a service which provide public IP address API, IP geolocation API, VPN and Proxy detection API products.", "website": "https://ipify.org" }, "ipstack": { "cats": [ 79 ], "js": [ "env.ipstackaccesstoken" ], "description": "ipstack is a real-time IP to geolocation API capable of looking at location data and assessing security threats originating from risky IP addresses.", "website": "https://ipstack.com" }, "iubenda": { "cats": [ 67 ], "js": [ "_iub", "addiubendacs" ], "scriptSrc": [ "iubenda\\.com/" ], "description": "iubenda is a compliance software used by businesses for their websites and apps.", "website": "https://www.iubenda.com" }, "iyzico": { "cats": [ 41 ], "js": [ "iyz.ideasoft", "iyz.position" ], "description": "iyzico is a payment receipt system management platform that offers ePayment solutions.", "website": "https://www.iyzico.com" }, "jComponent": { "cats": [ 12, 59 ], "js": [ "main.version" ], "implies": [ "jQuery" ], "website": "https://componentator.com" }, "jPlayer": { "cats": [ 14, 59 ], "js": [ "jplayerplaylist" ], "scripts": [ "jquery\\.jplayer\\.min\\.js" ], "scriptSrc": [ "/jquery\\.jplayer\\.min\\.js" ], "implies": [ "jQuery" ], "description": "jPlayer is a cross-browser JavaScript library developed as a jQuery plugin which facilitates the embedding of web based media, notably HTML5 audio and video in addition to Adobe Flash based media.", "website": "https://jplayer.org" }, "jQTouch": { "cats": [ 26 ], "js": [ "jqt" ], "scriptSrc": [ "jqtouch.*\\.js" ], "description": "jQTouch is an open-source Zepto/ jQuery plugin with native animations, automatic navigation, and themes for mobile WebKit browsers like iPhone, G1 (Android), and Palm Pre.", "website": "https://jqtouch.com" }, "jQuery": { "cats": [ 59 ], "js": [ "$.fn.jquery", "jquery.fn.jquery" ], "scriptSrc": [ "/(\\d+\\.\\d+\\.\\d+)/jquery[/.-][^u]\\;version:\\1", "/jquery(?:-(\\d+\\.\\d+\\.\\d+))[/.-]\\;version:\\1", "jquery" ], "description": "jQuery is a JavaScript library which is a free, open-source software designed to simplify HTML DOM tree traversal and manipulation, as well as event handling, CSS animation, and Ajax.", "website": "https://jquery.com", "cpe": "cpe:2.3:a:jquery:jquery:*:*:*:*:*:*:*:*" }, "jQuery CDN": { "cats": [ 31 ], "scriptSrc": [ "code\\.jquery\\.com/" ], "implies": [ "jQuery" ], "description": "jQuery CDN is a way to include jQuery in your website without actually downloading and keeping it your website's folder.", "website": "https://code.jquery.com/" }, "jQuery DevBridge Autocomplete": { "cats": [ 59 ], "js": [ "$.devbridgeautocomplete", "jquery.devbridgeautocomplete" ], "scriptSrc": [ "/devbridgeautocomplete(?:-min)?\\.js", "/jquery\\.devbridge-autocomplete/([0-9.]+)/jquery\\.autocomplete(?:.min)?\\.js\\;version:\\1" ], "implies": [ "jQuery" ], "description": "Ajax Autocomplete for jQuery allows you to easily create autocomplete/autosuggest boxes for text input fields.", "website": "https://www.devbridge.com/sourcery/components/jquery-autocomplete/" }, "jQuery Migrate": { "cats": [ 59 ], "js": [ "jquery.migrateversion", "jquery.migratewarnings", "jquerymigrate" ], "scriptSrc": [ "jquery[.-]migrate(?:-([\\d.]+))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2" ], "implies": [ "jQuery" ], "description": "Query Migrate is a javascript library that allows you to preserve the compatibility of your jQuery code developed for versions of jQuery older than 1.9.", "website": "https://github.com/jquery/jquery-migrate" }, "jQuery Mobile": { "cats": [ 26 ], "js": [ "jquery.mobile.version" ], "scriptSrc": [ "jquery[.-]mobile(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2" ], "implies": [ "jQuery" ], "description": "jQuery Mobile is a HTML5-based user interface system designed to make responsive web sites and apps that are accessible on all smartphone, tablet and desktop devices.", "website": "https://jquerymobile.com" }, "jQuery Modal": { "cats": [ 59 ], "scriptSrc": [ "jquery-modal/([\\d\\.]+)/jquery\\.modal\\.min\\.js\\;version:\\1" ], "implies": [ "jQuery" ], "description": "jQuery Modal is an overlay dialog box or in other words, a popup window that is made to display on the top or 'overlayed' on the current page.", "website": "https://jquerymodal.com" }, "jQuery Sparklines": { "cats": [ 25 ], "scriptSrc": [ "jquery\\.sparkline.*\\.js" ], "implies": [ "jQuery" ], "description": "jQuery Sparklines is a plugin that generates sparklines (small inline charts) directly in the browser using data supplied either inline in the HTML, or via javascript.", "website": "https://omnipotent.net/jquery.sparkline/" }, "jQuery UI": { "cats": [ 59 ], "js": [ "jquery.ui.version" ], "scriptSrc": [ "([\\d.]+)/jquery-ui(?:\\.min)?\\.js\\;version:\\1", "jquery-ui.*\\.js", "jquery-ui[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1" ], "implies": [ "jQuery" ], "description": "jQuery UI is a collection of GUI widgets, animated visual effects, and themes implemented with jQuery, Cascading Style Sheets, and HTML.", "website": "https://jqueryui.com", "cpe": "cpe:2.3:a:jquery:jquery_ui:*:*:*:*:*:*:*:*" }, "jQuery-pjax": { "cats": [ 26 ], "js": [ "jquery.pjax" ], "html": [ "\u003cdiv[^\u003e]+data-pjax-container" ], "scriptSrc": [ "jquery[.-]pjax(?:-([\\d.]))?(?:\\.min)?\\.js(?:\\?ver=([\\d.]+))?\\;version:\\1?\\1:\\2" ], "meta": { "pjax-push": [], "pjax-replace": [], "pjax-timeout": [] }, "implies": [ "jQuery" ], "description": "jQuery PJAX is a plugin that uses AJAX and pushState.", "website": "https://github.com/defunkt/jquery-pjax" }, "jqPlot": { "cats": [ 25 ], "scriptSrc": [ "jqplot.*\\.js" ], "implies": [ "jQuery" ], "website": "https://www.jqplot.com" }, "jsDelivr": { "cats": [ 31 ], "scriptSrc": [ "cdn\\.jsdelivr\\.net" ], "description": "JSDelivr is a free public CDN for open-source projects. It can serve web files directly from the npm registry and GitHub repositories without any configuration.", "website": "https://www.jsdelivr.com/" }, "k-eCommerce": { "cats": [ 6 ], "meta": { "generator": [ "k-ecommerce" ] }, "description": "k-eCommerce is mdf commerce’s platform for SMBs, providing all-in-one ecommerce and digital payment solutions integrated to Microsoft Dynamics and SAP Business One. ", "website": "https://www.k-ecommerce.com" }, "keep. archeevo": { "cats": [ 95 ], "js": [ "archeevosnippets.mostvieweddocumentsurl", "embedarcheevobasicsearch" ], "description": "keep. archeevo is an archival management software that aims to support all the functional areas of an archival institution, covering activities ranging from archival description to employee performance assessment.", "website": "https://www.keep.pt/en/produts/archeevo-archival-management-software" }, "langify": { "cats": [ 89 ], "js": [ "langify", "langify", "langify.settings.switcher.version" ], "description": "langify translate your shop into multiple languages. langify comes with a visual configurator that allows you to add language switchers that integrate seamlessly into your existing design.", "website": "https://langify-app.com" }, "libphonenumber": { "cats": [ 59 ], "js": [ "libphonenumber.asyoutype", "libphonenumber.digits" ], "scriptSrc": [ "(?:/([\\d\\.]+))?/libphonenumber(?:-js\\.min)?\\.js\\;version:\\1" ], "description": "libphonenumber is a JavaScript library for parsing, formatting, and validating international phone numbers.", "website": "https://github.com/google/libphonenumber" }, "libwww-perl-daemon": { "cats": [ 22 ], "headers": { "server": "libwww-perl-daemon(?:/([\\d\\.]+))?\\;version:\\1" }, "implies": [ "Perl" ], "website": "https://metacpan.org/pod/HTTP::Daemon" }, "lighttpd": { "cats": [ 22 ], "headers": { "server": "(?:l|l)ight(?:y)?(?:tpd)?(?:/([\\d\\.]+))?\\;version:\\1" }, "description": "Lighttpd is an open-source web server optimised for speed-critical environment.", "website": "https://www.lighttpd.net" }, "lit-element": { "cats": [ 59 ], "js": [ "litelementversions.0" ], "description": "lit-element is a simple base class for creating web components that work in any web page with any framework. lit-element uses lit-html to render into shadow DOM, and adds API to manage properties and attributes.", "website": "https://lit.dev" }, "lit-html": { "cats": [ 59 ], "js": [ "lithtmlversions.0" ], "description": "lit-html is a simple, modern, safe, small and fast HTML templating library for JavaScript.", "website": "https://lit.dev" }, "lite-youtube-embed": { "cats": [ 59 ], "implies": [ "YouTube" ], "description": "The lite-youtube-embed technique renders the YouTube video inside the IFRAME tag only when the play button in clicked thus improving the core web vitals score of your website.", "website": "https://github.com/paulirish/lite-youtube-embed" }, "mParticle": { "cats": [ 97 ], "js": [ "mparticle", "mparticle.config.snippetversion" ], "scriptSrc": [ "\\.mparticle\\.com/" ], "description": "mParticle is a mobile-focused event tracking and data ingestion tool.", "website": "https://www.mparticle.com" }, "math.js": { "cats": [ 59 ], "js": [ "mathjs" ], "scriptSrc": [ "math(?:\\.min)?\\.js" ], "description": "Math.js a JavaScript library that provides a comprehensive set of mathematical functions and capabilities for performing complex calculations and operations in web applications.", "website": "https://mathjs.org" }, "mdBook": { "cats": [ 4 ], "scripts": [ "localstorage\\.getitem\\('mdbook-(?:sidebar|theme)'\\)" ], "description": "mdBook is a utility to create modern online books from Markdown files.", "website": "https://github.com/rust-lang/mdBook" }, "metisMenu": { "cats": [ 59 ], "js": [ "metismenu", "metismenu" ], "scriptSrc": [ "(?:/|\\.)metismenu(?:js)?(?:\\.min)?\\.js(?:\\?([\\d\\.]+))?\\;version:\\1" ], "implies": [ "jQuery" ], "description": "metisMenu is a collapsible jQuery menu plugin.", "website": "https://github.com/onokumus/metismenu" }, "microCMS": { "cats": [ 1 ], "description": "microCMS is a Japan-based headless CMS that enables editors and developers to build delicate sites and apps.", "website": "https://microcms.io" }, "mini_httpd": { "cats": [ 22 ], "headers": { "server": "mini_httpd(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://acme.com/software/mini_httpd" }, "mirrAR": { "cats": [ 105 ], "js": [ "initmirrarui", "loadmirrar" ], "description": "mirrAR is a real-time augmented reality platform for retail brands that enables consumers to virtually try on products and experience how it feels to own them before the actual purchase, both in-store and online.", "website": "https://www.mirrar.com" }, "mobicred": { "cats": [ 41, 91 ], "scriptSrc": [ "app\\.mobicredwidget\\.co\\.za" ], "description": "Mobicred is a credit facility that allows you to safely shop online with our participating retailers.", "website": "https://mobicred.co.za/" }, "mod_auth_pam": { "cats": [ 33 ], "headers": { "server": "mod_auth_pam(?:/([\\d\\.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server" ], "description": "Mod_auth_pam is used to configure ways for authenticating users.", "website": "https://pam.sourceforge.net/mod_auth_pam" }, "mod_dav": { "cats": [ 33 ], "headers": { "server": "\\b(?:mod_)?dav\\b(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server" ], "description": "Mod_dav is an Apache module to provide WebDAV capabilities for your Apache web server. It is an open-source module, provided under an Apache-style license.", "website": "https://webdav.org/mod_dav" }, "mod_fastcgi": { "cats": [ 33 ], "headers": { "server": "mod_fastcgi(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server" ], "description": "Mod_fcgid is a high performance alternative to mod_cgi or mod_cgid, which starts a sufficient number instances of the CGI program to handle concurrent requests, and these programs remain running to handle further incoming requests.", "website": "https://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html" }, "mod_jk": { "cats": [ 33 ], "headers": { "server": "mod_jk(?:/([\\d\\.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Apache Tomcat" ], "description": "Mod_jk is an Apache module used to connect the Tomcat servlet container with web servers such as Apache, iPlanet, Sun ONE (formerly Netscape) and even IIS using the Apache JServ Protocol. A web server waits for client HTTP requests.", "website": "https://tomcat.apache.org/tomcat-3.3-doc/mod_jk-howto.html" }, "mod_perl": { "cats": [ 33 ], "headers": { "server": "mod_perl(?:/([\\d\\.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Perl" ], "description": "Mod_perl is an optional module for the Apache HTTP server. It embeds a Perl interpreter into the Apache server. In addition to allowing Apache modules to be written in the Perl programming language, it allows the Apache web server to be dynamically configured by Perl programs.", "website": "https://perl.apache.org", "cpe": "cpe:2.3:a:apache:mod_perl:*:*:*:*:*:*:*:*" }, "mod_python": { "cats": [ 33 ], "headers": { "server": "mod_python(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Python" ], "description": "Mod_python is an Apache HTTP Server module that integrates the Python programming language with the server. It is intended to provide a Python language binding for the Apache HTTP Server. ", "website": "https://www.modpython.org", "cpe": "cpe:2.3:a:apache:mod_python:*:*:*:*:*:*:*:*" }, "mod_rack": { "cats": [ 33 ], "headers": { "server": "mod_rack(?:/([\\d.]+))?\\;version:\\1", "x-powered-by": "mod_rack(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Ruby on Rails\\;confidence:50" ], "description": "Mod_rack is a free web server and application server with support for Ruby, Python and Node.js.", "website": "https://phusionpassenger.com" }, "mod_rails": { "cats": [ 33 ], "headers": { "server": "mod_rails(?:/([\\d.]+))?\\;version:\\1", "x-powered-by": "mod_rails(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Ruby on Rails\\;confidence:50" ], "description": "Mod_rails is a free web server and application server with support for Ruby, Python and Node.js.", "website": "https://phusionpassenger.com" }, "mod_ssl": { "cats": [ 33 ], "headers": { "server": "mod_ssl(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server" ], "description": "mod_ssl is an optional module for the Apache HTTP Server. It provides strong cryptography for the Apache web server via the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) cryptographic protocols by the help of the open-source SSL/TLS toolkit OpenSSL.", "website": "https://modssl.org", "cpe": "cpe:2.3:a:modssl:mod_ssl:*:*:*:*:*:*:*:*" }, "mod_wsgi": { "cats": [ 33 ], "headers": { "server": "mod_wsgi(?:/([\\d.]+))?\\;version:\\1", "x-powered-by": "mod_wsgi(?:/([\\d.]+))?\\;version:\\1" }, "implies": [ "Apache HTTP Server", "Python\\;confidence:50" ], "description": "mod_wsgi is an Apache HTTP Server module that provides a WSGI compliant interface for hosting Python based web applications under Apache.", "website": "https://code.google.com/p/modwsgi", "cpe": "cpe:2.3:a:modwsgi:mod_wsgi:*:*:*:*:*:*:*:*" }, "nghttpx - HTTP/2 proxy": { "cats": [ 22 ], "headers": { "server": "nghttpx nghttp2/?([\\d.]+)?\\;version:\\1" }, "website": "https://nghttp2.org" }, "nopCommerce": { "cats": [ 6 ], "cookies": { "nop.customer": "" }, "html": [ "(?:\u003c!--powered by nopcommerce|powered by: \u003ca[^\u003e]+nopcommerce)" ], "meta": { "generator": [ "^nopcommerce$" ] }, "implies": [ "Microsoft ASP.NET" ], "description": "nopCommerce is an open-source ecommerce solution based on Microsoft's ASP​.NET Core framework and MS SQL Server 2012 (or higher) backend database.", "website": "https://www.nopcommerce.com" }, "nopStation": { "cats": [ 19 ], "implies": [ "Microsoft ASP.NET" ], "description": "nopStation is a one stop ecommerce solution with custom integrations and custom built plugins based on custom tailored requirements on top of nopCommerce.", "website": "https://www.nop-station.com" }, "novomind iSHOP": { "cats": [ 6 ], "js": [ "_ishopevents", "_ishopevents_url", "ishop.config.baseurl" ], "description": "novomind iSHOP can be introduced rapidly, is highly scalable, has open APIs headless ecommerce and GDPR-compliant in the novomind Cloud.", "website": "https://www.novomind.com/en/shopsystem/novomind-ishop-software" }, "ocStore": { "cats": [ 6 ], "html": [ "\u003c!--[^\u003e]+ocstore(?:\\s([\\d\\.a-z]+))?\\;version:\\1" ], "implies": [ "OpenCart" ], "description": "ocStore is an online store based on Opencart and open-source.", "website": "https://ocstore.com" }, "onpublix": { "cats": [ 1 ], "meta": { "generator": [ "^onpublix\\s([\\d\\.]+)$\\;version:\\1" ] }, "description": "onpublix is a web content management system (CMS) platform for eBusinesses.", "website": "https://www.onpublix.de" }, "osCommerce": { "cats": [ 6 ], "cookies": { "oscsid": "" }, "html": [ "\u003c(?:input|a)[^\u003e]+name=\"oscsid\"", "\u003c(?:tr|td|table)class=\"[^\"]*infoboxheading", "\u003cbr /\u003epowered by \u003ca href=\"https?://www\\.oscommerce\\.com" ], "implies": [ "MySQL", "PHP" ], "description": "OsCommerce is an open-source ecommerce and online store-management software program​.", "website": "https://www.oscommerce.com" }, "osTicket": { "cats": [ 13 ], "cookies": { "ostsessid": "" }, "implies": [ "MySQL", "PHP" ], "website": "https://osticket.com" }, "otrs": { "cats": [ 13 ], "headers": { "x-powered-by": "otrs ([\\d.]+)\\;version:\\1" }, "html": [ "\u003c!--\\s+otrs: copyright" ], "scriptSrc": [ "^/otrs-web/js/" ], "implies": [ "Perl" ], "website": "https://www.otrs.com" }, "ownCloud": { "cats": [ 19 ], "html": [ "\u003ca href=\"https://owncloud\\.com\" target=\"_blank\"\u003eowncloud inc\\.\u003c/a\u003e\u003cbr/\u003eyour cloud, your data, your way!" ], "meta": { "apple-itunes-app": [ "app-id=543672169" ] }, "implies": [ "PHP" ], "website": "https://owncloud.org" }, "papaya CMS": { "cats": [ 1 ], "html": [ "\u003clink[^\u003e]*/papaya-themes/" ], "implies": [ "PHP" ], "website": "https://papaya-cms.com" }, "parcel": { "cats": [ 19 ], "js": [ "parcelrequire" ], "implies": [ "SWC" ], "website": "https://parceljs.org/" }, "particles.js": { "cats": [ 25 ], "js": [ "particlesjs" ], "scriptSrc": [ "/particles(?:\\.min)?\\.js" ], "description": "Particles.js is a JavaScript library for creating particles.", "website": "https://github.com/VincentGarreau/particles.js" }, "petite-vue": { "cats": [ 19 ], "scripts": [ "/petite-vue@([\\d\\.]+)/\\;version:\\1" ], "scriptSrc": [ "/petite-vue" ], "description": "petite-vue is an alternative distribution of Vue optimised for progressive enhancement.", "website": "https://github.com/vuejs/petite-vue" }, "phpAlbum": { "cats": [ 7 ], "html": [ "\u003c!--phpalbum ([.\\d\\s]+)--\u003e\\;version:\\1" ], "implies": [ "PHP" ], "description": "phpAlbum is an open-source PHP script which allows you to create your personal photo album.", "website": "https://phpalbum.net" }, "phpBB": { "cats": [ 2 ], "cookies": { "phpbb": "" }, "js": [ "phpbb", "style_cookie_settings" ], "html": [ "\u003c[^\u003e]+styles/(?:sub|pro)silver/theme", "\u003cdiv class=phpbb_copyright\u003e", "\u003cimg[^\u003e]+i_icon_mini", "\u003ctable class=\"[^\"]*forumline", "powered by \u003ca[^\u003e]+phpbb" ], "meta": { "copyright": [ "phpbb group" ] }, "implies": [ "PHP" ], "description": "phpBB is a free open-source Internet forum package in the PHP scripting language.", "website": "https://phpbb.com", "cpe": "cpe:2.3:a:phpbb:phpbb:*:*:*:*:*:*:*:*" }, "phpCMS": { "cats": [ 1 ], "js": [ "phpcms" ], "implies": [ "PHP" ], "website": "https://phpcms.de", "cpe": "cpe:2.3:a:phpcms:phpcms:*:*:*:*:*:*:*:*" }, "phpDocumentor": { "cats": [ 4 ], "html": [ "\u003c!-- generated by phpdocumentor" ], "implies": [ "PHP" ], "description": "phpDocumentor is an open-source documentation generator written in PHP.", "website": "https://www.phpdoc.org" }, "phpMyAdmin": { "cats": [ 3 ], "js": [ "pma_absolute_uri" ], "headers": { "set-cookie": "phpmyadmin_https" }, "html": [ "!\\[cdata\\[[^\u003c]*pma_version:\\\"([\\d.]+)\\;version:\\1", "(?: \\| phpmyadmin ([\\d.]+)\u003c\\/title\u003e|pma_sendheaderlocation\\(|\u003clink [^\u003e]*href=\"[^\"]*phpmyadmin\\.css\\.php)\\;version:\\1" ], "implies": [ "MySQL", "PHP" ], "description": "PhpMyAdmin is a free and open-source administration tool for MySQL and MariaDB.", "website": "https://www.phpmyadmin.net", "cpe": "cpe:2.3:a:phpmyadmin:phpmyadmin:*:*:*:*:*:*:*:*" }, "phpPgAdmin": { "cats": [ 3 ], "html": [ "(?:\u003ctitle\u003ephppgadmin\u003c/title\u003e|\u003cspan class=\"appname\"\u003ephppgadmin)" ], "implies": [ "PHP" ], "website": "https://phppgadmin.sourceforge.net", "cpe": "cpe:2.3:a:phppgadmin_project:phppgadmin:*:*:*:*:*:*:*:*" }, "phpRS": { "cats": [ 1 ], "meta": { "generator": [ "^phprs$" ] }, "implies": [ "PHP" ], "description": "phpRS is a content management software written in PHP.", "website": "https://phprs.net" }, "phpSQLiteCMS": { "cats": [ 1 ], "meta": { "generator": [ "^phpsqlitecms(?: (.+))?$\\;version:\\1" ] }, "implies": [ "PHP", "SQLite" ], "website": "https://phpsqlitecms.net" }, "phpwind": { "cats": [ 1, 2 ], "html": [ "(?:powered|code) by \u003ca href=\"[^\"]+phpwind\\.net" ], "meta": { "generator": [ "^phpwind(?: v([0-9-]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://www.phpwind.net" }, "pinoox": { "cats": [ 18 ], "cookies": { "pinoox_session": "" }, "js": [ "pinoox" ], "implies": [ "PHP" ], "website": "https://pinoox.com" }, "pirobase CMS": { "cats": [ 1 ], "html": [ "\u003c(?:script|link)[^\u003e]/site/[a-z0-9/._-]+/resourcecached/[a-z0-9/._-]+", "\u003cinput[^\u003e]+cbi:///cms/" ], "implies": [ "Java" ], "website": "https://www.pirobase-imperia.com/de/produkte/produktuebersicht/pirobase-cms" }, "plentyShop LTS": { "cats": [ 6 ], "headers": { "x-plenty-shop": "ceres" }, "description": "The official template plugin developed by plentymarkets. plentyShop LTS is the default template for plentymarkets online stores.", "website": "https://www.plentymarkets.com/product/modules/online-shop/" }, "plentymarkets": { "cats": [ 6 ], "headers": { "x-plenty-shop": "" }, "scriptSrc": [ "plenty\\.shop\\.(?:min\\.)?js" ], "meta": { "generator": [ "plentymarkets" ] }, "description": "plentymarkets is a cloud-based all-in-one ecommerce ERP solution.", "website": "https://www.plentymarkets.com/" }, "prettyPhoto": { "cats": [ 59 ], "js": [ "pp_alreadyinitialized", "pp_descriptions", "pp_images", "pp_titles" ], "html": [ "(?:\u003clink [^\u003e]*href=\"[^\"]*prettyphoto(?:\\.min)?\\.css|\u003ca [^\u003e]*rel=\"prettyphoto)" ], "scriptSrc": [ "jquery\\.prettyphoto\\.js" ], "implies": [ "jQuery" ], "website": "https://no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/" }, "punBB": { "cats": [ 2 ], "js": [ "punbb" ], "html": [ "powered by \u003ca href=\"[^\u003e]+punbb" ], "implies": [ "PHP" ], "website": "https://punbb.informer.com" }, "qiankun": { "cats": [ 59 ], "scripts": [ "__powered_by_qiankun__" ], "description": "qiankun is a JS library who helps developers to build a micro frontends system.", "website": "https://qiankun.umijs.org" }, "reCAPTCHA": { "cats": [ 16 ], "js": [ "recaptcha", "recaptcha" ], "scripts": [ "/recaptcha/api\\.js" ], "scriptSrc": [ "/recaptcha/(?:api|enterprise)\\.js", "api-secure\\.recaptcha\\.net", "recaptcha_ajax\\.js" ], "description": "reCAPTCHA is a free service from Google that helps protect websites from spam and abuse.", "website": "https://www.google.com/recaptcha/" }, "sIFR": { "cats": [ 17 ], "scriptSrc": [ "sifr\\.js" ], "description": "sIFR is a JavaScript and Adobe Flash dynamic web fonts implementation.", "website": "https://www.mikeindustries.com/blog/sifr" }, "sNews": { "cats": [ 1 ], "meta": { "generator": [ "snews" ] }, "website": "https://snewscms.com" }, "script.aculo.us": { "cats": [ 59 ], "js": [ "scriptaculous.version" ], "scriptSrc": [ "/(?:scriptaculous|protoaculous)(?:\\.js|/)" ], "website": "https://script.aculo.us" }, "scrollreveal": { "cats": [ 59 ], "html": [ "\u003c[^\u003e]+data-sr(?:-id)" ], "scriptSrc": [ "scrollreveal(?:\\.min)(?:\\.js)" ], "website": "https://scrollrevealjs.org" }, "shadcn/ui": { "cats": [ 66 ], "css": [ "--destructive-foreground" ], "implies": [ "Radix UI", "Tailwind CSS" ], "description": "shadcn/ui is a component system built with Radix UI and Tailwind CSS.", "website": "https://ui.shadcn.com" }, "shine.js": { "cats": [ 25 ], "js": [ "shine" ], "scriptSrc": [ "shine(?:\\.min)?\\.js" ], "website": "https://bigspaceship.github.io/shine.js/" }, "siimple": { "cats": [ 66 ], "description": "siimple is a minimal CSS toolkit for building flat, clean and responsive web designs.", "website": "https://siimple.xyz" }, "snigel AdConsent": { "cats": [ 67 ], "js": [ "adconsent.version", "snhb.basesettings", "snhb.info.cmpversion" ], "scriptSrc": [ "(?:staging-)?cdn\\.snigelweb\\.com/(?:snhb|adconsent)/" ], "description": "snigel AdConsent is a IAB-registered consent management platfrom (CMP) which help keep sites speed intact while remaining compliant with GDPR and CCPA.", "website": "https://www.snigel.com/adconsent/" }, "snigel AdEngine": { "cats": [ 36 ], "scriptSrc": [ "(?:staging-)?cdn\\.snigelweb\\.com/adengine/", "adengine\\.snigelweb\\.com" ], "description": "snigel AdEngine is a header bidding solution product from snigel.", "website": "https://www.snigel.com/adengine/" }, "stores.jp": { "cats": [ 6 ], "js": [ "stores_jp" ], "implies": [ "Mastercard", "Visa" ], "description": "stores.jp is an ecommerce platform which allows users to create their own ecommerce website.", "website": "https://stores.jp/ec/" }, "styled-components": { "cats": [ 12, 47 ], "js": [ "styled" ], "implies": [ "React" ], "description": "Styled components is a CSS-in-JS styling framework that uses tagged template literals in JavaScript.", "website": "https://styled-components.com" }, "theTradeDesk": { "cats": [ 36 ], "js": [ "ttd_dom_ready", "ttduniversalpixelapi" ], "scriptSrc": [ "\\.adsrvr\\.org/" ], "description": "theTradeDesk is an technology company that markets a software platform used by digital ad buyers to purchase data-driven digital advertising campaigns across various ad formats and devices.", "website": "https://www.thetradedesk.com" }, "thttpd": { "cats": [ 22 ], "headers": { "server": "\\bthttpd(?:/([\\d.]+))?\\;version:\\1" }, "website": "https://acme.com/software/thttpd", "cpe": "cpe:2.3:a:acme:thttpd:*:*:*:*:*:*:*:*" }, "toastr": { "cats": [ 12 ], "js": [ "toastr.version" ], "description": "toastr is a Javascript library for non-blocking notifications. The goal is to create a simple core library that can be customized and extended.", "website": "https://github.com/CodeSeven/toastr" }, "total.js": { "cats": [ 18 ], "headers": { "x-powered-by": "^total\\.js" }, "implies": [ "Node.js" ], "website": "https://totaljs.com" }, "uKnowva": { "cats": [ 1, 2, 50 ], "headers": { "x-content-encoded-by": "uknowva ([\\d.]+)\\;version:\\1" }, "html": [ "\u003ca[^\u003e]+\u003epowered by uknowva\u003c/a\u003e" ], "scriptSrc": [ "/media/conv/js/jquery\\.js" ], "meta": { "generator": [ "uknowva (?: ([\\d.]+))?\\;version:\\1" ] }, "implies": [ "PHP" ], "website": "https://uknowva.com" }, "uLogin": { "cats": [ 69 ], "js": [ "ulogin.version" ], "description": "uLogin is a tool that enables its users to get unified access to various Internet services.", "website": "https://ulogin.ru" }, "uMarketingSuite": { "cats": [ 10, 76 ], "js": [ "umarketingsuite" ], "implies": [ "Umbraco" ], "description": "uMarketingSuite is a set of diverse features that together form a full marketing suite for the Umbraco platform.", "website": "https://www.umarketingsuite.com" }, "uPlot": { "cats": [ 25 ], "js": [ "uplot" ], "description": "uPlot is a small, fast chart for time series, lines, areas, ohlc and bars.", "website": "https://leeoniya.github.io/uPlot" }, "uPortal": { "cats": [ 21 ], "js": [ "uportal" ], "meta": { "description": [ " uportal " ] }, "implies": [ "Java" ], "description": "uPortal is an open source enterprise portal framework built by and for higher education institutions.", "website": "https://www.apereo.org/projects/uportal" }, "uRemediate": { "cats": [ 68 ], "scriptSrc": [ "fecdn\\.user1st\\.info/loader/head" ], "description": "uRemediate provides web accessibility testing tools and accessibility overlays.", "website": "https://www.user1st.com/uremediate/" }, "user.com": { "cats": [ 10 ], "js": [ "userengage" ], "html": [ "\u003cdiv[^\u003e]+/id=\"ue_widget\"" ], "website": "https://user.com" }, "utterances": { "cats": [ 15 ], "description": "Utterances is a lightweight comments widget built on GitHub issues.", "website": "https://utteranc.es/" }, "v4Guard Checkpoint": { "cats": [ 16 ], "scriptSrc": [ "\\.v4guard\\.io/checkpoint" ], "description": "Checkpoint is a product of v4Guard that verifies website users and prevents fraudulent access to sensitive areas, by checking for any use of anonymisation services with a captcha-like widget.", "website": "https://v4guard.io" }, "vBulletin": { "cats": [ 2 ], "cookies": { "bblastactivity": "", "bblastvisit": "", "bbsessionhash": "" }, "js": [ "vbulletin" ], "html": [ "\u003cdiv id=\"copyright\"\u003epowered by vbulletin" ], "meta": { "generator": [ "vbulletin ?([\\d.]+)?\\;version:\\1" ] }, "implies": [ "PHP" ], "description": "vBulletin is tool that is used to create and manage online forums or discussion boards. It is written in PHP and uses a MySQL database server.", "website": "https://www.vbulletin.com", "cpe": "cpe:2.3:a:vbulletin:vbulletin:*:*:*:*:*:*:*:*" }, "vcita": { "cats": [ 53, 72 ], "js": [ "livesite.btcheckout", "vcita" ], "scriptSrc": [ "widgets\\.vcdnita\\.com/", "www\\.vcita\\.com/widgets/" ], "description": "vcita is an all-in-one customer service and business management software designed for service providers.", "website": "https://www.vcita.com" }, "vibecommerce": { "cats": [ 6 ], "meta": { "designer": [ "vibecommerce" ], "generator": [ "vibecommerce" ] }, "implies": [ "PHP" ], "website": "https://vibecommerce.com.br" }, "vxe-table": { "cats": [ 59 ], "description": "vxe-table is a Vue.js based PC form component, support add, delete, change, virtual scroll, lazy load, shortcut menu, data validation, tree structure, print export, form rendering, data paging, virtual list, modal window, custom template, renderer, flexible configuration items, extension interface.", "website": "https://vxetable.cn" }, "wBuy": { "cats": [ 6 ], "scriptSrc": [ "\\.sistemawbuy\\.com\\.br/" ], "description": "wBuy is a SaaS ecommerce platform.", "website": "https://www.wbuy.com.br" }, "wap.store": { "cats": [ 6 ], "js": [ "wapstore.categoria" ], "implies": [ "MySQL" ], "description": "The wap.store provides a range of services for ecommerce businesses, including a platform, a marketplace hub, and a digital agency.", "website": "https://www.wapstore.com.br" }, "web-vitals": { "cats": [ 59, 78 ], "js": [ "webvitals" ], "scripts": [ "(8999999999999[\\s\\s]+1e12[\\s\\s]+(largest-contentful-paint|first-input|layout-shift)|(largest-contentful-paint|first-input|layout-shift)[\\s\\s]+8999999999999[\\s\\s]+1e12)" ], "scriptSrc": [ "web-vitals@([\\d.]+)/dist/web-vitals.*\\.js\\;version:\\1" ], "description": "The web-vitals JavaScript is a tiny, modular library for measuring all the web vitals metrics on real users.", "website": "https://github.com/GoogleChrome/web-vitals" }, "webEdition": { "cats": [ 1 ], "meta": { "dc.title": [ "webedition" ], "generator": [ "webedition" ] }, "website": "https://webedition.de/en", "cpe": "cpe:2.3:a:webedition:webedition_cms:*:*:*:*:*:*:*:*" }, "wisyCMS": { "cats": [ 1 ], "meta": { "generator": [ "^wisy cms[ v]{0,3}([0-9.,]*)\\;version:\\1" ] }, "website": "https://wisy.3we.de" }, "wpBakery": { "cats": [ 51, 87 ], "meta": { "generator": [ "wpbakery" ] }, "implies": [ "PHP" ], "description": "WPBakery is a drag and drop visual page builder plugin for WordPress.", "website": "https://wpbakery.com" }, "wpCache": { "cats": [ 23, 87 ], "headers": { "x-powered-by": "wpcache(?:/([\\d.]+))?\\;version:\\1" }, "html": [ "\u003c!--[^\u003e]+wpcache" ], "meta": { "generator": [ "wpcache" ], "keywords": [ "wpcache" ] }, "implies": [ "PHP" ], "description": "WPCache is a static caching plugin for WordPress.", "website": "https://wpcache.co" }, "xCharts": { "cats": [ 25 ], "js": [ "xchart" ], "html": [ "\u003clink[^\u003e]* href=\"[^\"]*xcharts(?:\\.min)?\\.css" ], "scriptSrc": [ "xcharts\\.js" ], "implies": [ "D3" ], "website": "https://tenxer.github.io/xcharts/" }, "xtCommerce": { "cats": [ 6 ], "html": [ "\u003cdiv class=\"copyright\"\u003e[^\u003c]+\u003ca[^\u003e]+\u003ext:commerce" ], "meta": { "generator": [ "xt:commerce" ] }, "website": "https://www.xt-commerce.com" }, "yellow.ai": { "cats": [ 52 ], "js": [ "ymconfig" ], "scriptSrc": [ "cdn\\.yellowmessenger\\.com" ], "description": "yellow.ai provides chatbot and automation services.", "website": "https://yellow.ai/" } } } ================================================ FILE: backend/manage.py ================================================ #!/usr/bin/env python """Django's command-line utility for administrative tasks.""" import os import sys def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) from exc execute_from_command_line(sys.argv) if __name__ == '__main__': main() ================================================ FILE: backend/pyproject.toml ================================================ [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "config.settings" python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] testpaths = ["apps"] addopts = "-v --reuse-db" [tool.pylint] django-settings-module = "config.settings" load-plugins = "pylint_django" [tool.pylint.messages_control] disable = [ "missing-docstring", "invalid-name", "too-few-public-methods", "no-member", "import-error", "no-name-in-module", "wrong-import-position", # 允许函数内导入(防循环依赖) "import-outside-toplevel", # 同上 "too-many-arguments", # Django 视图/服务方法参数常超过5个 "too-many-locals", # 复杂业务逻辑局部变量多 "duplicate-code", # 某些模式代码相似是正常的 ] [tool.pylint.format] max-line-length = 120 [tool.pylint.basic] good-names = [ "i", "j", "k", "ex", "Run", "_", "id", "pk", "ip", "url", "db", "qs", ] ================================================ FILE: backend/requirements.txt ================================================ # Django 核心 Django==5.2.7 djangorestframework==3.15.2 djangorestframework-camel-case==1.4.2 psycopg2-binary==2.9.10 # API 文档 drf-yasg==1.21.7 setuptools==75.6.0 # CORS 支持 django-cors-headers==4.3.1 # 过滤器支持 django-filter==24.3 # 环境变量管理 python-dotenv==1.0.1 # 异步任务和工作流编排 prefect==3.4.25 fastapi==0.115.5 # 锁定版本,0.123+ 与 Prefect 不兼容 redis==5.0.3 # 可选:用于缓存 APScheduler>=3.10.0 # 定时任务调度器 # WebSocket 支持 channels==4.0.0 channels-redis==4.2.0 uvicorn[standard]==0.30.1 # SSH & 远程部署 paramiko>=3.0.0 # Docker 管理 docker>=6.0.0 # Python Docker SDK packaging>=21.0 # 版本比较 # 测试框架 pytest==8.0.0 pytest-django==4.7.0 hypothesis>=6.100.0 # 属性测试框架 # 工具库 python-dateutil==2.9.0 Pillow>=10.0.0 # 图像处理(截图服务) playwright>=1.40.0 # 浏览器自动化(截图服务) pytz==2024.1 validators==0.22.0 PyYAML==6.0.1 ruamel.yaml>=0.18.0 # 保留注释的 YAML 解析 colorlog==6.8.2 # 彩色日志输出 python-json-logger==2.0.7 # JSON 结构化日志 Jinja2>=3.1.6 # 命令模板引擎 croniter>=2.0.0 # Cron 表达式解析(定时扫描) psutil>=5.9.0 # 缓存 cachetools>=5.3.0 ================================================ FILE: backend/resources/resolvers.txt ================================================ 99.99.99.193 99.93.24.105 99.92.207.51 99.87.255.60 99.83.147.72 99.79.50.252 99.79.182.170 99.70.82.25 99.42.199.193 99.227.243.184 98.28.219.202 98.26.23.128 98.213.193.14 98.213.192.240 98.213.192.223 98.213.192.217 98.191.57.131 98.189.213.222 98.186.137.171 98.185.36.75 98.175.83.14 98.175.116.85 98.171.255.37 98.164.41.54 98.154.40.78 98.154.21.253 98.153.167.29 98.153.113.3 98.152.244.50 98.152.244.34 98.13.82.63 98.124.65.10 98.116.5.254 98.114.102.244 98.102.44.156 98.102.248.54 98.102.153.162 98.101.59.106 98.101.240.164 98.101.194.137 98.100.232.5 97.94.219.213 97.90.61.98 97.87.21.84 97.84.39.242 97.79.42.154 97.78.76.116 97.78.189.245 97.75.162.89 97.74.87.35 97.74.86.124 97.68.236.229 97.68.173.14 97.65.200.94 97.64.128.163 97.105.100.20 96.95.223.105 96.95.146.25 96.93.138.5 96.92.154.9 96.88.179.101 96.85.5.153 96.82.69.210 96.82.121.113 96.81.30.194 96.80.250.221 96.8.17.30 96.8.17.29 96.8.17.26 96.8.17.2 96.8.17.142 96.8.17.139 96.8.17.131 96.8.17.130 96.76.85.122 96.76.237.249 96.74.213.233 96.73.116.75 96.73.116.29 96.72.81.89 96.72.43.162 96.71.85.74 96.71.165.73 96.70.61.241 96.70.191.213 96.7.139.2 96.7.139.1 96.7.138.2 96.7.137.92 96.7.137.90 96.7.137.82 96.7.137.78 96.7.137.64 96.7.137.63 96.7.137.32 96.7.137.31 96.7.137.250 96.7.137.249 96.7.137.227 96.7.137.21 96.7.137.208 96.7.137.188 96.7.137.184 96.7.137.171 96.7.137.169 96.7.137.162 96.7.137.150 96.7.137.15 96.7.137.142 96.7.137.140 96.7.137.137 96.7.137.13 96.7.137.12 96.7.137.102 96.7.137.0 96.7.136.90 96.7.136.86 96.7.136.77 96.7.136.63 96.7.136.44 96.7.136.41 96.7.136.4 96.7.136.254 96.7.136.249 96.7.136.242 96.7.136.227 96.7.136.216 96.7.136.2 96.7.136.199 96.7.136.188 96.7.136.169 96.7.136.161 96.7.136.160 96.7.136.159 96.7.136.146 96.7.136.144 96.7.136.140 96.7.136.134 96.7.136.123 96.7.136.115 96.7.136.114 96.7.136.111 96.7.136.107 96.69.146.137 96.68.29.97 96.68.207.177 96.68.152.180 96.65.169.149 96.56.97.5 96.56.235.235 96.5.131.84 96.45.46.46 96.45.45.45 96.39.26.82 96.36.248.12 96.36.19.25 96.35.169.218 96.30.79.13 96.30.126.36 96.250.208.198 96.235.35.5 96.231.106.122 96.127.154.165 96.11.55.179 96.10.55.75 96.10.247.60 96.10.218.162 96.10.126.38 95.97.79.58 95.97.77.138 95.97.113.102 95.87.216.107 95.86.164.205 95.85.95.85 95.85.86.194 95.84.198.236 95.84.192.62 95.84.162.246 95.80.93.89 95.80.217.164 95.80.104.128 95.77.99.62 95.77.96.79 95.77.96.73 95.73.60.213 95.71.9.162 95.71.2.54 95.71.127.75 95.68.245.145 95.66.165.93 95.66.164.102 95.66.148.208 95.66.142.11 95.66.132.26 95.65.9.171 95.64.212.6 95.64.205.42 95.64.204.142 95.64.202.178 95.64.190.122 95.64.186.94 95.64.180.2 95.64.167.46 95.64.146.206 95.64.141.190 95.64.138.174 95.64.134.98 95.61.156.70 95.58.145.254 95.57.155.125 95.54.192.158 95.52.240.151 95.50.82.150 95.50.138.20 95.47.59.113 95.47.183.189 95.47.180.171 95.47.167.149 95.47.164.83 95.47.164.204 95.47.148.218 95.47.146.28 95.47.140.179 95.47.103.3 95.47.103.2 95.46.73.236 95.46.6.43 95.46.6.17 95.46.141.236 95.45.222.78 95.43.241.218 95.43.228.188 95.43.223.164 95.43.211.168 95.43.125.251 95.43.124.241 95.43.101.183 95.42.221.245 95.42.22.30 95.31.8.45 95.31.52.10 95.31.43.164 95.31.40.207 95.31.32.102 95.31.233.13 95.31.219.189 95.31.208.124 95.31.130.43 95.30.250.9 95.30.250.76 95.30.250.69 95.30.222.92 95.30.216.187 95.30.216.186 95.255.67.120 95.22.2.114 95.216.72.9 95.216.141.159 95.216.12.41 95.215.230.195 95.215.19.53 95.214.62.26 95.214.106.135 95.213.248.111 95.213.208.251 95.213.208.250 95.213.146.181 95.209.148.227 95.190.199.158 95.189.105.37 95.189.104.1 95.188.64.22 95.183.55.91 95.183.46.13 95.182.107.243 95.181.49.102 95.181.143.56 95.181.131.198 95.180.218.10 95.179.217.24 95.179.143.35 95.174.99.75 95.174.99.34 95.174.113.47 95.174.111.27 95.174.108.33 95.174.101.212 95.173.184.115 95.172.87.14 95.172.55.54 95.172.52.114 95.171.21.182 95.171.117.141 95.171.11.125 95.168.224.139 95.168.210.20 95.168.195.130 95.167.29.50 95.167.216.17 95.167.214.59 95.167.214.38 95.167.16.237 95.167.150.28 95.166.165.146 95.165.90.159 95.165.33.44 95.165.255.106 95.165.25.118 95.165.200.74 95.165.192.206 95.165.192.190 95.165.171.143 95.165.167.48 95.165.166.215 95.165.162.79 95.165.158.193 95.165.146.162 95.165.134.141 95.165.12.86 95.164.66.78 95.164.65.17 95.163.155.83 95.161.228.110 95.161.199.82 95.161.198.130 95.161.181.66 95.161.166.46 95.160.8.158 95.160.31.73 95.160.31.126 95.160.230.148 95.160.117.90 95.160.117.47 95.160.116.6 95.160.116.42 95.160.116.38 95.160.116.34 95.158.68.162 95.158.37.247 95.158.170.43 95.158.146.166 95.158.129.2 95.158.128.2 95.157.76.5 95.156.4.114 95.154.88.78 95.154.88.72 95.154.85.199 95.154.80.145 95.154.79.17 95.154.78.70 95.154.75.70 95.154.72.135 95.154.66.69 95.154.180.65 95.154.178.63 95.154.177.60 95.154.145.151 95.154.110.85 95.154.106.156 95.154.103.131 95.153.244.248 95.143.242.138 95.143.12.246 95.142.88.177 95.142.217.29 95.141.82.202 95.141.40.109 95.141.23.145 95.140.30.33 95.140.203.92 95.140.18.241 95.140.17.94 95.130.177.82 95.129.147.156 95.129.137.3 95.128.72.180 95.128.137.166 95.124.245.102 95.111.255.50 95.111.252.8 95.111.248.242 95.111.239.88 95.111.234.149 95.111.231.0 95.111.230.53 95.111.226.67 95.110.222.190 95.110.208.189 95.110.191.26 95.110.185.167 95.110.166.62 95.110.154.72 95.110.144.85 95.110.135.8 95.110.134.114 95.110.133.36 95.110.132.25 95.110.131.72 95.110.131.139 95.107.53.22 95.105.89.98 95.105.89.28 95.104.194.159 95.104.194.108 95.104.126.235 94.79.33.27 94.76.206.195 94.76.203.216 94.75.71.1 94.75.110.66 94.73.244.135 94.73.231.219 94.73.223.67 94.73.216.61 94.73.166.124 94.72.61.194 94.72.28.16 94.72.10.94 94.70.86.230 94.70.224.14 94.70.174.128 94.68.84.250 94.61.250.150 94.51.107.254 94.46.21.66 94.46.175.93 94.45.222.178 94.43.99.154 94.42.194.28 94.41.86.120 94.41.108.33 94.40.112.196 94.32.106.53 94.30.9.110 94.30.76.241 94.29.75.49 94.29.72.176 94.26.96.84 94.26.215.242 94.26.147.16 94.26.129.214 94.255.145.226 94.254.249.29 94.253.9.230 94.253.9.221 94.253.15.114 94.253.14.211 94.253.13.82 94.253.13.38 94.253.12.85 94.253.12.232 94.249.192.20 94.247.62.77 94.247.61.239 94.247.43.254 94.247.208.90 94.247.208.128 94.243.61.94 94.243.219.86 94.243.131.250 94.241.90.71 94.240.43.117 94.240.35.102 94.24.54.252 94.24.235.114 94.24.107.161 94.237.98.149 94.236.210.227 94.236.164.81 94.233.73.10 94.233.27.82 94.232.62.66 94.232.62.253 94.232.62.169 94.232.24.10 94.232.217.81 94.232.217.1 94.232.216.81 94.232.216.60 94.232.216.217 94.232.216.113 94.232.11.178 94.231.251.5 94.231.212.65 94.231.164.11 94.231.164.10 94.230.242.146 94.230.241.186 94.230.190.34 94.230.190.226 94.230.140.123 94.230.130.151 94.230.130.111 94.23.81.37 94.23.53.47 94.23.205.212 94.229.82.148 94.229.237.174 94.228.237.1 94.228.207.117 94.228.200.88 94.228.198.76 94.228.198.137 94.228.187.149 94.21.91.28 94.21.91.189 94.21.243.35 94.21.243.250 94.21.228.198 94.209.111.121 94.206.40.206 94.206.40.14 94.205.51.210 94.205.48.98 94.205.48.254 94.203.136.10 94.200.81.142 94.200.80.94 94.200.134.30 94.200.113.250 94.200.113.238 94.20.88.35 94.20.81.90 94.20.68.142 94.20.230.180 94.20.230.175 94.20.20.20 94.20.142.202 94.199.79.178 94.199.75.180 94.199.48.245 94.199.48.243 94.199.193.138 94.198.55.64 94.190.231.72 94.190.216.177 94.190.214.173 94.190.213.131 94.190.209.180 94.190.206.66 94.187.158.243 94.18.210.70 94.177.240.27 94.177.203.192 94.177.186.211 94.174.238.188 94.168.100.234 94.158.157.142 94.155.241.3 94.154.86.60 94.154.57.51 94.154.27.222 94.154.220.93 94.153.241.134 94.152.184.178 94.141.135.186 94.140.193.187 94.140.15.15 94.140.14.59 94.140.14.49 94.140.14.141 94.140.14.140 94.140.14.14 94.140.104.242 94.139.240.121 94.139.221.136 94.139.206.143 94.138.81.162 94.137.233.220 94.135.228.220 94.127.63.9 94.127.63.6 94.127.63.11 94.127.59.8 94.127.59.6 94.127.59.14 94.127.59.12 94.127.59.11 94.127.59.10 94.127.135.212 94.126.25.130 94.124.199.113 94.124.152.158 94.102.6.142 94.101.54.44 94.101.234.229 94.101.200.165 94.100.65.225 94.100.56.157 94.100.11.64 93.99.54.195 93.97.214.4 93.97.212.7 93.95.99.250 93.95.98.79 93.95.103.70 93.94.223.233 93.93.56.1 93.92.92.2 93.92.65.2 93.92.203.96 93.92.202.187 93.92.202.178 93.92.196.238 93.91.173.158 93.91.153.178 93.91.119.90 93.91.119.230 93.91.118.90 93.91.116.100 93.89.202.139 93.89.111.13 93.89.111.12 93.88.78.116 93.88.76.113 93.88.195.34 93.88.136.186 93.87.72.62 93.87.43.248 93.87.43.227 93.87.43.226 93.87.42.218 93.87.28.142 93.87.244.161 93.87.12.184 93.87.119.92 93.86.62.127 93.86.51.162 93.86.255.186 93.85.92.173 93.85.92.171 93.85.241.30 93.84.101.34 93.83.47.82 93.81.246.24 93.81.243.138 93.64.47.86 93.64.222.78 93.63.254.50 93.63.229.132 93.63.130.2 93.62.185.99 93.62.185.102 93.62.185.101 93.56.53.221 93.56.53.218 93.56.39.106 93.56.11.92 93.55.84.115 93.51.241.141 93.47.71.126 93.46.55.233 93.46.196.158 93.46.163.31 93.46.163.27 93.43.95.134 93.43.7.68 93.42.199.134 93.39.79.221 93.34.4.222 93.240.63.136 93.240.228.186 93.240.221.83 93.240.174.186 93.191.59.50 93.191.14.176 93.190.240.140 93.190.224.140 93.190.111.55 93.189.251.101 93.189.145.8 93.187.183.52 93.186.252.89 93.186.245.247 93.184.104.17 93.183.204.1 93.180.185.63 93.180.179.93 93.179.83.20 93.179.254.253 93.177.158.73 93.177.126.4 93.177.126.189 93.175.245.14 93.175.204.4 93.174.79.88 93.174.37.17 93.174.241.154 93.171.79.160 93.171.4.66 93.171.4.60 93.171.4.51 93.171.4.45 93.171.4.43 93.171.4.32 93.171.4.25 93.171.214.135 93.171.182.249 93.171.165.39 93.170.94.8 93.170.59.59 93.170.5.238 93.170.218.216 93.170.209.77 93.170.200.216 93.170.190.130 93.170.131.133 93.170.118.246 93.170.118.123 93.170.116.147 93.170.114.86 93.170.114.62 93.159.183.102 93.159.156.82 93.159.141.38 93.158.35.34 93.158.35.221 93.158.35.220 93.158.35.210 93.158.35.197 93.158.35.192 93.158.35.189 93.158.35.188 93.158.35.174 93.158.235.219 93.158.228.243 93.158.218.249 93.157.46.181 93.157.235.27 93.157.168.222 93.157.150.14 93.153.229.38 93.153.201.154 93.153.170.202 93.153.146.242 93.150.45.238 93.150.23.67 93.150.21.150 93.147.190.83 93.147.179.161 93.147.164.56 93.145.96.230 93.145.79.188 93.145.22.2 93.145.138.138 93.126.113.230 93.125.3.22 93.125.121.128 93.123.98.74 93.123.96.46 93.123.186.60 93.123.16.124 93.122.164.198 93.122.145.238 93.120.228.226 93.115.28.114 93.115.25.103 93.115.138.251 93.115.138.250 93.115.136.236 93.109.251.146 93.109.243.17 93.109.234.70 93.109.228.14 93.105.11.226 93.104.240.206 93.104.195.2 93.103.221.171 93.103.220.170 92.92.218.109 92.87.237.111 92.80.101.210 92.79.86.172 92.67.160.10 92.62.72.147 92.62.65.237 92.62.65.147 92.62.65.138 92.61.44.7 92.60.50.40 92.60.48.3 92.59.185.58 92.55.97.23 92.55.56.232 92.55.37.189 92.55.27.172 92.55.22.35 92.53.124.134 92.53.104.56 92.53.101.219 92.51.17.17 92.51.12.60 92.50.144.230 92.50.144.154 92.50.143.122 92.50.141.22 92.50.131.67 92.49.159.116 92.47.64.90 92.45.23.168 92.43.37.236 92.43.224.1 92.42.8.23 92.42.210.43 92.42.209.138 92.42.127.220 92.42.120.232 92.39.93.72 92.39.78.230 92.39.169.159 92.39.107.106 92.38.43.2 92.38.133.221 92.33.1.1 92.27.159.59 92.26.84.139 92.255.97.70 92.255.95.138 92.255.12.62 92.252.243.93 92.252.240.59 92.249.219.159 92.249.148.88 92.249.143.119 92.246.205.155 92.245.30.25 92.245.149.15 92.245.109.24 92.244.225.211 92.243.164.125 92.242.70.219 92.242.54.211 92.241.87.74 92.241.86.42 92.241.86.102 92.241.8.225 92.241.72.162 92.241.69.226 92.241.248.123 92.241.19.83 92.241.19.26 92.241.17.234 92.241.15.201 92.241.143.147 92.241.12.152 92.241.111.8 92.241.108.142 92.241.102.13 92.241.100.47 92.241.100.200 92.241.100.101 92.240.251.48 92.223.145.93 92.223.105.162 92.222.227.224 92.222.221.29 92.222.117.114 92.205.63.50 92.205.26.69 92.205.21.96 92.205.110.190 92.204.241.140 92.204.170.2 92.203.123.237 92.203.123.235 92.198.57.36 92.198.57.34 92.198.20.43 92.190.137.96 92.182.99.142 92.182.5.167 92.182.38.172 92.182.113.155 92.182.111.64 92.174.145.165 92.174.128.197 92.173.103.29 92.154.25.213 92.126.197.178 92.124.99.58 92.124.195.22 92.124.156.129 92.111.221.246 92.101.192.202 91.90.216.190 91.90.190.58 91.90.184.66 91.90.179.50 91.82.202.62 91.81.60.206 91.80.163.136 91.74.90.206 91.74.88.86 91.74.66.94 91.73.236.195 91.73.167.42 91.72.205.67 91.72.185.26 91.25.225.252 91.25.225.251 91.25.225.250 91.249.242.34 91.249.242.218 91.249.238.157 91.249.142.66 91.247.250.178 91.247.249.171 91.247.234.78 91.246.213.201 91.246.213.161 91.246.108.44 91.245.159.2 91.245.157.39 91.244.230.115 91.244.221.14 91.244.172.167 91.244.171.96 91.244.113.72 91.241.237.42 91.240.86.14 91.240.45.182 91.240.211.83 91.240.209.25 91.240.103.2 91.239.8.150 91.239.237.150 91.238.56.251 91.238.56.20 91.238.28.48 91.238.234.38 91.238.234.26 91.238.234.226 91.238.233.122 91.237.183.242 91.237.183.241 91.237.183.225 91.237.183.15 91.237.183.1 91.237.182.203 91.237.109.151 91.236.52.154 91.236.238.91 91.236.200.2 91.236.176.148 91.236.140.23 91.236.137.82 91.236.133.228 91.236.114.66 91.236.112.226 91.235.253.248 91.235.195.221 91.235.100.31 91.233.95.74 91.233.7.209 91.233.25.196 91.233.25.138 91.233.237.201 91.233.176.248 91.233.173.30 91.233.173.28 91.233.172.225 91.232.188.7 91.232.146.7 91.232.141.91 91.232.141.157 91.232.105.138 91.230.86.124 91.230.68.158 91.230.136.135 91.229.62.10 91.229.59.172 91.229.216.3 91.229.136.106 91.228.32.110 91.228.178.92 91.227.23.66 91.227.217.230 91.227.216.11 91.226.8.87 91.226.8.182 91.226.237.97 91.226.223.235 91.226.178.2 91.226.172.139 91.225.229.207 91.225.228.86 91.225.228.170 91.224.61.250 91.224.230.93 91.224.206.30 91.224.125.219 91.224.124.184 91.223.89.202 91.223.74.126 91.223.37.203 91.223.224.254 91.223.224.249 91.223.120.25 91.223.106.229 91.221.57.203 91.219.98.69 91.219.83.40 91.219.7.202 91.219.7.166 91.219.6.228 91.219.6.226 91.219.245.27 91.219.203.237 91.219.201.10 91.218.210.19 91.218.169.69 91.218.100.11 91.217.86.4 91.217.22.56 91.217.187.1 91.217.109.128 91.215.65.184 91.215.227.18 91.215.192.9 91.215.150.74 91.212.60.162 91.212.228.198 91.211.26.206 91.211.142.138 91.211.124.53 91.210.86.199 91.210.47.115 91.210.25.81 91.210.206.13 91.210.179.88 91.210.151.72 91.209.174.71 91.209.128.173 91.208.20.17 91.207.7.47 91.206.231.155 91.206.18.77 91.205.72.51 91.205.69.100 91.205.3.65 91.205.209.93 91.205.208.46 91.205.166.15 91.205.144.27 91.205.130.120 91.205.129.144 91.205.128.73 91.204.96.164 91.204.189.39 91.204.165.174 91.204.109.203 91.203.82.231 91.203.70.201 91.203.36.75 91.203.239.179 91.203.195.253 91.203.11.189 91.202.26.198 91.202.26.149 91.201.235.186 91.201.22.58 91.201.19.243 91.201.19.242 91.201.17.47 91.201.17.132 91.201.17.117 91.201.16.93 91.201.16.81 91.201.16.64 91.201.136.36 91.201.122.40 91.200.67.156 91.200.46.180 91.200.45.108 91.200.160.30 91.200.0.15 91.199.93.119 91.197.209.222 91.197.207.50 91.197.204.2 91.197.172.86 91.197.135.24 91.195.86.213 91.195.71.1 91.194.247.193 91.194.246.45 91.194.246.223 91.194.22.2 91.194.19.109 91.193.12.196 91.192.73.137 91.192.68.66 91.192.2.111 91.192.196.131 91.192.195.13 91.192.194.207 91.192.194.196 91.192.168.212 91.192.168.1 91.191.251.122 91.191.248.98 91.191.14.15 91.190.234.94 91.190.234.87 91.190.234.73 91.190.234.69 91.190.233.78 91.190.142.200 91.189.39.69 91.189.27.242 91.188.6.194 91.188.188.64 91.187.75.18 91.187.59.84 91.187.218.50 91.185.238.152 91.185.236.127 91.183.7.14 91.183.182.210 91.183.104.102 91.151.226.102 91.150.93.128 91.150.92.232 91.150.126.174 91.149.142.24 91.148.109.139 91.147.41.34 91.147.40.118 91.144.22.198 91.143.58.198 91.143.50.231 91.143.44.36 91.143.38.218 91.138.253.87 91.138.161.1 91.137.131.25 91.137.13.186 91.135.7.77 91.135.212.85 91.135.212.62 91.134.235.49 91.134.159.109 91.134.145.62 91.133.83.97 91.126.71.82 91.126.217.123 91.126.216.87 91.126.187.228 91.122.35.209 91.122.198.34 91.121.62.94 91.121.59.192 91.121.59.147 91.121.52.36 91.121.41.140 91.121.33.31 91.121.132.141 91.121.114.217 91.121.102.104 91.120.22.182 91.117.205.251 91.109.95.22 91.109.21.163 91.109.192.227 91.108.26.215 91.103.29.245 91.100.17.202 90.84.225.87 90.83.44.89 90.63.223.17 90.63.218.76 90.63.218.189 90.63.179.152 90.24.152.179 90.189.165.119 90.189.113.130 90.188.56.152 90.188.38.38 90.183.151.107 90.183.151.106 90.182.181.18 90.176.22.74 90.170.174.67 90.163.132.67 90.161.204.178 90.161.140.133 90.160.60.166 90.160.60.162 90.160.60.156 90.160.60.154 90.160.136.117 90.160.105.117 90.158.200.15 90.154.63.26 90.154.124.189 90.151.106.86 90.150.224.94 90.150.180.71 90.150.16.56 90.115.109.242 9.9.9.9 9.9.9.13 9.9.9.12 9.9.9.11 9.9.9.10 89.91.15.9 89.47.58.30 89.45.183.165 89.43.33.100 89.43.16.202 89.42.28.193 89.42.219.139 89.42.219.106 89.42.218.22 89.42.218.20 89.40.227.132 89.40.184.9 89.39.246.235 89.39.0.125 89.38.58.131 89.38.139.180 89.37.108.2 89.35.91.201 89.35.117.216 89.33.238.214 89.32.32.32 89.31.33.207 89.29.229.12 89.28.65.201 89.28.12.62 89.26.62.250 89.26.124.93 89.26.115.34 89.252.129.2 89.251.59.190 89.251.146.145 89.250.27.165 89.250.27.162 89.250.213.174 89.250.197.225 89.250.193.23 89.250.185.137 89.25.83.84 89.25.247.114 89.25.240.230 89.25.190.187 89.25.183.149 89.248.196.6 89.247.227.57 89.246.181.158 89.244.135.203 89.24.22.210 89.24.21.237 89.24.206.253 89.239.69.44 89.238.255.150 89.238.246.6 89.238.206.66 89.236.235.54 89.236.106.156 89.234.141.66 89.233.118.207 89.232.194.185 89.232.194.184 89.232.156.238 89.232.144.82 89.232.134.178 89.231.26.73 89.231.11.170 89.228.9.42 89.222.216.104 89.222.200.210 89.222.168.18 89.222.168.162 89.221.247.15 89.221.160.202 89.22.66.217 89.22.66.209 89.22.55.179 89.22.54.83 89.22.54.136 89.22.182.5 89.22.174.177 89.22.17.167 89.22.166.122 89.22.103.79 89.218.142.170 89.216.62.4 89.216.40.254 89.216.39.214 89.216.35.131 89.216.27.28 89.216.25.76 89.216.118.84 89.216.118.100 89.216.116.23 89.216.114.121 89.216.107.221 89.216.107.102 89.216.103.45 89.216.103.191 89.215.246.3 89.212.52.44 89.212.4.181 89.21.204.117 89.208.74.74 89.208.34.12 89.208.115.14 89.207.68.206 89.207.66.38 89.207.66.174 89.207.219.73 89.202.181.139 89.201.3.8 89.201.137.2 89.20.45.88 89.20.45.22 89.20.42.122 89.20.200.142 89.190.66.2 89.190.65.200 89.190.48.201 89.190.253.60 89.19.178.21 89.19.174.179 89.19.14.82 89.189.185.67 89.189.180.151 89.189.152.147 89.189.132.22 89.189.128.3 89.189.10.50 89.188.170.40 89.188.126.31 89.188.124.178 89.188.117.36 89.187.43.146 89.187.129.97 89.186.17.222 89.186.11.171 89.186.11.169 89.186.11.168 89.185.94.144 89.185.93.88 89.185.93.238 89.185.93.143 89.185.93.131 89.185.75.83 89.185.75.117 89.185.121.250 89.18.44.47 89.179.78.108 89.179.242.179 89.175.90.58 89.175.5.69 89.175.4.66 89.175.23.236 89.175.224.214 89.175.218.191 89.175.205.42 89.175.193.150 89.175.123.174 89.175.116.90 89.175.115.74 89.174.71.249 89.174.53.66 89.174.39.102 89.17.54.132 89.17.54.131 89.165.142.251 89.163.155.202 89.154.1.233 89.151.167.214 89.151.139.149 89.151.137.246 89.151.134.157 89.151.133.30 89.148.55.251 89.147.252.172 89.147.205.66 89.147.204.226 89.147.203.186 89.147.200.35 89.145.240.121 89.145.240.120 89.145.220.205 89.144.19.55 89.143.244.210 89.143.228.230 89.143.12.246 89.140.186.3 89.135.52.29 89.135.247.130 89.134.183.233 89.134.183.229 89.134.150.125 89.133.95.173 89.133.95.169 89.133.95.163 89.133.8.25 89.133.217.138 89.133.217.137 89.132.179.89 89.121.250.206 89.113.112.4 89.111.245.17 89.111.205.26 89.111.112.10 89.109.54.73 89.109.54.251 89.109.54.171 89.109.41.125 89.109.40.32 89.109.34.95 89.109.34.207 89.109.255.92 89.109.238.209 89.109.237.52 89.109.232.83 89.109.22.129 89.109.13.45 89.109.1.202 89.108.93.9 89.108.122.128 89.108.120.212 89.108.118.228 89.108.109.72 89.108.108.208 89.108.108.131 89.107.210.249 89.107.125.18 89.107.122.68 89.104.102.252 89.100.164.115 88.99.201.228 88.97.71.154 88.87.181.244 88.87.139.12 88.86.80.161 88.86.126.179 88.86.116.45 88.85.160.175 88.84.222.101 88.84.213.98 88.80.187.145 88.80.113.55 88.80.113.35 88.30.53.40 88.30.40.21 88.30.33.64 88.30.12.135 88.28.202.213 88.28.201.36 88.28.198.59 88.221.163.91 88.221.163.90 88.221.163.79 88.221.163.67 88.221.163.65 88.221.163.61 88.221.163.52 88.221.163.45 88.221.163.42 88.221.163.4 88.221.163.39 88.221.163.37 88.221.163.33 88.221.163.32 88.221.163.28 88.221.163.255 88.221.163.240 88.221.163.24 88.221.163.239 88.221.163.238 88.221.163.235 88.221.163.230 88.221.163.228 88.221.163.227 88.221.163.220 88.221.163.22 88.221.163.207 88.221.163.205 88.221.163.204 88.221.163.203 88.221.163.200 88.221.163.196 88.221.163.193 88.221.163.190 88.221.163.156 88.221.163.146 88.221.163.141 88.221.163.129 88.221.163.127 88.221.163.120 88.221.163.109 88.221.162.94 88.221.162.72 88.221.162.66 88.221.162.55 88.221.162.37 88.221.162.33 88.221.162.32 88.221.162.28 88.221.162.27 88.221.162.253 88.221.162.233 88.221.162.231 88.221.162.229 88.221.162.228 88.221.162.223 88.221.162.222 88.221.162.204 88.221.162.203 88.221.162.199 88.221.162.196 88.221.162.194 88.221.162.193 88.221.162.191 88.221.162.18 88.221.162.179 88.221.162.172 88.221.162.157 88.221.162.153 88.221.162.146 88.221.162.141 88.221.162.140 88.221.162.14 88.221.162.122 88.221.162.101 88.221.162.0 88.220.66.252 88.220.134.11 88.216.116.47 88.214.176.182 88.210.29.61 88.208.244.225 88.208.212.37 88.208.192.73 88.205.234.250 88.200.204.5 88.200.135.94 88.199.63.137 88.198.92.222 88.198.45.136 88.157.98.214 88.157.68.26 88.157.226.242 88.157.154.134 88.157.148.18 88.157.103.191 88.156.167.50 88.156.167.34 88.156.164.210 88.156.164.122 88.150.229.18 88.149.212.184 88.149.205.195 88.149.203.57 88.148.19.98 88.147.210.10 88.147.189.85 88.147.188.243 88.147.146.27 88.147.142.131 88.140.102.107 88.135.187.88 88.135.187.80 88.135.187.70 88.135.187.68 88.135.187.66 88.135.187.64 88.135.187.62 88.135.187.59 88.135.187.39 88.135.187.3 88.135.187.231 88.135.187.14 88.135.187.120 88.133.216.180 88.132.48.28 88.130.189.222 88.130.169.13 88.119.95.68 88.119.94.177 88.119.87.88 88.119.249.83 88.119.203.210 88.119.203.196 88.119.189.16 88.119.189.110 88.119.185.209 88.119.153.69 88.119.143.195 88.119.142.115 88.119.136.7 88.119.135.155 88.116.60.98 88.116.159.130 88.116.117.118 87.98.254.244 87.98.184.129 87.98.167.47 87.98.165.97 87.98.153.70 87.98.141.221 87.98.137.178 87.98.134.58 87.98.128.51 87.97.60.156 87.76.14.207 87.76.11.24 87.76.1.77 87.62.97.71 87.61.108.250 87.56.54.35 87.54.6.134 87.54.39.142 87.49.54.222 87.48.141.126 87.27.112.23 87.255.27.168 87.255.13.196 87.255.11.36 87.255.0.242 87.253.77.111 87.252.169.6 87.251.254.116 87.251.125.156 87.251.100.100 87.250.61.31 87.249.8.246 87.249.8.245 87.249.51.90 87.249.34.186 87.249.10.110 87.249.10.108 87.247.68.60 87.246.232.231 87.246.232.229 87.245.23.57 87.245.172.166 87.244.9.206 87.244.9.204 87.244.225.200 87.244.225.197 87.244.16.6 87.242.131.238 87.241.174.184 87.241.140.133 87.239.246.167 87.239.128.25 87.238.232.158 87.238.210.155 87.238.187.6 87.238.187.5 87.237.42.29 87.237.236.154 87.237.212.36 87.236.233.117 87.236.232.5 87.235.254.129 87.234.200.113 87.229.99.1 87.229.85.250 87.229.238.241 87.229.232.219 87.228.230.243 87.226.222.210 87.225.111.250 87.225.109.218 87.224.37.77 87.224.138.249 87.213.72.41 87.213.68.86 87.213.68.130 87.213.16.123 87.213.100.113 87.204.28.12 87.204.158.27 87.201.133.14 87.197.176.58 87.197.175.186 87.197.128.229 87.197.127.219 87.197.114.194 87.193.62.211 87.193.220.18 87.193.184.254 87.140.52.172 87.139.53.21 87.129.62.99 87.123.215.162 87.123.213.137 87.121.157.130 87.117.8.47 87.117.6.229 87.117.45.162 87.117.38.34 87.117.25.95 87.117.176.149 87.116.28.8 87.105.251.234 87.103.198.142 86.96.197.235 86.65.9.129 86.63.79.174 86.63.69.86 86.63.216.70 86.63.181.75 86.63.125.7 86.63.124.78 86.63.124.46 86.57.236.90 86.57.198.13 86.49.188.146 86.48.27.73 86.47.80.46 86.47.80.38 86.43.125.181 86.35.6.75 86.35.6.74 86.32.3.225 86.32.120.135 86.32.120.134 86.32.120.133 86.188.131.209 86.127.67.242 86.126.7.188 86.125.39.49 86.124.63.76 86.124.61.214 86.123.161.217 86.122.94.69 86.122.61.3 86.122.55.7 86.122.48.169 86.122.28.141 86.122.185.167 86.121.221.240 86.120.45.162 86.120.155.37 86.120.115.227 86.110.30.24 86.109.195.190 86.107.76.135 86.107.237.94 86.107.197.206 86.107.187.184 86.106.9.201 86.102.89.26 86.102.57.190 86.102.49.170 86.102.182.10 86.102.157.118 86.102.116.54 86.101.76.5 86.101.76.1 86.101.57.229 86.100.63.150 85.95.169.250 85.95.168.122 85.94.179.243 85.94.179.20 85.93.46.25 85.93.43.178 85.90.160.69 85.90.160.238 85.9.133.77 85.9.129.38 85.9.129.36 85.9.128.229 85.89.169.24 85.88.213.221 85.88.213.199 85.8.42.33 85.72.141.81 85.62.89.32 85.62.5.74 85.62.34.221 85.62.209.5 85.62.190.161 85.62.110.170 85.61.75.220 85.60.12.49 85.58.120.134 85.53.144.232 85.51.224.115 85.51.202.225 85.51.13.115 85.50.252.66 85.50.124.34 85.31.250.103 85.30.24.11 85.30.235.216 85.30.214.16 85.30.195.133 85.28.166.179 85.27.252.136 85.27.249.19 85.26.239.136 85.26.236.33 85.26.230.60 85.26.227.200 85.26.175.138 85.255.161.120 85.255.160.106 85.25.194.140 85.24.222.227 85.238.35.29 85.238.106.185 85.238.100.178 85.237.62.128 85.237.61.88 85.237.61.86 85.237.54.68 85.237.46.168 85.237.43.89 85.237.43.237 85.237.33.65 85.236.26.130 85.236.163.74 85.235.62.212 85.235.59.11 85.235.49.25 85.235.237.9 85.235.197.66 85.235.170.130 85.235.167.178 85.234.143.236 85.234.128.209 85.234.122.73 85.234.10.120 85.222.94.42 85.222.68.162 85.222.191.214 85.222.111.74 85.222.104.150 85.221.249.126 85.221.238.146 85.221.211.26 85.221.196.198 85.221.191.177 85.221.172.30 85.221.172.18 85.221.162.46 85.220.213.165 85.22.58.63 85.22.147.21 85.217.207.230 85.217.158.4 85.215.89.8 85.215.212.48 85.215.208.231 85.215.204.9 85.215.169.96 85.215.167.110 85.215.165.82 85.215.163.63 85.215.118.202 85.214.96.146 85.214.88.66 85.214.86.130 85.214.84.167 85.214.71.38 85.214.60.94 85.214.52.216 85.214.252.174 85.214.24.14 85.214.225.217 85.214.217.89 85.214.214.223 85.214.205.60 85.214.163.21 85.214.152.133 85.214.133.14 85.214.130.83 85.214.128.36 85.214.121.235 85.214.107.212 85.214.107.154 85.21.235.183 85.21.210.86 85.21.144.107 85.209.89.231 85.209.124.82 85.209.124.182 85.206.69.149 85.206.44.91 85.206.44.78 85.206.44.68 85.206.28.132 85.206.27.22 85.206.25.100 85.206.161.70 85.206.12.136 85.204.172.66 85.203.37.2 85.203.37.1 85.202.4.174 85.202.236.50 85.202.13.79 85.200.209.58 85.198.247.2 85.195.99.211 85.195.86.247 85.195.75.106 85.195.233.252 85.195.226.210 85.194.70.174 85.194.70.173 85.194.245.75 85.193.195.73 85.192.34.191 85.192.166.185 85.192.134.38 85.19.64.212 85.187.97.75 85.187.87.204 85.187.42.39 85.187.42.112 85.187.224.74 85.187.221.8 85.187.202.75 85.187.202.45 85.187.183.107 85.187.10.222 85.183.150.165 85.18.102.42 85.175.46.130 85.175.46.122 85.175.4.212 85.175.227.77 85.175.111.150 85.173.252.9 85.173.252.39 85.173.252.16 85.173.252.14 85.173.246.147 85.173.245.32 85.173.244.203 85.173.244.123 85.173.114.248 85.172.96.75 85.172.67.34 85.172.190.146 85.172.189.154 85.172.15.126 85.172.12.190 85.172.11.139 85.172.11.115 85.172.105.63 85.172.1.34 85.169.94.218 85.169.120.6 85.163.40.146 85.163.138.114 85.159.211.160 85.159.110.163 85.152.8.29 85.15.189.108 85.15.176.243 85.15.140.68 85.146.233.162 85.146.204.98 85.143.250.146 85.143.24.62 85.143.207.42 85.143.206.18 85.143.177.66 85.143.164.154 85.143.104.195 85.140.36.44 85.140.127.182 85.14.5.203 85.14.121.2 85.14.100.154 85.132.85.85 85.132.8.70 85.132.179.206 85.132.12.178 85.132.110.243 85.132.110.193 85.132.110.152 85.132.110.126 85.12.32.49 85.119.74.82 85.119.44.134 85.117.63.10 85.117.62.190 85.117.36.140 85.116.125.177 85.116.106.42 85.115.130.4 85.114.55.238 85.114.40.50 85.113.9.73 85.113.7.94 85.113.7.225 85.113.6.113 85.113.26.54 85.113.24.209 85.113.219.162 85.113.141.159 85.11.126.108 85.11.126.105 85.11.125.123 84.96.26.139 84.96.26.129 84.95.251.42 84.95.207.132 84.94.193.66 84.92.240.109 84.79.235.2 84.7.212.177 84.55.163.147 84.54.64.35 84.54.234.98 84.54.226.50 84.54.222.125 84.54.131.65 84.54.130.98 84.54.115.40 84.54.115.253 84.54.115.248 84.53.243.78 84.53.239.236 84.53.217.83 84.53.206.212 84.53.206.210 84.53.201.130 84.52.118.82 84.47.118.5 84.47.118.21 84.46.91.66 84.43.207.80 84.43.207.18 84.42.50.126 84.42.124.162 84.41.105.242 84.40.91.18 84.40.106.218 84.38.95.223 84.33.97.60 84.33.95.44 84.33.86.63 84.255.30.153 84.255.255.191 84.255.244.10 84.255.237.64 84.255.173.210 84.254.63.214 84.254.54.243 84.254.51.145 84.254.40.4 84.253.60.42 84.253.52.126 84.253.140.132 84.248.207.134 84.247.233.18 84.247.225.173 84.245.81.62 84.245.80.52 84.243.56.254 84.239.39.125 84.236.142.130 84.233.182.251 84.232.73.171 84.232.69.179 84.232.61.2 84.232.101.210 84.23.33.186 84.22.63.117 84.22.58.134 84.22.51.168 84.22.47.218 84.22.46.238 84.22.46.163 84.22.46.162 84.22.43.34 84.22.43.190 84.22.40.29 84.22.158.239 84.22.154.182 84.22.139.144 84.22.139.104 84.21.227.234 84.205.98.5 84.205.98.130 84.205.24.55 84.204.8.164 84.204.41.194 84.204.40.166 84.204.40.14 84.203.162.227 84.201.165.116 84.201.138.148 84.200.70.40 84.200.69.80 84.20.68.210 84.20.37.78 84.199.93.50 84.199.239.165 84.19.90.72 84.17.232.22 84.15.57.196 84.15.45.178 84.15.104.40 84.14.48.246 84.14.219.62 84.14.115.173 84.1.26.208 83.99.195.157 83.98.38.147 83.97.105.48 83.96.104.7 83.87.202.7 83.85.40.128 83.71.132.188 83.69.248.59 83.69.216.149 83.69.193.2 83.69.10.10 83.68.83.76 83.48.80.205 83.48.48.80 83.48.43.148 83.48.103.9 83.246.141.45 83.244.182.72 83.244.182.58 83.243.37.53 83.243.33.204 83.242.250.110 83.242.104.195 83.242.104.151 83.240.244.121 83.239.77.86 83.239.75.46 83.239.72.114 83.239.62.214 83.239.57.166 83.239.56.218 83.239.229.237 83.239.229.164 83.239.20.238 83.239.117.66 83.239.108.174 83.235.34.161 83.235.210.35 83.235.105.234 83.234.160.138 83.233.23.208 83.230.38.148 83.229.85.77 83.229.82.70 83.229.82.151 83.229.72.62 83.229.68.13 83.229.5.227 83.229.5.216 83.229.2.224 83.228.107.193 83.228.106.130 83.223.146.120 83.221.208.66 83.221.207.123 83.221.202.188 83.220.53.218 83.220.168.61 83.220.162.43 83.219.238.103 83.219.1.220 83.218.69.232 83.212.12.67 83.211.85.27 83.211.248.38 83.211.204.182 83.206.50.49 83.19.198.69 83.174.235.52 83.174.227.213 83.174.226.183 83.174.225.95 83.174.224.244 83.174.223.134 83.174.220.149 83.174.213.133 83.174.212.101 83.174.208.218 83.173.203.174 83.172.181.67 83.172.181.64 83.172.181.252 83.172.181.251 83.171.99.165 83.171.88.30 83.171.70.185 83.171.127.235 83.171.123.93 83.171.114.10 83.171.113.239 83.171.113.17 83.171.113.14 83.171.110.201 83.171.107.214 83.171.106.177 83.17.231.90 83.169.247.254 83.169.247.130 83.169.217.22 83.167.221.46 83.167.101.179 83.151.232.66 83.151.14.204 83.15.45.148 83.149.125.95 83.145.86.8 83.145.86.7 83.145.153.112 83.145.133.2 83.144.119.70 83.143.8.249 83.142.194.92 83.142.189.68 83.142.189.67 83.142.127.39 83.142.126.151 83.142.116.148 83.142.105.67 83.14.136.180 83.139.173.210 83.137.41.9 83.137.41.8 83.137.218.126 83.136.95.13 83.136.95.12 83.135.16.46 83.13.214.38 83.13.105.212 83.110.139.58 83.1.88.194 83.1.221.110 83.1.216.170 83.1.215.1 83.1.213.1 83.1.191.242 83.1.184.198 83.1.108.26 83.1.102.78 83.0.57.50 83.0.124.106 83.0.114.235 82.98.169.6 82.97.198.50 82.97.198.122 82.97.19.9 82.96.65.2 82.96.64.2 82.81.243.65 82.80.232.24 82.80.219.220 82.80.207.94 82.80.207.92 82.79.60.33 82.79.151.215 82.78.94.101 82.78.175.232 82.78.168.19 82.77.63.193 82.77.48.243 82.77.28.143 82.77.137.111 82.77.100.255 82.76.32.233 82.69.88.225 82.69.53.72 82.68.135.30 82.66.221.168 82.66.200.96 82.66.181.223 82.66.112.123 82.65.161.62 82.65.126.5 82.64.73.173 82.64.52.182 82.64.35.106 82.64.26.100 82.64.206.162 82.64.199.74 82.64.136.152 82.64.134.25 82.64.128.90 82.64.108.41 82.3.55.75 82.223.43.222 82.223.210.127 82.223.149.133 82.223.107.139 82.222.49.18 82.220.99.203 82.214.84.133 82.214.162.54 82.214.135.118 82.214.100.214 82.213.32.29 82.210.34.38 82.209.223.144 82.209.203.56 82.208.72.214 82.208.146.164 82.208.137.137 82.204.207.198 82.204.202.66 82.204.200.246 82.204.199.7 82.204.198.50 82.204.197.153 82.204.175.198 82.204.163.234 82.204.138.46 82.202.247.47 82.202.215.178 82.200.29.130 82.198.78.140 82.196.13.196 82.195.16.29 82.195.16.13 82.194.244.140 82.194.19.99 82.194.19.147 82.194.17.111 82.193.241.125 82.193.211.186 82.192.169.38 82.179.33.70 82.177.14.166 82.177.113.62 82.165.76.185 82.165.65.153 82.165.26.30 82.163.117.181 82.162.58.236 82.162.34.19 82.152.37.235 82.151.97.230 82.151.90.1 82.151.70.84 82.151.127.188 82.151.122.19 82.151.115.85 82.151.114.180 82.151.114.140 82.151.114.130 82.149.209.86 82.149.203.82 82.148.69.71 82.146.40.201 82.146.26.2 82.144.139.147 82.143.81.146 82.142.67.86 82.142.156.186 82.142.135.213 82.140.97.198 82.140.114.98 82.140.114.174 82.139.9.113 82.138.82.214 82.138.35.46 82.138.31.164 82.138.117.102 82.137.27.130 82.137.245.41 82.135.26.24 82.135.255.112 82.135.215.108 82.135.203.178 82.135.197.108 82.135.137.106 82.135.112.130 82.134.43.3 82.127.85.3 82.127.6.40 82.119.154.40 82.119.145.126 82.118.243.190 82.118.243.189 82.118.129.158 82.117.67.57 82.117.219.138 82.117.212.246 82.117.211.18 82.117.201.6 82.117.196.42 82.116.54.164 82.116.39.182 82.116.37.214 82.115.76.160 82.115.131.47 82.114.85.25 82.114.79.146 82.114.67.150 82.114.56.37 82.114.240.34 82.114.240.195 82.114.240.112 82.114.240.101 82.112.49.97 82.112.48.94 82.112.48.182 82.112.44.81 82.112.40.153 82.112.189.177 82.103.129.240 82.102.44.137 82.102.41.117 82.102.188.168 82.102.147.34 82.100.87.86 81.95.207.16 81.95.132.94 81.95.130.202 81.95.121.214 81.95.113.2 81.94.65.196 81.94.164.237 81.94.152.38 81.94.134.205 81.93.99.230 81.93.89.116 81.93.71.254 81.93.185.19 81.93.141.162 81.9.198.217 81.9.198.206 81.9.198.202 81.9.198.12 81.9.198.118 81.9.122.9 81.89.79.245 81.88.220.59 81.88.197.178 81.88.118.201 81.83.4.18 81.83.13.159 81.82.232.125 81.82.201.45 81.7.94.177 81.7.94.169 81.7.16.249 81.7.16.240 81.7.104.226 81.63.169.142 81.62.235.182 81.5.20.254 81.5.1.54 81.45.78.156 81.45.43.133 81.45.174.150 81.45.138.117 81.43.68.191 81.42.248.139 81.42.230.57 81.4.149.154 81.4.128.130 81.4.126.70 81.4.104.170 81.4.100.121 81.30.254.133 81.30.219.213 81.30.217.41 81.30.213.34 81.30.212.189 81.30.209.107 81.30.200.197 81.30.197.178 81.30.177.172 81.3.27.54 81.29.139.76 81.29.132.3 81.28.173.204 81.28.164.44 81.27.217.7 81.27.212.130 81.27.162.100 81.26.23.193 81.26.23.192 81.255.9.173 81.250.247.144 81.250.234.100 81.248.42.55 81.248.237.119 81.248.236.204 81.248.1.164 81.247.30.57 81.246.99.1 81.246.95.66 81.246.88.101 81.24.82.71 81.24.122.118 81.23.193.28 81.23.180.70 81.23.178.14 81.23.153.203 81.23.124.190 81.23.120.122 81.221.24.181 81.221.123.173 81.22.26.6 81.219.64.202 81.218.223.79 81.218.223.76 81.218.223.12 81.218.223.112 81.218.222.1 81.216.9.94 81.216.9.110 81.211.98.234 81.211.72.146 81.211.5.194 81.211.115.142 81.21.82.86 81.21.104.102 81.201.51.140 81.201.125.236 81.200.28.216 81.200.251.111 81.200.18.145 81.20.87.21 81.20.82.131 81.20.203.120 81.199.16.1 81.199.137.188 81.198.81.165 81.198.65.163 81.198.189.160 81.196.169.226 81.192.193.134 81.19.62.62 81.183.253.121 81.183.248.213 81.183.234.98 81.183.232.240 81.183.230.143 81.183.227.40 81.183.224.48 81.183.223.33 81.183.223.225 81.183.216.211 81.183.215.141 81.183.212.194 81.183.211.172 81.182.250.40 81.182.246.69 81.182.245.238 81.182.244.148 81.182.243.24 81.181.130.105 81.181.130.101 81.18.218.218 81.177.48.216 81.177.255.67 81.177.25.15 81.177.166.162 81.177.136.80 81.176.229.165 81.174.11.225 81.173.126.239 81.171.5.222 81.170.150.234 81.17.94.238 81.17.232.196 81.17.232.194 81.169.244.26 81.169.239.124 81.169.233.218 81.169.226.26 81.169.214.46 81.169.201.113 81.169.179.146 81.169.174.224 81.169.172.226 81.169.136.222 81.169.135.209 81.167.4.243 81.167.0.163 81.163.61.183 81.163.61.170 81.162.208.105 81.162.111.11 81.16.9.2 81.16.8.46 81.16.18.228 81.150.98.206 81.150.164.193 81.150.126.65 81.15.197.242 81.15.180.110 81.15.162.218 81.15.133.90 81.149.151.43 81.147.49.247 81.147.49.246 81.147.49.229 81.144.94.247 81.144.94.246 81.144.94.245 81.133.149.153 81.130.148.128 81.130.132.247 81.128.152.229 81.0.77.6 81.0.56.180 81.0.220.118 80.97.254.218 80.96.4.194 80.96.177.217 80.94.225.100 80.94.22.200 80.93.37.202 80.93.254.202 80.93.251.162 80.92.211.80 80.91.22.151 80.91.17.230 80.91.17.200 80.91.17.101 80.90.132.107 80.89.196.225 80.89.145.83 80.87.39.34 80.87.33.242 80.87.187.82 80.87.146.13 80.87.144.80 80.87.144.184 80.87.144.17 80.87.144.111 80.86.231.136 80.86.230.58 80.86.157.100 80.83.239.194 80.83.137.135 80.82.55.71 80.82.36.158 80.82.20.42 80.81.232.202 80.81.2.50 80.81.147.82 80.80.98.8 80.80.98.68 80.80.218.218 80.80.127.135 80.80.108.12 80.80.104.7 80.79.245.138 80.79.179.2 80.79.176.2 80.78.134.11 80.78.132.79 80.78.132.65 80.77.53.58 80.76.229.62 80.76.184.6 80.73.90.54 80.73.88.21 80.73.71.4 80.73.66.90 80.73.206.205 80.72.64.99 80.72.64.108 80.72.30.35 80.72.30.129 80.72.179.29 80.72.179.141 80.72.178.140 80.72.178.139 80.72.17.248 80.70.99.200 80.67.6.98 80.67.213.14 80.67.105.163 80.66.156.98 80.65.83.104 80.65.80.230 80.64.162.43 80.58.157.223 80.58.155.32 80.55.205.229 80.54.51.106 80.54.26.254 80.54.219.186 80.54.119.66 80.53.75.34 80.53.158.122 80.52.60.2 80.50.138.234 80.50.129.22 80.50.128.70 80.48.33.33 80.48.212.83 80.48.178.106 80.48.173.212 80.48.126.12 80.27.3.5 80.27.3.4 80.27.3.17 80.27.2.228 80.27.2.222 80.27.2.221 80.27.0.158 80.254.123.70 80.253.17.46 80.252.177.227 80.252.177.226 80.252.156.90 80.252.145.154 80.252.145.132 80.252.145.130 80.252.144.228 80.252.140.198 80.250.210.218 80.250.174.254 80.249.81.151 80.249.3.204 80.249.188.53 80.249.168.172 80.248.57.28 80.248.55.14 80.248.51.229 80.248.155.94 80.247.35.20 80.246.23.3 80.246.15.4 80.245.54.153 80.245.226.219 80.244.174.192 80.242.237.178 80.242.196.55 80.241.248.162 80.241.241.226 80.241.208.210 80.240.26.135 80.240.253.76 80.240.216.153 80.240.21.21 80.234.37.46 80.234.32.136 80.233.254.186 80.233.254.181 80.233.149.67 80.232.240.91 80.232.239.44 80.232.219.35 80.232.217.137 80.229.31.179 80.228.76.154 80.228.231.48 80.228.231.122 80.228.226.132 80.227.67.106 80.227.38.26 80.220.131.128 80.211.51.57 80.211.45.12 80.211.36.243 80.211.21.112 80.211.208.74 80.211.179.15 80.209.71.197 80.209.176.170 80.194.118.138 80.186.145.164 80.179.255.238 80.179.183.9 80.179.160.8 80.178.255.122 80.178.170.176 80.158.47.193 80.156.145.201 80.155.181.190 80.154.108.233 80.153.45.254 80.152.176.239 80.151.70.192 80.151.54.36 80.151.237.57 80.151.224.157 80.151.165.101 80.151.11.49 80.150.109.197 80.15.204.212 80.15.18.130 80.15.128.201 80.15.123.60 80.147.95.112 80.147.47.252 80.147.198.229 80.147.187.89 80.147.181.115 80.147.16.148 80.147.151.133 80.147.145.111 80.14.71.233 80.14.67.41 80.13.98.191 80.13.86.74 80.13.34.124 80.13.229.72 80.13.138.211 80.13.108.61 80.125.41.162 80.125.21.2 80.125.0.246 80.123.196.122 80.118.230.106 80.118.142.178 80.113.19.90 80.110.42.36 80.11.47.121 80.11.245.33 8.8.8.8 8.8.50.1 8.8.4.4 8.47.17.249 8.43.56.34 8.42.68.81 8.42.68.209 8.42.146.74 8.41.124.193 8.38.73.60 8.38.18.201 8.36.152.1 8.36.139.129 8.36.139.1 8.35.35.35 8.34.34.34 8.33.239.244 8.33.239.235 8.33.239.234 8.33.1.11 8.33.1.10 8.30.39.40 8.30.39.39 8.30.39.37 8.30.39.35 8.30.36.94 8.30.192.171 8.30.101.125 8.30.101.124 8.30.101.123 8.30.101.118 8.29.64.122 8.29.3.77 8.29.3.76 8.29.3.75 8.29.3.74 8.29.3.67 8.29.3.66 8.29.3.37 8.29.3.36 8.29.3.34 8.29.3.228 8.29.3.227 8.29.3.226 8.29.3.221 8.29.3.219 8.29.3.213 8.29.3.211 8.29.3.140 8.29.3.139 8.29.3.138 8.29.3.133 8.29.3.132 8.29.3.131 8.29.2.139 8.29.2.133 8.29.2.132 8.29.2.130 8.28.113.202 8.28.109.99 8.28.109.85 8.28.109.84 8.28.109.83 8.28.109.82 8.28.109.77 8.28.109.75 8.28.109.74 8.28.109.70 8.28.109.69 8.28.109.68 8.28.109.62 8.28.109.60 8.28.109.6 8.28.109.5 8.28.109.46 8.28.109.44 8.28.109.42 8.28.109.4 8.28.109.3 8.28.109.254 8.28.109.252 8.28.109.251 8.28.109.247 8.28.109.246 8.28.109.244 8.28.109.237 8.28.109.235 8.28.109.233 8.28.109.231 8.28.109.230 8.28.109.229 8.28.109.228 8.28.109.226 8.28.109.13 8.28.109.126 8.28.109.125 8.28.109.124 8.28.109.123 8.28.109.122 8.28.109.117 8.28.109.116 8.28.109.115 8.28.109.114 8.28.109.110 8.28.109.11 8.28.109.109 8.28.109.106 8.28.109.102 8.28.109.101 8.28.109.10 8.26.56.99 8.26.56.97 8.26.56.96 8.26.56.95 8.26.56.94 8.26.56.93 8.26.56.92 8.26.56.90 8.26.56.89 8.26.56.88 8.26.56.87 8.26.56.86 8.26.56.85 8.26.56.84 8.26.56.83 8.26.56.82 8.26.56.80 8.26.56.8 8.26.56.78 8.26.56.77 8.26.56.74 8.26.56.73 8.26.56.72 8.26.56.70 8.26.56.7 8.26.56.68 8.26.56.65 8.26.56.64 8.26.56.63 8.26.56.62 8.26.56.6 8.26.56.58 8.26.56.57 8.26.56.56 8.26.56.54 8.26.56.53 8.26.56.52 8.26.56.51 8.26.56.48 8.26.56.46 8.26.56.45 8.26.56.44 8.26.56.42 8.26.56.41 8.26.56.40 8.26.56.39 8.26.56.38 8.26.56.37 8.26.56.36 8.26.56.35 8.26.56.34 8.26.56.33 8.26.56.31 8.26.56.30 8.26.56.3 8.26.56.29 8.26.56.28 8.26.56.27 8.26.56.26 8.26.56.255 8.26.56.252 8.26.56.250 8.26.56.25 8.26.56.249 8.26.56.247 8.26.56.246 8.26.56.245 8.26.56.244 8.26.56.243 8.26.56.242 8.26.56.241 8.26.56.240 8.26.56.24 8.26.56.238 8.26.56.237 8.26.56.236 8.26.56.233 8.26.56.232 8.26.56.230 8.26.56.23 8.26.56.228 8.26.56.227 8.26.56.226 8.26.56.223 8.26.56.222 8.26.56.221 8.26.56.22 8.26.56.219 8.26.56.218 8.26.56.217 8.26.56.216 8.26.56.214 8.26.56.213 8.26.56.212 8.26.56.211 8.26.56.210 8.26.56.209 8.26.56.208 8.26.56.206 8.26.56.205 8.26.56.204 8.26.56.203 8.26.56.202 8.26.56.201 8.26.56.20 8.26.56.199 8.26.56.198 8.26.56.197 8.26.56.196 8.26.56.195 8.26.56.194 8.26.56.193 8.26.56.192 8.26.56.190 8.26.56.19 8.26.56.186 8.26.56.184 8.26.56.183 8.26.56.182 8.26.56.180 8.26.56.18 8.26.56.179 8.26.56.178 8.26.56.175 8.26.56.174 8.26.56.173 8.26.56.171 8.26.56.17 8.26.56.169 8.26.56.168 8.26.56.167 8.26.56.164 8.26.56.163 8.26.56.162 8.26.56.161 8.26.56.160 8.26.56.16 8.26.56.159 8.26.56.158 8.26.56.157 8.26.56.156 8.26.56.155 8.26.56.154 8.26.56.153 8.26.56.151 8.26.56.150 8.26.56.15 8.26.56.149 8.26.56.148 8.26.56.147 8.26.56.146 8.26.56.144 8.26.56.143 8.26.56.142 8.26.56.141 8.26.56.139 8.26.56.137 8.26.56.136 8.26.56.135 8.26.56.134 8.26.56.133 8.26.56.131 8.26.56.13 8.26.56.129 8.26.56.127 8.26.56.126 8.26.56.125 8.26.56.124 8.26.56.123 8.26.56.122 8.26.56.12 8.26.56.119 8.26.56.118 8.26.56.117 8.26.56.116 8.26.56.115 8.26.56.114 8.26.56.113 8.26.56.112 8.26.56.111 8.26.56.110 8.26.56.11 8.26.56.109 8.26.56.108 8.26.56.107 8.26.56.106 8.26.56.105 8.26.56.104 8.26.56.103 8.26.56.102 8.26.56.101 8.26.56.100 8.26.56.10 8.26.56.0 8.25.185.132 8.25.185.131 8.25.184.254 8.25.184.253 8.25.184.252 8.25.184.251 8.25.184.107 8.243.126.9 8.243.126.19 8.243.126.18 8.243.126.14 8.243.126.127 8.243.126.126 8.243.126.123 8.243.126.122 8.243.126.120 8.243.126.11 8.243.126.10 8.243.113.189 8.242.73.84 8.242.6.242 8.242.201.150 8.242.153.171 8.242.153.169 8.242.153.166 8.242.153.165 8.242.153.162 8.242.144.203 8.24.104.109 8.23.82.186 8.224.34.74 8.215.30.242 8.213.0.112 8.213.0.111 8.212.10.42 8.210.22.68 8.209.66.67 8.209.2.129 8.208.2.65 8.20.37.37 8.20.37.35 8.20.247.98 8.20.247.97 8.20.247.95 8.20.247.94 8.20.247.93 8.20.247.92 8.20.247.91 8.20.247.90 8.20.247.9 8.20.247.89 8.20.247.88 8.20.247.87 8.20.247.86 8.20.247.85 8.20.247.81 8.20.247.80 8.20.247.8 8.20.247.79 8.20.247.78 8.20.247.77 8.20.247.76 8.20.247.74 8.20.247.72 8.20.247.71 8.20.247.70 8.20.247.7 8.20.247.69 8.20.247.67 8.20.247.66 8.20.247.65 8.20.247.64 8.20.247.63 8.20.247.62 8.20.247.61 8.20.247.60 8.20.247.6 8.20.247.59 8.20.247.58 8.20.247.57 8.20.247.56 8.20.247.55 8.20.247.54 8.20.247.53 8.20.247.52 8.20.247.51 8.20.247.5 8.20.247.49 8.20.247.47 8.20.247.45 8.20.247.43 8.20.247.42 8.20.247.41 8.20.247.4 8.20.247.39 8.20.247.38 8.20.247.37 8.20.247.36 8.20.247.35 8.20.247.34 8.20.247.33 8.20.247.31 8.20.247.30 8.20.247.3 8.20.247.26 8.20.247.254 8.20.247.251 8.20.247.250 8.20.247.25 8.20.247.249 8.20.247.247 8.20.247.246 8.20.247.245 8.20.247.242 8.20.247.241 8.20.247.240 8.20.247.239 8.20.247.238 8.20.247.236 8.20.247.235 8.20.247.234 8.20.247.233 8.20.247.231 8.20.247.230 8.20.247.23 8.20.247.227 8.20.247.225 8.20.247.224 8.20.247.223 8.20.247.222 8.20.247.221 8.20.247.220 8.20.247.219 8.20.247.218 8.20.247.217 8.20.247.215 8.20.247.214 8.20.247.213 8.20.247.212 8.20.247.211 8.20.247.210 8.20.247.21 8.20.247.207 8.20.247.205 8.20.247.202 8.20.247.201 8.20.247.200 8.20.247.20 8.20.247.2 8.20.247.199 8.20.247.197 8.20.247.196 8.20.247.193 8.20.247.192 8.20.247.191 8.20.247.190 8.20.247.19 8.20.247.189 8.20.247.188 8.20.247.187 8.20.247.185 8.20.247.184 8.20.247.183 8.20.247.182 8.20.247.18 8.20.247.179 8.20.247.178 8.20.247.177 8.20.247.176 8.20.247.175 8.20.247.174 8.20.247.172 8.20.247.171 8.20.247.170 8.20.247.17 8.20.247.169 8.20.247.168 8.20.247.166 8.20.247.165 8.20.247.164 8.20.247.163 8.20.247.161 8.20.247.16 8.20.247.159 8.20.247.157 8.20.247.155 8.20.247.154 8.20.247.153 8.20.247.152 8.20.247.150 8.20.247.149 8.20.247.148 8.20.247.146 8.20.247.142 8.20.247.141 8.20.247.140 8.20.247.139 8.20.247.138 8.20.247.137 8.20.247.134 8.20.247.133 8.20.247.132 8.20.247.13 8.20.247.129 8.20.247.128 8.20.247.127 8.20.247.126 8.20.247.125 8.20.247.124 8.20.247.121 8.20.247.120 8.20.247.12 8.20.247.119 8.20.247.118 8.20.247.115 8.20.247.113 8.20.247.112 8.20.247.110 8.20.247.11 8.20.247.109 8.20.247.108 8.20.247.107 8.20.247.106 8.20.247.105 8.20.247.103 8.20.247.102 8.20.247.101 8.20.247.10 8.20.247.0 8.20.207.157 8.20.207.156 8.20.207.155 8.20.207.154 8.20.207.150 8.20.207.149 8.20.207.148 8.20.207.146 8.20.205.206 8.20.205.205 8.20.205.198 8.20.205.196 8.20.205.194 8.19.63.58 8.19.225.254 8.18.4.20 8.18.4.19 8.17.40.98 8.17.40.109 8.17.40.108 8.17.40.107 8.17.40.106 8.17.40.102 8.17.40.101 8.17.40.100 8.17.30.61 8.14.63.94 8.14.63.93 8.14.63.91 8.14.63.90 8.14.63.85 8.14.63.82 8.14.62.70 8.14.62.69 8.14.62.68 8.14.62.67 8.14.172.177 8.0.7.0 8.0.6.128 8.0.41.16 8.0.11.0 79.98.222.23 79.98.147.146 79.98.138.6 79.77.56.123 79.61.138.153 79.190.241.168 79.188.180.106 79.187.201.181 79.187.201.179 79.175.7.7 79.174.52.122 79.174.36.83 79.174.187.207 79.173.96.37 79.173.81.152 79.173.251.155 79.170.252.236 79.170.252.235 79.170.252.233 79.170.252.226 79.170.189.235 79.170.184.201 79.170.160.62 79.163.66.142 79.163.65.188 79.162.243.32 79.162.211.34 79.162.192.189 79.161.9.164 79.161.154.90 79.143.72.246 79.143.177.243 79.143.160.90 79.143.148.8 79.142.84.242 79.142.50.30 79.141.82.250 79.141.81.250 79.140.29.116 79.140.22.126 79.140.190.191 79.140.19.164 79.140.180.219 79.139.31.188 79.138.160.93 79.137.66.87 79.137.66.85 79.137.66.229 79.137.190.174 79.137.181.102 79.137.110.166 79.136.81.112 79.136.81.111 79.136.18.131 79.135.61.9 79.135.61.7 79.135.61.11 79.134.56.10 79.134.54.190 79.133.62.62 79.131.108.227 79.129.93.46 79.129.62.57 79.129.52.33 79.129.35.6 79.129.204.120 79.129.100.212 79.129.1.120 79.125.163.222 79.125.163.149 79.124.50.245 79.120.79.54 79.120.79.194 79.120.7.126 79.120.54.186 79.120.33.122 79.120.32.170 79.110.205.107 79.110.204.58 79.110.203.165 79.110.199.229 79.110.198.178 79.106.24.13 79.106.231.170 79.106.172.70 79.104.8.10 79.104.30.170 79.104.3.158 79.104.26.58 79.104.18.118 79.104.17.30 79.101.62.46 79.101.46.218 79.101.39.65 79.101.38.164 79.0.73.35 78.96.119.60 78.9.110.22 78.88.188.98 78.88.188.206 78.85.41.38 78.85.33.152 78.85.33.129 78.85.32.234 78.85.241.59 78.85.24.193 78.85.22.141 78.85.21.175 78.83.183.104 78.83.11.170 78.80.47.119 78.46.80.82 78.46.173.177 78.41.171.147 78.40.107.141 78.36.4.51 78.36.203.181 78.36.202.75 78.36.196.87 78.31.85.18 78.31.67.99 78.31.64.193 78.31.59.12 78.31.150.6 78.31.100.237 78.31.100.115 78.30.249.249 78.30.243.152 78.30.217.153 78.30.197.31 78.30.194.253 78.30.194.13 78.29.28.10 78.29.19.18 78.28.158.220 78.26.148.136 78.25.86.148 78.25.155.61 78.25.155.56 78.25.155.101 78.25.128.130 78.199.59.111 78.159.157.89 78.157.163.69 78.157.162.147 78.156.255.42 78.155.252.220 78.155.23.143 78.155.172.11 78.153.224.243 78.153.138.70 78.153.137.234 78.142.85.182 78.142.37.74 78.142.234.75 78.142.234.4 78.142.233.245 78.142.233.163 78.142.232.70 78.142.232.35 78.140.59.25 78.140.56.107 78.140.4.85 78.140.27.177 78.140.24.168 78.140.205.14 78.140.12.87 78.140.10.3 78.136.108.192 78.134.68.101 78.134.63.198 78.134.212.20 78.134.210.176 78.132.142.171 78.131.88.3 78.131.87.208 78.131.12.155 78.131.12.126 78.131.11.248 78.131.11.118 78.130.65.38 78.130.38.68 78.130.38.64 78.130.231.66 78.130.147.3 78.130.147.134 78.130.147.109 78.129.243.107 78.129.243.105 78.129.231.117 78.129.138.112 78.111.144.27 78.111.121.102 78.111.115.198 78.110.160.53 78.110.157.178 78.110.151.199 78.109.98.132 78.109.191.90 78.109.131.76 78.108.77.75 78.108.70.133 78.108.164.58 78.108.164.125 78.108.160.207 78.108.102.212 78.108.101.23 78.107.63.165 78.107.31.203 78.107.30.33 78.107.235.83 78.107.234.187 77.95.52.251 77.94.97.150 77.94.205.70 77.94.124.18 77.93.193.202 77.92.245.50 77.92.138.166 77.91.245.76 77.91.21.106 77.89.4.114 77.89.204.186 77.89.180.166 77.88.8.88 77.88.8.8 77.88.8.7 77.88.8.3 77.88.8.2 77.88.8.1 77.88.105.215 77.87.86.196 77.87.85.126 77.87.103.181 77.87.100.52 77.85.204.242 77.85.195.234 77.85.194.207 77.85.170.99 77.79.248.43 77.79.248.249 77.79.227.107 77.79.191.49 77.79.184.131 77.79.134.94 77.79.133.19 77.79.132.7 77.78.205.175 77.78.201.59 77.78.201.103 77.78.196.3 77.78.159.210 77.78.154.9 77.78.153.198 77.78.148.30 77.77.24.10 77.77.215.98 77.76.190.71 77.76.188.247 77.76.174.200 77.76.148.204 77.75.93.86 77.75.8.229 77.75.35.139 77.75.35.138 77.74.31.171 77.73.41.121 77.72.195.10 77.71.9.243 77.71.69.6 77.71.66.144 77.71.62.125 77.71.54.253 77.71.28.137 77.71.21.188 77.69.37.70 77.69.141.243 77.68.94.230 77.68.79.87 77.68.240.102 77.68.240.101 77.68.23.47 77.68.127.184 77.66.201.215 77.66.179.73 77.66.178.208 77.66.177.235 77.66.176.135 77.65.6.210 77.65.52.106 77.65.46.150 77.65.43.187 77.65.36.222 77.65.19.202 77.65.117.250 77.55.224.248 77.55.208.167 77.51.209.243 77.51.209.226 77.51.204.184 77.51.203.241 77.51.190.77 77.51.186.203 77.50.152.126 77.50.132.62 77.48.45.234 77.48.176.3 77.48.159.46 77.46.152.99 77.46.136.160 77.45.125.84 77.45.111.74 77.45.111.51 77.45.110.84 77.44.72.68 77.43.73.228 77.43.58.56 77.42.253.91 77.42.220.110 77.41.161.202 77.41.159.250 77.41.155.86 77.41.150.30 77.40.51.241 77.40.49.9 77.39.99.247 77.39.63.143 77.39.233.134 77.39.229.161 77.38.204.210 77.37.196.136 77.37.164.143 77.37.158.108 77.37.146.43 77.34.74.185 77.34.49.120 77.34.2.94 77.32.126.208 77.28.96.25 77.28.114.147 77.26.214.15 77.26.196.60 77.246.57.132 77.246.236.114 77.245.114.45 77.245.112.174 77.244.76.153 77.244.223.130 77.243.98.99 77.243.4.154 77.243.112.230 77.242.96.158 77.242.186.206 77.242.18.69 77.242.142.123 77.242.138.149 77.242.108.167 77.242.107.172 77.242.107.110 77.238.209.242 77.238.129.116 77.237.8.175 77.237.15.126 77.236.65.19 77.235.8.83 77.235.29.159 77.235.27.18 77.235.19.147 77.233.6.226 77.233.192.110 77.233.10.104 77.232.26.104 77.232.167.89 77.232.167.27 77.232.167.181 77.232.167.127 77.232.162.90 77.232.160.249 77.232.160.229 77.231.171.44 77.230.66.172 77.230.19.121 77.222.170.103 77.221.90.86 77.220.187.242 77.220.136.22 77.198.214.82 77.158.164.186 77.158.163.134 77.158.145.234 77.156.224.84 77.137.26.185 77.137.26.184 77.129.200.109 77.129.181.101 77.129.160.137 77.121.33.221 77.109.21.186 77.108.97.105 77.108.81.236 77.108.30.218 77.106.201.102 77.106.181.58 77.105.0.17 77.104.252.137 77.104.247.101 77.104.247.100 76.9.245.205 76.85.68.107 76.80.58.102 76.80.221.14 76.79.232.163 76.76.2.5 76.76.2.44 76.76.2.4 76.76.2.38 76.76.2.37 76.76.2.36 76.76.2.35 76.76.2.34 76.76.2.33 76.76.2.32 76.76.2.2 76.76.2.11 76.76.2.1 76.76.2.0 76.76.10.5 76.76.10.4 76.76.10.38 76.76.10.37 76.76.10.36 76.76.10.35 76.76.10.34 76.76.10.33 76.76.10.32 76.76.10.2 76.76.10.155 76.76.10.1 76.76.10.0 76.72.141.20 76.240.86.154 76.190.97.130 76.181.207.75 76.16.127.159 76.144.87.168 76.122.251.76 75.60.238.51 75.2.53.153 75.190.205.136 75.150.23.1 75.150.197.154 75.148.63.169 75.148.33.61 75.146.225.151 75.144.168.25 75.127.62.190 75.10.63.140 75.10.57.38 74.95.17.85 74.93.8.236 74.93.61.233 74.9.229.243 74.87.93.226 74.87.71.130 74.87.171.129 74.85.157.195 74.84.156.35 74.82.42.42 74.75.115.158 74.63.199.2 74.62.175.3 74.220.250.149 74.220.244.105 74.219.86.186 74.214.190.148 74.214.183.94 74.208.27.110 74.208.229.185 74.208.217.104 74.208.207.175 74.208.191.19 74.203.184.12 74.202.142.162 74.174.200.5 74.143.124.121 74.142.66.246 74.142.233.195 74.124.54.13 74.123.230.1 74.122.68.33 74.122.134.108 74.121.124.153 74.120.41.197 74.120.30.97 74.120.29.129 74.120.249.24 74.120.24.97 74.120.24.129 74.117.241.12 74.114.234.146 74.113.40.2 74.113.101.251 74.112.48.13 74.112.164.55 73.76.100.239 73.232.202.74 73.213.55.199 73.198.65.77 73.181.42.153 73.130.2.237 73.121.146.21 73.111.103.128 73.100.143.241 72.95.12.221 72.69.161.7 72.45.194.226 72.45.186.19 72.45.131.66 72.44.21.239 72.44.21.223 72.28.117.69 72.28.117.68 72.255.245.68 72.255.242.63 72.255.226.226 72.253.176.39 72.24.115.38 72.237.212.21 72.237.212.20 72.234.100.183 72.223.30.166 72.215.205.36 72.211.20.43 72.211.20.35 72.20.142.226 72.19.3.8 72.19.20.12 72.19.20.10 72.18.200.5 72.18.200.12 72.167.54.236 72.167.42.99 72.167.39.214 72.167.39.167 72.14.186.159 72.14.11.161 72.131.206.67 72.129.184.111 72.128.132.211 72.10.3.46 71.93.47.214 71.9.227.214 71.86.3.190 71.82.235.38 71.78.93.66 71.78.178.237 71.76.82.147 71.67.219.165 71.67.195.27 71.67.154.107 71.66.18.58 71.6.132.177 71.6.132.173 71.45.244.59 71.41.254.5 71.41.252.75 71.4.247.50 71.4.247.100 71.19.251.34 71.167.28.213 71.162.144.157 71.14.165.4 71.13.68.78 71.10.184.57 70.97.122.111 70.95.157.116 70.94.34.23 70.94.151.84 70.91.107.93 70.90.215.209 70.89.219.49 70.88.50.197 70.63.90.202 70.61.254.130 70.61.240.4 70.44.71.55 70.35.134.178 70.232.178.32 70.184.213.142 70.180.24.59 70.180.24.58 70.117.56.250 70.114.18.4 69.75.213.219 69.70.21.150 69.67.97.2 69.67.97.18 69.64.54.93 69.64.54.66 69.63.73.234 69.63.64.12 69.60.160.203 69.60.160.196 69.46.63.34 69.30.174.72 69.28.54.203 69.229.5.233 69.229.1.41 69.194.131.163 69.179.102.1 69.169.190.211 69.167.171.210 69.163.32.8 69.131.56.8 69.13.210.208 69.11.6.154 69.10.42.239 69.1.129.3 68.89.132.250 68.234.119.76 68.225.2.46 68.188.22.22 68.183.179.157 68.177.59.111 68.175.51.49 68.171.221.3 68.171.15.196 68.171.15.195 68.15.188.99 68.132.214.45 67.97.247.52 67.97.247.50 67.79.47.3 67.79.250.226 67.78.98.178 67.72.109.56 67.60.177.71 67.242.6.250 67.231.37.113 67.227.132.89 67.225.137.83 67.222.123.6 67.219.112.206 67.212.188.107 67.210.146.50 67.21.80.164 67.21.172.197 67.207.87.107 67.206.237.78 67.206.161.69 67.204.8.226 67.203.4.92 67.200.141.228 67.20.140.233 67.192.111.202 67.17.215.133 67.17.215.132 67.148.21.250 67.135.161.240 67.134.197.97 67.134.102.128 67.132.197.48 67.130.9.121 67.130.66.225 67.128.201.121 67.128.146.151 67.128.146.144 66.93.87.2 66.92.64.2 66.92.224.2 66.92.159.2 66.85.129.172 66.85.121.14 66.82.4.8 66.82.4.12 66.76.212.177 66.45.254.11 66.42.98.203 66.28.0.61 66.28.0.45 66.251.35.130 66.249.99.130 66.246.119.145 66.244.65.197 66.243.10.180 66.23.227.204 66.223.231.66 66.219.255.23 66.216.47.29 66.212.60.103 66.209.73.153 66.207.46.201 66.206.167.2 66.206.166.2 66.199.10.93 66.199.10.92 66.199.10.80 66.198.220.119 66.198.193.78 66.193.38.100 66.193.240.4 66.181.166.164 66.175.212.65 66.175.203.202 66.175.146.133 66.173.0.3 66.163.0.173 66.163.0.161 66.162.85.79 66.162.113.119 66.161.231.242 66.155.216.122 66.135.47.183 66.111.127.99 66.11.107.97 66.109.229.6 66.109.229.4 65.75.74.124 65.75.74.123 65.56.156.249 65.56.156.242 65.49.37.195 65.39.166.201 65.39.166.199 65.39.166.198 65.39.166.197 65.39.166.134 65.39.166.132 65.39.166.131 65.255.197.147 65.246.64.217 65.246.64.210 65.244.0.14 65.220.42.38 65.220.15.2 65.203.131.152 65.199.61.96 65.184.247.241 65.172.241.13 65.158.43.95 65.158.116.106 65.157.28.247 65.155.70.65 65.155.237.199 65.155.232.151 65.155.226.137 65.155.222.14 65.155.206.25 65.155.188.22 65.155.159.33 65.155.15.167 65.155.149.95 65.155.105.152 65.154.177.78 65.154.130.142 65.153.59.41 65.152.254.167 65.144.5.126 65.144.155.7 65.144.141.168 65.144.134.146 65.144.127.56 65.141.190.234 65.141.175.23 65.141.101.136 65.140.26.130 65.140.231.106 65.140.174.97 65.133.71.9 65.133.11.222 65.133.11.219 65.132.219.239 65.127.10.47 65.124.240.88 65.123.108.7 65.123.108.6 65.121.81.162 65.115.176.233 65.115.175.241 65.114.81.96 65.114.195.96 65.113.9.39 65.112.207.1 65.112.204.79 65.109.93.205 65.108.81.207 65.108.195.182 65.108.192.36 64.90.83.57 64.9.50.67 64.81.79.2 64.81.45.2 64.81.159.2 64.81.127.2 64.80.255.251 64.80.255.240 64.80.203.194 64.76.23.84 64.76.163.165 64.72.212.20 64.6.65.6 64.6.64.6 64.6.128.62 64.6.128.59 64.50.242.202 64.50.241.167 64.50.241.166 64.50.232.30 64.50.232.2 64.5.130.2 64.45.190.98 64.45.185.87 64.31.5.1 64.29.77.253 64.237.97.69 64.237.97.185 64.237.68.238 64.235.48.80 64.233.219.99 64.233.217.2 64.233.207.2 64.233.207.16 64.233.206.99 64.227.2.211 64.223.246.26 64.222.176.152 64.215.98.149 64.215.98.148 64.212.76.178 64.212.106.85 64.212.106.84 64.201.233.59 64.20.37.186 64.191.214.29 64.19.105.113 64.183.6.54 64.17.20.1 64.16.44.102 64.157.242.118 64.156.223.254 64.146.144.50 64.146.142.186 64.145.73.4 64.139.97.3 64.132.94.250 64.132.113.16 64.130.151.75 64.129.67.113 64.129.104.46 64.121.65.187 64.119.80.100 64.119.128.166 64.107.45.5 63.73.11.2 63.47.189.218 63.45.211.2 63.45.209.164 63.45.164.170 63.42.55.88 63.41.58.251 63.40.220.21 63.40.18.84 63.40.15.230 63.250.57.141 63.246.224.30 63.239.222.155 63.238.99.81 63.237.240.226 63.234.98.153 63.234.229.208 63.232.89.67 63.232.110.166 63.226.4.97 63.226.4.1 63.225.136.120 63.218.191.114 63.215.98.144 63.209.139.112 63.197.115.100 63.156.24.246 63.151.93.198 63.151.67.7 63.151.57.183 63.149.93.185 63.149.147.193 63.148.180.7 63.146.221.254 63.146.216.50 63.145.180.22 63.143.98.90 62.96.215.140 62.94.243.1 62.93.33.21 62.91.19.67 62.89.15.179 62.89.15.136 62.89.15.131 62.77.232.226 62.77.122.168 62.76.90.254 62.76.76.62 62.76.62.76 62.76.30.148 62.74.229.107 62.74.216.213 62.74.209.241 62.64.89.42 62.55.249.49 62.55.249.17 62.55.232.201 62.55.207.217 62.54.21.85 62.54.20.179 62.54.20.107 62.48.163.166 62.38.34.118 62.36.9.107 62.32.70.134 62.29.140.29 62.28.68.66 62.28.181.242 62.28.12.234 62.28.102.188 62.255.208.69 62.245.225.55 62.245.225.225 62.233.128.21 62.233.128.18 62.233.128.17 62.232.138.94 62.231.172.178 62.23.35.22 62.23.170.194 62.225.15.253 62.221.253.107 62.219.67.76 62.217.77.45 62.214.3.13 62.210.137.184 62.210.136.158 62.210.122.43 62.210.111.63 62.201.217.194 62.20.83.209 62.2.213.120 62.193.72.151 62.182.223.11 62.176.126.3 62.173.181.238 62.171.167.67 62.168.30.102 62.168.248.82 62.168.242.110 62.168.116.44 62.161.245.137 62.159.231.11 62.157.169.104 62.154.160.3 62.153.165.107 62.153.122.2 62.152.53.218 62.150.77.106 62.150.254.82 62.149.23.91 62.149.183.45 62.149.132.2 62.149.128.4 62.149.128.2 62.146.202.2 62.146.2.48 62.140.239.1 62.14.234.233 62.122.99.198 62.122.102.98 62.12.114.10 62.117.91.149 62.112.116.86 62.106.59.147 62.105.17.234 61.98.131.212 61.97.13.38 61.93.197.46 61.85.98.198 61.83.186.56 61.83.152.140 61.82.49.33 61.82.39.88 61.82.108.138 61.8.255.8 61.8.0.113 61.79.82.241 61.79.146.73 61.76.83.69 61.72.206.211 61.7.197.1 61.58.64.6 61.5.134.35 61.42.23.140 61.41.17.6 61.41.17.16 61.39.168.66 61.35.33.5 61.34.243.102 61.32.254.2 61.255.135.199 61.254.39.30 61.251.111.227 61.250.196.36 61.244.186.189 61.244.186.188 61.244.14.62 61.238.97.254 61.222.77.165 61.221.26.25 61.219.97.68 61.219.41.109 61.219.165.25 61.213.137.58 61.213.119.145 61.206.159.194 61.206.115.16 61.199.203.240 61.199.193.74 61.193.129.2 61.19.42.34 61.19.108.46 61.127.14.130 61.120.9.219 61.111.22.3 61.111.22.2 61.108.103.134 61.100.13.50 61.1.106.16 60.56.215.73 60.45.155.205 60.32.232.49 60.32.220.90 60.32.160.57 60.32.149.50 60.32.107.162 60.251.238.89 60.250.41.183 60.250.235.122 60.250.159.76 60.250.134.27 60.250.134.25 60.249.212.149 60.249.174.18 60.249.11.234 60.248.84.140 60.248.55.151 60.248.242.133 60.248.225.123 60.248.191.21 60.248.191.20 60.248.142.203 60.248.142.199 60.248.10.164 60.244.121.98 60.242.246.234 60.240.176.183 59.9.198.232 59.31.156.154 59.28.197.231 59.28.162.183 59.28.140.6 59.27.124.209 59.2.117.160 59.190.126.235 59.188.10.22 59.18.227.35 59.18.227.32 59.18.227.14 59.159.170.34 59.158.8.83 59.152.238.147 59.152.206.146 59.148.14.33 59.144.177.217 59.127.80.104 59.127.40.140 59.127.38.136 59.127.244.123 59.125.99.157 59.125.83.54 59.125.7.96 59.125.43.223 59.125.246.99 59.125.229.34 59.125.209.82 59.125.155.62 59.124.72.210 59.124.69.19 59.124.62.3 59.124.6.82 59.124.50.36 59.124.26.210 59.124.229.165 59.124.17.180 59.124.141.174 59.124.122.196 59.120.84.217 59.120.52.200 59.120.186.158 59.120.143.151 59.120.141.160 59.120.125.129 59.120.1.176 59.120.1.175 59.12.193.91 59.12.146.87 59.12.136.7 59.103.231.38 59.10.116.10 59.1.58.227 58.96.20.1 58.82.152.44 58.79.26.85 58.72.252.65 58.71.19.113 58.71.125.1 58.69.9.25 58.69.88.193 58.69.78.37 58.69.7.42 58.69.41.17 58.69.29.58 58.69.224.103 58.69.21.74 58.69.174.39 58.69.17.105 58.69.125.152 58.27.196.114 58.26.163.10 58.26.121.130 58.229.253.16 58.228.61.2 58.227.193.227 58.191.61.42 58.185.89.201 58.185.71.113 58.185.58.129 58.185.54.17 58.185.165.125 58.181.52.190 58.181.206.82 58.180.176.3 58.177.179.58 58.177.158.254 58.162.206.206 58.147.189.90 58.138.143.62 58.137.148.83 58.120.226.2 54.94.175.250 54.37.30.59 54.252.183.4 54.251.190.247 54.214.161.74 54.174.40.213 52.6.246.21 52.3.100.184 52.29.2.17 52.24.103.199 52.233.186.232 52.23.148.124 52.229.172.73 52.171.61.133 52.119.88.204 51.91.22.145 51.91.130.132 51.91.124.225 51.83.13.211 51.79.99.90 51.79.144.245 51.77.158.23 51.75.131.205 51.68.81.95 51.68.227.204 51.68.206.207 51.68.199.234 51.68.141.96 51.68.128.120 51.38.62.213 51.38.148.132 51.38.134.82 51.38.125.60 51.38.125.153 51.255.94.135 51.255.84.177 51.255.43.23 51.255.23.2 51.255.128.121 51.255.128.114 51.254.5.245 51.250.66.51 51.210.86.116 51.210.122.169 51.178.84.208 51.178.56.235 51.178.20.235 51.159.77.56 51.15.183.246 51.15.183.212 51.15.174.81 51.11.226.128 51.104.34.175 50.86.78.84 50.78.97.124 50.78.224.131 50.78.108.5 50.77.74.201 50.76.207.170 50.65.169.147 50.49.246.2 50.47.32.116 50.45.183.18 50.29.128.137 50.28.52.102 50.27.156.170 50.249.22.169 50.247.134.226 50.246.249.43 50.242.61.85 50.237.34.1 50.237.114.76 50.236.212.9 50.235.228.46 50.235.153.225 50.235.131.130 50.234.132.241 50.234.125.182 50.231.115.22 50.230.4.242 50.229.170.233 50.226.171.1 50.226.170.222 50.225.95.30 50.225.71.126 50.223.23.54 50.223.162.29 50.223.140.253 50.220.47.51 50.220.130.1 50.218.46.1 50.217.25.205 50.217.25.204 50.217.25.200 50.215.49.13 50.215.184.91 50.213.203.33 50.208.220.49 50.207.85.66 50.207.237.130 50.206.9.62 50.206.226.80 50.206.226.42 50.204.174.98 50.204.174.58 50.203.148.198 50.198.91.121 50.194.130.97 50.192.13.172 50.175.159.202 50.170.46.89 50.168.185.113 50.125.234.126 50.117.0.170 50.115.205.166 5.96.198.66 5.9.94.16 5.9.72.202 5.9.44.83 5.89.30.10 5.83.75.10 5.8.9.2 5.79.101.123 5.63.164.75 5.63.163.69 5.63.111.235 5.63.106.250 5.61.8.20 5.61.203.112 5.59.137.234 5.58.131.22 5.53.244.8 5.53.122.54 5.45.103.22 5.42.248.31 5.39.78.104 5.39.71.50 5.39.65.110 5.39.38.184 5.32.90.30 5.32.72.134 5.32.55.10 5.32.183.251 5.32.132.85 5.28.131.139 5.28.131.134 5.255.9.232 5.255.29.101 5.255.27.54 5.255.26.65 5.255.24.99 5.255.20.15 5.255.172.42 5.255.15.16 5.255.13.115 5.255.12.215 5.255.12.13 5.255.11.205 5.254.198.142 5.254.197.224 5.254.196.61 5.253.253.215 5.253.252.232 5.253.252.130 5.253.146.177 5.252.171.157 5.252.170.88 5.252.170.127 5.249.141.46 5.23.103.11 5.227.66.64 5.226.78.34 5.21.5.130 5.21.242.81 5.21.242.111 5.21.242.103 5.21.241.87 5.21.241.85 5.206.235.55 5.200.50.249 5.200.42.113 5.200.38.113 5.2.33.111 5.2.207.124 5.2.197.180 5.2.196.93 5.199.141.5 5.199.141.30 5.199.130.141 5.196.43.50 5.196.186.81 5.189.181.251 5.189.172.127 5.189.161.18 5.189.160.125 5.189.150.220 5.189.149.51 5.189.148.106 5.189.128.74 5.188.65.196 5.188.64.139 5.188.59.211 5.188.139.235 5.188.137.182 5.187.78.146 5.185.96.232 5.185.94.131 5.185.73.91 5.185.32.122 5.185.250.26 5.185.245.69 5.185.243.40 5.185.243.38 5.185.243.32 5.185.243.27 5.185.241.212 5.185.240.128 5.185.21.53 5.185.2.96 5.181.210.184 5.180.183.129 5.180.1.52 5.178.82.106 5.178.76.172 5.178.114.78 5.175.26.208 5.172.188.118 5.17.92.172 5.17.89.68 5.164.31.60 5.164.27.185 5.164.26.24 5.161.16.131 5.161.118.243 5.158.124.92 5.158.119.176 5.154.120.75 5.152.206.180 5.151.63.237 5.151.62.227 5.149.91.66 5.149.222.186 5.149.221.236 5.149.210.54 5.149.206.139 5.149.141.82 5.148.5.210 5.148.1.21 5.143.233.106 5.141.87.218 5.141.29.82 5.140.233.239 5.140.233.185 5.140.212.239 5.140.162.52 5.135.61.142 5.135.221.207 5.135.221.204 5.135.221.201 5.135.221.200 5.135.166.77 5.135.148.143 5.135.137.224 5.135.1.165 5.134.48.218 5.134.218.78 5.130.61.37 5.129.34.75 5.128.66.56 5.128.37.237 5.128.120.3 5.11.39.22 5.11.11.5 5.11.11.11 5.104.166.26 5.102.81.98 5.101.79.57 5.101.76.193 5.101.76.185 5.101.73.58 5.101.200.62 5.101.11.191 5.100.252.54 5.100.249.231 5.10.25.83 5.10.138.214 5.1.66.255 5.1.38.155 49.50.70.170 49.255.4.22 49.255.194.141 49.254.144.223 49.254.144.195 49.248.155.86 49.248.102.209 49.248.101.78 49.231.237.181 49.231.229.117 49.229.56.21 49.229.158.61 49.229.100.162 49.212.149.131 49.156.53.166 49.143.189.55 49.1.168.71 49.0.90.4 49.0.82.21 49.0.64.179 47.57.147.61 47.49.148.38 47.48.67.238 47.47.144.22 47.44.3.69 47.254.217.105 47.253.24.2 47.207.31.201 47.206.64.128 47.181.203.175 47.180.199.94 47.176.183.12 47.176.153.236 46.8.33.200 46.8.252.136 46.8.249.194 46.8.105.12 46.55.253.26 46.55.223.223 46.55.168.3 46.47.127.251 46.45.32.82 46.45.19.35 46.44.171.105 46.44.1.11 46.44.0.68 46.42.19.218 46.42.19.104 46.40.245.69 46.40.244.249 46.40.244.137 46.40.227.57 46.40.219.164 46.40.218.15 46.40.214.43 46.40.213.53 46.40.2.237 46.40.0.5 46.4.70.20 46.4.53.12 46.37.4.202 46.36.27.78 46.30.172.121 46.29.78.51 46.29.169.6 46.29.12.142 46.254.130.47 46.249.39.8 46.246.29.68 46.245.253.5 46.243.181.193 46.243.181.161 46.243.179.123 46.242.28.69 46.242.130.233 46.238.93.169 46.235.85.142 46.234.101.153 46.233.57.170 46.231.76.240 46.231.72.212 46.228.93.118 46.227.67.134 46.227.200.9 46.226.143.86 46.226.143.83 46.221.5.123 46.22.99.226 46.216.182.238 46.21.250.23 46.21.171.193 46.21.128.118 46.199.82.115 46.199.76.130 46.196.212.8 46.19.103.248 46.188.53.34 46.188.47.18 46.188.22.50 46.185.139.130 46.183.220.64 46.182.19.48 46.174.0.245 46.172.192.236 46.171.144.226 46.167.233.65 46.166.189.67 46.165.54.24 46.160.173.208 46.16.226.250 46.16.226.116 46.149.86.139 46.148.26.40 46.148.26.231 46.140.228.158 46.13.5.26 46.107.231.70 46.107.228.164 46.101.65.164 45.90.31.94 45.90.31.82 45.90.31.75 45.90.31.74 45.90.31.68 45.90.31.6 45.90.31.55 45.90.31.5 45.90.31.41 45.90.31.4 45.90.31.3 45.90.31.250 45.90.31.219 45.90.31.217 45.90.31.204 45.90.31.2 45.90.31.199 45.90.31.194 45.90.31.191 45.90.31.189 45.90.31.185 45.90.31.183 45.90.31.182 45.90.31.179 45.90.31.168 45.90.31.167 45.90.31.163 45.90.31.16 45.90.31.148 45.90.31.144 45.90.31.137 45.90.31.136 45.90.31.135 45.90.31.128 45.90.31.124 45.90.31.117 45.90.31.114 45.90.31.112 45.90.31.1 45.90.30.99 45.90.30.98 45.90.30.97 45.90.30.96 45.90.30.95 45.90.30.94 45.90.30.93 45.90.30.92 45.90.30.91 45.90.30.90 45.90.30.9 45.90.30.89 45.90.30.88 45.90.30.87 45.90.30.86 45.90.30.85 45.90.30.84 45.90.30.83 45.90.30.82 45.90.30.81 45.90.30.80 45.90.30.8 45.90.30.79 45.90.30.78 45.90.30.77 45.90.30.76 45.90.30.75 45.90.30.74 45.90.30.73 45.90.30.72 45.90.30.71 45.90.30.70 45.90.30.7 45.90.30.69 45.90.30.68 45.90.30.67 45.90.30.66 45.90.30.65 45.90.30.64 45.90.30.63 45.90.30.62 45.90.30.61 45.90.30.60 45.90.30.6 45.90.30.59 45.90.30.58 45.90.30.57 45.90.30.56 45.90.30.55 45.90.30.54 45.90.30.53 45.90.30.52 45.90.30.51 45.90.30.50 45.90.30.5 45.90.30.49 45.90.30.48 45.90.30.47 45.90.30.46 45.90.30.45 45.90.30.44 45.90.30.43 45.90.30.42 45.90.30.41 45.90.30.40 45.90.30.39 45.90.30.38 45.90.30.37 45.90.30.36 45.90.30.35 45.90.30.34 45.90.30.33 45.90.30.32 45.90.30.31 45.90.30.30 45.90.30.3 45.90.30.29 45.90.30.28 45.90.30.27 45.90.30.26 45.90.30.254 45.90.30.253 45.90.30.252 45.90.30.251 45.90.30.250 45.90.30.25 45.90.30.249 45.90.30.248 45.90.30.247 45.90.30.246 45.90.30.245 45.90.30.244 45.90.30.243 45.90.30.242 45.90.30.241 45.90.30.240 45.90.30.24 45.90.30.239 45.90.30.238 45.90.30.237 45.90.30.236 45.90.30.235 45.90.30.234 45.90.30.233 45.90.30.232 45.90.30.231 45.90.30.230 45.90.30.23 45.90.30.229 45.90.30.228 45.90.30.227 45.90.30.226 45.90.30.225 45.90.30.224 45.90.30.223 45.90.30.222 45.90.30.221 45.90.30.220 45.90.30.22 45.90.30.219 45.90.30.218 45.90.30.217 45.90.30.216 45.90.30.215 45.90.30.214 45.90.30.213 45.90.30.212 45.90.30.211 45.90.30.210 45.90.30.21 45.90.30.209 45.90.30.208 45.90.30.207 45.90.30.206 45.90.30.205 45.90.30.204 45.90.30.203 45.90.30.202 45.90.30.201 45.90.30.200 45.90.30.20 45.90.30.2 45.90.30.199 45.90.30.198 45.90.30.197 45.90.30.196 45.90.30.195 45.90.30.194 45.90.30.193 45.90.30.192 45.90.30.191 45.90.30.190 45.90.30.19 45.90.30.189 45.90.30.188 45.90.30.187 45.90.30.186 45.90.30.185 45.90.30.184 45.90.30.183 45.90.30.182 45.90.30.181 45.90.30.180 45.90.30.18 45.90.30.179 45.90.30.178 45.90.30.177 45.90.30.176 45.90.30.175 45.90.30.174 45.90.30.173 45.90.30.172 45.90.30.171 45.90.30.170 45.90.30.17 45.90.30.169 45.90.30.168 45.90.30.167 45.90.30.166 45.90.30.165 45.90.30.164 45.90.30.163 45.90.30.162 45.90.30.161 45.90.30.160 45.90.30.16 45.90.30.159 45.90.30.158 45.90.30.157 45.90.30.156 45.90.30.155 45.90.30.154 45.90.30.153 45.90.30.152 45.90.30.151 45.90.30.150 45.90.30.15 45.90.30.149 45.90.30.148 45.90.30.147 45.90.30.146 45.90.30.145 45.90.30.144 45.90.30.143 45.90.30.142 45.90.30.141 45.90.30.140 45.90.30.14 45.90.30.139 45.90.30.138 45.90.30.137 45.90.30.136 45.90.30.135 45.90.30.134 45.90.30.133 45.90.30.132 45.90.30.131 45.90.30.130 45.90.30.13 45.90.30.129 45.90.30.128 45.90.30.127 45.90.30.126 45.90.30.125 45.90.30.124 45.90.30.123 45.90.30.122 45.90.30.121 45.90.30.120 45.90.30.12 45.90.30.119 45.90.30.118 45.90.30.117 45.90.30.116 45.90.30.115 45.90.30.114 45.90.30.113 45.90.30.112 45.90.30.111 45.90.30.110 45.90.30.11 45.90.30.109 45.90.30.108 45.90.30.107 45.90.30.106 45.90.30.105 45.90.30.104 45.90.30.103 45.90.30.102 45.90.30.101 45.90.30.100 45.90.30.10 45.90.30.1 45.90.30.0 45.90.29.99 45.90.29.98 45.90.29.97 45.90.29.95 45.90.29.94 45.90.29.93 45.90.29.91 45.90.29.89 45.90.29.87 45.90.29.86 45.90.29.84 45.90.29.83 45.90.29.82 45.90.29.81 45.90.29.77 45.90.29.75 45.90.29.74 45.90.29.73 45.90.29.72 45.90.29.69 45.90.29.68 45.90.29.67 45.90.29.66 45.90.29.64 45.90.29.63 45.90.29.59 45.90.29.57 45.90.29.254 45.90.29.253 45.90.29.252 45.90.29.251 45.90.29.249 45.90.29.248 45.90.29.244 45.90.29.242 45.90.29.241 45.90.29.240 45.90.29.239 45.90.29.236 45.90.29.235 45.90.29.233 45.90.29.230 45.90.29.226 45.90.29.225 45.90.29.223 45.90.29.222 45.90.29.221 45.90.29.220 45.90.29.22 45.90.29.218 45.90.29.216 45.90.29.215 45.90.29.214 45.90.29.213 45.90.29.212 45.90.29.211 45.90.29.209 45.90.29.208 45.90.29.207 45.90.29.206 45.90.29.204 45.90.29.203 45.90.29.201 45.90.29.198 45.90.29.196 45.90.29.193 45.90.29.189 45.90.29.187 45.90.29.186 45.90.29.185 45.90.29.184 45.90.29.183 45.90.29.182 45.90.29.180 45.90.29.179 45.90.29.178 45.90.29.177 45.90.29.176 45.90.29.173 45.90.29.172 45.90.29.170 45.90.29.168 45.90.29.166 45.90.29.163 45.90.29.162 45.90.29.161 45.90.29.159 45.90.29.157 45.90.29.156 45.90.29.155 45.90.29.154 45.90.29.152 45.90.29.151 45.90.29.149 45.90.29.148 45.90.29.147 45.90.29.146 45.90.29.142 45.90.29.139 45.90.29.134 45.90.29.133 45.90.29.132 45.90.29.130 45.90.29.128 45.90.29.125 45.90.29.123 45.90.29.122 45.90.29.120 45.90.29.119 45.90.29.118 45.90.29.117 45.90.29.114 45.90.29.112 45.90.29.111 45.90.29.108 45.90.29.107 45.90.29.103 45.90.29.10 45.90.28.96 45.90.28.95 45.90.28.91 45.90.28.9 45.90.28.89 45.90.28.86 45.90.28.85 45.90.28.83 45.90.28.82 45.90.28.81 45.90.28.80 45.90.28.8 45.90.28.78 45.90.28.75 45.90.28.74 45.90.28.73 45.90.28.71 45.90.28.68 45.90.28.67 45.90.28.65 45.90.28.64 45.90.28.60 45.90.28.6 45.90.28.59 45.90.28.58 45.90.28.57 45.90.28.52 45.90.28.51 45.90.28.50 45.90.28.5 45.90.28.44 45.90.28.43 45.90.28.42 45.90.28.41 45.90.28.36 45.90.28.35 45.90.28.33 45.90.28.31 45.90.28.30 45.90.28.3 45.90.28.26 45.90.28.253 45.90.28.252 45.90.28.251 45.90.28.250 45.90.28.25 45.90.28.247 45.90.28.246 45.90.28.245 45.90.28.244 45.90.28.241 45.90.28.240 45.90.28.238 45.90.28.236 45.90.28.234 45.90.28.233 45.90.28.232 45.90.28.230 45.90.28.229 45.90.28.227 45.90.28.226 45.90.28.225 45.90.28.224 45.90.28.221 45.90.28.22 45.90.28.217 45.90.28.216 45.90.28.215 45.90.28.214 45.90.28.213 45.90.28.211 45.90.28.210 45.90.28.21 45.90.28.208 45.90.28.202 45.90.28.201 45.90.28.200 45.90.28.20 45.90.28.197 45.90.28.196 45.90.28.195 45.90.28.194 45.90.28.192 45.90.28.191 45.90.28.19 45.90.28.186 45.90.28.184 45.90.28.183 45.90.28.182 45.90.28.18 45.90.28.177 45.90.28.175 45.90.28.174 45.90.28.170 45.90.28.169 45.90.28.167 45.90.28.165 45.90.28.164 45.90.28.161 45.90.28.16 45.90.28.159 45.90.28.158 45.90.28.157 45.90.28.156 45.90.28.154 45.90.28.152 45.90.28.151 45.90.28.15 45.90.28.149 45.90.28.148 45.90.28.147 45.90.28.144 45.90.28.143 45.90.28.138 45.90.28.136 45.90.28.135 45.90.28.131 45.90.28.130 45.90.28.13 45.90.28.129 45.90.28.128 45.90.28.125 45.90.28.124 45.90.28.123 45.90.28.121 45.90.28.120 45.90.28.12 45.90.28.118 45.90.28.117 45.90.28.116 45.90.28.113 45.90.28.112 45.90.28.111 45.90.28.11 45.90.28.109 45.90.28.107 45.90.28.106 45.90.28.105 45.90.28.104 45.90.28.102 45.87.235.187 45.84.187.6 45.84.169.143 45.83.43.103 45.83.40.44 45.80.220.213 45.77.236.229 45.77.198.113 45.76.91.140 45.76.90.190 45.76.35.187 45.76.155.194 45.76.115.6 45.74.89.59 45.73.0.118 45.71.203.144 45.7.228.232 45.67.33.48 45.65.225.220 45.65.225.202 45.65.225.196 45.65.173.96 45.65.173.105 45.65.172.15 45.64.173.74 45.63.86.216 45.63.105.236 45.62.200.26 45.6.136.231 45.58.8.74 45.58.38.166 45.58.11.132 45.55.112.11 45.5.94.206 45.5.94.178 45.5.241.225 45.4.97.49 45.32.238.248 45.32.202.187 45.255.126.214 45.249.122.82 45.249.120.60 45.248.78.99 45.248.138.158 45.239.239.130 45.238.20.140 45.236.169.151 45.232.108.30 45.231.221.1 45.231.154.65 45.230.252.238 45.229.28.239 45.228.32.139 45.228.19.18 45.228.181.252 45.228.181.248 45.226.50.27 45.224.96.67 45.224.22.25 45.224.149.238 45.224.148.188 45.224.148.180 45.224.148.177 45.224.148.172 45.224.148.169 45.221.84.210 45.191.104.200 45.191.104.170 45.186.99.45 45.183.172.129 45.180.114.21 45.178.74.107 45.177.74.202 45.177.211.188 45.176.96.42 45.176.227.244 45.175.237.66 45.174.92.172 45.174.70.10 45.174.240.139 45.173.140.190 45.173.12.139 45.172.89.11 45.172.247.174 45.172.222.69 45.172.152.13 45.171.180.81 45.170.224.187 45.168.133.38 45.167.95.160 45.167.92.103 45.167.181.34 45.167.112.2 45.166.56.6 45.164.175.174 45.163.40.82 45.163.220.58 45.163.147.122 45.162.100.248 45.160.188.222 45.159.18.99 45.157.214.92 45.152.120.51 45.147.122.36 45.143.120.250 45.141.58.191 45.14.48.185 45.131.108.160 45.129.19.20 45.126.21.60 45.125.211.11 45.125.208.8 45.123.201.235 45.120.54.191 45.118.217.3 45.117.80.109 45.117.63.81 45.117.63.75 45.117.63.46 45.117.63.42 45.117.63.26 45.117.63.224 45.117.63.221 45.117.63.205 45.117.63.192 45.117.63.107 45.117.63.105 45.11.45.11 43.252.88.130 43.252.244.118 43.251.253.202 43.251.159.130 43.249.65.207 43.249.227.14 43.249.112.98 43.247.16.2 43.240.226.242 43.231.234.17 43.230.201.109 43.229.54.31 43.228.229.130 43.154.235.48 43.132.205.118 42.82.57.6 42.61.73.150 42.61.42.249 42.61.19.26 42.61.19.254 42.61.107.9 42.200.91.189 42.200.196.122 42.2.230.61 42.116.255.185 42.116.255.182 42.116.255.181 42.116.255.180 42.116.255.179 41.87.158.170 41.87.158.142 41.87.147.158 41.87.144.169 41.85.252.37 41.84.143.206 41.79.47.6 41.76.241.135 41.76.215.94 41.76.101.174 41.76.100.130 41.72.216.234 41.63.249.222 41.63.244.89 41.63.240.79 41.60.129.80 41.59.200.123 41.59.197.135 41.58.130.18 41.57.120.177 41.33.166.19 41.231.62.166 41.23.99.30 41.23.99.247 41.23.98.218 41.23.253.80 41.23.253.31 41.23.253.134 41.23.240.216 41.23.240.123 41.23.234.88 41.23.234.37 41.23.234.129 41.23.234.114 41.23.216.154 41.23.216.150 41.23.190.90 41.23.185.218 41.23.184.40 41.23.184.250 41.23.184.235 41.23.184.193 41.23.184.182 41.23.184.151 41.23.184.125 41.23.184.111 41.23.115.51 41.23.114.62 41.23.114.42 41.23.114.41 41.23.114.186 41.23.113.90 41.23.113.86 41.23.113.210 41.23.113.130 41.228.23.167 41.228.23.165 41.228.23.137 41.221.203.153 41.221.192.167 41.221.192.166 41.218.90.154 41.217.204.165 41.216.159.6 41.216.125.179 41.215.248.143 41.215.243.43 41.214.150.122 41.214.138.238 41.211.125.242 41.208.73.31 41.205.195.162 41.204.85.34 41.203.87.157 41.203.62.146 41.191.220.77 41.188.183.82 41.185.21.252 41.185.10.153 41.184.254.94 41.184.212.17 41.184.174.151 41.184.151.186 41.174.182.214 41.174.104.223 41.173.23.150 41.165.19.186 41.162.120.85 41.139.226.83 41.139.206.39 41.139.202.86 41.139.147.86 41.138.133.123 41.138.101.251 41.128.225.226 41.111.204.186 41.111.135.226 41.0.170.154 40.70.19.156 40.127.12.40 40.122.215.219 40.114.69.73 40.114.125.120 4.79.244.118 4.79.132.219 4.7.220.241 4.7.175.6 4.59.81.39 4.53.9.50 4.53.160.75 4.53.133.131 4.4.211.46 4.4.204.130 4.4.178.34 4.35.168.46 4.34.37.186 4.31.24.192 4.31.189.137 4.30.165.222 4.26.151.242 4.26.143.250 4.26.143.210 4.26.137.250 4.2.2.6 4.2.2.5 4.2.2.4 4.2.2.3 4.2.2.2 4.2.2.1 4.16.3.86 4.1.67.166 4.1.67.145 4.1.37.10 4.1.240.35 4.1.131.250 4.0.0.53 39.125.55.218 39.110.226.206 39.110.209.44 39.110.201.118 38.80.70.1 38.74.61.221 38.52.221.126 38.51.48.158 38.242.133.215 38.142.225.131 38.141.25.244 38.135.49.152 38.132.106.139 38.125.161.1 38.124.242.186 38.122.24.30 38.111.185.57 37.99.224.30 37.97.93.166 37.9.57.142 37.9.170.176 37.79.202.114 37.79.150.141 37.59.83.245 37.49.218.38 37.44.45.238 37.32.79.106 37.29.96.183 37.28.156.34 37.26.170.60 37.251.160.252 37.25.36.181 37.235.213.241 37.235.174.43 37.235.128.87 37.232.70.214 37.232.65.230 37.232.47.14 37.230.223.159 37.228.93.107 37.220.215.242 37.208.127.214 37.208.124.37 37.202.49.2 37.194.251.191 37.187.55.202 37.187.155.58 37.187.133.168 37.186.124.135 37.186.115.160 37.18.74.136 37.18.29.33 37.18.29.217 37.18.26.2 37.18.255.71 37.18.105.149 37.17.53.108 37.157.177.192 37.148.235.164 37.128.95.86 37.120.172.191 37.114.62.26 37.114.34.106 37.111.142.222 37.0.70.118 36.50.50.50 35.199.20.182 35.167.25.37 35.155.221.215 34.94.84.140 34.80.2.188 34.76.9.111 32.141.0.226 31.7.37.37 31.7.36.36 31.46.42.149 31.45.234.58 31.44.247.221 31.42.31.2 31.42.179.75 31.41.226.9 31.40.97.86 31.40.113.204 31.40.100.86 31.3.135.232 31.28.113.156 31.28.0.248 31.221.33.250 31.22.0.186 31.210.69.163 31.210.218.84 31.206.52.78 31.202.16.125 31.192.98.158 31.182.37.74 31.182.36.26 31.182.124.131 31.173.244.149 31.173.203.246 31.173.165.18 31.172.250.244 31.172.133.253 31.171.110.240 31.170.113.126 31.163.200.36 31.163.192.96 31.162.165.69 31.156.55.106 31.154.3.161 31.148.48.205 31.148.127.100 31.146.83.206 31.146.5.166 31.146.216.174 31.146.161.194 31.135.92.50 31.135.16.194 31.128.75.116 31.11.204.241 31.11.132.161 31.11.132.129 31.0.162.2 3.214.203.108 3.20.144.103 3.14.242.170 3.139.141.82 3.136.88.129 27.72.58.161 27.7.175.204 27.54.166.204 27.33.60.66 27.32.252.176 27.32.174.151 27.174.14.71 27.174.13.64 27.174.10.206 27.160.23.132 27.147.48.26 27.147.164.86 27.135.204.65 27.131.191.90 27.131.162.193 27.126.4.14 27.126.155.4 27.126.155.1 27.124.6.225 27.122.254.83 27.113.241.18 27.111.32.42 27.110.245.97 27.110.239.50 27.110.232.161 27.110.231.42 27.110.185.10 27.110.176.225 27.110.163.162 27.110.152.250 27.110.148.225 27.110.146.233 27.110.139.78 24.56.102.20 24.56.100.20 24.48.255.252 24.39.127.26 24.39.107.174 24.37.245.42 24.32.73.75 24.244.219.147 24.237.135.25 24.230.77.131 24.209.241.222 24.182.239.198 24.182.14.205 24.172.82.94 24.172.34.250 24.152.48.66 24.152.37.40 24.149.93.51 24.124.66.35 24.123.203.111 24.119.69.70 24.116.92.101 24.116.195.164 24.105.237.170 24.104.140.255 24.104.140.229 24.104.140.222 24.104.140.212 24.104.140.206 24.104.140.201 24.100.136.104 23.92.212.178 23.81.140.234 23.59.249.67 23.59.249.61 23.59.249.226 23.59.248.248 23.59.248.226 23.59.248.171 23.59.248.145 23.59.248.128 23.56.161.88 23.56.161.53 23.56.161.5 23.56.161.255 23.56.161.246 23.56.161.240 23.56.161.23 23.56.161.213 23.56.161.18 23.56.161.167 23.56.161.147 23.56.161.13 23.56.161.12 23.56.161.107 23.56.160.79 23.56.160.36 23.56.160.252 23.56.160.232 23.56.160.213 23.56.160.195 23.56.160.15 23.56.160.14 23.56.160.116 23.31.51.242 23.30.232.82 23.253.230.65 23.25.183.97 23.246.82.186 23.242.22.236 23.216.53.97 23.216.53.83 23.216.53.70 23.216.53.58 23.216.53.46 23.216.53.34 23.216.53.230 23.216.53.229 23.216.53.222 23.216.53.194 23.216.53.155 23.216.53.152 23.216.53.151 23.216.53.15 23.216.53.14 23.216.53.128 23.216.53.106 23.216.52.80 23.216.52.42 23.216.52.34 23.216.52.29 23.216.52.228 23.216.52.188 23.216.52.163 23.216.52.159 23.216.52.154 23.216.52.138 23.216.52.128 23.216.52.127 23.216.52.102 23.189.48.79 23.115.93.66 23.115.125.217 23.111.184.9 223.6.6.82 223.6.6.81 223.6.6.72 223.6.6.68 223.6.6.6 223.6.6.56 223.6.6.48 223.6.6.46 223.6.6.43 223.6.6.41 223.6.6.34 223.6.6.253 223.6.6.245 223.6.6.241 223.6.6.237 223.6.6.232 223.6.6.204 223.6.6.199 223.6.6.198 223.6.6.196 223.6.6.195 223.6.6.191 223.6.6.184 223.6.6.183 223.6.6.171 223.6.6.170 223.6.6.17 223.6.6.169 223.6.6.151 223.6.6.150 223.6.6.147 223.6.6.143 223.6.6.141 223.6.6.139 223.6.6.133 223.6.6.127 223.6.6.0 223.5.5.93 223.5.5.91 223.5.5.84 223.5.5.82 223.5.5.79 223.5.5.78 223.5.5.70 223.5.5.64 223.5.5.59 223.5.5.51 223.5.5.50 223.5.5.5 223.5.5.47 223.5.5.45 223.5.5.41 223.5.5.4 223.5.5.38 223.5.5.31 223.5.5.252 223.5.5.248 223.5.5.241 223.5.5.231 223.5.5.23 223.5.5.228 223.5.5.224 223.5.5.219 223.5.5.204 223.5.5.203 223.5.5.200 223.5.5.190 223.5.5.19 223.5.5.187 223.5.5.170 223.5.5.17 223.5.5.168 223.5.5.163 223.5.5.159 223.5.5.157 223.5.5.151 223.5.5.15 223.5.5.148 223.5.5.136 223.5.5.13 223.5.5.129 223.5.5.124 223.5.5.123 223.5.5.112 223.5.5.111 223.5.5.110 223.5.5.0 223.29.52.106 223.255.176.196 223.255.176.195 223.25.232.2 223.22.243.241 223.197.185.46 223.171.73.95 222.99.168.132 222.98.43.84 222.98.187.134 222.98.115.251 222.98.115.219 222.97.189.7 222.255.237.207 222.255.206.232 222.255.167.61 222.255.144.115 222.253.48.106 222.252.14.239 222.239.76.18 222.239.221.250 222.239.110.51 222.235.176.47 222.231.63.77 222.231.61.196 222.230.138.105 222.228.150.127 222.151.203.57 222.127.7.54 222.127.61.166 222.127.25.226 222.127.168.25 222.127.151.3 222.127.140.178 222.122.82.24 222.122.21.3 222.122.166.141 222.122.149.60 222.121.55.99 222.119.29.168 222.118.225.33 222.110.103.39 222.107.91.130 222.106.70.250 222.104.22.126 222.104.139.4 222.103.228.194 222.101.9.213 222.101.9.212 221.186.19.122 221.163.194.3 221.163.155.133 221.162.247.60 221.162.19.50 221.162.19.157 221.159.225.51 221.156.92.194 221.154.98.205 221.154.146.204 221.151.144.34 221.151.144.12 221.150.72.183 221.143.46.205 221.143.46.154 221.143.216.58 221.143.20.131 221.139.13.130 221.132.89.147 221.125.130.98 220.90.96.3 220.90.201.8 220.88.49.223 220.83.87.2 220.81.64.1 220.78.162.11 220.77.228.2 220.73.162.155 220.73.162.132 220.73.139.8 220.245.192.186 220.241.227.4 220.158.164.243 220.149.56.99 220.135.28.237 220.135.20.47 220.135.105.31 220.134.170.52 220.133.235.235 220.132.88.194 220.132.221.129 220.130.55.196 220.130.130.141 220.130.12.85 220.130.12.22 220.130.10.250 220.125.183.29 220.119.186.100 220.117.241.194 220.110.160.2 219.87.164.152 219.87.162.222 219.85.163.52 219.252.2.100 219.252.1.100 219.252.0.1 219.250.36.130 219.166.235.130 219.166.16.122 219.166.11.146 219.166.109.122 219.163.11.226 219.127.86.6 219.118.161.57 219.117.237.252 219.106.241.34 219.103.63.145 218.44.251.210 218.44.234.170 218.44.187.8 218.38.136.62 218.36.68.254 218.32.222.5 218.255.18.2 218.236.85.1 218.236.49.18 218.236.241.132 218.235.251.3 218.235.251.2 218.234.23.53 218.234.19.131 218.234.18.181 218.223.34.93 218.216.72.194 218.208.115.68 218.208.114.28 218.189.82.194 218.188.52.18 218.188.223.182 218.188.217.219 218.188.210.196 218.161.68.137 218.161.40.163 218.159.112.240 218.159.112.239 218.159.100.172 218.158.8.12 218.158.8.11 218.156.163.51 218.152.207.197 218.151.83.209 218.151.134.214 218.149.84.50 218.146.34.200 218.146.255.235 218.145.31.139 218.145.31.132 218.102.13.133 217.97.139.128 217.79.247.238 217.79.18.121 217.78.177.110 217.76.33.82 217.73.31.10 217.7.81.136 217.7.80.40 217.7.63.1 217.69.228.142 217.69.169.25 217.67.190.98 217.67.184.254 217.65.3.81 217.64.148.33 217.64.136.254 217.40.46.142 217.38.149.236 217.33.153.162 217.30.250.167 217.30.163.159 217.28.153.27 217.27.219.122 217.27.148.125 217.27.123.226 217.27.116.145 217.27.116.144 217.26.19.166 217.26.171.146 217.25.237.141 217.25.228.98 217.244.13.14 217.24.190.106 217.23.199.77 217.23.146.60 217.223.161.177 217.22.164.126 217.218.155.155 217.218.127.127 217.21.43.3 217.196.23.122 217.194.215.91 217.194.213.253 217.19.153.18 217.182.200.38 217.182.192.218 217.182.192.123 217.182.158.123 217.182.137.224 217.182.112.181 217.18.206.22 217.18.206.12 217.174.14.101 217.173.202.194 217.170.128.27 217.17.48.11 217.17.41.146 217.17.34.68 217.17.34.10 217.168.130.197 217.164.255.37 217.164.255.35 217.160.70.42 217.16.79.246 217.150.58.17 217.150.35.129 217.15.202.106 217.15.146.124 217.145.86.12 217.145.54.100 217.145.49.185 217.14.178.67 217.14.143.18 217.13.80.252 217.13.211.2 217.12.214.244 217.119.160.99 217.119.126.221 217.119.121.146 217.116.61.153 217.114.181.99 217.113.195.244 217.113.125.26 217.111.39.134 217.111.148.201 217.111.114.4 217.109.45.177 217.107.102.103 217.100.187.236 217.0.43.50 216.98.4.252 216.98.109.133 216.85.168.28 216.80.113.2 216.75.21.70 216.55.99.220 216.55.100.220 216.54.204.186 216.47.224.66 216.33.116.102 216.27.175.2 216.254.95.2 216.250.141.137 216.241.25.83 216.239.34.40 216.239.32.40 216.238.98.60 216.231.41.2 216.229.0.25 216.228.104.3 216.222.152.16 216.222.134.250 216.218.31.74 216.218.245.200 216.218.215.117 216.21.169.147 216.21.129.22 216.21.128.22 216.207.95.191 216.207.40.128 216.199.54.9 216.199.46.11 216.197.192.203 216.194.29.204 216.194.28.69 216.194.28.42 216.194.28.33 216.175.203.51 216.171.253.13 216.171.184.243 216.170.153.146 216.169.160.23 216.169.160.2 216.165.129.158 216.165.129.157 216.165.128.161 216.160.246.151 216.160.226.49 216.16.136.146 216.155.92.110 216.155.91.251 216.152.244.77 216.146.36.36 216.146.35.35 216.137.13.22 216.136.95.83 216.136.95.82 216.136.95.67 216.136.95.35 216.136.95.34 216.136.95.3 216.136.95.2 216.136.95.19 216.136.82.113 216.136.33.82 216.135.79.125 216.135.79.118 216.135.79.115 216.135.0.10 216.130.230.144 216.126.220.4 216.120.247.231 216.12.255.2 216.12.255.1 216.12.254.250 216.108.238.70 213.91.195.139 213.91.143.246 213.90.6.14 213.85.168.57 213.85.143.246 213.79.89.138 213.76.155.132 213.76.114.107 213.74.223.74 213.74.195.52 213.73.3.164 213.68.194.51 213.6.77.30 213.6.20.57 213.59.128.41 213.57.91.138 213.5.71.47 213.5.120.3 213.4.82.7 213.39.74.43 213.34.140.206 213.33.237.106 213.33.158.134 213.32.252.91 213.3.42.193 213.26.25.3 213.251.61.42 213.251.57.217 213.251.48.193 213.25.71.2 213.249.20.207 213.248.45.60 213.246.55.57 213.241.67.226 213.241.37.244 213.241.37.234 213.240.24.242 213.234.30.118 213.234.17.74 213.230.97.216 213.230.91.58 213.230.67.186 213.230.125.148 213.230.111.191 213.230.108.161 213.226.186.10 213.226.11.210 213.223.36.242 213.222.25.130 213.221.37.215 213.217.16.106 213.216.64.102 213.214.30.78 213.212.145.1 213.211.50.2 213.211.50.1 213.211.33.58 213.21.225.67 213.208.183.59 213.207.46.220 213.207.46.218 213.207.187.249 213.207.158.201 213.207.141.97 213.207.132.189 213.207.131.97 213.205.80.82 213.202.255.96 213.201.78.48 213.200.218.61 213.200.211.110 213.194.123.26 213.193.122.202 213.191.222.21 213.180.53.103 213.180.182.246 213.178.54.62 213.176.242.166 213.171.205.61 213.171.192.34 213.166.247.100 213.163.127.229 213.163.120.82 213.16.110.117 213.16.110.112 213.157.57.133 213.157.50.130 213.156.44.184 213.155.160.240 213.154.80.203 213.154.18.59 213.153.223.21 213.149.177.25 213.145.3.44 213.145.151.190 213.145.137.102 213.142.215.190 213.140.41.194 213.14.11.162 213.136.88.86 213.136.84.5 213.136.75.64 213.136.71.68 213.136.36.155 213.133.91.249 213.133.116.14 213.131.40.230 213.129.114.98 213.124.39.21 213.115.174.71 213.111.121.178 213.108.174.218 213.108.172.182 213.108.160.205 212.98.146.97 212.97.32.2 212.97.129.35 212.97.129.34 212.96.1.70 212.93.29.112 212.93.121.72 212.93.121.60 212.93.118.21 212.93.117.80 212.93.111.192 212.92.200.165 212.91.246.11 212.87.243.194 212.87.243.120 212.83.168.230 212.78.216.109 212.74.192.40 212.73.221.107 212.73.221.104 212.73.198.88 212.73.140.66 212.73.138.38 212.73.128.182 212.72.130.21 212.72.130.20 212.70.156.160 212.67.71.84 212.65.208.193 212.58.12.245 212.56.212.194 212.56.209.18 212.5.221.202 212.5.128.228 212.48.52.94 212.48.153.245 212.48.152.160 212.47.12.21 212.46.205.34 212.44.128.18 212.41.1.87 212.4.138.238 212.4.121.10 212.39.106.154 212.38.26.132 212.38.2.130 212.34.245.179 212.34.232.70 212.33.190.215 212.32.252.131 212.3.223.82 212.3.154.18 212.3.131.158 212.3.101.130 212.26.7.10 212.26.144.58 212.251.32.202 212.247.80.50 212.247.176.202 212.247.102.181 212.244.210.91 212.237.127.127 212.237.125.216 212.236.18.126 212.233.125.20 212.230.255.129 212.230.255.1 212.225.218.80 212.224.71.71 212.220.115.146 212.22.128.20 212.210.2.2 212.210.2.15 212.210.2.14 212.203.109.67 212.200.34.37 212.200.169.182 212.200.115.156 212.2.230.69 212.199.114.12 212.199.114.11 212.191.1.46 212.186.200.123 212.185.196.10 212.185.180.3 212.184.191.2 212.184.191.193 212.184.191.100 212.182.95.26 212.160.242.185 212.160.162.67 212.160.147.19 212.154.131.115 212.150.211.99 212.150.211.114 212.146.97.154 212.143.39.243 212.14.18.110 212.139.214.147 212.13.82.7 212.126.102.138 212.124.35.25 212.122.53.126 212.122.52.11 212.122.4.2 212.121.229.233 212.12.28.30 212.12.28.126 212.12.27.29 212.12.18.113 212.12.15.128 212.12.14.122 212.118.12.22 212.118.0.2 212.118.0.1 212.117.148.54 212.116.122.201 212.113.0.3 212.112.180.131 212.111.192.246 212.105.78.7 212.105.78.6 212.105.78.3 212.104.43.3 212.104.43.2 212.102.46.89 212.102.46.84 212.100.159.226 212.0.208.189 211.9.37.1 211.76.112.60 211.76.112.59 211.75.76.173 211.75.48.98 211.75.165.163 211.75.15.177 211.75.139.191 211.72.124.193 211.63.16.5 211.62.56.125 211.60.96.137 211.60.199.66 211.59.242.36 211.54.182.7 211.53.64.18 211.53.40.133 211.51.150.131 211.5.228.210 211.5.228.209 211.5.209.194 211.47.188.226 211.46.120.1 211.44.250.215 211.41.128.71 211.40.52.5 211.40.52.2 211.35.76.100 211.35.20.27 211.34.118.2 211.33.136.94 211.33.121.235 211.254.92.254 211.252.106.130 211.251.24.241 211.245.239.40 211.24.100.198 211.239.127.57 211.236.20.2 211.234.111.74 211.233.65.13 211.233.50.4 211.233.50.3 211.232.158.254 211.232.116.3 211.232.110.114 211.23.246.116 211.23.233.180 211.23.144.240 211.228.195.162 211.228.100.115 211.226.88.54 211.226.180.60 211.226.143.43 211.223.193.200 211.222.204.5 211.220.224.12 211.220.194.152 211.22.52.82 211.22.146.115 211.219.86.1 211.219.83.226 211.217.195.226 211.215.23.77 211.21.220.171 211.21.138.151 211.21.133.123 211.203.71.5 211.203.18.17 211.202.2.28 211.20.146.109 211.199.149.131 211.198.50.2 211.194.164.158 211.194.140.3 211.193.204.3 211.193.134.134 211.193.106.59 211.192.139.216 211.188.180.22 211.188.180.21 211.184.196.130 211.182.233.3 211.182.233.2 211.181.222.135 211.177.101.116 211.170.243.20 211.170.122.12 211.169.2.100 211.129.155.175 211.126.202.126 211.123.77.97 211.121.135.181 211.12.254.10 211.119.47.110 211.116.138.5 211.115.66.175 211.115.194.5 211.115.194.4 211.115.194.3 211.115.194.2 211.115.194.1 211.114.53.85 211.114.145.7 211.111.172.72 211.111.172.71 211.110.10.36 211.105.7.5 211.104.6.1 211.10.168.1 210.99.77.210 210.99.180.194 210.98.146.2 210.94.0.73 210.94.0.7 210.93.0.2 210.91.32.187 210.91.32.171 210.90.197.1 210.87.253.60 210.87.250.156 210.87.250.154 210.8.28.194 210.79.34.137 210.61.97.241 210.61.48.168 210.59.209.19 210.56.14.146 210.5.98.46 210.5.98.130 210.5.92.6 210.5.89.193 210.5.87.146 210.5.72.33 210.5.72.30 210.5.72.24 210.5.72.21 210.5.72.2 210.5.72.12 210.5.67.241 210.5.64.10 210.5.56.146 210.5.56.145 210.5.125.6 210.5.124.161 210.5.104.28 210.5.101.242 210.3.252.27 210.3.239.131 210.3.143.206 210.3.138.237 210.254.50.20 210.251.126.97 210.245.87.16 210.245.8.9 210.245.31.102 210.245.21.123 210.245.21.102 210.245.111.195 210.243.121.155 210.233.117.1 210.230.193.68 210.230.193.66 210.23.129.34 210.228.80.253 210.224.86.126 210.222.176.66 210.220.163.82 210.220.16.6 210.220.16.2 210.219.173.18 210.216.217.254 210.213.75.161 210.213.74.41 210.213.74.129 210.213.65.118 210.213.242.242 210.213.218.233 210.213.213.206 210.213.192.241 210.213.126.161 210.212.210.91 210.211.20.225 210.211.16.230 210.207.236.2 210.206.183.39 210.206.162.2 210.205.247.4 210.2.138.68 210.196.68.174 210.196.251.66 210.193.195.118 210.190.25.80 210.190.105.66 210.19.157.131 210.187.50.146 210.181.4.25 210.181.1.24 210.180.98.69 210.18.214.38 210.178.75.16 210.176.210.4 210.172.81.186 210.172.23.114 210.172.103.18 210.172.1.251 210.171.38.41 210.168.248.242 210.163.158.224 210.162.99.34 210.161.166.69 210.16.67.138 210.141.99.89 210.14.13.209 210.14.12.50 210.14.12.22 210.134.0.130 210.127.61.151 210.127.253.120 210.125.136.7 210.123.136.39 210.121.229.1 210.114.225.223 210.114.175.182 210.107.84.3 210.107.84.2 210.107.239.132 210.107.239.131 210.104.21.1 210.104.203.3 210.104.203.2 210.103.63.70 210.102.252.3 210.102.248.37 210.100.192.2 210.10.238.133 210.1.94.54 210.1.88.137 210.1.86.1 210.1.83.201 210.1.81.40 210.0.255.216 210.0.255.144 210.0.128.251 210.0.128.250 210.0.128.242 210.0.128.241 209.90.160.221 209.87.64.70 209.84.253.11 209.80.159.21 209.51.161.14 209.45.48.205 209.37.92.138 209.33.101.220 209.3.124.160 209.253.113.2 209.253.113.10 209.250.128.6 209.244.0.53 209.244.0.4 209.244.0.3 209.239.11.98 209.234.196.12 209.232.116.6 209.23.9.76 209.222.125.10 209.216.160.2 209.216.160.131 209.216.129.4 209.209.217.168 209.201.40.112 209.201.3.13 209.181.232.128 209.164.189.56 209.164.189.55 209.164.189.54 209.160.252.138 209.159.152.77 209.150.154.1 209.144.50.123 209.143.0.10 209.137.239.50 209.130.139.2 209.130.136.2 209.126.106.217 208.99.243.17 208.93.60.20 208.93.158.1 208.91.112.53 208.91.112.52 208.91.112.220 208.89.96.20 208.89.96.11 208.89.131.200 208.87.98.94 208.84.156.150 208.84.156.137 208.79.56.204 208.74.71.20 208.74.69.5 208.72.160.67 208.72.120.204 208.70.255.220 208.68.92.38 208.67.29.251 208.67.222.222 208.67.222.220 208.67.222.2 208.67.220.222 208.67.220.220 208.67.220.2 208.67.220.120 208.48.253.106 208.46.96.168 208.38.65.35 208.38.26.33 208.254.148.100 208.253.57.5 208.249.244.2 208.249.244.1 208.180.0.251 208.180.0.250 208.157.146.14 208.125.139.6 208.123.219.155 208.118.69.226 208.113.128.45 208.111.1.2 208.111.1.1 208.103.33.22 208.100.13.10 207.99.46.118 207.99.12.105 207.91.5.32 207.59.153.242 207.53.228.67 207.254.17.115 207.248.57.11 207.248.236.85 207.248.224.72 207.248.224.71 207.248.111.242 207.246.98.123 207.243.201.24 207.243.150.98 207.236.186.187 207.230.75.50 207.230.65.98 207.2.105.196 207.195.35.143 207.191.51.250 207.191.50.250 207.191.50.10 207.191.1.10 207.180.217.214 207.180.212.30 207.177.83.1 207.177.61.103 207.172.157.201 207.17.190.5 207.162.218.5 207.159.121.241 207.159.104.10 207.154.212.113 207.144.37.198 207.140.152.71 207.109.67.32 207.108.84.1 207.108.220.16 206.84.63.62 206.81.207.41 206.81.195.82 206.78.19.8 206.51.143.55 206.41.4.36 206.253.33.131 206.253.33.130 206.252.232.95 206.222.97.94 206.222.97.82 206.222.97.50 206.222.107.70 206.222.107.38 206.222.107.34 206.222.107.130 206.221.178.134 206.196.97.89 206.189.92.228 206.189.238.147 206.180.165.149 206.170.79.50 206.169.200.135 206.169.151.40 206.165.6.12 206.165.6.11 206.15.226.2 206.138.18.20 206.125.134.19 205.243.120.83 205.233.14.44 205.171.3.66 205.171.3.65 205.171.3.26 205.171.202.66 205.171.202.166 205.171.2.65 205.171.2.25 205.170.181.146 205.169.93.95 205.168.62.216 205.168.234.48 205.168.155.0 204.95.160.2 204.9.215.185 204.9.144.70 204.9.109.57 204.88.31.246 204.85.36.31 204.74.67.99 204.74.67.98 204.74.67.97 204.74.67.94 204.74.67.92 204.74.67.89 204.74.67.88 204.74.67.87 204.74.67.86 204.74.67.85 204.74.67.83 204.74.67.8 204.74.67.78 204.74.67.77 204.74.67.74 204.74.67.73 204.74.67.70 204.74.67.7 204.74.67.69 204.74.67.67 204.74.67.66 204.74.67.65 204.74.67.64 204.74.67.63 204.74.67.62 204.74.67.61 204.74.67.58 204.74.67.57 204.74.67.56 204.74.67.52 204.74.67.51 204.74.67.50 204.74.67.5 204.74.67.48 204.74.67.46 204.74.67.45 204.74.67.44 204.74.67.43 204.74.67.42 204.74.67.40 204.74.67.37 204.74.67.34 204.74.67.31 204.74.67.30 204.74.67.3 204.74.67.28 204.74.67.26 204.74.67.253 204.74.67.252 204.74.67.251 204.74.67.250 204.74.67.247 204.74.67.246 204.74.67.245 204.74.67.244 204.74.67.243 204.74.67.241 204.74.67.239 204.74.67.236 204.74.67.235 204.74.67.233 204.74.67.232 204.74.67.231 204.74.67.229 204.74.67.226 204.74.67.225 204.74.67.224 204.74.67.223 204.74.67.221 204.74.67.220 204.74.67.219 204.74.67.217 204.74.67.215 204.74.67.213 204.74.67.212 204.74.67.210 204.74.67.209 204.74.67.207 204.74.67.205 204.74.67.203 204.74.67.201 204.74.67.20 204.74.67.2 204.74.67.198 204.74.67.197 204.74.67.195 204.74.67.194 204.74.67.192 204.74.67.19 204.74.67.189 204.74.67.187 204.74.67.185 204.74.67.184 204.74.67.183 204.74.67.181 204.74.67.180 204.74.67.18 204.74.67.176 204.74.67.174 204.74.67.173 204.74.67.17 204.74.67.169 204.74.67.167 204.74.67.166 204.74.67.165 204.74.67.163 204.74.67.162 204.74.67.161 204.74.67.160 204.74.67.159 204.74.67.154 204.74.67.152 204.74.67.151 204.74.67.149 204.74.67.146 204.74.67.145 204.74.67.144 204.74.67.141 204.74.67.139 204.74.67.137 204.74.67.135 204.74.67.134 204.74.67.132 204.74.67.130 204.74.67.13 204.74.67.127 204.74.67.125 204.74.67.124 204.74.67.122 204.74.67.121 204.74.67.120 204.74.67.12 204.74.67.118 204.74.67.117 204.74.67.116 204.74.67.114 204.74.67.111 204.74.67.110 204.74.67.11 204.74.67.107 204.74.67.106 204.74.67.105 204.74.67.102 204.74.67.101 204.74.67.10 204.74.67.1 204.74.66.99 204.74.66.98 204.74.66.97 204.74.66.95 204.74.66.93 204.74.66.92 204.74.66.91 204.74.66.90 204.74.66.83 204.74.66.82 204.74.66.80 204.74.66.8 204.74.66.77 204.74.66.76 204.74.66.73 204.74.66.72 204.74.66.69 204.74.66.68 204.74.66.66 204.74.66.64 204.74.66.61 204.74.66.58 204.74.66.57 204.74.66.56 204.74.66.55 204.74.66.54 204.74.66.53 204.74.66.52 204.74.66.50 204.74.66.49 204.74.66.48 204.74.66.47 204.74.66.45 204.74.66.41 204.74.66.40 204.74.66.38 204.74.66.36 204.74.66.35 204.74.66.34 204.74.66.33 204.74.66.32 204.74.66.31 204.74.66.27 204.74.66.26 204.74.66.253 204.74.66.251 204.74.66.250 204.74.66.247 204.74.66.246 204.74.66.245 204.74.66.242 204.74.66.241 204.74.66.24 204.74.66.239 204.74.66.238 204.74.66.237 204.74.66.233 204.74.66.23 204.74.66.229 204.74.66.227 204.74.66.225 204.74.66.224 204.74.66.223 204.74.66.222 204.74.66.22 204.74.66.215 204.74.66.214 204.74.66.213 204.74.66.210 204.74.66.208 204.74.66.206 204.74.66.204 204.74.66.200 204.74.66.2 204.74.66.199 204.74.66.198 204.74.66.197 204.74.66.195 204.74.66.194 204.74.66.193 204.74.66.192 204.74.66.191 204.74.66.19 204.74.66.189 204.74.66.187 204.74.66.186 204.74.66.185 204.74.66.183 204.74.66.182 204.74.66.18 204.74.66.179 204.74.66.178 204.74.66.177 204.74.66.176 204.74.66.175 204.74.66.174 204.74.66.173 204.74.66.172 204.74.66.171 204.74.66.170 204.74.66.165 204.74.66.164 204.74.66.161 204.74.66.160 204.74.66.159 204.74.66.158 204.74.66.157 204.74.66.156 204.74.66.155 204.74.66.152 204.74.66.151 204.74.66.149 204.74.66.147 204.74.66.146 204.74.66.144 204.74.66.143 204.74.66.139 204.74.66.138 204.74.66.137 204.74.66.134 204.74.66.133 204.74.66.131 204.74.66.130 204.74.66.13 204.74.66.129 204.74.66.128 204.74.66.127 204.74.66.126 204.74.66.122 204.74.66.121 204.74.66.117 204.74.66.115 204.74.66.114 204.74.66.113 204.74.66.112 204.74.66.110 204.74.66.11 204.74.66.109 204.74.66.107 204.74.66.106 204.74.66.105 204.74.66.104 204.74.66.103 204.74.66.102 204.74.66.10 204.74.66.1 204.74.115.99 204.74.115.98 204.74.115.91 204.74.115.90 204.74.115.9 204.74.115.88 204.74.115.87 204.74.115.86 204.74.115.84 204.74.115.83 204.74.115.82 204.74.115.81 204.74.115.80 204.74.115.8 204.74.115.79 204.74.115.78 204.74.115.77 204.74.115.76 204.74.115.72 204.74.115.71 204.74.115.70 204.74.115.69 204.74.115.68 204.74.115.67 204.74.115.65 204.74.115.63 204.74.115.6 204.74.115.59 204.74.115.55 204.74.115.54 204.74.115.52 204.74.115.5 204.74.115.49 204.74.115.45 204.74.115.44 204.74.115.42 204.74.115.41 204.74.115.40 204.74.115.4 204.74.115.39 204.74.115.38 204.74.115.37 204.74.115.36 204.74.115.35 204.74.115.34 204.74.115.33 204.74.115.32 204.74.115.31 204.74.115.3 204.74.115.28 204.74.115.27 204.74.115.26 204.74.115.254 204.74.115.25 204.74.115.248 204.74.115.246 204.74.115.245 204.74.115.244 204.74.115.243 204.74.115.242 204.74.115.240 204.74.115.24 204.74.115.239 204.74.115.236 204.74.115.234 204.74.115.233 204.74.115.231 204.74.115.229 204.74.115.225 204.74.115.223 204.74.115.221 204.74.115.220 204.74.115.219 204.74.115.216 204.74.115.213 204.74.115.212 204.74.115.211 204.74.115.210 204.74.115.21 204.74.115.208 204.74.115.207 204.74.115.205 204.74.115.204 204.74.115.203 204.74.115.201 204.74.115.2 204.74.115.199 204.74.115.197 204.74.115.196 204.74.115.193 204.74.115.192 204.74.115.190 204.74.115.189 204.74.115.186 204.74.115.184 204.74.115.182 204.74.115.181 204.74.115.18 204.74.115.179 204.74.115.176 204.74.115.174 204.74.115.173 204.74.115.171 204.74.115.169 204.74.115.168 204.74.115.166 204.74.115.165 204.74.115.164 204.74.115.163 204.74.115.161 204.74.115.160 204.74.115.159 204.74.115.158 204.74.115.157 204.74.115.156 204.74.115.152 204.74.115.151 204.74.115.150 204.74.115.15 204.74.115.149 204.74.115.148 204.74.115.147 204.74.115.145 204.74.115.144 204.74.115.141 204.74.115.140 204.74.115.138 204.74.115.136 204.74.115.134 204.74.115.133 204.74.115.132 204.74.115.131 204.74.115.128 204.74.115.127 204.74.115.124 204.74.115.120 204.74.115.118 204.74.115.116 204.74.115.115 204.74.115.114 204.74.115.112 204.74.115.11 204.74.115.109 204.74.115.108 204.74.115.106 204.74.115.104 204.74.114.98 204.74.114.97 204.74.114.96 204.74.114.95 204.74.114.93 204.74.114.90 204.74.114.9 204.74.114.89 204.74.114.86 204.74.114.78 204.74.114.77 204.74.114.69 204.74.114.64 204.74.114.62 204.74.114.61 204.74.114.58 204.74.114.55 204.74.114.54 204.74.114.51 204.74.114.48 204.74.114.47 204.74.114.46 204.74.114.45 204.74.114.44 204.74.114.43 204.74.114.39 204.74.114.34 204.74.114.33 204.74.114.30 204.74.114.3 204.74.114.28 204.74.114.253 204.74.114.252 204.74.114.246 204.74.114.243 204.74.114.241 204.74.114.238 204.74.114.236 204.74.114.235 204.74.114.231 204.74.114.229 204.74.114.227 204.74.114.224 204.74.114.223 204.74.114.222 204.74.114.221 204.74.114.218 204.74.114.213 204.74.114.205 204.74.114.202 204.74.114.201 204.74.114.200 204.74.114.20 204.74.114.199 204.74.114.198 204.74.114.197 204.74.114.190 204.74.114.187 204.74.114.180 204.74.114.178 204.74.114.176 204.74.114.175 204.74.114.174 204.74.114.172 204.74.114.170 204.74.114.17 204.74.114.169 204.74.114.165 204.74.114.163 204.74.114.160 204.74.114.16 204.74.114.159 204.74.114.155 204.74.114.152 204.74.114.151 204.74.114.150 204.74.114.147 204.74.114.144 204.74.114.143 204.74.114.142 204.74.114.141 204.74.114.140 204.74.114.14 204.74.114.139 204.74.114.135 204.74.114.134 204.74.114.132 204.74.114.129 204.74.114.126 204.74.114.125 204.74.114.124 204.74.114.123 204.74.114.120 204.74.114.117 204.74.114.116 204.74.114.113 204.74.114.111 204.74.114.110 204.74.114.11 204.74.114.108 204.74.114.105 204.74.114.104 204.74.111.99 204.74.111.96 204.74.111.95 204.74.111.94 204.74.111.93 204.74.111.91 204.74.111.90 204.74.111.9 204.74.111.87 204.74.111.86 204.74.111.85 204.74.111.82 204.74.111.81 204.74.111.80 204.74.111.8 204.74.111.79 204.74.111.74 204.74.111.73 204.74.111.71 204.74.111.68 204.74.111.65 204.74.111.64 204.74.111.61 204.74.111.60 204.74.111.59 204.74.111.58 204.74.111.57 204.74.111.56 204.74.111.55 204.74.111.54 204.74.111.53 204.74.111.52 204.74.111.5 204.74.111.49 204.74.111.47 204.74.111.46 204.74.111.45 204.74.111.41 204.74.111.40 204.74.111.38 204.74.111.37 204.74.111.36 204.74.111.35 204.74.111.33 204.74.111.32 204.74.111.3 204.74.111.29 204.74.111.27 204.74.111.253 204.74.111.252 204.74.111.251 204.74.111.250 204.74.111.249 204.74.111.247 204.74.111.246 204.74.111.245 204.74.111.241 204.74.111.238 204.74.111.236 204.74.111.235 204.74.111.234 204.74.111.233 204.74.111.232 204.74.111.23 204.74.111.229 204.74.111.227 204.74.111.225 204.74.111.223 204.74.111.220 204.74.111.22 204.74.111.219 204.74.111.218 204.74.111.217 204.74.111.216 204.74.111.215 204.74.111.214 204.74.111.212 204.74.111.211 204.74.111.21 204.74.111.208 204.74.111.207 204.74.111.205 204.74.111.204 204.74.111.203 204.74.111.20 204.74.111.2 204.74.111.199 204.74.111.197 204.74.111.196 204.74.111.194 204.74.111.192 204.74.111.191 204.74.111.189 204.74.111.188 204.74.111.186 204.74.111.185 204.74.111.182 204.74.111.181 204.74.111.18 204.74.111.179 204.74.111.178 204.74.111.176 204.74.111.175 204.74.111.173 204.74.111.172 204.74.111.171 204.74.111.169 204.74.111.168 204.74.111.166 204.74.111.164 204.74.111.163 204.74.111.162 204.74.111.16 204.74.111.158 204.74.111.157 204.74.111.156 204.74.111.155 204.74.111.154 204.74.111.152 204.74.111.150 204.74.111.146 204.74.111.145 204.74.111.144 204.74.111.143 204.74.111.14 204.74.111.139 204.74.111.138 204.74.111.137 204.74.111.136 204.74.111.133 204.74.111.132 204.74.111.13 204.74.111.125 204.74.111.124 204.74.111.12 204.74.111.118 204.74.111.117 204.74.111.115 204.74.111.111 204.74.111.11 204.74.111.107 204.74.111.106 204.74.111.104 204.74.111.103 204.74.111.100 204.74.111.10 204.74.111.1 204.74.110.96 204.74.110.95 204.74.110.93 204.74.110.90 204.74.110.89 204.74.110.84 204.74.110.83 204.74.110.81 204.74.110.80 204.74.110.78 204.74.110.77 204.74.110.74 204.74.110.72 204.74.110.7 204.74.110.66 204.74.110.63 204.74.110.62 204.74.110.6 204.74.110.58 204.74.110.56 204.74.110.50 204.74.110.5 204.74.110.47 204.74.110.44 204.74.110.43 204.74.110.42 204.74.110.35 204.74.110.34 204.74.110.33 204.74.110.30 204.74.110.3 204.74.110.29 204.74.110.28 204.74.110.254 204.74.110.252 204.74.110.25 204.74.110.249 204.74.110.245 204.74.110.244 204.74.110.242 204.74.110.241 204.74.110.24 204.74.110.238 204.74.110.236 204.74.110.235 204.74.110.224 204.74.110.223 204.74.110.221 204.74.110.220 204.74.110.216 204.74.110.211 204.74.110.210 204.74.110.21 204.74.110.209 204.74.110.203 204.74.110.200 204.74.110.195 204.74.110.193 204.74.110.192 204.74.110.19 204.74.110.188 204.74.110.182 204.74.110.180 204.74.110.18 204.74.110.176 204.74.110.173 204.74.110.172 204.74.110.166 204.74.110.165 204.74.110.164 204.74.110.163 204.74.110.162 204.74.110.161 204.74.110.16 204.74.110.156 204.74.110.154 204.74.110.153 204.74.110.151 204.74.110.150 204.74.110.15 204.74.110.149 204.74.110.148 204.74.110.147 204.74.110.138 204.74.110.137 204.74.110.134 204.74.110.131 204.74.110.128 204.74.110.127 204.74.110.124 204.74.110.121 204.74.110.120 204.74.110.119 204.74.110.116 204.74.110.111 204.74.110.108 204.74.110.103 204.74.110.1 204.74.109.99 204.74.109.98 204.74.109.97 204.74.109.96 204.74.109.95 204.74.109.94 204.74.109.90 204.74.109.89 204.74.109.88 204.74.109.86 204.74.109.84 204.74.109.83 204.74.109.81 204.74.109.8 204.74.109.76 204.74.109.74 204.74.109.73 204.74.109.72 204.74.109.71 204.74.109.70 204.74.109.69 204.74.109.68 204.74.109.65 204.74.109.63 204.74.109.62 204.74.109.6 204.74.109.59 204.74.109.57 204.74.109.52 204.74.109.51 204.74.109.48 204.74.109.46 204.74.109.45 204.74.109.43 204.74.109.41 204.74.109.40 204.74.109.4 204.74.109.39 204.74.109.38 204.74.109.37 204.74.109.35 204.74.109.34 204.74.109.33 204.74.109.31 204.74.109.30 204.74.109.3 204.74.109.29 204.74.109.28 204.74.109.254 204.74.109.252 204.74.109.247 204.74.109.246 204.74.109.244 204.74.109.243 204.74.109.242 204.74.109.24 204.74.109.239 204.74.109.237 204.74.109.236 204.74.109.235 204.74.109.233 204.74.109.232 204.74.109.228 204.74.109.227 204.74.109.221 204.74.109.219 204.74.109.218 204.74.109.216 204.74.109.215 204.74.109.214 204.74.109.213 204.74.109.211 204.74.109.210 204.74.109.207 204.74.109.206 204.74.109.204 204.74.109.203 204.74.109.202 204.74.109.201 204.74.109.200 204.74.109.198 204.74.109.197 204.74.109.193 204.74.109.192 204.74.109.191 204.74.109.19 204.74.109.189 204.74.109.186 204.74.109.185 204.74.109.184 204.74.109.183 204.74.109.181 204.74.109.180 204.74.109.179 204.74.109.175 204.74.109.174 204.74.109.172 204.74.109.171 204.74.109.170 204.74.109.17 204.74.109.169 204.74.109.168 204.74.109.167 204.74.109.166 204.74.109.165 204.74.109.164 204.74.109.161 204.74.109.16 204.74.109.159 204.74.109.158 204.74.109.155 204.74.109.154 204.74.109.152 204.74.109.150 204.74.109.149 204.74.109.148 204.74.109.147 204.74.109.146 204.74.109.145 204.74.109.143 204.74.109.141 204.74.109.140 204.74.109.138 204.74.109.137 204.74.109.136 204.74.109.133 204.74.109.132 204.74.109.131 204.74.109.130 204.74.109.129 204.74.109.128 204.74.109.127 204.74.109.126 204.74.109.125 204.74.109.124 204.74.109.122 204.74.109.121 204.74.109.119 204.74.109.118 204.74.109.117 204.74.109.116 204.74.109.114 204.74.109.113 204.74.109.112 204.74.109.111 204.74.109.110 204.74.109.11 204.74.109.105 204.74.109.104 204.74.109.103 204.74.109.102 204.74.109.100 204.74.109.10 204.74.108.97 204.74.108.96 204.74.108.95 204.74.108.94 204.74.108.91 204.74.108.90 204.74.108.89 204.74.108.85 204.74.108.84 204.74.108.82 204.74.108.80 204.74.108.8 204.74.108.79 204.74.108.78 204.74.108.77 204.74.108.72 204.74.108.71 204.74.108.7 204.74.108.69 204.74.108.68 204.74.108.67 204.74.108.63 204.74.108.62 204.74.108.6 204.74.108.55 204.74.108.52 204.74.108.51 204.74.108.49 204.74.108.48 204.74.108.45 204.74.108.43 204.74.108.41 204.74.108.39 204.74.108.38 204.74.108.37 204.74.108.36 204.74.108.34 204.74.108.33 204.74.108.32 204.74.108.30 204.74.108.28 204.74.108.252 204.74.108.251 204.74.108.249 204.74.108.248 204.74.108.247 204.74.108.246 204.74.108.244 204.74.108.242 204.74.108.238 204.74.108.237 204.74.108.234 204.74.108.23 204.74.108.229 204.74.108.228 204.74.108.227 204.74.108.225 204.74.108.224 204.74.108.220 204.74.108.22 204.74.108.219 204.74.108.218 204.74.108.217 204.74.108.215 204.74.108.213 204.74.108.211 204.74.108.208 204.74.108.207 204.74.108.206 204.74.108.203 204.74.108.201 204.74.108.200 204.74.108.20 204.74.108.2 204.74.108.199 204.74.108.198 204.74.108.197 204.74.108.196 204.74.108.194 204.74.108.193 204.74.108.192 204.74.108.191 204.74.108.190 204.74.108.19 204.74.108.189 204.74.108.187 204.74.108.185 204.74.108.183 204.74.108.180 204.74.108.18 204.74.108.178 204.74.108.176 204.74.108.174 204.74.108.171 204.74.108.169 204.74.108.167 204.74.108.164 204.74.108.163 204.74.108.162 204.74.108.161 204.74.108.160 204.74.108.16 204.74.108.159 204.74.108.156 204.74.108.155 204.74.108.152 204.74.108.151 204.74.108.150 204.74.108.149 204.74.108.147 204.74.108.144 204.74.108.142 204.74.108.141 204.74.108.140 204.74.108.139 204.74.108.138 204.74.108.137 204.74.108.133 204.74.108.132 204.74.108.131 204.74.108.130 204.74.108.124 204.74.108.123 204.74.108.122 204.74.108.121 204.74.108.12 204.74.108.118 204.74.108.115 204.74.108.114 204.74.108.113 204.74.108.109 204.74.108.105 204.74.108.103 204.74.108.102 204.74.108.100 204.74.101.99 204.74.101.98 204.74.101.97 204.74.101.96 204.74.101.95 204.74.101.94 204.74.101.93 204.74.101.92 204.74.101.91 204.74.101.90 204.74.101.89 204.74.101.87 204.74.101.86 204.74.101.82 204.74.101.81 204.74.101.80 204.74.101.79 204.74.101.78 204.74.101.77 204.74.101.76 204.74.101.75 204.74.101.74 204.74.101.73 204.74.101.72 204.74.101.71 204.74.101.7 204.74.101.69 204.74.101.67 204.74.101.64 204.74.101.63 204.74.101.62 204.74.101.61 204.74.101.60 204.74.101.6 204.74.101.59 204.74.101.58 204.74.101.57 204.74.101.56 204.74.101.55 204.74.101.53 204.74.101.51 204.74.101.49 204.74.101.48 204.74.101.47 204.74.101.45 204.74.101.40 204.74.101.39 204.74.101.38 204.74.101.37 204.74.101.36 204.74.101.35 204.74.101.34 204.74.101.33 204.74.101.31 204.74.101.29 204.74.101.254 204.74.101.251 204.74.101.250 204.74.101.25 204.74.101.249 204.74.101.248 204.74.101.246 204.74.101.244 204.74.101.243 204.74.101.242 204.74.101.241 204.74.101.24 204.74.101.238 204.74.101.237 204.74.101.236 204.74.101.235 204.74.101.233 204.74.101.232 204.74.101.231 204.74.101.23 204.74.101.228 204.74.101.227 204.74.101.225 204.74.101.224 204.74.101.223 204.74.101.222 204.74.101.220 204.74.101.22 204.74.101.219 204.74.101.217 204.74.101.214 204.74.101.213 204.74.101.209 204.74.101.207 204.74.101.205 204.74.101.203 204.74.101.200 204.74.101.20 204.74.101.2 204.74.101.197 204.74.101.196 204.74.101.195 204.74.101.192 204.74.101.191 204.74.101.19 204.74.101.186 204.74.101.185 204.74.101.182 204.74.101.180 204.74.101.18 204.74.101.179 204.74.101.178 204.74.101.175 204.74.101.173 204.74.101.169 204.74.101.166 204.74.101.164 204.74.101.162 204.74.101.16 204.74.101.153 204.74.101.151 204.74.101.150 204.74.101.149 204.74.101.148 204.74.101.144 204.74.101.143 204.74.101.140 204.74.101.137 204.74.101.136 204.74.101.135 204.74.101.133 204.74.101.132 204.74.101.131 204.74.101.13 204.74.101.128 204.74.101.125 204.74.101.122 204.74.101.121 204.74.101.12 204.74.101.118 204.74.101.117 204.74.101.115 204.74.101.113 204.74.101.111 204.74.101.11 204.74.101.109 204.74.101.107 204.74.101.106 204.74.101.105 204.74.101.104 204.74.101.101 204.74.101.10 204.70.127.128 204.70.127.127 204.69.234.99 204.69.234.98 204.69.234.96 204.69.234.95 204.69.234.93 204.69.234.91 204.69.234.90 204.69.234.9 204.69.234.89 204.69.234.88 204.69.234.87 204.69.234.86 204.69.234.84 204.69.234.83 204.69.234.82 204.69.234.81 204.69.234.80 204.69.234.79 204.69.234.78 204.69.234.77 204.69.234.72 204.69.234.71 204.69.234.70 204.69.234.7 204.69.234.69 204.69.234.68 204.69.234.67 204.69.234.64 204.69.234.62 204.69.234.61 204.69.234.60 204.69.234.59 204.69.234.58 204.69.234.57 204.69.234.54 204.69.234.53 204.69.234.51 204.69.234.50 204.69.234.49 204.69.234.48 204.69.234.47 204.69.234.46 204.69.234.44 204.69.234.42 204.69.234.41 204.69.234.40 204.69.234.4 204.69.234.39 204.69.234.38 204.69.234.33 204.69.234.32 204.69.234.31 204.69.234.28 204.69.234.27 204.69.234.26 204.69.234.253 204.69.234.252 204.69.234.25 204.69.234.249 204.69.234.246 204.69.234.245 204.69.234.244 204.69.234.243 204.69.234.242 204.69.234.241 204.69.234.240 204.69.234.24 204.69.234.238 204.69.234.237 204.69.234.232 204.69.234.231 204.69.234.230 204.69.234.23 204.69.234.229 204.69.234.228 204.69.234.227 204.69.234.225 204.69.234.224 204.69.234.221 204.69.234.220 204.69.234.219 204.69.234.218 204.69.234.217 204.69.234.216 204.69.234.215 204.69.234.214 204.69.234.210 204.69.234.21 204.69.234.207 204.69.234.206 204.69.234.205 204.69.234.203 204.69.234.202 204.69.234.201 204.69.234.200 204.69.234.199 204.69.234.198 204.69.234.197 204.69.234.196 204.69.234.195 204.69.234.193 204.69.234.192 204.69.234.191 204.69.234.190 204.69.234.19 204.69.234.189 204.69.234.188 204.69.234.187 204.69.234.185 204.69.234.181 204.69.234.180 204.69.234.18 204.69.234.178 204.69.234.177 204.69.234.176 204.69.234.175 204.69.234.174 204.69.234.173 204.69.234.172 204.69.234.171 204.69.234.17 204.69.234.168 204.69.234.166 204.69.234.165 204.69.234.164 204.69.234.163 204.69.234.162 204.69.234.160 204.69.234.16 204.69.234.158 204.69.234.157 204.69.234.155 204.69.234.154 204.69.234.152 204.69.234.151 204.69.234.150 204.69.234.148 204.69.234.145 204.69.234.143 204.69.234.142 204.69.234.14 204.69.234.139 204.69.234.137 204.69.234.135 204.69.234.133 204.69.234.130 204.69.234.129 204.69.234.127 204.69.234.125 204.69.234.124 204.69.234.123 204.69.234.122 204.69.234.121 204.69.234.120 204.69.234.12 204.69.234.118 204.69.234.117 204.69.234.116 204.69.234.115 204.69.234.113 204.69.234.112 204.69.234.111 204.69.234.110 204.69.234.107 204.69.234.106 204.69.234.105 204.69.234.103 204.69.234.102 204.69.234.100 204.69.234.1 204.62.22.103 204.57.66.2 204.50.102.243 204.48.24.104 204.48.22.68 204.246.56.12 204.246.56.100 204.246.1.36 204.238.24.10 204.225.44.3 204.209.20.154 204.2.152.19 204.199.129.38 204.199.103.180 204.194.234.200 204.194.232.200 204.191.10.5 204.186.80.193 204.156.192.68 204.15.148.186 204.131.92.115 204.131.88.138 204.131.229.119 204.116.57.2 204.111.39.9 204.106.240.4 203.96.180.18 203.89.132.4 203.86.200.253 203.85.128.252 203.82.42.180 203.8.201.11 203.8.201.10 203.78.194.179 203.69.232.60 203.66.57.148 203.59.131.91 203.54.212.126 203.52.58.169 203.52.58.161 203.50.2.71 203.47.150.183 203.47.150.176 203.39.3.133 203.38.224.193 203.36.134.238 203.253.64.1 203.253.179.3 203.253.179.2 203.251.201.1 203.251.183.5 203.249.171.2 203.249.161.2 203.249.112.101 203.248.252.2 203.248.116.42 203.246.40.2 203.242.200.6 203.242.200.5 203.240.193.11 203.239.133.223 203.239.131.1 203.239.130.3 203.239.130.1 203.236.20.11 203.236.123.10 203.236.120.80 203.236.1.12 203.232.27.11 203.232.186.58 203.232.166.2 203.232.148.3 203.230.220.2 203.229.206.20 203.228.22.223 203.227.168.2 203.225.255.11 203.225.255.10 203.215.186.37 203.215.181.201 203.213.96.4 203.212.200.209 203.209.181.154 203.202.248.5 203.201.60.5 203.198.214.41 203.198.167.39 203.198.161.89 203.190.43.46 203.190.43.107 203.190.27.235 203.190.27.234 203.190.254.3 203.188.242.211 203.186.102.170 203.178.136.36 203.177.88.250 203.177.84.2 203.177.215.1 203.177.190.130 203.177.0.158 203.176.237.36 203.176.102.68 203.174.48.83 203.173.163.89 203.169.48.8 203.169.4.1 203.167.92.254 203.162.39.66 203.159.77.77 203.158.9.5 203.158.15.67 203.154.91.1 203.154.62.1 203.154.58.1 203.154.177.8 203.153.41.205 203.151.59.20 203.150.48.128 203.150.37.11 203.150.37.10 203.150.199.17 203.150.197.136 203.150.167.19 203.150.128.133 203.147.94.71 203.147.6.30 203.144.139.244 203.144.13.250 203.141.198.193 203.135.31.114 203.131.211.181 203.129.31.67 203.129.25.39 203.128.16.2 203.127.160.67 203.127.160.66 203.127.112.132 203.126.30.39 203.126.118.38 203.125.83.122 203.125.208.78 203.121.145.77 203.119.8.106 203.115.130.74 203.114.39.110 203.113.148.12 203.113.135.28 203.113.135.26 202.90.137.75 202.89.125.8 202.87.214.253 202.87.213.253 202.86.8.100 202.86.149.20 202.86.149.18 202.84.37.99 202.84.37.100 202.83.175.188 202.83.175.187 202.83.175.182 202.82.66.142 202.82.121.113 202.80.247.34 202.78.224.130 202.78.224.129 202.73.30.98 202.72.201.46 202.70.77.101 202.70.76.13 202.69.50.49 202.69.50.161 202.67.10.108 202.64.161.118 202.63.197.114 202.62.77.2 202.62.222.222 202.62.222.220 202.61.251.9 202.60.193.137 202.6.96.4 202.58.18.18 202.57.32.1 202.55.176.11 202.55.176.10 202.5.200.8 202.5.192.9 202.46.34.75 202.46.34.74 202.46.33.250 202.44.52.1 202.43.108.1 202.41.213.33 202.30.143.44 202.30.143.41 202.30.143.11 202.30.0.11 202.3.229.2 202.29.9.46 202.29.53.4 202.29.51.130 202.29.33.51 202.29.242.222 202.29.240.110 202.29.239.134 202.29.236.57 202.29.232.113 202.29.228.142 202.29.225.26 202.29.22.4 202.29.219.154 202.29.218.142 202.29.218.138 202.29.216.54 202.29.214.86 202.29.214.22 202.29.173.61 202.28.66.3 202.248.37.74 202.248.20.133 202.248.175.138 202.238.55.204 202.233.9.234 202.229.255.8 202.219.63.253 202.213.33.133 202.210.190.99 202.188.124.58 202.186.1.57 202.184.80.21 202.183.195.162 202.183.153.140 202.182.0.2 202.182.0.1 202.181.242.131 202.181.233.243 202.181.178.163 202.175.86.206 202.175.66.122 202.175.45.2 202.175.113.124 202.173.208.2 202.173.208.1 202.166.161.107 202.165.94.226 202.164.153.87 202.164.153.108 202.164.150.220 202.164.140.95 202.164.140.93 202.164.140.88 202.164.140.67 202.164.140.31 202.164.140.203 202.163.110.163 202.157.177.4 202.155.222.251 202.155.202.75 202.155.197.230 202.153.110.47 202.151.81.209 202.149.205.59 202.149.205.15 202.149.204.207 202.146.34.251 202.143.118.53 202.142.189.98 202.142.179.66 202.142.133.126 202.14.14.99 202.14.14.97 202.138.73.149 202.136.180.57 202.136.120.187 202.133.101.116 202.131.73.38 202.130.97.66 202.130.97.65 202.129.59.69 202.129.207.29 202.129.207.28 202.129.206.237 202.129.196.242 202.129.1.186 202.129.0.27 202.126.100.157 202.125.84.197 202.124.192.10 202.124.128.3 202.123.179.205 201.96.47.101 201.96.27.129 201.76.162.156 201.76.161.162 201.6.254.155 201.54.224.134 201.48.9.5 201.48.9.4 201.253.120.219 201.251.135.168 201.251.135.167 201.247.112.236 201.238.243.245 201.238.128.199 201.234.210.179 201.234.186.234 201.234.186.225 201.234.138.252 201.229.68.14 201.222.53.130 201.222.50.30 201.219.218.130 201.219.193.1 201.219.154.75 201.218.223.138 201.218.219.210 201.218.125.251 201.217.57.148 201.216.230.100 201.21.195.129 201.200.130.36 201.200.130.35 201.194.193.31 201.190.178.156 201.190.11.254 201.184.60.178 201.184.237.218 201.184.225.210 201.184.224.50 201.184.187.98 201.184.180.58 201.184.175.242 201.184.167.2 201.184.126.218 201.182.70.106 201.182.66.37 201.182.22.253 201.174.80.34 201.174.80.178 201.174.235.68 201.171.254.115 201.170.249.229 201.165.54.242 201.164.60.34 201.164.154.202 201.163.94.65 201.163.81.90 201.16.253.25 201.16.214.164 201.156.1.226 201.151.40.54 201.151.196.110 201.151.196.107 201.150.35.124 201.149.94.61 201.148.95.234 201.148.17.116 201.148.17.110 201.148.107.70 201.148.107.14 201.147.242.124 201.147.242.119 201.144.40.97 201.143.181.110 201.140.157.33 201.140.114.161 201.132.162.254 201.130.73.234 201.101.2.38 200.95.184.33 200.95.184.22 200.95.144.3 200.94.26.115 200.94.26.114 200.94.21.29 200.94.156.193 200.92.202.26 200.91.34.20 200.91.28.35 200.9.155.203 200.89.142.74 200.89.134.202 200.85.7.28 200.85.61.90 200.85.61.34 200.85.39.94 200.80.232.12 200.80.203.75 200.78.242.11 200.76.52.60 200.76.5.147 200.75.8.110 200.74.203.116 200.73.113.158 200.69.79.50 200.69.226.98 200.69.212.177 200.68.46.21 200.62.147.66 200.6.253.74 200.58.84.94 200.58.182.186 200.58.180.50 200.57.7.61 200.56.98.145 200.56.98.113 200.56.224.11 200.56.117.25 200.55.59.102 200.55.59.101 200.55.248.253 200.54.9.138 200.54.51.6 200.54.22.74 200.52.80.60 200.5.90.102 200.5.119.178 200.5.115.26 200.49.1.8 200.45.14.178 200.44.190.134 200.41.174.20 200.41.102.254 200.39.23.4 200.37.71.3 200.37.203.90 200.35.94.41 200.35.79.41 200.35.110.9 200.33.3.123 200.29.255.3 200.29.255.2 200.29.109.112 200.29.108.64 200.25.254.134 200.248.178.54 200.24.131.97 200.229.252.65 200.229.252.196 200.229.252.171 200.229.252.17 200.221.11.101 200.221.11.100 200.219.224.172 200.214.186.3 200.21.227.130 200.207.143.93 200.201.191.91 200.2.116.245 200.195.170.186 200.195.154.122 200.19.203.1 200.186.194.135 200.186.1.135 200.182.63.96 200.171.40.210 200.169.8.1 200.169.2.2 200.150.103.60 200.142.106.130 200.125.171.220 200.125.171.219 200.125.171.171 200.125.171.170 200.125.171.117 200.124.124.190 200.123.208.126 200.12.251.226 200.119.222.242 200.116.231.27 200.114.96.11 200.114.113.67 200.113.10.155 200.112.143.5 200.111.82.197 200.111.47.43 200.111.143.146 200.110.219.225 200.110.219.162 200.110.168.42 200.11.52.202 200.11.138.12 200.11.138.11 200.108.46.242 200.108.139.254 200.108.131.206 200.106.167.196 200.106.167.195 200.105.96.57 200.105.192.6 200.10.231.110 200.10.221.16 200.10.156.62 200.1.104.36 200.1.104.35 20.93.144.220 20.92.135.165 20.71.128.65 20.65.24.202 20.46.112.146 20.44.248.67 20.44.201.37 20.43.154.54 20.38.170.198 20.36.30.173 20.242.194.111 20.220.73.158 20.212.94.189 20.203.40.214 20.203.17.58 20.193.27.225 20.14.83.169 20.112.30.229 20.106.145.8 2.85.181.242 2.78.57.194 2.63.220.22 2.63.188.10 2.63.175.22 2.60.245.18 2.60.117.118 2.59.241.54 2.59.241.250 2.59.241.23 2.59.135.250 2.56.220.2 2.56.182.37 2.55.72.107 2.55.127.105 2.52.252.252 2.47.138.139 2.40.63.222 2.40.45.218 2.40.119.162 2.32.175.178 2.229.72.225 2.229.16.101 2.207.170.66 2.189.44.44 2.188.21.130 2.136.93.224 2.136.37.48 2.119.131.34 2.105.69.220 199.88.158.1 199.85.127.30 199.85.127.20 199.85.127.10 199.85.126.30 199.85.126.20 199.85.126.10 199.76.39.72 199.7.69.99 199.7.69.98 199.7.69.96 199.7.69.94 199.7.69.93 199.7.69.91 199.7.69.90 199.7.69.9 199.7.69.88 199.7.69.87 199.7.69.85 199.7.69.83 199.7.69.82 199.7.69.81 199.7.69.8 199.7.69.79 199.7.69.78 199.7.69.73 199.7.69.72 199.7.69.71 199.7.69.7 199.7.69.68 199.7.69.66 199.7.69.65 199.7.69.64 199.7.69.62 199.7.69.6 199.7.69.58 199.7.69.56 199.7.69.54 199.7.69.53 199.7.69.49 199.7.69.46 199.7.69.45 199.7.69.44 199.7.69.43 199.7.69.36 199.7.69.34 199.7.69.32 199.7.69.31 199.7.69.3 199.7.69.29 199.7.69.26 199.7.69.254 199.7.69.251 199.7.69.250 199.7.69.25 199.7.69.249 199.7.69.248 199.7.69.246 199.7.69.243 199.7.69.242 199.7.69.24 199.7.69.239 199.7.69.238 199.7.69.234 199.7.69.231 199.7.69.230 199.7.69.229 199.7.69.226 199.7.69.225 199.7.69.221 199.7.69.214 199.7.69.213 199.7.69.212 199.7.69.210 199.7.69.208 199.7.69.201 199.7.69.200 199.7.69.20 199.7.69.2 199.7.69.198 199.7.69.189 199.7.69.188 199.7.69.184 199.7.69.181 199.7.69.179 199.7.69.178 199.7.69.176 199.7.69.174 199.7.69.171 199.7.69.170 199.7.69.17 199.7.69.167 199.7.69.164 199.7.69.162 199.7.69.161 199.7.69.160 199.7.69.16 199.7.69.159 199.7.69.156 199.7.69.154 199.7.69.151 199.7.69.15 199.7.69.147 199.7.69.145 199.7.69.144 199.7.69.143 199.7.69.141 199.7.69.140 199.7.69.139 199.7.69.137 199.7.69.136 199.7.69.134 199.7.69.133 199.7.69.131 199.7.69.13 199.7.69.126 199.7.69.125 199.7.69.124 199.7.69.123 199.7.69.121 199.7.69.12 199.7.69.119 199.7.69.117 199.7.69.115 199.7.69.113 199.7.69.112 199.7.69.109 199.7.69.108 199.7.69.106 199.7.69.103 199.7.69.100 199.7.69.10 199.7.69.1 199.7.68.99 199.7.68.97 199.7.68.93 199.7.68.92 199.7.68.91 199.7.68.9 199.7.68.89 199.7.68.88 199.7.68.86 199.7.68.85 199.7.68.83 199.7.68.82 199.7.68.77 199.7.68.76 199.7.68.75 199.7.68.73 199.7.68.72 199.7.68.71 199.7.68.70 199.7.68.69 199.7.68.68 199.7.68.66 199.7.68.63 199.7.68.62 199.7.68.56 199.7.68.53 199.7.68.52 199.7.68.51 199.7.68.49 199.7.68.48 199.7.68.45 199.7.68.44 199.7.68.43 199.7.68.41 199.7.68.4 199.7.68.38 199.7.68.36 199.7.68.35 199.7.68.34 199.7.68.32 199.7.68.29 199.7.68.27 199.7.68.26 199.7.68.251 199.7.68.250 199.7.68.25 199.7.68.248 199.7.68.244 199.7.68.243 199.7.68.240 199.7.68.24 199.7.68.239 199.7.68.237 199.7.68.236 199.7.68.234 199.7.68.233 199.7.68.231 199.7.68.23 199.7.68.229 199.7.68.227 199.7.68.226 199.7.68.225 199.7.68.223 199.7.68.222 199.7.68.221 199.7.68.219 199.7.68.217 199.7.68.216 199.7.68.215 199.7.68.214 199.7.68.213 199.7.68.212 199.7.68.211 199.7.68.210 199.7.68.21 199.7.68.209 199.7.68.208 199.7.68.207 199.7.68.204 199.7.68.203 199.7.68.202 199.7.68.201 199.7.68.200 199.7.68.20 199.7.68.198 199.7.68.197 199.7.68.195 199.7.68.192 199.7.68.188 199.7.68.185 199.7.68.184 199.7.68.181 199.7.68.18 199.7.68.179 199.7.68.175 199.7.68.173 199.7.68.172 199.7.68.171 199.7.68.17 199.7.68.168 199.7.68.167 199.7.68.166 199.7.68.165 199.7.68.161 199.7.68.160 199.7.68.159 199.7.68.158 199.7.68.157 199.7.68.156 199.7.68.153 199.7.68.152 199.7.68.149 199.7.68.148 199.7.68.145 199.7.68.144 199.7.68.143 199.7.68.141 199.7.68.140 199.7.68.14 199.7.68.139 199.7.68.137 199.7.68.134 199.7.68.133 199.7.68.132 199.7.68.131 199.7.68.13 199.7.68.128 199.7.68.127 199.7.68.124 199.7.68.123 199.7.68.121 199.7.68.119 199.7.68.118 199.7.68.115 199.7.68.113 199.7.68.110 199.7.68.109 199.7.68.108 199.7.68.104 199.7.68.102 199.7.68.101 199.7.68.100 199.7.68.10 199.58.81.218 199.44.194.3 199.44.194.2 199.243.95.1 199.241.172.22 199.218.114.27 199.203.56.218 199.195.54.137 199.193.83.137 199.193.80.46 199.193.74.45 199.193.74.42 199.192.161.86 199.192.161.23 199.192.160.102 199.166.6.62 199.166.6.2 199.127.219.254 199.117.92.73 199.116.57.181 199.101.48.17 198.99.193.2 198.99.193.1 198.82.247.98 198.82.247.66 198.82.247.34 198.71.62.239 198.71.117.66 198.60.22.22 198.60.22.2 198.54.117.11 198.54.117.10 198.52.242.90 198.41.223.98 198.41.223.93 198.41.223.83 198.41.223.73 198.41.223.64 198.41.223.63 198.41.223.61 198.41.223.55 198.41.223.42 198.41.223.40 198.41.223.38 198.41.223.251 198.41.223.250 198.41.223.245 198.41.223.238 198.41.223.224 198.41.223.215 198.41.223.210 198.41.223.207 198.41.223.204 198.41.223.200 198.41.223.189 198.41.223.177 198.41.223.127 198.41.223.124 198.41.223.112 198.41.222.87 198.41.222.8 198.41.222.75 198.41.222.67 198.41.222.6 198.41.222.57 198.41.222.49 198.41.222.42 198.41.222.36 198.41.222.32 198.41.222.249 198.41.222.24 198.41.222.239 198.41.222.237 198.41.222.236 198.41.222.233 198.41.222.230 198.41.222.229 198.41.222.227 198.41.222.226 198.41.222.221 198.41.222.220 198.41.222.205 198.41.222.198 198.41.222.197 198.41.222.194 198.41.222.188 198.41.222.186 198.41.222.172 198.41.222.170 198.41.222.169 198.41.222.167 198.41.222.159 198.41.222.150 198.41.222.15 198.41.222.147 198.41.222.145 198.41.222.142 198.41.222.141 198.41.222.14 198.41.222.128 198.41.222.120 198.41.222.116 198.41.222.110 198.41.222.107 198.41.222.101 198.251.100.2 198.245.51.147 198.243.48.167 198.233.215.56 198.190.195.80 198.180.225.180 198.175.228.44 198.175.228.33 198.153.194.60 198.153.194.50 198.153.194.40 198.153.194.210 198.153.194.200 198.153.194.140 198.153.194.130 198.153.194.120 198.153.194.1 198.153.192.50 198.153.192.40 198.153.192.32 198.153.192.210 198.153.192.140 198.153.192.1 198.136.58.194 198.135.221.2 197.91.185.58 197.91.174.198 197.91.170.214 197.90.203.87 197.90.203.50 197.253.36.34 197.251.239.245 197.251.204.34 197.248.131.203 197.248.125.181 197.248.0.34 197.243.90.62 197.235.15.47 197.232.66.154 197.232.52.61 197.232.21.96 197.232.155.47 197.232.124.205 197.231.180.83 197.230.97.29 197.230.92.90 197.230.84.1 197.230.250.150 197.230.245.130 197.230.189.218 197.230.188.74 197.230.174.153 197.230.162.89 197.230.161.193 197.230.161.122 197.230.15.206 197.230.145.10 197.230.103.202 197.221.82.226 197.221.82.2 197.215.217.251 197.214.248.66 197.210.211.1 197.159.180.2 197.159.180.1 197.155.92.21 197.155.92.20 197.155.72.149 197.155.71.114 197.155.230.206 197.148.74.19 197.148.74.18 197.13.5.134 196.61.20.249 196.43.199.61 196.43.199.60 196.33.103.134 196.31.251.146 196.3.132.154 196.3.132.153 196.29.199.76 196.28.84.126 196.28.244.3 196.27.106.21 196.251.156.82 196.25.155.102 196.216.252.65 196.216.15.56 196.216.134.71 196.21.186.253 196.203.86.4 196.203.125.131 196.201.244.7 196.201.228.22 196.200.176.2 196.179.250.95 196.179.250.93 196.179.250.91 196.179.250.89 196.179.250.50 196.179.250.11 196.179.250.10 196.179.196.177 196.178.99.16 196.178.97.91 196.178.97.85 196.178.97.84 196.178.97.52 196.178.97.42 196.178.97.250 196.178.97.193 196.178.97.16 196.178.100.224 196.15.211.117 196.13.243.20 196.13.158.51 196.13.141.10 195.99.66.220 195.98.85.66 195.97.74.14 195.96.250.194 195.93.149.199 195.90.183.90 195.9.94.122 195.9.190.22 195.9.166.86 195.88.74.2 195.88.223.73 195.80.119.99 195.80.119.101 195.70.113.203 195.69.65.98 195.69.65.1 195.69.217.130 195.68.174.244 195.63.61.189 195.63.103.144 195.62.19.125 195.62.19.119 195.60.71.123 195.46.7.225 195.46.39.40 195.46.39.39 195.46.39.151 195.46.39.103 195.46.20.65 195.43.12.163 195.4.138.12 195.34.234.228 195.34.193.16 195.3.204.225 195.3.169.67 195.3.135.101 195.29.76.12 195.27.1.1 195.251.19.1 195.250.72.134 195.250.39.16 195.25.89.202 195.248.65.72 195.246.42.210 195.245.237.35 195.243.214.4 195.239.39.250 195.239.230.40 195.239.138.198 195.238.40.45 195.235.225.10 195.230.115.3 195.230.115.2 195.23.75.151 195.23.236.90 195.23.100.180 195.228.81.117 195.228.39.166 195.228.230.148 195.226.187.130 195.226.148.211 195.225.49.20 195.225.49.131 195.225.48.193 195.225.48.17 195.224.45.182 195.224.191.221 195.224.148.52 195.222.45.135 195.22.77.99 195.22.237.106 195.22.131.230 195.219.98.40 195.216.58.18 195.216.58.16 195.214.240.136 195.211.85.70 195.211.219.141 195.211.101.223 195.210.172.46 195.210.172.43 195.21.58.113 195.21.54.113 195.21.137.153 195.21.13.234 195.209.144.228 195.208.5.1 195.208.4.1 195.208.108.75 195.205.9.65 195.205.39.18 195.201.246.253 195.201.192.29 195.201.100.11 195.200.176.2 195.20.154.230 195.192.9.141 195.192.86.170 195.191.13.87 195.19.40.237 195.19.4.32 195.19.102.93 195.186.4.192 195.186.4.162 195.186.4.111 195.186.4.110 195.186.1.162 195.186.1.111 195.186.1.110 195.182.147.74 195.18.16.140 195.178.56.180 195.178.56.179 195.178.33.46 195.167.86.34 195.167.136.57 195.167.123.245 195.166.180.239 195.162.81.125 195.16.47.53 195.158.87.192 195.158.82.92 195.158.8.30 195.158.250.101 195.158.0.5 195.158.0.3 195.154.57.169 195.154.31.170 195.140.195.21 195.14.49.27 195.138.90.226 195.138.88.134 195.138.79.162 195.136.206.181 195.136.206.159 195.136.206.155 195.136.206.152 195.136.163.57 195.135.30.64 195.133.157.159 195.133.149.106 195.117.218.206 195.116.52.251 195.116.242.247 195.116.242.240 195.114.7.252 195.112.128.222 195.110.25.248 195.110.24.248 195.11.179.142 195.11.179.140 195.10.195.195 194.93.2.70 194.88.93.22 194.88.54.158 194.88.245.142 194.88.153.197 194.77.8.1 194.74.6.42 194.72.35.195 194.72.35.194 194.70.90.162 194.69.195.2 194.69.194.3 194.68.95.4 194.67.40.47 194.67.38.7 194.65.30.2 194.61.59.25 194.61.232.18 194.6.227.60 194.6.227.180 194.6.227.18 194.6.227.150 194.6.227.15 194.55.140.138 194.50.50.3 194.48.151.213 194.48.151.200 194.48.151.145 194.48.151.132 194.48.151.130 194.44.67.95 194.44.45.242 194.44.216.58 194.44.216.10 194.44.211.78 194.44.139.88 194.44.138.10 194.36.144.87 194.33.76.1 194.31.5.18 194.31.153.61 194.30.254.138 194.29.10.6 194.28.61.114 194.250.242.105 194.25.0.68 194.25.0.62 194.25.0.60 194.25.0.52 194.249.67.20 194.247.184.53 194.242.217.239 194.236.230.132 194.236.230.131 194.233.86.28 194.228.54.34 194.228.165.168 194.224.216.170 194.22.51.35 194.209.90.8 194.209.225.15 194.204.225.18 194.204.223.244 194.2.0.50 194.2.0.20 194.190.84.137 194.190.43.87 194.190.175.17 194.187.242.10 194.187.240.10 194.187.150.71 194.186.90.74 194.186.44.69 194.186.232.214 194.186.215.150 194.177.56.1 194.177.50.125 194.177.210.210 194.177.199.1 194.172.160.4 194.168.8.123 194.168.4.123 194.158.78.137 194.150.118.100 194.149.145.132 194.146.249.146 194.146.24.191 194.145.241.6 194.145.240.7 194.145.240.6 194.141.30.177 194.135.45.87 194.135.230.86 194.135.11.210 194.126.183.208 194.126.167.2 194.125.133.10 194.12.15.222 193.95.93.77 193.95.93.243 193.95.221.141 193.93.237.230 193.85.30.34 193.77.25.50 193.77.216.22 193.58.251.251 193.58.251.105 193.58.251.104 193.58.251.103 193.58.251.102 193.58.251.101 193.57.73.100 193.56.149.89 193.56.148.228 193.53.252.195 193.47.83.251 193.42.159.2 193.42.153.26 193.42.153.107 193.39.71.5 193.39.71.4 193.39.71.3 193.33.100.206 193.253.234.127 193.252.209.127 193.248.131.101 193.243.138.50 193.242.177.92 193.242.151.45 193.242.107.8 193.238.33.131 193.238.102.55 193.233.153.193 193.232.36.242 193.230.247.195 193.228.134.195 193.227.50.3 193.227.29.241 193.227.29.10 193.226.61.1 193.225.126.61 193.219.27.222 193.219.27.220 193.219.102.62 193.215.26.18 193.215.179.34 193.214.73.78 193.202.121.50 193.202.111.250 193.200.151.69 193.200.144.35 193.2.246.9 193.192.37.178 193.192.113.146 193.19.64.88 193.19.253.254 193.19.103.4 193.186.170.50 193.17.47.1 193.168.243.5 193.165.122.190 193.165.116.70 193.159.181.250 193.141.116.163 193.138.92.130 193.138.92.129 193.135.142.198 193.115.248.226 193.115.217.24 193.111.200.191 193.110.81.9 193.110.81.0 193.106.58.211 193.106.192.9 193.106.192.6 193.106.192.14 193.104.79.138 192.77.22.74 192.71.166.92 192.69.77.66 192.248.191.138 192.248.176.219 192.227.71.86 192.221.177.0 192.221.176.16 192.221.176.0 192.221.142.128 192.221.142.0 192.221.139.0 192.221.138.0 192.221.135.0 192.210.16.184 192.203.138.17 192.203.138.11 192.198.0.2 192.182.146.202 192.172.250.8 192.169.154.227 192.166.218.28 192.166.218.146 192.166.144.12 192.165.9.158 192.165.9.157 192.165.252.20 192.162.85.48 192.162.240.66 192.162.237.50 192.162.233.20 192.141.106.20 192.140.40.253 192.133.129.2 192.12.111.30 192.119.70.155 192.116.91.229 192.109.241.6 192.100.164.125 192.100.159.34 191.97.9.99 191.97.9.225 191.97.53.229 191.97.47.93 191.6.138.137 191.5.179.151 191.37.23.73 191.36.234.58 191.36.234.143 191.36.234.135 191.36.233.57 191.36.233.100 191.33.230.226 191.241.245.108 191.241.161.70 191.240.254.238 191.209.29.122 191.189.30.99 191.182.203.8 191.13.135.23 191.102.89.6 191.102.89.2 191.102.82.83 191.102.57.58 191.102.56.57 191.102.107.237 191.100.20.116 190.96.94.98 190.96.93.74 190.94.212.10 190.93.189.30 190.93.189.28 190.93.176.126 190.90.21.101 190.89.8.146 190.89.142.141 190.89.142.129 190.86.205.194 190.85.118.18 190.85.117.140 190.82.70.214 190.81.47.205 190.71.49.122 190.63.160.34 190.60.84.243 190.60.81.50 190.60.67.138 190.60.37.226 190.6.31.100 190.6.200.161 190.58.23.133 190.57.234.194 190.56.148.54 190.5.81.230 190.43.92.243 190.4.48.3 190.4.18.218 190.255.35.60 190.25.241.210 190.249.170.32 190.249.168.212 190.249.158.58 190.248.67.34 190.248.67.206 190.248.143.210 190.24.142.107 190.223.55.37 190.217.155.118 190.216.56.107 190.215.115.214 190.211.104.94 190.211.104.93 190.210.255.132 190.210.245.247 190.210.127.98 190.208.41.11 190.202.135.58 190.195.158.55 190.187.243.222 190.187.201.179 190.187.200.243 190.186.41.66 190.186.131.245 190.186.1.46 190.184.224.206 190.183.128.74 190.181.63.242 190.181.33.58 190.171.26.34 190.167.220.185 190.152.219.135 190.151.78.115 190.151.76.90 190.151.144.21 190.151.104.178 190.151.10.179 190.15.205.212 190.15.193.168 190.149.193.229 190.148.235.254 190.148.193.146 190.145.65.197 190.145.196.114 190.145.164.130 190.145.136.210 190.144.90.226 190.144.123.122 190.14.224.45 190.14.154.78 190.13.210.157 190.13.210.148 190.13.146.123 190.128.225.58 190.128.224.237 190.128.224.236 190.128.224.234 190.128.214.90 190.128.194.46 190.124.39.34 190.124.166.45 190.123.85.89 190.123.85.117 190.121.4.63 190.121.144.48 190.120.188.98 190.12.95.170 190.12.67.210 190.119.186.205 190.119.105.85 190.116.37.110 190.113.88.165 190.113.190.162 190.113.172.24 190.113.125.182 190.111.246.169 190.111.246.128 190.111.207.83 190.11.225.2 190.109.64.49 190.109.224.227 190.109.2.245 190.108.72.6 190.107.20.164 190.106.26.6 190.105.214.36 190.104.247.202 190.104.243.44 190.104.173.150 190.104.168.155 190.104.134.90 190.103.31.90 190.102.109.41 190.0.62.118 190.0.59.102 190.0.32.94 190.0.236.22 190.0.14.18 189.90.138.250 189.90.114.109 189.9.55.9 189.8.80.34 189.8.108.104 189.7.49.85 189.56.123.82 189.51.118.34 189.50.97.37 189.4.83.33 189.254.40.179 189.254.225.213 189.223.164.93 189.223.164.9 189.223.164.81 189.22.227.194 189.206.248.177 189.206.218.22 189.206.141.193 189.206.125.227 189.204.6.253 189.204.240.235 189.203.66.130 189.203.141.69 189.202.244.234 189.196.91.198 189.196.47.87 189.196.17.222 189.195.30.67 189.194.63.25 189.19.254.196 189.16.248.21 189.126.93.129 189.126.192.4 189.125.208.154 189.112.160.165 189.10.242.138 188.94.227.38 188.93.235.3 188.93.135.180 188.92.214.1 188.92.209.129 188.92.208.46 188.75.33.210 188.75.186.152 188.69.227.55 188.69.227.53 188.69.130.183 188.6.165.9 188.6.164.43 188.6.161.26 188.43.239.146 188.40.239.99 188.40.205.205 188.40.138.230 188.36.126.131 188.26.217.1 188.254.49.206 188.254.47.154 188.227.136.44 188.227.135.6 188.226.64.126 188.225.225.25 188.207.12.98 188.191.165.58 188.191.161.121 188.18.145.68 188.18.141.247 188.173.163.40 188.170.5.117 188.170.248.157 188.170.130.91 188.166.243.215 188.165.254.29 188.165.250.96 188.165.220.211 188.165.204.74 188.165.135.96 188.165.135.209 188.163.170.130 188.16.13.79 188.135.60.42 188.135.50.178 188.135.50.138 188.135.49.95 188.135.14.80 188.135.12.158 188.126.60.67 188.124.226.58 188.122.4.78 188.122.24.142 188.122.212.56 188.120.252.242 188.117.151.126 188.117.137.97 188.117.137.81 188.117.137.71 188.117.137.37 188.0.190.47 188.0.190.35 188.0.167.35 188.0.166.185 187.95.236.236 187.95.184.142 187.95.18.51 187.95.125.180 187.93.73.138 187.93.105.85 187.92.139.86 187.87.224.3 187.87.139.51 187.85.179.189 187.85.179.186 187.84.81.62 187.72.231.113 187.63.156.236 187.60.217.204 187.6.84.178 187.51.127.93 187.49.77.178 187.45.96.90 187.45.127.228 187.45.101.123 187.44.188.134 187.44.162.196 187.44.0.18 187.33.253.130 187.32.90.61 187.32.81.223 187.32.81.194 187.28.39.146 187.251.227.50 187.251.130.25 187.218.44.161 187.216.86.65 187.216.41.205 187.216.100.162 187.190.50.24 187.190.112.108 187.19.101.65 187.189.99.168 187.189.23.177 187.188.98.54 187.188.57.147 187.188.199.38 187.188.150.41 187.188.112.16 187.18.156.188 187.174.97.82 187.174.213.18 187.174.134.212 187.157.84.101 187.141.99.33 187.141.176.81 187.141.169.250 187.141.133.236 187.130.63.137 187.120.173.2 187.111.31.78 187.11.242.42 187.103.15.117 187.1.163.30 186.97.218.42 186.97.208.18 186.97.195.122 186.97.194.162 186.97.169.125 186.97.130.130 186.97.102.226 186.96.98.138 186.96.53.86 186.96.145.231 186.96.11.240 186.75.32.30 186.68.87.82 186.67.26.198 186.67.172.51 186.56.57.194 186.4.212.236 186.4.206.188 186.4.115.64 186.38.33.98 186.38.32.139 186.251.103.3 186.251.103.10 186.250.118.34 186.248.66.34 186.24.9.1 186.238.18.99 186.236.102.88 186.225.10.4 186.216.162.70 186.215.192.243 186.215.137.186 186.208.112.202 186.200.32.84 186.195.225.250 186.194.160.118 186.192.255.36 186.190.237.140 186.190.236.11 186.190.228.83 186.182.51.17 186.179.241.146 186.177.77.238 186.177.211.202 186.177.204.203 186.177.203.161 186.177.193.132 186.176.200.35 186.166.202.49 186.159.4.66 186.159.15.86 186.154.241.226 186.151.152.210 186.150.201.138 186.147.249.90 186.124.22.114 186.121.214.98 186.116.6.75 186.113.2.86 186.103.175.74 186.103.167.190 186.10.94.57 186.10.6.226 186.1.41.92 186.0.171.147 185.99.89.250 185.99.77.92 185.97.204.135 185.96.87.18 185.95.67.151 185.93.240.188 185.93.180.140 185.93.180.131 185.90.73.17 185.84.19.163 185.84.19.115 185.81.9.44 185.8.221.20 185.74.85.200 185.74.5.5 185.74.5.1 185.70.182.166 185.67.94.146 185.66.9.142 185.66.131.108 185.65.175.161 185.65.122.90 185.61.93.2 185.60.178.253 185.56.191.2 185.55.65.48 185.53.233.178 185.52.46.209 185.51.10.213 185.50.209.49 185.49.20.20 185.49.111.249 185.49.108.48 185.48.176.53 185.47.209.34 185.46.96.38 185.46.197.124 185.45.244.221 185.44.24.27 185.44.216.221 185.43.135.1 185.42.96.217 185.42.192.114 185.38.226.18 185.38.208.200 185.34.23.23 185.34.23.139 185.34.21.133 185.32.5.65 185.31.160.26 185.3.69.37 185.3.52.19 185.254.7.169 185.249.92.4 185.248.172.8 185.247.225.17 185.246.188.51 185.244.217.202 185.243.19.67 185.242.177.8 185.242.177.7 185.242.113.232 185.24.81.66 185.24.196.118 185.24.122.178 185.234.52.80 185.234.228.65 185.23.114.146 185.229.101.28 185.228.169.9 185.228.168.9 185.228.168.12 185.228.141.154 185.226.160.76 185.222.222.222 185.221.30.35 185.220.182.179 185.22.235.137 185.214.10.175 185.21.80.54 185.21.66.253 185.200.144.27 185.192.244.202 185.190.40.87 185.190.105.61 185.189.216.21 185.189.126.185 185.189.103.195 185.189.100.92 185.188.218.86 185.188.216.101 185.186.80.122 185.184.233.210 185.183.242.130 185.182.107.236 185.181.61.24 185.180.41.221 185.180.34.180 185.18.7.7 185.177.127.100 185.175.11.110 185.174.211.155 185.171.208.153 185.170.35.69 185.170.35.60 185.170.35.232 185.170.35.229 185.170.32.31 185.17.133.88 185.165.96.225 185.160.39.186 185.158.67.203 185.156.198.183 185.155.89.187 185.153.92.223 185.153.92.221 185.153.92.211 185.153.92.199 185.153.92.197 185.153.92.1 185.150.99.255 185.15.63.136 185.15.210.98 185.15.191.31 185.147.71.84 185.147.58.134 185.146.215.230 185.145.126.191 185.144.201.195 185.142.30.40 185.14.234.242 185.14.214.60 185.14.150.6 185.139.125.150 185.136.78.181 185.135.180.60 185.134.232.35 185.133.208.32 185.132.201.202 185.132.1.221 185.130.44.20 185.130.153.92 185.129.115.86 185.127.27.251 185.127.227.98 185.123.194.28 185.123.188.23 185.121.110.228 185.12.71.241 185.12.227.99 185.12.2.210 185.117.243.18 185.116.229.115 185.113.49.23 185.112.224.247 185.110.21.141 185.11.49.180 185.109.169.66 185.108.215.229 185.108.21.6 185.108.21.45 185.106.131.224 185.106.131.141 185.105.171.128 185.101.185.149 184.95.49.172 184.68.102.2 184.184.114.202 184.183.89.198 184.177.9.34 184.164.96.251 184.154.158.134 184.149.25.55 183.99.226.197 183.98.206.253 183.91.3.242 183.178.69.52 183.178.58.215 183.178.110.4 183.177.101.51 183.107.20.90 183.107.106.231 183.104.61.35 183.104.157.72 183.100.49.21 182.93.25.98 182.93.25.100 182.78.166.110 182.78.164.254 182.78.137.21 182.75.205.90 182.75.174.228 182.73.54.193 182.71.68.161 182.71.61.207 182.71.145.153 182.58.134.111 182.48.251.137 182.239.78.192 182.237.214.37 182.237.16.7 182.23.44.5 182.211.210.55 182.19.95.98 182.176.111.188 182.171.70.161 182.171.233.145 182.171.231.25 182.162.73.17 182.162.73.16 182.16.171.164 182.158.74.175 182.158.73.179 182.156.93.102 182.156.242.178 182.156.155.26 182.156.155.142 182.156.155.14 182.156.154.98 182.156.154.12 182.156.153.39 182.156.153.209 182.156.153.111 182.156.152.94 182.156.152.89 182.156.152.247 182.156.152.240 182.156.152.209 182.156.152.2 182.156.152.130 182.156.152.119 182.156.152.115 181.94.247.163 181.94.246.48 181.94.245.137 181.94.197.197 181.80.17.44 181.67.191.133 181.57.149.82 181.49.102.254 181.48.92.218 181.48.218.42 181.48.196.182 181.48.195.159 181.48.195.157 181.40.92.86 181.40.122.102 181.229.1.116 181.224.225.3 181.212.39.92 181.210.92.7 181.209.95.2 181.209.91.154 181.209.89.29 181.209.86.250 181.209.82.154 181.209.78.67 181.209.72.90 181.209.194.198 181.209.119.114 181.209.111.149 181.209.109.210 181.209.105.158 181.209.105.156 181.209.105.154 181.209.104.234 181.205.83.202 181.205.72.18 181.205.7.26 181.205.65.194 181.205.61.122 181.205.60.162 181.205.57.154 181.205.47.219 181.205.34.122 181.205.28.162 181.205.252.242 181.205.224.98 181.205.219.202 181.205.206.162 181.205.204.163 181.205.199.2 181.205.178.122 181.205.146.74 181.205.142.178 181.205.129.210 181.205.124.50 181.205.0.122 181.204.9.106 181.204.80.106 181.204.8.66 181.204.77.250 181.204.75.178 181.204.73.182 181.204.72.122 181.204.36.42 181.204.232.2 181.204.214.146 181.204.20.138 181.204.185.18 181.204.183.74 181.204.15.250 181.204.14.218 181.191.223.83 181.191.223.59 181.189.219.251 181.188.148.18 181.177.141.190 181.171.232.10 181.15.193.19 181.143.66.122 181.143.37.202 181.143.27.98 181.143.215.50 181.143.204.98 181.143.20.186 181.143.196.83 181.129.74.58 181.129.70.106 181.129.69.226 181.129.57.146 181.129.48.10 181.129.42.138 181.129.36.242 181.129.31.210 181.129.225.26 181.129.14.3 181.129.138.114 181.129.121.42 181.129.117.226 181.12.158.108 181.119.105.29 181.118.92.14 181.118.176.23 181.118.167.110 181.118.148.20 181.118.148.189 181.115.204.122 181.115.203.138 181.115.184.75 181.115.184.142 181.114.62.1 181.114.60.225 181.114.59.245 181.114.5.150 181.114.217.3 181.114.212.34 181.114.118.242 181.112.60.126 181.110.241.74 181.105.122.76 181.105.122.62 181.105.122.196 181.105.122.135 181.105.121.99 181.10.155.250 180.94.94.195 180.94.94.194 180.92.170.100 180.69.75.37 180.69.254.143 180.69.214.252 180.64.246.59 180.43.164.18 180.42.15.9 180.255.64.234 180.255.3.49 180.232.96.162 180.232.81.98 180.211.183.206 180.193.221.81 180.193.189.154 180.193.184.97 180.193.184.137 180.193.183.230 180.193.179.26 180.193.179.18 180.193.179.138 180.193.170.33 180.189.167.34 180.180.244.53 180.178.139.210 180.150.51.109 180.150.42.169 180.150.13.108 180.150.119.18 180.150.105.246 18.254.96.167 18.163.103.200 179.96.29.230 179.93.80.111 179.61.90.22 179.60.244.53 179.60.235.209 179.60.235.153 179.60.232.14 179.60.232.10 179.51.237.31 179.43.97.147 179.228.250.125 179.228.207.216 179.191.66.250 179.189.226.125 179.189.21.60 179.184.102.46 179.111.216.102 179.1.133.89 178.77.243.102 178.75.220.2 178.73.210.182 178.72.73.23 178.70.70.151 178.69.14.158 178.63.25.202 178.62.197.147 178.54.198.71 178.49.184.32 178.47.34.77 178.46.160.85 178.46.159.220 178.46.158.13 178.46.128.150 178.35.238.134 178.34.180.229 178.34.159.215 178.33.45.223 178.33.250.245 178.33.164.91 178.32.107.33 178.255.79.70 178.255.191.166 178.252.114.250 178.249.64.22 178.248.211.216 178.248.211.177 178.248.211.174 178.248.208.20 178.248.151.131 178.239.225.58 178.239.224.161 178.238.28.70 178.235.148.35 178.222.250.29 178.222.249.245 178.220.230.54 178.219.174.62 178.219.174.3 178.219.173.190 178.219.163.177 178.219.161.211 178.219.149.47 178.218.244.86 178.217.140.7 178.216.163.13 178.216.111.85 178.214.241.150 178.213.114.193 178.212.222.102 178.212.102.76 178.210.129.161 178.205.108.200 178.183.131.200 178.176.63.46 178.176.24.185 178.172.225.2 178.170.166.98 178.17.127.129 178.160.198.130 178.16.32.129 178.158.234.89 178.155.72.98 178.151.205.106 178.134.36.178 178.134.27.51 178.134.155.82 178.130.94.122 178.128.46.208 177.99.206.131 177.99.161.122 177.93.45.236 177.93.1.250 177.92.18.202 177.92.123.158 177.91.75.139 177.87.96.4 177.87.57.15 177.84.120.203 177.8.173.164 177.8.163.162 177.8.162.132 177.75.74.0 177.73.160.206 177.69.127.41 177.66.0.46 177.52.247.201 177.52.151.132 177.47.128.2 177.43.124.234 177.43.102.34 177.39.102.189 177.36.241.38 177.36.214.1 177.36.196.106 177.244.25.118 177.242.151.222 177.241.250.42 177.241.245.222 177.240.8.182 177.240.18.182 177.234.226.92 177.234.209.111 177.234.132.8 177.229.223.74 177.223.234.119 177.223.107.235 177.221.41.221 177.220.156.202 177.220.153.162 177.220.149.10 177.22.38.165 177.22.203.220 177.21.15.122 177.200.69.231 177.200.196.85 177.20.183.3 177.190.222.139 177.190.199.35 177.19.150.218 177.19.145.82 177.184.176.5 177.174.112.253 177.159.101.225 177.152.93.246 177.152.52.99 177.152.159.199 177.152.104.139 177.144.128.64 177.131.29.211 177.131.29.209 177.128.24.188 177.104.64.2 177.101.35.197 177.10.162.82 176.99.5.15 176.98.80.97 176.98.80.149 176.96.240.86 176.9.93.198 176.9.54.219 176.9.29.119 176.9.204.129 176.9.163.161 176.9.100.254 176.9.1.117 176.65.63.119 176.62.79.18 176.62.189.246 176.58.119.151 176.58.113.172 176.53.10.136 176.33.142.139 176.31.248.107 176.31.103.216 176.28.250.122 176.28.107.12 176.241.192.31 176.241.110.51 176.235.135.204 176.197.7.54 176.197.228.243 176.196.53.70 176.193.76.23 176.192.123.190 176.124.144.35 176.122.71.107 176.122.24.201 176.122.21.137 176.121.9.144 176.120.203.38 176.12.122.226 176.118.26.2 176.114.228.63 176.114.128.30 176.108.36.129 176.107.131.32 176.107.118.206 176.106.252.22 176.105.213.126 176.105.207.93 176.103.72.103 176.102.137.49 176.102.128.154 176.101.247.53 176.100.76.240 175.45.16.253 175.213.232.126 175.213.132.85 175.213.132.56 175.209.22.21 175.208.49.10 175.208.229.187 175.207.242.72 175.202.234.243 175.199.45.229 175.144.214.180 175.143.98.42 175.139.176.60 175.138.229.245 175.138.182.115 175.126.106.69 175.117.145.35 175.110.54.135 175.101.18.20 175.101.18.18 175.101.132.109 174.71.211.178 174.69.43.159 174.47.194.76 174.141.219.114 174.141.212.61 174.138.21.128 174.138.185.110 174.138.182.182 173.9.160.113 173.27.123.175 173.251.21.58 173.249.48.6 173.249.41.233 173.249.10.12 173.248.232.249 173.248.155.77 173.246.249.1 173.245.59.99 173.245.59.88 173.245.59.87 173.245.59.82 173.245.59.59 173.245.59.56 173.245.59.55 173.245.59.52 173.245.59.49 173.245.59.25 173.245.59.237 173.245.59.230 173.245.59.225 173.245.59.208 173.245.59.203 173.245.59.186 173.245.59.172 173.245.59.17 173.245.59.167 173.245.59.165 173.245.59.163 173.245.59.156 173.245.59.147 173.245.59.146 173.245.59.139 173.245.59.131 173.245.59.127 173.245.59.123 173.245.59.122 173.245.59.12 173.245.59.117 173.245.59.102 173.245.59.10 173.245.58.95 173.245.58.93 173.245.58.89 173.245.58.86 173.245.58.74 173.245.58.67 173.245.58.6 173.245.58.49 173.245.58.39 173.245.58.237 173.245.58.223 173.245.58.215 173.245.58.201 173.245.58.184 173.245.58.180 173.245.58.18 173.245.58.177 173.245.58.167 173.245.58.137 173.245.58.136 173.245.58.127 173.245.58.126 173.245.58.118 173.245.58.113 173.245.58.106 173.241.228.10 173.239.57.92 173.239.23.84 173.227.163.200 173.226.143.254 173.223.99.98 173.223.99.92 173.223.99.83 173.223.99.81 173.223.99.71 173.223.99.66 173.223.99.3 173.223.99.26 173.223.99.250 173.223.99.226 173.223.99.220 173.223.99.201 173.223.99.194 173.223.99.175 173.223.99.172 173.223.99.168 173.223.99.15 173.223.99.124 173.223.99.115 173.223.99.112 173.223.99.103 173.223.98.53 173.223.98.49 173.223.98.29 173.223.98.244 173.223.98.213 173.223.98.205 173.223.98.198 173.223.98.191 173.223.98.181 173.223.98.180 173.223.98.174 173.223.98.168 173.223.98.137 173.223.98.118 173.223.98.117 173.223.98.112 173.223.101.9 173.223.101.48 173.223.101.46 173.223.100.9 173.223.100.50 173.223.100.10 173.219.2.16 173.212.6.5 173.212.243.123 173.212.242.89 173.212.241.35 173.212.239.87 173.212.228.2 173.197.161.35 173.166.181.209 173.163.101.137 173.161.65.201 173.161.248.250 173.15.132.155 173.13.186.37 173.12.123.37 173.0.43.38 172.64.47.93 172.64.47.91 172.64.47.9 172.64.47.85 172.64.47.75 172.64.47.67 172.64.47.50 172.64.47.45 172.64.47.44 172.64.47.29 172.64.47.254 172.64.47.250 172.64.47.242 172.64.47.227 172.64.47.226 172.64.47.224 172.64.47.221 172.64.47.216 172.64.47.210 172.64.47.204 172.64.47.200 172.64.47.195 172.64.47.186 172.64.47.181 172.64.47.180 172.64.47.18 172.64.47.178 172.64.47.174 172.64.47.171 172.64.47.170 172.64.47.168 172.64.47.167 172.64.47.166 172.64.47.158 172.64.47.154 172.64.47.153 172.64.47.147 172.64.47.143 172.64.47.133 172.64.47.124 172.64.47.12 172.64.47.113 172.64.47.110 172.64.47.107 172.64.47.106 172.64.47.104 172.64.47.103 172.64.47.102 172.64.47.10 172.64.46.9 172.64.46.84 172.64.46.83 172.64.46.80 172.64.46.72 172.64.46.66 172.64.46.62 172.64.46.53 172.64.46.52 172.64.46.50 172.64.46.47 172.64.46.46 172.64.46.45 172.64.46.42 172.64.46.36 172.64.46.35 172.64.46.34 172.64.46.31 172.64.46.29 172.64.46.28 172.64.46.27 172.64.46.255 172.64.46.253 172.64.46.252 172.64.46.243 172.64.46.236 172.64.46.230 172.64.46.229 172.64.46.227 172.64.46.22 172.64.46.217 172.64.46.213 172.64.46.211 172.64.46.209 172.64.46.203 172.64.46.202 172.64.46.200 172.64.46.198 172.64.46.192 172.64.46.191 172.64.46.179 172.64.46.177 172.64.46.176 172.64.46.173 172.64.46.17 172.64.46.161 172.64.46.160 172.64.46.159 172.64.46.144 172.64.46.142 172.64.46.137 172.64.46.13 172.64.46.127 172.64.46.124 172.64.46.111 172.64.46.109 172.64.46.106 172.64.46.103 172.64.38.95 172.64.38.84 172.64.38.79 172.64.38.71 172.64.38.56 172.64.38.47 172.64.38.30 172.64.38.28 172.64.38.241 172.64.38.232 172.64.38.227 172.64.38.220 172.64.38.215 172.64.38.211 172.64.38.205 172.64.38.198 172.64.38.197 172.64.38.195 172.64.38.190 172.64.38.182 172.64.38.179 172.64.38.177 172.64.38.175 172.64.38.169 172.64.38.155 172.64.38.14 172.64.38.128 172.64.38.12 172.64.38.10 172.64.38.1 172.64.37.99 172.64.37.98 172.64.37.97 172.64.37.96 172.64.37.95 172.64.37.94 172.64.37.93 172.64.37.92 172.64.37.91 172.64.37.90 172.64.37.9 172.64.37.89 172.64.37.88 172.64.37.87 172.64.37.86 172.64.37.85 172.64.37.84 172.64.37.83 172.64.37.82 172.64.37.81 172.64.37.80 172.64.37.8 172.64.37.79 172.64.37.78 172.64.37.77 172.64.37.76 172.64.37.75 172.64.37.74 172.64.37.73 172.64.37.72 172.64.37.71 172.64.37.70 172.64.37.7 172.64.37.69 172.64.37.68 172.64.37.66 172.64.37.65 172.64.37.64 172.64.37.63 172.64.37.62 172.64.37.61 172.64.37.60 172.64.37.6 172.64.37.59 172.64.37.58 172.64.37.57 172.64.37.56 172.64.37.55 172.64.37.54 172.64.37.53 172.64.37.52 172.64.37.51 172.64.37.50 172.64.37.5 172.64.37.49 172.64.37.48 172.64.37.47 172.64.37.46 172.64.37.45 172.64.37.44 172.64.37.43 172.64.37.42 172.64.37.41 172.64.37.40 172.64.37.4 172.64.37.39 172.64.37.38 172.64.37.37 172.64.37.35 172.64.37.34 172.64.37.33 172.64.37.32 172.64.37.31 172.64.37.30 172.64.37.3 172.64.37.29 172.64.37.28 172.64.37.27 172.64.37.26 172.64.37.254 172.64.37.253 172.64.37.252 172.64.37.251 172.64.37.250 172.64.37.25 172.64.37.249 172.64.37.248 172.64.37.247 172.64.37.246 172.64.37.245 172.64.37.244 172.64.37.243 172.64.37.242 172.64.37.241 172.64.37.240 172.64.37.24 172.64.37.239 172.64.37.238 172.64.37.237 172.64.37.236 172.64.37.235 172.64.37.234 172.64.37.232 172.64.37.231 172.64.37.230 172.64.37.23 172.64.37.229 172.64.37.228 172.64.37.227 172.64.37.226 172.64.37.225 172.64.37.224 172.64.37.223 172.64.37.222 172.64.37.221 172.64.37.220 172.64.37.22 172.64.37.219 172.64.37.218 172.64.37.217 172.64.37.216 172.64.37.215 172.64.37.214 172.64.37.213 172.64.37.212 172.64.37.211 172.64.37.210 172.64.37.21 172.64.37.209 172.64.37.208 172.64.37.207 172.64.37.206 172.64.37.205 172.64.37.204 172.64.37.203 172.64.37.201 172.64.37.200 172.64.37.20 172.64.37.2 172.64.37.199 172.64.37.198 172.64.37.197 172.64.37.196 172.64.37.195 172.64.37.194 172.64.37.193 172.64.37.192 172.64.37.191 172.64.37.190 172.64.37.19 172.64.37.189 172.64.37.188 172.64.37.187 172.64.37.186 172.64.37.185 172.64.37.184 172.64.37.183 172.64.37.182 172.64.37.181 172.64.37.180 172.64.37.18 172.64.37.179 172.64.37.178 172.64.37.177 172.64.37.176 172.64.37.175 172.64.37.174 172.64.37.173 172.64.37.172 172.64.37.171 172.64.37.170 172.64.37.17 172.64.37.169 172.64.37.168 172.64.37.167 172.64.37.166 172.64.37.165 172.64.37.164 172.64.37.163 172.64.37.162 172.64.37.161 172.64.37.160 172.64.37.16 172.64.37.159 172.64.37.157 172.64.37.156 172.64.37.155 172.64.37.154 172.64.37.153 172.64.37.152 172.64.37.151 172.64.37.150 172.64.37.15 172.64.37.149 172.64.37.148 172.64.37.147 172.64.37.146 172.64.37.145 172.64.37.144 172.64.37.143 172.64.37.142 172.64.37.141 172.64.37.140 172.64.37.14 172.64.37.139 172.64.37.138 172.64.37.137 172.64.37.136 172.64.37.135 172.64.37.134 172.64.37.133 172.64.37.132 172.64.37.131 172.64.37.130 172.64.37.13 172.64.37.129 172.64.37.128 172.64.37.127 172.64.37.126 172.64.37.125 172.64.37.124 172.64.37.123 172.64.37.122 172.64.37.121 172.64.37.120 172.64.37.12 172.64.37.119 172.64.37.118 172.64.37.117 172.64.37.116 172.64.37.115 172.64.37.114 172.64.37.113 172.64.37.112 172.64.37.111 172.64.37.110 172.64.37.11 172.64.37.109 172.64.37.108 172.64.37.107 172.64.37.106 172.64.37.105 172.64.37.104 172.64.37.103 172.64.37.102 172.64.37.101 172.64.37.100 172.64.37.10 172.64.37.1 172.64.37.0 172.64.36.99 172.64.36.98 172.64.36.97 172.64.36.96 172.64.36.95 172.64.36.94 172.64.36.93 172.64.36.92 172.64.36.91 172.64.36.90 172.64.36.9 172.64.36.89 172.64.36.88 172.64.36.87 172.64.36.86 172.64.36.85 172.64.36.84 172.64.36.83 172.64.36.82 172.64.36.81 172.64.36.80 172.64.36.8 172.64.36.79 172.64.36.78 172.64.36.77 172.64.36.76 172.64.36.75 172.64.36.74 172.64.36.73 172.64.36.72 172.64.36.71 172.64.36.70 172.64.36.7 172.64.36.69 172.64.36.68 172.64.36.67 172.64.36.66 172.64.36.65 172.64.36.64 172.64.36.63 172.64.36.62 172.64.36.61 172.64.36.60 172.64.36.6 172.64.36.59 172.64.36.58 172.64.36.57 172.64.36.56 172.64.36.55 172.64.36.54 172.64.36.53 172.64.36.52 172.64.36.51 172.64.36.50 172.64.36.5 172.64.36.49 172.64.36.48 172.64.36.47 172.64.36.46 172.64.36.45 172.64.36.44 172.64.36.43 172.64.36.42 172.64.36.41 172.64.36.40 172.64.36.4 172.64.36.39 172.64.36.38 172.64.36.37 172.64.36.36 172.64.36.35 172.64.36.34 172.64.36.33 172.64.36.32 172.64.36.31 172.64.36.30 172.64.36.3 172.64.36.29 172.64.36.28 172.64.36.27 172.64.36.26 172.64.36.255 172.64.36.254 172.64.36.253 172.64.36.252 172.64.36.251 172.64.36.250 172.64.36.25 172.64.36.249 172.64.36.248 172.64.36.247 172.64.36.246 172.64.36.245 172.64.36.244 172.64.36.243 172.64.36.241 172.64.36.240 172.64.36.24 172.64.36.239 172.64.36.238 172.64.36.237 172.64.36.236 172.64.36.235 172.64.36.233 172.64.36.232 172.64.36.231 172.64.36.230 172.64.36.23 172.64.36.229 172.64.36.228 172.64.36.227 172.64.36.226 172.64.36.225 172.64.36.224 172.64.36.223 172.64.36.222 172.64.36.221 172.64.36.22 172.64.36.219 172.64.36.218 172.64.36.217 172.64.36.216 172.64.36.215 172.64.36.214 172.64.36.213 172.64.36.212 172.64.36.211 172.64.36.210 172.64.36.21 172.64.36.209 172.64.36.208 172.64.36.207 172.64.36.206 172.64.36.205 172.64.36.204 172.64.36.203 172.64.36.202 172.64.36.201 172.64.36.200 172.64.36.20 172.64.36.2 172.64.36.199 172.64.36.198 172.64.36.197 172.64.36.196 172.64.36.195 172.64.36.194 172.64.36.193 172.64.36.192 172.64.36.191 172.64.36.190 172.64.36.19 172.64.36.189 172.64.36.188 172.64.36.187 172.64.36.186 172.64.36.185 172.64.36.184 172.64.36.183 172.64.36.182 172.64.36.181 172.64.36.180 172.64.36.18 172.64.36.179 172.64.36.178 172.64.36.177 172.64.36.176 172.64.36.175 172.64.36.174 172.64.36.173 172.64.36.172 172.64.36.171 172.64.36.170 172.64.36.17 172.64.36.169 172.64.36.168 172.64.36.167 172.64.36.166 172.64.36.165 172.64.36.164 172.64.36.163 172.64.36.162 172.64.36.161 172.64.36.160 172.64.36.16 172.64.36.159 172.64.36.158 172.64.36.157 172.64.36.156 172.64.36.155 172.64.36.154 172.64.36.153 172.64.36.152 172.64.36.151 172.64.36.150 172.64.36.15 172.64.36.149 172.64.36.148 172.64.36.147 172.64.36.146 172.64.36.145 172.64.36.144 172.64.36.143 172.64.36.142 172.64.36.141 172.64.36.140 172.64.36.14 172.64.36.139 172.64.36.138 172.64.36.137 172.64.36.136 172.64.36.135 172.64.36.134 172.64.36.133 172.64.36.132 172.64.36.131 172.64.36.130 172.64.36.13 172.64.36.129 172.64.36.128 172.64.36.127 172.64.36.126 172.64.36.125 172.64.36.124 172.64.36.123 172.64.36.122 172.64.36.121 172.64.36.120 172.64.36.12 172.64.36.119 172.64.36.118 172.64.36.117 172.64.36.116 172.64.36.115 172.64.36.114 172.64.36.113 172.64.36.112 172.64.36.111 172.64.36.110 172.64.36.11 172.64.36.109 172.64.36.108 172.64.36.107 172.64.36.106 172.64.36.105 172.64.36.104 172.64.36.103 172.64.36.102 172.64.36.101 172.64.36.100 172.64.36.1 172.64.36.0 172.64.35.92 172.64.35.87 172.64.35.84 172.64.35.73 172.64.35.72 172.64.35.71 172.64.35.64 172.64.35.48 172.64.35.43 172.64.35.42 172.64.35.40 172.64.35.26 172.64.35.252 172.64.35.230 172.64.35.228 172.64.35.204 172.64.35.192 172.64.35.17 172.64.35.168 172.64.35.166 172.64.35.153 172.64.35.150 172.64.35.146 172.64.35.130 172.64.35.124 172.64.35.111 172.64.35.11 172.64.35.108 172.64.35.106 172.64.34.88 172.64.34.75 172.64.34.74 172.64.34.66 172.64.34.56 172.64.34.50 172.64.34.49 172.64.34.42 172.64.34.33 172.64.34.244 172.64.34.242 172.64.34.241 172.64.34.235 172.64.34.231 172.64.34.206 172.64.34.204 172.64.34.202 172.64.34.201 172.64.34.195 172.64.34.159 172.64.34.151 172.64.34.129 172.64.34.124 172.64.34.123 172.64.34.121 172.64.34.117 172.64.33.90 172.64.33.81 172.64.33.76 172.64.33.74 172.64.33.57 172.64.33.49 172.64.33.47 172.64.33.44 172.64.33.33 172.64.33.252 172.64.33.25 172.64.33.245 172.64.33.243 172.64.33.225 172.64.33.218 172.64.33.217 172.64.33.213 172.64.33.207 172.64.33.206 172.64.33.20 172.64.33.2 172.64.33.188 172.64.33.18 172.64.33.179 172.64.33.178 172.64.33.176 172.64.33.144 172.64.33.124 172.64.33.121 172.64.33.116 172.64.33.107 172.64.33.103 172.64.33.0 172.64.32.99 172.64.32.58 172.64.32.56 172.64.32.54 172.64.32.52 172.64.32.5 172.64.32.49 172.64.32.46 172.64.32.44 172.64.32.39 172.64.32.254 172.64.32.253 172.64.32.250 172.64.32.247 172.64.32.243 172.64.32.240 172.64.32.239 172.64.32.238 172.64.32.216 172.64.32.209 172.64.32.191 172.64.32.179 172.64.32.178 172.64.32.163 172.64.32.153 172.64.32.135 172.64.32.131 172.64.32.129 172.64.32.127 172.64.32.119 172.64.32.105 172.64.32.104 172.2.219.18 172.109.185.34 172.109.128.250 172.105.152.133 172.104.93.80 172.104.57.181 172.104.29.247 171.33.152.31 171.25.251.148 171.244.23.49 171.224.241.161 170.84.108.11 170.83.240.248 170.81.9.4 170.39.180.34 170.249.203.131 170.247.198.22 170.246.105.242 170.244.57.8 170.244.57.7 170.239.207.95 170.239.207.211 170.239.206.88 170.239.206.125 170.239.204.247 170.239.204.239 170.239.204.231 170.239.204.230 170.239.204.181 170.239.204.175 170.239.204.168 170.239.204.156 170.239.204.148 170.239.144.20 170.238.239.67 170.238.212.154 170.238.117.68 170.238.10.65 170.233.74.158 170.231.205.55 170.231.205.49 170.231.205.44 170.231.205.43 170.231.205.22 170.210.83.34 170.150.222.243 170.150.155.85 170.0.15.49 169.55.51.86 169.55.102.246 169.53.182.124 169.255.135.218 169.239.80.214 169.239.236.101 169.237.229.88 168.95.192.1 168.95.1.1 168.93.88.114 168.9.36.114 168.61.172.232 168.243.48.33 168.235.75.84 168.232.20.58 168.228.51.197 168.228.232.251 168.227.102.42 168.215.210.50 168.205.124.9 168.196.78.22 168.196.78.18 168.196.144.214 168.195.135.71 168.195.135.67 168.181.87.38 168.181.247.94 168.181.247.54 168.181.247.33 168.181.247.29 168.181.247.27 168.181.247.20 168.181.247.2 168.181.247.124 168.181.247.115 168.181.247.10 168.181.161.2 168.154.245.252 168.154.224.50 168.154.160.5 168.154.160.4 168.126.63.2 168.126.63.1 168.126.246.2 168.121.97.42 168.121.97.36 168.100.172.1 167.99.168.38 167.98.87.164 167.98.253.194 167.98.191.45 167.98.176.51 167.98.174.81 167.98.171.242 167.98.161.42 167.98.161.41 167.86.119.212 167.86.109.163 167.71.34.203 167.250.99.85 167.249.249.250 167.235.59.243 167.235.247.108 167.224.103.4 167.224.103.3 167.172.60.99 167.157.20.2 167.128.4.101 166.252.14.91 166.203.165.254 166.203.128.183 166.200.113.63 166.200.113.59 166.200.113.122 166.168.39.152 166.146.42.193 166.130.64.24 166.102.165.32 166.102.165.13 166.102.165.11 165.87.201.244 165.87.201.242 165.87.194.244 165.87.13.129 165.84.188.244 165.73.82.119 165.73.132.203 165.246.10.2 165.21.13.90 165.166.159.198 165.166.159.147 165.16.68.129 165.16.68.1 165.16.58.124 165.16.116.172 165.156.20.90 165.156.20.9 165.156.20.80 165.156.20.72 165.156.20.7 165.156.20.68 165.156.20.65 165.156.20.64 165.156.20.62 165.156.20.60 165.156.20.6 165.156.20.59 165.156.20.56 165.156.20.52 165.156.20.49 165.156.20.46 165.156.20.44 165.156.20.4 165.156.20.30 165.156.20.28 165.156.20.26 165.156.20.252 165.156.20.243 165.156.20.242 165.156.20.235 165.156.20.221 165.156.20.217 165.156.20.213 165.156.20.208 165.156.20.205 165.156.20.203 165.156.20.196 165.156.20.192 165.156.20.186 165.156.20.174 165.156.20.171 165.156.20.158 165.156.20.157 165.156.20.155 165.156.20.154 165.156.20.152 165.156.20.145 165.156.20.144 165.156.20.14 165.156.20.131 165.156.20.130 165.156.20.129 165.156.20.127 165.156.20.124 165.156.20.123 165.156.20.121 165.156.20.12 165.156.20.103 165.156.18.99 165.156.18.98 165.156.18.97 165.156.18.96 165.156.18.94 165.156.18.93 165.156.18.91 165.156.18.9 165.156.18.88 165.156.18.87 165.156.18.86 165.156.18.85 165.156.18.84 165.156.18.83 165.156.18.82 165.156.18.80 165.156.18.8 165.156.18.78 165.156.18.77 165.156.18.76 165.156.18.75 165.156.18.74 165.156.18.73 165.156.18.71 165.156.18.70 165.156.18.7 165.156.18.69 165.156.18.68 165.156.18.67 165.156.18.64 165.156.18.63 165.156.18.62 165.156.18.60 165.156.18.6 165.156.18.59 165.156.18.57 165.156.18.54 165.156.18.52 165.156.18.51 165.156.18.50 165.156.18.49 165.156.18.46 165.156.18.44 165.156.18.43 165.156.18.41 165.156.18.4 165.156.18.38 165.156.18.37 165.156.18.36 165.156.18.32 165.156.18.30 165.156.18.27 165.156.18.26 165.156.18.254 165.156.18.253 165.156.18.251 165.156.18.250 165.156.18.25 165.156.18.249 165.156.18.244 165.156.18.242 165.156.18.24 165.156.18.237 165.156.18.236 165.156.18.235 165.156.18.232 165.156.18.231 165.156.18.230 165.156.18.23 165.156.18.228 165.156.18.227 165.156.18.223 165.156.18.222 165.156.18.220 165.156.18.22 165.156.18.213 165.156.18.21 165.156.18.209 165.156.18.208 165.156.18.207 165.156.18.206 165.156.18.203 165.156.18.202 165.156.18.201 165.156.18.200 165.156.18.20 165.156.18.2 165.156.18.198 165.156.18.195 165.156.18.192 165.156.18.191 165.156.18.190 165.156.18.19 165.156.18.187 165.156.18.186 165.156.18.185 165.156.18.182 165.156.18.181 165.156.18.18 165.156.18.177 165.156.18.176 165.156.18.171 165.156.18.17 165.156.18.169 165.156.18.167 165.156.18.166 165.156.18.165 165.156.18.164 165.156.18.163 165.156.18.162 165.156.18.160 165.156.18.16 165.156.18.159 165.156.18.158 165.156.18.157 165.156.18.156 165.156.18.155 165.156.18.154 165.156.18.152 165.156.18.15 165.156.18.147 165.156.18.145 165.156.18.144 165.156.18.143 165.156.18.141 165.156.18.140 165.156.18.14 165.156.18.137 165.156.18.136 165.156.18.135 165.156.18.134 165.156.18.133 165.156.18.131 165.156.18.130 165.156.18.128 165.156.18.127 165.156.18.126 165.156.18.125 165.156.18.124 165.156.18.122 165.156.18.120 165.156.18.119 165.156.18.118 165.156.18.116 165.156.18.115 165.156.18.114 165.156.18.113 165.156.18.111 165.156.18.11 165.156.18.108 165.156.18.106 165.156.18.105 165.156.18.104 165.156.18.102 165.156.18.101 165.156.18.100 165.156.18.10 165.156.18.1 165.156.17.99 165.156.17.98 165.156.17.96 165.156.17.95 165.156.17.94 165.156.17.93 165.156.17.92 165.156.17.91 165.156.17.90 165.156.17.88 165.156.17.87 165.156.17.86 165.156.17.84 165.156.17.83 165.156.17.82 165.156.17.81 165.156.17.80 165.156.17.8 165.156.17.79 165.156.17.78 165.156.17.77 165.156.17.76 165.156.17.75 165.156.17.74 165.156.17.73 165.156.17.72 165.156.17.71 165.156.17.70 165.156.17.7 165.156.17.69 165.156.17.68 165.156.17.66 165.156.17.65 165.156.17.64 165.156.17.63 165.156.17.61 165.156.17.59 165.156.17.58 165.156.17.57 165.156.17.55 165.156.17.54 165.156.17.53 165.156.17.50 165.156.17.5 165.156.17.47 165.156.17.46 165.156.17.45 165.156.17.44 165.156.17.42 165.156.17.41 165.156.17.4 165.156.17.39 165.156.17.37 165.156.17.36 165.156.17.34 165.156.17.33 165.156.17.32 165.156.17.31 165.156.17.3 165.156.17.28 165.156.17.27 165.156.17.26 165.156.17.252 165.156.17.251 165.156.17.250 165.156.17.25 165.156.17.248 165.156.17.247 165.156.17.246 165.156.17.244 165.156.17.243 165.156.17.242 165.156.17.241 165.156.17.240 165.156.17.24 165.156.17.239 165.156.17.236 165.156.17.235 165.156.17.234 165.156.17.233 165.156.17.232 165.156.17.231 165.156.17.23 165.156.17.229 165.156.17.228 165.156.17.227 165.156.17.225 165.156.17.224 165.156.17.223 165.156.17.222 165.156.17.220 165.156.17.22 165.156.17.219 165.156.17.218 165.156.17.216 165.156.17.215 165.156.17.214 165.156.17.212 165.156.17.211 165.156.17.210 165.156.17.21 165.156.17.206 165.156.17.205 165.156.17.202 165.156.17.20 165.156.17.2 165.156.17.197 165.156.17.196 165.156.17.195 165.156.17.194 165.156.17.193 165.156.17.192 165.156.17.190 165.156.17.19 165.156.17.189 165.156.17.188 165.156.17.187 165.156.17.185 165.156.17.184 165.156.17.183 165.156.17.182 165.156.17.181 165.156.17.180 165.156.17.18 165.156.17.178 165.156.17.177 165.156.17.176 165.156.17.174 165.156.17.173 165.156.17.172 165.156.17.171 165.156.17.170 165.156.17.17 165.156.17.169 165.156.17.168 165.156.17.167 165.156.17.166 165.156.17.163 165.156.17.161 165.156.17.160 165.156.17.159 165.156.17.158 165.156.17.155 165.156.17.153 165.156.17.152 165.156.17.15 165.156.17.148 165.156.17.147 165.156.17.146 165.156.17.145 165.156.17.144 165.156.17.143 165.156.17.142 165.156.17.141 165.156.17.140 165.156.17.14 165.156.17.138 165.156.17.137 165.156.17.136 165.156.17.131 165.156.17.130 165.156.17.13 165.156.17.129 165.156.17.128 165.156.17.127 165.156.17.126 165.156.17.124 165.156.17.123 165.156.17.122 165.156.17.121 165.156.17.120 165.156.17.119 165.156.17.117 165.156.17.116 165.156.17.115 165.156.17.114 165.156.17.112 165.156.17.110 165.156.17.11 165.156.17.109 165.156.17.108 165.156.17.107 165.156.17.105 165.156.17.104 165.156.17.103 165.156.17.102 165.156.17.101 165.156.17.100 165.156.17.10 165.156.17.1 165.156.16.97 165.156.16.95 165.156.16.93 165.156.16.92 165.156.16.86 165.156.16.85 165.156.16.83 165.156.16.82 165.156.16.81 165.156.16.80 165.156.16.8 165.156.16.78 165.156.16.75 165.156.16.73 165.156.16.72 165.156.16.71 165.156.16.70 165.156.16.7 165.156.16.68 165.156.16.67 165.156.16.64 165.156.16.62 165.156.16.61 165.156.16.51 165.156.16.50 165.156.16.5 165.156.16.49 165.156.16.48 165.156.16.45 165.156.16.44 165.156.16.41 165.156.16.40 165.156.16.35 165.156.16.32 165.156.16.31 165.156.16.3 165.156.16.29 165.156.16.28 165.156.16.26 165.156.16.254 165.156.16.253 165.156.16.251 165.156.16.250 165.156.16.25 165.156.16.248 165.156.16.247 165.156.16.241 165.156.16.240 165.156.16.232 165.156.16.228 165.156.16.227 165.156.16.226 165.156.16.224 165.156.16.222 165.156.16.220 165.156.16.218 165.156.16.216 165.156.16.215 165.156.16.214 165.156.16.213 165.156.16.212 165.156.16.208 165.156.16.207 165.156.16.206 165.156.16.205 165.156.16.204 165.156.16.203 165.156.16.202 165.156.16.20 165.156.16.2 165.156.16.198 165.156.16.197 165.156.16.196 165.156.16.192 165.156.16.191 165.156.16.19 165.156.16.189 165.156.16.186 165.156.16.184 165.156.16.183 165.156.16.18 165.156.16.178 165.156.16.177 165.156.16.176 165.156.16.175 165.156.16.173 165.156.16.172 165.156.16.168 165.156.16.165 165.156.16.163 165.156.16.160 165.156.16.16 165.156.16.159 165.156.16.158 165.156.16.157 165.156.16.156 165.156.16.154 165.156.16.151 165.156.16.149 165.156.16.148 165.156.16.147 165.156.16.143 165.156.16.142 165.156.16.141 165.156.16.140 165.156.16.14 165.156.16.133 165.156.16.131 165.156.16.130 165.156.16.13 165.156.16.129 165.156.16.127 165.156.16.126 165.156.16.124 165.156.16.122 165.156.16.121 165.156.16.120 165.156.16.119 165.156.16.118 165.156.16.116 165.156.16.112 165.156.16.109 165.156.16.108 165.156.16.104 165.156.16.102 165.156.16.101 165.156.16.100 165.156.16.10 165.140.185.34 165.140.185.254 164.77.156.235 164.77.129.37 164.68.108.7 164.68.108.101 164.163.74.82 164.163.133.21 164.163.1.90 164.132.210.88 164.132.170.198 164.132.167.189 164.124.107.9 164.124.101.2 163.47.202.150 163.44.49.226 163.182.174.241 163.172.31.111 162.75.12.97 162.75.12.201 162.253.133.97 162.251.82.99 162.251.82.98 162.251.82.97 162.251.82.96 162.251.82.95 162.251.82.94 162.251.82.93 162.251.82.92 162.251.82.91 162.251.82.90 162.251.82.9 162.251.82.89 162.251.82.88 162.251.82.87 162.251.82.86 162.251.82.85 162.251.82.84 162.251.82.83 162.251.82.82 162.251.82.81 162.251.82.80 162.251.82.8 162.251.82.79 162.251.82.78 162.251.82.77 162.251.82.76 162.251.82.75 162.251.82.74 162.251.82.73 162.251.82.72 162.251.82.71 162.251.82.7 162.251.82.69 162.251.82.68 162.251.82.67 162.251.82.66 162.251.82.65 162.251.82.64 162.251.82.63 162.251.82.62 162.251.82.61 162.251.82.60 162.251.82.6 162.251.82.59 162.251.82.58 162.251.82.57 162.251.82.56 162.251.82.55 162.251.82.54 162.251.82.53 162.251.82.52 162.251.82.51 162.251.82.50 162.251.82.5 162.251.82.49 162.251.82.48 162.251.82.47 162.251.82.46 162.251.82.45 162.251.82.44 162.251.82.42 162.251.82.41 162.251.82.40 162.251.82.4 162.251.82.39 162.251.82.37 162.251.82.36 162.251.82.35 162.251.82.34 162.251.82.33 162.251.82.32 162.251.82.31 162.251.82.30 162.251.82.3 162.251.82.29 162.251.82.28 162.251.82.27 162.251.82.25 162.251.82.245 162.251.82.243 162.251.82.242 162.251.82.241 162.251.82.240 162.251.82.24 162.251.82.239 162.251.82.238 162.251.82.237 162.251.82.236 162.251.82.235 162.251.82.234 162.251.82.233 162.251.82.232 162.251.82.231 162.251.82.230 162.251.82.23 162.251.82.229 162.251.82.228 162.251.82.227 162.251.82.226 162.251.82.225 162.251.82.224 162.251.82.223 162.251.82.222 162.251.82.221 162.251.82.220 162.251.82.22 162.251.82.219 162.251.82.218 162.251.82.217 162.251.82.216 162.251.82.215 162.251.82.214 162.251.82.213 162.251.82.212 162.251.82.211 162.251.82.210 162.251.82.21 162.251.82.209 162.251.82.208 162.251.82.207 162.251.82.206 162.251.82.205 162.251.82.204 162.251.82.203 162.251.82.202 162.251.82.201 162.251.82.200 162.251.82.20 162.251.82.199 162.251.82.198 162.251.82.197 162.251.82.196 162.251.82.195 162.251.82.194 162.251.82.193 162.251.82.192 162.251.82.191 162.251.82.190 162.251.82.19 162.251.82.189 162.251.82.188 162.251.82.187 162.251.82.186 162.251.82.185 162.251.82.184 162.251.82.183 162.251.82.182 162.251.82.181 162.251.82.180 162.251.82.18 162.251.82.179 162.251.82.178 162.251.82.177 162.251.82.176 162.251.82.175 162.251.82.174 162.251.82.173 162.251.82.172 162.251.82.171 162.251.82.170 162.251.82.17 162.251.82.169 162.251.82.168 162.251.82.167 162.251.82.166 162.251.82.165 162.251.82.164 162.251.82.163 162.251.82.162 162.251.82.161 162.251.82.160 162.251.82.16 162.251.82.159 162.251.82.158 162.251.82.157 162.251.82.156 162.251.82.155 162.251.82.154 162.251.82.153 162.251.82.152 162.251.82.151 162.251.82.150 162.251.82.15 162.251.82.149 162.251.82.148 162.251.82.147 162.251.82.146 162.251.82.145 162.251.82.144 162.251.82.143 162.251.82.142 162.251.82.141 162.251.82.140 162.251.82.14 162.251.82.139 162.251.82.138 162.251.82.137 162.251.82.136 162.251.82.135 162.251.82.134 162.251.82.133 162.251.82.132 162.251.82.131 162.251.82.130 162.251.82.13 162.251.82.129 162.251.82.128 162.251.82.127 162.251.82.126 162.251.82.12 162.251.82.117 162.251.82.116 162.251.82.115 162.251.82.114 162.251.82.113 162.251.82.112 162.251.82.111 162.251.82.110 162.251.82.11 162.251.82.109 162.251.82.108 162.251.82.107 162.251.82.106 162.251.82.105 162.251.82.104 162.251.82.103 162.251.82.102 162.251.82.101 162.251.82.100 162.251.82.10 162.251.82.1 162.251.82.0 162.251.158.88 162.251.146.91 162.247.183.205 162.246.127.108 162.243.172.61 162.241.132.129 162.223.90.104 162.221.187.229 162.218.154.2 162.212.19.235 162.211.33.243 162.210.104.17 162.191.88.204 162.191.201.179 162.19.92.206 162.19.58.10 162.17.81.57 162.159.9.87 162.159.9.83 162.159.9.78 162.159.9.68 162.159.9.66 162.159.9.53 162.159.9.46 162.159.9.4 162.159.9.31 162.159.9.29 162.159.9.250 162.159.9.248 162.159.9.24 162.159.9.238 162.159.9.233 162.159.9.229 162.159.9.219 162.159.9.216 162.159.9.214 162.159.9.211 162.159.9.21 162.159.9.204 162.159.9.185 162.159.9.167 162.159.9.160 162.159.9.159 162.159.9.155 162.159.9.147 162.159.9.142 162.159.9.140 162.159.9.135 162.159.9.119 162.159.9.105 162.159.9.103 162.159.8.92 162.159.8.82 162.159.8.80 162.159.8.76 162.159.8.46 162.159.8.45 162.159.8.38 162.159.8.36 162.159.8.32 162.159.8.29 162.159.8.27 162.159.8.254 162.159.8.252 162.159.8.241 162.159.8.232 162.159.8.215 162.159.8.21 162.159.8.194 162.159.8.192 162.159.8.175 162.159.8.159 162.159.8.146 162.159.8.136 162.159.8.128 162.159.8.118 162.159.8.114 162.159.8.111 162.159.8.100 162.159.7.99 162.159.7.89 162.159.7.85 162.159.7.84 162.159.7.79 162.159.7.77 162.159.7.248 162.159.7.247 162.159.7.215 162.159.7.211 162.159.7.201 162.159.7.199 162.159.7.188 162.159.7.183 162.159.7.18 162.159.7.164 162.159.7.163 162.159.7.159 162.159.7.149 162.159.7.140 162.159.7.139 162.159.7.129 162.159.7.126 162.159.7.119 162.159.7.113 162.159.7.101 162.159.7.10 162.159.7.1 162.159.6.99 162.159.6.64 162.159.6.62 162.159.6.45 162.159.6.35 162.159.6.28 162.159.6.254 162.159.6.252 162.159.6.250 162.159.6.229 162.159.6.215 162.159.6.211 162.159.6.203 162.159.6.189 162.159.6.178 162.159.6.177 162.159.6.175 162.159.6.169 162.159.6.138 162.159.6.134 162.159.6.123 162.159.6.107 162.159.58.98 162.159.58.94 162.159.58.92 162.159.58.89 162.159.58.86 162.159.58.37 162.159.58.251 162.159.58.223 162.159.58.219 162.159.58.217 162.159.58.214 162.159.58.201 162.159.58.198 162.159.58.188 162.159.58.186 162.159.58.185 162.159.58.183 162.159.58.179 162.159.58.166 162.159.58.156 162.159.58.14 162.159.58.133 162.159.58.131 162.159.58.125 162.159.58.119 162.159.58.115 162.159.58.111 162.159.58.110 162.159.58.102 162.159.56.86 162.159.56.84 162.159.56.75 162.159.56.59 162.159.56.47 162.159.56.43 162.159.56.18 162.159.50.79 162.159.50.74 162.159.50.4 162.159.50.3 162.159.50.27 162.159.5.73 162.159.5.71 162.159.5.64 162.159.5.49 162.159.5.44 162.159.5.31 162.159.5.228 162.159.5.226 162.159.5.22 162.159.5.211 162.159.5.206 162.159.5.20 162.159.5.194 162.159.5.18 162.159.5.171 162.159.5.170 162.159.5.165 162.159.5.161 162.159.5.152 162.159.5.149 162.159.5.147 162.159.5.137 162.159.5.125 162.159.5.123 162.159.5.118 162.159.5.104 162.159.5.101 162.159.46.92 162.159.46.90 162.159.46.8 162.159.46.73 162.159.46.71 162.159.46.70 162.159.46.56 162.159.46.55 162.159.46.53 162.159.46.51 162.159.46.48 162.159.46.47 162.159.46.42 162.159.46.38 162.159.46.28 162.159.46.26 162.159.46.250 162.159.46.249 162.159.46.247 162.159.46.239 162.159.46.232 162.159.46.23 162.159.46.224 162.159.46.223 162.159.46.221 162.159.46.219 162.159.46.218 162.159.46.214 162.159.46.202 162.159.46.197 162.159.46.194 162.159.46.190 162.159.46.185 162.159.46.182 162.159.46.18 162.159.46.177 162.159.46.175 162.159.46.172 162.159.46.167 162.159.46.166 162.159.46.165 162.159.46.161 162.159.46.151 162.159.46.15 162.159.46.147 162.159.46.144 162.159.46.134 162.159.46.120 162.159.46.119 162.159.46.117 162.159.46.115 162.159.46.1 162.159.46.0 162.159.45.99 162.159.45.98 162.159.45.97 162.159.45.96 162.159.45.95 162.159.45.94 162.159.45.93 162.159.45.92 162.159.45.91 162.159.45.90 162.159.45.9 162.159.45.89 162.159.45.88 162.159.45.87 162.159.45.86 162.159.45.85 162.159.45.84 162.159.45.83 162.159.45.82 162.159.45.81 162.159.45.80 162.159.45.8 162.159.45.79 162.159.45.78 162.159.45.77 162.159.45.76 162.159.45.75 162.159.45.74 162.159.45.73 162.159.45.72 162.159.45.71 162.159.45.70 162.159.45.7 162.159.45.69 162.159.45.68 162.159.45.67 162.159.45.66 162.159.45.65 162.159.45.64 162.159.45.63 162.159.45.62 162.159.45.61 162.159.45.60 162.159.45.6 162.159.45.59 162.159.45.58 162.159.45.57 162.159.45.56 162.159.45.55 162.159.45.54 162.159.45.53 162.159.45.52 162.159.45.51 162.159.45.50 162.159.45.5 162.159.45.49 162.159.45.48 162.159.45.47 162.159.45.46 162.159.45.45 162.159.45.44 162.159.45.43 162.159.45.42 162.159.45.41 162.159.45.40 162.159.45.4 162.159.45.39 162.159.45.38 162.159.45.37 162.159.45.36 162.159.45.35 162.159.45.34 162.159.45.33 162.159.45.32 162.159.45.31 162.159.45.30 162.159.45.3 162.159.45.29 162.159.45.28 162.159.45.27 162.159.45.26 162.159.45.254 162.159.45.253 162.159.45.252 162.159.45.251 162.159.45.250 162.159.45.25 162.159.45.249 162.159.45.248 162.159.45.247 162.159.45.246 162.159.45.245 162.159.45.244 162.159.45.243 162.159.45.242 162.159.45.241 162.159.45.240 162.159.45.24 162.159.45.239 162.159.45.238 162.159.45.237 162.159.45.236 162.159.45.235 162.159.45.234 162.159.45.233 162.159.45.232 162.159.45.231 162.159.45.230 162.159.45.23 162.159.45.229 162.159.45.228 162.159.45.227 162.159.45.226 162.159.45.225 162.159.45.224 162.159.45.223 162.159.45.222 162.159.45.221 162.159.45.220 162.159.45.22 162.159.45.219 162.159.45.218 162.159.45.217 162.159.45.216 162.159.45.215 162.159.45.214 162.159.45.213 162.159.45.212 162.159.45.211 162.159.45.210 162.159.45.21 162.159.45.209 162.159.45.208 162.159.45.207 162.159.45.206 162.159.45.205 162.159.45.204 162.159.45.203 162.159.45.202 162.159.45.201 162.159.45.200 162.159.45.20 162.159.45.2 162.159.45.199 162.159.45.198 162.159.45.197 162.159.45.196 162.159.45.195 162.159.45.194 162.159.45.193 162.159.45.192 162.159.45.191 162.159.45.190 162.159.45.19 162.159.45.189 162.159.45.188 162.159.45.187 162.159.45.186 162.159.45.185 162.159.45.184 162.159.45.183 162.159.45.182 162.159.45.181 162.159.45.180 162.159.45.18 162.159.45.179 162.159.45.178 162.159.45.177 162.159.45.176 162.159.45.175 162.159.45.174 162.159.45.173 162.159.45.172 162.159.45.171 162.159.45.170 162.159.45.17 162.159.45.169 162.159.45.168 162.159.45.167 162.159.45.166 162.159.45.165 162.159.45.164 162.159.45.163 162.159.45.162 162.159.45.161 162.159.45.160 162.159.45.16 162.159.45.159 162.159.45.158 162.159.45.157 162.159.45.156 162.159.45.155 162.159.45.154 162.159.45.153 162.159.45.152 162.159.45.151 162.159.45.150 162.159.45.15 162.159.45.149 162.159.45.148 162.159.45.147 162.159.45.146 162.159.45.145 162.159.45.144 162.159.45.143 162.159.45.142 162.159.45.141 162.159.45.140 162.159.45.14 162.159.45.139 162.159.45.138 162.159.45.137 162.159.45.136 162.159.45.135 162.159.45.134 162.159.45.133 162.159.45.132 162.159.45.131 162.159.45.130 162.159.45.13 162.159.45.129 162.159.45.128 162.159.45.127 162.159.45.126 162.159.45.125 162.159.45.124 162.159.45.123 162.159.45.122 162.159.45.121 162.159.45.120 162.159.45.12 162.159.45.119 162.159.45.118 162.159.45.117 162.159.45.116 162.159.45.115 162.159.45.114 162.159.45.113 162.159.45.112 162.159.45.111 162.159.45.110 162.159.45.11 162.159.45.109 162.159.45.108 162.159.45.107 162.159.45.106 162.159.45.105 162.159.45.104 162.159.45.103 162.159.45.102 162.159.45.101 162.159.45.100 162.159.45.10 162.159.45.1 162.159.45.0 162.159.44.99 162.159.44.98 162.159.44.97 162.159.44.96 162.159.44.95 162.159.44.94 162.159.44.93 162.159.44.92 162.159.44.91 162.159.44.90 162.159.44.9 162.159.44.89 162.159.44.88 162.159.44.87 162.159.44.86 162.159.44.85 162.159.44.84 162.159.44.83 162.159.44.82 162.159.44.81 162.159.44.80 162.159.44.8 162.159.44.79 162.159.44.78 162.159.44.77 162.159.44.76 162.159.44.75 162.159.44.74 162.159.44.73 162.159.44.72 162.159.44.71 162.159.44.70 162.159.44.7 162.159.44.69 162.159.44.68 162.159.44.67 162.159.44.66 162.159.44.65 162.159.44.64 162.159.44.63 162.159.44.62 162.159.44.61 162.159.44.60 162.159.44.6 162.159.44.59 162.159.44.58 162.159.44.57 162.159.44.56 162.159.44.55 162.159.44.54 162.159.44.53 162.159.44.52 162.159.44.51 162.159.44.50 162.159.44.5 162.159.44.49 162.159.44.48 162.159.44.47 162.159.44.46 162.159.44.45 162.159.44.44 162.159.44.43 162.159.44.42 162.159.44.41 162.159.44.40 162.159.44.4 162.159.44.39 162.159.44.38 162.159.44.37 162.159.44.36 162.159.44.35 162.159.44.34 162.159.44.33 162.159.44.32 162.159.44.31 162.159.44.30 162.159.44.3 162.159.44.29 162.159.44.28 162.159.44.27 162.159.44.26 162.159.44.255 162.159.44.254 162.159.44.253 162.159.44.252 162.159.44.251 162.159.44.250 162.159.44.25 162.159.44.249 162.159.44.248 162.159.44.247 162.159.44.246 162.159.44.245 162.159.44.244 162.159.44.243 162.159.44.242 162.159.44.241 162.159.44.240 162.159.44.24 162.159.44.239 162.159.44.238 162.159.44.237 162.159.44.236 162.159.44.235 162.159.44.234 162.159.44.233 162.159.44.232 162.159.44.231 162.159.44.230 162.159.44.23 162.159.44.229 162.159.44.228 162.159.44.227 162.159.44.226 162.159.44.225 162.159.44.224 162.159.44.223 162.159.44.222 162.159.44.221 162.159.44.220 162.159.44.22 162.159.44.219 162.159.44.218 162.159.44.217 162.159.44.216 162.159.44.215 162.159.44.214 162.159.44.213 162.159.44.212 162.159.44.211 162.159.44.210 162.159.44.21 162.159.44.209 162.159.44.208 162.159.44.207 162.159.44.206 162.159.44.205 162.159.44.204 162.159.44.203 162.159.44.202 162.159.44.201 162.159.44.200 162.159.44.20 162.159.44.2 162.159.44.199 162.159.44.198 162.159.44.197 162.159.44.196 162.159.44.195 162.159.44.194 162.159.44.193 162.159.44.192 162.159.44.191 162.159.44.190 162.159.44.19 162.159.44.189 162.159.44.188 162.159.44.187 162.159.44.186 162.159.44.185 162.159.44.184 162.159.44.183 162.159.44.182 162.159.44.181 162.159.44.180 162.159.44.18 162.159.44.179 162.159.44.178 162.159.44.177 162.159.44.176 162.159.44.175 162.159.44.174 162.159.44.173 162.159.44.172 162.159.44.171 162.159.44.170 162.159.44.17 162.159.44.169 162.159.44.168 162.159.44.167 162.159.44.166 162.159.44.165 162.159.44.164 162.159.44.163 162.159.44.162 162.159.44.161 162.159.44.160 162.159.44.16 162.159.44.159 162.159.44.158 162.159.44.157 162.159.44.156 162.159.44.155 162.159.44.154 162.159.44.153 162.159.44.152 162.159.44.151 162.159.44.150 162.159.44.15 162.159.44.149 162.159.44.148 162.159.44.147 162.159.44.146 162.159.44.145 162.159.44.144 162.159.44.143 162.159.44.142 162.159.44.141 162.159.44.140 162.159.44.14 162.159.44.139 162.159.44.138 162.159.44.137 162.159.44.136 162.159.44.135 162.159.44.134 162.159.44.133 162.159.44.132 162.159.44.131 162.159.44.130 162.159.44.13 162.159.44.129 162.159.44.128 162.159.44.127 162.159.44.126 162.159.44.125 162.159.44.124 162.159.44.123 162.159.44.122 162.159.44.121 162.159.44.120 162.159.44.12 162.159.44.119 162.159.44.118 162.159.44.117 162.159.44.116 162.159.44.115 162.159.44.114 162.159.44.113 162.159.44.112 162.159.44.111 162.159.44.110 162.159.44.11 162.159.44.109 162.159.44.108 162.159.44.107 162.159.44.106 162.159.44.105 162.159.44.104 162.159.44.103 162.159.44.102 162.159.44.101 162.159.44.100 162.159.44.10 162.159.44.1 162.159.44.0 162.159.43.99 162.159.43.98 162.159.43.97 162.159.43.96 162.159.43.95 162.159.43.94 162.159.43.93 162.159.43.92 162.159.43.91 162.159.43.90 162.159.43.9 162.159.43.89 162.159.43.88 162.159.43.87 162.159.43.86 162.159.43.85 162.159.43.84 162.159.43.83 162.159.43.82 162.159.43.81 162.159.43.80 162.159.43.8 162.159.43.79 162.159.43.78 162.159.43.77 162.159.43.76 162.159.43.75 162.159.43.74 162.159.43.73 162.159.43.72 162.159.43.71 162.159.43.70 162.159.43.7 162.159.43.69 162.159.43.68 162.159.43.67 162.159.43.66 162.159.43.65 162.159.43.64 162.159.43.63 162.159.43.62 162.159.43.61 162.159.43.60 162.159.43.6 162.159.43.59 162.159.43.58 162.159.43.57 162.159.43.56 162.159.43.55 162.159.43.54 162.159.43.53 162.159.43.52 162.159.43.51 162.159.43.50 162.159.43.5 162.159.43.49 162.159.43.48 162.159.43.47 162.159.43.46 162.159.43.45 162.159.43.44 162.159.43.43 162.159.43.42 162.159.43.41 162.159.43.40 162.159.43.4 162.159.43.39 162.159.43.38 162.159.43.37 162.159.43.36 162.159.43.35 162.159.43.34 162.159.43.33 162.159.43.32 162.159.43.31 162.159.43.30 162.159.43.3 162.159.43.29 162.159.43.28 162.159.43.27 162.159.43.26 162.159.43.254 162.159.43.253 162.159.43.252 162.159.43.251 162.159.43.250 162.159.43.25 162.159.43.249 162.159.43.248 162.159.43.247 162.159.43.246 162.159.43.245 162.159.43.244 162.159.43.243 162.159.43.242 162.159.43.241 162.159.43.240 162.159.43.24 162.159.43.239 162.159.43.238 162.159.43.237 162.159.43.236 162.159.43.235 162.159.43.234 162.159.43.233 162.159.43.232 162.159.43.231 162.159.43.230 162.159.43.23 162.159.43.229 162.159.43.228 162.159.43.227 162.159.43.226 162.159.43.225 162.159.43.224 162.159.43.223 162.159.43.222 162.159.43.221 162.159.43.220 162.159.43.22 162.159.43.219 162.159.43.218 162.159.43.217 162.159.43.216 162.159.43.215 162.159.43.214 162.159.43.213 162.159.43.212 162.159.43.211 162.159.43.210 162.159.43.21 162.159.43.209 162.159.43.208 162.159.43.207 162.159.43.206 162.159.43.205 162.159.43.204 162.159.43.203 162.159.43.202 162.159.43.201 162.159.43.200 162.159.43.20 162.159.43.2 162.159.43.199 162.159.43.198 162.159.43.197 162.159.43.196 162.159.43.195 162.159.43.194 162.159.43.193 162.159.43.192 162.159.43.191 162.159.43.190 162.159.43.19 162.159.43.189 162.159.43.188 162.159.43.187 162.159.43.186 162.159.43.185 162.159.43.184 162.159.43.183 162.159.43.182 162.159.43.181 162.159.43.180 162.159.43.18 162.159.43.179 162.159.43.178 162.159.43.177 162.159.43.176 162.159.43.175 162.159.43.174 162.159.43.173 162.159.43.172 162.159.43.171 162.159.43.170 162.159.43.17 162.159.43.169 162.159.43.168 162.159.43.167 162.159.43.166 162.159.43.165 162.159.43.164 162.159.43.163 162.159.43.162 162.159.43.161 162.159.43.160 162.159.43.16 162.159.43.159 162.159.43.158 162.159.43.157 162.159.43.156 162.159.43.155 162.159.43.154 162.159.43.153 162.159.43.152 162.159.43.151 162.159.43.150 162.159.43.15 162.159.43.149 162.159.43.148 162.159.43.147 162.159.43.146 162.159.43.145 162.159.43.144 162.159.43.143 162.159.43.142 162.159.43.141 162.159.43.140 162.159.43.14 162.159.43.139 162.159.43.138 162.159.43.137 162.159.43.136 162.159.43.135 162.159.43.134 162.159.43.133 162.159.43.132 162.159.43.131 162.159.43.130 162.159.43.13 162.159.43.129 162.159.43.128 162.159.43.127 162.159.43.126 162.159.43.125 162.159.43.124 162.159.43.123 162.159.43.122 162.159.43.121 162.159.43.120 162.159.43.12 162.159.43.119 162.159.43.118 162.159.43.117 162.159.43.116 162.159.43.115 162.159.43.114 162.159.43.113 162.159.43.112 162.159.43.111 162.159.43.110 162.159.43.11 162.159.43.109 162.159.43.108 162.159.43.107 162.159.43.106 162.159.43.105 162.159.43.104 162.159.43.103 162.159.43.102 162.159.43.101 162.159.43.100 162.159.43.10 162.159.43.1 162.159.43.0 162.159.42.99 162.159.42.98 162.159.42.97 162.159.42.96 162.159.42.95 162.159.42.94 162.159.42.93 162.159.42.92 162.159.42.91 162.159.42.90 162.159.42.9 162.159.42.89 162.159.42.88 162.159.42.87 162.159.42.86 162.159.42.85 162.159.42.84 162.159.42.83 162.159.42.82 162.159.42.81 162.159.42.80 162.159.42.8 162.159.42.79 162.159.42.78 162.159.42.77 162.159.42.76 162.159.42.75 162.159.42.74 162.159.42.73 162.159.42.72 162.159.42.71 162.159.42.70 162.159.42.7 162.159.42.69 162.159.42.68 162.159.42.67 162.159.42.66 162.159.42.65 162.159.42.64 162.159.42.63 162.159.42.62 162.159.42.61 162.159.42.60 162.159.42.6 162.159.42.59 162.159.42.58 162.159.42.57 162.159.42.56 162.159.42.55 162.159.42.54 162.159.42.53 162.159.42.52 162.159.42.51 162.159.42.50 162.159.42.5 162.159.42.49 162.159.42.48 162.159.42.47 162.159.42.46 162.159.42.45 162.159.42.44 162.159.42.43 162.159.42.42 162.159.42.41 162.159.42.40 162.159.42.4 162.159.42.39 162.159.42.38 162.159.42.37 162.159.42.36 162.159.42.35 162.159.42.34 162.159.42.33 162.159.42.32 162.159.42.31 162.159.42.30 162.159.42.3 162.159.42.29 162.159.42.28 162.159.42.27 162.159.42.26 162.159.42.255 162.159.42.254 162.159.42.253 162.159.42.252 162.159.42.251 162.159.42.250 162.159.42.25 162.159.42.249 162.159.42.248 162.159.42.247 162.159.42.246 162.159.42.245 162.159.42.244 162.159.42.243 162.159.42.242 162.159.42.241 162.159.42.240 162.159.42.24 162.159.42.239 162.159.42.238 162.159.42.237 162.159.42.236 162.159.42.235 162.159.42.234 162.159.42.233 162.159.42.232 162.159.42.231 162.159.42.230 162.159.42.23 162.159.42.229 162.159.42.228 162.159.42.227 162.159.42.226 162.159.42.225 162.159.42.224 162.159.42.223 162.159.42.222 162.159.42.221 162.159.42.220 162.159.42.22 162.159.42.219 162.159.42.218 162.159.42.217 162.159.42.216 162.159.42.215 162.159.42.214 162.159.42.213 162.159.42.212 162.159.42.211 162.159.42.210 162.159.42.21 162.159.42.209 162.159.42.208 162.159.42.207 162.159.42.206 162.159.42.205 162.159.42.204 162.159.42.203 162.159.42.202 162.159.42.201 162.159.42.200 162.159.42.20 162.159.42.2 162.159.42.199 162.159.42.198 162.159.42.197 162.159.42.196 162.159.42.195 162.159.42.194 162.159.42.193 162.159.42.192 162.159.42.191 162.159.42.190 162.159.42.19 162.159.42.189 162.159.42.188 162.159.42.187 162.159.42.186 162.159.42.185 162.159.42.184 162.159.42.183 162.159.42.182 162.159.42.181 162.159.42.180 162.159.42.18 162.159.42.179 162.159.42.178 162.159.42.177 162.159.42.176 162.159.42.175 162.159.42.174 162.159.42.173 162.159.42.172 162.159.42.171 162.159.42.170 162.159.42.17 162.159.42.169 162.159.42.168 162.159.42.167 162.159.42.166 162.159.42.165 162.159.42.164 162.159.42.163 162.159.42.162 162.159.42.161 162.159.42.160 162.159.42.16 162.159.42.159 162.159.42.158 162.159.42.157 162.159.42.156 162.159.42.155 162.159.42.154 162.159.42.153 162.159.42.152 162.159.42.151 162.159.42.150 162.159.42.15 162.159.42.149 162.159.42.148 162.159.42.147 162.159.42.146 162.159.42.145 162.159.42.144 162.159.42.143 162.159.42.142 162.159.42.141 162.159.42.140 162.159.42.14 162.159.42.139 162.159.42.138 162.159.42.137 162.159.42.136 162.159.42.135 162.159.42.134 162.159.42.133 162.159.42.132 162.159.42.131 162.159.42.130 162.159.42.13 162.159.42.129 162.159.42.128 162.159.42.127 162.159.42.126 162.159.42.125 162.159.42.124 162.159.42.123 162.159.42.122 162.159.42.121 162.159.42.120 162.159.42.12 162.159.42.119 162.159.42.118 162.159.42.117 162.159.42.116 162.159.42.115 162.159.42.114 162.159.42.113 162.159.42.112 162.159.42.111 162.159.42.110 162.159.42.11 162.159.42.109 162.159.42.108 162.159.42.107 162.159.42.106 162.159.42.105 162.159.42.104 162.159.42.103 162.159.42.102 162.159.42.101 162.159.42.100 162.159.42.10 162.159.42.1 162.159.42.0 162.159.41.84 162.159.41.77 162.159.41.75 162.159.41.70 162.159.41.65 162.159.41.64 162.159.41.59 162.159.41.42 162.159.41.36 162.159.41.35 162.159.41.34 162.159.41.32 162.159.41.28 162.159.41.27 162.159.41.235 162.159.41.223 162.159.41.218 162.159.41.202 162.159.41.201 162.159.41.191 162.159.41.182 162.159.41.18 162.159.41.170 162.159.41.17 162.159.41.158 162.159.41.151 162.159.41.147 162.159.41.134 162.159.41.110 162.159.41.107 162.159.41.104 162.159.41.1 162.159.41.0 162.159.40.91 162.159.40.86 162.159.40.83 162.159.40.74 162.159.40.42 162.159.40.27 162.159.40.229 162.159.40.226 162.159.40.215 162.159.40.209 162.159.40.207 162.159.40.203 162.159.40.202 162.159.40.189 162.159.40.186 162.159.40.184 162.159.40.183 162.159.40.182 162.159.40.172 162.159.40.170 162.159.40.165 162.159.40.15 162.159.40.1 162.159.4.95 162.159.4.86 162.159.4.81 162.159.4.71 162.159.4.70 162.159.4.66 162.159.4.62 162.159.4.6 162.159.4.59 162.159.4.57 162.159.4.56 162.159.4.45 162.159.4.42 162.159.4.37 162.159.4.3 162.159.4.29 162.159.4.27 162.159.4.25 162.159.4.248 162.159.4.244 162.159.4.243 162.159.4.227 162.159.4.220 162.159.4.208 162.159.4.198 162.159.4.193 162.159.4.188 162.159.4.16 162.159.4.158 162.159.4.147 162.159.4.142 162.159.4.135 162.159.4.123 162.159.4.111 162.159.4.106 162.159.4.100 162.159.39.99 162.159.39.98 162.159.39.97 162.159.39.96 162.159.39.95 162.159.39.94 162.159.39.93 162.159.39.92 162.159.39.91 162.159.39.90 162.159.39.9 162.159.39.89 162.159.39.88 162.159.39.87 162.159.39.86 162.159.39.85 162.159.39.84 162.159.39.83 162.159.39.82 162.159.39.81 162.159.39.80 162.159.39.8 162.159.39.79 162.159.39.78 162.159.39.77 162.159.39.76 162.159.39.75 162.159.39.74 162.159.39.73 162.159.39.72 162.159.39.71 162.159.39.70 162.159.39.7 162.159.39.69 162.159.39.67 162.159.39.66 162.159.39.65 162.159.39.64 162.159.39.63 162.159.39.62 162.159.39.61 162.159.39.60 162.159.39.6 162.159.39.59 162.159.39.58 162.159.39.57 162.159.39.56 162.159.39.55 162.159.39.54 162.159.39.53 162.159.39.52 162.159.39.51 162.159.39.50 162.159.39.5 162.159.39.49 162.159.39.48 162.159.39.47 162.159.39.46 162.159.39.45 162.159.39.44 162.159.39.43 162.159.39.42 162.159.39.41 162.159.39.40 162.159.39.4 162.159.39.39 162.159.39.38 162.159.39.37 162.159.39.36 162.159.39.35 162.159.39.34 162.159.39.33 162.159.39.32 162.159.39.31 162.159.39.30 162.159.39.3 162.159.39.29 162.159.39.28 162.159.39.27 162.159.39.26 162.159.39.254 162.159.39.253 162.159.39.252 162.159.39.251 162.159.39.250 162.159.39.25 162.159.39.249 162.159.39.248 162.159.39.247 162.159.39.246 162.159.39.245 162.159.39.244 162.159.39.243 162.159.39.242 162.159.39.241 162.159.39.240 162.159.39.24 162.159.39.239 162.159.39.238 162.159.39.237 162.159.39.236 162.159.39.235 162.159.39.234 162.159.39.233 162.159.39.232 162.159.39.231 162.159.39.230 162.159.39.23 162.159.39.229 162.159.39.228 162.159.39.227 162.159.39.226 162.159.39.225 162.159.39.224 162.159.39.223 162.159.39.222 162.159.39.221 162.159.39.220 162.159.39.22 162.159.39.219 162.159.39.218 162.159.39.217 162.159.39.216 162.159.39.215 162.159.39.214 162.159.39.213 162.159.39.212 162.159.39.211 162.159.39.210 162.159.39.21 162.159.39.209 162.159.39.208 162.159.39.207 162.159.39.206 162.159.39.205 162.159.39.204 162.159.39.203 162.159.39.202 162.159.39.201 162.159.39.200 162.159.39.20 162.159.39.2 162.159.39.199 162.159.39.198 162.159.39.197 162.159.39.196 162.159.39.195 162.159.39.194 162.159.39.193 162.159.39.192 162.159.39.191 162.159.39.190 162.159.39.19 162.159.39.189 162.159.39.188 162.159.39.187 162.159.39.186 162.159.39.184 162.159.39.183 162.159.39.182 162.159.39.181 162.159.39.180 162.159.39.18 162.159.39.179 162.159.39.178 162.159.39.177 162.159.39.176 162.159.39.175 162.159.39.174 162.159.39.173 162.159.39.172 162.159.39.171 162.159.39.170 162.159.39.17 162.159.39.169 162.159.39.168 162.159.39.167 162.159.39.166 162.159.39.165 162.159.39.164 162.159.39.163 162.159.39.162 162.159.39.161 162.159.39.160 162.159.39.16 162.159.39.159 162.159.39.158 162.159.39.157 162.159.39.156 162.159.39.155 162.159.39.154 162.159.39.153 162.159.39.152 162.159.39.151 162.159.39.150 162.159.39.15 162.159.39.149 162.159.39.148 162.159.39.147 162.159.39.146 162.159.39.145 162.159.39.144 162.159.39.143 162.159.39.142 162.159.39.141 162.159.39.140 162.159.39.14 162.159.39.139 162.159.39.138 162.159.39.137 162.159.39.136 162.159.39.135 162.159.39.134 162.159.39.133 162.159.39.132 162.159.39.131 162.159.39.130 162.159.39.13 162.159.39.129 162.159.39.128 162.159.39.127 162.159.39.126 162.159.39.125 162.159.39.124 162.159.39.123 162.159.39.122 162.159.39.121 162.159.39.120 162.159.39.12 162.159.39.119 162.159.39.118 162.159.39.117 162.159.39.116 162.159.39.115 162.159.39.114 162.159.39.113 162.159.39.112 162.159.39.111 162.159.39.110 162.159.39.11 162.159.39.109 162.159.39.108 162.159.39.107 162.159.39.106 162.159.39.105 162.159.39.104 162.159.39.103 162.159.39.102 162.159.39.101 162.159.39.100 162.159.39.10 162.159.39.1 162.159.39.0 162.159.38.99 162.159.38.98 162.159.38.97 162.159.38.96 162.159.38.95 162.159.38.94 162.159.38.93 162.159.38.92 162.159.38.91 162.159.38.90 162.159.38.9 162.159.38.89 162.159.38.88 162.159.38.87 162.159.38.86 162.159.38.85 162.159.38.84 162.159.38.83 162.159.38.82 162.159.38.81 162.159.38.80 162.159.38.8 162.159.38.79 162.159.38.78 162.159.38.77 162.159.38.76 162.159.38.75 162.159.38.74 162.159.38.73 162.159.38.72 162.159.38.71 162.159.38.70 162.159.38.7 162.159.38.69 162.159.38.68 162.159.38.67 162.159.38.66 162.159.38.65 162.159.38.64 162.159.38.63 162.159.38.62 162.159.38.61 162.159.38.60 162.159.38.6 162.159.38.59 162.159.38.58 162.159.38.57 162.159.38.56 162.159.38.55 162.159.38.54 162.159.38.53 162.159.38.52 162.159.38.51 162.159.38.50 162.159.38.5 162.159.38.49 162.159.38.48 162.159.38.47 162.159.38.46 162.159.38.45 162.159.38.44 162.159.38.43 162.159.38.42 162.159.38.41 162.159.38.40 162.159.38.4 162.159.38.39 162.159.38.38 162.159.38.37 162.159.38.36 162.159.38.35 162.159.38.34 162.159.38.33 162.159.38.32 162.159.38.31 162.159.38.30 162.159.38.3 162.159.38.29 162.159.38.28 162.159.38.27 162.159.38.26 162.159.38.255 162.159.38.254 162.159.38.253 162.159.38.252 162.159.38.251 162.159.38.250 162.159.38.25 162.159.38.249 162.159.38.248 162.159.38.247 162.159.38.245 162.159.38.244 162.159.38.243 162.159.38.242 162.159.38.241 162.159.38.240 162.159.38.24 162.159.38.239 162.159.38.238 162.159.38.237 162.159.38.236 162.159.38.235 162.159.38.234 162.159.38.233 162.159.38.232 162.159.38.231 162.159.38.230 162.159.38.23 162.159.38.229 162.159.38.228 162.159.38.227 162.159.38.226 162.159.38.225 162.159.38.224 162.159.38.223 162.159.38.222 162.159.38.221 162.159.38.220 162.159.38.22 162.159.38.219 162.159.38.218 162.159.38.217 162.159.38.216 162.159.38.215 162.159.38.214 162.159.38.213 162.159.38.212 162.159.38.211 162.159.38.210 162.159.38.21 162.159.38.209 162.159.38.208 162.159.38.207 162.159.38.206 162.159.38.205 162.159.38.204 162.159.38.203 162.159.38.202 162.159.38.201 162.159.38.200 162.159.38.20 162.159.38.2 162.159.38.199 162.159.38.198 162.159.38.197 162.159.38.196 162.159.38.195 162.159.38.194 162.159.38.193 162.159.38.192 162.159.38.191 162.159.38.190 162.159.38.19 162.159.38.189 162.159.38.188 162.159.38.187 162.159.38.186 162.159.38.185 162.159.38.184 162.159.38.183 162.159.38.182 162.159.38.181 162.159.38.180 162.159.38.18 162.159.38.179 162.159.38.178 162.159.38.177 162.159.38.176 162.159.38.175 162.159.38.174 162.159.38.173 162.159.38.172 162.159.38.171 162.159.38.170 162.159.38.17 162.159.38.169 162.159.38.168 162.159.38.167 162.159.38.166 162.159.38.165 162.159.38.164 162.159.38.163 162.159.38.162 162.159.38.161 162.159.38.160 162.159.38.16 162.159.38.159 162.159.38.158 162.159.38.157 162.159.38.156 162.159.38.155 162.159.38.154 162.159.38.153 162.159.38.152 162.159.38.151 162.159.38.150 162.159.38.15 162.159.38.149 162.159.38.148 162.159.38.147 162.159.38.146 162.159.38.145 162.159.38.144 162.159.38.143 162.159.38.142 162.159.38.141 162.159.38.140 162.159.38.14 162.159.38.139 162.159.38.138 162.159.38.137 162.159.38.136 162.159.38.135 162.159.38.134 162.159.38.133 162.159.38.132 162.159.38.131 162.159.38.130 162.159.38.13 162.159.38.129 162.159.38.128 162.159.38.127 162.159.38.126 162.159.38.125 162.159.38.124 162.159.38.123 162.159.38.122 162.159.38.121 162.159.38.120 162.159.38.12 162.159.38.119 162.159.38.118 162.159.38.117 162.159.38.116 162.159.38.115 162.159.38.114 162.159.38.113 162.159.38.112 162.159.38.111 162.159.38.110 162.159.38.11 162.159.38.109 162.159.38.108 162.159.38.107 162.159.38.106 162.159.38.105 162.159.38.104 162.159.38.103 162.159.38.102 162.159.38.101 162.159.38.100 162.159.38.10 162.159.38.1 162.159.38.0 162.159.36.96 162.159.36.86 162.159.36.7 162.159.36.64 162.159.36.61 162.159.36.6 162.159.36.58 162.159.36.46 162.159.36.43 162.159.36.36 162.159.36.253 162.159.36.252 162.159.36.25 162.159.36.249 162.159.36.247 162.159.36.243 162.159.36.240 162.159.36.237 162.159.36.230 162.159.36.227 162.159.36.226 162.159.36.224 162.159.36.220 162.159.36.216 162.159.36.199 162.159.36.190 162.159.36.185 162.159.36.181 162.159.36.175 162.159.36.158 162.159.36.152 162.159.36.141 162.159.36.139 162.159.36.136 162.159.36.134 162.159.36.132 162.159.36.126 162.159.36.125 162.159.36.123 162.159.36.115 162.159.36.114 162.159.36.110 162.159.36.11 162.159.36.104 162.159.36.1 162.159.35.99 162.159.35.98 162.159.35.97 162.159.35.96 162.159.35.95 162.159.35.94 162.159.35.93 162.159.35.92 162.159.35.91 162.159.35.90 162.159.35.9 162.159.35.89 162.159.35.88 162.159.35.87 162.159.35.86 162.159.35.85 162.159.35.84 162.159.35.83 162.159.35.82 162.159.35.81 162.159.35.80 162.159.35.8 162.159.35.79 162.159.35.78 162.159.35.77 162.159.35.76 162.159.35.75 162.159.35.74 162.159.35.73 162.159.35.72 162.159.35.71 162.159.35.70 162.159.35.7 162.159.35.69 162.159.35.68 162.159.35.67 162.159.35.66 162.159.35.65 162.159.35.64 162.159.35.63 162.159.35.62 162.159.35.61 162.159.35.60 162.159.35.6 162.159.35.59 162.159.35.58 162.159.35.57 162.159.35.56 162.159.35.55 162.159.35.54 162.159.35.53 162.159.35.52 162.159.35.51 162.159.35.50 162.159.35.5 162.159.35.49 162.159.35.48 162.159.35.47 162.159.35.46 162.159.35.45 162.159.35.44 162.159.35.43 162.159.35.42 162.159.35.41 162.159.35.40 162.159.35.4 162.159.35.39 162.159.35.38 162.159.35.37 162.159.35.36 162.159.35.35 162.159.35.34 162.159.35.33 162.159.35.32 162.159.35.31 162.159.35.30 162.159.35.3 162.159.35.29 162.159.35.28 162.159.35.27 162.159.35.26 162.159.35.254 162.159.35.253 162.159.35.251 162.159.35.250 162.159.35.25 162.159.35.249 162.159.35.248 162.159.35.247 162.159.35.246 162.159.35.245 162.159.35.244 162.159.35.243 162.159.35.242 162.159.35.241 162.159.35.240 162.159.35.24 162.159.35.239 162.159.35.238 162.159.35.237 162.159.35.236 162.159.35.235 162.159.35.234 162.159.35.233 162.159.35.232 162.159.35.231 162.159.35.230 162.159.35.23 162.159.35.229 162.159.35.228 162.159.35.227 162.159.35.226 162.159.35.225 162.159.35.224 162.159.35.223 162.159.35.222 162.159.35.221 162.159.35.220 162.159.35.22 162.159.35.219 162.159.35.218 162.159.35.217 162.159.35.216 162.159.35.215 162.159.35.214 162.159.35.213 162.159.35.212 162.159.35.211 162.159.35.210 162.159.35.21 162.159.35.209 162.159.35.208 162.159.35.207 162.159.35.206 162.159.35.205 162.159.35.204 162.159.35.203 162.159.35.202 162.159.35.201 162.159.35.200 162.159.35.20 162.159.35.2 162.159.35.199 162.159.35.198 162.159.35.197 162.159.35.196 162.159.35.195 162.159.35.194 162.159.35.193 162.159.35.192 162.159.35.191 162.159.35.190 162.159.35.19 162.159.35.189 162.159.35.188 162.159.35.187 162.159.35.186 162.159.35.185 162.159.35.184 162.159.35.183 162.159.35.182 162.159.35.181 162.159.35.180 162.159.35.18 162.159.35.179 162.159.35.178 162.159.35.177 162.159.35.176 162.159.35.175 162.159.35.174 162.159.35.173 162.159.35.172 162.159.35.171 162.159.35.170 162.159.35.17 162.159.35.169 162.159.35.168 162.159.35.167 162.159.35.166 162.159.35.165 162.159.35.164 162.159.35.163 162.159.35.162 162.159.35.161 162.159.35.160 162.159.35.16 162.159.35.159 162.159.35.158 162.159.35.157 162.159.35.156 162.159.35.155 162.159.35.154 162.159.35.153 162.159.35.152 162.159.35.151 162.159.35.150 162.159.35.15 162.159.35.149 162.159.35.148 162.159.35.147 162.159.35.146 162.159.35.145 162.159.35.144 162.159.35.143 162.159.35.142 162.159.35.141 162.159.35.140 162.159.35.14 162.159.35.139 162.159.35.138 162.159.35.137 162.159.35.136 162.159.35.135 162.159.35.134 162.159.35.133 162.159.35.132 162.159.35.131 162.159.35.130 162.159.35.13 162.159.35.129 162.159.35.128 162.159.35.127 162.159.35.126 162.159.35.125 162.159.35.124 162.159.35.123 162.159.35.122 162.159.35.121 162.159.35.120 162.159.35.12 162.159.35.119 162.159.35.118 162.159.35.117 162.159.35.116 162.159.35.115 162.159.35.114 162.159.35.113 162.159.35.112 162.159.35.111 162.159.35.110 162.159.35.11 162.159.35.109 162.159.35.108 162.159.35.107 162.159.35.106 162.159.35.105 162.159.35.104 162.159.35.103 162.159.35.102 162.159.35.101 162.159.35.100 162.159.35.10 162.159.35.1 162.159.35.0 162.159.34.99 162.159.34.98 162.159.34.97 162.159.34.96 162.159.34.95 162.159.34.94 162.159.34.93 162.159.34.92 162.159.34.91 162.159.34.90 162.159.34.9 162.159.34.89 162.159.34.88 162.159.34.87 162.159.34.86 162.159.34.85 162.159.34.84 162.159.34.83 162.159.34.82 162.159.34.81 162.159.34.80 162.159.34.8 162.159.34.79 162.159.34.78 162.159.34.77 162.159.34.76 162.159.34.75 162.159.34.74 162.159.34.73 162.159.34.72 162.159.34.71 162.159.34.70 162.159.34.7 162.159.34.69 162.159.34.68 162.159.34.67 162.159.34.66 162.159.34.65 162.159.34.64 162.159.34.63 162.159.34.62 162.159.34.61 162.159.34.60 162.159.34.6 162.159.34.59 162.159.34.58 162.159.34.57 162.159.34.56 162.159.34.55 162.159.34.54 162.159.34.53 162.159.34.52 162.159.34.51 162.159.34.50 162.159.34.5 162.159.34.49 162.159.34.48 162.159.34.47 162.159.34.46 162.159.34.45 162.159.34.44 162.159.34.43 162.159.34.42 162.159.34.41 162.159.34.40 162.159.34.4 162.159.34.39 162.159.34.38 162.159.34.37 162.159.34.36 162.159.34.35 162.159.34.34 162.159.34.33 162.159.34.32 162.159.34.31 162.159.34.30 162.159.34.3 162.159.34.29 162.159.34.28 162.159.34.27 162.159.34.26 162.159.34.255 162.159.34.254 162.159.34.253 162.159.34.252 162.159.34.251 162.159.34.250 162.159.34.25 162.159.34.249 162.159.34.248 162.159.34.247 162.159.34.246 162.159.34.245 162.159.34.244 162.159.34.243 162.159.34.242 162.159.34.241 162.159.34.240 162.159.34.24 162.159.34.239 162.159.34.238 162.159.34.237 162.159.34.236 162.159.34.235 162.159.34.234 162.159.34.233 162.159.34.232 162.159.34.231 162.159.34.230 162.159.34.23 162.159.34.229 162.159.34.228 162.159.34.227 162.159.34.226 162.159.34.225 162.159.34.224 162.159.34.223 162.159.34.222 162.159.34.221 162.159.34.220 162.159.34.22 162.159.34.219 162.159.34.218 162.159.34.217 162.159.34.216 162.159.34.215 162.159.34.214 162.159.34.213 162.159.34.212 162.159.34.211 162.159.34.210 162.159.34.21 162.159.34.209 162.159.34.208 162.159.34.207 162.159.34.206 162.159.34.205 162.159.34.204 162.159.34.203 162.159.34.202 162.159.34.201 162.159.34.200 162.159.34.20 162.159.34.2 162.159.34.199 162.159.34.198 162.159.34.197 162.159.34.196 162.159.34.195 162.159.34.194 162.159.34.193 162.159.34.192 162.159.34.191 162.159.34.190 162.159.34.19 162.159.34.189 162.159.34.188 162.159.34.187 162.159.34.186 162.159.34.185 162.159.34.184 162.159.34.183 162.159.34.182 162.159.34.181 162.159.34.180 162.159.34.18 162.159.34.179 162.159.34.178 162.159.34.177 162.159.34.176 162.159.34.175 162.159.34.174 162.159.34.173 162.159.34.172 162.159.34.171 162.159.34.170 162.159.34.17 162.159.34.169 162.159.34.168 162.159.34.167 162.159.34.166 162.159.34.165 162.159.34.164 162.159.34.163 162.159.34.162 162.159.34.161 162.159.34.160 162.159.34.16 162.159.34.159 162.159.34.158 162.159.34.157 162.159.34.156 162.159.34.155 162.159.34.154 162.159.34.153 162.159.34.152 162.159.34.151 162.159.34.150 162.159.34.15 162.159.34.149 162.159.34.148 162.159.34.147 162.159.34.146 162.159.34.145 162.159.34.144 162.159.34.143 162.159.34.142 162.159.34.141 162.159.34.140 162.159.34.14 162.159.34.139 162.159.34.138 162.159.34.137 162.159.34.136 162.159.34.135 162.159.34.134 162.159.34.133 162.159.34.132 162.159.34.131 162.159.34.130 162.159.34.13 162.159.34.129 162.159.34.128 162.159.34.127 162.159.34.126 162.159.34.125 162.159.34.124 162.159.34.123 162.159.34.122 162.159.34.121 162.159.34.120 162.159.34.12 162.159.34.119 162.159.34.118 162.159.34.117 162.159.34.116 162.159.34.115 162.159.34.114 162.159.34.113 162.159.34.112 162.159.34.111 162.159.34.110 162.159.34.11 162.159.34.109 162.159.34.108 162.159.34.107 162.159.34.106 162.159.34.105 162.159.34.104 162.159.34.103 162.159.34.102 162.159.34.101 162.159.34.100 162.159.34.10 162.159.34.1 162.159.34.0 162.159.33.93 162.159.33.92 162.159.33.83 162.159.33.74 162.159.33.68 162.159.33.59 162.159.33.57 162.159.33.54 162.159.33.251 162.159.33.247 162.159.33.238 162.159.33.234 162.159.33.23 162.159.33.227 162.159.33.224 162.159.33.22 162.159.33.217 162.159.33.216 162.159.33.211 162.159.33.204 162.159.33.197 162.159.33.186 162.159.33.17 162.159.33.165 162.159.33.154 162.159.33.152 162.159.33.143 162.159.33.141 162.159.33.130 162.159.33.127 162.159.33.121 162.159.33.119 162.159.33.115 162.159.33.110 162.159.32.99 162.159.32.95 162.159.32.90 162.159.32.72 162.159.32.7 162.159.32.50 162.159.32.49 162.159.32.46 162.159.32.34 162.159.32.26 162.159.32.255 162.159.32.252 162.159.32.249 162.159.32.238 162.159.32.23 162.159.32.211 162.159.32.210 162.159.32.206 162.159.32.204 162.159.32.177 162.159.32.175 162.159.32.174 162.159.32.169 162.159.32.155 162.159.32.153 162.159.32.139 162.159.32.135 162.159.32.119 162.159.32.118 162.159.32.109 162.159.3.98 162.159.3.93 162.159.3.91 162.159.3.72 162.159.3.71 162.159.3.68 162.159.3.65 162.159.3.61 162.159.3.27 162.159.3.246 162.159.3.245 162.159.3.235 162.159.3.234 162.159.3.233 162.159.3.229 162.159.3.224 162.159.3.190 162.159.3.183 162.159.3.182 162.159.3.179 162.159.3.176 162.159.3.169 162.159.3.157 162.159.3.156 162.159.3.136 162.159.3.135 162.159.3.131 162.159.3.123 162.159.3.121 162.159.3.120 162.159.3.118 162.159.3.117 162.159.3.104 162.159.27.173 162.159.27.162 162.159.26.49 162.159.25.85 162.159.25.84 162.159.25.206 162.159.25.167 162.159.24.87 162.159.24.85 162.159.24.69 162.159.24.244 162.159.24.197 162.159.24.129 162.159.23.93 162.159.23.84 162.159.23.82 162.159.23.80 162.159.23.66 162.159.23.41 162.159.23.39 162.159.23.37 162.159.23.240 162.159.23.236 162.159.23.230 162.159.23.205 162.159.23.194 162.159.23.184 162.159.23.181 162.159.23.16 162.159.23.158 162.159.23.154 162.159.23.145 162.159.23.144 162.159.23.138 162.159.23.137 162.159.23.13 162.159.23.124 162.159.23.122 162.159.23.120 162.159.23.118 162.159.23.111 162.159.23.106 162.159.23.102 162.159.22.95 162.159.22.92 162.159.22.90 162.159.22.79 162.159.22.73 162.159.22.71 162.159.22.66 162.159.22.65 162.159.22.38 162.159.22.37 162.159.22.28 162.159.22.226 162.159.22.221 162.159.22.219 162.159.22.214 162.159.22.212 162.159.22.211 162.159.22.209 162.159.22.207 162.159.22.196 162.159.22.193 162.159.22.192 162.159.22.186 162.159.22.185 162.159.22.183 162.159.22.180 162.159.22.161 162.159.22.16 162.159.22.159 162.159.22.154 162.159.22.150 162.159.22.149 162.159.22.144 162.159.22.132 162.159.22.131 162.159.22.125 162.159.22.123 162.159.22.121 162.159.22.115 162.159.21.96 162.159.21.94 162.159.21.91 162.159.21.86 162.159.21.84 162.159.21.83 162.159.21.74 162.159.21.73 162.159.21.64 162.159.21.5 162.159.21.33 162.159.21.244 162.159.21.231 162.159.21.221 162.159.21.22 162.159.21.218 162.159.21.184 162.159.21.18 162.159.21.178 162.159.21.167 162.159.21.16 162.159.21.159 162.159.21.153 162.159.21.147 162.159.21.127 162.159.21.118 162.159.21.11 162.159.21.108 162.159.20.79 162.159.20.73 162.159.20.7 162.159.20.5 162.159.20.42 162.159.20.28 162.159.20.247 162.159.20.243 162.159.20.232 162.159.20.23 162.159.20.224 162.159.20.218 162.159.20.211 162.159.20.208 162.159.20.206 162.159.20.194 162.159.20.192 162.159.20.191 162.159.20.170 162.159.20.169 162.159.20.161 162.159.20.155 162.159.20.15 162.159.20.139 162.159.20.137 162.159.20.134 162.159.20.132 162.159.20.129 162.159.20.121 162.159.20.108 162.159.20.106 162.159.20.104 162.159.2.99 162.159.2.97 162.159.2.96 162.159.2.94 162.159.2.89 162.159.2.88 162.159.2.85 162.159.2.73 162.159.2.62 162.159.2.61 162.159.2.57 162.159.2.48 162.159.2.46 162.159.2.32 162.159.2.28 162.159.2.253 162.159.2.25 162.159.2.243 162.159.2.218 162.159.2.215 162.159.2.210 162.159.2.190 162.159.2.183 162.159.2.181 162.159.2.180 162.159.2.18 162.159.2.178 162.159.2.174 162.159.2.166 162.159.2.161 162.159.2.152 162.159.2.140 162.159.2.14 162.159.2.139 162.159.2.138 162.159.2.136 162.159.2.129 162.159.2.121 162.159.2.112 162.159.2.110 162.159.2.11 162.159.2.106 162.159.2.1 162.159.19.80 162.159.19.7 162.159.19.68 162.159.19.62 162.159.19.35 162.159.19.3 162.159.19.26 162.159.19.25 162.159.19.248 162.159.19.244 162.159.19.235 162.159.19.21 162.159.19.206 162.159.19.204 162.159.19.203 162.159.19.201 162.159.19.199 162.159.19.173 162.159.19.170 162.159.19.168 162.159.19.165 162.159.19.163 162.159.19.159 162.159.19.147 162.159.19.139 162.159.19.13 162.159.19.125 162.159.18.79 162.159.18.72 162.159.18.64 162.159.18.44 162.159.18.38 162.159.18.32 162.159.18.252 162.159.18.233 162.159.18.224 162.159.18.215 162.159.18.208 162.159.18.200 162.159.18.2 162.159.18.196 162.159.18.192 162.159.18.191 162.159.18.172 162.159.18.167 162.159.18.162 162.159.18.151 162.159.18.150 162.159.18.145 162.159.18.143 162.159.18.140 162.159.18.139 162.159.18.136 162.159.18.133 162.159.18.128 162.159.18.126 162.159.18.12 162.159.18.114 162.159.18.112 162.159.18.111 162.159.18.106 162.159.17.95 162.159.17.85 162.159.17.82 162.159.17.79 162.159.17.75 162.159.17.70 162.159.17.51 162.159.17.49 162.159.17.43 162.159.17.32 162.159.17.29 162.159.17.24 162.159.17.234 162.159.17.232 162.159.17.221 162.159.17.205 162.159.17.194 162.159.17.183 162.159.17.182 162.159.17.178 162.159.17.172 162.159.17.165 162.159.17.152 162.159.17.146 162.159.17.139 162.159.17.134 162.159.17.127 162.159.17.122 162.159.17.117 162.159.16.90 162.159.16.83 162.159.16.58 162.159.16.47 162.159.16.43 162.159.16.34 162.159.16.240 162.159.16.225 162.159.16.212 162.159.16.201 162.159.16.200 162.159.16.195 162.159.16.180 162.159.16.166 162.159.16.159 162.159.16.153 162.159.16.146 162.159.16.140 162.159.16.127 162.159.16.123 162.159.16.117 162.159.16.102 162.159.15.95 162.159.15.75 162.159.15.71 162.159.15.36 162.159.15.33 162.159.15.3 162.159.15.29 162.159.15.26 162.159.15.244 162.159.15.235 162.159.15.22 162.159.15.216 162.159.15.21 162.159.15.206 162.159.15.197 162.159.15.182 162.159.15.178 162.159.15.166 162.159.15.161 162.159.15.16 162.159.15.157 162.159.15.154 162.159.15.148 162.159.15.132 162.159.15.131 162.159.15.121 162.159.15.119 162.159.15.117 162.159.15.112 162.159.15.110 162.159.15.106 162.159.15.103 162.159.14.94 162.159.14.91 162.159.14.87 162.159.14.73 162.159.14.72 162.159.14.66 162.159.14.60 162.159.14.4 162.159.14.28 162.159.14.26 162.159.14.251 162.159.14.247 162.159.14.21 162.159.14.201 162.159.14.2 162.159.14.197 162.159.14.192 162.159.14.189 162.159.14.134 162.159.14.131 162.159.14.130 162.159.14.13 162.159.14.125 162.159.14.12 162.159.13.98 162.159.13.85 162.159.13.77 162.159.13.74 162.159.13.58 162.159.13.55 162.159.13.50 162.159.13.47 162.159.13.41 162.159.13.39 162.159.13.35 162.159.13.3 162.159.13.253 162.159.13.246 162.159.13.244 162.159.13.223 162.159.13.198 162.159.13.194 162.159.13.19 162.159.13.171 162.159.13.168 162.159.13.165 162.159.13.153 162.159.13.151 162.159.13.15 162.159.13.126 162.159.13.123 162.159.13.114 162.159.13.106 162.159.13.104 162.159.12.69 162.159.12.65 162.159.12.55 162.159.12.5 162.159.12.42 162.159.12.39 162.159.12.36 162.159.12.254 162.159.12.247 162.159.12.228 162.159.12.223 162.159.12.207 162.159.12.199 162.159.12.195 162.159.12.172 162.159.12.157 162.159.12.13 162.159.12.125 162.159.12.123 162.159.12.111 162.159.12.108 162.159.12.10 162.159.11.99 162.159.11.91 162.159.11.87 162.159.11.84 162.159.11.78 162.159.11.75 162.159.11.26 162.159.11.247 162.159.11.235 162.159.11.232 162.159.11.208 162.159.11.198 162.159.11.192 162.159.11.173 162.159.11.168 162.159.11.167 162.159.11.162 162.159.11.157 162.159.11.139 162.159.11.135 162.159.11.130 162.159.11.13 162.159.11.122 162.159.11.111 162.159.11.106 162.159.11.10 162.159.10.96 162.159.10.9 162.159.10.69 162.159.10.65 162.159.10.58 162.159.10.55 162.159.10.49 162.159.10.38 162.159.10.254 162.159.10.249 162.159.10.247 162.159.10.221 162.159.10.207 162.159.10.203 162.159.10.199 162.159.10.195 162.159.10.181 162.159.10.178 162.159.10.161 162.159.10.155 162.159.10.154 162.159.10.145 162.159.10.143 162.159.10.141 162.159.10.14 162.159.10.138 162.159.10.134 162.159.10.133 162.159.10.13 162.159.10.120 162.159.10.109 162.159.10.105 162.159.10.103 162.159.10.100 162.159.1.97 162.159.1.75 162.159.1.67 162.159.1.62 162.159.1.60 162.159.1.48 162.159.1.36 162.159.1.35 162.159.1.32 162.159.1.243 162.159.1.24 162.159.1.238 162.159.1.235 162.159.1.226 162.159.1.221 162.159.1.20 162.159.1.194 162.159.1.185 162.159.1.170 162.159.1.154 162.159.1.136 162.159.1.122 162.159.1.120 162.159.1.1 162.159.0.97 162.159.0.93 162.159.0.88 162.159.0.80 162.159.0.76 162.159.0.73 162.159.0.70 162.159.0.7 162.159.0.69 162.159.0.63 162.159.0.6 162.159.0.44 162.159.0.31 162.159.0.28 162.159.0.250 162.159.0.245 162.159.0.230 162.159.0.228 162.159.0.226 162.159.0.210 162.159.0.208 162.159.0.195 162.159.0.188 162.159.0.15 162.159.0.149 162.159.0.137 162.159.0.132 162.159.0.118 162.159.0.110 162.159.0.11 162.159.0.106 162.159.0.10 162.155.248.54 162.142.63.110 162.142.28.10 162.142.105.146 162.14.21.56 162.14.21.178 161.97.85.60 161.97.149.103 161.82.184.70 161.49.226.194 161.49.215.50 161.49.215.28 161.35.196.248 161.230.203.238 161.200.96.9 161.11.228.11 161.11.226.170 161.0.62.217 160.86.109.33 160.72.33.26 160.19.99.98 160.16.111.164 160.153.251.73 160.119.101.224 160.0.192.36 16.62.171.163 159.69.72.157 159.69.68.181 159.69.114.157 159.255.187.250 159.255.183.217 159.203.125.234 159.196.50.130 159.196.204.14 159.192.97.99 159.192.142.225 159.192.139.224 159.192.104.150 158.75.195.29 158.69.31.60 158.51.134.53 158.46.37.156 158.247.210.85 158.174.73.94 157.55.83.218 157.25.58.57 157.245.139.171 157.231.209.248 157.185.70.98 157.175.242.142 157.157.166.191 157.157.138.227 157.119.201.134 157.100.63.48 157.100.58.252 157.100.55.226 156.67.54.58 156.154.71.56 156.154.71.50 156.154.71.5 156.154.71.46 156.154.71.44 156.154.71.43 156.154.71.42 156.154.71.40 156.154.71.33 156.154.71.29 156.154.71.26 156.154.71.25 156.154.71.22 156.154.71.20 156.154.71.2 156.154.71.18 156.154.71.13 156.154.71.12 156.154.71.11 156.154.71.1 156.154.70.7 156.154.70.64 156.154.70.60 156.154.70.57 156.154.70.5 156.154.70.44 156.154.70.43 156.154.70.42 156.154.70.40 156.154.70.33 156.154.70.29 156.154.70.26 156.154.70.25 156.154.70.22 156.154.70.2 156.154.70.18 156.154.70.16 156.154.70.14 156.154.70.13 156.154.70.12 156.154.70.11 156.154.70.10 156.154.70.1 156.154.69.99 156.154.69.96 156.154.69.95 156.154.69.94 156.154.69.93 156.154.69.91 156.154.69.9 156.154.69.88 156.154.69.87 156.154.69.86 156.154.69.85 156.154.69.84 156.154.69.83 156.154.69.82 156.154.69.81 156.154.69.80 156.154.69.79 156.154.69.77 156.154.69.76 156.154.69.75 156.154.69.73 156.154.69.72 156.154.69.70 156.154.69.69 156.154.69.66 156.154.69.64 156.154.69.63 156.154.69.62 156.154.69.60 156.154.69.6 156.154.69.58 156.154.69.53 156.154.69.52 156.154.69.50 156.154.69.5 156.154.69.49 156.154.69.45 156.154.69.44 156.154.69.41 156.154.69.4 156.154.69.39 156.154.69.36 156.154.69.35 156.154.69.34 156.154.69.33 156.154.69.31 156.154.69.30 156.154.69.29 156.154.69.28 156.154.69.253 156.154.69.252 156.154.69.251 156.154.69.250 156.154.69.25 156.154.69.249 156.154.69.247 156.154.69.246 156.154.69.243 156.154.69.241 156.154.69.239 156.154.69.237 156.154.69.236 156.154.69.235 156.154.69.234 156.154.69.232 156.154.69.230 156.154.69.23 156.154.69.229 156.154.69.227 156.154.69.224 156.154.69.223 156.154.69.222 156.154.69.220 156.154.69.219 156.154.69.218 156.154.69.214 156.154.69.213 156.154.69.211 156.154.69.210 156.154.69.21 156.154.69.209 156.154.69.207 156.154.69.206 156.154.69.205 156.154.69.203 156.154.69.201 156.154.69.200 156.154.69.2 156.154.69.199 156.154.69.198 156.154.69.197 156.154.69.196 156.154.69.195 156.154.69.194 156.154.69.193 156.154.69.192 156.154.69.191 156.154.69.190 156.154.69.19 156.154.69.189 156.154.69.188 156.154.69.187 156.154.69.183 156.154.69.182 156.154.69.178 156.154.69.177 156.154.69.176 156.154.69.174 156.154.69.169 156.154.69.168 156.154.69.166 156.154.69.165 156.154.69.164 156.154.69.161 156.154.69.160 156.154.69.16 156.154.69.159 156.154.69.158 156.154.69.157 156.154.69.156 156.154.69.155 156.154.69.154 156.154.69.153 156.154.69.152 156.154.69.151 156.154.69.149 156.154.69.148 156.154.69.147 156.154.69.146 156.154.69.145 156.154.69.144 156.154.69.143 156.154.69.138 156.154.69.137 156.154.69.135 156.154.69.134 156.154.69.133 156.154.69.132 156.154.69.131 156.154.69.13 156.154.69.128 156.154.69.127 156.154.69.121 156.154.69.12 156.154.69.119 156.154.69.117 156.154.69.115 156.154.69.114 156.154.69.112 156.154.69.111 156.154.69.110 156.154.69.11 156.154.69.109 156.154.69.108 156.154.69.105 156.154.69.104 156.154.69.103 156.154.69.102 156.154.69.100 156.154.69.10 156.154.68.99 156.154.68.98 156.154.68.97 156.154.68.96 156.154.68.95 156.154.68.94 156.154.68.93 156.154.68.92 156.154.68.91 156.154.68.90 156.154.68.9 156.154.68.89 156.154.68.88 156.154.68.87 156.154.68.86 156.154.68.85 156.154.68.84 156.154.68.82 156.154.68.81 156.154.68.8 156.154.68.79 156.154.68.78 156.154.68.77 156.154.68.76 156.154.68.75 156.154.68.74 156.154.68.73 156.154.68.72 156.154.68.71 156.154.68.70 156.154.68.7 156.154.68.69 156.154.68.68 156.154.68.67 156.154.68.66 156.154.68.64 156.154.68.62 156.154.68.61 156.154.68.60 156.154.68.6 156.154.68.59 156.154.68.58 156.154.68.57 156.154.68.55 156.154.68.53 156.154.68.52 156.154.68.51 156.154.68.50 156.154.68.5 156.154.68.49 156.154.68.48 156.154.68.47 156.154.68.46 156.154.68.45 156.154.68.44 156.154.68.43 156.154.68.42 156.154.68.41 156.154.68.40 156.154.68.4 156.154.68.39 156.154.68.38 156.154.68.37 156.154.68.36 156.154.68.35 156.154.68.34 156.154.68.33 156.154.68.32 156.154.68.31 156.154.68.30 156.154.68.3 156.154.68.29 156.154.68.28 156.154.68.27 156.154.68.26 156.154.68.254 156.154.68.253 156.154.68.252 156.154.68.251 156.154.68.250 156.154.68.25 156.154.68.249 156.154.68.248 156.154.68.247 156.154.68.245 156.154.68.244 156.154.68.243 156.154.68.242 156.154.68.241 156.154.68.240 156.154.68.24 156.154.68.239 156.154.68.237 156.154.68.236 156.154.68.235 156.154.68.233 156.154.68.232 156.154.68.231 156.154.68.230 156.154.68.23 156.154.68.229 156.154.68.228 156.154.68.227 156.154.68.226 156.154.68.225 156.154.68.224 156.154.68.223 156.154.68.222 156.154.68.221 156.154.68.220 156.154.68.22 156.154.68.219 156.154.68.218 156.154.68.217 156.154.68.216 156.154.68.214 156.154.68.213 156.154.68.212 156.154.68.211 156.154.68.210 156.154.68.21 156.154.68.209 156.154.68.207 156.154.68.206 156.154.68.205 156.154.68.204 156.154.68.203 156.154.68.201 156.154.68.200 156.154.68.20 156.154.68.2 156.154.68.199 156.154.68.198 156.154.68.197 156.154.68.195 156.154.68.194 156.154.68.193 156.154.68.192 156.154.68.191 156.154.68.19 156.154.68.189 156.154.68.188 156.154.68.187 156.154.68.186 156.154.68.185 156.154.68.184 156.154.68.183 156.154.68.182 156.154.68.181 156.154.68.180 156.154.68.18 156.154.68.179 156.154.68.178 156.154.68.176 156.154.68.175 156.154.68.174 156.154.68.173 156.154.68.172 156.154.68.171 156.154.68.170 156.154.68.17 156.154.68.169 156.154.68.168 156.154.68.167 156.154.68.166 156.154.68.164 156.154.68.163 156.154.68.162 156.154.68.161 156.154.68.160 156.154.68.16 156.154.68.159 156.154.68.158 156.154.68.156 156.154.68.155 156.154.68.154 156.154.68.153 156.154.68.152 156.154.68.151 156.154.68.150 156.154.68.15 156.154.68.149 156.154.68.148 156.154.68.147 156.154.68.146 156.154.68.145 156.154.68.143 156.154.68.142 156.154.68.141 156.154.68.140 156.154.68.139 156.154.68.138 156.154.68.137 156.154.68.136 156.154.68.135 156.154.68.134 156.154.68.133 156.154.68.132 156.154.68.131 156.154.68.130 156.154.68.13 156.154.68.129 156.154.68.128 156.154.68.127 156.154.68.126 156.154.68.125 156.154.68.124 156.154.68.123 156.154.68.122 156.154.68.121 156.154.68.120 156.154.68.12 156.154.68.119 156.154.68.118 156.154.68.117 156.154.68.116 156.154.68.115 156.154.68.114 156.154.68.113 156.154.68.112 156.154.68.111 156.154.68.110 156.154.68.11 156.154.68.109 156.154.68.108 156.154.68.107 156.154.68.106 156.154.68.105 156.154.68.104 156.154.68.103 156.154.68.102 156.154.68.101 156.154.68.100 156.154.68.10 156.154.68.1 156.154.67.99 156.154.67.97 156.154.67.96 156.154.67.95 156.154.67.94 156.154.67.93 156.154.67.92 156.154.67.9 156.154.67.88 156.154.67.86 156.154.67.85 156.154.67.84 156.154.67.83 156.154.67.82 156.154.67.80 156.154.67.8 156.154.67.79 156.154.67.78 156.154.67.76 156.154.67.74 156.154.67.73 156.154.67.72 156.154.67.70 156.154.67.69 156.154.67.67 156.154.67.66 156.154.67.65 156.154.67.63 156.154.67.62 156.154.67.6 156.154.67.59 156.154.67.56 156.154.67.55 156.154.67.54 156.154.67.53 156.154.67.5 156.154.67.49 156.154.67.48 156.154.67.45 156.154.67.43 156.154.67.42 156.154.67.40 156.154.67.4 156.154.67.39 156.154.67.34 156.154.67.33 156.154.67.3 156.154.67.29 156.154.67.28 156.154.67.27 156.154.67.26 156.154.67.253 156.154.67.252 156.154.67.251 156.154.67.250 156.154.67.249 156.154.67.248 156.154.67.245 156.154.67.244 156.154.67.242 156.154.67.241 156.154.67.240 156.154.67.24 156.154.67.238 156.154.67.237 156.154.67.236 156.154.67.235 156.154.67.234 156.154.67.230 156.154.67.23 156.154.67.229 156.154.67.227 156.154.67.226 156.154.67.225 156.154.67.224 156.154.67.223 156.154.67.221 156.154.67.220 156.154.67.22 156.154.67.219 156.154.67.217 156.154.67.216 156.154.67.215 156.154.67.213 156.154.67.212 156.154.67.211 156.154.67.209 156.154.67.208 156.154.67.207 156.154.67.206 156.154.67.201 156.154.67.20 156.154.67.199 156.154.67.198 156.154.67.197 156.154.67.195 156.154.67.193 156.154.67.191 156.154.67.189 156.154.67.182 156.154.67.180 156.154.67.18 156.154.67.179 156.154.67.178 156.154.67.177 156.154.67.176 156.154.67.173 156.154.67.170 156.154.67.169 156.154.67.168 156.154.67.167 156.154.67.164 156.154.67.163 156.154.67.161 156.154.67.160 156.154.67.16 156.154.67.159 156.154.67.157 156.154.67.155 156.154.67.154 156.154.67.153 156.154.67.151 156.154.67.15 156.154.67.148 156.154.67.147 156.154.67.144 156.154.67.143 156.154.67.142 156.154.67.140 156.154.67.139 156.154.67.137 156.154.67.135 156.154.67.131 156.154.67.127 156.154.67.126 156.154.67.125 156.154.67.124 156.154.67.123 156.154.67.122 156.154.67.120 156.154.67.119 156.154.67.115 156.154.67.113 156.154.67.109 156.154.67.106 156.154.67.104 156.154.67.103 156.154.67.102 156.154.67.10 156.154.66.99 156.154.66.97 156.154.66.96 156.154.66.91 156.154.66.90 156.154.66.9 156.154.66.89 156.154.66.88 156.154.66.87 156.154.66.86 156.154.66.85 156.154.66.81 156.154.66.8 156.154.66.78 156.154.66.75 156.154.66.74 156.154.66.73 156.154.66.72 156.154.66.7 156.154.66.68 156.154.66.67 156.154.66.66 156.154.66.65 156.154.66.64 156.154.66.63 156.154.66.62 156.154.66.61 156.154.66.58 156.154.66.57 156.154.66.56 156.154.66.54 156.154.66.53 156.154.66.52 156.154.66.51 156.154.66.50 156.154.66.5 156.154.66.49 156.154.66.48 156.154.66.47 156.154.66.46 156.154.66.45 156.154.66.44 156.154.66.42 156.154.66.41 156.154.66.35 156.154.66.34 156.154.66.32 156.154.66.3 156.154.66.29 156.154.66.28 156.154.66.254 156.154.66.253 156.154.66.251 156.154.66.248 156.154.66.247 156.154.66.245 156.154.66.244 156.154.66.243 156.154.66.241 156.154.66.239 156.154.66.237 156.154.66.236 156.154.66.235 156.154.66.234 156.154.66.233 156.154.66.230 156.154.66.23 156.154.66.229 156.154.66.228 156.154.66.227 156.154.66.224 156.154.66.223 156.154.66.222 156.154.66.221 156.154.66.220 156.154.66.22 156.154.66.218 156.154.66.215 156.154.66.214 156.154.66.210 156.154.66.21 156.154.66.208 156.154.66.206 156.154.66.205 156.154.66.203 156.154.66.202 156.154.66.20 156.154.66.199 156.154.66.198 156.154.66.197 156.154.66.195 156.154.66.194 156.154.66.193 156.154.66.192 156.154.66.190 156.154.66.19 156.154.66.189 156.154.66.188 156.154.66.187 156.154.66.185 156.154.66.184 156.154.66.183 156.154.66.181 156.154.66.180 156.154.66.179 156.154.66.178 156.154.66.175 156.154.66.173 156.154.66.172 156.154.66.170 156.154.66.17 156.154.66.168 156.154.66.167 156.154.66.165 156.154.66.162 156.154.66.161 156.154.66.16 156.154.66.159 156.154.66.157 156.154.66.156 156.154.66.152 156.154.66.150 156.154.66.15 156.154.66.149 156.154.66.145 156.154.66.143 156.154.66.141 156.154.66.14 156.154.66.139 156.154.66.138 156.154.66.137 156.154.66.136 156.154.66.135 156.154.66.131 156.154.66.130 156.154.66.13 156.154.66.127 156.154.66.125 156.154.66.123 156.154.66.122 156.154.66.121 156.154.66.120 156.154.66.12 156.154.66.119 156.154.66.118 156.154.66.116 156.154.66.115 156.154.66.113 156.154.66.112 156.154.66.11 156.154.66.109 156.154.66.106 156.154.66.105 156.154.66.103 156.154.66.102 156.154.66.101 156.154.66.10 156.154.66.1 156.154.65.98 156.154.65.97 156.154.65.96 156.154.65.95 156.154.65.93 156.154.65.92 156.154.65.91 156.154.65.9 156.154.65.89 156.154.65.88 156.154.65.86 156.154.65.84 156.154.65.83 156.154.65.82 156.154.65.81 156.154.65.80 156.154.65.8 156.154.65.78 156.154.65.76 156.154.65.75 156.154.65.74 156.154.65.73 156.154.65.71 156.154.65.7 156.154.65.68 156.154.65.67 156.154.65.66 156.154.65.64 156.154.65.63 156.154.65.62 156.154.65.60 156.154.65.6 156.154.65.59 156.154.65.58 156.154.65.57 156.154.65.56 156.154.65.55 156.154.65.53 156.154.65.52 156.154.65.50 156.154.65.5 156.154.65.49 156.154.65.48 156.154.65.47 156.154.65.44 156.154.65.43 156.154.65.42 156.154.65.41 156.154.65.40 156.154.65.39 156.154.65.38 156.154.65.37 156.154.65.36 156.154.65.35 156.154.65.34 156.154.65.33 156.154.65.32 156.154.65.31 156.154.65.30 156.154.65.3 156.154.65.29 156.154.65.28 156.154.65.254 156.154.65.253 156.154.65.252 156.154.65.251 156.154.65.250 156.154.65.25 156.154.65.249 156.154.65.248 156.154.65.243 156.154.65.242 156.154.65.241 156.154.65.240 156.154.65.24 156.154.65.239 156.154.65.235 156.154.65.234 156.154.65.233 156.154.65.232 156.154.65.231 156.154.65.23 156.154.65.228 156.154.65.227 156.154.65.226 156.154.65.225 156.154.65.224 156.154.65.223 156.154.65.220 156.154.65.22 156.154.65.219 156.154.65.218 156.154.65.216 156.154.65.215 156.154.65.214 156.154.65.213 156.154.65.212 156.154.65.211 156.154.65.210 156.154.65.21 156.154.65.207 156.154.65.206 156.154.65.204 156.154.65.203 156.154.65.200 156.154.65.20 156.154.65.2 156.154.65.199 156.154.65.198 156.154.65.196 156.154.65.195 156.154.65.193 156.154.65.192 156.154.65.191 156.154.65.190 156.154.65.189 156.154.65.188 156.154.65.187 156.154.65.185 156.154.65.184 156.154.65.183 156.154.65.182 156.154.65.181 156.154.65.180 156.154.65.18 156.154.65.179 156.154.65.178 156.154.65.176 156.154.65.175 156.154.65.174 156.154.65.173 156.154.65.172 156.154.65.171 156.154.65.17 156.154.65.168 156.154.65.167 156.154.65.166 156.154.65.163 156.154.65.162 156.154.65.161 156.154.65.160 156.154.65.159 156.154.65.158 156.154.65.157 156.154.65.155 156.154.65.153 156.154.65.152 156.154.65.150 156.154.65.149 156.154.65.148 156.154.65.147 156.154.65.146 156.154.65.145 156.154.65.144 156.154.65.142 156.154.65.141 156.154.65.140 156.154.65.14 156.154.65.139 156.154.65.138 156.154.65.136 156.154.65.135 156.154.65.134 156.154.65.133 156.154.65.132 156.154.65.131 156.154.65.130 156.154.65.129 156.154.65.128 156.154.65.127 156.154.65.125 156.154.65.124 156.154.65.123 156.154.65.121 156.154.65.120 156.154.65.12 156.154.65.119 156.154.65.117 156.154.65.116 156.154.65.115 156.154.65.114 156.154.65.113 156.154.65.111 156.154.65.110 156.154.65.11 156.154.65.108 156.154.65.107 156.154.65.106 156.154.65.105 156.154.65.103 156.154.65.102 156.154.65.101 156.154.65.10 156.154.65.1 156.154.64.99 156.154.64.98 156.154.64.97 156.154.64.96 156.154.64.93 156.154.64.90 156.154.64.9 156.154.64.88 156.154.64.85 156.154.64.84 156.154.64.82 156.154.64.81 156.154.64.8 156.154.64.79 156.154.64.78 156.154.64.77 156.154.64.75 156.154.64.74 156.154.64.72 156.154.64.70 156.154.64.68 156.154.64.66 156.154.64.65 156.154.64.63 156.154.64.60 156.154.64.6 156.154.64.59 156.154.64.58 156.154.64.56 156.154.64.55 156.154.64.54 156.154.64.52 156.154.64.51 156.154.64.5 156.154.64.49 156.154.64.48 156.154.64.47 156.154.64.46 156.154.64.43 156.154.64.42 156.154.64.41 156.154.64.38 156.154.64.36 156.154.64.35 156.154.64.32 156.154.64.31 156.154.64.30 156.154.64.27 156.154.64.254 156.154.64.253 156.154.64.252 156.154.64.251 156.154.64.250 156.154.64.25 156.154.64.249 156.154.64.248 156.154.64.247 156.154.64.246 156.154.64.245 156.154.64.243 156.154.64.242 156.154.64.241 156.154.64.24 156.154.64.239 156.154.64.238 156.154.64.237 156.154.64.236 156.154.64.234 156.154.64.233 156.154.64.231 156.154.64.230 156.154.64.228 156.154.64.227 156.154.64.226 156.154.64.225 156.154.64.223 156.154.64.22 156.154.64.219 156.154.64.218 156.154.64.216 156.154.64.215 156.154.64.213 156.154.64.212 156.154.64.211 156.154.64.210 156.154.64.21 156.154.64.209 156.154.64.208 156.154.64.207 156.154.64.206 156.154.64.205 156.154.64.204 156.154.64.202 156.154.64.201 156.154.64.200 156.154.64.199 156.154.64.197 156.154.64.196 156.154.64.195 156.154.64.194 156.154.64.191 156.154.64.19 156.154.64.189 156.154.64.188 156.154.64.183 156.154.64.182 156.154.64.181 156.154.64.18 156.154.64.177 156.154.64.176 156.154.64.175 156.154.64.174 156.154.64.173 156.154.64.172 156.154.64.170 156.154.64.17 156.154.64.168 156.154.64.167 156.154.64.166 156.154.64.165 156.154.64.162 156.154.64.157 156.154.64.156 156.154.64.155 156.154.64.154 156.154.64.153 156.154.64.151 156.154.64.150 156.154.64.15 156.154.64.148 156.154.64.146 156.154.64.142 156.154.64.14 156.154.64.139 156.154.64.138 156.154.64.137 156.154.64.136 156.154.64.135 156.154.64.134 156.154.64.133 156.154.64.131 156.154.64.130 156.154.64.13 156.154.64.129 156.154.64.128 156.154.64.127 156.154.64.123 156.154.64.121 156.154.64.120 156.154.64.119 156.154.64.118 156.154.64.117 156.154.64.116 156.154.64.115 156.154.64.114 156.154.64.112 156.154.64.111 156.154.64.11 156.154.64.109 156.154.64.108 156.154.64.107 156.154.64.104 156.154.64.103 156.154.64.102 156.154.64.100 156.154.64.1 156.154.55.15 156.154.55.1 156.154.54.8 156.154.54.15 156.154.54.13 156.154.143.99 156.154.143.98 156.154.143.92 156.154.143.91 156.154.143.9 156.154.143.89 156.154.143.87 156.154.143.82 156.154.143.79 156.154.143.78 156.154.143.77 156.154.143.76 156.154.143.73 156.154.143.72 156.154.143.71 156.154.143.68 156.154.143.64 156.154.143.60 156.154.143.55 156.154.143.53 156.154.143.51 156.154.143.48 156.154.143.46 156.154.143.45 156.154.143.44 156.154.143.43 156.154.143.42 156.154.143.41 156.154.143.39 156.154.143.38 156.154.143.37 156.154.143.34 156.154.143.32 156.154.143.31 156.154.143.3 156.154.143.29 156.154.143.28 156.154.143.254 156.154.143.253 156.154.143.252 156.154.143.250 156.154.143.248 156.154.143.247 156.154.143.245 156.154.143.243 156.154.143.242 156.154.143.241 156.154.143.240 156.154.143.237 156.154.143.235 156.154.143.232 156.154.143.230 156.154.143.23 156.154.143.226 156.154.143.225 156.154.143.224 156.154.143.223 156.154.143.222 156.154.143.221 156.154.143.22 156.154.143.218 156.154.143.217 156.154.143.216 156.154.143.215 156.154.143.213 156.154.143.212 156.154.143.211 156.154.143.210 156.154.143.207 156.154.143.206 156.154.143.204 156.154.143.20 156.154.143.199 156.154.143.198 156.154.143.196 156.154.143.194 156.154.143.191 156.154.143.190 156.154.143.189 156.154.143.188 156.154.143.184 156.154.143.182 156.154.143.181 156.154.143.178 156.154.143.173 156.154.143.171 156.154.143.170 156.154.143.165 156.154.143.164 156.154.143.160 156.154.143.159 156.154.143.151 156.154.143.150 156.154.143.15 156.154.143.148 156.154.143.146 156.154.143.145 156.154.143.140 156.154.143.14 156.154.143.136 156.154.143.135 156.154.143.134 156.154.143.133 156.154.143.131 156.154.143.130 156.154.143.128 156.154.143.120 156.154.143.12 156.154.143.119 156.154.143.117 156.154.143.113 156.154.143.112 156.154.143.106 156.154.143.105 156.154.143.103 156.154.143.10 156.154.142.86 156.154.142.84 156.154.142.79 156.154.142.71 156.154.142.7 156.154.142.61 156.154.142.59 156.154.142.53 156.154.142.5 156.154.142.49 156.154.142.46 156.154.142.43 156.154.142.41 156.154.142.4 156.154.142.36 156.154.142.31 156.154.142.28 156.154.142.23 156.154.142.225 156.154.142.213 156.154.142.203 156.154.142.201 156.154.142.200 156.154.142.195 156.154.142.179 156.154.142.169 156.154.142.166 156.154.142.165 156.154.142.164 156.154.142.16 156.154.142.156 156.154.142.152 156.154.142.150 156.154.142.149 156.154.142.142 156.154.142.14 156.154.142.133 156.154.142.132 156.154.142.128 156.154.142.119 156.154.142.112 156.154.142.102 156.154.141.91 156.154.141.9 156.154.141.88 156.154.141.85 156.154.141.82 156.154.141.81 156.154.141.71 156.154.141.69 156.154.141.46 156.154.141.254 156.154.141.236 156.154.141.235 156.154.141.230 156.154.141.229 156.154.141.227 156.154.141.217 156.154.141.213 156.154.141.203 156.154.141.201 156.154.141.198 156.154.141.19 156.154.141.188 156.154.141.185 156.154.141.176 156.154.141.159 156.154.141.153 156.154.141.148 156.154.141.146 156.154.141.138 156.154.141.127 156.154.141.120 156.154.140.98 156.154.140.96 156.154.140.94 156.154.140.93 156.154.140.9 156.154.140.89 156.154.140.87 156.154.140.81 156.154.140.76 156.154.140.75 156.154.140.74 156.154.140.72 156.154.140.71 156.154.140.63 156.154.140.60 156.154.140.50 156.154.140.41 156.154.140.4 156.154.140.37 156.154.140.36 156.154.140.33 156.154.140.28 156.154.140.252 156.154.140.251 156.154.140.250 156.154.140.248 156.154.140.246 156.154.140.244 156.154.140.243 156.154.140.242 156.154.140.238 156.154.140.237 156.154.140.234 156.154.140.233 156.154.140.23 156.154.140.229 156.154.140.227 156.154.140.224 156.154.140.220 156.154.140.215 156.154.140.212 156.154.140.203 156.154.140.201 156.154.140.199 156.154.140.198 156.154.140.196 156.154.140.195 156.154.140.193 156.154.140.188 156.154.140.183 156.154.140.180 156.154.140.179 156.154.140.178 156.154.140.172 156.154.140.169 156.154.140.168 156.154.140.165 156.154.140.163 156.154.140.161 156.154.140.156 156.154.140.153 156.154.140.152 156.154.140.145 156.154.140.144 156.154.140.14 156.154.140.134 156.154.140.131 156.154.140.130 156.154.140.129 156.154.140.127 156.154.140.120 156.154.140.119 156.154.140.117 156.154.140.116 156.154.140.111 156.154.140.108 156.154.140.107 156.154.140.1 155.4.163.233 155.33.195.106 155.133.119.188 154.72.69.26 154.70.151.53 154.70.149.42 154.66.240.30 154.65.61.1 154.63.11.0 154.61.69.45 154.44.130.160 154.27.66.183 154.236.179.226 154.160.70.6 154.159.248.54 154.14.16.251 154.127.234.250 154.126.92.178 154.126.209.249 154.118.190.94 154.113.65.122 154.10.6.11 153.246.64.54 153.246.37.6 153.19.89.89 153.19.161.6 153.19.105.120 153.156.93.5 153.153.150.28 153.150.154.214 153.120.88.148 152.26.59.3 152.231.78.50 152.230.47.28 152.230.113.98 152.230.112.34 152.228.172.176 152.200.186.94 152.165.116.5 152.158.36.48 152.149.40.2 152.149.135.10 152.117.254.193 152.101.123.194 151.80.42.104 151.80.28.5 151.80.28.48 151.80.25.178 151.80.238.97 151.80.19.146 151.80.177.171 151.80.140.68 151.8.37.148 151.237.86.81 151.237.55.39 151.237.141.109 151.237.111.135 151.192.63.2 151.192.60.134 151.192.44.238 151.14.208.163 151.1.212.6 151.1.165.85 151.0.52.85 150.254.190.122 150.240.97.236 150.240.97.199 150.240.97.192 150.220.181.150 15.236.150.25 15.235.33.251 15.204.157.214 15.188.45.248 149.91.3.9 149.76.67.57 149.62.241.50 149.255.28.62 149.202.84.49 149.202.82.130 149.202.81.7 149.202.36.53 149.202.157.139 149.202.145.242 149.154.159.92 149.129.119.137 149.126.23.226 149.112.149.112 149.112.122.30 149.112.122.20 149.112.122.10 149.112.121.30 149.112.121.20 149.112.121.10 149.112.112.9 149.112.112.13 149.112.112.12 149.112.112.112 149.112.112.11 149.112.112.10 149.106.172.178 148.81.188.146 148.78.200.7 148.76.114.50 148.72.246.219 148.72.144.60 148.251.24.48 148.251.202.168 148.251.133.165 148.247.156.27 148.245.196.68 148.244.91.61 148.244.89.212 148.244.211.136 148.244.179.157 148.244.114.30 148.244.108.33 148.243.227.67 148.243.195.206 148.243.126.229 148.235.82.66 148.235.148.162 148.233.136.82 148.205.40.11 148.205.228.17 148.205.228.11 148.102.51.97 148.102.50.30 147.50.47.189 147.50.47.185 147.50.47.181 147.50.36.138 147.50.18.146 147.135.207.73 147.135.131.46 147.135.130.233 146.88.67.162 146.88.38.231 146.71.84.161 146.71.76.129 146.59.15.173 146.196.40.203 146.158.30.143 146.155.226.12 146.120.19.126 146.112.41.5 146.112.41.4 146.112.41.2 146.0.23.67 145.255.5.183 145.255.31.145 145.239.94.164 145.239.196.217 145.239.186.86 145.236.190.166 145.131.24.226 145.131.142.83 144.91.97.18 144.91.69.91 144.91.123.182 144.91.122.26 144.91.107.114 144.48.115.72 144.48.109.239 144.48.109.231 144.202.20.89 144.139.9.180 144.137.210.182 144.129.45.42 144.126.129.147 143.244.162.177 143.244.136.178 143.233.233.142 143.208.182.103 143.208.0.14 143.0.226.116 143.0.111.78 142.44.192.51 142.190.83.129 142.11.217.5 142.11.215.140 142.11.213.209 142.11.200.36 141.95.65.106 141.95.155.209 141.94.143.35 141.195.95.131 141.193.223.166 141.136.112.107 141.101.234.131 141.1.27.249 141.1.1.1 141.0.102.130 140.227.38.198 14.97.85.129 14.97.106.65 14.96.97.193 14.96.97.162 14.96.97.160 14.96.106.114 14.63.225.15 14.63.217.237 14.63.217.12 14.63.196.128 14.56.77.168 14.54.45.37 14.52.27.10 14.51.109.49 14.50.118.125 14.47.217.72 14.43.82.31 14.42.230.214 14.41.60.11 14.41.60.10 14.36.32.8 14.35.201.12 14.33.27.243 14.33.27.240 14.241.35.56 14.241.236.220 14.241.225.212 14.225.246.17 14.225.16.66 14.224.129.15 14.200.94.202 14.200.249.18 14.198.169.236 14.198.168.140 14.192.25.141 14.178.144.53 14.161.47.108 14.161.36.134 14.161.252.185 14.160.87.86 14.140.206.30 14.139.234.242 14.128.21.30 139.91.235.18 139.64.162.129 139.18.25.34 139.18.25.33 139.162.33.25 139.162.122.189 139.162.107.204 139.135.130.148 139.134.5.51 139.134.2.190 139.130.4.4 139.130.124.242 138.99.205.1 138.97.177.27 138.94.56.4 138.91.252.187 138.91.167.7 138.68.74.166 138.255.167.106 138.255.108.121 138.219.50.74 138.219.249.221 138.204.240.26 138.201.225.189 138.186.166.164 138.185.2.206 138.185.16.6 138.128.241.232 138.122.4.226 138.121.114.217 138.121.114.185 138.0.89.142 138.0.120.199 137.74.226.27 137.66.16.204 137.220.33.124 137.184.216.0 137.118.1.32 137.118.1.106 137.103.64.198 136.244.97.119 136.243.93.187 136.243.170.238 136.243.151.59 136.243.103.8 135.181.20.96 134.90.140.29 134.75.195.7 134.75.122.2 134.35.6.220 134.35.192.16 134.35.188.122 134.35.185.31 134.35.172.170 134.255.247.23 134.236.245.30 134.209.17.114 134.195.4.2 134.17.4.251 134.122.47.67 134.122.23.38 134.119.184.220 134.119.184.218 133.18.71.5 133.167.104.150 132.255.228.168 132.148.83.193 132.148.78.54 132.148.18.164 132.145.89.151 131.255.137.57 131.255.136.10 131.221.81.1 131.196.220.10 131.196.22.222 131.196.115.45 131.196.115.39 131.196.115.190 131.148.181.242 131.100.51.65 131.100.48.73 130.93.54.181 130.93.191.141 130.93.184.27 130.61.69.123 130.61.64.122 130.255.159.152 130.255.153.137 130.255.145.195 130.255.121.9 130.244.126.99 130.105.145.84 13.95.90.89 13.76.130.172 13.67.61.31 13.49.107.2 13.237.33.153 129.7.81.41 129.7.81.40 129.7.234.150 129.250.35.251 129.250.35.250 129.153.52.146 129.126.84.102 129.126.63.122 129.126.150.172 129.126.119.238 128.92.65.181 128.92.36.51 128.238.2.38 128.134.180.196 128.134.135.200 128.127.90.39 128.127.17.20 126.249.83.70 126.249.64.222 126.249.167.193 126.249.167.161 125.7.139.15 125.63.106.202 125.61.60.151 125.61.60.133 125.61.60.132 125.254.55.83 125.254.55.66 125.235.11.66 125.234.238.3 125.234.121.6 125.23.227.44 125.229.59.173 125.229.181.204 125.229.101.233 125.228.97.10 125.228.209.195 125.228.169.101 125.228.144.5 125.227.89.44 125.227.77.87 125.227.128.229 125.214.90.2 125.213.255.4 125.209.80.106 125.209.101.172 125.206.226.66 125.206.220.10 125.206.218.49 125.20.46.206 125.19.19.84 125.18.241.103 125.16.252.73 125.143.136.8 125.141.226.248 125.141.226.247 125.141.196.236 125.140.123.200 125.138.119.126 125.134.180.69 125.130.169.142 124.9.53.99 124.82.2.186 124.40.249.202 124.35.154.159 124.35.115.150 124.33.8.69 124.32.115.205 124.254.74.246 124.248.191.83 124.155.197.234 124.146.185.97 124.137.207.115 124.107.131.17 124.107.126.1 124.107.105.97 124.106.99.238 124.106.234.45 124.106.13.147 124.106.103.113 124.105.219.222 124.105.219.198 124.105.219.106 124.105.217.62 124.105.217.50 124.105.214.82 124.105.214.174 124.105.214.110 124.105.212.198 124.105.212.194 124.105.212.158 124.105.212.146 124.105.209.234 124.105.157.110 124.105.154.90 124.105.154.238 124.105.151.86 124.105.150.94 123.51.244.77 123.49.39.106 123.30.27.24 123.30.210.134 123.30.187.240 123.30.184.141 123.30.175.83 123.30.175.82 123.30.116.18 123.252.254.74 123.252.254.26 123.252.254.22 123.252.215.25 123.252.214.45 123.252.213.83 123.25.15.217 123.25.129.97 123.248.242.21 123.243.55.86 123.24.206.120 123.226.235.68 123.215.198.209 123.205.156.16 123.200.168.132 123.200.11.90 123.176.98.140 123.176.4.39 123.176.4.227 123.176.4.224 123.176.4.2 123.176.31.226 123.176.27.94 123.142.124.146 123.140.194.2 123.109.246.249 122.55.80.210 122.55.4.89 122.55.34.214 122.55.31.181 122.55.242.174 122.55.236.166 122.55.216.174 122.55.204.1 122.55.203.38 122.55.16.1 122.55.159.150 122.55.158.66 122.55.158.162 122.55.145.178 122.55.145.150 122.55.143.226 122.55.143.170 122.55.142.178 122.55.142.154 122.55.111.98 122.55.102.170 122.54.95.78 122.54.86.193 122.54.86.1 122.54.78.230 122.54.69.14 122.54.69.130 122.54.62.137 122.54.51.2 122.54.23.49 122.54.21.218 122.54.17.114 122.53.95.26 122.53.95.126 122.53.221.170 122.53.218.12 122.53.214.65 122.53.213.74 122.53.191.170 122.53.190.38 122.53.184.177 122.53.179.133 122.53.148.218 122.53.148.193 122.53.122.234 122.52.251.163 122.52.229.125 122.52.117.51 122.3.232.38 122.3.22.133 122.3.205.241 122.252.241.166 122.252.222.157 122.214.1.141 122.211.89.209 122.210.62.171 122.2.5.42 122.2.29.66 122.187.48.102 122.186.116.209 122.185.99.78 122.185.99.106 122.185.251.225 122.185.198.242 122.185.135.135 122.185.113.244 122.18.242.92 122.18.232.147 122.160.254.158 122.155.37.109 122.155.1.72 122.154.136.56 122.15.192.21 122.147.248.147 122.117.187.15 122.117.151.111 122.116.8.109 122.11.249.26 122.1.33.1 121.91.48.192 121.78.116.111 121.58.248.195 121.58.203.4 121.50.200.15 121.4.4.41 121.4.4.246 121.254.193.196 121.254.171.228 121.254.134.99 121.202.148.156 121.189.15.8 121.188.121.59 121.184.236.110 121.183.253.122 121.183.146.212 121.182.244.180 121.182.199.17 121.182.194.189 121.181.11.82 121.180.180.71 121.180.117.234 121.176.16.144 121.174.253.216 121.174.236.100 121.166.56.200 121.166.237.218 121.166.237.204 121.166.157.11 121.156.65.149 121.156.120.240 121.156.104.183 121.156.104.182 121.155.94.225 121.153.88.212 121.152.181.152 121.151.111.5 121.146.2.10 121.139.218.165 121.133.171.50 121.131.194.203 121.129.56.60 121.128.176.211 121.125.71.40 121.125.71.213 121.125.68.67 121.122.55.58 121.119.138.109 120.88.120.137 120.72.85.169 120.72.85.167 120.72.106.125 120.57.113.146 120.53.53.84 120.53.53.198 120.53.53.137 120.53.53.116 120.50.42.142 120.28.196.176 120.28.194.84 120.138.27.84 120.138.22.174 12.97.172.197 12.71.198.244 12.71.108.154 12.68.237.194 12.55.50.170 12.51.21.245 12.40.39.6 12.40.39.5 12.28.98.3 12.221.3.59 12.221.135.162 12.218.209.130 12.216.90.50 12.216.22.17 12.200.123.164 12.20.121.22 12.189.150.34 12.186.153.128 12.181.159.78 12.171.191.58 12.148.208.86 12.127.17.72 12.127.17.71 12.127.16.77 12.127.16.67 12.12.131.134 12.109.212.19 12.107.114.42 12.0.210.194 119.93.121.146 119.92.80.57 119.92.65.97 119.92.223.242 119.92.197.6 119.92.192.241 119.92.191.34 119.92.187.97 119.92.163.10 119.92.150.133 119.92.117.102 119.9.73.44 119.75.28.242 119.73.184.241 119.73.138.17 119.73.105.7 119.68.137.99 119.59.117.3 119.59.113.138 119.207.62.155 119.205.209.167 119.204.80.25 119.203.236.251 119.201.211.21 119.201.108.71 119.199.215.81 119.198.142.165 119.197.120.3 119.18.36.102 119.17.75.70 119.156.24.134 119.152.243.157 119.110.212.115 119.10.181.138 118.99.210.36 118.98.223.17 118.91.129.65 118.91.10.17 118.70.203.68 118.70.177.223 118.69.65.41 118.69.246.104 118.69.197.82 118.69.157.184 118.69.134.83 118.69.109.45 118.47.242.4 118.45.48.177 118.40.29.112 118.38.9.207 118.37.195.251 118.3.227.163 118.26.111.53 118.238.203.252 118.238.11.132 118.233.57.133 118.232.137.224 118.220.172.122 118.220.16.99 118.218.6.137 118.217.180.182 118.21.162.12 118.201.56.26 118.201.53.209 118.201.211.82 118.201.187.122 118.179.84.158 118.175.16.66 118.173.197.174 118.163.7.54 118.163.40.163 118.143.97.54 118.127.62.178 118.103.239.9 118.103.239.33 117.55.243.14 117.54.3.237 117.53.152.76 117.52.99.143 117.4.91.86 117.206.156.235 117.20.67.244 117.20.54.245 117.20.54.242 117.2.80.119 117.2.18.50 117.16.191.7 117.122.125.106 117.121.215.99 117.121.215.101 117.103.228.101 117.102.214.93 116.91.115.190 116.82.248.104 116.73.110.135 116.71.135.74 116.68.126.100 116.58.187.189 116.50.230.138 116.50.180.210 116.48.144.195 116.48.132.6 116.250.217.39 116.212.100.98 116.203.32.217 116.203.181.6 116.203.180.236 116.202.21.65 116.125.157.67 116.125.124.79 116.122.39.197 116.121.52.43 116.121.27.10 116.120.11.6 116.12.215.137 116.12.206.109 116.12.172.241 116.118.119.167 116.100.88.123 115.99.215.16 115.99.213.7 115.99.212.118 115.99.187.128 115.99.102.41 115.96.208.210 115.96.149.199 115.95.56.126 115.84.79.71 115.79.7.63 115.79.5.78 115.73.220.183 115.70.225.190 115.69.240.6 115.68.110.146 115.42.222.113 115.42.210.81 115.42.204.234 115.31.133.178 115.23.219.218 115.178.53.146 115.160.160.146 115.147.21.134 115.146.254.38 115.146.252.198 115.146.250.193 115.146.249.49 115.146.199.242 115.146.192.90 115.146.192.218 115.146.189.170 115.146.174.102 115.146.127.181 115.146.120.140 115.126.20.15 114.7.120.14 114.6.46.153 114.34.176.73 114.33.89.166 114.33.53.151 114.33.41.219 114.32.23.229 114.199.226.206 114.198.144.44 114.179.13.90 114.160.59.146 114.160.203.201 114.160.194.67 114.156.146.116 114.143.91.103 114.143.88.197 114.143.37.233 114.143.34.54 114.143.34.228 114.143.34.218 114.130.5.6 114.130.5.5 114.114.115.115 114.114.114.114 114.108.141.187 113.61.224.12 113.52.197.14 113.42.99.133 113.28.94.231 113.28.71.243 113.28.67.147 113.28.67.105 113.255.5.34 113.22.113.64 113.198.254.2 113.196.55.130 113.190.253.229 113.176.7.202 113.174.246.243 113.165.96.215 113.165.94.135 113.164.80.4 113.163.222.44 113.162.247.163 113.161.76.34 113.161.71.132 113.161.30.2 113.161.230.20 113.161.230.19 113.161.208.18 113.161.196.15 113.161.180.214 113.161.18.44 113.161.169.161 113.161.163.169 113.161.116.150 113.160.250.45 113.160.232.172 113.160.227.246 113.160.226.179 113.160.155.57 113.160.116.252 113.149.254.97 112.76.169.12 112.76.132.49 112.220.81.150 112.216.251.98 112.216.19.69 112.216.19.68 112.216.138.50 112.199.115.40 112.198.179.23 112.196.19.243 112.186.103.96 112.175.232.142 112.173.44.139 112.172.7.207 112.169.182.143 112.157.117.247 112.154.101.76 112.133.241.244 112.133.198.54 112.133.114.222 112.121.184.34 111.92.96.96 111.92.96.19 111.92.85.233 111.92.189.105 111.92.106.148 111.92.105.39 111.92.100.55 111.68.108.215 111.68.108.200 111.125.72.190 111.118.223.243 111.118.147.236 110.9.165.5 110.78.18.44 110.77.149.172 110.76.152.20 110.49.95.45 110.49.78.20 110.49.144.179 110.49.124.74 110.49.124.73 110.49.123.26 110.49.123.187 110.49.11.170 110.45.182.88 110.44.123.48 110.4.40.214 110.174.24.94 110.170.140.105 110.164.95.66 110.164.71.170 110.164.241.236 110.164.193.206 110.164.151.194 110.164.139.66 110.164.139.186 110.15.182.99 110.15.182.145 110.145.166.222 110.145.154.62 110.143.26.239 110.143.148.183 110.142.40.60 109.96.66.14 109.92.27.159 109.92.133.78 109.75.45.3 109.75.41.201 109.73.42.171 109.73.39.154 109.72.239.247 109.69.6.30 109.68.15.212 109.68.14.61 109.5.33.66 109.248.212.9 109.248.2.1 109.248.157.46 109.248.157.118 109.245.230.145 109.241.116.68 109.238.224.178 109.237.94.186 109.235.216.5 109.234.249.10 109.234.248.10 109.233.192.72 109.232.88.4 109.232.88.3 109.228.8.84 109.228.8.83 109.228.22.126 109.228.21.223 109.228.16.144 109.228.1.132 109.228.0.238 109.226.199.197 109.224.233.190 109.224.233.174 109.203.100.192 109.202.11.6 109.200.180.226 109.199.77.76 109.199.253.44 109.197.71.34 109.197.107.104 109.195.146.245 109.194.118.24 109.168.65.86 109.163.232.228 109.160.96.238 109.125.204.16 109.117.16.197 109.111.9.14 109.111.8.0 109.111.75.114 109.111.117.212 109.111.112.58 109.110.44.12 109.110.40.41 109.110.40.214 109.110.238.65 109.105.55.39 109.105.45.31 109.105.45.30 109.105.40.34 108.41.102.212 108.162.196.93 108.162.196.91 108.162.196.79 108.162.196.77 108.162.196.75 108.162.196.67 108.162.196.62 108.162.196.3 108.162.196.245 108.162.196.238 108.162.196.229 108.162.196.219 108.162.196.212 108.162.196.21 108.162.196.205 108.162.196.20 108.162.196.199 108.162.196.180 108.162.196.173 108.162.196.17 108.162.196.16 108.162.196.15 108.162.196.129 108.162.196.12 108.162.195.95 108.162.195.94 108.162.195.93 108.162.195.91 108.162.195.8 108.162.195.7 108.162.195.67 108.162.195.65 108.162.195.45 108.162.195.42 108.162.195.36 108.162.195.31 108.162.195.30 108.162.195.29 108.162.195.247 108.162.195.246 108.162.195.220 108.162.195.208 108.162.195.202 108.162.195.197 108.162.195.183 108.162.195.181 108.162.195.172 108.162.195.167 108.162.195.163 108.162.195.137 108.162.195.135 108.162.195.132 108.162.195.127 108.162.195.118 108.162.195.113 108.162.194.93 108.162.194.87 108.162.194.85 108.162.194.78 108.162.194.64 108.162.194.6 108.162.194.56 108.162.194.5 108.162.194.40 108.162.194.36 108.162.194.35 108.162.194.32 108.162.194.3 108.162.194.252 108.162.194.251 108.162.194.25 108.162.194.249 108.162.194.24 108.162.194.23 108.162.194.229 108.162.194.227 108.162.194.215 108.162.194.213 108.162.194.201 108.162.194.193 108.162.194.186 108.162.194.182 108.162.194.180 108.162.194.177 108.162.194.159 108.162.194.153 108.162.194.152 108.162.194.150 108.162.194.141 108.162.194.127 108.162.194.120 108.162.194.112 108.162.194.11 108.162.194.105 108.162.194.103 108.162.194.10 108.162.193.99 108.162.193.94 108.162.193.83 108.162.193.70 108.162.193.37 108.162.193.33 108.162.193.32 108.162.193.250 108.162.193.242 108.162.193.227 108.162.193.226 108.162.193.225 108.162.193.224 108.162.193.221 108.162.193.207 108.162.193.201 108.162.193.198 108.162.193.181 108.162.193.161 108.162.193.154 108.162.193.151 108.162.193.139 108.162.193.130 108.162.193.112 108.162.193.111 108.162.193.108 108.162.193.106 108.162.193.104 108.162.192.8 108.162.192.79 108.162.192.66 108.162.192.65 108.162.192.45 108.162.192.35 108.162.192.3 108.162.192.27 108.162.192.254 108.162.192.248 108.162.192.238 108.162.192.237 108.162.192.234 108.162.192.208 108.162.192.200 108.162.192.19 108.162.192.185 108.162.192.183 108.162.192.164 108.162.192.162 108.162.192.149 108.162.192.146 108.162.192.140 108.162.192.14 108.162.192.136 108.162.192.134 108.162.192.127 108.162.192.124 108.161.133.137 107.80.51.240 107.80.230.195 107.80.230.178 107.241.236.99 107.241.236.106 107.241.170.173 107.189.31.10 107.182.193.69 107.170.102.45 107.144.121.130 107.130.51.137 107.125.177.89 107.0.218.126 106.0.61.250 105.30.247.93 105.29.89.225 105.255.121.94 105.247.182.102 105.244.179.78 105.244.179.225 105.243.201.129 105.243.179.28 105.243.179.199 105.243.179.17 105.243.178.87 105.242.63.54 104.60.85.131 104.245.55.17 104.245.144.98 104.232.6.1 104.207.130.197 104.187.69.92 104.168.159.220 104.155.237.225 104.131.163.103 103.99.150.10 103.99.110.113 103.95.148.6 103.93.150.184 103.90.162.6 103.9.88.154 103.86.99.100 103.86.96.100 103.86.135.166 103.86.103.29 103.84.96.6 103.84.132.2 103.84.119.230 103.84.119.226 103.84.119.192 103.84.119.172 103.83.33.13 103.82.242.153 103.82.241.138 103.80.1.193 103.79.74.1 103.78.35.229 103.77.227.162 103.77.188.19 103.77.188.18 103.74.230.32 103.74.228.89 103.74.228.39 103.74.228.177 103.7.172.8 103.7.172.7 103.68.156.122 103.67.152.193 103.65.240.147 103.59.52.3 103.59.176.154 103.58.120.120 103.57.71.89 103.57.71.38 103.57.71.2 103.57.71.156 103.57.71.145 103.57.71.140 103.57.71.137 103.57.71.120 103.57.71.102 103.57.70.98 103.57.70.62 103.57.70.34 103.57.70.220 103.57.70.103 103.53.228.24 103.51.144.216 103.51.144.214 103.51.144.212 103.51.139.51 103.50.215.236 103.5.148.99 103.5.148.100 103.48.78.157 103.48.78.156 103.48.207.78 103.35.140.52 103.35.140.43 103.30.245.97 103.28.39.63 103.28.37.218 103.28.114.57 103.26.170.103 103.251.105.188 103.250.28.6 103.249.33.206 103.247.156.200 103.246.244.143 103.242.58.167 103.242.58.166 103.242.124.7 103.241.181.28 103.239.32.81 103.239.32.36 103.239.165.34 103.237.97.164 103.237.147.46 103.237.127.20 103.232.32.246 103.23.223.249 103.228.35.43 103.225.36.238 103.225.36.226 103.22.245.50 103.22.181.122 103.217.216.122 103.215.16.230 103.213.202.166 103.211.26.243 103.211.153.41 103.209.199.8 103.209.199.6 103.209.199.114 103.209.199.107 103.206.247.194 103.205.178.9 103.204.68.85 103.204.68.48 103.204.68.219 103.204.68.165 103.204.246.241 103.202.221.88 103.202.221.69 103.202.221.53 103.202.221.40 103.202.221.34 103.202.221.224 103.202.221.210 103.202.221.200 103.202.221.178 103.202.221.163 103.202.221.149 103.202.221.12 103.202.221.107 103.200.218.78 103.200.218.77 103.20.28.2 103.20.184.97 103.20.184.81 103.20.152.11 103.198.19.2 103.196.38.8 103.196.38.39 103.196.38.38 103.196.16.2 103.196.136.7 103.191.85.74 103.191.85.56 103.191.85.50 103.191.85.46 103.191.85.45 103.191.85.168 103.191.85.164 103.191.84.84 103.191.84.54 103.191.84.50 103.191.84.28 103.191.84.186 103.191.84.112 103.191.84.10 103.190.43.95 103.190.43.24 103.190.43.227 103.190.43.148 103.190.178.190 103.190.169.4 103.186.253.5 103.186.253.244 103.186.253.243 103.186.253.240 103.186.253.185 103.186.253.114 103.186.253.112 103.186.253.109 103.186.252.56 103.186.252.29 103.186.252.218 103.185.25.167 103.184.180.241 103.183.16.25 103.181.123.94 103.181.123.9 103.181.123.86 103.181.123.83 103.181.123.76 103.181.123.68 103.181.123.65 103.181.123.5 103.181.123.36 103.181.123.241 103.181.123.231 103.181.123.212 103.181.123.196 103.181.123.19 103.181.123.188 103.181.123.141 103.181.123.134 103.181.123.109 103.181.122.92 103.181.122.6 103.181.122.249 103.181.122.241 103.181.122.236 103.181.122.17 103.181.122.16 103.181.122.158 103.181.122.148 103.181.122.131 103.181.122.108 103.181.122.105 103.181.122.101 103.18.138.20 103.179.182.47 103.179.182.237 103.178.86.41 103.178.194.131 103.177.234.10 103.176.159.18 103.175.2.235 103.174.224.9 103.174.224.87 103.174.224.84 103.174.224.70 103.174.224.50 103.174.224.41 103.174.224.39 103.174.224.38 103.174.224.247 103.174.224.241 103.174.224.225 103.174.224.222 103.174.224.22 103.174.224.21 103.174.224.208 103.174.224.184 103.174.224.151 103.174.224.140 103.174.224.124 103.174.224.119 103.174.224.117 103.174.224.10 103.174.224.0 103.174.102.61 103.173.173.173 103.173.152.233 103.172.197.43 103.172.172.51 103.171.182.73 103.171.180.48 103.170.90.121 103.170.172.95 103.170.172.79 103.170.172.77 103.170.172.73 103.170.172.61 103.170.172.50 103.170.172.38 103.170.172.3 103.170.172.254 103.170.172.252 103.170.172.249 103.170.172.246 103.170.172.232 103.170.172.221 103.170.172.220 103.170.172.203 103.170.172.199 103.170.172.185 103.170.172.182 103.170.172.175 103.170.172.164 103.170.172.163 103.170.172.162 103.170.172.157 103.170.172.151 103.170.172.148 103.170.172.147 103.170.172.138 103.170.172.127 103.170.172.113 103.170.172.111 103.17.176.84 103.17.176.81 103.17.176.73 103.17.176.32 103.17.176.31 103.17.176.3 103.17.176.251 103.17.176.240 103.17.176.231 103.17.176.215 103.17.176.214 103.17.176.182 103.17.176.181 103.17.176.175 103.17.176.173 103.17.176.146 103.17.176.133 103.17.176.128 103.17.176.117 103.17.176.115 103.169.187.67 103.168.29.185 103.168.177.230 103.166.171.69 103.165.4.82 103.165.39.50 103.165.165.68 103.165.154.1 103.165.118.76 103.165.118.179 103.164.116.180 103.163.117.61 103.163.117.223 103.162.57.37 103.161.42.2 103.161.31.137 103.161.128.130 103.161.128.128 103.16.63.166 103.16.25.47 103.16.25.46 103.16.118.11 103.159.251.209 103.159.195.40 103.159.195.234 103.159.195.156 103.157.152.6 103.156.86.78 103.156.86.29 103.156.75.132 103.156.66.254 103.156.239.193 103.156.239.106 103.155.64.208 103.155.42.204 103.155.42.150 103.155.42.130 103.155.199.45 103.155.198.142 103.155.174.87 103.155.174.85 103.155.174.68 103.155.174.113 103.155.174.109 103.154.49.74 103.154.241.252 103.154.2.93 103.154.16.58 103.154.16.5 103.154.16.34 103.154.16.32 103.154.16.30 103.154.16.255 103.154.16.25 103.154.16.238 103.154.16.228 103.154.16.217 103.154.16.210 103.154.16.208 103.154.16.177 103.154.16.148 103.154.16.136 103.154.16.128 103.154.16.115 103.154.16.101 103.153.49.82 103.153.49.41 103.153.49.251 103.153.48.83 103.153.48.27 103.153.48.25 103.153.191.42 103.153.190.78 103.153.190.238 103.152.143.244 103.152.101.135 103.151.246.46 103.151.226.62 103.151.226.42 103.151.155.21 103.15.246.182 103.149.165.83 103.149.165.162 103.148.178.80 103.148.178.77 103.148.178.7 103.148.178.63 103.148.178.59 103.148.178.54 103.148.178.50 103.148.178.35 103.148.178.3 103.148.178.20 103.148.178.179 103.148.178.161 103.148.178.104 103.148.130.112 103.148.112.146 103.146.55.82 103.146.55.67 103.146.55.61 103.146.55.53 103.146.55.49 103.146.55.48 103.146.55.39 103.146.55.27 103.146.55.250 103.146.55.247 103.146.55.243 103.146.55.171 103.146.55.157 103.146.55.153 103.146.55.142 103.146.55.14 103.146.55.137 103.146.55.133 103.146.55.131 103.146.55.124 103.146.55.108 103.146.54.25 103.146.54.247 103.146.54.244 103.146.54.24 103.146.54.218 103.146.54.217 103.146.54.112 103.146.54.104 103.145.36.151 103.145.165.91 103.145.165.7 103.145.165.59 103.145.165.42 103.145.165.235 103.145.165.233 103.145.165.226 103.145.165.213 103.145.165.206 103.145.165.204 103.145.165.196 103.145.165.172 103.145.165.155 103.145.165.116 103.145.164.99 103.145.164.94 103.145.164.85 103.145.164.81 103.145.164.77 103.145.164.70 103.145.164.57 103.145.164.52 103.145.164.51 103.145.164.50 103.145.164.5 103.145.164.39 103.145.164.32 103.145.164.247 103.145.164.239 103.145.164.234 103.145.164.231 103.145.164.226 103.145.164.221 103.145.164.218 103.145.164.206 103.145.164.203 103.145.164.186 103.145.164.18 103.145.164.178 103.145.164.162 103.145.164.153 103.145.164.141 103.145.164.14 103.145.164.113 103.144.144.58 103.143.237.9 103.143.237.85 103.143.237.82 103.143.237.40 103.143.237.206 103.143.237.172 103.143.237.165 103.143.237.140 103.143.237.136 103.143.237.10 103.143.236.96 103.143.236.89 103.143.236.37 103.143.236.233 103.143.236.219 103.143.236.203 103.143.236.200 103.143.236.181 103.143.236.142 103.143.236.105 103.142.147.14 103.141.200.98 103.141.200.97 103.141.200.75 103.141.200.12 103.140.25.69 103.140.25.43 103.140.25.36 103.140.25.223 103.140.25.191 103.140.25.121 103.140.25.115 103.140.25.100 103.140.24.95 103.140.24.75 103.140.24.248 103.140.24.244 103.140.24.209 103.140.24.201 103.140.24.175 103.140.24.158 103.140.24.148 103.140.24.14 103.140.24.130 103.140.24.125 103.140.24.124 103.140.24.115 103.140.24.105 103.140.24.102 103.140.17.242 103.139.14.2 103.138.51.141 103.138.175.58 103.138.175.22 103.137.156.3 103.137.10.193 103.135.172.78 103.135.172.73 103.135.172.60 103.135.172.37 103.135.172.31 103.135.172.28 103.135.172.199 103.135.172.197 103.135.172.191 103.135.172.141 103.135.172.117 103.135.138.6 103.135.135.64 103.134.44.222 103.133.122.148 103.132.52.32 103.132.52.31 103.132.242.59 103.130.4.82 103.130.4.8 103.13.41.2 103.13.123.16 103.13.112.251 103.129.211.142 103.129.211.13 103.126.87.123 103.126.201.33 103.126.201.129 103.126.201.1 103.125.163.241 103.124.225.75 103.123.226.10 103.123.225.10 103.122.65.97 103.122.29.129 103.122.252.82 103.122.252.81 103.121.228.5 103.121.228.1 103.120.111.2 103.12.31.83 103.12.2.11 103.119.146.46 103.119.126.68 103.119.109.162 103.119.109.160 103.118.178.18 103.117.63.67 103.115.119.41 103.115.118.210 103.115.118.201 103.115.118.197 103.115.118.113 103.112.207.159 103.112.204.37 103.112.12.214 103.111.122.2 103.109.39.79 103.109.239.243 103.109.239.242 103.108.9.217 103.107.186.1 103.106.219.117 103.105.78.207 103.105.64.163 103.105.212.98 103.103.88.39 103.103.127.169 103.103.126.6 103.103.126.110 103.103.125.253 103.103.125.247 103.103.125.133 103.103.125.130 103.103.124.70 103.103.124.247 103.103.124.212 103.103.124.200 103.103.124.144 103.103.124.120 103.102.250.37 103.102.250.209 103.102.250.127 103.102.250.102 103.102.136.102 103.10.171.230 102.91.8.126 102.68.79.77 102.67.139.204 102.64.76.49 102.50.253.95 102.33.47.78 102.33.46.203 102.33.45.23 102.33.45.152 102.221.92.53 102.221.244.1 102.221.12.46 102.22.81.43 102.22.81.114 102.22.72.24 102.22.108.2 102.219.209.155 102.218.172.222 102.217.29.78 102.217.123.98 102.216.69.18 102.216.223.14 102.212.226.177 102.176.81.182 102.164.255.149 102.16.68.12 102.141.244.134 102.133.139.27 101.255.119.209 101.198.198.198 101.110.40.25 101.102.196.118 101.102.103.104 101.101.101.101 101.0.97.70 101.0.6.195 1.9.70.93 1.9.70.86 1.9.70.84 1.9.165.210 1.9.111.99 1.9.111.97 1.4.203.13 1.4.155.85 1.38.3.52 1.38.3.168 1.38.3.167 1.34.94.130 1.34.58.188 1.34.189.116 1.33.204.121 1.33.199.58 1.33.199.57 1.33.129.233 1.255.134.74 1.253.233.47 1.253.233.42 1.252.22.37 1.251.44.10 1.250.66.91 1.250.66.88 1.250.246.15 1.249.43.20 1.249.207.225 1.248.31.204 1.247.32.84 1.246.219.171 1.246.201.9 1.246.201.53 1.246.201.38 1.246.201.12 1.245.51.74 1.245.143.166 1.242.141.19 1.241.255.203 1.238.6.146 1.237.46.97 1.237.229.208 1.236.11.126 1.236.11.121 1.235.89.75 1.235.89.4 1.235.186.131 1.234.79.82 1.234.72.207 1.234.72.165 1.234.72.146 1.234.66.81 1.234.4.150 1.234.31.2 1.234.178.2 1.233.8.222 1.231.163.67 1.229.87.167 1.229.87.157 1.229.87.138 1.229.79.96 1.229.71.72 1.229.184.91 1.228.42.28 1.228.32.93 1.228.224.139 1.228.122.57 1.227.9.73 1.227.9.134 1.227.56.61 1.226.193.136 1.226.190.17 1.225.165.101 1.224.187.102 1.221.232.82 1.21.10.81 1.209.148.129 1.179.228.10 1.179.166.229 1.179.153.125 1.12.13.53 1.11.251.105 1.10.10.10 1.1.1.3 1.1.1.2 1.1.1.1 1.0.241.30 1.0.161.80 1.0.158.183 1.0.153.150 1.0.0.3 1.0.0.2 1.0.0.19 1.0.0.1 ================================================ FILE: backend/scripts/generate_test_data_sql.py ================================================ #!/usr/bin/env python3 """ 直接通过 SQL 插入测试数据 用法: # 生成常规测试数据 python backend/scripts/generate_test_data_sql.py python backend/scripts/generate_test_data_sql.py --clear # 清除后重新生成 # 生成百万级测试数据(用于测试 Dashboard 卡片溢出) python backend/scripts/generate_test_data_sql.py --million python backend/scripts/generate_test_data_sql.py --million --clear # 清除后生成百万级数据 百万级数据说明: - 目标: 1,000 - 子域名: 200,000 - 网站: 200,000 - 端点: 200,000 - IP (host_port_mapping): 200,000 - 漏洞: 200,000 (critical: 50k, high: 50k, medium: 50k, low: 30k, info: 20k) - 总资产: ~660,000 """ import argparse import random import json import os from datetime import datetime, timedelta from decimal import Decimal from pathlib import Path import psycopg2 from psycopg2.extras import execute_values def generate_fixed_length_url(target_name: str, length: int = 245, path_hint: str = '') -> str: """ 生成固定长度的 URL Args: target_name: 目标域名 length: 目标URL长度,默认245 path_hint: 可选的路径提示,用于区分不同类型的URL Returns: 固定长度的URL字符串 """ base = f'https://{target_name}' # 基础路径 paths = [ '/api/v3/enterprise/security-assessment/vulnerability-management', '/admin/dashboard/system-configuration/advanced-settings', '/portal/user-authentication/multi-factor/verification', '/services/cloud-infrastructure/monitoring/metrics', '/internal/system-administration/audit-logging/events', ] path = random.choice(paths) if not path_hint else f'/{path_hint}' url = f'{base}{path}' # 添加查询参数 param_idx = 0 while len(url) < length - 20: param_idx += 1 param = f'p{param_idx}={random.randint(10000000, 99999999)}' separator = '?' if '?' not in url else '&' url = f'{url}{separator}{param}' # 精确调整到目标长度 if len(url) < length: # 添加填充参数 padding_needed = length - len(url) - 1 # -1 for '&' or '?' if padding_needed > 0: separator = '?' if '?' not in url else '&' # 创建精确长度的填充 padding = 'x' * padding_needed url = f'{url}{separator}{padding}' # 截断到精确长度 if len(url) > length: url = url[:length] return url def generate_fixed_length_text(length: int = 300, text_type: str = 'description') -> str: """ 生成固定长度的文本内容 Args: length: 目标文本长度,默认300 text_type: 文本类型,用于选择不同的内容模板 Returns: 固定长度的文本字符串 """ # 基础文本模板 templates = { 'description': [ 'A critical security vulnerability was discovered in the application authentication module. This vulnerability allows attackers to bypass security controls and gain unauthorized access to sensitive system resources. The issue stems from improper input validation and insufficient access control mechanisms. Exploitation could lead to complete system compromise, data exfiltration, and service disruption. Immediate remediation is strongly recommended including implementing proper input sanitization, strengthening authentication mechanisms, and deploying additional security monitoring. The vulnerability affects multiple components including user authentication, session management, API endpoints, and data processing pipelines. Risk assessment indicates high severity with potential for significant business impact.', 'Server-side request forgery (SSRF) vulnerability detected in the API gateway service. An attacker can manipulate server-side requests to access internal network resources, potentially exposing sensitive configuration data, internal services, and cloud metadata endpoints. The vulnerability exists due to insufficient URL validation in the proxy functionality. This could allow attackers to scan internal networks, access cloud instance metadata, retrieve sensitive credentials, and pivot to other internal systems. Recommended mitigations include implementing strict URL allowlisting, blocking requests to internal IP ranges, and adding network segmentation controls. The vulnerability has been assigned a high severity rating due to potential for lateral movement.', 'Remote code execution vulnerability identified in the file upload processing module. Insufficient file type validation allows attackers to upload malicious executable files that can be triggered to execute arbitrary code on the server. The vulnerability bypasses existing security controls through specially crafted file headers and extension manipulation. Successful exploitation grants attackers full control over the affected server, enabling data theft, malware deployment, and establishment of persistent backdoor access. Critical remediation steps include implementing strict file type validation, sandboxed file processing, content inspection, and removal of execution permissions from upload directories. This vulnerability requires immediate attention.', 'Cross-site scripting (XSS) vulnerability found in the user profile management interface. User-supplied input is rendered without proper encoding, allowing injection of malicious JavaScript code. Attackers can exploit this to steal session tokens, perform actions on behalf of authenticated users, redirect victims to phishing sites, and exfiltrate sensitive personal information. The vulnerability affects multiple input fields including display name, bio, and custom URL parameters. Remediation requires implementing context-aware output encoding, Content Security Policy headers, and input validation. Additionally, consider implementing HTTP-only and Secure flags on session cookies to limit the impact of successful XSS attacks.', 'SQL injection vulnerability discovered in the advanced search functionality. The application constructs database queries using unsanitized user input, enabling attackers to manipulate query logic, extract sensitive data, modify database contents, or execute administrative operations. The vulnerability affects the product search, user lookup, and reporting modules. Exploitation could result in complete database compromise, unauthorized data access, data manipulation, and potential privilege escalation. Immediate remediation includes implementing parameterized queries, stored procedures, input validation, and principle of least privilege for database accounts. Consider deploying a web application firewall as an additional defense layer.', ], 'organization': [ 'A leading global technology corporation specializing in enterprise software solutions, cloud computing infrastructure, cybersecurity services, and digital transformation consulting. The organization operates across multiple continents with regional headquarters in North America, Europe, and Asia-Pacific. Core business units include enterprise resource planning systems, customer relationship management platforms, supply chain optimization tools, and advanced analytics solutions. The company maintains strategic partnerships with major cloud providers and technology vendors. Annual revenue exceeds several billion dollars with consistent year-over-year growth. The organization employs thousands of professionals including software engineers, security researchers, and business consultants.', 'An innovative financial technology company providing comprehensive digital banking services, payment processing solutions, and investment management platforms. The organization serves millions of customers globally through mobile applications, web portals, and API integrations. Key offerings include real-time payment processing, cryptocurrency trading, automated investment advisory, and small business lending. The company maintains regulatory compliance across multiple jurisdictions and holds various financial services licenses. Security infrastructure includes advanced fraud detection, multi-factor authentication, and end-to-end encryption. The organization has received multiple industry awards for innovation and customer satisfaction.', 'A healthcare technology enterprise focused on electronic health records, telemedicine platforms, medical device integration, and healthcare analytics. The organization partners with hospitals, clinics, and healthcare systems worldwide to improve patient outcomes and operational efficiency. Core products include comprehensive EHR systems, patient engagement portals, clinical decision support tools, and population health management platforms. The company maintains strict compliance with healthcare regulations including HIPAA, GDPR, and regional data protection requirements. Research and development investments focus on artificial intelligence applications in diagnostics, treatment optimization, and predictive health analytics.', ], 'title': [ 'Enterprise Resource Planning System - Comprehensive Business Management Dashboard with Real-time Analytics, Workflow Automation, and Multi-department Integration Capabilities for Global Operations Management and Strategic Decision Support', 'Advanced Security Operations Center - Unified Threat Detection and Response Platform featuring Machine Learning-powered Anomaly Detection, Automated Incident Response, and Comprehensive Security Posture Management', 'Customer Experience Management Platform - Omnichannel Engagement Solution with AI-driven Personalization, Journey Orchestration, Sentiment Analysis, and Predictive Customer Behavior Modeling Capabilities', 'Cloud Infrastructure Management Console - Multi-cloud Orchestration Platform supporting AWS, Azure, and GCP with Automated Provisioning, Cost Optimization, Compliance Monitoring, and Performance Analytics', 'Data Analytics and Business Intelligence Suite - Self-service Analytics Platform with Advanced Visualization, Predictive Modeling, Natural Language Query Processing, and Automated Report Generation', ], } # 选择模板 template_list = templates.get(text_type, templates['description']) base_text = random.choice(template_list) # 调整到目标长度 if len(base_text) < length: # 需要扩展文本 padding_words = [ 'Additionally', 'Furthermore', 'Moreover', 'Consequently', 'Subsequently', 'comprehensive', 'implementation', 'infrastructure', 'configuration', 'authentication', 'vulnerability', 'exploitation', 'remediation', 'mitigation', 'assessment', ] while len(base_text) < length - 20: base_text += f' {random.choice(padding_words)}' # 精确填充 if len(base_text) < length: padding_needed = length - len(base_text) base_text += ' ' + 'x' * (padding_needed - 1) # 截断到精确长度 if len(base_text) > length: base_text = base_text[:length] return base_text def load_env_file(env_path: str) -> dict: """从 .env 文件加载环境变量""" env_vars = {} if os.path.exists(env_path): with open(env_path, 'r') as f: for line in f: line = line.strip() if line and not line.startswith('#') and '=' in line: key, value = line.split('=', 1) env_vars[key.strip()] = value.strip() return env_vars def get_db_config() -> dict: """从 docker/.env 读取数据库配置""" # 获取项目根目录 script_dir = Path(__file__).resolve().parent project_root = script_dir.parent.parent env_path = project_root / 'docker' / '.env' env_vars = load_env_file(str(env_path)) # 获取数据库配置,docker/.env 中 DB_HOST=postgres 是容器内地址,本地运行需要用 localhost db_host = env_vars.get('DB_HOST', 'postgres') if db_host == 'postgres': db_host = 'localhost' # 本地运行脚本时使用 localhost return { 'host': db_host, 'port': int(env_vars.get('DB_PORT', 5432)), 'dbname': env_vars.get('DB_NAME', 'xingrin'), 'user': env_vars.get('DB_USER', 'postgres'), 'password': env_vars.get('DB_PASSWORD', ''), } def generate_raw_response_headers(headers_dict: dict) -> str: """ 将响应头字典转换为原始 HTTP 响应头字符串格式 Args: headers_dict: 响应头字典 Returns: 原始 HTTP 响应头字符串,格式如: HTTP/1.1 200 OK Server: nginx Content-Type: text/html ... """ lines = ['HTTP/1.1 200 OK'] for key, value in headers_dict.items(): # 将下划线转换为连字符,并首字母大写 header_name = key.replace('_', '-').title() lines.append(f'{header_name}: {value}') return '\r\n'.join(lines) DB_CONFIG = get_db_config() class TestDataGenerator: def __init__(self, clear: bool = False): self.conn = psycopg2.connect(**DB_CONFIG) self.conn.autocommit = False self.clear = clear def run(self): try: if self.clear: print("🗑️ 清除现有数据...") self.clear_data() print("🚀 开始生成测试数据...\n") engine_ids = self.create_engines() worker_ids = self.create_workers() org_ids = self.create_organizations() target_ids = self.create_targets(org_ids) scan_ids = self.create_scans(target_ids, engine_ids, worker_ids) self.create_scheduled_scans(org_ids, target_ids, engine_ids) self.create_subdomains(target_ids) website_ids = self.create_websites(target_ids) self.create_endpoints(target_ids) self.create_directories(target_ids, website_ids) self.create_host_port_mappings(target_ids) self.create_vulnerabilities(target_ids) # 生成快照数据(扫描历史详细页面使用) self.create_subdomain_snapshots(scan_ids) self.create_website_snapshots(scan_ids) self.create_endpoint_snapshots(scan_ids) self.create_directory_snapshots(scan_ids) self.create_host_port_mapping_snapshots(scan_ids) self.create_vulnerability_snapshots(scan_ids) # 生成指纹数据 self.create_ehole_fingerprints() self.create_goby_fingerprints() self.create_wappalyzer_fingerprints() self.create_fingers_fingerprints() self.create_fingerprinthub_fingerprints() self.create_arl_fingerprints() self.conn.commit() print("\n✅ 测试数据生成完成!") except Exception as e: self.conn.rollback() print(f"\n❌ 生成失败: {e}") raise finally: self.conn.close() def clear_data(self): """清除所有测试数据""" cur = self.conn.cursor() # 先删除 IMMV(避免 pg_ivm 的 anyarray bug) print(" 删除 IMMV...") cur.execute("DROP TABLE IF EXISTS asset_search_view CASCADE") self.conn.commit() tables = [ # 指纹表 'ehole_fingerprint', 'goby_fingerprint', 'wappalyzer_fingerprint', 'fingers_fingerprint', 'fingerprinthub_fingerprint', 'arl_fingerprint', # 快照表(先删除,因为有外键依赖 scan) 'vulnerability_snapshot', 'host_port_mapping_snapshot', 'directory_snapshot', 'endpoint_snapshot', 'website_snapshot', 'subdomain_snapshot', # 资产表 'vulnerability', 'host_port_mapping', 'directory', 'endpoint', 'website', 'subdomain', 'scheduled_scan', 'scan', 'organization_targets', 'target', 'organization', 'nuclei_template_repo', 'wordlist', 'scan_engine', 'worker_node' ] for table in tables: cur.execute(f"DELETE FROM {table}") self.conn.commit() # 重建 IMMV print(" 重建 IMMV...") cur.execute(""" SELECT pgivm.create_immv('asset_search_view', $$ SELECT w.id, w.url, w.host, w.title, w.tech, w.status_code, w.response_headers, w.response_body, w.created_at, w.target_id FROM website w $$) """) self.conn.commit() print(" ✓ 数据清除完成\n") def create_workers(self) -> list: """创建 Worker 节点""" print("👷 创建 Worker 节点...") cur = self.conn.cursor() # 生成随机后缀确保唯一性 suffix = random.randint(1000, 9999) regions = ['asia-singapore-1', 'asia-singapore-2', 'asia-tokyo-1', 'asia-tokyo-2', 'asia-hongkong-1', 'asia-mumbai-1', 'asia-seoul-1', 'asia-sydney-1', 'asia-jakarta-1', 'asia-osaka-1', 'europe-frankfurt-1', 'europe-frankfurt-2', 'europe-london-1', 'europe-london-2', 'europe-paris-1', 'europe-ireland-1', 'europe-stockholm-1', 'europe-milan-1', 'us-east-virginia-1', 'us-east-virginia-2', 'us-east-ohio-1', 'us-west-oregon-1', 'us-west-oregon-2', 'us-west-california-1', 'us-central-iowa-1', 'australia-sydney-1', 'australia-melbourne-1', 'brazil-saopaulo-1', 'canada-montreal-1', 'southafrica-capetown-1', 'middleeast-bahrain-1'] statuses = ['online', 'offline', 'pending', 'deploying', 'maintenance', 'error', 'upgrading'] workers = [ (f'local-worker-primary-high-performance-{suffix}', '127.0.0.1', True, 'online'), (f'local-worker-secondary-backup-{suffix}', '127.0.0.2', True, 'online'), ] # 随机生成 30-50 个远程 worker num_remote = random.randint(30, 50) selected_regions = random.sample(regions, min(num_remote, len(regions))) for i, region in enumerate(selected_regions): ip = f'192.168.{random.randint(1, 254)}.{random.randint(1, 254)}' status = random.choice(statuses) workers.append((f'remote-worker-{region}-{suffix}-{i:02d}', ip, False, status)) ids = [] for name, ip, is_local, status in workers: cur.execute(""" INSERT INTO worker_node (name, ip_address, ssh_port, username, password, is_local, status, created_at, updated_at) VALUES (%s, %s, 22, 'root', '', %s, %s, NOW(), NOW()) ON CONFLICT (name) DO UPDATE SET updated_at = NOW() RETURNING id """, (name, ip, is_local, status)) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个 Worker 节点\n") return ids def create_engines(self) -> list: """创建扫描引擎""" print("⚙️ 创建扫描引擎...") cur = self.conn.cursor() suffix = random.randint(1000, 9999) engine_templates = [ ('Full-Comprehensive-Security-Assessment-Enterprise-Grade-Vulnerability-Detection-System', 'subdomain_discovery:\n enabled: true\n tools: [subfinder, amass, findomain, assetfinder, chaos]\n timeout: {timeout}\n resolvers: [8.8.8.8, 1.1.1.1, 9.9.9.9]\nvulnerability_scanning:\n enabled: true\n nuclei:\n severity: critical,high,medium,low,info\n rate_limit: {rate}\n concurrency: {conc}\n templates: [cves, vulnerabilities, exposures, misconfigurations, default-logins]'), ('Quick-Reconnaissance-Fast-Discovery-Lightweight-Asset-Enumeration', 'subdomain_discovery:\n enabled: true\n tools: [subfinder, assetfinder]\n timeout: {timeout}\n passive_only: true\nport_scanning:\n enabled: true\n top_ports: {ports}\n rate: {rate}'), ('Deep-Vulnerability-Assessment-Extended-Security-Analysis-Framework', 'vulnerability_scanning:\n enabled: true\n nuclei:\n severity: critical,high,medium,low,info\n templates: [cves, vulnerabilities, exposures, misconfigurations, default-logins, takeovers]\n rate_limit: {rate}\n concurrency: {conc}\n dalfox:\n enabled: true\n blind_xss: true\n sqlmap:\n enabled: true\n level: 3\n risk: 2'), ('Passive-Information-Gathering-OSINT-Intelligence-Collection-Platform', 'subdomain_discovery:\n enabled: true\n passive_only: true\n sources: [crtsh, hackertarget, threatcrowd, virustotal, securitytrails, shodan, censys, binaryedge]\n timeout: {timeout}\n dns_bruteforce: false'), ('Web-Application-Security-Scanner-OWASP-Compliance-Testing-Suite', 'web_discovery:\n enabled: true\n httpx:\n threads: {conc}\n follow_redirects: true\n screenshot: true\nvulnerability_scanning:\n enabled: true\n dalfox:\n enabled: true\n blind_xss: true\n nuclei:\n templates: [cves, vulnerabilities, exposures]'), ('API-Endpoint-Security-Audit-RESTful-GraphQL-Assessment-Tool', 'endpoint_discovery:\n enabled: true\n katana:\n depth: {depth}\n concurrency: {conc}\n js_crawl: true\n automatic_form_fill: true\nvulnerability_scanning:\n enabled: true\n nuclei:\n templates: [exposures, misconfigurations]'), ('Infrastructure-Port-Scanner-Network-Service-Detection-Engine', 'port_scanning:\n enabled: true\n naabu:\n top_ports: {ports}\n rate: {rate}\n scan_all_ips: true\n service_detection: true\n version_detection: true\n os_detection: true'), ('Directory-Bruteforce-Engine-Content-Discovery-Fuzzing-Platform', 'directory_bruteforce:\n enabled: true\n ffuf:\n threads: {conc}\n wordlist: [common.txt, raft-large-directories.txt, raft-large-files.txt]\n recursion_depth: {depth}\n extensions: [php, asp, aspx, jsp, html, js, json, xml]'), ('Cloud-Infrastructure-Security-Assessment-AWS-Azure-GCP-Scanner', 'cloud_scanning:\n enabled: true\n providers: [aws, azure, gcp]\n services: [s3, ec2, rds, lambda, storage, compute, sql]\n misconfigurations: true\n public_exposure: true'), ('Container-Security-Scanner-Kubernetes-Docker-Vulnerability-Detector', 'container_scanning:\n enabled: true\n kubernetes:\n enabled: true\n rbac_audit: true\n network_policies: true\n docker:\n enabled: true\n image_scanning: true\n dockerfile_lint: true'), ('Mobile-Application-Security-Testing-iOS-Android-Assessment-Framework', 'mobile_scanning:\n enabled: true\n platforms: [ios, android]\n static_analysis: true\n dynamic_analysis: true\n api_testing: true\n ssl_pinning_bypass: true'), ('Compliance-Audit-Scanner-PCI-DSS-HIPAA-SOC2-Assessment-Tool', 'compliance_scanning:\n enabled: true\n frameworks: [pci-dss, hipaa, soc2, gdpr, iso27001]\n automated_reporting: true\n evidence_collection: true'), ] # 随机选择 8-12 个引擎模板 num_engines = random.randint(8, 12) selected = random.sample(engine_templates, min(num_engines, len(engine_templates))) ids = [] for name_base, config_template in selected: name = f'{name_base}-{suffix}' config = config_template.format( rate=random.choice([100, 150, 200, 300]), conc=random.choice([10, 20, 50, 100]), timeout=random.choice([300, 600, 900, 1200]), ports=random.choice([100, 1000, 'full']), depth=random.choice([2, 3, 4, 5]) ) cur.execute(""" INSERT INTO scan_engine (name, configuration, created_at, updated_at) VALUES (%s, %s, NOW(), NOW()) ON CONFLICT (name) DO UPDATE SET configuration = EXCLUDED.configuration, updated_at = NOW() RETURNING id """, (name, config)) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个扫描引擎\n") return ids def create_organizations(self) -> list: """创建组织""" print("🏢 创建组织...") cur = self.conn.cursor() suffix = random.randint(1000, 9999) org_templates = [ ('Acme Corporation', '全球领先的技术解决方案提供商,专注于企业级软件开发、云计算服务和网络安全解决方案。公司成立于1995年,总部位于硅谷,在全球50多个国家设有分支机构,员工超过10万人,年营收超过500亿美元。'), ('TechStart Innovation Labs', '专注于人工智能、机器学习和区块链技术研发的创新实验室。拥有超过200名博士级研究人员,与全球顶尖大学建立了深度合作关系,已获得超过500项技术专利。'), ('Global Financial Services', '提供全方位数字银行服务的金融科技公司,包括移动支付、在线贷款、投资理财等服务。服务覆盖全球180个国家和地区,注册用户超过5亿,日均交易额超过100亿美元。'), ('HealthCare Plus Medical', '医疗信息化解决方案提供商,专注于电子病历系统、医院信息管理系统和远程医疗平台开发。产品已部署在全球3000多家医疗机构,服务超过1亿患者。'), ('E-Commerce Mega Platform', '亚太地区最大的电子商务平台之一,提供 B2B、B2C 和 C2C 多种交易模式。平台入驻商家超过500万,SKU数量超过10亿,日均订单量超过5000万单。'), ('Smart City Infrastructure', '智慧城市基础设施解决方案提供商,专注于物联网传感器网络、智能交通系统、城市大脑平台开发。已在全球100多个城市部署智慧城市解决方案,管理超过1000万个IoT设备。'), ('Educational Technology', '在线教育技术联盟,提供 K-12 和高等教育在线学习平台。平台拥有超过10万门课程,注册学员超过1亿人,与全球500多所知名大学建立了合作关系。'), ('Green Energy Solutions', '可再生能源管理系统提供商,专注于太阳能、风能发电站的监控、调度和优化管理。管理的清洁能源装机容量超过100GW,每年减少碳排放超过5000万吨。'), ('CyberSec Defense Corp', '网络安全防御公司,提供渗透测试、漏洞评估和安全咨询服务。拥有超过1000名认证安全专家,服务全球500强企业中的300多家,年处理安全事件超过100万起。'), ('CloudNative Systems', '云原生系统开发商,专注于 Kubernetes、微服务架构和 DevOps 工具链。产品被全球超过10万家企业采用,管理的容器实例超过1亿个,是CNCF的核心贡献者。'), ('DataFlow Analytics', '大数据分析平台,提供实时数据处理、商业智能和预测分析服务。平台日处理数据量超过100PB,支持超过1000种数据源接入,服务全球5000多家企业客户。'), ('MobileFirst Technologies', '移动优先技术公司,专注于 iOS/Android 应用开发和跨平台解决方案。已开发超过5000款移动应用,累计下载量超过50亿次,月活跃用户超过10亿。'), ('Quantum Computing Research', '量子计算研究机构,致力于量子算法、量子纠错和量子网络的前沿研究。拥有全球最先进的量子计算机之一,已实现1000+量子比特的稳定运算。'), ('Autonomous Vehicles Corp', '自动驾驶技术公司,专注于L4/L5级别自动驾驶系统研发。测试车队已累计行驶超过1亿公里,在全球20个城市开展商业化运营。'), ('Biotech Innovations', '生物技术创新企业,专注于基因编辑、细胞治疗和精准医疗。拥有超过100项生物技术专利,多款创新药物已进入临床试验阶段。'), ('Space Technology Systems', '航天技术系统公司,提供卫星通信、遥感数据和太空探索服务。已成功发射超过500颗卫星,建立了覆盖全球的低轨卫星互联网星座。'), ] divisions = ['Global Division', 'Asia Pacific', 'EMEA Region', 'Americas', 'R&D Center', 'Digital Platform', 'Cloud Services', 'Security Team', 'Innovation Lab', 'Enterprise Solutions', 'Consumer Products', 'Infrastructure Services', 'Data Analytics', 'AI Research', 'Mobile Development', 'DevOps Platform'] # 随机选择 15-20 个组织 num_orgs = random.randint(15, 20) selected = random.sample(org_templates, min(num_orgs, len(org_templates))) ids = [] for name_base, _ in selected: division = random.choice(divisions) name = f'{name_base} - {division} ({suffix})' # 生成固定 300 长度的描述 desc = generate_fixed_length_text(length=300, text_type='organization') cur.execute(""" INSERT INTO organization (name, description, created_at, deleted_at) VALUES (%s, %s, NOW() - INTERVAL '%s days', NULL) ON CONFLICT DO NOTHING RETURNING id """, (name, desc, random.randint(0, 365))) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个组织\n") return ids def create_targets(self, org_ids: list) -> list: """创建扫描目标""" print("🎯 创建扫描目标...") cur = self.conn.cursor() suffix = random.randint(1000, 9999) # 超长域名生成,目标 200 字符左右 # 格式: {env}-{region}-{service}-{version}.{subdomain}.{company}-{project}-{team}-{suffix}.{domain}{tld} envs = ['production', 'staging', 'development', 'testing', 'integration', 'performance', 'security-audit'] regions = ['us-east-1', 'us-west-2', 'eu-central-1', 'ap-southeast-1', 'ap-northeast-1', 'sa-east-1', 'eu-west-3'] services = ['api-gateway', 'authentication-service', 'user-management', 'payment-processing', 'notification-center', 'analytics-engine', 'content-delivery', 'search-indexer'] versions = ['v1', 'v2', 'v3', 'v2-beta', 'v3-alpha', 'v1-legacy', 'v2-stable'] subdomains = ['internal-services', 'external-facing', 'partner-integration', 'customer-portal', 'admin-dashboard', 'developer-tools', 'monitoring-system'] companies = ['acme-corporation-international', 'techstart-innovation-labs', 'globalfinance-services-group', 'healthcare-plus-medical-systems', 'ecommerce-platform-solutions', 'smartcity-infrastructure-development', 'cybersecurity-defense-corporation', 'cloudnative-enterprise-systems'] projects = ['digital-transformation-initiative', 'cloud-migration-project', 'security-enhancement-program', 'customer-experience-platform', 'data-analytics-modernization', 'infrastructure-automation-suite'] teams = ['engineering-team-alpha', 'devops-squad-bravo', 'security-team-charlie', 'platform-team-delta', 'infrastructure-team-echo'] domains = ['enterprise', 'platform', 'services', 'solutions', 'systems'] tlds = ['.com', '.io', '.net', '.org', '.dev', '.app', '.cloud', '.tech', '.systems'] ids = [] # 随机生成 100-150 个域名目标 num_domains = random.randint(100, 150) used_domains = set() for i in range(num_domains): env = random.choice(envs) region = random.choice(regions) service = random.choice(services) version = random.choice(versions) subdomain = random.choice(subdomains) company = random.choice(companies) project = random.choice(projects) team = random.choice(teams) domain_name = random.choice(domains) tld = random.choice(tlds) # 生成超长域名,约 150-200 字符 domain = f'{env}-{region}-{service}-{version}.{subdomain}.{company}-{project}-{team}-{suffix}.{domain_name}{tld}' if domain in used_domains: continue used_domains.add(domain) cur.execute(""" INSERT INTO target (name, type, created_at, last_scanned_at, deleted_at) VALUES (%s, 'domain', NOW() - INTERVAL '%s days', NOW() - INTERVAL '%s days', NULL) ON CONFLICT DO NOTHING RETURNING id """, (domain, random.randint(30, 365), random.randint(0, 30))) row = cur.fetchone() if row: ids.append(row[0]) # 随机关联到组织 if org_ids: # 20% 概率关联多个组织(3-5个),50% 概率关联1个组织,30% 不关联 rand_val = random.random() if rand_val < 0.2: # 关联多个组织 (3-5个) num_orgs = min(random.randint(3, 5), len(org_ids)) selected_orgs = random.sample(org_ids, num_orgs) for org_id in selected_orgs: cur.execute(""" INSERT INTO organization_targets (organization_id, target_id) VALUES (%s, %s) ON CONFLICT DO NOTHING """, (org_id, row[0])) elif rand_val < 0.7: # 关联1个组织 org_id = random.choice(org_ids) cur.execute(""" INSERT INTO organization_targets (organization_id, target_id) VALUES (%s, %s) ON CONFLICT DO NOTHING """, (org_id, row[0])) # 随机生成 50-80 个 IP 目标 num_ips = random.randint(50, 80) for _ in range(num_ips): # 使用文档保留的 IP 范围 ip_ranges = [ (203, 0, 113), # TEST-NET-3 (198, 51, 100), # TEST-NET-2 (192, 0, 2), # TEST-NET-1 ] base = random.choice(ip_ranges) ip = f'{base[0]}.{base[1]}.{base[2]}.{random.randint(1, 254)}' cur.execute(""" INSERT INTO target (name, type, created_at, last_scanned_at, deleted_at) VALUES (%s, 'ip', NOW() - INTERVAL '%s days', NOW() - INTERVAL '%s days', NULL) ON CONFLICT DO NOTHING RETURNING id """, (ip, random.randint(30, 365), random.randint(0, 30))) row = cur.fetchone() if row: ids.append(row[0]) # 随机生成 30-50 个 CIDR 目标 num_cidrs = random.randint(30, 50) cidr_bases = ['10.0', '172.16', '172.17', '172.18', '192.168'] for _ in range(num_cidrs): base = random.choice(cidr_bases) third_octet = random.randint(0, 255) mask = random.choice([24, 25, 26, 27, 28]) cidr = f'{base}.{third_octet}.0/{mask}' cur.execute(""" INSERT INTO target (name, type, created_at, last_scanned_at, deleted_at) VALUES (%s, 'cidr', NOW() - INTERVAL '%s days', NOW() - INTERVAL '%s days', NULL) ON CONFLICT DO NOTHING RETURNING id """, (cidr, random.randint(30, 365), random.randint(0, 30))) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个扫描目标\n") return ids def create_scans(self, target_ids: list, engine_ids: list, worker_ids: list) -> list: """创建扫描任务""" print("🔍 创建扫描任务...") cur = self.conn.cursor() if not target_ids or not engine_ids: print(" ⚠ 缺少目标或引擎,跳过\n") return [] statuses = ['cancelled', 'completed', 'failed', 'initiated', 'running'] status_weights = [0.05, 0.6, 0.1, 0.1, 0.15] # completed 占比最高 stages = ['subdomain_discovery', 'port_scanning', 'web_discovery', 'vulnerability_scanning', 'directory_bruteforce', 'endpoint_discovery'] error_messages = [ 'Connection timeout while scanning target. Please check network connectivity.', 'DNS resolution failed for target domain.', 'Rate limit exceeded. Scan paused and will resume automatically.', 'Worker node disconnected during scan execution.', 'Insufficient disk space on worker node.', 'Target returned too many errors, scan aborted.', 'Authentication failed for protected resources.', ] # 获取引擎名称映射 cur.execute("SELECT id, name FROM scan_engine WHERE id = ANY(%s)", (engine_ids,)) engine_name_map = {row[0]: row[1] for row in cur.fetchall()} ids = [] # 随机选择目标数量 - 增加到 80-120 个 num_targets = min(random.randint(80, 120), len(target_ids)) selected_targets = random.sample(target_ids, num_targets) for target_id in selected_targets: # 每个目标随机 3-15 个扫描任务 num_scans = random.randint(3, 15) for _ in range(num_scans): status = random.choices(statuses, weights=status_weights)[0] # 随机选择 1-3 个引擎 num_engines = random.randint(1, min(3, len(engine_ids))) selected_engine_ids = random.sample(engine_ids, num_engines) selected_engine_names = [engine_name_map.get(eid, f'Engine-{eid}') for eid in selected_engine_ids] worker_id = random.choice(worker_ids) if worker_ids else None progress = random.randint(10, 95) if status == 'running' else (100 if status == 'completed' else random.randint(0, 50)) stage = random.choice(stages) if status == 'running' else '' error_msg = random.choice(error_messages) if status == 'failed' else '' # 随机生成更真实的统计数据 subdomains = random.randint(50, 2000) websites = random.randint(10, 500) endpoints = random.randint(100, 5000) ips = random.randint(20, 300) directories = random.randint(200, 8000) vulns_critical = random.randint(0, 20) vulns_high = random.randint(0, 50) vulns_medium = random.randint(0, 100) vulns_low = random.randint(0, 150) vulns_total = vulns_critical + vulns_high + vulns_medium + vulns_low + random.randint(0, 100) # info days_ago = random.randint(0, 90) cur.execute(""" INSERT INTO scan ( target_id, engine_ids, engine_names, yaml_configuration, status, worker_id, progress, current_stage, results_dir, error_message, container_ids, stage_progress, cached_subdomains_count, cached_websites_count, cached_endpoints_count, cached_ips_count, cached_directories_count, cached_screenshots_count, cached_vulns_total, cached_vulns_critical, cached_vulns_high, cached_vulns_medium, cached_vulns_low, created_at, stopped_at, deleted_at ) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW() - INTERVAL '%s days', %s, NULL ) RETURNING id """, ( target_id, selected_engine_ids, json.dumps(selected_engine_names), '', status, worker_id, progress, stage, f'/app/results/scan_{target_id}_{random.randint(1000, 9999)}', error_msg, '{}', '{}', subdomains, websites, endpoints, ips, directories, 0, vulns_total, vulns_critical, vulns_high, vulns_medium, vulns_low, days_ago, datetime.now() - timedelta(days=days_ago, hours=random.randint(0, 23)) if status in ['completed', 'failed', 'cancelled'] else None )) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个扫描任务\n") return ids def create_scheduled_scans(self, org_ids: list, target_ids: list, engine_ids: list): """创建定时扫描任务""" print("⏰ 创建定时扫描任务...") cur = self.conn.cursor() if not engine_ids: print(" ⚠ 缺少引擎,跳过\n") return suffix = random.randint(1000, 9999) schedule_templates = [ ('Daily-Full-Security-Assessment-Enterprise-Wide-Comprehensive-Vulnerability-Detection', '0 {hour} * * *'), ('Weekly-Vulnerability-Scan-Critical-Infrastructure-Protection-Program', '0 {hour} * * {dow}'), ('Monthly-Penetration-Testing-External-Attack-Surface-Management', '0 {hour} {dom} * *'), ('Hourly-Quick-Reconnaissance-Real-Time-Threat-Intelligence-Gathering', '{min} * * * *'), ('Bi-Weekly-Compliance-Check-Regulatory-Standards-Verification-Audit', '0 {hour} 1,15 * *'), ('Quarterly-Infrastructure-Audit-Network-Security-Posture-Assessment', '0 {hour} 1 1,4,7,10 *'), ('Daily-API-Security-Scan-RESTful-GraphQL-Endpoint-Protection', '{min} {hour} * * *'), ('Weekly-Web-Application-Scan-OWASP-Top-10-Vulnerability-Detection', '0 {hour} * * {dow}'), ('Nightly-Asset-Discovery-Shadow-IT-Detection-Inventory-Management', '0 {hour} * * *'), ('Weekend-Deep-Scan-Intensive-Security-Analysis-Full-Coverage', '0 {hour} * * 0,6'), ('Business-Hours-Monitor-Real-Time-Security-Event-Detection-Response', '0 9-17 * * 1-5'), ('Off-Hours-Intensive-Scan-Low-Impact-Comprehensive-Assessment', '0 {hour} * * *'), ('Continuous-Monitoring-Zero-Day-Vulnerability-Detection-System', '{min} * * * *'), ('Cloud-Infrastructure-Security-Assessment-AWS-Azure-GCP-Multi-Cloud', '0 {hour} * * *'), ('Container-Security-Scan-Kubernetes-Docker-Image-Vulnerability-Check', '0 {hour} * * {dow}'), ('Database-Security-Audit-SQL-Injection-Data-Exposure-Prevention', '0 {hour} {dom} * *'), ('Network-Perimeter-Scan-Firewall-Configuration-Compliance-Check', '0 {hour} * * *'), ('SSL-TLS-Certificate-Monitoring-Expiration-Vulnerability-Detection', '0 {hour} * * *'), ('DNS-Security-Assessment-Zone-Transfer-Subdomain-Takeover-Check', '0 {hour} * * {dow}'), ('Email-Security-Scan-SPF-DKIM-DMARC-Configuration-Verification', '0 {hour} {dom} * *'), ('Mobile-Application-Security-Testing-iOS-Android-API-Assessment', '0 {hour} * * *'), ('IoT-Device-Security-Scan-Firmware-Vulnerability-Network-Exposure', '0 {hour} * * {dow}'), ('Third-Party-Risk-Assessment-Vendor-Security-Posture-Evaluation', '0 {hour} 1 * *'), ('Incident-Response-Readiness-Security-Control-Effectiveness-Test', '0 {hour} 15 * *'), ('Ransomware-Prevention-Scan-Backup-Integrity-Recovery-Verification', '0 {hour} * * *'), ] # 随机选择 40-50 个定时任务 num_schedules = random.randint(40, 50) selected = random.sample(schedule_templates, min(num_schedules, len(schedule_templates))) # 获取引擎名称映射 cur.execute("SELECT id, name FROM scan_engine WHERE id = ANY(%s)", (engine_ids,)) engine_name_map = {row[0]: row[1] for row in cur.fetchall()} count = 0 for name_base, cron_template in selected: name = f'{name_base}-{suffix}-{count:02d}' cron = cron_template.format( hour=random.randint(0, 23), min=random.randint(0, 59), dow=random.randint(0, 6), dom=random.randint(1, 28) ) enabled = random.random() > 0.3 # 70% 启用 # 随机选择 1-3 个引擎 num_engines = random.randint(1, min(3, len(engine_ids))) selected_engine_ids = random.sample(engine_ids, num_engines) selected_engine_names = [engine_name_map.get(eid, f'Engine-{eid}') for eid in selected_engine_ids] # 随机决定关联组织还是目标 if org_ids and target_ids: if random.random() > 0.5: org_id = random.choice(org_ids) target_id = None else: org_id = None target_id = random.choice(target_ids) elif org_ids: org_id = random.choice(org_ids) target_id = None elif target_ids: org_id = None target_id = random.choice(target_ids) else: org_id = None target_id = None run_count = random.randint(0, 200) has_run = random.random() > 0.2 # 80% 已运行过 cur.execute(""" INSERT INTO scheduled_scan ( name, engine_ids, engine_names, yaml_configuration, organization_id, target_id, cron_expression, is_enabled, run_count, last_run_time, next_run_time, created_at, updated_at ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW() - INTERVAL '%s days', NOW()) ON CONFLICT DO NOTHING """, ( name, selected_engine_ids, json.dumps(selected_engine_names), '', org_id, target_id, cron, enabled, run_count if has_run else 0, datetime.now() - timedelta(days=random.randint(0, 14), hours=random.randint(0, 23)) if has_run else None, datetime.now() + timedelta(hours=random.randint(1, 336)) # 最多 2 周后 , random.randint(30, 180))) count += 1 print(f" ✓ 创建了 {count} 个定时扫描任务\n") def create_subdomains(self, target_ids: list): """创建子域名""" print("🌐 创建子域名...") cur = self.conn.cursor() prefixes = [ # 基础服务 'api', 'admin', 'portal', 'dashboard', 'app', 'mobile', 'staging', 'dev', 'test', 'qa', 'uat', 'beta', 'alpha', 'demo', 'sandbox', 'internal', 'secure', 'auth', 'login', 'sso', 'oauth', 'identity', 'accounts', 'mail', 'smtp', 'imap', 'webmail', 'ftp', 'sftp', 'files', 'storage', 'cdn', 'static', 'assets', 'media', 'db', 'database', 'mysql', 'postgres', 'redis', 'mongo', 'elastic', 'vpn', 'remote', 'gateway', 'proxy', 'monitoring', 'metrics', 'grafana', 'prometheus', 'kibana', 'logs', 'jenkins', 'ci', 'cd', 'gitlab', 'jira', 'confluence', 'kubernetes', 'k8s', 'www', 'www2', 'www3', 'ns1', 'ns2', 'mx', 'mx1', 'mx2', 'autodiscover', 'webdisk', 'cpanel', 'whm', 'webmail2', 'email', 'smtp2', 'pop', 'pop3', 'imap2', 'calendar', 'contacts', 'drive', 'docs', 'sheets', 'slides', 'meet', 'chat', 'teams', 'slack', 'discord', 'zoom', 'video', 'stream', 'blog', 'news', 'press', 'media2', 'images', 'img', 'photos', 'video2', 'shop', 'store', 'cart', 'checkout', 'pay', 'payment', 'billing', 'invoice', 'support', 'help', 'helpdesk', 'ticket', 'tickets', 'status', 'health', 'api-v1', 'api-v2', 'api-v3', 'graphql', 'rest', 'soap', 'rpc', 'grpc', # 扩展服务 'analytics', 'reporting', 'bi', 'data', 'warehouse', 'etl', 'pipeline', 'ml', 'ai', 'inference', 'training', 'model', 'prediction', 'recommendation', 'search', 'solr', 'elasticsearch', 'opensearch', 'algolia', 'typesense', 'cache', 'memcached', 'varnish', 'haproxy', 'loadbalancer', 'nginx-lb', 'queue', 'rabbitmq', 'kafka', 'pulsar', 'nats', 'activemq', 'sqs', 'workflow', 'airflow', 'prefect', 'dagster', 'temporal', 'conductor', 'registry', 'harbor', 'nexus', 'artifactory', 'pypi', 'npm-registry', 'vault', 'secrets', 'keycloak', 'okta', 'auth0', 'cognito', 'firebase-auth', 'notification', 'push', 'websocket', 'socket', 'realtime', 'pubsub', 'backup', 'archive', 'snapshot', 'restore', 'disaster-recovery', 'dr', 'audit', 'compliance', 'security', 'waf', 'firewall', 'ids', 'ips', 'tracing', 'jaeger', 'zipkin', 'tempo', 'honeycomb', 'lightstep', 'config', 'consul', 'etcd', 'zookeeper', 'nacos', 'apollo-config', 'service-mesh', 'istio', 'linkerd', 'envoy', 'traefik', 'kong', ] # 二级前缀,用于生成更复杂的子域名 secondary_prefixes = ['', 'prod-', 'dev-', 'staging-', 'test-', 'int-', 'ext-', 'us-', 'eu-', 'ap-', 'us-east-', 'us-west-', 'eu-central-', 'ap-southeast-', 'ap-northeast-', 'primary-', 'secondary-', 'backup-', 'dr-', 'canary-', 'blue-', 'green-'] # 获取域名目标 cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] for target_id, target_name in domain_targets: # 每个目标随机 80-150 个子域名 num = random.randint(80, 150) selected = random.sample(prefixes, min(num, len(prefixes))) for prefix in selected: # 随机添加二级前缀 sec_prefix = random.choice(secondary_prefixes) if random.random() > 0.7 else '' subdomain_name = f'{sec_prefix}{prefix}.{target_name}' days_ago = random.randint(0, 90) batch_data.append((subdomain_name, target_id, days_ago)) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO subdomain (name, target_id, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, NOW() - INTERVAL '%s days')") print(f" ✓ 创建了 {count} 个子域名\n") def create_websites(self, target_ids: list) -> list: """创建网站""" print("🌍 创建网站...") cur = self.conn.cursor() titles = [ 'Enterprise Resource Planning System - Comprehensive Dashboard | Acme Corporation International Global Operations Management Portal v3.2.1 - Integrated Business Process Automation and Real-time Analytics Platform for Enterprise-wide Resource Optimization', 'Customer Relationship Management Platform - Secure Login Portal | Multi-Factor Authentication Enabled - Advanced Customer Data Analytics and Sales Pipeline Management System with AI-Powered Insights and Predictive Modeling', 'Human Resources Information System - Employee Self Service Portal v3.2.1 | Comprehensive Payroll Benefits Time-Off Management - Performance Review Talent Acquisition Onboarding Workflow Automation Platform', 'Supply Chain Management - Global Logistics Tracking Dashboard | Real-time Updates - Worldwide Distribution Network Monitor with Predictive Analytics Inventory Optimization and Supplier Relationship Management', 'Business Intelligence Analytics - Executive Summary Report Generator | Advanced Data Visualization Decision Support System - Machine Learning Powered Predictive Analytics and Custom Dashboard Builder', 'Content Management System - Admin Panel | Headless CMS API Gateway - Multi-tenant Enterprise Publishing Platform with Workflow Automation Digital Asset Management and Multi-language Support', 'Project Management Collaboration Tools - Team Workspace | Agile Board - Sprint Planning Resource Allocation Time Tracking Budget Management Gantt Charts Kanban Boards and Team Communication Hub', 'E-Commerce Platform - Product Catalog Management | Inventory Control - Order Processing Fulfillment System with Multi-channel Sales Integration Payment Gateway and Customer Analytics Dashboard', 'Financial Trading Platform - Real-time Market Data Dashboard | Portfolio Management Risk Analysis System - Algorithmic Trading Support Technical Analysis Tools and Regulatory Compliance Reporting', 'Healthcare Patient Management System - Electronic Health Records | HIPAA Compliant Medical Information Portal - Appointment Scheduling Prescription Management Lab Results Integration and Telemedicine Support', ] webservers = ['nginx/1.24.0', 'nginx/1.25.3', 'nginx/1.26.0', 'Apache/2.4.57', 'Apache/2.4.58', 'Apache/2.4.59', 'Microsoft-IIS/10.0', 'Microsoft-IIS/8.5', 'Microsoft-IIS/7.5', 'cloudflare', 'gunicorn/21.2.0', 'gunicorn/22.0.0', 'gunicorn/23.0.0', 'uvicorn/0.24.0', 'uvicorn/0.25.0', 'Caddy/2.7.5', 'Caddy/2.8.0', 'LiteSpeed', 'LiteSpeed/6.1', 'OpenResty/1.21.4', 'OpenResty/1.25.3', 'Tomcat/10.1.15', 'Tomcat/9.0.83', 'Jetty/11.0.18', 'Jetty/12.0.5', 'WildFly/30.0.0', 'Kestrel', 'Puma/6.4.0', 'Unicorn/6.1.0', 'Passenger/6.0.18', 'Waitress/2.1.2', 'Hypercorn/0.16.0', 'Daphne/4.0.0', 'Twisted/23.10.0', 'CherryPy/18.9.0'] tech_stacks = [ ['React 18.2.0', 'React Router 6.21', 'Redux Toolkit 2.0', 'RTK Query', 'Node.js 20.10 LTS', 'Express 4.18.2', 'MongoDB 7.0.4', 'Mongoose 8.0', 'Redis 7.2.3', 'Bull Queue 4.12', 'Nginx 1.25.3', 'Docker 24.0', 'Kubernetes 1.28.4', 'Helm 3.13', 'Prometheus 2.48', 'Grafana 10.2'], ['Vue.js 3.4.5', 'Vuex 4.1', 'Vue Router 4.2', 'Pinia 2.1', 'Nuxt 3.9.0', 'Django 5.0.1', 'Django REST Framework 3.14', 'PostgreSQL 16.1', 'Celery 5.3.6', 'RabbitMQ 3.12.10', 'Gunicorn 21.2', 'Nginx 1.25', 'Docker Compose', 'Prometheus', 'Grafana', 'Sentry'], ['Angular 17.1.0', 'NgRx 17.0', 'RxJS 7.8', 'Angular Material 17', 'Spring Boot 3.2.1', 'Spring Security 6.2', 'Spring Data JPA', 'MySQL 8.2.0', 'Elasticsearch 8.11.3', 'Apache Kafka 3.6.1', 'Grafana 10.2', 'Jenkins 2.426', 'SonarQube 10.3', 'JUnit 5.10', 'Mockito 5.8'], ['Next.js 14.0.4', 'React 18.2', 'TypeScript 5.3', 'Tailwind CSS 3.4', 'FastAPI 0.109.0', 'Pydantic 2.5', 'SQLAlchemy 2.0', 'Redis 7.2', 'PostgreSQL 16', 'Docker 24.0', 'Kubernetes 1.28', 'Istio 1.20', 'ArgoCD 2.9', 'Prometheus', 'Grafana', 'Jaeger'], ['Svelte 4.2.8', 'SvelteKit 2.0.6', 'TypeScript 5.3', 'Tailwind CSS 3.4', 'Go 1.21.5', 'Gin 1.9', 'GORM 1.25', 'CockroachDB 23.2', 'NATS 2.10.7', 'Traefik 3.0', 'Consul 1.17', 'Vault 1.15', 'Terraform 1.6', 'Prometheus', 'Grafana', 'Loki'], ['React 18.2.0', 'NestJS 10.3.0', 'TypeORM 0.3.17', 'GraphQL 16.8', 'Apollo Server 4.10', 'PostgreSQL 16.1', 'Bull 4.12', 'Redis 7.2.3', 'Swagger 7.1', 'Jest 29.7', 'Supertest 6.3', 'Docker', 'Kubernetes', 'Helm', 'ArgoCD', 'Datadog'], ['Vue.js 3.4.5', 'Inertia.js 1.0', 'Laravel 10.40', 'PHP 8.3', 'MySQL 8.2', 'Redis 7.2', 'Laravel Horizon 5.21', 'Laravel Telescope', 'Nginx 1.25', 'Vite 5.0', 'PHPUnit 10.5', 'Pest 2.28', 'Docker', 'GitHub Actions', 'Sentry', 'New Relic'], ['Angular 17.1', 'NgRx 17.0', '.NET 8.0', 'Entity Framework Core 8.0', 'ASP.NET Core 8.0', 'SQL Server 2022', 'Azure Service Bus', 'Azure Functions', 'IIS 10', 'SignalR 8.0', 'xUnit 2.6', 'Moq 4.20', 'Azure DevOps', 'Application Insights', 'Azure Monitor'], ] # 真实的 body preview 内容 response_bodies = [ 'Login - Enterprise Portal

    ', 'Dashboard
    ', '{"status":"ok","version":"2.4.1","environment":"production","timestamp":"2024-12-22T10:30:00Z","services":{"database":"healthy","cache":"healthy","queue":"healthy"},"uptime":864000}', '403 Forbidden

    403 Forbidden

    You don\'t have permission to access this resource. Please contact the administrator if you believe this is an error.


    nginx/1.24.0
    ', '系统维护中

    系统正在维护中

    预计恢复时间:2024-12-23 08:00

    ', '{"error":"Unauthorized","message":"Invalid or expired authentication token. Please login again.","code":"AUTH_001","timestamp":"2024-12-22T15:45:30.123Z","path":"/api/v1/users/profile"}', 'Welcome to nginx!

    Welcome to nginx!

    If you see this page, the nginx web server is successfully installed and working.

    ', '500Internal Server Error
    An unexpected error occurred while processing your request. Please try again later or contact support.
    req_abc123xyz789
    ', 'Redirecting...

    Redirecting to login page...

    Click here if not redirected', '{"data":{"user":{"id":12345,"username":"admin","email":"admin@example.com","role":"administrator","lastLogin":"2024-12-21T18:30:00Z","permissions":["read","write","delete","admin"]},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}}', 'API Documentation - Swagger UI
    ', '{"openapi":"3.0.3","info":{"title":"Enterprise API","description":"RESTful API for enterprise resource management","version":"1.0.0","contact":{"email":"api-support@example.com"}},"servers":[{"url":"https://api.example.com/v1"}]}', '404 Not Found

    404

    Page not found

    ', 'PING OK - Packet loss = 0%, RTA = 0.45 ms|rta=0.450000ms;100.000000;500.000000;0.000000 pl=0%;20;60;0', '{"metrics":{"requests_total":1234567,"requests_per_second":450.5,"avg_response_time_ms":23.4,"error_rate":0.02,"active_connections":1250,"memory_usage_mb":2048,"cpu_usage_percent":45.6}}', 'Under Construction
      _   _           _             ____                _                   _   _             \n | | | |_ __   __| | ___ _ __  / ___|___  _ __  ___| |_ _ __ _   _  ___| |_(_) ___  _ __  \n | | | | \'_ \\ / _` |/ _ \\ \'__|| |   / _ \\| \'_ \\/ __| __| \'__| | | |/ __| __| |/ _ \\| \'_ \\ \n | |_| | | | | (_| |  __/ |   | |__| (_) | | | \\__ \\ |_| |  | |_| | (__| |_| | (_) | | | |\n  \\___/|_| |_|\\__,_|\\___|_|    \\____\\___/|_| |_|___/\\__|_|   \\__,_|\\___|\\__|_|\\___/|_| |_|\n

    Coming Soon...

    ', '{"success":false,"error":{"type":"ValidationError","message":"Request validation failed","details":[{"field":"email","message":"Invalid email format"},{"field":"password","message":"Password must be at least 8 characters"}]}}', 'Server: Apache/2.4.57 (Ubuntu)\nX-Powered-By: PHP/8.2.0\nContent-Type: text/html; charset=UTF-8\nSet-Cookie: PHPSESSID=abc123; path=/; HttpOnly; Secure\n\nphpinfo()PHP Version 8.2.0', ] # 获取域名目标 cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL LIMIT 80") domain_targets = cur.fetchall() batch_data = [] for target_id, target_name in domain_targets: for i in range(random.randint(15, 30)): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'website/{i:04d}') # 生成模拟的响应头数据 response_headers = { 'server': random.choice(['nginx', 'Apache', 'cloudflare', 'Microsoft-IIS/10.0']), 'content_type': 'text/html; charset=utf-8', 'x_powered_by': random.choice(['PHP/8.2', 'ASP.NET', 'Express', None]), 'x_frame_options': random.choice(['DENY', 'SAMEORIGIN', None]), 'strict_transport_security': 'max-age=31536000; includeSubDomains' if random.choice([True, False]) else None, 'set_cookie': f'session={random.randint(100000, 999999)}; HttpOnly; Secure' if random.choice([True, False]) else None, } # 移除 None 值 response_headers = {k: v for k, v in response_headers.items() if v is not None} batch_data.append(( url, target_id, target_name, random.choice(titles), random.choice(webservers), random.choice(tech_stacks), random.choice([200, 301, 302, 403, 404]), random.randint(1000, 500000), 'text/html; charset=utf-8', f'https://{target_name}/login' if random.choice([True, False]) else '', random.choice(response_bodies), random.choice([True, False, None]), generate_raw_response_headers(response_headers) )) # 批量插入 ids = [] if batch_data: execute_values(cur, """ INSERT INTO website ( url, target_id, host, title, webserver, tech, status_code, content_length, content_type, location, response_body, vhost, response_headers, created_at ) VALUES %s ON CONFLICT DO NOTHING RETURNING id """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())") ids = [row[0] for row in cur.fetchall()] print(f" ✓ 创建了 {len(batch_data)} 个网站\n") return ids def create_endpoints(self, target_ids: list): """创建端点""" print("🔗 创建端点...") cur = self.conn.cursor() paths = [ '/api/v1/users/authentication/login', '/api/v1/users/authentication/logout', '/api/v1/users/profile/settings/preferences', '/api/v2/products/catalog/categories/list', '/api/v2/orders/checkout/payment-processing', '/api/v3/analytics/dashboard/metrics/summary', '/graphql/query', '/graphql/mutation', '/admin/dashboard/overview', '/admin/users/management/list', '/admin/settings/configuration/system', '/portal/customer/account/billing-history', '/internal/health/readiness-check', '/internal/metrics/prometheus-endpoint', '/webhook/payment/stripe/callback', '/oauth/authorize', '/oauth/token', '/swagger/v1/swagger.json', '/openapi/v3/api-docs', # 扩展路径 '/api/v1/organizations/enterprise/departments/teams/members/list', '/api/v2/inventory/warehouse/locations/zones/shelves/products', '/api/v3/reporting/financial/quarterly/revenue/breakdown/by-region', '/admin/system/configuration/security/authentication/providers/saml', '/admin/audit/logs/security/events/authentication/failures/export', '/portal/enterprise/dashboard/analytics/performance/metrics/realtime', '/internal/monitoring/infrastructure/kubernetes/pods/health/status', '/webhook/integration/salesforce/opportunity/stage-change/notification', '/api/v1/customers/enterprise/contracts/subscriptions/billing/invoices', '/api/v2/shipping/carriers/fedex/tracking/packages/delivery-status', '/api/v3/notifications/channels/email/templates/marketing/campaigns', '/admin/content/management/pages/blog/articles/drafts/review-queue', '/portal/support/tickets/priority/critical/escalation/management', '/internal/jobs/scheduler/cron/tasks/execution/history/logs', '/api/v1/search/elasticsearch/indices/products/documents/query', '/api/v2/cache/redis/clusters/primary/keys/invalidation/batch', '/api/v3/queue/rabbitmq/exchanges/notifications/bindings/routes', '/admin/database/migrations/schema/versions/rollback/history', '/portal/analytics/google/tag-manager/containers/tags/triggers', '/internal/secrets/vault/kv/applications/credentials/rotation', ] gf_patterns = [ ['debug', 'config', 'api', 'json', 'upload', 'file', 'admin', 'auth', 'secrets', 'credentials'], ['backup', 'archive', 'debug', 'trace', 'log', 'error', 'exception', 'stack', 'dump', 'memory'], ['api', 'rest', 'graphql', 'websocket', 'grpc', 'soap', 'xml', 'json', 'yaml', 'protobuf'], ['auth', 'login', 'logout', 'session', 'token', 'jwt', 'oauth', 'saml', 'sso', 'mfa', 'otp', '2fa'], ['upload', 'download', 'file', 'attachment', 'document', 'image', 'video', 'audio', 'media', 'asset'], ['admin', 'dashboard', 'panel', 'console', 'management', 'settings', 'config', 'system', 'control'], ['database', 'sql', 'query', 'table', 'schema', 'migration', 'backup', 'restore', 'dump', 'export'], ['cache', 'redis', 'memcached', 'session', 'storage', 'temp', 'buffer', 'queue', 'message', 'event'], ['security', 'vulnerability', 'exploit', 'injection', 'xss', 'csrf', 'ssrf', 'rce', 'lfi', 'sqli'], ['payment', 'billing', 'invoice', 'subscription', 'checkout', 'cart', 'order', 'transaction', 'refund'], ['user', 'profile', 'account', 'password', 'email', 'phone', 'address', 'preference', 'notification'], ['api-key', 'secret-key', 'access-token', 'refresh-token', 'private-key', 'public-key', 'certificate'], ['debug', 'trace', 'log', 'error', 'warning', 'info', 'verbose', 'metric', 'monitor', 'health'], ['internal', 'private', 'restricted', 'confidential', 'sensitive', 'protected', 'secure', 'encrypted'], ['test', 'staging', 'development', 'production', 'sandbox', 'demo', 'preview', 'beta', 'alpha'], [], # 空的情况 ] # 100字符长度的标题 titles = [ 'Enterprise API Gateway - RESTful Service Documentation with OpenAPI 3.0 Specification and Interactive', 'User Authentication Service - OAuth 2.0 and SAML 2.0 Single Sign-On Integration Platform Dashboard', 'Payment Processing Gateway - PCI-DSS Compliant Transaction Management System Administration Panel', 'Content Delivery Network - Global Edge Cache Management and Real-time Analytics Dashboard Interface', 'Database Administration Console - PostgreSQL Cluster Management with Automated Backup and Recovery', 'Kubernetes Container Orchestration - Pod Deployment and Service Mesh Configuration Control Panel', 'Message Queue Management - RabbitMQ Exchange and Binding Configuration with Dead Letter Handling', 'Search Engine Administration - Elasticsearch Index Management and Query Performance Optimization', 'Monitoring and Alerting System - Prometheus Metrics Collection with Grafana Dashboard Integration', 'Security Operations Center - Vulnerability Assessment and Incident Response Management Platform', 'API Rate Limiting Service - Request Throttling and Quota Management with Real-time Usage Analytics', 'File Storage Management - S3-Compatible Object Storage with Lifecycle Policy and Access Control', 'Email Notification Service - SMTP Gateway with Template Management and Delivery Status Tracking', 'Webhook Integration Platform - Event-Driven Architecture with Retry Logic and Failure Handling', 'GraphQL API Playground - Interactive Query Builder with Schema Introspection and Documentation', ] # 扩展的技术栈列表(用于生成10-20个技术) all_techs = [ 'React 18.2.0', 'Vue.js 3.4', 'Angular 17.1', 'Next.js 14.0', 'Nuxt 3.9', 'Svelte 4.2', 'Node.js 20.10', 'Express 4.18', 'NestJS 10.3', 'Fastify 4.25', 'Koa 2.15', 'Python 3.12', 'Django 5.0', 'FastAPI 0.109', 'Flask 3.0', 'Tornado 6.4', 'Go 1.21', 'Gin 1.9', 'Echo 4.11', 'Fiber 2.52', 'Chi 5.0', 'Java 21', 'Spring Boot 3.2', 'Quarkus 3.6', 'Micronaut 4.2', 'PostgreSQL 16.1', 'MySQL 8.2', 'MongoDB 7.0', 'Redis 7.2', 'Elasticsearch 8.11', 'Kubernetes 1.28', 'Docker 24.0', 'Nginx 1.25', 'Apache 2.4', 'Traefik 3.0', 'GraphQL 16.8', 'gRPC 1.60', 'WebSocket', 'REST API', 'OpenAPI 3.0', 'JWT', 'OAuth 2.0', 'SAML 2.0', 'OIDC', 'Passport.js', 'Webpack 5.89', 'Vite 5.0', 'esbuild 0.19', 'Rollup 4.9', 'Parcel 2.11', 'TypeScript 5.3', 'Tailwind CSS 3.4', 'Bootstrap 5.3', 'Material UI 5.15', 'Jest 29.7', 'Vitest 1.1', 'Cypress 13.6', 'Playwright 1.40', 'Prometheus', 'Grafana 10.2', 'Jaeger', 'Zipkin', 'OpenTelemetry', 'RabbitMQ 3.12', 'Kafka 3.6', 'NATS 2.10', 'Redis Streams', 'AWS Lambda', 'Azure Functions', 'Google Cloud Functions', 'Cloudflare Workers', ] # 真实的 API 响应 body preview response_bodies = [ '{"status":"success","data":{"user_id":12345,"username":"john_doe","email":"john@example.com","role":"user","created_at":"2024-01-15T10:30:00Z","last_login":"2024-12-22T08:45:00Z"}}', '{"success":true,"message":"Authentication successful","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","expires_in":3600}', '{"error":"Unauthorized","code":"AUTH_FAILED","message":"Invalid credentials provided. Please check your username and password.","timestamp":"2024-12-22T15:30:45.123Z","request_id":"req_abc123xyz"}', '{"data":{"products":[{"id":1,"name":"Enterprise License","price":999.99,"currency":"USD"},{"id":2,"name":"Professional License","price":499.99,"currency":"USD"},{"id":3,"name":"Basic License","price":99.99,"currency":"USD"}],"total":3,"page":1,"per_page":10}}', '{"health":{"status":"healthy","version":"2.4.1","uptime":"15d 6h 32m","checks":{"database":"ok","redis":"ok","elasticsearch":"ok","rabbitmq":"ok"},"memory":{"used":"2.1GB","total":"8GB"},"cpu":"23%"}}', '{"errors":[{"field":"email","message":"Email address is already registered"},{"field":"password","message":"Password must contain at least one uppercase letter, one number, and one special character"}],"code":"VALIDATION_ERROR"}', '{"result":{"query":"SELECT * FROM users WHERE id = ?","rows_affected":1,"execution_time_ms":12,"cached":false},"data":[{"id":1,"name":"Admin User","status":"active"}]}', 'GraphQL Playground
    Loading GraphQL Playground...
    ', '{"swagger":"2.0","info":{"title":"Enterprise API","description":"RESTful API for enterprise resource management","version":"1.0.0"},"host":"api.example.com","basePath":"/v1","schemes":["https"],"paths":{"/users":{"get":{"summary":"List users"}}}}', '{"openapi":"3.0.3","info":{"title":"User Management API","version":"2.0.0","description":"API for managing user accounts and permissions","contact":{"email":"api@example.com"}},"servers":[{"url":"https://api.example.com/v2","description":"Production server"}]}', '{"metrics":{"http_requests_total":{"value":1523456,"labels":{"method":"GET","status":"200"}},"http_request_duration_seconds":{"value":0.023,"labels":{"quantile":"0.99"}},"process_cpu_seconds_total":{"value":12345.67}}}', '# HELP http_requests_total Total number of HTTP requests\n# TYPE http_requests_total counter\nhttp_requests_total{method="GET",status="200"} 1523456\nhttp_requests_total{method="POST",status="201"} 45678\n# HELP http_request_duration_seconds HTTP request latency\nhttp_request_duration_seconds{quantile="0.5"} 0.012', '{"order":{"id":"ORD-2024-123456","status":"processing","items":[{"sku":"PROD-001","name":"Widget Pro","quantity":2,"price":49.99}],"subtotal":99.98,"tax":8.00,"shipping":5.99,"total":113.97,"created_at":"2024-12-22T14:30:00Z"}}', '{"session":{"id":"sess_abc123xyz789","user_id":12345,"ip_address":"192.168.1.100","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36","created_at":"2024-12-22T10:00:00Z","expires_at":"2024-12-22T22:00:00Z","is_active":true}}', '{"rate_limit":{"limit":1000,"remaining":847,"reset":1703260800,"retry_after":null},"request_id":"req_xyz789abc123","timestamp":"2024-12-22T16:45:30Z"}', '{"webhook":{"id":"wh_123456","event":"payment.completed","data":{"payment_id":"pay_abc123","amount":9999,"currency":"usd","status":"succeeded","customer_id":"cus_xyz789"},"created":1703260800}}', '{"oauth":{"access_token":"ya29.a0AfH6SMBx...","token_type":"Bearer","expires_in":3600,"refresh_token":"1//0gYx...","scope":"openid email profile"}}', '{"debug":{"request":{"method":"POST","path":"/api/v1/users","headers":{"Content-Type":"application/json","Authorization":"Bearer ***"},"body":{"email":"test@example.com"}},"response":{"status":201,"time_ms":45},"trace_id":"trace_abc123"}}', '{"config":{"app":{"name":"Enterprise Portal","version":"3.2.1","environment":"production"},"features":{"dark_mode":true,"beta_features":false,"maintenance_mode":false},"limits":{"max_upload_size":"50MB","rate_limit":"1000/hour"}}}', '{"analytics":{"page_views":{"today":12345,"this_week":87654,"this_month":345678},"unique_visitors":{"today":4567,"this_week":23456,"this_month":98765},"bounce_rate":"32.5%","avg_session_duration":"4m 32s"}}', '{"search":{"query":"enterprise software","results":[{"id":1,"title":"Enterprise Resource Planning","score":0.95},{"id":2,"title":"Enterprise Security Suite","score":0.87}],"total":156,"took_ms":23,"page":1,"per_page":10}}', '{"batch":{"id":"batch_123","status":"completed","total_items":1000,"processed":1000,"failed":3,"started_at":"2024-12-22T10:00:00Z","completed_at":"2024-12-22T10:15:32Z","errors":[{"item_id":45,"error":"Invalid format"},{"item_id":123,"error":"Duplicate entry"}]}}', '{"notification":{"id":"notif_abc123","type":"email","recipient":"user@example.com","subject":"Your order has shipped","status":"delivered","sent_at":"2024-12-22T14:30:00Z","opened_at":"2024-12-22T15:45:00Z"}}', '{"cache":{"status":"hit","key":"user:12345:profile","ttl":3600,"size_bytes":2048,"created_at":"2024-12-22T10:00:00Z","last_accessed":"2024-12-22T16:30:00Z","hit_count":156}}', '{"queue":{"name":"email_notifications","messages":{"pending":234,"processing":12,"completed":45678,"failed":23},"consumers":3,"avg_processing_time_ms":150,"oldest_message_age":"2m 15s"}}', ] # 获取域名目标 cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL LIMIT 80") domain_targets = cur.fetchall() count = 0 batch_data = [] for target_id, target_name in domain_targets: num = random.randint(50, 100) selected = random.sample(paths, min(num, len(paths))) for idx, path in enumerate(selected): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'endpoint/{idx:04d}') # 生成 100 字符的标题 title = random.choice(titles) # 生成 10-20 个技术 num_techs = random.randint(10, 20) tech_list = random.sample(all_techs, min(num_techs, len(all_techs))) # 生成 10-20 个 tags (gf_patterns) tags = random.choice(gf_patterns) # 生成模拟的响应头数据 response_headers = { 'server': random.choice(['nginx', 'gunicorn', 'uvicorn', 'Apache']), 'content_type': 'application/json', 'x_request_id': f'req_{random.randint(100000, 999999)}', 'x_ratelimit_limit': str(random.choice([100, 1000, 5000])), 'x_ratelimit_remaining': str(random.randint(0, 1000)), 'cache_control': random.choice(['no-cache', 'max-age=3600', 'private', None]), } # 移除 None 值 response_headers = {k: v for k, v in response_headers.items() if v is not None} batch_data.append(( url, target_id, target_name, title, random.choice(['nginx/1.24.0', 'gunicorn/21.2.0']), random.choice([200, 201, 301, 400, 401, 403, 404, 500]), random.randint(100, 50000), 'application/json', tech_list, '', random.choice(response_bodies), random.choice([True, False, None]), tags, generate_raw_response_headers(response_headers) )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO endpoint ( url, target_id, host, title, webserver, status_code, content_length, content_type, tech, location, response_body, vhost, matched_gf_patterns, response_headers, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个端点\n") def create_directories(self, target_ids: list, website_ids: list): """创建目录""" print("📁 创建目录...") cur = self.conn.cursor() dir_paths = [ '/admin/', '/administrator/', '/wp-admin/', '/wp-content/', '/backup/', '/backups/', '/old/', '/archive/', '/temp/', '/test/', '/dev/', '/staging/', '/config/', '/api/', '/api/v1/', '/api/v2/', '/uploads/', '/files/', '/documents/', '/docs/', '/images/', '/assets/', '/static/', '/css/', '/js/', '/logs/', '/debug/', '/private/', '/secure/', '/internal/', '/data/', '/database/', '/phpmyadmin/', '/cgi-bin/', '/includes/', '/lib/', '/vendor/', '/node_modules/', '/plugins/', '/themes/', '/templates/', '/src/', '/app/', '/portal/', '/dashboard/', '/panel/', '/user/', '/users/', '/account/', '/profile/', '/member/', '/customer/', # 扩展目录 '/api/v3/', '/api/internal/', '/api/admin/', '/api/public/', '/api/private/', '/admin/config/', '/admin/logs/', '/admin/backup/', '/admin/users/', '/admin/settings/', '/system/', '/system/config/', '/system/logs/', '/system/backup/', '/system/cache/', '/storage/', '/storage/uploads/', '/storage/temp/', '/storage/cache/', '/storage/logs/', '/resources/', '/resources/images/', '/resources/documents/', '/resources/templates/', '/public/', '/public/assets/', '/public/uploads/', '/public/images/', '/public/files/', '/private/data/', '/private/config/', '/private/keys/', '/private/certificates/', '/backup/daily/', '/backup/weekly/', '/backup/monthly/', '/backup/database/', '/logs/access/', '/logs/error/', '/logs/audit/', '/logs/security/', '/logs/application/', '/cache/', '/cache/views/', '/cache/data/', '/cache/sessions/', '/cache/compiled/', '/tmp/', '/tmp/uploads/', '/tmp/sessions/', '/tmp/cache/', '/tmp/exports/', '/exports/', '/exports/reports/', '/exports/data/', '/exports/csv/', '/exports/pdf/', '/imports/', '/imports/data/', '/imports/csv/', '/imports/xml/', '/imports/json/', '/reports/', '/reports/daily/', '/reports/weekly/', '/reports/monthly/', '/reports/annual/', '/media/', '/media/images/', '/media/videos/', '/media/audio/', '/media/documents/', '/downloads/', '/downloads/software/', '/downloads/documents/', '/downloads/updates/', ] content_types = ['text/html; charset=utf-8', 'application/json', 'text/plain', 'text/css', 'application/xml', 'application/javascript', 'text/xml'] # 直接获取域名目标来生成目录数据 cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL LIMIT 100") domain_targets = cur.fetchall() if not domain_targets: print(" ⚠ 没有域名目标,跳过\n") return count = 0 batch_data = [] for target_id, target_name in domain_targets: num = random.randint(60, 100) selected = random.sample(dir_paths, min(num, len(dir_paths))) for idx, path in enumerate(selected): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'directory/{idx:04d}') batch_data.append(( url, target_id, random.choice([200, 301, 302, 403, 404, 500]), random.randint(0, 100000), random.randint(0, 5000), random.randint(0, 500), random.choice(content_types), random.randint(10000000, 5000000000) )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO directory ( url, target_id, status, content_length, words, lines, content_type, duration, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个目录\n") def create_host_port_mappings(self, target_ids: list): """创建主机端口映射""" print("🔌 创建主机端口映射...") cur = self.conn.cursor() # 扩展端口列表,包含更多常见端口 ports = [ # 常见服务端口 20, 21, 22, 23, 25, 26, 53, 69, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 110, 111, 113, 119, 123, 135, 137, 138, 139, 143, 161, 162, 179, 194, 199, 389, 443, 444, 445, 465, 500, 512, 513, 514, 515, 520, 523, 524, 548, 554, # 数据库端口 1433, 1434, 1521, 1522, 1525, 1526, 1527, 1528, 1529, 1530, 3306, 3307, 3308, 5432, 5433, 5434, 6379, 6380, 6381, 9200, 9201, 9300, 9301, 27017, 27018, 27019, 28017, # Web 服务端口 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8443, 8444, 8445, 8888, 8889, 9000, 9001, 9002, 9003, 9090, 9091, 9443, # 消息队列和缓存 5672, 5673, 15672, 25672, 4369, 11211, 11212, 11213, # 容器和编排 2375, 2376, 2377, 2379, 2380, 6443, 6444, 10250, 10251, 10252, 10255, # 监控和日志 3000, 3001, 3002, 9090, 9091, 9093, 9094, 9100, 9104, 9115, 9116, 5601, 5602, 9600, 9601, 24224, 24225, # 其他常见端口 993, 995, 1080, 1081, 1723, 2049, 2181, 2182, 2183, 3128, 3129, 3389, 3390, 4443, 4444, 5000, 5001, 5002, 5003, 5900, 5901, 5902, 5984, 5985, 6000, 6001, 6002, 7001, 7002, 7003, 7070, 7071, 7443, 7474, 7687, 8161, 8162, 8180, 8181, 8200, 8201, 8280, 8281, 8300, 8301, 8400, 8401, 8500, 8501, 8600, 8601, 8686, 8687, 8787, 8788, 8880, 8881, 8983, 8984, 9418, 9419, 9999, 10000, 10001, 10002, 11111, 12345, 15000, 15001, 16379, 16380, 18080, 18081, 19999, 20000, 22222, 27018, 27019, 28015, 28016, 29015, 29016, 30000, 30001, 31337, 32768, 33060, 33061, 44818, 47001, 49152, 50000, 50001, 50070, 50075, 50090, 54321, 55555, 60000, 60001, 61616, 61617, ] # 去重 ports = list(set(ports)) # 获取域名目标 cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL LIMIT 80") domain_targets = cur.fetchall() count = 0 batch_data = [] for target_id, target_name in domain_targets: num_ips = random.randint(15, 30) for _ in range(num_ips): ip = f'192.168.{random.randint(1, 254)}.{random.randint(1, 254)}' # 增加每个 IP 的端口数量,30-60 个端口 num_ports = random.randint(30, 60) selected_ports = random.sample(ports, min(num_ports, len(ports))) for port in selected_ports: batch_data.append((target_id, target_name, ip, port)) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO host_port_mapping (target_id, host, ip, port, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个主机端口映射\n") def create_vulnerabilities(self, target_ids: list): """创建漏洞(基于 website URL 前缀)""" print("🐛 创建漏洞...") cur = self.conn.cursor() vuln_types = [ 'sql-injection-authentication-bypass-vulnerability-', 'cross-site-scripting-xss-stored-persistent-attack-', 'cross-site-request-forgery-csrf-token-validation--', 'server-side-request-forgery-ssrf-internal-access--', 'xml-external-entity-xxe-injection-vulnerability---', 'remote-code-execution-rce-command-injection-flaw--', 'local-file-inclusion-lfi-path-traversal-exploit---', 'directory-traversal-arbitrary-file-read-access----', 'authentication-bypass-session-management-flaw-----', 'insecure-direct-object-reference-idor-access-ctrl-', 'sensitive-data-exposure-information-disclosure----', 'security-misconfiguration-default-credentials-----', 'broken-access-control-privilege-escalation-vuln---', 'cors-misconfiguration-cross-origin-data-leakage---', 'subdomain-takeover-dns-misconfiguration-exploit---', 'exposed-admin-panel-unauthorized-access-control---', 'default-credentials-weak-authentication-bypass----', 'information-disclosure-sensitive-data-exposure----', 'command-injection-os-command-execution-exploit----', 'ldap-injection-directory-service-manipulation-----', ] sources = [ 'nuclei-vulnerability-scanner--', 'dalfox-xss-parameter-analysis-', 'sqlmap-sql-injection-testing--', 'crlfuzz-crlf-injection-finder-', 'httpx-web-probe-fingerprint---', 'manual-penetration-testing----', 'burp-suite-professional-scan--', 'owasp-zap-security-scanner----', ] severities = ['unknown', 'info', 'low', 'medium', 'high', 'critical'] # 漏洞路径后缀(会追加到 website URL 后面) vuln_paths = [ '/api/users?id=1', '/api/admin/config', '/api/v1/auth/login', '/api/v2/data/export', '/admin/settings', '/debug/console', '/backup/db.sql', '/.env', '/.git/config', '/wp-admin/', '/phpmyadmin/', '/api/graphql', '/swagger.json', '/actuator/health', '/metrics', ] # 获取所有 website 的 URL 和 target_id cur.execute("SELECT id, url, target_id FROM website LIMIT 500") websites = cur.fetchall() if not websites: print(" ⚠ 没有 website 数据,跳过漏洞生成\n") return count = 0 batch_data = [] for website_id, website_url, target_id in websites: # 每个 website 生成 1-5 个漏洞 num_vulns = random.randint(1, 5) for idx in range(num_vulns): severity = random.choice(severities) cvss_ranges = { 'critical': (9.0, 10.0), 'high': (7.0, 8.9), 'medium': (4.0, 6.9), 'low': (0.1, 3.9), 'info': (0.0, 0.0), 'unknown': (0.0, 10.0) } cvss_range = cvss_ranges.get(severity, (0.0, 10.0)) cvss_score = round(random.uniform(*cvss_range), 1) # 漏洞 URL = website URL + 漏洞路径 # 先移除 website URL 中的查询参数 base_url = website_url.split('?')[0] vuln_url = base_url + random.choice(vuln_paths) description = generate_fixed_length_text(length=300, text_type='description') raw_output = json.dumps({ 'template': f'CVE-2024-{random.randint(10000, 99999)}', 'matcher_name': 'default', 'severity': severity, 'matched_at': vuln_url, }) batch_data.append(( target_id, vuln_url, random.choice(vuln_types), severity, random.choice(sources), cvss_score, description, raw_output )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO vulnerability ( target_id, url, vuln_type, severity, source, cvss_score, description, raw_output, created_at ) VALUES %s """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个漏洞\n") def create_subdomain_snapshots(self, scan_ids: list): """创建子域名快照""" print("📸 创建子域名快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return prefixes = [ 'api', 'admin', 'portal', 'dashboard', 'app', 'mobile', 'staging', 'dev', 'test', 'qa', 'uat', 'beta', 'mail', 'vpn', 'cdn', 'static', 'auth', 'login', 'sso', 'oauth', 'identity', 'accounts', 'secure', 'monitoring', 'metrics', 'grafana', 'prometheus', 'kibana', 'logs', 'jenkins', 'ci', 'cd', 'gitlab', 'jira', 'confluence', 'kubernetes', 'www', 'www2', 'ns1', 'ns2', 'mx', 'mx1', 'autodiscover', 'webmail', 'api-v1', 'api-v2', 'api-v3', 'internal', 'external', 'public', 'private', 'gateway', 'proxy', 'cache', 'redis', 'mongo', 'mysql', 'postgres', 'elastic', 'search', 'analytics', 'reporting', 'billing', 'payment', 'checkout', 'cart', 'shop', 'store', 'catalog', 'inventory', 'orders', 'users', 'customers', 'partners', 'vendors', 'suppliers', 'merchants', 'docs', 'help', 'support', 'faq', 'kb', 'wiki', 'blog', 'news', 'status', 'health', 'ping', 'heartbeat', 'uptime', 'monitor', 'backup', 'archive', 'storage', 'files', 'uploads', 'downloads', 'assets', 'images', 'media', 'video', 'audio', 'fonts', 'icons', 'api-gateway', 'load-balancer', 'reverse-proxy', 'edge', 'origin', 'primary', 'secondary', 'failover', 'replica', 'master', 'slave', 'prod', 'stage', 'preprod', 'sandbox', 'demo', 'preview', 'canary', ] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 # 获取扫描对应的目标域名 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] num = random.randint(60, 100) selected = random.sample(prefixes, min(num, len(prefixes))) for prefix in selected: subdomain_name = f'{prefix}.{target_name}' batch_data.append((scan_id, subdomain_name)) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO subdomain_snapshot (scan_id, name, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, NOW())") print(f" ✓ 创建了 {count} 个子域名快照\n") def create_website_snapshots(self, scan_ids: list): """创建网站快照""" print("📸 创建网站快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return titles = [ 'Enterprise Portal - Login | Secure Access Required - Multi-Factor Authentication', 'Admin Dashboard - System Management | Configuration Settings Overview', 'API Documentation - Swagger UI | RESTful Endpoints Reference Guide', 'Customer Portal - Account Management | Billing Subscription Services', 'Developer Console - Application Management | API Keys Webhooks Configuration', 'Support Center - Help Desk | Knowledge Base FAQ Ticket System', 'Analytics Dashboard - Business Intelligence | Real-time Metrics Reporting', 'Security Center - Threat Detection | Vulnerability Assessment Reports', 'User Management - Identity Access Control | Role Permission Administration', 'Content Management System - Publishing Platform | Media Library Editor', ] webservers = ['nginx/1.24.0', 'nginx/1.25.3', 'Apache/2.4.57', 'Apache/2.4.58', 'cloudflare', 'gunicorn/21.2.0', 'Microsoft-IIS/10.0'] tech_stacks = [['React', 'Node.js', 'Express'], ['Vue.js', 'Django', 'PostgreSQL'], ['Angular', 'Spring Boot', 'MySQL'], ['Next.js', 'FastAPI', 'Redis'], ['Svelte', 'Go', 'MongoDB'], ['React', 'NestJS', 'TypeORM']] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] for i in range(random.randint(30, 60)): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'website-snap/{i:04d}') # 生成模拟的响应头数据 response_headers = { 'server': random.choice(['nginx', 'Apache', 'cloudflare']), 'content_type': 'text/html; charset=utf-8', 'x_frame_options': random.choice(['DENY', 'SAMEORIGIN', None]), } # 移除 None 值 response_headers = {k: v for k, v in response_headers.items() if v is not None} batch_data.append(( scan_id, url, target_name, random.choice(titles), random.choice(webservers), random.choice(tech_stacks), random.choice([200, 301, 403]), random.randint(1000, 50000), 'text/html; charset=utf-8', '', # location 字段 'TestContent', generate_raw_response_headers(response_headers) )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO website_snapshot ( scan_id, url, host, title, webserver, tech, status_code, content_length, content_type, location, response_body, response_headers, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个网站快照\n") def create_endpoint_snapshots(self, scan_ids: list): """创建端点快照""" print("📸 创建端点快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return paths = [ '/api/v1/users', '/api/v1/auth/login', '/api/v2/products', '/admin/dashboard', '/graphql', '/health', '/metrics', '/api/v1/organizations/departments/teams/members', '/api/v2/inventory/warehouse/locations/products', '/api/v3/reporting/analytics/metrics/summary', '/admin/system/configuration/security/settings', '/portal/customer/account/billing/invoices', '/internal/monitoring/kubernetes/pods/status', '/webhook/integration/payment/callback/handler', '/oauth/authorize/callback/redirect', '/swagger/v1/api-docs/openapi.json', ] # 100字符长度的标题 titles = [ 'Enterprise API Gateway - RESTful Service Documentation with OpenAPI 3.0 Specification and Interactive', 'User Authentication Service - OAuth 2.0 and SAML 2.0 Single Sign-On Integration Platform Dashboard', 'Payment Processing Gateway - PCI-DSS Compliant Transaction Management System Administration Panel', 'Content Delivery Network - Global Edge Cache Management and Real-time Analytics Dashboard Interface', 'Database Administration Console - PostgreSQL Cluster Management with Automated Backup and Recovery', ] # 扩展的技术栈列表 all_techs = [ 'React 18.2.0', 'Vue.js 3.4', 'Angular 17.1', 'Next.js 14.0', 'Node.js 20.10', 'Express 4.18', 'Python 3.12', 'Django 5.0', 'FastAPI 0.109', 'Go 1.21', 'PostgreSQL 16.1', 'MySQL 8.2', 'MongoDB 7.0', 'Redis 7.2', 'Elasticsearch 8.11', 'Kubernetes 1.28', 'Docker 24.0', 'Nginx 1.25', 'GraphQL 16.8', 'JWT', ] # 扩展的 tags all_tags = [ 'debug', 'config', 'api', 'json', 'upload', 'file', 'admin', 'auth', 'secrets', 'credentials', 'backup', 'archive', 'trace', 'log', 'error', 'security', 'vulnerability', 'payment', 'user', 'internal', 'private', ] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] for idx, path in enumerate(random.sample(paths, min(random.randint(40, 80), len(paths)))): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'endpoint-snap/{idx:04d}') # 生成 100 字符的标题 title = random.choice(titles) # 生成 10-20 个技术 num_techs = random.randint(10, 20) tech_list = random.sample(all_techs, min(num_techs, len(all_techs))) # 生成 10-20 个 tags num_tags = random.randint(10, 20) tags = random.sample(all_tags, min(num_tags, len(all_tags))) # 生成模拟的响应头数据 response_headers = { 'server': 'nginx/1.24.0', 'content_type': 'application/json', 'x_request_id': f'req_{random.randint(100000, 999999)}', } batch_data.append(( scan_id, url, target_name, title, random.choice([200, 201, 401, 403, 404]), random.randint(100, 5000), '', # location 'nginx/1.24.0', 'application/json', tech_list, '{"status":"ok","data":{}}', tags, generate_raw_response_headers(response_headers) )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO endpoint_snapshot ( scan_id, url, host, title, status_code, content_length, location, webserver, content_type, tech, response_body, matched_gf_patterns, response_headers, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个端点快照\n") def create_directory_snapshots(self, scan_ids: list): """创建目录快照""" print("📸 创建目录快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return dirs = [ '/admin/', '/backup/', '/config/', '/uploads/', '/static/', '/assets/', '/images/', '/js/', '/css/', '/api/', '/admin/config/', '/admin/logs/', '/admin/backup/', '/admin/users/', '/system/', '/system/config/', '/system/logs/', '/system/cache/', '/storage/', '/storage/uploads/', '/storage/temp/', '/storage/cache/', '/resources/', '/resources/images/', '/resources/documents/', '/public/', '/public/assets/', '/public/uploads/', '/public/images/', '/private/data/', '/private/config/', '/private/keys/', '/backup/daily/', '/backup/weekly/', '/backup/database/', '/logs/access/', '/logs/error/', '/logs/audit/', '/logs/security/', '/cache/', '/cache/views/', '/cache/data/', '/cache/sessions/', '/tmp/', '/tmp/uploads/', '/tmp/sessions/', '/tmp/exports/', '/exports/', '/exports/reports/', '/exports/data/', '/exports/csv/', ] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] for idx, d in enumerate(random.sample(dirs, min(random.randint(50, 80), len(dirs)))): # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'dir-snap/{idx:04d}') batch_data.append(( scan_id, url, random.choice([200, 301, 403]), random.randint(500, 10000), random.randint(50, 500), random.randint(10, 100), 'text/html', random.randint(10000000, 500000000) # 纳秒 )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO directory_snapshot ( scan_id, url, status, content_length, words, lines, content_type, duration, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个目录快照\n") def create_host_port_mapping_snapshots(self, scan_ids: list): """创建主机端口映射快照""" print("📸 创建主机端口映射快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return common_ports = [22, 80, 443, 3306, 5432, 6379, 8080, 8443, 9000, 21, 23, 25, 53, 110, 143, 389, 445, 993, 995, 1433, 1521, 2049, 2181, 3000, 3389, 5000, 5672, 6443, 7001, 8000, 8081, 8888, 9090, 9200, 27017] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] # 生成多个随机 IP for _ in range(random.randint(10, 20)): ip = f'192.168.{random.randint(1, 254)}.{random.randint(1, 254)}' for port in random.sample(common_ports, min(random.randint(20, 35), len(common_ports))): batch_data.append((scan_id, target_name, ip, port)) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO host_port_mapping_snapshot ( scan_id, host, ip, port, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个主机端口映射快照\n") def create_vulnerability_snapshots(self, scan_ids: list): """创建漏洞快照""" print("📸 创建漏洞快照...") cur = self.conn.cursor() if not scan_ids: print(" ⚠ 缺少扫描任务,跳过\n") return vuln_types = [ 'sql-injection-authentication-bypass-vulnerability-', 'cross-site-scripting-xss-stored-persistent-attack-', 'server-side-request-forgery-ssrf-internal-access--', 'remote-code-execution-rce-command-injection-flaw--', 'insecure-direct-object-reference-idor-access-ctrl-', 'authentication-bypass-session-management-flaw-----', 'cors-misconfiguration-cross-origin-data-leakage---', 'command-injection-os-command-execution-exploit----', 'deserialization-vulnerability-object-injection----', 'jwt-vulnerability-token-forgery-authentication----', 'open-redirect-url-redirection-phishing-attack-----', 'path-traversal-arbitrary-file-read-access-vuln----', ] severities = ['critical', 'high', 'medium', 'low', 'info'] sources = [ 'nuclei-vulnerability-scanner--', 'dalfox-xss-parameter-analysis-', 'sqlmap-sql-injection-testing--', 'burp-suite-professional-scan--', 'owasp-zap-security-scanner----', 'nmap-network-service-scanner--', 'nikto-web-server-scanner------', ] count = 0 batch_data = [] for scan_id in scan_ids: # 为所有扫描创建快照 cur.execute(""" SELECT t.name FROM scan s JOIN target t ON s.target_id = t.id WHERE s.id = %s AND t.type = 'domain' """, (scan_id,)) row = cur.fetchone() if not row: continue target_name = row[0] for idx in range(random.randint(30, 60)): severity = random.choice(severities) cvss_ranges = { 'critical': (9.0, 10.0), 'high': (7.0, 8.9), 'medium': (4.0, 6.9), 'low': (0.1, 3.9), 'info': (0.0, 0.0) } cvss_range = cvss_ranges.get(severity, (0.0, 10.0)) cvss_score = round(random.uniform(*cvss_range), 1) # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'vuln-snap/{idx:04d}') # 生成固定 300 长度的描述 description = generate_fixed_length_text(length=300, text_type='description') batch_data.append(( scan_id, url, random.choice(vuln_types), severity, random.choice(sources), cvss_score, description, json.dumps({'template': f'CVE-2024-{random.randint(10000, 99999)}'}) )) count += 1 # 批量插入 if batch_data: execute_values(cur, """ INSERT INTO vulnerability_snapshot ( scan_id, url, vuln_type, severity, source, cvss_score, description, raw_output, created_at ) VALUES %s """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个漏洞快照\n") def create_ehole_fingerprints(self): """创建 EHole 指纹数据""" print("🔍 创建 EHole 指纹...") cur = self.conn.cursor() # CMS/产品名称模板(长名称) cms_templates = [ 'WordPress-Enterprise-Content-Management-System-Professional-Edition', 'Drupal-Open-Source-CMS-Platform-Community-Extended-Version', 'Joomla-Web-Content-Management-Framework-Business-Suite', 'Magento-E-Commerce-Platform-Enterprise-Cloud-Edition', 'Shopify-Online-Store-Builder-Professional-Business-Plan', 'PrestaShop-E-Commerce-Solution-Multi-Store-Edition', 'OpenCart-Shopping-Cart-System-Enterprise-Features', 'WooCommerce-WordPress-E-Commerce-Plugin-Extended', 'Laravel-PHP-Framework-Application-Boilerplate', 'Django-Python-Web-Framework-Admin-Dashboard', 'Spring-Boot-Java-Microservices-Framework-Starter', 'Express-Node-JS-Web-Application-Framework-API', 'Ruby-on-Rails-MVC-Framework-Application-Template', 'ASP-NET-Core-Microsoft-Web-Framework-Enterprise', 'Flask-Python-Micro-Framework-REST-API-Template', 'FastAPI-Python-Modern-Web-Framework-OpenAPI', 'Next-JS-React-Framework-Server-Side-Rendering', 'Nuxt-JS-Vue-Framework-Universal-Application', 'Angular-Universal-Server-Side-Rendering-Platform', 'Svelte-Kit-Web-Application-Framework-Compiler', 'Apache-Tomcat-Java-Servlet-Container-Server', 'Nginx-Web-Server-Reverse-Proxy-Load-Balancer', 'Microsoft-IIS-Internet-Information-Services-Server', 'Apache-HTTP-Server-Web-Server-Platform', 'Caddy-Web-Server-Automatic-HTTPS-Configuration', 'LiteSpeed-Web-Server-High-Performance-HTTP', 'Oracle-WebLogic-Server-Java-EE-Application', 'IBM-WebSphere-Application-Server-Enterprise', 'JBoss-EAP-Enterprise-Application-Platform-RedHat', 'GlassFish-Server-Open-Source-Java-EE-Reference', ] methods = ['keyword', 'faviconhash', 'regula'] locations = ['body', 'header', 'title', 'server', 'cookie', 'cert'] types = ['CMS', 'Framework', 'Server', 'Database', 'Cache', 'CDN', 'WAF', 'Load-Balancer', 'Container', 'Cloud'] # 关键词模板(多个长关键词) keyword_templates = [ ['wp-content/themes/', 'wp-includes/js/', 'wp-admin/css/', 'wordpress-hash-', 'wp-json/wp/v2/'], ['sites/all/modules/', 'misc/drupal.js', 'drupal-settings-json', 'X-Drupal-Cache', 'X-Generator: Drupal'], ['media/jui/js/', 'administrator/index.php', 'Joomla!', 'com_content', 'mod_custom'], ['skin/frontend/', 'Mage.Cookies', 'MAGENTO_CACHE', 'varien/js.js', 'mage/cookies.js'], ['cdn.shopify.com', 'Shopify.theme', 'shopify-section', 'shopify-payment-button', 'myshopify.com'], ['prestashop', 'PrestaShop', 'ps_versions_compliancy', 'prestashop-page', 'id_product'], ['catalog/view/theme/', 'index.php?route=', 'OpenCart', 'text_home', 'common/home'], ['woocommerce', 'WooCommerce', 'wc-ajax', 'woocommerce-page', 'add_to_cart_button'], ['laravel_session', 'XSRF-TOKEN', 'Laravel', 'laravel-livewire', 'laravel_token'], ['csrfmiddlewaretoken', 'django.contrib', 'Django', '__admin_media_prefix__', 'django-debug-toolbar'], ['X-Application-Context', 'spring-boot', 'Spring', 'actuator/health', 'spring-security'], ['X-Powered-By: Express', 'express-session', 'connect.sid', 'express.static', 'express-validator'], ['X-Powered-By: Phusion', 'Rails', 'csrf-token', 'action_controller', 'rails-ujs'], ['X-AspNet-Version', 'ASP.NET', '__VIEWSTATE', '__EVENTVALIDATION', 'aspnetcore-'], ['Werkzeug', 'Flask', 'flask-login', 'flask-wtf', 'flask-session'], ] count = 0 batch_data = [] for i in range(200): # 生成 200 条 EHole 指纹 cms = f'{random.choice(cms_templates)}-{random.randint(1000, 9999)}' method = random.choice(methods) location = random.choice(locations) keywords = random.choice(keyword_templates) + [f'custom-keyword-{random.randint(10000, 99999)}' for _ in range(random.randint(3, 8))] is_important = random.choice([True, False]) fp_type = random.choice(types) batch_data.append(( cms, method, location, json.dumps(keywords), is_important, fp_type )) count += 1 if batch_data: execute_values(cur, """ INSERT INTO ehole_fingerprint (cms, method, location, keyword, is_important, type, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个 EHole 指纹\n") def create_goby_fingerprints(self): """创建 Goby 指纹数据""" print("🔍 创建 Goby 指纹...") cur = self.conn.cursor() # 产品名称模板(长名称) name_templates = [ 'Apache-Tomcat-Java-Servlet-Container-Application-Server-Enterprise', 'Nginx-High-Performance-Web-Server-Reverse-Proxy-Load-Balancer', 'Microsoft-Exchange-Server-Email-Collaboration-Platform-Enterprise', 'VMware-vCenter-Server-Virtual-Infrastructure-Management-Platform', 'Cisco-Adaptive-Security-Appliance-Firewall-VPN-Concentrator', 'Fortinet-FortiGate-Next-Generation-Firewall-Security-Platform', 'Palo-Alto-Networks-Firewall-Threat-Prevention-Platform', 'F5-BIG-IP-Application-Delivery-Controller-Load-Balancer', 'Citrix-NetScaler-Application-Delivery-Controller-Gateway', 'Juniper-Networks-SRX-Series-Services-Gateway-Firewall', 'Oracle-WebLogic-Server-Java-Enterprise-Application-Platform', 'IBM-WebSphere-Application-Server-Java-EE-Enterprise-Edition', 'SAP-NetWeaver-Application-Server-Business-Suite-Platform', 'Adobe-Experience-Manager-Content-Management-System-Enterprise', 'Atlassian-Confluence-Team-Collaboration-Wiki-Platform-Server', 'Atlassian-Jira-Project-Issue-Tracking-Software-Server-Edition', 'GitLab-DevOps-Platform-Source-Code-Management-CI-CD-Pipeline', 'Jenkins-Automation-Server-Continuous-Integration-Deployment', 'SonarQube-Code-Quality-Security-Analysis-Platform-Enterprise', 'Elasticsearch-Distributed-Search-Analytics-Engine-Cluster', 'Kibana-Data-Visualization-Dashboard-Elasticsearch-Frontend', 'Grafana-Observability-Platform-Metrics-Logs-Traces-Dashboard', 'Prometheus-Monitoring-System-Time-Series-Database-Alerting', 'Zabbix-Enterprise-Monitoring-Solution-Network-Server-Cloud', 'Nagios-Infrastructure-Monitoring-Alerting-System-Enterprise', 'Redis-In-Memory-Data-Structure-Store-Cache-Message-Broker', 'MongoDB-Document-Database-NoSQL-Distributed-Cluster-Platform', 'PostgreSQL-Advanced-Open-Source-Relational-Database-System', 'MySQL-Enterprise-Relational-Database-Management-System-Server', 'Microsoft-SQL-Server-Relational-Database-Management-Platform', ] # 逻辑表达式模板 logic_templates = [ '(a&&b)||c', 'a||(b&&c)', '(a||b)&&(c||d)', 'a&&b&&c', 'a||b||c', '((a&&b)||c)&&d', '(a||(b&&c))&&(d||e)', 'a&&(b||c)&&d', '(a&&b&&c)||(d&&e)', '((a||b)&&c)||(d&&e&&f)', ] # 规则模板 rule_labels = ['body', 'header', 'title', 'server', 'cert', 'banner', 'protocol', 'port'] count = 0 batch_data = [] for i in range(200): # 生成 200 条 Goby 指纹 name = f'{random.choice(name_templates)}-{random.randint(1000, 9999)}' logic = random.choice(logic_templates) # 生成 5-15 条规则 num_rules = random.randint(5, 15) rules = [] for j in range(num_rules): rule = { 'label': random.choice(rule_labels), 'feature': f'feature-pattern-{random.randint(10000, 99999)}-{random.choice(["regex", "keyword", "hash"])}', 'is_equal': random.choice([True, False]) } rules.append(rule) batch_data.append((name, logic, json.dumps(rules))) count += 1 if batch_data: execute_values(cur, """ INSERT INTO goby_fingerprint (name, logic, rule, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个 Goby 指纹\n") def create_wappalyzer_fingerprints(self): """创建 Wappalyzer 指纹数据""" print("🔍 创建 Wappalyzer 指纹...") cur = self.conn.cursor() # 应用名称模板(长名称) name_templates = [ 'WordPress-Content-Management-System-Open-Source-Blogging-Platform', 'React-JavaScript-Library-User-Interface-Components-Facebook', 'Vue-JS-Progressive-JavaScript-Framework-Reactive-Components', 'Angular-Platform-Web-Application-Framework-Google-TypeScript', 'jQuery-JavaScript-Library-DOM-Manipulation-Event-Handling', 'Bootstrap-CSS-Framework-Responsive-Design-Mobile-First', 'Tailwind-CSS-Utility-First-Framework-Rapid-UI-Development', 'Node-JS-JavaScript-Runtime-Server-Side-V8-Engine-Platform', 'Express-JS-Web-Application-Framework-Node-JS-Middleware', 'Django-Python-Web-Framework-Batteries-Included-MTV-Pattern', 'Flask-Python-Micro-Framework-Lightweight-WSGI-Application', 'Ruby-on-Rails-MVC-Framework-Convention-Over-Configuration', 'Laravel-PHP-Framework-Elegant-Syntax-Expressive-Beautiful', 'Spring-Framework-Java-Enterprise-Application-Development', 'ASP-NET-Core-Cross-Platform-Web-Framework-Microsoft-Open', 'Nginx-Web-Server-Reverse-Proxy-Load-Balancer-HTTP-Cache', 'Apache-HTTP-Server-Web-Server-Cross-Platform-Open-Source', 'Cloudflare-CDN-DDoS-Protection-Web-Application-Firewall', 'Amazon-Web-Services-Cloud-Computing-Platform-Infrastructure', 'Google-Cloud-Platform-Cloud-Computing-Services-Infrastructure', 'Microsoft-Azure-Cloud-Computing-Service-Platform-Enterprise', 'Docker-Container-Platform-Application-Deployment-Orchestration', 'Kubernetes-Container-Orchestration-Platform-Cloud-Native', 'Elasticsearch-Search-Analytics-Engine-Distributed-RESTful', 'Redis-In-Memory-Data-Store-Cache-Message-Broker-Database', 'MongoDB-Document-Database-NoSQL-Scalable-High-Performance', 'PostgreSQL-Object-Relational-Database-System-Open-Source', 'MySQL-Relational-Database-Management-System-Oracle-Open', 'GraphQL-Query-Language-API-Runtime-Data-Fetching-Facebook', 'Webpack-Module-Bundler-JavaScript-Asset-Pipeline-Build-Tool', ] # 分类 ID cats_options = [ [1, 2, 3], [4, 5], [6, 7, 8, 9], [10, 11, 12], [13, 14, 15, 16], [17, 18], [19, 20, 21], [22, 23, 24, 25], [26, 27], [28, 29, 30], ] # 描述模板 descriptions = [ 'A powerful and flexible content management system designed for enterprise-level web applications with extensive plugin ecosystem and community support.', 'Modern JavaScript framework for building interactive user interfaces with component-based architecture and virtual DOM for optimal performance.', 'High-performance web server and reverse proxy with advanced load balancing, caching, and security features for production deployments.', 'Comprehensive cloud computing platform providing infrastructure as a service, platform as a service, and software as a service solutions.', 'Enterprise-grade database management system with ACID compliance, advanced security features, and horizontal scaling capabilities.', 'Container orchestration platform for automating deployment, scaling, and management of containerized applications across clusters.', 'Full-stack web application framework with built-in ORM, authentication, and admin interface for rapid development.', 'Lightweight and modular CSS framework with utility classes for building responsive and customizable user interfaces.', 'Real-time search and analytics engine with distributed architecture for handling large-scale data processing workloads.', 'In-memory data structure store supporting various data types with persistence options and pub/sub messaging capabilities.', ] count = 0 batch_data = [] for i in range(200): # 生成 200 条 Wappalyzer 指纹 name = f'{random.choice(name_templates)}-{random.randint(1000, 9999)}' cats = random.choice(cats_options) # 生成 cookies 规则 cookies = {} for j in range(random.randint(2, 5)): cookies[f'cookie_name_{j}'] = f'regex_pattern_{random.randint(1000, 9999)}' # 生成 headers 规则 headers = {} header_names = ['X-Powered-By', 'Server', 'X-Generator', 'X-Framework', 'X-Application'] for h in random.sample(header_names, random.randint(2, 4)): headers[h] = f'pattern_{random.randint(1000, 9999)}' # 生成 script_src 规则 script_src = [f'/js/lib/framework-{random.randint(100, 999)}.min.js' for _ in range(random.randint(3, 8))] # 生成 js 变量规则 js_vars = [f'window.Framework{random.randint(100, 999)}' for _ in range(random.randint(2, 6))] # 生成 implies 依赖 implies = [f'Dependency-{random.randint(100, 999)}' for _ in range(random.randint(1, 4))] # 生成 meta 规则 meta = {} meta_names = ['generator', 'framework', 'application-name', 'author', 'description'] for m in random.sample(meta_names, random.randint(2, 4)): meta[m] = f'meta_pattern_{random.randint(1000, 9999)}' # 生成 html 规则 html = [f'
    ' for _ in range(random.randint(3, 7))] description = random.choice(descriptions) website = f'https://www.example-framework-{random.randint(1000, 9999)}.com' cpe = f'cpe:/a:vendor:product:{random.randint(1, 10)}.{random.randint(0, 9)}.{random.randint(0, 9)}' batch_data.append(( name, json.dumps(cats), json.dumps(cookies), json.dumps(headers), json.dumps(script_src), json.dumps(js_vars), json.dumps(implies), json.dumps(meta), json.dumps(html), description, website, cpe )) count += 1 if batch_data: execute_values(cur, """ INSERT INTO wappalyzer_fingerprint ( name, cats, cookies, headers, script_src, js, implies, meta, html, description, website, cpe, created_at ) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())") print(f" ✓ 创建了 {count} 个 Wappalyzer 指纹\n") def create_fingers_fingerprints(self): """创建 Fingers 指纹数据""" print("🔍 创建 Fingers 指纹...") cur = self.conn.cursor() # 应用名称模板(长名称) name_templates = [ 'Apache-HTTP-Server-Web-Application-Platform-Open-Source-Software', 'Nginx-High-Performance-Web-Server-Reverse-Proxy-Load-Balancer', 'Microsoft-IIS-Internet-Information-Services-Windows-Web-Server', 'Tomcat-Java-Servlet-Container-Apache-Application-Server-Platform', 'WordPress-Content-Management-System-Blogging-Platform-PHP-MySQL', 'Drupal-CMS-Content-Management-Framework-PHP-Community-Platform', 'Joomla-Open-Source-CMS-Web-Content-Management-System-Framework', 'Laravel-PHP-Framework-Web-Application-Development-MVC-Pattern', 'Django-Python-Web-Framework-High-Level-MTV-Architecture-Pattern', 'Ruby-on-Rails-Web-Application-Framework-MVC-Convention-Configuration', 'Express-JS-Node-JS-Web-Application-Framework-Minimal-Flexible', 'Spring-Boot-Java-Framework-Microservices-Enterprise-Application', 'ASP-NET-Core-Cross-Platform-Web-Framework-Microsoft-Open-Source', 'React-JavaScript-Library-Building-User-Interfaces-Facebook-Meta', 'Vue-JS-Progressive-JavaScript-Framework-Web-Application-Development', 'Angular-TypeScript-Platform-Framework-Web-Applications-Google', 'jQuery-JavaScript-Library-DOM-Manipulation-Ajax-Event-Handling', 'Bootstrap-CSS-Framework-Responsive-Mobile-First-Web-Development', 'Tailwind-CSS-Utility-First-Framework-Rapid-UI-Development-Tool', 'Docker-Container-Platform-Application-Deployment-Virtualization', 'Kubernetes-Container-Orchestration-Platform-Cloud-Native-Apps', 'Redis-In-Memory-Data-Structure-Store-Database-Cache-Broker', 'MongoDB-Document-NoSQL-Database-Scalable-High-Performance', 'PostgreSQL-Relational-Database-Management-System-Open-Source', 'MySQL-Database-Management-System-Relational-Database-Oracle', 'Elasticsearch-Search-Analytics-Engine-Distributed-RESTful-API', 'RabbitMQ-Message-Broker-Advanced-Message-Queuing-Protocol', 'Jenkins-Automation-Server-Continuous-Integration-Deployment', 'GitLab-DevOps-Platform-Git-Repository-CI-CD-Pipeline-Management', 'Grafana-Observability-Platform-Metrics-Visualization-Dashboard', ] # 标签模板 tag_options = [ ['web-server', 'http', 'apache', 'linux'], ['web-server', 'reverse-proxy', 'nginx', 'high-performance'], ['web-server', 'windows', 'microsoft', 'iis'], ['cms', 'php', 'wordpress', 'blog', 'mysql'], ['cms', 'php', 'drupal', 'content-management'], ['framework', 'php', 'laravel', 'mvc', 'modern'], ['framework', 'python', 'django', 'full-stack'], ['framework', 'ruby', 'rails', 'mvc', 'convention'], ['framework', 'javascript', 'nodejs', 'express', 'backend'], ['framework', 'java', 'spring', 'enterprise', 'microservices'], ['framework', 'dotnet', 'aspnet', 'microsoft', 'cross-platform'], ['library', 'javascript', 'react', 'frontend', 'ui'], ['framework', 'javascript', 'vue', 'progressive', 'reactive'], ['framework', 'typescript', 'angular', 'google', 'spa'], ['database', 'nosql', 'mongodb', 'document', 'json'], ['database', 'relational', 'postgresql', 'sql', 'open-source'], ['database', 'relational', 'mysql', 'sql', 'oracle'], ['cache', 'database', 'redis', 'in-memory', 'key-value'], ['search', 'analytics', 'elasticsearch', 'distributed', 'restful'], ['container', 'docker', 'virtualization', 'deployment'], ] # 规则模板 rule_templates = [ # favicon hash 规则 [{'method': 'faviconhash', 'favicon': f'-{random.randint(1000000000, 9999999999)}'}], # keyword 规则 [{'method': 'keyword', 'keyword': ['X-Powered-By', 'Server', 'X-Generator']}], # 混合规则 [ {'method': 'keyword', 'keyword': ['content="WordPress', 'wp-content/', 'wp-includes/']}, {'method': 'faviconhash', 'favicon': f'-{random.randint(1000000000, 9999999999)}'} ], # header 规则 [{'method': 'keyword', 'keyword': ['Server: nginx', 'X-Powered-By: PHP']}], # body 规则 [{'method': 'keyword', 'keyword': [' list: """创建 1000 个扫描目标""" print("🎯 创建扫描目标 (1,000 个)...") cur = self.conn.cursor() suffix = random.randint(1000, 9999) domains = [ 'example', 'test', 'demo', 'staging', 'production', 'api', 'app', 'web', 'portal', 'admin', 'dashboard', 'service', 'platform', 'cloud', 'data', 'analytics', 'security', 'enterprise', 'global', 'internal', 'external' ] tlds = ['.com', '.io', '.net', '.org', '.dev', '.app', '.cloud', '.tech'] ids = [] for i in range(1000): domain = f'{random.choice(domains)}-{suffix}-{i:04d}{random.choice(tlds)}' cur.execute(""" INSERT INTO target (name, type, created_at, deleted_at) VALUES (%s, 'domain', NOW() - INTERVAL '%s days', NULL) ON CONFLICT DO NOTHING RETURNING id """, (domain, random.randint(0, 365))) row = cur.fetchone() if row: ids.append(row[0]) print(f" ✓ 创建了 {len(ids)} 个扫描目标\n") return ids def create_subdomains(self, target_ids: list): """创建 200,000 个子域名""" print("🌐 创建子域名 (200,000 个)...") cur = self.conn.cursor() prefixes = [ 'api', 'admin', 'portal', 'dashboard', 'app', 'mobile', 'staging', 'dev', 'test', 'qa', 'uat', 'beta', 'alpha', 'demo', 'sandbox', 'internal', 'secure', 'auth', 'login', 'sso', 'oauth', 'identity', 'accounts', 'mail', 'smtp', 'imap', 'webmail', 'ftp', 'sftp', 'files', 'storage', 'cdn', 'static', 'assets', 'media', 'db', 'database', 'mysql', 'postgres', 'redis', 'mongo', 'elastic', 'vpn', 'remote', 'gateway', 'proxy', 'monitoring', 'metrics', 'grafana', 'prometheus', 'kibana', 'logs', 'jenkins', 'ci', 'cd', 'gitlab', 'jira', 'confluence', 'kubernetes', 'k8s', 'www', 'www2', 'www3', 'ns1', 'ns2', 'mx', 'mx1', 'mx2', 'autodiscover', ] secondary = ['', 'prod-', 'dev-', 'staging-', 'test-', 'us-', 'eu-', 'ap-'] cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] batch_size = 50000 # 增加批量大小 target_count = 200000 per_target = target_count // len(domain_targets) + 1 for target_id, target_name in domain_targets: for i in range(per_target): if count >= target_count: break prefix = random.choice(prefixes) sec = random.choice(secondary) subdomain_name = f'{sec}{prefix}-{i:04d}.{target_name}' batch_data.append((subdomain_name, target_id, random.randint(0, 90))) count += 1 if len(batch_data) >= batch_size: execute_values(cur, """ INSERT INTO subdomain (name, target_id, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, NOW() - INTERVAL '%s days')") self.conn.commit() # 每批次提交 batch_data = [] print(f" ✓ {count:,} / {target_count:,}") if count >= target_count: break if batch_data: execute_values(cur, """ INSERT INTO subdomain (name, target_id, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, NOW() - INTERVAL '%s days')") self.conn.commit() print(f" ✓ 创建了 {count:,} 个子域名\n") def create_websites(self, target_ids: list): """创建 200,000 个网站""" print("🌍 创建网站 (200,000 个)...") cur = self.conn.cursor() cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] batch_size = 50000 # 增加批量大小 target_count = 200000 per_target = target_count // len(domain_targets) + 1 for target_id, target_name in domain_targets: for i in range(per_target): if count >= target_count: break # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'million-website/{i:06d}') batch_data.append(( url, target_id, target_name, f'Website Title {count}', 'nginx/1.24.0', ['React', 'Node.js'], random.choice([200, 301, 403]), random.randint(1000, 50000), 'text/html', '', '' )) count += 1 if len(batch_data) >= batch_size: execute_values(cur, """ INSERT INTO website (url, target_id, host, title, webserver, tech, status_code, content_length, content_type, location, response_body, vhost, response_headers, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NULL, '', NOW())") self.conn.commit() batch_data = [] print(f" ✓ {count:,} / {target_count:,}") if count >= target_count: break if batch_data: execute_values(cur, """ INSERT INTO website (url, target_id, host, title, webserver, tech, status_code, content_length, content_type, location, response_body, vhost, response_headers, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NULL, '', NOW())") self.conn.commit() print(f" ✓ 创建了 {count:,} 个网站\n") def create_endpoints(self, target_ids: list): """创建 200,000 个端点""" print("🔗 创建端点 (200,000 个)...") cur = self.conn.cursor() paths = ['/api/v1/', '/api/v2/', '/admin/', '/portal/', '/graphql/', '/health/', '/metrics/'] # 100字符长度的标题 titles = [ 'Enterprise API Gateway - RESTful Service Documentation with OpenAPI 3.0 Specification and Interactive', 'User Authentication Service - OAuth 2.0 and SAML 2.0 Single Sign-On Integration Platform Dashboard', 'Payment Processing Gateway - PCI-DSS Compliant Transaction Management System Administration Panel', 'Content Delivery Network - Global Edge Cache Management and Real-time Analytics Dashboard Interface', 'Database Administration Console - PostgreSQL Cluster Management with Automated Backup and Recovery', ] # 扩展的技术栈列表 all_techs = [ 'React 18.2.0', 'Vue.js 3.4', 'Angular 17.1', 'Next.js 14.0', 'Node.js 20.10', 'Express 4.18', 'Python 3.12', 'Django 5.0', 'FastAPI 0.109', 'Go 1.21', 'PostgreSQL 16.1', 'MySQL 8.2', 'MongoDB 7.0', 'Redis 7.2', 'Elasticsearch 8.11', 'Kubernetes 1.28', 'Docker 24.0', 'Nginx 1.25', 'GraphQL 16.8', 'JWT', ] # 扩展的 tags all_tags = [ 'debug', 'config', 'api', 'json', 'upload', 'file', 'admin', 'auth', 'secrets', 'credentials', 'backup', 'archive', 'trace', 'log', 'error', 'security', 'vulnerability', 'payment', 'user', 'internal', 'private', ] cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] batch_size = 50000 # 增加批量大小 target_count = 200000 per_target = target_count // len(domain_targets) + 1 for target_id, target_name in domain_targets: for i in range(per_target): if count >= target_count: break # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'million-endpoint/{i:06d}') # 生成 100 字符的标题 title = random.choice(titles) # 生成 10-20 个技术 num_techs = random.randint(10, 20) tech_list = random.sample(all_techs, min(num_techs, len(all_techs))) # 生成 10-20 个 tags num_tags = random.randint(10, 20) tags = random.sample(all_tags, min(num_tags, len(all_tags))) batch_data.append(( url, target_id, target_name, title, 'nginx/1.24.0', random.choice([200, 201, 401, 403]), random.randint(100, 5000), 'application/json', tech_list, '', '{"status":"ok"}', None, tags )) count += 1 if len(batch_data) >= batch_size: execute_values(cur, """ INSERT INTO endpoint (url, target_id, host, title, webserver, status_code, content_length, content_type, tech, location, response_body, vhost, matched_gf_patterns, response_headers, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, '', NOW())") self.conn.commit() batch_data = [] print(f" ✓ {count:,} / {target_count:,}") if count >= target_count: break if batch_data: execute_values(cur, """ INSERT INTO endpoint (url, target_id, host, title, webserver, status_code, content_length, content_type, tech, location, response_body, vhost, matched_gf_patterns, response_headers, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, '', NOW())") self.conn.commit() print(f" ✓ 创建了 {count:,} 个端点\n") def create_host_port_mappings(self, target_ids: list): """创建 200,000 个主机端口映射(用于 IP 统计)""" print("🔌 创建主机端口映射 (200,000 个)...") cur = self.conn.cursor() ports = [22, 80, 443, 3306, 5432, 6379, 8080, 8443, 9000, 9200, 27017] cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] batch_size = 50000 # 增加批量大小 target_count = 200000 per_target = target_count // len(domain_targets) + 1 for target_id, target_name in domain_targets: for i in range(per_target): if count >= target_count: break ip = f'192.168.{random.randint(1, 254)}.{random.randint(1, 254)}' port = random.choice(ports) batch_data.append((target_id, target_name, ip, port)) count += 1 if len(batch_data) >= batch_size: execute_values(cur, """ INSERT INTO host_port_mapping (target_id, host, ip, port, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, NOW())") self.conn.commit() batch_data = [] print(f" ✓ {count:,} / {target_count:,}") if count >= target_count: break if batch_data: execute_values(cur, """ INSERT INTO host_port_mapping (target_id, host, ip, port, created_at) VALUES %s ON CONFLICT DO NOTHING """, batch_data, template="(%s, %s, %s, %s, NOW())") self.conn.commit() print(f" ✓ 创建了 {count:,} 个主机端口映射\n") def create_vulnerabilities(self, target_ids: list): """创建 200,000 个漏洞 (critical: 50k, high: 50k, medium: 50k, low: 30k, info: 20k)""" print("🐛 创建漏洞 (200,000 个)...") cur = self.conn.cursor() vuln_types = [ 'sql-injection-authentication-bypass-vulnerability-', 'cross-site-scripting-xss-stored-persistent-attack-', 'server-side-request-forgery-ssrf-internal-access--', 'remote-code-execution-rce-command-injection-flaw--', 'local-file-inclusion-lfi-path-traversal-exploit---', 'xml-external-entity-xxe-injection-vulnerability---', 'cross-site-request-forgery-csrf-token-validation--', 'insecure-direct-object-reference-idor-access-ctrl-', ] sources = [ 'nuclei-vulnerability-scanner--', 'dalfox-xss-parameter-analysis-', 'sqlmap-sql-injection-testing--', 'burp-suite-professional-scan--', 'owasp-zap-security-scanner----', ] # 按严重程度分配数量 severity_counts = { 'critical': 50000, 'high': 50000, 'medium': 50000, 'low': 30000, 'info': 20000, } cur.execute("SELECT id, name FROM target WHERE type = 'domain' AND deleted_at IS NULL") domain_targets = cur.fetchall() count = 0 batch_data = [] batch_size = 50000 # 增加批量大小 for severity, target_count in severity_counts.items(): print(f" 创建 {severity} 级别漏洞: {target_count:,} 个") cvss_ranges = { 'critical': (9.0, 10.0), 'high': (7.0, 8.9), 'medium': (4.0, 6.9), 'low': (0.1, 3.9), 'info': (0.0, 0.0) } cvss_range = cvss_ranges.get(severity, (0.0, 10.0)) severity_count = 0 per_target = target_count // len(domain_targets) + 1 for target_id, target_name in domain_targets: for i in range(per_target): if severity_count >= target_count: break cvss_score = round(random.uniform(*cvss_range), 1) # 生成固定 245 长度的 URL url = generate_fixed_length_url(target_name, length=245, path_hint=f'million-vuln/{severity_count:06d}') # 生成固定 300 长度的描述 description = generate_fixed_length_text(length=300, text_type='description') batch_data.append(( target_id, url, random.choice(vuln_types), severity, random.choice(sources), cvss_score, description, json.dumps({'template': f'CVE-2024-{random.randint(10000, 99999)}'}) )) severity_count += 1 count += 1 if len(batch_data) >= batch_size: execute_values(cur, """ INSERT INTO vulnerability (target_id, url, vuln_type, severity, source, cvss_score, description, raw_output, created_at) VALUES %s """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") self.conn.commit() batch_data = [] print(f" ✓ {severity_count:,} / {target_count:,}") if severity_count >= target_count: break if batch_data: execute_values(cur, """ INSERT INTO vulnerability (target_id, url, vuln_type, severity, source, cvss_score, description, raw_output, created_at) VALUES %s """, batch_data, template="(%s, %s, %s, %s, %s, %s, %s, %s, NOW())") self.conn.commit() print(f" ✓ 创建了 {count:,} 个漏洞\n") def create_statistics_history(self): """创建 7 天的统计历史数据(用于趋势图)""" print("📈 创建统计历史数据 (7 天)...") cur = self.conn.cursor() # 先清除旧的历史数据 cur.execute("DELETE FROM statistics_history") # 生成 7 天的历史数据,数值逐渐增长 base_values = { 'total_targets': 800, 'total_subdomains': 150000, 'total_ips': 150000, 'total_endpoints': 150000, 'total_websites': 150000, 'total_vulns': 150000, } for i in range(7): date = datetime.now().date() - timedelta(days=6-i) growth_factor = 1 + (i * 0.05) # 每天增长 5% total_targets = int(base_values['total_targets'] * growth_factor) total_subdomains = int(base_values['total_subdomains'] * growth_factor) total_ips = int(base_values['total_ips'] * growth_factor) total_endpoints = int(base_values['total_endpoints'] * growth_factor) total_websites = int(base_values['total_websites'] * growth_factor) total_vulns = int(base_values['total_vulns'] * growth_factor) total_assets = total_subdomains + total_ips + total_endpoints + total_websites cur.execute(""" INSERT INTO statistics_history ( date, total_targets, total_subdomains, total_ips, total_endpoints, total_websites, total_vulns, total_assets, created_at, updated_at ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW()) ON CONFLICT (date) DO UPDATE SET total_targets = EXCLUDED.total_targets, total_subdomains = EXCLUDED.total_subdomains, total_ips = EXCLUDED.total_ips, total_endpoints = EXCLUDED.total_endpoints, total_websites = EXCLUDED.total_websites, total_vulns = EXCLUDED.total_vulns, total_assets = EXCLUDED.total_assets, updated_at = NOW() """, (date, total_targets, total_subdomains, total_ips, total_endpoints, total_websites, total_vulns, total_assets)) print(f" ✓ 创建了 7 天的统计历史数据\n") def update_asset_statistics(self): """更新资产统计表(Dashboard 卡片使用)""" print("📊 更新资产统计表...") cur = self.conn.cursor() # 统计实际数据 cur.execute("SELECT COUNT(*) FROM target WHERE deleted_at IS NULL") total_targets = cur.fetchone()[0] cur.execute("SELECT COUNT(*) FROM subdomain") total_subdomains = cur.fetchone()[0] cur.execute("SELECT COUNT(DISTINCT ip) FROM host_port_mapping") total_ips = cur.fetchone()[0] cur.execute("SELECT COUNT(*) FROM endpoint") total_endpoints = cur.fetchone()[0] cur.execute("SELECT COUNT(*) FROM website") total_websites = cur.fetchone()[0] cur.execute("SELECT COUNT(*) FROM vulnerability") total_vulns = cur.fetchone()[0] total_assets = total_subdomains + total_ips + total_endpoints + total_websites # 更新或插入统计数据 cur.execute(""" INSERT INTO asset_statistics ( id, total_targets, total_subdomains, total_ips, total_endpoints, total_websites, total_vulns, total_assets, prev_targets, prev_subdomains, prev_ips, prev_endpoints, prev_websites, prev_vulns, prev_assets, updated_at ) VALUES ( 1, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW() ) ON CONFLICT (id) DO UPDATE SET total_targets = EXCLUDED.total_targets, total_subdomains = EXCLUDED.total_subdomains, total_ips = EXCLUDED.total_ips, total_endpoints = EXCLUDED.total_endpoints, total_websites = EXCLUDED.total_websites, total_vulns = EXCLUDED.total_vulns, total_assets = EXCLUDED.total_assets, prev_targets = asset_statistics.total_targets, prev_subdomains = asset_statistics.total_subdomains, prev_ips = asset_statistics.total_ips, prev_endpoints = asset_statistics.total_endpoints, prev_websites = asset_statistics.total_websites, prev_vulns = asset_statistics.total_vulns, prev_assets = asset_statistics.total_assets, updated_at = NOW() """, (total_targets, total_subdomains, total_ips, total_endpoints, total_websites, total_vulns, total_assets, int(total_targets * 0.9), int(total_subdomains * 0.9), int(total_ips * 0.9), int(total_endpoints * 0.9), int(total_websites * 0.9), int(total_vulns * 0.9), int(total_assets * 0.9))) print(f" ✓ 统计数据已更新:") print(f" - 目标: {total_targets:,}") print(f" - 子域名: {total_subdomains:,}") print(f" - IP: {total_ips:,}") print(f" - 端点: {total_endpoints:,}") print(f" - 网站: {total_websites:,}") print(f" - 漏洞: {total_vulns:,}") print(f" - 总资产: {total_assets:,}\n") def main(): parser = argparse.ArgumentParser(description="直接通过 SQL 生成测试数据") parser.add_argument('--clear', action='store_true', help='清除现有数据后重新生成') parser.add_argument('--million', action='store_true', help='生成百万级数据(用于 Dashboard 溢出测试)') args = parser.parse_args() if args.million: generator = MillionDataGenerator(clear=args.clear) else: generator = TestDataGenerator(clear=args.clear) generator.run() if __name__ == "__main__": main() ================================================ FILE: backend/scripts/performance/monitor_pg_performance.sh ================================================ #!/bin/bash # PostgreSQL 性能监控脚本 # 用法:./monitor_pg_performance.sh [数据库名] [间隔秒数] # 尝试从 .env 加载数据库配置 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" if [ -f "$PROJECT_DIR/.env" ]; then export PGHOST=$(grep "^DB_HOST=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGPORT=$(grep "^DB_PORT=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGUSER=$(grep "^DB_USER=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGPASSWORD=$(grep "^DB_PASSWORD=" "$PROJECT_DIR/.env" | cut -d '=' -f2) PGDATABASE=$(grep "^DB_NAME=" "$PROJECT_DIR/.env" | cut -d '=' -f2) fi DB_NAME=${1:-${PGDATABASE:-xingrin}} INTERVAL=${2:-2} echo "========================================" echo " PostgreSQL 性能监控" echo "========================================" echo "数据库: $DB_NAME" echo "刷新间隔: ${INTERVAL}秒" echo "按 Ctrl+C 停止监控" echo "========================================" echo "" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color while true; do clear echo -e "${BLUE}========================================" echo " PostgreSQL 实时性能监控" echo "========================================${NC}" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 1. 数据库连接数 echo -e "${GREEN}[1] 连接数统计${NC}" psql -d $DB_NAME -c " SELECT count(*) as total_connections, count(*) FILTER (WHERE state = 'active') as active, count(*) FILTER (WHERE state = 'idle') as idle, count(*) FILTER (WHERE state = 'idle in transaction') as idle_in_transaction FROM pg_stat_activity WHERE datname = '$DB_NAME'; " -t # 2. 当前活跃查询 echo -e "${GREEN}[2] 活跃查询 (Top 5)${NC}" psql -d $DB_NAME -c " SELECT pid, usename, application_name, state, EXTRACT(EPOCH FROM (now() - query_start))::int as duration_sec, LEFT(query, 60) as query_preview FROM pg_stat_activity WHERE datname = '$DB_NAME' AND state != 'idle' AND query NOT LIKE '%pg_stat_activity%' ORDER BY query_start LIMIT 5; " # 3. 表级统计(插入速度) echo -e "${GREEN}[3] 表插入统计${NC}" psql -d $DB_NAME -c " SELECT schemaname || '.' || relname as table_name, n_tup_ins as inserts, n_tup_upd as updates, n_tup_del as deletes, n_live_tup as live_rows FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY n_tup_ins DESC; " # 4. 锁等待 echo -e "${GREEN}[4] 锁等待情况${NC}" psql -d $DB_NAME -c " SELECT COUNT(*) as waiting_queries FROM pg_stat_activity WHERE wait_event_type = 'Lock' AND datname = '$DB_NAME'; " -t # 5. 数据库大小 echo -e "${GREEN}[5] 数据库大小${NC}" psql -d $DB_NAME -c " SELECT pg_size_pretty(pg_database_size('$DB_NAME')) as database_size; " -t # 6. 缓存命中率 echo -e "${GREEN}[6] 缓存命中率${NC}" psql -d $DB_NAME -c " SELECT sum(heap_blks_hit) / nullif(sum(heap_blks_hit) + sum(heap_blks_read), 0) * 100 as cache_hit_ratio FROM pg_statio_user_tables; " -t # 7. IO 统计 echo -e "${GREEN}[7] 磁盘 IO 统计${NC}" psql -d $DB_NAME -c " SELECT sum(heap_blks_read) as blocks_read, sum(heap_blks_hit) as blocks_hit, sum(idx_blks_read) as idx_blocks_read, sum(idx_blks_hit) as idx_blocks_hit FROM pg_statio_user_tables; " -t # 8. 长时间运行的事务 echo -e "${YELLOW}[8] 长时间运行事务 (>30秒)${NC}" psql -d $DB_NAME -c " SELECT pid, usename, EXTRACT(EPOCH FROM (now() - xact_start))::int as transaction_duration_sec, state, LEFT(query, 50) as query_preview FROM pg_stat_activity WHERE datname = '$DB_NAME' AND state != 'idle' AND xact_start IS NOT NULL AND EXTRACT(EPOCH FROM (now() - xact_start)) > 30 ORDER BY xact_start; " echo "" echo -e "${BLUE}下次刷新: ${INTERVAL}秒后...${NC}" sleep $INTERVAL done ================================================ FILE: backend/scripts/performance/pg_stats_after_test.sql ================================================ -- 测试后记录对比数据 -- 用法:psql -d xingrin -f pg_stats_after_test.sql > stats_after.txt \echo '========================================' \echo ' PostgreSQL 测试后统计数据' \echo '========================================' \echo '' \echo '当前时间:' SELECT now(); \echo '' \echo '表记录数(测试后):' SELECT schemaname || '.' || relname as table_name, n_live_tup as row_count, n_dead_tup as dead_rows, pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname)) as total_size, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory', 'scan') ORDER BY n_live_tup DESC; \echo '' \echo '表膨胀检查:' SELECT schemaname || '.' || relname as table_name, pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname)) as total_size, n_live_tup as live_rows, n_dead_tup as dead_rows, CASE WHEN n_live_tup = 0 THEN 0 ELSE round((n_dead_tup::numeric / n_live_tup) * 100, 2) END as dead_ratio_percent FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY n_dead_tup DESC; \echo '' \echo '索引使用情况:' SELECT schemaname || '.' || relname as table_name, indexname, idx_scan as index_scans, idx_tup_read as rows_read, idx_tup_fetch as rows_fetched, pg_size_pretty(pg_relation_size(indexname::regclass)) as index_size FROM pg_stat_user_indexes WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY idx_scan DESC; \echo '' \echo '表统计增量(本次测试产生):' SELECT schemaname || '.' || relname as table_name, n_tup_ins as total_inserts, n_tup_upd as total_updates, n_tup_del as total_deletes, n_tup_hot_upd as hot_updates FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY n_tup_ins DESC; \echo '' \echo '缓存命中率(测试后):' SELECT sum(heap_blks_hit) as heap_blocks_hit, sum(heap_blks_read) as heap_blocks_read, CASE WHEN sum(heap_blks_hit) + sum(heap_blks_read) = 0 THEN 0 ELSE round((sum(heap_blks_hit)::numeric / (sum(heap_blks_hit) + sum(heap_blks_read))) * 100, 2) END as cache_hit_ratio_percent FROM pg_statio_user_tables WHERE schemaname = 'public'; \echo '' \echo 'IO 统计:' SELECT sum(heap_blks_read) as heap_blocks_read_from_disk, sum(heap_blks_hit) as heap_blocks_hit_in_cache, sum(idx_blks_read) as index_blocks_read_from_disk, sum(idx_blks_hit) as index_blocks_hit_in_cache FROM pg_statio_user_tables WHERE schemaname = 'public'; \echo '' \echo '长时间运行查询:' SELECT pid, usename, application_name, state, EXTRACT(EPOCH FROM (now() - query_start))::int as duration_seconds, query FROM pg_stat_activity WHERE datname = current_database() AND state != 'idle' AND query NOT LIKE '%pg_stat_activity%' ORDER BY query_start; \echo '' \echo '数据库总大小:' SELECT pg_size_pretty(pg_database_size(current_database())) as database_size; \echo '' \echo '========================================' ================================================ FILE: backend/scripts/performance/pg_stats_before_test.sql ================================================ -- 测试前记录基准数据 -- 用法:psql -d xingrin -f pg_stats_before_test.sql > stats_before.txt \echo '========================================' \echo ' PostgreSQL 测试前基准数据' \echo '========================================' \echo '' \echo '当前时间:' SELECT now(); \echo '' \echo '数据库连接配置:' SHOW max_connections; SHOW shared_buffers; SHOW work_mem; SHOW maintenance_work_mem; \echo '' \echo '表记录数(测试前):' SELECT schemaname || '.' || relname as table_name, n_live_tup as row_count, pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname)) as total_size FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory', 'scan') ORDER BY n_live_tup DESC; \echo '' \echo '索引信息:' SELECT schemaname || '.' || tablename as table_name, indexname, pg_size_pretty(pg_relation_size(indexname::regclass)) as index_size FROM pg_indexes WHERE schemaname = 'public' AND tablename IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY tablename, indexname; \echo '' \echo '当前活跃连接数:' SELECT count(*) as total, count(*) FILTER (WHERE state = 'active') as active, count(*) FILTER (WHERE state = 'idle') as idle FROM pg_stat_activity WHERE datname = current_database(); \echo '' \echo '表统计信息(累计):' SELECT schemaname || '.' || relname as table_name, seq_scan as sequential_scans, seq_tup_read as seq_rows_read, idx_scan as index_scans, idx_tup_fetch as idx_rows_fetched, n_tup_ins as inserts, n_tup_upd as updates, n_tup_del as deletes FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname IN ('subdomain', 'ip_address', 'port', 'website', 'endpoint', 'directory') ORDER BY relname; \echo '' \echo '缓存命中率:' SELECT sum(heap_blks_hit) as heap_blocks_hit, sum(heap_blks_read) as heap_blocks_read, CASE WHEN sum(heap_blks_hit) + sum(heap_blks_read) = 0 THEN 0 ELSE round((sum(heap_blks_hit)::numeric / (sum(heap_blks_hit) + sum(heap_blks_read))) * 100, 2) END as cache_hit_ratio_percent FROM pg_statio_user_tables WHERE schemaname = 'public'; \echo '' \echo '========================================' ================================================ FILE: backend/scripts/performance/start_performance_test.sh ================================================ #!/bin/bash # 性能测试快速启动脚本 # 用法:./start_performance_test.sh set -e SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" echo "========================================" echo " PostgreSQL 性能测试工具" echo "========================================" echo "" # 加载 .env 文件中的数据库配置 if [ -f "$PROJECT_DIR/.env" ]; then echo "加载数据库配置..." export PGHOST=$(grep "^DB_HOST=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGPORT=$(grep "^DB_PORT=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGUSER=$(grep "^DB_USER=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGPASSWORD=$(grep "^DB_PASSWORD=" "$PROJECT_DIR/.env" | cut -d '=' -f2) export PGDATABASE=$(grep "^DB_NAME=" "$PROJECT_DIR/.env" | cut -d '=' -f2) echo " 主机: $PGHOST:$PGPORT" echo " 用户: $PGUSER" echo " 数据库: $PGDATABASE" else echo "[WARN] 未找到 .env 文件" fi echo "" # 检查 PostgreSQL 连接 echo "检查数据库连接..." cd "$PROJECT_DIR" if ! source "$PROJECT_DIR/../.venv/bin/activate" && python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from django.db import connection try: with connection.cursor() as cursor: cursor.execute('SELECT 1') print('✓ 数据库连接正常') except Exception as e: print(f'[ERROR] 数据库连接失败: {e}') exit(1) " > /dev/null 2>&1; then echo "[ERROR] 无法连接到数据库 $PGDATABASE" echo "" echo "请检查:" echo " 1. VPS 防火墙是否开放 5432 端口" echo " 2. PostgreSQL 的 pg_hba.conf 是否允许远程连接" echo " 3. .env 文件中的数据库配置是否正确" echo " 4. Django 设置是否正确" echo "" echo "手动测试连接:" echo " cd $PROJECT_DIR && source $PROJECT_DIR/../.venv/bin/activate && python manage.py dbshell" exit 1 fi echo "✓ 数据库连接正常" echo "" # 菜单选择 echo "请选择操作:" echo " 1) 测试批次大小(推荐先执行)" echo " 2) 生成 1 万条测试数据" echo " 3) 生成 10 万条测试数据" echo " 4) 生成 100 万条测试数据" echo " 5) 启动实时监控(独立运行)" echo " 6) 查看测试前基准数据" echo " 7) 查看测试后统计数据" echo " 8) 完整测试流程(自动化)" echo " 0) 退出" echo "" read -p "请输入选项 (0-8): " choice case $choice in 1) echo "" echo "开始测试批次大小..." cd "$PROJECT_DIR" source "$PROJECT_DIR/../.venv/bin/activate" # 自动创建测试目标 echo "创建测试目标..." python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from apps.targets.models import Target, Organization # 创建默认组织 org, _ = Organization.objects.get_or_create( name='测试组织', defaults={'description': '性能测试专用组织'} ) # 创建测试目标 for i in range(1, 4): target_name = f'test{i}.com' target, created = Target.objects.get_or_create( name=target_name ) if created: # 将目标添加到组织 org.targets.add(target) print(f'✓ 创建目标: {target_name}') else: print(f'✓ 目标已存在: {target_name}') " echo "" python manage.py generate_test_data --target test1.com --count 10000 --test-batch-sizes ;; 2) echo "" echo "使用默认批次大小: 5000" echo "开始生成 1 万条数据..." cd "$PROJECT_DIR" source "$PROJECT_DIR/../.venv/bin/activate" # 自动创建测试目标 echo "创建测试目标..." python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from apps.targets.models import Target, Organization # 创建默认组织 org, _ = Organization.objects.get_or_create( name='测试组织', defaults={'description': '性能测试专用组织'} ) # 创建测试目标 for i in range(1, 4): target_name = f'test{i}.com' target, created = Target.objects.get_or_create( name=target_name ) if created: # 将目标添加到组织 org.targets.add(target) print(f'✓ 创建目标: {target_name}') else: print(f'✓ 目标已存在: {target_name}') " echo "" python manage.py generate_test_data \ --target test1.com \ --count 10000 \ --batch-size 5000 \ --benchmark ;; 3) echo "" echo "使用默认批次大小: 5000" echo "开始生成 10 万条数据..." cd "$PROJECT_DIR" source "$PROJECT_DIR/../.venv/bin/activate" # 自动创建测试目标 echo "创建测试目标..." python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from apps.targets.models import Target, Organization # 创建默认组织 org, _ = Organization.objects.get_or_create( name='测试组织', defaults={'description': '性能测试专用组织'} ) # 创建测试目标 for i in range(1, 4): target_name = f'test{i}.com' target, created = Target.objects.get_or_create( name=target_name ) if created: # 将目标添加到组织 org.targets.add(target) print(f'✓ 创建目标: {target_name}') else: print(f'✓ 目标已存在: {target_name}') " echo "" python manage.py generate_test_data \ --target test2.com \ --count 100000 \ --batch-size 5000 \ --benchmark ;; 4) echo "" echo "使用默认批次大小: 5000" echo "[WARN] 警告:这将生成 100 万条数据,可能需要 2-4 小时" read -p "确认继续? (y/N): " confirm if [[ $confirm == [yY] ]]; then echo "" echo "开始生成 100 万条数据..." cd "$PROJECT_DIR" source "$PROJECT_DIR/../.venv/bin/activate" # 自动创建测试目标 echo "创建测试目标..." python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from apps.targets.models import Target, Organization # 创建默认组织 org, _ = Organization.objects.get_or_create( name='测试组织', defaults={'description': '性能测试专用组织'} ) # 创建测试目标 for i in range(1, 4): target_name = f'test{i}.com' target, created = Target.objects.get_or_create( name=target_name ) if created: # 将目标添加到组织 org.targets.add(target) print(f'✓ 创建目标: {target_name}') else: print(f'✓ 目标已存在: {target_name}') " echo "" python manage.py generate_test_data \ --target test3.com \ --count 1000000 \ --batch-size 5000 \ --benchmark fi ;; 5) echo "" read -p "刷新间隔(秒,推荐 2-5): " interval interval=${interval:-2} echo "" echo "启动 PostgreSQL 实时监控..." echo "按 Ctrl+C 停止监控" sleep 2 "$SCRIPT_DIR/monitor_pg_performance.sh" xingrin "$interval" ;; 6) echo "" echo "记录测试前基准数据..." mkdir -p "$PROJECT_DIR/logs" psql -d "$PGDATABASE" -f "$SCRIPT_DIR/pg_stats_before_test.sql" > "$PROJECT_DIR/logs/stats_before.txt" echo "✓ 已保存到: $PROJECT_DIR/logs/stats_before.txt" echo "" read -p "是否查看内容? (y/N): " view if [[ $view == [yY] ]]; then less "$PROJECT_DIR/logs/stats_before.txt" fi ;; 7) echo "" echo "记录测试后统计数据..." mkdir -p "$PROJECT_DIR/logs" psql -d "$PGDATABASE" -f "$SCRIPT_DIR/pg_stats_after_test.sql" > "$PROJECT_DIR/logs/stats_after.txt" echo "✓ 已保存到: $PROJECT_DIR/logs/stats_after.txt" echo "" read -p "是否对比测试前后? (y/N): " compare if [[ $compare == [yY] ]] && [ -f "$PROJECT_DIR/logs/stats_before.txt" ]; then echo "" echo "差异对比:" diff "$PROJECT_DIR/logs/stats_before.txt" "$PROJECT_DIR/logs/stats_after.txt" || true fi ;; 8) echo "" echo "========================================" echo " 完整自动化测试流程" echo "========================================" echo "" echo "步骤 1:创建测试目标" cd "$PROJECT_DIR" source "$PROJECT_DIR/../.venv/bin/activate" python -c " import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from apps.targets.models import Target, Organization # 创建默认组织 org, _ = Organization.objects.get_or_create( name='测试组织', defaults={'description': '性能测试专用组织'} ) # 创建测试目标 for i in range(1, 4): target_name = f'test{i}.com' target, created = Target.objects.get_or_create( name=target_name ) if created: # 将目标添加到组织 org.targets.add(target) print(f'✓ 创建目标: {target_name}') else: print(f'✓ 目标已存在: {target_name}') " echo "✓ 完成" echo "" echo "步骤 2:记录测试前基准数据" mkdir -p "$PROJECT_DIR/logs" psql -d "$PGDATABASE" -f "$SCRIPT_DIR/pg_stats_before_test.sql" > "$PROJECT_DIR/logs/stats_before.txt" 2>&1 echo "✓ 完成" echo "" echo "步骤 3:测试批次大小" python manage.py generate_test_data --target test1.com --count 10000 --test-batch-sizes | tee "$PROJECT_DIR/logs/batch_size_test.txt" echo "" # 自动提取最优批次大小,如果没有找到则使用默认值5000 optimal_batch=$(grep "推荐批次大小:" "$PROJECT_DIR/logs/batch_size_test.txt" | awk '{print $2}' || echo "5000") optimal_batch=${optimal_batch:-5000} echo "✓ 自动选择最优批次: $optimal_batch" echo "" echo "步骤 4:生成 10 万条数据" python manage.py generate_test_data \ --target test3.com \ --count 100000 \ --batch-size "$optimal_batch" \ --benchmark | tee "$PROJECT_DIR/logs/test_results.txt" echo "" echo "步骤 5:记录测试后统计" psql -d "$PGDATABASE" -f "$SCRIPT_DIR/pg_stats_after_test.sql" > "$PROJECT_DIR/logs/stats_after.txt" 2>&1 echo "✓ 完成" echo "" # 生成性能报告 echo "步骤 6:生成性能报告" report_file="$PROJECT_DIR/logs/performance_report.txt" echo "========================================" > "$report_file" echo " XingRin 性能测试报告" >> "$report_file" echo "========================================" >> "$report_file" echo "" >> "$report_file" echo "测试时间: $(date '+%Y-%m-%d %H:%M:%S')" >> "$report_file" echo "数据库: $PGHOST:$PGPORT/$PGDATABASE" >> "$report_file" echo "最优批次: $optimal_batch" >> "$report_file" echo "" >> "$report_file" # 提取批次测试结果 echo "========================================" >> "$report_file" echo " 批次大小性能对比" >> "$report_file" echo "========================================" >> "$report_file" grep -A 10 "批次大小对比结果" "$PROJECT_DIR/logs/batch_size_test.txt" | tail -n +4 >> "$report_file" echo "" >> "$report_file" # 提取详细测试结果 echo "========================================" >> "$report_file" echo " 10万条数据生成性能" >> "$report_file" echo "========================================" >> "$report_file" grep "性能测试报告" -A 20 "$PROJECT_DIR/logs/test_results.txt" | tail -n +3 >> "$report_file" echo "" >> "$report_file" # 提取总耗时 total_time=$(grep "总耗时:" "$PROJECT_DIR/logs/test_results.txt" | head -1) echo "========================================" >> "$report_file" echo " 总体性能" >> "$report_file" echo "========================================" >> "$report_file" echo "$total_time" >> "$report_file" echo "" >> "$report_file" echo "========================================" >> "$report_file" echo " 测试文件" >> "$report_file" echo "========================================" >> "$report_file" echo "- 测试前基准: logs/stats_before.txt" >> "$report_file" echo "- 批次测试: logs/batch_size_test.txt" >> "$report_file" echo "- 性能结果: logs/test_results.txt" >> "$report_file" echo "- 测试后统计: logs/stats_after.txt" >> "$report_file" echo "- 性能报告: logs/performance_report.txt" >> "$report_file" echo "" >> "$report_file" echo "✓ 性能报告已生成" echo "" echo "========================================" echo " ✓ 自动化测试完成!" echo "========================================" echo "" # 显示性能报告 cat "$report_file" echo "" echo "详细报告已保存到: $report_file" echo "" ;; 0) echo "退出" exit 0 ;; *) echo "无效选项" exit 1 ;; esac echo "" echo "完成!" ================================================ FILE: backend/scripts/worker-deploy/agent.sh ================================================ #!/bin/bash # ============================================ # XingRin Agent # 用途:心跳上报 + 负载监控 + 版本检查 # 适用:远程 VPS 或 Docker 容器内 # ============================================ # 检查是否禁用 Agent if [ "${AGENT_DISABLED:-false}" = "true" ]; then echo "[AGENT] 已禁用,跳过启动" exit 0 fi # 配置 MARKER_DIR="/opt/xingrin" SRC_DIR="${MARKER_DIR}/src" ENV_FILE="${SRC_DIR}/backend/.env" INTERVAL=${AGENT_INTERVAL:-3} # Agent 版本(从环境变量获取,由 Docker 镜像构建时注入) AGENT_VERSION="${IMAGE_TAG:-unknown}" # 颜色定义 GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[0;33m' NC='\033[0m' log() { echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [AGENT] $1" } # 检测运行模式:容器内 or 远程 VPS # 如果 /.dockerenv 存在,说明在容器内 if [ -f "/.dockerenv" ]; then RUN_MODE="container" log "运行模式: Docker 容器内" else RUN_MODE="remote" log "运行模式: 远程 VPS" # 远程模式:检测 Docker 命令 if docker info >/dev/null 2>&1; then DOCKER_CMD="docker" else DOCKER_CMD="sudo docker" fi fi # 加载环境变量(远程模式从文件,容器模式从环境变量) if [ "$RUN_MODE" = "remote" ] && [ -f "$ENV_FILE" ]; then set -a source "$ENV_FILE" set +a fi # 获取配置 # SERVER_URL: 后端 API 地址(容器内用 http://server:8888,远程用 https://{PUBLIC_HOST}) API_URL="${HEARTBEAT_API_URL:-${SERVER_URL:-}}" WORKER_NAME="${WORKER_NAME:-}" IS_LOCAL="${IS_LOCAL:-false}" # 容器模式默认标记为本地节点 if [ "$RUN_MODE" = "container" ]; then IS_LOCAL="true" fi log "${GREEN}Agent 启动...${NC}" log "心跳间隔: ${INTERVAL}s" if [ -z "$API_URL" ]; then log "${RED}错误: 未配置 API 地址 (HEARTBEAT_API_URL 或 SERVER_URL)${NC}" exit 1 fi log "API 地址: ${API_URL}" # ============================================ # 自注册功能(如果 WORKER_ID 未设置) # ============================================ register_worker() { if [ -z "$WORKER_NAME" ]; then WORKER_NAME="Worker-$(hostname)" fi log "注册 Worker: ${WORKER_NAME}..." REGISTER_DATA=$(cat </dev/null) if [ $? -eq 0 ]; then # 解析返回的 workerId(API 使用 camelCase) WORKER_ID=$(echo "$RESPONSE" | grep -oE '"workerId":\s*[0-9]+' | grep -oE '[0-9]+') if [ -n "$WORKER_ID" ]; then log "${GREEN}注册成功: ${WORKER_NAME} (ID: ${WORKER_ID})${NC}" return 0 fi fi log "${RED}注册失败: ${RESPONSE}${NC}" return 1 } # 如果没有 WORKER_ID,执行自注册 if [ -z "$WORKER_ID" ]; then # 等待 Server 就绪 log "等待 Server 就绪..." for i in $(seq 1 30); do if curl -k -s -H "X-Worker-API-Key: ${WORKER_API_KEY}" "${API_URL}/api/workers/config/?is_local=${IS_LOCAL}" > /dev/null 2>&1; then log "${GREEN}Server 已就绪${NC}" break fi log "Server 未就绪,等待... ($i/30)" sleep 5 done # 注册 while ! register_worker; do log "${YELLOW}注册失败,5 秒后重试...${NC}" sleep 5 done fi log "Worker ID: ${WORKER_ID}" # ============================================ # 心跳循环 # Agent 独立运行,始终发送心跳 # 主服务器根据心跳数据选择负载最低的节点分发任务 # ============================================ while true; do # 收集系统负载(CPU + 内存) # 容器内使用挂载的 /host/proc 获取宿主机数据 if [ -d "/host/proc" ]; then PROC_DIR="/host/proc" else PROC_DIR="/proc" fi # CPU 使用率(百分比数值) # /proc/stat 是累计值,需要两次采样计算差值 CPU_STAT1=$(grep 'cpu ' ${PROC_DIR}/stat | awk '{print $2,$3,$4,$5,$6,$7,$8}') sleep 0.5 CPU_STAT2=$(grep 'cpu ' ${PROC_DIR}/stat | awk '{print $2,$3,$4,$5,$6,$7,$8}') CPU_PERCENT=$(echo "$CPU_STAT1 $CPU_STAT2" | awk '{ user1=$1; nice1=$2; sys1=$3; idle1=$4; iowait1=$5; irq1=$6; softirq1=$7; user2=$8; nice2=$9; sys2=$10; idle2=$11; iowait2=$12; irq2=$13; softirq2=$14; total1=user1+nice1+sys1+idle1+iowait1+irq1+softirq1; total2=user2+nice2+sys2+idle2+iowait2+irq2+softirq2; idle_diff=idle2-idle1; total_diff=total2-total1; if(total_diff>0) printf "%.1f", (1-idle_diff/total_diff)*100; else printf "0.0"; }') # 内存使用率(百分比数值) if [ -d "/host/proc" ]; then # 从 /host/proc/meminfo 读取 MEM_TOTAL=$(grep 'MemTotal' ${PROC_DIR}/meminfo | awk '{print $2}') MEM_AVAILABLE=$(grep 'MemAvailable' ${PROC_DIR}/meminfo | awk '{print $2}') MEM_PERCENT=$(awk "BEGIN {printf \"%.1f\", 100 - ($MEM_AVAILABLE / $MEM_TOTAL * 100)}") else # 使用 free 命令 MEM_PERCENT=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}') fi # 构建 JSON 数据(使用数值而非字符串,便于比较和排序) # 包含版本号,供 Server 端检查版本一致性 JSON_DATA=$(cat </dev/null || echo "000") RESPONSE_BODY=$(cat "$RESPONSE_FILE" 2>/dev/null) rm -f "$RESPONSE_FILE" if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "201" ]; then log "${YELLOW}心跳发送失败 (HTTP $HTTP_CODE)${NC}" else # 检查是否需要更新 NEED_UPDATE=$(echo "$RESPONSE_BODY" | grep -oE '"need_update":\s*(true|false)' | grep -oE '(true|false)') if [ "$NEED_UPDATE" = "true" ]; then SERVER_VERSION=$(echo "$RESPONSE_BODY" | grep -oE '"server_version":\s*"[^"]+"' | sed 's/.*"\([^"]*\)"$/\1/') log "${YELLOW}检测到版本不匹配: Agent=$AGENT_VERSION, Server=$SERVER_VERSION${NC}" log "${GREEN}正在自动更新...${NC}" # 执行自动更新 if [ "$RUN_MODE" = "container" ]; then # 容器模式:通知外部重启(退出后由 docker-compose restart policy 重启) log "容器模式:退出以触发重启更新" exit 0 else # 远程模式:拉取新镜像并重启 agent 容器 log "远程模式:更新 agent 镜像..." DOCKER_USER="${DOCKER_USER:-yyhuni}" NEW_IMAGE="${DOCKER_USER}/xingrin-agent:${SERVER_VERSION}" # 拉取新镜像 if $DOCKER_CMD pull "$NEW_IMAGE" 2>/dev/null; then log "${GREEN}镜像拉取成功: $NEW_IMAGE${NC}" # 停止当前容器并用新镜像重启 CONTAINER_NAME="xingrin-agent" $DOCKER_CMD stop "$CONTAINER_NAME" 2>/dev/null || true $DOCKER_CMD rm "$CONTAINER_NAME" 2>/dev/null || true # 重新启动(使用相同的环境变量) $DOCKER_CMD run -d \ --name "$CONTAINER_NAME" \ --restart unless-stopped \ -e HEARTBEAT_API_URL="$API_URL" \ -e WORKER_ID="$WORKER_ID" \ -e IMAGE_TAG="$SERVER_VERSION" \ -v /proc:/host/proc:ro \ "$NEW_IMAGE" log "${GREEN}Agent 已更新到 $SERVER_VERSION${NC}" exit 0 else log "${RED}镜像拉取失败: $NEW_IMAGE${NC}" fi fi fi fi # 休眠 sleep $INTERVAL done ================================================ FILE: backend/scripts/worker-deploy/bootstrap.sh ================================================ #!/bin/bash # ============================================ # XingRin 环境初始化脚本 (通用) # 用途:安装基础依赖(git, tmux, curl 等) # 支持:Ubuntu / Debian # 适用:主机 & Worker VPS # 特点:幂等执行,重复运行不会重复安装 # ============================================ set -e # 版本标记(修改此版本号会触发重新安装) BOOTSTRAP_VERSION="v1" MARKER_DIR="/opt/xingrin" MARKER_FILE="${MARKER_DIR}/.bootstrap_done_${BOOTSTRAP_VERSION}" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[XingRin]${NC} $1" } log_success() { echo -e "${GREEN}[XingRin]${NC} $1" } log_warn() { echo -e "${YELLOW}[XingRin]${NC} $1" } log_error() { echo -e "${RED}[XingRin]${NC} $1" } # 等待 apt 锁释放(最多等待 60 秒) wait_for_apt_lock() { local max_wait=60 local waited=0 while sudo fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || \ sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1 || \ sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do if [ $waited -eq 0 ]; then log_info "等待 apt 锁释放..." fi sleep 2 waited=$((waited + 2)) if [ $waited -ge $max_wait ]; then log_warn "等待 apt 锁超时,继续尝试..." break fi done } # 检查是否已完成初始化(返回 0 表示已完成,返回 1 表示需要初始化) check_already_done() { if [ -f "$MARKER_FILE" ]; then log_success "环境已初始化 (${BOOTSTRAP_VERSION}),跳过" return 0 # 不要 exit,让后续脚本继续执行 fi return 1 } # 检查操作系统 check_os() { if ! command -v apt-get &> /dev/null; then log_error "仅支持 Ubuntu/Debian 系统" exit 1 fi log_info "检测到 Ubuntu/Debian 系统" } # 安装基础依赖 install_dependencies() { log_info "安装基础依赖..." # 等待 apt 锁释放 wait_for_apt_lock # 更新包索引 sudo apt-get update -qq 2>/dev/null || true # 安装 git(必须) if ! command -v git &> /dev/null; then log_info " - 安装 git..." sudo apt-get install -y -qq git >/dev/null 2>&1 else log_info " - git 已安装" fi # 安装 tmux(会话持久化) if ! command -v tmux &> /dev/null; then log_info " - 安装 tmux..." sudo apt-get install -y -qq tmux >/dev/null 2>&1 else log_info " - tmux 已安装" fi # 安装 curl(网络请求) if ! command -v curl &> /dev/null; then log_info " - 安装 curl..." sudo apt-get install -y -qq curl >/dev/null 2>&1 else log_info " - curl 已安装" fi # 安装 jq(JSON 处理,可选) if ! command -v jq &> /dev/null; then log_info " - 安装 jq..." sudo apt-get install -y -qq jq >/dev/null 2>&1 else log_info " - jq 已安装" fi } # 创建工作目录 create_directories() { log_info "创建工作目录..." sudo mkdir -p "$MARKER_DIR" sudo mkdir -p "${MARKER_DIR}/logs" sudo mkdir -p "${MARKER_DIR}/data" sudo chmod 755 "$MARKER_DIR" sudo chown -R $USER:$USER "$MARKER_DIR" } # 写入完成标记 write_marker() { echo "Bootstrap completed at $(date)" | sudo tee "$MARKER_FILE" > /dev/null log_success "环境初始化完成" } # 主流程 main() { log_info "==========================================" log_info " XingRin 环境初始化" log_info "==========================================" # 检查是否已初始化,如果已初始化则跳过初始化步骤(但不退出,让后续部署脚本继续执行) if check_already_done; then return 0 # 跳过初始化,继续执行后续脚本(Docker 部署、启动容器等) fi check_os create_directories install_dependencies write_marker log_info "==========================================" log_success " ✓ 初始化完成" log_info "==========================================" } main "$@" ================================================ FILE: backend/scripts/worker-deploy/install.sh ================================================ #!/bin/bash # ============================================ # XingRin 远程节点安装脚本 # 用途:安装 Docker 环境 + 预拉取镜像 # 支持:Ubuntu / Debian / Kali # # 架构说明: # 1. 安装 Docker 环境 # 2. 预拉取 worker 镜像(避免任务执行时网络延迟) # 3. agent 通过 start-agent.sh 启动(心跳上报) # 4. 扫描任务由主服务器通过 SSH 执行 docker run # # 镜像版本管理: # - IMAGE_TAG 由主服务器传入,确保版本一致性 # - 预拉取后,任务执行时使用 --pull=missing 直接用本地镜像 # ============================================ set -e MARKER_DIR="/opt/xingrin" DOCKER_MARKER="${MARKER_DIR}/.docker_installed" # 颜色定义 GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' # 渐变色定义 CYAN='\033[0;36m' MAGENTA='\033[0;35m' BOLD='\033[1m' DIM='\033[2m' log_info() { echo -e "${CYAN} ▸${NC} $1"; } log_success() { echo -e "${GREEN} ✔${NC} $1"; } log_warn() { echo -e "${YELLOW} ⚠${NC} $1"; } log_error() { echo -e "${RED} ✖${NC} $1"; } # 炫酷 Banner show_banner() { echo -e "" echo -e "${CYAN}${BOLD} ██╗ ██╗██╗███╗ ██╗ ██████╗ ██████╗ ██╗███╗ ██╗${NC}" echo -e "${CYAN} ╚██╗██╔╝██║████╗ ██║██╔════╝ ██╔══██╗██║████╗ ██║${NC}" echo -e "${BLUE}${BOLD} ╚███╔╝ ██║██╔██╗ ██║██║ ███╗██████╔╝██║██╔██╗ ██║${NC}" echo -e "${BLUE} ██╔██╗ ██║██║╚██╗██║██║ ██║██╔══██╗██║██║╚██╗██║${NC}" echo -e "${MAGENTA}${BOLD} ██╔╝ ██╗██║██║ ╚████║╚██████╔╝██║ ██║██║██║ ╚████║${NC}" echo -e "${MAGENTA} ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝${NC}" echo -e "" echo -e "${DIM} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BOLD} 🚀 分布式安全扫描平台 │ Worker 节点部署${NC}" echo -e "${DIM} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "" } # 完成 Banner show_complete() { echo -e "" echo -e "${GREEN}${BOLD} ╔═══════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}${BOLD} ║ ║${NC}" echo -e "${GREEN}${BOLD} ║ ██████╗ ██████╗ ███╗ ██╗███████╗██╗ ║${NC}" echo -e "${GREEN}${BOLD} ║ ██╔══██╗██╔═══██╗████╗ ██║██╔════╝██║ ║${NC}" echo -e "${GREEN}${BOLD} ║ ██║ ██║██║ ██║██╔██╗ ██║█████╗ ██║ ║${NC}" echo -e "${GREEN}${BOLD} ║ ██║ ██║██║ ██║██║╚██╗██║██╔══╝ ╚═╝ ║${NC}" echo -e "${GREEN}${BOLD} ║ ██████╔╝╚██████╔╝██║ ╚████║███████╗██╗ ║${NC}" echo -e "${GREEN}${BOLD} ║ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝╚═╝ ║${NC}" echo -e "${GREEN}${BOLD} ║ ║${NC}" echo -e "${GREEN}${BOLD} ║ ✨ XingRin Worker 节点部署完成! ║${NC}" echo -e "${GREEN}${BOLD} ║ ║${NC}" echo -e "${GREEN}${BOLD} ╚═══════════════════════════════════════════════════╝${NC}" echo -e "" } # 等待 apt 锁释放 wait_for_apt_lock() { local max_wait=60 local waited=0 while sudo fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || \ sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1 || \ sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do if [ $waited -eq 0 ]; then log_info "等待 apt 锁释放..." fi sleep 2 waited=$((waited + 2)) if [ $waited -ge $max_wait ]; then log_warn "等待 apt 锁超时,继续尝试..." break fi done } # 检测操作系统 detect_os() { if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID else log_error "无法检测操作系统" exit 1 fi if [[ "$OS" != "ubuntu" && "$OS" != "debian" && "$OS" != "kali" ]]; then log_error "仅支持 Ubuntu/Debian/Kali 系统" exit 1 fi } # 安装 Docker install_docker() { if command -v docker &> /dev/null; then log_info "Docker 已安装: $(docker --version)" return 0 fi log_info "安装 Docker..." wait_for_apt_lock # 安装依赖 sudo apt-get update -qq sudo apt-get install -y -qq ca-certificates curl gnupg lsb-release >/dev/null 2>&1 # 添加 Docker GPG key sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/${OS}/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 2>/dev/null # 添加 Docker 源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${OS} $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装 Docker sudo apt-get update -qq sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null 2>&1 # 启动 Docker sudo systemctl enable docker >/dev/null 2>&1 || true sudo systemctl start docker >/dev/null 2>&1 || true # 添加当前用户到 docker 组 sudo usermod -aG docker $USER 2>/dev/null || true log_success "Docker 安装完成" } # 创建数据目录 create_dirs() { log_info "创建数据目录..." sudo mkdir -p "${MARKER_DIR}/results" sudo mkdir -p "${MARKER_DIR}/logs" sudo mkdir -p "${MARKER_DIR}/fingerprints" sudo mkdir -p "${MARKER_DIR}/wordlists" sudo chmod -R 777 "${MARKER_DIR}" log_success "数据目录已创建" } # 清理旧容器 cleanup_old_containers() { log_info "清理旧容器..." # 停止并删除旧的 agent 容器 docker stop xingrin-agent 2>/dev/null || true docker rm xingrin-agent 2>/dev/null || true # 兼容旧名称 docker stop xingrin-watchdog 2>/dev/null || true docker rm xingrin-watchdog 2>/dev/null || true log_success "旧容器已清理" } # 拉取 Worker 镜像(预先拉取,避免任务执行时网络延迟) # # 镜像拉取策略: # 1. 安装时预先拉取 worker 镜像到本地 # 2. 后续任务执行时使用 --pull=missing,直接用本地镜像 # 3. 版本由主服务器的 IMAGE_TAG 决定,确保版本一致性 pull_image() { log_info "拉取 Worker 镜像..." # 镜像版本由部署时传入(deploy_service.py 注入 IMAGE_TAG 环境变量) if [ -z "$IMAGE_TAG" ]; then log_error "IMAGE_TAG 未设置,请确保部署时传入版本号" exit 1 fi local docker_user="${DOCKER_USER:-yyhuni}" # 拉取指定版本的 worker 镜像(用于执行扫描任务) sudo docker pull "${docker_user}/xingrin-worker:${IMAGE_TAG}" log_success "镜像拉取完成: ${docker_user}/xingrin-worker:${IMAGE_TAG}" } # 主流程 main() { show_banner detect_os install_docker cleanup_old_containers create_dirs pull_image touch "$DOCKER_MARKER" show_complete } main "$@" ================================================ FILE: backend/scripts/worker-deploy/start-agent.sh ================================================ #!/bin/bash # ============================================ # XingRin Agent 启动脚本 # 用途:启动 agent 容器(心跳上报 + 负载监控) # # 架构说明: # - 使用 docker run 直接启动 agent 容器 # - agent 负责心跳上报和系统负载监控 # - 扫描任务由主服务器通过 SSH 执行独立的 worker 容器 # - 镜像版本由主服务器传入,确保版本一致性 # # 镜像拉取: # - 使用 --pull=missing,优先使用本地镜像 # - 如果本地没有则从 Docker Hub 拉取 # ============================================ set -e MARKER_DIR="/opt/xingrin" CONTAINER_NAME="xingrin-agent" # 使用轻量 agent 镜像(~30MB),仅包含心跳上报功能 # 镜像版本由部署时传入(必须设置) DOCKER_USER="${DOCKER_USER:-yyhuni}" if [ -z "$IMAGE_TAG" ]; then echo "[ERROR] IMAGE_TAG 未设置,请确保部署时传入版本号" exit 1 fi IMAGE="${DOCKER_USER}/xingrin-agent:${IMAGE_TAG}" # 预设变量(远程部署时由 deploy_service.py 替换) PRESET_SERVER_URL="{{HEARTBEAT_API_URL}}" PRESET_WORKER_ID="{{WORKER_ID}}" PRESET_API_KEY="{{WORKER_API_KEY}}" # 颜色定义 GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[XingRin]${NC} $1"; } log_success() { echo -e "${GREEN}[XingRin]${NC} $1"; } # 停止旧容器 stop_old() { if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log_info "停止旧的 agent 容器..." docker stop ${CONTAINER_NAME} 2>/dev/null || true docker rm ${CONTAINER_NAME} 2>/dev/null || true fi # 兼容旧名称 if docker ps -a --format '{{.Names}}' | grep -q "^xingrin-watchdog$"; then docker stop xingrin-watchdog 2>/dev/null || true docker rm xingrin-watchdog 2>/dev/null || true fi } # 启动 agent start_agent() { log_info "==========================================" log_info " XingRin Agent 启动" log_info "==========================================" log_info "启动 agent 容器..." # --pull=missing: 本地没有镜像时才拉取 # 版本更新由服务端通过 SSH 显式 docker pull 触发 docker run -d --pull=missing \ --name ${CONTAINER_NAME} \ --restart always \ -e SERVER_URL="${PRESET_SERVER_URL}" \ -e WORKER_ID="${PRESET_WORKER_ID}" \ -e IMAGE_TAG="${IMAGE_TAG}" \ -e WORKER_API_KEY="${PRESET_API_KEY}" \ -v /proc:/host/proc:ro \ ${IMAGE} log_success "Agent 已启动" } # 显示完成信息 show_completion() { echo "" log_success "==========================================" log_success " ✓ Agent 已启动" log_success "==========================================" echo "" log_info "管理命令:" echo " - 查看日志: docker logs -f ${CONTAINER_NAME}" echo " - 重启: docker restart ${CONTAINER_NAME}" echo " - 停止: docker stop ${CONTAINER_NAME}" echo "" } # 主流程 main() { stop_old start_agent show_completion } main "$@" ================================================ FILE: backend/scripts/worker-deploy/uninstall.sh ================================================ #!/bin/bash # ============================================ # XingRin 远程节点卸载脚本 # 用途:停止 agent 容器并清理环境 # 支持:Ubuntu / Debian # ============================================ set -e MARKER_DIR="/opt/xingrin" GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[XingRin]${NC} $1"; } log_success() { echo -e "${GREEN}[XingRin]${NC} $1"; } # 停止 agent 容器 stop_agent() { log_info "停止 agent 容器..." # 停止新名称容器 docker stop xingrin-agent 2>/dev/null || true docker rm xingrin-agent 2>/dev/null || true # 兼容旧名称 docker stop xingrin-watchdog 2>/dev/null || true docker rm xingrin-watchdog 2>/dev/null || true log_success "Agent 已停止" } # 清理数据目录 cleanup_data() { log_info "清理数据目录..." if [ -d "${MARKER_DIR}" ]; then sudo rm -rf "${MARKER_DIR}" log_success "数据目录已清理" fi } # 显示完成信息 show_completion() { echo "" log_success "==========================================" log_success " ✓ 卸载完成" log_success "==========================================" echo "" log_info "注意:Docker 未卸载,如需卸载请手动执行" } # 主流程 main() { log_info "==========================================" log_info " XingRin 节点卸载" log_info "==========================================" stop_agent cleanup_data show_completion } main "$@" ================================================ FILE: backend/wordlist/dir_default.txt ================================================ /api/admin/v1/users/all /registerSuccess.do /getALLUsers /swagger/static/index.html /swagger-ui/index.html /dubbo-provider/distv2/index.html /user/swagger-ui.html /swagger-dubbo/api-docs /distv2/index.html /static/swagger.json /api/index.html /v2/swagger.json /actuator/hystrix.stream /intergrationgraph /druid /swagger-ui/html /api/v2/api-docs /swagger/codes /template/swagger-ui.html /spring-security-rest/api/swagger-ui.html /spring-security-oauth-resource/swagger-ui.html /v2/api-docs /api.html /sw/swagger-ui.html /~www /~xfs /~uucp /~user5 /~web /~user4 /~user3 /~user /~user1 /~toor /~user2 /~sync /~system /~testuser /~test /~shutdown /~sql /~root /~staff /~rpc /~reception /~rpcuser /~operator /~office /~nscd /~postmaster /~pop /~nobody /~news /~mailnull /~mail /~lp /~ident /~http /~helpdesk /~help /~halt /~gdm /~gopher /~guest /~games /~fwuser /~fwadmin /~firewall /~fw /~db /~database /~backup /~ftp /~data /~daemon /~bin /~apache /~admin/ /~/ /~anonymous /~administrator /zipkin/ /~admin /~adm /zimbra /zf_backend.php /zone-h.php /zimbra/ /yonetim.php /zeroclipboard.swf /zebra.conf /zehir.php /zabbix/ /yum.log /yonetim.html /yonetici /ylwrap /yonetici.html /yonetici.php /yonetim /yarn.lock /yarn-error.log /yarn-debug.log /yaml_cron.log /xw.php /xx.php /yaml.log /xw1.php /xsql/lib/XSQLConfig.xml /xslt/ /xsl/common.xsl /xsl/ /xsl/_common.xsl /xsql/ /xshell.php /xmlrpc.php /xphpMyAdmin/ /xprober.php /xmlrpc_server.php /xphperrors.log /xmlrpc /xml/_common.xml /xml/common.xml /xml/ /xls/ /xml /xcuserdata/ /xlogin/ /xiaoma.php /xferlog /xd.php /xampp/phpmyadmin/scripts/setup.php /xampp/phpmyadmin/index.php /xampp/phpmyadmin/ /xampp/ /x.php /wwwstats.htm /wwwstat /wwwroot.zip /wwwroot.tgz /wwwroot.tar.bz2 /wwwroot.tar.gz /wwwlog /wwwroot.tar /wwwroot.7z /wwwroot.sql /wwwroot.rar /wwwboard/passwd.txt /wwwboard/ /www.zip /www/phpMyAdmin/index.php /www-error.log /www.tgz /www.tar.bz2 /www-test/ /www.tar /www.rar /www.tar.gz ================================================ FILE: backend/wordlist/subdomains-top1million-110000.txt ================================================ www mail ftp localhost webmail smtp webdisk pop cpanel whm ns1 ns2 autodiscover autoconfig ns test m blog dev www2 ns3 pop3 forum admin mail2 vpn mx imap old new mobile mysql beta support cp secure shop demo dns2 ns4 dns1 static lists web www1 img news portal server wiki api media images www.blog backup dns sql intranet www.forum www.test stats host video mail1 mx1 www3 staging www.m sip chat search crm mx2 ads ipv4 remote email my wap svn store cms download proxy www.dev mssql apps dns3 exchange mail3 forums ns5 db office live files info owa monitor helpdesk panel sms newsletter ftp2 web1 web2 upload home bbs login app en blogs it cdn stage gw dns4 www.demo ssl cn smtp2 vps ns6 relay online service test2 radio ntp library help www4 members tv www.shop extranet hosting ldap services webdisk.blog s1 i survey s www.mail www.new c-n7k-v03-01.rz data docs c-n7k-n04-01.rz ad legacy router de meet cs av sftp server1 stat moodle facebook test1 photo partner nagios mrtg s2 mailadmin dev2 ts autoconfig.blog autodiscover.blog games jobs image host2 gateway preview www.support im ssh correo control ns0 vpn2 cloud archive citrix webdisk.m voip connect game smtp1 access lib www5 gallery redmine es irc stream qa dl billing construtor lyncdiscover painel fr projects a pgsql mail4 tools iphone server2 dbadmin manage jabber music webmail2 www.beta mailer phpmyadmin t reports rss pgadmin images2 mx3 www.webmail ws content sv web3 community poczta www.mobile ftp1 dialin us sp panelstats vip cacti s3 alpha videos ns7 promo testing sharepoint marketing sitedefender member webdisk.dev emkt training edu autoconfig.m git autodiscover.m catalog webdisk.test job ww2 www.news sandbox elearning fb webmail.cp downloads speedtest design staff master panelstatsmail v2 db1 mailserver builder.cp travel mirror ca sso tickets alumni sitebuilder www.admin auth jira ns8 partners ml list images1 club business update fw devel local wp streaming zeus images3 adm img2 gate pay file seo status share maps zimbra webdisk.forum trac oa sales post events project xml wordpress images4 main english e img1 db2 time redirect go bugs direct www6 social www.old development calendar www.forums ru www.wiki monitoring hermes photos bb mx01 mail5 temp map ns10 tracker sport uk hr autodiscover.test conference free autoconfig.test client vpn1 autodiscover.dev b2b autoconfig.dev noc webconf ww payment firewall intra rt v clients www.store gis m2 event origin site domain barracuda link ns11 internal dc smtp3 zabbix mdm assets images6 www.ads mars mail01 pda images5 c ns01 tech ms images7 autoconfig.forum public css autodiscover.forum webservices www.video web4 orion pm fs w3 student www.chat domains book lab o1.email server3 img3 kb faq health in board vod www.my cache atlas php images8 wwww voip750101.pg6.sip cas origin-www cisco banner mercury w directory mailhost test3 shopping webdisk.demo ip market pbx careers auto idp ticket js ns9 outlook foto www.en pro mantis spam movie s4 lync jupiter dev1 erp register adv b corp sc ns12 images0 enet1 mobil lms net storage ss ns02 work webcam www7 report admin2 p nl love pt manager d cc android linux reseller agent web01 sslvpn n thumbs links mailing hotel pma press venus finance uesgh2x nms ds joomla doc flash research dashboard track www.img x rs edge deliver sync oldmail da order eng testbrvps user radius star labs top srv1 mailers mail6 pub host3 reg lb log books phoenix drupal affiliate www.wap webdisk.support www.secure cvs st wksta1 saturn logos preprod m1 backup2 opac core vc mailgw pluto ar software jp srv newsite www.members openx otrs titan soft analytics code mp3 sports stg whois apollo web5 ftp3 www.download mm art host1 www8 www.radio demo2 click smail w2 feeds g education affiliates kvm sites mx4 autoconfig.demo controlpanel autodiscover.demo tr ebook www.crm hn black mcp adserver www.staging static1 webservice f develop sa katalog as smart pr account mon munin www.games www.media cam school r mc id network www.live forms math mb maintenance pic agk phone bt sm demo1 ns13 tw ps dev3 tracking green users int athena www.static www.info security mx02 prod 1 team transfer www.facebook www10 v1 google proxy2 feedback vpgk auction view biz vpproxy secure2 www.it newmail sh mobi wm mailgate dms 11192521404255 autoconfig.support play 11192521403954 start life autodiscover.support antispam cm booking iris www.portal hq gc._msdcs neptune terminal vm pool gold gaia internet sklep ares poseidon relay2 up resources is mall traffic webdisk.mail www.api join smtp4 www9 w1 upl ci gw2 open audio fax alfa www.images alex spb xxx ac edm mailout webtest nfs01.jc me sun virtual spokes ns14 webserver mysql2 tour igk wifi pre abc corporate adfs srv2 delta loopback magento br campus law global s5 web6 orange awstats static2 learning www.seo china gs www.gallery tmp ezproxy darwin bi best mail02 studio sd signup dir server4 archives golf omega vps2 sg ns15 win real www.stats c1 eshop piwik geo mis proxy1 web02 pascal lb1 app1 mms apple confluence sns learn classifieds pics gw1 www.cdn rp matrix repository updates se developer meeting twitter artemis au cat system ce ecommerce sys ra orders sugar ir wwwtest bugzilla listserv www.tv vote webmaster webdev sam www.de vps1 contact galleries history journal hotels www.newsletter podcast dating sub www.jobs www.intranet www.email mt science counter dns5 2 people ww3 www.es ntp1 vcenter test5 radius1 ocs power pg pl magazine sts fms customer wsus bill www.hosting vega nat sirius lg 11285521401250 sb hades students uat conf ap uxr4 eu moon www.search checksrv hydra usa digital wireless banners md mysite webmail1 windows traveler www.poczta hrm database mysql1 inside debian pc ask backend cz mx0 mini autodiscover.mail rb webdisk.shop mba www.help www.sms test4 dm subscribe sf passport red video2 ag autoconfig.mail all.edge registration ns16 camera myadmin ns20 uxr3 mta beauty fw1 epaper central cert backoffice biblioteca mob about space movies u ms1 ec forum2 server5 money radius2 print ns18 thunder nas ww1 webdisk.webmail edit www.music planet m3 vstagingnew app2 repo prueba house ntp2 dragon pandora stock form pp www.sport physics food groups antivirus profile www.online stream2 hp d1 nhko1111 logs eagle v3 mail7 gamma career vpn3 ipad dom webdisk.store iptv www.promo hd mag box talk hera f1 www.katalog syslog fashion t1 2012 soporte teste scripts welcome hk paris www.game multimedia neo beta2 msg io portal2 sky webdisk.beta web7 exam cluster webdisk.new img4 surveys webmail.controlpanel error private bo kids card vmail switch messenger cal plus cars management feed xmpp ns51 premium www.apps backup1 asp ns52 website pos lb2 www.foto ws1 domino mailman asterisk weather max ma node1 webapps white ns17 cdn2 dealer pms tg gps www.travel listas chelyabinsk-rnoc-rr02.backbone hub demo3 minecraft ns22 hw70f395eb456e dns01 wpad nm ch www.catalog ns21 web03 www.videos rc www.web gemini bm lp pdf webapp noticias myaccount sql1 hercules ct fc mail11 pptp contest www.us msk widget study 11290521402560 posta ee realestate out galaxy kms thor world webdisk.mobile www.test2 base cd relay1 taurus cgi www0 res d2 intern c2 webdav mail10 robot vcs am dns02 group silver www.dl adsl ids ex ariel i2 trade ims king www.fr sistemas ecard themes builder.controlpanel blue z securemail www-test wmail 123 sonic netflow enterprise extra webdesign reporting libguides oldsite autodiscover.secure check webdisk.secure luna www11 down odin ent web10 international fw2 leo pegasus mailbox aaa com acs vdi inventory simple e-learning fire cb edi rsc yellow www.sklep www.social webmail.cpanel act bc portfolio hb smtp01 cafe nexus www.edu ping movil as2 builder.control autoconfig.secure payments cdn1 srv3 openvpn tm cisco-capwap-controller dolphin webmail3 minerva co wwwold hotspot super products nova r1 blackberry mike pe acc lion tp tiger stream1 www12 admin1 mx5 server01 webdisk.forums notes suporte focus km speed rd lyncweb builder.cpanel pa mx10 www.files fi konkurs broadcast a1 build earth webhost www.blogs aurora review mg license homer servicedesk webcon db01 dns6 cfd297 spider expo newsletters h ems city lotus fun autoconfig.webmail statistics ams all.videocdn autodiscover.shop autoconfig.shop tfs www.billing happy cl sigma jwc dream sv2 wms one ls europa ldap2 a4 merlin buy web11 dk autodiscover.webmail ro widgets sql2 mysql3 gmail selfservice sdc tt mailrelay a.ns ns19 webstats plesk nsk test6 class agenda adam german www.v2 renew car correio bk db3 voice sentry alt demeter www.projects mail8 bounce tc oldwww www.directory uploads carbon all mark bbb eco 3g testmail ms2 node2 template andromeda www.photo media2 articles yoda sec active nemesis autoconfig.new autodiscover.new push enews advertising mail9 api2 david source kino prime o vb testsite fm c4anvn3 samara reklama made.by sis q mp newton elearn autodiscover.beta cursos filter autoconfig.beta news2 mf ubuntu ed zs a.mx center www.sandbox img5 translate webmail.control mail0 smtp02 s6 dallas bob autoconfig.store stu recruit mailtest reviews autodiscover.store 2011 www.iphone fp d3 rdp www.design test7 bg console outbound jpkc ext invest web8 testvb vm1 family insurance atlanta aqua film dp ws2 webdisk.cdn www.wordpress webdisk.news at ocean dr yahoo s8 host2123 libra rose cloud1 album 3 antares www.a ipv6 bridge demos cabinet crl old2 angel cis www.panel isis s7 guide webinar pop2 cdn101 company express special loki accounts video1 expert clientes p1 loja blog2 img6 l mail12 style hcm s11 mobile2 triton s12 kr www.links s13 friends www.office shadow mymail autoconfig.forums ns03 neu autodiscover.forums www.home root upgrade puppet storm www.service isp get foro mytest test10 desktop po mac www.member ph blackboard dspace dev01 ftp4 testwww presse ldap1 rock wow sw msn mas scm its vision tms www.wp hyperion nic html sale isp-caledon.cit www.go do media1 web9 ua energy helios chicago webftp i1 commerce www.ru union netmon audit vm2 mailx web12 painelstats sol z-hn.nhac kvm2 chris www.board apache tube marvin bug external pki viper webadmin production r2 win2 vpstun mx03 ios www.uk smile www.fb aa www13 trinity www.upload www.testing amazon hosting2 bip mw www.health india web04 rainbow cisco-lwapp-controller uranus qr domaindnszones editor www.stage manual nice robin gandalf j buzz password autoconfig.mobile gb idea eva www.i server6 www.job results www.test1 maya pix www.cn gz th www.lib autodiscover.mobile b1 horus zero sv1 wptest cart brain mbox bd tester fotos ess ns31 blogx.dev ceres gatekeeper csr www.cs sakura chef parking idc desarrollo mirrors sunny kvm1 prtg mo dns0 chaos avatar alice task www.app dev4 sl sugarcrm youtube ic-vss6509-gw simon m4 dexter crystal terra fa server7 journals iron uc pruebas magic ead www.helpdesk 4 server10 computer galileo delivery aff aries www.development el livechat host4 static3 www.free sk puma coffee gh java fish templates tarbaby mtest light www.link sas poll director destiny aquarius vps3 bravo freedom boutique lite ns25 shop2 ic foundation cw ras park next diana secure1 k euro managedomain castor www-old charon nas1 la jw s10 web13 mxbackup2 europe oasis donate s9 ftps falcon depot genesis mysql4 rms ns30 www.drupal wholesale forestdnszones www.alumni marketplace tesla statistik country imap4 brand gift shell www.dev2 apply nc kronos epsilon testserver smtp-out pictures autos org mysql5 france shared cf sos stun channel 2013 moto pw oc.pool eu.pool na.pool cams www.auto pi image2 test8 hi casino magazin wwwhost-roe001 z-hcm.nhac trial cam1 victor sig ctrl wwwhost-ox001 weblog rds first farm whatsup panda dummy stream.origin canada wc flv www.top emerald sim ace sap ga bank et soap guest mdev www.client www.partner easy st1 webvpn baby s14 delivery.a wwwhost-port001 hideip graphics webshop catalogue tom rm perm www.ad ad1 mail03 www.sports water intranet2 autodiscover.news bj nsb charge export testweb sample quit proxy3 email2 b2 servicios novo new2 meta secure3 ajax autoconfig.news ghost www.cp good bookstore kiwi ft demo4 www.archive squid publish west football printer cv ny boss smtp5 rsync sip2 ks leon a3 mta1 epay tst mgmt deals dropbox www.books 2010 torrent webdisk.ads mx6 www.art chem iproxy www.pay anime ccc anna ns23 hs cg acm pollux lt meteo owncloud andrew v4 www-dev oxygen jaguar panther personal ab dcp med www.joomla john watson motor mails kiev asia campaign win1 cards fantasy tj martin helium nfs ads2 script anubis imail cp2 mk bw em creative www.elearning ad2 stars discovery friend reservations buffalo cdp uxs2r atom cosmos www.business a2 xcb allegro om ufa dw cool files2 webdisk.chat ford oma zzb staging2 texas ib cwc aphrodite re spark www.ftp oscar atlantis osiris os m5 dl1 www.shopping ice beta1 mcu inter interface gm kiosk so dss www.survey customers fx nsa csg mi url dl2 show www.classifieds mexico knowledge frank tests accounting krasnodar um hc www.nl echo property gms london www.clients academy cyber www.english museum poker www.downloads gp cr arch gd virgo si smtp-relay ipc gay gg oracle ruby grid web05 i3 tool bulk jazz price pan webdisk.admin agora w4 mv www.moodle phantom web14 radius.auth voyager mint einstein wedding sqladmin cam2 autodiscover.chat trans che bp dsl kazan autoconfig.chat al pearl transport lm h1 condor homes air stargate ai www.www2 hot paul np kp engine ts3 nano testtest sss james gk ep ox tomcat ns32 sametime tornado e1 s16 quantum slave shark autoconfig.cdn www.love backup3 webdisk.wiki altair youth keys site2 server11 phobos common autodiscover.cdn key test9 core2 snoopy lisa soccer tld biblio sex fast train www.software credit p2 cbf1 ns24 mailin dj www.community www-a www-b smtps victoria www.docs cherry cisl-murcia.cit border test11 nemo pass mta2 911 xen hg be wa web16 biologie bes fred turbo biology indigo plan www.stat hosting1 pilot www.club diamond www.vip cp1 ics www.library autoconfig.admin japan autodiscover.admin quiz laptop todo cdc mkt mu dhcp.pilsnet dot xenon csr21.net horizon vp centos inf wolf mr fusion retail logo line 11 sr shorturl speedy webct omsk dns7 ebooks apc rus landing pluton www.pda w5 san course aws uxs1r spirit ts2 srv4 classic webdisk.staging g1 ops comm bs sage innovation dynamic www.www resellers resource colo test01 swift bms metro s15 vn callcenter www.in scc jerry site1 profiles penguin sps mail13 portail faculty eis rr mh count psi florida mango maple ssltest cloud2 general www.tickets maxwell web15 familiar arc axis ng admissions dedicated cash nsc www.qa tea tpmsqr01 rnd jocuri office2 mario xen2 mradm.letter cwa ninja amur core1 miami www.sales cerberus ixhash ie action daisy spf p3 junior oss pw.openvpn alt-host fromwl nobl isphosts ns26 helomatch test123 tftp webaccess tienda hostkarma lv freemaildomains sbc testbed bart ironport server8 dh crm2 watch skynet miss dante www.affiliates legal www.ip telecom dt blog1 webdisk.email ip-us pixel www.t dnswl korea insight dd www.rss testbl www01 auth-hack www.cms abuse-report pb casa eval bio app3 cobra www.ar solo wall oc dc1 beast george eureka sit demo5 holiday webhosting srv01 router2 ssp server9 quotes eclipse entertainment kc m0 af cpa pc.jura-gw1 fox deal dav www.training webdisk.old host5 mix vendor uni mypage spa soa aura ref arm dam config austin aproxy developers cms2 www15 women wwwcache abs testportal inet gt testshop g2 www.ca pinnacle support2 sunrise snake www-new patch lk sv3 b.ns python starwars cube sj s0 gc stud micro webstore coupon perseus maestro router1 hawk pf h2 www.soft dns8 fly unicorn sat na xyz df lynx activate sitemap t2 cats mmm volgograd test12 sendmail hardware ara import ces cinema arena text a5 astro doctor casper smc voronezh eric agency wf avia platinum butler yjs hospital nursing admin3 pd safety teszt tk s20 moscow karen cse messages www.adserver asa eros www.server player raptor documents srv5 www.photos xb example culture demo6 dev5 jc ict back p2p stuff wb ccs su webinars kt hope http try tel m9 newyork gov www.marketing relax setup fileserver moodle2 courses annuaire fresh www.status rpc zeta ibank helm autodiscover.ads mailgateway integration viking metrics c.ns.e webdisk.video www.host tasks monster firefly icq saratov www.book smtp-out-01 tourism dz zt daniel roundcube paper 24 sus splash zzz 10 chat2 autoconfig.ads mailhub neon message seattle ftp5 port solutions offers seth server02 peter ns29 maillist www.konkurs d.ns.e toto guides ae healthcare ssc mproxy metis estore mailsrv singapore hm medusa bl bz i5 dan thomas exchbhlan5 alert www.spb st2 www.tools rigel e.ns.e kvm3 astun trk www.law qavgatekeeper collab styx webboard cag www.student galeria checkout gestion mailgate2 draco n2 berlin touch seminar olympus qavmgk f.ns.e intl stats2 plato send idm m7 mx7 m6 coco denver s32 toronto abuse dn sophos bear logistics cancer s24 r25 s22 install istun itc oberon cps paypal 7 mail-out portal1 case hideip-usa f3 pcstun ip-usa warehouse webcast ds1 bn rest logger marina tula vebstage3 webdisk.static infinity polaris koko praca fl packages mstun www.staff sunshine mirror1 jeff mailservers jenkins administration mlr-all blade qagatekeeper cdn3 aria vulcan party fz luke stc mds advance andy subversion deco 99 diemthi liberty read smtprelayout fitness vs dhcp.zmml tsg www.pt win3 davinci two stella itsupport az ns27 hyper m10 drm vhost mir webspace mail.test argon hamster livehelp 2009 bwc man ada exp metal pk msp hotline article twiki gl hybrid www.login cbf8 sandy anywhere sorry enter east islam www.map quote op tb zh euro2012 hestia rwhois mail04 schedule ww5 servidor ivan serenity dave mobile1 ok lc synergy myspace sipexternal marc bird rio www.1 debug houston pdc www.xxx news1 ha mirage fe jade roger ava topaz a.ns.e madrid kh charlotte download2 elite tenders pacs cap fs1 myweb calvin extreme typo3 dealers cds grace webchat comet www.maps ranking hawaii postoffice arts b.ns.e president matrixstats www.s eden com-services-vip www.pics il solar www.loja gr ns50 svc backups sq pinky jwgl controller www.up sn medical spamfilter prova membership dc2 www.press csc gry drweb web17 f2 nora monitor1 calypso nebula lyris penarth.cit www.mp3 ssl1 ns34 ns35 mel as1 www.x cricket ns2.cl georgia callisto exch s21 eip cctv lucy bmw s23 sem mira search2 ftp.blog realty ftp.m www.hrm patrick find tcs ts1 smtp6 lan image1 csi nissan sjc sme stone model gitlab spanish michael remote2 www.pro s17 m.dev www.soporte checkrelay dino woman aragorn index zj documentation felix www.events www.au adult coupons imp oz www.themes charlie rostov smtpout www.faq ff fortune vm3 vms sbs stores teamspeak w6 jason tennis nt shine pad www.mobil s25 woody technology cj visio renewal www.c webdisk.es secret host6 www.fun polls web06 turkey www.hotel ecom tours product www.reseller indiana mercedes target load area mysqladmin don dodo sentinel webdisk.img websites www.dir honey asdf spring tag astra monkey ns28 ben www22 www.journal eas www.tw tor page www.bugs medias www17 toledo vip2 land sistema win4 dell unsubscribe gsa spot fin sapphire ul-cat6506-gw www.ns1 bell cod lady www.eng click3 pps c3 registrar websrv database2 prometheus atm www.samara api1 edison mega cobalt eos db02 sympa dv webdisk.games coop 50 blackhole 3d cma ehr db5 etc www14 opera zoom realmedia french cmc shanghai ns33 batman ifolder ns61 alexander song proto cs2 homologacao ips vanilla legend webmail.hosting chat1 www.mx coral tim maxim admission iso psy progress shms2 monitor2 lp2 thankyou issues cultura xyh speedtest2 dirac www.research webs e2 save deploy emarketing jm nn alfresco chronos pisces database1 reservation xena des directorio shms1 pet sauron ups www.feedback www.usa teacher www.magento nis ftp01 baza kjc roma contests delphi purple oak win5 violet www.newsite deportes www.work musica s29 autoconfig.es identity www.fashion forest flr-all www.german lead front rabota mysql7 jack vladimir search1 ns3.cl promotion plaza devtest cookie eris webdisk.images atc autodiscover.es lucky juno brown rs2 www16 bpm www.director victory fenix rich tokyo ns36 src 12 milk ssl2 notify no livestream pink sony vps4 scan wwws ovpn deimos smokeping va n7pdjh4 lyncav webdisk.directory interactive request apt partnerapi albert cs1 ns62 bus young sina police workflow asset lasvegas saga p4 www.image dag crazy colorado webtrends buscador hongkong rank reserve autoconfig.wiki autodiscover.wiki nginx hu melbourne zm toolbar cx samsung bender safe nb jjc dps ap1 win7 wl diendan www.preview vt kalender testforum exmail wizard qq www.film xxgk www.gold irkutsk dis zenoss wine data1 remus kelly stalker autoconfig.old everest ftp.test spain autodiscover.old obs ocw icare ideas mozart willow demo7 compass japanese octopus prestige dash argos forum1 img7 webdisk.download mysql01 joe flex redir viva ge mod postfix www.p imagine moss whmcs quicktime rtr ds2 future y sv4 opt mse selene mail21 dns11 server12 invoice clicks imgs xen1 mail14 www20 cit web08 gw3 mysql6 zp www.life leads cnc bonus web18 sia flowers diary s30 proton s28 puzzle s27 r2d2 orel eo toyota front2 www.pl descargas msa esx2 challenge turing emma mailgw2 elections www.education relay3 s31 www.mba postfixadmin ged scorpion hollywood foo holly bamboo civil vita lincoln webdisk.media story ht adonis serv voicemail ef mx11 picard c3po helix apis housing uptime bet phpbb contents rent www.hk vela surf summer csr11.net beijing bingo www.jp edocs mailserver2 chip static4 ecology engineering tomsk iss csr12.net s26 utility pac ky visa ta web22 ernie fis content2 eduroam youraccount playground paradise server22 rad domaincp ppc autodiscover.video date f5 openfire mail.blog i4 www.reklama etools ftptest default kaluga shop1 mmc 1c server15 autoconfig.video ve www21 impact laura qmail fuji csr31.net archer robo shiva tps www.eu ivr foros ebay www.dom lime mail20 b3 wss vietnam cable webdisk.crm x1 sochi vsp www.partners polladmin maia fund asterix c4 www.articles fwallow all-nodes mcs esp helena doors atrium www.school popo myhome www.demo2 s18 autoconfig.email columbus autodiscover.email ns60 abo classified sphinx kg gate2 xg cronos chemistry navi arwen parts comics www.movies www.services sad krasnoyarsk h3 virus hasp bid step reklam bruno w7 cleveland toko cruise p80.pool agri leonardo hokkaido pages rental www.jocuri fs2 ipv4.pool wise ha.pool routernet leopard mumbai canvas cq m8 mercurio www.br subset.pool cake vivaldi graph ld rec www.temp bach melody cygnus www.charge mercure program beer scorpio upload2 siemens lipetsk barnaul dialup mssql2 eve moe nyc www.s1 mailgw1 student1 universe dhcp1 lp1 builder bacula ww4 www.movil ns42 assist microsoft www.careers rex dhcp automotive edgar designer servers spock jose webdisk.projects err arthur nike frog stocks pns ns41 dbs scanner hunter vk communication donald power1 wcm esx1 hal salsa mst seed sz nz proba yx smp bot eee solr by face hydrogen contacts ars samples newweb eprints ctx noname portaltest door kim v28 wcs ats zakaz polycom chelyabinsk host7 www.b2b xray td ttt secure4 recruitment molly humor sexy care vr cyclops bar newserver desk rogue linux2 ns40 alerts dvd bsc mec 20 m.test eye www.monitor solaris webportal goto kappa lifestyle miki maria www.site catalogo 2008 empire satellite losangeles radar img01 n1 ais www.hotels wlan romulus vader odyssey bali night c5 wave soul nimbus rachel proyectos jy submit hosting3 server13 d7 extras australia filme tutor fileshare heart kirov www.android hosted jojo tango janus vesta www18 new1 webdisk.radio comunidad xy candy smg pai tuan gauss ao yaroslavl alma lpse hyundai ja genius ti ski asgard www.id rh imagenes kerberos www.d peru mcq-media-01.iutnb azmoon srv6 ig frodo afisha 25 factory winter harmony netlab chance sca arabic hack raven mobility naruto alba anunturi obelix libproxy forward tts autodiscover.static bookmark www.galeria subs ba testblog apex sante dora construction wolverine autoconfig.static ofertas call lds ns45 www.project gogo russia vc1 chemie h4 15 dvr tunnel 5 kepler ant indonesia dnn picture encuestas vl discover lotto swf ash pride web21 www.ask dev-www uma cluster1 ring novosibirsk mailold extern tutorials mobilemail www.2 kultur hacker imc www.contact rsa mailer1 cupid member2 testy systems add mail.m dnstest webdisk.facebook mama hello phil ns101 bh sasa pc1 nana owa2 www.cd compras webdisk.en corona vista awards sp1 mz iota elvis cross audi test02 murmansk www.demos gta autoconfig.directory argo dhcp2 www.db www.php diy ws3 mediaserver autodiscover.directory ncc www.nsk present tgp itv investor pps00 jakarta boston www.bb spare if sar win11 rhea conferences inbox videoconf tsweb www.xml twr1 jx apps2 glass monit pets server20 wap2 s35 anketa www.dav75.users anhth montana sierracharlie.users sp2 parents evolution anthony www.noc yeni nokia www.sa gobbit.users ns2a za www.domains ultra rebecca.users dmz orca dav75.users std ev firmware ece primary sao mina web23 ast sms2 www.hfccourse.users www.v28 formacion web20 ist wind opensource www.test2.users e3 clifford.users xsc sw1 www.play www.tech dns12 offline vds xhtml steve mail.forum www.rebecca.users hobbit marge www.sierracharlie.users dart samba core3 devil server18 lbtest mail05 sara alex.users www.demwunz.users www23 vegas italia ez gollum test2.users hfccourse.users ana prof www.pluslatex.users mxs dance avalon pidlabelling.users dubious.users webdisk.search query clientweb www.voodoodigital.users pharmacy denis chi seven animal cas1 s19 di autoconfig.images www.speedtest yes autodiscover.images www.galleries econ www.flash www.clifford.users ln origin-images www.adrian.users snow cad voyage www.pidlabelling.users cameras volga wallace guardian rpm mpa flower prince exodus mine mailings cbf3 www.gsgou.users wellness tank vip1 name bigbrother forex rugby webdisk.sms graduate webdisk.videos adrian mic 13 firma www.dubious.users windu hit www.alex.users dcc wagner launch gizmo d4 rma betterday.users yamato bee pcgk gifts home1 www.team cms1 www.gobbit.users skyline ogloszenia www.betterday.users www.data river eproc acme demwunz.users nyx cloudflare-resolve-to you sci virtual2 drive sh2 toolbox lemon hans psp goofy fsimg lambda ns55 vancouver hkps.pool adrian.users ns39 voodoodigital.users kz ns1a delivery.b turismo cactus pluslatex.users lithium euclid quality gsgou.users onyx db4 www.domain persephone validclick elibrary www.ts panama www.wholesale ui rpg www.ssl xenapp exit marcus phd l2tp-us cas2 rapid advert malotedigital bluesky fortuna chief streamer salud web19 stage2 members2 www.sc alaska spectrum broker oxford jb jim cheetah sofia webdisk.client nero rain crux mls mrtg2 repair meteor samurai kvm4 ural destek pcs mig unity reporter ftp-eu cache2 van smtp10 nod chocolate collections kitchen rocky pedro sophia st3 nelson ak jl slim wap1 sora migration www.india ns04 ns37 ums www.labs blah adimg yp db6 xtreme groupware collection blackbox sender t4 college kevin vd eventos tags us2 macduff wwwnew publicapi web24 jasper vladivostok tender premier tele wwwdev www.pr postmaster haber zen nj rap planning domain2 veronica isa www.vb lamp goldmine www.geo www.math mcc www.ua vera nav nas2 autoconfig.staging s33 boards thumb autodiscover.staging carmen ferrari jordan quatro gazeta www.test3 manga techno vm0 vector hiphop www.bbs rootservers dean www.ms win12 dreamer alexandra smtp03 jackson wing ldap3 www.webmaster hobby men cook ns70 olivia tampa kiss nevada live2 computers tina festival bunny jump military fj kira pacific gonzo ftp.dev svpn serial webster www.pe s204 romania gamers guru sh1 lewis pablo yoshi lego divine italy wallpapers nd myfiles neptun www.world convert www.cloud proteus medicine bak lista dy rhino dione sip1 california 100 cosmic electronics openid csm adm2 soleil disco www.pp xmail www.movie pioneer phplist elephant ftp6 depo icon www.ns2 www.youtube ota capacitacion mailfilter switch1 ryazan auth2 paynow webtv pas www.v3 storage1 rs1 sakai pim vcse ko oem theme tumblr smtp0 server14 lala storage2 k2 ecm moo can imode webdisk.gallery webdisk.jobs howard mes eservices noah support1 soc gamer ekb marco information heaven ty kursk wilson webdisk.wp freebsd phones void esx3 empleo aida s01 apc1 mysites www.kazan calc barney prohome fd kenny www.filme ebill d6 era big goodluck rdns2 everything ns43 monty bib clip alf quran aim logon wg rabbit ntp3 upc www.stream www.ogloszenia abcd autodiscover.en blogger pepper autoconfig.en stat1 jf smtp7 video3 eposta cache1 ekaterinburg talent jewelry ecs beta3 www.proxy zsb 44 ww6 nautilus angels servicos smpp we siga magnolia smt maverick franchise dev.m webdisk.info penza shrek faraday s123 aleph vnc chinese glpi unix leto win10 answers att webtools sunset extranet2 kirk mitsubishi ppp cargo comercial balancer aire karma emergency zy dtc asb win8 walker cougar autodiscover.videos bugtracker autoconfig.videos icm tap nuevo ganymede cell www02 ticketing nature brazil www.alex troy avatars aspire custom www.mm ebiz www.twitter kong beagle chess ilias codex camel crc microsite mlm autoconfig.crm o2 human ken sonicwall biznes pec flow autoreply tips little autodiscover.crm hardcore egypt ryan doska mumble s34 pds platon demo8 total ug das gx just tec archiv ul craft franklin speedtest1 rep supplier crime mail-relay luigi saruman defiant rome tempo sr2 tempest azure horse pliki barracuda2 www.gis cuba adslnat-curridabat-128 aw test13 box1 aaaa x2 exchbhlan3 sv6 disk enquete eta vm4 deep mx12 s111 budget arizona autodiscover.media ya webmin fisto orbit bean mail07 autoconfig.media berry jg www.money store1 sydney kraken author diablo wwwww word www.gmail www.tienda samp golden travian www.cat www.biz 54 demo10 bambi ivanovo big5 egitim he unregistered.zmc amanda orchid kit rmr1 richard offer edge1 germany tristan seguro kyc maths columbia steven wings www.sg ns38 grand tver natasha r3 www.tour pdns m11 dweb nurse dsp www.market meme www.food moda ns44 mps jgdw m.stage bdsm mech rosa sx tardis domreg eugene home2 vpn01 scott excel lyncdiscoverinternal ncs pagos recovery bastion wwwx spectre static.origin quizadmin www.abc ulyanovsk test-www deneb www.learn nagano bronx ils mother defender stavropol g3 lol nf caldera cfd185 tommy think thebest girls consulting owl newsroom us.m hpc ss1 dist valentine 9 pumpkin queens watchdog serv1 web07 pmo gsm spam1 geoip test03 ftp.forum server19 www.update tac vlad saprouter lions lider zion c6 palm ukr amsterdam html5 wd estadisticas blast phys rsm 70 vvv kris agro msn-smtp-out labor universal gapps futbol baltimore wt avto workshop www.ufa boom autodiscover.jobs unknown alliance www.svn duke kita tic killer ip176-194 millenium garfield assets2 auctions point russian suzuki clinic lyncedge www.tr la2 oldwebmail shipping informatica age gfx ipsec lina autoconfig.jobs zoo splunk sy urban fornax www.dating clock balder steam ut zz washington lightning fiona im2 enigma fdc zx sami eg cyclone acacia yb nps update2 loco discuss s50 kurgan smith plant lux www.kino www.extranet gas psychologie 01 s02 cy modem station www.reg zip boa www.co mx04 openerp bounces dodge paula meetings firmy web26 xz utm s40 panorama photon vas war marte gateway2 tss anton hirlevel winner fbapps vologda arcadia www.cc util 16 tyumen desire perl princess papa like matt sgs datacenter atlantic maine tech1 ias vintage linux1 gzs cip keith carpediem serv2 dreams front1 lyncaccess fh mailer2 www.chem natural student2 sailing radio1 models evo tcm bike bancuri baseball manuals img8 imap1 oldweb smtpgw pulsar reader will stream3 oliver mail15 lulu dyn bandwidth messaging us1 ibm idaho camping verify seg vs1 autodiscover.sms blade1 blade2 leda mail17 horo testdrive diet www.start mp1 claims te gcc www.whois nieuwsbrief xeon eternity greetings data2 asf autoconfig.sms kemerovo olga haha ecc prestashop rps img0 olimp biotech qa1 swan bsd webdisk.sandbox sanantonio dental www.acc zmail statics ns102 39 idb h5 connect2 jd christian luxury ten bbtest blogtest self www.green forumtest olive www.lab ns63 freebies ns64 www.g jake www.plus ejournal letter works peach spoon sie lx aol baobab tv2 edge2 sign webdisk.help www.mobi php5 webdata award gf rg lily ricky pico nod32 opus sandiego emploi sfa application comment autodiscover.search www.se recherche africa webdisk.members multi wood xx fan reverse missouri zinc brutus lolo imap2 www.windows aaron webdisk.wordpress create bis aps xp outlet www.cpanel bloom 6 ni www.vestibular webdisk.billing roman myshop joyce qb walter www.hr fisher daily webdisk.files michelle musik sic taiwan jewel inbound trio mts dog mustang specials www.forms crew tes www.med elib testes richmond autodiscover.travel mccoy aquila www.saratov bts hornet election test22 kaliningrad listes tx webdisk.travel onepiece bryan saas opel florence blacklist skin workspace theta notebook freddy elmo www.webdesign autoconfig.travel sql3 faith cody nuke memphis chrome douglas www24 autoconfig.search www.analytics forge gloria harry birmingham zebra www.123 laguna lamour igor brs polar lancaster webdisk.portal autoconfig.img autodiscover.img other www19 srs gala crown v5 fbl sherlock remedy gw-ndh mushroom mysql8 sv5 csp marathon kent critical dls capricorn standby test15 www.portfolio savannah img13 veritas move rating sound zephyr download1 www.ticket exchange-imap.its b5 andrea dds epm banana smartphone nicolas phpadmin www.subscribe prototype experts mgk newforum result www.prueba cbf2 s114 spp trident mirror2 s112 sonia nnov www.china alabama photogallery blackjack lex hathor inc xmas tulip and common-sw1 betty vo www.msk pc2 schools s102 pittsburgh s101 rw ozone common-sw2 ragnarok venezuela ntp0 osaka wx the www.register wh common-sw privacy promos prov2 c.ns 88 oyun alexandria second router-b kentucky nickel www.physics wsb bruce www.connect cc1 www.history bert graphite nina ck kq cmts1-all.gw mickey goods was ramses teach on helen mng dotnet amir ptc nucleus prm pogoda frontend rails liga outgoing thumbnails ins ggg listen scs dark sav redaktion viewer files1 parker shib chandra mapa cartoon admin.test mad mail25 webdisk.www2 crossroads webserver2 www.file da2 gratis upd momo lost vps5 chelsea ironman hive gadget cfd307 alan sm1 kansas stat2 morpheus mail18 bleach joy solomon imgup-lb jk hammer ea honda omar trust nino img9 webmasters mona imaps www.backup wsp registro cooper uniform q3 betav2 magellan ris poetry clio metropolis teen phonebook app5 www.bank brilliant underground hero s51 amber www.f orlando autodiscover.wp server21 autoconfig.games pop1 sean autoconfig.wp forever ism www.studio app4 yum fermat demosite sea celebrity autodiscover.games testadmin les www.realestate demo01 msm mediacenter jxjy holidays ahmed stlouis bilbo coupang4 fb12 wlan-switch 21 offsite fluffy joker arcade cielo 17 server16 mss wonder smolensk dg esc w8 www.aa none breeze nba toys fakalipit-mbp.cit nss gen tmg www.perm fishing ldapauth cup dhl www.join eps dove tuning conference.jabber liste smtptest webstat www.beauty files3 resolver1 revolution jacksonville www.aff pv webdisk.tv ia fog mason odessa www.kb webdisk.newsletter im1 iweb tower memo emperor financial stm newwww chel supernova c8 rai hannibal lava www.manager caesar ssb www.az ftp7 itunes julia worldcup whatever alpha1 tablet grad tony 14 18 memory jeu anuncios smtp11 colocation clean anh crash ppm www.ct www.cards sti est goat sg1 etherpad 37 aplicaciones www.webinar thai iceman mass hqjt region itech 1234 demo11 www.ic orenburg cron autoconfig.info autodiscover.info reset amis optimus electra bitrix bolt mrs look thanatos wowza istanbul www.banners https timesheet www.s2 ibs lupus nutrition return www.ph s36 www.ir projetos america cirrus tax trash msc cep www.control da1 api-test www.bt adams xserve www.dealer orient retro www.krasnodar your anderson www.internet gts hits pat payroll oblivion notice andre dany portland applications mailin11mx www.google nr photography xxxx concept masters c.ns.email startrek mailin10mx l2 host11 alpha2 vmailin02mx cic d.ns.email pomoc melon provisioning gx2 egov ranger pod csr41.net otto pj godzilla www.house mgw web30 mail.demo spc univer eweb beacon merchant exclusive sensor imagens bu pathfinder oops tnt srv11 mage fernando urchin detroit cetus daemon irk seneca summit chimera nadia disney crane cleo sahara cartman b.mx hls px warren spam2 scooter mailin13mx e.ns.email smarthost tlc vmailin01mx mailin16mx onix kite jeep www.internal www.b ax torrents mailin15mx mailserver1 totem anh-mobileth ttc polo w10 otp mailin14mx ojs ksp webdisk.apps kyoto university academico pension www.remote cast ns91 mailin12mx www.h cbs facilities ads1 ns92 publisher lunar esd trip sac ot william serwis stk oj dragonfly b.ns.email a.ns.email dsa advertise s45 yz www.lists resume t3 s47 redesign toy pelican popgate www.ap plasma rocket patty srv8 pizza dmt asd srv7 bulgaria svn2 drivers ventas www.pc animation monica santiago tucson mary wm2 salem linda tamil armstrong 79 norman quartz scheduler socrates regist server24 campusvirtual ip4 alien www.dev3 www.vps ip1 misc capella www.mike www.pruebas sion testdb nat2 www.am anc mapas zombie cac nikita freestyle dude rail rea ran s103 s104 sarah webm mazda claire esx4 mail22 paste hy s106 nh elara mail23 vod2 autodiscover.projects lineage s107 f.ns.email egw apollon s108 s109 cyrus recruiter autoconfig.projects mahara chopin fat emp titanium www.bip chili cumulus blues u2 iam donna delivery.swid amy campaigns wstest cms3 webeoc basic uag vip3 xl roberto karriere pirates helpme economy www.moto www.corp nirvana 35 iklan commercial rooster cbf7 bkp ns53 webdisk.iphone canon test.www www.super dts gforge jam adtest cedar wns1 superman autoconfig.facebook ns66 esx tv1 karta chile dotproject ted usuarios relaunch ismtp 49 israel www.click s110 www.st www.teste images.a official autodiscover.facebook hentai bss dali sparky www.car cosmo emm digit landmark crs s208 www.com voipa075 voipa019 standard myworld brasil voipa062 megatron voipa04a groupwise voipa07e ns72 byron voipa03f img02 voipa029 amos voipa079 s125 voipa04d bam voipa017 ns58 voipa03d s124 voipa03c colossus oregon filemaker amethyst wp1 webdisk.member voipa03a projekt opa n1.eu.cdn www-origin tattoo driver voipa038 rdns1 s121 voipa031 voipa035 voipa02f solution freehost s119 mx20 robert s116 queen www.magazin acesso voipa040 riot temp2 voipa05e www.sale www.praca voipa039 taylor www.bm grs aruba-master voipa047 s113 yoyo flora www.voronezh verdi yc euler pooh voipa02e gy smtp8 voipa02d voipa02c iec 114 voipa037 quest mail30 www.vpn j2 mail26 voipa02a origen-www server17 voip1 ws4 voipa04c voipa036 browser j1 voipa073 release voipa072 s105 voipa048 voipa071 mail16 koala server23 voipa01f srilanka voipa04e soma ws-lon-oauth1 voipa01d voipa049 voipa04f f4 blitz cine host8 voipa05a zb voipa060 eportal voipa034 h6 voipa033 voipa032 digi voipa030 service3 joshua carlos projets kitty cloud9 mailinglist moonlight webdisk.link voipa05b www25 ina discount irc.sac voipa028 csa stories voipa05c parfum voipa06a voipa01c www.local voipa01b voipa06c voipa027 nag www.sl robin.exseed voipa06d voipa06e voipa026 voipa06f www.magazine wis voipa07a voipa025 benny rcs minsk voipa064 vps7 stash image3 noc2 www.canada smi voipa059 voipa065 webdisk.classifieds note voipa024 maggie planetarium luis voipa01a socialmedia voipa023 sweet rmt cmt serena collaboration ftpmini esxi www.advertising webadvisor m.demo psychology graphs ly ppa voipa063 networks s48 pub2 power2 greece xoap sib carla voipa061 rts voipa058 branch mediawiki clark twin b4 web25 pty11165b lighthouse voipa066 voipa057 webmeeting brian ircip www.conference web27 ocsp uranium autodiscover.billing marley correoweb fc2 fiesta velocity sanatate ac2 dentist u1 techsupport endpoint vestibular voipa022 clone frontpage www.turystyka samuel aws-smail gabriel bookings webdisk.stage b7 enroll wmt anonymous ali yukon gw.bnsc wikitest bv tutorial zaphod voipa056 voipa067 maint voipa01e tau voipa055 ren atl nat-pool voipa021 voipa054 turystyka voipa020 comic voipa053 voipa052 infonet she as400 autoconfig.billing voipa070 babylon voipa018 lee www.trade badger nospam srv12 www.kr chase srvc67 icc moderator stark voipa074 mail-2 henry m-test oud vincent lyra skinner guard sphere balance voipa016 lara srvc52 dogs voipa051 voipa02b antonio silicon srvc47 olympic kings activesync triumph www.freedom lena solarwinds voipa015 xerox voipa014 riverside gx4 cdb to voipa013 vault fisheye tron 29 chevrolet square srvc42 bbs1 dollar adnet voipa012 voipa011 south ccm hamilton srvc57 prepaid voipa010 kairos intel login2 creditcard eportfolio rproxy alfred sce nat1 riga blogdev voipa076 itchy newsletter2 voipa041 gx3 gx1 www.tmp voipa050 romeo nara legolas pol ical christmas webmailtest vw voipa07b portals envios sandbox2 amateur autoconfig.www2 voipa07c voipa077 emily umwelt shops starnet www.mc elena s03 bnet srvc62 lazarus daphne www.investor autodiscover.www2 voipa042 illusion ah newlife www.th equinox www.agent tz milano presence autoconfig.tv voipa078 novi pretty basil dcs agencias voipa03b venom erato ata voipa03e sipac programs myftp testdns gray autodiscover.tv horde hideip-uk d.ns manuel www.adv voipa046 thailand www.women arnold demo12 styles frost voipa04b therapists apc2 hugo epp gal gin wlc autodiscover.members nevis mart voipa045 nitrogen autoconfig.members lxy zone voipa068 s201 ibook aprisostg validation voipa043 tpm www.tula bluebird www.access 0 voipa069 death 8 justin www.innovation faust www.banner www.md gals staging.secure int.www int.api pn www.share mylife ipod piano wns2 pulse voipa05d ltx voipa07f lj jwxt 19 klm voipa05f cie voipa044 c7 voipa06b 1000 smtp12 liquid collector jokes evasys emailmarketing voipa07d royal observium node3 vis iks www.affiliate inferno drac bella ieee fran comp warszawa async stl wpb nagios2 linkedin mars2 kei geography www.david apolo razor infinite lucifer w9 48 bgs tzb dennis cs3 sls fhg qs gina boris hps randy catalyst random www.soccer con ani players troll ruben amg immigration vanessa synapse izhevsk hikari pri bryansk lw calcium gsc nashville nor pskov chita img11 turtle philadelphia scoreboard loghost redes ws01 prov akira uy malaysia lovely bond yuri prism jun goldfish brandon steel www.review ora ami corpmail demo9 romance www.sex www.track mmp fk mentor butterfly communications nao www.talk mem short www.anunturi mssql3 s53 jennifer tito stitch www.ss ods bigbang www.intra sdo moa streams kav room gastro mat barbara epo morris jabba dl3 peace win6 bologna alpine benjamin experience mtg srv9 www.ecommerce indian wilma photoshop teens er www.e pine mortgage espace wish ob darkstar winwin nx cam3 dota b12 color marie www.happy server27 architecture okinawa jess itest ns48 xj fine admins flux basket profiler athens nest bison roadrunner mobileapp neko img170 charity file2 apptest showroom lima www.gry zoe arrakis rss0 howto aikido vps6 operator rv sasuke modules sniper www.pm armani webdisk.dev2 sms1 www.wm ddd vtiger yam employment sir paintball proj mgt soso aldebaran bim loto ron xml2 oslo pic2 snap msdnaa promotions devadmin alta-gsw viajes ram agents bash memberpbp api3 taxi frontier yuyu 34 reading vm02 venture beheer hz tf sierra-db hulk plugin ns05 www.science samson espanol arsenal cpanel2 vadim lord trend brest lesbian avs empresas xavier flamingo nas3 alive cname jss amd terminator newworld cpe professional visit www.ee spm presta yellowpages block rosemary ns65 goblin educ piter crow zenith 46 sabrina voip2 jet img14 nebraska i0 adidas afrodita i6 gimli bara treehouse solid 51 valiant vm5 michigan embed limesurvey sc2 rossi www.friends xoxo meetingplace god www.family s122 img03 licensing petra s118 www.traffic www.ford s117 see trunk mystery www.golf s115 mail19 els mail33 crimea x3 informer publicidad www.clientes birthday livesupport trance www.biblioteca mail24 ms3 bbm lcs abraham jonas stephanie salam sws www.tm juan rage battle rdc timeclock kat dna bit force winnie liverpool static5 beaker lit service2 spica advertiser salon yo fichiers prov1 ecards autodiscover.wordpress publishing captcha podcasts org-www orc uploader web33 ek-cat6506-gw krang dani fotografia orb sitesearch livestats www.ro pantera www.ac autoconfig.wordpress milan classes neutron dcms www30 beethoven mail36 accommodation macbook ap2 testa webprint dewey crmdev qc society psycho jacob knowledgebase vg cem s221 s216 raovat tara lea observer andrei elsa css1 chs homepage www.ec aloha spartan cs16 zdrowie dual spin iis ec2 trace compare photo2 ica badboy gourmet obsidian cpc mode april yuki onlineshop www.volgograd umfrage admin.dev siteadmin phptest som mani atendimento pagerank olivier www.gay fbapp www.redmine o2.email newdesign s207 ssd suppliers helsinki cheese test19 www.as s203 27 autodiscover.radio ne financeiro www.sp autoconfig.radio phpmyadmin2 saransk tyr vic cluster2 dev6 xs bliss 60 tatiana mature babel 26 xinli pustaka mydesktop www.n carter 22 kobe testing2 my2 90 explorer wy ftp9 aovivo army dx kiki phoebe clasificados survey2 ravi origin-cdn dial www.legacy ftp8 wz www-c nws s202 80 bgr01swd voltage-pp-0000 itm im.rtpete 23 assets1 johnny street dev7 ban ip-uk weightloss lpm iraq paradox fermi vino oban test14 musa perpustakaan radius3 rtpeteim game2 pro-oh regions hcm.m dns10 smx mans tns pozycjonowanie gonghui muller nick church services2 hana imperial porno hama showcase sputnik www.stock skywalker www.tomsk storefront crater chan localhost.m chloe pharm pavel national barcelona silvia remoteaccess webdisk.seo srv02 jt recim alc fear aulavirtual prog timer kana cardinal hn.m m12 timetable dev.www maxi cyan www.customer ids1 ric lucas ganesh mik member1 31 mali noel ero pack dba reza papillon kps politics s222 navigator host12 designs car40.net elc lp3 sta csr21.arch pallas nostromo carl nlp terry cmts2-all.gw pyramid monk keeper magpie spike wolves consumer jay mediakit topics infosys lolita www.pozycjonowanie pr1 oldftp ritz www-1 pastebin nowy poland tds rami mami mybook topsites statistic 66 gomez pamela listings only webdisk.my speak kl-cat4900-gw media3 original admintest preview2 game1 videoconferencia academic vdp autoconfig.iphone teachers flame my1 newage mx05 sofa www.smart dwcloudorigin autodiscover.iphone www.templates sorigin tama cde c21 fw01 ross onlinegames cfd264 sell teddy bos ftp.cp edwin mapsorigin sync1 fbm cshm-sbsc01.v10.csngok.ok warez wwworigin dwiorigin www.mob wxdataorigin justice maporigin morigin lira old1 kbox legion klub hurricane fcgi may xxxxx golestan dworigin torigin nvpgk1 dataorigin sed mp2 www.islam nvpgk filter2 mandarin staging.www mwiorigin tl soon omni www.adm lc1 anders icinga wawa questionnaire dynamics bia www.km kf cognos pmb sslorigin jana nw1 fedora www.devel myportal gromit www.finance today prelive kermit p5 s219 lancelot jura cyc epi s206 penelope newdev detox simba www26 www.wedding wisconsin philippines fad girl www.novo apps3 stb consulta dingo cmail 67 saba fairy bluemoon auth1 athos guia songs siam novelty tera www.eshop s205 clarity pdu1 elias lawrence sds web0 srv20 fireball www.list sv8 s100 cambridge mission kamera atest ns69 rtpqaim fair c-asa5580-v03-01.rz s42 beyond demoshop horoscope puck egroupware 40 sup sv7 three option ozzy mail06 mhs pasca wps 53 postit wii smf spitfire cstrike utopia vm01 vi dms1 52 citrix2 mxbackup vm6 zeon s126 classroom webalizer halo s131 illiad s133 archivio s134 cns belgorod ldapclient klient batch fabio s211 s214 phaim22 sfs giporigin s215 melissa s213 s120 abel cow y2k s130 gem goliath demo15 tang ftpserver www.kaluga kia clips ham silence quad webinfo plugins www.article volvo mb1 cris ayuda kingdom juegos ns82 i10 autodiscover.portal autoconfig.portal ts01 ns81 caramel zc circle ipplan automation rob twister poznan c9 moskva ns71 redhat secured rr1 morgan str academia researcher ns59 muse www.monitoring mei ns56 meridian wendy ns46 brains bla autoconfig.sandbox traf autodiscover.sandbox vma nieruchomosci simpsons ark dbase bulldog lyon kkk design2 sequoia centro pro-ky eternal www.kids jasmin tyb newspaper rtpclientim argentina www.net nancy ajuda bosch vpnc magnitogorsk colombia cws mee convergence tech2 scully deneme rudy cab day monalisa blade7 galeri acer qwerty as.iso hsp proof 3c www.gs host01 indy paolo ns49 blade5 harris gw4 select webdisk.reseller weber wxy dictionary dmedia-g info1 verify.apple sandra b2btest pic1 strong suny clientftp sml emba www.allegro tmc galadriel sun1 gary medios andromede statistiche mail.99 eat cdn4 vps8 sloth ray electro oms archangel www.s3 im.rtpqa bible www.alpha lovers economics sma electric ip2 nene planner nw anita www.ws homolog myown rtpim firewallix traveller bulletin www.demo1 benchmark whisper ann greg host25 marshall spiderman crowd sprite tot harvey trs gtest shuttle modern judas backstage deti sterling ss2 coconut xlzx win13 scarlet www.sistemas ebs argus lh maryland yn server29 relay4 sexshop futaba historia b11 b10 markets xc www.av santafe usedcars presentation cpm norway bcs krishna castle rewards alexa sonata formation www.assets radon zelda autoconfig.loja wyoming fate panel2 imap3 cm2 autodiscover.gallery mssqladmin autoconfig.gallery www.gps autodiscover.loja smtp9 wakeup d5 independent julie stiri selenium www.archives platform daisuke dc3 ernesto www.ps fes www.pb d9 porn atomic www.correo chatter rbs emto277627 tdb milwaukee tintin www.cl astral lottery paint comments thegame foryou truba mozilla borg node vps9 worker wiki2 outdoor monaco mimosa sid body stardust devserver egresados seagull server44 webdisk.host cp3 swansea.cit chicken api.test server03 mssql4 lucia nfc vs2 vale imss s41 s43 projekty picasso blossom eleven taobao papyrus pharma laila autodiscover.it evans ngs failover rajesh profit enlace podarok amira louis reboot planeta owner www.blackberry response server30 pil del geyser mtc vanguard cec blackcat prezenty clubs yun primus www.2012 apollo2 www.corporate dubai devapi finanse autoconfig.music autodiscover.music phenix madison tambov bcc vpnssl wp2 www.hc webdisk.music mambo www.r www.europe roy apartment www.memberpbp hod server41 mugen primula goodlife server25 evil idp2 www.memberall b15 mx9 memberall blade3 www.pic unreal b13 112 acp haru mailservice no1 www.irc tpl weekly webmail.forum testapi ironport2 free2 brothers blade6 bayern daedalus cincinnati www.aurora wi avon nmc season zorro www.at fruit mx-1 magneto atmail wicked webmail4 sanfrancisco www.central surgut adwords esl salah cmp mania mebel aviator chennai ser tccgalleries blogg jj jh smtp04 www.op www.tracker gui.m someone imac tanya drew ns112 kai andrey ion plum aplus weekend baker ews qp moodle1 theater www.phoenix educacion parser limbo mak ns54 profil arg freemail ns57 42 shara opal www.css mil storex download3 www.apple nil mssql1 records v6 vine ecuador webdisk.health webdisk.social bones popup i24 philosophy barry amadeus www.yaroslavl bluebell 45 smtp13 www.tutorial drop www.cars ud sql02 smtp14 www.meteo viktor taz www.calendar partner2 h7 twilight bat emo realtime demo13 sasha toshiba deli mq www.todo adel 47 drake info2 mktg webzone certificate s212 themis newchat s218 s217 music1 yoyaku shibboleth s139 gordon i7 employee havoc cs01 lb01 s138 blueberry mobile3 adelaide s137 i8 s136 i9 s135 webdisk.it ptt zippy camp fnc m2m s132 gaming darius lapis netstorage s129 www.singapore hunting maker win9 ssh2 north label cjc oneway kuba sapporo lin full bodybuilding www.phpmyadmin popular voodoo portal3 wildcat lucius project2 sumire mn testm britney magma bilder asian an s58 www.cinema passion vds1 sklad eform devdb www.test4 61 www.like s224 andres sunflower update1 gbs basij pavlov fancy locator bmail thalia tip kaiser dsc sv9 success invite wellbeing emailadmin ldap01 srv21 mstage www.booking xen3 asg strike unique titus uran led webdisk.us 69 juniper shams repos cerbere www.tracking wwwstg hair sulu file1 www.australia opsview origin-static appdev www.open bursa net1 weddings www.org s210 just4fun halley s144 jimmy wanda test1234 s143 s209 ipac webview gcs amazing pubs demon utah gls hertz www.wwww sipinternal lua www.exchange myblog pic3 happylife xiaobao knight papercut timothy rns1 77 shin primrose dep administrator filer2 sharon kayako redaccion tsunami belle pokemon sleep mail40 apl srv10 environment adc avedge top10 saint svm sonar butters warning used jeux chouchou www.learning long firewall2 demo02 credito wallpaper aeon billing2 anal ns-2 furniture titania elmer wwu autodiscover.files karaoke glory autoconfig.files deai gamez cristal sgm gates gregory acorn rice venice kid fiat geek mail27 media4 afp servicetest pje adp www.hn seminars sql01 b6 sama remax vortex sharing mox vince pts rrr mimi mca concours hehe web28 phi pirate trent bpa js1 xszz pipe glacier bacchus puffin webim chatbox charles element www.students sana ibrahim apidev nnn webcache autodiscover.help lili autoconfig.help shaman s227 remont lexus ftp.demo www.pomoc qm eddy 32 absolute kan espresso indra mweb rama colibri anti a8 windowsupdate inspire cmstest rive now nini annunci elrond heron lineage2 kenzo feng envy abc123 personel rides d8 lust 360 karim sims nats nash alumnos stop bk1 obiwan www.feeds arquivos store2 www.futbol lexington hardy infocenter pxe edu2 evaluation www.foro trading tiny www.biznes autodiscover.helpdesk larry muzik autoconfig.client volleyball kultura eman autoconfig.download autodiscover.download itadmin ultra1 yamaha 57 must newman 63 mail-gw autodiscover.client bbs2 topsite workplace mari mailgate1 mysql10 publications ka devsite report1 student3 yy autoconfig.helpdesk www.ww lang masaki costarica set labo oriflame www.noticias devwww 30 www.festival tpc net-xb.ohx features bgp www.georgia webdisk.loja www.kaliningrad azerty www.chelyabinsk novgorod camfrog dig anyserver hiroshima zend www.sites carrie 76 olap dc4 binary www.24 colors mynet salary judo webdisk.tickets gravity webdisk.design aviation rst 94 boxer hilbert herbalife carrier 64 nexgen intranet1 willie api.staging siena doom record admin.m l2tp mail.dev ariadne www.transport alaa area51 webmail.demo www.reviews cantor webdisk.links autoconfig.member test17 autodiscover.member s05 mail250 gateway1 smb web29 scrubs transit chewbacca web34 koha properties tori vc2 mail37 mail38 css2 mail39 foxtrot printing bigben neworleans www.dms vns teams writers cmdb muenchen oldforum 111 libweb esx5 benefits www.asia scl pws esx6 28 gutenberg django caldav var tracker2 mov lumiere tracker1 33 manhattan kaku maga kumi kesc-vpn dns9 kelvin insider www.car-line mastermind sw2 ns80 wildersol1 dns14 ns75 avasin dns.class webdisk.server handy ns68 ns67 seco trinidad puppetmaster immobilien regina nantes wm1 ns47 41 citrix1 citron zw dialog ns90 ns111 bomgar www.doc discountfinder lb02 tao psg www.website resim www.sm resolver2 ns120 wwb 101 patriot portugal porsche treinamento ns110 marilyn l2tp-uk aladin zim sophie francisco quebec depot1 msw onlyyou thu parrot www.ces interior wins hh sr1 ll tf2 tallow.cit sv10 bigmac lock ri vtest www.products mus bewerbung www.international moc tata srm-atlas-2.gridpp bane wwwc cfg building linux.pp dev-api printserver autodiscover.online autoconfig.online gw.pp pierre cnr pressroom cox fmc amin vtp.data anis srm-atlas.gridpp dhs legacymail ws6 fig devel2 dia maximus heritage smoke lo.vip 163 santa popeye prefs.vip asc s04 lingua amc 203 dnsadmin jsj s66 www.toko etoile s49 trafic circus orientation www.im lsg harold 666 email3 virtual1 ww8 rs3 server33 server28 ii dialer eds isatap npc creditbank perfume garden cream kuku florian phy icq.jabber pop3s snort tiki right lounge great www.best kato slc wj www.delivery.a mind cover or adx pasteur chitchat inspiration kanji hari ideal socrate mc2 winchester www.sanatate www.bancuri chen galois sgd recipe countdown editorial hitech 365 field retracker strider fleur isaac signin testcms cbc s140 marwan bobo eda contribute www.directorio moldova www.gift kura s226 dolly psa volunteer relatorio draft iowa s127 s128 maat canary norton s141 www.resources s142 backup5 xbox360 s156 s225 diego www.order s220 thayer sacramento gap nac kassa xbox user1 nm2 misty carina ethics sundance person charm confirm value infoweb reportes diane atenea serene www.omsk asdfg oral cmd adobe ahmad irving theia www.vladivostok m19 fatima millennium avenger freechat webdemo movie2 anand www.sub franky cleaning arhangelsk artem barcode blink orion2 euterpe wfa encuesta walking capa ape ayoub sftp3 danny xa squirrel gwmail coins servis kd webhard scylla coleman weblink doris drama apc4 wip mistral prisma elisa outage kangaroo mpr term hakim concord pear emailing running s230 scrapbook caroline distance www.sf flight ecampus host10 www.la airport viola cbt www.dp www.ci nds ill ids2 catering user2 up1 up2 www.pliki impulse theseus mcafee flc lvs2 myphp for forums2 phillip master1 saturno cowboy rebel burbank lenta wellington icarus www.football midnight mafia lis cosign whiterose calliope penny geology webdisk.api mamba mit ole joseph rcp subscriptions mfs racoon maroc fg gra tsgw spravka sda cai abacus freegift delicious mail-old titanic www03 igra uno plm clc eko umbrella cpan prod2 cdl pebbles globe nightlife helper champions joel li yumi tuanwei flirt scholar jon angela recette rahul potato hlrdap app6 tree baku per superstar tops eu.edge bcm adminmail autoconfig.classifieds nec managed autodiscover.classifieds ronny rover ttalk valentina boletines ithelp ida edoc partenaires restore punk excellent owen www.premium tcc www.2011 emmy remotesupport gama bulkmail md1 gera mailout2 rbl db0 alta osc testdomain email1 nasa mika redwood agata voltage-ps-0000 willy srv13 www.phone leaf sga nitro webdb b16 santabarbara issue env pma2 erwin kungfu cadillac antony sfx fury calls typo www.js restaurant cheers ait sirsi dust elec esther webcom www.suporte activation cassini dots sally spacewalk selfcare pia ocelot fic cute proxy5 ps1 dice www.cm ek archiwum nguyen webdisk.archive cel virginia webmailx www.mail2 repositorio krypton ftp.new urano whitelabel pure mundo walnut trillian mail32 billy sof friendship tlt mail09 webcam1 st4 nico muzica www.card policy anon mia remix aviva laplace dos shs shout fsproxyhn.kis inscription hsl mypc paco extend www.mysql icms magnum sp4 fsproxyst.kis bcst-xb.ohx sebastian mobiletest mrm ies campus2 rtr-xb.ohx itservicedesk spss villa epost reports2 zozo tomo miracle ultimate proxy4 www.cultura senator cdr werbung chelyabinsk-rnoc-rr02.backbone.urc.ac.ru www.moda rosetta smhecpsc01-v60.ok f6 hrms assets3 oas pgsql2 pgsql1 hell star2 dprhensimmta nothing ffm xq www.manage jin www.do rohan mx8 canoe www.dc eclass hotthiscodecs kn codecsworld megamediadm symphony kea bestmediafiles enjoymediafile easymediadm devblog www.cf livedigitaldownloads downloadmediadm admin01 allstar bestlivecodecs www.ls lib2 s52 time2 www.security pow searchdigitalcodecs teaching siri thezone findfreecodecs bestdigitalcodecs luggage cu jj-cat4900-gw www.realty txt enjoythiscodecs honeymoon www.tourism tomato www.computer findmymediafiles newmediacodecs hj-cat4900-gw mydigitalcodecs flat optima asso ariane pie tuna gtm1 mediacodecsworld aurelia nestor fastprodownloads srm freedigitalcodecs delivery.platform sgr megamediadownloads copyright timon ldc languages fundraising fastmediadm vidar getthiscodecs linux3 py gis1 webdisk.office livepromanager networking silica fastdigitaldownloads newdigitalcodecs mythiscodecs skype dod rrd azalea backupmx weibo superprodownloads fukuoka webdisk.x practice muffin mystic www.germany xerxes globus freedownload als assistance lada freemediadownloads gsk wha www.vietnam downloaddigitaldownloads fastmediamanager livedigitaldm gaston megaprodownloads internship liveprocodecs arte megadigitalmanager downloadpromanager meg sow cherokee easydigitaldm freemediadm easymediamanager supervision varnish hn.ipad ressources paiement slm livemediacodecs thethiscodecs sql4 chum 1trmst2hn www.post vlg www.erp www.bd times newdigitalmanager dddd irina deer leech newprocodecs laser www.orders lukasz gan nascar ceo dataservices access2 control2 esf searchmediafilesinc joke getmediacodecs themediacodecs freehdcodecs sifa ringo thenewcodecs freeprodownloads finddigitalcodecs back2 tolkien puskom stage1 bestfreecodecs supermediamanager freedigitalmanager sudan www.zdrowie mendel ico digilib apunts2 js.hindi hospitality vod3 newprodm enet www.laptop hostel jing www.e-learning joan megamediamanager tibia searchlivecodecs b14 www.insurance pesquisa mymediacodecs boo liveprodownloads juli newmediadownloads bestmediafilesinc freeprodm gotcha searchmediafiles lien dreamteam lilo wsc sysmon rbt resolver loli www.mt staf garant findthiscodecs clienti way fastprodm pronto champion terms data3 www.global pr2 callback sede erbium madmax ku nono pkg formula1 vodafone www.11 evision cp01 cosme darkness www.kursk opportunity webdisk.joomla www.zabbix raja dumbo sogo xfiles antispam2 clover freemediamanager webdisk.blogs autoconfig.blogs marcopolo autodiscover.blogs sierra filer dana happiness webconnect icp www.zp shanti superdigitaldm mynewcodecs www.notes webapi easyprodm webconference astrahan taos promociones supermediadownloads www-staging dickson livemediamanager newdigitaldm kostroma 777 jpk ldap-test megadigitaldm logan airsoft fastmediacodecs teal ipam advanced app7 switch2 hidden united underdog yaya www.system pwa lib1 finder yoga lz www.podcast hobbes hani findmymediafileinc york bars www.fx skoda mysql02 nueva tyler pdm wander ns00 fastdigitaldm valencia dar mns easypromanager www.afisha megapromanager fastprocodecs superdigitalmanager synd wes surabaya comcast demo14 bestmediafileinc mouse profesionales xgb real-estate tad rl recreation www.cz dmc bestdeal fastpromanager frey eldorado pepsi dmg oldman merak www.planet raw livedigitalcodecs marta findmediafileinc megadigitaldownloads sft findmediafilesinc hotlivecodecs www.musica mtn gondor spy www.dz pdb cracker www.digital downloadhdcodecs freepromanager warrior bestthiscodecs searchmediafileinc mailmx www.mini www.kiev kizuna enjoylivecodecs mmedia idefix searchmediacodecs rdg pigeon webdisk.testing searchfreecodecs eb enjoymediafilesinc fit telefon points pla eli freedigitaldownloads paranormal ms4 hotdigitalcodecs awa jesse enjoymediafiles limited sgw 12345 worldwide aga getlivecodecs www.gb www.he findnewcodecs easymediadownloads connection ns2.hosting gucci ns1.hosting www.rc mojo freya timeline signal met pmt uk2 www.expo hasan rambo eca mylivecodecs poisk fasthdcodecs s233 s236 apk menu skipper s237 twins s239 mgm eski grass starlight ns2b www.rent ismail echelon kitten bollywood enjoymediafileinc fastdigitalcodecs downloaddigitaldm downloadprocodecs motion pax lalala livemediadownloads jonathan arcturus www.poker s238 newshop bonjour accent win14 encore raphael downloadprodownloads tarik donkey findmediacodecs hudson freedigitaldm bauer newprodownloads safari advokat hotmediacodecs mfr bubba easydigitalmanager api-dev qa-partner-portal freeprocodecs ilearn livehdcodecs plusone newhdcodecs thelivecodecs brisbane midas newdigitaldownloads fantasia tas superprodm devon blaze findmediafile easydigitaldownloads downloaddigitalcodecs findmymediafile livedigitalmanager kw enq downloadmediamanager origami www.lipetsk mongo swallow emotion megaprodm qarvip am1 getdigitalcodecs www.star brother searchnewcodecs infotech performance newpromanager enjoymediacodecs honduras eowyn qa-verio-portal www.insight www.script proxy01 baron kif freemediacodecs jurnal google1 hotfreecodecs livemediadm cheboksary www.multimedia webapps2 win17 hannah www.rostov entrepreneurs www.mag tarot findlivecodecs rambler win16 iridium win18 www.al enjoyfreecodecs inform trackit asher www.sd secmail qa.legacy superpromanager mobiledev prod.tools prod.new www.newyork rejestracja enjoycodecs 132 searchthiscodecs ferry findcodecs cwcx findmediafiles susan www.dashboard insomnia hotnewcodecs ocadmin cfd bestnewcodecs coder porter superdigitaldownloads sep getfreecodecs blood bestmediacodecs supermediadm downloadmediadownloads theone kpi netman epic searchmediafile fastmediadownloads prospect matilda ronaldo enjoynewcodecs love1 myfreecodecs esxi03 shire esxi02 esxi01 old-www geronimo configurator downloadprodm www.zoo getnewcodecs pepito of fo wms1 newmediamanager island mensa challenger www.ds www.stiri findmymediafilesinc centre chaplin onlyone malcolm thedigitalcodecs easyprodownloads cra members3 members1 lookatme mailbackup test07 getcodecs downloadmediacodecs copper group4 ginza dsf concurso bright irc2 delhi ground sdp raspberry newmediadm legendary why karina ganesha liveprodm enjoydigitalcodecs d10 trevor tri bestmediafile czat bestcodecs azrael twinkle josh lvs1 laos downloaddigitalmanager spo thefreecodecs www.pos autodiscover.stage mta01-40-auultimo mta02-60-auultimo mta01-bpo-80-auultimo mta02-bpo-80-auultimo mta01-50-auultimo adriana mta02-70-auultimo dcm mta01-bpo-10-auultimo nts ip5 mta02-bpo-10-auultimo billing1 mta01-bpo-90-auultimo mta02-bpo-90-auultimo mta01-60-auultimo mta02-80-auultimo mta01-bpo-20-auultimo mta02-bpo-20-auultimo mta01-70-auultimo mta02-90-auultimo autoconfig.stage fastdigitalmanager citroen popcorn mta01-bpo-30-auultimo crm1 memberold mta02-bpo-30-auultimo mta02-20-auultimo mta01-80-auultimo mta01-bpo-40-auultimo intro iq mta02-bpo-40-auultimo mta01-10-auultimo mta02-30-auultimo rk mta01-90-auultimo mta02-10-auultimo mta01-bpo-50-auultimo mta02-bpo-50-auultimo vmc mobileapps www41 mta01-20-auultimo mta02-40-auultimo freeman nox mta01-bpo-60-auultimo mta02-bpo-60-auultimo adsense studios mta01-30-auultimo mta02-50-auultimo mta01-bpo-70-auultimo mta02-bpo-70-auultimo net2 ankiety baran kami kutuphane kk acl kmc smarty m.m s63 sh3 analysis asi capital hrd heracles webcalendar infra mks i75 servizi supra i74 zixvpm asetus1 i72 asetus3 mail.85st smtp-in asetus2 btc mail.shop marconi mrtg3 fleet montreal sm2 xyy www.christian esa ctp z3950 db8 www.vhs bscw jive scope cri szkolenia 85st aya smtpout2 organic bdc w0 minnesota rita illinois mada louisiana ito mail.eyny eyny ses cloud3 gs1 mie albatros dieta cisl-plaisir.cit exams albatross www.prod aims qaweb1 qaweb2 www.atlanta img10 hx ns100 logout tbs sif arthouse p7 vid www.pa unifi wtf geoportal blade4 monarch smithers dakota gladiator place krakow crm3 recipes adi ho aka ispace abyss archivo ns95 wina henri trixbox inv athletics edo cobbler newdemo morningstar 43 sava ulysse ns73 ns74 autodiscover.server autoconfig.server ns77 monet webdisk.site alchemy baobao his dns22 nida moms 120 nu ming dns21 terre monitor3 quark wcp mtv ns-1 ns-3 indus soho ucenter kdc www.www1 www.main i14 alexandre i12 iwww stable i11 min display webdisk.helpdesk ebuy vendors vmware tick ges tsa floyd madonna replay mail46 saa entrepreneur mail43 s38 aero aslan byte gerald www.webstore ftp12 whoson roa web31 giving mail08 spamd vconf axel news01 gems snmp sweden tsc acdc test20 aroma www.minecraft deborah bronze web101 domain3 insite shoptest sec1 login1 rochester hf sight www.openx apitest www.trk dispatch downloader supply mj secure5 65 pythagoras jr soulmate dump hao ns.forum www.myspace opencart resolve car40.eng www.4 hound peggy www27 www.3 webdisk.v2 reborn netra quasar zipcode moria akashi eoffice iportal rescue mail34 stream4 hamza seal btp surya ik tui achilles ibis bazar www.w instant imperia easter imagehost boleto office1 galerie ricardo complaints lark www.manual 87 cc2 exchange01 avg osprey backup01 daa serg 89 bor 91 www.fotografia diesel lynch kestrel www.ekaterinburg netbackup rafael webdev1 tunisie xvideos 71 fuck lens dominus anakin vhs iw mywebsite ukraina pyatigorsk 58 remoto ssl-vpn 56 screenshot worldmusic test18 domaincontrol test16 55 www.16 aras giovanni webdisk.development cca hussein www001 cdi rancid filetransfer andi autodiscover.reseller logistic gib beatles webdisk.sports snapshot autoconfig.business autodiscover.sports autoconfig.reseller hyouon32 val autodiscover.business autoconfig.sports sdf webdisk.business #www webdisk.fb shp winfm gorod vserver gss auriga mrb giant nix muonline webserver1 kunden www.ti ns99 spec jen hale designfd aldan sip3 test.m webdisk.hosting newcom monmon freeweb crm-dev backbone salad www.tester trc newport collaborate asp2 davis yang captain tintuc ns103 ns104 sd1 pmp artefact kss ns123 www.accounts stingray wwa ns121 tweb www.sip tees www.energy origin.fhg3 secureauth networld cxzy erasmus ottawa username origin.fhg origin.fhg2 maxx acrux emoney www61 web36 pusher nsm iloveyou takeoff pnd wwwt zeropia magnus mud autodiscover.us autoconfig.us psm corvus volans firme aris webdisk.wholesale im3 msx mail.tw kom builder.hosting essen zulu www.ak teknik www-spd bbc cam4 bap bay webdisk.online www.nieruchomosci aoa bhm poems tcl annonces moj www.bg gtm dct s4357 bibliotheque www.finanse www.prezenty eie ksi vu dnc ego cpp bugtrack avl aso porthos z1 paginasamarillas h14 204 handmade charts h12 afs s37 sa2 kanri costa hebe ssotest server45 msi server42 milo web32 clic stargazer pm1 web35 leia www.mms omg ooo zhaosheng nagi baki charger seer www.arm stan m.staging teleworker gis2 run tux flickr vin fds kane aquarium psn www.redirect love2 aramis jweb pmx convention vdc pele bangkok www.voip www.profiles webdisk.clients sentinelle hartford rwxy i19 edu1 c-asa5550-v03-03.rz sita osi c-asa5580-v03-02.rz autoconfig.director massive autodiscover.director www.biotech lenny ovh galactica idata tesco elma mayak esse massachusetts edmonton sv01 milton hapi hats naples ori virgil inmobiliarias midwest slice part belarus mysql11 mysql9 classificados brahms mailb purchasing channels i16 etech vod1 transparencia pdi i20 murakami windowsts hagrid juice hosts estate mxout bordeaux mico celular fotki audrey i23 marx terminalservices petrozavodsk plone www.fl nauka continuum i25 i26 i27 nomad b8 b9 eservice i28 webdisk.movil bsf parked correu joom quick poligon entest serv3 mailhost2 safein asus res1 redbox karate gzc mom mitchell loyalty gea sapi javier park2 park1 news3 s234 s229 s228 mail-1 shampoo rss2 courier asterisk2 zarzadzanie savenow toulouse s235 s231 emall s232 staging1 nagasaki prosper rideofthemonth hideki imedia www.groups plastics wetter bin aos-creative cs02 trailer mops investigacion ankieta livestreamfiold.videocdn angus uss sunday startup yuva windows2008r2 mid sharp webdisk.i simix radios sct ontime www.sh devmail www.tyumen www.10 www.ml 103 scrap mailex www-uat ekonomi aster bouncer fms1 isg wms2 www.mkt league srv15 www.comics dbserver musicman hosting01 off sparrow srv14 abhi www.fenix router-h strawberry swordfish windows7 lims frozen www.2013 ys superhero risk kansascity louisville flint www.v1 joanna epayment jesus hep carme gewinnspiel saturne gum gerard crypton 110 rsvp ans realestate2 autoconfig.archive ldap02 autodiscover.archive vs3 secureftp clothing sql5 www.ebooks bull www.group rocks seoul faxserver heineken ams2 webauth philippe mailboxes www.russia agile facturacion kimchi www.japan iran bck selena incoming scout tsm nigeria marble bom yara ns1.ha ns2.ha autoconfig.it www.florida galatea roku vip7 federation vaio bazaar www.mu mailserv marry sigrh wizzard cls www.ae topic www.by www.hi www.eventos webdisk.fr ipv4.forum www.ka xm webdisk.cn marks s64 chromakey s57 s56 poc hun bds www.sql newunse www.ok hammerfest-gsw verona underworld seti landscape trek certification hemera xw massage www.space ic-asa5520-vpn-fw cstest autoconfig.link 404 autodiscover.link toast www.15 gwia hector religion www.sk pc-cat4900-gw kj www.mailer yl piranha asap token ktv granada iws truck www.tt ebisu ssss ul-asa5520-vpn-fw www.europa autodiscover.seo arun reload higgs autoconfig.seo cgp windmill wotan rmail habarovsk promote bass www.zakaz www.msf ubs elektro vixen nsq path www.hawaii sylvester bbq noor laptops cottage lighting rina bang nona duck c11 travis protect nowhere akatsuki mura rac2 nimble kosmos crmtest ktc json magix sponsor freelance vip5 cci lbs sro kaitori mail31 winston skc socket shi sei top1 bono webmarketing toad sole fanclub cos pipeline ima www.fm copy karin techweb didi host9 b19 mci reda agriculture doit ip6 demo20 prosfores jpn vkontakte fake miguel boxoffice dung dbd aplikasi process sunil scp irene noir hanoi gigi yusuf autoconfig.newsletter shakira autodiscover.newsletter www.pms edc www.plan serve 125 jean temp1 filer1 pcgames metc assistenza make zcc vbulletin change ibanking backup4 vps102 submitimages awesome presto miel www.ea nada marcel imvu tn manado svs incom www.linux www.base string maurice oil oscommerce vivian lynn gundam goodtimes 123456 sword escape placement nuri kumar working xml-gw-host glow turner ginger nuovo brad shaggy yesterday rrhh dedi salt www.management vip8 sand uhspo scom iris2 masa dada www.eco hms nataly smart1 inb websvn personals sola twist suri punto ting wonderland akari vh genetics prophet www.invest www.master www.ksp mailsv www.journals marcos polit www.event srv24 ingenieria xsh grey bogota retete informa dracula a6 o1.mail www.bc mateo mylove provision dominios tvonline ccp vir xpress mgr murat demo16 demo18 pocket bulten www.crimea bumblebee abcde hanna lb3 cynthia snowflake nap se2 ibc bulksms beeline wa1 www.power www.rnd www.ma cathy master2 jeremy lsrp anything ps3 www.luna honolulu filter1 ege hellokitty acad swiss eschool ari mio slf ira raman mammoth ons jsp eroom smiles mail.de ramon jessica checkpoint dawn s153 lvs host13 kerio pin agnes globo garage box2 take star4 sparkle s190 rdm spotlight s176 cedric nut testaccount budapest frame unico tamara fas ignite zodiac stuart kasper webapps1 start2 ced cpn stp newyear beach varuna leap tigers hotmail web09 imaginary connections ss4 mein ehsan mssql5 sayac cbf4 goddess mailcheck scotty referat cecilia baco atelier online1 www.turismo weaver cbf5 marian s223 exchange1 dorado iserver barracuda1 prada streaming2 gisweb psd daffy musicbox ralph acid roland a7 shelly pikachu mailstore tecnologia advice s186 s167 astrology lm1 cocoa secrets miranda webstar alone awc younes crawler adele shamrock primavera ned webdisk.login autoconfig.login autodiscover.login cp5 spiral syktyvkar fuzzy jessie i90 makemoney telnet danger dollars proc as3 aaaaa industrial www.network webdisk.portfolio serv83 overflow www.kirov boron birds behzad faces webdisk.live tamer www-2 lilac devcms warranty mcq-indus-01.iutnb supreme hangman cancel mcq-projet-01.iutnb srv0 slash child geoweb nowa conrad webdisk.free indesign 86 sbe curtis myforum infra1 univ web4004 rune 81 duplo mail35 wam skins himalaya beatrice krs finland harrier fw02 perfect goose genealogy erik marriage heimdall autocad pony stranger hilda advisor 75 win15 kaizen ns150 regulus adler zakaria pay2 www.reports cpanel1 74 patricia i80 www28 www.kemerovo www.stud highway securelogin www.l insane inti 68 www.barnaul tomtom jedi speech filebox rdns3 noda integra elan kingkong akash www.irkutsk 62 seeker keyword log1 vtc www.report agape mara responsive wan ipv4.demo bca test23 96 moments amp www.12 www.travian escrow nights www.13 dev10 po2 ssh1 www.man w11 webdisk.upload www.20 surat toro go2 wassup pleiades conan alef caravan amjad smtp.mail www.smolensk canopus www.9 tsgateway colt 02 cpt www.mama redsun dac fdm cdn5 myip www.stavropol puertorico isc zhaopin www.esp turizm eticket assets4 thewall adserver2 img05 autodiscover.main win20 doi www.developer portale khorshid counters prs psc romans 222 oneclick cheap img165 neuron trigger secure10 nobel dakar www.dvd secure11 www.demo3 savebig taka sdns rhythm adagio www.property noproxy mrp sou paygate sailor #mail billpay itp volta hris sinope doodle drc xchange shield rdns hubble predator www.url turan murphy voting boletim collins progamers ns97 ns96 host03 pct watt orinoco sa1 secureweb pharos nota picnic eduardo congo ns78 ns76 aquamarine www44 sot padma mosaic hw x4 rocker fathi converter derek fullmoon rns2 persia t5 murray vps104 bsm util01 barbados essence main2 pcworld tis mailsvr kirakira amigo ns79 smash cassiopeia fairytale ns105 jnp www.puzzle mulberry solusvm bfm ns117 mclaren mx13 ns122 technet demo19 local.api www.account smtp-out-02 sonet vol jinx damian eminem photobook www.wd vps107 atlant hamid bambino bismarck secdns fcs www.piwik kkkk jackpot excelsior tootoo alani spi vids amal newhost pingpong mail-in origin.www mister www.deals korean dinosaur kristine ccl empty shining ww9 rays autoconfig.links autodiscover.wholesale www.vc clay sch nagoya minmin phs www.shadow yuan pmc autodiscover.links smiley rews olsztyn mot bioinfo osm macho mime glamour otter kx imran autoconfig.wholesale www.mailing 85cc www.prestige profi avril mail.fc2 bb1 corner legends bongda sobek asta prep sogox 8591 alcatraz waffle idiots mail.8591 mail.77p2p spawn valerie ass emailer filmy cho bsa www.irk vip4 cristian aj access1 council den elysium gsf www.msn vcon drp emg cme gcm www.firmy workstation 5278 gadgets mail.5278 tapety holocaust mail.sogox mobiles jorge m18 object apps1 mediasite spectro lister os2 hcp 228 gos s46 amar www.template cet kor q10 dsadmin mocha kiran lps blago marin sparc host02 bellatrix curiosity mail.85cc biuro oursogo mail.oursogo mahdi femdom merida language alto www.delivery kopia malik dave1 eburg web52 web51 server47 senior server46 mvp clan domaincontrolpanel referral www.develop halloween fee medea robotics mehdi server32 mssql01 jiuye server26 trauma desert tu harrison box11 miass darklord 77p2p soluciones osd slk av8d dentistry mx-2 monroe mail.av8d simorgh www.telecom kerala wuhan moody erc santander sharefile niobe aca orangecounty m01 pta mail41 vc3 www.7 eleanor hvac assassin sacs mex tales webdisk.go autodiscover.exchange mail44 mail.news mail45 urania www.photography hamlet freebox bianca hadron vcd blake sync2 pdu2 konvict lobo fw3 smtp-gw nhac1 mail.corp as4 omicron www.black ngo www.autos trends tweety kinder ttl celeste pitbull zxc exchange2 groovy www.bridge oglasi desa zara oplata www.ece srv22 blizzard iti ems1 wintermute groove srv23 pearson www.ebook 109 rtc handbook vitrin ws02 cdm adv2 bugatti www.int www.rec www.tk postal chou montgomery priem bailey www.tender fileupload bestseller dongwon comet2 leviathan poze mac1 ebusiness www.vitrin concursos merry 129 cso nsp www.profile mowgli chewie alla annapolis preston nos ets kv leasing test007 apricot ykt flog slx algerie indicadores excellence leslie fresno freeworld moby gestalt webdisk.jocuri zakupki edu3 marion thalassa autoconfig.jocuri jefferson tp1 romi mpe stuttgart www.fotos timmy takaki www.bug mnemosyne artist matador autodiscover.jocuri desi encrypt bulkemail i13 association esupport algeria www.elite kennedy yedek tires remo www.motoryzacja motoryzacja mystore aula pakistan socialwork ihome dept raid deepblue reserved www.dream caracas tsp wvpn triplex jobsearch sushi ontario www.losangeles szb shoutcast mga fart vito vmtest squeeze experiment tal mos blocked newsfeed lc2 webdisk.newsite darling imageserver vpn4 creme esmeralda american pstest tabletennis www.virtual host23 www.counter mb2 yar vrn www-demo pc11 global2 www.destek bysj quarantine www.ga chandler evp reed a0 www.dreams helpdesk2 titans dq termin mota kamel newtech 128 tttt red5 inews manchester e10 cyberspace saigon www.users srv03 www.bali lojas filosofia operations www.program regional authors malibu ghosthunter pacman ladolcevita www.style www.andy www.mr electron www.cert webmail10 babbage giga g6 pmm dixie bea stamp nmail kage trials eforms content6 markov sw3 watches snowy marvel content7 maru woodstock mano para markus mako srv16 srv17 srv18 csweb www.chinese www.casino mail42 mail47 levi www.arabic student4 www.prestashop lana domini kamikaze openmeetings ftpadmin christianity iep emc labrador poly xuebao redline tiamat aq boc silk infos xweb msite thehub rainbow2 bola andreas jane www.ny webdisk.novo bsh item francis georges rainbow3 schulen katy hoster garuda fsm datasync greatdeal i33 gamezone lawyer marcelo sl1 consult hoge ellie hlj pussy jersey violette kagoshima generator webdisk.book sal databases questions www.mantis zeus1 web10656 centurion nika six primer roche barra www.scripts merkur www.spa radyo alvis coa cch ilo clear www.mark bells www.mars wikis autoconfig.i thot freeze sahil quattro www.klient live1 rtg tinker autodiscover.i pera mirror3 www.z bc1 eon www.poznan communities mfc rem www.hp simg d22 saber planck smr joey salesforce wired kernel qatar itsm dima h8 unlimited www.nice vodka sud testlink www.dental threads inca null nate blade9 lifeline paf 105 saman b18 b17 hachi stick mta3 prashant pavo server51 coc sonny apus ibiza www.wallpapers lukas thera fmipa blade10 zxcv xf ym zd oklahoma espana kool baba errors sable www.victoria tokens igate webdisk.web www.mercedes instyle aion warcraft crawl mrc orion1 emu cisl-gijon.cit opros teamwork ppt kang score integral stealth lo supervisor tempus c13 vmware2 bubbles chiba sorbete mido webdisk.docs porky autodiscover.health sha ivory true lfs vtour aha host21 nato wild christopher papaya ohio permits cct heroes autoconfig.health untitled xnet xian www.rsc www.alfa bilet jas 118 paragon bem mordor fe1 hdr www.tc customersupport million ipcam www.hub ns.demo jms pro2 s76 lts www.donate ddi colorful olymp www.about i61 longevity appstore sra tortuga www.vn sigadmin juliet aml si1d rates s55 www.lady pres kos whale mal ew fender autodiscover.live solus testvpn caos autoconfig.live www.gg fans noob autodiscover.cn tdc wheat agua pineapple silva anne webdisk.de nour conferencia s68 antiques www.me revista cs4 shepherd ramazan zena s54 lsh dnp ctc taha doku mail.in sm3 boole sssss oceanus proactive zakon kobayashi www.photogallery hook srd stor1 arhiva preproduccion omid wp3 sse webmail01 spiker www.no avalanche adds crl2 playboy contador sela blessing mijn luther stephen gj ananke komi www.auction dionysos www.king trix tomate www.center luck arif almighty climate vz2 www.bio documentos techblog zuzu www.invoice leader chevy dune www.linkedin www.shared biyou coach literature amazone terranova arion loulou typhoon supersite gtm2 webmail.test nets funny vienna bf s1103 rick forza sergio cdn103 interno sdi i35 neumann www.va moca i67 nepal dme purgatory axiom invision sylar rape rams reference cdn102 said i69 tino medi www.et oh dauphin webdisk.books www.galaxy techinfo i71 lyncwebconf minnie ectest www.newsletters i66 tomy i73 kst race fiction sala sbb exec jester fix www.nissan nishi hummer matrix2 limelight http2 warp sunlight kar mapy distributor scratchy xk lola cashing pgp sirena b30 racks wash www.ko taganrog gpm www.mb cha omer valhalla merci vz cache3 sucre waptest sexo kani iad i76 scr breezy appcgi dangan ws11 www.pk www.pg i65 tennessee www.ns foot lams csng.ok www.auctions i64 training2 abf obninsk cjxy i63 pcsupport.bnsc pcb aussie buddy web6400 i77 s67 d0 linkin star9 translation www.gamers flseok sota gpu candle autoconfig.de bae www.img1 www.ig lic elegant mymoney s73 www.fh chrysler hime myname autodiscover.de gu s77 bigtits autoconfig.cn ilab claude i78 s78 children streaming1 i79 beryl cosmetic s06 yummy guitar vpngw lcgbdii.gridpp impuls i62 baghdad ssrs backpack fenrir kurs myapps mkc derecho anil games2 119 teamo hts mail.newsletter lpta001.itd lpta009.itd ad3 i81 zurich trex peso secure6 cambodia gw.nd gmt irm magnet ras2 vpn02 gw.ag scholarships estrella ataman hoanganh cf165.conf mailhub.kis www.hiphop rtr-xa.ohx aldo lastminute niki shadows catalogs shuzai caca net-xa.ohx monavie ulises kaspersky cf195.conf western bcst-xa.ohx cf175.conf emprego i82 yutaka cf185.conf reddot xing cf155.conf regis rtr-oa.ohx wat usub cmi wartung net-oa.ohx sur lfc-atlas.gridpp bcst-oa.ohx sever marcom mon2 static0 mock bmb autodiscover.x maillists autoconfig.x mody i60 macos veeam brett brazzers main1 i58 mbs cda esi panfs2-nfs.esc lila pptp01 e-mail i57 northstar mail29 racer endeavour www.fs webdisk.articles camper exercise gost intrepid zaki theworld i83 www.france www.israel handball stephane hanson plug pmd adsl2 i56 sweets pivot i55 asp-winterville.cit mail28 www.crazy autodiscover.soporte rcc dragonnew c64 blacksun solaria www.hardware karo continental boon mce luxor kawaii ultra2 tan compunet caro maxime internetr-all m.beta hcm.ipad ei i54 z-diemthi rac bomber reiki img.e ciao i53 ddns changes smog mask dmca service1 www.plgto.edu pepe alis bk2 hindi bk3 i84 medicina alibaba ntc www.easy gymnastics hq2 kaka i52 sdr ork zf natura racine quake i85 xmen entertain cocoon bubu www.pets prensa stat4 www.server2 hst lexi www.resellers mailhub2 garnet pain belka morena coca rz un121101225938 sagittarius b33 pci start.ru abcdef plgto.edu i51 b32 b31 ich myway wts macedonia m-dev www.m2 i86 citibank explore junk cupcake pixie test.shop 212 abdo b26 automail ewa hunters b20 imagini 121 palermo frink b23 smtp-in-01.mx-fs2 frida i50 nstest replica hj arctest thulium b21 i48 smtp-in-03.mx-fs2 investment i47 i46 compton smtp-in-02.mx-fs2 unused.aa2 home.stage g5 cheyenne hostmaster webdisk.soporte g4 callme i87 robby www.lider vds4 i88 i45 zahir cp4 i44 dojo industry bandung tumen admin5 pba hideip-europe i89 jaka ora-placeholder-ps-db.srv fab clara oks cor fish1 bomba formosa mailweb e6 autoconfig.soporte i43 i42 rad1 www.v natalia digitalmedia i41 webserver01 hermes2 i40 e4 seas nicole webdisk.analytics hackers jungle i91 www.holiday iva i38 complete node01 i92 fifa healing i37 abiturient gato sh7 jv creator sote infiniti nit smsc mstudio four appli i93 secure7 i36 ivy valeria smtp16 rohit konto www.fz liberte pti video4 protech vss kygl mp4 most horoscop www34 hino im4 opinion ipo pingu www.door stellar cro www.horoscop i94 reunion xion i39 atropos training1 i30 yw innova tatooine dr-www austria webdisk.bugs i34 hood shop3 www.dr chester hora i96 kenobi www.xy radius4 datenschutz i97 vod4 canopy dop host20 i98 static-mal-g-in-g01-s sisko eol wahlen i99 126 issa pig auth3 leela tva uk1 mta01 alp onion dle mlp liza khan mxmail i32 mobileiron lian minos www.worker tsb mld www.build kick rtx vds3 sammy vet chatting maplestory i31 play1 maki reyes skala mail49 addicted autodiscover.movil mailgateway3 closed i29 doctors autoconfig.movil calgary pdb2 mach silverstar old3 michiko bkm kl arctic utils vulcano madi test-m d28 d27 horses registry win22 www.code ishop www.tenders www.dd horror classico autodiscover.dev2 cmsdev bbss wide prima autoconfig.dev2 carpenter mymusic jelly moga www.gd oswald whiteboard smallbusiness www.mp cfs rcm www.mv ben10 www.conf neuro verwaltung www.cabinet www.ng tw.blog www.rr iman olympia s241 dolce loko auc m.pool partner1 www.spanish i22 moka dev.admin www.rus cdn01 mws malaga mono www.firme mineral i21 dipsy xd thebe www-hold winxp www.payment i18 i17 porto www.hf homeless well guangzhou www.sis small www-stg canal www.cats sab i15 tsi discus hay slides starlife trader o1.sendgrid ipphone hungary topstar 3w cairo www.dns ts.kmf nuts oper sitemanager jang vpn5 dionysus asdzxc gss1 tetris incubator oren newhaven cuda2 pty13213b www.date estonia mrtg1 wroclaw greenapple thumbs.origin domination c2c creation kawagoe myhost pong vts faperta ts.fef lebanon grapher 000 vestnik lip myrtle ts.ydyo psbfarm newww romantic syria pergamum tpi dede edms catfish www.o egcdn www.author discuz 106 www.hobby statystyki contrib research1 charleston katowice animals seraph darknight nasty sari chronicle stats1 vz1 gibbs doll via 11091521400593 observatorio spice sokol emails www.act khalid tucker match counterstrike testing1 webdisk.director www.print fatih odie rush epro belize samer ripe c-asa5550-v03-01.rz ortho c-asa5550-v03-02.rz barrie ikaros imobiliare concurs cypress cgs ashley shu ticker teleservices lover sitelife lhr www.max ffl gooogle www.lms listsrv www.city www.discovery ncp wiwi doc2 omi guestbook ke justme town comet1 ignition phim testonly ryder fobos lobby yahya eucalyptus bmc fps vivo 230 www.ops abba ringtones webd webmail-original mailrelay2 isv srv19 www.storm ultima naughty webproxy priya app8 www.vladimir yoko tinkerbell southpark julius reach peridot www.pre www.private yachts beehive ati viejo hanybal hamm hn.nhac www.mirror bangbang asha eragon probe mysql03 emmanuel it1 luka chillax kanto ipmonitor webworld www.evolution chetan sun2 oauth web100004 tmb api.dev vh2 sph dmm sod hsi oficina marcin toni gilda offcampus nightmare something cas3 redbull vtb i49 tam tbc axa coyote avm eventum albion nanda fivestar qwe ip3 www.ava rev 234 pinger resort bdog pcc testpage wombat aplicativos audition www.lan nhce webplus wyx www.cdn2 blackandwhite ericsson webdisk.home mikey arirang mst3k republic pf1 www.alaska eiger websearch vegetarian localhost.blog input www.forum2 avcome dat154 www.sim front3 pbs lords siva odc reverseproxy dys tomahawk se1 server43 marko nrg pooky marek chilli testuser miko 080 lys mobile-test kaito nine shelter hoteles mail.xvdieos mail.avcome praha albany pss advertisers host04 host05 cotton p8 mysqltest webdisk.webdesign cbr herakles i59 h10 serendipity autoconfig.my s39 ftp.shop foxy 233 www.moscow lv121101224239 emilia h11 autodiscover.my s59 jcc dev.shop s62 piglet damdam h13 tigger duncan s44 h15 madagascar sportal hank placeholder 170 www.k ing amt beth iii judith www.notebook server35 rdweb cacti1 joshi videoserver xvdieos hey genie www.nano alt.relay newmedia kamil yugioh digisys martialarts www.adrian mailing2 sfr sm01 m20 www.wroclaw oddbanner webgis s4242 proposal smpp2 wwwadmin sss2 dio cul alvarez hs1 fen eso encoder evm artur major mcm nils sohbet webdisk.marketing mobile4 malta samar aaaaaa alborz sks centaurus citadel www.password cdrom mariana da17 isengard angelina http1 ipp mermaid margaret ama img2081 hawthorn mkg roxy web002 ki www.mak icpmupdate enquetes illuminati host101 bubble approval dfp octans www.uat uruguay eagles distributors mail50 msl trailers aks img142 marianne enjoylife nsi ears boomer omail s157 franco mysmis s159 marine micros crafts gogle holy snowball www.fin webpro mx.mse4 simply kali bogdan mx.mse3 jules addons appel s173 reality newt tatsumi wrestling sr3 un121101224723 www.gm mx.mse5 rsync1 rsync2 hansa www.cde ssi sssttt klara sudoku doraemon s175 mx.mse21 www51 bps shino img181 miyabi elk mx.cs bluerain ver www.cps ward photo1 blacklabel www.people tandem webhost2 abc1 mail.mse4 ns119 virgin mail.mse3 panzer vds2 www.cv router11v06.zdv wxdatasecure sachin wws rack10u24 imwxsecure tutos blade8 creater xmlsecure ssl3 marktwain islamic ocsweb ns116 rtp ecshop corp2 cure origin-api isf zina asr v6.staging jang3572 mail.mse21 www.om burn www.wifi clickme floor makalu corvette api.ext bon exchbhorl2 www.updates ns115 ns114 cploginky www.tea ns113 haven hilfe ns109 ns108 test.secure darkfire ns107 ns106 vpn-uk logging api.int yd august dulich murdock peanuts autoplataforma salman deb safa umbriel midian cim bru design3 cploginoh pmi vps11 frankfurt elaine ssl4 dem pontus jalal macbeth tet supernatural mmoem westside cp01int linode vps103 blackpearl proje www.theme queue iceland vivi gdi nixon esxi04 icpmdirectory emr yu gif redrose gti cucumber smtp-ha dogma newlook ns83 moi aspera www.projekty feri novorossiysk online2 mail-mobile sinsei videochat ns98 outside hoover biblioteka eddie csf freeland harmonia kas www.aaa camera3 mustafa paz analog mirkwood geonetwork diddy mobile9 ngw sounds ian mgs hawkingdialinrouterport1 newwebmail jigsaw un blade13 cookbook pal www33 sven lapin fargo planb elpaso www.lol ptn smtp.mse21 massmail fresco sooreh fraise sgp nstri ahwp freeforall servicenet vicky www.avia hip directories kart img06 parto stt r0 dingorio peppermint mon3 gio www.threads itcenter hermes1 ycg www.mir turism star3 www.turism www.pop www.avto bac isee celine savings conquest myth brave s185 rta fptest supporter surgery excalibur service4 mail.mse5 www.19 kenshin innovate adms rhodes webda sting www.cep web156 sug pete sangsang ftp10 nam mxm dingdong www.25 www.logo web151 93 s200 postgre ftp14 alvin border-odd.nntp.priv britneyspears lancer ftp15 www.kiss border-even.nntp.priv ddns1 salina r7 www.18 www.17 ub recycle test04 attendance smsgw scholarship cristina abe mobile.dev joinus intermapper indi-web130 nk 97 contract walk coke betaa camera2 hussain mahachkala www.gt endeavor esales sb1 freezone ldaptest dns-2 blacky internetmarketing ecomm1 59 oneman platypus akita ts17 sagan apu suspended qms amigos dharma 95 tachibana beautiful barton aladdin finn i68 etna vmscanus vbox gfstest ange hall jerome cdo monitoring2 hsbc temp01 cweb i95 www.president 72 charmed 36 blog3 alina www.clasificados panasonic csr31.eng car21.net bba adnan www.coupon auk cub koyo rizzo escobar www.murmansk stamps moha more cristi flyers sagar anger peek novokuznetsk secondary pimp mayur www-org digg ite asahi www31 backup02 www32 www36 amaranth www37 striker buddha extension faceboook rise compaq intertest holding www.penza murdoch mypictures www.montana helloworld canna swati www.tvonline carlo seba ophelia adserv katrina i70 tobi winupdate freetime www.translate ptrmedia tolyatti goran thesis burns reservas blend occ blade11 risingsun web5516 web3423 web3424 web3425 mx06 web18328 oman web3426 web3427 web18327 web18770 web3430 web3422 web3431 infotec web18326 web18325 web3421 web3432 web18324 web3433 web3434 web18323 web18322 www.salon web3435 topgun web3436 web18321 web44 web3437 web3438 web3440 web3420 sco web18319 web3441 ddp web18318 ddl web3442 web18317 infra2 web3443 web18316 web18315 web88 web18314 web3444 web90 web3418 web3445 www.statystyki chaitanya rf web18313 web3446 web3417 web3447 web3448 web3416 cdserver web3450 studyabroad web3451 greendog web3452 web3415 tomas web3453 web3454 web3414 web18312 web3455 ccd web3413 name1 web18311 kyokushin web18310 br1 web3412 web3456 web3411 web18298 web3457 ws9 web18297 web3410 web3458 web18330 web3461 web3462 web18331 circe web3463 web3408 web3464 web3407 silent web3466 web3467 web18776 web3406 web3470 web3405 web3404 supersonic judy web3403 web3402 web3471 web3472 web3473 web3474 web3401 web3475 web3476 web3388 cakes web3477 web3387 73 web3478 92 web3480 web3386 web3481 web3482 web3483 mh2 web3484 web3485 web3385 hinata web3486 web3384 web3383 web18296 web3487 web3382 casas seema web18779 web18332 advancement web3500 web18333 essai web3501 web3380 web3502 web3503 web3504 web3378 web18295 allstars web3505 web18294 web18293 web3506 web3507 web3508 web3510 web3511 web3512 web3377 web18292 web3376 web3513 web3514 web3515 web3516 web3517 web3375 web18783 web3520 web3521 web18291 web3522 ria web3523 web3524 web3374 web3525 web18334 web3373 web3372 web3526 greenfox web3371 web3527 rms2 web3370 web3528 web3531 web3532 web3368 web18290 web3533 web3534 web18335 web3535 web3536 web18288 clans student5 mgmg pif amon web3537 web3367 web3538 web3540 web18287 www.rd web3541 web110 web3366 web3542 web18286 isi web3543 chantal web3544 web3545 web3546 ident web3547 web3365 web18285 www.oasis web18284 web3548 secure.dev web111 web18283 web3550 web3554 web126 web18790 earn keyboard web18791 www.oregon crema web18792 cryo www.prince web18803 web18804 testonline web18805 web3364 web18796 muzyka web3611 faster web3612 web3613 web3363 web3614 web18807 web3362 web3617 web18282 web3618 web18281 web18279 web3361 web18278 web3620 web18336 web3360 wiki.dev web18759 web3621 web18808 web18277 forum5 web3623 web18276 web18275 web3624 web3625 web18274 web18273 web3626 web18337 web18809 web3630 metallica ftp13 web3631 skunk web3632 web3633 web3634 web3635 danube kylie alim iceberg web3636 ariana web3357 cae web3637 tgn flo web18338 web3638 web3640 zeppelin web3641 web18272 web3642 web3643 atb db9 web3644 web18271 web3645 ccb web3646 web3648 web3650 web3651 www.oriflame web3652 web3356 web3653 web3654 web3655 web18269 web18339 cea web3656 web3657 nsr2 web18268 aza web18341 brief web3355 chm web3658 web3661 diabolo web3662 web3354 web3353 web3352 03 web3663 agus web3664 web3665 web3666 web3351 web3350 manta web3667 web3668 web3670 web3671 dev0 web3672 longisland web3673 web3348 web18267 web3347 web3674 det web3346 web3675 web18342 web3345 web3676 web3344 web18266 web3677 web3678 web3680 web18265 web17080 elton web18264 genome web18263 win19 web3343 xgc web3682 cloud4 autodiscover-redirect web3683 web18262 emd web3342 elo kcc web18261 web3684 blondie web18259 merlot web3685 web3341 isle web3686 web3687 web18819 web3340 web3700 web3338 web3701 web3702 web3337 web3703 medu web3704 web3336 web18258 web18257 gci webdisk.main web3705 web18256 web3706 web3707 web18343 sok web3708 web3711 web3712 web3713 web3714 wmv wisdom web3715 web3335 web3334 web18255 web3716 web3333 web3717 pgames web3718 web3720 web18254 web3721 web3332 web3331 www.sss netscape web3722 web3723 web3328 autoconfig.main web3724 web3725 web18253 web3726 web3327 web3727 web18252 web3728 web3731 qazwsx lastchance web3732 web3326 web3325 web3324 rol web3322 web3321 web3733 web3734 web3735 web3736 web3737 web18251 web18249 web3320 web3738 web3740 web3741 hofman web3318 web3317 web3742 crunch web3743 web3315 mailgate3 web3314 web3744 web3745 ganges web3746 thehouse web3747 ns141 web3313 web3748 uninews web18248 web3750 web3752 web3312 skl web3311 web18749 web18740 inno web3753 web3754 sae web18344 web3755 bookshop web3756 web3757 web18247 web18729 web18720 web18246 web18716 www.solutions web18245 web10679 web18829 teste1 achieve mym web18650 web3760 web3761 web3762 web3763 web18640 derby web18630 web18619 web4894 web3764 xi web18244 web3765 web3766 web3767 web10669 web3768 uds web3770 ns94 web3771 mississippi web3772 web18243 web3773 ns89 web3774 kaltura ns88 web3775 ns87 ns86 web3776 ns85 web3777 ns84 web3778 web3780 web18613 web18242 web3781 web3782 web18609 web18598 web3783 web3784 web18597 web18241 web3785 web18606 web18595 alcyone web3786 web18240 web18209 web18594 roamer web18593 web18592 projet web18238 web18591 web18237 watcher orz web3787 web18236 web18235 pip web18234 web3788 web18345 web18600 web18580 web18346 web18569 web3801 web18563 web3802 suport web18347 ns93 web3803 time1 web18233 web3804 web18562 durga web3805 web18561 web3807 xmlrpc web3808 web3810 web18559 web18557 web18348 web18232 web18231 web18556 web18555 web3811 web3812 www.dictionary www.campaign web18554 spr 38 joomla25 web18229 gt2 fcc web18228 web3459 web18549 web18189 ns124 web3814 web18540 web5933 web3815 web18530 ns118 web5932 web18520 web18509 others web18507 web3816 webnews web18504 web3817 csd web3818 web18503 web3820 web18502 web3821 web18350 www.sia web3822 web18227 web3823 web3824 web18501 web3825 web3826 web18226 web16917 chalet web3827 web3939 cgm web18839 web3830 web3831 web3832 web3833 web3834 web3835 web3836 web3837 web18480 web3838 web3841 lucca web3842 web18225 web6023 web5923 sidon web3843 web18470 web3844 web3845 myoffice web18450 web3846 learn2 web18224 web3847 web6689 web18223 web3848 web5915 web3850 sen web18222 web7439 www52 consultant web18221 web18846 hobart web18430 vns1 web6100 web18219 web16918 web18850 www.baby web18420 web4000 web5924 web18218 slot web4001 hcc web4002 web18217 ds6 web4005 lanka web18216 web7409 web7407 web5898 web7396 web18215 ds3 web7395 navarro web4006 thc nata web7394 web5897 web18214 web16919 web4007 web7391 web7376 server31 web7400 web4008 www.sys web5896 web4011 web7385 www.chevrolet www.lg web4012 programas web4013 web4014 web4015 darkorbit web4017 web18853 wwe web4020 afm web5895 etv artwork web4021 web4022 web7379 web4024 web4025 web7378 web18213 web5894 web4026 web7446 web7369 web4027 wpc web18212 drogo web4028 web4031 web4032 web5903 web4033 web4034 ezadmin web5941 orac web4035 web18211 web4036 web4037 web7445 syd web18210 web4038 web5892 web4040 web6699 web7361 web4041 srl web4042 web4043 web5891 blackbird web7357 web16921 web18349 web5890 web4044 ds10 web18198 web4045 web4046 s1012 web4047 web18197 web4048 web7352 web7350 web4050 gs2 web18196 host122 web4051 mail.kuku web4052 ag1 web4053 web18195 web18340 web4054 web7339 rmc web5886 web18329 imt web4055 web4056 reseller2 web5926 web18194 fist web18193 ott web7330 web7325 web4057 web18320 webdisk.gmail smm web7323 web4060 web4061 web16922 web18192 anas orl gene web7319 web4062 web4063 web4064 web4065 web4066 web5927 web4067 host120 web7318 web4068 vhost2 sdm web4070 web4071 img04 yy568 web4072 web7316 web4073 voyeur web4074 web18191 web4075 twc mila web18190 www.red web18299 web4076 web4077 web4078 engels web4080 web18308 web4081 web18307 web4082 web18306 666av srp web7311 testapp web16923 web18305 web18188 web4084 web4085 web4086 web4088 ldp ius web4100 web5928 dof amb web7310 web18304 www.kh smpp1 web16924 web18303 web18187 web4101 web4102 web4103 eoe web4104 web4105 web7297 fatality web18186 dpt vv web18302 web4106 ipn web4107 jbc web18185 exo web18866 web6030 download4 web4110 web7296 web18411 ger web18184 web4111 web18183 web18182 web18301 activity web18181 web4112 epg web4113 web4114 web4115 web7295 web4116 web4117 web4118 web18300 fir www.scc web4120 edelweiss web7304 m13 server40 web18179 web18178 web4121 web4122 web7303 web18177 web4123 web5880 camaras web18412 web18413 web7292 web4124 web4125 web18414 web4127 web7291 web7290 web18870 web4130 annualreport web3729 web18176 jiaowu web5789 web18175 truyen web4132 tf1 web18415 kds h21 web7286 web18174 web18173 scd web18416 kir web18280 web7284 web7281 web7280 web4133 web4134 www.malaysia 205 web18270 web18172 web7273 web7271 adadmin web7269 mae web4135 web18417 freebooks web6696 web7266 ktm grd cyprus web4136 web4137 web4138 recon web4141 web18171 web18418 gore web18260 web4142 vitrine hektor elijah arp famous web10719 p6 web7260 web18170 web4143 web5873 any web3959 web4144 web4145 web4146 web18168 web4147 ckarea web4148 web18167 e-commerce web4150 web6095 mail.yy568 server49 www.informatica msd server48 www.thumbs web18250 slpda web18166 frm web18165 mail.666av aic web4429 1111 mail.080 pizzahut web7253 web10698 web18880 web7251 web6096 web7249 web10695 web4211 web4212 jpadult web4213 web4214 mail.jpadult web4215 web4216 web4217 www.orel web4218 web18419 mail.ckarea web10694 web4220 spor ost web4221 web7246 web4222 web18164 web4223 alpha5 web10692 web18421 web18239 prd www.memberlite web4224 web4225 web10691 web4226 web4227 web4228 web4230 web4231 esports web5869 web18163 acca volterra web4232 web4233 web4234 web18422 web18162 www.s4 web7242 virt web7312 web7240 web18161 web7421 web4235 web4237 web10682 web18230 web18886 sgt web7233 web4240 web4241 web18159 web4242 web4243 web7219 235 antigo web18158 web18157 arsenic web4244 gallium web7229 web4245 web18156 web18155 web7226 je web5866 firefox web4246 sw5 web18423 hl web18220 web10670 vh1 web18424 web18154 web18153 web10668 web4247 web4248 web18152 wr web3710 ufo web6039 web4250 web4251 ns201 web7220 www.tennis web7217 out1 ns.blog web18199 rq web18425 web4252 web18208 web7213 vio ns161 darkside dict web18151 web18149 gear nalog web18207 web18206 web18148 covers web18147 web18146 web4253 web18145 web18205 zee web4254 web18144 vasco web4255 web18204 web4256 web4257 crt web18426 web18900 frontdoor web4260 web-02 web18143 web18142 gaspar autoconfig.fb autodiscover.fb web4261 web4262 dns13 web18203 itec web18427 web18428 web4263 web4264 web18202 web18201 web18891 web18141 web-01 web4266 ness wishlist web18200 web4267 web18139 autoconfig.lists autodiscover.lists webcam2 sumy studentmail web4419 logic web10649 web4268 kfree web4270 protector web18138 web4271 juventus web18892 web18137 web18136 centennial web18429 web18135 web4273 web10642 www.teacher csj web4274 autodiscover.student web18431 www.inventory web18180 mac2 web4275 webclasseur web10639 notes1 web4276 web18432 web4277 claymore web18903 thetis web18134 web4280 autodiscover.clients web3698 noise web18133 www.anime autoconfig.clients web4281 web18132 d101 web5860 web6693 web4282 web18131 web18169 libanswers web10629 web7399 web10622 web18129 niagara attach michal web18128 banner2 web18127 web4283 web4284 www.audio musique web7398 named odds webdisk.teste web18126 web18894 naomi redcross web4286 www.orange web18125 paprika www.ajax web4287 web4288 web4301 web18124 web18123 lance web18895 hahaha web18160 calendario www.www3 knox fafa web4303 web10619 web18121 jquery web4304 web4305 web18119 www.sso web7397 web18118 web18117 web6739 web4306 web18116 kokoro web10613 web18115 web18150 web18896 jimbo web18114 takumi web4310 web3697 web3970 web4311 fisip web18113 pdfs web18112 september web4312 broadway fkip web4313 web18140 web4399 underwear nelly web4314 web18111 perfil web17999 web7393 web17998 web18907 web17997 web4316 web4317 web17996 web17995 pari web18130 web5849 web17994 web4318 web4320 web17993 arie web7392 moran web18122 allen web4321 www.2010 web3696 web17992 web17991 slide marlboro web18120 origin-blog niche web17990 web4395 leeds comsci web7390 web18898 web4323 web17988 web4324 web3958 web4325 web4326 web17987 web4392 web3692 web18910 web4330 web17986 web4331 mascot web4332 web4333 web17989 web18433 web17985 web17984 web4334 myphotos www.denver web4335 web4336 web17983 web18434 gfs web4337 web18435 web4338 fortmyers ctl web4340 web17982 web4341 web17980 web4342 www.quran web4389 web4343 web17981 web4344 web17979 web4345 web6700 web17978 module web17977 web4346 cpl www.rp www.sb web4347 web4348 web4350 web17970 web4351 web17960 web4352 ptr downtown web3999 web4899 web18436 web4353 web4354 www.focus web4355 frederick web4356 web17976 web4357 adder web5938 web4358 www.foros lidia web3694 web4360 web18050 web4361 fgc web17975 web18048 web18047 web18046 diffusion web18045 web18044 nsd www.ghost web18437 aukcje web4362 web4363 raki web17974 web4364 crimson www.glass web17973 site5 rival web17972 web17971 lst vtls web4365 web4366 gjc web18043 web4367 otc riker www.che web17969 panic web4368 tallahassee web17968 web17967 web4370 web4371 arcgis document web4372 wen web18438 web4373 web4374 surrey web4375 www.inter res2 ddh web18042 web4376 web4377 web4378 web18041 web4380 web18040 myjob periodismo www.livehelp wsus2 base2 web17966 www.keith web4381 web18038 ubezpieczenia www.ubezpieczenia web18037 redstone web18440 web18036 web18035 web4382 web4383 web4384 dma web18034 web18033 lmc web18032 web18031 hosting4 web17929 web18028 web18027 s242 web18026 web18025 web17965 web17964 web17963 graffiti web18024 www.miami web18023 eu1 validate web18441 web4385 singer seis web18442 web5831 web18022 web18021 web17962 ddc web17961 yalta web4386 jiwei test001 web17959 web4387 cs5 test111 www.digi mailserver3 babyface test333 arjuna web18019 web17958 gjs web18018 kalendarz ehealth web18017 web18919 hicham web4400 web5829 mdc web4401 web18016 abood web17915 web4402 web17914 cmcc web18013 web18012 web4403 web18443 www.wj hikaru www.sn duster vcm www.mg nv web18444 web17957 webmail.admin builder.admin web17956 web18445 web18011 web17899 web18008 andorra web18007 web4404 web18006 www.secret web17955 rodeo web18446 brainstorm web18005 extensions bks concorde web4405 polly www.ve web4406 web17954 web17953 web4407 outbound1 web17952 web17951 web4408 porta web18004 web4410 web18003 web18447 web18049 web4411 web4412 podolsk web18002 web4413 confirmation web18001 web4414 harley web4415 www.nn s253 web17890 web10449 web4416 web4417 web17880 web10439 tivi web10434 snr web4418 web4420 web17870 matematika zabawki web17948 web18448 fms2 web6151 web4421 web18449 cptest swww vle web17947 web17946 www.zabawki web17945 web4422 web3691 web17860 web5819 web17944 web4423 web17943 web17850 crl1 web17942 web17941 web4424 web7359 informatika keystone web18039 web17938 web6850 mana edesign web4425 web6149 web17840 base1 sla web6843 web4426 web3792 web6842 www.cpa web4427 doberman web3690 web6836 sexuality web17830 web6830 web17820 web6823 web4428 web17937 web4909 web4431 web6819 web17936 bebe web17935 www.greetings wikileaks web6816 web5809 por web4432 web4433 revelation web4434 web4435 precious autoconfig.web web4436 web4437 web5937 web3688 web18451 web6809 web4438 web17934 wm3 zing web6798 quetzal web4440 web6797 web5798 web4441 web4442 web18452 web6796 web4443 web4444 web17933 web4445 autodiscover.web web17932 ex2 web17931 web17930 web6795 stages niko www.vologda web4446 web4447 web17928 web6794 web18453 web6803 katana hippo web4448 web17927 web6792 web5797 ksu web6791 web4450 web18929 www.onlinegames web5899 web17926 sh4 web17925 warm web17924 web18454 web7349 gorilla web18455 web18456 web6790 web5796 web6780 www.songs web17923 web18457 web18458 web5794 web6773 web4511 web17922 inventario ws191 web4512 web5239 ws182 ws201 web4513 web6769 web5793 web6768 ws102 ws101 yogi web6766 ws192 kodak web18460 c0 vive web4349 web4514 web18461 web5792 web6760 rondo netsys combo web4515 web4516 mychart web5791 web4517 web18462 visualbasic web17750 bbt web5949 web6753 shady parkour web17921 web18463 hiho rooms web5790 web4518 www.indonesia web18464 web18020 web4520 web4521 web17918 web4522 web6749 ftpweb web4523 holidayoffer web17917 web4524 web18465 web6746 web18466 qt web4525 web4526 smtp.out web4527 web18939 web17916 web17740 web6743 web4530 web6740 web4531 web4532 www.weather tehran web17030 web17730 web6729 web4533 web4534 web18467 web18015 web17949 web4535 web18014 web6726 memories web17720 web4536 dic mailmx2 mailmx1 web4537 web6720 web4538 fpa web17699 web4339 web17913 web4540 web17912 web4541 web17911 web6713 web4542 sly web4543 web4544 web17910 web17707 web17706 web4545 smtp15 web4546 web4547 web17705 jgxy web4548 web6709 web4550 web17898 php54 web4551 fe2 web17907 web4552 web4553 web17906 web17704 web6698 alles web18468 web17703 web6697 web17702 web4554 web17905 manufacturing revistas web17904 web18469 nasc web17893 tvr www.mall web4555 letsgo web6706 web4556 web4557 swap web4558 web17701 www.daniel web6695 security2 web4561 web4562 web17690 sagitta web6694 web4563 camus web18471 web4564 web6703 web6692 ita web17892 web4565 web4567 web6691 web4568 browse web4570 web18909 web4571 web4572 web4574 web4575 tiga web4576 betablog web4577 web17680 web17891 web4578 web4581 web4582 tetra web17900 web4583 traders srt web6683 web7329 sklep2 web4584 otaku web17888 web17887 web17886 vm11 web4585 web4587 web17885 dev02 web6416 web6679 web18949 web4600 web17884 masoud tmn s74 www.yes s72 web6676 web17883 web17669 web6670 web17939 nms2 soto web17882 nir www.men web17881 web17660 ciscoworks web6663 ricette web17879 graduation www.upgrade web4601 s65 vds22 web6659 teck web17878 yearbook web17649 web17877 web17876 qwertyuiop web4602 web4329 web5936 web17875 web6650 uslugi keitai pixels web4604 sisa web4605 lars web17874 web4328 facts rdb web17873 web17872 web4606 fsa anaconda stack web17871 sire web4607 web4608 web4611 web4612 exile web4613 web17869 gallery2 web4614 h120 web4615 web4617 web17868 web17867 web17866 web4618 web4620 web18472 web17865 web17640 web6644 web6643 adminpc web18473 web4327 web6639 web17864 testvps web17863 web4621 web17862 web17861 jaime web4622 shane web6636 nnm web4624 web17630 seat cpnew kmm unplugged web6630 web17620 web6623 swamp jury web4626 web18030 chacha web4627 web4322 riza web17599 www.player web18474 sondage www.agora web4628 polycom1 web17859 web18475 q2 web4631 web17608 web17607 web4632 o1 web17606 web17605 web17604 web4633 web17858 redirector web17857 web17856 zeit antigua froggy ecp larch web17603 web18476 naoki vs4 web17602 bluesea web4634 klaus web17855 www.ben web17854 vpn-test web4635 chromium web17601 web18477 web4636 web4637 web17590 web17853 web4638 estates web17852 web17851 web17849 web17848 web4319 zia web18478 host41 web17847 web17846 web18479 web4641 riad vertex web3681 web17580 web17845 web7429 web17844 web17843 web17570 web4642 web4643 fileproxy www.entertainment web17842 dce rana remote1 web4315 web7309 web17560 paola nutri web17841 web4644 printer2 web17839 web17838 mdb web7298 web4645 funzone web17837 web17836 web4599 web17835 web4647 web17834 web3679 web17550 xmlfeed web4648 web17833 f11 web4650 web6043 camera1 web17832 nozaki web4651 web4652 web4653 st01 web4654 web4655 tpe web6549 web17540 web4656 web17831 rumba messagerie web4657 web4309 web7294 www.painel yamada web18481 web4658 bill2 webmail5 webdisk.drupal autoresponder web18482 web4660 soledad web18483 netserv1 web6539 web4661 web4308 web4662 web17829 ns.math web17828 web17827 web18484 tracks cisco1 ashi d16 www.tours sf2 web17826 web4663 d15 web7293 web4664 web4665 d14 d13 d12 d11 www.amazon web4666 cesar randall web4667 terri web17530 web4668 almaty mab cameron web4670 calipso web3790 web4671 web18485 postbox pap nord tls web17825 web4672 web4673 web18486 web4674 web17824 web18487 web4675 web18488 meganet web4307 tomita web18489 web4676 web17823 www.dj web17822 web4677 webdisk.magento web4678 web4680 test55 web6530 tsubasa web4681 web4682 sprint web4296 web17821 web17819 web4684 web4685 ovs web4686 bcp rehab web17520 comodo web17818 tierra www.lite www.bulk web4687 smbc babe bada web4295 web4688 c12 web17817 web4294 web18491 www.silver web4293 web17816 web4701 web6509 web18009 web4702 web4703 rosebud amor web6498 web6497 web18492 web18493 web6496 web4704 web17815 web17814 chin web6495 web4705 web4706 www.mo daybyday web17813 web4707 web4302 web5935 www.antiques web4708 web17812 web6494 web18494 web4710 baito sunpower web17811 web17908 wraith web6493 web5199 web4029 site4 web6492 cliente web6491 naboo mon1 web17749 web4711 web4712 web6500 web17748 web17747 naps spl toaster ogre web17746 web3949 mimo web17745 mica hayato iproxy1 web17744 web17897 ppi otr web17743 web4714 hispania itnet web17742 web4715 web6485 www.torun game5 web17741 web4716 web4300 webdisk.dating web17739 web18495 quentin web4717 obmen universum web17738 web17896 julian web18496 web17737 web18497 dogbert web17736 web4718 web4720 web4721 web17735 cdms web6479 jns miller plesk1 web4722 web17895 web17894 www.tube web4723 web4724 web18498 www-backup kolo triple libopac web6469 web17734 web17733 roza web17732 coin come web17731 mag1 coms web4725 web4726 web16940 lantern happytime mailmaster web4893 nsmaster web18511 web17903 web4285 web4727 web17902 diva web17729 www.example wpdemo web6459 b22 web17901 sona writer web4728 web17728 web6449 web18512 web17727 web4730 mmk web4731 imaging kerr web4732 web18000 fe01 web6439 web4733 seller web6438 web4734 web4735 taichi mighty web7275 e5 web18513 indira www.technology a9 web4736 web3758 web4737 web4738 web4279 web4740 web6669 olya web17726 web4690 midget web4741 web4278 web4692 web6049 web4742 adsrv web17725 web4292 web4744 web3759 oleg web4745 remove web4900 web4746 web4747 web17724 web17723 web4939 web17722 web7389 web3969 pancho web17721 web4713 web6409 vsa web6398 web17719 web17718 relay01 web5919 web3489 nippon web6397 web6430 web6396 web4719 relay02 web18514 web4748 web4750 web4099 www.herbalife web6394 web5279 hash web17717 www.time web17716 web5945 web17715 gman web4812 railway fai web17714 web4813 web4814 web4815 web4816 web17713 gong web4817 web4818 web4820 web4821 hide humanresources web4822 web4823 web4824 web6393 web10699 web4219 hist web4825 web4827 soi shredder muzika web4828 web4831 web4832 web4833 web4834 zvezda web4835 web5950 web4836 web17712 hola fed gip web18515 web4837 web4838 web6390 web4840 youcef web17711 web4841 web4842 web4843 duma jain web18439 web4272 ftp02 web4844 web4890 web4845 radikal web4846 web17029 web4847 web17710 web3929 lori raymond web17698 web4848 web17909 web4850 web4269 211 web4829 web6360 lizard web4851 web4852 web6099 web17697 forum-test web4853 web17696 web5946 web4854 web4855 web4856 web4857 web6489 web3399 web4858 web4860 web4861 web4862 web4863 web6349 web4864 web17009 kari web4865 web4098 web4866 web4867 web5934 web18516 web4868 web4920 web6339 asterisk1 mydomain pkm www.cart web4870 k1 web4871 web4872 lazy web6329 web4873 june web4874 web17695 alberto web16911 web17694 web17693 web16912 web18517 quack web4259 web16913 web4875 kepegawaian web4258 koti web5920 web4876 web16914 web16915 web5299 web4877 web4878 d37 d36 web17016 www.cool web4906 web4880 d34 limo d32 switch3 web4881 d31 male web7299 web18459 web6129 web17692 persona web3769 web4882 web4883 web4884 web3669 web17691 web4885 web4949 web4886 web17700 web4887 maze web4888 web5001 web17688 web18800 kuma web5002 web4249 web17687 web5003 webdisk.team web5004 web5005 spruce web6391 web5007 mess shooter publiker web5008 kyle server08 zabbix2 web6249 visions sw4 web17103 web5010 www.kz web5011 web17686 web17019 web5012 miku web17685 web5013 web100000 web5014 web5015 web5016 miso web5017 web5018 web7239 swanson composite monika web17684 carnival web6239 web100001 web5020 web5021 web100002 web5022 www.test6 web5023 web5024 web5025 web5026 cpd aukro bullet web18518 web6230 web17683 de1 web5027 web5028 rosie web4039 web5030 maximum ican web5031 mohsen web5032 web17682 web5033 web18519 web18521 web4239 web17681 web5034 web5035 tunisia sidious web17679 web5036 web18522 web5037 web17678 web5038 web5040 web5041 workfromhome cw01host9 cw01host8 web17677 web17676 nathan cw01host7 web17675 web5042 web5323 web5043 web5044 web17674 web5045 web17673 web5046 web3329 glad web5047 retailer web5048 web5050 web5729 web4951 web4952 web4953 web17672 web4954 web4955 web17671 web4956 web4957 web4958 web16925 web4962 foru web4963 low web4964 web17670 web4965 nore xo web17668 web4966 programming mx00 ichi rapids mpi pana web16926 app9 web4967 web4968 web16927 web17667 web17666 web17665 web4970 chihiro web16928 web17664 web17663 gunther web16930 cw01host6 shemale web4971 web17662 web4972 web4973 web4974 cw01host5 web4975 web4976 web4977 web17661 web4978 meetme cw01host4 web4980 web18523 web4981 megara web4982 web4983 beta.admin web4984 www.profesionales cw01host3 web3499 web17659 web18524 web4985 numbers web16931 web5859 web3799 web4987 web4990 cw01host2 web16932 web18525 autoconfig.joomla warriors autodiscover.joomla wushu web16933 pola web16934 preview1 minus web4991 privat web16935 cw01host1 radio2 ireland web17089 web4993 pull web6209 beekeeping web4994 pobeda web4995 benz cost web17658 web17657 zhang web4996 deva rt1 web18526 web18527 web17656 thanh dominio web4997 web6198 philips web4998 web4999 web5111 web5112 web17655 web17036 web5113 web18528 web3709 web16937 web18529 ogame web17654 web18531 yasin web17653 popmail web17652 web5114 web16938 web5115 web5116 web5117 web5118 web5120 web4238 web17040 web5121 web6197 web5122 web16941 web16942 web6196 web6194 web16943 web5123 web6193 devils www.ch web5124 web5125 web5126 web6191 web5127 web6190 web17651 web17650 web5128 web5131 marino web5132 web5133 web5589 web5134 web5135 web5136 web5137 tma ns.test web17648 web5138 web5140 web5141 web4236 web5142 web16944 web6180 web5143 web5144 web6173 web5145 web17647 web5146 web5147 web5148 web5150 web5151 web6169 final nadya web17646 web6167 web5152 web5153 www.mi web5154 web5155 web5156 gus web16945 web16946 combat web5157 web5158 roeder web4579 web17645 web18490 web6160 web5161 web16947 towa web17039 web17150 web17644 web5162 web17643 callpilot web5163 lp4 web5164 mailto web17642 web5165 web5166 postman friendly web5167 web5168 web5170 web5591 web5171 web5172 web4229 web18532 web5173 web5174 web16950 zona web5175 web5176 web5177 topdog web16951 web16952 web18505 web18506 web4299 web17139 web5178 web17641 web6139 web5180 web17129 web6131 web17639 vital myplace vermeer web4922 web5181 web5182 palmsprings web5184 web5185 web16954 web17119 web17638 boost web5329 web18508 web5186 web5187 scream woow web17637 web5188 www.torrent web5201 web18950 web17636 web18948 web5202 web18947 web16956 web5203 a01 web18946 web3349 web5204 web5205 web5206 web18945 web5207 web5208 web5210 web5211 web18944 web5212 web5213 web18533 web5214 www.bi web18510 nick2 web18943 web16957 web5215 web16958 web17635 web17634 web18942 web17060 web18941 web5216 web16961 web17633 web17632 web3359 web5217 web17631 web3779 web17629 tiamo web5218 web7419 web5220 web5221 web17069 web17072 web18534 web5222 web18940 backupserver web18938 hihihi ttk web18937 web16974 web4819 www.mega web16995 web5223 buck dex web16975 web16976 web5224 bestway web5225 web18936 web3369 advertisement ptest star7 web16977 web18935 prod1 syzx web18934 web17628 web5226 web5227 monitoreo yellowstone web18933 web5228 web18932 demo17 newstest demo21 web17627 web18535 web18931 web16978 web5230 web5231 web5195 marius web17626 web5232 hadi www.boutique web5233 arslan web17079 web5234 web18930 web4826 fullhouse web17625 www.all web5235 web5236 ironport1 web5237 web18928 web18927 web5238 web6369 web17624 web16984 web5241 beta4 rusty web18536 web16985 rod web18926 web5242 origin.m web18925 web18924 web18537 web5243 oldadmin site3 web5244 shaka web16986 hecate web5245 web5246 web17623 web5247 web5248 192 web5250 hptest web5251 web5252 web18923 web5253 web5254 web3379 web18500 mystyle web17622 www.cod web5255 checkmate web5256 web16987 web3381 web18538 web5257 web5258 se3 web18289 web16988 web18539 web5262 web3739 web5264 sheldon web5265 web5267 web18922 web18921 web5268 web5270 autoconfig.api web18920 sajan web5271 web17090 notifications web5272 web5274 web18918 web5275 web18917 web18916 web5276 web5277 web17621 autodiscover.api web5278 web5281 web17619 pkd web5282 web17101 web5283 web5019 web17618 kon web5285 web5287 web5419 web5288 web5301 skills web16992 web5302 web18915 web18541 koa web18914 web17617 web5304 web18913 web5305 web18542 autodiscover.testing web6379 politik comunity web5306 sqlserver web17616 autoconfig.testing web18912 web5307 immortal web5308 web16948 web18911 web17093 web17110 web6779 web17615 web17614 web5311 web18908 web17613 web17612 mall1 casting web5312 web5313 www.contest web5314 web5315 web5317 web5318 web17611 web17609 web18897 web5320 web5321 www.sync web18906 web5324 web17094 web5325 go4it web18905 s240 zcgl web5326 slave1 osama web5327 layout web18904 wsa omkar web5328 web5331 patel web5332 salim web5333 web18543 web5334 web4839 web5335 basel web5336 dei web5338 web17598 web5340 web18893 web5341 www.models noe web5342 wanderer web18544 web17597 vidyo web5343 web17596 web17105 web17595 web17594 web5344 web17593 web5345 web18902 web17592 web5346 web18901 paraguay license1 arrow web18889 web17591 web5347 web17589 web18888 web5348 web18887 web17588 web17587 web5350 web3693 web17106 web3400 web16997 web17586 bad fortran web4586 web5411 web17107 web18885 web18884 web3391 web18883 web5412 web5413 pse web5414 web17585 web5415 tin web18882 web18881 web17050 web17108 b99 necro web18879 web18878 web17584 web18877 web5416 web17583 headhunter web5417 web18876 web5420 web5421 web5422 borabora web5423 web5424 web3392 web5425 www.nnov web5426 web17582 web3439 web5427 web17099 web5428 web5430 web5431 web17581 web5432 web3393 apteka rector pegas web3394 liebe web5433 web5434 web5435 web17579 web5436 web17578 web5437 web6389 web3395 kapital web16996 web5438 web17577 lolol web5440 web3396 web18875 web5441 clubhouse web5442 kraft web5443 web18874 web5444 web18873 jxcg web6392 web5445 web17576 web4849 web5446 window klimt web3397 web5447 web17575 mur dsi web5448 dedicado web17574 www.mail1 web5450 web18545 web18872 web5451 web18871 web5452 web3398 web5453 web5454 marly web17573 crayon web13129 web18546 goodfeel web18869 web17572 kuban web5455 web18868 sanctuary baloo web6519 web3409 web18560 web6395 web5456 web5457 bsd1 web17571 web5458 web13139 web10690 web17569 web5461 web17568 medium web5462 web5463 web13149 web5464 web5465 mayor web5466 lucky7 zlatoust web5467 web18867 web13152 web17567 web17104 win21 web13157 web5468 web5470 web5471 psms torun web5473 web5474 evergreen leila yume cuda maher web13159 web18865 web5475 web17566 oe web5476 web5477 web6399 salama web5478 web18864 web17565 web18863 web5480 web5481 limon gaga web18862 www.america libre lithuania web13163 sancho www.saransk onelove web17564 web5482 www.quotes web17563 web3990 web17562 web5483 jumbo web5484 julio web13168 metamorphosis web5485 khalil web5486 web5487 web13169 web5488 paranoia khaled bigdog web5500 web7428 web18547 web4589 web5502 web4859 web5503 web13179 web13182 web3419 web5504 maven web5505 web3800 web13190 web18548 web5506 web5507 web17561 web18861 openemm web5508 web18550 bilal web17559 nicaragua web5510 tif web18860 web17558 web5511 web13191 lcc admini ding web5512 web13192 mcb web5513 web13193 web5514 web5515 web17557 web13194 jolly web18858 issam artis web5517 web17556 web13195 web17555 web13196 alisa web5518 redtube web18857 colgate web13197 web5520 democracy web13198 web13209 plesk2 web18856 web18855 web13212 web5521 web18551 web5522 web13213 liliana web5523 bookman vf web5524 web13216 web13217 web5525 web5526 web5527 web17554 web17553 web17552 web13219 web6419 web13229 web5912 web5528 web18854 grants web5531 web4869 web10693 web13238 web5532 web5533 web5534 web3428 web13239 web17551 c10 zoot web4289 web3989 web3429 web5535 web13245 ripley web5536 web5537 rockon web5538 rawan web17092 web13250 web3529 web4699 rasta web5540 web5541 web5799 web5542 onlineworld web17549 web17548 web5879 web5543 web4879 jimo web5544 web5545 staging.shop ns129 web5546 web18552 rogers web5547 web5548 rodrigo web18499 web18589 web17547 web3794 ns128 web17546 web18553 web10696 epage web6789 web5550 web18558 ns126 ns125 web5551 web5552 web5553 web5554 temporal jamie web5000 web3795 terence web18564 web4901 web4902 web5555 tecnica web17545 web3449 jamal testing123 web5556 web10697 www.california web5557 web18599 web4903 web5558 web16960 web5560 web4904 web16949 web4889 web4905 www.tlc web5006 web4907 igloo web4908 dreamland hosam web17544 web4911 web4897 web4912 web5561 asdfghjkl devsecure prize web3460 web5562 web18565 web4913 web16998 web17543 merpati web4914 web5563 web5564 web5565 web6457 admin6 gca perso web4915 web17542 web17541 web5566 web4592 web6793 web17539 web17538 web5568 endymion web4916 web4917 funky web5572 webdisk.photos web5573 web5574 web17537 web3465 web18566 dns03 sawyer web5575 web5576 web5577 web4918 web4921 web3468 web3469 web5578 haris web3809 videocenter moncompte web4896 web5580 web6429 racktables redondo web17536 web17535 web3479 isidore web18567 web18639 web17534 web5581 web17533 pradeep shouji web5909 web4935 web5889 web5582 web5583 web4940 web5584 dock web5585 web3488 vps106 web10715 web7443 magenta web3490 nakamura gadmin habbo web3930 web5586 web3491 web5587 web5588 traffic2 web3492 spambox chaotic 2006 web3493 ntv web18309 web17532 forte web5602 web5603 web3494 web5604 web6490 web3660 web18568 web18570 vps115 web5605 web5606 isabel file01 web5607 web3496 web5608 web5610 web4593 web5612 web6799 web5613 lacoste web5614 eidos web17531 www.public web4950 accelerator web3497 web5615 web5616 web5617 web3498 web5618 web5620 web17529 web10689 inlove web3509 web5622 od web5623 web5624 web5625 web5893 filex web5626 cw07web01 vps108 web6499 web4959 web5627 web3518 web5628 web6759 web5630 web5631 mohamed web3519 elegance web3998 web5632 webalbum web5633 web6520 web3530 web3819 cpanel3 web6059 web18571 web7449 web18572 web6529 web18789 melinda simpletest proxy02 web3979 web5634 web5635 web3539 web4895 web5259 web3549 web5637 web5910 web5638 web5911 web4992 web5942 web5795 web6839 web5640 web5913 web5929 prove web5641 web5642 hangout web5643 web18852 darkman web16980 refresh web5644 web5645 web17920 web5646 web5647 web5648 web5914 209 web5119 satan angie web6119 web5650 web18730 web4595 web5711 web7289 web5712 annex web10729 web5713 web17889 web5714 web5715 web5716 web5717 web4139 web17528 web5718 web5720 bauhaus web5721 web5722 web6016 rudolf web5129 web5723 web5724 web5725 web5726 angola web5917 web5727 unavailable web18810 webdisk.partners web5918 web5728 web5731 gi web6019 web5732 web5733 web6849 cw03host1 web5734 whynot web5735 cw03host2 web5921 animes web18851 web3719 web18849 web5922 web3615 web3616 web6829 web5159 web5736 mercator web3619 web16990 web17527 web6616 publica ejournals web5737 web3622 web5738 web5740 externo web3316 web3319 web17526 web5741 autodiscover.host highland web18573 web17525 autoconfig.host web5742 web5743 web5744 web17524 web17523 web5745 web5746 www.cam web5747 web5750 drago test002 web5751 web17522 web5752 web5753 web3323 imk web6619 spaces web3628 web5754 web3629 web3358 web5755 www.bill web5757 dofus web5758 web5760 web18010 web5761 web18574 web18848 web3495 edson web5762 web5763 web5764 web5765 web5219 web5766 web5767 web17521 web5768 web18847 web5770 web5771 web5772 divya web5773 web16999 gigabyte realmadrid tiago web17919 drumandbass web5774 web17091 web18845 web5775 web18575 web5776 web3806 web3798 web6719 web5777 calculus web18576 web18890 web5778 web18029 web3943 reb web3944 ebank web3945 web17519 web5780 web3948 web5781 web5782 web4049 web5783 web5290 web3953 fso web5784 www.acs web17518 web4059 fortress web5785 philip www.ams web17517 milkyway live3 web17516 web5786 web5787 web5788 web3961 web3963 icom web5801 web5802 web5803 web5804 web18899 www.ict web5805 web17515 web5806 euro2008 web5807 web5808 mms2 www.cis web5810 web5811 terror web3965 web5812 web17514 web3966 web5813 web3975 web4079 web5814 web3981 web3984 web5815 problem web5816 web5817 deuce web17513 web3985 web5818 web4087 web5820 web5821 web5822 web17512 web5823 web3988 web5824 clare web4093 web4097 web5825 web3330 web10709 web3791 web4291 web5826 web5827 web3793 web18577 web17940 web3796 web3797 web17511 web5800 web3813 web5779 web5931 nazgul web5828 web5830 web4609 craig web5832 web5833 web5834 web4359 web4369 web5835 web4379 web4919 web5836 webtech web5837 asdasd web4089 guava web5838 web5841 web6649 enzo aztec web5842 web4388 web5843 web4390 chill web5844 web4391 web5845 s155 web5846 web5769 web5847 ashish web18578 web5848 web4393 web4394 web5621 web18844 web5850 web5851 web4396 web4397 web5852 web5853 web18843 web5854 web4398 web5855 lab1 web5856 web5857 desperado web5858 web5861 web5862 web5863 web5864 web5865 web5867 bandar web18842 bk01 web4409 web5868 web5870 web5871 web5872 web5874 doggy web5875 web3689 web5876 web5877 web5878 dolls aymen newmoon web4430 web4439 web4290 web5619 web3828 web5759 kagami web5881 tournament web5882 web5883 web5884 web5885 web5756 web5749 web5887 respect xanadu terminus web18579 web5888 web5900 web5901 web5902 web5748 web5904 web5905 blazer web5906 drift web4449 web18841 web5907 web5908 farmer web6011 web18581 elis web6012 web3829 web5739 web6013 web6014 web6015 web3339 web6017 web6018 web6020 web3983 web6021 web6022 bills web6024 web4519 web6025 web18582 web3840 www.sochi web18583 annie saffron alter web4528 web18584 web6026 web18840 simplex web4539 web18585 web18586 web18838 web6027 web3991 web4549 web6028 web3389 web18837 web4560 web3849 web18587 amity web4566 testphp web6031 web18836 web6032 web6033 s169 web18588 celcom web6034 tmm web6035 tania web4569 web6036 freely cyberzone web6037 rascal vampire web18835 web6038 daum web4573 web18834 web17149 eplus web4580 web6040 web6041 web6042 web6044 web6045 web6046 web16953 web4929 dzone erica erika gaban web17148 s158 web6047 web6048 web6050 web17147 www.krasnoyarsk web17950 web6051 web4898 web18833 web6052 web6053 web18601 web6054 web17146 web6055 mountainbike web4588 web6056 survey1 entry web4590 keira mybaby web17145 web18832 pra web4591 web18602 rti web6057 web6058 web6060 web18831 web4603 web18830 web4594 web6061 web18603 web6062 web17144 web4596 gears web6063 web4597 web6064 web6065 bikini armada videobox web6066 web17143 www.td web6067 wsi web4598 web6068 web6070 web18828 web6071 web4610 web17142 web18827 smstest web6072 web6073 web6074 ens web17141 bns web17140 web5944 www.ulyanovsk diamante web6075 web6076 web10356 web18604 web6077 web17138 power4 depression web6078 web6080 web17137 web6081 web4623 web6082 web4625 web6083 web6084 ftp.secure web4630 web10431 web53 web6085 web6086 web6087 web18826 web10432 ginny web54 web17136 shortcuts web10433 web18825 web10435 village web43 web6088 web10436 www.izhevsk web6101 web6102 mylive web6103 web18824 web6104 hermit web10437 web17135 shh web18823 rinrin web6105 web18822 web10438 web6106 web10440 web6108 web6110 web17134 web10441 web6111 web6112 headlines web6113 web6114 web18821 web6115 web10442 web18820 web10443 web6116 web6117 web10444 web6118 web6120 fairtrade spartacus web18605 web17133 web10445 web6121 web6122 www.stu web6123 web10446 web6124 webdisk.club web17132 web18818 web18817 web17131 web6125 fadi web18596 web10447 web10448 web18607 web6126 web10450 web18816 web18815 yokohama web10451 exporter web6127 web6128 web18814 web6130 web4640 nightwing web6132 web6133 spectra bread web4646 web6134 web4649 web6135 web6136 gort web6137 web4659 web10611 web18813 web17130 web10612 web18859 rekrutacja www.rekrutacja web6138 web18812 web10614 forum3 thekey web6140 web10615 web18811 web6141 web6142 web6143 web10616 web10617 web10618 web17128 web10620 web10621 web6144 mydev web6145 web6146 web18799 web6147 astronomy domi web6148 web10623 rtmp web6150 web4616 bappeda web6152 web18608 web10624 web18610 web6153 web10625 web6154 web6155 web6156 www.mdm cnet goodies web18611 web18612 happy123 web18798 web16955 web6157 web6158 web18614 web18797 eedition web17127 web18615 radium web10626 web6161 web17126 www.testsite web18616 web6162 portalweb web18806 web6163 web10627 mandrake web6164 web6165 web18795 web18794 web10628 web6166 web18793 oam web10630 web5839 web10631 web10632 web10633 web10634 web10635 web10636 web10637 easymoney bomb bangbros web10638 web18617 web6168 web10640 web10641 server07 web10643 backup6 web10644 jenny server06 web18802 web18618 hshs web10645 web17125 web6170 web10646 onlinetest web6171 web10647 web10648 web10650 web10651 web10652 web18801 tpp web6172 tunis web6174 web6175 web10653 web16983 web18620 web6176 freeads swim web10654 web10655 muzic web10657 mofos web10658 web10660 web18788 web10661 web6177 web10662 web18621 web6178 realitykings bhc web10663 web10664 web18622 web10665 web10666 web10667 web4669 web6159 web10671 web10672 iservice smurf web6181 web18787 www.oc ide web18786 armageddon web6182 web17124 web18785 web6183 web6184 web10673 web10674 web6185 web6186 kain ssl7 web10675 web6187 web10676 web6188 web10677 web18623 web18624 web10678 web10680 web6200 web6201 web10681 web10683 web6202 web6203 web10684 web18784 itservices web6204 web17123 alterego web16982 web10685 web18782 web10686 pinetree web18625 web6205 web6206 web6207 temple web10687 web10688 d21 web6208 web6210 web6211 web10700 web10701 web18626 web6212 web6213 web6214 web18781 web6215 web17122 web18627 web18780 bas web10702 web6216 web18628 web10703 dbs1 web6217 web6218 web17121 loves prado web18778 web6220 goya web6221 web6222 web6223 web10704 web6224 web10705 iftp web18629 hoken web6225 web6226 reform easydns2 web17120 easydns1 web6227 web10706 web10707 web6228 web10708 web17118 webdisk.foro web17117 web18631 web10710 web6231 web18632 web10711 web10712 daugia web10713 web10714 dev-admin web6232 odp dl5 web17116 web17115 web18633 web6233 web10716 sergey web10717 web6234 web6235 web6236 web6237 minotaur web6238 web18777 web6240 web6241 web16981 web10718 buu web6242 iraqi web17114 web17113 web6243 bowling web17112 web6244 web18634 web18635 web18636 web18637 web18775 web6245 web6246 web6247 web18774 web18638 web6248 web10720 web17111 web18773 ns131 web17109 web17059 nessus web6250 web17098 web17097 web10721 www.designer web10722 web18641 aziz web10723 melpomene echidna polish ixion web18642 sanat www.ventas web18643 web10724 web17096 malabar web18772 web17095 web16994 protocolo web4619 web10725 who web6311 web16993 web17102 web6312 web6313 web6314 jak web10726 web18644 web6315 tottori web6316 web6317 web16991 web10727 www.fis web6318 web6320 web6321 web10728 web17100 web6322 web6323 web18771 web6324 web18645 web6325 web6326 web17088 web6327 web6328 strauss web6330 web17087 vm03 vspace web10730 web4679 web6331 web6332 web18769 web6333 www.agro web17086 web6334 web17085 web4683 web6335 web6336 web6337 web6338 new3 web6340 olm web4700 lyncext web6341 web6342 web6343 web3992 web17084 cgc web4693 web4694 web6344 www.cams www.casa web6345 web4695 web6346 web4696 web4697 web17083 web6347 sm4 web18768 arda web18767 bnc web6348 web17082 web6350 web6351 www.chef web6352 web6353 cjy web6354 web6355 ghc web6356 web17081 web6357 web6358 web6361 web6362 web6363 web6364 web4698 web4709 web18766 www.buzz web6365 web6366 web6367 ns140 www.core web6368 web6370 ecdl web18765 arab web6371 web6372 web6373 web16979 web17078 web6374 web6375 abdullah web6376 web6377 deepak web6378 beny web4891 web4729 web17077 web6380 weblync web17076 www003 web17075 web17074 web18590 web6381 web3730 web18764 web4739 web4743 web6382 www.plant web5009 web17073 logserver web18763 web6383 web16972 web18762 web17600 web17071 web6384 web16970 web18761 web6385 web6386 web6387 web17068 web6388 discussion web4749 web17067 web6401 web6402 web6403 web18760 web6404 web6405 web18758 web4529 web4297 web17610 web4003 web6406 web18757 jericho web6407 web18756 web6408 web6410 qv web4811 web4010 web17066 web17065 join2 web6411 web6412 web3911 web18755 web6413 web17064 web18754 web6414 web3912 memoria web16963 sigam web3913 arkansas web17062 web18753 web3914 web6415 web6417 web18752 117 web6418 web17061 advocate web6420 web18751 web16959 web18750 web6421 web3915 web6422 www.washington web6423 web17058 web6424 hassan web17057 web6425 web18748 web4016 web17056 web18747 web6426 web5459 web6427 web6428 harper web6431 web6432 web18746 web18745 bits web6433 web18744 files4 web6434 web6435 web17055 web6436 web17054 vscan web6437 web3917 web6440 web4018 tesoreria web6441 rentals web17053 web4019 web17052 web3921 web17051 web17049 web17048 web17047 web6442 bacon web3627 web3922 web5925 web6443 web6444 web17046 kochi web4023 web6445 web6446 web17045 web4923 web17044 web6447 casanova web18743 web4924 web6448 web17043 www.the web6450 web6451 web3924 web4925 web6452 web4926 web6453 web4927 beam web4928 kawaji optics midgard web5029 130 web17042 bayside.cit web17041 web6454 web3925 diamant web16939 web17038 web17037 web5940 web16936 web4931 web6455 web6456 web17035 web4933 web4934 web6458 web3926 ceramics web6460 web4936 web4937 radioweb web17034 web17033 web17032 web17031 web6461 web5939 web6462 web6463 musicworld web6464 web4938 wwwa wwwb web6465 web5039 grassroots web16929 web10659 web6466 web18742 web6467 web5309 web17028 web4941 web3927 web6468 web6470 web4942 web6471 web4943 web18741 jz web4944 yh chat4 web6472 adis web18739 web4945 web4946 web6473 web3928 web4947 loadtest web4948 locate vpbx ssr web6229 web5049 web6474 web4030 dtk web13189 www.quality web3931 web17027 web4960 web4961 javascript micco micos web6475 web3932 web6476 web6477 web6478 web3933 web6480 web4969 www.html web6481 web17026 web17025 web6079 web18738 web6482 web18737 web6483 web3934 web7259 web4979 web6484 web4910 web17024 web6486 web3935 faktury web4265 web3936 web6487 web6488 web17023 web6501 web6502 web6503 web4986 web4988 web6504 web4989 web3937 web3938 web3994 subscriber web6505 survivors web18736 web13199 web18735 web6506 web3941 web3942 sparta web6507 pgsql3 web5130 web6097 web13125 web17020 web13126 web6508 web13127 web6510 web6511 web13128 veterinaria web6512 web17022 web13130 web6513 vlc web17021 web13131 web6514 www.mta web18734 babes web13132 web6515 turf web6516 web6517 tres ldaps web6518 web16920 web6521 web13133 web6522 web6523 web13134 web6524 web13135 web17018 web6525 web18733 runner web13136 web17017 web6526 wfb web6527 web6528 renoir web18732 web18731 web16973 reka web13137 web13138 web13140 forwarding web6089 web16916 web17015 web17014 web6531 web13141 web13142 web17013 web17012 web13143 web6532 web6533 web6534 web6535 inex web6219 web6536 lc3 web6537 ots web17011 web6538 web13144 santosh web6540 web6541 web13145 web18728 web5189 web6542 web13146 web18727 web202 web6543 cannes web6544 web18726 blog-dev web13147 web13148 web18725 web13150 web18724 web13151 web6545 web17010 web6546 web201 web17008 web18723 web6547 web18722 cl1 web18721 web13153 blanco web13154 talos web6548 web6550 web4629 web6611 web6612 web6613 web13155 web13156 web6614 web18719 web13158 web6615 web6617 web17007 cw01host10 web5948 web13160 web17006 web6618 web17005 web6620 web13161 web13162 web13164 web6621 web18718 web6622 web13165 web17004 web6624 web13166 web6625 web13167 web6626 web6627 suche web5139 web17003 backyard web6628 web17002 opendata web13170 nita web3919 web6631 web17001 web6632 web18717 web6633 web16989 web6634 inout web16971 web6635 web6637 fastcash ftp.staging web6319 web17000 web6640 web6641 web5599 web6642 web5289 web6645 web6199 web13171 web6646 web13172 naif jackass web13173 web13174 web13175 web5840 web6647 web6648 web6651 web6652 web6653 alms web13176 dragons iina web13177 www.tibia web6654 web18715 web6655 web4932 backlink web13178 web4559 web13180 web13181 web13183 web13184 thegallery web6656 007 st6 web4298 web6657 web18714 nlb web6658 iview web18713 web18712 web4149 web18711 web6660 web6661 web6662 feedme web13185 web5592 web17070 web6664 web13186 web6665 wargames earnmoney web16968 edu4 web13187 web13188 web6666 web16967 www.test5 web6667 web6668 web16966 web13200 web13201 web3390 web6671 web6672 web6673 web6674 web6675 web6677 www.ld web3699 web13202 web5590 web6678 imagegallery web6680 web5492 web6681 web16965 web13203 web13204 web3923 web5649 web13205 web13206 web6682 web6684 www.fan web13207 web6685 webdisk.movies web13208 mountain joko dmx web5639 web13210 web6069 web13211 web16964 web6686 web6195 web6687 web17063 web6688 blik kala web5719 web6701 web6702 web6704 www.gov web16962 web6705 sociology web6707 web13214 web13215 web3946 web13218 web13220 web13221 web6708 web6710 web13222 web7450 web13223 web6711 web7448 holland web13224 web13225 web6712 web7447 web13226 web6714 web6715 web6716 web7279 web6717 web6718 web13227 web5636 web13228 web13230 web6109 web13231 web6721 web13232 ebi web4830 web6029 web6722 web6723 web5629 web6724 web6725 web3649 iapps web7444 web5192 web6727 web6728 web6730 web6731 web7442 web5916 web6732 web4140 web6733 web6734 web7441 web7440 web6735 web5611 web18646 natal web13233 web5609 web6736 web5598 web5597 web7438 web7437 web6737 web6738 diaspora web6741 web6098 web13234 web18647 web13235 web13236 web5596 web7436 web5595 web5594 web13237 web5149 web13240 web7435 web7434 bydgoszcz web13241 web5593 web7433 web6742 web7432 web7431 lloyd web6744 web6745 web6747 web7430 web6748 web13242 web6750 web6751 web6752 web6754 web6755 web7427 web4892 web5601 web7426 web5600 web13243 web7425 web7424 web6756 web6757 web13244 web6758 engage web6761 web6762 web5489 test.support web6763 web13246 web7423 web13247 relais web6764 web7422 web6765 web6767 web13248 web7420 web6770 web6771 web7418 web7417 web7416 web7415 web6772 x22 ever web5579 web6774 web3947 web5571 web5491 web5570 web5160 web3950 web6775 web6776 web7414 web6777 web18648 web6778 web6781 web7413 endor web6782 gaza web6107 webdisk.app figaro web5567 web7412 web3647 web6783 web7411 web7410 web6784 web6785 msuperserv web7408 web3695 salix web3951 web7406 web6786 www.webstats web5190 cdf web4131 web6787 web6788 web6800 web7405 web6801 webdisk.community web6802 web5169 web6804 web6805 web6806 web6807 web5494 web3952 web5495 web6808 web6810 web6811 web3920 web4691 web6812 web5179 palembang web6813 ajs web7404 web7403 smtp05 ecr web6814 web7402 web7401 finch tdr web4129 web6815 web6817 ien bedroom web5183 web6818 hre web6820 web6821 web3954 web7388 web5200 web6822 web7387 web6824 web5549 deve web3955 web4128 web5569 web5191 web5539 web6825 web7386 web6826 web4126 web6827 innovo web5193 web6828 web7384 web7383 web6831 adrms web5943 web6832 web6833 web5194 web6834 web6835 web6837 web3956 web7382 web6838 web5196 web5530 web6840 web7381 web6841 web5947 web3918 web6844 web5197 web6845 web7380 web5509 web5498 tiens web6846 xen4 web6847 web6848 chicco sgb web7377 web6179 easyway web3659 web5198 web5209 deedee web4639 web5519 web5499 pwc web18649 b161 web3749 web5497 web4930 web5496 b123 jellyfish web-hosting web5493 web6690 web7211 web4119 web5501 fukushima web5490 nebo web5559 web3957 web7212 web7214 web5479 web7215 web7216 web4058 web7218 web7221 selly web6094 bindu web7375 web7222 web7223 web7224 web7225 web6629 web7227 adil web7374 web7373 web7228 web5472 web7372 web5469 web3916 web7230 web7371 web7370 web7368 blaster web6638 web3960 web7231 web7367 starweb web5229 web5460 web16969 web3962 web7232 web5240 web5449 web3964 web3789 web5249 web7366 web7234 web3839 le web7235 web6093 elgg web7365 web4109 hud eset web7236 web7237 web3995 asp1 kingston web5260 web5261 ntt samho webdisk.ip web3967 web7364 web7238 web7363 faisal singh web7362 web7360 web5263 web5439 web7358 web7241 fabian web4108 web7243 web5266 web7244 web7245 web3968 web5269 www29 web4069 www39 www35 web7247 web3997 web5273 web6192 web4009 web5429 web7248 web3971 web7250 web7356 web5280 web7355 web7354 web7252 web5730 web6359 web4096 web7254 tmp7 darkknight web3972 web7353 answer web4095 web5284 mail.pics web7255 web7256 web7257 web6092 web7351 web5930 web7258 ver2 web7348 web7261 web7262 web5286 web7347 web5418 137 web7263 sysadmin web7346 web3996 web7345 web7344 web7264 web7343 web4094 web7265 web3973 web7342 akasaka groupon web5300 web5291 web3993 web7341 web7340 web7267 web5292 web7268 web5303 web5294 oyster web7270 seabird docman web3974 web5295 web17709 web3940 web5296 web7272 web4689 web7338 web5297 web4092 www.6 www.5 web5298 web7274 web7276 web7277 hmc web17708 web7278 web7337 web4091 web5310 web4090 web7336 web6189 web6091 web7282 web3976 tableau web3987 web3986 firebird web7335 visual web7334 webpay hoth www.bo web7333 web5316 web5319 vishnu web7283 reisen web7285 web7287 web7288 web7300 web7301 web7332 web7331 web5529 web6090 web3977 web5349 cosanostra web7328 rat web5322 ws02qa000 web7327 web7302 web7326 web5293 walrus web7305 ws02qa001 scooby skylight velma ws02qa002 web3751 web7324 ws02qa003 ws02qa004 web3978 web5330 web7306 sleepy sandbox1 morton web3980 web7322 www.novosibirsk mathematics web7307 web13249 croatia sst web5337 web7321 web4083 web7320 web5339 web3982 web7317 web17689 reps web7308 homeschooling web7315 web7314 web7313 web3639 memberlite testmobile b.i61 orbital scrapbooking b.i59 b.i62 b.i58 therock abcdefg b.i57 myinfo b.i63 b.i64 b.i65 b.i56 b.i55 b.i66 b.i67 devforum b.i54 smpt b.i53 drupaltest b.i52 venkat kimoto b.i68 b.i69 b.i51 b.i49 faceebook b.i48 eac vhosts b.i47 b.i46 www.uy b.i71 b.i45 b.i44 b.i43 b.i42 b.i41 b.i72 www.14 b.i40 b.i38 b.i37 b.i36 b.i73 youssef b.i35 b.i74 b.i75 b.i34 cuckoo xink b.i33 b.i32 169 b.i31 237 b.i29 ohyes b.i76 b.i77 b.i28 b.i27 timemachine resimler b.i78 autodiscover.design b.i26 b.i25 b.i24 pylon b.i79 www.financial retailers b.i81 momen b.i82 autoconfig.design fsc b.i23 b.i22 b.i21 guideline 131 reef 134 h2media funnyman b.i83 afshin choose www.ffm 162 eforce storm2 openvz b.i84 b.i20 bestcar b.i18 milkbar b.i85 b.i17 punjabi logiciel b.i86 dreamz clk b.i16 autodiscover.tickets b.i15 b.i87 autoconfig.tickets huygens thales jason1 alertus invent b.i14 kopenhagen b.i13 b.i12 b.i88 t10 b.i11 b.i89 b.i10 b.i91 geotech b.i92 d.i40 d.i91 d.i90 hamburg marie1 schubert whiterabbit janey r230.i90 d.i86 d.i85 contractor d.i80 b.i93 qa.secure qa.www staffs b.i94 jambo uws build.www ak47 b.i95 splayer b.i96 r230.i80 translator qa-lohika.www elnino freesoft local.www b.i97 local.secure anilkumar b.i98 build-lohika.www d.i70 usertest b.i0 rolando kath build.secure rotor polychrome imhere opmanager r230.i69 courrier dn2 shinbus masq d.i59 anto b117 mayrose tribuna b148 mtb2000 r230.i59 servicecenter fastnet a1234567 hayden d.i49 anarchy hbf redwing brew connector fishbook www.phys idp-test smart2 d.i99 d.i98 d.i97 d.i96 qweasd d.i95 funfunfun d.i94 d.i93 amoozesh b.i1 comedy craiova www.sante daesin d.i92 b.i2 r230.i50 d.i89 b.i3 zoidberg farhangi d.i88 d.i87 ebm lilith i-origin logbook b.i4 d.i46 ielts ww7 imis d.i84 barlow gestao backlinks d.i83 ateam algol denebola d.i82 b.i5 b.i6 d.i81 b.i7 d.i79 fs5 _domainkey webdisk.card d.i78 autodiscover.app b.i8 b.i9 autoconfig.app garm gava www.shop2 d.i77 camilla ptah mcd-www2 d.i76 x10 x11 gareth d.i75 autodiscover.v2 autoconfig.v2 d.i74 d.i73 version1 av1 d.i72 qh mansour d.i71 d.i69 d.i68 d.i67 julliet drupal7 kepa d.i66 safer d.i65 textile mf1 ispadmin d.i64 d.i63 fuel spooky gobo aoi www.new1 krsk d.i62 d.i61 d.i60 autoconfig.webdesign roo d.i58 d.i57 d.i56 dns18 d.i55 d.i54 dns20 autodiscover.webdesign d.i53 d.i52 screen context dns19 webdisk.labs mafiawars serv4 d.i51 d.i50 d.i48 cleverskincare d.i47 rapidleech hideip-canada garcia d.i39 d.i45 wedge flames d.i44 csm-nat-10 d.i43 d.i42 d.i41 d.i38 itd boky gautam www.afaceri cpw miyazaki ip-ca ici pclab autodiscover.movies hideip-hongkong autoconfig.movies webclient dame ip-hk slipknot ip-it www012 mysql41 www.imagegallery mapz mall49 kota l2tp-ca dcode midori l2tp-hk highschool l2tp-it gapi whisky flores gmax gogl medo gshf hideip-italy loke gardena www.zero windows1 fap baikal driss juridico goldman lemur joen dk2 ouroboros mathews mathias ql psyche syed nikolai www.study maruwa render www.zend www.xtreme banane ocio edu10 asgadmin topcat fs3 fs4 amail shivam j3 kurihara md5 vie reni hairy styleguide raza syndication sotm artlove afd sinbad bypass jsd achille greenhouse gmc dimension fervor smtpmail wisla www.advert arquivo l1 dayton p1-all1 nirwana beian mutation office3 filter3 www.mlm 104 lyncsip vhost1 sis2 seek competitions iperf neotest hifoods dwarf chat3 supergirl dt1 lklp1 lklp2 lklp3 lklp4 lklp5 rflp4 rflp1 rflp2 inuyasha rflp3 www.estore rflp5 st0 st7 vpn11 msdesign ausbildung ghost2 comtax jrhms molotok wakayama tokushima madan baja savoy www.p2p pace aucc efile spamfilter2 kitahara shenyang spamtest www.porn malak photo4 cass www.kansas www.webservice www.park onlinekatalog www.louisiana coding www.next www.utah delaware gameover pennsylvania www.maine gambit www.lost alok bongo www100 mpc www.liga zaid chandan apollo-v d.i0 d.i1 havok warta banshee ws21 www011 d.i2 www-hac ws22 d.i3 mys d.i4 visage webdisk.central www.ecom tarek creativemind azur d.i5 opr info7 www.clip bcr edf www.boom ns130 sm11 www.cr par urlaub nadir asad d.i6 www.mailbox d.i7 callum www.tasks ucupdates-r2 sptest www.aaaa kal vm04 openhouse bans d.i8 thiago d.i9 vm05 scuttle search3 web50 www.hu lucky777 arno inblue domino2 pegase osp hichem pc10 ipade bk15 www.fa landau w3c kvm01 lares bounty jsw yassine valley www.relax hephaistos sesame eole irce.sac irco.sac love4ever dsj aliraqi zono wsj correo2 dawood saddam davido haydar archivos ouranos tns21 www.u b.i70 webdisk.webinar www.test123 comfort webtrack afaceri tribal thelord kauai pnj webdisk.noticias e-shop lazaro www.alt atos blop zabava webdisk.ask duckbill www.gc ume 135 www.fishing test008 everyday www.spam hacked rp1 battery www.um skate ssl8 ecos arco flashgame myproject www.il myfriend cadastro nicky chucky cot lollipop krystal ando mdt www.bw coolweb 122 lab2 hyena cal02 cal01 127 rad01 bots picpost ddos farhad s154 www.messenger mort jasmine lcr origen management-uat fernanda cpmail zixgateway02 www.eedition havefun hotsex ftp.mail cina pcserver2 davy mmsc studenti shit boletin iem prague parceiros nereid webtrac outcast escort micasa 168 nitrox 202 www.anuncios 999 www.honduras doremi r80.i0 www.magnitogorsk r80.i1 r80.i2 stylist veda verity cisco-capwap-controller.net janice gekoo mellow surfing r80.i3 vivek cuc apophis paulo shah 2000 idiomas furni www.lifestyle golf2 skkk22 nomade material sophosav seeit lsmb01c.lsdf rentacar power3 r80.i4 bigcity www.pedro sonic3 imanager r80.i5 acura lsmb02.lsdf r80.i6 www.deal raiderz r80.i7 r80.i8 afroz r80.i9 found members4 qatest1 prestige2 contenidos mp7 www.nokia mp26 r230.i0 r230.i1 dnd r230.i2 www.argentina r230.i3 loadbalancer zxcvbnm dpa sonic4 r230.i4 sonic2 lucian s170 www.holidays box13 lorena mrelay r230.i5 sgmail chihuahua tmd webdev2 melkor box3 vermont stevens r230.i6 myprofile protein ovz1 ap3 myweb20 spamserv newgeneration onapp www.ssp andri belal dahlia betta egis fetish xe dominion drugs ashok drone testtesttest january elly montada francois portia mongoose emil chang draconis esxi05 bisnis ashraf myrose chico hotplace reflex www.hot s198 vantage crisp bnat ash977 r230.i7 autoconfig.novo dario autodiscover.novo webzine asd123 aisha spanky aiolos dejan ton www.box reg1 zixgateway01 www.admission www.wa www.bid live4 www.arts dimas cawaii dandy verio www.ada www.ace extmail nsw assess cna spamfilter1 brics techie chips r230.i8 r230.i9 netlog johnson www.imagens r230.i70 drlee www.nic r230.i10 chara axion blade14 vps024 cyril tsl myserver uae vps100 vps101 www.euro2012 farah edtech netshop r230.i11 bcd r230.i12 cardiology reynolds carol devapps r230.i13 rosso vps105 hp2 api.new resnet r230.i14 arora kakashi kalyan hibu-portal fendi casablanca rvip megaupload tkd esoft whsil blackfriday filestore vps119 r4 r230.i15 rajiv bassem movie1 bassam verio-portal r230.i16 2007 rit hml haker worldwar playgames r230.i17 package baraka vps109 r230.i18 munna chipmunk uh webmail.panel nyc2 raj builder.panel kaylee vps114 hawai basketball apac metric deadly guess r230.i19 enrique darkangel entourage filemanager www.camp r230.i21 monolith tiffany partner-portal hoang aspirin r230.i22 apollo1 wonderful hours googleservice r230.i23 shabaz holistic tab ronald elink exp1 folkart iherb ebanking taekwondo madness avp ns127 atlantida mii pil.qa ukraine jackbauer homework pilqa pnp benben saerom severodvinsk oac possible lv121101224503 library2 iwillbe flute karel cc3 theking petrus adolfo r230.i24 katja 83 hadar office-gw las r230.i25 domain.control-panel wecare amore amara besmart r230.i26 thoth mf3 r230.i27 r1soft webdataadmin www.mails dreamers pdu4 www.chel overdrive allianz r230.i28 apc5 billion santos r230.i30 teta mizar project1 singularity simolly asma sakshi r230.i31 r230.i32 serv01 host14 fim majid www.mybook wakaba router11v13.zdv manny r230.i33 lviv proxmox sena suncity staff2 seguridad www.museum location r230.i34 cnki ths wlddy129 www.rainbow daesung www.catalogue oracle1 iframe r230.i35 smaug r230.i36 www.east portuguese m360 abcxyz ss3 lavender micky uv r230.i37 lewis.ucs naser rajawali navid galactus invoices jamestest r230.i38 recursos www.warriors cdnet r230.i40 brownie mohan fax2 hss nameless zerocool akram r230.i41 basement rik shopping1 r230.i42 zin bohr ringtone roundtable podarki sleipnir finaid harem r230.i43 castest bst loving www.kitchen bci mybox pdu3 blogs1 blackrock dol abcabc r230.i44 r230.i45 nibbler koka dangban artgallery flyhigh piero post2 r230.i46 jdc tta test123456789 musicvideo r230.i47 slave2 vitality enomoto r230.i48 cts solidworks renata fra spokane investors r230.i49 learnenglish cms01 r230.i51 r230.i52 rafik companion www.merlin r230.i53 r230.i54 r230.i55 tahiti phototheque rakuen r230.i56 snoop jaya www.action thea slider norbert yasser affiliation notification webmail.blog 123456789 rowdy mostwanted r230.i57 www.gls listmail r230.i58 flashback roach ronin vz10 iakas buzon algebra plesktest www.ccc rim sportscards humanrights www.ash gate5 a10 orwell shibby youyou spade asdasdasd mail.new vam shenzhen freetv imperium crocodile yosep r230.i60 r230.i61 demo22 r230.i62 mcr r230.i63 video01 question dejavu r230.i64 r230.i65 ped cookies java1 tmail r230.i66 heath medic sumit www.enterprise suraj skincare habbocoins www.view moment raymond1 siren mma afl yomi speedup tiara a11 actividades yjsh mercy www.exam pc01 wake complex asptest srv25 vpndr tyrex imarketing toolkit sunray what mmail wawan r230.i67 www.aqua minimalist r230.i68 fantasio rockstar flor b.i19 r230.i71 r230.i72 makeup r230.i73 www.yo hacks trivia djh www.os newtest tong busca toma www.mk sugi abdellah titi vitamins r230.i74 mangos www.hm osx r230.i75 yah00 r230.i76 kumquat dania admin.staging in-discountvouchers marios in-v4 gds reserv r230.i77 r230.i78 norma bibliotecas www.rich goga vilnius exim limit www.warszawa turquoise cascade starworld thumper infamous www.empresas capture centenario sv0 arius vini r230.i79 pon r230.i81 rema rn column alfredo webmail.extend hex r230.i82 r230.i83 svn3 r230.i84 kona lms2 psicologia sweeps bangalore adweb r230.i85 firepass hiroyuki wlan-controller crucible poem r230.i86 ella otrs2 upload3 jdih futsal talktalk sai lu r230.i87 de.test mental private.search www.pandora actus hc2 www.station hg2 geonet pauline vodoley gugu elsalvador blueteam suzhou bene hobo http3 smsapi evelyn flair motd market1 lol123 cleopatra r230.i88 jordan23 www.klub simbridge www.lang moro websoft medya nasser swp vps01 myvideos asl healthline r230.i89 blueocean keywords moma fozzie pmis admindev clever herb grandfantasia imad edition listserver gram santacruz speaker ru1 elizabeth degreeworks fr2 www.espanol pkp nani uz mile gratuit r230.i91 cisco5 server09 michaelm xyz1 www.dk r230.i92 autoshow buzzard lppm flashchat mate mann louise sprinter sportsmedicine less ipkvm corp1 version2 koda r230.i93 munich r230.i94 dns2.inf mydream www.free2 k3 bse r230.i95 r230.i96 gym urp stumail greencard baike illu alcohol r230.i97 r230.i98 vnet lionel mysql55 freegames gk1 hoya muslim bradesco znakomstva alex123 www.face hong r230.i99 b.i30 rincon aviso gorgon nsr b.i39 freeway high r80.i20 b.i50 r80.i30 arb autodiscover.newsletters v8 head paginas happyhour www.advance autoconfig.newsletters b.i60 dalian r80.i10 glam alireza shura onlineshopping www.hentai oldbbs toa skif yjsb robson ipa zlgc www.fusion gggg pankaj sleeper fm1 ryohchan gamp five peer offshore renegade pic4 back1 symfonia slogan artek violetta ramen kiko mabs www.hacker test1111 www.juegos b24 r80.i11 r80.i12 readers r80.i13 usvpn dca b25 micro2 rudolph trabajo fsp r80.i14 b28 b29 cona etax kenko www.admissions www.campus koks r80.i15 modx mail99 healthy pl2 kec r80.i16 korn b39 ps2 activities disability edukacja devweb webline dale tema megaplan lionking manu donation r80.i17 travelworld b49 metall mash kuki r80.i18 mero palma yavin rapport www.webhosting r80.i19 masha r80.i21 loly institut fleo r80.i22 katia tanit automobiles ourspace webdisk.tutorial nejm caronte www.tp cara www.rs arti tsukasa www.nz r80.i23 storage3 asem moza www.mz es1 pissing admin.demo umc yuka routing anni starscream www.lp mip rel r80.i24 gardening lille r80.i25 mylib edt purchase r80.i26 tomasz cta iga know effect rand www.fj sono aeris www.el mount r80.i27 choice autodiscover.magento r80.i28 autoconfig.magento r80.i29 accord r80.i31 netoffice webstyle r80.i32 tupper hotjobs dreamseed c36 last sedna r80.i33 quimica kasai brutal mailout1 kill vlast r80.i34 r80.i35 www.try d17 r80.i36 d18 www.empleo nyc1 cisco2 fotograf paysites mora kenya r80.i37 hdd r80.i38 d23 r80.i39 d24 r80.i41 tvs r80.i42 r80.i43 r80.i40 r80.i45 r80.i46 tribe d25 mods newsupport r80.i47 r80.i48 r80.i49 d26 d30 sublime design1 r80.i51 susu tenis backend2 pvc smartnet r80.i52 r80.i53 r80.i54 addc r80.i55 r80.i56 r80.i57 r80.i58 r80.i59 r80.i61 sears posh pochta r80.i62 svi hostgator r80.i63 buffy e22 contracts content-test r80.i64 nat4 spongebob synchro citrus staffmail r80.i65 r80.i66 yves prem lonewolf herbal standards autodiscover.books autoconfig.books toucan kora sql6 host29 sup1 fw-ext host31 nat3 chubby kbs webdisk.legacy vmware1 pool-node r80.i67 www.filosofia www.systems fpk b151 ball canberra www.cursos zebulon simona boca christ bluestar cosmin avdesk webdisk.shopping syrup 214 4ever mtk www.logos sago ns.m ebe r80.i68 antenna demoweb r80.i69 abl ects mssql7 tj200 mssql6 borderless bremen kater woo pu q4 fop r80.i44 atv blabla saki webservices2 mayhem r80.i72 tuk c20 r80.i73 cpk d20 r80.i74 r80.i75 d29 igame r80.i76 educatie wikipedia r80.i77 templar r80.i78 sue kvm6 f10 semi wmail2 sera r80.i79 grc shon habitat skt r80.i81 r80.i82 still r80.i83 smsgateway miroslav scuba rip star1 owa1 slate r80.i84 dandelion livetest ols www.bj meetingplace2 webdisk.auctions vds7 warlords r80.i85 chichi vds15 hqc workshops vds16 newportal vds10 vds12 mrx me2 webdisk.hotels droid crack vds18 s71 eight vds5 vds6 sour autoconfig.fr vds8 autodiscover.fr r80.i86 rowing loveyou veranstaltungen vm10 35114 cocos 36114 fr1 s91 tico dnsmaster arh kefu ksc ilove resultats kao ubnt r80.i87 sule r80.i88 pcgame snail vds9 r80.i89 lyrics idol dlp r80.i91 s75 tris gnu waf turk paulus waps cir r80.i92 r80.i93 wsn r80.i94 r80.i95 panoramix iflow www.ai old.nrelate momo1 www.maths xeno ontheroad r80.i96 actu internalmailrelay sgc www.mech mystique r80.i97 r80.i98 btb spe autoconfig.articles xone autodiscover.uk oskar www.horoscope harace www.miss pathway www.brazil aki autodiscover.articles webdisk.uk r80.i99 help1 www.revolution r80.i50 b.i80 www.korea creatives kep dynamic1 r80.i60 st5 cons b.i90 shake ingrid impala ramadan bolivia strategy uspeh bestfriend app02 r80.i70 sanjay cmax r80.i71 www.webcam wed mail-3 mens resonance www.form charming eld ncaa fairytail www.outlet a.ext ranma r80.i80 image4 fiorekorea r80.i90 enlighten oscars ems2 webdisk.suporte websitepanel rubin zola obi monopoly belinda giochi darko sunjoy dealclick interhost ex1 r230.i20 d.i19 webdisk.themes autodiscover.themes autoconfig.themes td3xgamma reddragon unic www.cas gdc r230.i29 adhara www.cma zoro ecms hao123 m.qa torque d.i29 d.i31 stupid techwiki trustees d.i10 www.eva lookup d.i11 d.i12 webdisk.contact quan adam3 kobi www.stone d.i13 asti www.stars adam2 mailhub1 d.i14 invisible www.owa nfs1 www.onepiece d.i15 granite abnormal parliament adventure obm enoch www.salud props www.cb ghost1 energia precision core4 sbaweb rybinsk websystem autodiscover.analytics www.tumen jumper hse tone concierge www.est udp serv5 autodiscover.social autoconfig.usa piggy webdisk.usa mailscan restaurants autoconfig.analytics webdisk.track zenit campbell autodiscover.usa thomson noreply grafik d.i16 coal d.i17 sadewa reebok avrora wac maila czech fip classics igre feynman konferencje d.i18 ala d.i20 www.be elm nori online-test d.i21 pushmail d.i22 d.i23 karolina waterloo goethe www.eb d.i24 oferta cepheus s243 www.fish ksk d.i25 qd spoc wizards mam www.seed www.rap arms d.i26 admin.new d.i27 windsor webdisk.s d.i28 d.i30 tur r230.i39 www.3d nuage spx www.houston bode cloud5 pchan d.i32 comtest newblog d.i33 tribute nweb format clinton kb1 qzlx abram aruba www.historia able www.clinic typer vacation xxh cancer.ucs cntest bohemia www.berlin southwest www.starwars c-asa5550-v04-02.rz www.adidas podcasting aristotle www.mh unicom dev9 d.i34 vaughan gamebox c-3640-v03-02.rz zamani rencontre merkury atmos fibonacci c-4402-v03-01.rz c-asa5550-v04-01.rz worcester greenville montage rx b75 ketban robinson b73 pczone black1 sri olddev dublin othello sitio etraining akron professor lucky13 prom harvest www.backoffice www.golden flv1 autodiscover.tools autoconfig.tools flash1 bht doc1 chibi aman senat nou fourier gcweb kgb demotest d102 www.ayuda abby wn mycroft www.mca www.tb russell vcenter5 dl4 ldap4 intouch autoconfig.teste dirsync autodiscover.teste cmsadmin pune zigzag xboxadmin redapple kenneth micah webdesigner d.i35 www.alice niel d.i36 nhac poste merc vpscp fairfield dev.mobile secondlife jeeves av2 publicftp wild10 d.i37 d100 www.chicago bangladesh cardiff renaissance iblog leadership kimjm ofis www.smtp afterimage webmail.manage ombudsman dla fibo fort grenoble aoc nieuw screenshots zillion testservice xxl minfin www.gap zan samo irc1 ernest eh prospero phoenixguild wiz gv www.oxford hspc jo ws122 net3 dpr m.media ns171 ns181 rowlf cockpit autodiscover.go zpanel nofear ucc cena ws202 bayes autoconfig.go pyrite mail003 sysaid pm2 sni tokiohotel sng andante 236 shy www.s5 www.surveys catapult www64 peugeot mct aap powerdns qqq acr upi zerone metin elohim saab osa server34 www.halloween server37 fausto server39 vcenter2 imghosting server55 dining apa mlb rhubarb lsj lsd matin giuseppe nas4 salut ceti dido mft lpg hogar medved llama h70 www.college m15 h16 h17 h18 lf h19 jks ere denial www.wow firenze ddr jhc jap esx8 s60 paddy dmp ngwnameserver2 mycampus drs dsm imgmulti newwebsite partizan usa2 constellation www.production etm www.v5 evg han gep webdisk.panel teststore gil ggs webdisk.erp promo1 autoconfig.erp misaki autodiscover.erp ipt elt civicrm programy dks sigma2 lap operation bookit din mail.sex chj ngwnameserver www.its boy www.tapety inmotion cbm saeed extrem h2h hustler xcite ossec bch videodemo inhouse www.ftptest raghu bb2 host112 sheila arhiv verne loan origin-m x5 webui bigone smtpauth gilbert mamo www.bib sv51 maca vpc cadmium dago soar teo music2 wot onenet congress bunker abaco lazer webqa gaby kkkkk serveur www71 www66 www49 www74 www54 www62 ds7 aron july www63 noodle www65 www67 toot www56 nc1 www55 www.imagine redirection greenday www48 host100 adb www53 host103 mda vik everyone aberdeen ooc latitude subdomain www.direct loans www.omega tmt stv distribution seb tsw eam web2008 dnt gbp hns kdl esg bpi annapurna staging3 testwebsite cs7 curie sdx mx.dev vertigo sandie ghs host114 autodiscover.dir gtp ptm webdisk.dir bluebox shinbodenki host115 itf webwork pdg tigris autoconfig.dir sccm simka autodiscover.hosting qam monitor-dev autoconfig.hosting msf angeldesign host118 www.properties ol msweb wu nonprofit flying phuket mna kobold shx uucp weixin pam mdp pit lota pinnacle2 s150 ns151 dhcp3 zhuanti netinfo julien kundencenter fortis liveupdate savremote bishop sii fotoservice tgs fmp svn1 polis fil vb4 harrypotter phpmyadmin1 win29 bistro win26 win25 win24 crm2011 newhome windows2 curso mack shoes win01 betelgeuse cavalier outils esolutions arena1 dylan michaeljackson grab 09 band cle alpha3 pumba gunsnroses mysoft web155 www.offers betting comps web153 db7 beko db10 www101 4all web152 priv autodiscover.development flyfishing himawari autoconfig.development w12 bowie portable robbie dhcp.zfn ftp16 gail erptest ftp17 biblos aragon provider gemini2 web134 kakaku test08 web112 cornerstone www.genesis cp03 corex capecod drag mm1 staging-www web103 emax cp14 www.biology psearch pyro web100 darshan over ws111 angeles pagamento ftp20 informatik dns-1 sba analyzer terminal2 banking ship se4 elsword ital ws112 joda kila nsf ws121 temp3 ws131 nizhnevartovsk ws132 www.gfx softball pano theory web211 ws141 exch1 78 prefect www43 ws142 clyde ws151 ws152 alexx geo2 ws161 ws162 enjoy ginga coma remi ilan ws171 web81 web55 82 zimbra1 ws172 siti web37 filr moses 85 ws181 static6 webdisk.services ws211 www.jb tess enlaces sge financialaid 84 webapp1 ws212 websvr1 tabi indianapolis connect3 cp16 cp11 cp05 promise historico.vestibular devshop fencing vmhost1 dbtest1 sc1 precios www.extreme mvs hubbard manabi straylight planetlab2 planetlab1 gw8 webserv payonline www.j appgatecl jimi pdns5 khayam stu1 su1 dena sahand atena acme2 axle scar resize acceso quince redirect1 net4 mx-4 sdfs belgique pier juggler pepo onex dell1 allinone blackshark cmf movi srinivas mylink d112 mcdata forma hcm.nhac sessions us.nhac intranets dev8 angarsk vm-jorum-live ulanude sanger www.katalogi katalogi shaw kitkat kidney yew weboffice dms2 pwd www.everything imgg imax valentin yankee hexa here account2 metalib mensagens ws-payment www.czat bipolar beneficios cs13 aac edd www.50 www.po saravana win03 iba s10145 host40 host37 benten ups1 www.dh caf ssmtp spd vs6 host27 santamaria argent host26 dcm2 tyros carreras so1 cyrene nathaniel workgroup terpsichore mail001 elecciones interact seshat arek callofduty libcatalog torch www.lego bosei.goto images.platform dco dec fuze interracial santalucia folderman blag dom2 acache host24 ecn antiguo ccache hiring fern host50 www.chatbox professionals host34 dpe www.sami preview-domain host32 divinity fet www.database selma karnage ficheros cl01 www.hack www.killer emeeting womenshealth majestic domainadmin mxi mxo lohas knowhow www.miass msu jag vyborg origins northwest vps128 vps127 muhammed jst cloudcomputing vps020 webdisk.www www.signup vps110 vps034 media-1 pics1 pics2 mcserver mvm diz dga www.arhangelsk ulan-ude www.police sankt-peterburg www.ivanovo epub hiraoka lbc khb matsunaga seto poplar adachi ssl6 ssl11 dalton ioc ilm camille jan solon djinn rko muppet venise moorea budo test.api iif italian zazcloud3 zazcloud2 zazcloud1 ishare tik gad fer casual fec uo www.si fca fao dta libftp grendel e-learn ntp01 mantenimiento onecard ermis beautystyle ew54384r9c9hyy company1 freespace nfe rw2 rw1 tos ibk mftp bragg test003 test005 amd97 test0429 netowl008 oldhost nbc tubo0626 arthritis painting cce ecomm charis umar itil bahamas wwwstage www06 www05 bigfoot messageboards www07 stage01 www.answers countrymusic vox vweb1 worms zep admiral k4 brenda lemlit www.ranking www.harmony biologi proxy6 gw01 quitsmoking destination partnersite experimental cmsdemo wincp xs2 lll rc1 elms www.secrets saurabh domainmanager www.bolivia concrete bsi valera www.filmy www.muzica ksiazki rda www.interface www.millenium departments 112233 tse jail localhost.test nwoclan www.roma www.ptc usp zn zappa haunter gs3 aspnet sym sv55 sv33 sv32 sv12 sv11 www.dn sv14 corina kurdistan malina kvm5 www.bulgaria oto gods hala dmo3 xymon tlp www.emperor tribalwars sitestudio wesam comprar hutch wilkesbarre mtm aozora mrt cristy bench musicians starz monitor4 sysy www.key fiatlux ralf animax chapel www.les www.belgorod sadik reign 6arab ctn edn www.neu ena kaizer epk buyandsell kaz ese ocm witnesses web2011 web2009 11111 aspect inthebox santamonica parody benji admon zmm mx.blog grandcoteau gi5 229 cours mypics fem alucard ftp.media calidad www.sexshop gradius 7oob tai www.egresados acj vbtest angel2 nail potter akb48 honeypot csl minimal tvguide tv3 coe bolton disclaimer cmg webdocs vacancy bro citrine mprod awp praxis cate gb2 pixfirewall boardroom coolstuff applyonline f8 modelo asm capitol newbbs weblab kettler aigle rainier apn www.dell www.surf kmv bron amu azc sanok sustainability indo h24 ale acs3 ftp.ads localhost.new vcp amie s925 sturm mt4 www.sanok e-academy itmail signature peanut www.bydgoszcz szczecin mail-in2 aces adm1 www.olsztyn kay faye mxrelay activa www.xbox360 sig2 tda whistler roses chao bta devsupport ethel mcdonalds recall allison arsiv yi mikolajki lsaccess pila ike www.underground violeta oce xara iz xfer gag ntserver polling vitesse 124 lemmy 115 www.psd 108 3e 102 internacional 107 cyrille mt2 webedi vungtau buff othman vpnex agw dst darin antivir inventor ssg mist kurt client2 jona stanley espero raul smooth mum volt reuters db03 www.deportes rpl storehouse miri alex1 2pac alternativa secim wee onetwothree reese intermed kolkata tus loc www.arena paranoid www.bingo kobra prazdnik chaser dasher www.tambov mony www.tms dpstar hos sev neptuno campfire www.chaos msg2 wm4 www.brand www.konferencje loop entrance spider1 omserver-iscsi1.srv miner bux cop serv11 nw2 energo st16 plotki st10 st13 aip whitepapers www.denis fw4 www.intl www.princess www.dot rets ims1 theboss kes aspen www.olympic chemical oid manila www.annuaire hiburan salomon pland pbx2 rave cob banco saul out2 carnage doug jtest hilal maintain rptest salo www.cyber lwp sabre jjxy autoconfig.wap webdisk.wap autodiscover.wap wfs mink dstest sstest avantgarde mote talon fulcrum luckystar www.first webmoney yana achinsk oceanos ariadna www.popup freehosting zaza www.girls gluttony auckland mme www.ed doin libcat tuananh carto makassar aann adda misa addy badr alix dim ally bmw1 guanli beat bebo amun idp1 ewb lp-infracom manis lp-interbusiness bibo caci asif ashu arya www.stk amway appa vladikavkaz nsl gaz kolomna hooligan mole webdisk.hr tut bold boot azad chiz dano davi buro acct bk4 www.kevin ehab carte cccam seotools www.beta2 bod hajj residentevil hosting0 box4 martins lilly khabarovsk tycho clement dilbert sipfed agni fulton web70 shelby greene bertha mail.plus www.basket bigstar kabu miledi vili gapp www.motor vineyard citrixmobile graham maks ord www.politics godlike kampanj peixun jsb 200 kontakt gertrude qks please luisa magia agm gauguin glenn kristina furious osk gmp ipb ipd sintra lav www.andrew foxx ome mail.staging tat kxfz bwch vit overlook admintools fito pc02 sitebuilder2 wolfe tati universo gola delo dies gora edem svet www.rabota oscar1 skorpion hina hinh rtrarccore muaythai systeminfo neruda scruffy ehra jago elektra hieu imas da3 sibir imghost iter facility skill forfree radiomaster mail.office matan dnepr tashkent ania www.doska mirror4 gamedev expresso mail.info kely www.sonic www.texas mmr nep portrait together starstyle mta4 www.diamond pop.m smtp.m ftp.shopping dnscheck webdisk.stream maas lips ak1 kuro www.vegas gerardo mich cmo division neha mrak nikki engel homeloans lyncws kras www.special lnx media01 www.avatar web2010 pein rico peng media03 opia pos1 www.promote contingencia outmail pop01 redo kks 195 fst pelops 4arab raa ron2 crypt phorum lombard shar webdisk.traffic simi simo wlw iweb1 tami freemusic stormwater souk autodiscoverredirect www.asp webdisk.pt stfu lsm usmail vulkan cnmail tobe tuba netapp flexmaster senna wala xdsl aloe worldnews fallback.preprod inw autoconfig.vietnam abner kuwait www.mock www.wetter www.mexico autodiscover.vietnam www.mmm autoconfig.uk www.egypt lecture ss01 mbeta denise juju www.kerala sharepoint2010 pbi prasad server81 www.smf bc2 wg1 www.webmail2 tm1 webdisk.events seo1 triad krasnogorsk www.44 www-neu www.vl cms4 webprod www.pagerank www.kurgan tourist emag rmm simpeg psinfo kariera openvas odysseus flag www.jamie.users www.eozkural.users fwwilson.users www.angelware.users davard.users www.malkara.users markufo.users www.mg4rci4.users citrix3 www.trial-4e2df4.users zsjy jessicagrehan.users jonathanmann88.users ldapserver helensoraya.users timesheets www.sls www.kruse.users adm3 www.trial-14d203.users www.lukestuff chltlahs www.finntimberhomes.co.uk.users arias www.trial-f40c2e.users www.rubber-facts.users www.johnmcmanus.users www.test1.users www.premieredance.users www.securehost2044.users www.moonrakers.users bleronuka.users www.test.andi.users www.humble.users db12 db11 decor vm14 vm13 robtest1.users conta skippy www.moonjam.users dhcp02 www.tpj.users www.mariajane.users www.bohemia lovejoy vds20 vds19 starmusa.users drink www.sunrise pcbscott.users vds11 vds17 minneapolis www.alexmountford.users www.alexb.users www.carly.users www.cyanideshock.users vds24 vds23 www.a1 vds21 jezz.users kata69.users sweepstakes molibi.users newmarket trial-4e2df4.users michael999.users vm9 vm8 toupiao mushroomgod.users macau stuckey.users gomobile yandex buka tadimeti.users beasiswa www.ukbikerz.users www.omoikitte.users flore flori www.cardigan.users socialengine brp przemo banks freud www.jessicagrehan.users fireworxstore.users mikepower.users bex.users mst2 bertrand387.users publicshare.users www.mrmarkmountford.users alutto.users newchurch www.plants1966.users www.slider69gdw.users phpmyadmin01 paulmasters.users poptest blackcat.users new.shop backup1-10 www.msfbiz.users guido www.alex3410.users rouge.users phone3 www.artsutorus.users laboratorio hoshi lmarsden2.users www.c-electrical.users chrischarlton.users pasadena www.php54 www.onlinedatingguru.users www.fireworxstore.users www.lyonsqc.users www.europa108.users trial-14d203.users backup1-1 backup1-2 backup1-3 backup1-4 backup1-5 backup1-6 backup1-7 backup1-8 backup1-9 www.trial-37e040.users khainestar.users trial-38af15.users www.forasf.users jinerenco.users redhotme.users www.reumatologia.users www.magento.sapin.users cartridgeworld.users www.robtest4.users www.dynamic o3 dhingli.users ivana hindsjohn2.users www.kandyug.users www.takeley.users itube forsale svc1 www.chrischarlton.users kerry ac1 mockingbird www.mfarry.users thebeach.users reumatologia.users futurewasp.users node4 assistlink.users www.thepropertyjungle.users www.blackbeard.users rfine.users cat2 eai www.binary.users samus dna-decals.users www.digitalfilmmedia.users magna m.apps securehost2044.users www.paulie.users www.timhoverd.users mclean www.custom lb4 www.asb www.razzz.users www.sina www.invertedmonkey.users www.dsimkin.users finntimberhomes.co.uk.users newengland www.talos.users www.scottcook.users noobs www.rsmith1.users cfos.users lr magali vip6 www.kata69.users www.jackson php1 www.dtc lfm www.tumpin.users www.bertrand387.users chrismartin60.users www.publicshare.users webdisk.sales hobe1.users moonrakers.users mlsw.users ermm2 php4 www.imagines.jinerenco.users www.davemountjoy.users www.text handjob dbutler.users thetwistshow.users www.stuckey.users christophe www.gingenious.users osh www.kitay-na-dom.users www.jayvanbuiten.users napa robtest2.users test.jmarnold.users sql5-replicat la-tardiviere.users www.educacion www.elskitchen.users save1 quito shiki longbeach www.can.users squid1 darranstewart.users www.bendidit.users www.g4axx.users adamcrohill.users blog.pcbscott.users lukewhiston.users www.chrismartin60.users video.etools egysoft edicion senate www.testt3.typo3gardens.users latex-facts.users www.woman anilaurie.users msfbiz.users test99 wvagc.users mailrelay1 rocio epic2 pgu georgesbigshed.users esra economica beef.users laurencepeacock.users www.elle.users moneyonline rui artsutorus.users www.jquery cinar sfera otsukaru.users vs10 binary.users www.clean-wheels.users bullets.users addy.users beartrio.users kate.users www.cgt.users places grevstad.users www.trial-38af15.users rainbowmassage.users forasf.users radu www.darranstewart.users admanager www.q4nobody.users www.nfenn.users digitalfilmmedia.users c-electrical.users www.techit.users banda www.unicorn www.victory can.users calculator www.wordpress.typo3gardens.users sketchbook.users www.de-jay.users autoconfig.home trrocket.users johnmcmanus.users autodiscover.home sforum tanga testing.another.users www.blueleaf.users www.lexicon.users www.latex-facts.users www.cpmotors.users www.beacon.users inspectoriguana.users mail.666 www.paminfo.users mfarry.users attorney ukbikerz.users robtest3.users onecandle.users eozkural.users www.imaginary tpb server69 www.tmedwaysmith.users www.philcain.users admin-dev www.html5 s61 heatsinkbikes.users paulie.users blackbeard.users www.zaphod star5 autoconfig.office cgt.users www.heaven.users s82 autodiscover.office carly.users www.thetwistshow.users www.timmargh.users s69 www.bex.users www.paulg.users tumpin.users test.andi.users wims ssa www.szkolenia across badminton www.lmarsden999.users kmail www.adamcrohill.users www.eleven wako www.veritas eggs www.lukewhiston.users www.jezz.users ccr mail.dora thien www.albarnes.users adserve www.buy www.pingpong imsandy recorder www.davidives.users www.weightloss jackdavies.users igrey.users tkk okami rwd premieredance.users communication.users crossfire hvc www.dhingli.users goa sander dsk apo www.medicine 7stars write qw dns147 dns148 brianna webserver3 www.smash www.heatsinkbikes.users web83 www.nagios web77 shankar nsx kxfzg bih ftp21 server04 web183 web182 www.ks cardigan.users tpj.users lb0 video6 alexatack.users www.jasonthain.users www.lv uni-regensburg sarahedwards.users video5 www.nm caoshea.users elskitchen.users web170 www.thebeach.users www.cyberwhelk.users stand ishtar www.flameboy.users www.helensoraya.users leeanderton.users nab www.wolf thepropertyjungle.users blade01 g3las.users navajo www.mushroomgod.users institutii hesham maiden alex3410.users www.masters ldapintern web157 fleetwoodmac buttercup comms dtest mining web150 www.noapacherestart web148 www.knowledge web147 web146 www.purple efi web145 names www.genius homeworkhelp web143 web142 web141 web140 www.institutii webdisk.catalog www.worldspan.users march-dmz libros my3 supporttest web138 web136 web133 web132 web123 correio2 www.cse pup co.users misocial.users sterlitamak imob abakan www.communication.users incest ras1 nfenn.users web130 web214 web212 ntp4 macro winners phi11ip.users www.q web207 web206 www.tadimeti.users magento.sapin.users daleel web204 eleulma hi-tech web203 rpa www47 paloma web217 web216 m.store sigaa pokeworld nusantara web215 bottletop.users webdisk.ns2 www.jonathanmann88.users www.millwood.users wc1 web87 angelo.users web86 web82 web80 mynews milka web78 www.csr nanas airtel greyhound www.lmarsden.users web137 chrismadin2000.users jacquimarsden.users userweb mychat web135 web131 web129 web118 hayabusa web205 web99 techit.users mx07 autoconfig.services noelle jammer ichat www.lista mariko stw radioclub autodiscover.services public1 www.tax travel2 public2 imb autodiscover.apps autoconfig.apps gerenciador demon-gw toplist sayuri www.xceed.users happydays irmucka.users hastane stream5 iibf ursula tblern-scan blern-scan habbohotel de-jay.users crab webdisk.demo1 rac-scan konstantin sidekick tblern1-scan claudia secondary006 bra csr12.crsc csr11.sci gupta car13.net mytime car31.net strm indi amepop www.dbutler.users jayvanbuiten.users bookmarks www.paris cird blitzkrieg leos threadgoldj.users millwood.users www.chrismadin2000.users szablony www.asfdgh.users robtest4.users sh5 sh10 sh11 nirmal dev03 pushingarrows.users ise cdns1 authentication webdisk.kb test05 igri tptest farmasi www.bleronuka.users platforma ftp.www smail1 seguranca drucker orig intra2 unica principal jamie.users takeaway www.tomfox.users walid smtp-1 reminder wordpress.typo3gardens.users rov desenvolvimento dimdim www.sarahedwards.users beacon.users heaven.users www.df stuart.users www.cfos.users www.la-tardiviere.users vijay www.fc backdoor kruse.users corpvpn www.ff padang secure01 monicabatsukh.users blackmamba www.fi host181 avc web-prod milestone mailgate4 magnesium s148 skat sh13 ioa www.cmc cosmology memorial futurama utc mail.uk host127 host123 host117 echo360 sh6 handle mosta freenas mmorpg www.webshop mekong ex01 www.freestyle www.w2 webhost1 traktor chart technologie tupac screensaver csu centreon www.ica sp3 attpos freelancer mariano keti vns2 bkk cdp1 www81 www77 www80 pix2 rsync3 archie eyeos narnia sh12 intranet3 postino archon cashier moodle3 test33 gruber www.meme undead telephone wallflower fuckyou maha tracy standup loginlive inmail gecko tethys gator sombra unnamed wirtschaft medien host126 host121 acn at1 toker vhost3 host119 www.peru tug autoconfig.drupal autodiscover.drupal testw buc idtest ctm sunflowers smpp4 ene smpp3 mando go3 hbs rtb census www.sexy h20 jumpers m16 m14 www.drupal.publicshare.users h79 h78 citycenter h77 h76 h75 converse www.candy vdr h74 um-mailsafe-00 um-mailsafe-01 h73 h72 medica h71 laboutique sm07 h69 h62 www.test.jmarnold.users esx7 ink jes europa108.users test1.users iri isu msupdate h23 smtp06 h80 www.bullets.users freepbx www.rouge.users www.fwwilson.users punisher adverts installer akademik www.pushingarrows.users earnonline nex movistar mill openfiler sin webdisk.forum2 oob lexicon.users cims foobar rgb babyboy authenticate yemen wink say karsten m02 handel shree tnc ns202 ns162 ns191 badboyz irc3 navier zap maroon ysj marlon yuu marseille mecha markos www.ce www.cg number babar www.dsp webdisk.lists lovestyle theboy marche stest crdp socks nomercy boardportal zephir kirei mangas kms1 milky facstaff listserv2 mindy 315 natty fff www.rb paradis reckless hannover kin icecream ladder clarion win32 mmmmm mobel kimo zizo petunia nexon moral kansai milou braveheart www.yar athome arianna u3 carrot kiseki n218 pika blackmoon vremea www.vremea sada wug woodland knockout pronet qk literatura blackrose mservices aji www.presentation attack iadmin omani www.1c parks version gossipgirl yaka www.ck www.ly sega picka tweet helpcenter under tanto renshi houqin colombo referencement kusanagi umail sponsors nid dfs mtu hcl komik varun irma hughes admin8 visionadmin admin4 teste2 www.kronos roller vero delete turnkey svr1 jiu tucows leonard wapmail addiction vdb www.thebest vgrp1 platina free1 nintendods journey superb welcometo lunaris sense spook www.luxury www.servicos oa1 bonbon macha greenlight rodin talbot ans3 breakdown www.ant serge letras rules autoconfig.docs du autodiscover.docs ade sheng www.pma www.out dth tammy cia ads.be iavfatnfoopio.be siham zhidao imhn nagatacho bistrooz www.cit gnt nobody sexxx deki stadia np13 kth umegari teebo iml whd www.csi squirrelmail satya ksm qy ij notepad santi nes nickelodeon autobahn neverdie fls www.developers pis hacker1 voda www.ideas kento sajad iit www.synergy www.sci snp www.koko sor satoshi umk wet wmc doctorwho studio5 guesswho synth sysop ezone joris maize husky yamanaka cachalot thesaurus haruka collect rajat shikaku sylvan foxnet peterpan kogao camelot d35 d33 praga graphic rudeboy msdn anyconnect a001 d19 free123 scorpius aska yakutsk license2 undercover salmon mackay lakeshore qwer darlings sowhat scf www.mirage udec formula aid www.camera psychic session zgloszenia lorenzo elf ipv4.blog c26 eagleeye smap ucs leonidas kagura alban akiko asas devi befriend pandy be1 windy salvation uto cain poweradmin karas amol b83 b77 piracy aton b71 flp ohana default-mx esta pso munch psf qed b59 testns crosslink rising b52 b51 choi a-hm-3107-diemthi dala mail.beta www.mlsw.users www.blog.pcbscott.users mfl momo2 alexb.users dann spaziocloud.users www.leeanderton.users www.jstebbings.users lac tmedwaysmith.users net4u www.khainestar.users www.imperial los www.jacquimarsden.users chezzer.users www.robtest.users lukestuff www.madmax www.foobaz.users www.marlin2001.users www.robtest1.users www.monicabatsukh.users naren www.cartridgeworld.users www.hobe1.users motorola www.stuart.users bendidit.users mayyubiradar.users cult www.dkproperty.users h9 ema nabil onlinedatingguru.users efe mihai cwj e7 misato imagines.jinerenco.users timhoverd.users louie www.jinerenco.users scottcook.users jiji faro nishiyama dusk cyberwhelk.users feel www.ermm2 metas prisca retry aci livetv www.beef.users kunal marlin2000.users mazen wendensambo.users erin rubber-facts.users marty www.electro marsa www.mikepower.users riverside.users jasonthain.users noapacherestart www.threadgoldj.users www.addy.users petehowells.users www.kate.users www.phi11ip.users invertedmonkey.users www.blackcat.users cyanideshock.users www.anilaurie12.users malkara.users hada mg4rci4.users vacuum gol vw1 bsdb-cluster lmarsden999.users autoconfig.book q4nobody.users hhhh www.aln.users autodiscover.book c2i www.wvagc.users krazy www.angelo.users www.rfine.users www.kiding.users www.markufo.users koora igo gweb levis blueleaf.users kokon pro01 dsimkin.users razzz.users lenin asfdgh.users cpmotors.users micho moonjam.users juicy www.caoshea.users www.automation playstation qa3 lamar cronica mail.out talos.users maillog yf philcain.users tomfox.users bestgames yyxy ns8-l2 typo3.heaven.users myanmar ns4-l2 keen www.spaziocloud.users www.bottletop.users joint climax peristilo.users timmargh.users aln.users angelware.users trial-37e040.users gingenious.users omoikitte.users www.georgesbigshed.users robtest.users www.davard.users plants1966.users www.robtest2.users albarnes.users www.anilaurie.users www.irmucka.users juni www.redhotme.users www.rainbowmassage.users www.wendensambo.users foobaz.users jstebbings.users putra lyonsqc.users rgmcdermott.users www.laurencepeacock.users mrmarkmountford.users www.petehowells.users marlin2001.users www.michael999.users jessy www.testing.another.users thethink.users humble.users g4axx.users preview02 www.thethink.users www.jackdavies.users hukum www.lmarsden2.users cheater flameboy.users boise www.igrey.users www.molibi.users dkproperty.users www.sketchbook.users kandyug.users takeley.users lin1 anilaurie12.users www.riverside.users jairo www.misocial.users www.alutto.users smtpa drupal.publicshare.users www.inspectoriguana.users www.g3las.users maro davemountjoy.users s330 aaaaaaaaaa www.marlin2000.users lemonade lmarsden.users maul mayo www.tomfender.users humas coba www.simpletest kitay-na-dom.users gross kiding.users rsmith1.users theo greek greg1 www.typo3.heaven.users gracia rockers www.otsukaru.users elle.users www.chezzer.users virtual4 www.grace bitacora www.baseball www.beartrio.users hazem hayat www.clienti www.grevstad.users slider69gdw.users www.retro paminfo.users www.indiana trial-f40c2e.users www.onecandle.users tomfender.users www.pcbscott.users www.robtest3.users hanif www.hindsjohn2.users debugger xceed.users hallo hamad www.trrocket.users worldspan.users mariajane.users www.mayyubiradar.users www.futurewasp.users www.assistlink.users clean-wheels.users www.peristilo.users eplans www.starmusa.users freak www.co.users www.pool www.test7 www.alexatack.users www.dna-decals.users alexmountford.users nar wells davidives.users echoes testt3.typo3gardens.users evita paulg.users mmmm luxe smail01 www.paulmasters.users ska neno nera 987654321 www.rgmcdermott.users daniela www.kit sli ganga ervin wa2 www.recruitment eslam webco films mmg mori epoch moya corps msis image165 test0 image163 ramona noma qingdao tlm uranus2 torr one1 postgresql akbar fatma vip99 orso tyx productos webdisk.demos evolve ppms hs2 qqqq print1 sang gearsofwar diabetes lostandfound shak foa unm daidalos soya origin1 sw93 vesti sbm hummingbird triathlon toki shekinah toku toyo trap ibrands fcr xworld jisan unas www.bologna wait pre-prod want www.career webx debate monique wwwe endless armenia yohan zero1 zeros shadowz spamd2 spamd1 inmed tibet youxi www.ccs accelerando pub1 furax togo hotaru www.dan gmi itproject blackadder coda faceb00k daver aether rost locked www.don facbook cabaret game3 roadshow esb zzzzz lsty autodiscover.scripts webdisk.scripts autoconfig.scripts brock mywedding ensemble renato ayumi wolfgang www.jen veg www.samsung www.isp hosting02 www.cash include www.joe www.gifts hibiscus kasumi revolt mch grid1 cte november maxxx sweetie sunfire www.psych regi mycp ivc musical gamingzone westend athan imagination daydreamer dementia grades aslam agg home01 armin www.sam fountain arief pasha jobsite archi isabella www2011 www.ek energizer revproxy slh sabine thinker daisuki dutch justforfun www.sky lfg knights flexible kahori schoolnet riseup ptp wanted www.ssd andes saleem da18 redirect2 www.ver wdc gentry denmark centaur naos autodiscover.iklan autoconfig.iklan ameer apc3 aamir thefactory pyxis vps12 cdp2 test-mail amour realize is2 basma www.nightlife satsat lockerz phpmailer jis nathalie babak bdg fantastico starnew rebecca group12 www.naruto asx skyview imusic tra www.jewelry maui admis user3 fati cisco-pv2 googlemail bora livescore homebusiness gangster bigbluebutton abdul abdou abbas dotcom infoline probando surface sensation favorites bahrain jeevan dreamgirl msb blackfox umzug imagestest vivid mlsrv muzica9 ceit inra shanks cooking shiraz soundbox erepublik loading robocop dream1 onestop imagem webdisk.android smartgroup autodiscover.photos mema adonai crazyman autoconfig.photos crypto dns04 gamenet stronghold blogshop postcode revolver starpower srvc www.spider bromo simulation mptest radiomix pop.mail hangame rabbits adstat dever mydns dandi academics webacc buggy sa01 burgerking kant celtic nightingale homebase imagelibrary batista hobbies bbbbb jacksparrow webos m.new almaz zoltan www.proyectos fn deutsch devcenter www.street mentalhealth freelife photoart www.zeus tiptop hifriends ftp.us support-test galena www.arizona autodiscover.portfolio autoconfig.portfolio cabin cacao frankenstein catch appserver host53 ankush shopper sunbeam www.tds devin fcbarcelona vogue mailint iskandar blade12 mailscanner stic magritte physical eoa anniversary netgear break personnel choco lovegame theghost fluorine bobtail www.legal www.pd www.umwelt bhakti cindy sd2 quota de2 apple1 dokuwiki www.arch hansol www.educ silkroad shalom www.audit reg2 s1013 s1011 jny s184 persian pcdoctor crazyworld creativity spiele www.hg alegria employ ela thienan s199 hakunamatata exposed pch hogwarts kabuto merino cosmopolitan thames www.vision merian emilio arvind bratsk ichigo echos cydia moore eurovision linkinpark margie castro pcsupport fatal tomodachi s197 states friendster nightwolf ftpw s196 hitman chameleon ravindra testman www.cdc guatemala www.cec www.cem testowa gustavo yousef www.sugar prolife redstorm daredevil s166 cybertron dancemusic shushu s160 s194 s165 supermario www.cartoon dear grigor s193 alicia natsu mata elham syntaxerror suresh alvaro veteran faithless nightfall ethan thehacker mikes fall www.delivery.b emailserver silverlight mp6 mp5 nomore vm12 itools lbmaster franz bigboss renew2 alam lbslave front5 front4 westcoast selling hydro dudu dresden kalki tarzan erebus gana gazette instinct cluster3 hiden palette mysql15 govind greed mysql12 www.cine arabtimes brands blacksheep kam top100 gill uganda www.ra toip linux5 theearth ether bobcat s163 www.fear smile2 zi instrumental fwd myroom www.content jessi hypnos jupiter2 scarlett sirocco vpdn destroyer arar warlord buh restricted tka photonics lyceum fs10 cipher kaze aist fond cardio a-dtap.kalender t-dtap.kalender d-dtap.kalender file4 pass3 games4all lvov www.c1 santarita futuro cccc asturias www.ivan armand horizons sufian mohammad itb testi www.check scipio davide tjj registrasi webcheck metalhead tellus click2 fgw afghan saravanan samantha chatbook ns134 ns135 ns137 vagina miniclip dumbledore pc13 burhan harman naim bamse www.read zarabotok log2 www.sara logger1 pc5 anzeigen sm10 www.wolves searchengine yxy xgxt forum7 haitam www.promotion twit ajaykumar ws7 preguntas newdb piramida ws12 amicus mourad cordelia tc2 words autoweb etic pmail suma krasota mmi smtpout1 www.ssc ediweb email02 sout komachi archiver ms01 ms02 photo3 nethack vpn10 www.mci cont gifu okayama www.questions shashank yamagata oec portaldev cmusic notifier tns1 www.oklahoma www.michigan annarbor tulsa mybb pmg kabas bizcenter zl yj postgres antivirus2 daemyung dent secure-test helpnet devcrm thinking www.recipes mobileconnect euq clube salesadmin is1 samy yess www.flowers tstore vial sysm bibliotheek www.tom vesper ux megaman www.la2 rainbow4 rainbow1 likelike www.yahoo file5 brittany poas j25 class2 google2 www.pai edu11 newb www.sommeraktion crg historico.concurso sommeraktion autoconfig.community autodiscover.community sa3 linkproof1 router3 www.gameover moschino koolstuff beef test25 technical imai mailsecure testftp iaso gown twp vadmin healthlife server38 searay licai backup60 kamakura peliculas www.nicaragua noa yukari eq halle testcrm nima ste infoview www.nod32 gena babygreen dbgs sigahu webmail45 www.blue www.nas brn starmax webmail40 tamara3 webtera campus1 lsi hcs becas www.ie chois ching nadi webmail43 webmail42 www.sme webmail47 martini webmail46 webmail44 webmail41 mena webmail39 webmail38 webmail37 webmail36 webmail17 lando jango boba conimg webdisk.galeria host227 referrals starmaroc ctxweb mf4 anket eob www.tas cwrumtas kess qaupl mesa-gnu01 mesv-transit01 mesv-transit02 www.venezuela mesv-transit03 mesv-transit04 koma mesv-transit05 www.chocolate mesv-transit06 mesv-transit07 mesv-transit08 mesa-para4 newmusic vpnslc eng-core slc-para-poc2 slc-para-poc3 slc-para-poc4 mvrscorea slc-wad01.sorensoncomm yacine mesva-vp-para3 vcmessagea econ-upl-vip mesa-ios-para1 mesa-ios-para2 mesa-ios-para3 ecov-mo-para1 isma yama ecov-mo-para2 ecov-mo-para3 flavio jimm ecov-mo-para4 ecov-mo-para5 slc-para4 econ-gnu01 econ-gnu02 econ-gnu03 econ-gnu04 www.tamil surprise econ-gnu05 econ-gnu06 econ-gnu07 jeje econ-gnu08 hi5 ecov-transit01 ecov-transit02 web001 ecov-transit03 ecov-transit05 ecov-transit06 ecov-transit07 ecov-transit08 sc-email01 mesa-para3 con-wad02 diemchuan2009 francesco slccorpweb dns15 dns16 dns17 nguyenvong2009 slc-cuda03 grim mesa-para5 chold con-sql-sign01 hydrus mvrsmessagea smi-gurgle hrftp con-tux01 con-tux02 con-tux03 absolut contactus con-tux04 naka slcv-ts-para1 spanking slc-para1 mesa-mo-para1 mesa-mo-para2 mesa-mo-para3 mesa-mo-para4 serverdesk mesa-sql-sign xnxx qava-para1 qava-para2 ext2 dev.api qava-para3 qava-para4 slc-para-poc1 dr-sojo-cuda onyxlb listman mvrs-core-staging econ-vmscuda1 econ-vmscuda2 sogtest realtunnel woohoo slc-tux01 slc-tux02 slc-tux03 slc-tux04 liber mesa-upl-vip drs-tux-01 dbm drs-tux-02 drs-tux-03 drs-tux-04 mesa-vmscuda1 mesva-ios-para6 econ-cuda01 vpnmes econ-sql-sign1 mesacorpweb cuda05 mvrs-statenotify-staging sc-email02 urc familymedicine dboardiprelay mesva-vp-para1 werock mesva-vp-para2 obchod con-nimbus flasher mesva-vp-para4 mesb-hold7 slc-para2 slc-para3 landscaping alejandro con-ldap01 con-ldap02 vrsiilms message3 ecov-pc-para1 ecov-pc-para2 ecov-pc-para3 ecov-pc-para4 ecov-pc-para5 mesva-ios-para4 mesva-ios-para5 patent nci econ-tux1 andy1 econ-tux2 econ-tux3 econ-tux4 qadownload ecov-vp-para1 ecov-vp-para2 ecov-vp-para3 ecov-vp-para4 ecov-vp-para5 mesva-ios-para7 blackdahlia mvrsstatenotifya cuda6 bourbon symantec cuda7 mesa-ldap2 mesa-ns2 saltwapolycom atik mesa-nimbus1 mvrs-message-staging bluehost ntouchftp production-www bastet mesa-tux1 comunidade mesa-tux2 mesa-tux3 mesa-tux4 mesa-para1 vccorea felipe wonderdesk statenotify3 chenfeng kate qa-auth ecov-transit04 reddwarf ecov-ios-para1 ecov-ios-para2 ecov-ios-para3 ecov-ios-para4 ecov-ios-para5 ecov-ios-para6 ecov-ios-para7 ecov-ios-para8 mesa-para2 ecov-vp-para6 slc-syslog01 slcv-exedge01 engftp mesa-ldap1 www.cdf ue ww0 mataram oi newtimes spud usage wwx webdisk.ar kirari mainweb pajero lunch flagship fisica devang dwalker daejin amiad admin02 gfactory sslvpn2 zihu tranny choral tomson boeken widi toons hull dars farzan millionaire bol competition freewatch bilgi launchpad b319 b318 b314 b312 b320 planet1 b122 b120 b115 schneider webdisk.toko shair roma1 summerschool senal sejin hummel shinya bombit www.vote www.sitemap timehost autoconfig.ip autodiscover.ip ecoplus gst koeln stylen subnow reweb host08 gwsync img44 193 www40 stat3 hitachi zencart 207 167 inet2 151 sadmin stlike 133 moodletest chester3 admin-remote img15 img16 webdisk.tools nteam kcp verygood www.22 buch mrbig nice9 colin biyori greenhands diff communicator felicity scrappy postcard habby vender rot nextgen dev-blog www.novgorod devs barak optical facebook1 facebook2 webdisk.ns1 softzone sandbox4 sandbox3 katsuya hamsa ad01 spor0 secim0 w13 artisan vulture fotogaleri0 wasabi priyanka debbie ows sondakika0 resident fileserver1 rudi win36 gannet lafayette asw01swd turkish netuno firdaus adminservice battlefield wattle edward www.img2 jcraft mallard wassim shaun www.darwin stork honeymoons waseem bf2 qatest3 map1 cw12 subekan technics cw11 graphicdesign cp07 belmont waleed wren belleza sybil web11301 vishal w01 web11111 caladan web11101 web10205 jmf n6564321 chatroom www.paula db05 walmart topgames bowser oneness www.hep vbc sff lse secureserve snap-scheduler.round-robin crying masseyanywhere helal king89 autoproxy snap-event-sink.round-robin flw ebdaa3 tur-ldap amnesia getmyip devstore sportcom alb-ldap ete snap-developer.round-robin pregnancy fight adoption fatherhood google3 mailstore1 snap-docs.round-robin bidding snap-scheduler.site snap-event-sink.site rapide-web.class webpages icprovision.cic mu-mailbe parth snap-server.round-robin www.pogoda cyborg schmidt newgames okc rosie-glow.co.uk api-web.class bobbins ttest snap-home.round-robin lak windward drcorna-bms biomass account1 hollander eskandari ts08 celestial eslami turnip jongho7410 tmdrbs2 gw6 tecnico pricing pcsuw020 dhcpfa1a dhcpfa3d nuvola dhcpfa3a hyejin24 dhcpfa2f armode21 maen2002 www.mytest dhcpfa1f newel madinah dhcpfa39 phase4 dhcpfa31 dhcpfa30 www.responsive bluesee710 dhcpfa27 halifax genx dhcpfa23 vision1 zangbie fff327 myspace2 dhcpfa21 rsj staging01 tur-cache choigoda dhcpfa19 heylis98 dhcpfa16 jong7188 vico dhcpfa14 dodream dhcpfa12 qorthd andriy watch1 dhcpfa10 gachimaker www.sv www.21 mousavi fololo mushi www.23 pc-hwell-10 likekid casinoonline brandlab connect-test wel-ldap dhcpfa3e egotrip nasr dhcpfa3c olympics goldencontent tinies nonos uas www.32 kimaa79 dhcpfa3b klmwook1 pdns1 blackroid pdns2 docentes pdns6 jinakim dhcpfa2e dhcpfa2d khaiser dhcpfa2c v1002 sungdong dhcpfa2b dhcpfa2a crossover dhcpfa1e phoenixadmin samwootech madhatter dhcpfa1d sesp dhcpfa1c nursery sunwoo1 mave hsj234 parsons matome dhcpfa1b dhcpfa38 goung4242 tur-print kjj8101 uploadtest dhcpfa37 dhcpfa35 opendoor gid045 webdisk.entertainment juese1 dhcpfa34 dhcpfa33 dhcpfa32 emad m.mobile jia1728 gogogogo cherrypink dhcpfa28 ssooal dunya asal ryuhyuna arak junseok sjpeach dhcpfa26 kurosaki best-life dhcpfa25 dhcpfa24 hellsing dhcpfa22 navision dhcpfa20 img24 derkuss0706 juli45 domato dragos eflow1 136 donati 139 dhcpfa18 andys dhcpfa17 acer12 dongui bestpeople 150 dhcpfa15 sucre7 dhcpfa13 dhcpfa11 bryce webchin9 www.teszt puff pc-hwell-9 haken fishinggear partyhouse bigeye swvpngw-ssbcom ppp2 ppp3 201 planetx chelm contabilidad hanbok www.wf web11121 monik web10198 robyn webct4 www-4 www42 jjodash auracom ehouse multicare zcs1 husain linuxadmin alberta poincare zapf gravityfree nun drkeyn-voip webposrt ipro master.ldap wlc1-ap-mgr5 maebong klein okey gameboy vostok dnv worf adrastea misery webdisk.survey elumitec dhcp120 dhcp116 zenwsimport web10169 dhcp117 dhcp118 tkts01 aspdemo salewa jyoon dhcp119 leed20 evergreen2 vibe dhcp121 bartok iac pepin samjin t15 evecare redmoonpo acomma news07 luciano dhcp122 matematicas www.virginia cmr habiba dhcp123 moohan pcadmin dhcp124 jayeon dhcp125 smartplace njell249 host225 kgoodtime comeback naty host226 tamar elmasry coffee01 hmmedical dhcpfa36 dhcpfa29 oldenburg gate.ocn gate.so-net yahooblog webdisk.whois c-4402-v03-02.rz ajh0381004 kook www.cleveland gate.yahoo faheem comunicacion gate.biglobe eadmin saksham hekate check001 promoman v6.ext wycieczki devnull studio3 rosehill gate.yahoopremium gilead keko gate.nifty yahia carshop server112 edexcel shyduke1 drcornb-bms forestry test0000 gangsta pongdang www.cai rosse supportdesk ksm0759 johndoe happyh jmac imgsrc ernst drcorn-bms nefarious drmrala-suep heon1567 www.nautilus drkeyn-swmgmt sinbi pc7misc059 navinavi amo tequila altmediaadmin b152 www.phs sstp www.uni bosque gre it3000 mgcp-cgoon01ca pots-cgoon01ptc asm-cgolab01ain pots-cgolab01ptc sim-cgolab01ca kokomo charleskim1 songhee shspa85 asm-cgoon01ain deathknight steph farhan auctionboard sia-cgolab01ca niche2012 toastmasters tjy0514 darknet sim-cgoon01ca mgcp-cgolab01ca ithelpdesk sia-cgoon01ca webdisk.adserver sia-cgoon02ca ajkzz429 psh4637 sung3moon dksxodhr greeneyes negative vclub mauritius boomtime heungwon der www.colocation fuse onlyu pawpaw idp-dev www.kings bprock yjs9535 chuck ssiso elba payment-callback delivery-ng industrycert pw01 mstg pw02 foxit geos gogopro eduforum nikkip baige111 eurekasa dagon facebook-callback db-test microsites kryptonite vmware-controller inner2 seafood1 scurve contratti pvcs kees ip214 ip225 ws-partner ip227 dolarge17 innerlight mineco21 testocn2 3ring tory1 kaiser1 ip231 seesun ip232 ip233 crashdump facebook-log september9 sip-fw ufficio-old ip234 ip235 ip236 apm1010 smtp-local ip237 coolingmusic ip238 bbang redjinah builder.hcp clean123 vacanze cocomong godqhrgotdj ip240 webmail.hcp etec nutricion prometeo barron casadeaur ip248 newtemplate ip250 midia tricolor webconf.um access.um gkthdud9 sip.um ip202 kwonsusan av.um www.cacti ameli bcode www.mia www.translator cinbui uncle tae056666 fina cs03 dongin99 homeandgarden bata template1 projectpier www.msc mckerli mlg ftpbackup netwatch test9d autodiscover.hotels employees hyung0502 mihosubir elit ip213 test9c ip230 ip249 test9b stoc dbservice 0000 syd-gw2 besttimes autoconfig.hotels autodiscover.ar tr-tn-0002-gsw vs7 test9a queenie d205.dev vs8 d101.dev vufind d213.dev d209.dev wwp autoconfig.ar d221.dev d222.dev tr-tn-0001-gsw d228.dev test8d host45 community2 lenovo kaoyan imoplataforma web11142 d207.dev poster test8c terminalserver hb-gw3 d215.dev www.publiker endang fondation d210.dev antena d223.dev pcservice dinamica d217.dev ipmi colaboracion brok cod4 252 chuy 253 uruk bobi www.kls test8b ceco test8a powered testwp test7b consultoria test7a test6c agn test6b test6a test5f web11858 www.webster cba peacock test5e test5d kmp mssql02 livia yoshimura www.computers handyman ya-ali sakamoto cee srv05 amazonia work4 webdisk.image www.edukacja mx14 seven7 flv2 thoitrang aide autoconfig.proposal repositoriocemabe youandme werner webdisk.proposal www.proposal autodiscover.proposal rockadmin nudist mx1.mail elab tims acti acsi takepic bcache nereus adops wlan-switch.hist wlan-switch.khm wlan-switch.svet hme firework wlan-switch.soch ahmedali wlan-switch.circle kabin ear wlan-switch.saco egao linux01 vvvvvv en2 kamome mandalay top2 wlan-switch.plan wlan-switch.teol abhijit sm02 wlan-switch.kult karem historico mta001 wlan-switch.psychology wlan-switch.igsh wlan-switch.esss evan wlan-switch.ekol autodiscover.manage wlan-switch.bygg wlan-switch.cait jenkins1 wlan-switch.botmus sirio wlan-switch.guesthouse photographer moviestar www-tt directaccess wlan-switch.hum.sol wlan-switch.lundakarnevalen cdn.origin rss.origin wlan-switch.sambib images.origin gian www.iwww wlan-switch.lunet wlan-switch.lumes mailrcv mc1 wlan-switch.gerdahallen wlan-switch.li.sol mail.bb wlan-switch.kongresscentrum wlan-switch.englund moviezone ggw login.omv gamecenter websrv3 parsian dns30 wlan-switch.konferens dns2-br dns31 wlan-switch.rektor tsnsql17 b3ta royalty wlan-switch.iiiee amavis tsnsql18 sportnet www2-spd gamesx micro1 wlan-switch.ub wlan-switch.pi wlan-switch.upv wlan-switch.stu x86 webdisk.ticket mentoring debica karthik gwweb mail2.pics wlan-switch.srv biyoloji wlan-switch.sol wlan-switch.soc wlan-switch.net wlan-switch.lub publishers wlan-switch.mhm www.vancouver qtss q123 etime wlan-switch.ldc www.oldsite oita wlan-switch.fpi gaurav kumamoto wlan-switch.etn dpi iwan exhub wlan-switch.fil wlan-switch.ced wlan-switch.ark kip wlan-switch.adk wlan-switch.kansliht www.bma wlan-switch.oresund wlan-switch.botan coaching raleigh wlan-switch.pedagog vreme podpora wlan-switch.kultur wlan-switch.astro client1 muaban wlan-switch.evaluat wlan-switch.luinnovation soraya dreamweaver webservice2 autodiscover.legacy autoconfig.legacy contentx kearney thinktank millhouse ile kls mailservices leroymerlin tomek www.internetmarketing netstats ukvpn gut tnp adios host22 waza k2000 okna a12 lior syt host19 pager aida01 host18 smtprelay stor api4 abbey idximg01 lito eii s321 host17 moulin videoblog www.baza gdb spiceworks oa2 vitrin.vitrin gofla010 etu damavand vpn-server generali archimedes cust siberia 5star host15 betawww gate1 ntagil address autoconfig.labs autodiscover.labs gpr rivne jiratest ibe www.lviv v6.int pashmina padme kharkov vblog assessment socialnetwork erevan oola godang kirovograd ifc limbo1 limbo2 hansolo rom rok tallinn ikar www.mid clearance tree76 tpvlfh bcaisp lhc swatcher www.celular parati gdcaisp pvp jpg www.platinum shcaisp vps118 vps113 vps111 wbt bergman 1983 vps029 ndh8134 jscaisp woohaha121 constructor png 3000 lovebug chon1 lmb vps117 lalala3 dnglobal loncapa bbnb hema vps116 vps112 lss ip20 pics3 noi mte zcaisp vps015 xms wwwmail jal sukien ffs starfox ssm car4 media7 www2dev damko junauto vdi2 oldnews gsp www.orenburg new4 www.chita mongolia www.tver lte pak perseo bigstar19 www.inspiration fallout newzealand sanchit registr pruebas2 doa0614 kiso kubota maruya vitruvius lin2 magokoro swingers bwby realclub ansa interfaces kusakabe oko perro pho www.euro online3 noilly gold777 www.bz cozy bstore oceanblue www.nt ssl16 plt sandeep mx21 vcenter01 www.watches paros sassafras sandesh montenegro farma hht preprod.m hca gkc enciclopedia canit mahler mainz sandman dolf czen mirabelle sdb raoul catalpa sfc smile2233 goldline ev12 foshan fuzhou www.giftshop lettledyr dialogic dread 176 reward etp fkm gat web154 baekse emi pub3 web104 gongji hideip-france 001 010 hideip-india hideip-germany l2tp-in l2tp-de cals2579 ip-in dev98 ip-de mantienilatuaprivacy ip-fr video-italy webreport certificados dsb redrock bonsai applet cheonji oldschool gook tlb onthespot funnystuff tantra www.boa libtest gpnp dht animezone kshare chem1 bys whitewing1 baesunhappy jin123 lje1265 mtp dgp jdev girlbygirl igc inni ipas iotv jiae qmailadmin yell-sandbox d220.dev jkbn d225.dev bbmy486 airljs d201.dev adforms4yell d204.dev d100.dev oneorzero myschool d212.dev d219.dev d211.dev allabout intra1 baccharis pond d227.dev mushi3 point2 lockwood d229.dev internal2 linkproof2 d206.dev d214.dev makk d208.dev hostings d216.dev paulsmith d224.dev sandbox4yell werkstatttest ict4 adforms leadservice mail.fis daten jjibbong d202.dev d203.dev koko1234 www.werkstatttest proxya www.pet d218.dev rawl eyecandy d226.dev time119 l-ukicalifia.it yeslee joule3700.its kagayaki edu21 edu26 l-s-a000307.it unicef e-uskj5y59e.eps ballo001 v100 gymiin sq2 cl5 old4 www.adult webdb1 tkr hwaya0952 videoteca jinhwa siegen gprs pingu313 erb tmobile playerint main39 ndc bcast adoc puny bc01 bc02 sqltest chr holycow necco babysoo webserver02 playlist cid www.catalogo sban autoconfig.properties tennshoku awe autodiscover.properties energie icepeach hosting11 ceb gesundheit cumall proxyb verbraucherschutz womenshistory empresa institucional m-relay gsd oda philosophie transact em2 ihm bartar flanagan woohyun netsecurity mjjproduct siemens1 studium addison astro1 sl2 sl3 8888 testapps crossstitch milenio trackandfield 187-122.owo sv126 farm2 northernnj blk www.webboard marcas mooncho5 privado sdca atr iphonerepair koras saml autoracing mutualfunds rmsnlf2140 silctl vpn-dev bie casinogambling usedcar onedrink threestar imhotep worldsoccer vpntest bfg p1-all2 sfl zk api-staging usnews as6 theotherside zata gouk hra globalfood roadtrips farming sinjin fallingstar sytkfkdgo3 slave4 bosfood economia specialed m1234 lss0918 www.opencart amr sv125 cplus calendar2 lacrosse originals nasan neuroscience zyxw beta5 commons moviles bellavista symccloud www.sato trgovina bookclub bandits mka qa-www proskate artcom boardgames kasina alking artdesign www.clothing vpn0 cage cookware magaza italianfood ccap replicant mani671 xpressconnect k11 k12 3com slartibartfast azteca webdb2 gq bhs abra webtesting kredyt adsonline did8535 e4life thezoo hjs pman jcs lhs medizone fbs thesimpsons qmc www.lineage shoutbox wax wjdtjs3460 writing forecast dagger pharmacology www.columbus americanhistory pledge www.so kaczor st8 mundomagico smsgate www.dennis www.user lax allure cor1 www.los pediatrics collegefootball insp zzttfg tamiky wap.naujas rtfm menace lovej fenris www.naujas www.courses touch.test wap.test bobae524 m.naujas touch.naujas changpo arkadia feelers www.mapa shan hen frugalliving shimane muzeum whiskey fukui yamaguchi frenchfood www.dev01 preprod2 www.dev02 kittysh1 www.play1 freemind smax www.www02 wmail1 statistika sonda www.aukcje szkola www.typer demonstration adminnt1004.admin lcgfts3.gridpp dcap.pp eblp14.ebl lpta097.admin lcgft-atlas.gridpp lpta153.itd tcom6-pc.cc burton dgs lpta142.ebw kurumsal mc5 srm-lhcb2.gridpp oomnamoo it2 phoneplaza binghwa prop newhampshire srm-superb.gridpp www.tennessee pipipsrv one-test2.gridpp srm-ilc.gridpp castorns.ads zak icsm srm-preprod.gridpp newjersey burger cernvmfs.gridpp ghosty www.documentation lpta117.admin lpta006.admin www.wyoming pca370.ebw nero.cc www.office365 atlas-squid.gridpp www.pennsylvania srm-dteam.gridpp srm-gen.gridpp dml connecticut cypher srm-t2k.gridpp pca103.itd pca240.itd www.ohio atlassquid.pp www.kentucky aiv-emc01.ag srm-mice.gridpp www.missouri srm-cms.gridpp srm-hone.gridpp www.maryland haste www.iowa outbox-og srm-cert.gridpp lpta141.ebw cfi gw.inf lcgft-atlas-test.gridpp cms-squid.gridpp www.ldp rider opennms touched srm-na62.gridpp babylove venz rack7u39 lpta100.admin linux4.pp l26 linux5.pp hepwin2008p.pp rack7u38 barbie gw.cc rack7u28 xat lpta141.admin srm-cms-2.gridpp lfc.gridpp rack7u13 osman srm-minos.gridpp cndlaptop.clf pca150.itd richman www.debug scnt92.sci pca095.admin srm-biomed.gridpp a3obulogon.itd harmoni site-bdii.gridpp atlas.pp pakiti.gridpp coches stewart rack7u29 lcgfts.gridpp gengar vww www.bin lhcb-lfc.gridpp lpta131.admin umbraco scnt97.sci sv30 sv35 lpta142.admin outbox-mx srm-snoplus.gridpp habbot www.asf sv54 srm-lhcb.gridpp srm-cms-disk.gridpp sv53 sv52 rapidshare srm-alice.gridpp caramel1 mongo-tuk-c0 www.flex sv50 sv34 tmk sv31 publicity echo.sc za-switch kbn2430 sv16 sv15 www.atm media101 www.bmw gallery1 pnr kirkenes-gsw www.sirius rbc mofo www009 www008 www007 www006 www005 www004 thumbs3 www002 www010 www013 econet designfactory www.truyen www.roberto gigic www.topsites rack10u20 doa moritz osb otm eben rack22u36 rack22u12 bristol rep1 newtop daftpunk tournesol olx waka dens ws5 vans odo dow www.servers fzgh metradar haianh d1-1 ceg vice webradio mylinks ns200 handson mtt sm5 milforce busted playstation3 nsr1 biolab pang cyberwarrior appweb m.es apns dillon phongvu kemper jyzx kdk thierry www.ural www.memoria haohao irs capita pcx desarrolloweb www.ols isp2 www.mel jbo xmltest pc4 pc3 tek www.dw www.cel spectacle adman mailmaga nadmin www.soul vm06 search4 www.mix www.evo hoy hoa www.ngs ludo palladium otis pc12 alternativeenergy ifr p01 web2020 spidernet smartmaru kirey kkami sheriff1 ns160 www.nwr spacetech surgery1 kamis www.osp cherryb jmp lexcorp vulcain www.psi www.san ns139 gam refer ns136 hyderabad wildstyle lovesome dws accel localhost.media click1 trojan axs eung32 nausicaa pre-a kingmotors leepd adam123 eunhee laurent xxb redmay promethee glecor multisam startimes davids www.networks dsg s18-254-fi800 m.videos freestuff arcas deporte yolanda dse cmail2 cmail1 www.lolo haidar makemoneyonline mapit test.cg.vip silo www.serwis www.mary webdisk.update finger cg.vip arttech locg.vip wo1 armor boapi.vip wxaut.d3s.ili peri wxstor.d3s.ili test.lott.vip keuangan test.tt.vip trendy pokermail lott.vip akshay www.winter www.mart coach6new autoconfig.foro byt topsalesclub jpa laith authwsop authwsop.vip smartfund ciscovpn test.locg.vip dgi col osol ftp.allegro tolga casio upload1 autodiscover.foro www.teszt2 cov generica immobilier staging40 zeko lms1 bibliotecadigital abcdefgh photomania ado sbt m.staging.apps mbi caxton www.sitebuilder filip www.sharepoint www.48 levon fizika w2p hmm biologia infomedia fotoboek www.guia aoladmin liriklagu asig murdoc pantyhose onlinemarketing gamezer www.poseidon tct bios blackbook bink wcms msds novel webdesk eatingdisorders ads4 partytime just4u www.gina www.exit optout fs11 bmi hrselfservice atf itsme mecatronica web189 akg www.fire kingfisher hemant pg2 fs12 fs13 educar www-t chop alps isweb fs14 fs15 f7 fs16 xwiki mimas karol itservice fs6 ckp kaori cybozu ate tomorrow violin tonton fs7 fs8 hendry controlescolar globaltrade war3 toontown kairo www.microsoft thisisatest janette dom1 cvo space2 inco neve mobilesync proveedores rikardo shinigami vm-dns www.bmi aos kenkou informatique localhost.demo hurley herman vz6 oceania www.aspire cinnamon rainyday livescores www.eric educa webdisk.staff abd copernico astarte hache exc envious espacio pkpk87111 amh ghqks1203 www.szczecin nettuno bbf jeunesse agt soil bitcoin irbis www.ef agb newyahoo wilk dsr wmp isp1 wwwmobile mt1 afc mail.mail afa kimkim tjdwh18 www.elk thermal bebero shyduke wjdthal1 itshop elvira s149 botany uis folder onlinemoney tungsten www.lancut alexia sipav fedex boromir reaper scratch aisa generations angkor sudheer young7197 mytree yosemite pdu8 www.belchatow goodhope1 bildung pleasure 173 aprs ferret oldpop ej 888 4x4 radiance praise ambition radom www.pokeworld megan dead clearwater yk carpet wo airwatch simmons accolade onlinedating woozoo rj lancut belchatow amelia bcl yvonne eeee ufl palas goldap pha www.aria insa bree manda www.error www.nevada gn matterhorn kwon tum vips bachelor grisu datastore erotic 113 collector1 exotica redemption ezine local-www namaste flex1 vpne gh0st subzero kamino highvoltage boomboom mscanus jiminy deviance www.rea webteam dcweb skintech bosna golf6 starone iptbai content3 truol.parcerias infoma vpn1-uk www.gearsofwar rubens backup7 nsd2 truol.parceiros shequ autopay staging.admin vengeance acadia ftp.moodle bk5 prx myself1 www.karaoke imag newdns 140 bimbo details webmarket charly aiadmin kakao facedog kulinar hack1 pd5 gagushow ictc webmaker habin adriano prema martian toros earl deepee apm dez penta dvb beibet freyr a12345 coolboy mail.um jen0615 supertop wire turn seif kwons bkbfate maz lucent www.pub vm7 diab ujjwal prestige1 ur rjsgml5694 genom lamy securelab vchat www.liliana tdm amelie dentoo09 encoder2 satanas dynamo mp8 mp9 mp20 createadmin mp28 mp30 mp10 mp11 mp12 mp13 mp14 mp15 mp16 mp17 mp18 mp19 mp21 mp22 mp24 mp25 mp23 mp27 mp29 mp31 shuffle dailies maac yourworld wtc mulan asasas ipv4.test www.pure www.ahmed silicium lobster ferrum nok ihb ester faw hill bkr techshare roxas www.anita siwa araba mobo mili s191 takamiya cometogether islamona torrentz greenbee mercadolibre www.bells khenzi gurgaon champ floria nonsensical smdesign sg108 wdh0517 www.extra jinny1004 luffy humantech plf pd4 simsim nie humberto ire kankan loveparty fateh vdp1 funtime vps36.dc1 bnt surfin s168 s171 uchiha bf3 ds4 www.fv thunderbirds www.nato www.att etravel star8 papi kamyshin sanjose sudhir rustam aldrin avh huron test888 dasha spammer test-it test009 cima akhilesh imba s177 sars bloody jyx cco betatest www.atc www.tao nobile coolboys jn backup-server s178 testtravel ghvpn www.bola winmail listserv1 ts.inf ts.mmf ts.eef ts.labktp misslee ts.iif ts.ist ts.myo ts.mkf webmedia ts.laby codec thuong times2 js2 showme autoconfig.contact shutter autodiscover.contact lipstick asthma www.brain wup black2 risa tingting www.coop thejoker www.spark gpa realworld suboffer sanluis updown netmovies24.edge thienphuc tia beni lee002200 hugoboss alfa2 www.bike show-tmp domenapanel leather doc3 syzran ruslan mediaserv01 www.death st02 st18 snowvalley carina00v hojung vpn03 www.doit arthas kniga moren exhibition phpbb3 monjali lift cstool www.aol amsp www.sra s180 www.iic s188 dizzy mayg193 benebene www.communication j123456781234567 www.coins ciberlynx-wsvn-web1 rtm iphone5 na1 tice asdfgh stafford www.panda msadmin www.is adma origin2 en97ea4c tmp3 ogrod mcbox rpi doktoranci www.edc corn www.vas royals sherry forbidden s183 estimate sagitarius gsearch builder.extend handsome kinomania libro vp01 smartcard selenagomez q1w2e3 motaz strm3 forall sviluppo s181 lsb bestof webdisk.ayuda newsearch cali www.eagle s192 soup ssbtest servidores kandydat gps2 amulya quercus cmos chiko nahyun kaizoku germanium telechargement physik asean sourabh rc2 clown mhm www.idc ticket2 irish ssltest2 arch1 londres s1018 starsoft www.pdf dip advisortrac aileen blacknight vcr sips autodiscover.ns1 danco prashanth www.cyberspace autoconfig.ns1 iprint n6 manualidades orgs pancake freaks corsair brook hoop lifetime omega2 www.gamma ns155 kissmin farida www.firma mojtaba messiah viki lifes delight kangdy777 sweetdona rkd2885 www.thegame dlfmaekdns codysale webdisk.vip anjongbok teflon gksghktjs yumi89choi inmobiliaria taehwa5 butiroom comtech beryllium eodks ddok1213 customerservice hjs0997 zeeshan heeseung kaustubh autoconfig.vb kamzi80 cheuk cheng ooccc autodiscover.vb webdisk.vb inchan21 checkmate3 ndnasd qkswlenro ujjwweu12 www.comunidad rarakk2 ansari cips pippo kdoy3 brand94 telius sangzero bnshdj267 newdata archiv11 ya54 bblues xmaseves lty5229 www.worldcup ccudi68 dapin sinhk71 girlsunit angelia22 ffdesign update3 verified nicekim72 lovely1st eloah ruddls333 mrcteoqkr skumar bless anta182 jinwomall beyourself blank keerthi ihappy doremi3652 enkistar bbonamall dum24 stweb blair vnfmadid www.ppc propose chinatown jsmith twee agencia webdisk.downloads tkagmd friends4ever rena1730 adslcolor ac3513 tencent image670 ttbe rachman ppp725 e-business bmw2120 wapp bluemint constructii okadam irusy formulare guy2me dkflfkd77 test2007 nojom matthias jejewa rng002 sondari1 gongg777 taufik animo www.yoga easysdh hp1 stwvudtod ocnswjfs wjdakfdn bs1973 sadness917 a1231a rs3beta zzezze srkjh thsoj www.prova eventhouse1234454 bmw0520 funstyler hooraing freefree deathstar myohan72 enurizone bshtheone tarlan ev0726 cyzoo sarapul procyon manyenalda xvshebnjw damien paws amac johiok avenue bhvf547 synjy00 kuoemyhws good0353 sj8253 da6atelier kopnwx rainbowaa ts04 pianojs mstore zyn3103 fnqltjs qkr3584 inobell kimjk1191001 kwonhi21 amalia whoami ohygtk fontane kettle k9180 hesse alison neofrom poorinbag whispers kdmsekdnsr fabrics adimg2 klpkorea am2 anlion nanna022 smisslee comp2020 ksaraki countzero gaga2525 knife hamsat jcjong21 namiezuki jahanzeb team8club culamoto sorro edwards gg1477 inix3039 inha35 jintoy icolor ivwss2 izziban jm2k7 babymam b127 tangerine eyevee zemnmn autoconfig.backup cjhmylove hyun0011 factorial muzzy417 autodiscover.backup wiseyjy wnsgml3370 wooritoy moonmih bdiweb pp77 yeosi albums freaky kjy102938 webdisk.backup fastguy75 wnetworks dollhero pubftp romario wtest epc mf2 rlaendus11 gadeuk progress1 lscompany gospel81 flyinghorse gospel80 nonfiction jinjin8858 temin78 www.union wahid mbbs tnlrdl traffic1 autoconfig.upload kimmyungsoo autodiscover.upload tntworld next700 ato6193 ggamigirl windowsxp h4x0r polter taken r-pa1 mta001.kmm.mobile feature bashar rtsp pk62 youngwar85 youungs happyyim iidong aryan skawnddl84 sms0656 goodloan24 banned beaver basri0310001 www.gamezone photobucket kgb212 uiuiui sj4322 allonrigs surajit hamo psw2024 gowcaizer any4love rlagusrl39 obus sjansjan s333ss item119 cassandra edgestyle cjstnsdjq m.order membres schatz bestfood iloveu sy3381 redirects teatime pearlngem sunytest quenya vitadolce eilkuk presupuestos musumm service5 limkorea korea8585 narasimha www.monster savior pbk4959 ksczerny univision7 dgfshhw gar119 theplace dicamp kulkulku ruru57 j7 winners09 starlove aaabbbccc mbap sarangme gang5064 me09 fitbow www.mirror1 greenf5 zizibe0316 jhy914 sj1062 guinea mephisto ohontaek newkissq ares2 sulgi0566 rancho love83js wshow apollo4 apollo5 lohasbank kim3929 testdev somerset pczoom vicious shakti shaker hiphopjr madammoa vanda inis nono099 gauthier sohosoho oaoqnfakd karma01 etisalat kj49 rack msbig www.newhome sjsj825 blackice kyh90100 dea8520 mycampus-315-admin inotes vudiwbjsw ccmjbr mycampus-256-admin exp2 iface jin987 p725 newbie mbc shapping megastar aboutme78 gywns20000 sakuma wjdduqdl12002 wjdduqdl12001 m28 m27 rlawngus71 pnpink chamomile botanyadmin system32 cw8989 frogmeat ceid myth0505 mr8032 juju8598 royday smoothguy igii niceuni diamonds adamas acc2 qkrrjsals ripple ygfactory grolsch interview nongae75 kaban soogi3333 in001 heat hulkmall scarecrow china1230 orangesky student6 adamo as5 adapt glimpse mstr fanfiction ubersmith judy8055 namissam bowlpark in7041 upm www.images2 juju7236 qweqwe test18501w www.forex www.images4 gogreen mabelmari inline thesun thgml884 kjhlhj0313002 ourworld codeigniter kjhlhj0313001 unik mtr panini newvision bizhanna anpara chun7436 memento mahmood jungjbk mnmnq25 cony cinfo zangmanenc realtop boogug ryusuc heytaehoon forum4 destroy aubade001 night0070 nm1 dnc103 medmsal younocke hoya811218 accent70 caligula dufjk232 vaco27 sade yks4267 accessories mungushop7 savage zzeshop yameyuco zeeman servlet ksongha enbe nothingjh designers naturally delirium nectar sado911 luxury2304 dragonse alclswlfkf joa282 wangenni59 theggun swe kds221 www.hamza ckdvmfh11 skssso largo bewithme whoops12 paranlp alcor sathya leibniz dmtest enjdhf238 nocturne lucie regor homeworks gember zealor kkkkkyta wlr79 choi3241 bestop tkthcjswo rulrulru99 alias qkstjr1107 skydriver dbsak zrnmebdzq trustbike pporori83 pporori80 tate smtp.forum pop.forum mamababa1 astronaut allan daacc56 scfan mskgreen webdisk.iklan gjdjdrmfl0 www.sakura www.wwe topsecret www.iklan gucci8596 www.woo amine www.war ritter frutas ljs4394 dasf qwerty123 www.poland tem skycity ebmzone mail.lists skyblue becky xoghzkb jps mailsender s2handi prune sajjad aardvark zaqwe9713 duo sbboa angle anika greenroom october hayanpibu modelboa bdr baksu74 beowulf fallback paradigm revive killerjjh kbsbond amrit safran artiman safdar mdesign demo23 inbmall yagudosa gsb gsh ankit hyunsoo1 ankur ird au11 ahmedabad lovesukjun camden dnddlek81 bywoong designart momkids usldskel router1v105.zdv mkk9894 t1234 bess-proxy nexzen hothot letstalk pgm sadhu havana kjhlhj0313 anoop amaranda tulipe grn01 todytody evangelion planner001 hyu21ni dnflkskfk sky4005 bebequ usb52614 starshop heyckim shyness37 user01 wbg urologyadmin truegirl eboya4 cardiary sluggo qnrrudrud kyois akai suny58 cochise anwar zxweb mypopstyle qqbox hellowyp arash superior hellboy vosko qkdl0922 starsbc hombrecokr arman sudafun moja kim389 www.sad alfi alin msproject codibank zyz oakland asoka kathmandu momsbebe ames mcse comuriji gotsodrl busdayrim moonyelf seinz carka leninache bbre5241 giri mailcleaner ssailor khdesign styleshop uf coffeehao frc www.progamers static1-org simu iop sherif casta www.pow apcompany autoconfig.az temporary autodiscover.az webdisk.az fiorekorea001 proyecto kingmaker www.one loveyou1 haemir welook sky0958 bme i486yhs hjnm34 blanca infoshare benisjw polymer edp sungjo2001 mintshop gsncom bombom bess gmrao pulleaum sang248 ct1 nomad21 tonic 247 dsh sang247 www.violet wedro allot allah theshadow cunsung eod ottomall www.enigma mollym parkhunuk nmg neture dreamworld evenewyork arka hlsports sunytest001 www.trans mcoup qatest alger fungo deo3000 thermo hss7333 dikfmj28 essential pueblo fufififi biscuit krisberry elita therapy hyymlove misskar crochet grid2 chanz netnews badboyshop ushng02 www.lit assi cokokk rubychi guardians www.srilanka arkorea1 www.idaho pcportal gimminhyun brokers sonemart autopro qopnbvevb bobkjd stasis kyung2299 ayman autoparts byhappy365 ehdgoanrh koopreme hightech han2gage aaa123 jisuandj tachikawa cheesecake shinagawa emnbxjkst believe enjdfm323 hanax shoesbal www.irs www.ips jiyugaoka cf2 hanab meysam nfl seriat lomcehia1 abcd1234 kai202 goonis21 www.agents meo1973 sunwoojin1 zerosumz nahyenmom001 qlzlsl shababcool www.gtm benedict webkey1 kbs3749 azalia1020 amiltd monkey202 abracadabra onedirection alas dlfwhago goodr39 kbi3229 kct3000 www.submit divertimen state starhome min0501 hajimeru hongsham paparazzi hamuske repairman soaps cogygud t18503 whqudgus81 hotel4989 mfe ayan mangojelly gdguy15 jun0970 c52 thehill grp buffer www.epi tbi pporf oyesloan xxxl80 apple10cme busstop1 www.pix comeon meteor76 alstjd0001 ampere as77as wp-test instrument mogi01 redcap yayoi sysweb wins20 lifelike nostalgia eccube dugian inquiry yanstory cocochi sahra hpcc unqpuio halogen outsourcing hot2012 rnxgwmuor mondayshow inschrijven gastory bran bris melowyelow driving llomn365 dldms06 tundra chyi87 www.btc rino54 geocoder jeh0907 cold rad02 disc facebookadmin naco3535 wk dbslzhs magicworld fashionadmin acn-net-cojp ovirt mindf-jp bma pc001 pc002 suny2858 bluehorizon mycampus-314-admin ajtgm-info alice5 eriana-jp loveae99 maxmobile osorymall guilherme gabinetevirtual controle autodiscover.vip delfin czar darkworld www.cds sitelifestage z2 staging02 hwjj1004 m7043 rk5558 virt2 jinpw73 deves ilovez001 mailproxy comon eunseong kiki0705 euniii users2 clstyle cariere eventhouse inneo zip1 zico mmnxringk redfly eagle9753 yeunddang freemu hslove80 poli2003 ramarama rlaxotjd tidgodl hami0323 gndo00 kooragoo timeleft ilearning us3502 snowman ccyulim fame arabian qnubenhs23 hsh7933 lj4100 www.fp dnfl1206 iworld ifdesign hjs7985 eyoung2003 anydaum webdisk.todo www.econ katze1004 s0319y dadasa2 riugombo yann yagi l33650 as011 ju8646 wow1 kjy1823 cestlavie etoss mssql2005 holylove dand1135 rlekfuwlp augusta azul sechuna1 autodiscover.pms ww12 autoconfig.pms spyro wg12 www.pictures silkworm autodiscover.todo webdisk.pms kado2 pokeradmin kimjr1941 evrika burnhorn123 nso kingchoon001 www.rms storyone hma5400 comune trud cjb nami000 saytool vatek do504005 vava autoconfig.todo crush primo do504004 npart11 dlink dbsdngus ehfdkrksms tory 800 googleadmin leglong77 esx01 cocktails parosa hczerny sure qboouy890 ksy3151 suny2858002 dox xboxlive verde kilo disaster virus0316 tonga isshoe www.light nextel jimmys timo jaca runews station1 tian yci2000 hubert nmshdjsu78 www.mango choichino doniworld www.porno sirent ttu264288 weeds2251 jina2493 oden en.test vertrieb test-ssl test27 www.maxim bigshan puddles joyongkore pp725 inet1 tada corporativo mc277668 shot cotacao shoesadmin aomyunswbs gujecat justfun hellyhs growing car040404 dub toilfox ika cap1122 pilot83 lachy sejinilove kws1388 noyoung zixvpm01 r0921 sham hwa4394 feel701 rota yahho bebezzang roof yiwutc control1 spamcontrol ald1034 goodfeel64 road oratest yws yeoli9 garrison sare amf skola bluelucky muledeer bulkflow sake ondemand epicprintservice laylie riko donau tok2580 fajar www.adams xixi brooks ssonda yozme reim l9051 vrs clouds dedi21 dudwnls10 dnjsdl79 rayo pixel3 khn1212 www.tlt inerjjang www.anthony dept2 archi80 qhrhvmssu adonis9966 beijin2783 take1001 answn0240 dgdz autoconfig.bugs piyo autodiscover.bugs farid ackbar www-prod archive1 tpa kcs0713 alden serbia klink signups distribuidor galls www.solaris yenim peep bestoffer isfahan terrier marlene alwin tohoku balsa ha1 vmp kyushu ns001 sica instructor fm2 myfirstsite redman veterans telefonia ladybird milos vesna adina dcjark2 musicstore zhengzhou kristian basset www.te ddb mxb mortel www.party dazzlers programmer larissa elise attachments tkm homeloan flip www.jf aer radion serialkiller rtr-cadre bal elements tww securetest emran reio oksana stress raido blackstars survivor mundial eka ning www.andrea iip socios jpp 123123 vgw providers soe gaara wit asser moni pmr lil www.payroll gajah mone aston www.otaku butik rin www.cdn1 ptl netmotion www.karta rgp ap30 oldstats tch parabola caritas www.animal awww www.sbt www2012 mail.nsk testserver1 vmk voz orbita blimeyl www.bird angelica www.kg kassem oldham imperio hellen mladen fmail dolcevita honest hams hard linden ru2 pulp adriaan sankyo wineadmin alternative confidence sidney newstyle www.prada stile lune kazama dare vybor ebony shannon milksugar haya abhishek arma yourhealth deus goli hackz helptest vipmaster ftp.web vds13 comenius pdu7 pdu6 pdu5 adela aeolus ekat sesam rag chimp laurence github hatim faza collectd niconico gren vektor cerium ambrosia www.cap glas www.animals hava niranjan brucelee jaan midi jaja muneer chet onlinecasinos averell wunder tizer graf r2.reboot illy mesa inda jeet margarita strona s276 lakshmi living gtaiv www.protocolo astana lexx mstar s425 karl iro rabat mmo www.titans logistik koleso web369 hotro mup leszek blogspot s247 s245 jacko welcom www-d beetle ohashi www.speed jacky dogwood ftp.ask aruaru forlife ip14 windylion jove neweb www.sound flyaway dtp kivi jafar lapa niv d54 celsius wds videogames powerschool klon jahan mta6 mafalda mta5 zoya liam janet pdu lexa propane uchi mail.main kore monterey jatin dreamhouse koro romanos mala lapcooked.com trantor extweb www.automotive thessaloniki ovz mailgateway2 marg mats www82 www.ultra meka intranetdev ipg mesi harvard giorgios mygroup miao www.venom avanti nama luan nccs neda buster nena mcg veni jung karak pawel neto karam bonanza mao myhealth elina nilo markanthony cluj pagan rac3 century dinara zel rackspace narod cauchy volgodonsk nunu dlib iguana nintendo tproxy org2 pion chemlab pma1 loja2 tattooadmin cesantia prix radi cameroon vsmtp solicitarclave keng cbg mlab kenta rasa rawr kee renz kata www.mohamed saeb genesys 189 kamo www.bugtracker 188 sark proshop rclwp791749 ikarus 154 strat shun hyip vertical intact static.dev www.makemoney programa autoconfig.auctions bbstest schedules esms autodiscover.auctions ugc zg sonu backupmail jsoft sosa kaseya remoteapp scot spro animeworld imagen artists iserv stil arr balthazar musictv jamesbond support-ru uday rayan holz susi masterdb kondor kolik www-cache-all rotary webdisk.deals gunz messageboard testforums cumbia wapes www.jump ufos regalo wsam wireless2 samorzadstudencki eic tutu undo hihi www.pro.glass theclub speedtest.nic-west.cy patton yjsgl amen wael justtesting www.chalet www.chance pro.glass www.illusion www.mypage alonso keaton hand sima takeshi in01 maket ftpmaster vieclam maniac bostonadmin bomail hearing mini2 papers www.myblog xman exia www.welcome kemahasiswaan marianna evol manel hro wwwn autoconfig.indonesia www.spravka www.horo www.vd www.fair mariam brightside www.italy bonilla dynamic2 magazines ascom machi www.elektro www.philippines rci gage autodiscover.indonesia webdisk.vietnam systec webdisk.indonesia htmltest dynasty s4104 machida thumbweb officespace psu mehul adj heri lopes lopez farshad bconley.com.inbound wasf-law.com.inbound redmine2 ds01 topten lemonde izolda zita www.alexander drug www.martin kato1 assoc lotfi fact lou bud frisbee cmb dee webdisk.pay fabi www.freebies verification relay5 e8 e9 akademi aig secure8 woodruffsweitzer.com.inbound midwestglove.com.inbound dome oci server61 modental.org.inbound hannibalbpw.org.inbound login3 sife ophthalmology dini misha najme toluca middleware komenmidmissouri.org.inbound edge01 wg2 testr eigo communitybankmarshall.com.inbound webstage aic.org.inbound theatre ibf iap msma.org.inbound fbc-columbia.org.inbound kaiteki hsa b35 auta dayz www.odessa b37 tix daffodil dfm gerke.com.inbound freezer b38 www.fe mohak dr-mail withersradio.net.inbound www.kostroma astrakhan mail.oyun mikekehoe.com.inbound b41 kse ns.oyun maison b43 kmfc.com.inbound ipv4.oyun mgn kopn.org.inbound webmail.oyun mosab autoconfig.play krcg.com.inbound mustapha b47 thedoctorshelper.com.inbound b48 vampire1 mpl checkmail1 daw cafw mri checkmail2 kpo nidal interconnect autodiscover.play emac pcm webdisk.play rahmat www.sie nikos technica hsd autoconfig.social moberlymonitor.com.inbound danielboonell.org.inbound rce v21 techops blogi joycebremer.com.inbound klik gsr bln-stpt gardenia cbofmo.com.inbound manitoba www.lc www.zzb dementor edhardy douga da4 freesms m23 www.cw sslgate cao shilohranch.org.inbound mfaoil.com.inbound hidamari fblmo.com.inbound executiveadvantagellc.com.inbound notas atoz newmy leestirecompany.com.inbound loveallrv.com.inbound www.integration cpps-ofallon.org.inbound goriley.com.inbound barsa moroni takahashi leave cano sinergia cana www.fantasy www.marketplace prb prl tanaka valery avila zdh leaves pop4 bolsa countryside linus aod sahar www.nuovo jxgc webdisk.preview phe ltc bibi wwwakamai smartpc zjc gi-6-1.edge-r.fra.de te-1-4.core-r.lar.cy tactics lpdns bras webdisk.t zch plymouth webdisk.g anta cny perforce roll bioinformatics stalin forrest colour armadillo autoconfig.orders www.nj deuxface hokuto www.rm mini1 libero epica pentest www.podarok autodiscover.orders webdisk.orders mj289 www.camfrog www.coffee smk www.dubai www.hits riv greenfield allergies c14 www.distance fianet.xml www.boston partenariats c15 gelen kazuma c16 c17 webdisk.press newcity hiro freetalk c18 mail.support c19 robotic alexey cadremploi c22 partxml gogogo back.partxml img12 c23 c24 helio gomel brooklyn engineer c25 patches anek c27 hiper hooloo www.crafts smtp-2 saqib www.peliculas older runrun c28 perry stat7 westpalmbeach c29 equipment stat6 seventh sace lx1 c31 negocios c32 c33 q35 q21 hq3 kaden raf q8 www.urban karlo c34 watanabe c35 liming fortworth wilkinson boulder www.behzad www.melbourne lunchbox nevertheless q1 www.membership c37 wojtek speedway www.span c45 callobserver homewood output www.origami hrnet medina oaw hajar www.limited amakusa anaheim iron2 www.haj mixer yuriy johan www.present levelup fritz www.orlando holyspirit squid2 pauli waltz www.bodybuilding tegrity pooya cbk laurel davidjones greenwich blackpool botamedi providence memcache1 anshin caelum lionheart www.gsc plane php2 www.gta www.ali vip11 pnc www.tim bushido ethereal e12 mythos lifeup www.dragon sevilla d3.files toplevel kuperkorea e24 www.good d1.files saif aram scary d2.files tototo dell2 vip10 e107 gameserver www.pol 31sumai resona-gr webdisk.form daybreak zenrosai pcw.istmhd pcw1.cyahd raouf autoconfig.form keele-nnw-leis-mc-leis.net www.nyc autodiscover.form replicas.ldap autodiscover.galeria autoconfig.galeria lib-ht-2.net r-es-1.net lib-ht-1.net xtermsrvr.gradsch bcst-rs.hor downloads4 www.wpb recfs.kis kuwahara rtr-t.lin lib-ln-1.net 61-e.lin blakout ucb soaptest r-ch-1.net pcw1.cechd autodiscover.dating autoconfig.dating openathens www.mic rtr-rs.hor huda gnat sarasa wc00300.wifi192 net-x.bar yamaneko bootstrap builder.manage www.seminars muzee anapa treat pcw1.ugmhd deniz net-w.bar ncom net-s.lin shares wc00300.wifi160 nfreya.net trail rlaguswndl2 fujisan pcw.cyahd afs.cyahd afs.pmed www.ken r-dw-1.net bcst-ob.ohx wc00300.wifi96 mail-backup net-e.lin www.moj mitsu liens afs.medx cmstore xtermsrvr.netwshop rtr-x.bar bcst-cta.lin cabal rtr-w.bar lib-oa-2.net rtr-s.lin net-ob.ohx darkdream www.formula1 sn2 net-t.lin rtr-m.lin refah pcw.cechd agentfox zeal win27 afs.istmhd afs.cechd rtr-cta.lin be2.server.twtmail win23 r-ht-2.net r-ht-1.net icand xtermsrvr.kopen webdisk.intranet toddy pcsrc.kis www.aikido danesh www.cake gara magda h101 www.onix pcw.ugmhd afs.ugmhd clubtest www.vle www.dev1 forsaken be1.server.twtmail afs.kis emea lexmark psb anson freya.net 61-cta.lin be3.server.twtmail lib-ln-2.net misterx minimax rtr-ob.ohx b40 xtermsrvr.temp b50 efc c30 e20 scimte hitec rtr-e.lin fluxus mail.hi99 stfafs.kis xtermsrvr.lect r-oa-2.net mil5500 hwbgz01 demo-webconfa sjm so4 hi99 www.karin r-oa-1.net shore bcst-hj.hor gboard tibor pcw.pmed r-hx-1.net volcano builtin bcst-x.bar amoxicillin chiron aiken mikyung3422 newsms pun mail.av9 server56 server57 mohammed pcw.medx bcst-w.bar vpngate uni-netebas itunesu szxmam01-sen pcw1.libhd bcst-t.lin bcst-s.lin net-hj.hor lib-oa-1.net salar tr2 sameh inner pcw1.istmhd lkpf-dx reestr everdream print-mo.net bcst-m.lin xtermsrvr.lib xtermsrvr.kpa nov s70 www.new2 rtr-hj.hor tivoli szxmam02-sen spas samir net-rs.hor bcst-e.lin sjpostad km7007 starsky stuafs.kis mail.int mun updates.kis ijeltz bb.vle xtermsrvr.plroom mvc pcw1.pmed s81 salto sanda r-is-1-2.net dlv s83 saran bighand kookoo spill lsf pcw1.medx lsc pagamentos s07 sauce mbb wc00300.wifi64 solis s09 www.joom sayed s87 www.ijeltz kik net-cta.lin av9 whitelist kcl sobee haj www.testy localhost.cc r-ln-2.net erp2 www.det ankitjain myhosting straight bustup fr.test senha skydive mizu demo123 proxima pcw.libhd www.cnr r-ln-1.net gpt www.programy shani oceans rowan mail.av9898 afs.libhd staffprintcluster.kis eys vpspanel cs-utils-rtr.net av9898 w-htgb-a.net dad creo gbc unite shona uriel darts 4test sinfo galerias equilibrium business2 garp inst www.eos optin5 idisk www.amb optin10 econtent shyam optin1 optin2 optin3 optin4 optin6 optin7 optin8 optin9 harlem heavensgate coffeeshop webdisk.assets www.wb qzone harami ebenezer tasha webeoc2 autodiscover.realestate autoconfig.realestate momiji shift szmail appserv webdisk.realestate yas rudra sheep www.ni b2bqa esprit makeawish www.christmas fc1 www.paysites www.empire osl slick boogie pdl app10 lop ans1 ans2 bellevue kirara booboo altemis sober cinderella synnexdns blu ghs.google.com fcp glxy syslog1 b46 margot ecity ryan1 arsenalfc fts videoman nolimits saleh chb r8 www.ab lunatic fonts autoconfig.suporte sammi autodiscover.suporte www.af cntt www.ag mainserver catia dns117 www.theater snowflakes proofing www.dv root2 tigre timex assassins cluster4 www.ha nastik ns4a lovestory ns3a www.hb plastic web3d cosplay designme www.gr web47 gtb web42 web40 dmi ftp.video smarterstats videogame appletree puppy mserver ftp27 ftp26 mail.edu ftp25 www.marcus shib-idp ftp24 pmu ftp23 mysql51 psyco bite stunt ravin ftp22 www.jv info3 lpc ns142 iwin ftp19 ftp18 phiphi w23 ftp11 dnsmanager www.presse www.mf www.lt mercurial avail ankara pshop soldier sodium indie pdc1 accept pc110 www.oz ftp.crm sotestapi www.nw chatterbox www.africa cookiemonster pos1234.netcologne-mw litchfield c-kurs www.panama thistle hermes3 conferencing archeage blade02 freshy www.doors somi ktel myradio denny mousika antallages worldofwarcraft xartis sport2 www.drivers columbo www.xmas thetikienergeia www.viva travels www.michaeljackson qmail2 bonjovi pluss pl1 staffweb chopper reliance www.ecology rural xpam plus1 aggelies plaisir ptolemaida shirley chouaib umair gw5 mag2 gw7 many rd1 www.interactive firstline pars traveler1 mim www.mysite hosanna painkiller sweethome web128 web127 www.nirvana web113 www.fotograf aurore pinto pinta svn01 dummy2 intruder thevoid web108 web107 naijatuale.com web106 www.jx web105 techtest vgame www.ys advantage web102 monitoramento netcom apocalypse salavat www.hassan perla urdu yamayama superuser iplist pecan nak voltage www.testshop scn rehan celebrate spirou gamblers www.adsense yancancook.net web209 jatt007 panta www.gazeta taimoor lom tudou tello sirius1 www.deathnote www.hospital apple123 www.sco pandawa bnp matsuzaki kaa ilikeit br2 backup03 adarsh gutschein alkelaa web62 demo-imeetinga saikat madoka mail-ext www.junior noisy web208 autoconfig.ns2 autodiscover.ns2 web98 math2 ramadhan free-software dailynews geoffrey claudio web49 a123456 web46 web41 rek web39 zags walia web38 rockwell dnevnik waqas hellraiser home3 emarket kb2 xatka static8 posgraduacao wasup leisure mx09 mx08 lampung sip.abas merchants msoft lilili b74 www.enciclopedia matthew rivers startimes2 singles neverland mail.mobile bengal www.egitim aubade gok n62 sakata farzana sacred mozzi netsoft www.myworld dni linlin indico mangesh hackermaster stream6 monia never blackmarket kareem web-2 demo-reg-hostingconfa duality www.clickbank revival dragonball runescapebeta test12345 s520 reddevil yms cc4 fira muneeb sireg aco mas3 michail vertikal positron goodwin xlab webdisk.2011 birth chair mukesh rio2 mahmud fakultas dph packet canaan milad mail.mse17 cherepovec www.ufo nalchik webstaff missworld habbomusic nesa jkt pcclub gaokao likewater jk2 duffman nass ludus docs.dev www.lj jameson shaheen graveyard autodiscover.aff www.load diag webdisk.aff autoconfig.aff csn eastwood pieter marcela pppp mikki msgs shaimaa egg www.anti files5 manuka mail.mse7 sh8 webapps-test longitude xiang www-qa serveradmin sh9 bicycle www.ares freecoins mail.mse20 www.hd slovenia www.ke bbs7 mail.mse8 uzair shaper medialab edetail test47 ips.vds punch webdisk.au www.cq webmailnew cdns2 test09 mx.mse12 goal dwp mail.mse9 news02 www.bh montpellier ftp33 martha cdn161 sarg pile workorder www.olympus nicholas ftp30 vsv iwt masumi components miya lake helpdesk1 una prisonbreak thanks branding sjbluecn mobileworld ns211 syb ns231 telefonica rampart himki seychelles ssk corleone www.boss smu pm3 mx.mse20 asa2 overland ftp29 dila kickoff ftp28 cas4 winweb01 m03 m04 ctb shc sgg elwood mail.www wuxin mx.mse22 mh1 smtp-test dn1 konoha ethos www.eda renault thesource win31 cavin mailhost1 flare win34 mice cavuit paraiso pml oceanic nyhetsbrev url-server-cn-3 webdisk.love opx xiaoban www09 dev40 snickers bdb autodiscover.love cftv lexikon win30 win35 autodiscover.filme pf2 host-1 melina unicreditsim.investor snx autoconfig.filme akademie nns webdisk.filme vinny smtp.mse17 smtp.mse18 genealogie smtp.mse19 smtp.mse23 smtp.mse22 leblanc facebooklogin dynamite ilink id2 www.fitness no8 mow webbank mnm mnk crtrieste.investor autoconfig.love www.em nan sgi zaurus retriever newtechadmin vpnb xelion.investor mo2 kym mfa affinity airfrance dhcp4 snapper kdm bancacrt.investor host196 barman host193 smtp.mse20 h26 www.ib secure13 www.streaming autismadmin sciences naveed artykuly ordini www.pi cassamarca.investor ksl ksg harare lch www.investimenti ricerca-ac lay kkn cariverona.investor fhm jsk caritro.investor esmtp smtp07 smtp08 ntb h22 daniels www.short h25 htd www.ug march dnsb jjj shop4 favorit www.lineage2 www.call googlemini esk ppl host131 proxytest host124 scores rho biochem shibidp admin.mail chaka runescape host116 crick rsport eliza cityweb gabrielle www.bloom mailuk host113 hancock uu myface bigred yamuna glitter mail.mse10 mlc renegades myspace-login mail.mse11 mail.mse12 staging.administration host111 ifb mail.mse14 mail.mse15 mail.mse16 autoconfig.sales host109 autodiscover.sales mail.mse18 mail.mse19 www.if zubin syllabus chutiya mail.mse22 m17 mail.mse2 www.hope parse ksoft nagios3 gwa mailsystem serversupport www.dolphin host108 wowinfo aut hy.lhzs stg.www host107 vlab citizen host105 host104 www.healthcare csis timekeeper has duluth schsmtp statler facebok fre download5 turnir asa1 www.gct flashtest mx.mse7 www.just4fun ktech project7 cher testwiki mhsmtp logins rlp kisa gct eet host102 cum pontos spenden ephraim stockholm geodns kitt reno alexis mail.mse23 mail.mse6 vigi smeagol bpk mx.mse10 mx.mse11 evaftp renaud mx.mse14 vhost4 unibanking-test smasb2b01 mailspam02 apif www58 www57 autoconfig.gmail email2003 mail-out02 ane autodiscover.gmail mx.mse15 webdisk.calendar mx.mse16 bbv evabid webdisk.moodle host106 bb9 mx.mse17 cargoappmsg mail-out01 hifisweb mx.mse18 mx.mse19 eva-rms classicrock host110 flighttrace01 flighttrace02 unibid myegsc myeva curry hacking linna weblogs www.replay av01 immeet www73 cargoecdvp hail mx.mse23 host137 myforas www.wirtschaft www75 mki elc01 fisnet myeva3 library1 parque myeva2 tosh gibson evapm www.album fiswebservice cmscpbs kenken gogoeva host125 transformers layer fpsweb elearnqa mx.mse8 fisoem spsowa www68 naresh mailspam01 real2 shivani ambsweb ladybug mx.mse9 evaflow santhosh evawt3 mx.mse6 www.leon gcstest correos arkan comercio test31 apifweb myegat smtp20 smtp17 smtp18 smtp19 soldat imextabs shinobi evakpi mx.mse1 epos mx.mse2 slartibartfast.itd s80.as diagnostics pastel s105.as kram host170 archives2 motoki www.akatsuki mado ansar namnam s3.svr.tdzs s13.as host171 host173 trainer host176 test24 mail.europe pejman fod configure san2 smalltalk s104.as www.akira host177 oujda host188 the-best host150 truestory dystopia migrate s190.as www.tournament s106.as fujifilm snooze host130 s1004 s1125 freedownloads host133 mabel isca dragonzone alumnitest b92 s103.as s134.as host135 s107.as autoclub www.arc euphoria nsg n5 zpg bb8 ame s108.as weareone mexicanfood s17.as h2o winvps scorpions bli fourseasons pradnya vanna sidebar paulina dev-web which retailtest belfast www.sidebar thegrove sangam s110.as crazychat kawasaki s102.as ziggy metin2 sabra punta loginfacebook marengo mesbah lacie botnet portabilidad urbanstyle exeter l23 bloodlust www.seth nimes eno marryme s111.as cerebrum www.ad2 ruch w2w cdntest mima zynga www.whmcs autoconfig.panel autodiscover.panel s19.as grafika fattony s101.as darkangels s5.tdzs nairobi zagreb cercetare mcbain lukman gwb strategia s112.as admitere hic www.mec ded hig montero tickers paramore dalibor gri kul arlequin gup s100.as martine redis homologa s21.as s97.as h88 h87 news5 h86 h85 h84 mobs s4.tdzs h83 h82 h81 hoteltest mehmet www.april mietwagen cooltech wishmaster webdisk.mob magnacarta dico zombi hamdy andros iapetus bats h67 h66 hoo s113.as mailus hotman zizou h57 phorcys potomac h56 h55 epimetheus hsk coldwater coltrane htv www.hoteles s60.as admin.mysql h51 momos h49 s22.as www.cuba parana www.yoyo asavpn islamway elbe upk zidan vali h43 h41 mgc upsilon www.gaby h38 efiling h37 h36 h35 geoserver h34 yosef host132 h29 spv www.coupons host134 gangstas h27 view2 prt s513 third s114.as adeline zgame banca mq01 s23.as www.tg host172 s322 h90 anjali www.rt host174 host175 www.sj h68 gamerboy h50 gss2 h48 h30 www.jl h28 ktf nakatomi host194 raquel mdl host199 wyse karman soyokaze gamepark secure04 s115.as secure03 cau mater www.affinity www.ep cooldude luz magnetic radioadmin pc252 updater xtrem shoping www.eg mrv obl mug s116.as id1 www.umfrage listados autoconfig.forum2 pc104 anca liu myst s25.as bugreport xx163xx usagi cruiser berserk wtv conteudo autodiscover.forum2 op2 zabbo prepress livecams hotsite festa ore s117.as mayank www08 po1 dev143 duty www.emc norilsk abit waldo xserve2 powers maximo keep habboretro alpha4 maxis cib elab1 encyclopedia syscom qlikview officemail yemin saw win02 s118.as usu www.cce www.musicworld www.bla guppy icons alka mcd sax www.dany htc popa glossary posta2 tb1 s27.as jafari gamefree tak slg tcp kstyle pm4 pm5 wins01 sum www.kinder www.seychelles maumau s120.as diverse tre ns182 awm ras03 olivos www.farmasi webshare servo ns172 cmsweb logica esxi06 ns192 tde manager2 nikhil northside audio2 wbs vov moomin prtest cache01 marthe idpdev asimov clockwork wsf secure9 surveyor mtech mall6 yyy lync-edge s121.as bath www.bk s1.svr.tdzs erina normande uos test21 tile www.aris king3 welcomeback homme test28 webcontrol clematis marcia mobile.news littlesister www.bangladesh chefkoch internet2 evi andra openwebmail spccore-router momoiro lotos ssearch extvideo s122.as olimpo stf proxynp s8.tdzs flashmedia wallet carousel publinet www.gw files7 s31.as www.szablony blog.dev mbr prestyle xavi mslogin miley www.ht pubnet datafeed www.kc dwb s123.as jhb milhouse chrisss amefirew bomberman kodos sideshowbob sound9 jinzai sandbox.api richie zixun petshop primequizzes mstyle lakhdar www.hobbies jacobs ichigoichie ijs mailru shimada rotaract quanghuy nnovgorod fool odm detectiveconan jack2566 mymy megha imager kailash td1 clicker contra crus irecruit lwbsb secure-mail s124.as gatekeeper2 old-mail myself mth darkshadow s64.as genero saya funnyhaha google-search oktober medvedev s3.tdzs hikaku s33.as mimic bober undernet backmail speedtest3 www.trial seasonal easynet hifive hemali buenosaires laperla plo mariposa catharina expertise cerber primetech linkbox ctv spiritchapel oriental felicita bidb serious uygulama blackboardtest infra3 fishy musicon maildr nude administrador madura s125.as www.maya eapps www.staf empleos www.legend satelite time3 www.splash ed2 faccebook ogrenci www90 www.legion nazuna special1 ecommerceadmin wesele b72 simpson pac2 www.gratis oreo web56 tgc pina monsoon andesite s126.as www.budget anduril comp1 hyde web96 vladi admin11 fastdownload brora gladius thewarriors svod newfacebook s35.as harshit in1 web181 fletcher usoft loveandpeace av99 www.techno naman go2av web163 web48 existenz lamejor web75 web76 novice mail.z wc2 s8.svr.tdzs web85 mail.go2av u6 aadhaar gameon mail.plus28 autodiscover.clientes www203 manish web91 web92 web93 web95 web97 plus28 web178 web180 web224 webdisk.clientes klas autoconfig.clientes mail.99770 mail.av99 vipul web210 mail.9son 9son myweb1 momus web213 mail.adiscuz mywebs kunde mycom s36.as mail.tudou ljm web65 adiscuz exchange07 ms13 exotic 99770 dummy0 web225 viral web226 web227 web229 mss1 kcb web231 blackstar ap5 web232 www.liriklagu online-casino vinod hotmeil ravel sldss mail90 venere autodiscover.s www.asus www.heaven triangle autoconfig.s brainbox nose dinesh nsz rmr mxbackup1 walle www.oil temp4 yr halcyon lauren se8 acms www.consulta www.yp pinocchio captiva testserver2 webpr naat tekno petit biysk se6 maykop s129.as smtp170 se5 orsk vicki www.ky www.armageddon vps0 vpsa taylorswift scouts new.test expo2010 vpsb apolon dummy1 s2.svr.tdzs s38.as venta s204.as yourspace oo www.watch karachi s131.as zq web115 web116 web117 web120 web121 web122 www.ecuador web125 itnews baa pitta stage-admin www.supermario neonet ddns2 www.libros tanis shambhala conexao s39.as gemini1 autoconfig.catalog autodiscover.catalog mdmc mail2sms fasttrack narutoworld www.exodus flowershop statusquo yjsc rns s132.as topper allergan networth fellows punjab www.eternity kazekage www.word mallorca ffmpeg drluke pardis www.crazyworld s41.as animales pinkfloyd www102 cyberhacker undertow amuse matsu enchanted www.statusquo www124 www123 gim itsolution web158 web160 web161 rapunzel hendrix www.domeny www.uto web162 olddb domeny web165 www.fiesta sshot brc truth web166 puccini s133.as s119.as shoe oes eager curriculum duranduran tgate web167 web168 fiji hackerpro zone1 zombies w50 bsk vpnx svr xplay cre prana trung percussion web171 www.nr test999 web172 kannon tehnika admin7 web173 sercom www.nh www.ne jdm web175 sharktech artesia web176 po3 web177 bx wms3 sumi video7 ns251 www.makeup newstore tonto www.listas video8 ctt video9 ns241 www.kq www.hongkong rooney www.bangkok edge3 celina sharks kostas tomi bassel s135.as tora webdisk.updates mea ftp.news allnews fb1 gilson fairyland web230 web233 scutum remember web45 www.jr maximizer periodicos www.registrar stacy matematica mt5 nsy www.guru headstart yantai daniel1 freire montecarlo twig bok www.dm monza www.bp dkp testws www.myforum leona www.bl nickname www.an s136.as mediatheque pea corazon mays keiba www.picture sanae www.spotlight dev.services www.madison vignesh alb www.medicina autodiscover.test1 smtp.test iodine edm2 dob ftm sqmail git2 supplierportal wrx s205.as fsg nmp yakitori www.gadget shifa jmk ryo consigna virtualserver azmusic www.anp www.d3 lca lcf www.records pav app01 pst tcg seaside www.bia s46.as moderato okada soyuz tow vpp ravenous lethal tasya hongha www.holy drawing dienthoai kevindev pop.out ald ramune www.proto omc shinhan ftp.out webeoc1 bmr magica www.asi swimming myapp www.mn harima cog www.dragonballz demoserver www.ars www.dsa intramail www.nms talia www.eminem www.cci www.goa business1 tvm doh fte psych www.nsr www.seg noavaran mjc www.costarica processmaker sitemail chanel dev-mobile www.writers cyn s139.as mfm testsite1 automobile manas cln chatchat yosi s48.as regal www.cdl love520 menslife hat vosges windstar nguyenhoang sahoo www.cytaty lifeisbeautiful www.das grg saudi noz dreamweb www.openid fundacion s141.as iea sergo hoi zoeken mybill songoku shash secretpage i4u mostafa teksty segar www.get dns201 localhost.cs www.humor dns202 cytaty mail.students bloodlines encounter exoticpets matchup sofie sethi blueprint volkswagen webmail.pec s08 s86 s85 sasan www.famous s84 s51.as santy nable sando wonko krew s79 bbdb bizadm imation ctd ismp 2005 mwe sam2 rgs jeltz my-test staty stage.api www.09 vks femme samin s206.as www.fly dedecms elog vs01 tams www.dienthoai mymeeting b149 palmbeachgardens time4 s144.as earthquake b139 span wrt h206 ombre saira h205 www.gym reddevils anan sadia vs12 qna unreality wolfpack server53 h204 h203 h202 h201 int1 edv ongame lynda ipadmin keine www.jam tmms qqqqq amana www.adel www.ipc richa detudoumpouco www.psychology www.sib www.opt sheepdog billie ttr www.ipp s146.as www.trailers h126 ftp-dev sculpture marc1 supportadmin ozelders swing woe www.kai wol s55.as h116 talks www.esports exorcist bluehat linde h100 f113 www.ist wst www.startrek speakout marka e178 clearing saria s147.as c251 daotao shape c250 ymd c247 c123 ddv s56.as ready tonny c117 lebron www.lop narutofan novosti tooth www.itv b158 josephine nosferatu sadeghi b157 expert1 siteantigo www.dss b156 www.mahdi s148.as www.poetry b155 dina macserver liveon webha itacademy government colosseum havilah www.formation rafting nguyentu b154 s57.as www.log daiwa winkel showbiz www.stocks mirai traum bulletproof b153 secur rezerv lalaland b147 procon keiko cancun www.moo s149.as www.msi kasa b146 localhost.lib vvp maiko pentaho kotobuki medaka s50.as counter2 www.pec b145 roble yunus downloads2 belair b144 s7.tdzs www.thai s58.as com01 perth iconi b143 giftforyou anet b142 chuchu s207.as ostrov www.c2 www.savannah margate b140 b138 okapi b137 b136 b129 tp2 b111 bakersfield b108 dialogue b102 towers h91 rajan lonestar www.rds s59.as timeout www.sic yanagi fantastic e23 crazyboys wyd dslab albuquerque taiyo www.ecc rando falah www.stp dnsbl inge andover d67 www.colorado www.dallas browny d61 plati d56 upset vernon rosario sssssss mashup merrick starstruck memcache2 gonzalo gekiyasu www.colombia micronet www.trabajo exchange-test www.dollar wildwest chistes pooja upskirt live5 serv206 ss8 oikos archivepro bridge-sp noble www.zs www.aim reclamos myheart plog ourschool s153.as moros www.toronto tog www.ryan nettv daikokuya m.news telcel fotoweb c128 morrow andrews chestnut newhosting psql lilium stms static-test networker s7.svr.tdzs merch agassi trips newads www.mining de.dev s62.as showa es.dev southdakota fr.dev castlerock globalsoft www.kent drmail www.servicios cgi-bin martinez www.site1 rnt c44 aidan allyes princeton q60 asu drt weba webstory d001 www.proxy1 redstar microlab pialadunia nouveau itcom rivera protocollo hq1 imga plutus graceful toda q77 mn1 lei beatz intec restaurante cam5 cam7 www.publichealth seashell zaiko mx001 hugin prova1 smtpin eastern sonora kendall v12 www.zgloszenia westgate www.learnenglish peric s155.as phone1 reslife dreamcatcher dnscache1 dnscache2 www.guide lavoro kensington kvm7 rahimi gofree fergus studiofun sandi speed2 aabb qa2 abc2 www.cosmos pass2 yoshi3 gongyi idrive www.diablo herring acha peterborough www.regal shopshop pawan autodiscover.press latest autoconfig.press collect2 www.future s156.as unet metropolitan hima bandb www.storage pavan berkay www.venus mavericks www.veronica perpus davenport bbms s65.as tape preview-m bahonar apparel sdk b98 autodiscover.register allo www.bloodlines pcbbs www.ilove kiemtien warrock www.esf plc snack thietkeweb penrith mxserv1 webdisk.domain b97 autoconfig.register trademark webdisk.register ddm s157.as ns.dev clink kamila aimages pz botan philly eelab prod3 dsweb www.riverside s69.as b95 xgzx gamestation medialink www.delta falco parag webdisk.stats s66.as beto codetest aone dcadmin b94 cpadmin b93 server0 fearless aran h4ck jimbob eclub comex db14 clima macon ravage b91 vaevictis forumweb www.adwords www.pmb b89 anakonda watashi miyake hys gmailservice b86 play-online boing salvador sugimoto bogus bobba netkuu nihongo raijin psion anfro2580 yuyuyuyu www.george families s158.as librarians b85 b84 webdisk.fa beton comunidades noone nonon bayer maildb b79 mnr ghostrider b76 fujiyama texte egress witch serwer b69 b67 musashi acceptatie b66 isolde tomioka webmailold sbi buyersguide b65 archibus voltaire nikka b63 invictus chem2 b61 animemanga helpline vtech arl fufu izumi lusitania stylus bbp www.trinity clerk www.leads advantage1 wloclawek enum nimex imm saglik s68.as b57 s4.svr.tdzs b55 compatible www.emag azar www.offer fuchsia b53 boys nip btest hebrew www.universum s143.as mytischi aimhigh netcafe thanhnhan b45 s70.as shinsei www.newlife dbms raghav chain www.ryazan dax rad2 hossein mohit cms5 ser2 mail.cn www.descargas olahraga wukong danu s162.as elex www.myweb paw deutschland plume sasi www.auta www.region autoconfig.md wb1 wb2 acoustic autodiscover.md ahxxxhot mikrotik seo3 gto ldgateway demi seo2 ipi eiko s163.as simoon ns1.vps ns2.vps b27 www.weblog habbomix zope s72.as drec crea zsys bundle conversion dive nails doan sucuri docu pratap tp3 server71 harish mini8 airworks prints s164.as g7 ipad2 lambert zubi dlc yuma poisson michi gudanggaram www.sanane loser candidats mamami moving yudi takayama www.bihar testserver01 zima roh balzac mychoice bihar edl s90.as s165.as www.survivors zevs www.academia m-sta elife rasputin yong esmf m-qa mobile-preview mycolors digimon www.nigeria ptw massi kuber zaxc primaria tuktuk heavymetal www.lada tedu www.nebraska zain agama www.nofear test2013 www.turkey radiology manly neocorp garu globalbusiness isilon gcg webdisk.china autoconfig.china zack autodiscover.china www.iran cve s1.tdzs mamun s166.as dw1 rumah manji yeye manik autotrader embedded ibaraki maman lowie maxima wic jiaoyou www.turkteam yami s75.as jjw whj imtech microwave vvvv www.skyline finances www.360 weka ezio caiwu down2 tv4 hbc www.agenda wayne www.seeker passat wap3 webdisk.list funy patria v9 dolores webdisk.dvd t8 spel tryout manolo maddy onlineweb www.lh s76.as madar autodiscover.list consul s1234 hastings autoconfig.list onlinepr kriss granit greenboy tota libya hip-hop nade igm empik suzu vlounge s168.as muhammad finanzas suna randevu talisker hopi device s77.as temis stav cfengine stag tink www.index www.fatal diler hrc medianet ip10 huawei fathers tecno s6.svr.tdzs jace register2 biztositas www.biztositas lon sharingan mra tere typhon haifa runa sandro ucakbileti www.vanilla www.academy intranett www.celcom matius kinks www.darkness iut jens insu anmeldung autoconfig.traffic autodiscover.traffic morning www.prog 208 cd-cat3750-sw health2 mabo rony todofutbol roni jiin livingstone ursa s78.as 155 bkzs nejc 156 moons www.mailadmin qube 165 sniffer mame sany samm 182 185 khang www.merc 191 jkim 197 lamia rino 198 saed kasi vpn6 fcserver www.austin resh hearts sources plants taotao jonah webmail.stage razi pierrot rara fav ftpsearch rani webdisk.test1 kenji vc-cat3560-gw s171.as ragu scala dike tmp5 webmail.haber christine ns.haber www.blackjack www.challenge hospedagem ipv4.haber poke kika kimi mail.haber www.meeting kenan devnet s79.as mitsuba dragonballz kebab jmark dods www.bleach kkok newtracker netcommunity okajima landings autodiscover.id payback jokers www.icm autoconfig.id chinook ssl26 vdns1 www.tecnologia tomiko feliz www.carter sasaki db-master ssl28 valinor ssl24 ssl22 ssl20 stijn ssl18 oradea webcat mail.omsk nise kassi weal niit ellen itsmylife luca moyo www.religion taty llc www.wmw nt4 momi s81.as currency kapil nadeshiko kamar hotrod luyi kamal lmd supermarket nath ishan mizo nard www.bellavista smak albina bestshop www.katowice s173.as kabul smsservice webman ironhide loll d148 znaki mer inova mfe1 kush indir maxy belyaeva preview01 nt1 www.y jure s82.as rate autoconfig.monitor webdisk.monitor newstar mugs autodiscover.monitor mlf www.tutor iknow tais webmail20 www.asgard kopi javad s2.tdzs shoggoth juguetes installation webmail26 janez tack kpop s270 uroda lele www.tribe janem s310 www.sunny jandk tenki rebelion leah jupi d49 s145.as d41 d40 celtics d55 d53 rammy klds makh magical d51 funeral d50 d48 kink mp33 duplicate d47 d46 d45 atempo evrm s83.as fits zarafa d44 s200.as d43 d42 d39 smtp-in1 www.rugby www.shine joao maj smtp-out1 shinsekai maka webirc jul web911 www.sears reiya mirror5 www.pixels vdns2 emiliano s255 wealth s256 practicas worldgame miva jman kyiv itsa designcom www.gamestation s258 nomura login.cqgd taipei freebook s262 oneworld s84.as s264 s265 s266 gunit www.ragnarok poison akadem torus isra s271 hiren isni stronger inna kabo s272 arsen www.tizer sheva mell s278 tetanus casino-online www.quote dosen melt sevastopol hunt leonid doladowania huli s285 s287 s176.as mert realgaming jawa gia orlov available cisco7 cisco6 consider s288 auster s911 vanadium 2b jani grant s305 disease s311 testbench sw6 www.animale dialup-63 dialup-62 dialup-61 dialup-59 dialup-58 dialup-57 dialup-56 dialup-55 dialup-54 dialup-53 dialup-52 dialup-51 dialup-50 dialup-48 dialup-46 dialup-45 dialup-44 dialup-43 dialup-42 dialup-41 dialup-40 dialup-38 dialup-37 dialup-36 dialup-35 dialup-34 dialup-33 dialup-32 dialup-47 hoor dialup-60 dialup-49 dialup-39 hold shade s312 safire golds haos s313 s314 s85.as hactar s316 viktoria s317 fallenangel sankar snd blacklight s318 s324 s325 www.chemistry nami www.viajes charter elen s326 sastra silvanus harsh ditweb sepia s329 www.champions my-life mrbean mp3music tendo hansy droopy s332 yawaragi tex austral s335 familie s336 netdrive bethesda hamed kazuya s337 newway www.marco webgate datarecovery s338 www.ski s86.as daneel goku miyu deng habib natali s340 anytime s341 domtest feb2 www.thekings geel s422 giel s427 atma gnys dittest rahman s440 freed artemida www.rachel starway prosperity positive naya sanangel pc03 sftp2 okra s178.as integrate chandru medialive iccs renat samira muz stef helga s87.as rse tinyurl awake speakers spectral joe11 www.counterstrike isec frn srv04 cltest s179.as moin extdev csadmin bpt clxy web2005 tsd rvr www.pixel tatyana kartik ascent moko swarm supercars olk mpacc mog www.cdn3 s88.as ramesh galan valeo yxxt begemot fires mont s181.as www.andres sleepless ix hau dagobah hp5500 gav dwd arbiter rcb wsapi fofo narcissus www.safety s89.as raisa phpmyadm avr geld opac.lib newns2 nrs ishika www.vts jinan rosi hilary pollen jelle qingyuan courant gamesworld www.gazette s182.as mybusiness prairie ivona mehran annemie poczta2 noop loka goodjob gringo paka brightstar nanobio acd www.musik noto mg2 private2 yulin mastercard powerweb s91.as pp11 ecat sp01 yourway numb kameleon delmar fbook web500 cd2 web89 supportteam teodora s183.as davies boson hamedan pproject amina safir dtd celebration tiku rns3 mail.spb s92.as sometimes mydreams xnova aleks cf1 servi1 pill master007 wec pino syjx whitaker devdashboard s184.as faraz plot pole autoconfig.demos xxzx newscs autodiscover.demos geovax dosa raso s5.svr.tdzs dedi24 dedi12 reve emedia dedi10 s109.as talkfusion starbook ribi www.warren prophecy kailas focus2 marquez www.rebelion paule saza engagement s186.as www.sell nodo21 nodo12 seng fs29 dbtest2 wuss fs31 sherwood s95.as cogito rdgateway fs30 devel1 fian sec2 gate01 shed webshield fs28 goodbuy fs27 ino fs24 fs18 m.cafe celebratelife ttu265662 m.gas tour2 sien komatsu workers1 fs17 popopo chery mail.nl franquias preisvergleich phaeton rainbird bluray slow cycle dtm www.talkfusion mnp sooo s188.as www.maroc that www.macro mdx anesthesiology s1.as cyb3r merengue ztc amaryllis srv00 overnight ssra duff lacc webdesigning bil reporte elem yogurt www.sion splendor ucp fmsadmin nightclub ville wonderboy diony dictionar unis tsr dipak tobolsk hahahaha fashionhouse box5 contrast www.test22 www.pilot s201.as upup box9 wada wang variety rm2 diogo s99.as webp weed hypatia box12 srv50 box25 www.fund vvip www.elearn yadi cafedawha s202.as forester radha yawn miu www.bbb www.amt diezz ives www.big grupa diani ceca trabzon heather distant spamd3 worm jewoo www.sap www.newforum s203.as www.craciun origin-community.qa origin-community.qat4 origin-community.qat3 origin-community.qat2 s130.as craciun insem s5.as www.midnight testvideo origin-community.devstage7 origin-community.devstage5 origin-community.devstage4 origin-community.devstage3 origin-community.devstage2 origin-community.psqa sungyeon yupi www.cae ricerca kaktus rpt drak lucho egor delux bengali www.gf areon imagesrv x-nova dasm ext02 doni deka www.autodiscover mekuri dody hns1 cocoro cubo dixi demo03 crop crib neuroshima yocto cam01 deni dene mainframe hinet hns2 irawan www.kelly buda www.shadowcompany nds1 booster www.kat www.dgm tuttifrutti spencer buza xxxxxx pld jeffrey non damn kuroneko omniping vz8 collin www.csc seemann www.edr bestofthebest byebye elcamino nscache2 nscache1 theleo s6.tdzs mediatech www.presta rafiki damir ctmail mochi hap ayam dalet googleapps shina inbloom www.almaty abril www.karen www.newworld nikon kvik www.gem www.ghe aaaaaaaaa s29.as www.gmi unbreakable esperanza chorale and1 www.gsm s208.as thegirl lydia shibboleth2 whitewolf 789 aristo www.ing beautysalon www.codex tariq growingup relief fdl matsumoto angry bobs cristiano awan mediaadmin azizi natale hakata moneta jonny shonan avar chema thongke bower www.itm hdtv sfzx futbolka somewhere barca smtp-in2 novamed chatx s150.as coffeebreak dok blak mirza cyberman vba caps geol email01 www.mer alcantara vist fara sity webmail02 xtremex www.ba kindergarten asli www.jerry venue wildlife sazan s40.as zxcvbn fukushi magus mrtg4 s1.jzwc pistache na4 lastresort wanfang jgm web179 na3 herbalife1 www.we dimple um1 uploading www.mvm geranium s002 csstrike netmeeting apic de9 fineart anuj pftp ansi jp2 mail.fr softtech csadm isel vinnitsa give shuzai.canoekayak reason commissions redred www.horse procurement spamtitan infinit partnership boomerang carik anbu wenxue miriam shenji godaddy guy asmar webkinz bioinf jwxt2 www.psp alii alif glenwood hoffman bbs8 roel holmes kobato ruda test6398 www.roy nanako webdirectory srch cameleon www.rsm bala beter steps sams hac familypet aira sammisound renuka daeryuk totaleclipse new-world baha fakebook myworks extragames ar1 queenbee hotdog router11v04.zdv gabriella babu sabur malvern recados aidi ashish123 adri mpg www.gucci aden www.proba www.grand acen orleans strategic smtpi franquicias pomme fever anisa flower12 alyssa emailsecurity megane former softpro vmail1 erotica cassandre myconnect sagent fss grape manutd sairam ananas ptu scan2 cloudtest nutella www.hello voyageur salimi serc aerospace arnaud switzerland preps zo0om ammar www.testowa girtab www.wws happyday bellydance sqlbackup aliza lululu decision waseda ecolife izar londoneye www.xc vps10 jibong tc01 sascha kawanishi recover cezanne sartaj asaka web-proxy autodiscovery electronic dcvpn xspace tester2 satish clermont ryugaku croma toutatis www.dedicated www.encuesta arjun apc6 autoconfig.xml autodiscover.xml webdisk.xml all4u staging0 asdas mure bardo rewat osvaldo insect espoir savixx www.conferences badar ahsan mediastream wwwh funkymonkey downloadzone www.install idesign www.sanfrancisco kum teng netsystem rodman sys2 opale comunicacao cybele mahmoud vak hogan woodward sabina mercado addme kapo abuja scs2 bemine bestfriends percy acc1 teahouse blister hopeless test-site www.homework fullmovies searches www.proteccioncivil addict sendto sepehr sex169 onlinebanking whitenight webmeet artsandcrafts atlantica mx23 peyote monday index1 138 nightwish morgoth romana tribune wvw goodstyle cardmaster testabc cfp bab ozgur blackout poochie proteccioncivil hkshop apollo3 blackhorse blackwolf francais springtime shark2 catalogues www.smiles theunknown kerman hunt3r web139 epr one12 www.energia sbc1 roxana airmax chocho88 service6 moveon excite j4 fanatic lostmind da5 berich webdisk.weather cantabria morrison samsungindustry www.surat innocent newsdev viruz icarus6 encoder1 hooka amra janko blacksmith darkarrow ajmail afrique bandit sidali anythinggoes theway pacco gideon gamerevolution www.websites hedgehog mrcool tribunal execute horseman ksiegowosc r9 mms1 r6 basecamp r5 mytool vendetta punchline gameonline rhn shurik mundotkm alex99 simmer simon1 simran alexam mechanic alexan servicio infoservice baxter webdisk.cms wales roshan addax weiss admin159 baceco fuyu thebrain spicy aliman webworks mysample fivestars hardservice onlygirl sol1 over40 outlaws hwachang moodle-dev jacket mohajer webdisk.dashboard mohamad seesaw inet-gw web149 lazlo billybob wpp architekten ipcheck lessing bluegrass oussama informes www.ecards tede phwt alians propaganda madewithlove webdisk.advertise albireo bourahla dbs3 dbs2 web2012 www.excel ts05 zav raider vbox2 shadowland ntk bayan alike allin msss uap hewitt anthem lyncpool enrollment moregames www.helix vconference ansan lsweb-ext institute exchange2010 andrej projectx andris jamaica www.mtg ftp.in wlse surplus www.medical asia2 arche howies ashes host002 blanc jhoncena ohm skating appsrv www.timeline nikobellic radiant mcu2 yusuke atrix benito dominos milkshake healthylife musicpro www.uae sonicboom sumatra bereal webint webmail7 smartbox magdalena www-3 technosoft hyphen chell rookie chime chino anurag www.mastermind ucm hammadi prueva webseed chong personal2 redskins serv40 mikimiki backtrack www.ipod nicko ender vanguardia dc02 www.gamer lmm hessen athlon shared2 sas1 www.handmade catalog2 javelin myhousing wftest tr1 fang letsplay backfire lestat dalek tala www.webservices roscoe admin2012 www.drink bridal www.drama s1019 bearmail banquetes honors bblearn matematik www.poll newyorkcity starteam soft32 s1017 s1016 www.era manhthang officescan tuma grill vdo s1015 sohail s1014 www.earth outofcontrol oviedo s1010 happyfriday darklife s1008 notificaciones filemon badabing perception testnew spacer www.cross exodo sbp host52 host58 bfc persada photograph ezequiel deepa s187 trf pscn s1009 blogweb stoplight drupal6 www.koala chiro netstar at2 santana cools www.cgc howl www.chr www.craft testlogin www.coa www.referat citrix01 pippin serpent teste123 www.coral tested somali filin idm1 meli corea agentur mitch steamgames webanalytics www.devil konsole azeroth tomec vietnamese habanero www.dig fzghc mail.voronezh zaqwsx vm52 granja pericles outsider nokian cocopop nch gosolar teplo days sorrel morocco www.color oxo www.soso www.demo7 redbike s182 biogas minet pri1 ht001 www.ym livestock www.ipo dozer www.dx idkort lyncrp www.plotki opc www.dop mwp stargolf maelstrom arshad organizer st22 shibu www.kcc st12 www.infocenter st28 www.lb st26 jrsystem init st29 st23 st21 st20 thecodi e-services st15 st14 st11 st03 caution econom hotspring serv10 brano iletisim www.civil dipesh dvs zup blagoveshensk www.chris archive2 dl45 dl12 nizhnekamsk pietro h216 bambam female partnernet woorifood radmin tomatoelec authority corps2 phuc jinjin blackhawk www.brett morad czone www.bravo www.iti vanillasky bigdeal www.tala www.zarzadzanie bigsavings dotop kimberly gudang webber pt2 wth siesta jimmie webct2 monthly referendum doc4 newuser olea girish filez cary music4you cave weblogin faint www.t1 highspeed conestoga yorkshire www.issues s179 im5 gamespace charlie1 ordinary www.todofutbol etforum afghanistan boni natan speakup janedoe stefan mailserve archery d01 pongo base12 s1121 stigma horseracing authen goodboy suchet itclub pase s174 gns cici zerogravity styleicon www.tst grover h323 benefit ds11 patrik 555 loic s172 aea giveme ds8 aqa omt tongji geneva vek wab baltazar arabsex malek newcore jjjjjj facelook clm kannel www.cargo nazim ips1 cordoba s164 ptb reputer req s162 s161 www.hardcore mkmaster www.melody grafitti bharat sg123 korrg goodfood landers zloty aceofspades darkhunter birdie rid www.mumbai shockwave gachi belgrado testbb s189 thelast www.pune fixer hotmailmsn webmailadmin www.tad www.thi tabasco thekings marafon viagra gameronline s1039 www.step esxi3 s1038 s1037 mm2 gaa wolfram bugz ks1 gabba sing s1023 pbc rihanna eplant jm2 flexi s1024 s1022 thi igoogle svt thepit zapisy hangover nst advent games2play edan eduline msh blob banan bors office5 bonzai lovehate garf nead viso ggyy t34 gemma wns worldpaper www99 esample construccion satyr sweb ivanov nine9 walt explorer1 grb nowayout kendo wvvw www.images.a www.outlook estilo zoli cat4 diversion front6 www.owner iphonetest sprint1 beckham imed www.sif alo lantana notenote guzhou www.testforum music4u spartans kendra epicure voyager1 pilates haley hammy pt5 iconnect bebop megapig sabo bernard amod www.kulinar uppic fudge universitario lguplus lovingyou themaine happyhouse sovet onemoon e-office crazynet ajay sicherheit mathe sancasia glock grabber digimarket hannes concerto kashmir hom webclub vitalis gamerz serkan blog9 slavik www.poems geocode for-you vincestatic alexandrestatic homesweethome lorangerstatic acropolis loranger webst cyrillestatic reply playhouse shopdemo devtok folkmusic hanaliving itce andong ouvidoria 4u explo htl sugarray chaotix cdt caiman rzd taster kish i2i marca aes flyff www.apex 116 gorky jiajia wow-europe lococo lab3 fv xchat enertec sorteo amulet dut liviu mysql50 classmates fifi with 360grad bpd brahim gtl supergames uri weboa www.asdf www.axis administracion yahoo-mail attila chirag loveme deejay sxx wiki-test test011 ocb przemysl andyb whitefox route x-ray ruth kara nellie dorothy www.personal www.dash lucille ecop chl sienna www.pila murasaki www.express elemental spw www.gniezno hrss devis s1002 nissan1 s1001 iena russ melba mcsupport yak bri gniezno przeworsk customercare www.vita forgetmenot www.przemysl www.nisko ninjaworld 24h xiaoshuo s2008 gsoft siscom alcoholism eternita greentools www.cook elder photoblog capi animatrix elblag www.diet linux10 www.dino www.grid www.elec si1 gospel www.img3 www.brodnica haxx0r rozan xtime webcare n3 minigolf toxic boinc amma departure herbarium whirlwind www.mikolajki badboys daylight discordia gomi katherine howdy orly chai eggplant sanandreas www.blacksun www.przeworsk addon aba www.krakow dix cnb ns-master wowwow cosway cpr nisko confucius haze abn starcraft szukaj enable adn hana5 zizhu lists.mail skysky thesky brodnica gander dr2 mpf gomail www.kmm wer hpt ecrm director1 tiburon s152 s151 elites imail2 s147 s146 www.planeta s145 planetlove xvideo orione ivo dbu dvds acs2 hata www.images1 qrcode magazyn www.led anp kluge omnibus duarte yq teamcenter retiree opti server05 avemaria tectec newhorizon clab anyang dyndns www.mitsubishi comingsoon agate tcserver betamail vot jihad irony kalam microtech coucou hrportal web11290 web00 websvr softphone testbbs lowry outdoors johannes timeserver topweb wormhole chucho silviu webb www.ebay torres letterbox hendro webdoc xiaojie web193 fed1 accenture castrol bluecard shortcut homeshop cyberia broadband ardi peterson fantomas nikola www.geek mimizu polygon ads3 lao jukebox ave father blo bluedragon www.sugarcrm www.axiom pxetest anatoli formulaire netadmin p0 carrefour ccnet mchs teardrop www.greece bne vacancies www.full aua res12 res11 bmx jobshop dftp cer bigdaddy web194 jones www.jake nolan grayhat brunei icts vmm web195 gryps mail.mailer wapsite rashed autoconfig.sitebuilder tweeter arindam subaru autodiscover.sitebuilder www.brown www.hvac cig2 gonzaga habbocredits cng wl2 telefony danish atif www.wii carr vanle cata legato funfun rakuten www.http cachorro smd e-pay bazinga mhamad www.kolo tvi www.papa alzahra autodiscover.noticias voldemort cmis access3 gmaill cst www.v4 cvresearch www.vds haddock ctech keene www.calendario jiro freevideo spiders cvt v19 spidey karbala amxbans cwp gmaile www.brotherhood dpp mothersday ocean1 autoconfig.noticias wwwj kimura www.toy ml2 roxio www.loto orpheus koe www.luis adad powernet e250 gfc agamemnon erotika winters yoshikawa cletus www.snd integracao pre.www arges downtime gatti freefall hrishikesh jackie mail.hk fy lovetale emy krish ns132 q17 www.neon recep1 q16 q15 epn angelwing worship mk4 www.sas www.pack yahoomail ns138 pnt ns143 tp4 ns144 photo6 etl watchfreetv partage q100 aditya autoconfig.vip www.aspect killua ns147 spalla mikids mascara www.pepo juann nxy allkind ns153 ns156 truong web1021 ns158 shabab daekyung hashem meduse web1111 web1116 basem web1127 web1131 www.bannersbroker house2 www.earnonline www.msg web2006 web2007 computertalk s-107 minhngoc weiwei www.opel almuslim rene www.zh gfp www.pooh sellit gfw anduin divino pc14 maxgame pc15 www.als www.arg icg click2call www.mes htm www.ffl kamensk-uralskiy mahir www.gib www.htd tadmin supernet pc6 pc7 www.sws tejas www.upd cooltimes mhl cucm www.ppp ferien upfile marocsat kdb mgw1 ipass yado 98 furuhon abm stirling jom pwk ceshi francoise www.lak ichiro mdr skp yszx www.domination cronaldo sm13 ahbab clickbank vinci asdasd1 broom sm9 ehx deviant jeroen elamal partages cppro uksas rstools thenews as7ap sons peewee fxy mzmz ftp.cloud decode worldofgame ns159 technicalsupport pao jjs minhquan pfm tmf jayne jaws wireframe xplode hebergement cogs nye www.parkour webdisk.account jszx abdelrahman www.designs startimes55 ntg fsed shadowcompany direccion eurotour fp2 contraloria autosurf vpns thumbs2 knoz www.anis www.asma www.jokes friki tpx www.general www.cjc e3lanat forums1 tc1 sv19 www.hq www.ats ftp.www2 ng2 ftp.cs tareas sv17 sv20 ymir tmx myonline swat riddler habbox www.professional guitarman ttd kfz hivemind sql2008 sart chiltern sofi isas sumo smg1 www.iraq www.anc www.tempest dwh alma3rifa deluxe www.nail maor uva www.delphi www.raid vs5 pna jubilee www.romantic clickonce bannersbroker web190 wwwwww decima web191 web192 voiptest so3 so2 ultras sampark services.irc ago haryana www.paranormal starcity heroo www.studyabroad gamersparadise uweb wwwprod whitney vacations zon hmsat corus marocstar topshop kaba cogent babylon5 barclays rozrywka makarenko www.ksiazki soni sjs electronik www.rozrywka adminpanel starlink acte montcalm smit ukdev eefi mke test46 bhushan www.experience rassegna www.wis erm autoconfig.track autodiscover.track kiturami autoconfig.c autodiscover.c upper webdisk.c shsh ishikawa www.anders fouad aomori cervantes pdr amerika toyama www.sr exchange2003 web197 habbouniverse lookbook nucleo ragtime kanagawa ecologia youngl pic6 atilla catv gw-vpn ctf loven archaeology s58b s58a s53b s53a s51a j5 xs1 masashi polarbear vagabond ftp.live www.miracle www.mybaby medall tour1 testing3 www.administrator www.tour1 istudy im8 troubleshoot mail.live blognew mx-3 itlife backup55 www.vivaldi mssql2008 www.webinars ganpati udon actie standrews s-34 wso backup65 oklahomacity landingpage asteroid www.archiwum backup70 www.nowy hofmann oraculo www.arquivos yumi2 boeing ktp otomotif fhs xh modernstyle s-95 poss karir swd paidtoclick www.encuestas k8 k7 problems b2b-test k6 beta.www istar treasurehunt kvm8 webquest esoteric canli ids05 www.gestion chus www.touch daemyong highperformance vweb embroidery gefest freshwater lib-db commencement study2 grifone zproxy csportal namdo nintendowii hamleys seahorse residence toollove sms3 portal-test ksa chivas aegir lovemusica chats accreditation momentum agd utv supporters www.admanager ladylove favicon animalrights cariart fiera iix taki artpop decoline corefit cars2 b2c lvs01 saku omedia 220 www.schools trains homerecording momshug xwing green2 gepir bluebrain landrover reptiles mai bentley camps superforum qos freetimes thinkup emdev mail-dr safi daycare southbend quotations oldwebsite webdisk.photo grinder concur shtech pekanbaru giftsadmin sogokju tiendaonline sumai prueba2 ver3 pk1 ns06 pdamail dg01 clouddevapps wlc02 funds licensing1 licensing2 tvco hitchcock hbtest websurvey mi2 cybergames aetos www.mississippi cloudapps nnf xenapp02 xenapp01 homevideo astro2 sl4 hp4200 shuzai.soapoperadigest suen ssmi ibg chinadev guest1 itg tft forumz heartman fda sua pixies chrysalis globedesign ccn kasanokarbu bkd architektur ttserver slgp pbl oyabin centrix groucho notitia seojapan evoque finaid2 au10152771 rongtail alecto rkis webridge01 webdisk.properties www.tuning gamewiki serv9 gulliver colle vamos file6 cgi2 apple2 bbgolf vag ecl chattest ocsrp md2 autoconfig.domains jinsun webdisk.domains siphon cio laue webdisk.affiliates amer infobell autodiscover.domains terminals noema kangoshi wlc01 harpo constantin weare bura wns4 wns3 base01 base02 attitude base03 remotehelp ozon mobilesentry fandango jls gslb2 dda gslb1 mail-a rw5 dde eport sto musicmaster www.curtis impress cerise uol iris12 marinm bk06 partner.dev overseer greg2 www.poligon cnt follow pipo scissors dgm hsms laxmi autoconfig.newsite autodiscover.newsite calltracking kids1 magicbox dib editest locations cw2 wholesaler engdev ebaystore s88 s89 jabapos s90 speed1 kubrick ntp02 ucs2 guerrilla alquran hepa ww11 webcast02 webcast01 sanjuan bugati dra gp1maindns2 dzb vmt rockfish jalisco dev97 dev77 noni dev29 dev23 teambox web1070 web1080 ut3 tufi web144 asa3 web1109 jungang web184 web185 emt web187 web188 et6000 web218 webdisk.lms autoconfig.lms autodiscover.lms bwing 172 cnm srf web408 buzz2 www.graduate ecare www.epaper irsa www.networking iptel novidades cosmoinc ghe vivalavida takara vanille prost freestyler r-timc mayflower ginkgo saphir mixi dcustom edu5 dobby ulm prunus virtualoffice chemnitz aachen laurier www.oferta pattaya kama majuro hpm dbmart prg www.amar vmhost2 ds09 ipcop nile websupport web4test backma beta-admin gokmul ssl14 lumen www.karma ssl10 www.re www.np ipm newdomain ssl9 masrawy www.fo www.kw hscl ssl5 www.ielts moriyama www.einstein isac programacion katayama tanimoto aset jos fujigaoka wcf starwar www.instant mcch albania ishida veyron onodera kelso kawakami tanpopo ney miwa mizuho kodiak talento chapters cremona www.moe koh copenhagen lia rostov-na-donu ambiente ogr apuntes chemwatch slovakia www.cheboksary www.bryansk circulo publicidade www.sankt-peterburg iptv2 gerencia danju rweb bubbel nhacchuong lws planeacion farmers media10 media5 beta.m api.beta winit download.im zc2 www.transfer nik vps006 vps010 vps012 vps013 mysite.sharepoint bfn2 bfn1 isidro vps016 vps017 vps019 vps021 globalnet vps023 vps026 vps027 vps028 wwwtest2 vps030 lists2 whitetail vps031 vps032 myo vps033 mpk mail.chem manet redalert spear-login.rcc spear-login.hpc ymfood mge vps124 autodiscover.www nwd autoconfig.www xterm vps126 vps129 vps009 report2 adia revenge www.fms monsters lamasbella miks wade viscon decobox bobmarley prosoft vps125 wwwl meer geo1 www.desarrollo www.lookatme damusi napoli lomis lugansk arkhangelsk petersburg cherepovets cenha latvia www.rivne bmsys eng1 randomhouse thrawn www.moldova dvclub amk ecatalogue lidl fun4kids www.czech smena www.xat www.sibir vid2 www.belarus tvadmin rostovnadonu carros hgc odesa new-york mshop www.kuban www.sts la1 uliss derbent dnepropetrovsk michele kipper tallis serv17 neworld wefactory host16 anm knightmare sqs atoum vds14 addr cms02 sth strelka eseries tech4 ssrpm voa oxi www.tmm compta ambre tks vcc a25 bsec ip7 nocps intersport cns2 cns1 casimir jabri themaster mailarchive ap02 canter clicks2 bowmore camilo mailbck fbe eec ura www.typo3 emoticons bulut lido tyt pmwiki mpp aljoker www.mambo www.mcc newland neopolis dva vpo category propiedades keygen www.digimon theforum www.firefly mariner lum kili acmilan webdisk.tracking digipath seattle4 autoconfig.tracking autodiscover.tracking webdisk.job bib2 pre-www cpns fac x31 x19 estyle region2 dos2 host33 deathproof isit admin-test webdisk.oldsite host38 npd anjing sabe sdcserver m07 jyw ebys dominican curs ahlamontada www.hit jame loginlivecom autodiscover.katalog autoconfig.katalog posttest temara whereareyou ipadadmin antivirus1 www.thehub www.royalty statm www.yourgames steampowerd www.devblog tol mysterious junction power7 www.hooligans kiku fileup market2 kaede vmb centerpoint www.stories www.ww5 core-rn www.besiktas greenbeans sphynx asteria coffeetalk testingtesting back01 gerrit webdisk.mag elja kyocera test.admin parenting www.stamps www.nintendowii www-all manohar funforum karan endo prewww manjula rhc www.agency bahrami bcn labnet webdisk.host2 fdo shahrukh dide a123 d217 dias diar valiasr www.risk diba webdisk.ssl www.thailand ect www.regional desenv hsr ele f123 link2 vai pecs acis jhony instalator ns.in smalltits crossdressers cfnm pregnant gyno nudesport acne pov groupsex menstruation kic swtest web-ns budi nonnude bisexual ctu shitting bote livesex baum dit ye strapon folio goly nightshift prpr manya push3 natter pangea rde sdl nubiles wsz bilbao ws82 eagent 1221 www.delivery.swid atop devwiki pfizer kak drafts ferhat meng zine fanli www.web-hosting f0 webmail03 amed eventhorizon powerlink masuda link1 graystone iuno www.apply cheshirecat bday amsa f5-2 arge carz hoax voyages ader habibi motorcycle f5-1 aben estrategia syracuse games3 mx30 rhiannon www.teen 255 dacs elinux ako nema cms6 supertramp dasa vltava ficus www.dl2 byblos claw clik dion host28 dish qas luthien weihnachten ecko spellcheck xcart dony symposium www.testblog worklife acces beluga 1001 solicitud web-test host42 host43 host44 subject admision autoupdate brahma emilie ns1.l autoconfig.cl central2 ns2.l host39 webdisk.cl masterhack jocker vs9 softwares wando daisy1 autodiscover.co webdisk.art autodiscover.cl repl www.publicidad trustee cthulhu polaris32 0001 slots bloomingcard drum www.nec www.steve pingdom hanmaum cortes arquitectura cadence protest bs01 soz123 vmbackup asl1 ip196 crawl3 brotherhood detali hgw autoconfig.cpanel autodiscover.cpanel tmr pastime webdisk.cpanel producer webdisk.journal iroiro fed2 antispam1 chris123 myportfolio foreign zcs chroma daesungco batam maxworld videotutorial smtp25 favour aniac crm4 pinguin crawl2 ip193 www.primus mfo shadi abdallah goldencity studyroom iasi websrv01 umma gtc burmese ip253 icelandic infrared newscenter sitenovo devesh ip245 autoconfig.partners salesdemo1 barone salesdemo2 autodiscover.partners bastman webdisk.phpmyadmin mobilux democms angelsofdeath pandu cs11 diets rgu ip217 factory4 roe cs12 ugo ip210 pension1 ip205 ip204 ip203 ip188 ip164 ip162 acris ip147 no1cafe ip119 datafeed2 angelus ip106 authtest youhei from d1-4 nikesb dns40 keele rcworld fpo sendblaster yekwangco choice1 ssada korack subsidy r1back ingolf tikal bigmusic uc2 essex sonax server-0090 orangemusic psworld ticket1 www.old2 songjin beaunix timecoach fannan emprendimiento www.dic kolang iklangratis testversie web717 1004 cofe pls 1012 hwajin reise b133 b124 mansoor alico theoden sinix heliopolis regret taean www.elsalvador vpnserver 4free kame spare-240 spare-248 www.quimica rodan vm110 moist okdspack linux02 server-0087 aurora2 www.port fon parsley nettest1 nettest2 ret abs2 nettest3 corridor nettest4 waitingroom insidepro preview.cmf.staging dte fotoklub www.twilight joka tns3 tns2 tumble peyman hanics nightwatch myapi rei tweets elizabet www201 novosib www.pasca especiales heffalump ctk sutech jwdesign feeds2 kobalt soulteam sargon megazone eprint topsoft player7 mext explorers bigsave niels flowersky leipzig selli www.opensource bosphorus littlethings samwon modi d142 d141 t7 younghwa d140 d138 d137 d135 d134 d133 d132 d131 d129 t6 d128 d127 d126 d125 d124 d123 d122 d121 d119 d118 d117 d116 d115 d114 d113 sungju d111 sungil sungho faq2 nghenhac www.rover salonb www.franchise edomain win2008 www.eko pasiphae securetransfer mosk goedel sycompany suzukishop picdev d139 amalthea image99 d130 jensen d120 boanerges d110 d108 d106 d105 d103 norn www.countdown test-vip caen save-big bestone host06 host07 tokai gingerbread adminweb oliveland switchvox moonstone cheops ironbox babypark gasgiveaway d109 autoconfig.prueba cmf.staging d107 windows3 d104 webdisk.prueba autodiscover.prueba foreclosure abbot opposite avtech sql2005 www.oh siberian vargas meru v001 preview.cmf cacti2 www.bookstore blue-sky www.cristian qadb1 esxi1 stat5 topup invaders pita www45 www46 osos www.404 net7 dc1002 xray2 dgw tenshoku sysadm mywebpage 180 pers plexus 160 153 www.mailboxes libreria syscon spare-44 spare-96 casi mobileshop worldpc spascal linksys orangeave geomusic pilote dongin motorhead rocinante supporto cvsweb frame1 schumann timestore ssv bain soho1004 img32 dev.support consultants ganz signals e001 saib besthouse photoss onclick midiland edubot maleki myra mechanics polomix digiweb unicoh ifree serveri slam luckymart cornea www.8 pdns3 www.42 www.37 www.36 www.33 tnns vica www.30 www.27 www.26 dpec manatee nanotech mjstyle trax shkorea projecta whw artshop admin9 omerta sunline balkan www.ns3 laforge nayely wwwneu backend1 tintagel mg1 vegeta vworld racing teak wooster n4 thecube netdisco cosmas ling pectus file3 dimitri animale projekte devdocs dory unlock lago eeyore overlord caesium wechat cs6 jiang gaspode nawras www.romance preview-www happyfamily compra brava devportal udb pasta lexicon rzeszow gao www.dolls windowslive san1 pns2 viceroy www.mylife tuts weight-loss cys mapserver stary sporting mta7 mobilewap ischool blackblood labyrinth mi6 fws pims victorhugo rax zeus.cc clp stagingcms mdf ns1.cs net5 ruralvia pwtest vmhost3 thefamily astute vikram traveltips db04 automate w15 autokb ive lettuce bennett www.invaders admin123 cabbage aluminum cullen nkh healthyhabits pier999 cp09 creativa timm buffett cp22 wangyi steampowered 3arab vcops mapping abtech wta saltlake www.valhalla smtphk waters pbx1 fileserver2 free-sms goldeneye maarouf hosting5 hayate dbprosearch01perf presd07 dbapp01-6120 web11690 dbsearch01dbnet ts16b web11689 web11009 u1204s web12789 dbhps01dbnet web10242 web10239 dbbuild01dev-6120 web11679 web10809 web11678 dbapp01qa-6120 web10235 web11677 web10808 web10229 web11672 web10228 web12199 web11669 ws292 ws291 web11668 cmdev ws282 ws281 dbadmin02 dbadmin01 ws272 ws271 web10929 ws262 ws261 ts05b ws252 ws251 ws242 ws241 web12349 ws232 ws231 web10918 ws222 ws221 web10247 rtpmaster03ete routernet30subnet2oemail web11982 web11665 web10248 trade9950-test web10249 web12889 loggingky web13096 web10222 web10765 recimmaster00 recimmaster01 recimmaster02 db03perfext recimmaster03 web11696 web12211 web10219 web10796 web13124 web13121 web13120 web13118 web13117 web13116 web13114 web13113 web13112 web13111 web13110 web10996 dbsearch01collectorky web13104 web13103 web13101 web13100 web13088 web13087 web13086 web13083 web13082 fpftp01qa web13080 web13077 web13076 web13075 web13074 web13073 web11659 web13070 web13068 web13067 web13066 web13064 web13060 web13058 web13057 web13056 web13055 web13054 web13053 web13051 web13050 web13048 web13047 web13046 web13044 web13043 web13042 web13041 web13036 web13035 web13034 web13033 win2ktestpc web13030 web13028 web13027 web13026 web13024 web13023 web13022 web13021 web13020 web13017 web13016 web13015 web12305 web13013 web13011 web12910 web12908 web12907 web12904 web12903 web12902 web12901 web12900 web12887 web12886 web12884 web12883 web12881 web12880 web12878 web12877 web12876 web12874 web12873 web12872 web12871 web12870 web12867 web12866 web12865 web10795 web12861 web12860 web12858 web12857 web12856 web12854 web12853 web12851 web12847 web12845 web12844 web12843 web12841 web12840 web12838 web12837 web12836 web12834 web12833 dbbiddata01-6120 web12830 web12827 web12826 web11339 web12824 web12823 web12821 web12818 web12817 web12816 web12813 web12812 web12811 web12810 web12806 web12805 web12804 web12803 web12801 web12800 web12788 web12786 web12784 web12783 web12782 web12781 web12780 web12776 web12775 web12774 web12773 web12771 web12770 web12768 web12767 web12766 web12764 web12763 web12762 web12761 web12760 web12757 web12756 web12755 web12754 web12753 web12750 web12748 web12747 web12746 web12744 web12743 web12742 web12741 web12737 web12736 web12735 net27sub04 web12731 net27sub01 web12728 web12727 web12726 web12723 web10209 web12721 web12720 web11652 web12716 web12715 web12714 web12713 web12711 cp07dev web11709 cw09 cw07 cw06 cw05 web10208 cw03 cw01 cw00 web12346 web12650 web12647 web12646 web10207 web11650 web12640 web12638 web12637 web12636 web12634 web12633 web12631 web12630 web12627 web12626 web12625 web12624 web12623 web12620 web12618 web12617 web12616 web12614 web12613 web12612 web10196 web12607 web12606 web12605 web12604 web12603 web12601 web12587 web12586 web12584 web12583 web12582 web12581 web12580 web12577 web12576 web12575 web12574 web12573 iftp03 web12570 web12568 web10195 web12566 web12564 web12563 web12562 web12561 web12560 web12557 web12556 web12553 web11700 web12551 web12550 web12548 web12547 web12546 web12544 web12543 web12542 web12541 web12540 web12537 web12536 web12535 web12531 web12530 web12528 web12527 web12526 web12524 web12521 web12520 web12516 web12515 web12514 web12513 web12511 cp05dev web12508 web12507 web12506 web12504 web12503 web12502 web10803 web12500 web12487 web11645 web12485 thirdwriteback01ete web12483 web12481 web12480 dbhps01qa-6120 web12473 web12472 web12471 web12470 web12467 web12466 web12465 web12464 web12463 web12461 web12460 cmqa web10192 web12454 web12452 web12451 web12450 collector2 web12446 web12444 web12443 web12441 web12440 web12438 web12437 web12436 web12433 web12432 web12431 web12430 web12427 web12426 web10191 web12423 web12421 net30sub01uploads web12417 web12416 web12414 web12413 web12411 web12198 web10190 web11933 webmaildev web12350 web12348 web12347 dcoh web12344 web11641 web12342 web12341 web12340 web12337 web12336 web12334 web12331 web12328 web12327 web12326 web12324 web12323 web12322 web12321 web12320 web12317 web12316 web12315 web10187 web12313 web12311 web11640 web12308 web12307 web12303 web12302 web12301 web12287 web12286 web12285 web12283 web12281 web12280 cs04 web12274 web12273 web12272 web10186 web12270 web12267 web11638 web12265 web12264 web12263 web12261 web12260 web12258 web12257 web12253 web12252 web12251 web12250 web12245 web12244 web12243 web12241 web12238 web10185 web12236 web12234 web11637 web12232 web12231 web12227 web12226 web12224 web12223 web12221 web12220 web12218 web12217 web12216 web12213 web12212 web12210 web12207 web12206 web12205 dbsearch01dev-6120b web12203 web12201 web12200 web12188 web12187 web12186 web12184 web12183 web12181 web12180 web12177 web12176 web12175 web12174 web12173 web12171 web12170 web12168 web12167 web12166 web12164 web12163 web12162 web12161 web12160 web12157 web12156 web12155 web12154 web12153 web12151 web12150 web12147 web12146 web12142 web12141 web12140 web12137 web12136 web12135 web12134 web12133 web12131 web12130 web12128 web12126 web12124 web11634 web12122 web12121 web12120 web12117 web12116 web12115 web12114 web12111 web11998 web11997 web11996 web11994 web11993 web11992 web11991 web11990 web11987 web11986 web11985 web11983 web11981 web11980 web11978 web11977 web11976 web11974 web11973 web11972 web11971 web11966 web11965 web11964 web11963 web11960 web11958 web11957 web11956 web11952 web12050 web12047 web11632 web12045 web12044 web12043 web12041 web12040 web12037 web12036 web12033 web12032 web12031 web12030 web12027 web12026 web12025 web12024 web12023 web12021 web12020 web12018 orionb web12016 web12014 web12012 web12011 web12010 cp24 web12007 web10493 web12005 cp20 cp18 collector1b web12000 db01perfext web11886 dbadmin01-6120 trade9955-test web11883 web11714 web11881 web11838 web10979 web11876 web11873 web11871 web11629 web11868 web11867 web11866 web11863 web11861 web11860 web11857 web11856 web11855 web11854 web11853 web11850 web11848 web11847 web11846 web11844 web11842 dbhps01dbtmp web11840 web11837 web11836 web10789 web11834 web11833 web11831 web11830 web11827 web11826 web11824 web11823 web11822 web11821 web11820 web11817 web11816 web11815 web11814 cp08dev20 cp08dev17 cp08dev16 cp08dev15 cp08dev14 cp08dev13 cp08dev11 cp08dev10 web11626 web11750 web11747 web11746 web11745 web11744 web11743 web11741 web11740 web11738 web11736 web11734 web11733 web11732 web11731 web11730 web11727 web11625 web11725 web11724 web11723 web11721 web11720 web11718 web11717 web11716 web11712 web11711 web11710 web11707 web11706 web11705 web11704 web11703 web11688 web10172 web11686 web11684 web11683 web11682 web11681 web11680 web11676 web11675 web11674 web11673 web11671 web11670 web11667 web11666 web11664 web11663 web11662 web11661 web11660 web11657 web11656 web11655 web11654 web11653 web11651 web11623 web11648 web11647 web11646 web11644 web11643 web11642 web11636 web11635 web11633 web11631 web11630 web11628 web11627 web11392 web11624 web11622 web11621 web11620 web11617 web10976 web11614 web11613 web11611 web11610 web11608 web11607 web11606 web11604 web11603 web11602 web11601 web11600 web11588 web11586 web11585 web11584 web11583 web11581 web11580 web11578 web11577 web11576 web11574 web11573 web11572 web11571 web11570 web11567 web11566 web11565 web11563 web11562 web11560 web11558 web11557 web11556 web11553 web11552 web11551 web11550 web11548 web11547 web11546 web11545 web11544 web11543 web11542 web11541 web11540 web11538 web11537 web11536 web11535 web11534 web11533 web11532 web11531 web11530 web11527 web11526 web11525 web11524 web11523 web11522 web11521 web11518 web11517 web11516 web11514 web11513 web11512 web11511 cp04dev bobj web11618 bobd webadmin03qa ts06 web10787 web11450 web11448 web11447 web11446 web11445 web11444 web11443 web11442 web11441 web11437 web11436 web11435 web11434 web11433 web11432 web11431 web11427 web11426 web11425 web11424 ss01qa web11422 web11421 web11420 web11418 web11417 web11416 web11415 web11414 web11413 web11412 web11411 web11410 web11408 web11407 web11406 web11405 web11404 win95testpc web11402 web11401 web11400 web11388 web11387 web11386 web11385 web11384 web11383 web11382 web11381 web11380 web11378 web11377 web11376 web11375 web11374 web11372 web11371 web11370 web11367 web11366 web11365 web11363 web11361 web11360 web11358 web11357 web11356 web11355 web11354 web11353 web11352 web11351 web11350 web11348 web11347 web11346 web11345 cp03dev-1 web11343 web11342 web11341 web11338 web11337 web11336 web11335 web11333 web11332 web11331 web11330 web11326 web11325 web11324 web11323 web11322 web11321 web11320 web11318 imnode05qa web11316 web11315 web11314 web11313 web11312 web11311 dbhps01qa web11307 web11306 web11305 web11304 web11303 web11302 dbprosearch01perf-6120 web11300 web11288 web11287 web11286 web11285 web11284 web11283 web11282 web11281 web11280 web11278 web11277 web11274 web11273 webadmin01qa web11270 web11268 web11267 web11266 web11264 web11262 routernet22 web11260 web11258 web11257 web11256 web11255 web11254 web10831 web11250 web11248 routernet20 web11246 web11245 web11244 web11243 web11241 web11240 web11237 web11236 web11235 web11234 web11233 web11231 web11228 checkmate6 web11226 web11224 web11223 web11222 web11221 web11220 web11217 web11216 web11214 web11213 web11598 dbhps01db ws01qa010 ws01qa008 web11150 web11147 web11146 web11145 web11144 web11143 web11141 web11140 web11138 web11137 web11136 web11134 web11133 web11132 web11130 web11127 web11126 web11125 web11124 web11123 web11118 imnode03qa web11114 web11113 web11112 ws01perf web11110 web11107 web11106 web11104 web11103 web10815 web11100 web10785 web11087 web11086 web11084 web12259 s-test1 greenberg web11083 web11082 web11081 web11080 web11077 web11075 web11074 web11073 web11071 web11070 web11068 web11067 web11066 web11064 web11063 web11062 web11061 web11060 web11057 web11056 web11055 web11054 web11053 web11051 web11050 web11048 web11047 web11046 web11044 web11042 web11041 web11040 web11037 web11036 web11035 web11034 web11033 web11031 web11030 web11028 web11027 web11026 web11024 web11023 web11022 web11021 web11020 web11017 web11015 web11014 web11013 web11011 web11008 web11007 web11006 web11004 web11003 web11002 web11000 web11593 cplogin01ete web10149 web10847 web10846 web10845 web10844 web10843 web10841 web10840 web10838 web10837 web10836 web10833 web10832 web10830 web10826 web10825 web10823 web10821 web10820 imnode01qa web10816 web10814 web10813 web10812 web10811 web10810 web10807 web10806 web10805 web10804 web10801 web10800 web10788 web10786 web10784 web10783 web10782 web10781 web10780 web10777 web10776 web10775 web10774 web10773 web10771 web10770 web10768 web10767 web10766 web10764 web10763 web10762 web10761 web10760 web10757 web10756 web10755 web10754 web10753 web10751 web10750 web10748 web10747 web10746 web10744 web10743 web10742 web10741 web10740 web10737 web10736 web10735 web10734 web10733 web10731 dbadmin01perf industrymail web10499 web10550 web10548 web10547 web10546 web10544 web10543 web10542 web10541 web10540 web10537 web10536 web10535 web10534 web10533 web10531 web10530 web10527 web10526 web10524 web10523 web10522 web10521 web10520 web10517 web10516 web10515 web10514 web10513 web10511 cp03dev web10508 web10507 web10506 web10504 web10503 web10502 web10501 web10500 web10487 web10486 web10485 web10484 web10483 web10481 web10480 web10478 web10477 web10476 web10474 web10473 web10453 web10452 web10427 web10425 web10420 web10418 web10417 web10416 web10414 web10413 web10412 web10411 web10410 web10407 web10406 web10405 web10404 web10401 web10400 web10388 web10387 web10386 web10384 web10383 web10382 bk05 bk03 web10376 web10374 web10373 web10371 web10370 web10368 web10367 web10366 web10364 web10363 web10361 web10360 web10357 web10355 web10354 web10353 web10351 web10350 web10348 web10347 web10346 web10344 web10343 web10342 web10341 web10337 web10336 web10335 web10334 web10333 web10331 web10330 web10328 web10327 web10326 web10324 web10323 web10322 web10321 web10320 web10317 web10316 web10315 web10314 web10313 web10311 web11575 cp02backup web10250 web10246 web10245 web10244 web10243 web10241 web10240 web10238 web10237 web10236 web10234 web10233 web10232 web10231 web10230 web10227 web10226 web10225 web10224 web10223 web10221 web10220 web10218 web10217 web10216 web10214 web10213 web10212 web10211 web10210 cp02int web10206 urbanhome web12894 web10203 web10201 web10200 web10188 web10184 web10183 web10182 web10181 web10180 web10177 web10176 web10174 web10173 web10171 web10170 web10168 web10167 web10166 web10164 web10163 web10162 web10161 web10160 web10155 web10154 web10151 web10150 web10148 web10147 web10146 web10144 web10143 web10142 web10141 web10140 web10137 web10136 web10135 web10134 web10133 web10131 web10130 web10128 web10127 web10126 cmbuilder web10124 web12419 web11728 web11729 web11719 ubr01swd web12895 dbsearch03dev web11596 rtp01qa web10123 collectorky oh-mysql-02 web10818 web11735 web10122 web10121 web12896 web10120 cp08dev web10117 prointernal web10116 dotla768 lconline tabul web10115 web11989 web10114 web10113 web10111 web10110 web10108 web10107 web10106 web10104 web10103 web10102 web10101 web10100 web10087 web10085 web10084 web10083 web10081 web10080 web10078 web10077 web10076 web10074 web10073 sm100 sea10 web10072 crafty01 web10071 web10070 web10067 web10066 web10065 web10064 web10063 web11739 web10061 dbsearch0pro02qa web10060 web10058 web10057 web10056 web10054 web11742 web10053 web10052 web10051 web11748 autoscout24 web11749 highlander vmhosting web10822 web12295 web12289 web12899 grandmom web11878 web10824 presentations smoky red2 tsst pgtest ptech fps.eu1 fps.tc1 fps.wg1 web12822 web12912 newky upload01qa dbadmin01qa-6120 promonet web11247 asoft54 ftwright web12262 web12914 upload03qa dbadmin01db legacy20022test directory1 itn hps01 kwtest hps02 web10919 mchproxy02 leukemia net27sub02a docstest rj2707368 net27sub02b net27sub02c net27sub02d web10829 web12797 ns1dev rgt web11737 ppcm dbadmin01perfext www.wiwi ky-mysql-01-qa web11832 dbprosearch01 web10050 web10047 web10046 web10045 dbprosearch01tmp web10043 cw01qa web10041 web10037 web10036 web10034 web10033 web10032 web10031 web10030 web10027 web10026 web10025 web10024 web10020 web10018 web10017 web10016 web10014 web10013 web10012 powerkyalt web11564 web11726 web10778 web11561 web11559 web11685 net29sub06web dbprosearch02 webback07 webback04 webback03 webback02 webback01 web13108 gregz web11555 web13097 cp02dev web12864 web11554 web13106 trade9957-test web13095 web10099 web13094 web10098 web10097 webdesignpc web13102 web12195 web10095 web13089 web11955 web10094 web10380 web11232 thirdwriteback01int web12589 web11419 web12299 db02dev cp01backup web10089 web13084 web11954 web11539 web13081 db03perf-6120 web13079 web13078 intmci9 ts25kycb intmci3 ts20kycb intmci1 routernet4ky collector1-6120 ts14kycb web10079 web11299 net29sub05web web10510 web10772 web11529 web13072 web10381 cp01dev upload03dev checkmate9 checkmate8 checkmate7 checkmate5 checkmate2 web12204 web13063 web10165 web11520 web12049 web10769 web13061 dbhps02db web13059 db01dev web11515 ws03dev web10062 web12048 icpmchat02dev web12178 web13052 olddocs web12948 rcollector2 net29sub04web web12946 web12944 routernet0ky web12941 web13039 web11902 web11945 web12938 web12937 demo1398 demo1390 web10042 web11409 web11946 cs01qa web12935 icheckdocs web10039 web12934 web12932 web12046 ts27kycb web12931 web11398 dbsearch04 dbsearch01 web13029 web12309 web11943 dbsearch01-6120 u1204c icpmchat01dev imail03 imail02 dbhps01-6120 mmoem01qa demo1015 demo1012 demo1011 demo1010 demo1006 web11938 web12849 demo01qa upload01ete web10028 web12314 web12920 web12848 web13018 web10023 web10752 web12917 dbsearch01devbknet newdocs web12916 web11829 web13014 web11395 cplogin04 supportweb02 cplogin02 cplogin01 imapp01qa web13012 web12039 web10759 web12911 web12792 web12909 web12279 web12846 web12897 web12906 web12038 web12294 web10758 web12905 xbcast01qa web11615 web11449 compatible3 compatible2 web12891 web11937 winnttestpc reports6000 dbhps02dbtmp dbbiddata01qa-6120 trade9956-test dbadmin02-6120 web12885 web11722 web11922 web11396 dbapp04db cpprosearchoh net29sub02web cpprosearchky web11439 web12882 web12879 web13098 web12035 dbapp01qa web10969 web10390 dbapp01db trade9951-test web11934 web11430 web11428 cpprosearch06 cpprohomeky urgnet2 powerlink8 powerlink7 powerlink6 powerlink5 powerlink4 powerlink3 powerlink2 web11391 web12189 uploaddev reports04 web11843 cpprohome04 cpprohome03 cpprohome02 cpprohome01 db01dev-6120 web12925 web12196 web10392 web12820 web11364 ky2 carpt immaster01tst web11619 db5ext webadmin01ete supportimail web10194 webadmin01dev web11344 loggingoh web11825 icpmnode02dev web11373 web11845 ts07 thirdwriteback01qa bk05dev web11917 web12779 idevdocs web10999 web12778 web12777 web11334 web12278 defendermx03bb web10998 net29sub03web cal01dev web11329 web12192 benchweb01 cw09web030 web11328 defendermx02bb prooh cw09web021 web12769 filesender cw09web020 web10393 proky web11915 web10916 web12277 dbadmin02db cw09web010 defendermx01bb web11298 web13123 web11369 web10396 web12598 web11849 web10397 web10189 web12765 web11851 web12927 web10398 web11852 web10399 web12939 dbadmin01qa petros webadmin01 routernet5ky defendermx00bb bs01dev dbprosearch02tmpdb mmoem01dev web11249 studev02 web12276 loggingdb web11390 web11862 gaj web12930 cp02prod web10419 zgh web11811 web11839 whatasite web11319 web11368 mzj web11864 salem1 web11317 gzw web12758 web11865 web11913 web10423 web12929 xbcast01demo web10424 perf-route-ds3 web11951 web11818 web11870 web11872 khaled1 web10429 web10995 cpprohome01qa www.mongolia icpmnode01dev web11893 dbapp04 web11875 cpprohome02qa web11693 checkdocs briandev web11877 web11835 pw01ete abaco1 xbcast01ete web11658 web11639 web12949 web11880 cpanel4 web11882 pdns4 taban cal01qa qatest5 cannotorder qatest4 web11702 web11884 web11885 mehr skyy2011 ws61 qatest2 routernet9ky appcgi1 web10732 web11219 web10509 appcgi2 ws71 web11310 web11887 web11888 net29sub13sysadmin mm01 web12751 dbprosearch01-6120 blogadmin basman dbsearch01db dbsearch01qa-6120 web11900 anderson2 cpbidproc01dev web11297 web12001 routernet8ky web12945 web11296 ws02qa web13099 web11931 web11295 jeremydev606 web11959 web11294 routernet7ky web11293 web11599 imnode01tst routernet6ky routernet28 routernet26 routernet23 routernet21 routernet19 routernet18 routernet17 routernet16 routernet10 web11910 web10992 web12739 recimnode01 recimnode02 recimnode03 web11908 digiline upload01dev nasim recimnode04 recimnode05 recimnode06 recimnode07 web12003 web12004 didattica web12266 web11905 videoconferenza web10991 dbsearch01qadbperf web12006 routernet3ky rtp01 web11907 web11399 mooc web12008 web12734 web12733 web10849 web12129 web12009 rogerlaptopwin98 web12815 web11911 web11894 web10011 cpprohome01prod web11279 web11912 cronweb02 cronweb01 web12732 routernet2ky web12918 web12306 web11897 web12729 web10015 web12269 arddb jaysen web11089 routernet1ky web11275 web10798 web11362 araupload alpacas web12013 web10019 web10021 cpprohomeoh web12926 web12725 web11906 cp02perf web11271 web10022 www.s0 web11914 web10029 web12015 web10035 web10464 web10038 web10040 web11269 web12185 web11930 web12719 web11895 kentuckyserver cplogin03 web12717 reports5000 web10749 webim2104 webim2103 webim2102 webim2101 webim2100 web11359 web11263 webim04 webim03 webim02 collector2-6120 ts24kycb web11904 routernet28g routernet28f ts18kycb web12420 web11261 ts19kycb web11259 ts13kycb web11950 fpofc webconfig01qa web11903 extmci1 web11549 web10985 dbprosearch01qa dbsearch04db web11253 web12799 cpprosearch02qa dbprosearch02db cp08dev5 web11251 bk01net web13092 web12002 dbprosearch02dbnet cpprosearch01qa dbprosearch01db dbsearch01qa ws02dev cw09web029 cw09web028 cw09web027 cw09web026 cw09web025 cw09web024 cw09web023 cw09web022 telnetserver cw09web019 cw09web018 cw09web017 cw09web016 cw09web015 cw09web014 cw09web013 cw09web012 cw09web011 cw09web009 cw09web008 cw09web007 cw09web006 cw09web005 cw09web004 cw09web003 cw09web002 cw09web001 web12798 web11901 demo1014 web11242 web12807 web12028 web11239 web11890 demo1013 web11238 thirdwriteback01 oxops datafeedext1 web12017 web12796 monitoring01dev web12291 datafeed1collector web11276 web11230 web11227 web10980 web11379 web11225 web12794 demo1009 web11940 web12835 web10978 web12793 web11218 rogerspcupstairs demo1008 web12296 web11215 rpt2000 web11349 rtpval01 web12802 nihil web11927 web11212 demo1007 web11211 web11891 web11076 dbhps02temp dbprosearch01perfext web12648 web12290 web12255 web12790 web12643 web11713 web12254 ns2dev web12639 web11819 web12525 cp08dev9 cp08dev8 cp08dev7 neildev02 cp08dev4 cp08dev3 cp08dev2 cp08dev1 defendermx00 web12787 webimdev web12632 web11879 web11929 web11616 web11926 demoim dbapp01net stepmom dbbiddata01qa web11595 paulcdev web12785 web12622 web12621 dbprosearch01qa-6120 web12249 web10970 web13122 web11692 web12615 dbbiddata01 trade9952-test dbbuild02dev-6120 web12248 rtp03ete immaster03qa cpbidproc01qa web12239 web12610 ws01qa web12247 web11340 immaster01qa defendermx01 web11612 web12594 fastparts demo-3 web12592 fpftpserv web12591 web12940 web12590 win98testpc web11925 web12588 web10827 chatroomroster01dev web11594 winxptestpc db03perf web11609 defendermx02 web12292 dbprosearch02tmp-6120-6120 rtim defendermx03 web10964 jeremydev02 net28sub12datafeed web11135 web11919 web11394 web11597 vbsii cpprohome03ete cc01qa web10199 winmetestpc wiki01 web11698 dbprosearch02qa-6120 thirdwriteback01prod web13115 rweb01 web12565 web13109 web13107 web13105 web13093 web10044 web13091 web13090 web11119 web11605 web11701 web11924 web12214 web11010 web11117 web12240 web13071 web11116 web10959 web13069 web13065 web11115 web11715 web13062 cpprohome02int loggingohnet web13049 web12947 web11272 web13045 web12943 web12942 web13040 db01perf web13038 web13037 web11099 web11948 web11969 web12933 web13032 web11098 web13031 web12928 web10997 web13025 web12924 web11699 web12923 web12922 web12921 web11096 web13019 rtp01ete web12915 web11095 web11949 web12913 web12499 web10994 web12898 web12772 web10993 web12893 web12237 web12892 web11592 web12890 web12888 web11092 cp3web web11091 dbhps02-6120 web12831 web11090 web12875 web10988 web11942 web10792 web12869 web11899 web12868 web13119 web11591 web12863 web12862 web10986 web12859 web10048 badpentiumii cpprohome02dev web12855 web11085 web12852 web12850 web10984 web10983 web11327 web12842 web12839 web10982 client03perf web11590 web12832 web12828 web11079 web12532 web12825 web11078 web10793 web10977 rtnode01dev web12529 web12814 cpprohome01int paulc02dev web12809 web12808 web12795 web10975 web10974 web12495 web10972 web12194 web11587 web11069 gatewayrouter web11708 web12759 web12791 cpprosearch04 web12519 web12752 web10966 web12749 web12275 cpprohome01ete web12745 web10965 web12740 cpprosearch01 web13085 web12738 web10197 web10963 net27sub03 web12829 web12730 web10962 web12724 web12722 web12718 web11649 web10960 web12712 web10958 cpprohome01dev web10957 web12509 intmci5 intmci4 intmci2 web10956 web10949 web12936 adminback web12505 web10952 web11889 trade9919 trade9918 trade9917 trade9916 trade9915 trade9914 trade9913 trade9912 trade9911 trade9910 web12491 web10950 web12501 web12649 poolmaker2 cpreportsbackup hawkingdialinrouter web12645 web12489 web12644 cp01prod web12284 web10049 web12019 web10467 bwg web10055 db02dev-6120 web12642 web12641 web12635 web10945 web12629 web12628 web12486 web11393 web11921 web10943 cp05qa qadb3 web11582 web10059 dbbuild01devcoll2 web12619 web12484 web12611 fascache web12022 web10469 dvlabs web12608 nnssa1 rcollector1 web12597 web10940 web12596 web12482 web12595 web10068 web12593 dbsearch02devbknet web12602 web11038 web12600 backofgen dbprosearch02-6120 kentucky2 fn01qa web10937 designer-stg web12585 cp03qa hpsbackup02 hpsbackup01 web10936 web12579 web12478 web12578 web12477 web11923 web12572 web10069 web12571 web12569 web10471 natalie shootingstar web10075 super2 web10082 dbadmin01dbnet web12476 cp02qa 5201314 skel web10086 web12567 webconfig01 web100005 trade9900-control web100003 web12559 web12558 web10932 web11579 web12555 web12554 cp01qa cp01bench web12552 web12549 studev web12545 web10928 web12539 web12538 web12534 web12533 web11928 jwebconfig01 web10925 web12523 web12522 web10924 web12518 web12517 web10923 web12512 dbhps02 dbhps01 web12510 web12498 web12497 web12496 web11589 web12494 web12493 web12492 web12490 web12488 web10920 web12222 web12475 web12459 web12474 jeffmlaptop web11016 web12469 web12468 web12457 web12462 cp08dev6 web10799 web12458 web12456 rtpnode05ete checkmate4 web12453 web12455 web12449 cp08dev18 web10912 computerinabox web12442 web12435 cp01perf web12219 web10939 web12448 web12418 icdev web12447 web12412 web12445 backuppc4 backuppc3 backuppc2 backuppc1 web10938 ts23kycb cp04qa web12439 web11920 ts12kycb cp02qa002 cp02qa001 snoopyoh web10739 web12479 lupin web10088 dukakis sethu routernet30sub03 web11309 imgcollector1qa web12345 web12343 web12339 web12338 web12434 web12335 web12282 web12333 web12332 v23mig web12330 web12325 web11308 web12319 web12318 cpprosearch05 cpprosearch03 cttest web12429 cpprosearch02 web12312 productsdemo web10090 web12310 web12428 web10091 db7netdev web10092 jobfair web12298 web11695 cpbidproc02dev narab462 web12297 web10093 web11918 web11403 web12304 ky-mysql-01-dev web12293 web12215 web12300 web12288 web12425 web12424 web11569 web10105 web10389 web12422 web10096 web10109 upcheckmate03 web11812 ky-mysql-01 web11568 web10112 web11841 web11869 web12029 web11389 fighters dbhps01temp-6120 meta1 web10118 web10119 jawknee web11932 web10479 megap usd mel01 web10125 web10129 web10132 muskoka pinker homer2 web12034 web10482 jeremie orkutthemes napstar rogerhome pge jaydeep unipower webmail.webmail builder.webmail web10138 web10139 web10145 mtf neildev web10152 web10153 web10156 web10157 web10158 web10159 jbz web12919 pt1 webinterchange web11941 george1 rpt1000 web12042 web10489 hpg rahuljain gpc owlseye6 sizzle isrc woodlawn server001 ipv4add6 umbracotest mspro web10175 patch4 www.uruguay avatar2 unified web10178 sentral web10179 db1net20 web10202 web10193 msv csv web10204 parking-san-mc web11229 park-memcached web10495 freeproxy web10215 biuletyny aimtestpc ts15kycb web10496 luciana web11935 cpimnode01 cpimnode02 dkn cpimnode03 cpimnode04 cpimnode05 cpimnode06 cpimnode07 cpimnode08 cmdev2 web11697 web12950 dbsearch03devbknet parking-tor-mc cplogin03ete cpprosearch01prod web12139 web12268 web11961 web11962 ts26kycb ws01qa001 ws01qa002 ws01qa003 ws01qa004 ws01qa005 narrabri ws01qa006 ws01qa007 ws01qa009 web10312 testim02 cpbidproc01 cpbidproc02 vzxca mailstore2 web11896 child1 web10318 web10319 dvredit-crackdb portcullis test.cms froth web11967 web10325 web11968 web10329 web10332 braddev web11970 dbsearch01dev-6120a web10338 kiarash cfm web10340 web10345 web10349 galahad elgar web10352 trade9954-test web12415 cplogin01int ulysses web10359 web11975 phadmin rmi rodina web10362 web10365 scottbat web10369 mcleod web10372 emin butch nwvl mahboob ph4nt0m dbadmin01collnet web10375 web10377 drugon bugsy dayna chss ohdc barn utenti vcb web10378 thunderbird blunt web11979 webformcc.web.d-dtap web10385 checkmate10 web10391 svevo sasika cpreports web10402 elinks cafe1 bilby blogmu jalapeno smiler web10403 web10394 web11947 web10395 ppp4 web10408 webdav1 dan2 dps1 web10409 web10415 paraisossecretos regus web11984 web11429 web10421 web10422 web10990 web10426 trade9959-test web10428 web10430 web10545 web11988 web10454 web10549 web10455 web10456 web10457 frontpage1 web10458 web10460 web10461 web10462 autoconfig.bd webdisk.bd web10463 web10465 web10466 icpmmaster01dev web10468 web10470 datacenternetoh web11995 web10472 web10475 db5kyint web12609 web10488 web10490 web10491 web10492 autodiscover.bd web11999 web10494 web10505 web10497 web10498 web10512 tin-tin db5collectorky wiki01qa web12112 wv playtime ky-brianweb-01-dev alrahma web10518 fastnnet web10519 web12113 web10525 web10528 web10529 hps01qa web10532 dbsearch03dev-6120 web10538 web10539 web12118 web11289 web12123 web12125 www.phuket web12271 dbprosearch02tmpdbnet web12127 www.mauritius dbsearch04-6120 demoimmaster01 padfoot web12132 web11898 hollander2 z-v-tamngung-20130130-www.mobile hollander3 www.ketban hollander4 web12329 cmsupport z-v-tamngung-20130130-www.mobilegame tsung0 web12138 dbapp01 web12143 web10339 web11519 web12144 streamings gammoudi5 web12145 trade9901-control datafeed5 routernet0 routernet1 web12148 web12149 dbsearch01net xbcast03ete web12152 web10745 web11423 cpimmaster01 cpimmaster03 cpimmaster04 web11813 web11939 molitva web12158 routernet10ky web12159 web11909 rtmaster01dev web10790 web10791 web10802 web11953 web11892 web10797 web12165 ts11kycb web11252 ts16kycb web10828 mx2o2 ts22kycb devnetrouter mx2o3 web12169 web10834 datafeed3 cs01dev mxo2 mxo3 www.prosper webadmin01perf tinnhan stylesgiles mmoem03 web11694 jnb www.tuvangioitinh m.nhac xbcast01 ipswich xbcast03 web12179 web10989 web11001 net29sub01web web12182 autoconfig.survey autodiscover.survey www.lamquen ucow200018 web11005 ucow200118 dtdd upcheckmate01 upcheckmate02 www.nhac web10911 web11012 autodiscover.um web10913 smsbongda web10914 didong products.demo ws04dev web10915 viec web10917 www.tinnhan intelec web11018 www.tuvantamly z-v-tamngung-20130130-mobile web11019 onlinehelp datafeedtest web10921 web10922 web11025 z-v-tamngung-20130130-www.javagame www.dtdd web10926 web10927 web11029 skn web10931 ucow200218 web11032 web10933 login01qa ucow00018 web10934 web10935 ucow00118 web11528 web11039 web10941 dbsearch01dev web10942 ucow00218 web11043 web12190 mgd web10944 web11045 www.didong z-v-tamngung-20130130-javagame krd web10946 lemmiwinks web10947 uploaddev2 web10948 www.operacje tuvangioitinh web12191 lesath vampira tuvantamly www.ukr www.ringtone lympne web11049 web10951 web11052 web10953 test.nhac www2.nhac web10954 web10955 web11058 web11059 mxserv2 www.smsbongda z-v-tamngung-20130130-mobilegame web10961 web12193 lamquen c-3640-v03-01.rz ladon-1.rz web11065 mailrelay-eddev mailrelay-edprod oxford1 c-asa5520-v03-01.rz c-5508-n04-01.rz c-5508-v03-02.rz dh-ramirlt www.shop1 cw01qa001 webdisk.resellers ranch hughie web10967 web10968 rhdev web10779 kevindev02 web10971 supportcenter web11072 sandal acsteam web10973 web11691 perky web10981 ssotest2 arundel dmv dbsearch01collnet 0745 web12197 wsftp treasurer web11936 web10987 web12208 virtuality evision-test web11088 foe bs01qa web11102 tutoriales web11093 lcezone web12209 anacreon 1006 web11094 cw01qa002 web11105 web11097 web11108 web11109 intpt01a mchproxy01dev web11120 web11122 dbhps02temp-6120 net29sub07proweb trpz web11687 collector1qa diseno web11128 web11129 web11131 web12202 web11139 ns2.sdns ns1.sdns itanium www.rotor web11148 web11149 tcoh web12225 powerky poweroh web12228 wlan-switch.dyn web10459 web12230 host35 web12599 jwebconfig01qa prod.contentlibrary web12233 web12819 web12235 rtp01demo web11265 cpimmaster02 web12242 rw7 webconfig01train ssqa pw01qa web11291 autoconfig.t web11292 web12246 autodiscover.t allthegreenhomes wlan-switch.inf credix rtpmaster01ete cs8 ts09 rtpmaster01 dadmin cs22 www.arquitectura begin autodiscover.tmp webdisk.tmp autoconfig.tmp qa-version server1010 yamyam anteprima www.bkr www.aldrin anne1 www.toplevel www.mmone mmone mcommerce craven rtpmaster03 vps-107.cp web12256 protek boneyard steveo web11397 malang creepers trpz.dyn trpz.inf suites cpprosearch01ete wms5 wms4 supportweb01 intratest www.derecho supportweb03 ims2 fascm compbio l4d wms6 www.psicologia mbl testnode1 appstest cp01prod001 kaitain web11438 dha messalina agrajag lucilla garkbit tps1 profesores planetree web11440 lti carthago compost myteam fabia skyx tsung1 publicaciones mockturtle sartre herbster webdisk.david iulia db3collectorky kirsten1 cpprosearch01int icpmmaster02dev hamzeh realcity reports01 dedicatedserver dinosaurs reports02 reports03 reports05 kronos01 srv06 kronos02 ts04b ts06b stg02 stg01 jhw ts07b wwwbeta ts08b ts09b ts11b ts12b webdisk.minecraft neerc ts13b ts14b ts15b www.ciekawostki ciekawostki jkoecher gmail-iweb brightmail presd01 presd02 presd03 idelivery10.platform presd04 presd05 presd09 ts18b monitoringoh ts19b cpprosearch02int images.swid qa-route-intmci8 imgcollector01dev client01dev cpprosearch03ete dbprosearch01net idelivery11.platform rtpnode01ete ws31 rblack berkshire ws32 hgxy xinh hug0318 pcv snieg mmtp ws41 ws42 evo-master www.bioinformatics jay.ns newmeleno a.riten.hn ws51 b.riten.hn meleno.in c.riten.hn d.riten.hn lindon e.riten.hn www-h puppymoon daa2 fire1 aep bankruptcy kronos1 sunny.hn meleno wwwmeleno newmeleno.in ivy.ns a.sunny.hn b.sunny.hn riten.hn c.sunny.hn d.sunny.hn e.sunny.hn munin.riten.hn newsat westy superstore kiril localhost.net kns rsi dhcp04 yamamoto holm env1 www.prosfores admin.env1 market3 ws.statm mkg-admin statm2 cas01 hidayat wayfarer istra hta-prodhost0.sol isk vakant.kc stigmata lbi matthijstest marilot1-design randr eufrasia.bio teco45.ae router-sdi.teseo d37pc2.mp uniflow pent-x450.cbm b20pc2.bq darker a37pc2.mor pc22.icp sidirect2.sidi fcpc19.far ws52 dbapp04-6120 b20ppc3.bq fourhorsemen ws62 cl02 ws72 ws81 ws91 annabelle rubis ws92 tamtam trade9953-test cplogin01prod cp08dev12 sonyericsson biff cp8 alize r2000 mportal accueil cp9 urgnet3 web11828 cp7 cp6 sql2k3 sql2k2 efront prelive-admin ew54384r9bcgh3 ew54384r9bcgca ew54384r9cxl7w web11916 ew54384r95tahl ew53680r9cxfhg ew54384r9d5fkm ew54384r99z0rh ew54384r9abzgm win101 web10794 ew54384r9cxkf8 sql2k5 sql2k4 sql2k1 ew54384r9d4wth ew54384r99nhcl ew54384r9d6hla ew54384r9d6hlw ew53680r9ah4kc0 ew54384r9arf7f ew53680r991hl4 collectorback ew54384r9ca8rn cp08dev19 ew53680r9bbvt4 wiki01dev mail.chat ew54384r9cxkyg ew54384r9ca99x ew54391r96vvye data6 client02dev ew54391r96vvzv trade9958-test ew54384r95taeb web11859 web11874 web10817 dbbuild01dev ew54384r95taee ew54391r98m0p5 web10819 web10379 mmoem01 ew54384r95taka mmoem02 ew54384r979gln0 www.eburg routernet11ky jeremyclientdev ew54384r99nht2 web11944 ew54284r9fd8cb1 routernet28sub13sysadmin routernet12ky routernet13ky qaweb3 dbhps01temp www.aga web10835 routernet14ky client03dev demoimnode01 routernet15ky web10839 ew54384r98e15v web10842 web12119 grodno www.instalator urbanlaptop 1337 web10358 web10930 dbbuild02dev web10848 www.tournaments dbbuild01net okr web10850 rtpnode03ete web12172 rtpnode01 rtpnode03 rtpnode05 meier ts21kycb web12229 web10738 zhitomir mercurio2 ew54384r99z1wf sivaram ew54384r9cxlz30 ew53680r9amhxg ew54391r96zpan luk meca lodestar www.rating cbb ew54384r9d5f9n sanket pdn11g-scan ew53680r992l0x ew54384r96rm4f administrativo crecon tournaments ew54384r96rm8b ew54384r98kz000 ew54284r9ehm2n0 ew53680r9d5ctz ew54384r99nham ew54384r99nhdp ew54384r99nhm6 ew54384r9ca8h7 ew54384r9atcfd ew54384r9d4t3a nlplanner www.erevan ew54384r96vtbm ew54384r9d5fep ew54384r99nhwh ew53680r970llk kherson uzbekistan ew53680r970lly ew53680r970lmv maild ew54384r9aa18v ew54384r9aa19v ew54384r9aa19x ew54384r9aa19y ew53680r99nlh6 ew54384r9aa1a7 ew54384r9aa1b1 feniks baks ew54384r9aa1b6 www.mur mogilev ew54384r9aa1aw ew54384r96vtge ew54384r96vt63 test-p ew54384r96vt97 ew54384r96vta6 ew54384r96vta9 telaviv ew54384r96vte8 ew54384r96vtkl ew54384r96vtlm ew54384r96vtv7 ipv4with6 ew54384r9ac08e viz ew54384r9ac0f1 lepus ew54384r9ac0da ns22266 ns24331 ew54384r9ac0dt ew54384r9ac0ev autoconfig.central autodiscover.central ew54384r9ac0ew ew54384r9ac0gt ew54384r9ac0gv ew54384r9ac0gy ew54384r9ac0hz ew54384r9ac0ll ew54384r9ac0nl vps130 ew54384r9ac0pb ew54384r9ac0pt ew54384r9ac0rc vps120 ew54384r9ac0wv websrv1 mango2 ew54384r98m384 ew54384r98gdm6 ew54384r98gdn7 ew54384r98gdr0 ew54384r98gdnp ew54384r98m1k3 ew54384r9ca8g3 ew54384r9bl31t ew54384r9d4wd3 vps160 ew54384r9bcgk7 vps167 vps187 vps178 tripplanner vps159 vps146 ew53680r992x65 ew54384r9d4wcr ew54384r9ae2c4 ew54384r98kyyd0 ew54391r98rhmz txdowtp ew54384r9d4wnd ew54384r99nknz ew54384r9cd2mp ew53680r99v27b ew54384r9bl2ke ew54384r9cl1lc0 jawhara ew54384r9bl3bh moslem ew54384r9arh37 ew54384r993neg ew54384r9abzme0 ew54384r9c03p60 ip8 vps046 vps043 vps039 ian1 ew54384r98kz0a ew53680r981fpb ew54384r98kyca ew54391r99ngb9 ew54291r9rg5k1 vps025 ew54384r98ng5f ew54391r99ngen vps022 sjp ew54384r9abzwz ew54384r98nep6 vps018 ew54384r98nena ew54384r9c9hl8 ew54243r9f714d vps014 ew54243r9f713x ew54384r99v3en ew54243r9e8mkh1 www.mature vps008 vps007 ew54384r99l6gb proxmox1 vps005 vps004 vps003 vps173 ew54384r99l6gk time.services ew51fkya60218 ew51fkya60254 ew54384r99pp4n ew54384r98xy7h ew54384r97ygm5 sparkhost mailman1 p001 ew54384r9ca8yx ew53680r9a2177 ew53680r9a217p ew54384r99pr0c ew54384r9bkm3d media8 ew54384r9ca9cp media6 ew54384r9cd2pt ew54384r99v3md ew54384r9cd5a9 ew54384r9be4p6 ew54384r9be4pr ncs1 xkb wwf ew54384r9be4td ew54384r9be4vv ew54384r98rha1 ew54384r9bab0m ew54384r99pt3z ew53680r987ct1 ew53680r9a34w8 ew54384r9bkn52 ew54384r9baaw2 ew54384r9ac006 ew54391r9bhymp ew54384r99ppag ew54384r9ac011 ew54384r99vc66 ew54384r99pnxl ew53680r987mrt ew54384r99ppp6 www.khabarovsk ew54384r979gll ew53680r987pkc ew53680r987pla ew53680r987pky ew53680r99px0r ew54384r9cd4g7 ew53680r989df1 ew54384r99vc4g ew54384r9bcf1x www.ulan-ude ew54384r99prk4 ew54291r9e8ehw1 www.surgut ew54384r9bcf9m ew54384r99prgb ew53680r990he1 ew53680r990hfc ew53680r99py2e ew54384r9bcfkh ew53680r978fdb ew54384r99prnt ew53680r9a706g www.dreamweaver naberezhnye-chelny ew53680r99pz0p ew53680r99pz76 ew53680r99pz3t ew53680r991hlk ew54384r979gtb red1 ew54384r99nh73 ew54384r99nh82 ew54384r99nh8f www.phpbb listas2 ew54384r9ca95v test2012 ew53680r992l0t ew54384r9b5x46 hirano simomura ew54384r99nhb5 ew54384r99nhrr yamamura ew54384r99nkh8 ew53680r992krx ew54384r99nkmx irifune aoba fujimoto ew54384r99nkpb shimomura yoda01 ew53680r97ent3 taira hasuda9230 hanazono naitoclinic ew54384r9bl341 chuuou ew54384r9aprw5 yamadaganka ew54384r9bl35z inagaki ew54384r9bl37l miyata01 ishimoto ew54384r9aprw9 ew54384r9arh24 ew54384r99pvpx kiyose ew54384r9arh0e s4336 morinoki ew54384r9bl2dx ew54384r9aprzb kirin ew54384r9bl2pc yoshimi bandgplotter.printer nanohana kensei ew54384r9cc7f6 ew54384r99v3d5 ew54384r99v3fa ew54384r99v3mp ew54384r99pp77 shinobu kishi kashima fukushima01 suzuran fbc greenpark kumagai machino ishibashi mick ew54384r9cd2bt ew54384r99pr11 smtp1.net1 ew54384r9cd2ht ew54384r99pr5h ew54384r99pt16 ew54384r99pnfn www.mw ew54384r99pnle ew54384r99pnlf s4335 bambou www.ge ew54384r99pnkv ew54384r99ppfz ew54384r99prmh www.nf ew54384r9arf64 ew54384r99pvkx ew54384r99pvva ew54384r99pvvk webvip ew54384r99pvwt ew54384r99pvzl ew54384r99rm39 nbdb ew54291r9rmzf4 gruppo rsp ew54384r99rm56 ew54384r99rm5y cndev ew54384r9arcze ew54384r9arfna ew54384r9argzy ew54384r9arfv5 berlioz s4334 ew54384r9argfx ew54384r9arfpz neocom ew54384r99z08t ew54384r9bkp7m ew54384r99z48z ew54384r99z0pd irfan ew53680r9a6xf7 ew53680r9a6xg1 ew54384r99ppv0 ew53680r9a6xz5 a02 ew53680r9b0ach ew53680r9b0ada grenache ew54384r9bkn8a ew54384r99vb58 ecrins ew54384r9bkp8a ew54384r99vc1t ew54384r99vc8d a13 a14 orphee ew54384r9bknhc ew54384r99vah2 a18 motte ew54384r99vahe a22 smetana ew54384r99vaz3 delos ew54384r99vawt v182 vila ew54384r99vbrx ew54384r99vbtt rossini ew54384r99vbvz birman ew54384r99vbxr ew54384r9bmbn7 ew53680r9b68ln ew54384r9bmdy1 nexus1 ew54384r9bmdz4 babette rimbaud ew54384r9bmdxx a20 ew53680r9b806x ew54291r9rdfbr0 ew54384r9bkn5e daf ber ew53853mjeapn2 ew54384r99vbeg ew52325r9xz5w9 ew54384r9arnh0 s821 crumble ir1 nyco willem marocco r01 r02 ardeche ew54384r9bnn0f sagarmatha ew54384r9bnn0x ew54384r9arnn6 ew54384r9bt7c6 ew53680r9b86vk ew54384r99z08f s4330 ew54384r99xhzt adserver1 ew54243r9nt1gd ew54384r9dd73l shopinvent ew54384r9ca8w5 ew54291r9e8eff ew54384r9dd80m ew53680r85pndk ew54384r99prg0 ew53680r93z807 s601 ew53680r93z80f ew54384r9dd6zp peo ew54384r99vat6 ew54384r9bl3ay novell erp1 ew54384r9ca9lz igw lmail ew54384r99yzpv ew54384r98e60l ew54384r9atcg0 ew54384r9cxly50 ew53680r99z1mp ew52241r87235h ew54391r99nghf mssql03 ew54384r9cxm340 spm01 sd04 ew54384r9d4whn ew54391r99pw150 sia2 ew54384r9c9k5h biotec ew54291r9h948g0 s4325 rss4 s4120 ew54384r99z1vz web320 ew54384r9bz7kw ew54384r99vbdw ew54384r99vbpt ew54384r9ac0dd web334 web328 web324 s4324 web323 web322 web321 ew53680r9c68w2 ew53680r9c68wd ew54384r9bkm7m backuper ew54384r99vbrm ew54384r99ppvg ew53680r992kn3 ew54384r9cd2l1 ew54384r9ac0l3 ew54384r9bkn8b ew54384r98m39n ew54384r9bkn9k ew54384r9ac0fn ew53680r992kla ew52241r8mmpaz ew54384r9bkp3a ew54384r99vb59 ew53680r8l979b www.qs ew54384r9bac3a ew54384r99vb8p s4321 web114 ew54384r99vbye ew54384r9bzb61 ew54384r9ac0r1 ew54384r98gdml 1985 s4260 ew53680r9be0ay0 qa.contentlibrary s4319 ew54384r9bzazv ew54384r9bknaf alsaher keepyourprivacy ew54384r81gtrl hideip-sweden fish2 floppy wtnmodel5 ew54384r9cd2l5 zaq1234 hideip-ru ew54384r9bknpl hideip-australia ew54384r9ca9e3 ew54384r99vam8 l2tp-tk l2tp-ru internet1 l2tp-sg l2tp-se ew54384r9ac0y3 ew54384r9b5r1p ew54384r9b5w73 l2tp-sp www.teachers l2tp-fr ew54384r9848m9 ew54384r99vbmh ip-tk l2tp-ch ip-ru preview-fsc ip-sg ip-se hideip-spain ew54384r99vawk ew53680r9c6wdl ew53680r9c6wex ew54384r99vbz5 ew53680r9be2v20 ew53680r9avg2c ew54384r82h6y8 ip-ch ip-au ew53680r9ah595 ew53680r9ah53n l2tp-au ew54384r9ca9dw hideip-ch ew54384r9cxmdg ew53680r94xpw6 ew54384r99nkxt ew54384r9c9hmg ew54384r9ccldz hideip-russia hideip-turkey ex54391r99txdr ew54384r9bmbrg ew54384r9b5x73 ew54384r82k55z ew53680r9d1mbc ew53680r98rfgy0 www.opinie lists.h1.nl ew54384r9cxa24 ew54384r82dtnd bpos-eas ew54384r9cxakz ew54384r9be4tz0 ew54384r9cxl43 ew54384r9cxl1a ew54384r9cxm43 ew54384r9cxm1l ew54384r9cxlcy ew54384r9cxlka ew54384r9cxlr0 ew54384r9cxlkp ew54384r9cxmda ew53680r9d5c45 ew54384r9cxpev ew53680r99hlwg ew54384r85fp530 ew54384r9bl2w9 madowtp ew54384r9bl2wb ew53680r97cz9p orfeo ew54384r99ptbe ew54384r9bkp9e ew54384r9arnv9 ew54291r9h948m ew54384r81ttfy ew54384r99v3dl ew54284r9g3w0t nportal ew54384r99v3n5 ew54243r9hlp9g ew54384r9bl3vw0 ew54384r99v3nb comed support.test ew54384r83p17g ew54243r9hlp830 ew54384r9b1xrh ew54384r99vben ew53680r87gddw ew54384r9bmby7 ew54384r9clezv0 ew54384r9c03dx vmc1 balrog ew53680r9aa9m5 ew53680r9aa9mf ew53680r9aa9xl ew54384r9cc7fk ew53680r98gc97 ew54291l1bgc17 ew54384r9bl3az ew54384r97lmy2 ew54384r97lmy7 ew53680r98gcda ew53680r98gcea ew53680r98gcgx ew54384r9aa19z vmhost01 vmhost02 ew54384r9ac00n ew54243r9fdrf5 ew54243r9fdrec ew54384r9bcgd8 ew54243r9phccn0 ew54384r9c04kz ew54243r9gd498 ew54384r9cd572 ew54243r9gd4az ew54384r9cd579 ew53680r9aaadk ew54384r99ptbd ew53680r9axv6n ew54384r9dd802 ew53680r9ah38a ew53680r9ah3c4 ew53680r9c68th0 ew53680r9ah5b9 ew53680r9ah5fh ew53680r9ah5n0 ew53680r9ah4yh ew53680r9ah4zk ew53680r9ack0l ew53680r9acgfx ew54384r96vt7p ew54384r97gwae0 ew53680r98ltf6 ew53680r98ltg5 ew53680r98lth3 s4311 ew53680r98lth7 ew53680r98ltkd testcontent ew53680r9aebr5 ew53680r9axxb1 ew54391r99ngdm ew54384r9ccny4 ew54384r99vcg0 ew54384r96vt8b ew54384r98nefd ew54384r9bcf430 ew54384r99vcf7 ew54384r96vtbg ew54384r96vtar bsl reloaded ew54391r99ty13 ew54384r96vtef www.passport ew54384r96vtgn ew53680r9bd61b s4310 ew54384r96vtt6 ew53680r9be09x ew53680r9be0ad ew53680r9be0g9 ew54384r98nga1 ew53680r9be2v5 ew53680r9be2wr ew53680r98rfh8 ew53680r98rfhv ew54384r98ngb6 ew53680r9ahkz0 ew53680r9ahkve ew53680r9ahkvl ew54384r99prbn ew53680r9be7dp ew53680r9be7ev ew54384r9abzgd ew54384r9abzew ew53680r979t3t0 ew52429r9vd40t ew54384r99pt9z ew54384r9arfdp ew54384r9ac0f6 ew54384r9ac0g4 ew54384r9abzmh ew54384r9ac0cp ew54384r9ac0dn ew54384r9ac0k0 ew54384r9ac0l4 ew54384r9ac0gn ew54384r9ac0n9 ew53680r9ar66r ew54384r99ppcn ew54384r9ac0lp ew54384r9ac0nh ew54384r9ac0t9 ew53680r9ca23f ew53680r87gdcn ew54384r9argc0 ew54384r99vcn5 ew54391r99txlr0 ew53680r9amhxa ew53680r9amhww ew53680r99nl2l ew53680r99nl8z ew54384r9abzy4 ew54384r9b5x4d ew54384r9b5x4e ew54384r9abzr7 ew53680r9bk62c ew54384r9b5x5m ew54384r9b5x6h ew54384r9b5x6k ew53680r99nlc2 ew53680r99nldc ew53680r99v228 ew53680r99v238 ew53680r99v253 ew53680r99v255 ew53680r99v23c ew53680r99v21z ucs1 ew53680r99v28h ew53680r99v28k ew53680r99v28v ew53680r99v28w ew53680r99v386 ew53680r9cc7d6 usdigitalws3 ew53680r98xyxc ew53680r99py57 ew53680r99py90 ew53680r99py5g ew53680r99pz2y ew53680r99pz3r ew53680r99pz8x ew53680r99pyam ew53680r99pyca ew53680r99pyp6 ew53680r99pzkp grupo ew53680r99pzlh ew53680r99pyzf ew54391r9c6tlc ew54384r9cd4lh ew54384r9cd4kz ew54384r99vc10 ew54384r86gryw ew52429r9vnera1 ew54384r9cclcn ew54384r99prfx ew54384r9cd4ra ew53680r99pyen ew53680r9avg24 s4306 ew54291r9fevrn simon2 ew53680r9avg2y ew53680r80crra ew52768r82y5e3 ew53680r9avn81 ew52768r82y4y9 ew54391r99txe4 ew53680r9btdmh s4305 ew54384r9cd4vp iis2 ew54284r9fd8fg ew54384r9bl3d1 ew54284r9ehm2n ew53680r9bt94r as.im ew53680r9amhwd1 ew54384r991mr90 ew53680r992l0a0 56bpos-eas ew53680r9bv0eb ssl30 ew53680r9axv6r phylab ew54384r9bakvh ew54384r9bz919 ew53680r9bw2z2 ew53680r979t3c ew53680r99pzaf ew54384r9ccnx7 tndowtp ew53680r9bteb3 ew53680r9bteba ew53680r9btecc ew54291r9fmtt0 ssl15 ew54384r9cxa4k ew54384r9ca8r90 ew53680r992kl00 ew53680r9b7yhf ew54384r9apt1f ew53680r9daym1 ew53680r9daym6 ew54384r99nhwf0 ew53680r9daylv ew54384r9clevh ew54384r9cleyb ew54384r99nkfb0 ew54384r9apt4g ew53680r9cmp90 ew54384r9apt3z ew53680r970lpb0 ew54384r9bcggw ew53680r99nlrx0 ew53680r99pykx ew54384r99pvhm ew54384r9c3wyk ew53680r98ltex ew54384r9ard08 ew54384r9ca97p ew54243r9p0cvy ew53680r99pylx ew53680r9c68wk ew54243r9p0ct90 ew53680r9btyzn ew54384r9848f8 ew53680r82avlm ew54384r9848l3 ew53680r9dme04 ew54384r9ca8pg ew53680r9dmdym ew53680r9dmdyy s80 ew54384r9c04kk0 ew53680r99pzm4 ew54384r87rxac ew54384r9cl1lt0 ew54384r87rwzv ew53680r9ah52f ew54384r9bl2cw0 ew53680r9ah53f ew53680r9ah56m ew54384r9bl2ka0 ew54384r9bcf30 ew54384r9cd2nc ew53680r9cxffr ew53680r9cxfhx ew54384r9b5wgn ew53680r9czak4 ew54384r9cxm95 ew53680r9ah4l0 ew54384r9arf3l ew54291r9hlez8 ew53680r9ah5ez ew54384r9arf4l ew54384r99rm5p ew54384r979gbk ew54384r9arf6k ew54384r979gbx ew54384r979gkv ew54384r9c2meg ew54384r98r75d ew54384r98r75v ew53680r82lalh ew54384r9cd4l0 ew54384r96vtd20 ew53680r83bzpy ew53680r9aebf60 ew54384r9cd2eh1 ew54384r9bch2a ew53680r83fbrm ew54391r99ng98 ew53680r83rrk9 ew54391r980c1h ew54384r9cd4z2 ew53680r99pzng ew54384r9bzb48 ew54384r9bzc29 ew54384r9bzc37 ew54384r99ppbv2 ew53680r98ltk4 ew53680r98ltl6 ew54384r9c0497 ew54384r9bzc5f ew52429r9tt12p ew54291r9rg5hm eric8 ew54384r9c4hkp ew54384r9c04h6 ew54384r88xyyh ew54384r9c04cd ew54384r9abzw6 ew54384r99vcl1 ew52429r9vd40l ew52429r9vd40m ew54384r9ac0gb0 ew54384r98nem3 ew53680r98gcb70 ew54384r9bzbbz ew54384r98nenl ew54384r9ac0kt0 ephoto ew53680r99pz3c0 ew54243r9ne5rv ew54384r98nexb ew52325r9v1va9 ew52325r9v1val www.p202 p202 ew53680r99px5w ew54384r9ca9bd ew54384r9be4r7 ew54384r9848dx ew54384r9848fg ew54384r9848er ew54384r980c1x ew53680r99pza70 ew54384r979gt6 ew54384r9bcfgf wbsld8c0fx2j ew53680r99pyt1 ew53680r93mf6f0 ew54243r9ne5r9 ew54384r9bzb81 ew54384r89ywa8 ew53680r99pz81 ew54384r9bcfv6 huizhou ew54384r9a1766 ew54384r9a174k ew54384r9a174m ew54384r9a174t ew54384r9a174z ew54384r9a175x dstore1 dstore2 ew54384r9a2304 ew54384r9a235p share2 ew54384r9a17n9 ew54243r9fdrgt1 ew54384r9a23ry ew54384r9ca9de ew54384r9ca8t2 ew54384r9areh10 ew54243r9nng6k0 ew54291r9r246b wbsldh5xkx4j ew54384r9cf5dp1 ew54384r987pyw ew54384r9a566p ew53680r9akk8t ew54384r989ebw ew54384r990gmf ew54291r9ma0bm ew54384r9c04dp uatwww ew54384r9arhmm ew51fkya59899 ew54384r96vt9p0 ew54384r99vchf ew54384r991mvd ew54384r989wz3 ew54384r9c04n2 ew53680r9be08n ew54384r9c9k5y0 ew54384r9atcg3 ew54384r9ca8t3 ew54384r993ne6 ew54384r993nlf ew54384r9b08d6 ew54384r9b08lt ew54384r9b11k7 ew54384r9b09z7 webdrive ew54384r9b09zp nfs2 ew54384r9b13gk ew54384r9b13gr ew54384r9a3yd4 ew54384r9a3yk5 ew54391r98rhnf0 ew54243r9nng8c ew54384r9arf3w ew53680r9be2td ew54384r9b0a45 ew53680r99hlx3 s835 ew54384r9a8n2k ew54384r9b5x67 ew54384r9bknat ew54384r9be4p7 ew53680r98rfgw ew54384r9be4mt vz107 ew54384r98rhg5 ew54384r9c9k51 ew54384r9b1y23 ew54384r9cxlat ew54384r9a9zyw ew54384r99vchp ribbondalda oxo4433 ew54384r9c9k9p ew54384r9c0448 ew54384r9c040m ew54384r9c041h ew54384r9c044y ew54384r9b1xn6 ew54384r9b1xmf ew54384r9b1xv7 ew54384r9b1xv9 ew54384r9b1xtk ew53680r99pxwd ew54384r9c03db ew54384r9c03gl ew54384r9c03tl ew54384r96vtat scidata ew54243r9nz79x ew53680r987cw9 ew54391r96zpbk ew54243r9gd4bg2 ew54384r99pphd ew54384r9b5r03 ew54384r9b5r09 ew54384r9b5r37 ew53680r87gdga ew53680r87gdgb ew53680r87gdfm ew53680r87gdfy ew54384r9b5w6v ew54384r9b5x4l ew54384r9b5x5l ew54384r9b5x4v ew54384r9b5x4z ew54384r9b5x7a ew54384r9b5x5y ew54384r9b5rzp archivemanager ew54384r9b7cbd ew54384r999k880 ew54384r9arh2c ew53680r99pyyc ew53680r9arbhb ew54384r99vb3z1 ew54384r99vc0b1 ew53680r87gzlh ew54384r9848be ew54384r9ac0h7 ew54391r99z0w8 ew54384r9848el ew54384r99pt3f ew54384r9arnp5 ew54384r99pt78 ew52429r9wwnt7 ew54384r9c2m2t ew54384r9c2m4d ew54384r9c2m5y ew54384r9c1rm2 ew54384r9c2mdc ew54384r9c2lx6 ew54384r9c2mkp ew53680r970ll8 ew54384r99pt86 ew53680r98rfgr0 ew53680r970lgn ew54384r99vbhm ew53680r987pkh ew53680r987pkm ew52429r9ygkld ew53680r987plk lema ew54384r9bkn31 webdisk.forms ew54384r9arnx5 ew54384r9ca9m5 ew54384r9c3wna ew54384r99vavx0 ew53680r970llv ew54384r9cd576 ew54384r9a5683 ew53680r970lpe ew53680r9avg2z0 ew54384r9d6hld0 ew54384r9c6ph4 ew54384r99nk89 ew54384r9cxala0 ew53680r9b30gc ew54384r989ebv ew54384r98nemn ew54384r9c9hk1 ew54384r9arf96 ew54384r9c9htf ew54384r98nelz ew54384r9c9hwh ew54384r9c9hxc ew54384r9c9hwy ew54384r9c9hxx ew53680r9ah57k0 ew54384r9arnr8 ew53680r9cxfkp aud birt xtranet doxa sansan costss hirohiro strelet tokyomonkeys jintoku tousi partnershop shinfoo execube erens roboinq microfix eco7813 artifact bersbar klient2 oodonya dpu gekisapo1307 morgmolmalmo yomoyama ansonweb ha1228 bsuki702 test004 test006 test010 pluse01 test012 test016 test017 test018 remediate akirag3 uetenri gqrbm055 sankaku zg5 kyokushin2 zebu wankoroid bni fotokuma sect genco eiesei suneng netanew2 downline2762 builwing datsumou myamya tuhan sasatani rakuchin01 incense no003 odaatsushi kalla birdcage nekote 2hanjp grafica02 lapisdiva salinger leathermall crosswork grafino test013 81q 1tax ryoyoss nihonkai odicgo alpharise glowsurf tsuyoshioka saokichi hirokuni1 aojiru dotchimni jstock paulfactory tuncay koba tsubo1 sin7021 unseal kanrikyoku goodway reshikku pcnishiya wpwp xenapptest livedata smile38 gradius2 gradius3 biei rsu blueearth tokusanhin inc02 dalimitr smile201303 usefulinfo romiromi chimeraworks mifaso addressbook ant69tr carong gaza21 suninjang13 dw012384 dusangzzang2 minimarket7 nhseaftr5422 wowgusdn laorange1 axian993 zegobs2 arcanej1 gaza212 kimzang13 kimzang14 moorootr yaehu7 naiadlove barocamping ohryuken2 seb3309 dressupcartr ssnongwon annzooco nosmoking95 tinyaptr6195 cromy69 hsh2124 daebok3 joliejong phji1230 medifun2 auntbaby araonktr6801 n1hstar kemr1436 akari24141 jooo761 vna clais ninnin vengence lva wcache deprep bethany timetables lawpre dongsan501 bsjbsj791 abettetr7772 worldnewspre sports7 calla6251 tabletennispre piroco2 civilliberty christianmusic kidexchangepre frenchfoodpre catholicismpre jobsearchcanada catspre retireplan islampre altmusicpre wichitapre soapspre usmilitary babyparentingpre emailpre tattoopre homevideopre hartfordpre dying macsupport gojapanpre christianitypre paganwiccanpre profootball worldfilmpre torontopre desktoppubpre spanishculture rockclimbing investingcanadapre crosswordspre racerelations heartdiseasepre dentistrypre houstonnwpre gosouthasia ldspre websearchpre toycollecting frenchcaculture budgettravelpre palmtopspre tucsonpre christianteens germanculture waterskipre southparkpre miniatures bicycling worldsoccerpre intranetspre alcoholismpre history1900s interiordecpre collectstampspre businesstravel pennybaycom parentingteenspre atheismpre augustagapre microsoftsoftpre chicagowestpre unixpre vancouverpre modelrailroadpre women3rdworld jpkr4 bobptr2967 fortron sjjiyun gocycltr6047 cross1 woojung1151 papas5 allergiespre imgarden365 kudos5850 coordiplus puny10 crossg albanypre avidleeda1 hgijung hairblow tprime kidswriting s1devsunny portlandmepre mng7772 kwons2tr5012 razypooh max8812 s2pedu manypanda1 hongse891 kwh79021 kwh79022 gi0sky animationpre sstarhong1 sstarhong3 man8334 lglg02051 nowkandol1 mchanman1 voguenewyork3 jfriend59tr8223 momomoguri puntoo hymnself s807 welpiatr7295 worldpapertech ecopromise berry61231 snobier inaemedi dodamsoktr mallcorea lbs276tr3039 mj1choco hifoods1 kms0744 djh165tr9046 smarttr1853 amazine mijiwang chenyou joorok shinsm2001 snhk2001 ana0202 ad0212 yjwone1 csgood tentoy motorbank2 saltaquariumpre chromcell directdnp godo197019 jeekeem godo143722 kizzz09 ohmyggod hitouchpen rkrn1965 decojetr2505 highones1 highones2 cartooning ideabook ver4fix frenchcaculturepre pkartitr9472 gdream2 gaylifepre artsandcraftspre stepparenting vps3utdell2 witnessespre nursingpre environmentpre volleyballpre winepre investmentclub careerplanning mostafa1 privateschool jobsearchtech rosespre teenexchangepre botanypre lasvegaspre min233 finefc1 finefc3 fortlauderdalepre kssks0509 seefuture drpojang tera1439 chl8270 kimdh234 jjfamily2 dudtn815 personalcreditpre iamleech sw83293 dj76dgb1 outdoorlook ilovemommytr saltaquarium dlgmlqocjswo1 familymedicinepre speeddog2 wheeya88 yoyokids1 decorativearts npaper1 venus4197 hairdays gratomo2 gratomo3 heal2013 s4freeintsunny jaguster2 enamoopackagefix homesenc dobero2 marketingt pangicare farmforyou2 farmforyou4 changwon81 mgk0416 beatcool2 htmlpre jutoyjoy fishingmetro goeuropepre humanrightspre hhyy7773 garfield1 cabinlee allin11 beautyswan1 ssyoon1 kks19911 altmedicine charlestonpre gocanadapre compactiongamespre birdspre netboot philosophypre quilting interactfiction candleandsoap prochoice ravehousetechpre buddhismpre horrorfilmpre menseroticapre altmedia 7-12educators worldfilm javapre lamaisontr quincemore1 maktub0070 s2frelease skanskan42 powerboat cgogol2 ecard1tr bomuljido2 konimi1 masami04 xmlpre dlehddls11222 roleplaygames decorativeartspre eugenepre goorlando macsupportpre gogreecepre kidsnetgamespre votechpre investmentclubpre sanantoniopre dcpre latinoculturepre publishingpre goireland mdsuburbspre mountainbikepre amateurphotopre womenserotica heatwave chineseculture activetravel japaneseculturepre bluespre altreligionpre compreviews asianamculture crochetpre startrekpre knitting weatherpre indianculture columbiascpre altreligion ophthalmologypre flyfishingpre panicdisorder usgovinfopre ussoccer gosanfran compnetworkingpre duluthpre backandneckpre tallahasseepre actionfigurespre milwaukeepre proicehockey internetgamespre neurosciencepre yabookspre movieboxoffice s739 memcached2 napoleon hollywoodmoviepre internal1 prochoicepre lesbianerotica ravehousetech bk14 palmtops bbqpre s736 bk13 broadcastnews diabetespre rw4 bk12 chattingpre s734 bk11 s733 goirelandpre s731 architecturepre depressionpre amateurerotica s728 s727 s726 usnewspaperspre fantasyleagues gogreece s725 guitarpre authorspre memcached1 gogermany legalindustrypre webworst scottishculturepre tvcomedypre gonycpre s719 s718 proskatepre ecotourism taimurasghar mena55 thyroid backandneck kidsciencepre s715 quiltingpre gotexaspre 7331 s713 s712 personalwebpre classictvpre goodnews allmychildrenpre kyyong kgyg2 soundmtr5992 skinhappy base05 base04 windowspre jewelrymakingpre womenshealthpre pascalpre satellitepre kurosawa generalhospital compositepre eatingdisorderspre spacepre skitrips geologypre okx puchillena gotexas wildflower carinella disabilities hiro3 simpsonspre lesbianeroticapre onelifetolive icandy asianamculturepre countrymusicpre pdpt ve1 airtravelpre file02 dancemusicpre www.pdpt www.ejournal www.faperta cartooningpre mailing._domainkey.sunnynews www.odp preview.rcw dev.rcw qa.rcw burlingtoniapre dev.build sunnynews mailing._domainkey.info palmspringspre paintballpre lesbianlife techwritingpre substanceabuse celebrityerotic macospre kidscience kidspenpals desktopvideopre stlouispre denverpre paintingpre progressiverock infertility contestspre globalbusinesspre fb90 fb120 worldnewspaperspre fb117 watermark aipre burlingtonia cdn8 resourcespace sarasotapre fb99 goaustraliapre koonja9194 baroma19 baroma24 skinleader migosa kim33003tr jihomansan goodtime243 gorenaratr jeincool blueseaj min2m2 enjoymall sammishin iyyob istmalltr finelbs coffeeallday maofamily okgood marui8443 s4intkthkira casiobank osesunkr2 skyman2002 ftsystar oton22 lds2007 bankline oneorzero9 wonhyo81 medicatr9575 ahch37711 rexsolbt academy-010 academy-011 gorussia fb92 s634 worldnewspapers chineseculturepre pregnancypre collectpins luga balletdance bakingpre nashvillepre almetevsk novomoskovsk pirateradiopre otradnoe huntingpre womensbballpre s627 weaving spanishpre multiplespre burlingtonvt conspiraciespre collectstamps gorussiapre herbsforhealthpre energyindustry puppylinux tipster s619 businessmajorspre wjddladn29871 atheism spares fishingpre xfilespre gayerotica detroitpre homerecordingpre pardus westvillage waterski icdiijesus yaehu71 eh1025 kms1992 iloveimc academy-020 green119 unjm6212 puppia victorssi1 academy-027 lovelyel2 academy-029 dpzhthf12 prettyaha cakefactory1 jb9709 gplus7400 yufron heellary agrinagrine rhrlgus1012 this0718 raffles1 freshaquariumpre gcsd33009ptn blueprint0 lovepipi yongchil2 abbinewyork puppyp heeyoung01262 mr01000 wonjin1 ch11137 gpal10141 kimex entratr7837 zibig8115 fs1190 clubhada2 bhinfo baduncle daon12tr5708 koobart qwehk7131 kimchreom nthmax soonung11 sonjh253 hptc21 myhappy10921 godotechjsseo candlehouse nascarpre soo111 soo112 xartcard ds497910 pushnpull1 whtjdfo0216 lkp1961 unifittr9743 clonezilla goaustralia s611 netculture hronline travelwithkidspre bicyclingpre telecomindustrypre panicdisorderpre pittsburghpre beekeepingpre gohawaiipre accountingpre englishculture homecookingpre balletdancepre parentingteens homeelectronicpre realestatepre asthmapre southernfood economicspre poetrypre autoracingpre ibm03.lsdf libertarianism nonfictionpre ipe politicalhumorpre clevelandpre marketingpre fortmyerspre nutritionpre freebiespre spaspre weavingpre folkmusicpre www.pse dallaspre goeasteurope autoconfig.donate autodiscover.donate webdisk.donate burlingtonvtpre compreviewspre westernmapre multiples casinogamblingpre gohawaii worcesterpre chicagonorth gayeroticapre www.archiv lancasterpre quitsmokingpre classicalmusic afroamculture uspoliticspre internetgames localftp managementpre milf roleplaygamespre lupuspre journalspre babylon5pre uspolitics lowfatcooking basketrypre sickjokes conspiracies catloverspre portlandor dogspre musicvideopre netconferencepre portlandme romancefiction buffalopre govegaspre www.travelinfo travelinfo womenshistorypre s408 beadworkpre crosswords investingcanada bodybuildingpre starfire rcvehiclespre s4361 renotahoe netculturepre os2pre etransport protestantism divorcesupportpre chesspre montgomerypre mailmag blog-test s4359 s4271 candleandsoappre englishlitpre rowingpre arcticculture britishtv deafnesspre onlineshoppingpre golapre neworleanspre musicianspre coptv sandiegopre pediatricspre 1web sailingpre teenadvicepre chronicfatigue s260 btc-dev collegegradjobs homeparentspre rede s4341 www.ipad protestantismpre addpre bigdata horseracingpre humorpre s4331 springfieldilpre sewing keyan interiordec s4329 bowlingpre beadwork 244 houston3 houston2 goitalypre 232 slave3 slave5 slave6 centrum bdsmpre generalhospitalpre vintagecarspre admin.beta talkshowspre powerboatpre yabooks lvs02 portlandorpre mars1 surfingpre sbinformation northbeach gonewengland 4wheeldrive s4262 biologypre s4314 compsimgamespre kidscollectingpre energyindustrypre homeschoolingpre toycollectingpre artistexchangepre comicbookspre s4309 runningpre gocaribbeanpre inventors businessmajors chinesefoodpre memcached seniorliving goswitzerland collectdolls windowsnt s4304 walkingpre remotemail www.epiphany seniorhealthpre www04 newagepre adoptionpre couponingpre phoenixpre s4301 northernnjpre gradadmissions childparentingpre cruises slike wichita israeliculturepre visualbasicpre collectdollspre specialchildren s4320 santabarbarapre telecomindustry purchasingpre gardeningpre mst3kpre sacramentopre richard5 coloradospringpre spelletjes midimusic archaeologypre agriculturepre classicalmusicpre racerelationspre telecommuting s4255 germanpre gosouthamericapre s4269 skapre bofa menserotica wisuda forestrypre lore womensgolfpre brighton heartdisease goorlandopre www.mma goukpre s4254 gocanada qa710proplus3 kidsastronomypre girlscouts christianhumorpre familyinternet s4264 healingpre distancelearn chicagowest cocktailspre teenexchange usparkspre tennispre s4261 catlovers s4259 childparenting gradadmissionspre lacrossepre chinesefood wyxy gw02 honolulupre italianculture ecommercepre womenseroticapre fitzgerald canadanews detroitsuburbspre urbanlegendspre port80 themeparkspre craftsforkidspre cardgamespre springfieldmopre airtravel collectminerals s4251 s4249 arttechpre businesstravelpre kansascitypre proicehockeypre goitaly tampapre sewingpre canadaonline frugallivingpre daycarepre jazzpre s4245 hamptonroadspre healthcarepre www.ets s4250 geographypre gogermanypre prinz gaylesissues profootballpre s4241 detroitsuburbs s4239 historymedren amateurphoto s4238 santacruzpre couponing sportscardspre genealogypre sportslegendspre irvingpre singleparents springfieldil writerexchange s4234 bowlinggreen inventorspre s4233 qa.portal trackandfieldpre classicfilmpre starfish englishculturepre colbasketballpre springfieldmo homeworkhelppre s4231 distancelearnpre photoweb s4229 chemengineerpre microsoftsoft pharmacologypre collegelifepre landscapingpre backpacking weddingspre graphicssoftpre ireport gosouthamerica heavymetalpre hype peripherals collectbookspre datingpre mev usmilitarypre internetradiopre radiopre tensyoku comicbooks spyware historymedrenpre mentalhealthpre ns1b gonyc dc01 marriagepre homecooking usnewspre fantasytvpre spanishculturepre jewelrymaking vgstrategies ussoccerpre substanceabusepre ufospre fantasypre mcguide1 mcguide2 mcguide3 ceoblog trl mcguide4 seniorhealth gosouthasiapre womensgolf personalweb prm1 martialartspre internetradio rodeopre orangecountypre austinpre greenvillepre humanresourcespre kidswritingpre miniaturespre singleparentspre seniorlivingpre gocoloradopre fotogaleri englishlit buddhism columbusohpre americanhistorypre ftpacc1 ftpacc2 reenactment s4244 columbiasc cricketpre eastvillagepre vpn-gw needlepoint backpackingpre eastvillage netsecuritypre onelifetolivepre gymnasticspre classicfilm telecommutingpre germanculturepre mexicanfoodpre saltfishingpre holocaustpre writerexchangepre craftsforkids edmontonpre roundup s4209 busycooks mobilepre kvm10 kvm11 kvm13 kvm16 civillibertypre ancienthistory personalcredit sportsmedicinepre prowrestlepre k10 fedo s4204 exoticpetspre antiviruspre netconference s4203 screenwriting britishtheatre barbiedolls usnewspapers chemengineer kidscollecting progressiverockpre artforkidspre produtos govegas prowrestle stepparentingpre womensbball fatherhoodpre japaneseculture s4201 kidsastronomy midimusicpre careerplanningpre afroamculturepre pirateradio quotationspre homerepair usparks graphicssoft israeliculture collegeappspre fortlauderdale somapre s4187 hollywoodpre pfsense bowlinggreenpre frenchculturepre altmusic westvillagepre collectpinspre s4185 campingpre celebrityeroticpre s4184 ecologypre s4240 sv59 cpluspre harlempre screenwritingpre hollywoodmovie anesthesiologypre surgerypre frenchculture s4182 kidsnetgames socialworkpre sv65 sv64 arcticculturepre daysofourlives prolifepre s4181 sv58 sv57 sv56 longislandpre s4179 horsespre canoepre history1900spre 4wheeldrivepre gofrance machardware paranormalpre urbanlegends exercisepre webdesignpre javascriptpre judaismpre sv28 tvschedulespre themeparks augustaga incestabusepre divorcesupport collegelife sv21 southernfoodpre amateureroticapre gosanfranpre chicagonorthpre beatlespre catholicism s4174 cincinnatipre talkshows jobsearchtechpre altmediapre needlepointpre costumejewels s4171 certificationpre costumejewelspre s4169 mbk p9 barbiedollspre jacksonvillepre teenadvice dataroom cruisespre center2 spokanepre www.newdesign industrialmusic tvschedules ceramicspre arthritispre s4164 rcvehicles gojapan coloradospring toledopre bismarckpre freelancewrite webworstpre mathpre vgstrategiespre s4161 boardgamespre k-6educators www.freedownload sharewarepre gomiami bboy vegetarianpre cheesepre houstonpre baking probasketballpre japanesepre gocaribbean bandbpre webdisk.affiliate incestabuse basketry actionfigures atlantapre interactfictionpre italianculturepre rockclimbingpre marktwainpre birdingpre treasurehuntpre bostonsouth automotivepre gofrancepre s4151 s4149 kidexchange modelrailroad birding latinoculture sexualitypre hans2 s4145 www.senator s4144 tracking2 tyche feronia www.chopin 05 04 s4141 s4139 raporty appcenter s1319 goeasteuropepre bronxpre lowfatcookingpre fictionpre specialchildrenpre animalrightspre judaism gaylife knittingpre christianteenspre freelancewritepre chronicfatiguepre reenactmentpre hamptonroads artistexchange s4131 s4129 politicalhumor infertilitypre s92 weightlosspre movieboxofficepre gomiamipre gocolorado astrologypre gaylesissuespre budgettravel women3rdworldpre paganwiccan woodworkingpre gameshowspre italianfoodpre s4124 louisvillepre homeelectronic desktoppub busycookspre gonewenglandpre entrepreneurspre sleepdisorderspre southbendpre collegeapps annapolispre babyparenting geneticspre industrialmusicpre history1800spre librarianspre softballpre sbinformationpre sickjokespre fantasytv deafness financeservicespre webdisk.myspace autodiscover.myspace autoconfig.myspace northbeachpre bostonsouthpre usgovinfo s4111 ancienthistorypre krasnoyarsk6 s4109 worldmusicpre privateschoolpre amateurwrestlepre optika shareware sportsgambling golfpre stockspre 80music s1230 classictv dossier labeltape baisisi ipia119 cho01233 rumebag fourmis841 sunilover1 narabio s4224 magicpre russianculture allday laflo lecjohn crow778 abcbike hades10 cap1460 priel0071 legalindustry hometime synccitykr isstore hmsdb1 dugni00 bunnysugar puredm iris121 iris122 iris123 mhrich whitehotae1 biznoble cho01453 cho01455 rimelite2 indankorea1 denis1110 parhae enskorea goswitzerlandpre siruwon bk5389 lance1998 miiino coco515 kensert2 ogi0418 invisual001ptn kwp iwebple s4intextacy nikstyle3 nikstyle4 fineway jss33333 smarket2 cromy691 alliums doradoel compsimgames kkamu darphin801 katusa9507 evan87 spad11 andynashley ssing71 lsd1982 seomuho cherrybox magictonertr undermalltr tyta5000 elle82531 probasketball yhm19991 yhm19992 allstory spplus1 tlsgur755 wolfkickbox logostaff mcubei1 mcubei2 sr656310 smcnftr voyage71 haustyletr megasnc1 zkdhtm65083 velohouse lee8dofnb1 j201331 lcs2 barishoptr frenchpre woongnyu823 jh209700 duoback2 ckh00224 duru1004 phji12301 bipolarpre diphoad miinkr dyingpre delete1984 araon6 araon7 ddays0404 recycletown3tr3178 newshinsa jdc132003 s3intb kn1905 s3intp bournemouth7 s3intw welavkr collectmineralspre kindjay1 samjungshoptr m89718971 jwcjyh1 hwangss771 sem06052 bloody127 bo2848 assinaturas algovital honeymoonspre surgery7 surgery8 automobilespre jamesf9h1 asylum781 bisang3 bisang4 soji25 rock4utr6807 dream3821 dream3822 dream3824 ipaybmhstar myaqua1 jinee4786 infedo1 ink8do2 imshyeon3 h93063 wonjin91 kwonstesets mtmkorea s2shop icefeel luxsketch1 infeel4 qort0107 coqls1004 aryunyewon seokjoop mikak1 officeinside mssi85801 markman lsh178 z007007 sulem12 jw2389 naranlm kyungseo lpcc2012 djkim1 induk11-001 induk11-002 induk11-003 induk11-004 induk11-005 induk11-006 induk11-007 induk11-008 induk11-009 induk11-011 induk11-012 induk11-013 induk11-014 induk11-015 induk11-016 induk11-017 induk11-018 induk11-019 induk11-021 induk11-022 britishtvpre dongsajung induk11-025 induk11-026 induk11-027 induk11-028 induk11-030 induk11-031 induk11-032 induk11-033 induk11-034 induk11-035 induk11-036 induk11-037 induk11-038 induk11-039 induk11-041 induk11-042 induk11-043 induk11-044 induk11-045 tojongage2 s2skin mutualfundspre sg2 devgodobill beadsborntr stringpage jiincnt ohandee1 nasungin3 nasungin4 eunsun0504 oklee9687 kis77jjj1 badaone1 soostore eudirect2 eudirect3 eudirect5 latti lauricidin crafthouse1 medall12121 pm21001 hazel101 wkqldus s2patch kbldmk1 duddkek009 sandol77 hikaru1616 bearbird1 wsfeel pbmarket haeun95953 billiardspool hanjin500 igosancokr3 igosancokr4 igosancokr5 pusiul korezontr dawon6376 cromyoung11 cromyoung12 nohmk741 nohmk744 s2fsrelease appletrees toytopdome minsokmalltr jy05071 ksy4065 iamjangme eint5013 naturenbio1 sojium gooddayskt dhdsifl meatpow apples1 yawarano1 takeuns haemosoo skfkrhfem snskin morenvy009ptn eun0107 jhy6065 d2k54677 hyoreen1 mir001 phill012 3680sj slckorea en2free81 plusjean mediheals beerpre hermin1004 vldzmenddl jobsearchpre firstwood nari522 catletter marioztr9728 mmisuk1 mmisuk2 mmisuk3 dlaaldo201 ddingle3 mikimh design114 wishpot88 boxking mjcafe gonsen721 innerweb2 lassiette delphipre invisual003ptn alicenart2 alicenart3 alicenart4 alicenart5 alicenart6 alicenart7 alicenart8 alicenart9 anytoker77 azm3224 dogsound neukkim ad4444 qlxmftiq1 sleepdisorders coptvpre jobsearchcanadapre columbusoh scottishculture giraffe jjh retireplanpre www.spc 7-12educatorspre domaindnszones.spc.comp samstag skitripspre history1700s s4221 forestdnszones.spc.comp qlxmftiq2 qlxmftiq3 jjung1121 mir276 kmall mjassa collectbooks madmoon1 kman4045 okkill iroomceo hwangtojung1 hwangtojung2 fissler2011 bk9846061 naneca1 dhfandb hphone3 hphone4 jopersie15 hajunbb3291 scubapre webclipart s4354 allmychildren novocherkassk mp3403 hikosen jijigo123 qnaqna sjkfree iceapple mir438 nokchawon sd00281 bluesis2 csmaru chlgks771 chlgks772 pcrainz ynhkm84 beautypre ekdnjs2002133 jirisanak berry66001 berry66002 eumban daejinmat2 compense thegull7 hbcommtr6900 oktopcoffee mjceo2 arrmani diamanteun a082010 mai38317 jijeong jhsign sooj8375271 longevity1 escrowtest juellove free2fly1 free2fly2 free2fly3 okganji eve1004 divehq elight10141 caraudiodc sh40261 kimsony03192 golfdctr qvely8239 inaba20021 paulandj cockkhn yoonjooyul l0uis81 seasun1004 plscompany1 jp5-rm00000 compactiongames indianculturepre familyinternetpre dltpwls3621 jvibe all4batr2866 xhprof adsonlinepre s4219 crossstitchpre cardgames webdisk.a vintagecars votech cgmedia2 howon17671 mmagpie2 multials nstory ysj2930 nuchi2 sol8282 linuxhosting51-51 tubularr ozkimjo hdpn1 s2pdevp smartnuts rkddlfo11 rebois horrorfilm www.res cyberarts1 ddalgi5 ddalgi6 tony70 jikyjeon28 ddalgee oitalia3 activetravelpre yahocamping herostock lkjk551 sejin77071 kimwoo76 jejusambo kmkm9 nadaum pluseksm mimi76 gotooutdoor collegefootballpre uckorea nuenara2 charmhtr6375 zaltabike2 hocorp nabut2 daidanv subsubpark nolboo1 constructionpre jutty textmove blackblanc ulppang1 pbmaul tshot12 jmoore tttestt vangquish mobilekr1 vbsoma8 vbsoma9 zeropack rookie0907 lionyoon newbankda lovetkt1 urbook 0ms ledok enindi193 carm1004 siyeon1234 luxbabara momoiatr3079 sarrah233 yu04042 escapolo enindi195 airzol lexingtonpre costcatr0911 freeguyyck1 ecotourismpre michabella1 dream6644 adel751 mind33 s4devb jomakorea1 pgl10045 s4devp fgmall1 s2pdevmcpark dkrlehd viazoe sajubaksa9 somani woorimf881 hairim77 kimwood2 max88121 max88122 enindi209 sollae cf5869 enamoopackage s086428 hans9494 looz781 lhw01033 bada66541 mjpark872 kohwasop dsbkoreatr danmoojy1 gojack6062 kwak73kb1 autonomon1 lcs15544 lucas2005 qwpp123 kokopening1 zzimkjh1 clickoff1 alekkim cutesoli dekung1 k7251203 jjakhs jw5361 gaongift tea30402 guk680404 toyfun2 jangan4934 bmbob91 disabilitiespre koaid woodrotr8451 girlscoutspre qwe912-009 qwe912-011 enindi219 morenvy019ptn istory1 leed201 hyuninter hypermed stishotr4379 mahanpear djmtb1 trianni6 trianni8 rosa5042 qwe912-020 lhowook say10111 andrew71 jwy53601 zeropia3 zeropia5 kbncomputer-020 sjaqua165 dracula851 dracula852 labnshtr1375 trensetter hs301301 marom10 marom12 marom13 marom14 marom15 marom16 marom17 marom18 marom20 marom21 marom22 km78020 smj9827 marom29 tbalance damaflower cbtk10041 whxogml dimpleskorea knots100 jungbrave jjugly2 s4freeintkhs ooinjaoo tnrud2006 tnrud2008 gaonfurn arlsatang lovetaiwan2 firetornado winiworks1 winiworks2 aljjaman23 duatkdgns kkddd791 song41 organza111 toxshotr9837 fashionpre kentanos inkcasting1 mineta love3cmtr hongikav sjkukuri1 itspresent1 designgj aileen2006 kogal jbsim2000 jja09girl lepas heo2000 christianmusicpre kheo77 tscoffee partycook1 gmj09034 creatitr4412 canuslim dom12346 takuteru classicrockpre colbasketball benettong redmir dhdusdk ieciecieciec lionyoon2 outdoorsman yhcompany gadmin11 jeju824513 xc4284 jeju824516 oteem011 bestgarden syung2kko3 kbs0006 icd900tr6382 cancerpre graphicdesignpre crimepre onlinework homerepairpre adobe-serialsdb canadaonlinepre gameshows chemistrypre linuxpre financeservices anas123 wilkesbarrepre drawsketch wargamespre amateurwrestle stare broadcastnewspre techwriting specialedpre nowe ns1.m travelwithkids ns2.m woodworking www.deporte aolpre altmedicinepre k-6educatorspre rediffmail philadelphiapre freshaquarium romancefictionpre nonprofitpre christianhumor sportsgamblingpre tvcomedy baltimorepre comunitate seattlepre aviationpre 80musicpre webclipartpre mms3 insurancepre herbsforhealth windowsntpre v29 capecodpre britishtheatrepre starwarspre smtpc tedx libertarianismpre folkartpre lesbianlifepre desktopvideo canadanewspre homeparents history1700spre houstonnw machardwarepre history1800s goeurope perlpre mdsuburbs computerspre artforkids saltfishing eslpre scellius fantasyleaguespre iinet s1219 billiardspoolpre drawsketchpre dinkes signet bubo daysofourlivespre physicspre access5 access4 s4214 sportslegends funclub collegegradjobspre bwnews compnetworking farmingpre topsales kidspenpalspre russianculturepre thyroidpre mikan renotahoepre westernma westpalmbeachpre physio micros2 peripheralspre gwsmtp09 www.uganda apai 221 besnik priority farm1 www.arthur baileys nazanin taran sb2 dreamsoft siatkowka nakaf982 pisa mestre slarti dlw93-2 dlw7-2 dlw7-1 dlw187-2 dlw187-1 dlw66-2 dlw239-2 dlw239-1 dlw93-1 vpn214 dlw225-2 vpn193 dlw225-1 emusic dlw131-2 dlw131-1 dlw10-2 pfs dlw10-1 s1216 dlw85-2 shanram dlw20-2 dlw85-1 s4211 dlw158-2 goool beatriz dlw20-1 dlw37-2 dlw37-1 dlw6-2 dlw6-1 dlw186-2 dlw186-1 dlw89-2 optimum emas dlw65-2 dlw65-1 s4210 westdale dlw224-2 dlw224-1 dlw130-2 dlw130-1 dlw66-1 dlw157-2 dlw157-1 idx dlw36-2 dlw36-1 dlw202-2 dlw5-2 dlw5-1 dlw202-1 dlw87-1 dlw185-2 dlw185-1 dlw63-1 dlw64-2 dlw64-1 dlw223-2 dlw223-1 s.ext dlw150-2 dlw150-1 dlw128-2 dlw128-1 dlw156-2 dlw156-1 dlw35-2 dlw35-1 dlw90-1 dlw4-2 dlw4-1 dlw184-2 dlw184-1 dlw100-2 dlw100-1 dlw206-2 dlw94-2 dlw206-1 dlw94-1 dlw222-2 bestbuy dlw222-1 dlw127-2 dlw127-1 partenaire dlw249-2 dlw249-1 dlw230-2 dlw229-1 dlw155-2 dlw155-1 dlw34-2 dlw34-1 dlw3-2 dlw3-1 dlw183-2 dlw183-1 dlw75-2 dlw75-1 dlw62-2 computing dlw62-1 dlw221-2 dlw221-1 dlw126-2 cpi dlw126-1 dlw98-2 dlw98-1 dlw248-2 dlw248-1 dlw154-2 dlw154-1 dlw33-2 dlw33-1 cacos-m104-i55 s4134 dlw2-2 dlw2-1 dlw158-1 dlw182-2 dlw182-1 dlw61-2 dlw61-1 dlw219-2 dlw220-1 dlw79-2 dlw79-1 s1210 dlw125-2 dlw125-1 dlw247-2 dlw247-1 dlw153-2 dlw153-1 dlw139-2 dlw199-2 dlw140-1 dlw32-2 spamassassin dlw32-1 dlw1-2 dlw1-1 dlw181-2 dlw181-1 dlw59-2 dlw59-1 dlw199-1 dlw218-2 dlw218-1 dlw80-2 dlw124-2 dlw124-1 chapi dlw83-1 dlw246-2 www.wcs dlw246-1 dlw84-2 dlw80-1 dlw84-1 dlw152-2 desknets dlw152-1 dlw31-2 dlw31-1 dlw180-2 dlw180-1 dlw220-2 dlw219-1 dlw58-2 dlw58-1 dlw217-2 dlw217-1 dlw123-2 dlw123-1 dlw245-2 dlw245-1 dlw151-2 dlw151-1 www.sharp dlw30-2 dlw30-1 dlw201-2 dlw88-2 dlw201-1 dlw88-1 dlw178-2 dlw178-1 dlw57-2 dlw57-1 dlw90-2 dlw216-2 dlw216-1 dlw122-2 dlw122-1 dlw244-2 www.hyundai dlw244-1 dlw149-2 dlw149-1 dlw70-2 dlw70-1 dlw28-2 dlw28-1 dlw177-2 dlw177-1 dlw56-2 dlw56-1 dlw205-2 dlw129-2 dlw205-1 dlw129-1 dlw215-2 dlw215-1 dlw121-2 dlw121-1 dlw243-2 dlw243-1 dlw148-2 dlw148-1 dlw27-2 dlw27-1 dlw176-2 dlw176-1 dlw74-2 dlw74-1 dlw55-2 dlw55-1 dlw214-2 dlw214-1 dlw119-2 dlw119-1 dlw209-2 dlw97-2 dlw209-1 s1204 dlw97-1 dlw242-2 dlw242-1 dlw147-2 dlw147-1 www.gdansk dlw26-2 dlw26-1 dlw175-2 dlw175-1 www.radom dlw54-2 dlw54-1 dlw213-2 dlw213-1 dlw78-2 dlw78-1 dlw118-2 dlw118-1 dlw241-2 dlw241-1 dlw146-2 lodz dlw146-1 dlw25-2 dlw25-1 dlw174-2 dlw174-1 dlw53-2 dlw53-1 dlw60-2 dlw212-2 dlw212-1 dlw117-2 torgi dlw117-1 www.szczecinek dlw240-2 dlw240-1 dlw120-2 dlw120-1 dlw145-2 dlw145-1 dlw24-2 tychy dlw24-1 www.wisla dlw173-2 dlw173-1 dlw52-2 dlw52-1 dlw211-2 dlw211-1 www.tychy dlw116-2 dlw116-1 dlw238-2 dlw238-1 dlw144-2 dlw144-1 dlw23-2 dlw23-1 dlw190-2 dlw87-2 dlw189-1 dlw172-2 dlw172-1 dlw51-2 www.lublin dlw51-1 dlw210-2 dlw210-1 dlw45-2 dlw115-2 dlw115-1 dlw89-1 dlw237-2 ronnie dlw237-1 dlw143-2 dlw143-1 dlw22-2 s1470 dlw22-1 dlw171-2 rybnik dlw171-1 dlw49-2 dlw49-1 dlw194-2 dlw92-2 dlw194-1 dlw92-1 dlw208-2 dlw208-1 dlw114-2 dlw114-1 dlw236-2 dlw236-1 dlw50-2 gdynia dlw142-2 dlw142-1 dlw21-2 dlw21-1 dlw169-2 dlw169-1 srem dlw73-2 dlw73-1 dlw48-2 www.srem dlw48-1 dlw60-1 dlw197-2 dlw197-1 dlw113-2 dlw113-1 dlw198-2 snom dlw96-2 dlw198-1 dlw96-1 dlw235-2 dlw235-1 dlw141-2 sieradz gdansk dlw141-1 dlw19-2 dlw19-1 deploy.dev dlw168-2 dlw168-1 dlw83-2 dlw47-2 latte dlw47-1 dlw196-2 dlw196-1 dlw179-2 dlw77-2 dlw179-1 dlw77-1 dlw112-2 dlw112-1 dlw234-2 dlw234-1 dlw140-2 dlw139-1 dlw18-2 dlw18-1 dlw167-2 dlw167-1 dlw29-1 dlw46-2 dlw46-1 dlw195-2 dlw195-1 dlw111-2 dlw111-1 dlw233-2 dlw233-1 dlw82-2 dlw82-1 dlw138-2 dlw138-1 dlw17-2 dlw17-1 dlw166-2 dlw166-1 s4180 dlw40-2 dlw40-1 sulis dlw45-1 szczecinek gchq dlw204-2 dlw204-1 dlw110-2 dlw110-1 dlw63-2 dlw232-2 dlw232-1 dlw137-2 dlw137-1 dlw16-2 dlw16-1 dlw86-2 dlw86-1 dlw165-2 lublin dlw165-1 opole dlw44-2 dlw44-1 dlw193-2 dlw203-1 dlw72-2 dlw72-1 dlw231-2 dlw231-1 dlw136-2 dlw136-1 dlw170-2 dlw170-1 www.gdynia dlw15-2 dlw15-1 dlw164-2 dlw164-1 dlw43-2 dlw43-1 dlw203-2 dlw91-2 dlw193-1 dlw91-1 dlw192-2 dlw192-1 dlw71-2 dlw71-1 dlw229-2 dlw230-1 dlw135-2 dlw135-1 dlw14-2 s4366 dlw14-1 dlw163-2 dlw163-1 dlw42-2 dlw42-1 dlw191-2 dlw191-1 dlw69-2 winsp dlw69-1 dlw207-2 dlw95-2 dlw29-2 dlw207-1 dlw95-1 dlw228-2 dlw228-1 dlw134-2 dlw134-1 dlw13-2 dlw13-1 dlw162-2 ewinner dlw162-1 dlw50-1 dlw41-2 dlw41-1 dlw9-2 dlw9-1 dlw200-2 dlw189-2 intranet-dev dlw200-1 static.base dlw76-2 dlw76-1 dlw68-2 dlw68-1 dlw227-2 dlw227-1 so5 s730 15mof dlw190-1 www.mod chiangmai so0 dlw133-2 dlw133-1 mazda3 dlw99-2 dlw99-1 dlw12-2 dlw12-1 dlw161-2 units dlw161-1 dlw39-2 dlw39-1 dlw160-2 dlw8-2 dlw8-1 jboss dlw160-1 dlw188-2 dlw188-1 dlw67-2 dlw67-1 dlw226-2 dlw226-1 dlw81-2 dlw81-1 dlw132-2 dlw132-1 dlw11-2 dlw11-1 dlw159-2 dlw159-1 dlw38-2 yukle dlw38-1 www.dialer www.comsci rack12u18 space1 joc sss1 www.noda rack1u36 gs01 rack1u20 rack1u18 arkadas rack1u13 rack14u11 rack11u36 covenant rack11u34 yanshi rack26u36 ag2 cmh scrm rack6u37 rack6u32 rack6u28 rga rack6u30 x7 www.xboxworld vsc www.borg s4170 www.mystery datashare sag bassline www.divinity epsi edata www.mylinks mux s723 apidemo cfa2 www.jeff www.reese vad conlang cappa monitor5 moshe amnesty v1p inara sheree tomoko emailb www.brothersinarms ganbat www.fairtrade trt senni cpaneltest sik www.afterdark www.nsb xboxworld brothersinarms equipe spdev hikvision belvedere sandrine www.uwf gamesonline mickey1 mickey3 cvg cyb www.mmk www.ikg www.message imihotel piyush a-math nlt falcone s4114 pradana motors sharepoint1 event2 favor orderhost masterword weirdo bestwestern pringles minigames paczek galilee simpleman temp04 nyserver www.ut www.fourhorsemen megatherion parklands hivi www.portrait thecoffeeshop mywork jordanian serveur1 filmer phungbinh myslam www.vt mitie goodav broad speedsoft www.logiciel uwf trg tide maa tejendra bradleys ikg idf demigod s4s elin afterdark magik bizzy s717 mikako intersoft stromboli www.depot www.moodle2 esx10 empregos cnsrv1 sauvegarde lain ocean3 onsen moderation s716 www.virus askus strg s4101 preview15 hutchinson tradewinds scraps precise cicada berita mm9 www.teszt1 superfly banweb greentree ikt www.retail night281 oktatas webapps-dev cat-test vision3630 tabor ipaynicekuma2 ipaynicekuma3 ipaynicekuma4 sunwoogagu kgobs3 zoy4444 dayluck1 tong0430 mandhome teamlead yeonribbon spn pitstop s714 sulphur googlpis bandofbrothers springs www.ipv4 okaward3904 mememy315 dsjeong48 s2freesetuptest prepstest2 prepstest s4159 mm7 mm5 mm3 prepsprod www.codered shortener res01 res02 hassane hassana res03 projekti res04 antikvar res13 free10 maktaba chalk aacc kinetic fe3 s4364 yejung5 keohanpnf waterfall ad4 sp2010 metalgear bizhongikuniv mycej83 dollarbill2 pg4 www.fight4fun ishow september1 bo7317 nezumi ssorung2da cmh5839 xerox2 meti indis www.phantom2 lespo falcon1 minkmu isuzu sunrice85 k34j98s point8798 yescm11112 yescm11113 yescm11114 yescm11115 wealthpop gcsd33011ptn irix503 primectr6489 everei friendshair iferratr6780 areumi ledhaus gdero1 apxmfh kkh18743 kkh18747 iferrav4 sonhak budstory sheecho65 dyl070808 kbs0426 hubsmell bookgreen serverhosting254-39 sonian fins011 rubicon melody713 whitehouse chuldori thefemme2 kirin12123 hairpltr7190 junad2013 asadal001ptn piclove refarm itlife1 itlife2 itlife3 itlife4 itlife5 itlife6 minnot reelas buse benjamin791 ukkinjay2 kibee jinhs0217 iferra yangh1 siruboon sonjin s1intsunny capeasy7 godo12099 xzizi9841 gibbmi88 brood1000y3 tnevivid hellobee4 hymnself1 andria10 andria12 maumcompany realusers gofud892 gofud893 asadal034ptn gofud896 hyemin0602 educut1 yangju cocobia mandulgo2 mandulgo3 massagek1 thtkdanss2 thtkdanss4 tong1210 ifeva2 vstatitr2400 zayougrid dptmfl1258 kpgnh chunsig75 copyplus1 soocia qwqasa1 qwqasa2 eunpal01123 cwtest godo12294 jakal203 nanumatr5145 ia2do742 enkcorp nineonetwo kblue010 cocodia yanji4 yanji5 howsigntr1 sb6700 mp7161 ibaekchun jinne0205 dosinongup ieonet jeoung252 hw12341 vier4d hirondelle smartself bpcosmedi qkrwhdals4 ggomjilak9 kfc0930 wandobada1 wandobada2 kiki1443 ipayno2345 nyangi1 goodnara1 apccoree1 wowmin723 feelnatr6784 jw7570 eliecho jabjll1 oie morefun011 psy770706 raraaqua1 gooseyeo knj07231 parancorea aki0000 hy4512tr8230 canari sonpre dindon therich1234 hubfarmtr dbgnlwo1 kkomakoala gajafishing highkickzny sorantr4808 runbio1 nages3 runbio3 nages5 whdgur23 newcm2 greenmoa hogine cho08181 ajajbraj charmhtr9651 releases gank jongi2001 dnjswjd52361 queenseating akbo241 ywhdtjs viprice soonsoo6132 lci0901 vz5 jjairan zeroscho esapyoung1 henb1 najjooni1 whrnlska33 sangpaemalltr skynsnow godo13211 ykaa11021 sora0311 peter77 bodorok lee040804 marrang chm8004 canavena miyoun15 sky2sun5 greenpin ipayfothkc1 lhhgm thaitantawan1 ingang1 lsm947 ljy9296 imypen eprivacy epreaching matishop greenpns mkhouse k0121017 jks1914 kismet2010 hwa15381 hwa15382 cryout regeni bypo1234 buylcdtr cronus yooriapa2 il8540 clxkclxk2 yooriapa5 clxkclxk4 hellojungwoo helloboy0 georgelee1 cocolux greensam syc me2style cgang129 baberina1 leean5103 sebins5 ariapp ezer19312 zmfhqk jolieugly dain130 midiclick3 aurore7moi snhk20011 snhk20012 trophymall smarttest bigraon ssjh7119 hanbyul k96389272 k96389273 cake1st axigen s4intnulbo shoemania gaggi113 kali0083 tdk3776 ejobs nowtuning nun275 s2pselfsetuptest peterc1 footztr1075 csj627123 delphi1 circlepia woojung115 sullai1 russelpark4 sewinggirls suyedang manplus73 summersun northwind traff nava imanweb hot-live pre-live-m hot-edit pre-live edit-m pre-edit-m huecard pre-edit sonja premium1 boss0582 namseung11 english2 bbserver airwolf diving rys bramka hsn www.basel ap04 obgyn grilsexi pal2 harel andhika mar trixie courtney vbrick ssq peekaboo www.mody offroad laval christina si2 tarjeta ds5 xiaoying yacht spiegel sigem ds12 phantom2 diplomacy vespa totti s4160 kosova www.wptest purekids morse norules alwakil atlas1 jlab-tv emailtest mdmtest eason cristianoronaldo sinan jada technews gameclientapi putty sunil123 zxcasd ncf mvh mno anya modul s4230 kenna www.teamlead s4150 btw videoportal yosri dagong mavis liyan vos maili lamxung www.roundtable kadin tamburki pegasus.cpd ikram qq123 lessons citi b2kclan www.sef workbook www.artemis www.ios gekko local-www2 upgrades kalina formular pr0xy www.outofcontrol botox relations manuales badcompany novedades altan bigfishgames www.torque herbert abc12 huxley schumi www.cheers readmore ades oldip germania happyfun elpunto znanie fight4fun codered refinance neckermann www.testes digitaltv moneymaking agent007 renegate futures testhost gretel wert gva serials tekk sink rips okok norm kub mdk lenz criminal annika exel foam fwtest cino selim aral bela alt2 www.b2kclan rbw mtw theconstruct phoenixx intime vien 4you software4free komputer panthers rao www.sow www.ege www.dnd ingenius s4140 wesley nefertiti morphy pflege www.theconstruct matrix3 toz peka goody xyw wwm udt ssw titan2 sef pll moh s1476 krb koc kmk kfs one60 hsc janna nonstop ede bbu rampage java2 grob webdisk.mall neal autodiscover.mall gung autoconfig.mall edutest swa chis 0verkill autoconfig.php s4136 webdisk.php autodiscover.php ip23 dorel pgb gbkh kjy ghweb rdp2 gokhan fantasylife webservices1 samu autoconfig.temp webdisk.temp autodiscover.temp im7 im6 rfid nsct noon fcss kikuchi arta godel vcma zingosu6 zingosu8 faramir eolo lod lince okul mailgw01 www.bookmark elattar riptide movie0 wide2 webdisk.responsive kango sooptr sntrade1 www.gorzow munki1002 gorzow cocorex mds0701 kooji55 janghang991 jw8833 papp www.koszalin koszalin tmo syn lshdvs sjanwhdk221 parkhw771 automotor pinn pdev wangji9676 eunhasul632 elifepc akarios kitty816 server252 micoffee sungyi4234 finflix.videocdn wi2 bbs4 eyes alarm-r0150-0g-g10-visoralarm-01.security www.gok dianying 4d mst-dc holmium alarm-r0150-0g-g10-visoralarm-02.security econ01 lanetli gis5 ns.cs profkom imx sopro fido marenostrum gis3 gis4 latin ats2 komputery ekstranett ocsav s1469 www.nc dbo gestio cdnt bizdirectory pri7 pri6 pri5 pri4 pri3 pri2 s4220 aquiles ciberlynx-wsvn-web2 emaila newsproxy engproxy trial0330 dl001 mailmarketing www.112 resizer www.mpr s4130 hainan hole omni-rcms1 gel beda dns1outer banner1 kaixin warsaw mobistar paloalto diogenes autoconfig.marketing autodiscover.marketing vns3 meetingmaker filesharing jkt6 cod2 wvc rachelle subfinder idm2 garry tapioca sn1per idm3 jedi-en veryold bbdb-scan sisdb-sc ecmdb-sc tsisdb-sc tfmsdb-sc oahu fmsdb-sc halfmoon annu eduphoria webdisk.proyectos host83 host55 out3 out4 out5 out6 iptest ulisse clamps arrowhead sith icestorm www.moi wettbewerb s4350 technique chemist www.statistics jobjob jogja plutone authwireless catest s4154 blackbaud ipdb autoconfig.wedding webdisk.wedding autodiscover.wedding madcap stei alexandr foxbat www.constructii thunderbolt ip2001312196.ice nmswas easyjob www.pesteri horeca cashcow doverie poni new-life mail.vita joylife pewdy housejj pescuit overdose79 perte jimmyalice www.horeca qhtrjr0319 wharkdgks toggi hans1502 ksuk8787 tjdgus2011 thd0683 zuhbhsd53 brandgo zzline salezone okmembers ebebebeb g6368 yang0905 pesteri boyandro futureyyh lys42343 conan101 varam99 aisarang wjdxotjs s4119 okokjoa susss rkswl888 ostory nview didhd1004 kks240 nochen beius sealeeyu kamilshop hosancom nov3004 monumente okmyshop omh11 faline24 jinejoa mino8841 uni486sk sulan18kr akflffls missnyacc northrsoft tsports1 heejin0339 b.a2 b.a1 b.a0 cjn2424 nice10300 janghuk2 jssoft jino3698 ssipo1 chanagini7 rosia elboy grayjazz morek0294 rudgk08 wnrmfodlg1 hyojae1005 neuestyle no7rose hem7229 tqny tdsbjs ljs3133 wildegle dud02 hellen0302 mihye5575 eydong486 www.abram msnrkcs tnlvk1 brg111 clstyle21 uh64 bong333 s4152 runbeast lsdbabo83 mo1109 geunho76 sgr5641 tryrex www.stei ydowne langeriea akb2000 hoattakji kkijnh6 jangnan01 tofurs soul1221 see630 popoki babaon chhpig projecttracker oukzzang tourisme setsj2010 han3608 dadaworld pianoon kchol000 newpinkboy tjcss0 tjcss8 sncfelice imgtj imgtj2 tjcss2 tjcss3 yulevip tjcss6 picup image5 tjcss tjcss1 tjcss4 tjcss5 tjcss7 tjcss9 fseason schilling laposte webex gorira07 blaine cytel ehdans9426 mypul mbro271 golligi jjp2040 rlawkdal graceme burney007 s4110 lh2dream cncompany hyunchol2 harace55 harace33 wjddud523 pipimo sensgirl puba hw8714 happyromi ckffltiq ymcm8585 dalgwang jkyo521 mimi3799 plusinside guy2009 s4368 s4367 ysgdvgs5 s4365 qowo83 s4363 s4362 jingo8927 yanhsgwg s4358 s4356 yanhsgwa boyandro001 s4353 s4352 junpos zzeng541 s4348 yogoyogo s4346 s4345 clickjbl s4343 s4342 kongyh jakad11 s4338 s4337 bebeheaven dkdlfltm12 loves11 s4333 s4332 thdeockd ohjung4 s4328 s4327 s4326 bsh5276 ujhnsgdr13 s4323 s4322 zziccoogo vintageny s4318 s4317 s4316 hosted2 s4315 eyefun rrnflrrnfl s4313 s4312 alliebaby harace2 harace1 s4308 s4307 gpwlswkd mydv ny90201812 cui3545 aion0501 thrushine b991228 s4303 s4302 jss647 zacava wwcatw clockzone yj972 noa114 muse9 eunsaem zltkzltk s4273 s4272 oyi502 o2mall hi4363 s4268 s4267 s4266 kamzi800 s4265 jhjh012486 dbmart1 guzezzang001 sealeeyu001 ppp-11 ppp-10 jjmobil s4263 allenhan hanafood nammaecom s4258 f14okppp s4257 s4256 kiper0119 polo21c wnrmfodlg s4253 aeun1009 s4252 shoeseller themestory s4248 s4247 s4246 rhan12 juliana algeriano ruach s4243 fitgam japet avokato ryu6058 studyphp shinyo123 innerstyle s4237 s4236 s4235 kimjk1191 marado11 s4232 jinan4749 kney1018 s4228 s4227 skp5969 kingmade s4226 s4225 sendy77 s4223 blair1 s4222 ttff1030 banana2 run2run7001 s4218 s4217 sioor kk9999 gsmom100 s4216 s4215 onlharu s4213 s4212 coco4652 akacom paypal1 lovely1st001 s4208 irusy08 filmtour s4207 s4206 s4205 mcmin92 jm2k p0725 s4202 jodongam cjiyeong wjk0529 ilovez s4188 jong617 j007962 s4186 mpopov samiros dosa3377 qjnybkesz shadowgold b2b2 qjnybkesk tlsstory s4183 soumya phernand kk7935 coolkids lys9153000 duhokfrm ljh0217 beeho3654 ocstest s4178 adamantium yanamanhup condom giga220 s4177 s4176 s4175 kludge monit2 tomyself s4173 s4172 pau daheeya13 wowow78 olntydbsrw olntydbsrg s4168 s4167 s4166 s4165 kikibox fuscata plz s4163 www.your www.anywhere s4162 rlaghwls sorajm kanghun789 s4158 s4157 vatenna s4156 s4155 keese4 renard s4153 ggrjuh1 knan405 parisapple s4148 s4147 c101 sgt783 wjdduqdl12 mudeapo7 s4146 lg6014 gm77 magictimes aubade003 karakoram aubade002 f200 kidsksmxg rang99 riyaz sdavis qookace ccc333 sechuna s4143 s4142 kimmigogog abdu pcht2901 aber s4138 s4137 gosu81 dlrlals3 s4135 annsnamu s4133 joypsp mac3d daelimfood jks2661 changttr5949 suntechdnc1 suntechdnc2 kimjezara alekkim1 kidscltr9222 dipopo1 dipopo2 zzang79121 sung27113 sung27114 lms0913 elinfit003ptn qhfka767 itfactory total7004 rudgml56541 rookie11 wevestyle joytac fleury00 joyti1 robo1142 s541129 thdworms02021 medisale heehee6375tr pcm9x1 cocowa2 ice979001 jh8006202 mcc6931 hsc80442 tjplus2dnob1 choccolato sera4j2 kmj19601 doguebox engdevadmin2 d61573 hwajin72423 anpabak okok1428571 star918 yeonsung-010 clever338 njoypp1 goededag1 k1j1k071 shinjichoi yeonsung-015 designbar zerotest ichoco3tr picone2 picone4 yeonsung-020 picone6 picone7 picone8 yeonsung-021 yeonsung-023 s4132 bird12311468 lse0918 thevillage imggirl amotion3 audiencekorea cocoyaw marseme sj6305021 sj6305022 mukuge adem koream79 s4128 adie fleader s4127 ggro903 orkutadmin s4126 haha0503 agha ahca s4125 artemis.cpd mmo20 ahly s4123 s4122 ahoo iqmart sytvfc53 nicole-screensaver tjtls11 s4118 s4117 s4116 s4115 jsndkerx74 s4113 rd01 wlsdud0739 s4112 dataebank modelsuk s4108 s4107 s4106 pks1279 ban1 s4105 wegoshop ddolggoo s4103 s4102 yuran07 newweapon asia0416 yeonsung-040 ceratec1 ceratec4 mykang77 bahy ukctr001 pkd0911 hjyco balu bbmotors35 wkaehfl mini312 twinz2 ifthen wlmuhebsdf s4351 s4349 roy815 eurostar9 ceratec5 ansgmlwns3 dkf89701 designskin1 designskin2 woriro designskin3 youprint uni2399 khhodu yeonsung-050 ericflower1 bukseorak sotye0109 yeonsung-054 wemako1 greendust2 yeonsung-059 enfree150 soji4148 barr enfree151 enfree152 enfree153 pointed legiocasa00 yeonsung-069 albi aldi qnsghde tlrkfh alek alen theplace001 bayu bambish hddvdent naru52 kimgoon002 london2008 yeonsung-071 finedeal yeonsung-072 yeonsung-073 kyj01235 alli jingaone minissuki1 hyeok111 hitro acasiaaca isisshop ddrgx541q mtshoes stylenam webmachine pp0725 inha212 mykidsmall kakaroka f14okpp bodria1 bodria2 spo119 linuxhosting229 linuxhosting231 yeonsung-080 insungtr5197 yeonsung-081 goldcarttr yeonsung-082 only52461 ecox3739 only52465 only52466 only52467 only52468 lsy1227 hananim415 mgraphy1 mgraphy2 ammu stupa qkrehdgml s1465 anja anik creed0606 clamkorea people9 kp1012 s1464 nuguri100 a327751 eyeshape finemart linuxhosting239 designclan003ptn linuxhosting241 spiao1 yeonsung-091 ebingo yeonsung-093 like1539 designgj1 dodo66991 wj22741 dblglobal1 aurorakorea1 burnoaa1 cloudcorp boardpan4 vincentmani choi60232 mjin89 whejs88 kensingtonkorea kswieyjkk bookdang rornwkddl fegerri mong123 allsize euroco uniquecamp msc9870 hiya888 begoddess fun64601 adfasdf misuk5282 snikystyle4 wjyou0818 lsp123 s2pintp borncompany1 eurom4 ajfxlxhr rwakeman hsyoon75 leeark4 hok04162 jynistyle5 qpswl75 queenslook narinim scole4874 geagea jkksports pantsbear madollkr jmtkdtk katechoi8 icafetekno venuskwon paxvobis0 dhforhd negasl6721 hieva s1434 wjdsladl11 jgms38317 designtr7238 choah sd07081 sd07082 antz ktkang1 h1n1 chlwk fbwocks gagamelxd metavoxtr jin03130 comictone os1101 ykm20051 ziinjjb66 babytoto09 omin881 darknulbo4 omin884 darknulbo6 barbiein johculture birdmarine designlak hsblue1 purpletopaz3 eaw wellage whippingc1 promaltr6451 cuz mrsinabro sorexi cstamp kookis1 bnbglobal wellbag shinkee lovelydeco2 godosoft-007 mh402 theshopsw godosoft-010 sunwoo11 aqua79 twoco4ever3 mami2 doichangfarm ririringeu qqhwk sweetfox513 dendy2002 scmwoo2 scarlet2193 yardin godosoft-020 todvhfl nownow801 godo15782 pro25443 dralkaitis1 dralkaitis2 ongame951 ongame952 celeryang aznymohc003ptn murrin3 in4mall8 godosoft-030 cjy8232 actgagu4 actgagu6 actgagu8 chipmunk1 protootr9743 bokgily sansotank godosoft-040 ksu12 interhard herra1124 freebilly1 ktl33 wj23651 overmimo thejamie s4intb godosoft-050 godo16072 s4intp salirery cwsports1 hayfine godosoft-054 godo16133 rangin2 zino1513 y4utr1891 promisej missjjtr1425 musiccoach drmuscle2 envylook1 cubeqa cueplan21 amavilis ladycode adl3910 azz21362 chulho975 kimujuok82 leeborn miz011 jamesjeon lixxi keepsafe001ptn trioutlet rusidnew goodoong minamine01 ikonet kimyune cjw001 aref eptnbhqmwfgvp s1c2k3 wizhomme1 arin bichnada muzzima leeys1123 rlaqhrtjs biju dmsghk419 bimi thiskim776 happy8841 pmillion cdc1 toyplay jflove5 dnss intromall asem86 return0610 eksmcokr heeja hottime123 cafebogner oknnko11 keun0912 w3w webcg jilaldance dress79 stting huni0906 phy1771 mlstory wewe s1429 tjsxo20 ahs234 godqhr7755 an520610 law321444 hai486 ron7856 dudfks33 kdk5428 khn1212002 khn1212001 tjdgmlrla withtns passion020 s1430 rhrhkdvlf s1428 oozzoo designsky trg486 ruru yea0317 allclock kingchoon ktfnh gelios fortest hjkh23 gb890387 pczoom001 lhseok org333 hamji judasoli bestaym kt1523 hong5075 s1420 findlight tyty wlmuhebst nahyenmom mintcream megaeunjoo toymall myshirts k5227497 k5227494 krnaite planwiz reclama s1471 glamgirls bluesky556 chlwkzizi lss9775 lhsij lesson dc1114 soosyy mizzleone shns551 ladybear cultmania robo0672 solo1214 ypop77 fakesmile yms7474 miggu77 zwolx8673 hunlee77 friedegg nam479 tnsaldl12 knight7667 seon12 kimjuok82 hjm705 tjdtnr64 stockplaza kim831017 reemax dodo2011 raya144 qaz4745 ijnjdf78 syl9709 s1410 gusdk8318 koko6 redox1 cocoru99 doogy7 ilove6155 rudal65 webdisk.honduras kogun toppingkr s1405 mintcream001 bdk nihao s4k1na lty5959 alsxor84 autoconfig.radios fable123 cutetiti cheonjia autoconfig.honduras s1402 whdbsgml minisign maple417 autodiscover.radios solarpower webdisk.radios s1401 selt22 ehdans512 rhone gajisam jdsfndh62 jlcorp alsgh4860 ninahiyoko ryuyoung7 tuningshop obzor amkdh basri0310 jang829 departures autodiscover.honduras realgamjao cocoii kdlwlsl wild33 vuisnjhxy boomdiby guzezzang s4347 zbjkim ngbluaknsb lovemekso kkrtg elboys jgcbwm issc ssss21 gugigigi umewede tjrwls5 mkgallery ctphilos bluesoul34 nixspy75 www.consulting baehongbum image7777 web499 naviyaa bone wjdtnsl08 aze1 towclock gengioh hvfire pjy12 azer azha wcode78 khs4341 autest s1371 ukctr clicks.runews mihuij irani cimille79 kkitime ffrock bwabwatv gpdjsdl1 chor s4121 portalpms web109 yourajoa onoffsale godehak dais foka dane bsnl harang09 ps0429 shlvmj6 dks8504 kidsksmx kimjovi daya jayholic lhh2121 nilufar413 web1b wsxedc artweb yns8645 patrol deny race4000 seriat001 sweetglam cole zixvpm02 dewi topkki birth0531 cmj0410 web64 bliss220 wjdtldyd tifac jinihome dipu gksltkdtk lnybksrbz lnybksrbh focuspc toonis sexytoday min304 alflspwjd dawoud207 coolbuddy007 bodyfriend mfcsg sspama shyh22 wj6838 joug200 rlwmd78 gilmall chp jeonjisun jb2110010 kkoobi realgamja dacha autoconfig.hr autodiscover.hr autodiscover.foto autoconfig.foto sreverse mailadmin9 coe081 jiny8282 sdoduk www.tvconectada tvconectada tba gmulco key9614 api-qa ticketsystem api-prod a.test ids01 evilium tmpsolutions ckmina80 rkddball hotzzang ljhljhhh ftpm forcar77 s4339 rtdata sigweb mikee ailos sus01 egy1 serpens week devww sicoa metricapublicidad virt4 enterprise2 uploadftp thaonguyen webdirect gfa ludmila sektor viktoriya www.traduceri www.imobiliare drem kron soki gintaras joyful goodday peaceful carti takahara smbhostverw referate vinch www.concurs adg lisin strela www.felicitari www.referate mail.biz lek www.retete lev supershop daneshnet traduceri bullseye subtitrari nhm rum qlife ftp.med relevant solution1 felicitari publicitate phytotherapy nataliya wecan ftp.sport masterpiece xoops smbhost glorious mail.sport aas web430 izhevsk13 ftp.love matter aniz mirny superstars fana sampo ability crum bulan mystar yaroslav freeshop sergeeva minhhai caring nubian tsh vitamin vira taim shiseido lora gesund luch runet neopro nira vipnet bewell yesman saludybelleza valentineflowers kio sharper web94 tinman ftp.job ftp.pro richlife allnatural www.u3 autoconfig.stream transaction autodiscover.stream mail.look millen tr3 sats perspective grande vipclub autodiscover.tech autodiscover.tutorial webdisk.tech autoconfig.tutorial autoconfig.tech lad rioweb flyer rhodium inlife ww20 www.angajari angajari mail.web splendid ns4-2 ns4-1 worker1 s1220 it01 dbmail entry3 entry2 longlife nakagawa sunlife box8 box7 webdisk.designer autodiscover.designer autoconfig.designer box6 s1334 szg nomad2 seimgex mail02.gr health-beauty readme webmail01.gr pop01.gr seieumg saiwmng.is sefcmg partnerships smtp01.gr www.cameras 2ch nietzsche blondi videos2 notar table emperors cdb2 pubsub.jabber media02 server-1 datacenter1.cesantia orcus datacenter1.solicitarclave datacenter1.contingencia knet tartarus aandp avtest pool-node-tr hei kmt vpn9 215 skm webpower 213 ecourses eurynome 196 rtest 187 atlas2 www.auth 157 kch kof pothos 145 143 141 tadpole enfer 190 movies3 www.uslugi luminis xtra elie autoconfig.pt autodiscover.pt tutoring zrenjanin cornelius sticker addm www.sklep2 ues huonglinh interstate ipcamera assd hma nonlimit raps dashboards onlineco signon campusparty whee farwest settlement scrum us.mobile www.kumquat vicon orange2 vigor dwar emre dwin feli kebo mmb teamxtreme netapp2 ffff kolab suburban ukki ambassador www.ent peta caracal dyaa c203 kenny1 webdisk.italy util3 cua2 gamma1 autodiscover.italy mondeo autoconfig.italy www.spain socialize socialite sanskrit btk dominator validmail tritone freeinfo referent pix-outside vpn-gate amalthee testias utilscpo planningweb announcement webdisk.rent pc23 www.renewal realkey cloud7 www.reb pgmi tarbiyah syariah ie7 docomo www.domain2 www.tgp thevoice erez swl localhost.live www.plaza bataysk odincovo www.kultura www.67 www.lm www.nv www.ekb www.paradise www.smr trsc skytest webdisk.coins sedi autoconfig.coins m.blog ppid autodiscover.coins province ipphones atp www.avrora www.kurs www.bat www.moskva www.tx name2 hildegard ldap00 sps1 minecraft2 caprica skylab tuyenct4 wsd1 chimaera reliant aceit www-temp www.arl newsflash laulima bnm www.course ikebana disconnect synergist previous searchtest bunbury manav ir2 dl101 1970 9706 interest buildserver www.jupiter www.laguna springfield sitim www.na www.mysports hanover www.newhaven apigold melville sendsms www.gh www.metro yuanwei www.tsw etis ogrody youngstown www.richmond ftworth restoran www.myname anirban www.wall www.vist ware northampton denden orf princessworld westchester www.anderson www.ssdd www.saif www.safa janz waldorf freegroup salisbury www.noor kanoon www.brandon moviegalls5 anhngoc duman gonzales www.nurse velo elect www.lex minhnguyen tacoma brentwood rockville uhura sepp www.hehe moviegalls4 moviegalls3 fypproject moviegalls2 venera www.butler onur kramer moviegalls1 www.cube oguz shareit xlsx www.amin yap hikmet viruswall testmoodle suzy essa bahman split volunteers mneme maindb pingvin eses bct2 caixapreta davood exciton wienaz www.taobao tock webpub www.amoozesh lundbeck bore www.nts essi www.hussein artbank www.mgt en.service thienphong stump calci wwwv www.danesh maomao pibid www.darkstar mymaster hungarian automoto farina manhhung mysports meadmin server62 agahi vichy m31t server66 ezp nas5 luminary rbl1 thiru konrad s1235 rbl2 hawaiian asse inscricao www.zamani www.noclegi www.2009 noclegi sahin www.1111 s1231 rdv s1229 ppd www.sunset www.newton twisted www.conquest glados fansite www.vpp ssdd wouter benoit ermine www.ssa vsphere nguyenvanquynh instruction tien www.gbp www.env www.elc magictrick tage www.fatih jaipur www.friendship www.ehsan geni genclik mersin www.testwebsite hoangan www.esra potc gjxy vampir desigo reservaciones vbnet energetik gast020f semih www.soa pranav luana computer1 mytestpage bingo2 executive www.anand cormack www.turan wrapper sorrow www.million intranet-new sb3 suzuka ibo sn1 m1m2 maserati flu dtv egl rtrb040 csx dns101 aam www.pdl www.ahmad www.serv dns118 mib web2013 pancha www.host1 159 kitap osmanli newbox webdisk.host1 barracuda.test mamiweb zsw rec.messagerie dev2.messagerie eid pp.messagerie messagerie9 rec2.messagerie www.ims www.results www.result ftp.upload xinwen bast s1215 #smtp checking picture1 wilco gorgona middleeast s1214 kurumi wsd tane yss misr eudoxus www.britneyspears zircon beegees optusnet mx.staging chihaya shira www.pinkfloyd nurse1 www.celine rosehip asama lennon shigeru www.elvis gnr fsfc awstat rollingstones ironside kczx www.u2 s1209 www.who publicdns webscan www.gunsnroses pagseguro vdm azaan dkr smtp140 s1206 dark-net ip-156 ip-150 gita s1205 warda smtp148 informacje smtp142 smtp132 ip-143 hany autodiscover.demo2 autoconfig.demo2 webdisk.demo2 ip-136 ip-130 wksta2 tstb056c tstb056b tstb056a ip-56 ip-49 tine tstb008c tstb008b tstb008a ip-43 expertiza ip-29 libmail ip-23 e-mailing www.robo suzanne ip-16 ip-155 ip-148 grok s1201 ip-142 ip-135 ip-159 ip-62 ip-55 ip-149 pc09 pc07 web63 ip-48 pc04 web61 web60 ip-42 ip-35 hasu paket ip-154 ip-141 ip-134 ip-61 luce ip-54 autodiscover.in webdisk.in autoconfig.in ip-34 leen ip-27 ip-21 ip-160 ip-153 ip-146 temptest ip-59 grus vols ip-53 ip-39 ip-33 ioannis gmac bagdad remotedesktop ip-158 lutz ip-152 ip-145 ip-57 ip-50 ip-58 ip-52 ip-25 ddavis www.preprod ip-18 ip-12 gcms dialin10 s4270 ip-40 ip-30 ip-157 ip-28 m7md ip-144 ip-137 ip-51 beta.mobile ip-44 autoconfig.ws ecommerce2 autodiscover.ws ipartner ip-17 ip-11 stream8 blub clarice plotter colu rohini directi elb basi autoconfig.cms autodiscover.cms frontend2 creasyst nayami shunwa s530 the-portal jmpc cwimedia1 west01 www.ino yui nanoha dialin12 dialin11 dialin09 dialin08 dialin07 dialin06 dialin05 dialin04 dialin03 dialin02 dialin01 colorp receiver haendler vindhya dbg ftpapps ss5 net.aa2 thyme czt rwanda chandrashekhar mdata tulip.crsc allseason.net chetana spring.net ct095.eng season.net ccweb zygo compact nb2 autumn.net car13.sci inter01.rector car21.elec csr21.eng car21.eng winter.net summer.net inter02.rector csr41.rector alexr testvis car31.eng car10.net inter03.rector csr41.eng elec1.elec millenium.crsc daa1 joshkar-ola sergiev-posad www.blagoveshensk vaidya rekha www.pskov vtk solidrock j210 niobium mssql8 mssql9 gameservers rupali phosphorus 2u kritika nilgiri partnersw.ftp biomed nvision poezd sound11 sound1 partners2 kurort www.seotools r.mail indium realestate.dev ftpau sftp1 vmi smsadmin kollwitz stephani lgc files8 files6 webreports sinclair www.desire dev05 iklansemua dev08 sigmanu dev11 dev12 dev14 www.garant oldintranet test60 dev15 test44 test37 nouvelle netsky fyzg test06 mikul labstats ibda mnet icah netgen www.fai enemy w18 manager1 test-client piacha angebote hondacity node22 devcontrol guto free4all zwalm winweb02 mail.exchange daniele hoho oblomov wana nation mx.www ibi avconf eveready dookie democrm hopa more2 adimg1 infuse ey pem dialup-30 informe www.turizm c-00 dialup-68 dialup-69 dialup-79 dialup-88 dialup-89 torg trout dialup-20 dialup-21 dialup-22 dialup-23 dialup-24 dialup-25 dialup-26 dialup-27 dialup-28 dialup-29 dialup-31 selfserv devsql easyweb dns.cs altus winweb03 devlinux vc8 flv4 playm flavius dev123 made spmexp-clu-01 pingifes s323 s327 s328 s510 s4360 s1129 s511 s512 s514 s515 s516 s517 s518 dialup-64 dialup-65 dialup-66 dialup-67 dialup-70 dialup-71 dialup-72 dialup-73 dialup-74 dialup-75 dialup-76 dialup-77 dialup-78 dialup-80 dialup-81 dialup-82 dialup-83 dialup-84 dialup-85 dialup-86 dialup-87 dialup-90 dialup-91 dialup-92 dialup-93 dialup-94 dialup-95 hqglc s519 s521 s522 anggrek s523 videonews vue s524 s525 s526 s527 nhx s528 edmond www.maintenance termine s529 s531 s532 s533 s534 mv2 s535 s536 s537 s1119 filer3 printers printshop multivac webreg zbx autodiscover.site thaumas autoconfig.site nwa notesmail rc.webmail delta2 cserver downloadshop hexagon dyndns2 dyndns1 rhine johngreen tobago balance1 eit www.bmb bhima fluege testlive usatoday vmweb s4355 bsd2 hunk logintest rm1 boujdour torigin1 torigin2 torigin3 lovemode daytona showroom2 showroom1 coimbra smtpcelular mtas mtp2 bramble jour tiraspol inam iloveme stevin transform wak duracell igallery promo2 dizi mail.co calvino imon parcel jena yoann jose81 izzat bari rotterdam jeni macao inox especial madras cherish irfb s1477 lasik lovelyyou bakery qwe123 leedh nbi eunice lovenote assemblage s1473 subaru25 s1472 krys greentea kreis remon allgrow botandesign tnd kanshou s1467 seikofesta hatogamine s1466 webconf01 headspin netzone f64 noatoshina technolinks ikachi s1462 ach patio nesjapan bb3 kosodatemama space5 mg130s2000 gclass pkobo multi64 otoku bb4 bb5 marusuko212 ahn uranai bbi stagewww kasf ameblo bgm lujian ote-telhosting jellicle vhost5 autoconfig.india webdisk.india autodiscover.india ronronear bnb ccy nyantaro cei webdisk.clasificados joycue webdisk.youtube bou onsenichigo tev nrw paulette dak mygw21 ell pops dxb bioty s1447 ecraft socialapps moneybookers gge hd1 mailwatch s802 s811 s810 s820 s824 s823 ktw icache mokeke s818 s817 s816 jltffukuoka ti1 predict webdisk.whmcs unb ycc perpetual 1banshop hea pumps itvn www.radiomaster castanhas genabog kean elearning2 hhh s1431 jyoutokuji katori awoni s1427 s1426 ampersand sandhya gun s1425 michinoku funnyface helloman sorairo shizuku progressive sunray-servers tomatoclub bellamusica kel lsworld s1424 s1423 s1422 sanuking hiyos2 hiyos3 jondon khn jsl s1421 rewind freefit r18 s1419 s1418 jtm miz mr1 yakiniku crmweb s1417 akamai bw2 s1416 s1415 s1414 route66 phm s1413 ais2 ebis resical jole dpop haato parasolife joni pog yeti ehime311 type sc4 iekai qpr riyoukomaki mcftp chibarevo s1407 s1406 izer kimiyoru yulily100 sdt shm s1404 rue snk s1403 hellas ascii ryu 1000noha tjo beplus tna usb bellport s729 kimu rindesu stokes sigex wus fugakudo ymh valkyrie zxx strasbourg bum www.tel www.mts www.itc nightsky hs232c autodiscover.singapore dkweb gotomarket mimitsubo autoconfig.singapore webdisk.id autodiscover.au videowave ponto webdisk.singapore jaybee pharmamarketing wolo idms yasunaga unoichika chikujyo aggrenox.edetail quonschall mm100 eastpoint kyani oracle-colo aaaaaaaa messy avwqr374 mbs47 www.icmtest starman jsn thorium jesuc mobilegame lunartears lovee rano webdisk.photogallery loveu teenbang kimaroki eel mills mimie silom firejam mimmi mysupport artbox nayan sample2 sample3 39software hotfile sdmail amemiya kaigyo hotgirl asmith mmmax loveplace buddysp kelautan zeitung mercurius trouttimes eigohikaku sunnyside wordpresstest nadeem pall takeover machikadokan yoshikinet ichihara skeleton clowncrown highscore greenleaf mems furyuin parfait tanatos bluedesign sleepwalker zodiak wmx mrdoo newmonitor mythology lifeis waiting krit eastward saqqu jamiroquai enust threee obama astaro viagens vendedor thrill mbah kissme mar1 www.showbiz test2006 marketer smo mang kodeks musso fallwind shiney brandnew doner nnnnn vul tt1069 onlyme myacc peter2 agasadek mail.av myboo juvefan mbmb matu fordca configsrv stun.techops configsrv.techops apartments kull servicestest oldsupport doumi cdesign meda one04 one03 one02 one01 meky freshair one07 1203 one24 meat knd strobe mezo lory privilegeclub tetsuo wenku firstclass onoff gypsophila s1290 miho exquisite steeze revenda naae pyrenees calculon www.yn danijel mish www.wl www.nx www.gx sweetpea hitch www.farm www.88 tisiphone.olymp qx ckworld counseling bailang pipik xinhua test222 luiz letterhead pte maskan pi24 neil www.avatars lmi s710 wma websvc nesh situ malicious mycloud radioman jumble mssql11 christelle sns1 mosa konga hotelparadise lyle zarabotai some n7610 admin0 pictureperfect niaz ultra-vpn z1z1 tpeb tpex vpnbe vpnat s1233 nish vpnea s1232 vpneb morteza www.una livezilla sun333 3gp s1228 tomochan doubledesign s1227 schatten inpress raina informationcenter suns tomer vxml-lb rac1 impression s1222 s1221 alert2 s1218 alert1 satworld ramwi ransa s1217 mycv nggums appleseed noos directorweb www.directorweb s1213 sitelink s1212 www.sitelink dunhill s1211 integreat ws100 cpma s1208 cavell fdb mentality s1207 kfir pc4353a mytv pc115h s1203 s1202 cr006 exec01.uus mri-dieter.mri enterprise.uus uus-soc-01-od.uus new2.uus hallam_dev koa-as-well hallam_ad junior06 pc3256a space4 pcn125a pc3457b yhman-gw pc3458b pi01 pata ps115 pc1051 pc1103 ps4101 pc1309 pc1401 pc1405 pc1452 pc1102b pc162a pc201m pc201n pcn351a pc1256a justdoit l3-1 pc1257c pc4051 orki pc1403a ilomail pc1458a s4344 pc1458b cdn.greedy healthc1 pattern qwert dmedia-eg mail-gw2 235.bint3 vxml-lbn regio reina renee maru0216 dror michelle1 pran revin nonutilizare bengolan3 ten26llc myhouse bonobo s1134 rafa someday foolish sanma autoconfig.ajuda autodiscover.ajuda rahu raji sanne sanuk www.lukasz filehost saram analyze ramy surreal raph theology www.cristi www.cosmin www.danco staffnet invincible redi bonnie rein impressions sweety fore thinkpad qnoy mild core5 hub1 shami poonam rovin madmin carts test1101 saad rima sonetapijk wednesday el7oup far saha taste mechanical be-plus iraytb fukuhara norinet vanillabeanz hnctphotocb saju minase 4sight anelog noguchien utbiscuit mamezy studiovier sata n47 goodgroove sass s4340 genkotu-dan nasutaworks hgf obamaharumi point136 kinjyou minibird usr roby miyakon semo komala wwz 9gnote roo7 starholic ronn icn tacacs1 designmaster shab roro rosh rory kgh rosu ricoh2 roxi jsc frigg jsa kkb kredo webdisk.magazine taco vesal ldw knr maska nosmoke mbo rubi testshare lmf zhu magento2 magentotest comsup mmn teco conv odl sock www.romania rxhl 0rkutcom custard donovan ecoman nop ramonin samman test100 masood greengolf d60 pme ovo b130 b110 z3r0 rbf uandi rna h159 thesteamcommunity h150 h140 h130 caixaeconomica straw d99 strom c60 dream20 autodiscover.deals autoconfig.deals allgreat versatech b80 hypnose tram copanel a40 j117 h215 h214 h213 h158 islamweb umax h157 h156 registry-serials h155 h154 upit upld clientaccess h152 h149 h148 h147 h146 h145 wali h144 weoligre h143 h142 pasrvt1 ringtones865 www.bundesliga volk vpro h141 silverfox h139 h137 powertech pantai h136 wova wowo h134 h133 h132 yael h131 kousin vaibhav honeybee allhere h123 chocho kumis larozum taher wtt wwwk staging.m pikapika c211 www.tehran www.mirza www.ekat saihi www.akademi b202 b186 tester12 frankie dmb sympathy mapi modoo zied photocontest webshell grampus yuji chuang ziko b141 zink moneybook libido b135 yuko b132 b131 champs zond b128 b126 b125 b121 b119 b118 b114 benreghda b113 b112 b109 arunkumar fukuda b107 b106 b105 b104 b103 tunel sheriff b101 b100 a101 k22 pratik transactions whitedove g25 g21 g19 g15 g13 e94 e91 e78 e26 windows-serials edge02 e25 wildrose cis0 e21 e19 e18 www.guides e17 e16 e15 nasza-klasa e13 protrack e11 d89 pbo greenwood iproxy3 iproxy2 images.beta delivery.stress leith.sandbox controlproxy6 images.loadtest images.stress iidb delivery.beta dbbktwin idelivery2 idelivery1 delivery.loadtest idbbktwin icontrolproxy6 icontrolproxy2 icontrolproxy1 adsummit2012 www.adsummit2012 codename d64 webdisk.jv aalam nullpoint wb3 toybox mylover cherryblossom moonwhite pocoapoco tous facabook sleepyhead kelmetna yourname lilian c95 c93 c92 c67 c66 talis c65 c63 c62 internasional rachid raj007 laboratorium c61 c57 gifts4u nagaland c42 c41 webit 7amoody caramelo designstudio untouchable undertree heotun readymade odagiri happychan malhotra theman monophony bexo atak rockband blee hypersonic bom2 daca b44 wwww2 b42 dang daze b36 lavidaesbella b34 cnnc toko2 k100 ws115 achil daydream dmar edom a34 mail01.test mail02.test mail002 l3 mail03.test l4 dogo dope ip28 draw apc02 eins apc01 fajr duet nserver topping dw2 nds2 gams s98 s99 rakesh poverty nwww studentweb s246 mangoo appmanager smsgratis fram ggrw amnhac macpro www.lmarsden44.users www.pauldemo www.dariuskrtn.users wreck www.plugins fugu mstest godi webdisk.newsletters license3 nederland manyou typo3.sapin.users goon www.daz134.users ibar ggi idle guuu hmmm prediksi feminine www.joomla.demo2012.users snot mingming nautica maxa smsdemo huhu xswyh ccie cliche sunclub ecargo dhcp01 jyxy tmgc newftp infi rcu booklog secu hxhg www.antoniom.users www.sheldor.users jjjj bigip www.reiki.users irun qunar katz www.paigilin.users heyyou nightshade jota www.jakarta webcounter kualalumpur nanjing joss bbarchive ppg web-local joya pauldemo team2 www.tonyawad.users www.lsg www.ankita.users brilliance kito lama yz.pass oldimap rha mmf www.stl marmar kody mainte1 imycro.users demo2012.users www.frankstar.users backup1-11 ssl-1 www.abdallah.users router1-main-ex sv30a mbackup1-1 iahead.users firey.users ssl-2 www.im21.users rayalgar.users test25.chris25.users www.sakkoulas.users router2-backup-ex mysql10a psychoman router1-backup mysql6a tombutlerbowdon.users mysql7a sv50a abanob20.users ffv1000.users mysql8a mysql9a sv31a sv32a sv33a sv34a sv35a router2-main koki www.rams.users router2-backup router2-main-ex router1-backup-ex router1-main koku rohitwa.users atera.users sa3eedahmed24.users tanx koob game8 www.mefistofelerion.users www.test25.chris25.users behappy ksas courts revenue spider2 foghorn ffr rsan extdb amirdaly linuxv mapo www.holway.users kunu blueline extender anghel-andrei.users oice lmarsden123.users northern lmarsden44.users www.chris25.users pressoffice dariuskrtn.users kobieta volley michelin loin www.kobieta s0s0 pnw daz134.users www.arh www.srt ss7 www.nica.users www.sa3eedahmed24.users signupsyeah.users ocreg ocvalidate swieta www.irfan.users www.eis2sip.users yayan nacc www.uz novipazar autoconfig.bancuri www.samm.users www.academic tlabrvt1 autodiscover.bancuri webdisk.bancuri miro rushabh1211 namo slotmachines oracle-dev www.anghel-andrei.users www.uta etk moab cloud10 www.bindas.users ocr reso karcher kkp ankita.users hartmann mnmn nesi newindian.users www.punniamurthi.users aidycool456.users def rohit.users neru resultados mold nativelife eclinic www.maroculous.users mobile10 fris mong past proxy7 moth iine skg downloads3 no11 uks nms1 t2t2 stgadmin alsalam sysdev irsdev aii lilboo testluke.users musk www.grimothy.users jilin hefei comunicador chengdu xiamen fbtest www.mailinglist train2 wuxi haerbin changsha kiddy beavis s2test jian www.phoenixguild gargamel nosy ytube www.amy roswell blog.yasirakel.users tianjin zibo vs15 chongqing soprano blueocean62.users funworld app11 eric3 pedo fmd fsu liberation goi webdisk.service autodiscover.service kiabi graylog autodiscover.intranet mv1 autoconfig.intranet dataexchange dcx www.joergd.users loller pitt www.lmarsden123.users webpoint www.cosanostra highaltitude.users us06 poda bowwow libssummers.users poom yey localmail www.elysium popi spell somethingnew chillisauce.users bj01 www.devon raha www.basement www.signupsyeah.users mail.toy maybee snipershot inmail2 ramo www.trial-022e98.users www.yasirakel.users rash gameinfo se02 vs20 screens nevercry1.users images9 apologize soora boobytrap saem mailt antoniom.users zaphod3 hopper adplacer www.trillian pinkads hotblack www.abimassey.users www.zaphod3 ogc www.lessharma.users www.hotblack dedibox savy www.magento.demo2012.users www.paulgwyther.users www.wonko www.jeltz sdat reiki.users katharsis meno maud aftershock www.typo3.sapin.users roy.wang.users helene seen www.aidycool456.users www.ffv1000.users sele yotsuba mail.song99 roco song99 nodo3 nodo1 roop natur tomandjerry smoothie fs21 fs20 aun rrrr adcbs.users fs19 mail.avgame tippspiel avgame tatu blu-ray reseller1 cx1 www.donkey collaudo tazz kanna sawa snsd www.androidctc.mefistofelerion.users voucher tsumo onkyo bitbit nn1 mh3 ssis ssuu homenet suni supe grange smtpdel fishman zappy morethan decade tpemail www.bayern ktest trice www.sphere tune paigilin.users ycbf1 new-web stream12 synca webi secureapp wien hayley crpm guadalajara monterrey www.rohitwa.users www.frame www.dad www.cws wito xboy srv26 staging.services xoso mino zero0 www.scm srv42 www.hod zeron yoli www.algeria bindas.users rougugu.users delfi bamboobites.users dbdb zhen ziya camellia zoop yomyom ns261 jxzy ns152 livingtodie svn-source hoainam tonyawad.users warden cuncon magicweb nat510 vip900 vip600 www.blueocean62.users efsaneforum trial-022e98.users beshoy55 preityzinta leggings mido92 kakarot antitrust filmovi frendz beachboy cerisier mindstorm supernovice amir2007 mervyn corvet corbin papermachines tra2002 dracomalfoy sylfaen blade03 blade06 ndsunix zootycoon dreamer30169 djc examene freersgold demo24 portal4 blade05 blade07 demo28 abdallah.users cdac rapidshar yeuem xnews www.faith egystar matfiz oldshop www.massivegreyhound.users shanerhodes.users yatie shankey www.new.newuser.users minhdung nas0 topspot e0 rapier www.ausbildung www.rural manojm customer1 www.b12 esx02 fortyouth autoconfig.audio webdisk.audio rett7.users androidctc.mefistofelerion.users kasino sd2cx1 autodiscover.audio mamali securitys sd2cx2 vonline www.libssummers.users sd2cx3 sd2ca1 sd2ca2 toplink sd2cx4 lagiator se7 magnat hegemonia shababy prayer cmtk1 cmtk2 cmtk3 birk ugyfelkapu spiruharet libyan www.wpeasy.users webdisk.black pinga checkit vedat lb-www www.dijinkumar.users nanoicom darkshade sdb3ko2 www.chillisauce.users sdb3ko4 www.90 toual paulgwyther.users suzie realdreams azizim sdb3ko1 ajans sdb3ko3 spic sexystar www.sipac proxy.ccs vat staffing young2 www.sigaa webdisk.meteo missingyou www.realbusiness dilemma alex18 chiemi mail83 mokka fwe mail51 mail48 webmail0 www153 www202 serv148 newuser.users gate6 growth growup www212 autoconfig.coupon autodiscover.coupon webdisk.coupon jenkins3 joomla.demo2012.users www215 monkey02 filedrop k1000 greatescape wardrobe philos lessharma.users negro fastukhosts.users www200 cretiveadmin.users whitemoon yourdream accura zxcvb megalodon konoka cooler gslbdns3 gslbdns2 gslbdns1 pps2 proman mr2 exchange2007 iapple netmaster tele2 pavlodar tictoc donskoy elmi shum veille ohrana unions qbusiness bousai sloan www.osi-app-new saray linkshare swicki autoconfig.kino www150 testmy db.test webdisk.kino autodiscover.kino x.www learnmore ssologin engine1 starlike toip-cluster uzem velona www.atrium realbusiness cyber10 kukku webdisk.faq www.firey.users joergd.users triki ilahiyat ahmet nerima warframe hachioji englishgrammar gabor uxasr01 radtest fef includes insanity untech ux-mailhost www.krs manama olopa busan diklat creamy vpn113 cutebaby napas loveit agx uxwr1 uxnbacu101 netlive starstar dema www.iahead.users unused visitoradmin smarttv webctdb wildcard uxpbasa01-pnr u1-00-b1-sw03 yulia beloved ws185n185 zerobase prison telemedmon uxr2 tll slivon thb denzil rayray dcgaming na2 ilya dilmun riche really illusionist pln dream2013 idream planethippo.users iot xwb caliope efax orchard thang jhome goldstar wcedge devman design007 ashtray awo www.apc dpm www.ukraina www.ramazan stage-api palmbeach sharetest pr3 inertia pr4 pr6 ebichu t222 hwarang www.calls droplet pr10 bbs9 pr11 pr12 uattravel nbg www.showman renplace analyst showman xserve1 district www.tijger.users nakaji ftp42 brookland ftp40 reizen ftp36 ftp35 usanet ftp34 mail-new www-php ftp32 bic ftp31 michael.users theisland www.ieee hongda wpeasy.users hillcrest ftp41 kouprey.users ftp38 henderson lonelyplanet whs ftp37 ntest1 iismtp lightspeed ftp39 oracle2 osceola khs switch4 frankstar.users wiki1 www-stage www.planethippo.users win33 win46 tixiliski.users definite oracle3 demo29 www.qazwsx paradiso thorin tropicana detective autoconfig.ad jmorris belgium www.finland autodiscover.ad www.atera.users sunny1 pc122 pc123 www.austria www.ireland chicago3 www.norway www.zave10.users autodiscover.bt chicago4 www.lithuania chicago5 arttime freeonline pc251 solitude solidarity staycool exhub01 exhub02 himalia batist www.bamboobites.users shoppingmall iae macabre host198 host197 infected host195 loveletter eternel host189 host184 newns1 host182 dokeos host179 host178 intuit killers atoll host169 host168 host167 dladmin host165 host164 host163 host162 host161 host157 host155 host154 host153 host152 host151 loopback-net host149 host148 host147 eastside host145 host141 host139 host136 zippo dav.ox-sd matra host129 host128 jacker terni omeka stacks apptest1 dododo bermuda seabass lovelovelove vps20 qwer1 khurram oana calligraphy apotheke mailengine feed1 joomla15 www.erasmus iwamoto godfrey fib www.arte webfree www.note vls ldapmaster www.images3 domdom testads leporis alhimmah www50 djclub host200 host180 samwise host159 dsvr2 group11 ib1 moneymoney www72 mail.us www60 www70 sr6 dcf saguaro www76 www59 www69 rakon host192 sr5 host187 host186 mojito dev-support host207 host191 host190 real1 host185 host183 real4 www.demo4 cef scca moodle4 horairetele host166 host158 www.task tarantella smtp23 dispute host156 www.jacksonville galaxyworld netmax host142 host140 host138 eres apache2 eduserv ifs apache1 pc08 multigame salvia dextro southeast samsam samsun montes mimmo tealeaf super12 ellipso2 n33 dp1 gart mashhad existence sbc2 pirouette dreamy j6 up6 www.p1 autodiscover.calendar form2 autoconfig.calendar form5 hellyeah jkoecher1 elog5 stjohn host160 lastone eis5 iag basie vil artic download7 freefiles gliwice printec ip48 arukikata storytelling ocn picturesque individual zucker usa3 immune d1002225 d1002101 d1001440 border2.nntp.priv border3.nntp.priv h89 h64 h61 h58 h54 h53 h52 h47 h46 crafty1 h45 border1.nntp.priv h44 h42 www.vidhyasagar.users h39 joon.lee.users h33 h32 alpha99 h31 h65 h63 gcf1-rr.nntp.priv alt-relays h40 agroweb2 border4.nntp.priv h60 gcf2-rr.nntp.priv fafnir vanburen h59 node11 astat changepoint ipos tijger.users vax hyperv yyc-border bonds www.frm snorlax ldapadmin uasdb-scan fishbowl www.genealogie redwolf autoconfig.laptop autodiscover.laptop waterwater webdisk.laptop jejeje www.dave1 doghouse isildur ms4idrac sol2a array statdb postfix4 bweb postfix3 humancapital am2idrac www.mdi.users dosya lkm kars ms3idrac vmserver uranus1 ns232 ns212 am2a internetru ds437 ms4a am1a activenote invftp adore ikou slack am1idrac medblog seed01 medianomika jmw kab mailstore01 jcb sweetdream smup kafka hydrangea e-card tiktik wuli fairfax zhongkao smh anxiety bigworld carrent aimer sendai nel shisei bagel fb-apps coldheart ahuntsic hgj beams mail.secure finam rambler-tier nnn-i stars7 master1234 rambler-test f116 www.con nbt dududu n226 n202 might cummings e-club drishti pee kulabyte2.lab2 live1.blr1 smtp-rr.srv in2 syslog-rr.srv www.manga www.nauka www.rpg live5.bitgravity.cpe v2.core3.sfo1 http-rr.srv live2.blr1 zxc123 bgp-rr.srv axfr-rr.srv infocentre www.trust ntp-rr.srv sberbank snmp-rr.srv mysql-rr.srv tacacs-rr.srv jatim tftp-rr.srv gestor rdns-rr.srv rav www.astro shazam ldap-rr.srv kallum kdc-rr.srv renwen efriend kickstart arden bodyguard autodiscover.downloads tcdn fujitsu autoconfig.downloads hardik kingsfield saveonline lololol cbi qa.tools waitting couture testintranet heroine lovedream moondance jabberwocky avant nintendowifi sgames withme www.mailman promail blush ssr1 setup2 romero webpage netscreen oceano cench ides noroozi elodie timewarp aniworld autoconfig.cars www-beta webdisk.cars www-5 chata autodiscover.cars kumsaati esporte kyouei muscat boyet cider limelime choya equip gb3 maps2 visio2 visio1 ggl antibes agadir americas gw-mx1 vps02 dadan nl.test luckystrike ucms digitalclub cipot terminal-uk uk.test daili panmog1 cdh7210 hispace3 bybarang1 playonline teaks2hyun s1devsf eko2 ncre gosibook cemerald rc21com kshcow723 unionptr2870 sunbow6958 llux7831 demoself s1devnj s1devsky s3freeintsf gomooke1 cutemate one5303 jr286tr omega1 s1devhn angkotr9019 isaac87 retonar2 retonar1 s3freeintnj ipaydaejimobile1 withpace3 jsy8656 go7art8 go7art7 go7art6 go7art4 dero bbolemoosky1 allgreentng2 purperi3 s1devsdg ipayhybridin guqlrnt bizcsijang yeonsung-060 kaewoong1 amazontr4268 venus2259 gw-10 sodosi blackbean2 mielmp sanyaco2 seeun003 miga01 skingifttr lovemina antikimchi1 hslv06081 rksehfrns4 snnet7 jejuhbtr doobedtr6434 snninc1 pumpkh sungeun21 bizcenter11 zerogolf damha jokag ohs5301 killian2 gdmgnsun autotest haesung083 ysuri5 bctraders dirtydelta poongcha1 manchu99 sam5284600 eyo14682 newadmin hacker0 sey5624 snnbyn tpoo8350 brush foxdiy babywish12101 gametoday6 sugolftr gametoday1 dajoajoa2 dajoajoa1 rnfanf823 sony723 jackie2372 najjang9 artwell10041 hans1544 ssuissui6 ssuissui5 mi07285 roastery2 mi07283 mi07281 jooh12 p999123 myjuyer kyoun1230 collw3 bobbymom spacenoah jbs0609 hampil771 cardupdate siriusfrog2 ddengali3 s3freeintsky seizerdlek1tr sejinkorea s1devman reagelab godo3d-039 kcompany1 reytak sgv ibb vvmmvv8881 nabiggtr7399 civis hankrlee godo3d-030 opstree s3freeintsdg chaiwoon wlsdl04181 nutraone baeksehoon3 diolla quiltvalley godo3d-020 davin beautytr2068 rendezvous sensekw ansholic1 cjh05101 meatnpeople godo3d-010 iamcontr9499 djembe lily7979 inno1121 inno1116 neotest2 moncrotr8732 lili1206 foxlovely6 jayeonmiin blucelee2000 jiae71472 wellnessia jonga1 yim04252 interbrain dbstksgh09 jnlee yh710404882 yh710404881 slko10041 powernike nteam3 nara2nara hjretail cmchair2 moleok20 hadam85 moleok13 moleok12 myanb17 myanb16 myanb15 myanb13 myanb12 myanb10 mrgravy photo-story mslalala tkdmleh3 tkdmleh2 kitweb-010 eg6040 mlist maycoop1 lover830 helenoh3 tripleo silverheaven kliccmart bioskinceo1 s2mile s3freeintman cooks garyong4 planm70001 hucheum artmusic65 bananakiwi tymca1 pulmoo aromisua dingcs powernet1 inspired designplus cartoon74 creep kds7606 kizstar719 modainmall ustivoli imdm miz1041 smarthand s3devw a01066662966 hooyoya s3devp dist1 partyplace ds34 mail.crm benegen s3devm jusihyeon871 s3devb maxjojo31 ipayspxlwms925 ipayspxlwms922 ipayspxlwms921 kimchitouch nskway smarthan1 cameostar megapeak2 pvckkk eyesystem sa4318 simple9454 sellstyle espoir175 dcp4300 www.iceman sparkles enshriue2 enshriue1 pamcom okcnc2 moser ds123 michaela speed1234 djdkz2 midpoint ouruniverse brody donga natural2 vhost102 vhost101 apia gmini ahn6244 timeless phillip1 s076121 gac lukes yt assa blur ducks pannchat smartfree tears mistica win28 shibata bong webclass azel realpro joa89 aprilseven1 spornack dusty boyz wrmb12 brat wonilcnp kanade kyunh0 sport113 keunpb cmstory archv egold www.999 kamiya blender elastic movzeetr6058 darkcity mp119 redhatkill1 gamebobs3 daehanmusic lsa412 picupu10041 dimito gawaa2 kfaa2014 officeboy1 rentalshop huborn4 huborn3 huborn2 huborn1 younpark29 chl4318 js4u1 maryam doogie69 eppie karyban hopy5983 myoungdesign ihee08142 hellomagic sijjsijj sj50425 namph50 ami5407 recipe1228 foammake soccus midan2 godoweb2 x6 up2011 gaile wgna61113 gandu shishido koryo fixed hotsauce moldscooterclub besakura triplek11 replay57 innocence campingpoint dios mandala tserver misocorp1 crmdemo theyasmina provo.tile srvweb godovs16 www.za jomart tema76 jsgonno1 yali8922 ds24 hucenf flyit7771 hazen younguijung hkfishingtr bumilion9 bumilion8 cfmallcash x428ma pleatsme abaoaqu devit gurye100 nannuni85 kdgtl dm2 iocean20121 bulezou1 smpp6 politicas vsnl pony0701 sms07422 bodynjoy dona retrofactory hepimina plusbeam lavastone1 fire2 teafood2 mahim fourm smart3 drill partyween4 hawkeye9 paleum bilety giare wjdals5611 darkprince cat1 calverton thewestvillage voyager2 seie5687-089 godoshop-040 rumagirl jovial rmx twelve godoshop-037 www.bsec bambie silas hukiworld godoshop-035 alchemist godoshop-034 joodung godoshop-032 mongo1 godoshop-031 godoshop-030 godoshop-028 godoshop-027 godoshop-026 godoshop-025 godoshop-024 godoshop-023 limjh63061 hiex godoshop-021 godoshop-020 kekkon godoshop-018 www.hiex godoshop-017 godoshop-016 misba1001 godoshop-014 godoshop-013 godoshop-012 www.zel godoshop-011 godoshop-010 godoshop-008 godoshop-007 godoshop-006 godoshop-005 godoshop-004 froyo godoshop-003 www.thewestvillage www.copper www.xp www.twelve candyfactory udo autosystem nsd1 segreto godoshop-002 godoshop-001 amts lsw4378 skymoon1 kimjs28125 kimjs28123 igrp daejinclub enyo seie5687-079 omdesignkr mudra dfmaltr5155 joinmedical lnt eltpark1 cybermedic1 mail.jp vtf07451 heros malka kcroad1 kimp2 namph40 seie5687-073 seie5687-072 riken owa2010 tamura braxton cocco dangerous seie5687-071 lhy1pys seie5687-070 kctyb11 pawlitic daniella grain seie5687-068 kidstravel hyung05021 lsc4455 pharmsave wosung2 swpaper1 onlyyou3 onlyyou2 spoonz1 ranju netservice j8 lear mguess thetop seie5687-060 arttest italy2 italy1 polorl28 besttour grimm achim remover polorl12 gonatural gmc0072 dmsql121 miainkorea1 lovehome hatena s9356s chunamujuk1 uzumaki waterlily testhosting detoxkorea induk1-040 induk1-038 reorder induk1-036 induk1-035 induk1-034 induk1-033 induk1-032 induk1-031 induk1-030 induk1-028 induk1-027 induk1-026 induk1-025 induk1-024 induk1-023 induk1-022 greenb induk1-021 induk1-020 induk1-018 induk1-017 logosmart thefacebook opportunities findme geophy simbata anonym snowwhite pfa maplezone induk1-015 induk1-014 induk1-013 induk1-012 newfoundland induk1-011 248 fiddle induk1-010 induk1-008 induk1-007 riri myzone plutonium vendorftp happyman pp2 mailcontrol ratio induk1-006 induk1-005 induk1-004 skyweb ironwood nara118 induk1-002 induk1-001 jpboom cellexc onlinemedia seie5687-040 ecoearth smilee univers esn dole creators www.camelot tanada azi joanne jokong kimbok10 sisgirl parkhawon handostr8771 peace96902 izzy08018 izzy08017 peoplenbeauty micasatucasa dresdenpp1 koalamart withaylatr5289 thecristal iphonern3 spec01 seie5687-030 sensmall jomo seie5687-028 nonggigoo joven091 rnlqls06 zenheist novelty1 good3931 cahaya colorparty002ptn biocospharm seie5687-023 saku435692 seie5687-021 bdsblog3 massacre webdisk.chef tenichi1049 daisuke140 seie5687-019 cuwoocuwoo hostingblog bugtest svadba jazzy superadmin webdisk.fashion swacom2012 dotmail parceiro sktoolz emsp12053 seie5687-012 www.wh pimpin moonstruck tamworth jetty cgj servertest knchintr9652 chocolat totoro winserver kabel isty iwork seie5687-011 ahi guard2 tricounty murapic loadtesting fs9 nashua facebooktest vanessahur pluse marchen serverhosting254-239 browns seie5687-009 h128 rp2 keroo blr woodbury popov georgetown knigi ed126861 a-dtap.www dev.ident revel itsti fwupdate mspark3 a-dtap.klm giftbaskets tenorio sankei estargolf1 mspark1 ci.dev collie lims7738 wakalee bartlett nutter chemics sommer ferienhaus webdisk.adm myvpn cress imstore4 harada prev ml1 choianne-010 ahabeauty ili7067 seie5687-001 pepedeluxe1 moadesign002ptn clark1112 09jungle ahn4817 qtmagpie1 kkimkki touchptr2555 yg2213 innofoodi fruitage2 kkang75652 aux semele gestionemail.pec houchukyo pos2 s2fsdevsunny peg shiga iyatoy shows pablopark apolo25 piao x60 slt xfb citylife v13 samaa v7 syokunin czj erebe sfj natukorea oneweb hushin2002 mixuk71 k2cine1 yhahsw gmgleeyz neree fzb maruko steropes kplaza jcj court jgj omykeytr5098 brontes saika namph19 frontal1 optima2 lcy arrows optima1 fujinokuni packsun2 xen01 dedale bujaok1 eje micaad itree susil nesting saher seohae1 cms-test search7 dajungmotors levanthanh john11 gentoo loyforever3 mail.store loyforever2 loyforever1 stock01 logger2 msg1 autodiscover.domain wedcoupon awaji besthost wping515 boxiz0013 boxiz0012 dealernet ghktjdrldjq pc8 astech2337 www.ies ubytovanie autoconfig.domain mgw2 spak arin0822 xyglc vw2 webdisk.map urushi itory baoming taihei lijun dahanoo geryon ruter tkatka33 pagodapan goodhope2 billboard ysxy iol zbb www.rajasthan rajasthan qu smartfarm lamda durian inger iao wega tyxy economic sqlmonitor votus12 jr761 dhrwngmll2 dhrwngmll1 wbw cartier07222 yjcjms2 icbc netcity webdisk.ecommerce su2230 palikorea airljs2 reception webcluster always airljs1 itwiki demoofix gananhan zhibo soban5 ruthie fujin soban1 adsimg tell www.nour kislovodsk greatmunkoo pushkino murom villainy yushin korolev komsomolsk-na-amure jengokk5 comodoto pervouralsk seiko ooollooo81 zooone426 filter1141 bodapnp h001 beniya jhsi10044 essentuki desdemona www.ppma gratinus dreamlandco rsmc hlssci www.scarf evserver01 scarf ag-control wjdxodid tcvpn www.eat kbmtb photo5 pinhole elimsori itmro ms0107 ez2 bockhan md02 hcglobal md01 vip254-9 vip254-8 tocarpianoadmin xn980b51ng3co8ntr weblogsadmin bakingadmin blocs dreamdipot gusqop aorwn6971 sjinsji joungage sn3 ilove471 soul3523 forceout1 jewelrybouquet ythsun gumigagu iucon midtiti sjsearch freebiesadmin habosae copyrental oh72184 oh72182 oh72181 haemin3425 mhr gaylifeadmin powerkjin usconservativesadmin jjaturinamu1 useven1 online-booking grandparentingadmin overce1 nob mwb anh-mobile anh-t ipodadmin gi414admin gamen anh-ipad a-tha-2410-hn bornstory gosoutheastadmin hong1 gi165admin jjtech1 traveltipsadmin dsn ndt giaithuong1.diemthi listadmin goneworleansadmin asumi moneyfor20sadmin distancelearnadmin aichi astrologiaadmin lsp hnth hinhanh1 urbanlsladmin naracnc3d3 mhjjyy lsc3103 ctc825 hajung486 polostar1 kurage govancouveradmin waterqualityadmin jayecas.users genki decoy mefistofelerion.users gi92admin mcprepacc1 webbuilderify.users massivegreyhound.users bitcoinbear.users another.users collegefootballadmin gi282admin kidsfashionadmin mdsuburbsadmin saikyo sexoadmin www.tixiliski.users budgetstyleadmin gpsadmin www.ddfgfg.users sjdns2 pzh sjdns1 fuu www.jacqui.users cooperative fx1 bateriaadmin asakusa uktop40admin www.tombutlerbowdon.users bto bagus dancemusicadmin www.fastukhosts.users dineroadmin boxall2 viewtiflow1 dsyo331 joocorp kato6 gryphon gfgf2001 istn1 family1 mil3034 edorostr3920 oneorzero004ptn dc79231 impuestosadmin leegangju jnss80 gi408admin mirador moadesign001ptn midong262 midong261 kasma itisp annason el19772 yjo09061 aa09030903 kijinceo ipayjsegn hyflux6 hyflux2 duggy74 hemplee1 sbycs486 eco1004 smartedu3 smartedu2 smartedu1 abp oddpactr5315 macsadmin jbj19992 gardenhada1 grimothy.users kca gi160admin helmet ctzone mdi.users chistesadmin maeda www.highaltitude.users autonet www.webbuilderify.users bbspecial asahisouko motivacionadmin publishingadmin www.rohit.users coptvadmin autoconfig.futbol new.newuser.users autoconfig.musica autodiscover.futbol polkadot www.roy.wang.users autodiscover.musica tenjin mentalhealthadmin compnetworkingadmin www.demo2012.users dijinkumar.users telephonyadmin aao gezi couponingadmin macallan nat-eduroam gi129admin foad webdisk.eshop www.rayalgar.users ldap-ro im21.users neelix guinness autoconfig.eshop autodiscover.eshop www-cache-out-all www.testuser.users bebidasadmin www.abanob20.users starwarsadmin www.anamul.users searchnode gi86admin sheldor.users drupal.rohitwa.users swc rams.users nydns2 jjy nydns1 zave10.users birdingadmin chat8 vidhyasagar.users chat7 escience www.jayecas.users www.bitcoinbear.users chat6 yasirakel.users chat5 dzp gettingengagedadmin www.tmedia.users esstest guidepolls bizsecurityadmin www.newindian.users irfan.users vserver11 drawsketchadmin testuser.users vs36 skidki www.newuser.users www.blog.yasirakel.users chicagoadmin www.drupal.rohitwa.users immigrationadmin cruisesadmin videogamessladmin chessadmin marriageadmin gayteensadmin gi403admin vgstrategiesadmin nica.users militaryhistoryadmin gi154admin britishfoodadmin ddfgfg.users trabajoadmin hydrasearch rockclimbingadmin usatraveladmin gi81admin www.michael.users gi271admin www.kouprey.users celiacdiseaseadmin www.adcbs.users cravens meatandwildgameadmin samm.users bssp gi490admin abimassey.users www.rougugu.users teenadviceadmin huntsvilleadmin webmail28 magento.demo2012.users mmsoundadmin gi387admin classtest www.cretiveadmin.users gi148admin gi450admin knittingadmin collegeappsadmin holidaytraveladmin vserver12 www.shanerhodes.users vserver10 www.joon.lee.users beta.calorieconnection vserver3 www.testluke.users vserver2 sitebuilder1 hbh www.imycro.users probe3 careerplanningadmin baproductions.users eastbayadmin chris25.users trial-54a4f1.users multiculturalbeautyadmin www.nevercry1.users candleandsoapadmin ennuevayorkadmin www.rett7.users voice1 sw7 www.another.users gi265admin www.widgets rubyadmin punniamurthi.users london2012 househomesladmin eis2sip.users personalwebadmin goeasteuropeadmin prmcorp-forum realestatecaadmin southjerseyadmin anamul.users gi382admin xls tmedia.users www.trial-54a4f1.users realitytvadmin gi143admin maroculous.users goisraeladmin mysterybooksadmin boyscoutsadmin www.baproductions.users seniorhealthadmin jacqui.users hojasdecalculoadmin sugarfreecookingadmin budgettraveladmin gi70admin holway.users gi498admin tvstream pny100038 lovehope gi260admin ddrmabu2 seokamzz s1shop mi07286 lsjholsj paekguy042 godoedu48 godoedu47 godoedu46 godoedu45 godoedu44 hnaksi godoedu42 godoedu41 godoedu40 godoedu38 godoedu37 godoedu36 godoedu35 godoedu34 godoedu33 godoedu32 godoedu31 godoedu29 godoedu28 godoedu27 sakkoulas.users proskateadmin pestcontroladmin horrorfilmadmin alanadi santarosaadmin ekip www.ekip www.phpmailer us3 piligrim bluesadmin wallpaperadmin gi376admin corporatedesign indianfoodadmin videodev gi137admin mobiltest friend4ever gocentralamericaadmin asianamcultureadmin eddb.team www.workfromhome tatuajesadmin godoedu26 godoedu25 godoedu24 godoedu23 godoedu22 godoedu21 godoedu20 godoedu18 j2ydiver godoedu16 godoedu15 godoedu14 godoedu13 godoedu12 godoedu11 godoedu10 elnino417 jounga88 miyjs13 gehunhun iks10091 voguentr4621 enovia freshers homepmart allart5 allart4 arumsaegim2 soapschool jarrodlee kthkira lycos bodylink kkksi175 kkksi173 heasunggo mbp pkteafood bonolang mailmiso1 widesign1 hotpinky2 bujacat bbmy4861 skymap11281 gold8gold1 dbcjf111 snowz123 jadarmbi sym14701 tsgim7015 tsgim7014 tsgim7013 dragonjjw tsgim7011 healingsoo hyang777kr14 mare15001 pjs8642 justly2 image168 image167 image166 dil image164 www.magic image162 yudo93211 emit1004 ziyun1 giniginian ggo9ma1 mhj104693 gi9admin image113 image112 image111 image109 image108 image107 image106 selrana3 image104 image103 image102 image101 image100 sesdevsunny powerjkl1 csakks wooritelceo2 spacejkj1 isljh miclove1 dentalland zizity cd-rom wowgulbi3 djbank oeufkorea jo94511 gtmen72 seoes02 kwons137785 winca bayi lavka www.pressroom launcher rehber mclist useconomyadmin gtalk petr weirdnewsadmin heeland ws-test gi64admin gi493admin ukproxy gi254admin preemiesadmin feminismoadmin katalepsija ma2 ma1 hg3 rapper fl2 pa1 prabhu home4 musicaelectronicaadmin yazd goitalyadmin germanfoodadmin www.bushehr lifeminders gi309admin breastcanceradmin ruchit bombuzal bushehr www.devcrm ottawaadmin gi371admin bankingadmin www.cable www.lap gi132admin amidala goafricaadmin homeelectronicadmin nonprofitadmin filter4 ravehousetechadmin presenter www.projekt speckidsladmin paperless creditadmin secure.team detroitadmin myk uhstree 30pr1k1 s120.avatar gi4admin 7h1ck71 giftedkidsadmin ftpuser postad.hightech gsg-forum 5vsjz91 rhyolite zimmer gi58admin dicom wm_j_b__ruffin gi487admin holocaustadmin diorite gi248admin machardwareadmin webdisk.img1 nytstage1 groupbuy lagos gasprice web-1 computadorasmacadmin jeansadmin gi106admin gi365admin gi126admin theoneman cutegirl annuitiesadmin mobili gi396admin coco67 build.pages gi196admin sigil test124 socialinvestingadmin destructor nativeamcultureadmin intim wirelessadmin lojavirtual justgo gi53admin media04 saude gi482admin ipayjugmaru heyarech1 jasangbox3 jasangbox2 jasangbox1 dcjae83 enjoydog2 onlymystyle csh168 hwchunma1 allmarket2 orang1011 oneorzero003ptn cosstore whdlfgh90 xspiders1 smartdev3 smartdev2 guseod kch34p1 hoon3264 sevenhanse7 jnj3907 sshnad1 swtrading sweet88aa irshj zldry77665 yerangmall insun0917 chunghonline mailspooler limedeco1004 kwons137553 sysmax11 annahra lovegolf carrierzone garu12 homeplaza xrion20121 gadeuk1 sgcorp11 gfriendgs2 nokyawon hyungyu4862 winkcg5 jkim0918 hotaruru esumalltr pagwow dhcrace marbbal godotalk gskim351 yogodesign gadess6 yoyojjim1 www.garage kds3547 kmksound rayull pkjy1219 godosiom unisel98 fjrmal jasung3 dazzlingday gunwi4989 ht1216 momoyagi6 yurimgolf momoyagi3 api01 hanshairtr xunmei14 xunmei13 amashin xunmei11 xunmei10 mirrato hmsolution1 fizssy thegeacock4 iwanora2 magicart1 uncledum5 uncledum4 bizcilsan mpdpp661 oceanblue2 suyi5316 www.sahil lions777 dinplus pighappy hadmin.seventeen oskkage1 jys1994662 jys1994661 ssgulbi jpl3061 vanessa1 madeangel aorvhfl9988 crikit ross9006 vision533 vision532 jessie1010 bronzehousetr imarketings3 iambylee75 ssk2231 eversell cafemaster6 cafemaster2 kmrloveu kinglionjay1 jooheej1 rlatjdwk774 rlatjdwk771 sunspider7 sunspider5 fishing1231 ds49798 rkarkarka3 spomate rcn854 destudy1 kej8399 riravava seojiho3 seojiho1 gabimaru s4freedevsunny www.gurgaon hoon2203 jjbb1 logthink countryman2 jjanjjandc sogum92 pkwmyth jackie23721 seizerdlek3 airing2 skliving ld0308 premiummyth morningpond football1141 powerhong pulip123 powerhome larc1729 gi243admin play0400 sky27918311 sohafancy enjoyday7 kws79381 cheezsaurus jin2v teenketch1 soul1015 w3bmaster1 rayndy jphoenix03 maychao dio712 goldflower771 bkoutdoor antepost curious001ptn bbchs123 word86681 jyk1516 jinwoo792 cocosin17 every091 ujako810 nemo88883 ryan4ever012 lovekissye mailnew qkqh7z tem2ya poohluna mimi5791 cybergeni0512 jisy0331 mydccokr1 yeps001ptn cnhotelarv wjl1005 ssspsysss6 jjr09251 npblegift firstkks1 gopung7 jhnam gopro1 gcf200 pink1313 s1devmimi lpayton ksd0913 scmdemo www.expert mymeetr8173 shoesptr2592 park1555 kwons135843 yeng0827 nanna519 vellashoes3 vellashoes2 godoid-030 bigneovega3 snfood rokmcajh1 lannara51 kerb75 huccaci anytoy graceskms s3intkthkira kong078 godoid-020 harcayo1 mikael30 digitalhp ellipia13 oneorzero001ptn digitalgo wodms19472 everygoods haedolli3 gayafntr7917 tmbh811 joeundm1 digitalcp s2fsqa digitalck woori54891 dorositr5538 www.protocol yeil1101 humanbear anysky sunoak20111 centratr2549 newframe nicenury1 potterjj2 cafedavin noblemobile foxlike9220 cjrosetr0389 hbsfoodold yokurt9330 ermac seoul20133 ippum bsm7801 p4-all narangbu1 iktc5539 prodrug1 eventrain2 gaigalu9 gaigalu8 gaigalu7 gaigalu6 gaigalu5 gaigalu4 gaigalu3 gaigalu2 gaigalu1 kjh12143 garam70702 egland soonmin2677 semir06152 semir06151 lightvampire1 tkshop-030 tkshop-028 tkshop-027 tkshop-026 tkshop-025 tkshop-024 tkshop-023 tkshop-022 tkshop-020 tkshop-018 raycop tkshop-016 tkshop-015 tkshop-014 tkshop-013 tkshop-012 tkshop-011 tkshop-010 tkshop-008 tkshop-007 tkshop-006 tkshop-005 tkshop-004 tkshop-003 tkshop-002 tkshop-001 kalee995 canstudy indasom231 imarketing071ptn snkc1594 neeke5435 oeufkorea5 airpass7 skyladder14 brandfactory kds1480 miele6363 hanjubnd www.debate skyinfini naturekorea schooltr7902 hym1987 horsecore anynow hanjumalltr hklkjs1 mn7654 jiji05021 gma21 lagon2002 digital4d havensports zerotest-005 zerotest-004 zerotest-003 zerotest-002 zerotest-001 phobiasadmin thegglim ok00yeol3 engdevweb mentoree3 smassa1 mentoree1 kjhzzang102 kjhzzang101 cocosheis ashgirl godopost enamooselffs invers132 hada114 woosungdt mhm518 ganainfo badamokjang pjch9472 chocolab wingpet ellimtrade leavemealone2 khgd2743 nekoidea purplehands1 chengik2 chengik1 mervert3 lastchance1 iconsu swirlkorea1 joypaitr9417 kbng6852 ivycos qhdgkduf12 smartttr7541 prankencorea khw0531 jucy421 t48821tr1906 mid181 hanyinjijon1 limpass14 okyk734 autocaddy12 www.model gon08232 eatbag12091 csoulcompany lastfactory8 kwons134521 h85550101 glasslock1 s4freeintextacy fixisterhous bee20246 thsalswo1 daewony smilejudo1 dollspia bys6210 kimilgon103 shininghairtr bronnum badasatr7498 karuselli rainbow1004 netant gogotori1 jesusfor greensoccer hijkl01 servantjin hym1198 theshah netstermnc shoppingone barungil digdug tsgim70 imarketing069ptn dreamktr4076 serverhosting254-210 jongyeol mwseo86 canada79 bonnie2caret3 ju7023 yangjumal jongsoo xbtion99 www.experts cafemaruni lauradavis6 jin9805 jini8013 gogotony2 peace0945 opstree2 opstree1 gbk20731 hijungutr nggift15 nggift14 nggift13 oliveppo111 nggift10 mokdori2000 keunkim7 pradaas snowin759 snowin758 c4family k050326k1 celtashop seungsunme kdwood god2691 hyun29182 hyun29181 mrballoon hegaon3 ss2inctr0712 dudtjrdl1243 syncbird1 pspadmin irewithmall pys06044 rabombaram coolmercy hwabantr1679 vkvnflzk7 bird123 doozy2013 wolfnfox victoriash jmlotus3 decondtr7919 zazak0200 lsb7138 skinnytr4415 pjungmee smnews kent90 caviar11 hloety jan65681 jakespace2 mhotelarv serverhosting130 smilechan dufmaql kdk05131 digiwear2013 elccikorea redwolf7401 bestsupertr k217171 thesalt ipayjes11052 owlove79 poopoo1004 jongu72 zeusmarket s1devjonr puma0310 fitsladmin ilviet6 ilviet5 ilviet4 bizcjaegi wnsdmlx1 lureman m258ss smart11 lobchou702 mantis3171 jinline2000 ampettr0590 kjh09221 cpaparky1 kpmobile inptr indralee chatcentral jtoh7151 beefood2 wiki1234 s86017 modesto6948 iblind1 pkj3924 imys1 carebank serambank ljc7403 youngsun1602 jongeuns772 jongeuns771 wngks1013 ashelon egoodnature mazdesign smash47 parkhc005 zz6kies imarketing068ptn rvs4me hearing1 rujsh13 acerokim starwarssi hcg32 ryoo711 origin-mobile.devstage5 miracledu kpj7422 kpj7421 ssyannie1 yuni2901 king2112k1 lovol5 kwons133158 skytears79 sera2tr5034 nyfriend samlim62 gostmmr1 diekun bnjey62361 kim7866 gmb2002 baekjj24 mchang934 alcammtr0389 iamjjoon sofia409 kwons132944 sjae0111 gogermanyadmin wogus1302 dwpattern smurfet seniorhousingadmin bemes97 wezenbag blingme onchang1 blueboo thepuln chowonherb daewang harutr1420 relationsladmin waikikiboy5 wwxkorea2 inkoa baby1433 nystylist jonghap xsports3 xsports1 dksgytjd071 kate21c jfarm wooritool didrns s3devmimi rathers0609 sbh1692 kdh74331 biniwni repair2 llsell1 cheece1 djembes yena54250 bestmr91 ssomuch1 o8naman16 o8naman14 jongfal koreasansam hkfmbooktr sagazangg2btr coana91 mimartco hks0610 neosense lifemma dinamico kyungmin-030 kyungmin-028 kyungmin-027 kyungmin-026 kyungmin-025 kyungmin-024 kyungmin-023 kyungmin-022 kyungmin-021 kyungmin-020 group1 preview.equisearch disabilityadmin gi142admin messe naturelover punzer promadmin quebecadmin allstate saltfishingadmin zapatosadmin gi360admin purkat gi121admin guglzlo manage2 scotlandadmin angelz free8 tatar thyroidsladmin gi398admin loungearchive-forum filmmakingadmin rasol kyungmin-018 kyungmin-017 kyungmin-016 sexualityadmin info123 mhammede sys4 gi159admin chillywilly schizophreniaadmin gi47admin sanswitch conliv playsadmin grapple puypal fatherhoodadmin hp-test sasserver panicdisorderadmin kyungmin-015 kyungmin-014 kyungmin-013 kyungmin-012 kyungmin-011 kyungmin-010 kyungmin-008 kyungmin-007 kyungmin-006 kyungmin-005 kyungmin-004 nationwide gi237admin www.customers samos noc1 kyungmin-003 kyungmin-002 kyungmin-001 www.multistore dimebag montrealadmin colours infomed aiman multistore womensladmin prescott costumejewelsadmin eventi concorsi diehard sociologyadmin dogsadmin anissa kidsinternetadmin healingadmin golftraveladmin abdulaziz consoles 160by2 consejosamoradmin wjdals6626 kim7309 violleta1 rerfan vision11011 serverhosting254-200 kys901 there80 watervis1 young1107 p098792 terracoms2 yukkuri77 vinegar2 pacoel lovemary4 kanggoon72 anegels9 anegels8 gojangi4 gojangi2 gojangi1 shpark75071 ilyfe kdk03632 ideant serverhosting-monitor ideanj imarketing067ptn edworld1 eightday1 kwons132275 gandg7 dnp3368 newcrystal4 enrental185 enrental184 enrental183 enrental182 gunahp enrental180 enrental178 enrental177 foodplat0897 enrental175 enrental174 enrental173 gagarin www.go4it middleeastadmin gi354admin esx16 www.ps3 medicalsuppliesadmin energyadmin gi205admin midlandsadmin culturecafrancaiseadmin gi42admin gi471admin type1diabetesadmin altreligionadmin shuzai.americanhistory allaboutbabyadmin disciplineadmin bestmusic mensfashionadmin inl papps cyberweb mutualfundsadmin amz gi348admin vif alena rugbyadmin aaabbb rezgui stroyka shizzle enrental172 loverz enrental170 enrental168 enrental167 technoworld fanny hawk2 phuong wear ittest enrental166 enrental165 enrental164 enrental163 it2gpc-039 it2gpc-038 enrental160 it2gpc-036 it2gpc-035 it2gpc-034 it2gpc-033 it2gpc-032 it2gpc-031 it2gpc-030 it2gpc-028 it2gpc-027 it2gpc-026 it2gpc-025 it2gpc-024 it2gpc-023 today09tr6057 it2gpc-021 it2gpc-020 it2gpc-018 it2gpc-017 it2gpc-016 it2gpc-015 it2gpc-014 it2gpc-013 it2gpc-012 rbmart it2gpc-010 it2gpc-008 it2gpc-007 it2gpc-006 ezpoint2 ipaygandalfwr1 it2gpc-003 it2gpc-002 it2gpc-001 zero21631 dkmguess xacxac1 cheol1987 lover5 dgweb1 hmdo79 bipumntr4004 cacaocoach ddkcmbb hjh0328 mienki13 sillabath lovej2 bdangam foavm83 pinkmania hurun2002 myhome6660 jongtae1987 jk48041 regenskinmalltr fortmyersadmin gi110admin office365 epishon exa gi480admin goasiaadmin providenceadmin bingbong britishtvadmin paramvir commoditiesadmin sportsrocket2 anass abbass as7ab guglzlos chrisking tawfek greencleaningadmin sezer gabvirtual s001 colbasketballadmin bintang gi36admin gi465admin parasite literatureintranslationadmin podcastingadmin gi226admin photoservice www.proyecto ued communityserver wlp womenshealthsladmin internetgamesadmin rickon endangeredspeciesadmin roca gi330admin gi130admin md6 imr straic lamaison honoluluadmin md4 dumbinlove kei7167 rlatnswk241 ided93 rica ilplustr8773 lifeib1 lonsomeyez7 agnes0927 hdbike thegeam3 arariyon gumgee samsung2528 moadenim venta21 n1234u midasclub kwons131750 lovei101 hnkcoltd lovebin5 familyup3 kkozzam2 soda41671 jebl4 anjunara jebl2 pinklive1 ladymatr6788 worldline1 imiz2 biolink1 iltam julia701 yeorimong2 choicetech popshoes homedvd4 mencheres2 young5563321 winds61 ebestone s2pintmimi manu10251 mysug66 kyjzz1 demofree miniorange1 miso0530 jnslife1 haenamtr9809 greenayon1 buyinktr6518 yehdam2 sprendid71 welloskorea likelove0808 md3 suntree8 idea08 miae07065 wowgita1 kangje141 sweet3273 wkaxld072 wkaxld071 cottiny wkaxld067 kwons131413 wkaxld064 wkaxld063 wkaxld062 wkaxld061 wkaxld056 wkaxld055 wkaxld054 eliphoneadmin wkaxld053 interfaith4 interfaith3 interfaith1 medifoodtr youngchang01 joj159 wkaxld042 wkaxld041 sjhjjang09241 wkaxld035 wkaxld034 byeyourjune26 wkaxld032 byeyourjune22 byeyourjune21 wkaxld022 gogumatr6368 ccimart wkaxld014 wkaxld013 emqodqod13 cartools77 wkaxld008 kibum613 wkaxld005 soj8111 wkaxld003 wkaxld002 winnerywc swkcygbha kdh72791 dfriendd dmsrud2131 bigredkane heypon3 dnftks9du skykeep1 jjy6632 msa3580 europeans001 s3devh newevery ewok dict12 brandvideo1 enbmt77 schaefer milkhome inwoo09 gi343admin imarketing011ptn oohiro1 suntrade koreafarmnet cbrr929 madkorea aauxxkorea stonektr1082 kyh43306 kitweb-020 starsign theone5 check00 gi104admin rlatldud331 mhfishing1 a1bike1 pen201107 chichoney tomatored1 jubzone bejjang194 bejjang193 bejjang192 bejjang191 lsb4101 shezbag biotrap hl3qyetr6194 nanum79 dbstksgh091 jks710912 neoscrap yjcase1 aonecare alal8334 rkahfn1 icovertr3582 jnlee6 jnlee5 jnlee4 jnlee2 jeime207 jmmug ehwabun necjjang1 okeedokee comegie3 hoontop btpspic imbag citynlife5 citynlife4 beautyus eno0915 viridis5 squareone001ptn rcvehiclesadmin jbseo icleen mindstore www.selfservice cnitech sung8815 bellhyo evanjarin kwons130569 kwons129565 w680727 filterdm pbhfaith winnerspo tower12 tower11 webdisk.testsite kobu2009 gi276admin spanishfoodadmin reon2k1 s2bike ysh2030 troylee2 melodicpia beautyhs yhoon0011 kfccc0 godomdb2 boblbee lng4132 tinymart1 s3devjonr lsmint1023 tealim sjh20821 nocturne12 esll00 mykingdom2 powernike3 powernike2 luxury9746 hmaum1 shs51421 geoocarina jyj4599 pagold74 applimate jhflower1 pheonix testprepadmin nydsosweb6 nydsosweb5 nydsosweb4 nydsosweb3 saadmd nydsosweb2 nydsosweb1 webmail.staff gtw router1v119.zdv venus2 thevampirediaries internationaledadmin gi31admin gi460admin elmohajir rdr searching letsrock ukhumouradmin router15v20.zdv surfingadmin residentevil4 gi221admin lovepink birdfluadmin minkyou2 bestkim7 bestkim4 rlawntls12 facepencil.co.kr bestkim1 godomail beyondschooladmin mana09761 imarketing065ptn cl3 lsa cl2 ecosister cpswo3 bellacottage3 ucat cl6 canadactualiteadmin mawahib cl4 ffa ubid infectiousdiseasesadmin safira atlantaadmin hpb sportsrocket dztimes afr achref cl7 gi304admin enmexicoadmin christianityadmin webcfg shewt888888 dspam charting hope2 votechadmin menshealth gi337admin marinelifeadmin bbfamily webdisk.join infofinder anjoman folding homerepairadmin sakthi tutm qwerty321 sameer bibleadmin e-v07eawm14601.it mugshots sk-joule-office-4250.its antoine baris e-ssrgmrrq4.physics e-v07faskadmin4.it h-s-h001801.humanities skincanceradmin e-sskd9w583.eps sanuki seniortraveladmin childrenswriting e-swm011902.seaes arfan c-s-148-146.csist www.amal jett h-p4-ax-m4555-146.its as2test mujo h-a07huh005450.it ftpnew bellacottage2 smeiwonn stata outsider7224 firstenc1 kim5058 statictest haeyum93 hmarin apaya9 apaya8 apaya7 apaya6 apaya5 apaya4 kim4858 louischoi2 jini3792 mm4mom ddacco1210 huead kwons130045 moronokimi sockspill innoffice biotis2 jini3701 mulkunamu bestyj id3812 shmeditech pabang psshoe focusin35 dog1036 giman018 schooltr2576 manimore1 mammutyjtr6015 bestnz www.credit ynjynj63 hadam851 yuseunghun1 gdtest-052 ckd2131 coffeemal3 mylove1053 hoyang1999 gdtest-047 jnkcom jbiz8 jbiz5 prfishtr0601 messrs7 wlfjddl46581 jjm4555 dayroom gdtest-040 yeoinmin414 dingzzz gdtest-037 openmd64 stockhome1 ctw1013 headcom1 neoad1472 huaco temptutr waiguo88 gdtest-030 newoni1 l-v07xx7g6yc5j.it c-tr-wm206.csist m-a07hdb7jl35j.it e-ssr065602.physics mailsql windows01 chef-test h-i07huh005110.it rizwan h-s-h004012.humanities l-v07xx3192nkm.it www.wz parabolica e-s07ska16e001.it www-int mail.sp abac quarto webdisk.encuesta australianfoodadmin familymedicineadmin healthyheartadmin satpal redundante00 satria redundante01 fdc12 fdc30 mdurohtak saumil fdc29 willi fdc43 fdc59 drm2011 fdc98 dervish detecka pesquisaclima www.pharmacy selecao portalax e-p2-sk-m4555-076.its saymon l-s-a000324.it participante moviestvcanadaadmin cheurfa h-s-h001400.humanities tsqa tsrh aplic tswa spanishcultureadmin gi25admin ecrmqa vcalfa gi490 ftptemp e-d07eawm0275b.it e-v07cmcytempa.it images01 massinissa redteam fdc123 paex anhtam agendamentosala altecrm h-p2-ax-cm6030-111.its gi454admin m-a07bbc7jl35j.it aleksandrov arab4ever mcl c-e-230-029.csist cawra lembaga h-s-h003927.humanities egowennasb2.it dragutzu19 infinito iv gi215admin southamericanfoodadmin arc3 literaturainfantiladmin gi339admin tget sbinfocanadaadmin atsil gi332admin redzone svb www.w2p que micro8 micro7 tnetworks goparisadmin schultz collegeadmin women3rdworldadmin kidscookingadmin ict3 oris qwerqq ict2 motorcyclesadmin monte banvatoi stayathomemomsadmin regedit olympicsadmin naturalbeautyadmin breastcancer zerkalo ibsadmin micro9 mobinet seikei sfadka student7 newcms seldon nguyenhung draugiem sde form8 gi480 dif clickmyheart m21 theartssladmin m22 m24 m25 nyfreelist1 m26 gi19admin m30 gi448admin gi210admin gov2 gameboyadmin lkpfdns2 lkpfdns1 civillibertyadmin modamer traduccionadmin www.annunci skincareadmin guidetraining hoai polisciadmin settec romano childparentingadmin webdisk.cloud classicgamesadmin webdisk.advertising stressadmin ronggo nyrelay4 lb-dns holidayinn sexbeybe vexim testing101 serverjava nyrelay3 nyrelay2 kimokimo bakersfieldadmin kidsmusicadmin perfecto moderador rose18 antic devzone dkny enrico malluwap ispconfig craftsforkidsadmin optin copacel runningadmin grapevine.specials shahan shahin gi326admin shakir bachho spanishadmin gochinaadmin shamil blogwide ywfas30951 antilo jimi12341 moonjins2 wsryou212 simazeri naniwajapan2 ohsfss gdtest-020 contraceptionadmin songee151 apple1772 automatic1 gdtest-016 chair119 tworldtr1859 cynical11 linuxand white1tr8989 a4dc12 kungjundduk gdtest-010 peterpapa greenbodtr uminpop1 punnyshock goldsoccer1 oiioii erst30 ddol50 minuse1 vonokotr1787 autodiscover.lync buzzz71 ndwor265 anpkorea yoohj2891 jake0929 tree4smart imarketing064ptn metro71113 s2pintjonr s2prelease s1intp manager2015 vincaserin besnow italianadmin partyhong newroinlt dirl2000 sobombee hudullini1 nemosuv1 apollo6 kkduck21 ysh0505 germanhorse asadal008ptn sorkjoo2 fptcmfkr1 hanseol21 sheeker real2009 tsshin80 nerrmoa nemocase jinutech jdy36383 kkj13574 spodaqtr9175 kgecho1 ivy622 dibaoi csl0398 bella26 dc2347 s3freeintmimi gui5859 jewel8351 doctoralex1 honjjang2 honjjang1 dadana001 issuetracker hskim herbalwife daerimi yeinwine renny41 thence1 hoonbro sung7022 ysun920 smandsw happykenny beautifl yearimdeco1 hs1624 kwtechwin2 schoolbee1 st0607 hs1608 jinah615 ms1intsunny abcmusictr hades2 kyoumetr9835 ibsk22 quad4813 ansimi themeparksadmin vegetarianadmin perrosadmin internalmedadmin simonandschusteradmin gi443admin jesus923 mn1126 kim333a strental osong789 ms1devkhs godoedu50 kyw88371 you03161 pakmunsung1 edailyedu2 edailyedu1 craft5 beside gaimod usoutlets gearlounge2 kkomahouse nyshair anshim skysuf jnhsds ttiik04211 dwarflee1 techdata funnkids4 funnkids3 funnkids2 pointdecal dmsgk0728 asadal029ptn seohyange424 amidami8828 kimchealjoo1 napsmalltr h780405182 itdanatr8676 miss-chocolate ub0222 boysnice791 kmyungran2 scfactory todream072 gniland1 fineseafood bike20003 togetit4066 oio486 divedicehd dosox2n indsystem2 indsystem1 hipdeux1 hoolv33 offician h8100210 gi194admin wargamesadmin jun-jean voice0809 okgotr3676 yjs51616 ipayneoart12 nanrigo vyplus ninety89001ptn viopapa1 kd44573 jenpaulrey polishlove konadream smh4866 solarzen1 badman shazzy punkrockadmin badrou realestateadmin loungebb gi321admin campusplacement punkmusicadmin newsblog www.demo5 banybany mekhamata securitylink ggupdegi ultima55101 anrnf1 dyingadmin simontasker bandbadmin ngagutr mik1171 dmo customs yahoologinpage presentationsoftadmin won30051 assa5733 lee11362 dmsgk0315 koreanshop24 daytrips1 rvgolf sbk2720b3 twowax officeoa yhm00001 ecoholic cheek2cheek1 cdcomco4 prmart24 kim2581 wooripets kbhstar ysms8167 livejin052 pkh2002042 ohmytrader5 ohmytrader3 serverhosting202-69 lim65281 s1setuptest concursosadmin raning2580 peterkhsong hive781 golfpeoples firstchic jini01227 kyo199 dodkdnjs1 slowj3 nuntings2 nuntings1 ydltmf07101 gbm33044 thyme63 rura98 mytujana cjstk6671 solomon4u pane001 benehost ssong2127 park0207 ab1315 designpixel jaguarlim1 jin22yo tymca11 botzim2 botzim1 youngkey7 suji573 cotorro space87674 space87673 onefamily www.educatie americangreetings www.servicii citate vavagirl tkcjsdhkdtk1 minjishoptr shoocream mysopum morningheim noorymart wis2st1 proyare4 polodona triplelife gagus3 imarketing062ptn redsky06242 mosaics7 mtholdings1 ipayungiuma71 nom03152 banikong tomogitr7757 manyotr3217 redbetar2 redbetar1 molylove001ptn jini0902 helios1201 dumpout1 jbkim25804 gaguae wjdals66261 dlaehd12342 looya1 lemontr2 oihj25 smfrei ipayidreamtown ilpumctr7356 indra2k1 anibigtr5444 mgarden starhwang mj941169 dobicycle ojs18071 cbx9001 byjay sdeah094 jinwoo7925 gadimbs wleofn10042 wleofn10041 okxerox trustline1 kos1191 seichong dingcs1 songother7 ljw0709 bumilion7 oiuokm3 looup3 uzi1003 funnjoy11 mungmung79 gangnam7879 gksdkfhd theklee skygg4 skygg3 skygg1 dla8909 tool2788 khc74460 shyun29 baruncorp skyduk newbeing03 ganzishop7 twomax www.citate ldy980204 csakorea jreat6027 hansan00331 cheeseadev jejutour twosmedi jjk29432 stdevmap ogambaby newerakr bkrheem park0063 kim1452 mac0615 enavisave hanadool12 sujipbtr6591 poloftr6195 mmcandletr8074 vip51-159 choi7901 artone2000 nicezip cocokktr7385 s3freeintjonr sathelper s3freerelease gi190admin have3031 anonymou dbsgmlrudz yyh63061 eulnyung dcgood3 s1m2s3 baekbooo guitarnet1 tokyoshop romancefood hijung761 konet762 jini0207 mac0420 guess182 guess181 mk10042 smessp feeling0841 yjh7611 youl0411 okcom02 shelko mfg seterecords1 ipattern namts001 happyellitr godoshop-039 imarketing061ptn godoshop-038 grandzone godoshop-036 godoshop-033 lsh002486 jeoldatr4599 tyche862 gucci21 godoshop-029 sejin9898 toppatoppa s1devextacy hyejin1 jjpfartr7334 hairsootr chi1019 godoshop-022 godoshop-019 cozcoz cmy22953 godoshop-015 micostr hahajinwoo84 servicii hstar44 dafm414 dafm413 nissistyle rhkdsutr4690 hkorea kwon7717 erosis domaedtr1856 leejaeheon hwrkorea najeeman1 rich2girl anandatr5825 iraf1010 famertable3 famertable2 famertable1 songhiii tjsgml66371 kipa1234 bhhanyang smscenter heba0905 dydghksgl4 godo98104 sodamon mmagpie-049 s43200542 migabetr2372 clearwater1 wmozart sparrowbear1 binudduk enuri4989 kdong7 heejung kay1239 hkoon1 tourlv1 gomnfood sheonlee kwon7425 artbrotber arienail yjs34601 gnstore1 iljinkorea2 four321001ptn gg7772 jje1324 majortn simuri121 cheyun5001ptn iyoungmi1977 newsz easyworks1 galaxy-dev s4freedevnj hknuz3 horim aloe0504 godotechnari tec486 worldmtb jin1232 jin1231 prmart38 prmart37 prmart36 pyw3658 multex prmart33 innerweb adamgirl prmart28 prmart26 bjb25404 bjb25403 bjb25402 prmart18 prmart17 nerois1 bdtkorea laskastr7912 she135790 smarthand1 wowmin-020 korina21 judy8098 s3devsf cometrue101 dbwjd66602 s3devw2 polobox2 cooldaegon1 hdw0002 womenshealthadmin romeoja3 s3devnj niceman0081 usu007 metrokrtr viewzone ifood kc93isc blazeguy11 mobicrtr7531 imarketing060ptn dspkorea wowmin-015 minzoro tnr1214 chaerripo1 bby8047 gpfud00 pharos03067 pharos03065 pharos03064 sonjjang77 pharos03061 joc911 enbmt78d enbmt78c s3devh2 enbmt78a hyperi99 najukim4213 enbmt77d enbmt77c enbmt77b enbmt77a issac00 dudunna yup0233tr barry.dev psd24002ptn armani0823 zabes07 isolmgtr0449 kakaofuck18 asiana69373 sh7686790 astrogate wowmin-011 bniwork imarketing009ptn yikyupok wowmin-010 life114 gmbservice monchouchou nanoids sheslee eartprint doheejjang1 myphpsql71 logthitr2949 godofont kimchitouch1 bagpia3 ipaylsh7921 lks99273 lks99271 stylish247 gootboy ss10299365 sd794615 ss10299362 ss10299361 ieonet2013 yjh6128 namwoon newsoul135 ssshimmm2 ssshimmm1 clear2300 egolfmall1 casa2580 mmagpie-019 steaven6 steaven5 steaven4 nii25846 rangin cc112a30 cc112a28 cc112a21 lb1laxtest ohyoungkr cc112a11 ikj05184 micofus wkdeo8605211 ivylandtr freeonlinegames redmaster web2.lax goindiaadmin web9.lax startimes2008 mc.lax wind526 iwell4 oprahadmin kcsport ksm51362 nicehs1 bluetangboy freekhju3 aga7878 junho42791 metavox2 metavox1 naturalpromise chammidia1 asa4821943 dmboshop un50251 hanjinho icloset2 bancet bandel web4.lax lb2.lax lb2laxtest db1.lax jobs1.lax future125 web6.lax db3.lax chorus400 bdagape gododownload sung2711 kwons123452 sellstyle1 jinwoncctv2 sajbco1 boss76772 ibobos jjsofa2 hcchae33 induk1-029 yj5575 mmagpie-009 polofactory bizkim1 kreesys ubridge lstrade1 chapter32 ibobo7 anskintr2156 morefun01 wandobada induk1-019 azzi425 imarketing058ptn induk1-016 wejangtr3554 gdpants delarei donghun72 newav thefemme securityteam web1.lax web8.lax lituretr5901 yootzee joomla30 dpsearch tamana lowes gi437admin kansascityadmin ltest.team gi188admin webclipartadmin musicadelmundoadmin juguetesadmin pcworldadmin ocdadmin archaeologyadmin sowyen5 stay4321 psnavy induk1-003 dance1004 kittypaw2 xofkd002 nicedob icedesign5 icedesign4 cutyjina2 choi5487 yain77377 yain77376 yain77375 cristorper yain77372 bluecloset nesege1 frontier398 metermtr9539 kyh6501 actto7536 songfirm vivipetfood rooibosmarttr qkdrjsgh6 blessing1 ekdrnqhf turnkks2 heyjed1 e2n1one lagnn081 superdaddy ysj312 yhkim7594 ewavetechtr babynetwork iena1 ipaykimhega tear32183 tear32182 tear32181 whddnjs0483 manul1009 myusim web3.lax mfashion1 almighty1 longupzin hjg1122 bigcoftr9283 gvten ilikeshop gosteam3 gosteam2 fishvalleytr mixel77 woom2012 sfglobal3 bluesee7102 bluesee7101 jihoon00 s3intsunny tec20206 tec20205 tec20204 tec20203 tec20202 culturenet5 culturenet3 gi315admin bentouif web10.lax lb1.lax db4.lax yourcloset hcj1477 vldals123 thegioiso web5.lax princess4u3 jobs2.lax db2.lax web7.lax videojuegosadmin forestryadmin alzheimersadmin healthcareersadmin w800 bartek yule w214 kyungdo godosg-030 ycj0831 ezenbike lkfg776 donglaep2 hms9391 lkfg774 binuya4 maxion1 ssung2shoptr richaroma2 richaroma1 godosg-020 emodeuntr nexus75102 jigging knsydmaster thegray farmforyou ibikeboy2 alinekim sky70394 findpc jujuring2 jujuring1 ririkos fineds godosg-010 bell012 dpmax007 soulmie gaedle trazenkat1 starjung voguenewyork godosg-003 gi320admin conradkwon doslaos kpwell1 misscrow1 mininmini swgagutr italgagu jihomamma www.reporter imarketing057ptn gi235admin tarjan381 whisenplaza ra7al serverhosting20-253 s1devp bingsugirl73 serverhosting20-245 ingress-03.mx cha033tr2546 ipaykjwook7 willgolf joa891 ohs530 serverhosting20-197 serverhosting20-195 serverhosting20-192 serverhosting20-188 serverhosting20-170 bmhholdings choicelab1 dupimall mblog serverhosting20-137 twinz21 winner734 bioskinceo anzing999 kgol0011 gafilld56 icdij3 namuro1 gmu jizone2 hayantan4 maxjojo3 atree4u suhosgi skinzone ijy8282 zong bestcody yeeumtr designfingers bbrmom1 qoehtjd psr2x4 ssitmal91 oscal441 zzubong1 hommedi chrome12 kwandong willn413 gi432admin hardworking1 dongoodong bobdesign sport1131 akila2013 annbox withealthtr gi183admin eryberry aeroc17tr joa494 photogoodtr s3intextacy hanamu2011 tj3651 godoedu9 godoedu8 godoedu7 hjparkkr hojungga1 enfshop hoon392 godoedu2 godoedu1 selrana bl5253 gyunwoo287 jinandco rodiajp yewon09031 pts06061 dragoner jejunetr1890 creditoadmin kiki95811 knpiano1 anmira elfbada zoomcamera phonehouse5 phonehouse4 spacehue emote12 emote11 lee24192 limgaram2 csa251400 mdpromise pola1206 kbk14481 kmc9556 codegears midashjs ingress-02.mx mity0312 lkm5282 slr365 flower2580 hasimoto27 ebiztr4968 cubeintnj oipmaltr6333 mk05051 jun34784 leemiddleton h1a2n3 www.vivasms hklkjs washvath twins61 jinaleebbo hikiake3 bbosomtr7474 vivasms fool21c1 ksong83 schoolfun lucky8669 hakpower hpvalley wowwoman1 gyuho9898 cmstore2 cmstore1 gardena1 workusa merveil dimiwon iblind godotest-012 imageshack vidaverdeadmin parejasadmin godotest-011 bluevitamin godotest-010 bimp1234 aromari italiansladmin godotest-007 cicokorea4 cicokorea3 royaltyadmin gi253admin ingress-01.mx bicicletasadmin shibuya secportal infohelp neverforget murad a1webmail cadadmin a1mail roppongi zone100.cepi mandarinadmin jahanara gi299admin alfian iden2 marketing.team mhh1110 jukoline gtlife dosevent2 sejin5774 sejin5773 keongdtr7204 lntnet biomam2 biolink shutup gothailandadmin lb.www preventbreastcanceradmin miamiadmin autodiscover.g autoconfig.g www38 classiclitadmin gi426admin brandenburg dietasadmin nymph priyankachopra chelyabinsk-suu-rr03.backbone alfa-romeo gi177admin nicu rr02 math3 teleworker-sw-campus financialaidadmin snapdragon benevita2 benevita1 cplant4 dooob2kh2 dgmart yipsaac1 dgmax1 daehanmusic1 kjw5525 bejjang19 ok258025 lsa4121 uchoice anna18 alimotr1558 atonbtr6079 dakineshop2 yohanis3 dbsaytns smh731 iclay gododemo hostingmanage ipayticgirl swisswatches woorisai ohlady ssomina2 kimeraj1 artdepeau choin11251 jludia bluangelo leehansl mmmobile3 yjoung101 ohkids jung3568 tennisadmin swju555 schoolbee formula1admin unisum mflady ahj19752 ahj19751 lounge.team jslee369 tigersm07 officeboy11 mi100942 banybany2 jungubox hjudew whitehtr0803 proposals cubeinflux elitebasic11 copymine2 gilin575 sindo8710 toyfleatr enfantstar gonewenglandadmin paransys3 ipaykonvision kinoprida jikyjeon50 jikyjeon47 jikyjeon46 jikyjeon45 jikyjeon44 jikyjeon43 jikyjeon42 jikyjeon41 jikyjeon40 swingfire jikyjeon37 jikyjeon36 jinimall001ptn jikyjeon33 jikyjeon32 jikyjeon31 jikyjeon30 guava1 jikyjeon27 jikyjeon26 jikyjeon25 jikyjeon24 jikyjeon21 jikyjeon20 sunhd20026 jikyjeon17 didwogh22 jikyjeon15 jikyjeon14 jikyjeon10 hlch81 hkoon simuri12 fcdesign5 mrviura kokomi2012 netlabs timestore228 imarketing055ptn edge52 tvdramasadmin zaengyi3 zaengyi2 yy1516 jejuolle metavox reactiv1 icdvd lseinlondon hkmug bbqtown yain7737 mountkorea2 taol1000g soritong hjs98824 hjs98822 monaco0421 plusdiettr seebuytr3276 raisis thefeel enfanbebe ss2004 remott1 honor travelceo maniastore yauoo05051 gswb2 cubeintw ii22ee gamecp ihack aromero dbal1126 cubeintp wellpeople cubeinth ulfarmer cubeintb nowlovetime2 songchoi www.tsm vantruongvu bhaskar phish magicsladmin saunders neotech mohammd corinth gohongkongadmin modelrailroadadmin nuclearpoweradmin halstead gcreports shorty nyakamai2 nyakamai1 acheron rankpeople gi294admin sanfernandoadmin buddhsladmin adra thecrims osteoarthritisadmin financecaadmin tariko tarkis canterbury mundojava coeus onlinebusinessadmin weighttrainingadmin gi421admin corrupt gi172admin dek foodbeverageadmin islamsladmin support-us santoso nse victorian start1 pytha3477 m1300m stickers mohmmad vlasov urbanlegendsadmin businessmajorsadmin mediabank www.iep sexsladmin socialanxietydisorderadmin anhdep americanhistoryadmin milimetr lms-test harlemadmin gi98admin audioconf snies wadas envivo whitehat rygby goooals www.artem rengeko benyamin tmi comunicaciones unknown1 nyquist gi288admin japaneseadmin medecine humorsladmin dgt thedexter lswebconf abdelatif nyrelaytest afv medschool mailsecurity loggers danceadmin nesetka zaryab gi405 lingerieadmin ouray expertsearch www.manuals berilo pegasus.cc www.tamer gi415admin gi166admin eteam intranetsadmin bgboss tpi-pdb-scan anupam weavingadmin anusha taxe cytrynko cellphonesadmin sarki www.taxe gi369admin arthritisadmin calisto anyone cgi1 fairfieldcoadmin jamadmin fisc lovegate riverbend gi400 mifa hendrick www.fd eric7 sparda duel 357951 pharmaadmin criminologycareersadmin tibio adminsite machinetoolsadmin giaitriso gtools.team myold dheeeraj netlove chikago giveaway englandseadmin palmtree gi93admin dahmane16 albuquerqueadmin cefa firewall1 romanticmoviesadmin www.hpc autism gi283admin netopto animalcareersadmin dallasadmin gly postresadmin corpuschristiadmin sohaib herbgardensadmin psportal external2 generalhospitaladmin arabtv sitesearch2 travelwithkidsadmin newsdesk teqnia schooltest autoconfig.webstore autodiscover.webstore birdsadmin webdisk.webstore incestsladmin lindsay www.gutachterausschuss squish difference punt1bdd punt5web bankruptcyadmin arrel1 hirawan arrel2 punt3web mail.rebots glt dnsgrupelpunt zdravko punt1web persuit sofiane punt2bdd nicedogs speedo sonice punt4web acidrain arrel punt2web punt3bdd gi410admin shuzai.militaryhistory gi161admin spasadmin kommunikation washingtondc enchicagoadmin informacion legalindustryadmin shosho www.zapisy jabba2 familycraftsadmin yogaadmin biggs hnptuyen hwvaxwp614 thanos sososo legalcareersadmin lucky7301 witcommerce mysille dbc2191 canoeadmin quigon ccbyungkr ya09uni ohjima kkimtony mansuvv jijiwoong2 linesence yegalim padosory3 hihangongjakso kwtank greatewoman004ptn annasui071 idgodo-040 idgodo-038 lkm3473 idgodo-036 idgodo-035 idgodo-034 idgodo-033 idgodo-032 idgodo-031 idgodo-029 idgodo-028 paddlingadmin proxy1d classicpoetryadmin gi87admin palpatine gi277admin lostadmin energyindustryadmin kdhap okcadmin soulro goswadmin dooku getenaks kooora2 contestsadmin idgodo-027 idgodo-026 idgodo-025 idgodo-024 idgodo-023 idgodo-022 idgodo-021 idgodo-020 idgodo-018 idgodo-017 idgodo-016 idgodo-015 idgodo-014 idgodo-013 idgodo-012 idgodo-011 idgodo-009 idgodo-008 idgodo-007 idgodo-006 idgodo-005 idgodo-004 idgodo-003 idgodo-002 idgodo-001 ruis4u alacmola star38407 star38406 star38405 hugreenplus star38403 star38402 star38401 chamgaram zigzeg icas99 vlc-aacs vlc-bluray tabletennisadmin newgame khs535-010 hoodtee ing37771 bkml.m ovariancanceradmin khs535-006 khs535-005 khs535-004 khs535-003 khs535-002 khs535-001 kmoon70074 geosang3 whalehh minside junsic-021 yrsong06291 hinokilife seesawi1 cpb56014 netzantr2633 cpb56011 junsic-019 world09 umchichi ice68 mallandmall free55661 foxyshop3 eqtech ms1devsunny gi394admin yym0214 grym2 grym1 kurare3 tandymalltr kmh5007 imarketing054ptn ssnbackupsvr andongsoju godobill hwaldo1 motm2464 mebaritr7105 estella1 djsteelkih1 airwalkmall nativeedge ultrahiya1 chsong0505 itac2500 coollake2 coollake1 rainykk homenlife sizer20131 junsic-010 dawoom gabang ckc1407 ihwasports tigerlk1 huehouse wooricat woodcatr1429 babysitr0459 smilelifeje living2u arkhe307 kcy720 lois99 leonrider1 gayacctv hana18753 tdaehan petereon1 skrghk nalarizone67 cl0521 reweb2 vogue21c easyguitartr jerum2001 sqoop113 sqoop111 dal1143 dal1142 printout2 jimmychic brbrjbr5 brbrjbr4 woorigolf brbrjbr1 zzzoo icaffe wildfire pocwebcast softnet gatishna ashoka baselgold yumehinoki zetmin4 foammake1 zetmin2 hlanuep003 kaspersky-serials ssc-contentinfo girlspouch hlanuep002 ilovedream hlanuep001 ashwin pocmail mobilevpn cwvvpn edrfnep212 ssc-www edrfnep211 hudtest alexro googlle arabnet envoy rure10011 pjjpjs1 ljb2644 ibinfo corptt aaronshin dukeland2 dukeland1 again789 geddy751 kimsil7252 running21c1 www2saml tekocokr1 drfswitch uneecase mdworld1 tammy8321 qkqh16171 jhhan7512 zino15131tr9875 godoweb11 ghsenfk hhhqnwp007 jen06152 jen06151 ww11721 gookyuny2 guandki blue05722 jejunet1 littlewitch hwvanwd1054 chj1013 pass69084 pass69082 aoh007 sdh6161 kidsss1 songane1 vfaccom raja88 hudadak2 chally0524 funfromfun1 bbsbaby ckw0467 givekorea gbs7071 lls2ll48603 z4ever1 eatthestyle hipet nanikr3 kongirang imarketing053ptn manualprime nalraribebe hope61371 goho19721 ezrock2 sjyshs optomamalltr chic1215 bultaewoo5 bultaewoo4 bultaewoo2 buyheart cw1537 cw1531 jiran0513 haninara will02304 will02303 will02302 psd24001ptn tj0115 qbike96162 shcompany1 faboosh vid1 antiqpia wooyeong3 wooyeong1 prendero imarketing008ptn callan crimeclub runxrunmalltr saebingagu1 wjj1876 cleanshop1 tj0012 dal0357 daegasports coexmart jejumitr fone51110 iview1 arabweb sipxt xpsh1104 arabtimes2 caz superdotadosadmin gi155admin winnipeg xpsh1102 inetdream2 coscar remobil s3devdarknulbo miocell1 skagns75 hill8 lyspsw1 busanedu metaprov manstone jejumiin kst14022 grr21 kjkim68031 cfmallcash3 cfmallcash2 anewface8 withusmobile xpsh1101 emall24 pleatsme1 binibini1 hanhee2119 elannep511 cashdesign001ptn hhhqnrp042 bumilion19 bumilion18 bumilion16 bumilion12 ayouki20131 skw620 investtr6501 js9441 evol213 evol211 yaksontr1850 greatewoman002ptn lwy0302 hwiyun blackpc-020 blackpc-018 blackpc-017 blackpc-016 blackpc-015 blackpc-014 blackpc-013 blackpc-012 blackpc-011 blackpc-010 blackpc-008 blackpc-007 blackpc-006 blackpc-005 blackpc-004 cino007 blackpc-002 blackpc-001 ipcsung phonkebi eheh49363 yahya1233 sc55862 sc55861 optionsadmin gjithqka publicrelationsadmin gi310admin comidaperuanaadmin gofloridaadmin upimg lounge.contribute businesstraveladmin gi82admin terrorismadmin gi272admin gi40admin publication admin2010 dl360 taxesadmin dramaticmoviesadmin gonewzealandadmin babyshoesadmin gi230admin kauaiadmin sandiegoadmin bostonsouthadmin homecookingadmin diyfashionadmin gi388admin gi149admin ftpuk gi486admin classicrockadmin lowcaloriecookingadmin powerize quotationsadmin detroitsuburbsadmin compsimgamesadmin mwsladmin hqfailover-css2 compactiongamesadmin hpc1 federalcontractadmin onlineretailingadmin gi76admin gi75admin gi266admin sweetboy todaysladmin jpagent babyadmin barmssl christianmusicadmin ctan tabiat highbloodpressureadmin heartburnadmin hakers hollywoodadmin deano gyncancersadmin movingadmin gi383admin ftp.members gi144admin mxc1s assistivetechnologyadmin thisweeksladmin adolescentesadmin prowrestlingadmin nytoolsmail4 nytoolsmail3 websql basin nytoolsmail2 nytoolsmail1 kddb xtremesladmin prolifeadmin gi71admin kariyer zai gi499admin muhendislik sjakamai2 gi261admin boxingadmin mxc1 englandswadmin nlsl ahead gi329 gi333 netbeginsladmin oldradius2 hindusladmin gi377admin ultra3 gi138admin jobsearchcanadaadmin courriel gi330 bibweb lawadmin ukfootballadmin beginnersinvestadmin ip-reserve-139-126 northbeachadmin baltimoreadmin toysadmin musicsladmin drugsadmin militarycareersadmin gi208admin ns2v35 ns1v18 gi65admin curio coolmasti gi494admin gosanfranadmin pirateradioadmin basketballadmin x28 x25 gi325 x18 x14 freethingstodoadmin internationalinvestadmin m08 frenchcacultureadmin m09 bdsmadmin nurma m06 m05 eor gi346admin cm.equisearch hqfailover-css1 x64 hwvaxwp072 nthhqsmtp2 chatwrite tictac entpsl hlannwp010 totoro5948 selly19 selly18 haagen11 acervo hlannwp005 hlannwp003 web3dadmin hlannwp002 hlannwp001 gi372admin hlanunp003 bizpro hlanunp002 gi133admin hlanunp001 anchor iis-mapping3 trunks darklight elannep311.exh.prod devilboy elannep312 elannep311 lugia hudboxdemo testswitch hlanudp001 aulas cybki astyle homeschoolingadmin devmobi poetryadmin sgglb hudgatelm btenroll hudappsint obgynadmin hudappsr lanswitch hhhqnwp001 nthhqsmtp3 moonnet hhhqunp003 hhhqunp001 resumes gi317 hudgater hhhqnrp021 hhhqnrp020 dannyboy poppy mfpilot drgr hwvalwd3231 sustainablelivingadmin louisvilleadmin taras elannep313.exh.prod auth.portatest ilannatv001 lhfailover-css2 lhfailover-css1 hlannwp004 oshcgms cracked gi5admin proxy53 proxy31 eir bellona afroamcultureadmin mazu hhhquft001 pictest1 sftptest fedtraveler stepan archana stephy consultingadmin mobileenroll lansslvpn1 homeworktipsadmin hostadmin hhhqnwd007 elannep313 pwctest1 spandan sfgis hudstarsr test786 mangusta euthd lanvpn2 peripheralsadmin lanvpn1 czqwa gi60admin gi488admin proxylm chemistryadmin acko gi250admin internationaladoptionadmin sgvpn hwvauwp059 ceejay sudeep fotografiaadmin hamada horluep903 hlanuep902 scifiadmin hlanuep901 nthhqsmtp cwvglb foiahud gi309 kothari www.ezec flirting mx39 bbnbackupsvr americanfoodadmin testest hudmobiletest hwvauwd491 maynard hudcomp hudlist moroccanfoodadmin xpsh2104 xpsh2102 blogsespanoladmin testrun sufyan videocast faizi xpsh2101 bitdefender-crackdb collegeboard tesal worldfilmadmin duhokforum1 gi308 maroctimes elannep312.exh.prod uiv hwvalrp1162 hudstars sulake habbofans some123 fhadirect alarab stuffs laksslvpn1 quizadmin.historynet fasda portatest hudgate hhhqunt001 greetingcards xxeniks btmdm mywebhosting horluep003 classiccarsadmin ftplm lounge-forum hehehe gi366admin hwvanwt415 sg125 lowcarbdietsadmin kovardo sg124 sg122 cessco xerblog sg121 sg120 swapna asianhistoryadmin sg112 sg111 webdisk.launch dev3.www sg107 www.launch ofelia ayesha booker freshaquariumadmin gi127admin salafi tenisadmin pauta videoserv hairremovaladmin pinnwand gi399admin wishop suzane kspack2 cc1115 anhy00 potato76062 zooicl20 adc79 moonsteam2 tonicyhg maeumsori shenring3 ddongbalsa fjrzl4758 hepashopping loveholetr kmartkorea d2icide ey0506 byhom7 manucare eneskorea thechae cotm974 junek001ptn icaller retrofactory1 durifishing rpmuno1 petitvelo biologyadmin zziny1004 naju52tr7662 nikonpark sskim328 yjun23c seuhong999 homtoy3 prestige3 gate.iitr jee.iitr thebom3 nakwonguitar pgadm.iitr spanishsladmin gi302 internetbanking mioh25801 niaplus u1trading3 u1trading2 colakids smstory s2pdevsky merrymac smstore artemoa2 kang0107 cheongdam-039 warmgrey2 warmgrey1 mario1812 s2pdevsdg corbu2 econatr4735 cheongdam-029 jmet.iitr mba.iitr angusn joont9995 blanden1 anguse sky19991 ziope014 ziope011 cubeintsunny touch182 cheongdam-020 puzzlebebetr chan9485 saicorp worhkd4 gustjrr223 byeol0486 allfocus1 cheongdam-010 steamptr6064 sjtrdco2 chakra www.iitr photoupload mail.iitr syncovh daehan1 woolee helloeunji1 bebiromie tieworld ex8888 hmmedical1 kamin711 hdw01241 min0gomin0 judy0403 lk11191 karajo6 scentedmen karajo4 yonghun2 adminovh gest adobe-crackdb virtualtour hazellemomo thecamt ipayssnchbe www.tsc greatewoman001ptn egoodesign lohas1 clubtsp1 sseryun thearte ehdqkd1gh buelin moin21c logjin lawhuaaa1 kyh0080 zatool2 queen6c36 jjanga2010 indycomics3 tnrruddk1 artemin3 uturn051 catholicismadmin core71 lesswire astinpark6 astinpark3 odaesanfarm yesoobin2031 joyparty grab3 grab2 fhxjtm12 danidud1 inucare2 seunghwk muni63 indomart moneydream chan9067 sky3371 letier2 apitrading bell01 www.warning mark2164 mark2162 yhuj12341 bigcoftr2817 quiltscent graypsycho lrs0115 bookinmylife love56742 s2pdevman sweetool1 program11 orbit19795 imarketing051ptn s4intsun seed9493 seed9492 birdmarine11333 danggal21 yooohco sbarasee natural8426 kwonss kjlee95a2 crosscase moifood jjoonjang hanapack jooho0830 ara8508 kwons6 jongromedi4 wonu26 wonu24 wonu23 wonu21 xn3v4bl9ggh yhkim0731 didskatlr glsbike2 namphtr livingnice1 xwing911 wonlyo hoya8749 amw610 myomg1 s4intsdg schg20092 kjc01kr haanvit7 zzi33 fotoware inomvala1 zenithtr4611 kang23277 inashop kingkong772 hansung20105 hansung20104 hansung20101 ugreen7001 theallo woobul abcsports1 yunm2581 thing thewellbaus nrfworks electom facednd qkrantjd77 woodc2 adoptionadmin gi483admin toboju figureskatingadmin wpadmin dimelee wawagift yooriapa rudxo1 kkn0428 dogbakery getmind7 cubeemom good031004 kdy8412-009 girocall mskye51 masterblue nasa01 sisleeeun3 sisleeeun2 durihana2 zyo21 halfpangpang aleatorik1 aneunjuone rladlstjq01 baggno1 paris11191 yyhee3300 hejan855 hejan853 kongstyle14 hejan851 enflqn1 mceshop1 a2golf stardu12 rkeltm0317 jayminapp happyb2012 seoultree www.clickme unitrust1 nasa02 ekgmlqkr1 ini53533 ini53532 jsu20002 jsu20001 otamin1 hiyazz s1intkthkira elimtrade yhseom1 ipayidugi jmgagu busanbank2 umnine clubthea hexy3 beggob kkamandol domemart3 elecpia keh0527 imarketing049ptn tvcomediesadmin cher90 186 gi244admin kancha history1900sadmin forgotten credits cfd321 kidscartoonsadmin chetna honeycom142 kwonsyy-001 hyunjoon94 s4intkhs mkyungro2 performanceartadmin gi300 gi289admin onelifetoliveadmin couchcrunch namph49 namph48 namph47 namph44 namph43 namph42 namph41 namph39 namph38 namph37 namph35 namph34 namph33 namph32 namph31 namph29 namph28 namph27 namph26 namph25 namph24 namph23 namph22 binsbench1 buyhalf3 namph18 namph17 namph16 namph15 namph14 namph13 namph12 namph11 namph10 kec860 jungsiki8 jungsiki7 jungsiki6 jungsiki5 godobill2 jhb1044 hanaro3894 tpdl1001 smc105 midas574 bbosomtr1268 canscan2 wji8039 micarewiz yumji831 nouveautes1 myc81014 myc81013 spoonz11 kyg7480 shoutzzang5 shoutzzang4 idman77 dongja700 ipasscom centrial1 opatz001 foxya331 rosaflower ipayjunimall01 egoist139 mommy10443 tobi41141 sella76 ripsoul treenwater2 yoobooral pirenze7 zenhide1 wondas kik8704 godo199370 wonbox mucompany geosungnc5 onemulti8 onemulti7 geosungnc2 geosungnc1 wtrading88 ktk09931 naver1968 akstjr782 akstjr781 unigown financecareersadmin golf4 demos2 cry74stal3 sjhahm2 lovely9679 sorkdmsdud unisoft sleeky prmory eggirl0034 yulki83 julenom2 ssunjun1002 ssunjun1001 xalomyx4 seoultile erkekorea printmate farmers9 glass76 qinfo3 qinfo1 godo199087 beesek wooree01 ccs10203 nara2013 namodiy rkarl1127 shdy815 carbitna pmj3808 x-large ddilbong2 yabes4u jebongzzang tcctv2 tcctv1 ky741209 pjinside7 nfriends s3devsunny cool87 jimipage dharltr3162 jomichael16 jomichael15 jomichael14 jomichael13 jomichael11 bush2080 whitelux0223 moon36085 gogl2 imarketing048ptn iamss2 aromacandle1 keugkim corinlhw1 totostand1 gloria75 gloria74 gloria73 sinyuntns3 jeyoon0429 okwatchtr eoqkr12 cpla2k6 cpla2k1 gloria37 mylure geeker2 fifasp yeonsung-030 rosemelia1 prmanager shoesmong9 shoesmong8 marchespublics shoesmong7 shoesmong5 shoesmong4 jsh167551 shoesmong2 shoesmong1 alwns7 antoniuse1 take2650 footbox namseung13 kj5778 radkay sunrisejr hamsukman1 xn21tr8635 kinosida2 muai50313 zhenlong98 bodasadmin cubedevw lsmnice cubedevp edana021 cubedevh kweek10882 cubedevb plum33size poon5404 kidslaktr stepparentingadmin phone4tr3183 cafeier odaemanmul gy01142 gilenge1 you81133 qldrnrdl bytherin dasanmedi fafa3fafa3 costcotr8018 kjb7594 soarcom smcommerce jalgreen2 timekorea hongik91tr jjjongs1 file0309 sjgift1 godo198146 mokpofood youhansol5 goodday0298 imarketing050ptn holyspi ohs26251 gog12 cellexc1 amga gi287 smartdragon4 highsuccess endlless15 brandshine mom0won1 godoedu43 mrpieinewha jurmy842 jurmy841 golf1sttr godoedu39 kimsony8 seiber33 s1devwheeya88 dsa08221 hoon3922 agnet76 hoon3921 skinsale hongsi1 godoedu30 hongsan vaticanhouse howdisplay psclub tapmill1 n5821 hongsd1 gmpkb bagsaseyo gtech1 hanaro2187 godoedu19 packtory1 godoedu17 dekill1 xeve12 js253830 totorez unco77 lavender2tr imarketing047ptn hong7904184 yjkim1130 bikerush guitarand1 cape alicecoco final13911 ptg2020 eukim2100 ksuppcts ggghwe1 igamenettr starcany bluemaster6 bluemaster5 melon2 melon1 sswu20052 jnktra66182 jnktra66181 mymee1 wntmvk gms9776 elinfit002ptn independentfilmadmin frenchfoodadmin godoedu-030 aiia1124 jiwoolove4 jiwoolove1 kjk133 daynnitr9735 godoedu-023 devmap cnutsm lee07982 ehoh2010 ensheet smith44211 godoedu-020 sang198512 jungyeosa gadogolf bosuly1 nandii2 godoedu-010 sem06053 boasguitar1 sem06051 dlcnswk3 monter oraprod yunchulwoo791 qimo20011 cooky73 pcquinoa p747715 wang11111 gf4946 botamedi1 runice79 comism banzzake tksrhkruf qwe1090 mathlove dm4leaf dongbubio11 xnells2 saengi771 shj337 eternalblue1 nffood caga777 raboom dosanet gmis3 crmart1 modurental01 paintong playhome1 masaru202 hongkal rixkorea jangpantr jungs337 outliftr4175 kdsw28003 debien001ptn living365 uncbag bycons melias na84972 dwcho3004545 campingrover2 campingrover1 jinrose792 y2k8711 shdbsrud hongo71 dltmd0829 tatacompany4 enwj1234 ongzi0118 hedgren bijoukorea young76oo bosun09 tikikite hyosocorea klstory21 dever2 theeden1 ezpyun1 usenetadmin imarketing046ptn brunyeux1 canagroup hispace1 dkdleldkdlel1 giftzone moongubox maximum1 manmin2 sportsgamblingadmin yptech hangs0809 nnbworld mysanso allder13 non3001 hwanz32 funis baehouse dnfskfk elinfit001ptn yoojong godo3d-040 godo3d-038 godo3d-037 godo3d-036 godo3d-035 godo3d-034 godo3d-033 godo3d-032 godo3d-031 godo3d-029 gi122admin us.img onlinebrokerageadmin godo3d-028 godo3d-027 godo3d-026 godo3d-025 godo3d-024 godo3d-023 autoconfig.co darkrider maquillajeadmin godo3d-022 godo3d-021 godo3d-019 godo3d-018 godo3d-017 godo3d-016 godo3d-015 godo3d-014 godo3d-013 godo3d-012 godo3d-011 godo3d-009 godo3d-008 godo3d-007 godo3d-006 godo3d-005 godo3d-004 aiesec webdisk.co godo3d-003 godo3d-002 godo3d-001 hubpage1 wchyun06281 jiwoomessi mindtesting kkjj09241 rabine sujipbanktr eqlinc nimirrr2 iking783 passion973 nalarizone672 nalarizone671 drum4989 cigarahn1 faville promise100 woorajil sagabang7 sagabang6 ipayhoneyshop1 bat87442 sagabang1 peachoi2 peachoi1 s3intnulbo rabick onoffstore1 minfabric khskorea4 nande07 csgbboss brbrbr86 jeanmania1 bsta2tr3009 madamyoon roi blossomandco haryoh2 patamania etrang73 dux shinilpack musclebeef daebo99 hfa doowool7 doowool2 hanbell5 collage0071 moulay2 rif fessu imstore3 xboxdesign superpasha3 nvisual a2core dyota2080 dlwogus1 vitaminstore redlife821 streaminglog nhretail earlychildhoodadmin houstonadmin ipaybarun0900 vanessahur1 mrlighttr sorimaru romantiquej lovems2756 nbgkorea less751 lygll2091 bunyoung godo191622 phonebuy say201231 nospin mira8724 myjinan2 herbncell feel2025 manmart lemoncandy kyung3043 kyung3041 bboglee76 icandoit7a rubi82 mansu382 tsgim7012 nani427 somsimaepsi acnenomore2 sjskr1 byo37441 emma1981 devnavercheck hbook jyp00316 hwh6366 thvldkfhfp6 godo195737 sujip-dev imarketing045ptn linux4 mejoos kwe3838 ti2214 shmarket danieljung81 kimteddy godps6223 meeples1 simac0603 xmfkdnak essyoon enjoyetr1820 jooajoa11 biobkj1 airwalkkorea dmsghk1983 hitguy ahabeauty1 gobraziladmin s4freedevkthkira japanesecultureadmin bagstyle1 skinnyco wkan200b polebeancci1 wowavtr7884 oksmoking 92food aps3332 omniremote-crackdb motionpixel5 kyh22272 beaure dooderjy totalsds sp4510041 sungcho91 hwangsj cnr1004 kassanobada autocntr8491 hi-ho www.league nagne159 crysy2k4 s0aman yeunkim5 bsretail1 good1985 eatbag12092 gi48admin gi477admin toltec pcf anno beatman1 beatoy image110 nemodale piaoyj7 hcbig image105 harridan2 bakeryzone ohhyuk96 assistking7 triratna foryoutr6147 gmdrmslee cjk1979 amilove121 ymmink1 doremitr8685 ara3080 dugilb2b showrang jinyingyu800 alsso9 pkh0214 hanshatr0859 beasia yabamtr anart3 ssunworld1 je78kim9 unicoh1 njmal88 hwajin0 mjnamja ebedding1 09jungle2 dhahrry carapass anastone khkbest1021 ckw04671 skijun gnookim3 gnookim1 tarkko cntese bikedream hana09241 pdk0518 rivermee3 smartsetting slackware eyeglassesadmin srjy1234 ubplus2 ubplus1 cokes4 trustfactory1 dmd quitsmokesladmin imarketing044ptn skykeep5 skykeep3 skykeep2 gi238admin popololo1 widephoto lotto97961 sommo7979 odcmalltr moontk88 ipaynoteari1 yahoofss wnrfla vngkt12 dsbkortr2522 jokkrye dawwenter2 dawwenter1 hanoc rain001 gi8 goldposition1 gimme51912 go2cool2 pe1501 godo204620 minhwan90 seunghyun97 fishintr8255 brightsk6761 jmagic etern4283 selenia mongmania hthlsy9 hthlsy8 hthlsy6 hthlsy5 hong1sutr oddy051 youinn42 edu35 headstone012 jihoon1004121 carstudio partyanimal4 partyanimal3 partyanimal2 tgmedia ppk cooluktr mccoywatch kansinny okbible morffstyle1 rockordie1 itself skinnwtr1082 shdnjs1 t202 bebecare s042833 amberhouse3 vbsoma-020 vbsoma-018 namjm96 jojun26 jojun25 femshoetr4711 jojun21 vbsoma-015 bear71 edu30 hjp710 mikeoiya kronos012 twinssm72 lissy11042 lissy11041 funchiptr nodecore godo194241 godo194240 beet8838 lee11361 cctvclub suguntop junghwaw heedubu2 techtalk-forum duji1381 medela00 ksh85791 wlsk003 ivadak cjj9937 ip209 dsignhoo5 koreayb15 yw9000 kazugb mercurium seawoong2281 byh000 coke76 injeju jachin11 ip198 fshop woodyctr4561 kyneo7536 ninefirst1 emofood gocaruso csj0035 airmedi4 nanacom forsellerrelay ip197 mantomanjr1 gi6 szngsilver daingolf1 inumber yoyohi godo193812 sksdltmf hushin20023 smsmile hankook72 eyoungrla medibank16132 mangno2 wrtoysports1 junghwa741 brother1 imarketing043ptn jlcorea1 js100j wk040304 totalbus sanegatr7906 iblpkotr8975 siwon1siwon2 uc24891 ipayhaircool incobbtr1465 us82go kch34p2 anbd11 girlnshop mtbzone1 byeatopy wlfjddl46582 mehode goodnfs brandywine streetdia jungo871 jumpgyu1 oops01231 anjinil shy980204 yhcmidas pamikyung1 raeo1004004ptn jw33world1 radstore alzipmtr2005 pok7204 godosg-029 godosg-028 godosg-027 godosg-026 godosg-025 godosg-024 godosg-023 godosg-022 godosg-021 godosg-019 godosg-018 godosg-017 godosg-016 godosg-015 godosg-014 godosg-013 godosg-012 godosg-011 godosg-009 godosg-008 godosg-007 godosg-006 godosg-005 godosg-004 hommejk godosg-002 godosg-001 memorydream pro109 paranshop3 crs2 azrael0907 kidjoo9 dhadepot eteamart myshiny1 pstrain today2421 vinch701 hansclupp ssf80001 cottsco2011 ogamoktr1404 gofla0tr9221 micaad1 tysopumtr choh0211 vivicar ruddk23141 dm1159 ipayjehwan0202 meareman1 vinusman ye01072 kimstoon2 kimstoon1 overdose runescapebetatest ns29939152 pearlkorea cubedevsunny hanguomj gike1 jeosystem kuoo1914 gateau12 bk1199 emedimalltr lifeedu-019 lovesole83 ip195 ip194 hmsladmin peter123 gameshowsadmin media-bpo youtubers hsb sqr azozrm sudha www.psy ip191 azshop wowedu yasedesa ip190 pharaoh editors ip183 shkola ip180 ip169 symbol atlastest ip163 dafaka profcom ip140 homebuyingadmin natadm www.dale kms2 retailindustryadmin paladin ip252 ip251 dahaya syntax italiancultureadmin germansladmin ip247 ip246 hotmailservice autoconfig.linkedin mentalhsladmin dakati autodiscover.linkedin www.reklam ip243 o1.send skylark ip241 southbayadmin gi355admin gi116admin irishcultureadmin guideway jacksonvilleadmin tpt westchesteradmin golfadmin spj foodreferenceadmin ip229 gomexicoadmin stylespeak data4 danlod ip224 chaubathong ip223 mvd ora2 ip222 ip221 phonecards hibuddy alisha ip220 ip218 exoticpetsadmin ip216 ip215 gi43admin ip212 stream02 ip211 ontheway gi472admin ip208 conecta nadorino ip207 ip206 alojamientos gi69admin gi233admin correo1 campingadmin ip192 ip201 cocinalatinaadmin ip187 ip186 hkmail ns133 ns145 dbrown ip185 deadman ecomerce bilalof ip184 samysoft testesite ns148 akulah ip182 ip181 ip179 ip178 ip177 ns154 servicelogin ns157 ip176 ts17b hayati ip174 ip173 ip172 ip171 ip170 ip168 ns167 ns170 ip167 ip166 ns199 mailmkt ip165 raleighdurhamadmin itblog www.kst ns221 midimusicadmin oldblog ip161 ch3 armando ip160 vasant videomost sm14 sm12 ns220 sm25 ip148 vinaconc efecan ns230 ns190 ns240 butnow ns250 ns210 ns204 cheeseadmin ns260 ns205 dafa ns180 ip146 ip139 ip138 ip136 sisters ip133 ip131 ip130 ip121 mp3test ip118 ip113 ip219 ip199 ip189 delphiadmin pureumlnt rapadmin www.azmoon asdfghj bbarts bujamy56 risses0520 doreuri lifeedu-012 lifeedu-010 relaxchair xkqrhfvpstus1 jb34387 jb34386 jb34384 phonejtr7321 arcmalltr kestech jyuhwan amigyu xn2ztr5941 vbsoma-010 saintvin1 kgcbee1 pchansol anativ21 camp60 magicgonet1 sandboy293 intheliving5 intheliving3 bigboy930 bluesunh2-040 gateall2 weppow2 storenet moohan21c2 saejong0063 homme4u akak54543 hcwb031 maestro4 maestro3 khunderjapa bluesunh2-030 imarketing042ptn yjy75574 pool5519 hdauto01 storenettest gi350admin bonaebada1 gi111admin art9403 masa3029 reddesign bluesunh2-020 openmaeul bluesunh2-018 taeannet1 seldesk wookjoong noa64101 ksu0921 audgml8586 ks91554 ezmro bluesunh2-006 ojas20128 gien1 yah0216 bluesunh2-004 ojas20124 tj04016 guandki5 guandki2 guandki1 bchhome eugenephil2 eugenephil1 sanfranciscoadmin jjoong978 duluthadmin goodcna noplan crossector dpakorea4 dpakorea3 dpakorea2 dpakorea1 hgh9111 gf0103 sang3570 efinlandia jad3343 dominoland5 wow9173 dominoland3 godo202351 solsongju motosadmin fos0830 zzuujjoo jejucjh3 nepoung hipole skywithsea sangwoopool lohasprime storymt signmul2 entrada divorcesupportadmin gourmetfoodadmin comicsadmin video77 godo192239 gi37admin gi466admin ftlauderdaleadmin gi227admin franchisesadmin aerospaceadmin siliconvalleyadmin kidsbooksadmin rcmetr3143 cmzip2 dm0107 cjdgo71 gimtech212 m9202 quantez1 dangmuji n011n wikids1 sewon122 simswfcc besthimall1 myfran arin08222 rhdrkdgml cocoluxury1 snow2tt1 kinisia1 ahk0729 parangsae doremii parkmina0318 joafabric padipros1 aftermidnigh neubible damoa2171 ediya05051 sogakjang1 tontoy13784 moms9112 jonggkim01 house2641 kchair kitchenmall dustnsdl godoedu-029 godoedu-028 godoedu-027 godoedu-026 godoedu-025 godoedu-024 ipaykhaksoon godoedu-022 lee07981 godoedu-019 godoedu-018 godoedu-017 godoedu-016 godoedu-015 godoedu-014 godoedu-013 godoedu-012 godoedu-011 godoedu-009 godoedu-008 godoedu-007 godoedu-006 godoedu-005 godoedu-004 godoedu-003 godoedu-002 godoedu-001 dahanoo4 dahanoo1 ksa0403 team65071 ezgo3 kk11569 cctvpartnertr tyjjang sinba8tr8703 dass65982 pagodapan1 ggomi imarketing041ptn sang3022 sang3021 shinyo1232 kuc0121 lovelysani5 lauraashley1 khskorea3 khskorea2 khskorea1 hyunny7468 raja883 gi204admin vmde gi305admin littlerockadmin gonwadmin printscanadmin uspoliticsadmin xfacfory bbcompute autodiscover.adserver wsw autoconfig.adserver contributeadmin bsosbos allamlatakia gi344admin oreon gi105admin b365 b364 calle b359 smtpout5 deivid b350 smtpout3 b322 onlineorder ejercicioadmin b316 restaurantsadmin biztaxlawadmin kidsmathadmin www.newjersey www.connecticut newlywedsadmin northcarolina gadadmin dekrow managementadmin www.alabama www.massachusetts bindass frugallivingadmin newmexico homebusinessadmin latinmusicadmin www.arkansas gi32admin www.delaware demons www.minnesota dsample newscool2 highteen doumikorea1 sungkunc2 koryms2 e-malltr4552 kjwoo32293 neverdiesp3 labote131 gi461admin jytrade harugy2 lee9501 haesung20843 outweltr0931 bbridge0734 sheungmo1 story62 skdiwndl1 gogumagogo2 csangsun75 jhcho8420 jhcho8418 www.newhampshire www.illinois gi222admin steelni1tr foodduck www.vermont zzuzz2 lee9393 jncseller1 foodfarm clubchamp southcarolina siwori young2536 harueui cnsgh334 iconsupply siwood ksm32601 no1boiler nno12345 spatherapy sojin7475 probastr1978 rhodeisland www.wisconsin genetichong mtsports1 ipayhercules001 this2157tr arab-net jinmax371 bomto3434 godo201251 es4today pdstudio pjhwass vision894 hipet2 woonsanhb2 woonsanhb1 hgyjsa1 hds3406 alaya2776 zpii2 aodkorea winksjd1 widcase1 haoba8tr4026 james75861 gosisktr9155 uss8888 myeraf cilon79 luhzenblanc bigca4u2 glffldqnwjr deccario bsosabt kimshow2 mrsong21 baboking blcmath noogle dorcus2 bhhanyang1 wiclara1 aimys67 grandhil1 hkp2560 spycoffee1 pick.rap fhwmepdlf6 minkj001 fhwmepdlf2 linenumma12 kjhmisope godogodo-049 pon2mart idealistar2 khs9281 soapschooltr lee07101 jsoo100 mozart4426 jinsori2 byeonghg4 plumbingadmin boxeoadmin godogodo-039 dailymans zigngn4 zigngn2 s3intsky coomim77 kkareu2nara drcorp1 godogodo-030 jamongc co980329 fromnongbu imarketing039ptn carajsj1 godogodo-022 s3intsdg sailingadmin sts1 iklanbaris godogodo-019 tae64802 tae64801 guess001001 ljh82403 khs8989 iaandp1 eyely iaey57 kkdyoon lsmfish godogodo-010 gomputer1 buybetter3 wjh7975 akxogh exmtb atco6565 godogodo-005 shesgotr9676 shockyoo sangsev designnice1 vaionote horroradmin bantdoduk qnrgoe2224 ub12121 gi338admin metafaux ghs04022 raeo1004001ptn morenvysenior gi100admin ocsedge centralnjadmin haven-forum plasticsadmin waterskiadmin toolsdevadmin www.clone gi358admin dev29s bonkorea snowmatr4981 hkjajae cornerb sound16 cttc tardis.ntp nonno100 swy9988 goobbuy densun finishline1 youto1 itmyth seland2 printec09 ektl1004v1 js2proj alpskorea a18burn kgh8860 inooint3 inooint2 inooint1 tjdejrah1 cosmamtr6185 ttt308091 mamongs ilgimae1 hyj0616 jwy8044 vdmsv125 sekkei earangel pinkiegirl bikemac1 meal1owner godo190245 chungzz rocbi01 alone0301 hot95292 honai77 korbiketr gerpm kptool1 jm40491 jejucjtr9330 jb1130 aquaclean1142 yewonnn1 tory8787 inhotel2k4 youppy inhotel2k3 dadream7 gerio itechkorea1 s3intman greenstarlab akyba1 and136 eyesore hurbnvinu racetech1tr sardo763 syr0247 geniusynh chunghs aurora3333 h9944021 punkgirl141 damin9496 sisunagency limjaddd sj12240 sang1172 jungfarm yasw1109 milwaukeeadmin uncledum2 pjk8112122 bboyan1 surfingthemag bbongc84 eye31 yesjubang1 dbswjd12001ptn gokimyong51 vustore123 mangbae gi120admin felttree jungah2009 noriko newdept1 allthat01 chamosa wlgus0606 imarketing038ptn sisamall-020 bysooni2 beliefstoretr hinius articandle bridgestone lion98988 lion98987 lion98986 municipalcareersadmin lion98984 zippy0883 zippy0882 zippy0881 busangirl mangjang7 icon1220 about1103 jyhong851 sisamall-010 dororo21 ivoguetr3185 dressmoon mimartco4 oxybion gi26admin iamamine002ptn caliella sarahmell bockhan2 bockhan1 icamp4tr atozsaib gi455admin ruchaga8 ruchaga4 ruchaga3 sugar003 girlsego hmhee0130 dberry001ptn kimterry17 moduru belldand02 cocoamilk29 cocoamilk23 gtc017 sado102 sunrise1 yeecya2 yeecya1 thfactory shilla041 lsw31391 badboys532 takyp4 dongkang-015 dongkang-014 takyp1 dongkang-012 dongkang-011 dongkang-009 dongkang-008 dongkang-007 dongkang-006 dongkang-005 dongkang-004 dongkang-003 dongkang-002 dongkang-001 rongee19901 godobusan-025 godobusan-024 joy2htak godobusan-022 godobusan-021 godobusan-020 godobusan-018 godobusan-017 godobusan-015 godobusan-014 godobusan-013 godobusan-012 godobusan-011 godobusan-010 godobusan-008 godobusan-007 godobusan-006 godobusan-005 godobusan-004 godobusan-003 godobusan-002 camerasadmin godobusan-001 seoulitle woowing tod01081 lily0728 cok2yj tj00692 eyetag2 gagugood win5010 suuv1226 cyan071011 avibookstr shoptr6928 zzzooon4 solgartr1956 mad41303 segyeuhak1 lison982 sksk0622 tuinsports dynfou fpfp883 babohtj1 jaehunx1 lifesaver9 lifesaver1 takuti wfishingtr godo188085 dengol kichpony kblue0 yewon0903 dodan15258 gi216admin ckdghks5317 armarkat3 armarkat2 itckorea215 itckorea213 itckorea212 domain11 hangreen youngink411 hansj1128 debr1004 abzapps dadajubang urizone3 bbcountry2 curtbein rainsoul00 cyj19742 jikyjeon137124 maxsavtr0357 changwoo0120 bswoo414001ptn pungnew9 gongze1 j2story touch1822 jwpkg0696 lifehanbok imarketing037ptn eggstar sjmall banilafruits ldhstudio2 missleeshoes2 missleeshoes1 niubung chase69002 chase69001 hangravi jikyjeon136869 ych78772 ych78771 mega70 iamamine001ptn milisitr8615 jean218 nakim0103 topia12342 topia12341 stylelight kissmethe21 coffeegsc5 badwin7 fmmol badwin3 badwin2 trueguy211 gumigagu1 wunderkammer myclic dltkdgusz22 flux9 namdo71 agafriend2 hit000 jikyjeon136672 seolmisoo laurenjoo2 minneapolisadmin frog0815 amdkyt gocamptr ttouch85 hhb9397 knstamp3 buelin1 mandoo1 lifestylist1 skidlove3 agprinses aws26801 go90861 dudalj1 usnewspapersadmin munbook staryuja68 delsey sujung0807 webhostingadmin dk83666 treefrogco3 treefrogco2 treefrogco1 dk83661 chuksan cueplan2 elbtano pygetec2 koino11 mymiru09184 vusrmawhd haemin34251 kwang8481 penjoby duckbai therapycareersadmin yesmi10042 1004sg als112911291 supplyctr1 plan20133 dbs001171 work.americangreetings rtj01034 sisusu yosong201 weddingcar1 talk11 everland04 songahry1 kwj123 goodgown2 coscat3 coscat2 sjanwhdk22 ptuebiz-050 ptuebiz-048 ptuebiz-047 ptuebiz-046 dressline ptuebiz-044 ptuebiz-043 ptuebiz-042 ptuebiz-041 ptuebiz-040 ptuebiz-038 ptuebiz-037 ptuebiz-036 ptuebiz-035 ptuebiz-034 ptuebiz-033 byminlee ptuebiz-031 ptuebiz-029 ptuebiz-028 ptuebiz-027 ptuebiz-026 ptuebiz-025 ptuebiz-024 ptuebiz-023 ptuebiz-022 ptuebiz-021 ptuebiz-019 yvette ptuebiz-017 ptuebiz-016 ptuebiz-015 ptuebiz-014 ptuebiz-013 ptuebiz-012 ptuebiz-011 ptuebiz-009 ptuebiz-008 ptuebiz-007 ptuebiz-006 damulkorea ptuebiz-004 ptuebiz-003 ptuebiz-002 ptuebiz-001 ramses15 kagamii2 kagamii1 baksakimchi1 highend bukku s2pintsunny inagi99 gcore ozled1 hyun790320 auteurkim1 ilove3691 imarketing036ptn gomppi1 nana312 kiwamimall ip2001771221.none cafepremio luxurycity9 delt77 daljae113 s4freeintsf wlachacha donghan53 biny1122 kundservice wow4482 yasuike jeju82457 entertainingadmin s4freeintnj samiamseo itspresent sjkjh2 mamsarang coroner jjoodol s4freeinthn ansanmooki6 ansanmooki5 ansanmooki2 gogofishing1 pcmaker serverhosting245 serverhosting244 serverhosting243 serverhosting242 serverhosting241 serverhosting239 serverhosting238 kidsmotors serverhosting236 serverhosting235 serverhosting234 serverhosting233 serverhosting232 serverhosting231 serverhosting229 serverhosting228 serverhosting227 serverhosting226 serverhosting225 serverhosting224 serverhosting223 serverhosting222 spatial fox9head1 serverhosting199 serverhosting198 serverhosting197 serverhosting196 serverhosting195 serverhosting194 serverhosting193 serverhosting192 serverhosting191 serverhosting200 serverhosting188 serverhosting187 serverhosting186 serverhosting185 serverhosting184 serverhosting183 serverhosting182 serverhosting181 serverhosting179 serverhosting178 serverhosting177 serverhosting176 serverhosting175 serverhosting174 serverhosting173 serverhosting172 fieryguy serverhosting170 serverhosting168 serverhosting167 serverhosting166 serverhosting165 serverhosting162 serverhosting161 serverhosting160 serverhosting157 serverhosting156 serverhosting155 serverhosting154 serverhosting153 serverhosting152 serverhosting151 serverhosting149 serverhosting148 serverhosting147 serverhosting146 mk3477 serverhosting144 serverhosting143 serverhosting142 serverhosting141 serverhosting140 serverhosting138 serverhosting137 serverhosting136 serverhosting135 serverhosting134 serverhosting133 serverhosting132 serverhosting131 kdypiano yuki2 serverhosting125 chlgks77 serverhosting123 serverhosting122 serverhosting121 serverhosting120 serverhosting118 serverhosting117 serverhosting116 serverhosting115 serverhosting114 serverhosting113 serverhosting112 serverhosting111 serverhosting110 serverhosting108 serverhosting107 serverhosting106 buildup66 serverhosting104 serverhosting103 serverhosting102 serverhosting101 serverhosting100 yepia2 binco41 eosyun cromyoung1 enjoyholictr baeoun2013 kbldmk pfcb2btr9416 hanqtour2 kangaloo681 smallvtr1168 kc0505 bbulai teacera1 namja5979 boromaru eblshop itjump ok907212 mcubei meeandjoo yun6208 ukss12 wansung2 wansung1 gocamera foxdata tyfnb07011 flagoutr7506 soonung1 woghksbs12 yeskr872 kptool2 julee2722 tkvkdldj12 itscamtr7819 hot2shtr8324 uicivfer anticalf stupid13 ghj11243 beatcool wolimmungu12 gonysoda8 gonysoda7 gonysoda6 gonysoda5 iamyulmo2 dm1159tr7350 composer2020 jijangsoo sunny8711 broadbandadmin highkickz theholyseed footstreet allfun homemeat1 emall244 khuart imarketing035ptn greenfamilyadmin minki65451 fjqmapwlr bau ainmall lee4651 shcompa leejy12292 btoall9 miraeatr2005 gabenori ftforest1 city06971 rhkdwls723 ktk4051 jujutiti new.www na73732 yh71040488 myanb9 airing3 sminco041 myanb3 sltlwjf2 soban9999 ipayecolv1 oldprime inul003 kumsansane totor19181 viatc011 pbuild5 ohayo jinhui11202 minormajor1 konkuk-064 pcs1218 allect syjmom3 syjmom1 heejung2 jobsearchadmin wpraitr3844 mygdgr3491 anima69 heejung1 bdsblog ksmkoo3 dkt1234 merci21 ip2001311721.nrc.ice naru49494 roverto greiding3 timmy92 tong043012 daun79 tong043010 garnetstory kojj073 kojj072 scribe urbantake3 leegun19804 leegun19803 protuve4 cartoman miscel2 dadajch zeezer hhsol7 dreamtime2 jaboshop junetek2 junetek1 ribonbebe3 hyang777kr7 salimsali allapp artisan85 williamws44 jungang3 jungang2 manager84 kch34p hangoeul saeyangint1 somang01532 ypp002 ypp001 automotr5324 allbab yeoback8 myahn7 pdazone tbldesign01 cjihun792 cjihun791 gi333admin trynulbo starexon1 stoneis klove76 garak pks82191 chairbo hiki88 royalaqua snoopy0712 indasom23 micromtr8776 vollzzang1 dap gksrudfla1 kdiden1 himoon43141 cmw1287 cinemathe koreantea nemestar1 luvmung6 luvmung3 badpoet9 badpoet8 badpoet7 badpoet5 sooguncafe bmpshop vpn2gftp imarketing034ptn lmss042441 rkdxogh011 lee3642 gamzi swdps0811 snkc001 lobchou70 choisseung chonggakpapa pusary74 babylish1 coalsk king2112k chunbak1 kimsj418 bigtown7 hesaidsmart bobdodook1 doleyetr3930 newface22 newface21 xpshx777 dcbook asctaix calla11190 gurilla sytkfkdgo31 sachajuan rlatnswk24 dnckorea lwy03022 lwy03021 upmotors erumn isolmg1 inhyun44tr hyflux11 cnb57091 kkaebong insunui therefore1 isroad ulife1 duggy741 cnn5326 domaejoa eosida ahwld53 foodztr asdq001 jjsk26 auddnjs2 puppyworksmall djbiart coolmans yejin3 mcsh97 dlfrnjs9102 dlalswns14 zzus70 dkkj0518 jwjuliashin ping3059 perevod lee3122 neosans moung4839 yuna04791 allatpay foodzen todream07 raimtree bank1 ohtrade1 yc0098 abstrait1 gagus herezzim pink129-030 fruitsoban fix05 xenodori2 pet2day dpency mrherb kokory932 cjyhm sunnyhouse nicolekimbs pink129-020 dpseller gahee hdwegutr3316 graphicn pink129-012 antiqland kkangtae852 pink129-009 gg777 a72481 gspungsun ilove0702 ilove0701 na462791 bluesanitary tenorlky2 dbwjd6660 animationadmin moning620 hqmon imarketing033ptn gaeun acbccc3c cc112a8 dasom7735 cc112a5 cc112a4 cc112a3 corelee6 cc112a1 uniquebutton jamomalltr8882 asanever prcup1 morenvy028ptn iamgantr3550 baejina prori61811 hjg112 lightingadmin jayhome5 mediasoul bada264 w90226 lucylove swissmall jizone rsho04 s33h3001 suniya10041 mjs1051 chhj1017 jspark3661 mk0505 webdevsladmin outdooraz cstyle2 yogoyotr6804 dsr62083 jewbling mmmobile bbosasi51 hgk5361 wooriv4 queenslook3 amadas woorioh coopnutr9554 livinjs gibrocom2 hyunju0510 coscostr0282 innohouse2 innohouse1 morn1020 costfetr6892 cyhealth4 cyhealth2 tfarmstr5694 ipaycbk326 searchlist.pmy jhmeditec coollake tjdtnrnen gyuho771 wooro22 hobongtr0513 jsdesign00 qkqh1617 tamina zeyo12 outdooreuro1 dialogic2 lesha12 robean2 sasari729 mttech parandul10042 kst1402 bbosasi isb12151 as1115 samohago1 foodome green1004kr1 eduts23213 clubdica sadbluerose hangju123 kapsik silicon63 qkqh1403 eorect ftts12272 bj1003 godointerpark superdhk1 metdolkimchi gaiasun9 jkd21004 anaclicom ho9318 redtough78 manijoa36 manijoa34 manijoa31 infos912 eueverpure2 kwakjh53 weert77 geddong imarketing032ptn pppman orzr2me2 khs2145 darkenen ktk0993 akstjr78 domemart11 hnaksi2 gi404admin sinzza netcr61-029 netcr61-028 netcr61-027 netcr61-026 netcr61-025 netcr61-024 netcr61-023 netcr61-022 netcr61-021 netcr61-020 netcr61-018 netcr61-017 netcr61-016 netcr61-015 netcr61-014 netcr61-013 netcr61-012 netcr61-011 netcr61-009 netcr61-008 netcr61-007 netcr61-006 netcr61-005 netcr61-004 netcr61-003 netcr61-002 dns254-4 dns254-3 morenvy027ptn pinknatr9125 tinda78 ks75b72 eticket24 brion4311 seo11011 joinxstudio mom0won ahnjb281 silverasun2 seawari1tr headintr3582 stylehtr0153 as0601 jschang9 taeky96 shoptr1282 jellyfish1 taeyangkim sugarjy chan501 kny1213 ichina98 durifishingtr kkjj0924 nohant hascos2 wjsquddnr enurictr4861 ppori2 salmon6948 marys-igloo.powerize parabol wheeya882 ynskorea hue3087 wineworld backshtr8387 painfred phototile anshhans1 unjung17 bsbosan daegunet dysky moon18451 lee1136 ilsanrc yeye159 seawoong228 moolzil1 infomax4 infomax1 hyoseob90 coretnt yeon0408 jit00400 haegung1 gursung march322 yoyo8 isplan dmswn63352 khan3815 jun10031 cucu811 asianain yoon01 ufirst11 highandlow taeuki eugenephil jssj0515 greum07 cantaville4 kjmy119 gkdlfndgl mudetppo1 flaming lee0798 inpiniti1 sponia95 pkgagu80 narintr7342 biyosekkai1 eugenephi1 gjrjsrkd ouangkn1 dbstmdwn hgyjsa mool203331 koreamall spycoffee hujung87 fghj40 zpdl161 imarketing031ptn mhke486 erumn0701 wjddudejr2 eventplanningadmin yyao auddlfdu isoral yewonnn bi80002 bboyan jphoenix037 jphoenix036 jphoenix035 jphoenix034 jphoenix032 gagustory zexcom kthkira3 kthkira2 kthkira1 tabacstation ey05061 sweetpack1 sdphottr4640 swimnara2 shj3449 tnchtr4676 gdtest-049 cmdesign16 cmdesign15 cmdesign14 cmdesign13 cmdesign12 cmdesign11 cmdesign10 buymi1 jhngyu11151 takyp2 sinsa2 dongkang-013 ych7877 seniorlivingadmin dongkang-010 jsa0821 vivianan5 multinaratr nice7174 gurdl1207 yewonb1 peppercenttr planetm81 bangang5 coreok2 ellisvtr3425 ppoip5 ppoip4 dudskawnd7 dudskawnd3 foodbay dldydtmd serserser vip254-16 godobusan-023 enstyletr godobusan-019 vip254-10 herbkorea godobusan-016 yubu cnt32321 godobusan-009 gkdms92541 simwon tobewing2 styleformen cham292 thechae2 rudy1248 badpoet na7282 haenim20001 soybonita2 ollehdo altenergyadmin bc20092 xmanjee1 vitacatr6990 luxurytr3289 minilever hmsolutr6091 leejihyec1 gatwo1141 chagal4 hjspomedi amarzon2 kchul9111 kimdaehyuni gt-camp bradpato gundamhousetr ftts1227 cham100 gnrecycle hello21c1 bomnalecom woong12062 yoon1 yellyky2 yellyky1 koorie69 yang2625 jangmoer lovejlovej1 vpn2crc giftme71 baegma2 rkqjsj1 agrnco01 y48199811 gi21admin tazale1 jiyaaa kimhyohyoun3 kimhyohyoun1 wdbyeon2 imarketing030ptn gatwo114 sgmania hansongcnc dyfkrl gi449admin leeah3573 leeah3572 leeah3571 bboori1 snp2009 moon17005 rjsgml56941 a025085 a025083 hojungga2 expertlounge-forum petitange morenvy025ptn iluminox gi211admin nobujang abalico5 hansgallary daaec112 gdtest-023 pinkicon4 pinkicon3 aramusic tdrp774 amaretto4 carstera foodallergiesadmin ynj6 akongs pswzag protool betahome tmx0907 joypolo3 alike123 editors.team happy23593 noduel happy23581 any49527 passimo57 hahaback21 kowakorea jiwon1 buybiz mir83577 mir83576 mir83575 mir83573 parkhahang js90203 js90202 foteckorea michs372 bizjapan sally7tr9258 okpack97 artmania7 alexno1 sjk752 pjo4422 gagastudy miiusnc001ptn philosophybag ensso dycal atechmall hue1104 rusi1001 barbiedollsadmin kiztopia minilca1 magajean trionsun kksh7028 johyomi todayonly1 zlwhs1231 bujacat1 jeonginzone rcpowetr8500 fiveray1 styx11211 body70772 no1cctv1 jgarden drimi28 drimi25 drimi23 venosan1 raehyun1 lastcamping1 wndhrl ksfishing cpt091117 dptnfrh21 beeradmin yepia7 a0250811 healingstay granvill k8w3s fm012 yogitea10 wonwoo2 heatertr4486 hongmessi koaf4949 bumilion2005ptn konkuk-069 konkuk-068 konkuk-067 konkuk-066 konkuk-065 somgulem1 konkuk-063 konkuk-062 konkuk-061 konkuk-060 konkuk-058 konkuk-057 konkuk-056 konkuk-055 konkuk-054 konkuk-053 konkuk-052 konkuk-051 konkuk-050 konkuk-048 konkuk-047 konkuk-046 konkuk-045 konkuk-044 konkuk-043 konkuk-042 konkuk-041 konkuk-040 konkuk-038 konkuk-037 konkuk-036 konkuk-035 konkuk-034 konkuk-033 konkuk-032 konkuk-031 konkuk-030 konkuk-028 konkuk-027 konkuk-026 konkuk-025 konkuk-024 konkuk-023 konkuk-022 konkuk-021 konkuk-020 konkuk-018 konkuk-017 konkuk-016 konkuk-015 konkuk-014 konkuk-013 konkuk-012 konkuk-011 konkuk-010 konkuk-008 konkuk-007 konkuk-006 konkuk-005 konkuk-004 konkuk-003 konkuk-002 konkuk-001 jgh09171 flykys13093 imarketing028ptn gorillakt1 flyforest dms33281 berry0007 mrteddy heewoon0 falltvadmin selfcrab1 jungjs3142 feelmedia tkfkdgo01 vuuv01 qhejrqh anykeyezon d431214 dinnovation morenvy024ptn cristianosadmin btmobile carpediem01 rinshua ydsm giftall yejj thfwl1911 kkium1484 yedo tendori1 gi298admin lubu1061 gunsa1231 james5272 likesam1 catcafe3 makeoftr4787 kamnol keyang40049 keyang40048 keyang40047 keyang40046 ljm19671 keyang40043 aszx11201 isofum2 isofum1 englandnwadmin jcym1537 jcym1535 colorshopping mdeco6 seyong10 asung291 labelladea hoidap fastjun dufkddl1191 mj5358 akdlfjtr8602 gi173admin homehealth1 carmemorabiliaadmin na5284 ddmris azazaz3331 ogapylove pozl0865 yain itk418 green8 yje4875 smtpapps mecafitr3291 lightmodel ae-admin wmcom1577 godoshop-009 somimom12342 chemical91 neoprize2 tmc8683 dancompany deehes duzon jkyoonc jjnara gi327admin heewon85 benefitkorea joinusb wansocar stayawake77 moon15193 darius211 kunstler2 kunstler1 ontiptoe bumilion2004ptn tnhawaii1 kamit2 ismine ipayjola0559 rudtn119711 eun1590 wizbook4 wizbook3 penblan wptndtr5678 annandy1 hanxiaojie1 globalfood1 minimaltaste hyunyx2 vividtt1 imarketing027ptn tonerpiatr enest asepsis4 wjswn73 mtb7679 enfid starfavorite bockshot1 garsia7 summerfunadmin ho5154 ddos134 ddos133 morenvy023ptn gary812 gary811 jeongrh1 heeflowertr urizone1 k123625 things1 yang0346 goeuropeadmin skinevent3 s2pdevsunny feel4 skarndalsdn2 cjtrophymall protool1 yonginmis iyuneun evenmore xwave sky2000aa kibon13 mario18121 aoupersona2 aoupersona1 oneself01 kjnet76 eomji7 ycleeforl cjcylee7 ericgolf cndizn tkshop-029 earlywire4 ya09 bc16271 kgswon2 kgswon1 ohdaejun kukujj soccerbu minetatr9974 tkshop-021 nalee14 ojiland godotechmijung lamodem leech12208 tkshop-017 liveplane2 white5now1 einein3 bas03134 bas03133 rockwall tkshop-009 smartdev1 bobbarabob1 seirart alecas yooo782 wwwmall gi439admin monicahair koo6002 hicodi baitas greendoughnuts livedo3 shimsb75 momipotr6212 crazyshaun jangle65 tig233 gi210 tig232 chadago epdevb gi208 thacker62 physicaltherapyadmin gi191admin pungnew1 bread35tr kami44 bastoni1 gb098 lemon8250 dbwjd1004 mkphw214 mkphw213 simsimq9 simsimq7 hm50061 simsimq5 coratex dalcomkids daontech1 toktokki charlieyeo happyyj86 godo177009 kakti2 kalito sooa5548 altaicho2 kkk6099 hjw8500 ssh83311 shellac1 bumilion2003ptn esecretr8940 koo5586 ipayetlaw hyunqok rhim1119 litta1999 ldy03021 zespa6 zespa2 godo176770 srynn1 soulful12 enjoybike shchdud cc.m event114 naknrak8 imarketing026ptn hk28914 knight76671 vnsy sjk8402 good365food ss2inctr2004 ahn1222 mudeuntr7725 ey12191 voff doosikl spacenowave rice9661 sportsday morenvy022ptn dvdva haendel chaawoo soccer11 iskra1 ocmart4 shug00 heeddong pringlesk2 w861104 bikeshowtr cacmall tnfusdl81 weisure00 silvercat eballet1 daolnet0072 daolnet0071 redhwang993 redhwang992 sjkw0414 ddolyka9 ddolyka8 shinhwatex5 siiyou saltlakecityadmin emcpb p0won01081 saicorp3 saicorp2 saicorp1 hhkim5112 yjscac1 nicekido3 pajama6 pnlenter4 jeongeun sinjin77 kyungmin-009 remnant1 godanbtr8389 saehan5340 autoconfig.whois coolgun83 venygood c1s1o1 cana12122 wkdrns09 gi15admin kemuri82 cmd79564 nearndear1 herbjuicy yoonwata commando1 gi444admin skinspecial2 ajume1 stdevos1 timeseo ks75251 tjytr5406 npaper212 kwakcom4 tinyeltr2933 autoplaza1 elju6 elju5 elju3 elju1 ggamsnet2 ggamsnet1 asiabridge1 starfatr7406 totoking3 eastvillageadmin phermia vium toolemart qwe912-016 cadboy2 dicovery autodiscover.whois bwchon gustjrr2231 sykim9403 glandblue21 shaians1 ylg2670 elime despresso vasuburbsadmin condance1 hanzone4 zeroxl plantgallery gi195admin cleanok mj23kr sunflower92 wassadacable sin51151 urer sa1004a bmw320d mahleria kotak04411 fourthb2 nycdowntownadmin jinnwon dlwngml672 missung ynsgbm wjddmlwjd678 alexno11 rydesign3 rydesign2 inasound aidpower iskins duwls2651 uucloud master375 kfinco1 michiget shoptr6378 yongilpak imarketing025ptn dbnaksi pmh0624 mbsool unui eprincess1 tyg3 loveganome yeahyayo11 gd3363 skorea20101 cosmogoni gray73 hyungje ljs3943 hibini morenvy021ptn ver5 ver4 comprarautosadmin ink2150 parkts3242 jbhg1231 canopix3 cnccom potape wecomarket3 wecomarket2 jj4ncts cncbuy only114 jinana004ptn parksee8 batekorea izzang65 quiltquilt1 wjglobal erunner2 nhdcmart corecube key4989 jaemin205 jaemin204 smartpremium refurbishadmin missred magicyi1 pdy07911 yun890804 nightcoffee cookingequipmentadmin ssinsunwood joypartners whtpwls3 ukino3 littletommy7 happygrim7 yojan5 whats1004 ppippo omi0927 solmi213 tryp tryb dfactory005ptn choijy8767 happyzone1 bassoj libbon3 ho59ho1 nodazi90902 monblank moonares pszoth8 dbsthf12 kuiry0 hyunant enters envious1 silrupin2 prominwoo2 mdbaby butgod skiingadmin dandyryu cdma soccerestore konkuk-049 safeuni knou0505 inteck2 rugga24 taeyonintl1 doori91 www.3g akabelle hjkhjk1410 nailone1 kodomo enteen motor6292 ecopyzone2 yonghun23 soho10045 dspnf bumilion2001ptn vlclgmd thehogeon2 thehogeon1 ekhan ai7412tr6555 redmangchi artherot8 artherot7 artherot6 artherot5 artherot4 postshtr8475 brandmall godo174774 chimique dbsrud10131 cutygenie dsone imarketing024ptn heavening2 leehyejin1 cgolfood1 ymusic13831 hantmdwls ryusoyoung ipaysmartinside4 ariel2023 kdemall h42310031 morenvy020ptn greenyou494 kake28 beibet1 chul0830 cha03305 jinana003ptn yedam21 sehwadang dsmnf zalea arrum486 combacom2 janusre bngintl yasira1 nemostory photonart alani1 conadeli ucpb dreiburg gurrms84 jjrepublic2 ekcis mamapai zizibe5 sseryun1 suip moamax4710 merrygrin saypc15 youngstr6157 heavenjade kitlej1 ziziba7 jcd5144 t9 outriger7 roberto17 thepose1 rook1261 nfmbrisbane the30dtr1835 butaha ch2365 gi201 basecamp65 mungkle27 omh8915 mungkle25 hongmans7 jlove7k boram30031 gcsd33019ptn naturalmomo2 ssok daejonilbo edmport kuhsre minifix8 insun09171 yii ohydragon netserv3 wwwalt encoree yim9885 lottoherb uxc3007 hotelsadmin mj1205 jjungyk2 pgupnpgdn sonicbio12 incross pc0905 welltuned buffalotr sindoha led21tr www.verbraucherschutz sjwang211 passionsubit1 intcln1 hyr882001 rjmhouse csb vivianan ecoritr5876 alqorzmf halu08152 mpizone3 hanxiaojie gi200 atheismadmin gi322admin assignments na1010 asia63661 soho100410 wkzid2 wkzid1 smdv5000 dingdong1 ezpro1234 zeroboard kiwi045 tjwls80 dev.intranet geuxer2 godo58510 accmania davicom audio-bay spo4 ssupltr6200 nice0472 llim98 redgrape1 tlfdj22 koizora6 koizora5 imarketing023ptn chul0075 kanku76 powervk robertpacino1 spai ipayamatchday sogm mirimkim833 mirimkim832 joo0575 gomdodi bethelav1 ipaynomad62 sala70-020 sala70-018 sala70-017 sala70-016 morenvy018ptn sala70-014 sala70-013 sala70-012 sala70-011 sala70-010 sala70-008 sala70-007 sala70-006 sala70-005 sala70-004 sala70-003 sala70-002 sala70-001 lavazztr9156 hanacome4 yeppy671 muyoungs slevin4 neomin21 ppod102 jinana002ptn imarketing070ptn junss77 core741 ddalki0111 jjoojjo okabkorea ojas201212 ojas201211 ojas201210 limhj925 backshtr0601 clsrndid photomate kss1762 lmj52501 kbs60160 mbj1752 pygetec1 kmg21216 ndk0719 giftlg365 kaienb hak0312 soo9236s bogosago6 bascon jikyjeon orangesptr3 orangesptr2 orangesptr1 khsdad joejylimtr dscm1 cartechadmin hojung1 tomatoi5 yeonsung-090 vizworks2 vizworks1 showy1 dla60253 skjp taylortr6432 yeonsung-088 mingihong nakiha1 seven2012 gcsd33018ptn lovegomon jlsi1459si poporu enctotal hiroeriko godo279 auctionimg godoedu-021 kopasi eijih lolipoli tsj01080 godo275 truelinks uneec68035 drim365 sincomo oznara11 hangingchair krap635 krap634 shplus ohhora777 missc15 bigpig043 behip87 honeystyle finalcooo1 santa114 remixcartr trykhs carsmith dubero1 soojlee71 uhmting2 lucedeco jangfood bnckbr22 heartbroke junsic1 sgtl migafotr9290 goyuil host51 ko32288 ko32287 ko32286 aramong1 ko32284 wlstjs07192 wlstjs07191 forpuptr5490 mihcelob enepatr5166 cstool3 isungnam memoforyou buret6 host46 shinyk06 nananaksh imarketing022ptn test18520 designzibe logient seum petshopsadmin gointsunny zzang09061 kbsvitamin flak882 suyonga7 luxfertr8958 bkc86111 strat791 koo1411 morenvy017ptn metro71114 lampjeil shinyi61 turiya66 punchto003 punchto002 punchto001 gollmoo jinana001ptn designmaker yeonsung-070 baxo782 healingstay1 inhee1008 shoptr flyfishingadmin demoselffix mirmirtr0954 personallog1 ymkm841 okham621 kwc0620 jjgolf cozyroom1 ho0010 popino diychoco1 jerryim capotr0570 euna0910 ssdbr10 buj8131 euroshtr5237 k8w3s2 rnjs91315 menstime3 menstime1 kemandwb tcentetr2067 clients.pmy suken12282 popo77 jeonboo2 jeonboo1 sportsline-ver4 spbq1234 dalcom85 fishingtv9 myshop-014 fishingtv7 ykn0628 xartcatr6602 ssclan2 pophit min35841 yhjj3 simbaddacase2 hd55131 yangcheon2 y989212712 universoadmin haieland1 syj32562 lwb62741 ldm1217 beb gcsd33017ptn jjhdha dfactory002ptn sa05311 wiseket1 mvpp10 hairintr4904 myshop-010 shda100 kpshop2 kpshop1 kankan1 egtai akiapc ssodesign gi10admin houseplus3 houseplus2 s2pdevmimi shinwoul eibe1 puhaha275 kkk1311 gi438admin dodocupid bbibbi colorline1 sincez3 jojia692 sincez1 safecomtr mineralallga lat1255 asde717 sksskdi601 moorkoreatr xcolletr0603 malgum1 saehan1006 ingemail saehan1003 ptuebiz-049 spsports fastpooo ptuebiz-045 ghkd1603 omanmul mint67825 ilrang1 xpop4 ptuebiz-039 goldcrtr3577 vvstore2 misowa4 misowa3 misowa2 misowa1 krownbtr9246 cma7539 digitalsori sortie4 designlink1 ar0012 ptuebiz-032 phinix2850 uditlife ksj83351 ptuebiz-030 chorong2 shaudwo designline5 gerpfile minicong ptuebiz-020 chamalook1 newsissuesadmin hby12201 imarketing021ptn gobigstr arsenic83 gports yeok78 ptuebiz-010 koreadaco czeon charlottetownadmin ptuebiz-005 egreengeo6 ppymangs jjggoo morenvy016ptn doyoulove kf1234 eastline1 safewater1 friends0447 karl2plus leech12209 ina2011tr jiphan cyt51 shawsank1 johnj213 jjungbal clove1 mvisking mysql04 wnddkddusgml2 edugreen8 sansamm1 simon3979 bomi05261 webdisk.perm jeanfarmtr roseflo selandshoptr cabosan studiostyle1 gpdbs09 clothe reve19851 pup7 mi7437 bluesea9311 taraswati bara38 jlosak1 hangaram maxlim apumpkin foxlike929 rcdh foxlike922 foxlike921 vieltabagyj bkcat05251 ehara o1045295435 hangilman untitle0 ybibo80 elance2 elance1 mayi17 gcsd33016ptn maummatr7381 dfactory001ptn byhemee jichul5 gomasil bigstons3 bigstons2 mayamk gskim3015 jinvas france88281 gi200admin enterlink hbtgt0828 maxion poogaa gucciman7 ssncc2010 somee5230 s3freeintextacy mail.39 y12600831 c653219 hapsung efree siena1 ver3-ext jinuc1 jeffkim75 harcayo misomo1 sinhwa69 design0jang dhejrgtr7517 rsk2577 morenvy3 morenvy1 go4364 woodworkingadmin tomi1242 tomi1241 signtotr9219 sinta271 click2buy zendys samho9352 visualpun chan88191 metroden able882 dainemall dongiltr3463 amazondvdtr s3freedevsf jjangkkw eunamall2 sunplaza pung07084 pung07082 littlefarmer7 swkim0831 littlefarmer3 littlefarmer1 koreacake xpege philadelphiaadmin ryuseong yeson1 priest65691 s3freedevnj racerelationsadmin sansam31 moderntc1 nt002543 s3test2 s3test1 bionprime jjm005 aron4097 hk22827 hue11044 firstaidadmin galbimyoung serverhosting morenvy015ptn hoon27271 pode flyforest1 historymedrenadmin chsjin1003 tibultina1 chemicalguy steven612 s2pintnj zenco2 tyvldahf123 jm19851 luxurycity4 cervicalcanceradmin skhong321 qltkorea6 egcom miznow suny0286 djdental sik830 srs1275 swy99881 teukwootr jgh0735 jinu34 mkplaza112 qazz kwonsss spdkorea jja0521 misoful injujung3 burlingtonvtadmin jayeontr4710 aries29011 click71t3 svn-fashion oys12471 bikon4u tendgolf edenkorea snghyunkim ossw kwonss2 kwonskw westside18395 othe kleenup1 goldonsmog7 huppiness classykr amin77271 rcfieldadmin gibackin yesb2 yesb1 samisound hmedical1 modernlux wlikorea woom012 s2pinthn oeeja4 godo169165 hnjiho132 redstone96 namu0369001ptn itk9099 hntile4 nggift11 infobank doobagi2 kleentek soonetws jirobotics jjoonjang1 yepia mky19911 banamoon7 photohow1 jangcong trust4 kswigo uniquedonut2 test15695 sidmar byoungil81 rizhao8889 republic391 te8ayo ggplaza1 coupplan qhejrqh2 qhejrqh1 jinix1 rnskorea3 rnskorea2 dawun0121 kimzzbcom1 jdb63813 rnddevsj ysleeb1 s2pdevjonr saekcci houstonnwadmin semicolon6 goksgo1 yeain00 highallatr bau833 nyhc aldhr82121 efolium doomall nwwp imarketing018ptn pcnara213 koko3817 mylovecx2 jinhit chojinbal aneuntc3 fix20244 jjangair ybhwin1 morenvy014ptn willbeok3 bank9688 christianhumoradmin kjn18243 kjn18242 documentariesadmin bigcoffee2 alfoodtr4354 answjddbs82 aloe05041 bums2251 bau639 fashiondesignersadmin junkg0001 motor1004 gi316admin dodoa arcos001 kwons71 mentodream5 mentodream4 mentodream3 kwons55 kwons54 kwons50 kwons43 quinka0707 kwons39 kwons38 ggebi17 kwons29 kwons27 kwons26 kwons23 so4879 wantuphone1 kwons15 kwons13 kwons12 mbawool gjwjd5190 s3freedevmimi pk-2 tstyle1 inntzone cck5846 hidochtr6423 kunduun join001 metrustyor yejin skarch kjs7494 serverhosting240 baro8949 serverhosting237 garagesadmin bumhokim3 giftall3 bumhokim1 giftall1 kimsunjang foruricky usbrand0301 nsta idea1007 serverhosting230 kbk8246 sekamotr4627 tx.js.get r23 jejy1029 s1intsky nsoa freshd1 whitefeel122 raeslor jang850314 cwith draw10033 godo168211 reviewtr3247 lohasfarm jindam dj6058 olive10 ohyo ogolkei r17 r20 sejinkid s1intsdg ukbul1 pckbook ipayatop0001 sohojob2 aspiringirl bluesunh7 jinbt4 nsan kaisership3 bluesunh2 serverhosting190 needfor3 treesandshrubsadmin xkkangi01 shmj73 oitalia santintr2102 ekfashion dypowetr8234 moani001ptn serverhosting180 jinana id41004 gowj21 polishes ginachoko1 hair1009 adamspark1 jangboja bangup capecodadmin ohhi dontlee serverhosting171 oxenbed2 serverhosting169 hdq1121 ynmc89 wangpanda3 wangpanda1 bstjoeun-020 bstjoeun-018 bstjoeun-017 bstjoeun-016 bstjoeun-015 bstjoeun-014 ipaywakemedical1 toystotr3977 bstjoeun-011 bstjoeun-009 bstjoeun-008 bstjoeun-007 bstjoeun-006 donia bstjoeun-004 bstjoeun-003 bstjoeun-002 compnet99 seok5582 rotifl2 latinocultureadmin singimalltr sorento800 worldsocceradmin halu03011 imarketing017ptn rokmc7483 serverhosting150 serverhosting145 ddedon kwak09791 ecwox pic2942 yedo1 edu49 edu48 edu47 edu46 joo7242 edu44 edu43 edu42 edu41 edu40 edu38 edu37 edu36 morenvy013ptn edu34 edu33 edu32 edu31 funnychild edu28 edu27 braun edu25 edu24 edu23 edu22 gi433admin edu20 edu18 edu17 edu16 edu15 edu14 edu13 edu12 p13n stat10 pern0303 kidmusics mvpp tti777 cwpjn81 urinong wicked0827 serverhosting124 minsstory choice00211 needlepointadmin amdesign6 serverhosting119 amdesign4 05lead domeketr5519 maluwilz1 han10711 seahauto1 levisman mvie monkie16541 serverhosting109 iconpower mo05199 mo05198 mo05197 mo05196 mo05195 mo05194 mo05193 parksunjea1 wishcompany serverhosting105 rafjeon s1intman mattya kkang17011 anthem025 dudshdtk4 xfilesadmin zecjojo icd9004 icd9003 divxwant5 shinjiwon zzari7 hansang4862 zzari3 soundforgetr xnsytr6592 primetest hosan111 muel n2comm lovehanna spacectr1616 zoodesign kangbk2 maidea enoliter tnzone2 wico9160 nixy condo gcsd33013ptn kk0040008 bung25 mattia homenhouse mhtoilet tnqls2023 mamacloset1 taiguk01 nikekids sejinbiz realpicky1 reedmall jesusani cookers2 aboobar neocla7 kji135tr4770 share88 njco www.hbh toodury701 sadream yjcompany81 roast5286 jerome1 zzamti jujudeco parkjoye lyun kiboonup literaturaadmin zzange rice0905 golfzen truan1 tweety0501 qwertyu0303 joinshome yoanna gutaguta2 gutaguta1 dlakswjd81 packingclub1 ssayer1 siason hellofilly bbodongtr ujkim7 xixi21135 xixi21134 xixi21133 xixi21132 xixi21131 ba2sports skmarket247 skmarket246 skmarket245 hostingtest253-170 skmarket242 mutu14 mutu13 mutu11 gi184admin mot2 silinmaum2 apc9 queenscloset ybilion mntk tetsu1999 mioggi2011 drbodytr mjstyle1 majuro1 montonson1 helpmatr3787 www.pki ajs707 bumk22 ecoco designtory morenvy012ptn blisscamping ncs4011 meprette2 poorbotr9474 bedboy782 formtabc keyang400423 keyang400422 esusanmul upperlady4 keyang400411 keyang400410 hapoom333 hapoom318 cumni gaonnara2 anytube2 kslee41 swshop13 swshop12 swshop11 kookjaets jjuni225 hanjh04011 oa4u mmix mnbc kslee01 shee118 elaine1 kennyrtr3273 nasagirl2 nasagirl1 balanceline jmmart00 neobob5 neobob4 ipaymaximagolf sunwoowd1 neobob1 eversell2 eversell1 jey6766 hkfishtr2422 clmart t-na tdggolf2 cpftl33 gotoy7 masull epari0208 eyaaeyaa1 aqua1151 hansollife aderskr sbprobio s4st megafish woongnyu82 netzang69 innerweb5 wksjsn junsic-023 junsic-022 s4qa j1224h1 junsic-020 junsic-018 ravie2012 linux11 derkuss070611 any49521 sds45002 wpdmstkfkd82 carrots1 masss1 junsic-009 s3freedevjonr junsic-006 s3qa gaylezsladmin tndorskfk junsic-002 jikku1 gi500 poorbotr8843 oldshot yhsatti13 bluebetar haihui herbalifemall datanlogic1 scholarj4 plasticsurgeryadmin gwellkorea1 saludreproductivaadmin mgs7 a01118a hairplustr ikin0704-010 halimmalltr1 kittysh kendoo1004 pascal75 imarketing015ptn dlarlxo uriiyatr3460 www.controlpanel onedesign003ptn bkfashionmal sehooni ardorwin5 doubleyoubay jhengsungil shuzai.europeanhistory adrianmole accountingsoftwareadmin koreasound2 inseo75 tohwantr6957 morenvy011ptn nettictr2174 backsee jesus307442 granjete jjangbaegee1 ttmedi1 ddmshop hardess802 summonworks1 ninefruits lietime99 mdml yoonei123 yooriapa8 yooriapa7 yooriapa6 ipaymiha124 yooriapa4 yooriapa3 saegida eoasis lnbi jmhn1015 shop.flyfishing martmoa2 eutti204 jeonlatr4684 yasoo medi3651 cuclo chwnm20123 voltonenm2 shantih lymphomaadmin erchjinho victorssi mbri dldbsdhr jakujaku1 capdialog1 nanumcafe boardktr6805 joy0120418 ttldrmt1 ujini1 ebizs gungantr6670 maummind leenayoon neoncho1 hspcgreen souskin1 k3238 scalix waterptr7232 leedaeri silra spielwiese gi477 woodmoritr mediabus2 161 thebaram missmore marske techlene2 sosl205 gi476 naadia77 gi474 s2pqa mute74 foursbiz05 kukumada leenawon1 gminter heyshotr4633 ice97900 mysql0 point1 gi470 diyya eveni331 eduhope1 pisirusi1 liet ai74123 sfsdgdsfsdf troikatr1776 adioslee xchres roomsearch1 smile08142 smile08141 babycenter echohouse studioakka1 golfgs1 marre1 electee1 chrezotr8204 cookcore billyksp kblue06 tbaksa designshop ipaypurmir81 gortez joo4348 imarketing014ptn mingoon6 mingoon5 mingoon3 mingoon2 mingoon1 badasky dbsrnwl2 otw01 jyav onedesign002ptn aya04265 ddanga zigprid701 jhshin flspent jwny ujin70 inkcasting maroo1 celebritynewsadmin morenvy010ptn marom3 marom2 eanju happysangja fa9390tr4632 warship mi1640 dbckdgns1981 4989119 doumzoosio welskitr4589 godoid-009 yu0404 mart3d star2015z pazziya mobilekr juun yasan66 asasjjj jjung214 salomon2 exitmusic12 jjin871 goready2 thenew452 cacaka7 irion1 bonanza24 mirz021 silkworm1 gi311admin sunwooland2 backhee gusxo02236 leej1001 gusxo02234 mvp21c dive1 gi290 koyh01301 fops0045 kkk73324 kkk73323 heoshey chohwanwoo s2pselfrelease laum lcbp spascal1 cdb1719 shim09 florytr0668 park868011 isak12 baracoffee cookiepet2 logthink1 musai1 gi460 gcsd33010ptn healthpia1 cskcs academy-030 academy-028 raypark academy-026 academy-025 academy-024 academy-023 academy-022 academy-021 academy-019 academy-018 academy-017 academy-016 academy-015 academy-014 academy-013 academy-012 metrigen academy-009 academy-008 academy-007 academy-006 academy-005 academy-004 academy-003 academy-002 academy-001 saramsai42 briquetrib1 operationstechadmin goldsea dh9696 serverhosting254-241 kcs39014 thsdudtls oopsi1156 cdmacs11 gi450 serverhosting254-240 yaesodam mobiledevicesadmin jeje93kdy ruffa76 ecare10 ksy103 pkwmyth4 pkwmyth3 freecphone1 totorozzang jiworld3 enjoykon moonjw7001 okwhitelily hm35846 chorc newtroll librosadmin youstar2 redmin70 shcandle3 good06084 good06083 bakingtr6528 kohanee ukstyle1 goldone dvdlife1 ho55551 soccerdom4 imarketing013ptn chou7 bigpaprika wj22745 maryhotr0525 onedesign001ptn happyliya moon01021 lth1260 rlice1234 mi0728 gosaib taylormade2 serverhosting254-229 mblbumtr8147 crok1 img22 mika7073 edugodo-009 morenvy008ptn gong1225 ipaykies3341 ebizcom jio841 bizcbusan dingm sinic291 zespatr3559 eunsil0613 doshkorea3 doshkorea1 tomalgim tsgolf leviolla ksqms2 godevsunny mylove4u3 mylove4u2 mylove4u1 gunp75 ityn harimeng kddk img20 ifishlove newgolf kcis win4eva img18 jjww wjdwogns628 istn moonxoxo2 k320sh1 rain20722 isoo gcsd33008ptn img17 mari00 dhss5 kthkha unibasic1 shippingadmin enjoydog childrensbooksadmin wrice goodplusman jeju57888 wlsdud6222 jinny38182 larc17291 img08 darkvgirl entereins yoshikisuny1 cafemaster tnckorea2 jjang2011 img07 ddmsal4759 ujako89 ujako86 lakki2630 ujako84 alatda77 firstled sewingclub imarketing3 play04001 friendlykids1 ddomddom honeymoonsadmin serverhosting254-209 vipjuitr4157 ssunshower medi1193 medi1192 gi442 christ101125 firstju1 happy06063 enjoyday71 yamakko831 pnk01180809 img19 bbmmart2 pnksol13 y2bcom1 plcretail shinpei2 halladonma1 tradappy1 llkmll cheezsaurus4 cheezsaurus3 cheezsaurus1 market2013 imarketing012ptn oceanblue1 sugarlong1 gi440 sltlwjf1 rusidnew1 madetrue brandbaby kkma1117 dearderm hanna5291 wane1277 felicidad6 imys sametour trioutlet2 lawenforcementadmin a1.pwr.a02.f4s01.logo morenvy007ptn ucomedia1 s4intmimi deokjune ds9324 serverhosting254-201 ksowlv o8naman2 ssspsysss7 paldorok ssspsysss5 great8403 ssspsysss3 lixxi2 lixxi1 serverhosting254-189 saedin3 sadmin2 gnoneint1 pnppc001 daytur eightday ansdudwn12 midofood1 tnxod0430 jebl jworld2 dguri jdis clifwear ahzoa5 wingworld wkaxld07 wkaxld06 wkaxld05 wkaxld04 wkaxld03 wkaxld02 wkaxld01 capra782 nonstop731 heypon a1.pwr.a03.f2s02.logo shumade healsdak1 kokozenytr7919 kskim36 kskim35 sina119 kmyhsid hvco furnioffice1 simdae1 autodiscover.entertainment hsyo goho69 dafishing4 newyanus76 boy50402 knpiantr9201 ruhitr7902 headcom iop2621 jssh0802 hspm uhan2009 supeolle2 ipaywelesclub gcsd33007ptn space8943 dj0123 gi427admin serverhosting254-179 scotland lepio00 als112tr8265 goldbal moyhada erogizer s2pselfdevwheeya88 admj dwarflee tobaccon eedentr jijon09891 heylux autoconfig.photography farmsea dfactory004ptn hsdc catstree aiqing y5001242 suho91371 h140498 heykyu cubeqam cubeqah bzjb1 ugibang mallmallmall gemspell mjstudio farmri1 jeon2001001ptn xbogx1 dcgolf hawk21c1 xgodo smile5457 sdcran jeongtel1 jwork71 tahang64 italia2u dlenfl86 enbmt78 jch102310 gxms bagpia lgk327583 berymilk1 mapget jjoggumi002ptn sosppor1 pionext juliet0691 an19400 anygear1 smartpuppytr doctorphoto morenvy006ptn phoebe56651 yesdaehyun tnhawaii02 tnhawaii01 hmss crc11 angela02173 angela02172 styleftr0769 pionet3 pionet2 artalltr dlawk1234 dlawk1233 dlawk1232 dlawk1231 iampartners kyoung0915 khjin31 idix milleiber knpiano gbicom1 zeejun ywdeco21 wonhh74 autodiscover.antiques chinasample hjpark4 hjpark3 hjpark1 nebalrokorea aeroc171 primenext incubus07231 pekoe44 chicgirl84 mentopark insaero vyard a2232682314 mbkangtr0339 topseed enggul smoothguy1 needlesladmin bravolej osm5353 designnut1 cjy05131 grym webdisk.beauty ekfrl1007 gcsd33006ptn power8029 counselling webdisk.promo tonyhaustr procnc1 sohokorea30 min8938 autodiscover.financial oderi2 tong043014 byjen jhome1 cw153 soundmedia1 sohokorea19 scalemart serverhosting254-149 fdoor1 dpency7 zeen77 dragonhwan6 ipayicewindow1 dragonhwan2 jinwoo7922 jinwoo7921 eofldjf2 eofldjf1 menpico gold7771 jungpum kspack ilsimdongchetr berry6600 snrn0111 godowebhard lbj0202 higb dameetr5725 bamboobebe cubefnp mansa9 wookh oxengi insaart frandutr8883 angel2468 vnfma215 rental1 wssin6w5 hayfine2 specialists traceroute glsbike s4intsf kji59821 ssusdii myfitting woodc helpboy spike0330 bnjmalltr s4intnj kjbaek1 hop2yun eneuropaadmin sciencesladmin lsinstr gi178admin squadsb sk92791 gyoungdug imarketing010ptn cooky panchokmul2 soripes s4inthn jjoggumi001ptn enfmedix safeboard up5907 mjinst3 mjinst1 gi430 sportsmart sullsull cplusadmin morenvy005ptn henb cindy8121 khs535-009 hyunjoon941 spromotion kdypsn5 muns45 khs535-008 sweetforest1 lyusia julaikorea1 biketek popoiland norang10075 iamsoyoung qcidea1 jungs79 psalms151 sinchotr5575 como2 bongsem1004 jsjang693 jsjang692 ijoaau2 nemodol orangeave1 hj1000y1 dogmanse mver12 goperuadmin dons823 teatigs1 jwdleho1 safecompsladmin redbagstory aserving amapspace01 skinmecca bioflex1 stonehous emmarttr7025 s4release unto1 kika0505 s3devsdg bikerak gi420 balgolla craftcream enfid3 enfid2 chrisjlee sehee50871 autoconfig.entertainment junhair gcsd33005ptn sheet2 webdisk.photography jcphone wlsdud3243 soundstreamtrans shinhung1 garam4292 sj8410022 goodqt meepobtr2122 muyoungs2 umjui741 parkssgood bizcdaegu jungo87 thestotr5627 won55 nstortr8909 fox4864862 today242 cutqueen gike gjam manjdk spio2tr munib1 alrzldirkwk2 parkk018 jjungeun1981 backup90 gien snh4u2012 chindo214 dnwls21 sangpetr75636 jeonga12031 hakmaeul ssh9751 orichair gomuin rogellean jangjunu4 jm10301 kuc012 ghey feelux cafricool1 zetmin3 cello2017 misojinal coffeeteaadmin backup69 gftp mangno gi414 autodiscover.photography kidscollectingadmin gi410 lovelyand7 annaflora1 gi398 ypp000 sinicare backup57 krukovo kimlleo saskatoonadmin sbgs22 kjr7846 sasari7217 sasari7216 sasari7215 feelie anewface7 nndesign2 anewface5 gerp gomsin guitarbugtr jhl02001 nasagirl lion9898 rikyjeon bancrest mooyemart hanaro38941 morenvy004ptn redmanso1 jumoney h2fishtr7956 footmart ener18 ener17 tod0108 mikilove2 boanmart3 boanmart2 tscorp hm5989 gongzi shaina1 toyfuntr0890 jjtamna1 smc1052 smc1051 jhmoon serverhosting99 serverhosting98 serverhosting97 serverhosting96 serverhosting95 serverhosting94 serverhosting93 serverhosting92 gongte sevenbiketr gi397 ligtime1 bware kcc75731 bikeing geniuseh reikaz2 godo158416 revive22 hama1245 joinshop gi406 baekwh gi2j koil09091 unitrust2 leejy1229 danyangok1 lamanh bwlee wskang7 autoconfig.antiques wjtsyg gasinaeya ksmkoo zecipe baekop ljm00552 autoconfig.financial webdisk.financial dastard1 k2worltr2721 hohyung webdisk.antiques smiledtr3201 hkm0803 gi395 gany gcsd33004ptn utub1 kyungmin-029 esmt sesdd9546 inbeom20023 vlvl933 gi404 kyungmin-019 baekby strabbit mtvice gi403 nocsunfood gi392 boazfood kkk67082 topjjoo lightree roulette gi295admin nmj851 espclothing emmom1 leeje1125 soyou1221 bigstarkid s2pdevsunny2 ks56906 aone4945 ahzlomall1 bikefac fila0116 fk5577 dndauto mbk001 ejrdl21391 ahn12221 gi401 silgange dasung1 sunny386 caravel73 wcanopy agimanse chhubcas2 lovegate7 sgirl33 oatopitr7394 partydress imarketing007ptn yonginmis1 sudaebak1 kssunmin1 gi389 dptnfrh2 uamysoul vispelar7 peopletr3877 morenvy003ptn badu78 ynskorea1 toolsdev kginicis yurigudu81 sonmk1122 enha duuub2 coolgen jsoutlettr southparkadmin ranger12881 autosusadosadmin zona671 teamo1114 jangkn1 daontech sm5w80 skykeeper5 kyc5398 hcompany trione2 trione1 eloi wellbest kki6564 greenmart21 mocuni4 poweryongin jeay0924 bandykorea aincom silhihi aqua982 aqua981 xotns771 abrahamsheen1 thesuptr sleepspa skylink steamltr5295 pluto0628 viewzoneintl happyfoot kibon131 w415chdl keelisk1 hohohomimi9 hohohomimi8 hohohomimi7 hohohomimi6 hohohomimi4 hohohomimi3 hohohomimi2 hohohomimi1 gcsd33003ptn ejnj cooldk2 badkid debak aqua792 aqua791 clary777 qosse01 baru31411 bluesunh2-039 bluesunh2-038 bluesunh2-037 bluesunh2-036 bluesunh2-035 bluesunh2-034 bluesunh2-033 chuckman bluesunh2-031 bluesunh2-029 bluesunh2-028 bluesunh2-027 bluesunh2-026 bluesunh2-025 bluesunh2-024 bluesunh2-023 bluesunh2-022 bluesunh2-021 bluesunh2-019 dauri9 bluesunh2-017 bluesunh2-016 bluesunh2-015 bluesunh2-014 bluesunh2-013 bluesunh2-012 bluesunh2-011 bluesunh2-010 bluesunh2-008 bluesunh2-007 ojas20129 bluesunh2-005 icmkoreatr bluesunh2-003 bluesunh2-002 bluesunh2-001 duaeod78 jsh1143 hgh9112 limeplus dorangmal nanulee21 egoist1391 whitehometr ssb04091 do93099 do93098 do93097 do93096 do93095 do93093 ksd09132 ksd09131 ipayokfoto gomcnc buj813 pnksintl wishhouse wonders quarterbag gi353admin gi380 chamalook www.40 babyrb studiostyle koreacm2 iamymj1 gomast crom4404 vodasipi es4self kjnet761 osgagu1 dlqnftiq1 splaybill3 mukmul kmk5719 macdesign1-010 poke1007 dhshop17510 dlwlsgh03 kyoulri imarketing006ptn ssk5589 shinkee1 jwko21c1 chaos19952 dandjik2 dandjik1 hvi21153 hvi21152 ripsoul1 www.49 min21321 ver3-biznet kth4989 luviewtr1058 cookie2 cutesarah3 goksgo gbk2073 miffy30412 revital1 dongyang152 go1394tr dcclub trizen www.47 morenvy002ptn rossi3 eduo ecocanvas1 chha9 pirenze71 www.46 ash4287 chocogtr6562 changstyle4 kopasi21 enrental181 enrental179 edu9 edu8 edu7 edu6 www.45 www.43 gi374 www.41 santorini outstage enrental176 iri750 sonang79 enrental171 edkg enrental169 cookers mychoi01 bbcountry1 whataplay2 whataplay1 www.39 golfya ecoi enrental162 domostyle001ptn gold5tr enrental161 www.38 gi370 nc5manager cmcr3 pongdang1 golfup drjungle depaola1 enrental156 cpm2621 enrental155 ggosijoa safecare8 safecare7 houseplantsadmin safecare5 safecare4 it2gpc-029 wnsdmlx jbk7143 hotsauce1985 ipaymiha12 golhs1004 primese3 primese2 cozyrang1 it2gpc-022 sw7114 www.35 it2gpc-019 www.34 tecumseh smile0814 cakelatte st06072 induk golfgs goaustraliaadmin gcsd33002ptn it2gpc-011 it2gpc-009 aimbio malarb jaks2233 errordb www.31 gi366 it2gpc-005 smpys715g it2gpc-004 pocq1004 eumby7 bongver4 wldb5568 kmk5116 jang62510 daezanggan1 julujuly ns3000 dimf s2freedevwheeya88 zigwatch sun99251 morenvy030ptn dreamfield1 do91 www.28 ohdaejun3 leespocket kukujj9 aka082 sbk nonmission afroamlitadmin samdo02252 www.sbk pognibiz maxfeel1 primehtml soccerboy kku19781 gi422admin mistyle1 swenlee junee11 soccerbu1 dbout mimineaqua1 polomixs2 golatv studiostory selyoun2003 guitartr6386 bsfactory gi360 thgus99311 yyh1204 byha onlyalice corefit12 cindy812 endiettr7344 nmckorea devu imarketing005ptn jereint ottchilstore1 aznymohc010ptn polomixdb dbold gi145 cindy741 gi470admin walesadmin autodiscover.imagegallery autoconfig.imagegallery bizforge jh56441 hessed morenvy001ptn webdisk.imagegallery love05tr ilrgglho korva52445 maket1 smile0225 wooricoop3 dasung ty823096 banghanbok s2pdevwheeya88 darknulbo17 mx100 papameal1 leech122011 sleepy2 podseowon yyu35355 hgh911 makedd ct04 boorusu enaroo grandplan1 ocktool1 dbmk2 brandtown2 nanzzangna5 ddcr gi350 primeins lhy699915 inurface cwj0933 cwj0932 hyteid ksjs12 alsals71791 qwzxmm jaeil13701 baberina001ptn catsone dbmk hcseafood oroanreb2 bongtooi geosunglife wkrkfcl001 jerusalem dh88 healthplanadmin dudwls3498 zucca1 gcsd33001ptn wizstyle maxbest1 bestsellersadmin cotton3 happycyc1 love1002 herbnyoung dkhousing2 solee1120 bsm6 ys9914 jjmk123 chyc hanxs71 maureenjewel2 burundi trikke booska1 dongwon5 dave2 skblossom1 rkdeoaks prochoiceadmin eclipstr collectmineralsadmin kingcome kyky1 jmelody icenerve enamoo wilywily2 mh2012 gfeshoptr iveloce cgod golaadmin royaldtr3914 leehoon79 uro4122 sk8mania lwt2013 bbbusiness dasom1 ipaytamarama3 godomall-060 www.29 alleyhouse6 gi339 queensadmin rayfoto gi336 gi99admin footidea yog05192 gkssk020 kyhj1022 gold2523 imarketing004ptn polarsoul arkas22 gi140 automotec1 godomall-050 tanzania enaksi sawoo45 ty1029 gjim0515 loan2345 ardormin2 ardormin1 lookihyun koreagolfshop december12 hl3qye godomall-039 boem gradschooladmin twinborn1 beisboladmin bromang gugu59203 dizzy015 gugu59202 gugu59201 godomall-030 novelasadmin herse2 herse1 vrtra damom aritani yurim0607 a-land sriver7410 laborsafetyadmin ecojejuwork godomall-020 limetree1 diycars qingeun aspoon14 aspoon11 maini1 bangsanga cjs68 juni416 jjs4422 jjs4421 godomall-010 nicehong1 concertsh1 shl19551 gs96604 gs96603 godomall-005 cwcho77 herotj sossay1022 nyfactory wise69763 gi290admin djshiva koangjin7242 healthinsuranceadmin pfpenstr7881 gngnt1008 cayl youngnam3042 bobby8088 bobby8087 homeimart1 filmnara bobby8081 dbbs1 eng1tr junggomaeul sens1984 uiiudesign myanais00 paegilju zenith2734 jarin625 patme1st manjang10000 steng19 arthistoryadmin audrnrdl1233 audrnrdl1232 eumjiwon12 power2000 bsshon jandie1 godo55552 bonibell arre tgyh1004 mh1225 suyonga8 rdl psy23251 gloomypig webtrans herebaba aqus designhug1 futuretak1 jtapparel2 neomagicshoptr ssh4862 ssh4861 piohan1 godoa3-029 cjifm kyungse3573 tkshop-019 oco823 eurohnj banggitong beez102 beez101 majisun xorudtkdtk godoa3-020 aqr5 incobb gi320 michaelkkors1 egreengeo4 egreengeo2 te0404 trackandfieldadmin haoting11 mameden1 mmarket exhobbytr durnfk mirimi9 godoa3-010 coppa freemo1 biotis givesoul9 godoa3-005 salesops.team s2pintsf luxlucci rithfale25 happyclay wingk asadal020ptn hothighest choice511 tjdghgud omero1 ssanc01 imarketing003ptn oriontek1 dongwontc apci chadago5 id1230 chadago2 chadago1 headami1004 forsythia88 ats1212 martaza4 martaza3 winad kumin07112 kumin07111 flseok3 flseok2 jung94811 catsneo1 chaoskym0 ufosys1 kidsclubsadmin jcl2008 daeju dongin2 dongin1 chorong8293 caspian tucsonadmin westvillageadmin marketingadmin organicstory historiausaadmin dvradmin gi310 gi298 jackal militarykor1 rora9326 yoddanger syyoon leevelys lanoviagd gi307 devdf shortcake sohojob9 sohojob8 sohojob7 sohojob6 sohojob5 sohojob4 sohojob3 bluesunh8 sohojob1 bluesunh4 cjscn7 bks1016 dizzi50 cjdgo knowglobal leeaprk2 claraj2 msc98703 msc98702 msc98701 iocean2012 ssambo1 sohokorea003ptn topwatch-trans allc soyariel jg130412 cafenoli kobomo1 thdnjs8112 jewelrysoo nbsaleshop pdae101 ssaljin baechu0910 shadirs kbcs9771 xxizee2 xxizee1 catsnara gi150admin dbakintr5549 leejihamcos e1it32 o2music cms8673 tenatena tstkim4 tstkim2 tstkim1 jahunbangtr gi306 wonilchoitr bbac godochina229 cellgreenon littlelys061 godochina214 designida1 rxbiketr elastica91 phillife1 gi305 fiestasadmin jsjsjs2 bayyard1 emerzency didcksdh331 hgh5076 kumhoan1 pkw6862 ijennifer leesujae17 ronin9499 chogood772 chogood771 justaromatr ncr0331 s4freest bokmintoy aidl eggtoktr0979 mynezz2 dongwon91 gi304 herbsj s4freeqa webroin gogun3 herbok roots3 sstudio comaharim pius11151 seemille bota1004 kimpanjo herbjo salarymanbox bydharl1 yhstop-025 freedai dongang dextoon12117 daedoosm yhstop-022 innakmtr8388 shamu kwonbing3 imarketing002ptn yhstop-020 hanjun06112 yhstop-017 gaintelecom rpangkjh3 gi303 rebirthsr enamutr gi301 krdoctorstr hapeach cokelabo yhstop-010 capdocokr camwear1 sadeabu gaigalu17 gaigalu16 gaigalu15 gaigalu14 gaigalu13 gaigalu12 gaigalu11 gaigalu10 innermarket loveyu722 gi167admin ormedic1 qkrwjdtn113 qkrwjdtn112 roori2 roori1 yuyounho byesang1 cguru hm0008 decore1 noobs69131 shingh29 juju122786 kidswritingadmin silveresk3 jump420 sjblind guswls0630 wkha72 tourmania et0124 sohokorea002ptn nmagic2 nmagic1 webtong2 jeillatr9571 sohokorea29 sohokorea28 sohokorea27 sohokorea26 sohokorea25 sohokorea24 sohokorea23 sohokorea22 sohokorea20 sohokorea18 sohokorea17 sohokorea16 sohokorea15 sohokorea14 sohokorea13 sohokorea12 sohokorea11 sohokorea10 catsmart jung302 tabacconaratr todajung ysu7100 acuzzang spolandtr foundstore aegkorea ahri28 koolfella03 terahtz2 abec3579 dh894k sospica3 sospica2 gooutkorea sammarket xogud0415 jj72721 junwhatr acecnc011 tys102714 awsfreedom wannabtr0916 brent slabest11 ssri48 malltest gyubin2 gi416admin fingerist7 glamstarlab hjw85001 uyork finewolf3 nala ssangchu gon444 ryoo95551 filmbank01 adinplan miran96681 chho1 kirisatr gbmarket aldo211 enamoo1 hyoroo yunojapan herbhouse yooyk1 tribalgear2 gana2000 dove2 macdesign1-009 macdesign1-008 macdesign1-007 macdesign1-006 macdesign1-005 macdesign1-004 macdesign1-003 macdesign1-002 macdesign1-001 ldhoony2 dasomco increase3 miffy30411 ifagain4 manlejjong gi280 j9020721 imarketing001ptn uniflame2013 projectb033 theavenue kksshh99 sanyangsam1 ptpcomm duometis ecoplanet6 hsnambu hhhsolution s51022 wkaxld052 bigmantr0007 tjsgml809 wkaxld051 shsaa8101 asahi01 kisszone jung0711kr snjfurtr7672 wkaxld043 qnibus1 publicnt bpms2 spechrom0506 aulkorea1 helloko s3devpekoe sm7002 sm7001 shelko281 jaeyon27 leehoon792 leehoon791 banhallawoo thezillo godo-11781 naigie5 naigie3 sohokorea001ptn godo-11768 englishmug ipaymico7com lcd80202 rwakeman6 rwakeman5 rwakeman3 rwakeman2 novocos eju2013 maha09 wkaxld012 nobody2 buycare1 apexstudio bignbigtex dpxndkf pqpq2250 wkaxld004 sportsline4u-ver3 lucegolftr chukactr6385 akfoajfo kyyong1 gnomya s3freedevsunny colorman rivusdesign elnutr cfdevel persona871 truegaon cfdevel-anzeigen richgold3 kimkiki officevendor1 cfdevel-immo littlean2 bestbuyusa2 ydptong wedps25742 iapplian m9611053s classices1 dventure1 qortodn godo151041 cubeintextacy skautous ain100 bori4 serverhosting189 donnadeco imarketing066ptn cfdevel-partner cfdevel-stellen xjunior1 cdmnte2 enjoybike1 evenly229 maternityadmin paranormsladmin aile357 gi276 eko4849 boova icecast wordprocessingadmin mathlessonsadmin phplive gi270 wiggle2 roseflower1 gi266 iamss21 sohokorea waassa1 turdef alren819 alren818 fspatch shabell hanstar alren816 iya04052 mypopcase sury2848 gyilove1 fabholictr runnersworld3 runnersworld2 raybond woodongeya2 henshe silvercat-v4 joyav1191 kho8939 danuri youngr3 reslinux247-254 reslinux247-253 shoeshouse tgifd776 coa6071 wawapcb tgifd772 memong1 dbfls7 somino58861 hcjung1117 ke6753 yumpie963 yumpie962 pradise3 muell1 rookiehjy in4sea4 sjk84021 imi13801 lean06012 keydalee soracom shoeshosue asadal039ptn corelee5 good365food1 odc251 minkuy06221 linkz4 ramhandmade treedn cuberelease apolloeos junginsam7 primedemo nam92952 jj70771 iluly1842 iapplian2 fieldro shoesmongdb nyguy111 abecast01 free01022 prmjung hantek2 agyang qorthd2 qorthd1 bumystar3 alsl981206 guideadmin.metrics bbanyong1 ndealtr6026 asonejkh1 designer17 yoolose1 yesjubang kkm77777 loan23451 pinkscy hens77 qwe78221 solanin201 ymj810 akwjr1111 cos80825 urbanetr7159 jwandme dc894 cpla2k24 cpla2k11 nzshop24tr timelesstime bonheur1 tone20102 heode2 heode1 tailorsuit mswest moira1231 bestgsm18085 passtwo1 ljs49541 dapanda114 hymsl1 akwjr1000 hymtb1 dc821 pravs1003 fly2820 dmsdk6029 mn76541 gapkids jayhome6 janghana7 dodolfarm1 vdlove8 dvdvcd hanforyu2 hanforyu1 gomoojtr7532 ncpsys1 bodyx romiok jejuilhak sneakersadmin kangbo822 anzelto finedeal1 jplusinfo fishingadmin agigatr uzooin1 gi262 eth19012 dlqmsvhddl jinnwon3 linemk europa88 unnatas7 pluter busanftr5995 gi94admin potowoong naturalalice jinirose0709 eksvndsk1 happysaem4u3 rosa2007 sunyaro1 tai1228 jumflow jhm08272 ccimartr7337 kkm7724a shoesmong12 shoesmong11 shoesmong10 onlinefair healthcafe topic74 sky10888 siena59582 siena59581 fddsfd fashion24 y4219371 em2daytr7411 simple71 mnkwear yes991113 flowerstate yeowocom gi259 donbook oceand legiocasa001 ddung6641 chungangtr chameleonwoman opop997911 hiwin77 shfreetr1964 agyangfarm2 agyangfarm1 hgh1302 sm4707 parentingteensadmin ando1e1a flower72 edenhill11 baby-farm dc251 touchplus1 jdepot1 chacer23 clickit001ptn purity194 gododb take26502 youngface ssonso bobai topia07 sinbiclub3 boseong341 seven3 senspot205 ecofairtradetr rubatocare2 bomdigital bonusp2 bonusp1 designeda1 woonsatr1136 vasooyu headsetkoreatr jamie32 designcube jmk7808 eicompany gmwear pecglobal jinboms hunmintr2873 hyunny76 mjy10752 wego4 wego3 nelly74 icreative1 funnydeco radkay1 kokoe2 goldhase2 boomin5 boomin4 mineedon6 doriskintr ssun587 eliyuri1 doufeelme gi284admin kosobank goodgn2010 matsutake1 hsj1373 roy0719 nzlifetr9453 cjwatch2 brooknw1 line46 jhkwon85 sdphoto riravatr8889 babekhj shh920428 dandy7 rosemart marsch0625 dandy2 kddong1 fohwchoi aquaritr5907 rosemari hanbyul1 googi813 o2musitr2123 esladmin 2meplus premier72 peter9961 kimhong001ptn godqhrgks k7j6k7 maybe2012 icw0073 madmax200 yjo0906 jeon20016 jeon20014 mirean2 bsrabbtr5724 seostephen3 finger822 agil282 cho110044 wkdb99 madeit baey03191 majorbook hongilyua hjlepotr7846 luxurysp2 samsungitv singme81 min12111 scale114 madee1 prettydari aidlv4 tpdud521 gocost cjb33335 edun1126 bebewise smedia01 limcha kitels7 kitels4 kitels3 miyoung07141 mastertool8 mastertool6 sweetpotato song5844 imypen2 limbo8 limbo5 shuzai.history antiquesadmin nari5221 shyun8861 gagumtr5758 yjb4023 recyclingadmin redlineon esosi79 esosi78 esosi77 esosi76 esosi75 esosi74 esosi73 esosi71 kesjjjang motohouse dtuomo lilix1 sesweb cubedevnj aroma1 orange89 beanmarket pscsaws gszkimjy1 haebaragi withtv tryextacy 79house noriter00x seubyy qingeun1 jycustom1 sweetyj tnghxmfhvl iamchudo tlawndud1004 adonia5 allmedicus yets032 yeawon231 goldbat733 cdicn jas7725 comtive applefactory2 zinepages dolcevocal ismlove486 bf4949 ntperson kkungku wkdud14784 pooh72583 safecatr8353 krlibe godo146856 yyjkingman1 yju4uu2 comsta9 bookpot ambleside62 gi249 bachstyle es3self truebowl iprohmc innergongju ksw87091 ccomz kes5850 wksckakxm cirt wbweb hoo7878 howhow3332 txdns2 txdns1 blackboard9 squared gi246 bbdev camcordersadmin gi245 libraries cakedecoratingadmin goukadmin gopuertoricoadmin humanresourcesadmin gunyis2 gi239 file023 miscarriageadmin cpapshtr7934 bedroomadmin gi230 farbuytr9058 doozycom2 ilgun77 bsmedi kkh5789 khy26833 hanworld chatyjjang bezclub wemake4u ahnc87 kitchensense twintreekore sgaqua shoppingtong treebd tncmotor1 soyamall jgy6727 sinjukushop5 cdeco compositeadmin anytarot bjtcoltd1 mitme841 oto04152 oto04151 baby-club impmedia6 impmedia5 impmedia4 ins98054 ins98053 hichang cambibi1 sweeple pooh0220 ckj315 entro76 popscoaster akasia20004 johnjacobs5 johnjacobs1 themin76 damano ttlc207 ttlc204 gi411admin ttlc202 sujiyayo3 sujiyayo2 daebagg4tr gi162admin asuratime hanwool3 sesoft nekoidea8 nekoidea4 nekoidea3 nekoidea2 hanwooda kumanbo1 hot95291 asas5377141 tkd02241 yaoming77 emdevtest hmfood1 bookkey rental1004 indiplus wlsdnr777 jason65 speedstackstr tngmlolbbl yjwone sossay10222 bingsugirl7316583 vannersky onnahana vanessa6 vanessa5 rubydog lsy831114 heamil1020 mlisttr foxy1000 prinseum1 psj9362 zese40132 satunljs kakaku75 randynoh dakorx iplant nat58164 teentea bueno-shop hellofriday bpksg1 boynine duka123 waahaha-019 waahaha-018 waahaha-017 waahaha-016 waahaha-015 waahaha-014 waahaha-013 waahaha-012 indianapolisadmin holidayentertainmentadmin gi452admin waahaha-011 waahaha-009 insectsadmin waahaha-008 gi219 gai waahaha-007 dartsadmin plan9 waahaha-006 secureserve2 gi199 waahaha-005 api.membership waahaha-004 waahaha-003 waahaha-002 acneadmin waahaha-001 ky2900 eom19828 sbdesign002ptn gi207 es3rent tintvillage juna771 anycasetr qec environmentadmin smhyun741 shafali4 donabi4 autowill rora2500 sandbox6 mrotec7 maimai1 mariweb-029 mariweb-028 mariweb-027 mariweb-026 sandbox5 mariweb-025 astrologyadmin gi196 mariweb-024 breastfeedingadmin mariweb-023 gi195 webdisk.test2 mariweb-022 mariweb-021 mariweb-019 mariweb-018 jobsearchtechadmin mariweb-017 mariweb-016 mariweb-015 mariweb-014 gi194 shuzai.historymedren benrokorea gi193 w20 ocspool db06 mariweb-012 hbsfootr8762 gi202 mariweb-009 gi189 kugong90 mariweb-007 mariweb-006 mariweb-005 mariweb-004 cheerleadingadmin mariweb-003 gi88admin mariweb-002 mariweb-001 w14 samdoic1 moterora1 wildwolf tentingkr naiasis emcars tobe7009 voltrun twotwobebe apt201r001ptn dev2-self bond20011 shinwonwood5 shinwonwood3 maano1 momo3624 diso98380 filmtvcareersadmin f8018011 culinarytraveladmin godo145509 headin031 webmail.login sky07012 bodhi gi278admin sky07011 ambmembership gi185 s1patch gi183 sikgaek wt23456 savanna devmini soostyle08 angelesymilagrosadmin q5850117 psdgogo digilog bigeagle42 dh3311 mymimin claires mstamp ykm2005 chammarket projecta3 projecta1 leechandoo3 focusing1 munia danbi06532 fathersdayadmin sleepdisordersadmin m4498m44983 audwls7117 ipaydurihana7 partyparana foodlina8 foodlina7 wuriwa1 adcenter gi180 syrmhj willsadmin shjk1013 leghorn dpwl5312 lawschooladmin mountaineer jyw3727 bpmem autodiscover.painel autoconfig.painel webdisk.painel gns2 www.ehs citio5 uppereastsideadmin gns1 hydravg gi170 help2 citio4 jpboomv4 valueitem petrel gi168 docshare akabelle02 jmedia2 kagu kursy rubberstampingadmin aboutdssadmin daytradingadmin jmedia1 sector2000 aznymohc babi570 motelb2b muckping peoplelook www.hobart junco www.stafford cmcrtr7858 kwons129457 notepeople gi159 gi395admin stlouisadmin gi156admin architectureadmin gi150 lesbianasadmin samheung1 smcommerce1 brainegg2 electionadmin bebeadmin chronicfatigueadmin animalrightsadmin healthylivingadmin madisonadmin gi130 gi83admin gi273admin estatement cncinc1 souladmin funnyhoney bebetoy1 www.tos gi122 netforbeginnersadmin www.kita jugendschutz gi120 cincinnatiadmin echanges gi393admin candyadmin gi110 haedolli simple30488 pizzaadmin gi101 vinpaper gcny aldccc1 africanhistoryadmin airjoon78 bandwidthadmin ksg700518 gi389admin gi99 gi98 gi97 mail.it landlord gi96 gi95 gi94 gi93 gi92 gi91 gi89 defterim gi88 www.ad1 s1.lzzh gi87 gi86 gi85 gi84 gi83 thanhvinh cuxiao gi82 gi81 gi79 gi78 gi77 gi76 nx2 gi75 gi74 gi73 gi72 gi71 premiere gi69 gi68 gi67 gi66 gi65 gi64 gi63 gi62 gi61 gi60 gi58 gi57 greatoffer gi56 gi55 gi54 2for1gift global3 antalya gi53 educator hatay politicalhumoradmin gi51 gi49 gi48 www.chery www.audi gi47 gi46 gi45 gi44 gi43 blogs2 gi42 gi39 ntu gi38 portsmouth 3m voluntary lmt gi37 gi36 gi35 gkh gi34 salford gi33 glu gi32 gi31 gi27 gi26 gi25 gi23 gi22 breadbakingadmin bpp gi19 img.narodna gi18 img.blogs gi17 img.tabloid karamba www.hud gi16 postgrad gi15 gi14 gi13 gi12 bangor wool gi11 gi10 flowersadmin datingadmin gi77admin tweenparentingadmin superbowladmin gi267admin deafnessadmin burlingtoniaadmin eqtx shuzai.gardening huntingadmin ufosadmin footballadmin gi145admin personalcreditadmin catsadmin 80musicadmin shuzai.britishhistory poesiaadmin familyinternetadmin gi329admin oscarsadmin geologyadmin kmx humoradmin collectstampsadmin gi72admin www.vids gran cableadmin ccm1 gla accessoriesadmin gi262admin gi259admin rc3 nytools4 mathadmin southern nikko arima homefurnishingsadmin industrialmusicadmin loungeadmin ebayadmin momrecommendsadmin cancersladmin beadworkadmin addadmin vancouveradmin slp origamiadmin financialplancaadmin gi378admin content.team gi139admin pcosadmin wwwftp stayingactiveadmin affiliates.metrics buscadoresadmin autowax3 manchesternhadmin allforfamily zzzcool35 hugosoft bluesky2969 serverhosting254-254 majordomo mail-out2 mail-out1 windows2000admin immagini serverhosting254-253 bagheri guitarraadmin strefa 226 exoticcarsadmin serverhosting254-252 rodeoadmin serverhosting254-251 rza weddinginvitationsadmin gi66admin serverhosting254-249 serverhosting254-248 ww1.co.za www.els serverhosting254-247 gi495admin feminin nashvilleadmin gi256admin elcanceradmin petsladmin bif serverhosting254-246 serverhosting254-245 forextradingadmin mustangsadmin serverhosting254-244 unesco hifi aarmssl serverhosting254-243 webdesignadmin collectsladmin bangormeadmin serverhosting254-242 prettyaha2 jarin6252 hto gi373admin ip17 jarin6251 palmtopsadmin apartmentsadmin greekfoodadmin cartooningadmin serverhosting254-237 fmr serverhosting254-236 info.lounge gi6admin glusterfs walkingadmin origin-download advogados automotiveadmin serverhosting254-235 serverhosting254-234 serverhosting254-233 gi61admin gi489admin serverhosting254-232 serverhosting254-231 applehearts9 mxs2 babyproductsadmin gi251admin 712educatorsadmin enchileadmin pilatesadmin serverhosting254-228 serverhosting254-227 gi179admin serverhosting254-226 serverhosting254-225 labweb serverhosting254-224 blogues serverhosting254-223 serverhosting254-222 webext publicrelations draft2 webinterface mothersdayadmin busycooksadmin imam serverhosting254-221 aceh serverhosting254-219 alikhan orthopedicsadmin gi367admin semarang gi128admin canadateachersadmin strokeadmin medan serverhosting254-218 arttrans homeofficeadmin gi1admin gi207admin mountainbikeadmin furnitureadmin zipi jem nuevaeraadmin serverhosting254-217 serverhosting254-216 perun serverhosting254-215 serverhosting254-214 gi55admin gi484admin gi245admin serverhosting254-213 gi464admin serverhosting254-212 serverhosting254-211 askweb go1 serverhosting254-199 webtrader mta004 mta003 serverhosting254-198 mta002 housekeepingadmin shuzai.floridasporstman verdetest dnssec2 css.m www-admin windowsadmin serverhosting254-197 serverhosting254-196 serverhosting254-195 serverhosting254-194 enhanced serverhosting254-193 serverhosting254-192 somilee2 serverhosting254-190 serverhosting254-188 serverhosting254-187 serverhosting254-186 serverhosting254-185 serverhosting254-184 serverhosting254-183 serverhosting254-182 serverhosting254-181 jailzotr7394 serverhosting254-178 serverhosting254-177 serverhosting254-176 khs640109 pediatricsadmin serverhosting254-174 serverhosting254-173 serverhosting254-172 serverhosting254-171 serverhosting254-170 northernontarioadmin serverhosting254-168 serverhosting254-167 serverhosting254-166 serverhosting254-165 serverhosting254-164 serverhosting254-163 serverhosting254-162 serverhosting254-161 serverhosting254-160 serverhosting254-158 ch779 serverhosting254-156 serverhosting254-155 serverhosting254-154 serverhosting254-153 serverhosting254-152 serverhosting254-151 prettyaeng serverhosting254-148 serverhosting254-147 serverhosting254-146 serverhosting254-145 serverhosting254-144 serverhosting254-143 serverhosting254-142 serverhosting254-141 serverhosting254-140 multisite serverhosting254-138 serverhosting254-137 serverhosting254-136 serverhosting254-135 designaide serverhosting254-133 serverhosting254-132 serverhosting254-131 serverhosting254-130 like02 versha weightlossadmin shoe9111 igosantr jinsi07123 jinsi07122 jinsi07121 dugotech2 jxmusictr unizone1 chlrhkdwhd handdud1 taijoon9 taijoon8 sero82 tpfakxm3 fstyle3 tpfakxm1 ilpumcrab atfc1 sm1026 sm1025 lkg2821 autoaction5 promusicstory ucat-er muttagi1222 artxx zlem24tr2876 music104 aiang1 cholibdong zywall dicovery2 bsun20031 danggal2 parkek3399 snikorea1 jin020526 gi362admin daitda curlyseo77 megacoffee gcsd339 dakbal gcsd337 gcsd336 gcsd335 gcsd334 gcsd333 gcsd332 asr12 arto9 joeun01 jnttravel1 queenas a7896bv2 evintage wooliad1 dlatprhkd1 ckh135 rohoco toshinchotr hooskin1 spreadsheetsadmin morning1010 ndaily1 designaco1 boojang tjdfhr76 pchw8300 koomin211 cisil2 yhcompany1 kkh3311 bony213 foodliatr ajh2565 bebecloset2 aengrani shine777 wings911 roby1977 redmist8420 bediant1 qadw123 kkarigirl-019 kkarigirl-018 kkarigirl-017 kkarigirl-016 kkarigirl-015 kkarigirl-014 kkarigirl-013 gi123admin kkarigirl-012 kkarigirl-011 kkarigirl-009 infos911 kkarigirl-007 kkarigirl-006 kkarigirl-005 gabang36 kkarigirl-003 kkarigirl-002 kkarigirl-001 fixpage bebetete love2vent mh12253 korea25691 chjm53842 enargentinaadmin vector16 vector15 vector13 chicagonorthadmin hancommunity kperpect yedawoomtr iconbay zayu18 djdxjfl07 okyk7310 webkey1004 adventuretraveladmin signstar2 signstar1 kissryou goinfit coinsadmin diso9838 osk7777 bobolang gloomypig1 suyonga10 valentinesdayadmin bobolala newsinda pinktailtr hick409 lakanto cafeoutlet all100tr7242 nisimshop iamlsm3 elpaperie ksh15142003 pridegolf inhakjis3 inhakjis1 luxurytr4814 mecca3622tr wlska48 jkwatch drimi aqus2 solian011 purnnuri2 purnnuri1 hnaksi1 jyyuni roomnhometr vartist gunvest signpost mooncho51 vip89 abehouse2 bshsky justbiococo epi6901 kbase fuzone netcr61-030 bumyul2000 metalsadmin kukjea1 brandshine2 lily95053 lily95051 hww3633 hww3632 motiblue2 chunjang1 you1smile1 netcr61-019 dralkaitis chlaytlf ipaybaobab2011 wjcwoojeong airqualityadmin idiomart zenastar ganglia medisale3 kk446688 netcr61-010 02creative ksp1488 room4500811 bike4 myoyeun sandlntr8264 kyb1093 mygodman2 robert01 olivemuz netcr61-001 poohkny90 nintendoadmin fight156091 shimfood gi50admin amysred1 h121519 fixisterhous4 noblemetro1 zzang7912 hyunism1 w1nu10041 ysj78716 ysj78715 millard ysj78714 anyhost kangbo821 wantedher1 playclay1 phanminhchanh gi478admin owieoe1 lkj43562 andrewjkang janaworld plumgarden varioum1 must05782 yjleejun gi239admin comprarcasaadmin memphisadmin altrelsladmin iovesoon artbtr3686 tattva1 hometheateradmin daewony1 sweetcloset takeitnow1 ssanta3651 plovew granbury freightadmin modo10042 espritshop autoting duicnc sss29991 blossomj1 kay98631 bigj2 bigj1 shpor1214 ljp1100 dgprint1 winiworks winxii mariashop tlatlao nectar78 sjakamai1 only4711 symy2009 madeby42 inchalbase gangzzang00 toyhan cm.seventeen artteck2 qpit261 kimsony11 kimsony10 autosply cmkorea lunasy14 joongsan1 realway chakhankong1 kmrush27783 angeltr9617 ibk4141 animalsadmin majisun1 autonbtr5897 thdgustn27 shslion ecovelo2 fishfriend suajoang hong790418 shaneman 90srockadmin andyeven1 qlxmftiq hidejeeman1 kkongtol funkyjoo481 zzinge3 xxlae000 rich20081 nan2han lhmarket4 smartmov godo142326 danawagolf pkujoon2 ks080108 banasun6 banasun5 banasun4 exweb7tr4591 banasun2 byengpung aliceddm jjoyful5 jjoyful4 maming31563 maming31562 detoxktr6608 kitlabtr leejiyeproject joonggophone1 digistar10291 agri00 scienctr8825 missultr indankorea zxc764 swys2101 apron mygking1 s3freeqa aaid2142 lhote0 chunscompany ppman1111 congaru www.ww6 godo141977 bho73 zzang6886 thdxoehd1 qorwngkd hoondosa1 ham74241 posncom jm8248 ywkimera1 hans352 enrental158 ipaykingzoon jungpotr7702 kidsactivitiesadmin lee590271 yh78310 avidleeda seojun gces1033 conprost akari2414 randy381 withpastel sensti yellowpisces coney12 coney11 smarthud wolseong cleanat3 cleanat1 hongsd73 hongsd72 wakyakya2 s21004v dnlemehrm lo0olz ginza006 hcbig1 joeunphoto www.wwwww toughsky hongsd12 hongsd11 magicmotors qwop45 duwls26511 icnthok hwangjiniw jayeonmee smarthan bsfund ptocoi3 ptocoi2 s07612 hjlee2915 lstrading1 jcdldlto ggambu4 odsnote picupu1004 zms202 sootdol topaz8625 hyfood sun970815 devrelease ipayunseus sonjimall oj07042 autosladmin ksjjjks1 lagunayang adkang992 survivaladmin ssabari viridis4 inyeok soole821 dongkis4 hachikuro dlwjdfid doowool hoianfl seohg1 agrina89 thewang121 edeco1142 americano1 ballpenmoa1 scienctr8040 darksode3 darksode2 midong26 smartedu conely1 hangsang881 tsgim707 oapack almaher tsgim703 tsgim702 tsgim701 cnst1616 s2pintsky khc03433 vdhouse3 vdhouse1 brid076 godo141203 dntwk83 smartcs5 minjin9999 smartcs3 smartcs2 smartcs1 almajed olzwell geosystem mir0014 unzip bigin8642 nomiri01252 mijumart fgwj532 shcho2000 jys199466 s2pintsdg s2pdevkthkira godotechyby winink toluene2504 jyh65212 cavabien main393 asolution jclayshop ibrother mothertr4216 sunmoontex the2102 gmpcom zerobag youngg09the ziba1 elfnix kishimo oriongolf iamkei6 iamkei5 reglasespanoladmin propro69 thehockey1 the7shop2 greenmade99 grain52392 suamplastic danawaba smartacc eatbag1209 edenhouse godo140762 hanawelfare mastuoka1 americahot lyh67991 chadvissel monnani0735 therokoh ogs5795 bonghang btbgift1 iamamine1 joeunwoor kdw134679 ds22sonia004ptn anygear micoffee1 manomano1 nawaf gi356admin englishlitadmin jongsori japanrecord1 gojangi hersh80 kchairtr3504 ipaykauring21 sildmax3 sildmax2 yyoo22 jebeef untoc godotechsky kitty8162 dlsektk2 webtootr4979 jdreamer pengolf1 wbhouse mary0534 dongwontc1 gi117admin s2pdevoneorzero klasf1755 japanesefoodadmin salescareersadmin inwoo2 herbolle bulhandang note4youtr cipi22 midomall chdrkrtbwm32 kjp8556 jong69994 canoeandkayakadmin bullyingadmin handsltr5719 s2pintman realmack1 sjrjj taoismadmin parvez recetasninosadmin pensieroinc gmail2 mana1071 dojagiyatr6557 livonasia hyangcountry2 naraenet8 yamanashi truejisoo1 bestd godotechptj inkeshop bebepink jaemin3961 bestflasher midimitr4285 mac330 www.for www.eye polladmin.seventeen bbqadmin camberlin 1stdol enstory yishugtr9470 s4freeintkthkira xigoldkr212 altccatr9318 gks7531 hanjt67 youmean08 illumegate13 s4freesetuptest itswattr3663 pjk4256 mainsqtr8842 pjk4254 pjk4251 asia54321 golfmatr6324 yks901 designctrl chowho1 godotechone mpumwedm yahanbametr injeongwon1 ksc82171 naraentr2791 naraentr2786 wing09 naraentr2781 chonbatr6758 jhp0215 peace09451 naraentr2775 godo139053 ssadagtr5866 newseoul twomo opstree23 opstree22 opstree21 www.aoi wjdgus actonis1 peter2277 nan6446 hyejin bluesunh2-032 beautyland1 m4627225 clubrenai morenvy029ptn famertable hyorisun1 gfph94461 heejuz belladdle1 bokding21 xorrb0604 synack kooji551 prmart3 prmart2 prmart1 wimhh2 wine21 natureaquatr8672 rubas8412 yajoongsa godotechloy pdbsabrina qorwldrb investingeuropeadmin starbeauty ksw80041 radiojack godotechlhr corexmall senal2 ds22sonia003ptn kyy33821 yanoritr rok142 api.caloriecount guitarplanttr annis bigecoltd kpwell hwangkeunho1 sks0967 youngmtbtr shhoustr5979 bl525 lsg22841 brheavy desirable lse03081 hyran031 godotechhym sinura gi44admin bluezeta fi6096 fivesix1 suhon006ptn alicedeco3 alicedeco2 ohsungad lee0932 ocolortr3028 sdb1604 godotechgye designfactoryfile anma1 anointingm cncprint lalaone4 gi473admin joosawng1 tirestore dhcurvtr1241 naraentr2119 hyunetre gi234admin crevate syyoontr2302 coupontr3371 binuyatr1512 bekei gorani77 wondongtns1 progressiverockadmin coupleboarder assist05132 assist05131 captin832 sweetyjeju daein2 wimall edugodo-059 edugodo-058 lydiastore edugodo-056 edugodo-055 edugodo-054 edugodo-053 edugodo-052 edugodo-051 edugodo-050 edugodo-048 edugodo-047 edugodo-046 edugodo-045 edugodo-044 edugodo-043 edugodo-042 edugodo-041 edugodo-040 edugodo-038 edugodo-037 edugodo-036 edugodo-035 edugodo-034 edugodo-033 edugodo-032 edugodo-031 edugodo-030 edugodo-028 edugodo-027 edugodo-026 edugodo-025 edugodo-024 edugodo-023 edugodo-022 mysohotr0910 gaytraveladmin edugodo-019 edugodo-018 edugodo-017 edugodo-016 edugodo-015 edugodo-014 edugodo-013 edugodo-012 edugodo-011 edugodo-010 edugodo-008 edugodo-007 edugodo-006 edugodo-005 edugodo-004 edugodo-003 edugodo-002 edugodo-001 bluesunh2-009 babyatr8713 bsdoye mmagpie-039 wowmin-019 hb0201j wowmin-018 sonjjam08 wowmin-017 heecol akfoajfo4 daehi1 akfoajfo3 gnf1230 wowmin-014 wowmin-013 wowmin-012 heebum mmagpie-029 wowmin-009 swancnt gi306admin airwalkbag m491900 wowmin-006 hero870 induk1-039 wowmin-005 ssalmaul wowmin-004 wowmin-003 wowmin-002 jun58012love click7tr2661 fillgoon aleatorik induk1-037 techdatr4078 mmagpie-012 jaeyoungbiz djpuer3 godo137771 cretoy1 zinoent pkdd9111 ele2779 walmartr9308 godotechdfk prismsystem ye7605212 lhs751 nongsagun skanskan41 chsun7931 sewingtr8878 godotechchy acacia36367 gloria7 gsdaectr0704 dbtn1517 ds22sonia002ptn withfootball s4freedevextacy ramarama2 ramarama1 daedoktr5956 southeastasianfoodadmin liberty16 dns32 jym12344 will34 livinglife5 sshp3385 kenny68 manguitar6 viewone nurseryadmin sem0605 spysman4 hydm74 wjglobal1 swprotech bellutr0046 hongik911 noa10001 kvanes2 kokacoffee1 totokt my7cm4 oufo1 treeofhill2 sjh0177 bricktechnic lonsomeyez11 daebok dkdleldkdlel oamart stickerbank jinok523 corecube3 whalemtr4127 corecube1 jsjfeel epsetuptest redlife82 ugmc33 suupgil suhon005ptn ph565tr5757 dongateco kbncomputer-029 kbncomputer-028 babyutopia kbncomputer-026 kbncomputer-025 kbncomputer-024 kbncomputer-023 kbncomputer-022 kbncomputer-021 sannoul1 kbncomputer-018 kbncomputer-017 kbncomputer-016 kbncomputer-015 kbncomputer-014 kbncomputer-013 bebob kbncomputer-011 kbncomputer-009 kbncomputer-008 kbncomputer-007 kbncomputer-006 kbncomputer-005 kbncomputer-004 kbncomputer-003 kbncomputer-002 kbncomputer-001 freeimt2 beaum zpsla52 zpsla51 devjuso alto1 meatpojang bluesunh16 naturescent7 bluesunh12 bluesunh11 bluesunh10 campnetr3452 ljha1017 foxrain7 urmine212 wieluxe ecosaver1 atelierf backup74-2nd hdmedi misnmari soundnrecording2 jisoo81 darkogt cb114 freejch2 ccamdio hjs8603 kx4123 jhigh11 asmamatr6103 kbsharp2 dlqmssjn002ptn redtiger1843 dami3224 cressc1 dlwnsgh04 vcomm artshop4 rexdectr7541 dns29 yunchulwoo79 yunchulwoo77 choiwy0309 fromysgd chocobo85 raneeman ceocharles4 nunbit69 luxuryfriendly s2fdevsunny as2as almightygear1 godo136812 rnlbio ti2posrv dpflsskfk051 oosnuyh862 myoungshim991 induk1-009 ps1203ps2 godo86022 victoriash1 joyuneed1 dns28 comlab3 peter0115 peter0114 kptool samwonsm szarbo haemosoo1 inonsan yunth84 ds22sonia001ptn comeon19 dns27 anybuy1 dns26 iocean20122 s1intw dns25 budgetingadmin ipetbrand wjddudejr1 robo74 irecc5041 bigpink1 trueguy21 hwang9805 danhbaweb dbswndudv34 hwang9801 eraitman2 teatroadmin ru3030 kangjoung282 ata3dphoto supplyctr babara0307 toody yosong20 bluework aweadmin kangageu2 kangageu1 armario1 coolman6761 s4freeintp vincentia s4freeintb otthtr rosebibi dg4321 azukis hkcorea rainbebop1 catboy2 suhon004ptn ozmisozo indihero gigadotr3592 digout13 metaljin3 metaljin2 ultraracing1 whgdmsdls1 allat saeroevent jujutel enst0821 bj21c choice1588 soyariel5 soyariel4 soyariel1 entiger pinah85 orb59 goldman1969 moteevtr7993 funfungirl orb54 do9115434 johnny421 elcha1 v6ralph wizday3 gsgtel-019 ptsdadmin jyhong85 p65jun morenvy026ptn smarket11 granadacnt1 jgreenfarm tortex dlqmssjn001ptn ipayobeauti strangecat versacehome tkmulkorea rurico712 yourday2 cmdesign9 cmdesign8 cmdesign7 cmdesign6 cmdesign5 cmdesign4 cmdesign3 cmdesign2 cmdesign1 smarttest3 smarttest2 smarttest1 rkdwogks hwang9184 naamzoon2 jmj5588 gi351admin esajang78 sensretr5948 gerpmsg kimhyohyoun ddr222c lohaspia enhotelarv leeah357 visualmelody bychoi8249 sweetpack3 uknew inthou sayin007 gnomya1 mtau01 vndck bungae801 squaress82 gsgtel-009 hongdaesalon1 ys0831-019 tonnie1 ys0831-017 ys0831-016 ys0831-015 ys0831-014 ys0831-013 bawoo decains gmdrmalltr ys0831-008 ys0831-007 ys0831-006 ys0831-005 ys0831-004 ys0831-003 ys0831-002 beerline sjsmssorjt12 cellboomcos brotherworkstr dosxlrwhgdk baechu09101 word00521 odjfnrtm rt4403tr4716 rockxury chae64652 chae64651 ipaycozplaza4 cyj0921 urizone gi112admin styleeyetr artshare beansmade jailzonetr twowintr7461 wowpower2000 kescorp1 janghs0620 hyanni wjseodns12 dearosa suhon003ptn vsjangho dlsl0124 skorea2010 syffb73 staygold1st1 bisniscepat daesinmeat jsonline greenpr10041 zmfhqk1 jkut123 ipanes s2pintextacy openfishing samsungdica1 gbeovhs studiosato2 nesladmin fiberopticsadmin quickandhealthyadmin miningadmin www.keys gi38admin arice82 multinara2 dnfs74791 seojiho0722 gi467admin nimsikorea aland tonature2 ipaysoulkiss00 onionmarket danbiftr4724 trysf salesdemo saerohtr5219 inganryu kkssyyy trynj gi228admin dimasqi mindoro1 ybk2002 dbkn8700 soonine dubero afikim58 ukhan ipaymtwonhyo hs1862 dicaframe daara1 pp49125 hyunchun hyconere kbsmart godoshop000-015 godoshop000-014 godoshop000-013 godoshop000-012 godoshop000-011 godoshop000-009 godoshop000-008 godoshop000-007 godoshop000-006 godoshop000-005 godoshop000-004 godoshop000-003 godoshop000-002 godoshop000-001 bioworks dcomskin1 ghddotnr11 joena68 pieen7911 misspapa freegine xellos1225 candyluv213 cbkbass acdcgoo debijou chorock airtraveladmin aktionen cyj0213 monkeystreet caoliotr5340 mobiple torida ggstory2 ggstory1 mky1991 banamoon ajoo5 sjy07051 dawun012 pcnara21 sun99424 ubigeotr4072 soaphouse innercircle orangepink1 ukbul godo134606 kilim2004 jgg1kr choulhak1 jeross hegys0207 babygirl2 cotjdtn092 cotjdtn091 gackt500 herbpeople heret41 rache01 fishlove foll0603 yunkiri486 roselian z1m0b65 z1m0b64 woori0101 leoirae4 beebeez artherot001ptn juli451 melitta nemo-box semicolon87 rachel789 arise cocolulu sesladmin ssodesign001ptn georgelee11 derkuss07064 choianne-020 derkuss07062 derkuss07061 bizcsuwon freejuick1 bestbatr0142 choianne-011 chosale shopisready sooncho caffemuseo1 uokdc0079 kracie hpauthdream madamepapill clxkclxk24 clxkclxk23 thine20111 ddr0715 maya4000 tustown kcrjjk031 aison chungpung1 ghj1123 headachesadmin khn3552 cdmacs9 cdmacs8 cdmacs6 cdmacs2 hyaj13 iojazz uglypuppy landasco tkddn511 namcheonwood monblank2 monblank1 hjnetwtr1099 sosobaby by2004 moon4284001ptn yonacat1 tradappy sugarlong epdevsunny sda34431 bigthing3 bigthing2 bigthing1 clokemed midofood hummel1 jinny10041 kristingale asadal049ptn hjs5553 insamq edrf12342 edrf12341 nauridle1 dbsthf121 rcd73251 ilovekichen godo133852 pfire neoist77 sinhanlight3 mksssang57 samjung2662 hdiled cjy0513 sbmaster-015 sbmaster-014 sbmaster-013 sbmaster-012 sbmaster-011 sbmaster-009 sbmaster-008 sbmaster-007 sbmaster-006 sbmaster-005 sbmaster-004 ggaemuk fontmatr6627 sbmaster-001 silkriverfd usehacker wjdvnatiq7 hopeelpis1214 godo133761 qcidea ddres15881 makingstyletr jabiznet bbosasiseller kem08121 sehee5087 drdori1 sjh7even dreamtime ndg1111 jm1030 pat50071 kozola rlatkdrjf xnittr9142 s2psetuptest gambbong grunamu young87171 badu4 minzy28 kisskey1 taeyohan gs9957 visualhip4 suomi3tr8442 sk8923 blinkisbling solerebkorea durgatm redglass2 sojungs24 gs9881 misslyn1 andjean kozmic bodacompany badas comhdtr artcook viganhu banana64 miyoun913 hj9795 kws1324 ottchilstore healthynote coff22man afsco2 prada801 lastchaos artcraftsladmin mdbaby1 infertilityadmin hsjun1112 bubicattr0219 texmate ambergage harumemory me9273 xteenman egreengeo jsturtle2 greenplum raontec1 comfun4 mallboom judokiss6 ufosys kpmobile1 bluesunh www.hi5 ipayescooo hosbinz4 cihri1 quizadmin.seventeen vadesign farm30 gimp tbjung3 lenahc2 jaeyoung1 zirh hummingblue1 moongift frombin2012 goodreview dkpingpong godosoft-059 godosoft-058 godosoft-057 godosoft-056 godosoft-055 cbk73768 godosoft-053 godosoft-052 godosoft-051 godosoft-049 godosoft-048 godosoft-047 godosoft-046 godosoft-045 godosoft-044 nairi godosoft-043 godosoft-042 poolandpatioadmin godosoft-041 godosoft-039 godosoft-038 godosoft-037 godosoft-036 adfines godosoft-035 godosoft-034 godosoft-033 godosoft-032 godosoft-031 godosoft-029 godosoft-028 godosoft-027 godosoft-026 godosoft-025 godosoft-024 godosoft-023 godosoft-022 godosoft-021 godosoft-019 godosoft-018 godosoft-017 godosoft-016 cambridgemaadmin godosoft-015 godosoft-014 godosoft-013 godosoft-012 godosoft-011 godosoft-009 godosoft-008 gamakjae godosoft-006 godosoft-005 godosoft-004 godosoft-003 godosoft-002 godosoft-001 ms1intkhs yooncitr7021 kozo01 tiumtech ilabguide imysen littlebe traxacun obbs herbhong poloislands aaacoffee kisssilver dametr7277 somino5886 daesun771 ddingminji babilove trees ecopyzonetr treen dlrlghks811 ellinchung kim8310k ua9499 faqdesign mtes yong1830 inparo1 prori6181 therich1 wiki12344 hyung747 edenhill3 sfglobtr5110 threesisters1 mineedon agiga2 agiga1 pig200301 actiongirl bileepia2 ecofairtrade1 doriskin6 photickertr canavena1 jameslee922 showtime jwclub748 jwclub742 noyou55001ptn aidl2 mansoura securedmail mallaqus justinny1 ydyo kimya slasys1 moviesadmin diypapa mmotorpart godo132406 sneaker1 ochairtr7416 smurp777 jjh19824 jjh19823 shoulder991 innsoo1 kidzmetr4592 dumbo8311 fantfant1 blueteng icedemon gi345admin bbliving gabanna eunsungbae ttutt2582 godo132316 sangt1004 sangt1003 spirrastore peter731 kimdsjtr0169 travelmart dlsl851 tarih jinsi0712 whynot612 ihmeditr4510 iblind11 tpfakxm afrch0 svmans1 dreemee oidb jnttravel ubispo1 neofootlockertr besyo hialice sora03111 yong1360 s2pdevextacy hanasyj1 pjhgreen afox773 baadshah afox772 soulmatebed jongkuk2 niland120 s2fsselfdevsunny carebank2 carebank1 sungardkorea waterfall21 ks29973 valueon1 hee530 ksc74182 rlaxoqhr7 comesta topart dancershop mecca36222 skynsnow3 skynsnow2 freeman9634 cocokids sookin1 funkyjoo48 yesgo24 azpeper1 king99230422 goulyeon ticketman1 soole82 carolin1 porntube iki2626 coolkiss1015 lhmarket7 lhmarket6 lhmarket5 anibig11 odvelotr3621 chowon lh10922 eightcollect r42tr7690 onesukyu japanrecord viva12042 kajinsp hwphot lowfatcookingadmin uhfc2 flovetr wlsrbdus1 hallawine en2free88 en2free87 en2free86 en2free85 en2free84 en2free83 en2free82 dongasys hongo713 hongo712 hongo711 eropanda1 kaiser2 gi359admin tra78 ddorai0702 knmidal mshb13 morgandev key94120233 assist0513 key94120231 hj8136 mitisyun hcorp5 hcorp4 yoon0 kbyggkbygg1 smartnara365 lonsomeyez8 roots32 lonsomeyez6 lonsomeyez5 babyforce bacaboca goeric79 tonong enwj12341 enteam2 talatula nipc6016 skaudcjf simswf sstudio1 seorabul1609 zencostr9567 uni1122 wondongts1 chouh1 redmangchi1 blueya9 rhwntjs1 chool995 polar885 ecinderella bizfinanceadmin polar884 dh96962 dh96961 dkfqlsh3 jeonil jeonid s2freeqa jennysoap yesfkil renoirart inpeed funnkids1 candyluv21 sensenara syeng1 egowrapping ggstory wltjd999 noru19631 hollyhock mashile8 maya0824 googondo chungpung fishing7 jjpack zaggusa9 zaggusa7 gi287admin hanaweb film09tr bss699 bycode2 wanturoom rodemgagu hyssop03291 cctv365 klstory211 newhavenadmin carenet0123 net00041 wildkam1 solgreen1 envymall freebud1 gi33admin gi462admin a8544012 demofreefix hanatoy joboksam4 imarketing063ptn bugatti2 bugatti1 millioneyes godo131003 tifhffld eshuma daewoonara quddusrla2 quddusrla1 zangi2 totalstr5555 chefmeal choone kbyggkbygg hyang2e4 pikimini1 godotech05 godotech04 godotech03 godotech02 godotech01 tnwjde kmh8766 autoka1 iw90952 nytech18 sivakumar tnwo88 dadaicksun zion6333 admin.horses paran7730 imarketing029ptn yisukrye1 yjb85582 gs7228 carpedium922 designdemocracy styleinseoul sony724 testwebserver hanasbt sonrojj dmswn12031 jsung9743 ipayhongdetr joyhil1 acerokim2 acerokim1 moongubox3 polysuka cctx workplan mybrandla gi223admin sigoljang1 sunmi211 vigossjean kyuso6079 viki9209 dreny7171 jongkim882 mini17495 laiic88 tv365 mirhkinc chinesesladmin senior21 dragon15251 biz9742 s4freedevp jhsuh88 s4freedevb baekfood happypsk1004 ttt911 samdaein goodcaremalltr mk82324 neckknead ccs.m classythe1 herbbox gymnasticsadmin biblejohn gounface nandamo1 happystr7224 e-yeha a025088 khakis822 yb07301 edumost pkh35001 todaymalldev mindlerae lowepro autocos agamo baseballadmin sinwoo84 rainbotr6420 ingodoman heo38021 ibtkfkdgo dwelling00 autocnc mimpikang1 cartier07223 tongup2 cartier07221 greenmoa3 greenmoa2 ccam2314 sea11sun2 tookhanwoo2 minuya82 smreo007 zhdfyddl hyec9778 dodoteen petitmamang kdh743tr7167 emsp12052 organitr7178 inoble pny100044 godo130082 pny100042 pny100041 pny100040 bigbangt5 pny100037 mcmon lkm721231 secupc pny100019 seungsam534 bluekhi ssum331 honggift simhu tp00781 kyong12k3 mistama1 freebits thd0950 mhj104692 todakorea ksgolf1 ccny nanacotr4958 sbs2212 allmarket1 hanalcd 5min july6268 missbotr1340 design29202 mir33091 greennara indibank assetad1 hyderen2 hyderen1 saegilfood financeservicesadmin www.umbrella simpleplan atokoreatr koreahobbytr hipolee5 jmhyon841 gkgk1212 lounge-test dgyoon77 youarespecial kwh8391 sptcmrh1 excelwis manjis10041 smash12121 bluegun credere2009 seoul266 globe3 shero20001 myjuyer1 godo99762 foodlitr2047 ssukland hvdica3 zootrade pknara cmmgxml zambus tokyo9 gs6078 magic1tr2987 livingartmall awesom711 totorujjun waahaha-020 hdcytr pak4382 yooncibang ez1213 biottatr9337 sms9645 jeeyae2 mcitelecom computadorasadmin zambi3 ipaywonderlisa knetdev1 zandie1 cindy11142 teappong serverhosting107-156 barbieholic jpoomtr godo128311 freebeau yayadldl1 cmos01 kmh7242 gjs2ya2 gjs2ya1 magooganshop anniy3493 oneupfood1 bigsmusic1 yankeetr9528 parksb220 tong18171 enpranihome kimschain oroyoeo1 suyue eod13923 decorico mikako1505 brownmusic marie70541 ica0702 innovid certificado circadies1 tomceo wgtrop topwatchtrans wnffldhp84 factor41 geriotr ranye81s1 mono85862 mahasiswa mono85861 snusptr6247 behomme rnddev mhjar232 roadwise najuoh kocom23 fat644 eoq2592 fat641 leeruli1 nova121 tmpdb shy0579 ptuebiz-018 hj71161 serverhosting33-249 boysnice792 soosan21 lhj930 ych20102 ych20101 trooper funchi ubiplus irises22 citysound mipds33 maryon2 jellyshop orgio8848 mscogo sweko ksuhyeon spicyyeon tomoro1 hinomura1 arecelcard yedam114 adoll lenscare tjfflfkd okokna1 hanbitart swinpro2 swinpro1 greenmade imurak commattr8236 mcinfra moca771 tlawo shinan12072 jukbox0826 paragoncys zama79 marktwainadmin juneogi4 device1141 voltakorea1 dopamines naturesvie pass3097232 seika fsmatetr0262 www.websoft ha1jek2 nicekido babyhoo2879 okparty dlarkddnr1 daedongsa heybuilding suun000 sk3897 rms004 lohas500 parkzicj1 rabkorea soqlcwns white5582 godo127430 zion3914 veilsuit grayleopard mirhkinc1 lys64647 soung4016201 tnwjd483 gps123-v4 backchj61m jellyp super9373 terryreside2 qusxo6 arenas63 fsmaster4 fsmaster2 acryl jejuhalla insurancecompanyreviewsadmin tnsehd33 dreamfc gi340admin cjhlime011 winwin20112 luvhyun812 rltnr2 suri3 suri2 purelock herbflora bumho741 sure1 smlove1 ong2012 backup73-2nd edu5011 housemade1 chs915 fifkorea3 sosom3 www.umc sbsports2 jys142 aliassu1 hisynim ableinc ohyesysj hjleports akld9919a ejrdka12 kappa100 praiselord87 msbook s4freedevsf namdo0523 zzarupet1 tolbae godo98089 snj8188 minkmink74 passion9731 blackpc my-web brch3927 thinkfree772 blackt1 jyjyok blackjn ipaygspkr3 vhdldpak12 www.guitarhero s4freedevhn hyewon962 puremax1 kwkydoor1 sweetshadow mgmmdl4 pkma00 castroledge7 jminhyug ddos-linux160 koss0965 busan2good fine1224 thetanpopo decopan741 shineshoe denimctr4582 scuba2 xlove10 yjgogagu pyo0325 izu19811 purelily skycomm3 skycomm2 qutin7 gurrms841 uniquedonut6 www.summer guswls06301 bass792 gi101admin jibong9981 am4582 ciclo2 act21 zion2977 mogaebi1 aromapack sigongeshop plases sshhjjoo ckhkill fanta70 faline microsoftsoftadmin contact2yeon s3setuptest qudwns36 rentalpc danacross1 na52442 jw75701 maxkorea1 misshera omin0531 happyag0211 godobilldev2 godobilldev1 hsr12352 na52441 gloryinkn juokled1 leuny256 huhu0821 godo126275 westyle joyel01 jejusc myucstory2 myucstory1 teasle228 mgraphtr6510 njangttr2530 tpana4 tpana3 tpana2 qfriend urijeju721 godoacademy jj060707 heoja331 jejuif verylovely slashbak mansnonno ekayak gi405admin seoinjae1 fall76 innobox nystylist1 kosres bjm7x167 prostatecanceradmin utzentr2899 zion2476 egujjoa ipayishop01 minsuke endan4513 lohanlife celebrityeroticadmin realboutique suga1 wind23472 cocoritt111 kont gungang koryms sonkang092 ojm72722 dlsdo513 sonnori csgbboss1 supersoft judystory iamzookeepe emgreen print1004 sgfood2 cometbicycle1 mystgirl lovej1111 saenong7 promade215 saenong4 saenong2 vanessa3 babo7749 fulam1 childrenstvadmin newcalion babo7727 purelady m7bike actorsadmin gram400 sorrjcyxl1 jinyoo103684 westso9 westso7 saynew westso4 westso1 chnsky4 rodemnamunet khyunt4 khyunt1 scshin klover001ptn madamyoon2 helpboy1 godo96584 bodmodutr nfmbrisbane1 ziani222 kifood77 littlejune sssmi getmind4 getmind1 suh10211 fbi100 subag yiyinha248 mcoamall goodberg3 goodberg2 investingglobaladmin food1232 kkomi301 cdsaesae2 cdsaesae1 pr2011 osj0404 babaco0306 ninewishes jran72711 zang9180 dhfl4444 jhp02151161982 dameetr yss0941 westore gi27admin minworam yht81101 mfccafe kimura52da eusebio1 yesfarm3 feroxkr eunhyehan i2r025 gi456admin hongmans75 s6822143 kkhy08076 kkhy08075 strongbaby1 brapra iq25781 seongyu22 ginsengnara cooldange godo125063 seacom bynu4225 andbike mykika1 ssono space87678 vmsjune2 a0250810 myr1111 siyeonb1 volaweb cocolsports ucc93 gergerh s3devextacy malfa0529 aegkorea1 korrg1 k6807221 fm014 prayk10041 redwingshoes gadangel eq18aa michinkimchi2 michinkimchi1 top092 yangleehair junecrtr3729 greenmoatr namdointeri kangsky2402 steek citynetphone nagakig nt99993 nt99991 tiuum campsaver1 otime5 ssyu7852 otime3 otime2 shallom30 gi217admin imshin lab-ware naseeyou1 kkomange kumhoad7400 lovetournet16 lunacy71 haudxjjh3 qvp081 agapa1 dzkorea facstore risingsu ta9933 rpm6400 hitdeco stbiz loenstore zuzu7967 jihoon1004122 ll2tr4543 jsbae3408 korkys mer2371 vbsoma-019 jielkumsok vbsoma-017 vbsoma-016 leesim31 vbsoma-014 vbsoma-013 minso02 vbsoma-011 vbsoma-009 vbsoma-008 vbsoma-007 vbsoma-006 vbsoma-005 vbsoma-004 vbsoma-003 vbsoma-002 vbsoma-001 winenara halom65 espacios minicarnara violetreetr konkuk-070 waahaha-010 waffletr7761 enple usliberalsadmin gogocar sssk005 cafeluwak monomini1 go123 konkuk-059 storymall neo8977 jdy482 hyunte0615 pureleeyun1 lky2345 chinaguide jinne02051 ltecompany icalys konkuk-039 boy6girl9 boy6girl8 jadepost1 bhc2013 glinda david1982 asphodel1 greengrimm16001 konkuk-029 ptlabo06 bigstons hscommunity choin33 badpark simmong4 simmong3 simmong2 konkuk-019 neverdiesp8 neverdiesp4 ssgj1 neverdiesp1 italianfoodadmin greenmoa88 manomano777 kpigup ssey1 shalombada that2000 konkuk-009 kienforever yanji12 juette18 sseon843 sseon842 nacaoo88 rabbityjk3 bomin78 mj12052 godogodo-050 godogodo-048 godogodo-047 godogodo-046 godogodo-045 godogodo-044 toqha0719 godogodo-042 godogodo-041 godogodo-040 godogodo-038 godogodo-037 godogodo-036 godogodo-035 godogodo-034 godogodo-033 godogodo-032 godogodo-031 godogodo-029 godogodo-028 godogodo-027 godogodo-026 godogodo-025 godogodo-024 godogodo-023 srobe godogodo-021 godogodo-020 godogodo-018 godogodo-017 godogodo-016 godogodo-015 godogodo-014 godogodo-013 godogodo-012 godogodo-011 godogodo-009 godogodo-008 godogodo-007 godogodo-006 hwa4385 godogodo-004 godogodo-003 godogodo-002 godogodo-001 warrior1 wyfe dshuni corvettesadmin mun0305 tacocoke3 rarestone22 shoestore y0017035 workingmomsadmin inobrid godo94768 sisamall-025 sisamall-024 sisamall-023 sisamall-022 sisamall-021 sisamall-019 sisamall-018 sisamall-017 sisamall-016 sisamall-015 sisamall-014 sisamall-013 sisamall-012 sisamall-011 sisamall-009 sisamall-008 sisamall-007 sisamall-006 sisamall-005 sisamall-004 sisamall-003 sisamall-002 sisamall-001 jinnam01 gumho7033 gumho7032 nj00901 pearlsma5 pearlsma4 eztechtool ckyudong natural365tr kshan33 rlvndqa magicpuppy thsui lhl1982 s2pselfdevsunny qwe879 gameshowsure wlgus0411 prime05562 prime05561 jejufood2 magicadmin mariweb-030 sintoboolitr www.sol ykssk209 dbflfksp smreo0071 mariweb-020 jinying7771 meatstore cmpsnd11 attybook m.development mariweb-013 parkyuri01 edell2214 mariweb-011 designhappy mariweb-010 hhjk090 mariweb-008 kailas1 ohhifeel1 babyonekorea quitsmokingadmin pulmoo1 www.smi bsmedi1 j0103s wskang71 hanakwon71 coolsangchun musicsesang feha1004 soguitar violinbank white1331 inicis ams1237 blackhairadmin me0200 seinntech sgadidas babokachi1 frandus greenfund coverqueen gi334admin ucnownet3 ucnownet2 dalgudayo daumplus5 daumplus2 isshe841 msdoye1 dlaehd12341 layetttr6850 caribul nospin1 rolex112 jimi1234 nam0428 blueland ywoojoo www.smc pink129-029 pink129-028 pink129-027 pink129-026 pink129-025 pink129-024 pink129-023 pink129-022 spiratek pink129-021 pink129-019 pink129-018 pink129-017 pink129-016 pink129-015 pink129-014 pink129-013 herherbada pink129-011 pink129-010 pink129-008 pink129-007 pink129-006 pink129-005 pink129-004 pink129-003 pink129-002 pink129-001 acasia4 acasia1 patiloma3 flood37 contentsweb001ptn choib81 syoe1992 theprayg cjrail1503 hoeun55 lsyzizibe ansdydwk77 ocm8245 moon2nn1 ryusc jygolf vitamineya3 qkznsocm19 qkznsocm17 qkznsocm16 qkznsocm15 mqnix00272 woohaha1212 woohaha1211 dental08011 raonix17 ilovepcbang rina4634 daewoong0525 aceoutdoor smilebean4 fexchange jacekorea1 lemoncandy1 saiquick hana2ju youmi4262 buy7942 yoojimin stmediakorea sujunggun enamoofs ebookstore chon355 chon354 bunkers chon351 hera463 sambsamb4 sambsamb3 sambsamb2 vivianan8 www.sit vivianan1 woohyang hadouken poplarathome rhj66072 barreme yibok1002 bunnywtr3877 cbin777 misomommy2 impnic fan951 danahblind sj7727 crowhell jsminicam alejantr0857 dalnara zaxshop pyhee74 maytwo3516 dcstore12 dksckdejr081 kidsclub1 leesum0101 kukujj007ptn oliveanne1 liongroup hospitaladmin psmcreep6 psmcreep5 psmcreep4 jjoo12341 lalahaha7 freebits1 tong12104 motorex ckzks331 godo50687 jeeyeon486 nickyeh2 cara4422 hanxiaojie3 hanxiaojie2 sudamnet gogoko123 ithecompany mate1987 blackzang cha8055 rainbow05 lcooljl juallygirl1 moagift windsor7 ssismcss2 windsor1 godo92959 tofino leeunsoo2 goldwinwin sayyonara3 rosebud0314 do6803041 xmflgha1316 soraebada curemed factory13 winiamando1 zbatsugar mlove2013 sbj32941 hileesee1 a482 giftcard24 inmytime striftr2773 islamnet ninetwo itconsultingadmin kmh0662 dragoniron sbs22121 pacoel7 pineintr2455 pacoel3 kbg1616 iintimatetr lexon3 miu8209 scpack shairsys2 fridaytr7648 hamchom emma19813 emma19812 ssadoo2013 dadam92002ptn zamting00 godo121570 mhworld sianfb123 sianfb122 fittz0514 beagastr2931 lifell01 c29042 tni2005 urygusl boxtv1 eyaaeyaa ouadms1004 wdne20102 kindperson1 jeeyae cjscience klp2man s2fsselfdevwheeya88 deepsy11 artmonos1 anegels13 anegels12 anegels11 anegels10 safeland nookyshoptr shfksgorl2 greennare1 americalatinaadmin ire1532 ire1531 ideantb onesberrytr omokdae2 godcadmin yjkkkyj2 tyj0711 indibank1 sg13735 wnrkq2322 sklg3377 basstuba1 ongame95 boxsquare large777 jiwon1601 jisabal ryu3362 easy71 leenalee77 rainboweshoptr charmfnd1 gocanadaadmin minou73 minou71 liitto y46581 i2free locobozo14 simsimcocall dsfood choeran gibbmi881 valansis wnsghk2 wnsghk1 nytech011 uro09828 uro09827 uro09826 egujjoa1 uro09822 daedohead cha7142 teaping1 wooilyo1 bellabella jujoonet jayblood tressa gamessladmin rubana3 sabakki2 hwa1538 yoyo07164 clef4404 clickpsh rjstkah woalguswls pdoohan higro814 koohip xn9ktr9341 greenfarm clickpos koreacc1321 kitchensense2 dandyhong sooda able881 newhelloabc shindusik dnp33686 dnp33685 dnp33682 fatfatbaby2 phonebank chworld www.sat heoshey1212 imstyle-v4 lovekssh20 antivirusadmin iamstore dilly9898 florencearoma glfood3 iferra2 thegroup sensetime19412 sib2b777 ds3ebr3 ds3ebr2 ipayibogenalse gionara1 de7521 swan20084 www.equilibrium kool77 kool74 shjung80 manlejjong1 gani793 bodacard1 ideaguy hanakang lovetnb dadam92001ptn somac ohbeeho longdown river0205 jfdesign jiahyoon imom24 mediffice1 sddre1 thiscotr8602 hjm306164 cloverisyou jinubooin jcommerce widepicture juicybam naraeb2b5 naraeb2b4 naraeb2b2 naraeb2b1 hyoreen cntoto762 yinang no6248 unluv29 lmgkorea hscosmetic boyami levelize myifthtr3838 ohandee kmg8290 ssy0918 yjean1 hi6732 sm72152 jiniee2001 ttaeyeops11 p16442868 glennn godo119237 dbcrktyd samchotr7819 godo119190 son3s parfumtr7383 lwinkl5 lwinkl1 truejisoo rolenjoe godo119110 ziucore doongsun76 konimi coldr11 cgogol slaimhj lovenz1 excellent1 winwintr8114 wjdgml04022 ifm1209 whatever1 quarter misso79421 zsunho ksw60251 seoul3000 konico rhew3373 rhew3372 ribbonnco shinilmusic jujoocom iworld21 puremskim hamjimin illideg cpainsladmin innodesign hyunchtr4151 twithutr5899 jeehui adonis928 inface ipitta ielttr8266 barny22 jpory64323 duometis3 safefirst1 hello2friend seul5868 tjddk007 ysjune1 creed26 sodo3 nient011 hiais777 bethebiz nudull1 lgallery doshkorea soday fafarm jeon9897 sodam artistry2001 shinykon1 seongnew2 juxilove hadongm totalsun1 qusdydgo major10121 h82y1548433 june00531 secrettr3719 pommevert interweb mjl5923 xmfkdnak1 gogimat gjalfk1062 xenonplus4 xenonplus2 wssin6w9 wssin6w8 gomddange crystal28 cottony0 powerkim yami9999 keiron48002ptn hanacome18 hanacome17 bolt365 yesljunu1 bau6393 hjkim99 plelece1 rain8192 buyshock kyweb daha4136 muyoungs3 smsd2 muyoungs1 popsnow cacaocoach1 tkyng555 gyc9393 www.musiczone foodritr2117 boardkorea ecoskill minione301 xunmei9 xunmei4 lollishop vision76 chin5445 qkrdnjswls131 smpre aliceyul eversee jajaja dltnstls047 dltnstls042 artnartr1382 historyquizzes scmdev kgy09064 mmmgooo1 designnaudio miz013 analoggo beck981 duoback1004 ghjp559 moon5822 s2fsselfsetuptest dabidang hi5425 quarium cltrs5011 intercom haim1004 tong043013 happybaby1 dgblind diypronet dnsap001 lauradavis tong043011 cw70672 volgali1 lyunmi jjellymo radiodj uisookpark minimotors4 scmall minimotors2 minimotors1 gownmart pch93474 desingarts3 hoyoa dlscjs27 heechany761 publicnt1 dang3000 lovej21 dmstory591 dksgytjd07 cheece powerfe6 powerfe5 powerfe4 powerfe3 powerfe2 powerfe1 1001mall ehdchdltm greenchoi yhj9475 tae9290 zinoljm4 synthpark1 zarabiaj yjs4187 moacom3 moacom2 moacom1 vintage302 artrack1 lovei10 gsme1 rcarena4 rcarena2 eunhee461 exweb8 fsuri2 kb4741 bbanyong babyparentingadmin godo117484 yaho0627 lightnara1 familyon iceworld994 ionhaitr1044 europeans00 serverhosting254-250 imi8061 incom1 rokaf8217 kopd13093 uworld1111 interkorea planthej5 planthej3 prettyaha1 serverhosting254-238 zach32 kona21 hersvill wangsstr1532 beauty1 pkhong147 miracltr9261 keiron48001ptn serverhosting254-230 jdmedi mysohome2 myhome66601 ghdrbekd1 ruril mageel2 serverhosting254-220 jjanghyuk1231 deadhorse.powerize kukujj003ptn solletr3301 ttiik0421 ljw57441 osr777 beautec gi22admin lioncra serverhosting254-208 serverhosting254-207 gi451admin serverhosting254-206 myspacelayouts blbox119 serverhosting254-205 runtoptr serverhosting254-204 theshitr7447 backup72-2nd ohmytrader serverhosting254-203 bagsa1119 serverhosting254-202 capulus lwimall serverhosting254-191 botzim caw22 dnridnri123 pinkdangkn1 woosukgagu joen1120 guglielmo2 gdbird1 psh1310 jusin3333 gi212admin dkfdkqhsl2 wharl7 bandyoun godo117022 serverhosting254-175 ourking121 kss17621 ovis79 aajenny2 ldsmalltr gks410 serverhosting254-169 seoulflower tjsgml6637 reshkorea2 foreverkdy1215 foreverkdy1214 foreverkdy1213 dnjsemr02081 kjokjo6869 yjs3460 tinytottr4759 packfna lion27192 beaure1 serverhosting254-159 choisakra jrin6981 gi30admin serverhosting254-157 www.wwenews dm-bike withtng114 tigger1 westoretr serverhosting254-150 ssshimmm wellooker s4devmimi shilladsmalltr dbgma11 phill19772 billiardsadmin ddangwee lagon20021 serverhosting254-139 totalsds7 totalsds6 onyaganda1 turnkks lagnn09 lagnn08 totalsds1 greenbike serverhosting254-134 sarah2660 toyzon gjreform mkflower rumi1 yo3una drsousu1 hayantan leejinwon87 foothealthadmin kyeong3919 hojungga zabcho eunicorn happyday0413 hasooni2 solyeep sinbalmall no3same3 enamooselffix giftlg3651 lbebecom hotkrtr4482 googi811 dkfhddl1286 choi24k lesvie cjb33333 ladytable jikyjeon9 jikyjeon8 jikyjeon7 qkr9477 hwaya3 jikyjeon1 jkpark9000 hkh8026 testedu-003 testedu-002 testedu-001 allmychildrenadmin nagne1591 kamangoo2 jaeho0404 bikeon mostive countrymusicadmin vedika dnstory1 agnes09271 mrcafe jihyuntt cool6270 ss102 ss101 gisadmin dukeland marientr3765 marientr3763 jaeho0310 kukujj002ptn vortec danbi6510 modafamososadmin gm00008 kysgreat1 jk3384 jihyunin revernco raykkorea tkfkd5353 jjellise jennyholic92 aa114 tazal hwasss whistlemotor whitelee85 legomaniaxtr ellisvilltr nosturbo f4040 tobang finfratr2080 ftshoptr0819 jiny14452 ilsub1 haudi3 chchd5 chchd4 godo87112 fourth hwasin dang1191 www.eldorado padg771 modencase ckhanda hanil8807 uamarket dbskk2tr5271 trinta302 sj2290 fstr07 purecare ssadamoll2 ddmsaip82 rococotr0634 tcctv nam58501 hayunine shoesmong namseung1 dafm415 inarai netlinks realhockey1 jeon7075 minhair www.por dodogirl ssmario1 uhakinside qlwn482 cararis leesan79 ajedrezadmin nixxxtr0906 mrmarket inaoro sbshop speeno5 dapark94 saengi77 jcsoot envy55712 heat4860 wnrjstn hispace hcbig3 padadac pen1003 blooming1 minhyounga ssaneon11 myjinan p216212 nostume1 trendi1 polyhan2 anjunara1 theziatr6193 pishon kaidlee teappong2 teappong1 musiczone oldro72 misoen0422 chomi0628 sbseul estoneme2 ssunworld bemakakao cfmall3 kwak3709 nsj1224 photomade1 trymimi lotto9796 goldposition navercheck purebess iamsoul2 ljh06874 ljh06873 ljh06871 fineartadmin snlovely www.graphics sseu1234 shin01181 kukujj001ptn danzzac skgun child5572 chongmu1024 rcchamp ttong044 ostingirl2 ksm3431 cottontr0542 popo66zz mmagpie-050 mmagpie-048 mmagpie-047 mmagpie-046 mmagpie-045 mmagpie-044 mmagpie-043 mmagpie-042 mmagpie-041 mmagpie-040 mmagpie-038 mmagpie-037 mmagpie-036 mmagpie-035 mmagpie-034 mmagpie-033 mmagpie-032 mmagpie-031 mmagpie-030 mmagpie-028 mmagpie-027 mmagpie-026 mmagpie-025 onlylove mmagpie-024 mmagpie-023 mmagpie-022 basilio coloncanceradmin mmagpie-021 mmagpie-020 mmagpie-018 mmagpie-017 mmagpie-016 mmagpie-015 mmagpie-014 mmagpie-013 swancnf mmagpie-011 mmagpie-010 mmagpie-008 mmagpie-007 gi328admin togames mmagpie-006 mmagpie-005 chinesecultureadmin mmagpie-004 mmagpie-003 mmagpie-002 1100 mmagpie-001 gi476admin oilfreetr kdh4715 justice1233 seven20121 drkein hwamong1 capsmal sjph1 freshgarden jolrida dlwhddnr4400 violet3x financialplanadmin bosomi kimejj1414 kys17x3 kys17x2 s2freerelease pjh9019 qkr7903 feria74 lucksr78104 hanil7772 zizyzix1 nicecd3862 shezhome cha1850 carajsj hyokyum golfchaetr sch7095 victree btsmono2 sj1234 kwonmihang bc2765 harry2 ciellight namju815 ipaybbwood mdpkang2 pcsimmani moohanfa minitar cultfilmadmin koo20033 toolsjoa3 ekbooktran limh6151 newageadmin minishe momejon2 momejon1 missleeshoes jujh10081 underthewind kcw30100 eusenstr2920 minjine edmontonadmin ohfashion liveinsoccer4 e2com coffeehearth bigmouse rtary backfactory nybigmama2 decofarm ksm2766 sunahouse gi192admin popshoes3 popshoes2 megacross hansung501 kissme1719 momsoutlet1 asadal050ptn speedbi ansunyoung11 tong04309 tong04308 tong04307 tong04306 tong04305 tong04304 tong04303 tong04301 carrusun6 naltene1 chaiz1 skineva moaba34 nemestar homendream1 youngfly882 youngfly881 hstrading1 kojavi sonhyeran dodosense tsj010803 tsj010802 tsj010801 jid4382 webiketr5947 ipayelechorn procycle1 plcorea ryung132 wicked3 showrang4 showrang3 ubicom2 agnes07074 in2diet swibin kdh3755 familia hdk6246 gagudawoo kays0310 tokyoshoes1 chacha8606 luxclub ssawoona porori1121 tjd4804 oilback3 specialedadmin darknulbo5 leey0333 omin883 emileok1 blueday1 huritz betty020 htata2013 ksmtmdal sj0401 gwangpiler sjm03 showdr3 sopimiran12 amebaworks2 asrada1 gcsd338 gocoloradoadmin bomnalco beasia4 beasia3 beasia2 chaeks storehouse2 storehouse1 fiveray kimnh62561 drimi3 drimi2 ep1421 kumsanew anypiawp gcross www.oks gi16admin chadol gi445admin stickoa rtjean1 doosol1 serverhosting107-245 silverss healthy3 bluemingky 09jungletr serverhosting107-225 ltc1221 jungin36122 codecode next10304 serverhosting107-201 dkxmvlf115 tnhawaii silkn serverhosting107-175 dpan081 gyounet serverhosting107-157 bae12sh serverhosting107-154 serverhosting107-138 bc1627 caribul18 caribul10 feel11012 mi9792hyon qkrfodbf2 cktiger hansolvan richman602 miniii3 miniii2 miniii1 bakoonpro3 ace2525kr inplacebo animefans iljinkorea3 kiwi121215 ntreeux1 ljsystem chowonherb2 monosara hujun94 boriya asadal048ptn sonddam bsw02271 mapia12031 rssports2 rssports1 cad1042 hjkhjk146 haha5502 uzzbebe wnffldhp841 ameliejsohn gi206admin jap4045 iapplian1 minifix ezinext asia6366 pjmh1234 hehishim redgrape gaintkys yeppy67 oaky10041 fsleeco gdayadtr hanacokr hitec91 theshitr3463 chujasong weasd4312 mhchosj motif73 the154225 moon0925 www.nsc authorsadmin egon07881 es4free rv114tr3544 leomaltr2861 minidog chicagowestadmin cozyroom kk7375 memsearch maymong12 a328jank pipoca ulookmalecom shuba ilrang waitingsky rommystory3 moonyoung1 acc114tr forhome1 heon1119 modernxx namutrading nanang00 shnpg safecom5 nl10052 safecom3 sifff manguluv2 manguluv1 silver75 crossstitchadmin holystar jliten2 jliten1 br00315 health-i codus8474 s2pintw ebaypop9 ebaypop6 oshea2 haramj cbc26161 isicmaster84 heritzen7 heritzen4 rhrhtlsgp wjdgml2 kjn1824 dojagiholic goevent snikystyle3 psywigtr jkglobal21 gydmsl91 ajflrl831 ksm1048 avlabtr7583 study000 soutiger2 soutiger1 kwons222 tathlon1 ganhedinheiro ghdejr drice1 gi255admin gotodigital sblindtr4686 cling721 eunmmmi carapass1 yeppne2 yeppne1 htable1 lypkmr shkim theredclub1 rooiboskorea nysearch iamshinq2 vasilius1 sonido recetasfiestasadmin guitartr1175 prmart34 goodstore prmart31 prmart29 donnadeco1 asadal047ptn prmart25 yummibtr6393 mubjstr6205 tigi228 leeheni1 woo37721 jelson5 mplandtr7697 bluebelt cghjlc godo83445 shimc modesale eve282mj mingoon prettysfc desong1 prmart12 mhj0035 wpspw12 cowalking leoug4 chukachuka5 aart1232 flyhouse ahrdus93 rain2151 furunbory dujin1004 playtitle tolive1 multisam1 kky1121 suniltoolz seongnew4 seongnew3 taemin8101 seongnew1 kky1101 theminime eastgagu2 althing takuteru1 zacboard healsdak prinart power3g5 jwkim21 godehdal shinyehwi basematr0983 castbrain skijun2 skijun1 godo111866 mikimjh1 sema20001 juny8075 www.fmipa sohokorea2 okyumion mogu05015 kkarigirl-020 hansoletc e2gee fancyk4 fancyk2 fancyk1 rookiegirl2 kkarigirl-010 kkarigirl-008 laminating1 welcomebbtr4436 mikilove kkarigirl-004 lsk8233 hwani4u1 codyand1 s4freeintmimi tjesther kimdongeok2 mykim02062 lkmnature1 1001gagu isesangkids purplecart yca8004 kwen8567 ppjar861 happystory fantazzi2 jjwp6929 eoqkr7976 breakers3 turkishfoodadmin lucasmall leontailor evenly2210 casinogamblingadmin exerciseadmin safecare primese comsun777 aone322 redmay6 redmay3 redmay1 jbizweb002ptn cafemano3 moonsu803 sawori gi323admin asadal046ptn green4kids1 muzaki73 lemonteeflower londontr9096 honamfood1 haso10246 haso10245 haso10242 loveandwe sbmug491 primeex mh12252 mh12251 alleyhouse m9611053s1 goldrightgr sambakza haha751000 aspoon7 ruchagtr3159 zzooni400 jsm9394 imeux2 imfs76 haieland fancy4u juslisen8182 juslisen8181 khwon10261 jja09girl6 chogootr5558 danwooc dngkfka3608 power120 mscogo1 hanvok e1it3 www.bluesky southnine bodypeople byuka4454 illkwon831 she-k tanksolution eveyatr4937 godo111084 bbosihae deakug13 dfriendd1 bumpertr0601 mhbooks illak79 sohokorea5 sohokorea4 sohokorea3 signstars oldnew2 oldnew1 fictionadmin alspo3o jj7272 gonycadmin jmh0707 s3devhn booora sfoo3 sm700 daedongfood geuxer1 godo81935 actpos6 owoo4343 jhtech1002 labonsella hansum gkgi36 boyscouting rain0735 enindi223 enindi222 enindi221 enindi220 enindi218 enindi217 enindi216 luxpalace enindi214 enindi213 enindi212 enindi211 enindi210 enindi208 enindi207 enindi206 womensissuesadmin enindi205 enindi194 oxo7910041 enindi202 enindi201 enindi200 mp3admin imi1380 girl2783 bigredkane1 limjd1 fundoo osekun boomss tyvld011 hitalk7 obchungs enindi215 minking10022 pharos03068 sangginara enindi199 enindi198 enindi197 ipayksh41451 agyangfarm enindi196 jdepot hptoptour enindi204 alpsgom2 enindi203 geosung mkad13 junkno772 boomin enindi192 dresso sury111 enindi191 enindi190 core0413 sjy1980 shygirlj2 kukuy7551 khk8863 donnafugata lorde volvmr godo109511 aseva seoroin3 seoroin2 anna7332 lkw7607 mst3kadmin booknm enbmt78b creep5862 ins9805 cm36513 cm36511 mimoo25 tphanwoo2 jbizweb001ptn godo81529 brown77071 mjsw2001 heinzman5 iatoz841 pickupnuri major001tr prettyang donxiote asadal045ptn j7001021 popkorn endlesrain87 allenjung godo15013 brocante1 toolserve imfeel iceworld99 sytkorea anvgagu ssuper111 omikorea1 koreaittimes opencloset duipsatr9452 ykchoyoungho1 sbic1101 hsmarttr2079 pak110044 www.scarlet finedeco perfume2u peunyang1004 seri2 login.flyfishing thulebox a19911114 jcodi1 catnortr6101 jdh9688 victorynana boogun ddprince godo81258 zhik112 s3freeintnulbo gi11admin tointomalltr hannam blackstar07 anatma991 seorm uyeah1 kmrush2778 elfinmk1 vonglass shosemd jw58361 godo110037 ritz1224 funnyfancy popklml sheet123 xezza04 goyonara coshouse rustichouse woodener1 sophiekim881 multipic1 maroo007 ksj392221 kange1082 jjdstore3 bizcarshop henshe3 henshe2 in0fishing dldmswjd682 misomobile info2008 verashoe maker11233 soundwho illumegate8 pjk425 gnointl kakaokong selus gksqlrldjq mbc7095 gi440admin hishuh1 iovesoon3 kids0310 hailua daonbnb roning5 magnifik deospot gi201admin ashleydsk book09 gpddl223 nineseedtr macouttr5779 hamse7 bomuls brotherkorea sr11051 spdental muum1004 pregnancysladmin senq21tr2021 inwoo091 roast tpwlsrkrn sck001 thismom2 thismom1 robho boutigirl5 paragoncys1 mizu1206 hinduismadmin pupple92921 pucca82 mptextile cmdesign jjugly21 dydwn8199 performingartsadmin asadal044ptn chae6465 uniwith4 laflore1 osama36 jindogift gi301admin s4freerelease legendblue minehg4 hamong beans00 teamzeus jerrysog sjy0705 anyone13 nanana30008 inposition jpmpshop1 collegesavingsadmin devtr6545 sindanmo lovealdo7 byallie hdwestore002ptn neoway001ptn stylezoa5 innorec1 superex knmira lenahc internavy yh870430 homerecordingadmin cholesteroladmin dojavil hotelmann2 binutgage2 givmii tess6824 june5379 anjumaru73 fantfant www.mortalkombat svmans lalamaison verychu mallufriends sonamu1317 withyjs4 lee5555kh sonamu1314 bluworld lhmarket dopamines4 dopamines3 dopamines2 dopamines1 halujk pcm3319k tldus11021 yegaboard zetbit nohsora1 jellytup nora00141 y42193713 y42193712 y42193711 bonge5 dragon1525 dogpartr2198 kli2519 www.maplestory blak1004 anmiwonjae jya802 ghdtjsdud99 lead0419 actol21 mpinc2009 nicekido2 gillsung002 allmarket miraclefish2 miraclefish1 anes5020 goyongho onestar ixoustr1734 kwankyou1 hthlsy11 hthlsy10 bradshaw kps6235 satta4 wumuw12 wumuw11 wumuw10 ilogan tophomme sedar edutest-003 edutest-002 edutest-001 adnet4 adnet3 designtr6405 goofee74 info0704 dop3030 kmungu happymind3651 mottny siatkids uriwa eleddong20111 ehaesungtr designpilottr innopole dtrend003ptn woo5218 asadal043ptn serverhosting254-180 pageenter2 cdsaesae kwc06203 kwc06202 valuer21 dltkdrb2202 starsign1 auri22tr6901 cntcctv mexicancultureadmin mincoon tad8878 lovetournet3 trivistr3679 breakset tiresadmin happyroomstr ckwls0707 adnbiz golfmotion shoeptr5574 diychoco87 popo0724 gnjsclfalska3 smj98271 drcorp smartsunny km780201 hdwestore001ptn newdian012 kkozzatr1147 backup71-2nd bettysl cubicpan1 donongwol harmonydeco ha61114 admit4 baseballkid wfr123 winzgirl2 gosuccess suuh75 marokiki44 khk6362 suun0001 secho70 tlssmc qorwldrb1 tree4smart1 liosnaif001ptn jennykim salam7777 idikorea euphorie71 rih21005 kazetr7485 ykustic charmfnd mirae09 ssdbr103 ssdbr101 okebary2 irowoon mini0762 akira34991 haechowon saywhat mirae02 npaper213 younnam0 yongyong2k chinaweb pen2011075 pen2011074 pen2011073 euniett jwminbak2 atzoootr1292 teamj0317 buyblackberrytr3134 h82y1536641 lejybe wanghh330 shopjtr bomebi ysisky2 limux21 tommy20023 tommy20021 anyparts juheun1105 hh4088 hansori7 emotionno1 costarmarket tulip7787 bambara improvn2 smartwax httpej cc112a31 dreamwk7 sevenled koyw0225 say79kr kimjobo5 kimjobo4 trustkor kimjobo2 hahacoba7 gomnimtr5839 alphawill gi317admin yuooooo bos300 dtrend002ptn asadal042ptn sj192 cfmall pck1977 urbanoid biotree7 osarao yuni06251 y4141 rhkdsus21 stayathomedadsadmin moto3651 rsko9210 rdh74351 redglass khwanik5 fdonetr7285 pjh1296 eunhea82 spbq12342 spbq12341 servlet12 rssports dreamsji deazon moto11 cslighting1 rin8531 fishingtv16 s0428331 fishingtv11 woo3772 koi111 odc2512 odc2511 yhp778 leemaking1 hellosports apolo25v4 abc16164 jdleports pkr9776 da2sso1 cm3743 ehleem dapanda k1textr4114 khwon1026 windev18 bluesunh-001 lovebicycle gydms851 luluchemical bizcincheon hukhuk juny6340 neo2885 styleyang cm3651 spokhatr0080 jdh990 jwarehouse k2juni exe03112 satang daejunbank gps123-v4r absj maxtoto adkoko tasd121 iaan1004 diottica enprani hobbyandtoy ink82tr4547 signup.mail har107 iope79422 swam82 osmosetr7286 mini103 s383638 an194001 photos24 windowsespanoladmin tzmcom1 cheongon5 clzlseowkd threeh03011 dbgma111 acts96 wlfmddl6 wlfmddl4 wlfmddl2 wlfmddl1 fd10813 www.kss dtrend001ptn asadal041ptn acts29 mauntain2001 un50252 kyr3089 ucnehandwork ymfoodtr3901 cheongnam mjcsong nhbai2 ecorian2 csco3040 swacom booksell3 booksell2 mrcompany wesang kmerkatz limsurk kidsartscraftsadmin jcreative8 jcreative7 thyroidadmin jcreative4 rex19951 jcreative1 mrman16 mrman15 mrman14 soonsou755 mrman12 mrman11 apolloeos2 ropatree manualfree saemichan1 vision97001 canonhousetr4170 sukpopo1 euromatr3933 youmsangwoo kicheolpark edubooks kkh84233 sdmysong6 sdmysong4 bladerpk egg0419 zillion3 meetree zillion1 nani94401 saqa1 qusxo61 okeedokee1 fantary6 chojisoon1 arenas632 hspark01 etodayshop wonwoo612 ybrenttr5235 yuseonk1 mystertr8093 moroo1 crqdaiwa koaid3 svn-season2 svn-season1 moru82 trydeng elnoya1 ntree906 cph1113 cctvclub1 nabiggum moses5 jjhdha2 jjhdha1 the336 kobj0706 woodpeer1 tank10081 vldzmvostl wonderstr zaizzaiz kpc101 x5dr5 stylesay chdlminji1 pbs9425 plateros girlscoutsadmin goodsin3 thdud8848 voip3 joagoltr4470 mirepaok designw whtjdms0392 soleil1024 tgs52471 imagok lsed winnerswon minajo2 thecentaur bjw1990 backpackingadmin gi434admin debbnmor urzzang4 urzzang1 familykorea ustyler1 twohaptr2258 fcss0700 joe08181 ysboard153 sdfsdf digity81 www.srs euneunv kog515 ewoojoo joy740423 eduedu-002 eduedu-001 ljhookart keeka1 risma asadal040ptn bumilion2002ptn cyshop j2s0408 urbanworks2 suren2 jbseo3 soya04071 wayomedia moriz2 shongun damano1 jsealing fishingshow skyanbg3 nicegam karu1220 ipayatoben1 gufarm yhlayuen wcysports hosikgi123 oltramania bonpeople1 minam54 ts9492 mamijjangtr hajemt werbew dd1999 prmjung3 msr97973 brandplanet jchull worldbath3 thirtday7 dcjae831 florist4 florist3 florist2 konom777 acts1270 cellsladmin hghong09141 awy03034 goho1972 petruspark1 kimjs9374 ghyawr01 gi185admin paolo202 playgon medicalofficeadmin www.ldc multikids jazz75 bigboycustom mmiijjoo2 m5acnc arktour012 wesang2 linkbel hansu5802 lhj2425 sz900831747 yoyoyo6 youoh252 zfishitr6882 skdiwndl godo18tr8760 kal32000 pluscheese orij79 edding1 bojeon joungyoon3 orange6716 godo75002 medusa1599 dmscjf892 ymoonchan1 jjicoffee1 seoilfood ballista2 aux9971 gi336admin wizz abzzab jkkorea2 surlira hoontech loshfinna2 loshfinna1 leegonelee3 tobangfood idc06002 amateureroticaadmin alsl9812061 kby3388 tlswjdgns12 tlswjdgns11 ceresjane cinthea2 perpetual77 wearnet wellnlife busexpress teamevo dashuhouse bicyclecrew statisticsadmin yuildent2 onepice lyhyun2 gifteabox es4rent dk04272002 asadal038ptn artnwine gojack60621 anna1203 jchnew cleanmobile sungkunc ipayy1684220 babycrew1 daoncp1 eveelf5 chs9152 chs9151 eoqkr0773 coloryarn3 ssong49921 solmart nwwnulbo hnmobile yeonsung-100 viridian2 won92ko minibyuri hahobj danpopo psdstudio www.tik anna0927 uber7328 nggri2 sj162863 nyrelay ecoperm orgpbh trio1195 trio1193 stars231 kyy3382 lafirst xotjd0523 leeseo2322 xiao611 wanjin1 joatel4 yesoya2 www.villa alfo3093 dkehd71 goelrai ccy0222 cocdesign psychologyadmin hukaura zizimaa ahnsj00 jsspace6 junsic-030 jnsglobal kjc7890 goodboybsy3 goodboybsy1 homekimchi skgulbi sac31 dodream1 youra961 hens771 ultimateroms miae6941 dudghktl ashley715 styleup2u cooltrack friendog vapalux sunyub hisynim3 fgns5119 pojangmd bbo1029 ch79191 adhomi gbk12031 namhunzz asphp72 totalbtr3290 mr70042 sterniqeq fromdaniel1 ipayhsomang medicmedia pojangdr luxzero u102hyun3 u102hyun2 csj00354 csj00353 csj00352 dlfrnstk skimxbeen hjleports5 pjaeoh7 pjaeoh2 kongsooni sanyum mstowel1 lhsgkrtn xoghk03 www.aaaaaaaaaa koemtr1622 dgtong9 dgtong8 dgtong7 dgtong2 aram7074 lhj1025 papadaughter1 sevachrist nextgo adicok luxury97461 asadal037ptn pro83132 han777 yshwsdj designartsmart park7270 shkim5439 petitmore2 okidoki9 gmskin10 bbabboo183 bluecarpet parkjohns3 godo73378 dannykr shonnlee adnet7tr9530 findgoods forestfood1 seleibe2 seleibe1 kmrush27786 sps49051 pasteryn kjytoyou durifitr2595 shoesbang rjckdahf koh0811 pjw306142 motelriabed bitdrugstore makeupcar hun337 eduweb34 greenhands1 babyve71 baiclef1 koshmarket s4freedevsdg jollykidz oleiros gill263100 sanup1 phonia yakplay s379103 otimetr1039 p2sung22 pangpang2 myshop-029 myshop-028 myshop-027 myshop-026 myshop-025 myshop-024 brotherjj myshop-022 myshop-021 myshop-019 myshop-018 myshop-017 myshop-016 myshop-015 ipaykhtr9885 myshop-013 myshop-012 myshop-011 myshop-009 myshop-008 myshop-007 myshop-006 myshop-005 myshop-004 myshop-003 myshop-002 myshop-001 allthegate lohas0011 agijagime bogok1 soccerkoone englishcultureadmin gyuri010 www.tic sim3419 popdkdl westernunion maxport sante2 sante1 mounggoong1 godo270 moonan csnet00 nurinail1 bestkim99 barack4j4 lesportsackr dnjsgnsgml741 sinnara1 moitie70 hocsong omniherb3 omniherb2 jaekyumlee acticon kokundo4 jlp1357 npschool kate37501 i68425 stwood pluto134340 nancho911 anagod1 boombox811 jun9453 douglasmac mn22ang atfox02 go04124 hantara2 somang2 somang1 wkdwjdwk11 binine00 newsz3 newsz2 gi312admin rhas2 imarketing052ptn stseller drumman prides2 park6322 park6321 asadal036ptn bear0235 popcorp tonyaqtr1378 newsjw minami21 needforspeed t1inter boggisland1 beans87 duruduru zillfin2 ddos253-133 ddos253-132 ddos253-131 seoulem switch001 icars blackmat hanmibook ahorroadmin thenow23 kookmitr2323 mapline3 es3today haitnim blackkpg okkuyng sspp800 jes1550 yeonsil fromto ansholic snoberry2 gkkoreana5 dmsdk60291 jyjyok3 jyjyok2 cheongyewon1 gaegul211 s4devtj partiniitr s4devsf brother12 lilymag dntjr001 k7k6w35 s4devnj bea60482 filternara romiys1 kan1017 www.webdemo soljin2 koreacarcare1 i2373720 s4devhn cosmosqaqa3 k9301251 tvschedulesadmin jason9808 newoni logic875 limoti4 enter3853 enter3851 jsm0045 s3freedevnulbo mindhomme housentr9794 wbdw777 gkstoalek1 zeropark6 sankdy orilove evan1052 pcsupportadmin sori50783 usgovinfoadmin dsptools ntree9061 ji0ij1 www.crazychat papavov8 enfgksk1 lhwfree ejlove1109 news71 orientationbb myoungs9152 sunhae www.freeworld goscandinaviaadmin youngmusic tpijhkim eunjin11181 pazzihouse sangvi partners1 newksc kdg0309 starquad4 godo100517 haemiltr2502 ojh96792 ojh96791 tabu hahoetal70 dowser lyhpjo5050 qoqo4496 rkeheo jykorea marok gucci27kr kstorch1 dreamgive limta1351 monkie choi760301 skfl730 entadmin leicanaracom haeorm asadal035ptn bicicokr kmmukg hyundai-040 hyundai-038 hyundai-037 hyundai-036 www.fcbarcelona hyundai-035 hyundai-034 hyundai-033 pjb916 hyundai-031 hyundai-030 hyundai-028 hyundai-027 hyundai-026 hyundai-025 hyundai-024 hyundai-023 hyundai-022 hyundai-021 hyundai-020 kyung07201 hyundai-017 hyundai-016 hyundai-015 hyundai-014 hyundai-013 hyundai-012 hyundai-011 hyundai-010 hyundai-008 hyundai-007 pricedn hyundai-005 hyundai-004 hyundai-003 hyundai-002 hyundai-001 gi115admin kan0245 kmobis wormwood89 eslatti leeju7 2bbu winwin11 blackbs1 hyhan2010 bodyya tokitoki88 sogangtnt patbingsu3 gaon16103 teradesign1 sujakssam1 gautiermall mono12 kinoson park5058 ebccenter ecoment haenam monic0 czeon4 wpspw1tr8125 yeonhoj xofkd003 soccer2002 nzblueyang2 rl755 rl753 safecotr7794 zzipzzuck1 limboskin yeijak edumentor1 norinori82261 wowcouples pinkstory helloko2 coffeecha squashon1 babarara041 linuxhosting245 linuxhosting243 stickermalltr1180 linuxhosting240 linuxhosting238 linuxhosting237 linuxhosting236 linuxhosting235 gi428admin linuxhosting234 linuxhosting233 linuxhosting232 phlux1 linuxhosting230 tmp0301 hellojju microbridge romiok1 kim7323737 mulkibel10 allthatstory ancrystal stylertr7079 cnrqrh13 gi180admin park4673 kkw70041 dltmato1 wjdtmdgns77 graphicssoftadmin carm10041 jmoons007 stuhamm2 ljkeang73 ljkeang72 tkdstory misoshop coodgns2 newcrc picto2 rladidgus94 jang05051 santamonicaadmin sebins7 linex01 sebins3 dinnerfactorytr hisekina strobeau homecorea imtoyv4 colle723 anymusic apaya10 shineshoe1 dvduck1 hbckorea1 vmeet jhg90wkd green61611 hkschul3 hkschul2 dosion213 ssongyi17 slrrent bodysktr7751 leecos a0221642700 ju27921 pej0620 gensiro nalgai20001 jjh2161 classicmotorcyclesadmin leechi sameun adelie shop001 designmz natedanji gcsd33015ptn danjifood secada1 s3freeintsunny harry7000 rainboworld daewang01 fasionbiz mvpclub aidsadmin godo69353 xn3htr9530 spxkoreatr designfx aurorakorea soleil10244 soleil10242 soleil10241 molylove005ptn juwon0622 jhtrend2 luvpratik ladycat lch66511 designbs zeropack2 zeropack1 ucs337 kool2741 sullai zzang6881 winnerswon2 ttl7812 baberina quddn4 kkw7004 upartners neo17304 neo17303 neo17302 neo17301 urban3822 zaoln www.soto semonemo vangquish4 vangquish3 vangquish2 geojerc hallolupin1 yyasz10041 redhairanne redfroger vnfdlv03031 koreachild esedog bomcmall1 l3035757 choimin20042 jinirose07091 www.sora love22431 kodi0725 silstar4 plusme5 toc njtrading2 njtrading1 mazanta3 alicatr4694 samack loitraitim adel75 chounghyun2 pandor00 ulppang monitor161 dowh67 choikimine3 jzid1284 btylife pluskey hulux0920 nzmall stevehtr8770 hyenminee go01171 design2h sonamu1315 leehongsuh sonamu1313 ledek4 rebiz yonghun22 amare2241 happyshook yonghun21 uziuzi4 yoojin19994 fairtrade7091 postictr genfa091 asadal033ptn www.puskom jooni12341 sulem7 suyunpuls hamo0003 applyresults hacong enteam duoback dream347 papastoy gksmfls1 boltplaza3 www.sips sayujung1 dumelife rlaeorua12 twoseven molylove004ptn artherot2 claraestee dltksemf www.sica sensafeel1 www.rose apnakarachi syspharm1 rainstone alwls10243 d2gmedia netpod meiko addinb milgarujsk3 minhee25051 openorkr azmazh8 azmazh6 azmazh4 mulkunamu1 puny9 puny4 puny3 puny2 estokorea stylistr1696 namin2z3 citrus10251 jagci326 rcom2 rcom1 daynight3 ironpin edugameschooltr vmflwms fishingmega lybon2 san3datr9921 sali12 jkw23144 allgreentng hollabagtr meganetserve saxoflute wandoph juheesh www.safe ledcorp01 dajoajoa ruruyang falinux biartmtr9184 aegiyeosi001ptn golfthtr0292 roadbella ifoodnet cunti72 cunti71 jwbong thewonderful mis4244 kekeker uckorea4 uckorea3 maycoop ssonssu sokoon3 thenmark ipaydawoo2com joungsw lcsvvv enshriue vnak3000 pabang1 systech3 style911 pinknana cabosan8 huborn aclock nzkiwi cabosan4 cabosan2 godoweb hanraynor heejin09 ehgud7642 ssonso1 iseya79 aceeuro1 tendenciaswebadmin ed12686 estargolf k2cine jmadang1 kmlee7 abwreq2 dnpqzh1 imarketing020ptn ldwhs82 rainmakers k1like filter114 nadayos uomya1325 goorlandoadmin image98 image97 image96 asadal032ptn hache3 hache2 nikkip1 changdae3 changdae2 richwater babywish1210 godosup bara581 cantong mikum76 collectiblesadmin ssun9804 godosoft-060 jasangbox celini justla ritdye godosms sungyou1 www.pink godotax gemnara1 rcguy joy7404233 joy7404232 joy7404231 youngjo123 totalspeaker oneinno jj4944 wekami woon2013 dcr kinglionjay olivekong icikorea asadosadmin dajunghan goodsflow fsblue usall0321 rojukiss nmj1185 ubskin kg75932 kg75931 godo67173 asiasound1 hbsfoodv4 qmzp1818 gideon3012 gideon3011 oceand2 oceand1 zazu aileda tkawjdtlrvna3 choihyunsoo1 oyerdan latinamericanhistoryadmin maxlim3 wlgus33451 bestnz1 bosaeng gogotori luvcrystal alttut11 godopjt lsw133090 dlawlsrkd00 balletstar xn9itr6850 jan6568 hstp07 hckorea sun40013 wawo90201 roseleaf71 shoon5071 hungsicjang oem1982 shoesyo kmkeun luxhk242 kmjpce pse9023 bestmnb mytime12 duduworld mntk10 marylucia ks1630651 babypear roaorlrnjsdu foxlike9225 foxlike9224 foxlike9223 foxlike9222 foxlike9221 foxlike9219 foxlike9218 svspower3 omega3egg host09 limlhk2 limlhk1 mohico86 just79 byeyourjune2 byeyourjune1 cantico harawoo4 hsr123521 assayes2 khj4817 godokys eyedabom k2bioz won3306 klyhbm8284 klyhbm8282 kmiway rkahfn fuzzy0071 host99 gi296admin godomdb lds5876 correradmin dkdhtl1 koolmobile contemporaryartadmin i8e1793 goodjoin asadal031ptn plusmro2 yoohj333 godolee haanul dtegsecurity tantoos1 defaultmedia doctoralex swordsbear itsbetter edailyedu molylove002ptn dreamco01 gi390admin iamyulmo1 ekzktl791 cncinccart bestgul neople1111 suji57 wjd66551 suhui2 zillion2 adart4 pbs0708 www.noel a369002 guitarnet miljs93 jetaimtr6840 capamax www.niko mlineshot2 matenmall4 matenmall2 matenmall1 hjyoo10011 jejusy1 jbiz10 seventr battery1st1 jcake5 jcake3 se000000 jcake1 dktkrhkswnd diy-shop cantaur volky2001ptn grayzone sty121 obmilk1 sskcr8000 m2skin wosung yok9900 audioandvideo jichun37 jjimin8718 lsj2307 ubrich nesege bass5214 idgodo-039 byhemee2 byhemee1 icoco6801 hawaiiview mayzzzang cysticfibrosisadmin renewals sevenam jejusc2 jejusc1 kimjs1004 hanme10 jajaemadang2 hitopic8 hitopic5 hitopic4 ettyk86 hsy819 nts0311 godoedu cumashoptr ghshop selebean alsanis zzukbbang yjoung1015 kwongroup1 robottap2 teddylee20102 shoesbucks rjp011 pointbox3 hoonklee wowmin-016 hoony81111 cavatina114 gododev joonggobaksa danbistyle apple18961 woqjf073 www.moka monoama3 younsunhwa bnp04171 icd jjm4352 asadal030ptn www.moha bestbed jtouch1 dummerce1 minam322 idgodo-030 dass8027 yrsong0629 revoice rahsy yakroad2 hainok1 brandntr6827 img43 jinatman1 iplus20 sungwonr financialservicesadmin s1intextacy ukdaycareadmin cult03tr1408 yy99008 bultaewoo yy99004 itmyhope jane9006 karam2491 impressbuy park0115 baramggi kimssy1 www.nana kimtkid waycosmall mb1210 captain761 werbew1 iluxbotr3041 mmm365110 ssysts homeworkhelpadmin minne1029 stylencom s2pdevsf lk1119 guweb120 morin77 dd19991 kook7676 s2pdevnj sunme7071 goxneul maditis ray7055 babymoov onesports ibbnyani s2pdevhn pgreen kwonskwons hap6327 fenixtr5898 gd2011 mceshop anycompany3 bestd24 viewtiflow cobaltray doubleyou1 jejukdc choseoni3 littdrg hgy78872 asadal010ptn sinanto1 nnwwssgg saibi1 stcok15tr7777 seanews all100flower cheongdam1 adam59 betinfo tubularr1 serverhosting202-114 balggorock2 balggorock1 djkorea7441 loveottogi godoedu6 w4cky godoedu5 guitarand bassertr5514 godoedu4 godoedu3 howlattr5838 ccw9812 jiun1115 js2538301 saintyum ds54527461 seodoori1 parautr7082 shulintr8114 ssyoon sun767 dnzsky ysj29301 gcsd33020ptn zpzg94 verylovely1 bgarlic simplemind happy4049 oikos10041 getsworld6 ljk1766 aojoa20087 babylucy bbiero1224 peopleutd1 dunesu4 tsgim704 rose76651 hillstate blue95063 enkai09721 topglass bagstyle healingsu asadal028ptn yellowbus dndns12065 dndns12064 dndns12061 ambassa8 godotest-009 godotest-008 mols1441 godotest-006 godotest-005 godotest-004 godotest-003 godotest-002 godotest-001 midistation pris8 pris6 pris5 trustfactory paintballadmin presentbox kimna0403 jinstar yellowcap ygftr3693 kimsiyeon dldyd11521 vivitar konom7772 coffeeschool innocnf4 goldberry dobuddtr7765 atsumare nachoi1 jin51774 saintvin hoya104 recsladmin jejucs2 abriny ii1121ii3 ii1121ii2 wowmin-008 leo08212 jejucjh oncarmalltr wavlady365 ektelecom ecofoam ardorwin58768 suhank dass6598 wlfjddl4658 artnworks rainbownature psd24 bst8575 zzz12994 andishe banzz33 nightsky23 s4intsunny rock0813 godlove dhfmrhf125 piezoprinter inlater jinsori gi151admin recon905 goho19722 dressoo2 nelly741 wowmin-007 osteoin amigyu3 amigyu2 amigyu1 dahong0704 ontarioswadmin joons791 stylemana www.loco fall766 newchina21 fall763 happy-art philos11 enrental159 sdkcool a4dc121 design8883 stylemam1 dorazl saintsei fourwolf isme0220 muhanbit cheongdam-040 cheongdam-038 cheongdam-037 cheongdam-036 cheongdam-035 cheongdam-034 cheongdam-033 cheongdam-032 cheongdam-031 cheongdam-030 cheongdam-028 cheongdam-027 cheongdam-026 cheongdam-025 cheongdam-024 cheongdam-023 cheongdam-022 cheongdam-021 cheongdam-019 cheongdam-018 cheongdam-017 cheongdam-016 cheongdam-015 cheongdam-014 cheongdam-013 cheongdam-012 cheongdam-011 cheongdam-009 cheongdam-008 cheongdam-007 cheongdam-006 cheongdam-005 cheongdam-004 cheongdam-003 cheongdam-002 cheongdam-001 jwpresident7 jwpresident6 jwpresident5 jwpresident3 lixuanyu mega-phone goodgown eframe otcgreen sweetool2 kagamii alus1209 www.mass tophana2 cameramart won0321 allmirae lovetemtr sgdbswl wdong3 teacera jaesoox3 kdsjhr1 nemoshtr8535 pkdd91112 ego108 viatc01 jsk12191 asadal027ptn skygksmf22 kosrhee ssun5871 ntm21com turboap1 foot7010 hhan8258 bobdodook recon28r em8888 jinhak4733 kdh710105 seamart eukwang stoymall innocctv wom9035 chcnc11812 sojubar w8883 babylife myfashionny gaon08087 gaon08085 gaon08084 gaon08083 gaon08082 api0011 manijoa3 eueverpure seamam1 sandboy2932 sandboy2931 vivianco heaton y63075411 edennu1 dodls531 ppori fashionflying campingmall gabidream kkc1206 oznation jun1003 uniphoto2 02ne exelone a88356337 ming4881 yskaou4 handock1052 gi423admin tourplaza innocasa suhkj1103 kkc1117 blastmedia1 amishop3 amishop2 gi174admin nanoex532631 doo83891 fanypink2 fanypink1 eagle216 makingsoom2 fashionwing1 belle625 yaksunfood ksmanmoon andwhite themotor blackcat587 tayajuka sagao5 nzgaza likerockers mymarootr smile81 rollei2 rollei1 meena lacida le40971 papero1201 gptnr1972 akkidirect bodysktr1050 um.exchange ipayosshop79 godo62724 eunhye7521 wowmin-001 smile06 shuzai.ancienthistory besound choiyh64 dnels2003 altaicho adosindong wyelec cdplex bread355 jaja6644 samtalmo ilchulphoto seodongik s3freedevsky ipet2000 inyourtr8448 neokey asadal026ptn woozlim2 hannara352 newdate debali76 seulbi1 mogait silver6022 gi90 dbsrud1013 s3freedevsdg peliculasadmin nikesb1 healscompany nexen211 combacom lifeedu-020 lifeedu-018 lifeedu-017 lifeedu-016 lifeedu-015 lifeedu-014 lifeedu-013 hantech21 lifeedu-011 lifeedu-009 lifeedu-008 lifeedu-007 lifeedu-006 lifeedu-005 lifeedu-004 lifeedu-003 lifeedu-002 lifeedu-001 soho10049 soho10048 soho10047 soho10046 linkbee1 soho10044 soho10043 soho10042 soho10041 hbglobal1 themoons sara1929 godo62323 woogen91 dogndog gardencity2 godo12129 pinbantr9179 newyorkstory altcgotr5936 yeonsung-029 canoncw wlstjs0719 bmw017 ck7914 yoyoyo80 pic711 chrissouth patmos1 jijh3246001ptn heedihee10314 jhk1233 dagle91141 wls2gml2 lyw66851 sungkunc3 chengjiyin sungkunc1 isero11 kisoo202 gsgtel1 ksj8335 kototo527 latexravie singleparentsadmin feelcom32 bluebirdie sparras jsl0118 dlwotjddms1 pool55192 pool55191 morenvy eugene08042 kal320001 whykiki10042 momshanger ub12122 damocos gi80 jnhyun7 gigaro thglobiz2 thglobiz1 www.josh vivid45553 babekhj3 michaelcue dmdwbsp neodsn koreabipum sm42591 king0530 gi291admin orij792 migogallery xpeedy phdsys doolho jki0727 yjinlab ipaypop365 wldus0106 khalomsky1 s1intsf sandman01261 wangpanda kim39981 rokmc756 www.inti romanplus s1intnj door00 s3freedevman markantr2453 sulgaul1 sjw1978 sewon6473 s1inthn packingclub xixi2113 canon4u antidotekr jsk8634 www.jeje heeinging neobob a77chosh1 bam12181 bivouac4 acegolfball humanpivot1 diosoft6 diosoft4 dkwelltr manager20151 lbwmk1 bod21c jihee121 asadal025ptn capdialog campingjoa1 ipayraonpets hprental neobay ipaygiggolaid1 dasom9205302 s817067 onecomm comaider flexakorea1 ensceo autorepairadmin s3freesetuptest lowblow3 lowblow1 emall246 emall245 casebotr9054 emall243 emall242 babyjjan kayoyon intimo85454 mc8837dj ijoayo sctaix1 doogi3 nuripltr5732 thekitchen81 junipi sala70-019 player11 bye365tr1992 bora2007 stdadmin lunchbell sala70-015 jjm0054 kim39439 baesam03 madeun1 winex1 typesafe sala70-009 sadmi2 dool22 hskim67672 jdesigncore dlawk123 goodfarm bananashake fremd4 fremd1 helena23201 kangajtr2483 samsin34 samsin32 lololokiki sonnpark cbu1116 ddakjol1 nemogg weldman1 jubilee79 www.jane saeang thenelim maybe20124 maybe20123 maybe20122 yijisuk sasari725 sasari722 tonicyhg1 eom3338 hedgrenmall gi70 perf ecobubs ogbizcom skyaa10042 spacecyk die09070002ptn guirin2 guirin1 ghdtjddus3 ghdtjddus1 kimjin71672 thereturn egfarm blacklabelr soodragon wlgmlwjd123 jangjs unbeaten mdowlsm godo60683 f1corp3 depotstar dandjik cutesarah canadapcs1 janest icw00732 icw00731 s4devkthkira madmax2004 jh5679 madmax2002 madmax2001 tongbooks dyd2978 inbusfnb mariamagic3 eduts2321 jhj8540 asadal024ptn yah02161 europeanhistoryadmin noah0202 mdg37601 oroanreb diana11 jeon200140 jeon200137 snjkorea gigameta1 kimos79 modish parkinsonsadmin chsjin10032 xwidox1 art92654 hellosanso miffy3333 sik9890 donho1 drinkbeer sik9874 youjin0927 jams77 gi59 freeng freemo patientsadmin jandl3 jandl2 mipi2013 ck5995 www.hawk kangsmwin1 cwkimchi2 lilo0607 mihwanamdae nylong vampn2n kprosen1 july2k jung75 jinoria haja1133 tlckr1 sejinwtc1 ja131007 kittykitty87 knifeya jayinlee1 mentor4733 unicare0128 sadbye dakeda72 kaircotr8614 serverhosting51-131 ygbori hanbest51 insummer1 babyhanbok hl49897 steven6121 noxnemo8 cbday3651 wara6133 cdnews sejungkr sslegy23111 andpetr4271 dcu0048 s4freeintsdg dventure en3r145 en3r144 en3r143 en3r142 www.speak en3r141 stlink johnkasih machambre1 rochester1 forestko pop12061 dammee1 www.girl canadanewsadmin pdalsoo1 june26 ogilvy1004 sunhill7 sunhill6 sunhill1 s3freedevextacy eth1901 golf1217 acdong kwonsiljang2 hkscietr5240 roboholic1 htk008 htk007 bobp7234 coffeekaffa die09070001ptn powerntr8846 acem11 sportsmedicineadmin jewelsmk1 jinasong3 opengodo ipaydotr7734 jphotelarv gi52 wellooo1 hillantr6673 dolsol gi50 jhj17493 jhj17491 tjsdla9910 knight38x1 thlove7 stkong kimhokr8 kimhokr7 jhbyeol happyskintr5755 tokkippin dejigom1 eshoptr4336 henaa55 yohann8711 jalogi techwarm travelgetsladmin dolsan dolsam koreagoyang kkumee danchoo asadal023ptn neozen21 imagemaker001ptn sls98tg villi0001 bluepuffin1 sik9012 wocns131 bogoinfo3 kkamangddi godo286 godo285 godo284 coolio godo283 godo282 godo281 godo280 godo278 godo277 godo276 citybean godo274 godo273 godo272 godo271 godo269 godo268 godo267 witheuro gisu0101 kumkangsys jean4utr3831 jinutech1 mntadmin limecup khd59251 xv3080 weast2 workscm tinypotr0821 naegadeok gi417admin jumall wellnlife1 kimjiman751 daesaree dk440011 you1smile daltone farmparktr1557 domeup playclay pgm2392 sensorline gksqjrn busexpress3 yesoya ham20302 godo58189 beaverty22 hoondosa mijung2 mijung1 episode3tr63230 bicyclecrew1 unicorn931 denty2804 julies dametalk ouoii chuliz001ptn olivedeco flowera1051 ecobebe qhdtjr992 pmeng bunnyttr1826 happytool sunsun03303 chan05173 chan05172 saprada tmpdns253-240 realmack hsfood2 hsfood1 bbss31882 okyoulove2 sosjj777 onebase kss1590 mscctv1983 laniboutique dfsdfsfds cctvsi rurunrun kswlove pm-korea cookie1 sean0jr ssspot bebeclara skitripsadmin www.dusk artskin5 ccumim yellow0o1 ecocandle dingorio2 actionman sangsang5142 sangsang5141 ssang10055 ssang10054 domall yoyang1 gi168admin choqueen60 minjoo5779 rlagkstn0513 baram222 ipayoneulthe1 opengodo27 doljip bluemong7 bluemong2 rainskiss coolman676 csl03984 pnj1205 korviet chenhyesam1 yeskin tt808022 yesjoy tt808016 cyj092 storyweb asadal022ptn storywax skinmell6 ghgo007 skinmell2 skinmell1 sports1004 sean394 gogomay2 ace5395 em4013 www.fast www.dota ftsound stkcom dnjsen2011 dome24 babybombom22 drimpeople3 drimpeople2 vhcjsglftm1 www.dodo jukkee hobolee www.edge ojoagency spdkorea2 getmind19 ondino1 glamfit1 bowlingadmin heybread irenecompany2 shopready threesisters zzuujjoo4 marinesea15 zzuujjoo2 zzuujjoo1 mori009 c11c cyawny godo57164 get2get shin1687 haze10042 fitchnlux nowparis6 peoplepet1 pjshpp1 cozzyup seoys09032 aidlman otoo6 otoo2 otoo1 doldol qud5482 sappira allga0051 wooddanjo sssils hooncom1 ecopiety dbswls2087 sanjunghosu enamoossl3 enamoossl2 hskime danbee1 beantrtr9889 maya009 minji5 lumenled prime1233 endxldnjs x2tank kwg24241 mcoamall2 mcoamall1 neulchan unionpettr hiendcable kmansu scrooji bikon4u2 osung iemmedia dltkdgns6 noodleroad damisoo pooh11291 juju24 skywow7 zaikan2 plusditr5407 wheemory1 kdjmhh002ptn judas5802 w3344 withdoll extrimer0303 anna12211 huhu082 hnarutr6952 keviinimi cruiizy bouncing7 dnphoto limcha1 otjoa cocoritt11 kaymix7 fishingart6 hikorean fishingart1 goodbest qkraudwl valuti3 polypix asadal021ptn breezecoffee2 smardi dalsik1 gudwls6572 kindcom k680722 yooeukim beanshightr gi41 ossco otime kmall2 mailuzza jinikkoo luxurygroup3 luxurygroup2 away55 haaa8113 hnfarm2007 garryong1 kitels13 bonnietr0255 adilike lgnuritr0797 agatory digitalsalad monickim3 doffltm monickim1 dypower rockenespanoladmin osj04041 danagga jinying777 zzana9991 jinilamp jucibel22 bt2924 fisharp blnk5959 koreabeko1 ysun9201 tastec1022 golugolu2 hskart rjacob ysun9149 austech1 magicmode4 sooldoga1 nenno0701 wk0916 xtrongolf2 www.crew tlc20122 tlc20121 zelkova04 kwc1130 egbecs able88 wnx11282 gsfantasy dawoosf1 skywin3 lwinkl dhfl44442 dhfl44441 s2pintkthkira st06071 roadstter hshs0925 janggabang pizzer4 itingroup naviro3 naviro2 naviro1 soulani3 gi40 daejinkorea jikyjeon49 zetmin005ptn sharpkwon3 ya7897 jikyjeon38 moacom jikyjeon35 choish82 jaeheeya2 woodytop koran7201 oosame jikyjeon29 dkfdkqhsl ubigeo russellkwon1 kdy8412-039 foreverkdy123 foreverkdy122 foreverkdy121 kdjmhh001ptn ideakeyword cgnflower shsports djdj49182 yonex2013 skyteam7 skyteam4 jikyjeon19 kdy8412-029 jikyjeon18 chamzoun www.creo dmarktr3569 mnijsj steng18 gameswtr0311 dang119 kdy8412-020 rusyowner1 givesoul8 givesoul7 givesoul1 godo55503 asadal019ptn enamooself cho39272 cho39271 movenations2 djs0210 top4556 dex0562 ikin0704-009 ikin0704-008 ikin0704-007 ikin0704-006 ikin0704-005 ikin0704-004 ikin0704-003 ikin0704-002 ikin0704-001 nicecd386 tonydani trauma1 misubaok oiio192 michael941 minworam1 dkco113 dal navicnctr dhc jjektg1 ddilbong21 yhstop-027 yhstop-026 k7176k yhstop-024 yhstop-023 faholo771 yhstop-021 yhstop-019 yhstop-018 ksbtech yhstop-016 yhstop-015 yhstop-014 yhstop-013 yhstop-012 yhstop-011 yhstop-009 yhstop-008 yhstop-007 yhstop-006 yhstop-005 yhstop-004 yhstop-003 yhstop-002 yhstop-001 ikai99 vs63001 godogodo-043 pippi www908 hooni003 mikimsh manguluv donamona oshea kimjua1 nabimom afak guinea1 juslisen818 rety58582 prebebe1 esosi712 esosi711 esosi710 sentikim76 mother2328 taesanceo mikimjh sema2000 dietcoffee1 wishpot881 whitepsm01 ths4750 happyotr4976 iisaka tnsckd7 prety0717 do20002 prettypop1111 mujuwine blindview mlk1225 mk81758 mchat ys0831-018 hiplus1 artemis2009 lucy172 j700102 wolf33403 dakyung sweetie87 ahmi vvoo1231 eunijung3 ribbonandtie dflex001ptn neuroscienceadmin oliveadam miiinotr0932 dldmswjd68 godo54840 kim90223 bmkc01 geunsill2 geunsill1 eyestar2012 debak729 go1224 epopdesign2 epopdesign1 sz9008 ben-bat.co.kr quad48131 zetmin004ptn soung0305 goddnr1 knpc2 s4devsunny artrecipe2 militarycontractadmin sunrisejr1 telecomindustryadmin is04211 mmisuk18 mmisuk16 mmisuk15 usmania yoyumheni2 salomon4 doriskin-v4 s4setuptest nks0081 ys0831-010 silverbest1 go0921 daesintr2934 bluecabin2 jaehong664 jaehong663 kirinkyg7 kirinkyg2 pddental sunrisein2 aljjaman25 kmsjgr77 appu iidooltr1903 chiropracticadmin toilet1 jinklim pollutionadmin sangsang2013 www.host2 jetsky82 vivajenny i2r0251 elibrary1969 asadal018ptn asluxe7814 doozycom1 booksell canh haramdnd mbc70951 true0420 kimiart1 bok32621 sugunbank qaact s68221431 wkzid goodjob857 neo152 junopark1 anigraph1 byun1747 ys0831-001 jaesheen citypet sanshoenco babycrew kosint1 godo54263 daon7179 gainstory doggebe mook1030 sunhye03224 a2core1 wara1231 luxian1 imsli72 banchado4 sejinsign mingallerytr2885 winnerface898 winnerface897 winnerface896 koreanfoodadmin winnerface895 cete winnerface894 winnerface893 go0412 wgroupe2 hyuna2003 yl7732 byte011 hyunminco babycong tubepink gi29 duchi77021 plusjean1 o3ozz6 kym58062 dew8100 zhenyi1 realvtr hide7674 girllovers5 girllovers2 mulkibel4 hd967234 roadstar1 proonan29 mdc0815 ytotodau romiaril7 ennoble laverhan wbkorea5 wbkorea3 ggonara hsystem yowonil lafirst3 siyeong25 siyeong23 siyeong22 xotjd05237 xotjd05236 xotjd05235 xotjd05231 sngriver xeroxclub1 heartbeats1 last1020 genfa09 luxhera sungoltr7233 nose1727 hyuna01241 holybride dudeo222 bngdss79 leeseo23221 skytool kim33003 edailyedu12 maizon1144 pantocrator craft42 hjn26242 enenfjsl daedongsound kenj5522 woodchang maniacsh3 maniacsh1 ddong5626 wisekids japson08 mir0017 yejin0707 mir0015 auri22 dfellas6 flow0479 www.cias vuelistr9567 asadal017ptn ssono2 ssono1 campingclub haseo52121 kchair2 kchair1 withanew deeb hjyoo1001 uchanee1 yeoily xgear0072 eunyicha near10042 jtouch mahatma3 mahatma2 mahatma1 yhbloveshy2 yhbloveshy1 kimji86 kgoodtime1 sbdesign001ptn dfsl naviclean great8401 jkw1915 bsm07094 philippapai1 themsel3315 kjk1331 dldms0520 kikibibib luxhanu sweetple cjangcho rcskytr gshawon doheup myr11111 dullymt nkkomom sweetool prince3022 prince3021 s4devextacy leesedesign1 ideaaudition applephd resinok1 fantastix1 hemeelhome1 marom19 on32201186 cabbage23 jihyukbae13 seconddress sharpay1 sunfung1 diybatr2427 sbgs221 avgood ljhon00 kudos realnut juese11 leebrkorea1 sszang00 dslrstore maintopv4 black17071 dkwl486 ys27254 campingchon mmoody sddw1234 bivouac uspalmtr0409 zeus9941 flexakorea openhub glorygagu lovelyhangs wizard082 archi5u helena2320 smdesign1 orb52 warmoviesadmin h4ck3r jagang3 bytimerobe syg2013 isunghun rnddevsnu e10014 lsh8232 zetmin002ptn hueplus1 luxmgz thunderants kwave817 ghghss qlss481 withskin1 pculture gi28 aceshotr1593 cnc7051 soltolove onmysky022 onmysky021 ccotti foxred pride6733 boriflower dairyfreecookingadmin hukaura1 fabulousfall midorock1 dhdsifl2 kapuccino2 choianne-025 choianne-024 mediacareersadmin choianne-023 choianne-022 choianne-021 choianne-019 choianne-018 choianne-017 choianne-016 choianne-015 choianne-014 choianne-013 choianne-012 applejoy choianne-009 choianne-008 choianne-007 choianne-006 choianne-005 choianne-004 choianne-003 choianne-002 choianne-001 ganghun1 wowzip6 soccerbridge jsspace63 actioni2 jsspace61 asadal016ptn d-station wlfmddl8 treestory liverpoolkp donakim1 sunbeltkorea2 lyncxmpp tlc2012 eunsajang tyjjang4 aquagarden ccopain1 galaxy101 sgi3162 itspoptr1978 ijeshop platinumid1 jeong2012 alsp0124 cbk73762 nakwontr9317 ever51685 ever51683 yesthink siyangx www.atom ggomse kimiart naturenbio13 junopark hsgagu1 euro7961 hyunju79486 vavagirl2 bachstyle1 modavintageadmin gadangel1 lsj94102 hitenbike gi24 hyuna0124 trianni5 ssmug1 gogofree peoples12 soundplusltdtr forencos dmonline money8tr5198 openme inonos007ptn gi21 ggos38 efolium10 pondomtr2582 gn7420 ez14174 ez14173 efolium9 efolium8 efolium7 efolium6 efolium5 efolium4 efolium3 efolium2 efolium1 ilmare1130 vanac76 flexpower1 neepac neopicnic idabank finefactory3 kosfun1 sweeteel ucc106 hanaro8555 carsin101044 kkohh1 robomarket yainsim kjh700s1 ipayprimrose0021 misoarttr tkfka0072 sususu90 skateboardadmin ryuit76 tobeemom8 lime111 ezerop gasaraki zetmin001ptn lighting10 goldenbridge2 zzuujjoo3 tgajet4 realdie alltoskin prmydream mypett2 sensegood4 oemparts2 extremezone mintcard joyplus0503 yupkimania metropia pgapi sy4989 gi20 lulu1012 onsmi mokjang114 asadal015ptn mhk24912 ndesign739 haneul0066 tny0566 ndesign731 goargentinaadmin pyj3037 ethiopiabet1 spxkorea mine4sw3 samjin5468 vmdlee rosecold damibears1 ryuiji1 diamond4c flowernate3 ditng21 bittyboy1 www.anna ss2inc3 ssa1092 open24 sbas bokbunja80 idgodo-037 nagakig2 nagakig1 myoung5383 jam0900 kekeker1 msgr4404 dbgudwns79 jhj0315 tjsl901119 xyclx0124 ksing007 keptto001ptn supguy2 partycs idgodo-019 kimsil725 songchang jswjam kdjmhh8 yhs5011 atma2012 ssyu78522 abm111 idgodo-010 luxeinc inonos006ptn ww1172 xebec751 jnlbath1 yuhwa82 o3obbb petitchou828 divedicehd1 www.bell hyun8055 dhflrndl777 edugodo-060 dosox2n1 edugodo-057 vintagecity moblue3 onemind08 umakemefeel foxart godo50899 namikim0105 star38404 edugodo-049 sinji2006 dam2 foxbed ezziroo photojoony2 sincez2 pjy3588 mjsmile1 edugodo-039 datastop jojia691 wshuztr idc0600 fstyletr3005 jewelleaf ebeds4957 seven0770 avenca khk881206 edugodo-029 cozyshtr2117 shinbi921 luxem23 morowind khs535-007 baraba123 godo50707 godo50706 chbh44 kimgh29711 lime1111 ucnehandwork1 edugodo-021 gi95admin onijuka771 edugodo-020 qowognl1 gaphoto1 dkfqlsh9 www.test1234 dkfqlsh8 dkfqlsh7 eunsun272 eunsun271 dkfqlsh2 envylook3 tkcomm gonde2002 finival mdhsl898 leesr82 cafeyteadmin juapage bstation gi285admin le8015002ptn onkid hyuantr0976 namhunzz1 southernfoodadmin ccocca pondaiso sweetdeco onurie partsda sweetclub asadal014ptn hic24851 esom85301 join2020 kbsok7788 uschool1 heyman cnc4721 s2freedevsunny clinique706 clinique702 davin1322 bumdagu3 luckysman2 luckysman1 jdy8591 shoppingtong2 lsangi1 smcis82822 smcis82821 lovejini123 lore794 mkmk514 sportsabctr uossifesoom1 yemac1 ezdog1 petiteadmin grc1000 gvtgswa poll75821 bosongyi ipaymymoongchi bau6392 jaehwy1tr castro77 seberuse1 sterniqeq1 mt4877 cpb56013 woodtory cns20101 sskssg acampitr9136 judikr kangluck designbook5 sevenmarket kks3ho exweb6 inonos005ptn hikaru16161 godo50141 ssmall lavier dodu11 goldwell sporting1 beemer76 hebron212 hebron211 seie5687-090 peeps fish153 sojusocool seie5687-088 ssline nwwkira mmkww5 soyoyou lapis2 o2vill seie5687-087 myhottopses12 any77any771 camnara youuyouu2 s3devkthkira sinjukushop10 gordie bonafarm famenity sticketr3548 impmediatr chrisroh15 jacpum 33store zorim922 edutps www.acer s99320671 naturei www.abcd patchnaratr luj4926 helmet114tr hangilsemi1 kast aange1 ponbada hobbang0083 cbwcom godo48694 dongin991 peco2 nutra sapin01 hyun6651 godo48659 gkrthd20 realcore vbsoma-012 hbshop2 risingsu1 soapsadmin leeztyle1 launel pyj1210 thdgml8652 anthropologyadmin dlfgns316 kgt18851 polishlove1 kobacco4 kobacco3 unstudied terra63 naturalcat kerz jwckong3 ssknit damchon asadal013ptn zoominmall hy-mtb pgbrl1 www.landscape fabrica7202 dodo34 wxya2 naturalall fishworld dodo12 patapum starphone downunderugg myeston nonsul5 edupod atomicsnow edutige1 kaymix002ptn psh77701 xpxltm95 ningstar84 businessinsureadmin petpig lcyregina2 lcyregina1 kwons219 rkdrn209 colorbaduk rick83 any4952 boardya1 musicforum pjaeoh10 kwons169 gaegoory qlsxlwl1208 ipayplaye rui61781tr trinity001 gameindustryadmin marley81 godo48234 playstationadmin changmo20se4 fujiara ohowow2 una72331 kwons111 kklikk sktworld inonos004ptn rksrnajf2 yogobara1 ps4youkr starus forestpeople riccio grandparentsadmin lux07111 kimdy21 feeltex2 welskin1 feelingyou imbak1 mac20022 mklee11291 sunyata hongsamfirst ozflower candytoy buynz0019 chunsoul starie zeropark jkcho0405 jimmye4 jimmye3 yykaze hytelecom2 apmglobal isaiah43211 pcne2 hsj001 hsyimjit4 jade86 nextnm7 rose3237 jgbros12 killwyj momcook duckbill001ptn s2fssetuptest mmlee2 ammanara nstar22 zyoonliving phoneplaza3 phoneplaza2 ironhytr3789 joyplus05031 mungbean1 kubi gi232admin imjajatr0379 minetree002ptn cih3385 idsoon2 han8851 mjss8077 enjgroup y4dot2 eprelease sssch3111 os21c seie5687-050 eruzaming23 roori olitt fophidden1 superface03 jmrho777 asadal012ptn mypumpkin eduhoc godo47457 oksem bebecare2 bebecare1 chunrun1 yupkimania2 assets.team jielkumsok3 jielkumsok2 jielkumsok1 profootballadmin jeinobi dode81 ikdesign s2fsselfrelease hoodia boardpan olies docglo noeyedeer2 yejin2 yejin1 mp100 kaymix001ptn neoeyen yoyomaha ula5959 bigdookim2 nab3 lastem hssohn74 embarazoypartoadmin engdevadmin rianfn milc boardmtr ligkorea bookookm1 thiscore1 peoplefood vogcody ezauto okpkr capzzang lollypop1 peterc thaitantawan ydy810 dnjswjd5236 inonos003ptn ironstory cdbox1 hsy9988234 youdong50081 bluecomfort hoony2718 younga1727 gi412admin pearpeach1 onsnap choijmjy vistyle jadegreen1 freshia1 hseok95 laceplaza genetichong2 genetichong1 cbs09581 cj3651 gangdoo1 499645059 ddalgibebe scaniakr01 hrdiary3 rkrxm87 dbcity3 pje0802 heraenglish qkqhrlwls1 digisys1 ngatetr7925 www.todogratis preppy1 hohomimi pgl1004 ziyegatr1791 qkfka910 pje0708 tojongdac ezbike cssh1903 sandletr2160 foric7905 bbo06262 plscompany sungyeon17 free2fly minetree001ptn iiiyep doath1 jiin20111 webnaeil mokjang1141 pomie84 oojjdd criss2879 heynamu1 qhrdmsgk topnotch1 safetytr4987 nstal kjkorea11 asadal011ptn luxsketch dobidu sang24601 celeborn2 jamesf9h hyun4441 jmg21402 crash0507 dojangtr3313 ssimmi shnjs08111 yhm1999 ssing7 hhk7092 realbean maisonparis1 jsskjh ds49799 lovelyweb3 ds49797 lch280 ds49794 ds49793 cyd0609 caselogic1 sodasoo021 kimhaozhe2 kimhaozhe1 dbwjdgkfaja1 mufc argirael psports happyngo8282 tattooing2 tattooing1 leftory godo46260 foxeye2 ckrheetr6079 damam13 sportstr4798 eratoint5 eratoint4 suhan253 bogsili cvsoft yajambo officegem pch0691 gain251 inonos002ptn luxbaby enamoofreefix natto001 anjn3030 iikala sesoft1 jijh3246002ptn pyj30373 pyj30372 pyj30371 suhan116 imfact0508 refresh11 lonsomeyez10 hairi1 retonar sustainabilityadmin en3f121 insami331 ehgud7641 sjkyong2 sslweb4 haesung08 poongcha mineralco vvmmvv888 gagyo21 palus goldenage mahamalltr modenjeju1 insamcall venceremos www.mirrors gi59admin londonmob braceinfo2 www.excellence ramin oemattr3699 woodstory1 buddhai6 hnnature gsme6 anxhfptr7954 themaker gsphonak spnskorea saladin006 xniea4 xniea2 pafc jw23891 thefaith oopsmimi1 s3803972 heechany762 ljcompany2 jmadang lpmusic uittum4 uittum3 bmhouse2 majiyabe2 dongjinds001ptn ro1003 rlatjdwn77 nydmarket1 jssdr1 jsy521 kafa421 pcko kimck77 officebay huisoonn guweb119 guweb118 guweb117 iknow214 mcyama1 godomantis smh45641 indiplus2 asadal009ptn lookyweb serverhosting202-104 pm1023 sshms2 www.sid ggo9ma taesongf l2zone1 cbsint sshnad jinimage101 godo144957 meetain choihw21 jindam1 collaman1 icamp4tr7977 kjkgis014 kbncomputer-030 daisymom kbncomputer-027 donadona cjlim11 mcloud8642 canarywharf3 canarywharf2 lilalim kbncomputer-019 gi163admin hymtbold lay123 narangbu newman60 semir0615 leejiyea54181 bbliving2 rlawls01 kbncomputer-012 choo9646 inonos001ptn eshoptr4777 kbncomputer-010 kenzpeople sohojob10 egw8191 hyun2981 sophi77 adamas29 twinkleahn bsretail suomi37 nggift9 nggift8 nggift7 nggift6 nggift5 nggift4 nggift3 nggift2 oliveppo11 hyun2918 syncbird godo44923 shmedia koongstr3115 sso119 sk05843 sk05842 bychance486 sidecom isecetr anglicanismadmin art1gagu babybabar jusihyeon87 vpn2gadmin onchang godoid-026 blingi ansadon babi03191 depressionadmin inglesina hitodachi2 www.ebusiness shpark7507 edworld skyanbg2 hsj80261 po77701 chungilfarm2 wellbeing251 coqls10041 eshoptr4437 toonlee3 yehdam plannetr9495 poloo79 apple365 jam09002 han5878 jini467 bikinistore3 kimshosa1 matziptr3159 hyowon1229 kangil88 peniel1004 kygsan1 ozq8 hyojoong2 ababyo hun4032 yonexjapan5 yumidavid jdy3716 wembstore kimbj89 f16t1253 esecretgardentr kobuworld risingbike fox739 salesctr0964 coordians sb6007 nadaje mijumarket2 p10499 marineland essvalve selebetr5470 geographyadmin girlingirl funnkids bros90071 indsystem winstory jhj03151 desig11051 browse012 smallfarmadmin kimh313 koh08111 jinseok120 listen007 herbtrees xmore1 mainpark206 lhj06203 dswoodlac dobidop3 jjk2943 bydo82412 kdy8412-040 kdy8412-038 kdy8412-037 kdy8412-036 kdy8412-035 kdy8412-034 kdy8412-033 kdy8412-032 kdy8412-031 kdy8412-030 kdy8412-028 kdy8412-027 kdy8412-026 kdy8412-025 kdy8412-024 kdy8412-023 x1x1 kdy8412-022 kdy8412-021 kdy8412-019 kdy8412-018 kdy8412-017 kdy8412-016 kdy8412-015 kdy8412-014 kdy8412-013 kdy8412-012 kdy8412-011 kdy8412-010 kdy8412-008 kdy8412-007 postad.sewing kdy8412-006 kdy8412-005 kdy8412-004 kdy8412-003 kdy8412-002 gi249admin kdy8412-001 dydghksgl rma2 hipgirtr3630 law924 golden1295 peplus kaybes1 dsspotr2418 polobox eraecorp idsky11 lkdc3535 halifaxadmin ihkim20004 ihkim20003 heenam71 ihkim20001 mascara1 soso0808 ohseungkon2 fmricetr3811 wkdeo860521 hiona08 force1 chammidia atomyctr7292 bookssladmin jinee47861 alpo801 aljjaman woolungnar sems tear3218 jinho781 akswkehf1 momoihome ohstylishe1 dhtown54373 acecounter kkhgh1 ibikeboy cotorro1 jeilad2 ipuhaha1 designarts3 wiso811 kjmoon973 sunsim09062 rooz jwellday1 chamsallee1 ghkdvy11 atree3 miiragi space876712 kkang732 gi90admin saokkum spacehs oohjuwon1 slow2go21 kjhmisope2 kjhmisope1 hellomaniatr ndmshop gi279admin hustler2011 casadela guide25 allergiessladmin wowzip2 alicekids124150 kkhk11 arawon10 zeus1592 id410041 me10921 reactiv msleesh663 parpado skinhappygeo yeetj1 asadal007ptn tlstmdxor772 pon2mart1 polishes1 free5566 nudienara ziopack koy0829 www.musicman troikakoreatr qlqushs smallej2 artzero k1984321 hotstk5 hotstk2 th485001 m1544tr1530 nprn1 toggi021 datamove soh21832 kjnd1218 cherryheel hotsso6 calla7tr9299 krr0516 selandshop yj55755 nanumfood woodmarkers powermtr4204 gm8579 kjw190 automobilesadmin byul9651 scandinavianfoodadmin cjstkek24 silvers hdmarket paganwiccanadmin goblin1 bangsuk greenmoa884 greenmoa883 newsnetr8213 jasmine925 inmigracionadmin plus67021 controlman grace60232 grace60231 jwckong2 petsland hyun0987 yuyichoi ohero cnsgh338 cnsgh337 cnsgh336 cnsgh335 hyun100p cnsgh333 youngsuhp hheawon tuning1 surgery13 surgery12 surgery11 surgery10 mojomall1 ms7675 yiminhee tworld2 onemulti omycom thesuptr7962 acemodel2 phonia3 phonia2 lowercholesteroladmin tpghk05311 nsnyc39792 vino62001 m1m3y3 enamoofree marylennox bomul90009 tworing naver062 lovesjeong spdhalsxm epqa dudcosp2 zeus0705 luv4tion1 m897189712 bicyclingadmin neoeurtr9209 fndkorea persent991 mvadmin castleb1 godo42593 compnet991 poongwoontr hhhjjjkkk berenice07 tesas77 hipark7 xuxgirl1 laciel1 luckylady leezipp malzahar jayunmart funfromfun2 gi406admin comtachi mirsystem nacaoo882 nacaoo881 t-pani asadal006ptn yuhwa821 taekyupark www.tam pinkjjunga1 komsunni skykeep godo15tr8668 moonoogi1 godo42440 game19653 sarlira2 ksh8579 mikibonbon1 kimsuk3181 naebrotr0181 bank88521 ghayour bubbleangel1 woodnice aaa9470 bianzai angeloarte ezmrotr0665 dsamples2 godo42315 efreeworld taemiwon44 firstblush chamvium supaek1 ahjun7111 hadesway alphain dlqnsl183 quffl0613 granty moguchonlove hanih70 gomsoman sanubis godo42184 lifeyotr9845 longdown1 avenue5 gulbiwon ljh8354 kiansha1 jhcho845 jhcho844 costcomarket krepis richkor1 penmoa jsmysh www.dcs tileart3 ljh8240 s3intsf nonno21 aboutshoe zzi33tr nonno10 hsd123 s3intnj heliosji kiss9035 dayoun01 jinyunung www.cmd imarketing019ptn rany0111 gofla0101 jhh9866 kjunggu1 yeecya seezytank jw20122 mydiy itemssada mydiw eyetag imarketing059ptn kck33371 fpfp88 dsfashion ceycey801 kn19051 hh119tr8019 annesattic wjdwldnjs godoshare2 gi157admin han2963 cypark113 cypark111 www.sdi thekoitr lemonttt2 bluelink5 wkahd25 dshuni5 godobackup dshuni3 lannen ojy5220 ingpp7488 korezon rexbattr5147 yecstr conceptsmith chummy1004 kjh6312581 ms6336 jpspace3 manna2641 godoedu49 vitrosports2 ysm5208 somangmalltr rheeys kdw8881 asadal005ptn ninja781 dltjdwn682 isensemom11 hiv2000 wshoesj sojabon divoff82 cnb5709 mailike1 bngcenter godo41390 onlyu2 onlyu1 flag119tr6840 www.susan ogemma3 ogemma2 sohometr1208 sunheealsk kadian2 kn35403041 jubangtr5297 cubesetuptest benrokorea1 bible4ne1 emliving eyelux needss1 ohjoojoo hsc345 foodkk lenmonglass wowbizbiz lucea64462 cbj6503 s3inthn dgdg00251 thepottr4429 eugenephi lshyun0202 vpop bathroomsadmin woorihanwoo izzle365 applebarista1 joy8334 moongkl eugeneph2 eugeneph1 rongee1990 alicatr0439 ipaychaesowa1 toycorea young23391 dddog91 miraicej2 tinaea sundaymarket sewingadmin wildwolf1 mmeeok zona67 leeneahn minyoung3 gundamhouse5 gundamhouse2 iktc55391 audwls joo72421 evendoztr frankkcl chai37461 godo39838 skplastic1 lubu106 dajutns markgolf hohohaha tawn05252 eoakeka13 eoakeka12 eoakeka11 csinfotel dna4300 help62ne usshotr1632 chanoj98 jhdigitech1 ipaycarpr0112 bluelife5 bluelife3 vsinv55 youn22ya2 freshblue2 dlatmdxo lemontr21 naiasis2 eballet loisemall mwj4780 noi20133 noi20132 noart moondal mwkim ds09-trans kotak0441 sb12341 gkdl1111 makyung414 shs1127 kyuri231 lprecord neoblume3 jeonjinok-003 jeonjinok-002 jygolftr7526 dlsrnjs1358 sunge03145 sunge03144 asadal004ptn sunge03141 hjw02273 food75 momtobee yedam2 kevin9001 han1661 soocol83 jstephanie leoncafe1 artrxtr7959 tpy8297 www.gamerevolution camel76 pcstop1 halu0815 trysunny mideastfoodadmin geuxer firstwave1 iium242001ptn itools.team dl3094whgdk enjoycoffee1 tobe70091 collahaha villi000 hkc9711 dpplaza finalcooo photome1 misotrees cheung62231 jh2097001 www.runescape bantdoduk1 rio20003 coffeeseed mwfss happytgr mvpp9 mvpp8 mvpp7 mvpp6 classicalmusicadmin mvpp5 mvpp4 mvpp3 mvpp2 mvpp1 odysseygolf arums84 xn2otr1926 danparkb dposter thinkplus idio0121 amban3339 lune12 einein1 foodplan smframe puryhouse preist1 satelliteadmin godo38991 qkqh80801 jaesheen1 idmoontr7517 kjmo23 hmk50403 sooyeoun2 gobigs3 richqueen9 handerson healthtr1831 diva4789 lovelypink ibbeoneh2 dajung1 psyche3171 vision12001ptn moitie701 minsstory2 minsstory1 photohow abator83 dsand261 danchooya aldhr8212 parklon deblanche detoxpw1 golfbank2 leexcom reddj752 jbd04131 maxdm3 ginachoko kleeu12 hwhv981 cubedevextacy halu0301 dshuni4 a622dday2 cohanamalltr han1071 unicityro narae3943 exmiki time24 jsj77402 gochicagoadmin mklee74 mell99381 hsyhan1 mkqhouse jejutrust han1014 mutu9 ssayer nukorea100 mutu2 www.rv s1intmimi aramjo2 s2fsdevwheeya88 bonkorea2 bonkorea1 everhome1 fuhrer1 santaatr9816 shin202 jopersie13 lawncareadmin akdlxl3 gsgtel-020 gsgtel-018 gsgtel-017 gsgtel-016 gsgtel-015 gsgtel-014 gsgtel-013 gsgtel-012 gsgtel-011 lee84352 gsgtel-008 gsgtel-007 gsgtel-006 gsgtel-005 gsgtel-004 gsgtel-003 gsgtel-002 gsgtel-001 ufo112381 asadal003ptn espanolsladmin soo8407 misan1234 rmsdud9909 diyadmin aldhrwhgdk artgroup21 aaa11 sugar8080 redstyle76 halloweenadmin tanic79 skyho50461 elsabyelsa sbyung4422 paanmego lovelyone1 odin3 meet202 nick218kim ilovetoyz autochamp happymax luvmary wastec jehomme gomdontr6981 samyuko studygoon1 hueyounsun7 bubblestore hueyounsun3 jay4114 foby004 witcommerce1 plannetr4111 jini07064 jini07063 jini07062 sdgvictory coffeetr4517 dasstr0493 ghdiaka1 detoxjoa cider4567 chungchowon smm8277 tlsgur7551 na995444 jidomatr5165 naragu92 peakswoods stdevw5 stdevw4 stdevw3 stdevw2 stdevw1 taerin333 ns707 fineyes1 printmtr8091 samoondoh sqube4 cottoyamyam helinara kji5982 wowman21 zigprid70 dkfqlsh10 lhsmkbs fishingart quezon11 rurisnaby1 artlife6 artlife1 bnw3835 odmaru1 choibs76 time3040 sorra777 mega701 koreavi wt234561 happyho2 truebeans mn22ang1 parkj21 behaptr0410 djawdj55 djawdj53 gi84admin bandiac babystown starexon kodtsite happyhan john316tr wowksk88 eyesrue1 cocobunny naturalline cnb3078 oo0103 han0011 bpktoolpia1 indi-web141 indi-web140 indi-web138 indi-web137 indi-web136 indi-web135 indi-web134 indi-web133 indi-web132 indi-web131 gi274admin mettlertoledo wnaks316 mukie altmedicineadmin ssanot ms6204 evendotr7447 dmfoodtr0677 oobike ssanmk kaulbach5 wowhouse2 seomuho1 oxygenmall mega325 asadal002ptn twomomo filcotr7304 qkrtmddo karisub3 karisub2 karisub1 themadtr3641 www.worldofwarcraft yeosinmall1 poplittle1 catsin getpda free0530 lsd19821 tundra3 worldmusicadmin rbghks1 eclips1 ssh486 fourleafs monkeystreet1 ochw1 kkassi leejin120 kanegi85381 designangle sohojob ssambo hsk7005 edgestory kdw5701 oje1990 edinburghadmin jayeon4 agas00705 mungmung795 mungmung794 mungmung793 mungmung792 mungmung791 stdev24 stdev22 bandi83 blackpc-019 sunyoung fahsai2 blackmoo3 ksana11 team3point0 sooya300 najs8412 sohohub ksumahu jhko21c1 blackpc-009 water20201 le8015001ptn shjcy1348 gogoga121 march03111 redbb10107 redbb10106 redbb10105 armyinsa1 yeg777 blackpc-003 lxh05121 ndaoom sinatrano1 susan123 susan120 classices yeonsung-099 yeonsung-098 yeonsung-097 yeonsung-096 yeonsung-095 yeonsung-094 polomin17551 yeonsung-092 bigsun38051 yeonsung-089 johansoo yeonsung-087 yeonsung-086 yeonsung-085 yeonsung-084 yeonsung-083 nms2223 stcok19 yeonsung-079 yeonsung-078 yeonsung-077 yeonsung-076 yeonsung-075 yeonsung-074 stcok12 pondaiso1 stcok10 joyav119 yeonsung-068 yeonsung-067 yeonsung-066 yeonsung-065 yeonsung-064 yeonsung-063 yeonsung-062 yeonsung-061 rgbtable yeonsung-058 yeonsung-057 yeonsung-056 yeonsung-055 diva2763 yeonsung-053 yeonsung-052 yeonsung-051 yeonsung-049 yeonsung-048 yeonsung-047 yeonsung-046 journalismadmin yeonsung-045 yeonsung-044 yeonsung-043 yeonsung-042 yeonsung-041 yeonsung-039 yeonsung-038 yeonsung-037 yeonsung-036 yeonsung-035 yeonsung-034 yeonsung-033 yeonsung-032 yeonsung-031 waityo3 yeonsung-028 yeonsung-027 yeonsung-026 yeonsung-025 yeonsung-024 hospitalityadmin yeonsung-022 xross01 yeonsung-019 yeonsung-018 yeonsung-017 yeonsung-016 cc112a yeonsung-014 yeonsung-013 yeonsung-012 yeonsung-011 yeonsung-009 yeonsung-008 yeonsung-007 yeonsung-006 yeonsung-005 yeonsung-004 yeonsung-003 yeonsung-002 yeonsung-001 s4freedevmimi unomito sanorm1 siena5958 aid09082 fire881 dybox7711 mattox3 paris05 n2comm6 n2comm5 n2comm3 hinokid eliyuri venusbt fish6033 johnny422 childrens8 wholesee luvite7116 bonnie1988 tas78335 mamangtr2075 buxtest kygwings urbanx saemartd2 leejieuna dukgun2 karismay skinustr ybmidas uiyi007 naraetek jcfl9275 evenfalltr skyreins sakeimalltr yourlim warmer serverhosting254-77 projecth luxurytraveladmin serverhosting254-64 khc744601 serverhosting254-52 limsh03045 serverhosting254-43 welpia serverhosting254-40 todaymall serverhosting254-36 agstore xlsh23 unioutlet seatline rira10291 ssadoo dugotech sangsangcat omrpro gaiazone1 als24681 lastlove72 hyou.co.kr econian6 econian5 japansladmin thsqndud1 dmi9797 s1intjonr masus990 dmmpowtr9582 s1release shyun293 youhansol qwe912-019 qwe912-018 qwe912-017 in4mal qwe912-015 qwe912-014 qwe912-013 qwe912-012 lsg2646 qwe912-010 qwe912-008 qwe912-007 qwe912-006 qwe912-005 qwe912-004 qwe912-003 qwe912-002 qwe912-001 ds5evj shinkangco looz784 looz783 bodybuildingadmin brandsil qpit26 aks35351 moohyun khmedical oilotaku salenjoy hhoow8585 parkyuri011 chaosrever browsersadmin bbsports hikingadmin veffka gi401admin vipjuice saerom123 sketch1993 hdw112006 columbiascadmin stsunwoo popcone1 banner7963 godo36074 designclan002ptn hjlee215 jaednr2 newromi csy11223 seomsky2 cs51311 xigoldkr21 green4all aroundtable startac1011 belajar young18284 shjk10131 churi4861 gagooya tammy69 gnfcorea ciellove83 freeover1 skanskan4 hksh012 feelidea mplay20131 sannoul nongbufarm esceramic astden homenhouse2 esfreak3 bjs1979 xmidas gi152admin gmdrmatr3060 keiangel1 wansophonetr malddotr0520 joyuneed mkscho kjjcyh kangageu tommyboard tradech wook0308 manjijak004 manjijak003 jinhaney luji54 johnny42 mindsports shuzai.history1900s broadcastnewsadmin photoworld nativeamericanhistoryadmin canadahistoryadmin adnet8 yhl1239 fish1tr2605 istel0701 m9927254 tonature classicfilmadmin wldms0105 colorparty003ptn dasoon222 pink29001ptn s3intmimi caster07 shin971111 gobekjy gomsinne flyingtr6350 luna4781 sjjwe1212 dnstars84 godo102867 eunjungddal mmmjbw6 green9629 rcd7325 revimotr0488 jikukak jhwa211 kdonggin khalili odedesign001ptn raontec floraquilt kq1219 purebounty2 kdykorea2 ms0921 homesuda4 miiino1 ozzguitar bohwa1124 loosfly yafil72701 onitstyle hataesoo2 lovejini1231 lskwoan3 lh1092 iknew06254 leatherworks asitaka7221 shaeizzang i1127724 rmfpdlq11 printmtr5136 hydrus86 coolchoice gojapanadmin rhkr51451 wh9022 bizydp carone yongsanoa caros4 visualbasicadmin designclan001ptn seob60139 dyparttr8149 sunmi21 blog131 blog130 aboobar1 purplelove1 wholeart channelpc europankorea ldm523007 damwoori vdvctr2705 casejo vdoffice inicis1 koj24572 ansholic2 timetreehue1 ksh2081 nbreed artrxtr3451 come3840 edev asksal2 pensive0042 cuberental140 kitweb-019 kitweb-018 kitweb-017 kitweb-016 kitweb-015 kitweb-014 kitweb-013 kitweb-012 kitweb-011 kitweb-009 kitweb-008 kitweb-007 kitweb-006 kitweb-005 kitweb-004 kitweb-003 kitweb-002 kitweb-001 soung401620 sengju1937 biscuit65 luview2 ssdiarytr youplus rui61781 navydew2 navydew1 pyungyi yesmountaintr cppower skycomm defenseadmin usplus daebbang010 diva0427 hotemeil1 armssl crsharp seie5687-099 seie5687-098 seie5687-097 seie5687-096 seie5687-095 seie5687-094 seie5687-093 seie5687-092 seie5687-091 seie5687-100 k3d2c33 k3d2c32 seie5687-086 seie5687-085 seie5687-084 seie5687-083 seie5687-082 seie5687-081 seie5687-080 www.terri seie5687-078 seie5687-077 seie5687-076 seie5687-075 seie5687-074 hannongcc alsdlf789 jaeinfarm seie5687-069 hongsamajc seie5687-067 seie5687-066 seie5687-065 seie5687-064 seie5687-063 seie5687-062 seie5687-061 seie5687-059 seie5687-058 seie5687-057 seie5687-056 seie5687-055 seie5687-054 seie5687-053 seie5687-052 seie5687-051 seie5687-049 seie5687-048 seie5687-047 seie5687-046 seie5687-045 seie5687-044 seie5687-043 seie5687-042 seie5687-041 seie5687-039 seie5687-038 seie5687-037 seie5687-036 seie5687-035 seie5687-034 seie5687-033 seie5687-032 seie5687-031 seie5687-029 www.victor godo34474 seie5687-027 seie5687-026 seie5687-025 seie5687-024 saku435693 seie5687-022 saku435691 seie5687-020 seie5687-018 seie5687-017 seie5687-016 seie5687-015 seie5687-014 seie5687-013 cmb200tr5801 chunglim seie5687-010 seie5687-008 seie5687-007 seie5687-006 seie5687-005 seie5687-004 seie5687-003 seie5687-002 koran21 kim171802141 and1364 bosongyi1 paran219 srhj95 neverdiesp emberhm tachhotr1929 oceanfamily cosmosseed nj0090 lkc1120 newrack wepix003ptn kiras3 ys0831-020 ehdgl9622 hanakwon7 lohason2 lubicon hoyup2 hoyup1 snuspo52347 s4devsdg fullart5 fullart4 fullart2 ds2pcw cmj8547 lovelyjudy gi78admin gagu331 ys0831-012 esher24 ys0831-011 ys0831-009 whn1482 upgrade8kwb mjceo crackman dychemi2 roast52863 roast52861 calicoz chanwido8 chanwido7 chanwido6 chanwido5 chanwido4 cupyeon1 cmplus12 khyse2 eunsun27 bluelover55 shinhyoun mob0117 rextop calibow jcw75651 bat1207 minukorea yooho0802 dl68136 tofto99 yuhaenam howsign1 damin94961 gi268admin ehdgoanf10 sangkoma psworld2 ezziroo1 carein parkjoye1 creamstr5719 zzangzo kwh83911 www.terror nika20101 godoid-029 gamerspot godoid-028 godoid-027 puretime godoid-025 godoid-024 godoid-023 godoid-022 godoid-021 godoid-019 godoid-018 godoid-017 godoid-016 godoid-015 godoid-014 godoid-013 godoid-012 godoid-011 godoid-010 godoid-008 godoid-007 godoid-006 godoid-005 godoid-004 godoid-003 godoid-002 godoid-001 goldmommy03 dodopiggirl coconenne sound8224 ivory60 kiboonup3 ok00yeol5 ok00yeol4 petcentral4 petcentral2 maneryun dollkooo1 nasoyo1 mandu10202 gomiamiadmin arteadmin je79hs jingu721 godo33568 green7804 zzangfa funnysuper dodoham warefile2 lsg0000 pointbar usbhouse1 btbgift greenpet114 zzange2 pys06045 shoedealertr powertr1217 colorparty001ptn djjjahwal airjoon783 airjoon782 airjoon781 dt0043 s4devkhs toolsjoa gka64711 ljh0625 ivitacost1 hoparkc2 karimi ydgbb1 lahatz hpstar20011 cure75 kikis13 kkt1227 minhee4205 3000ton asrada carace lilylee1 yovery1 fishcatch caribul9 aspris caribul6 caribul5 kwons41 kji1351 onggij wepix002ptn kidsastronomyadmin edawool jjile799 bizcdaejeon sonsubook inowater ttbehan1 giftspoon namikkoquilttr s3intjonr sevenmarket3 snd3282 nanacom2 s3release inoi3357 comsaja1 duck66815 fazel codyand 7-12educatorsadmin ds1lza audi88131 himomoko mrc22 bbshine2 gi109admin vidan2002 yeseee1004 gyorim youl04111 fromap1 graceraiment it2gpc-040 dasincn5 dasincn4 amahime1 bizcws gobawoo comebine1 exfron it2gpc-037 gdtest-055 gdtest-054 gdtest-053 coffeemal5 gdtest-051 gdtest-050 gdtest-048 coffeemal1 gdtest-046 gdtest-045 gdtest-044 gdtest-043 gdtest-042 gdtest-041 gdtest-039 gdtest-038 jolibabytr gdtest-036 gdtest-035 gdtest-034 gdtest-033 gdtest-032 gdtest-031 gdtest-029 gdtest-028 gdtest-027 gdtest-026 gdtest-025 gdtest-024 jimi12342 gdtest-022 gdtest-021 gdtest-019 gdtest-018 gdtest-017 cody4man gdtest-015 gdtest-014 gdtest-013 gdtest-012 gdtest-011 gdtest-009 gdtest-008 gdtest-007 gdtest-006 gdtest-005 gdtest-004 gdtest-003 gdtest-002 gdtest-001 car7979 miracle1201 kkw29142121495 abcbike3 metro71112 rose44781 yuginara voglenza7 applehearts10 damoainc2 myloveday76 cara06 outsider2 uamake2 recipeformen autofactory jk91792 jk91791 hautechocotr3818 motahari nasungin2 artpia1 monitoro4 p098791 gabangusa monitoro1 guciogucci monokio goprinting hellosra2 polyflower bokdory1004 orangehold4 jangmanho1 narabio1 necomas whoislover teraled mayfresh interesia8 interesia6 interesia4 interesia2 babyprism1 yoanna1 mosac hoah441 gi385admin porfavor mejiro11191 divineworks5 divineworks3 mrherb1 wepix001ptn yong4535 ilovesneaker-trans kisstreet blackhoon wanjin jhcho8tr5661 toto0609 babegiraffe1 kajawine caphjm mr7004 need232 joyaudtr1183 bumhokim2 terahtz gmskin7 gmskin5 gmskin4 actionfiguresadmin godo32207 sunilv4 deartdesign1 paratopia gi146admin iherbalife tex2105 rumebag7 rumebag6 rumebag1 jhchae71 kswl0626 naye01 monoful cariart1 park632 tmdrlfs jeonjinok-001 hyj01636 youngs2 moon3 luveret lgslgs lbs8788 seongbuk smileparty onevskorea ysj1215 hosogkim induk11-040 uniqueme sun04041 uppermost0622 alimoradi wake777 ks0801081 montage2013 annaj20121 induk11-029 sigane42 bizcbucheon c-olymp cmailreceive wangga sponiatr3499 bada88222 eggbbang moncl induk11-024 induk11-023 geojin parkjung962 designaide3 designaide2 designaide1 induk11-020 rovltr3141 haessac choimin2004 ksg7939 monitor16 induk11-010 hamdp3tr syspharm changcom upside1 unclemulti cosmosmall2 cosmosmall1 ifxeye gcsd33014ptn sesalo2 autobiltr sesame2 sesame1 ylife39 blueking3 bblocal trueness78 uslux1 lemonmall hwjhaisr exwin20101 maurizio realestateprosadmin byeyourjune mioggi20111 dgplus1 falconshoptr rlaqhdus12 valenciano thechakhan domainparking mtsearch easyfile passecompose swon06161 09land jyn7771 coolsohot2 ckh5853 kimsy3 haeorums en74421 kjh8347 nanotometer sabatapark hskim7201 clientjh001ptn daoud hapoom10041 www.graveyard ii1121ii sulem10 fashionweekadmin superftr9577 lcs111985 ryuyangrod www.vendor thedark textbooks chatserver emjstyle3 zatool4 gadgetgiftsadmin mexicanfoodadmin windowsntadmin www.fernando partypoker heavymetaladmin gi73admin gi263admin ldssladmin tatsladmin www.teknik gi384admin asthmaadmin emergingmarketsadmin prono www.escorts opensourceadmin embroideryadmin womenshairadmin twohcnc zatool3 lwj6166 cano33332 monocruz2 petarian kingze feelcos6 kalpataruhan4 kalpataruhan3 www.rocks k6educatorsadmin miguelangel lesha121 s3designskin ruu70781 todayfood yabooksadmin yjh8505182 wanasa habb0 celebritystyleadmin leejiyea5418 simon02711 luciashop feelcom3 myssoltr5863 humanrightsadmin findwlsfl claudia1004 bengillee studenttraveladmin ecojoon76 saesoltr1810 twoweek000 cozcoz1 abdev1b jhun731 mendoza ziodeco cuticase narapuppy bumk222 mnt21 sakurasweety7 glutton sakurasweety6 sakurasweety5 iandsoop dandy8613 serimmf mobyj reusea kimnno bluepuffin wocns13 jacpum4 jacpum3 jacpum2 monixcop thisa25 ssbk10942 ssbk10941 houze0 hanumatr4803 codica shr1217 kindpc ilovenamu kiddykorea willvi phone1001 walltv lemadang pettong ondino xhfl098 kjk517 coordicoordi2 ubi9134 okits211 enamoossl ugly7707 sss0083 hsj9191 formtabc1 ilikeshop003ptn zyoon cho5253 jisungju tkdalswnsdl jinokey01 playplay heh525 wldus33841 pawpawkr kang8017vs9 michael91 ryumin godo30384 pedia1 girlsego1 lhwfree1 nextone cricketadmin gi379admin sparedb organicgardeningadmin gi141admin thehero ramansaran pirtnews www.ricky tabletasadmin dentistryadmin icecreamadmin cigarsadmin giopt jayp www.bussines laundryadmin www.pcgames showslow gi67admin gi496admin gi257admin gi429admin financesadmin goseadmin googlpiz godasky inventorsadmin crazzy www.motahari publictransportadmin orangecountyadmin themillionaire gi374admin testgb gi135admin biomedicineadmin heartdiseaseadmin intljobsadmin ukjobsearchadmin gi7admin lovestar gi391admin chattingadmin retireplanadmin www.funnystuff 4wheeldriveadmin gi62admin webdisk.pruebas www.theempire search.jabber www.amigos timor gi491admin gi252admin www.brothers armftp gogreeceadmin 55555 awesomesauce bogy upperwestsideadmin rgarcia www.roger enusaadmin vhenzo mariyasexi shuzai.afroamhistory csforum evolutionadmin ksiegarnia personalorganizingadmin izh tuto www.inmuebles puzzlesadmin gi220admin carolina facebooka nybfreelist1 gi368admin facebooks ngraphics ahl blackbirds ashvini gi54admin ashwini lenga oportunidades javaadmin elpasoadmin taesang1 coomheedo edaun00 hplus7 dodomint4 oncore lavert3 lavert1 jounnal77 twinya liesangbong1 luxyi www.calculus donnland1 dmdoll kilroy mdwootr4250 lomis-v3 yhbloveshy voc turki canceradmin gdlist stampsadmin gmailwebmaster startweb registros specter abdalla postad.primediaautomotive preschoolerparentingadmin www.capa www.archangel www.smiley sportscardsadmin minorleagueballadmin thienha www.skynet srvjumirim nea saudi1 esx11 arabcafe stratus srvlpta gi2admin alex2alex vineet szxy weatheradmin netsecurityadmin english4all prmpix www.liberty www.thereturn sosnyt vipboy hhh01 gi56admin gi485admin farmacia www.muonline vinicius gustave sv71 billabong teennewsgossipadmin mifamilia gi246admin peloadmin reparacionesadmin famososadmin pixelworld www.terranova seafight www.samp contratos spread nguyenvanha melani444 cupido zyx www.tablet abeille ftpdata theateradmin arabtube retailadmin postad.equisearch proicehockeyadmin www.terminal johnpaul www.capacitacion 3bnat gi89admin abdulla mueblesadmin gi363admin latinfoodadmin ga3datimes bluestone gi124admin teachingadmin maira www.pablo www.tecno timmytimmy arabstar tnl radioindustryadmin www.sergio qcc metal13 fdn gi14admin peaceandlove childcareadmin longevityadmin entrepreneursadmin www.toto gi280admin farpoint sexygirl www.integra abubakar orlandoadmin bussines enfermedadescorazonadmin mynameis climbingadmin gi51admin gi479admin webdisk.management luckypoem privateschooladmin mycache immigsladmin acuario gi241admin goirelandadmin investingcanadaadmin www.freezone dreamsat addictive rvtraveladmin gi297admin www.zen gonorthwestadmin assistedlivingadmin dixon guddu cvyrko group01 topgamer nysshgateway1 culinaryartsadmin slisar dosti fotoalbum bsosnyt ba-reggane writerexchangeadmin gi357admin dosug boardgamesadmin cyber1 www.ssh gi118admin freesladmin www.ruda diginto freeupload musicaadmin www.ankieta tcmadmin outsourcingadmin webone 13579 flagstaffadmin www.msm webtec www.neo mpendulo www.mis hotgirls lawoffice vidasanaadmin www.min lossimpsons folkmusicadmin teenhealthadmin saveenergyadmin redirecting gi45admin www.ito gi474admin collegegradjobsadmin workathomemomsadmin loinersa weihua vipxinh ladiabetesadmin friendshipadmin ogw mysqlread www.imc aminelove abigail weller www.ima www.jay hip-step-stop ynote yokkaichi-kougai genasite withcom manualidadesadmin experimentosadmin hontomo irvingadmin coolcrewpar ndkrouso www.hey gi352admin windows-remote steam-community www.hbt gi113admin www.gfp algerstar enclave kapok financialsoftadmin www.gcm zinfo yumaadmin www.emo coldfluadmin www.fas gi361admin www.dnt www.dks www.freetime cuppycake manhattanadmin collegelifeadmin reus mrmehdi dresci hanabera cleanmypc-serials www.cmt ranjoy lenceriaadmin shiro usnewsadmin usparksadmin commando www.daa www.chm apnetwork-forum raj6 free-money gamekid linsday rosmawati neworkut www.cal sanjiv thedying housewaresadmin actividadesfamiliaadmin progres islamadmin lediscret2006 fadcav fba fantom www.bet gi39admin gi468admin www.bca www.bbf gi229admin www.air www.aic studio2 www.age fungame fahmed frederik www.kedr besthotel nininho teachworld www.tanya logitech 83181928 black11 physicsadmin optionsfutures neurologyadmin sweetlove www.night radionet sosbos farahdesign aviationadmin jacki estateplanningadmin grammaradmin armagedon gi140admin imadmin starter frenchadmin protestantismadmin www.enrique idtheftadmin gi107admin brunner alternativefuelsadmin freedomx sosabt lafinca backandneckadmin easteuropeanfoodadmin fooddrinksladmin maritimeadmin gi9 www.ingenieria catalin uff jalsa miraesto stararabe lasaguilas gi34admin www.mas elecon umi gi7 freejobs gi463admin gi4 gi3 www.reload group13 rikkoyt gi2 shadow77 gi1 diabetesandyouadmin sabnamtusiba islamna gi224admin syr duhokz afifinho pavlosss 3dadmin beatlesadmin dinosaursadmin chinni bhavesh aristoteles hijosadmin weddingtraditionsadmin fbtips marines teenfashionadmin tcw987654321 dimitris ie4search alzahraa sikhismadmin databasesadmin secure.horses gi341admin cs.m unforgiven gi102admin palestine test.game gi442admin clu webdeveloper alcoholsladmin aboutdss tef babyclothesadmin dupree manmohan dionys isaksakl tdi gi193admin enlosangelesadmin husna www.punk gi409admin goggle coloradospringadmin sjftp1 incon gi209admin fannansat gi28admin tekken www.metin mala3eb xaryte gi457admin www.raptor waf7225 contactos artstyle gi218admin simpsonsadmin javascriptadmin gi459admin enmiamiadmin najm-arab arquitecturaadmin womeninbusinessadmin madeira phongthan newhope learningdisabilitiesadmin www.pretty ibscrohnsadmin musicedadmin puppiesadmin pipelin interiordecadmin bluealgea gi335admin usedcarsadmin bbtravel homevideoadmin marveluniverse summertime electronsladmin music4life kamlesh selfhelpbooksadmin crochetadmin www.tests hispanosadmin lasvegasadmin iclickadmin www.lay specialchildrenadmin cvitky gaylatinoadmin pintura bazi gi23admin daysofourlivesadmin gi213admin tahar phx d1000116 cookingfortwoadmin d1000138 darkcode souleater welshcultureadmin apes yoursite decoracionadmin detodounpoco nwr enelcaribeadmin nishant www.androidtablet pbr asis horsesadmin ergonomicsadmin www.paco freegame freefile winzip-serialsdb freedown d1000150 searchrank.guide vista-crackdb macrobioticadmin freecash evaluacion www.blogspace gorussiaadmin mooncake foodservice boby www.novi pythonadmin www.nota computerzone d1000182 bowo bigabout-ext leyendasadmin christiansladmin longislandadmin makeupadmin incognita i4u2 mafioso pianoadmin gi17admin gi446admin telewest www.angeles gi197admin jazzadmin gi292admin seattleadmin gi324admin fishcookingadmin electricaladmin darkgame ecologyadmin misadmin ahmed2010 gsreddy homedepot fashiontrendsadmin juegosadmin nahdd123 hebrewadmin www.rebel swimmingadmin specsportssladmin blackheart masearch kidstvmoviesadmin www.gamingzone womensgolfadmin starforum shuzai.demo vampireknight www.phenom jewelrymakingadmin celularesadmin kabir nutritionadmin kidspartiesadmin gi12admin gi441admin gi202admin gocaliforniaadmin www.paraguay quebeccityadmin blast01 dost lim roofingadmin www.extrem boiseadmin lolipop www.lia martialartsadmin bkorcan fary manisha programsladmin www.httpwww default-search1 ssbb xango accesoriosadmin kashyap007 paypallogin secureyahoo onlinegames123 homestagingadmin mafiahack hotmailserver shuzai.horses www.anarchy www.zim gi318admin www.emerald desktoppubadmin victoriaadmin sahiwal estudiantes www.ecrc www.callofduty directv angelic directo wholesalersadmin webdisk.manage autoconfig.manage inteligencia auth-smtp.vmail backtoschooladmin rafaeloliveira gi435admin ums-auth curbas jmd smtp.vmail gi186admin nascaradmin lucifer666 vinayak newcurbas auth-smtp rsiadmin abhisek www.manitoba glutenfreecookingadmin frenchsladmin vatex www.vanessa harm testsecure hydroponicsadmin www.robert gmbm gi134admin automax ncstest gi313admin perladmin fmso cwlounge chronist korsan artesanos www.navarro techwritingadmin www.petrozavodsk kafa 2609_n_www anh-m vetmedicineadmin androidtablet 0907_n_hn.m bk.sukien netcultureadmin cron02 vipersky cron01 mohsin bk.mst eshwar ibro code.m kalp gi430admin sukien2 sukien3 guys blackstage mgj 0507_n_hn www.sukien wpi playfreegames modeltrainsadmin blingee gi181admin gamesforall orientation-forum govcareersadmin technologies vm104 vegetalesadmin sakblog lomejor bronxadmin dbtest-scan rosesadmin joule englandneadmin 55545082 dinamic gendbtest-scan gi400admin sakeena erpdbprod-scan terabyte vaughn askjeeves eship gi189admin shuzai.collectdolls worldnewsadmin crusher jhon www.sanantonio rugsandcarpetsadmin jiko gatika gi307admin alcoholismadmin pregnancyadmin dwdbtest-scan oficinavirtual www.paintball dbprod-scan ebrahem gendbprod-scan fta cinemania americanpie christianteensadmin londonadmin aryan123456 diabetessladmin backtoschool environmental erpdbtest-scan loggingadmin gi424admin gi175admin gar websearchadmin losangelesadmin fgs gosouthasiaadmin sbatimes vacationhomesadmin primesearch gamblesladmin www.element torontoadmin gi302admin ravi1234 voipadmin www.independent xinxin saltaquariumadmin dwdbprod-scan napalm emf renotahoeadmin marinos santabarbaraadmin yahoo9 donations hollywoodmovieadmin redessocialesadmin gi418admin meenakshi gi169admin gi500admin markyie carinsuranceadmin dirk dheeraj ap9 civilengineeradmin whatismyip bengalicultureadmin gi96admin sanyi007 www.mig www.switch mady www.strike gi286admin theroseanneshow ibdcrohnsadmin atheismsladmin lizzard dll na20 torchwood portuguesefoodadmin shakespeareadmin triton.dis vipadmin golosangelesadmin conspiraciesadmin suvsadmin yanuar windowssladmin purelife cpv gi413admin gi164admin www.wallpaper gossipadmin turbo2 yardim martina cla matisse remediosnaturalesadmin tejeradmin lifemadeeasyadmin birminghamaladmin yaseen aprenderinternetadmin pcbiblio aleman cuisine slingshot newjil yasmin kapre cmm yassin crearte eatingdisordersadmin gi91admin kriminal starcom starfes swimwearadmin www.descargar gi281admin starlik dermatologyadmin divorcesladmin comidamexicanaadmin sj.js.get www.gomel starsat www.cristianoronaldo admin.flyfishing personalinsureadmin bbhealth2 gi409 jewelryadmin logisticsadmin lrss.team cukerko clcs cyberdemon familybusinessadmin sultan gohawaiiadmin stringer menshairadmin dvredit-serials gi407admin gi158admin foodpreservationadmin www.paul are deltaforce thaifoodadmin www.thefamily mudy mobilegamesadmin www.nutrition www.neobux gocaribbeanadmin mangaadmin allexperts sanfour nehemiah canadamusicadmin suncewap moooon sanjeet sanjeev gi85admin gi275admin paintingadmin iadmin.pmy flashmania ceramica randomstuff scottishcultureadmin akis softweb gi349admin guidepolladmin horrorbooksadmin encolombiaadmin theend greenlivingadmin cukorki textil insideprimedia-forum gi402admin petsuppliesadmin mandawe compreviewsadmin www.bullying gi153admin osly mubaraq futboladmin ludia8 news906 resinok global99 chelseaprany oldiesadmin 3dbangla metin2forum junje smusic garibaldi ropaninosadmin pesca gotexasadmin volume theempire cigarsladmin pittsburghadmin koronful baileadmin lobbyadmin paranormaladmin trucksadmin gi80admin www.bandits uniqroom marinesby computersladmin www.lovers fororo gi270admin sunnysk69 babylon5admin shopmanual scw1025 freshchan bkk730 jolifemme zen88282 zen88281 depresionadmin karacoco5 sqs123 mrcha321 nataraza ymslhs1 mamalatinaadmin gun0216 origingeoje 86236 miinstory11 houseplus designtoken ngelpc1 candy9 crown9022 topcook5 topcook2 kym5470 backtoschoolfashionadmin todayfeel socee2011 janghyuk18 sungiu1 sunghwa hsj8441 top40admin dcheroes poembaseball edutige velofltr0443 jhonatan ihcorp cypaper godoshop000-010 zeusbsj2 lanos4153 navazo audwk991 www.midgard youinn41 jaworld mklee0982 hytelecom fkdlagkfmxm dorikorea colemangear hpixtr6886 leadersway junggotr7791 winshade yj3300 aramistr5696 www.tnp gamistyle1 reve12 bstjoeun-019 ilikeshop002ptn caselogic mmix6 shoenettr bstjoeun-013 heyjune1 bstjoeun-012 boulderadmin yangposs woodstory bstjoeun-010 lsszzi highsora ihdeco lux4u bstjoeun-005 akwlswn byplekorea daisyv4 jinyuk001 sksk10011 bstjoeun-001 drjungletr bth3804 sugarcare1 npshoptr9027 smj6242 sevenwell kseongbuk cho3927 ihkim2000 jolrida1 ms4747 mcfoods1 balltop jwellday www.tkd kobaccotr fbiscout queenz67 daibokorea th48500 toggi02 ribbonshopv4 bbobbodi1 suhojjang1 multiplesadmin lhy5363 bombom2124 myshop-030 exclu1 eclock nzonbf myshop-023 inwoocomm dlqnrnr4 myshop-020 wendt30 creator1141 nator1 mukuk9tr6244 enamoofix ceoyaa kjunggu kgsmook4 kgsmook3 kgsmook1 lee73772 realtitr9751 kohjeondo2 hunetdong locohouse1 park6742 onblog artvus eugeneph yhdiva56 seuumcom1 knovita1 sinhongagu artwiz banyflat1 marinpet mesosuk1 fireird16 fireird11 jasaengdang1 ruawhk119 sice328 music1042 bj10031 megaphone2 moses129 pyj12101 ebule1 thsdkgus enfi2389 girlngirls wowman2 foruzone1 green2902 barolife1 ahemskiss1 horseracingadmin polomonster coffeegsc4 coffeegsc3 coffeegsc1 ptypty1 ksk77762 www.jackass rfc53403 car3921 kjh5640 www.rpm www.saa bungalow collectpinsadmin remy mathavang yahata augustagaadmin jukstory daisseo gi386admin yetiman1 calldo www.pmm balmers muse8119 rlatkdtr1002 mlcast dpoint3 s1devkthkira newlight46 artryx hkent12273 son7446 ggstory4 ellistar pauly842 pauly841 cho3234 soyea0529 gion716 dalmados cashpricedn gi147admin us3acid zzambbang dakbam33 parkyh xkrrod dkssud588 colicehockeyadmin cho3146 nousa971 tiamo1 rmfpdlq1 sangt01 x86x resolutionsadmin www.pcs www.nsn www.nox takamura vlounge-forum sano www.ngw vip90 alrong11 jehyeub85 www.nba sih7811 hejgirl ksgo7263 ksgo7262 olspecta1 hosuko edu50 dryad8221 edu45 aspera75 jjboaba hbnow1001 kjbird aruih2 chorokseum cas012 kpham0503 edu39 winnipegadmin hpstar2001 ttbehan jrjrjr pomipomi edu29 anyweb002ptn ilovejoo2 yagooshoptr golilaking1 tameus2 kikifs wonu27 noble0730 edu19 rhdrptns artjugg airsense1 jb97091 biglocust1 chunbe87 lovestarlit mkjohn icysniper5 pil1001 pom50231 dalky123 www.low minpower encittr carrymtr2154 daol0778 ilmare79 january11662 leemj71 oh19552 sanfran m63200 petitptr0838 viscon4 viscon2 megafish1 blindplus1 tkk017 rirosystem donakaran77 nblt2 youinn4 threeboard4 threeboard2 threeboard1 artkyu kkum77777 dmarket tekken986 toolmt09 calbin6 calbin5 calbin2 sogangtr0438 giogiaa hosoon jazziscool jhngyu11152 tgdometr2527 swood33 leemh77 thinkerk luci2 luci1 namublind bankmatch leonaeyo2 wainat memorykitv4 bisto01 mooas09 arai1103 anonima123 airsense jardinadmin heavearth2 luvbean1 paulrhim artkit jhngyu1115 chinadesign gcsd3314 gcsd3311 gcsd3310 rlatkdrjf119 crabman2 gomnfood1 pacu4ng1 t2rtr7289 majunil3 xowls1 gkstoawltoa kimys861 adream4u youilemv leearm0217 fkgt19801 heret43 heret42 copdadmin kitlabtr7995 bbhobbies bcuwkorealtd takwon2 ncbank1 asr122 arirang01732 yoofan4 marketingengine pure081 rosejang110 peanutsco crowhell5 crowhell3 canon7813 crowhell1 uyacco692 cho2024 bnutopia1 nabiritr9900 comicztr9477 decoline1 edpchair omion1 wkdtn3007 pjb9162 pjb9161 uhhng01 chung131 join09151 woodkid spsh79 anyweb001ptn jirisnnm lesepy34 sejin577004ptn loakekorea1 tig234 newd chonm9122 biopioneer4 qkrrudcjf huencos azh1207001ptn gnnew5425 naroit hotelarv nambookmusic jjutwo1 fashionsmctr lavenders narodo day12312 lovemomo82 wonmee cacaoharu2 ercedutr zone19741 saru www.mat otinane gi74admin pricedn2 njy1281 gulbia1 ropdacom pyhee741 adream4u2 adream4u1 kmbabara smartknife honey3139 redhotman ipayrosthill realdeep1 www.mao piosbike yuow7531 tarifa gotoday desecret ladymama cakee1 mrtelecom gi198admin tsgim7tr7930 dorothymalltr gi264admin kns10302 cz0138tr9701 youguy2 youguy1 demobb duke356 donghwasys mkart artbom ihammer derkuss07063 kwk2381 decolight operassi1 free1261262 miss2 luxury50491 bumhee147 to0622 baliya2 designstory nsd0290 miz01 artand wmbaldy miraeppa supremacy1 myeston8 nattskin11 thing95 bootintr8750 hellojungwoo2 leesum01011 hellojungwoo1 leh01091 hy45122 walidos steiner4869 shine10262 osooso3 kimsontr9280 mggarden nahri woman4u3 goodkim20042 goodkim20041 dodo6699 sanga89 jts3200 bbworksmaste4 hoscnn johnonline hongjamong sewingateliertr bulrogeon shoptr1430 booriboori dokyngo2 dokyngo1 gwon10082 e-weddingcar bbocksil sky486ym1 nsd130529 kikass1 blogshop1 wsyoun morning6 nfarmer repuni atomicsnow4 ckh0630 atomicsnow2 atomicsnow1 posiinc00 nzlandshop raraaqua jemmaroh91 pokeuni sejin577003ptn asiooy 2bbu2 very0421 scubaom1 gsgtel-010 decorativeartsadmin tuntunkids1 mimyu mandulgo bom1004 leeks10072 artima6 mint3 artima3 mei12131 enamoodemo kornesia jikr771 mhvsg night28 burstbany col0101 goldonsmog6 oneorzero17 oneorzero12 oneorzero11 oneorzero10 wjdgml21 s4edu kt200505 lseed hotwjddus mini0 mulangsa lhy1984 ej1378 sw8901 ribbonvalley michabella horie1 lsz1022 nabut shesplus big1301 hana5249 bodyya3 rkdrn2091 kama1122 k198432 dgamdong001ptn youngadultsadmin toilettr4563 ch29952 gi381admin euorganic bbbseul ipaymall say24112 anttelecom hoopcitr6821 campingfirst2 campingfirst1 modernagecut didmontr2712 natalri4 natalri3 lemonfish acebless2 mijkr geo821 artgyp2 ebonghwa futuremediatr roby19772 roby19771 pyw36582 bodyup6 bodyup2 toysun2 hwan5855 newjjang junsic-029 junsic-028 junsic-027 junsic-026 junsic-025 junsic-024 innerweb4 innerweb3 www.balance finefamily innerweb1 any49526 junsic-017 junsic-016 junsic-015 junsic-014 junsic-013 junsic-012 junsic-011 kims18418 junsic-008 junsic-007 cooljoon2 junsic-005 junsic-004 junsic-003 biggolf1 junsic-001 denis119 denis118 denis117 denis116 www.jas denis115 denis114 denis111 onky5346 imex771004 cho0123 smzluv gog5202 sj112911 mapline4 jy0222 stylesock cok8370 gaegoory1 jabi8874 kongstyle15 kimssang7775 kongstyle13 kblue08 ch1005 kblue05 kblue01 thddl8666 lovelyone7 es3free highones view21001 dlient nordkap8 iloveherb how4u4 how4u1 april20 sejin577002ptn tmddus5411 je0224 hwan5487 popcorntreetr spoutltr6391 icon21phil nacodory blueskyym1 s3freeintw demping s3freeintp s3freeintb nakis2 ciplatform1 cross56221 thfdbxhd1 denveradmin touchdog3 ipayjwmall3 miega iorizia s3edu cho2001s pensarangtr lifelink6 htmladmin lifelink4 lifelink3 lifelink1 kama0242 saddog74 onagana wigdesigner3 s4freedevkhs romeojang ch0559 monic01 flyte2 mya000001ptn jackmen gi20admin lovehouse3651 dasan247001ptn binilatr1277 kim9hs daenong1 leeji2k mangonamu ppunia2 finelbs5 sismedia finelbs3 finelbs2 okgolf1 swpaper sandfox madeinreal semicon21 pelletcamp gosouthamericaadmin nicepick best12295 best12294 sakeimtr9141 cocosribon ipayeve58153 taewoo32022 dhrwngmll sketch luna7658 stwood1 miapc abbishop a01086700679 s3devsky softlon ryoocs kjbaek2 soekaldi5 soekaldi1 fleamarketadmin rhotcool zktmxkem122 herman77 jonejmama1 kghjl79 skymap1128 ilovemusic3 demomt2 fairy001 enjoymall4 enjoymall3 backup89 backup88 backup84 backup83 backup82 nesteggz backup68 backup67 backup66 www.ess backup64 backup63 backup62 backup61 backup59 backup58 lovelyand4 backup56 www.fer backup54 backup52 backup51 intorock11 hmsolution another0 redstars4004 www.fdc baksa77 sktworld2 sktworld1 pdfox4 jates2121 allip600 qutjin60 tree9613 buja49483 minovia1 spolex aaasss84 demor44 wanggung sl1238tr2669 sh3123015 deplant1 swch4040 rlawndo613 kyw01 godqhrtoa s2fqa icarus89 natur331 sejin577001ptn godo23125 superhoya1 rentop gracex82 hairtoo3 newyorker9 ribbonarts daein69414 kingdisplay soyaco twoace1 chgoods wyh1015 directmall yangok331 rkdrudtjrs emlifetr theo06182 theo06181 aznymohc009ptn www.fca mycom84 ginseng2000 downie3 yukinongup ksjbank2 offman21 offman20 offman18 ryu858 www.cup thepnk sensrect2 www.diy flashram sulry20 s3devman ololaa drmartens jsh0727 kyjzz adagioepiano varam089 interfaith godomall-059 godomall-058 godomall-057 godomall-056 godomall-055 godomall-054 godomall-053 godomall-052 godomall-051 godomall-049 godomall-048 godomall-047 godomall-046 godomall-045 godomall-044 godomall-043 godomall-042 godomall-041 godomall-040 godomall-038 godomall-037 godomall-036 godomall-035 godomall-034 godomall-033 godomall-032 godomall-031 godomall-029 godomall-028 godomall-027 godomall-026 godomall-025 godomall-024 godomall-023 godomall-022 godomall-021 godomall-019 godomall-018 godomall-017 godomall-016 godomall-015 godomall-014 godomall-013 godomall-012 godomall-011 godomall-009 godomall-008 godomall-007 godomall-006 nanum2 godomall-004 godomall-003 godomall-002 godomall-001 s3devkhs nuny78 parisfrance gongze11 reon2k usemix aramseosan kangs2445 can337 godoa3-030 godoa3-028 godoa3-027 godoa3-026 etiquetteadmin www.eaa firstchoice e-store www214 ldschristmasadmin gi199admin rola epilepsyadmin deportesadmin shashwat shuzai.sewing www.cee wertex gi68admin gi497admin ldsadmin godoa3-025 godoa3-024 godoa3-023 godoa3-022 godoa3-021 godoa3-019 godoa3-018 godoa3-017 godoa3-016 godoa3-015 godoa3-014 godoa3-013 godoa3-012 godoa3-011 godoa3-009 godoa3-008 godoa3-007 godoa3-006 ryu18077 godoa3-004 godoa3-003 godoa3-002 godoa3-001 jdoutlet wanggolf artform euncho2 tofino1 comfs1004 mixjs1 bornstreet1 yujane21 qkralwjd94 heykeung godohomez momv230 hsj1993 ybmtb1 pequalno1 arablionz lilybebe sigmini1 arimaltr6888 skypjhek kperpect2 y0603791 cdcomco dr7799 qq14121 toysale andynaudrey papassun3 sw6385 goodbutton bestshop221 dlaehd1234 gi258admin sbmaster-010 jsh0258 enostyle vldals1231 syprime zinsol1 ezcominc scrapbookingadmin abdou474 everydaybeautyadmin familyfitnessadmin palmspringsadmin www.amd radiovip farmingadmin sitech canadaonlineadmin sani336 frends cumurki www.infamous sbinformationadmin bcom miniaturesadmin giggle them racquetadmin gi375admin tibs koraa certificationadmin gi136admin angelsadmin inlineskatingadmin blablabla loveforever internetradioadmin subas totalsport adithya homebasicsadmin moulay sportscareersadmin www.estilo sune designsladmin toldmeher petroleumadmin gi8admin gi63admin gi492admin sura www.llamas frames militaryfamilyadmin habibo kidmoneyadmin hack15 hack33 musiciansadmin infamouz teensadmin djims333 scifimoviesadmin stocksadmin bpdadmin enbrasiladmin funpower megabyte gi370admin sasanka soapssladmin european gi131admin www.michael hotmailcom www.facebok collectdollsadmin starlines2 akermoune holidaysadmin allergiesadmin charlotteadmin saiko landscapingadmin mbx gi3admin adamadmin cycles economicsadmin goatlantaadmin wara ravinder restaurantes registered cstrikes freelancewriteadmin gi57admin hammas vintageclothingadmin gi247admin webo hamood silverboy swsladmin hanlin hannan k-6educatorsadmin www.magnet internshipsadmin parquesdediversionadmin sarthak frederictonadmin ny.js.get snowrides www.pizza portlandoradmin www.stephanie tampaadmin easylife 15minutefashionadmin charlottesvill www.consultant mazika0 tvcomedyadmin www.papillon triathlonadmin www.lasvegas nom raviteja teenlifesladmin ivalice marketresearchadmin www.faceboook gosouthwestadmin www.tbt zerarda2008 womenshistoryadmin mcspecial1 carrerasadmin gi364admin gi125admin hassen bullying saludinfantiladmin carsadmin m4trix www.metin2 hdvideo elyogaadmin usnan nailsadmin chandrasekhar sanantonioadmin softwaredevadmin www.vg comediansadmin ximo mita www.rk snowboardingadmin admin99 healthsladmin weaponsadmin mauro flooringadmin www.oa marouane startimes333 ablistadmin kikopolo gi52admin mayas viprasys gi481admin moneyover55admin quiltingadmin gi242admin saobang greennet fonari husam kudanil ablist coolbuddy animeadmin crimeadmin bulldogs gi119admin www.blueteam haven.team dutchfoodadmin pharmacyadmin zalizo androidapp organicadmin brooklynadmin gi170admin homerenovationsadmin hilaryduff volleyballadmin gi46admin gi475admin gi236admin ladygaga seasianfoodadmin shortstoriesadmin kutta magicshop gi380admin history1800sadmin nhan zoey cybermafia meera masterhost www.programas xstone drjohn gi499 yourphotos gi498 gi497 gi496 tutut clarence kollywood gi495 gi494 www.streetart taj flashart gi493 www.dulce vijaykumar gi492 demonic gi491 retal lumberjack www.clima gi489 gi488 gi487 godwin muslims gi486 gogeta gi485 fworld gi484 sani335 hwan3592 sbmaster-003 rebels pgc sbmaster-002 guess18 sociales iconbay1 ppakuns nariswater gi483 gi482 gi481 gi479 subhadeep mav www.jordan gi478 tcenter1 enter3854 aa1 sksdhkdtn dslgstr8532 volky2006ptn pinksuger1 infsch2 infsch1 sesintsunny eggstar1 wellbeingtowel dksro2454 qodtns hamdang1 dasom77352 regalos fengshuiadmin gi475 mule hackeriraq gonzalez golane www.boris gi473 gi472 gi471 afn salma facebuk googel gi469 gi468 www.hotline comptech chatworld gi467 gi466 gi465 animeonline gi464 virtualcity gi463 gi462 www.fox jack-aceh www.pokemon gossip mp109 contenido gi461 ccf clemente gi459 www.congress www.tokiohotel gi458 gi457 gi456 images.b mobiclub gi455 www.theotherside gi454 delivery.o gi453 gi452 gi451 dalia gi449 yogesh marukima badboy123 gi448 gbt gi447 doheejjang a27974844 kbm77005 kbm77002 kifid2 mygaras2 blue1192 www.kankan myepicase sjlock11 pascal752 pascal751 flyant imarketing016ptn biomta zzukppang boss7628 gosteam long4 sunyaro4 four321 namuwa seechans d0tb1t zzubong sodom1982 dns51-4 dns51-3 hbmart07041 baesilri2 baesilri1 godo21667 hj2000kk green12671 kwil7191 biomam brozdist delete01263 hsdacam arome1 reflexkorea ideaz021 dns50-4 gi446 seralee han92501 gi445 academyshop aroma4 aroma3 skyonemoon8 aseva1 www.tobi gi444 zaengyi momodd1 samjogo hwan3049 nari230410 dportal lovesuho89 namph30 doshirac sehooni1 vit424 namph21 merot red4sky namph20 smartdoc allthatkid1 thednd nuno12 eastiger75 ninetyg2 welpia2 welpia1 indishoptr gsv plam gi443 anhquan kidsss dailymi byonce5 pen2011071tr loveintr0102 godo21354 cakent1 fone5117 diso98381 mm045 mantralight artenis wkaxld00002ptn halla4529 okfishtr6461 enicostr1 gpsauto1 quickbattery lohft pcmpcn sogjg86 tree7584 ssizoo1 issac001 juni10981 godo21215 manyo331 queen6c3 oofbird4 oofbird3 oofbird2 whitemoon951 gi441 plusgajun gi439 khy8166 hejan85 ssiznet livelocks3 renbow amore1111 yesyakim71 thevassi1 namph9 namph8 namph5 namph4 namph3 namph2 namph1 wonphu2013 wkseoul jwj15414 tranquan jwj15412 chyra521 elsm5101 eurodirect6 gi438 giftodaymart supersim yvespotr3947 zabes072 cocovenni naxpungtr4570 varun089 upperlady3 upperlady2 rmfjadpeh12 gi437 samiri1 supersg3 starceo gi436 jego114 gi435 coqueterra mnbnm52 lodee cafertr gagsital11 saeromedu yooa47753 sirbanny yms39401 ckwlgh122 fristar1 caselogicshoptr lovestory2 onstore ledstyle kbs8303 hwangtosum jeanmania cjymsms2 haepal79 ohohoh55 wjdghks6 hyde0228 gymboreei i16322 jaypark4 jaypark1 poohaha21c1 hoangdeptrai www.rock jm3 aroma0063 hanna2012 hwan2013 synergykorea artegio ebedding hana0924 sungje jungjm49891 runa0401 summary pursevalley1 morffstyle cleansafe gi434 hautegallery spy007m sunjinpet adev167 khmkjt youtubee clubmobile www.korean gi433 plus12193 naa cuongth2009 www.rage jakob gi432 www.antonio gi431 gi429 jrn yasmina gi428 gi427 cabalph red-dragon www.telefon gi426 www.searchengineoptimization gi425 www.amira gi424 gi423 gi422 gi421 www.jersey jlcorea honeycom143 hemohealth pamikyung rcrace wabtel fishingmetro1 ipaysupplyurs10 junarian1 livingsens1 wkaxld00001ptn kjtop41 gi419 hoshino saygolf bonaebada sanai81 yangil23 ouranus sanai57 dominoland gi418 gi417 harvardmarine www.nick gi416 salmankhan ms146 gi415 llbejll vempee3 waltz00204 chj84291 www.mona dsharp1 wellhouse moms911 psd10022 psd10021 bbcareers purefarm20111 parsley1 wndus2422 imagejan4 sang230 theiluvi newinggo jagex dasanbooks worlddigital wsw10254 wsw10252 splink gurm0001 ajjvsl7 raise gi413 exlife cjhwa86 neobob3 mcommuni neobob2 sang115 linkhouse newdept happygrim73 happygrim72 gi412 www.impact gi411 bluebook gi399 himura gi408 blink182 albin pinpin www.levi gi407 happygrim71 unionflower allegrouz eunbeo3o jmeatman gsharpmall mikanginc ssjoun1 cjws2000 opusone honbeelsh client792 client791 gi396 geolay1 adoresun1 khumalltr ctnara sweeteeleng yung3651 flux91 bmdcorp everydaygreen eoasise gi394 gi393 alameda reflections group2 tana gi402 p1r1 cybertricks marquee hisham gotoday2 dbenamoo jks7292 gi391 erlandsen yooriapa20 yooriapa16 yooriapa15 yooriapa13 gi390 ahmedasem moriarty gi388 gi387 allamerican nutting xyz123 gi386 chewy gi385 gi384 clothes optica stararab asadullah starcasa gi383 samirbba tfm gi382 harshita starcom2 schulte 2rbine stardoll tja yooriapa11 jjh7457 phenom gi381 gi379 rhorse58 song2000991 hohs6870 gi378 gi377 remates cibertec stargirl cinkabene gi376 fasebook stylentr0015 gi375 gi373 gi372 mau gi371 woaini gi369 gi368 gi367 starkora gi114admin gi365 eartprint1 zerowox1 esmailzadeh infopia horoskope blackie gi364 starnet2 3arabforest gi363 gi362 gi361 gi359 zzinga7777 hit0043 testgodo-003 testgodo-002 testgodo-001 motorplus mk211 cadkdy homeic nobelkorea1 oksysy kangkosy1 theseatr5545 digilog1 runescape3-beta geosungnc4 geosungnc3 jcy80801 knan4053 moltz13 witharbina jentcosm1 mnbmato soundforum1 innohouse danmist1 cjmarttr bumbi1 samohago gi358 geddoi marusol hikang93 whb jshak1012 tkfdkdltsp weddingnbaby1 bomool10141 petsbtr5164 furnipeople baleda2 rkatkatjd3 khs106 lloom bymommaster promaltr8853 khlife thatbe dh13571 matjoeun snowcathome bysummer nalgae olleh1 atmanhouse zi9 uiseok4 godo17925 medcos2 shira81 yatene yespump2 yijungah1 oizang3 nanogolf kissthehydra rauschtr1027 sshousing bigbangt4 t2002kr1 gi357 mjkt84 aznymohc005ptn golfmax1 yonggary311 meditotr1586 billyb vou hyundai-039 kimjinryeol gi356 bnutopia jeeyae1 taebancosmetic ltlkorea sofoom1 koolz18 koolz15 unixmart1 www.iq hyundai-032 staristr8183 hyundai-029 vmulti2 sw2803 ieonet20131 qqqqq7600 tourkorea f1tr7745 eternal0424 infoic2 gcsd33012ptn hyundai-019 sosomm hyundai-018 jungmi803 intopkorea aidiishop monavan sonaten231 hyundai-009 sosom4 marketing11 totaltrade www.jd hyundai-006 marumoa yein5151 gi355 snailsp bimax1 marumir hka7898 kbvintage motor629 mcumart dodam16 hori5000 jjungyk dlwlstn12343 hosikstyle emtmaster1 artbom5 artbom3 yonsuart97 dktak nalabi gi354 ddalki011 wikitetr0769 gi353 jazz2you1 gi352 carsm5252 mbri1 ggamsiya mis0142tr viiv6153 gi351 eros10921 godo17272 mydaisy bori25603 ggamtan3 eum9960321 tjdwns092 gi349 min3584 so17702 seolleim motibluetr page2940 delskin mkara1 yjh61281 wooridream2 gi348 seong9557 samhang vitamitr3086 akddong11 outdoorlook5 shinwha misomo narsha67 infocad s3freedevw stylesaysmart s3freedevp roradress s3freedevb gi347 unistarlp maxi9 venisarmy1 extra44 wintop253 wintop252 wintop251 toytoylego pka fluaos mondoudou1 misoap gi346 rjmhouse1 gi345 cuteysoo aznymohc004ptn attic831 dream12451 gi344 sgsgcbs youal12 msraion taddyseo newdctour artbike livingquilt miss64 arti112 ecoliebe nzlandtr4975 shinter mds3515 vitamitr2648 gi343 gi342 ajkzz4292 ajkzz4291 pnbhfood bel13941 ipaysupplyurs9 ipaysupplyurs8 smartcs4 gaonnara parkinn a2amanager3 gi341 r4tt1 naturaltown6 wkdrnthd12 cubist upflykorea3 upflykorea2 datanlogic flue87 www.4u ujini11 pakch042 pakch041 darkrookie78 designsol zing212 mirae021 shiny02 marue polaris321 sam840711 designsmc yoursea mirtel www.3e pazzu1 gi340 www.partypoker designtag sd08051 yurian ksroh ebizs1 zerozin mirz02 sunwooland michellekor chaeeunabba2 anirudh aquan1 maqua misit5 gi338 misit4 arabicsoft zioips2 dwkorea3 okidoki h10516156 gi337 gi335 thaddy jjang98 miso99 uriiya tera14391 k320sh amecano ramosu3 maummind1 tjdgml8004 gi334 mouad gi397admin gi332 informate gi331 register1 gi328 foxhound gi327 gi326 lupusadmin aquatech startime gi324 reflect gi323 startoon gi322 gunjan gi321 www.aras gi319 gi318 lakshman www.dta addictionsadmin emotions gi316 gi315 gi314 www.rebels jengkoil canadian december gi313 gi312 gi311 freechips powerfull aloevera gi299 famillypower gi297 my123 conquerors firewolf tigertiger profesor freeleech zlatko hostweb www.restaurant www.douglas gi296 one101 officefile gi295 idrees gi294 freewallpapers studies gi293 suleman gi292 gi291 gi289 bodexdas qa.myportal gi288 www.rcm gi286 gi285 yulong www.royal gi284 gi283 gi282 gi281 kakalot shareblog mudit gi279 gi278 musicfa coolpages gi277 gi275 gi274 gi273 cavake www.iceland gi272 loveofmylife www.hicham gi271 startunisia test123456 arivolker rhapsody profile123 chillout gi269 gi268 musics m.video gi267 gi265 gi264 farouk medinfo gi263 samoloty bebobebo cyberworld mahjong gi261 myfamily gi260 www.lemonade doddysal hostme gi258 orkutnet gi257 gi256 gi255 gi254 houser gi253 gi252 gi251 gi250 manish786 cukinate gi248 dprakash redatimes gi247 www.helpme posters mega007 gi244 takuya al3mlaq www.emilia stallion gi243 ezekiel gi242 acompany gi241 khan786 gi240 photolab gi238 chimung azmail002 vinay gi237 funnythings gi236 gi235 gi234 soundsystem gi233 gi232 gi231 richar gi229 freesupport lipe gi228 gi227 www.des danubio gi226 legende hrishi netweb mail111 oldworld gi225 coley gi224 a7lam gi223 gi222 gi221 gi220 gi218 gi217 a7zan www.cnc gi216 cruel123 gi215 mmusic zouzou gi214 jagoda www.friend gi213 sipe robinhood gi212 www.freetv ghatipati pcsafe mikerichardson friendsworld www.hospitality aluminium gi211 gi209 arabsoft gi198 gi197 sitecore gi206 integrity gi205 gi204 cementar gi203 gi192 gi191 gi190 gi188 tube8 viswateja cirugia gi187 robinsons gi186 netwalker realserver gi41admin troya huatak mixter certika samspade searchengineoptimization gi184 gi469admin barcalona antijboura gi182 mistic gi181 gi179 pisby gi178 dreamhack gi177 phpmysql gi176 gi175 gi174 gi173 occo wandi sfsf jayson www.abraham www.eureka www.flores fasling gi172 vishnuvardhan gi171 achratech gi169 torre laminate www.evelyn gi231admin macipoli www.crema impulso promotor gi167 amec hamoud todojuegos sanandres www.backtoschool gi166 gi165 gi164 gi163 dostavko miauto www.bit gi162 gi161 gi160 gi158 www.ibrahim gi157 www.aws promusic mycomputer hussam www.gamerz gi156 gi155 gi154 guitarhero gi153 gi152 zuzki ingame skyking gi151 www.escort gi149 imotok gi148 davidoff www.wiiworld gi147 www.ccr gi146 desktopvideoadmin gi144 hortensia gi143 abadi abaja gi142 wiking gi141 abdoo gi139 puremusic melanie gi138 gi137 gi136 usman gi135 achat imstar gi134 www.iloveyou myphone mohseni www.newspaper addie gi133 adept adjie aditi videoclip gi132 gi131 gi129 www.xx www.tz www.tu gi128 bayarbat www.to gi127 www.rq www.rg aftab gi126 netboy afzal ahlam gi125 www.or gi124 gi123 gi121 ahrar gi119 gi118 gi117 badin gi116 bahaa gi115 gi114 ajith gi113 gi112 gi111 gautamkumar gi109 balli apnafun gi108 aizaz aizen barde gi107 gi106 gi105 batar gi104 gi103 www.kt missou15 gi102 alex4 northernirelandadmin gi100 insuranceadmin algno alibi usmilitaryadmin aliii zanzibar www.iz www.jm amany constructionadmin allam graphicdesignadmin webtrendsadmin allie artforkidsadmin plussizeadmin ameet gi347admin clevelandadmin www.ew gi108admin jevans www.er amjed laborissuesadmin sweetpoison ucat-sl anami youngadultbooksadmin www.dt employeebenefitsadmin frenchcultureadmin bedda gomontrealadmin desmoinesadmin www.dg alwrd angad angga inglesadmin bipolaradmin gi35admin askjpartners betans2 betans1 fictionwritingadmin ucat-gl gi225admin pmsadmin familyfunadmin lungcanceradmin chicagosouthadmin berta preview.seventeen antar homesecurityadmin gospainadmin stage.americangreetings menopauseadmin comicbooksadmin eathealthsladmin shuzai.womenshistory llamas arab1 yaser aqila arbab memo242 www.vintage gi342admin gi49admin bidet ardhi powerboatadmin gi103admin sweetums rockstar1 beaguide.team usforeignpolicyadmin cabba hernandez arkay biker startrekadmin gi240admin filosofiaadmin lesbianlifeadmin gi29admin cadsf simonsky gi458admin gi219admin dyingsladmin asker musicacristianaadmin canadapoliticsadmin faccbook asmaa gi30 gofranceadmin preschoolersadmin arwef asoft purples worldsport stereosadmin austinadmin coffeehouse activetraveladmin usana politicaadmin www.original carob www.elites westernmaadmin pepa cave1 gi24admin gamebattles blero kratos www.photoworld john123 gi453admin chinesefoodadmin aures aurum gi214admin inmuebles gi303admin adultedadmin leandro womensbballadmin contemporarylitadmin cezar boots gi331admin awardsadmin officeadmin kosherfoodadmin collegehockeyadmin ussocceradmin psoriasisadmin francia altmusicadmin tesis amblogin gi18admin gi447admin azert kvartira piotr rufus diversions braga talkshowsadmin mychemicalromance tails cidar diabetesadmin shots choci yaziland choki catloversadmin azooz enperuadmin stardays2 drumsadmin columbusohadmin dacad azumi gi325admin cindi foodpolicyadmin goamsterdamadmin kmusic globalizationadmin azzam homesite daima tuankiet downsyndromeadmin movieboxofficeadmin dalac djk ancienthistoryadmin subsabsladmin gi13admin damin fisheryadmin classifieds.history gi203admin reich philosophyadmin enespanaadmin gatosadmin bbissues theaymane www.phantom www.ia darsh beautyadmin twitteradmin goseasiaadmin www.sac minhaconta simpozia nanotechadmin kalemat www.gl dcebe doctorpc davor dayan govegasadmin menshealthadmin gi319admin taxtimeadmin webcams genealogyadmin seniorsladmin gi392admin bux08 componentsadmin debaj oaklandadmin judaismadmin deepu digesto mobileofficeadmin afroamhistoryadmin banserver juarez pcfix medisys libertarianismadmin cokoo eastangliaadmin salas hwpoll dewki containergardeningadmin potteryadmin servant gi436admin gi187admin corpi www.terra lamoon budgetdecoratingadmin musix museo weddingsadmin keralam gi420admin encrucerosadmin dilan importexportadmin crkut collaborationadmin motos gi314admin gi300admin etfadmin africanculturesadmin tech.team shuzai.in-fisherman bbcultures localfoodsadmin kabaka feeds.beta.nytmy nachi menus paltalk kidclubsadmin mentors kacang gi431admin dmail kpax gi182admin photographyadmin michaele musicamexicanaadmin cyganka biotechadmin socialworkadmin oulfa www.bs redvampir portablesadmin gosanfranciscoadmin hepatitisadmin dodaj calgaryadmin tavera www.geography sacramentoadmin latex advertisingadmin germanadmin lapaz dolar homeparentsadmin izone donat el7ob richinnyd www.divine doyen joyas elemailadmin johny jogos ehome login12 gi308admin search.beta.nytmy fafaz owais www.cyprus fahid bbhealth judaismsladmin bondsadmin kathy bestofadmin txsearch herbsforhealthadmin buddhismadmin falak irshad fanna bejoy bismarckadmin fara7 faqih farad iskra goswitzerlandadmin cocktailsadmin heemo fbitb oncologyadmin fatik www.tecnicos geneticsadmin fauzi jithin gi425admin animatedtvadmin fayez fazal ekrem duhok beautysupplyadmin wasp jeans gi176admin computersadmin elmir humer nightcrawler mobilecouponsadmin elove scubaadmin javis golondonadmin kaname artsandcraftsadmin translations jacks jabar clks bahaiadmin www.create kamran feras igirl tourismadmin barto fetka electricpoweradmin rahma alesa herbsspicesadmin surgeryadmin macsladmin erfan gi79admin himanshu karami ictus superheroes fikri gi293admin sexcerbobi icast masterman firas icaro spaceadmin abhilash ertin amarilloadmin www.add guitaradmin www.wowinfo graff galib painadmin neworleansadmin fitzy shuzai.africanhistory divingadmin gardeningadmin www.neptune gi269admin chemengineeradmin gi419admin realptc rarediseasesadmin gi171admin habbi somaadmin txsshgateway gazal childrenshealthadmin familysladmin randbadmin bmcmail3 mazinkhalil landlordsadmin katrok www.animezone gi97admin yahoo360 fname negociosadmin crosswordsadmin estec fixit chandni gamex alfars gamet galax feathers www.coches habboisland www.server3 drunk gmcj www.thevoid static.hdw toss moodleold www.promotions curly rammstein djmax www.expresso freds www.selenagomez alessandro susa frisk www.dinamic porki danes hacki citec hacko haray hacky bross www.theclub damascus bonne haise hakar bline cassa asnet hakki bijou www.oldschool anunt alinea hamdi palomino vdp2 wm5 bigmike z20 kenmore ambar www.webmasters alain phpmy parallel bandy lop12a6 bball nwp sportclub germain boualem www.videochat gjwap www.chrome claremont gmale www.tga pelco www.brasil sekhmet tns9 tns8 gnews tns7 terraria tns6 gohan tns5 gogol tns4 tns10 nero10 magyar www.encyclopedia tecnicos googl www.maestro cerebro rocklee frenz www.valentina pokemonworld proweb blogspace transportation www.water ely www.cancer www.miniclip www.turbo cyhwyyx www.tsweb www.thesimpsons coldplay megajuegos wolfer sexygirls ibda3 suhani www.arcade www.smile ichal mindcontrol www.simon nhatlinh dso celeron findfriend translators www.remix idris tne metepol gamesource www.raman web4you www.rahul sendibadtv kolumbus rafay www.radyo www.animes www.animax overkill www.plati www.autoresponder obsolete www.oscar nidalstyle www.piano wiiworld meloode zone-ghost www.opera bestptc raytech www.peter jadid frederic senegal mland alnoor alhamaty www.ocean santuario rockshop www.niche www.albert nacho series janne marketingonline tetsu itworks www.society muro sonia007 chebdal www.mazda www.godofwar jawad prv www.laura www.laila www.videoclub kristoff www.joker lagrange stacey hunny www.https jockey runescapeforum autismo gamemaker www.lincoln checkme upton www.igame www.violetta www.ictus doubler gigantes www.gtaiv mito jenna 1direction nad jerin intan revenant www.glory www.hakim www.hades medalofhonor ratki www.habbo www.fresh iraq8 www.active www.ourspace modiran www.etech stem jimmi badgirls knightonline www.concept popolo franki sese mysms www.lighthouse maja mago www.curso www.eddie redz mosafer kanak extasy www.crane kamon keshav irwin www.cobra www.class www.clans www.chile www.ayoub www.chevy www.cheat katie olis www.blink www.askme lawa kethek laera clf kikki descargar www.alexa mirc lino www.toyota kedar javaworld iranian ledo descarga kern tmtest01 kaya www.bazar gandhi jlca www.dentist empireearth ns85824 dznet webmail.deepsron.com feta www.sebastian ns1.vps2 darkmoon ecco khoso ns2.vps2 kiman killa kingm darkhero kingz cora www.medalofhonor cica kanika bows capo arca holo comunicate enduro www.yuri jtech judgement baccarat carlosr fallen latef jvc01 joomla3 traveling careful www.mario caramba capitan dorcas cyber7 bdp klotz cemolo cancion knihy www.wtf harpreet www.wms luckylife webgame www.why dineshkumar emtoi www.uli www.tomodachi kolas www.svm www.sao www.rgp cuervo soufiane deathnote loikili007 wwenews www.mrs forumnet www.met liana www.jessie www.mac www.needforspeed www.kms fedaa jmed www.kia xerumide www.jos starpage www.whatever madhu duniamaya hairstyle creare sciencetech mal3b www.gts cratos mahsa lirik www.cookie www.tmd majed www.ggg www.dys mysteryman mortalkombat www.bulldog www.eli mall3 freez dextra compro detodo www.blk desing www.asd mandi www.afb mandy www.reptiles protektor magictricks emedical euros manoj mannu fcall manos mansa mansi marah faruk mark2 drxox bigfish ven uli goodwork tga tcr sil ros sdn rct tamlym3ak ghazali bodega pkr videoclub mazin oli ksd customer-service jus cybercity kursi jmt video15 ixa soliman www.illuminati matban memet www.nicolas www.rentacar timbo lokee loker hbb incidencias abomosa forum2009 luckyweb camara eht salvatore cnv mgl vampires cfn cff cfc bmp www.daniela www.agricultura diastery adt egeli kzone www.easymoney www.carpediem belzebuth mp110 www.computerfix www.hollywood www.mad nadal andrex beaute naeem crisis burma amauta minou ventura alexei najem www.hackers knyexchg knysaprout1 bugsbunny misto barcha barber nanou musicweb www.pin mkhan somos bander solteros isem musicislife webdisk.md cheat abdelghani habbovip www.melissa wendell aguila vacaciones www.on www.pspgame thelegends mouhcine mediaplayer askme lutfi webdisk.cdn2 artec redhill actual www.allstars www.veda hankook anthrax columbus1 unitel redrum nesta vendo guillermo www.brainstorm monem mastergames infocom lovemusic pleyades yoyogi pspgame www.habbomusic www.tips www.michelle com1 lukoil www.conquerors todogratis streetart www.gamemania pacifica kakamilan justchill njoel pctech thunderstorm cocacola spektrum haseeb www.toledo yale mulya www.myhome www.dragonball vals snet tato federal siac shai laluna sahmed ropa seni lamrfe agricultura patr mycar nola lugo yousha salsabil kiya kits karn noor1 iori javi jams nosil gyym mypic idee goma sam4u glob darkempire ersa saied gabo admix dhruv pacio padam eddi cros cres dien palms dex1 bunk crazy1985 sama7 djromeo brea ceto creat carp camu asch didac arbo juanes aime adas www.noname okkut www.profit guild computerfix ahmed12 mygames okrut sania greentech www.blacklist wmm falloutboy vsm websales tbt rox educadores pfc dreamspace nnc humbert ricardogarcia klz httpwww phani knc klk lcd jpc jfs runescapeforums him wwjd fpi evl fez orkot orkul dvitre end fae edr dng ebg piwky dekza qasta djg aliali bso 8638521 bmf ra3ed apr apg bdo amm junaid aby owned godigital publico thecrew timeweb ratchet junjun managua www.radios trad circassian warhammer vermillion www.webchat qf posti vivek123321 alraqqa www.freelancer www.you trucker narutox ozono dragana yut mismail tph jurgen shor profu tio sah rhp rey rfc psr rpc3 pk2 ntr ola ramzi nsn loveorhate rasha ratti kkxiaozi mvr msr mro razer sabr kmz jol jml inu hoc gsi hec pandata gmh fsr shahad putri eti ppc4 ept reema dnf dhp btr clg bsp myideas dao renda bsb azr cif dalex aliahmad alm akp davywavy agentx bag aia afb d66 sabah papiro naranjo www.vvv ju sadiq safar safin saida calton www.futurama 4g rishi 4c sakil www.e-commerce clipping samad hyla reademail slcam fortimail oferty ipad1 www.garden utt riyad inf2 saveearth pressrelease rizki j9 agra scada linuxmint www.chennai sawaw noida sso1 scoot gotr toletol lektro www.planning www.acc1 www.housing eia sweett openview seo11 www.startup seksi co2 edir simplet www.pstc km1 sqlweb setyo romio romka intermedia www.road www.disa www.eso tws www.doe shaan shafi shaft love177 www.csh shanu shari tcdms www.fbm fath bizinfo dorm shery ines kuchnia httpd frango wwwd shone accessedge tablo www.mrtg shared1 node0 textads bobby shank saludmental tamas sharj www.grd tabaco bugg tapan danc tarak tareq wproxy onlinegate jw1 cans libserver fraser clippers www.camping championsleague kolchi sportsbetting nrl nbl listy domeniu www.xr www.listy xr www.omni labtest catarina l212 pazar www.standard shida video123 konici soft1 dopuna l209 adar abid logistica shoponline begood some1 orice cti ct2 spidy fraktal twww mailsend npm fpt s434 starnet4 s430 kopral thoma s420 s414 bbk s442 s441 s439 tinku playgame s438 www.versuri versuri s437 s436 s435 s433 superpixel s432 s431 tlee2 rfaxa s429 luminoso s428 s426 sumer s424 s421 formations videosex wxinlin s419 saber123 s418 s417 s416 s415 s413 s412 s411 s410 s403 s402 s401 s339 biohazard4 kpreet s406 rendy s342 talal s334 s333 libana s331 thechosenone askar s315 s309 s308 kenza s307 s306 s304 s303 s302 ttttt s301 noujoum sigmini09 serdar mongol aldous cadou wb407 arnet s320 star50 www.mmc mailbk star10 www.aed paras www.consumer mla sanerdex fragile aed vhera lightz www.cpe vibhu www.mrb usama alpo komak backup-1 neza amiga kaker tins copia roko varsity navdeep slr rsv irp viswa sombrero mobiplanet capacita wapbd wwwi goldendragon aser www.aser vlado foton hojo foren cubic codon madani www.wind convict duesseldorf webku recht riverdeep johann www.tony ericl www.emploi intercambio bevan aei xxq www.grad bepro shabeer 973 prolog www.classified autoconfig.shopping autodiscover.advertising osodaleslam autoconfig.assets autodiscover.assets autoconfig.advertising loire autodiscover.shopping accountmanager maicol mbe www.company www.idea mahome db13 shadowx www.riv lisboa friday vm53 vm18 vm17 staralarabe vm16 triskelion vm15 makeit vm19 xawer shafqat livejournal vipdosug-ac1 forte94 mall50 mall52 mall59 mall61 mall62 mall63 smtp.be malice hsmtp math4 cheeta divis sfecm2 littos sfecm1 ups2 manishjain mp3find krusty clientstorage svc2 off6 tfe1 maniek manpda proxy.whois r4v37t wqdxa balan cam6 sfe5 ginko toubib sfe1 netdot tokyo-hot babui q23 q14 q13 crozet q12 q11 audiodrom ghost-zone o14 marlin chosta o13 o12 o11 da20 wtaty sfe2 shop.new mp3list vipdosug-ac6 sarina vipdosug-ac5 vipdosug-ac4 vipdosug-ac3 vipdosug-ac2 yasso aayushi masoom forimage yazan sigmini mail.server pinterest ac3 ivrstat test2.shop off5 off4 off2 off1 bill1 cp-epay load.support off3 fr.staging es.staging www.inside barencevo orkutcommunity ttg mickael extranet-test travelfree tcn facturation sql6-replicat sql-dell-i30 torkica subby afonso eh4-i ntp-int parsa ftphosting eurorack varaujo thaer tibialogin baise zahid sql2-replicat gameloft laurenttest ludo3 zargo flashtrack tunisian-hacker zm1 newton.phys localhost.hist localhost.geol kooora ymail localhost.chem newbux localhost.biol kumar1 localhost.soc hackersun localhost.psy localhost.med localhost.cns localhost.maths newstaff ghoghnoos localhost.ciel zeroo arbuckle cherkessk jm1 ghostbd blueeyes www.kis quiosque xxx4u autodiscover.users autoconfig.users webdisk.users linuxserver karlos bah test1000 mobsite abodi webopac vpn100 assets0 www.mapy internode games-online fizyka politika radman www.mage publicsite agc onlineserver appservices stratusbeta-pns stratusstage-pns rajendra akrimnet myproxy profilesyahoo ppccore tot3 jm15222 smers supertimes hawkeye panida thabet zohar reham vpsisgred okazii timur renovat-e3 mohanagy apc03 vikrant hnode-iberonet04 maguire2 palace pakida royalking stech trouble musick clifton startimes5 startimes3 netsupport ministryofsound rogermase mronline rajsite loginn wqdfa symbian myshare games4you karrox runescape3 valentino metal2 langzii lwfchn mfkggi rincewind mysite1 saurav guitars tahichi downloadvideo winjie0618 lololo williams dawson suomi myteril rapidsharee losans smoka mytimes zabarom shantou desiworld mystuff elking larachesat 4islam eleicao megaonline vactin satheesh rickyroma toxicity jesske1990 deepanshu michel wolfstar smilies luiscarlos ridah hoangtan habbomania bazooka gemstones star-forum mylogs nounou mylist meriberas vivekanand fatakata yasirweb 4algeria kadra awfda blackfoot rifai bhavinpatel habbobeta myhack mall60 forumstar nejasno loginpage bisnisonline mall51 codebase frncisa server100 server123 xxenik slimshady mirela shahbaz noldor praneeth rahul123 proxyvn nbaztec mithun neural111 elattaf gandhiji elghedir gandistq anydvd-serials sindbad thebestforum harbour smartconnect metka rajkumar freegifts teguh gmaillogin nassim myupload supratim nader darkwing nazari passreset hayder jiangfan giglio facebook22 rafaell bandhan irancell omany umang t-online testforum1 mrali madworld kissmp3 versasex startimes22 startimes07 certified shubham whitenoise serial88 digitech killer1 nod32-crackdb lvivka mistery safezone batumki montadana trebor batuhan uniqe xiao77 aviemore tounsi sestrada drsonia topreplica venky jopasaran sajal travel1 johanna detyatko biohazard teddybear goldeneyes neobux tupola norton-serials accident shobhit prasanna dz-down nitesh orkutlogin danghuy rajatarora chlorine easyjobs kalpana jakitan b8000 outreach hunterxhunter faksoma nimesh cimislia naveen darbuka ngetes caqer blacksea hacktrack albaraa arab-4ever loginorkut wasim webtimes asuna pritish viyeu southtown abdulla-raid thespider carnaval wap4u princes vipin usher forum4sobe madina saleswwo feel800628 softech ppls-y2lab-202.ppls srv105.csg hca-netprint-bw8.shca hss-hca-0015.shca csg-pps-0011.csg mvm-ri-l107136.roslin nimbus2 ppls-y2lab-207.ppls hss-hca-0009.shca ngocha hss-hca-0021.shca ppls-y2lab-213.ppls psy-adlab07.ppls www-test.epeople-fin.humanresources csg-hr-0021.csg sci055.scieng csg-srs-0003.csg wapas hss-hca-0026.shca ppls-igel-2-01.ppls function sas-cas-0083.sasg prithvi nhatky csg-corp-0002.csg csg-as-0000391.csg nightstalker pps-xer3.csg clickone mvm-ri-d097063.roslin mvm-ri-l615158.roslin csg-fin-0091.csg dsb-g-1-mfp-reader.ppls mvm-ri-d087171.roslin sas-cas-0077.sasg madhav billard hotmaillogin csg-est-0197.csg hss-hca-0032.shca passwords hotmaill parashar csg-fin-0036.csg frisco ris-valx02.roslin ppls-pc31.ppls hss-hca-0037.shca hss-health-l27.health sas-cas-0072.sasg hca-lab3-mac30.shca phhh-g-lab-mfp-col.csg kinka csg-fin-0086.csg www-test.vle mopeda hss-hca-0103.shca sas-reg-0163.sasg danniel aap071.sasg newell ml-3-openplan-mfp-col.sasg mvm-ccbs-060164.ccbs ccnsm076.ccns alberic sas-cas-0066.sasg glowwebcast.trg ppls-sem-0001.ppls redhacker csg-as-0000781.csg mvm-ri-d086168.roslin hss-hca-0043.shca csg-fin-0146.csg radioplus msprevak-mac.ppls hca-lab3-mac24.shca csg-est-0025.csg associations csg-as-0000841.csg sas-alumni-0017.sasg sci162.scieng megavideo useless hss-hca-0048.shca sas-cas-0064.sasg ppls-igel-4-01.ppls travianbest kingpin sce-coll-0051.scieng csg-est-0075.csg harakiri jack007 9hps-2-206.csg stayfree hca-lab3-mac18.shca sec06.roslin blahblah mspace ltsmeet.lts kishore www-beta.events vertu hss-hca-0054.shca cerc-d002.roslin sce-coll-0015.scieng sci126.scieng sas-cas-0055.sasg unpef vcs-lap-167201.roslin mvm-ri-i055152.roslin hss-hca-0059.shca mvm-ri-d106023.roslin twitt csg-est-0185.csg hss-ppls-0005.ppls bems-011.csg mvm-ri-l076063.roslin youcandoit hss-hca-0065.shca hss-ppls-0079.ppls www-tmp.vle hca-lab3-mac07.shca resolution mvm-ri-l105188.roslin health-omq-012.health rii-105168.roslin barada oc-3-corridor-mfp-col-2.csg dallas1 mvm-ri-i075019.roslin scico eeg.ppls csg-est-0245.csg csg-est-0304.csg mvm-ri-d116235.roslin moneymaker sas-cas-0038.sasg health-omq-037.health telus serviceit tralala int-jet14.sasg iknowyou hss-ppls-0011.ppls hss-hca-0071.shca hca-lab3-mac27.shca www-dev.eit.finance cuonline hss-ppls-0096.ppls yu-gi-oh csg-est-0305.csg csg-est-0029.csg claret.ppls fuckyeah ms-dw6-3-pg-mfp-col.health haggis.cache csg-est-0244.csg alton.ppls sas-cas-0033.sasg dropdead sci101.scieng mvm-ri-d134249.roslin mvm-ri-d117194.roslin csg-est-0184.csg themastermind mvm-ri-l115187.roslin ppls-y2lab-131.ppls 23wpc-g-siteoffice.mfp-bw.csg claudiu freddie mvm-ri-l117089.roslin dadada investigator hss-ppls-0016.ppls hss-health-0120.health mercadopago munish ml-3-reception-mfp-bw.sasg roslin-dc2 mvm-ccbs-060207.ccbs jaskaran inspiron hss-hca-0076.shca prodent sas-cas-0047.sasg ppls-pgpc37.ppls oc-1-r210-mfp-col-1.sasg reconnect csg-est-0134.csg ppls-y2lab-125.ppls gemilang aap119.sasg helping hss-ppls-0022.ppls sas-cas-0022.sasg mvm-ri-m107111.roslin csg-est-0074.csg hss-hca-0082.shca ppls-y2lab-119.ppls csg-fin-0205.csg lel-power1.ppls ppls-psy-002.ppls aligator sas-cas-0016.sasg csg-as-0000840.csg g2cpx1.ccbs bambina orgasm struga scoda hss-ppls-0027.ppls mvm-ri-i065092.roslin reflector csg-est-0024.csg ppls-y2lab-114.ppls csg-sss-0007.csg vcs-127149a.roslin mvm-ri-l134242.roslin csg-fin-0145.csg sas-cas-0011.sasg nasa10 csg-as-0000780.csg iahe-2k3cesrv01.roslin feitian021 ppls-y2lab-108.ppls mvm-ri-v105232.roslin vcs-126039a.roslin sas-cas-0005.sasg phstl-2-managers-mfp-bw.csg ppls-y2lab-103.ppls hss-health-l63.health dragonfire csg-fin-0035.csg alessio hss-hca-0087.shca demopc01.ccbs mvm-ri-d107205.roslin hss-issh-l1.health mvm-ri-d115231.roslin rii-055147.roslin amilcar ris-lx13.roslin armas maroc4ever ris-esxi05.roslin saada gfl105247.roslin csg-corp-0001.csg vc-g-shop-mfp-bw.sasg hca-jpglab-015.shca mvm-ri-d107215.roslin lect-health-004.health hss-hca-0093.shca ppls-mcguire.ppls mvm-ri-d125042.roslin sas-chap-0003.sasg unblock mvm-ri-i055209.roslin ris-lx03.roslin mishra sourcecode mvm-ri-i065031.roslin manoo mishka zuikong mvm-ri-l085047.roslin najeeb fusilli.ppls anamuslim superfoto ris-lx12.roslin csg-pps-0009.csg fblikes npatel vis014.sasg sas-cam-0026.sasg hss-health-l53.health surendra ebri043198.roslin sci019.scieng riv-amxmodero.roslin my-world vis008.sasg trang praveen mall17 mvm-ri-l125245.roslin hss-hca-0098.shca nadina sas-cam-0021.sasg mygame beshoy2050 csg-hr-0050.csg myfree wheeler vis003.sasg newhaven.scieng iad-pc19.iad mvm-ri-d127086.roslin csg-cse-0058.csg hss-iad-0032.iad mikado hss-ppls-0044.ppls navin jackiechan crystalx sas-cam-0015.sasg mvm-ri-d097174.roslin laptop-gmiller.health mvm-ri-l087102.roslin whitesnake ppls-monmac.ppls mymate textiles hss-hca-0114.shca as-lock-001.csg hackman ris-backup.roslin dns1.inf cripple newsecure hca-jpglab-010.shca loginfb www.estores.finance mvm-ri-sx01.roslin ris-vlxweb11.roslin hss-ppls-0049.ppls doga csg-cse-0056.csg sce-coll-0025.scieng mohandsen mangal mvm-ri-d075153.roslin www-dev.admin.eves.myed rajiv123 csg-cse-0006.csg sas-cam-0004.sasg csg-hr-0052.csg airline thebridge textbook ris-ifs3.roslin lalolanda mvm-ri-d136101.roslin cyanide hss-hca-0119.shca sas-sra-0028.sasg csh-2-2.14-mfp-col-1.csg mydesign www-trn.ess.euclid pps-xer4.csg mialee holyrood hss-ppls-0055.ppls ppls-printer11.ppls hss-hca-0125.shca sas-cas-0075.sasg sujay wolfi citrixweb hss-hca-0101.shca rim-076017.roslin sonyvaio woolf rip-brfm5.roslin ebrd075073.roslin lokesh csg-est-0106.csg metals computerworld oldbryght mvm-ri-d067183.roslin hca-mfd-003.shca background hellfire oc-3-corridor-mfp-col-1.csg scarface fishies ms-dw6-g-1-mfp-col.health chris.temple-lib-web7 jasonwu templeton-dev temple-lib-web.temple groovyonline ebri073195.roslin login7 hss-health-vaio.health live.dosomething sci065.scieng still.temple csg-est-0207.csg motorsport ipswap jarvis mvm-ri-l115162.roslin moleman ccintranet csg-est-0243.csg mvm-ri-d125087.roslin menber ppls-y2lab-015.ppls oldlinode int-usbmac11.sasg delphine.temple-lib-web7 greatist-legacy civil-rights.temple zumba meknes mvm-ri-d096140.roslin stampy facebookalbum melani javachat csg-est-0183.csg panela sas-leaps-mac1.sasg ppls-y2lab-009.ppls www.admin.drps ebri083204.roslin sas-reg-0129.sasg zstar lindo mvm-ri-d136045.roslin csg-pps-0012.csg ppls-printer16.ppls 5forrhill-c-c20-mfp-col.sasg ssl38 zonex phcc-g-trades-mfp-bw.csg lect-hca-009.shca zonda ip-40.138 babait ppls-y2lab-004.ppls ppls-igel-3-01.ppls csg-est-0073.csg www.tqintra.dev facebookvideos flipbook hss-health-0109.health class1 riv-hd2.roslin lect-hca-004.shca csg-fin-0194.csg mvm-ri-m126083.roslin ris-vlxftp01.roslin csg-est-0023.csg www-dev.epeople-fin.humanresources oldies hca-escreen-05.shca redhot medhat csg-sss-0006.csg bigfm csg-fin-0144.csg csg-as-0000778.csg hss-health-l37.health csg-hr-0047.csg ris-vwlx03.roslin mvm-ri-d115195.roslin csg-fin-0084.csg hss-health-0023.health mvm-ri-d096210.roslin 13infst-2-openplan-mfp-col.csg mvm-ri-d126046.roslin discounts chan-1-gu438-mfp-bw.ccbs srv016.csg angrybird mvm-ri-d096068.roslin tortoise dev.services.learn sce-coll-0061.scieng csg-saf-0021.csg amprint.lts uhs002.sasg mvm-ri-l096142.roslin hss-hca-0100.shca mvm-ri-d127009.roslin hss-health-0107.health psy-pc024.ppls test.scieng health-omq-022.health csg-pps-0008.csg ed1st.csg mvm-ccbs-060423.ccbs pps-xer1.csg forensic mermoz srv045.csg zsmtp www-dev.myed www.esp.myed qmail1 sas-cas-0020.sasg stewartmacair.lts csg-hr-0048.csg mvm-ri-m096007.roslin mvm-ri-l117232.roslin ris-pvnb01.roslin hss-iad-0031.iad sas-bu-0042.sasg hss-health-0129.health dcmobile dns0.inf montezuma online-games notes2 reg-jet48.sasg csg-cse-0055.csg kurama www-dev.suppliers-admin.finance www.psc ebrsqlsrv2.roslin sas-bu-0036.sasg csg-cse-0005.csg sas-bu-0031.sasg xzone gamespot handc-pc66.shca csg-fin-0202.csg sas-bu-0025.sasg vpn118 vpn119 vpn122 vpn123 vpn124 hca-tlab-023.shca sas-bu-0020.sasg hca-tlab-017.shca hss-ppls-0077.ppls vpn101 vpn102 vpn103 vpn104 vpn105 vpn106 vpn107 vpn108 vpn110 vpn111 vpn112 vpn114 vpn115 vpn116 vpn117 vpn120 vpn121 vpn125 vpn126 hss-health-l73.health vpn109 cas-mlb3-013.sasg mvm-qmri-0113.roslin hca-tlab-012.shca auction2 kusa sas-bu-0008.sasg mvm-ri-d096114.roslin pcntterm1.ppls cas-mlb3-007.sasg mvm-ri-d107225.roslin ema5.ppls hca-tlab-006.shca ksh health-lap67.health sas-bu-0003.sasg csg-est-0242.csg cas-mlb3-002.sasg per-jet11.iad nexen ppa011.ppls hca-tlab-001.shca csg-est-0182.csg mvm-ri-d125240.roslin sce-coll-0009.scieng mvm-ri-l096177.roslin www-test.courses.myed www.epeople-fin.humanresources getlink ziani amaterasu mvm-ri-d086044.roslin mvm-gf-l115204.roslin ns-uk ns-za googleorkut sce-eccc-0002.scieng mvm-ri-d127045.roslin csg-fin-0203.csg adminstaging tetis hss-health-l12.health cale jano csg-fin-0125.csg csg-est-0022.csg hss-hca-0105.shca sas-cas-0008.sasg febe hinatabokko csg-corp-0003.csg csg-sss-0005.csg csg-fin-0143.csg mvm-ri-d086222.roslin sgw1 backup-2 ednet-fv sgw2 ltsp mvm-ri-l067160.roslin hss-health-0140.health handc-mhist24.shca csg-fin-0083.csg ppls-y2lab-210.ppls mvm-ri-m125244.roslin sce-coll-0035.scieng sas-reg-0107.sasg csg-scecc-0001.scieng csg-fin-0033.csg photosite sas-reg-0179.sasg s-1 iad-pclaptop02.iad mvm-ri-d135000.roslin kfc mvm-ri-d096221.roslin handc-mhist13.shca sciengmscs.scieng mvm-ri-d067025.roslin mvm-ri-i125096.roslin rid-vuoe.roslin www-dev.wpmservice.finance ris-vlxbio01.roslin sas-reg-0191.sasg phstl-b-postroom-mfp-bw.csg hss-hca-0090.shca csg-pps-0007.csg greymatters localhost.admin forhill-1-trades-mfp-col.csg sas-reg-0185.sasg srv042.csg mvm-ri-l115172.roslin hss-health-0104.health ebrmclsrv1.roslin sas-reg-0180.sasg hss-ppls-0030.ppls mvm-ri-d105038.roslin sas-reg-0092.sasg mvm-ri-d096150.roslin hss-iad-0030.iad sas-reg-0174.sasg mvm-ri-l137046.roslin www.timetab ril-115152.roslin rid-056189.roslin csg-cse-0054.csg mvm-ri-d107161.roslin csg-fin-0032.csg sas-reg-0168.sasg bbl-dev.vle pc02.chem ppls-labds-020.ppls csg-cse-0004.csg saf-laptop6.csg pc202.chem ris-vlxweb05.roslin mvm-ri-d065137.roslin mvm-ri-m115037.roslin pc203.chem sas-reg-0060.sasg wrk-laptop13-2.csg sas-reg-0157.sasg hss-ppls-0209.ppls mvm-ri-v086079.roslin pc93.chem hss-health-l47.health sas-reg-0152.sasg health-omq-002.health hss-health-0033.health mnc www.psr hss-ppls-ccace-lbc-01.ppls sas-reg-0146.sasg sas-leaps-0008.sasg phoenix3 mvm-ri-l097085.roslin mvm-ri-d107200.roslin mvm-ri-v115215.roslin csg-est-0301.csg sas-reg-0141.sasg sas-leaps-0003.sasg ppls-cns-srv1.ppls csg-est-0241.csg sas-reg-0135.sasg mvm-ri-l096152.roslin g2ctmdev1.ccbs csh-2-2.csg darkking rim-097065.roslin csg-est-0181.csg sas-reg-0130.sasg lib1.lib hardcore1 g2cdb2.ccbs www-test.admin.alumni.dev pc176.chem sas-dis-0019.sasg csg-est-0131.csg yokai sas-reg-0124.sasg csg-est-0140.csg www-test.api.payments health-omq-032.health eri268.roslin pha002.sasg csg-est-0071.csg sas-reg-0118.sasg csg-fin-0192.csg csg-as-0000836.csg ppls-win8-srv1.ppls csg-est-0021.csg sas-reg-0113.sasg sce-coll-0010.scieng csg-sss-0004.csg csg-fin-0142.csg csg-as-0000776.csg hss-ppls-0083.ppls dsb-g-1-mfp-col.ppls hss-ppls-0199.ppls hss-health-0139.health www-dev.fpm.finance sas-reg-0097.sasg sec01.roslin ftpadm csg-fin-0082.csg raspi1.ccns hca-mac044.shca lmn sas-reg-0102.sasg mvm-ri-d077237.roslin hca-mac038.shca sas-reg-0086.sasg meter-82-186.csg hca-mac033.shca sas-reg-0081.sasg mvm-ri-d116184.roslin tapas wrk-kbrc-g-office.csg hss-hca-0073.shca mvm-ri-l127022.roslin hca-mac027.shca sas-reg-0075.sasg www-test.readrae.planning hca-mac022.shca mvm-ri-l115146.roslin pc179.chem csg-pps-0006.csg www-dev.suppliers.finance pc83.pol csg-fin-0037.csg u22 sas-sra-0010.sasg mvm-ri-d126183.roslin hss-health-0094.health sas-intl-0004.sasg pc90.pol mvm-ri-l106019.roslin hca-mac016.shca kumako sas-reg-0064.sasg ymcmb pc92.pol ppls-onelan.ppls mvm-ri-l134240.roslin pc93.pol evet2-pc.ppls hca-mac011.shca hss-health-0110.health sas-reg-0058.sasg hss-ppls-0088.ppls csg-hr-0046.csg mvm-sbms-130280.ccns csg-est-0265.csg newhaven-webcam.scieng hss-iad-0028.iad morcom01b.ppls rim-115126.roslin mvm-ri-d125250.roslin teketeke gregg sas-reg-0053.sasg csg-cse-0053.csg coolface sas-reg-0047.sasg www-dev.miniportfolio.euclid gfd065253.roslin cassiopee csg-fin-0087.csg csg-cse-0003.csg fpweb prodweb sas-scs-0014.sasg yoda2 www-dev.dpts.drps sas-reg-0042.sasg dsb-4-7-mfp-col.ppls iron1 sas-cas-0081.sasg hss-health-l22.health hss-health-0007.health sas-reg-0036.sasg sas-cam-0030.sasg ignace zacky jeanne lr9569 health-mac002.health hss-ppls-0208.ppls sas-reg-0069.sasg vhosting sas-intl-0009.sasg csg-as-0000116.csg sas-reg-0031.sasg sci156.scieng ns1.noc sce-coll-0045.scieng vcs-126011a.roslin sas-reg-0025.sasg ppls-g26-009.ppls adrien csg-est-0300.csg antonin mvm-ri-l096073.roslin sas-reg-0020.sasg candidates fujino csg-est-0240.csg sas-reg-0014.sasg ebri053199.roslin yifan csg-as-0000782.csg network3 pplsms12trial.ppls mvm-ri-l105183.roslin extraction hss-ppls-0094.ppls sce-coll-0027.scieng health-omq-006.health media-cd csg-est-0179.csg sas-reg-0008.sasg francine ppls-mac028.ppls csg-est-0129.csg sas-reg-0003.sasg csg-fin-0147.csg csg-est-0069.csg eric2 jupiler csg-fin-0201.csg csg-as-0000835.csg boulet lsystem kampus hss-health-0114.health uberlolz jean-charles vip9 ril-v107107.roslin mvm-ri-d095048.roslin sas-sra-0021.sasg laure mvm-ri-l106055.roslin media-z csg-sss-0003.csg csg-fin-0141.csg csg-as-0000775.csg csg-hr-0080.csg silvio newhay bofh mvm-ri-d095226.roslin csg-fin-0031.csg ppls-igel-5-01.ppls mvm-ri-d085135.roslin sas-scs-0020.sasg cerc1.roslin popmedia mvm-ri-l087096.roslin csg-as-0000615.csg hostingtest baisemoi mvm-ri-d097032.roslin www-test.scs.euclid techbase sas-cam-0018.sasg hss-health-l57.health weir-g-17-sfp-bw.scieng it.dev csg-est-0026.csg csg-as-unitots2.ppls sas-intl-0015.sasg mvm-ri-d115225.roslin ris-lx07.roslin ppls-g26-015.ppls health-laptop24.health mvm-ri-l097105.roslin mvm-ri-d107209.roslin nmx1 csg-as-0000842.csg fresher hss-ppls-0110.ppls health-mac009.health bill3 csg-fin-0207.csg sas-sra-0026.sasg fanaticos mvm-ri-d137050.roslin csg-est-0076.csg wwwfacebookcom csg-est-0095.csg dsb-4-7-mfp-bw.ppls q20 csg-hr-0030.csg termo ac7 q30 webdisk.h leela.tardis csg-hr-0045.csg q46 q31 q48 q50 hss-iad-0027.iad alumni1 xlife www.pubsadmin.recordsmanagement mvm-ri-d127029.roslin mvm-ri-d107159.roslin csg-hr-0013.csg sas-reg-0010.sasg www.courses.myed q80 ppls-g26-021.ppls yasha www.announce.myed sas-sra-0032.sasg marsal q90 yanti q98 csg-cse-0052.csg www-test.course-bookings.lifelong o4 o5 health-omq-042.health 11infst-1-corridor-mfp-bw.csg mvm-ri-d115154.roslin csg-fin-0210.csg q5 q6 q7 csh-g-reception-mfp-bw.csg q9 yaniv saf-laptop4.csg csg-est-0136.csg sas-intl-0026.sasg hss-health-0003.health hss-health-l17.health ics-001.ppls mvm-ri-l097034.roslin sce-coll-0019.scieng hmx hss-ppls-0121.ppls egypt25 markie marisa csg-est-0186.csg sas-intl-0032.sasg q18 q19 sce-coll-0060.scieng q22 yahaa q24 q25 q26 q27 q28 q29 q32 q33 q34 mvm-ccns-0097.ccns q36 q37 q38 q39 q41 q42 q43 q44 q45 q47 q49 q51 q52 q54 q55 q56 tempe q57 q58 q59 q61 q62 q63 q64 q65 q66 q67 q68 q69 q71 q72 q73 q74 q75 q76 ml-3-31-sfp-bw.sasg q78 q79 q81 q83 q84 q85 q86 csg-est-0190.csg q87 q88 q89 q91 q92 q93 q94 q95 q96 q97 q99 porto.ppls mn2 ris-vlx08.roslin hss-ppls-0126.ppls research-innovation ac4 phhh-g-microlab-mfp-bw.csg sas-alumni-0023.sasg smtp-6 psy-alz-nas1.ppls q108 q110 scm2 csg-est-0246.csg csh-2-2.15-mfp-bw.csg q120 mvm-ri-i067176.roslin sas-alumni-0055.sasg wrath sasg-oldcoll-3-r299.is.ed.ac.uk.sasg g2cpxdev1.ccbs cam8 cons2 chp004.sasg q130 mrlonely ds443 ds454 ds460 steve620.ccns q40 oc-reg-g116.sasg sas-alumni-0050.sasg ppls-m-vico.ppls mx-10 mx-11 mx-12 mx-13 mx-16 mx-18 mx-19 q53 konami q160 g2csrv2.ccbs hss-ppls-0132.ppls svc3 svc4 ppls-igel-1-01.ppls ppls-psylib-01.ppls ris-vtlx01.roslin cecelia q70 cd1 sas-alumni-0044.sasg sas-intl-0043.sasg q82 q101 q102 q103 q104 q105 q106 q107 q109 q112 q113 q114 q115 q116 q117 q118 q119 q121 q122 q124 q125 q126 q127 q128 q132 q133 q135 q139 q141 q142 q143 q144 q145 q146 q147 q148 q150 q151 q152 q153 q154 q155 q156 q157 q158 q161 q162 q129 q131 q134 q136 q137 q138 q140 csg-est-0238.csg q149 q159 q163 octopus1 rim-076012.roslin csg-fin-0149.csg sas-alumni-0038.sasg q111 mvm-ri-d067177.roslin csg-est-0178.csg ds376 mvm-ccbs-060439.ccbs smtp-3 smtp-4 smtp-5 sunny123 ris-vlx09.roslin bizet csg-cse-0019.csg beaufort billold sci060.scieng mvm-ri-i045241.roslin ris-vwindev.roslin mvm-ri-l115156.roslin mvm-ri-d064175.roslin www-tmptest.star.euclid pop.be mvm-ccns-0092.ccns sas-alumni-0027.sasg csg-est-0068.csg mfe2 mvm-ri-d136024.roslin csg-fin-0189.csg malcom csg-as-0000834.csg mddb ds243 mvm-ccns-0106.ccns sas-alumni-0022.sasg ds303 ds317 ds326 ds346 ds360 mx-17 ds392 ds394 mx-20 ds411 ds445 ds450 ds457 ds458 ds459 ds461 ds462 ds463 ds464 ds465 ds466 ambro ds500 ds501 hca-netprint-col1.shca babylab3.ppls db17 hss-ppls-0137.ppls mx-5 mx-6 mx-7 mx-8 mx-9 csg-sss-0002.csg webmail.server webmail.corp csg-fin-0140.csg csg-as-0000774.csg mvm-ccns-0101.ccns sas-alumni-0016.sasg hss-hca-0040.shca mvm-ri-l106197.roslin ris-dxi01.roslin csg-fin-0080.csg rim-096009.roslin mvm-ccns-0085.ccns www.fantasyfootball sas-alumni-0011.sasg csg-est-0091.csg csg-eusu-0009.csg mvm-ri-m116133.roslin csg-fin-0030.csg mvm-ccns-0079.ccns vm153 vm154 csg-fin-0090.csg sas-alumni-0005.sasg www-dev.pod.drps hss-health-l32.health cam-mac008.sasg rid-046157.roslin hss-health-0017.health www-dev.ess.euclid mvm-ri-m115200.roslin cam-mac003.sasg mvm-ccns-0068.ccns sce-coll-0055.scieng hybridb.scifun sas-ssp-0007.sasg riv-vc03.roslin www-test.pubs.recordsmanagement hss-ppls-0149.ppls mvm-ri-d117173.roslin mvm-ri-d087114.roslin mvm-ccns-0052.ccns mvm-ri-i085236.roslin vds25 csg-hr-0044.csg dcn040225.ccbs health-omq-016.health rii-105173.roslin hss-iad-0026.iad mvm-ri-d116239.roslin sm790.ccns oc-1-221-mfp-col.sasg csg-cse-0051.csg psy-g7-pr.ppls mvm-ri-d127172.roslin csg-cse-0001.csg mvm-ri-d134254.roslin hss-ppls-0099.ppls hca-jpglab-035.shca mvm-ri-d064165.roslin mvm-ri-d096053.roslin www.1000 hss-health-0124.health ppls-igel-04.ppls hcanda-laptop12.shc mvm-ccns-0029.ccns hca-jpglab-030.shca mvm-ri-l115164.roslin hca-jpglab-024.shca g2ctm1.ccbs ebr-bcd1.roslin mainst int-usbmac4.sasg vm21 csg-est-0237.csg g2cweb2.ccbs maimai musicmusic hss-health-0086.health hca-rc-016.shca mvm-ri-v115246.roslin ppls-printer1.ppls db15 db16 mailbe9r.staffmail freekey ppls-igel-6-01.ppls hca-rc-011.shca hca-spglab-046.shca hca-jpglab-013.shca mvm-ri-d126000.roslin idb1 hss-ppls-0143.ppls vm157 cam-mac009.sasg hca-rc-005.shca hca-spglab-041.shca laser20.roslin qiwi mvm-ccbs-060437.ccbs ris-esx02.roslin hss-health-l67.health alerte mvm-ri-d096119.roslin www.mbe correio1 mvm-ri-l115131.roslin freefun rip-e02m4.roslin ebrl065182.roslin pps078.csg mvm-ccbs-060432.ccbs csg-est-0177.csg www.ww2 maheen mahaba hss-health-l29.health appleroam.csg dailydeals aswebcast.csg ris-esxi10.roslin jds skb chan086169a.roslin hca-spglab-030.shca mvm-ri-d107219.roslin ris-vlxftp.roslin mvm-ccbs-060421.ccbs csg-est-0067.csg mvm-ccbs-040220.ccbs testfms p-20 mvm-ri-d125234.roslin p-52 csg-fin-0188.csg csg-as-0000833.csg honeywell hss-health-l54.health vongola precision.lts www.bq mvm-ccbs-060415.ccbs maffia www.icc www.goto snejana csg-as-0000773.csg sra-57gsq-g-203.isg babylab.ppls hss-ppls-0148.ppls weir-g-corridor-mfp-bw.sasg gxy xuan mvm-ri-d067081.roslin hss-ppls-0218.ppls membrane ris-vwinprn.roslin www.bioprocess bye csg-fin-0078.csg cam-mac004.sasg hca-spglab-007.shca proxy.lib wfxy hss-health-l06.health round sas-dis-0028.sasg mvm-ccbs-060404.ccbs csg-eusu-0008.csg hss-ppls-0213.ppls csg-fin-0028.csg hss-ppls-adl27.ppls csg-as-0000663.csg ppls-igel-1-17.ppls mvm-ri-d086216.roslin bahnhof doc39 hca-spglab-002.shca sas-dis-0023.sasg mvm-ccns-0070.ccns hss-health-l78.health hss-ppls-0197.ppls hss-ppls-adl22.ppls mikhail health-lap01.health www.alterego data-nas1.ppls sce-coll-0029.scieng sas-intl-0059.sasg sas-dis-0017.sasg ebrl033183.roslin hss-ppls-0202.ppls horoskop tcd mvm-ri-i115102.roslin khatri hrs045.csg sas-dis-0012.sasg www.nrg vanhelsing hss-ppls-0186.ppls maddox mvm-ri-l107222.roslin hss-ppls-0013.ppls sas-dis-0006.sasg hss-ppls-0181.ppls ppls-mac032.ppls macmac hss-ppls-adl05.ppls www.dpts.drps svg ppls-mac005.ppls sas-dis-0001.sasg hss-ppls-0175.ppls hss-ppls-0154.ppls ppls-mac026.ppls www.gbs ebri042174.roslin sas-reg-0019.sasg ustar win98router1.ccns mvm-ri-v095247.roslin kristi mvm-ri-d085034.roslin amitkumar arzt csg-cse-0009.csg dean-jvcs.scieng hss-ppls-0170.ppls csg-hr-0043.csg relay8 gfl065240.roslin mvm-ri-d086121.roslin ppls-mac021.ppls alog hss-iad-0025.iad mvm-ri-d097077.roslin www.works sas-intl-0038.sasg ebri073210.roslin sci070.scieng ppls-mac015.ppls giac csg-cse-0049.csg cmsr bolero lbc-backup.ppls mvm-ri-l115166.roslin rii-115146.roslin ppls-mac011.ppls hss-health-0088.health rip-brfm9.roslin hss-ppls-0158.ppls faeebook scifunlaptop6.scifun hamer ppls-mac009.ppls auditoria intek slv12 sci115.scieng hcanda-print13.shca mvm-ri-d096144.roslin mvm-ri-d136034.roslin hss-ppls-0153.ppls asterix2 caretta ppls-mac004.ppls hss-ppls-0159.ppls studio4 csg-est-0239.csg mvm-ri-i134156.roslin wahed ris-vwinlic.roslin dongchang csg-cse-0059.csg ris-fas1a-bmc.roslin taxa tech-center bondi hss-ppls-0165.ppls mysql2a sas-intl-0058.sasg vcs-126214a.roslin gornik labirint ppls-igel-1-16.ppls hss-ppls-0147.ppls mvm-ri-i125030.roslin ppls-pc151.ppls int-usbmac8.sasg kula ucuprinter.ucu webmail.exseed vpsadmin brune mail-5 mvm-ri-d136212.roslin berk fitnes miha hss-ppls-0142.ppls zeman int-usbmac3.sasg hss-ppls-0136.ppls babylab2.ppls valeur www.tqtelethon.dev sas-intl-0033.sasg hss-health-l42.health mvm-ccns-srv1.ccns hss-ppls-0131.ppls hss-health-0027.health csg-est-0206.csg sas-intl-0036.sasg csg-est-0236.csg mvm-ccbs-060316.ccbs mvm-ri-l127148.roslin hss-ppls-0125.ppls mvm-ri-v115199.roslin idobsonvb.csg mx1.email sas-intl-0031.sasg fcms urist csg-est-0176.csg sas-sra-0036.sasg hss-ppls-0119.ppls csh-g-g3-col.csg mvm-ri-l115182.roslin elec1 www.employment csg-est-0180.csg ebri064179.roslin www.pds sas-intl-0025.sasg csg-est-0126.csg www.wrd www.dse elec2 www.elections mvm-ri-i086180.roslin arisa sas-sra-0031.sasg upanh ppls-mac022.ppls csg-hr-0053.csg mvm-ri-l096146.roslin ppls-g26-019.ppls sas-intl-0019.sasg csg-est-0066.csg mvm-gf-l115163.roslin sas-sra-0025.sasg csg-fin-0187.csg hss-ppls-0108.ppls csg-as-0000832.csg sas-intl-0014.sasg ris-onelan03.roslin csh-3-3.4b-sfp-bw.sasg sas-scs-0018.sasg sas-sra-0020.sasg sce-coll-0031.scieng health-omq-026.health hss-ppls-0093.ppls csg-as-0000772.csg omaha hss-ppls-0171.ppls ppls-g26-008.ppls chplap-bg.sasg sas-intl-0008.sasg sas-scs-0013.sasg mvm-ri-d086181.roslin csg-fin-0077.csg mvm-ri-m115138.roslin ppls-g26-003.ppls hcanda-pc71.shca s248 sas-intl-0003.sasg csg-eusu-0007.csg mvm-ri-d077054.roslin sas-scs-0007.sasg sas-sra-0008.sasg csg-fin-0027.csg hss-ppls-0082.ppls ebri003227.roslin sce-coll-0004.scieng www-test.estores.finance hss-health-0134.health sas-sra-0003.sasg cse-46pleas-1-12.csg phoenix.ppls pc5155 tuner mvm-ri-l107187.roslin sas-intl-0039.sasg wwms235igel.shca win98router2.ccns ppls-kuhn.ppls spgamers tuhin hss-ppls-adl01.ppls mvm-ri-d126250.roslin hss-ppls-0071.ppls ppls-alistair.ppls ppls-printer21.ppls hss-ppls-0065.ppls shahrukhkhan ppls-igel-7-01.ppls 46pleas-g-fasic-mfp-bw.csg ppls-printer15.ppls charlotte.scieng hss-ppls-0059.ppls bigtree.ppls ppls-mac027.ppls hss-hca-0124.shca ris-trac01t.roslin lect-hca-007.shca tsoft kpage ppls-printer10.ppls hss-ppls-0054.ppls ri-dpcs2.roslin csg-est-wmds.csg hss-health-l77.health csg-hr-0042.csg hss-ppls-0176.ppls sas-dis-0002.sasg www-test.research sergik hss-health-0135.health dancersoul sextube hss-ppls-adl06.ppls ppls-mac033.ppls csg-pps-0013.csg sas-reg-0070.sasg toxik fireblack myuser sce-coll-0005.scieng srv097.csg hss-ppls-0182.ppls hss-ppls-0048.ppls sas-dis-0007.sasg mvm-ccbs-040161.ccns saf081.csg www-test-old.jobs hss-ppls-0187.ppls testing1234 mvm-ri-d086182.roslin hcanda-laptop14.shca todoparatupc stara csg-est-0309.csg hss-ppls-0193.ppls health-omq-027.health telia frankel adult-sex sas-dis-0018.sasg data-nas2.ppls starnet1 hss-iad-0024.iad jira2 mvm-ri-d125066.roslin hss-ppls-adl23.ppls discourse hss-iad-0019.iad csg-corp-0004.csg mvm-ri-m115197.roslin hss-ppls-0198.ppls hss-hca-0113.shca hss-ppls-0043.ppls mvm-ri-d076050.roslin spoof csg-cse-0048.csg misdev csg-est-0070.csg mvm-ri-d137119.roslin mgp hss-hca-0097.shca hss-ppls-0037.ppls spiel apps.sps hss-hca-0092.shca cam-backup.sasg sony1 maildev www-dev.admin.alumni.dev hss-ppls-0032.ppls csg-fin-0191.csg mvm-ri-d136176.roslin wrw-1z-19-mfp-bw.shca hss-hca-0086.shca hss-ppls-0026.ppls ppls-atl01test.ppls srv-dht-ground-servitors.csg gu206hotdesk.lts hss-hca-0081.shca mvm-ri-v086048.roslin www.overseas hss-ppls-0021.ppls hss-health-l16.health hss-health-0002.health gwy 2004 hss-hca-0075.shca srv-lap6.isg autonation hss-ppls-0015.ppls www.logistics www.imode sas-princ-0004.sasg rip-a00m4.roslin calvintemp.ppls hss-hca-0070.shca mvm-ri-d137048.roslin mvm-ccbs-060434.ccbs lovesex hss-ppls-0010.ppls sce-coll-0040.scieng console1 j8017e.ccbs hss-ppls-0095.ppls recarga csg-cse-0027.csg hss-hca-0064.shca hss-ppls-0004.ppls iad-mac003.iad www-dev.rssjobs.careers mvm-ri-d096225.roslin sofia2 vcs-127052a.roslin mvm-ri-d117157.roslin csg-est-0125.csg evn hss-hca-0053.shca drumstanex-g-g4-mfp-col.csg srb health-omq-001.health aaao abc3 rid-086208.roslin sas-dis-0024.sasg kzn acci csg-fin-0186.csg hss-hca-0047.shca csg-as-0000831.csg mvm-gf-l115164.roslin ebrgeldoc.roslin hss-ppls-adl28.ppls mvm-ri-l127052.roslin vsys wlf hss-hca-0042.shca hss-ppls-0214.ppls giaitri bellagio csg-as-0000771.csg mvm-ccns-0078-vm2.ccns aap070.sasg hss-hca-0036.shca cbweb berserker fry l114 prodaja sas-dis-0029.sasg plavi l203 l206 l207 mvm-ri-l125095.roslin csg-srs-0005.csg hss-health-0108.health 11infst-g-genoffice-mfp-col.csg csg-fin-0097.csg zajecar aaa2 ris-igel1.roslin hss-ppls-0100.ppls csg-fin-0026.csg hss-hca-0031.shca csg-as-0000661.csg tatties.cache hns5 hns6 aap058.sasg www.apps.disability-office csg-fin-0088.csg www.audyt www.artykuly 9hpsq-printer1.csg hss-ppls-0219.ppls truffaut hss-hca-0025.shca mvm-ccbs-060411.ccbs linkbuilding zenek lib-pc-1713.isg maile www.linkbuilding audyt ppls-y2lab-212.ppls www.omniping sce-coll-0066.scieng hss-hca-0020.shca beverly-pc.ppls ppls-y2lab-206.ppls ram-marg-122.ccbs hss-hca-0014.shca bundesliga mvm-ccbs-060135.ccbs hca-netprint-bw7.shca nickolas predators sci177.scieng int-scanner-01.sasg ppls-y2lab-201.ppls csg-as-0000783.csg raiders www.testa vis009.sasg vcs-126149a.roslin sas-cas-0087.sasg hss-ppls-0190.ppls bslt tawan caba hss-health-l13.health ppls-et1.ppls hss-hca-0008.shca ruchi sci018.scieng ccbb hss-health-l52.health hca-netprint-bw2.shca wlxt sas-scs-0009.sasg ris-lx02.roslin hss-hca-0003.shca mvm-ri-l107090.roslin xbserver mvm-ri-d107204.roslin jwxt1 cfs1 cgeng.ppls hss-iad-0023.iad sas-cas-0071.sasg www.vacancies csg-cse-0047.csg sec07.roslin nptel ccnsm075.ccns csg-fin-0148.csg sas-cas-0065.sasg incubation bret dns.ee hca-lab3-mac23.shca ms-dw6-1m-8-mfp-bw.health mvm-ri-d116082.roslin homesecurity www-test.tqmobile.dev mvm-ri-m135039.roslin sas-cas-0060.sasg hca-lab3-mac17.shca csg-est-0027.csg municipios siwar tamia mvm-ri-l127149.roslin csg-fin-0209.csg sas-cas-0054.sasg mvm-ccbs-060416.ccbs www.clips mvm-ri-d115148.roslin 46pleas-g-communications-mfp-col.csg www.textads www.feed hca-lab3-mac12.shca csg-saf-0034.csg csg-est-0315.csg romuald mvm-ri-d137023.roslin csg-as-0000843.csg www.scs.euclid shared3 simmi liz sci125.scieng sce-coll-0014.scieng cerc-d001.roslin mvm-ri-l115222.roslin www-test.admin.careers csg-fin-0198.csg www.ppmd.euclid csg-est-0284.csg mvm-ri-v107133.roslin pie1.lts www.kuchnia sidra centrala maret mvm-ri-d076059.roslin sec05.roslin shiba mvm-ri-d125147.roslin shera courseware www.jt cwm1 sas-cas-0037.sasg dog1 int-jet13.sasg med-000847a.roslin mvm-ri-l107196.roslin csg-est-0234.csg csg-fin-0206.csg hss-health-0028.health www-dev.transparencyadmin.fec rifranking.roslin hss-health-0089.health www.advertise csg-est-0174.csg ppls-y2lab-129.ppls sas-cas-0026.sasg ris-valx01.roslin ppls-y2lab-124.ppls vbs-194252a.roslin pwb sas-cas-0021.sasg sheen doc22 mvm-ri-d115211.roslin csh-g-g21-mfp-col.csg csg-est-0064.csg www.dba csg-est-0077.csg ppls-y2lab-118.ppls mvm-ri-d097062.roslin csg-fin-0185.csg sas-cas-0015.sasg www.edunet drumstanex-g-office-mfp-bw.csg csg-as-0000829.csg fxnavi sci160.scieng www.edm hss-health-l43.health www.dof www.dial sci054.scieng hss-ppls-0139.ppls www.eoc www.tupc ppls-y2lab-113.ppls happykids www.goodtime geo-cc-003.scieng sas-cas-0010.sasg csg-est-0137.csg lenova ronja esig www.hac csg-as-0000770.csg summerfun www.urbandesign ppl001.sasg docweb www.look wwms00m05igel.shca mail.bote www.antivirus win2000 mvm-ri-d126187.roslin mvm-ri-d096128.roslin romel happyhome hca-spglab-031.shca setan www.lda hca-jpglab-003.shca ris-vlxweb01.roslin ppls-y2lab-107.ppls csg-fin-0075.csg www.dome sas-cas-0004.sasg flea csg-eusu-0005.csg www.course-bookings.lifelong www.pbs ppls-y2lab-102.ppls ftp.bote gem1 csg-as-0000659.csg mvm-ri-d064184.roslin ccnsm003.ccns 1brsq-1-staffarea-mfp-col.sasg hca-spglab-036.shca sweetp csg-fin-0190.csg www.mso www.hoping mvm-ri-d086058.roslin sam-test.roslin wrk-jet32.csg sas-chap-0002.sasg www.tct mvm-ccbs-060020.ccbs hss-health-l26.health www.zone csh-g-g6-mfp-col.csg www.sec hss-health-0012.health isw www.landp www.tac sas-cam-0013.sasg vis013.sasg rid-057084.roslin www.tec www.land viera www.xinyi www.msdn health-mac006.health sas-reg-0140.sasg sas-cam-0025.sasg sci161.scieng www.hw vis007.sasg hca-rc-001.shca ncm tmu-g-office-mfp-bw.csg fatimah www.retire sccm13 sas-cam-0019.sasg csg-hr-0039.csg rnd01 leland www.kolkata ms-dw6-1-genoffice-mfp-col.health sccm14 sccm16 csg-est-0247.csg vis002.sasg hss-iad-0022.iad sas-cam-0014.sasg www.hyderabad hca-spglab-042.shca cas101.sasg sce-coll-0050.scieng offprinter1.scifun www.delhi csg-cse-0046.csg sas-cam-0008.sasg 48pleas-1-union-mfp-col.csg sardi ris-boxi.roslin hca-rc-006.shca rii-105167.roslin myadm mvm-ri-i134157.roslin sas-cam-0003.sasg scifundock.scifun g2cwebdev1.ccbs ppls-igel-b-21a.ppls rstest ris-ilx02.roslin hca-jpglab-014.shca jtinspiron.ccns mvm-ri-d136035.roslin ipad3 mvm-ri-d086165.roslin hca-spglab-047.shca sccm15 mvm-ri-d107210.roslin erecording.lts mvm-ri-d077038.roslin sci100.scieng hca-rc-012.shca j23 hula oin ois ntn sek mvm-ri-d134248.roslin mvm-ri-l115186.roslin hss-health-0118.health hca-mfd-007.shca gaus mvm-ri-d076095.roslin elvs01sq01.roslin hca-mfd-002.shca dsb-lptp-4.ppls csg-est-0283.csg eniac samia scifunlaptop7.scifun www-dev.org.planning mvm-ri-d125093.roslin ppls-pc7.ppls www.alumni.dev csg-est-0233.csg ghosting01.roslin ppls-y2lab-014.ppls csg-est-0187.csg csg-est-0173.csg ppls-y2lab-008.ppls csg-est-0123.csg uranio hca-jpglab-019.shca lect-hca-008.shca ppls-y2lab-003.ppls hss-health-0090.health 1a hss-health-l62.health 7gs-g-26-mfp-bw.ppls saini csg-est-0171.csg hca-rc-017.shca ppls-carver-01.ppls csg-est-0063.csg lect-hca-003.shca ris-esxi04.roslin csg-fin-0184.csg csg-as-0000828.csg health-omq-010.health mvm-ri-d096103.roslin mvm-ri-l127168.roslin mvm-ri-l097109.roslin hca-jpglab-025.shca lax1 lect-health-003.health lccu hca-escreen-04.shca csg-fin-0134.csg csg-hr-0078.csg csg-fin-0074.csg www.adminrae.planning mvm-ri-l097130.roslin csg-eusu-0004.csg tmp-health-004.health csg-fin-0024.csg mvm-ccns-0025.ccns riley sevendays csg-as-0000658.csg mvm-ri-m135049.roslin gfl035237.roslin www-test.pure www.oma ppls-zak.ppls uhs001.sasg hss-health-l01.health rii-115142.roslin products1 ris-vbiolx01.roslin phi-aristotle2.ppls psy-pc023.ppls sce-coll-0024.scieng sas-bu-0052.sasg csg-fin-0169.csg mvm-ri-d106209.roslin fastservice ris-ifs2.roslin ppls-printer7.ppls mvm-ri-d136089.roslin c85 c88 rid-086179.roslin mailbe11r.staffmail abb csg-hr-0038.csg abi mvm-ri-m126200.roslin hss-iad-0021.iad sas-bu-0041.sasg acv csg-as-0000859.csg csg-cse-0045.csg hss-ppls-0145.ppls sas-bu-0035.sasg hss-hca-0030.shca vcs-126157a.roslin www-test.pubsadmin.recordsmanagement agp agr rodas mvm-ri-d116198.roslin mvm-ri-d067071.roslin sweetgirls mvm-ri-d126030.roslin csg-fin-0208.csg kazanova rip-brfm4.roslin csh-b-b1.5-mfp-bw.csg sas-bu-0040.sasg csg-est-0061.csg sas-bu-0029.sasg www.eit.finance sci064.scieng bff sas-bu-0024.sasg mvm-ri-l115161.roslin aom aoo ppls-deploy-01.ppls rii-115141.roslin lect-hca-005.shca mvm-ri-d125086.roslin mvm-ri-l126093.roslin ml-3-42-mfp-col.sasg hca-tlab-022.shca sas-bu-0018.sasg mvm-ri-d096138.roslin mvm-ri-l107145.roslin riv-tpiaud.roslin mvm-ri-i127149.roslin rachael.ppls bkn atu hca-tlab-016.shca sas-bu-0013.sasg avi cas-mlb3-012.sasg mvm-ri-l125159.roslin axe hca-tlab-011.shca gfl065241.roslin sas-bu-0007.sasg hss-hca-0109.shca mvm-ri-l115185.roslin bpr hca-jpglab-031.shca nordine mvm-ccns-0031.ccns cas-mlb3-006.sasg riv-hd1.roslin googlemoney hss-health-0030.health pwn3d hca-jpglab-036.shca vweb.ppls ema4.ppls hca-tlab-005.shca sas-bu-0002.sasg csg-est-0232.csg hss-ppls-0089.ppls strozzapreti.ppls cas-mlb3-001.sasg beograd iad-1208.iad hss-ppls-0040.ppls csg-est-0172.csg hss-health-l36.health mailbomber ris-vwlx02.roslin hss-health-0022.health stpeter rid-076052.roslin mvm-ri-d125025.roslin csg-est-0122.csg csg-est-0062.csg mvm-ri-d105052.roslin sce-coll-0059.scieng csg-cse-0002.csg dus enc csg-fin-0183.csg csg-as-0000827.csg www-test.employerdatabase.careers ebri063215.roslin ebrptdmr.roslin www-dev.drps mvm-ccns-0036.ccns gab tehnologija ers csg-fin-0133.csg mvm-ri-d096245.roslin zerberus hss-hca-0104.shca cse-kiosk2.csg sas-cam-0009.sasg csg-fin-0073.csg mvm-ri-v105134.roslin csg-srs-0002.csg csg-eusu-0003.csg handc-mhist17.shca eyi csg-fin-0023.csg ghh fse health-omq-021.health redif ris-trac01.roslin ftr mvm-ri-d094162.roslin punit gmx gon gpl sas-reg-0106.sasg handc-mhist12.shca mvm-ri-d086175.roslin www-test.wiki csg-cse-0011.csg ifl ebri053171.roslin hss-health-0128.health handc-mhist01.shca sas-reg-0190.sasg jaz mvm-ri-d067021.roslin hss-ppls-adl10.ppls ebrsqlsrv1.roslin raven.ppls sas-reg-0184.sasg itl hss-hca-0088.shca data-nas1b.ppls sas-reg-0178.sasg sce-coll-0020.scieng speedgroup jmr csg-hr-0037.csg jmx vbs-194198a.roslin sas-cas-0082.sasg hss-iad-0020.iad kme kml sas-reg-0173.sasg sas-intl-0056.sasg koi reg-jet1.csg syndicate hss-ppls-0028.ppls mvm-ri-d126004.roslin sas-reg-0091.sasg mvm-ccns-0047.ccns csg-cse-0044.csg mvm-ri-i064167.roslin mvm-ri-d095105.roslin sas-reg-0167.sasg sci038.scieng hss-health-l72.health sas-reg-0162.sasg mvm-ri-d096113.roslin kindzadza mvm-ri-d107224.roslin wwms227igel.shca sas-reg-0156.sasg csg-as-0000684.csg dragonz health-lap66.health dragoon cor-jet3.csg dragon2 csg-est-0255.csg thunderbolt-display2.scieng www-uat.star.euclid sas-reg-0151.sasg mvm-ri-d064168.roslin mvm-ri-l125134.roslin prc haymarket rca csg-hr-0054.csg mvm-ri-i115103.roslin mvm-ri-d084163.roslin raged mvm-ri-d125238.roslin hss-hca-0083.shca rog rii-087001.roslin sets.sps wwms236igel.shca tfc sas-reg-0145.sasg sas-leaps-0007.sasg csg-hr-0070.csg csg-fin-0050.csg mvm-ccns-0053.ccns mvm-ri-d087154.roslin swt sce-eccc-0001.scieng eplab1.ppls sas-reg-0139.sasg sas-leaps-0002.sasg tash hillier-mac.sasg sas-reg-0085.sasg health-pc94.health hss-health-l11.health csg-est-0231.csg mvm-ri-d115168.roslin www-dev.estores.finance tornado.ee sas-reg-0128.sasg xio g2cdb1.ccbs capturedroslin01.roslin sce-coll-0034.scieng csg-est-0121.csg qihaa sas-reg-0123.sasg www-test.announce.myed sowa mvm-ri-l127135.roslin mvm-ri-d095098.roslin autodiscover.exseed sas-reg-0117.sasg dishnetwork cheapshopping csg-fin-0182.csg emanuel ebri053213.roslin csg-as-0000826.csg www-test.alumni.dev percheron atlantia mvm-ri-l107226.roslin www.moregames hss-ppls-0203.ppls pspinfo castillo adcity sas-reg-0112.sasg prash llano mvm-ri-d067024.roslin hss-health-0103.health psy-adam-moore.ppls en-macmini.ppls mvm-ri-d117137.roslin sas-reg-0096.sasg cse-kiosk1.csg csg-fin-0072.csg sas-reg-0080.sasg www-dev.ppmd.euclid csg-pps-0014.csg www.artdesign csg-srs-0001.csg ris-vwinwja.roslin srv098.csg hca-mac043.shca yourfuture sas-reg-0101.sasg ponco mvm-ri-d085106.roslin vangogh www.interior tran brawler www.thehacker www.oblivion milagro csg-fin-0022.csg geac-annex www.patty hca-mac037.shca www.ambiente csg-saf-0008.csg www.classics mvm-ccns-0064.ccns sci074.scieng rii-105220.roslin mvm-ccns-0069.ccns sce-coll-0052.scieng ppls-mac-jk.ppls travelguide lib-pc-1708.isg sas-alumni-0049.sasg hss-health-0093.health sas-alumni-0001.sasg mvm-ri-m125235.roslin cam-mac010.sasg arcl-hpgen7.shca hca-mac032.shca csg-corp-0005.csg sas-reg-0079.sasg aec psy-kiosk01.ppls am5 ags uren ajv fuckers sas-dis-0013.sasg bel kogepan gfl075243.roslin hca-mac026.shca sas-reg-0074.sasg csg-saf-0026.csg estates.csg ril-115151.roslin hca-mac021.shca sas-reg-0068.sasg hca-tlab-009.shca scimac.scieng hca-mac015.shca sas-reg-0063.sasg vhost01.scieng rip-b01m4.roslin hca-mac009.shca sas-reg-0057.sasg csg-hr-0036.csg ebri023184.roslin geo-cc-006.scieng hss-iad-0018.iad fun-zone anarosa mvm-ri-v086078.roslin www.crb cnd hss-health-l46.health coi dgc hca-mac004.shca sas-reg-0052.sasg www-test.org.planning hss-health-0032.health csg-cse-0043.csg leven sas-alumni-0006.sasg mvm-ri-m115214.roslin osoft lisa.ppls csw www-test.dlhe.careers sas-reg-0046.sasg chocolates mvm-ccns-0081.ccns mvm-ri-d077055.roslin rip-c01m3.roslin csg-pps-0030.csg health-lap63.health www-dev.transparency.fec sas-reg-0041.sasg ebri043221.roslin sas-cas-0080.sasg fcl mvm-ri-l125108.roslin green5 pinki fdp sas-reg-0035.sasg llc-staff-pc2.shca sas-alumni-0012.sasg mvm-ri-l137152.roslin ycfc mvm-ri-l086031.roslin sas-reg-0030.sasg mvm-ri-d127018.roslin sas-reg-0024.sasg health-omq-031.health lafamilia csg-fin-0109.csg mvm-ccns-0086.ccns wsprueba mvm-ri-d107221.roslin gic eri267.roslin wrk014.csg csg-est-0280.csg sas-reg-0018.sasg hdc gnp gox csg-est-0205.csg theparty csg-est-0229.csg sas-reg-0013.sasg sce-coll-0008.scieng hrh philo jac jad rii-045132.roslin mvm-ri-l115216.roslin salavirtual htt csh-3-3.7-sfp-bw.sasg ppls-polar2.ppls sas-reg-0007.sasg ucsisa2.csg php10 csg-hr-0049.csg jhs hss-ppls-0039-dsb.ppls sas-reg-0002.sasg lect-hca-001.shca jmc shilo jmj mvm-ri-d076041.roslin csg-est-0059.csg csg-fin-0181.csg csg-as-0000825.csg aberdour.ee nylon ccslaptop.scifun kmh satin laxman csg-fin-0100.csg ldu ris-vlxweb04.roslin csg-est-0009.csg csg-fin-0131.csg mvm-ri-l127120.roslin mlh csg-as-0000765.csg mvm-ri-d096109.roslin vbs-194232a.roslin mvm-ri-l117190.roslin www-test.rae.planning mui most-wanted bettyboop ris-115173.roslin ppls-printer6.ppls health-omq-011.health csh-g-g12-sfp-bw.csg csg-fin-0071.csg mvm-ri-d107056.roslin 7brsq-g-1.204-mfp-col.iad www.hesa.star.euclid ebri073178.roslin pcl omf ris-esxi11.roslin www.electronica www.electronics precor-demo.csg mvm-ri-l127049.roslin sas-alumni-0033.sasg sty001.csg csg-saf-0057.csg raz www-test.etime.finance rdx csg-fin-0021.csg mvm-ccns-0102.ccns sas-reg-0039.sasg rix www-test.reward.humanresources sel health-omq-013.health mvm-ri-l097129.roslin www-dev.course-bookings.lifelong uncharted mvm-ri-d057106.roslin at-g-office-mfp-bw.csg ebri013160.roslin www-dev.pubsadmin.recordsmanagement mvm-ri-d064178.roslin www.blackfire tce amusement csg-as-0000784.csg csg-as-unitots1.ppls mvm-ri-l096186.roslin hca-mac010.shca ssn mvm-ri-d076232.roslin mvm-ri-m135070.roslin uea hss-health-0119.health mvm-ri-d117233.roslin mvm-ri-v125248.roslin www-test.student-experience hss-health-0100.health hss-health-l21.health dsb-et2.ppls vll csg-est-0085.csg csg-fin-0150.csg hss-health-l68.health mvm-ri-d115178.roslin hss-health-0006.health wse www.hugoboss emasonmac.ppls www.boxing pcline csg-hr-0019.csg maquinaria csg-hr-0035.csg jayaprakash saf074.csg smartcom andrade hss-iad-0017.iad mvm-ri-l107058.roslin www-test.eves.myed elshady scieng2.scieng health-hopepark-print1.health ris-esx03.roslin csg-cse-0042.csg hss-hca-0110.shca pauls sweetdreams cubeworld sce-coll-0044.scieng sprinkler hss-hca-0049.shca mvm-ri-l096125.roslin www.explore gfl035236.roslin acac mbplvdev2.ccns xeroxbd.ccbs mvm-ri-l077167.roslin csg-fin-0200.csg www.ess.euclid csg-fin-0171.sasg www.wonderful vcs-167225a.roslin sas-alumni-0059.sasg health-omq-005.health mvm-ccns-0096.ccns aila juanjo yingyang sas-alumni-0054.sasg mvm-ri-d077041.roslin sas-alumni-0048.sasg vbs-19475a.roslin amix alvi csg-est-0278.csg g2csrv1.ccbs mvm-ri-l115181.roslin mvm-ccns-0107.ccns hss-health-0113.health csg-as-0000844.csg b4-et-host.ppls hotwear bing paseo caph saltoftheearth www-dev.star.euclid avel ceci hss-ppls-0160.ppls ppls-colwyn.ppls csg-fin-0199.csg sas-alumni-0037.sasg mvm-ri-l107165.roslin parin ceus axon mvm-ri-d127112.roslin csg-est-0168.csg waverley-p4 csg-sec-0032.csg swanston-jvcs.scieng cire ppls-osxsrv-7gs.ppls cita csg-fin-0110.csg dass health-lap-029.health sas-alumni-0032.sasg tommy-lap.trg mindgames deck khalifa cpam csg-est-0118.csg dm4u sas-alumni-0028.sasg affirm.sps csg-cse-0010.csg webcam.scieng risen rim-086213.roslin digitalnet sas-alumni-0026.sasg cssc csg-est-0058.csg zap178a.roslin edam csg-fin-0180.csg starlive csg-as-0000824.csg cyds mvm-ccns-0105.ccns mvm-ccns-0091.ccns sas-alumni-0021.sasg csg-est-0008.csg mvm-ri-d097031.roslin faty rbci083206.roslin csg-fin-0130.csg emailpro mvm-ccns-0090.ccns emis epsa fide gabe sysinfo sas-alumni-0015.sasg hss-health-l56.health sahid ccace-media-pc.ppls esme mvm-ri-l125020.roslin garo csg-fin-0069.csg csg-fin-0096.csg csg-est-0267.csg www-dev.jams.finance even sas-alumni-0009.sasg mvm-ri-d126156.roslin gets fora habo rim-117144.roslin hass csg-saf-0056.csg betaversion mvm-ri-l097104.roslin csg-fin-0020.csg csg-as-0000777.csg cam-mac013.sasg grin mypix mvm-ccns-0078.ccns homa csg-est-0138.csg mvm-ri-l134245.roslin jaco noris ikka atl2-1 jaza sas-alumni-0004.sasg cam-mac007.sasg inso csg-fin-0079.csg iona atl2-2 cam-mac002.sasg ipop mvm-ri-l137162.roslin irce mvm-ccns-0067.ccns kafu csg-as-0000243.csg waverley-p5 myers ghosting02.roslin waverley-p3 waverley-p1 mvm-ri-m116086.roslin mvm-ri-d127028.roslin kosmetyki saga3 lalo atl2-3 atl2-4 sas-intl-0060.sasg beans.cache sas-alumni-0034.sasg koru ebri093151.roslin m.cod sas-ssp-0006.sasg mvm-ri-i065202.roslin noman m.mcp health-omq-041.health ris-hpcx01.roslin eplab4.ppls nerv nexa sas-cas-0076.sasg mvm-ri-d086205.roslin franking.sasg www.wpc m.vip musi mvm-ccns-0093.ccns padi oldcoll-2-corridor-mfp-col-1.csg srv028.csg blackdiamond nagios2.ppls www.coaching mvm-ri-l127092.roslin smartshop www.star.euclid gfl-117117.roslin mvm-ri-m106026.roslin rii-115122.roslin opps csg-hr-0034.csg www.gameonline sce-coll-0018.scieng lindy.ppls mvm-ri-i075201.roslin hss-iad-0016.iad pcscifun7.scifun psic mvm-ccns-0045.ccns mvm-ri-l085157.roslin resa www.creativity sec10.roslin sape csg-fin-0089.csg csg-nad-003.csg csg-cse-0041.csg csg-est-0188.csg rody sert mvm-ri-d096194.roslin timeshare rope penelope.sie shey mutaz statusuri sige sigi csg-fin-0029.csg sas-alumni-0040.sasg is-apps-0094.isg temp-wipe.ppls mvm-ri-l137067.roslin mvm-ccns-0034.ccns herpderp suka gfl-117141.roslin www.habbohotel csg-saf-0049.csg audiovisual med-000407.isg wars www.forsale uuuu iroquois munir lordanime pacwest csg-cse-0029.csg yari xmac ed1stcatering.csg mvm-ccns-0080.ccns hca-jpglab-028.shca csg-est-0248.csg zape yiyo zhan newhaven-gss.scieng jwhite cocacolo sas-alumni-0045.sasg workforce geos-d-0036.scieng sisco nitin animaco mvm-ri-l116088.roslin tuki topmovies mvm-ri-d116203.roslin sasg-oldcoll-g-foy-2.sasg ppls-printer5.ppls mvm-ccns-0023.ccns mvm-ccbs-060453.ccbs mundodigital ppls-psylib-02.ppls hca-jpglab-023.shca g2cweb1.ccbs hca-rc-015.shca www.megaupload hca-jpglab-017.shca www.portugal delarosa dextroyer www.steven soporteinformatico mvm-ri-l115155.roslin www.atlantis g2csrv3.ccbs hca-rc-010.shca shinyshop nikky jewelery emporio hca-spglab-045.shca ris-vblx04.roslin mvm-ccbs-060442.ccbs postales hca-jpglab-012.shca mvm-ri-d076064.roslin www.salfor.finance timetoshine hca-rc-004.shca dontask mrgud esolution www.muzica9 hca-spglab-039.shca www.chistes bendice vis-hp1.sasg megamanx moxie hss-health-0125.health mvm-ri-i135018.roslin hca-jpglab-006.shca sas-reg-0029.sasg csg-est-0308.csg help.sps sas-alumni-0051.sasg mvm-ri-d134255.roslin monop hca-spglab-034.shca mvm-ri-d115189.roslin cateringopsprint.csg hca-jpglab-001.shca ppls-util.ppls ebrm073200.roslin bahia socialnet mvm-ri-d115021.roslin balde wrw-g-8-mfp-bw.shca webmail.beta dsb-lptp2.ppls www.habboretro monal artecultura www.totalwar csg-est-0117.csg ipv4.beta devreports ns.beta star4ever ppls-g26-test.ppls csg-est-0057.csg mvm-ccbs-040218.ccbs www.readrae.planning abelnf csg-fin-0178.csg www.literature contractors www.smartnet csg-as-0000823.csg mvm-ri-i135017.roslin hca-spglab-017.shca lync2010 hss-health-0016.health mvm-ccbs-060414.ccbs snafu csg-fin-0128.csg edgesight ris-fasdev.roslin darkhacker reg-oc-ho.sasg elitesports www.cristina pfp health-mac011.health hca-jpglab-008.shca hca-spglab-012.shca mdi kinera rock-2 antonyo sas-dis-0033.sasg vbs-lap1948a.roslin blackbear hss-ppls-0217.ppls actecs csg-fin-0068.csg mocco sas-alumni-0056.sasg sce-coll-0054.scieng hybrida.scifun www.shakira sas-dis-0027.sasg mvm-ccbs-060403.ccbs pat0.roslin edunet hss-ppls-0212.ppls eltigre csg-saf-0055.csg csg-fin-0176.csg csg-fin-0018.csg calis campi hss-ppls-adl26.ppls lukka artstudio mvm-ri-i066099.roslin csh-2-2.15-bw.csg www.protektor luken thelion vbs-laptop01a.roslin www.playgames hss-ppls-0206.ppls importaciones www.alexgames wrk-laptop2.csg hss-ppls-adl21.ppls www-test.transparency.fec sas-dis-0016.sasg deg hss-health-0096.health happyfeet hss-ppls-0201.ppls ppls-trans.ppls refused 20gilmerton-g-office-mfp-col.csg nazia rayitodeluz habboweb www.parking health-omq-015.health sas-dis-0011.sasg www.fotoalbum www.shemale borax hss-ppls-0185.ppls bienestar zyngachips health-omq-017.health brokendreams mvm-ri-d077115.roslin looking nasir hss-ppls-adl09.ppls m.rai ris-vlxrt.roslin sas-dis-0005.sasg hss-ppls-0180.ppls puzzles bandas www-tmpdev.star.euclid darkblood ms-dw6-2-15-mfp-col.health mvm-ccbs-040169.ccbs ppls-mac031.ppls pib mk13 csg-est-0279.csg habbonet mk2 nandi hss-ppls-adl04.ppls mvm-ri-d077043.roslin mvm-ri-d134253.roslin baster opensocial ppls-pc159.ppls miron alerta hss-ppls-0174.ppls csg-cse-0012.csg skyonline myshopping www.practicas alivio tokunaga mvm-ri-d096242.roslin mvm-ri-l115191.roslin ppls-mac025.ppls flamenco hss-health-0123.health ppls-pc154.ppls www.transformice minna amigas hss-ppls-0168.ppls csg-hr-0033.csg teenchat relojes mvm-ri-d095131.roslin nadav numismatica kampala ppls-mac019.ppls www-test.miniportfolio.euclid casagrande buenavista mvm-ri-l107175.roslin hss-iad-0015.iad mvm-ri-d137169.roslin kaffee ppls-mac014.ppls ebri063164.roslin csg-cse-0040.csg webmastertools sas-intl-0037.sasg antrax ecci-jh.scieng rim-115171.roslin mvm-ccns-0063.ccns hss-ppls-0157.ppls csg-fin-0219.csg seguros ppls-mac008.ppls oldcoll-2-corridor-mfp-col.csg www.lacoste sbmacbook.ppls appsgt www.cityweb sas-intl-0063.sasg www.universe sce-coll-0056.scieng hss-ppls-0152.ppls arceus ppls-mac003.ppls hss-iad-0037.iad www.employerdatabase.careers sas-intl-0057.sasg bda minaret.ppls webmsn mvm-ri-l094187.roslin space3 ris-esx01.roslin hss-ppls-0146.ppls sas-mac001.sasg jzj sci033.scieng www.rae.planning eulib old.search csg-est-0230.csg hss-health-l66.health int-usbmac7.sasg loyal mailwfe5.staffmail mailwfe7.staffmail mvm-ri-i005076.roslin hss-ppls-0141.ppls int-usbmac2.sasg mvm-ri-d096107.roslin www-dev.secure.vle mvm-ri-d127244.roslin cen reza1 csg-hr-0055.csg sas-intl-0046.sasg mvm-ri-d107218.roslin chd lect-health-007.health clb www.downloads.euclid hss-ppls-0135.ppls rid-056021.roslin dbz services.learn hss-ppls-0129.ppls mvm-ri-d125022.roslin cylon mvm-ri-d125233.roslin hss-health-0018.health hca-lab3-mac29.shca tortilla asesor hss-health-0138.health mvm-ri-l126240.roslin mvm-ri-d115201.roslin cvc sas-intl-0035.sasg mvm-ri-l096171.roslin ecu www-test.ess.euclid hss-ppls-0124.ppls roslin-dc sas-intl-0030.sasg www.jams.finance csg-est-0166.csg csg-sec-0029.csg dti mvm-ri-d067079.roslin sas-sra-0035.sasg mvm-ccbs-060310.ccbs hss-ppls-0118.ppls ppls-g26-024.ppls eoc sas-intl-0024.sasg monkeys csg-est-0116.csg hss-hca-0062.shca digger rmsbigsave hss-health-l05.health arturo virtualgames sas-sra-0030.sasg mvm-ccbs-060294.ccbs www.kira flg ppls-7gs-011.ppls winocular atenas learnspanish ppls-g26-018.ppls csg-est-0169.csg capcap doc-e-fil sas-reg-0183.sasg metod m.people csg-est-0056.csg csg-sec-0033.csg www.usana pantherplace carols calentamientoglobal sas-scs-0023.sasg sas-sra-0024.sasg csg-fin-0177.csg hss-ppls-0097.ppls www.blackandwhite csg-as-0000822.csg ibn www.vega hlm bus-routes ppls-g26-013.ppls catweb mvm-ri-d137037.roslin fahrenheit jck atomix sas-intl-0013.sasg icue ipf ebri053211.roslin www.borderweb itt fivestar1 gtmbigsave estadistica searchme habbinfo gmsbackpack www.vanguardia sce-coll-0028.scieng cyberchat 11infst-1-fsu-mfp-col.csg kicker sas-sra-0018.sasg iparent lec pinkribbon lio kui csg-fin-0127.csg hss-ppls-0092.ppls ppls-g26-007.ppls nursietoo.ppls sas-intl-0007.sasg boombang ecopro 33bp-g-reception-mfp-bw.sasg lsu sas-scs-0012.sasg sas-sra-0013.sasg csg-fin-0067.csg hss-ppls-0086.ppls mvm-ri-svcen.roslin freemovies ppls-g26-002.ppls mvm-ri-d096214.roslin mvm-ri-d136094.roslin sas-intl-0002.sasg csg-saf-0054.csg www.coffeebreak sas-scs-0006.sasg sas-sra-0007.sasg csg-fin-0017.csg nrc hss-ppls-0081.ppls csg-as-0000652.csg psy-elaine-niven.ppls csg-hr-0061.csg hss-health-l33.health sas-sra-0002.sasg wrw-3-06-mfp-bw.shca mvm-ri-d136220.roslin www.watson verizon wwms313igel.shca flawless ril-026062.roslin csg-pps-0015.csg cybersoft srv109.csg ova www.vital cyberstop ppls-atlab-001.ppls matty themusic csg-hr-0040.csg mvm-ri-l117220.roslin www.philosophy hss-ppls-0069.ppls rip-brfm8.roslin www.freelance riv-amxwap.roslin rjc mvm-ri-d097076.roslin ppls-printer20.ppls ebri073208.roslin hss-ppls-0064.ppls tmu-g-trades-mfp-bw.csg sci068.scieng mvm-ri-l115165.roslin www.earnmoney marwa www-test.ermis.planning shk hss-health-0087.health rim-107122.roslin masla dulce ppls-printer14.ppls bonami csg-as-unitots3.ppls lewis-mac.ppls mvm-ri-d125091.roslin scifunlaptop5.scifun mvm-ri-d095032.roslin csg-est-0093.csg pcs4000-5001.roslin mvm-ri-l115159.roslin mvm-ri-d076074.roslin hss-hca-0123.shca srv026.csg ppls-polar1.ppls stn mvm-ri-d077185.roslin mvm-ri-m136033.roslin vmlgen-pc.ppls tml sas-intl-0021.sasg hss-hca-0117.shca findlove csg-hr-0032.csg peffer-g-office-mfp-bw.csg hss-ppls-0047.ppls chacal chacho ttm sas-cam-0020.sasg ulp hss-iad-0014.iad nrg5.ppls csg-corp-0006.csg csg-hr-0011.csg hss-hca-0112.shca chavez mvm-ri-l136096.roslin csg-nad-001.csg wdb hss-ppls-0042.ppls boxing ppls-y2lab-001.ppls csg-saf-0027.csg boxnet csg-cse-0038.csg scs-onelan.scieng motorcu www.warlords madeleine d194135a.roslin hss-iad-0010.iad www.landing enric hss-hca-0096.shca ppls-tilllptp.ppls hss-ppls-0036.ppls csg-fin-0197.csg www.pod.drps csg-est-0060.csg hss-ppls-0109.ppls xam sce-coll-0041.scieng michaeljordan hss-health-l41.health www.elegantmodel macad.ppls evilempire smartdesign mvm-ri-d115208.roslin dagmar valles hss-ppls-0031.ppls ppls-hegel.ppls vabel marea mvm-ri-d107246.roslin hss-health-0026.health arquitecto bestchoice hss-hca-0085.shca comentarios yoel hss-ppls-0025.ppls mvm-ri-v115198.roslin www-test.ppmd.euclid sci175.scieng fatos www.fina sce-coll-0064.scieng clanak goldenstar hss-hca-0079.shca ribbon cech www.dinamico hss-ppls-0019.ppls neurosys meandyou www.laptops djzone www.videogames wrk059.csg www.taekwondo bungie printer25.ppls prismatic hss-hca-0074.shca www.demoshop hss-health-l50.health mac-skype.csg jantar ris-vblx06.roslin mvm-ri-l115157.roslin www.nintendo cifs mvm-ri-l096145.roslin www-test.timetab csg-as-0000735.csg est-forhill-g-trades2.csg gfl075344.roslin www.deltaforce sce-coll-0049.scieng sas-princ-0003.sasg sci061.scieng cocina codigo csg-as-sacconference.csg artesanias mvm-ri-d116071.roslin www.skating pacifico csg-cse-0034.csg www.ape hss-ppls-0008.ppls manar sas-scs-0019.sasg csg-est-0225.csg ris-onelan02.roslin www.cbc hss-hca-0063.shca health-omq-025.health manan ebri073201.roslin hss-ppls-0003.ppls csg-est-0165.csg hss-ppls-0104.ppls est051.csg csg-sec-0028.csg www.dam www.dcc mvm-ri-d067178.roslin devsys www.cpt www.cri www.xl hca-lab3-mac25.shca corpuschristi mall5 mall4 www.edy www.eet hss-hca-0057.shca contactanos cortex ppls-g26-010.ppls mall2 mvm-ri-m115137.roslin www.ems lissa csg-as-0000785.csg rip-brfm1.roslin csg-est-0115.csg int-jet5c.sasg signs hss-hca-0052.shca sce-coll-0003.scieng mainy www.fra csg-fin-0151.csg cristovive csg-est-0055.csg plazma holyrood-le1 majda holyrood-le0 www.reward.humanresources csg-est-0030.csg controlcenter www-test.events hss-health-0133.health rim-076013.roslin lion1 creato espf.ppls hss-hca-0046.shca www.hun csg-as-0000821.csg www-test.admin.eves.myed ppls-kiosk-01.ppls axa-hrm csg-est-0005.csg rip-c02m4.roslin www.boombang sas-intl-0010.sasg macka ctx2 csg-fin-0126.csg djdark hss-hca-0041.shca mvm-ccns-0078-vm1.ccns metsa-ctx est026.csg csg-fin-0066.csg www.nostalgia dinero inditex hss-hca-0035.shca szukajpracownika vbs-194162a.roslin escuela o1.email.praca empikbeta bdb-1-finance-sfp-bw.ccbs ris-vlxgw01.roslin aap063.sasg scanner-b62959b.csg csg-saf-0053.csg sas-sra-0015.sasg boygirl extremedream www.corina www.nak www.ned csg-fin-0016.csg evaluaciones hss-hca-0029.shca csg-as-0000651.csg mvm-ri-d086118.roslin camaieu sas-reg-0161.sasg hca-lab3-mac20.shca djneto bluesoft www.oli rivoli hrkim.ad hss-hca-0024.shca www.pim www.osi mvm-ri-d107202.roslin xpr-touchscreen.shca www.ganoexcel bitbyte mvm-ccbs-060145.ccbs www.pti hrm2 www.raw ofertypracy holaholahola kv.ad ri-dpcs1.roslin ppls-y2lab-211.ppls kokos pp4sspc6.scifun www.nelson hss-health-l76.health www.sav www.mifamilia www.sk8 www.rac www.sig hss-hca-0018.shca www.onedirection mailbe12r.staffmail tokio www.stc ecosol fin210.csg multikino ppls-mbook01.ppls ppls-y2lab-205.ppls do.atman-isp hss-hca-0013.shca jbr csg-as-0000845.csg transglobal hca-netprint-bw6.shca ppls-y2lab-200.ppls canizares sas-cas-0086.sasg vesuvius www.vid hss-hca-0007.shca erptemp.ppls ultimategames seminario mvm-ccns-0030.ccns hca-netprint-bw1.shca biggboss orca.ppls csg-fin-0211.csg lemot firenet mvm-ri-i115172.roslin www.wot mvm-ri-d064173.roslin mvm-ri-d067070.roslin hca-jpglab-029.shca ris-vtlx02.roslin dmusic csg-hr-0081.csg mvm-ri-d125243.roslin www.xyz jully www.tutorials csg-est-0079.csg 4life rid-056211.roslin hss-hca-0002.shca kincaids-cctv4.csg kb-canon2.csg msantos hss-health-0101.health alex24 sas-scs-0008.sasg csg-hr-0031.csg www.vampires satisfaccion mvm-ri-d096170.roslin autotech galaxia sas-sra-0009.sasg mileycyrus nikolas mvm-ri-d086047.roslin lib-mac-009.trg hss-iad-0013.iad www.worldsport csg-eusu-0001.csg mvm-ri-d104172.roslin redox sas-cas-0069.sasg csg-cse-0037.csg starprogging.ppls www.animemanga gameday games11 gamenew gamertv welding hss-health-l15.health ccnsm074.ccns eljoker www.futbolmundial kallisti www.soporteinformatico nextgeneration sas-reg-0004.sasg www.reading hss-health-0001.health www.robotic radiostyle guidance www.pirate newwave casanet psychlaptop.ppls www-test.adminrae.planning mvm-ri-l127110.roslin fanime rankings hca-lab3-mac22.shca edadfed isitech rastaman ms-dw6-2m-0-mfp-col.health mvm-ri-l067163.roslin sas-cas-0058.sasg gfd075245.roslin elblog www.numbers phstl-g-reception-mfp-bw.csg www.informatika sce-coll-0038.scieng catcher mvm-ri-i005193.roslin csg-scecc-0004.scieng handbags lib-mac-011.isg stellamaris et-dsb-b04.ppls sas-cas-0042.sasg elixir sas-sra-0004.sasg thunderbolt-display.scieng hca-laptop-006.shca rogerio ris-redi01.roslin wwms226igel.shca sas-cas-0036.sasg sas-reg-0150.sasg insplap.scifun csg-est-0139.csg csg-est-0224.csg mvm-ri-l086049.roslin lamis teu009.csg lamer www.playlist sas-cas-0031.sasg csg-est-0164.csg csg-sec-0027.csg lambo ppls-y2lab-128.ppls ccnsm035.ccns sas-cas-0070.sasg ebri053150.roslin mvm-ri-l137093.roslin epicfail onlinesv bbox sas-cas-0025.sasg mvm-ri-i075149.roslin andr mvm-ri-l115175.roslin hss-health-0097.health csg-est-0114.csg vijay123 netc junior12 asan arsa ris-vnlx01.roslin www.webzone ppls-y2lab-123.ppls sas-reg-0009.sasg sas-cas-0019.sasg lib-pc-1707.isg ccgh worldclub business-school www.nextel boda csg-est-0054.csg ppls-y2lab-117.ppls mvm-ri-d096206.roslin envole godknows stargames csg-fin-0175.csg happyhappy hca-jpglab-018.shca sas-cas-0014.sasg csg-as-0000820.csg creditos csg-est-0200.csg sas-alumni-0058.csg darkhell ris-vlx10.roslin csg-est-0004.csg ppls-y2lab-112.ppls jozef edel mvm-ri-i085148.roslin csg-as-0000759.csg wwms01m20igel.shca egac forums5 josua gatoman ppls-y2lab-106.ppls fede moonster csg-est-0135.csg khanh motoshop csg-fin-0065.csg cyberstore miweb sas-cas-0003.sasg neeps.cache mypag esma galt estudio csg-saf-0052.csg geco foci folk ppls-y2lab-101.ppls darkzone gavilan escool csg-fin-0015.csg ebri023188.roslin www.zoom hss-health-l51.health webdisk.student www.smartdesign autoconfig.student www.pubs.recordsmanagement jordy mvm-ri-l085045.roslin www.legends ris-lx01.roslin gamess lauren-lptop.ppls obelisk sas-reg-0015.sasg jags ebri013159.roslin backup-kbserv2 mvm-ri-d107203.roslin sas-chap-0001.sasg www-dev.admin.drps mvm-ri-l134239.roslin lelman20.ppls ketty www.hero jesu ipsa www-devupg.myed vcs-126125a.roslin isam sas-cam-0029.sasg ris-buildlx02.roslin sbvm2012.ppls irys kass mvm-ri-l115228.roslin www.animeworld vis012.sasg malaika jomar avaluos jmmp sas-cam-0024.sasg homosexuales mvm-ri-l137156.roslin ebrilx093139.roslin rim-097068.roslin tsuki csg-hr-0079.csg www.goddess vis006.sasg csg-est-0249.csg kincaids-cctv3.csg hss-health-0099.health lau03.roslin csg-hr-0029.csg www.abcde sce-coll-0021.scieng health-omq-035.health lgbt kosh proxycom vis001.sasg samadhi hss-iad-0012.iad mvm-ri-d107140.roslin winsrv2.ppls evelin health-lap-seminar.health sas-cam-0007.sasg floral ris-ptesxi.roslin sce-coll-0013.scieng csg-as-0000209.csg sas-cam-0002.sasg mvm-ri-l115221.roslin ppls-imac-01.ppls www.bandy www.banks www.barra musiconline mvm-ri-i136255.roslin murali csg-fin-0019.csg sec04.roslin hca-jpglab-007.shca www.alone sas-reg-0021.sasg mvm-ri-d096188.roslin mvm-ri-l097195.roslin sci034.scieng mvm-ri-d117131.roslin www.blackboard lib-mac-010.isg www.annie jlink mvm-ri-l127231.roslin castelli sanchez mrcs www.language www.bible www.tata mvm-ri-m135069.roslin www.arias www.aries hss-ppls-0061.ppls hca-mfd-006.shca sheridan shishi mvm-ri-d127198.roslin csg-est-0333.csg holyrood-kbserv3 holyrood-kbserv2 www.blast hca-mfd-001.shca sampler excess csg-est-0310.csg satsuki.ppls mvm-ri-d087240.roslin genial paes hca-spglab-035.shca ppls-y2lab-018.ppls csg-est-0204.csg mvm-ri-d086191.roslin mvm-ri-d086207.roslin www.bosch ris-vwinprn3.roslin katar www-test.disability-office www.parsian sas-reg-0026.sasg weir-g-105a-mfp-bw.scieng ppls-y2lab-013.ppls www.ciber rii-115129.roslin csg-est-0163.csg csg-sec-0026.csg ppls-y2lab-007.ppls hca-jpglab-002.shca vbs-lap-194222a.roslin petz marks.sps www.cisco csg-est-0113.csg health-omq-043.health gfd-117143.roslin www-test.office365 www.destiny ppls-y2lab-002.ppls www.decor sas-reg-0032.sasg wonka ris-hpc01.roslin www.abcdef sec09.roslin csg-est-0053.csg new2008 rii47245.roslin lect-hca-002.shca csh-3-3-7-mfp-bw.sasg www.echelon csg-fin-0174.csg www.diana kandy csg-est-0003.csg mvm-ri-m135074.roslin www.happiness hca-escreen-03.shca qixi csg-fin-0124.csg csg-as-0000758.csg mvm-ri-m116126.roslin arres csh-b-b1.9-mfp-col.csg trg-sr2.trg esi-tosh.ccbs mvm-ri-d067072.roslin www.spl halocombat ismet www.contactanos csg-as-0000708.csg hss-health-l25.health csg-est-0144.csg mvm-ri-i075053.roslin mvm-ri-v105156.roslin www.wisard.registry jivan sas-reg-0037.sasg hss-health-0011.health csg-saf-0051.csg jithu rid-057083.roslin health-mac005.health csg-fin-0010.csg lib-lap-1653.isg sci159.scieng jiten sce-coll-0048.scieng ril-047127.roslin kaiba hss-hca-0120.shca www.drive www.droid shay franck sas-reg-0043.sasg frases metroid ris-vlx01.roslin www.mhm csh-3-3.8-col.sasg www.era.finance www.aslan sec08.roslin www.elisa www.emaus mvm-ri-l096129.roslin mvm-ri-d096234.roslin tavo www.emily www.adagio newhaven-jvcs.scieng freepc jinji frenzy teru www.enric www.enter csg-pps-0038.csg www.confort mvm-ri-l120711.roslin psy-pc022.ppls mvm-ri-i135223.roslin hss-ppls-0050.ppls psy-pc016.ppls habbbo habbix habbuk mvm-ri-d104179.roslin csg-cse-0013.csg health-omq-009.health www.gapps sawayaka rii-105166.roslin muebles www.lastminute isaak mesh srv023.csg sas-reg-0048.sasg kincaids-cctv2.csg ris-ilx01.roslin csg-est-0084.csg sas-bu-0045.sasg mvm-ri-p125078.roslin lib-mac-007.trg mvm-ri-d094190.roslin hca-mac001.shca hss-iad-0011.iad mvm-ri-d107211.roslin themasters ionut www.survivor sas-bu-0039.sasg csg-cse-0063.csg health-mac001.health mvm-ri-d134247.roslin csg-cse-0035.csg www.cooking hss-health-0117.health sas-bu-0034.sasg www.funny insta ris-trac01d.roslin www.heart csg-as-0000849.csg health-omq-020.health www.gogle mvm-ri-d126158.roslin sas-bu-0028.sasg pef haoyun mvm-ri-d137164.roslin lap-temp.csg seniors majoo eventus sas-bu-0023.sasg myworlds yasui uniad wrk116.csg manes hca-tlab-021.shca sas-bu-0017.sasg www-dev.employerdatabase.careers cerc4.roslin www.santamonica sas-reg-0054.sasg hca-mac006.shca mvm-ri-l087099.roslin ris-esxi01.roslin www.messaging webmix www.arteycultura indah momo11 hca-tlab-015.shca checker morcom01.ppls gamemania www.restaurante lupo csg-est-0034.csg aston-martin sas-bu-0012.sasg mvm-ri-d097035.roslin imgup www.human velas mvm-ri-l104182.roslin nsu-union-0001.unison cas-mlb3-011.sasg hca-tlab-010.shca www.intro blueway hss-health-l61.health sas-bu-0006.sasg csg-est-0272.csg www.kakao ris-lx11.roslin cas-mlb3-005.sasg ris-lx08.roslin hca-spglab-029.shca infinitygroup ris-esxi03.roslin ris-devlx.roslin ftp.srna-mammal.roslin hca-tlab-004.shca www.kenzo www.jogos ramos mvm-ri-d126161.roslin www.joshi hss-iad-0038.iad www.joyas ksltop.ppls orizont www.label sas-bu-0001.sasg hss-health-l58.health csg-est-0222.csg www.laser www.judas randi hss-hca-0108.shca csg-as-0000248.csg mvm-ri-l097108.roslin mvm-ri-d107213.roslin csg-hr-0056.csg hss-hca-00104.shca henrry csg-est-0162.csg nakayama javed roraima csg-eusu-0002.csg csh-g-g22-mfp-bw.csg ahazlett-pc.ppls hss-ppls-0038.ppls presenter.csg hernan csg-est-0112.csg tmp-health-003.health www-dev.ccts.careers golazo alejandra csg-est-0052.csg www-test.reporting.euclid sas-reg-0059.sasg mvm-ri-m116091.roslin hca-mac012.shca tele3 jarno csg-fin-0173.csg csg-est-0002.csg estebanoc 5forrhill-c-printroom-mfp-col.sasg warzone hsoft micke spacegames csg-fin-0123.csg www.milan ppls-shared.ppls www.miweb www.levelup laser11.roslin csg-as-0000757.csg mvm-ri-l005145.roslin ris-vwinrep.roslin taalman01.ppls knak shalomshalom ppls-y2lab-109.ppls handc-mac3.shca mvm-ri-i117139.roslin csg-fin-0063.csg csg-fin-0105.csg www.neuro dsb-lptp-ng.ppls www.nexus www.underworld csg-saf-0050.csg www.motos sce-coll-0023.scieng www-test.learn nextlevel genka childcare srv051.csg www.alerta jamil ris-pvnb01a.roslin hss-ppls-0033.ppls sas-reg-0065.sasg hca-mac017.shca cerc2.roslin mvm-ri-i093219.roslin hca-netprint-bw12.shca jorgemiguel vcs-127104a.roslin mvm-ri-i137100.roslin www.noobs www.myjob sas-reg-0105.sasg csg-fin-card6.csg ril-035183.roslin soiree csg-pps-0037.csg lib-pc-1579.isg www.pavel meyer sas-reg-0188.sasg www.amigas mvm-ri-d056248.roslin rip-brfm3.roslin csg-hr-0077.csg tatan mvm-ri-sx06.roslin csg-pps-0016.csg sas-reg-0071.sasg kincaids-cctv1.csg www.worldwide rid-056254.roslin csh-g-g20-mfp-bw.csg sci063.scieng sas-reg-0177.sasg mvm-ri-l115160.roslin www.osaka viks hss-ppls-0014.ppls csg-hr-0027.csg mvm-ri-l085091.roslin udm lib-mac-006.trg www.planb www.plane sas-reg-0076.sasg saf066.csg hca-mac028.shca mvm-ri-d065136.roslin psy-eblic.ppls sas-reg-0082.sasg overload hss-iad-0009.iad sas-reg-0172.sasg mvm-ri-d126196.roslin www.ozone hoots mauricio rim-086014.roslin mvm-ri-d096137.roslin www.secure.vle hca-mac034.shca gamestore hss-ppls-0189.ppls www.bertha www.reich fecebook guerra www.admin.alumni.dev supercar mvm-ri-m125085.roslin csg-as-0000257.csg ris-sb01.roslin sas-reg-0166.sasg www.scary www.apocalypse sas-reg-0100.sasg iclick josemaria www.mycareer www.seals cgltop.ppls ideias hss-health-0115.health www.shara www.rouse dbritmac.ppls vcs-126190a.roslin irweb www.shoes csg-corp-0007.csg www.socialnetwork www.tarot pp4sslaptop1.scifun sas-reg-0155.sasg www.skype mvm-ri-d086067.roslin alaan csg-saf-0028.csg www.teach www.snake www.smoke gstar rip-b02c3.roslin 5kc-g-siteoffice-mfp-bw.csg www-test.tqintra.dev sas-reg-0149.sasg hca-mac039.shca 13-2rc-g-siteoffice-mfp-bw.csg xjcmblta sci086.scieng ppls-labds-001.ppls www.stamp mvm-ri-l097180.roslin hss-health-l35.health ris-vwlx01.roslin thrasher mvm-ri-d115193.roslin csg-est-0331.csg www.buyandsell sas-reg-0144.sasg sas-leaps-0006.sasg mvm-ri-d125024.roslin metal25 metal14 mvm-ri-d126135.roslin hss-ppls-0207.ppls www.thewarriors mvm-ri-d096066.roslin sas-reg-0138.sasg sas-leaps-0001.sasg metal10 www.minegocio edneuro-imac.ccns health-lap30.health www-dust.star.euclid sce-coll-0058.scieng afterlife mvm-ri-d097094.roslin csg-est-0221.csg sas-reg-0133.sasg munoz hca-copier-xpr.shca www.camila himar csg-est-0161.csg sas-reg-0127.sasg sas-reg-0093.sasg sellout www.chatbook csg-sec-0024.csg mvm-ri-d137245.roslin ris-vwintslm.roslin www.naa www.carlos mvm-ri-d127007.roslin sas-reg-0122.sasg mvm-ri-d094189.roslin www.blanco sgrant2013.ccbs programme sce-coll-0030.scieng health-omq-019.health csg-est-0051.csg lamode www.celulares macc hca-mac045.shca sas-reg-0116.sasg rid-057020.roslin csg-fin-0172.csg happydog www.forall sas-reg-0111.sasg csg-fin-0122.csg utt.ppls www.valentine csg-as-0000756.csg hss-ppls-0192.ppls hca-mac047.shca www.grafika elecom sas-reg-0095.sasg rockman vmet-test.ppls gonza jadore rii-pda2.roslin mvm-ri-d086162.roslin csg-fin-0092.csg csg-fin-0062.csg csg-as-0000706.csg generic hss-health-0127.health hcanda-laptop-dkaufman.shca mvm-ri-l065067.roslin lovetolove hca-mac042.shca sas-reg-0090.sasg csg-saf-0048.csg mvm-ri-d096173.roslin narcisse sas-reg-0078.sasg mvm-ri-l107179.roslin ris-vwlx04.roslin hca-mac036.shca sas-reg-0084.sasg hca-mac031.shca www.myed csg-fin-card5.csg sas-princ-0005.sasg www.gordon rofl extm sublimate gameshow mvm-ri-d085051.roslin www.rosi jazmin mobotix vscan2 vscan1 olife siba crashbandicoot goldy vsproxy www.mmt sas-reg-0098.sasg herry hacer mvm-ri-l136185.roslin ris-ifs.roslin help3 moneytoday www.boxnet alfadigital health-omq-007.health galb slap ffacebookk csg-fin-0152.csg www.hsl sas-reg-0114.sasg www.ilk ekstra punky www.magma www.bsl ministranci acies adama www.plb ilk csg-est-0031.csg ppls-y2lab-206a.ppls mvm-ri-d067036.roslin plb www.slk www.abc1 hagar kenichi csg-as-0000846.csg kreativ mvm-ri-v125180.roslin www.ministranci snte bacho baile csg-fin-0212.csg akane www.galb hss-ppls-0020.ppls baner www.ekstra hugocastro sas-reg-0119.sasg ap108 libertine teen-sex ext01 intima csg-est-0081.csg rid-067080.roslin mvm-ri-l096127.roslin www.dealers posts gw-adsl jetset anais pp4sspc3.scifun hss268.ppls darkassassins csg-sec-0004.csg montclair beloo flipflop berny sas-reg-0125.sasg csg-est-0141.csg getaway kirikou dwn dowhome1 hss-ppls-0195.ppls www.danger mastertrack dowiepplus dasdmail asada korokoro cacsa bitfm caleb virtualx hss-hca-0080.shca cantu carga ppls-mac007.ppls gismo cbtis schoolbus stoneware auris dowesp01 cedro persefone lmswx boden lyncext2 dasd-ttc natwest dasd2 dasd3 bolix dasd4 girly hafis dasd5 chick chipi hadis cristiana squad cinna hcanda-ckolotur.shc fujimura gille sce-coll-0046.scieng danis gfd danko danty nakayoshi datos riv-amxnetlinx.roslin dasd6 www.clicks dasd8 sas-reg-0131.sasg cochi dasd9 dmswx nateast cores dasdweb tamatama www.hip-hop csg-est-0201.csg fredy dasdvideo mvm-ri-d106054.roslin dimex health-mac003.health dasd-sharepoint facedook dasdwise lesbianas rip-brfm10.roslin natdasd sas-reg-0136.sasg www.zeta tupperware dwodm digitalplus franc qpteach csg-est-0251.csg donar hss-health-0008.health dongo www.pakistan hss-health-l23.health ssca1 rbigc01 sas-leaps-0004.sasg mati securetibia forty imageup fanni avacs bssd rickysfr earls.staging fstraining emaus movpublic.stg sas-reg-0142.sasg avengers maracaibo www.dejavu winmac ucmall expro www.cronica colecciones christin adventcom joeys ucmallnew ergon expel ugifit.temp gam3r karlim gle csg-est-0311.csg fpcss 13infst-g-transport-mfp-col.csg webdisk.green sas-leaps-0009.sasg esraa autodiscover.green every autoconfig.green geeko geekz geims gfd065254.roslin csh-g-g14-sfp-bw.csg mvm-ri-m135072.roslin ponce rim-106001.roslin www.chess forja forti ppls-labds-004.ppls nagaraju hca-mac040.shca gigas sas-bu-0019.sasg sas-reg-0153.sasg sas-reg-0158.sasg mvm-ri-d117057.roslin mvm-ri-c124035.roslin gimbo ezweb windows8test.ppls mvm-ri-l097132.roslin mvm-ri-d076056.roslin essam furia sas-reg-0164.sasg heber csg-cse-0014.csg kashif ppls-labds-021.ppls vest rocking sas-reg-0169.sasg chaimaa itinfo sci051.scieng sas-reg-0175.sasg galah histo evaluate scifun1.scifun csg-hr-0057.csg finny sas-reg-0181.sasg lab-copier-xpr23.shca icool cox.ee israil fidel kaotic handc-m-titan.shca hoola dyana ferro ferdi gypsy fendy law1 health-pc10.health www.dario litho jabes jacal emule jafra sas-reg-0103.sasg crazygamers hubbo emmet csg-srs-0004.csg sas-reg-0186.sasg kamael www-beta.estores.finance goldmember ebri063182.roslin csg-pps-0017.csg aaaaaaa.csg mvm-ri-d077238.roslin upr sas-reg-0192.sasg kenmon mvm-ri-l107193.roslin jetta mrlab moon-light hss-hca-0091.shca sec02.roslin highnoon fares www.teahouse www.free-software mvm-ri-d076060.roslin handc-mhist08.shca fanta kanon faker www2.hcrc eitai itachi csg-corp-0008.csg mediaweb csg-saf-0030.csg itpro battousai csg-fin-0102.csg iwant parishilton sas-alumni-0030.sasg csg-fin-0218.csg drako health-omq-033.health csg-fin-0103.csg cyrex natmark handc-mhist25.shca www.ital www.tequiero lacom ladob dolby lau01.roslin sas-reg-0108.sasg taalman04.ppls blackhearts facehack www.viktoria health-print7.health kodai csg-est-0032.csg csg-fin-0213.csg sas-cas-0009.sasg mexicocity www.lima hss-hca-0106.shca du110 csg-est-0082.csg fisicamoderna krieg csh-1-corridor-mfp-col.csg edent faceface ppls-tms-01.ppls mauri csg-sec-0005.csg misi ecell lostsoul mendo djsky meson csonline djsam securehost mvm-ri-d107191.roslin lucio www.i2i csg-est-0142.csg dirty www.edison ppls-psy-test.ppls sasg-oldcoll-g-foy.sasg chidori neuma teu006.csg ultimasnoticias monto mvm-ri-l116223.roslin www.supernatural dinno ilovepets msdos csg-est-0192.csg hss-health-0034.health ris-lxpoc01.roslin nevermind hca-tlab-002.shca handc-pc40.shca adana aydin hss-health-l48.health friendsforlife conceptos jhonny noize ukulele thecompany sasukeuchiha muhaha conny freedoom cas-mlb3-003.sasg zaqxswcde sci015.scieng csg-est-0252.csg desai j0k3r sas-bu-0004.sasg vbs-194176a.roslin cinemark ollin sanji blue04 behemoth cnbbs mvm-ri-l124238.roslin hca-tlab-007.shca materiales www.eas elegantmodel ddddd microweb agustin ema6.ppls csg-cse-0026.csg www-test.jams.finance sas-bu-0010.sasg plata fastbook rim-096018.roslin hca-tlab-013.shca www.justice daved bloopers ris-vlxweb06.roslin junkie polka iad-1-bw.iad darth impacto cas-mlb3-014.sasg proma claim friendsforever rally darky sas-bu-0015.sasg seeds lifelonglearning hca-tlab-018.shca bsoft ril-115153.roslin danil damon motocross www.epicfail natacion yeya sas-bu-0021.sasg sagem damas salvo www.makemoneyonline jmccpres.csg hca-tlab-024.shca dalal dala3 mvm-ri-l077088.roslin muerto lemans seals mvm-ri-d126219.roslin sas-bu-0026.sasg hss-health-0095.health www-test.esp.myed azura sas-bu-0032.sasg musicone www.fabian www.wpmservice.finance ebri073216.roslin rouge ayush www.bettyboop taboo csg-cse-0015.csg mvm-ri-d107207.roslin colpitts chits rid-057010.roslin rouse ris-vlxbio02.roslin www.facelook mvm-ri-d115109.roslin www-test.rssjobs.careers sas-reg-0120.sasg www.avengers sas-bu-0043.sasg lae hss-iad-0041.iad blog002 littleboy csg-hr-0058.csg mvm-ri-d067026.roslin csg-as-0000398.csg mvm-ri-l107228.roslin chama www.cstrike azadi suini mvm-ri-l096117.roslin mash.cache veracruz bonga todos bolek top40 www.demon csg-pps-0018.csg celeb avoid slevin riwebserv2k3.roslin sce-coll-0036.scieng aus22 ebri053218.roslin d112211.sasg psy-pc031.ppls mayer reclutamiento mvm-ri-l116230.roslin aubbs assam taalman01-host.ppls ppls-laptop2.ppls csg-corp-0010.csg wally mvm-ri-d125179.roslin ebri043220.roslin hss-ppls-0053.ppls maddog websd callo fotoclub www-test.services.adminrae.planning www.recetasdecocina documentacion magana radiomax camap box2.ee csg-fin-0094.csg hca-escreen-01.shca www.crystal csg-sec-0021.csg mvm-ri-d125241.roslin binay www.heritage mvm-ri-i135238.roslin christo abraxas csg-est-0033.csg billm malawi ppls-y2lab-130.ppls www.jasmin wilfredo asako www.enlace h2so4 csg-as-0000848.csg contacto wespace csg-as-print235.csg abcdefghij csg-fin-0214.csg csg-est-0083.csg ppls-igel-3-02.ppls www.bis arabi sinewave iad-mac002.iad marcello app17 vbs-195120a.roslin qwertyu gamersworld matteo ppls-y2lab-005.ppls antik csg-sec-0006.csg csg-est-0143.csg ahmedabdo hss-health-l74.health ebri003153.roslin med-000658a.roslin ppls-y2lab-011.ppls laser26.roslin teu007.csg mvm-ri-l096174.roslin csg-est-0203.csg csg-est-0191.csg int-usbmac12.sasg ppls-y2lab-016.ppls csg-est-0253.csg mvm-ri-l106249.roslin mvm-ri-m124191.roslin csg-est-0313.csg sas-cas-0032.sasg hca-mfd-004.shca csg-est-0217.csg altec rii-115145.roslin www.dlhe.careers ppls-igel-01.ppls hss-health-0131.health csg-as-0000129.csg alpen ebri053173.roslin psy-macbook.ppls www.gp ameen mvm-ri-m096008.roslin mvm-ri-d077051.roslin www.gz www.jh old-www.ppmd.euclid sas-cam-0005.sasg alist csg-cse-0016.csg health-omq-023.health www.jw sas-cam-0011.sasg ppls-cns-01.ppls webcity alang ebri043174.roslin ppls-kiosk02.ppls ris-lxnbmedia01.roslin barit csg-hr-0010.csg sas-cam-0016.sasg akess psy-f23print.ppls hss-iad-0042.iad balam rip-d02c4.roslin rip-a02m4.roslin airam aims1 vis004.sasg csg-cse-0050.csg csg-hr-0059.csg mvm-ri-d106247.roslin mvm-ccbs-060441.ccbs ssllogin mvm-ri-l096143.roslin colour22.roslin sas-cam-0022.sasg mvm-ri-d125205.roslin ris-vlx03.roslin vis010.sasg petrolheads www.etime.finance sas-cam-0027.sasg sce-coll-0062.scieng www.vs vbs-19595a.roslin vis015.sasg www.zz csg-pps-0019.csg micha-lap-01.ppls hss-hca-0118.shca mvm-ri-d096070.roslin www-dev.salfor.finance mvm-ri-m115196.roslin www.freedownloads mvm-ri-d125027.roslin psgames xtina giggles rid-026105.roslin abrar hss-health-0024.health sas-chap-0004.sasg webdesigns extremex axlrose hss-health-l38.health pcscifun10.scifun www.lafamilia psicodelico www.cbr abced hss-ppls-0070.ppls ucu1.ucu enlinea fingerprint www.stalker dsb-pgman-01.ppls ris-vlxftp02.roslin meimei csg-corp-0011.csg mvm-ccns-srv1b.ccns secure0 brescia jbg swastik csg-est-0327.csg www.openbook www.blackfriday sector7 ppls-y2lab-104.ppls mvm-ri-d057005.roslin hardrock ad123 www.timeweb onlinetv mall7 swapnil www.ctb ebri083205.roslin hellrider sas-cas-0006.sasg neoworld www.eclipse mvm-ri-d087014.roslin pixelhotel hurray csg-fin-0095.csg zr ppls-y2lab-110.ppls ris-condor01.roslin mvm-ri-d077064.roslin mvm-ri-d096141.roslin sas-cas-0012.sasg csg-fin-0155.csg ppls-y2lab-115.ppls scifunlaptop3.scifun mvm-ri-d125088.roslin intermax g2cpx2.ccbs rii-115143.roslin mvm-ri-l115163.roslin www.lapagina crazyboy sushant www.musicacristiana swagger csg-as-0000850.csg sas-cas-0017.sasg wanna animania csg-fin-0215.csg www.facebook-com ppls-y2lab-121.ppls mikasa sas-leaps-0010.sasg booklist sci066.scieng blackmetal mehrdad 34bp-4-4z3-mfp-bw.sasg cardona pennyauctions dsb-2-19-mfp-col.ppls www.wc sas-reg-0147.sasg radiochat sas-cas-0023.sasg ppls-y2lab-126.ppls nakata www.edesign acapulco banjarmasin garantias htmail rip-brfm6.roslin www.economy vitor machoman csg-sec-0007.csg www-test.calum-maclean.celtscot facebooklet ppls-y2lab-132.ppls valor srikant mudanzas facebookapi lomas virtualassistant csg-est-0194.csg hss-health-l70.health sicario csg-fin-0193.csg arc-printer.ppls facebookconfirmation sas-cas-0034.sasg exelent teddyweb www-test.intra.finance csg-est-0254.csg operaciones ppls-lap-011.ppls www.api.payments vox.ppls www.whynot sas-cas-0039.sasg facebook123 techworld jaleel ris-ifs4.roslin mywap hobbahotel www.freepc ebrptweb.roslin negros musicmax mvm-ri-d086201.roslin www-test.wpmservice.finance wapftp mvm-ccns-0089.ccns ucd aap003.sasg fucoidan www.habbux jaffar ebri033140.roslin sce-coll-0026.scieng mvm-ri-d127214.roslin puritan radiocool gfl045238.roslin jaeger happysun csg-as-0000111.csg netbox mysite123 sas-cas-0056.sasg hca-lab3-mac19.shca hss-health-l03.health sas-cas-0062.sasg ilovemusic csg-cse-0017.csg www.dmg sohil sas-cas-0067.sasg x919 kaafox m.porno hca-lab3-mac31.shca mvm-ri-l115179.roslin campeones health-omq-036.health bareback sas-cas-0073.sasg innovations et-temp.ppls tequiero www.socrates adlabtemp.ppls hss-iad-0043.iad sunflare masbelleza jeanpier sas-cas-0078.sasg www.metalmilitia lect-health-005.health cursosgratis mvm-ri-d107216.roslin candy123 mrmoon hss-hca-0005.shca juanproductions handbag sas-cas-0084.sasg www.dhl mvm-ri-d126164.roslin www.boletines hca-netprint-bw4.shca ris-esxi06.roslin blackmagic www.webcontrol mvm-ri-l116238.roslin ris-lx14.roslin www.goblin www.helios hss-hca-0011.shca m.sport www.dim csg-pps-0021.csg pcserver1 farzad youtubes www.herbal ppls-y2lab-203.ppls jornadas clancsw thewalkingdead hca-netprint-bw9.shca mvm-ri-d125026.roslin www.detodoparatodos hss-hca-0016.shca vikas ppls-y2lab-208.ppls djlatino magama hss-hca-0022.shca sas-cas-0059.sasg www.clubdescargas aaaaaaaaaaa aap055.sasg sas-alumni-0035.sasg anonymoushacker hss-hca-0027.shca murder csg-corp-0012.csg csg-saf-0033.csg sospc saras hss-hca-0033.shca espada www.grafik kittykat www.granma paei csg-fin-0046.csg dodatki www.mame pangolin barrio mvm-ri-d076097.roslin bacardi musicacristiana aap066.sasg www.mundomagico med-001024.sasg www.hikaru csg-as-0000741.csg hss-hca-0038.shca pkforfun csg-fin-0106.csg makina emailupdate www.ground zidane yunior techzone willian ris-vlxdb01.roslin mercadeo hss-health-0121.health www.detodounpoco ppls-sem-0002.ppls cabernet xlab-0 mvm-ri-d134251.roslin studyin mixes celulares akropolis hokey hss-hca-0044.shca www.pruebasweb sas-intl-temp1.sasg studio6 paty cartel techspot www.multiverse hss-ppls-0102.ppls www.atlantida csg-est-0035.csg atrium-onelan.scieng habbomoney csg-as-0000851.csg mapics kod hackforums digitalsolutions mabel.ppls sandeman csg-fin-0216.csg pagina mvm-ri-d086167.roslin tantan www.hellokitty marilynmonroe tolstovki clinica mvm-ri-d116236.roslin ccbs-mvm-060142.ccbs www.ted hss-hca-0055.shca videomax solucion salida rii-105169.roslin www.sharon faninc juanita mrose nai csg-as-0000237.csg www.alan nayma www.dofus www.simo www.alto latinos www.amos csg-sec-0008.csg csg-est-0145.csg mathiasl gunner hss-hca-0061.shca teu010.csg www.army www.surgery aquarios www.dsm dadadada sbvmref.ppls csg-est-0195.csg habboradio hca-jpglab-020.shca www.cied mvm-ri-d096237.roslin cataclysm mvm-ri-l126192.roslin julia123 sas-princ-0001.sasg starsale hindustan hss-ppls-0012.ppls mvm-ccbs-060193.ccbs ppls-card-01.ppls iijima hss-hca-0072.shca sas-princ-0006.sasg sci163.scieng hss-ppls-0017.ppls ppls-psy-unitots.ppls pinguino www.shadows hss-hca-0077.shca mvm-ri-d127239.roslin hca-lab3-mac28.shca sas-reg-0170.sasg omusic health-mac008.health hss-ppls-0107.ppls csg-est-0039.csg hss-ppls-0023.ppls hss-health-0014.health ykh wrath.ph hss-health-l28.health ppls-psy-003.ppls mvm-ri-v116130.roslin mvm-sbms-120224.ccns mvm-ri-d067113.roslin khoctham csg-est-0109.csg paradoks wgw jaejoong www.lk csg-fin-0204.csg hss-ppls-0034.ppls www.rh mvm-ri-d086061.roslin hss-hca-0094.shca rim-096006.roslin vahid falkon sas-intl-0018.sasg www.wy prevention nesto achin userservices sas-sra-0029.sasg quadra pineview csg-cse-0018.csg firephoenix rbm hss-ppls-0039.ppls amorg www.gore mustafa1 stratos cooldownloads hss-hca-0099.shca newproject bombsquad jackman www.idee ebri083185.roslin starboys hss-ppls-0045.ppls www.indy mvm-ccbs-060236.ccbs humphrey appsfacebook starback paginaprueba www.jazmin smw mvm-ri-d007155.roslin www.iris floresta xyz111 www.children www.itec www.isra csg-hr-0012.csg www.roman hss-hca-0115.shca www.visualbasic mvm-ri-l137027.roslin goodmusic affect www.micasa mvm-ri-l134241.roslin hss-iad-0044.iad mvm-ri-d106131.roslin loa pur hss-ppls-0051.ppls www.renata thekillers csg-hr-0062.csg hss-hca-0121.shca futureworld periodico gameshell brethren motociclismo reg-oldcoll-g-rfoyer-dhl-1.csg csg-est-0089.csg hss-ppls-0056.ppls deathrun www.maze concepcion hss-health-l20.health www.prevencion sci056.scieng hss-hca-0126.shca www.bicentenario nvc mvm-sbms-0054.ccns hss-iad-0040.iad hotnews cromarty ebrptsql.roslin highlights www.nina freeyourmind marumon hayashida csg-pps-0022.csg www.esc www.muse ppls-printer17.ppls autohits www.xd edogawa mailbe10.staffmail www.omar loh csg-hr-0041.csg mvm-ri-l115194.roslin ppls-printer23.ppls alwayson www.mercury lect-hca-010.shca ppls-ccace-01.ppls testgame kgk tattoos www.yorkshire mvm-ri-l127158.roslin hss-ppls-0073.ppls decibel iadl3.iad commander www.shock ppls-mac016.ppls temptop semillas www.nasa narutouzumaki www.riot smartcoder www.sal hss-ppls-0078.ppls lataberna sas-sra-0005.sasg csg-corp-0013.csg mvm-ri-d106202.roslin l2top mvm-ri-l106087.roslin www.sims dsb-mon1.ppls sas-dis-0022.sasg ifd www.sony nbf www.fairyland mvm-ri-d106228.roslin sanal www.suri ris-vlx05.roslin www.leisure www.darkorbit www-test.star.euclid backwoods everywhere fsn ltn nax mileva easyrider veronika fussion rii-085135.roslin www.casas hss-ppls-0084.ppls ltv zentai haddohotel csg-fin-0047.csg sas-sra-0011.sasg sas-scs-0010.sasg sas-intl-0005.sasg sce-coll-0016.scieng www.cbtis mvm-ri-d096149.roslin www.pegasus stewbot.lts hss-ppls-0090.ppls zelene ccw csg-fin-0107.csg imnotafraid sas-sra-0016.sasg cobain provac sas-scs-0015.sasg oblivionguild easyliving gurdeep www.cynthia est057.csg sas-intl-0011.sasg bg4 henrique touchme bg3 bg1 scotsman-kbserv1 newhack scotsman-kbserv3 ppls-g26-011.ppls ppls-y2lab-010.ppls hessel mamita penguinshow publik snake1 hss-ppls-0105.ppls sas-sra-0022.sasg love8 sector mvm-ri-i136081.roslin csg-est-0119.csg csg-est-0036.csg pag ocha sas-intl-0016.sasg delfind health-omq-038.health euc024.sasg tramites aspirantes ppls-g26-016.ppls ciclismo statement www.nowayout hss-ppls-0111.ppls mendez rsg cityville csg-fin-0217.csg sweet-dreams x-zone delawder poli www.environmental sas-sra-0027.sasg csg-est-0086.csg sas-intl-0029.sasg eletronica sas-intl-0022.sasg kuldeep ppls-g26-022.ppls obb hss-ppls-0116.ppls informatic fairview mvm-ri-d086025.roslin cybernet sas-sra-0033.sasg mvm-ri-d116084.roslin csg-sec-0010.csg csg-est-0146.csg shelley sas-intl-0027.sasg eurostar www.delux ms-dw6-1-genoffice-mfp-bw.health hss-ppls-0122.ppls www.bluemoon roadkill audiobook tsukahara teu011.csg www.f5 tsadmin sas-sra-0038.sasg csg-est-0196.csg greenvillage mvm-ri-i115150.roslin hss-ppls-0127.ppls ppls-ma-old.ppls speedupmypc blueray health-lap48.health ris-esx04-nic2.roslin mvm-ri-d107206.roslin rgomez csg-est-0199.csg zcom hss-ppls-0133.ppls gehealthcare2.ccbs www-dev.etime.finance ril-v097033.roslin csg-est-0316.csg muhamad www.je blubber onlygames ris-lx04.roslin mvm-ri-m125233.roslin sas-cas-0040.sasg hss-ppls-0138.ppls www.services.adminrae.planning g2ctm2.ccbs heartless sas-intl-0050.sasg int-usbmac5.sasg kubin hss-ppls-0144.ppls oc-1-r210-mfp-bw.sasg otherside www.uc sas-intl-0055.sasg mvm-ri-vbarry.roslin mvm-ri-sx02.roslin www.julian ppls-mac001.ppls bouanane wfm minera clubdescargas mvm-ri-l136120.roslin hss-ppls-0150.ppls sabino mouse-db.bioservices.aaps infernal srv112.csg pcsoftware sas-intl-0061.sasg rid-vrepos.roslin ppls-mac006.ppls hss-ppls-0155.ppls mvm-ri-d087030.roslin samael thanatos.activedir info9 csg-cse-0020.csg ppls-mac012.ppls www.softzone ppls-7gs-058.ppls www.facebook2 www.facebookk offprinter2.scifun hss-ppls-0130.ppls desiree scaner pcserver1-2 www.onlineshop breakout ppls-mac017.ppls sichem test2010 maike harden happy1 hss-health-0111.health sarvesh hss-iad-0045.iad bradford.lts www.faceebook www.mara ppls-mac023.ppls www.maggie mahen csg-hr-0063.csg hss-ppls-0172.ppls gfd095246.roslin hamzah hss-ppls-adl02.ppls thunders hamza1 lorenz ebri003177.roslin mvm-ri-d116226.roslin lilis hss-ppls-0177.ppls vmed www.salsa hanabi pab mvm-ri-d127201.roslin dimensionx lunatik sas-dis-0003.sasg confort health-omq-003.health ppls-mac034.ppls www.madrid tyre csg-pps-0023.csg hss-ppls-0183.ppls sas-dis-0008.sasg lacasa ebr-i500.roslin servit twar tuku multiverse giorgi hss-ppls-0188.ppls mvm-ccbs-060380.ccbs sas-dis-0014.sasg www.cadillac mvm-ri-d106227.roslin hss-ppls-0194.ppls csg-fin-card3.csg www.little sexual ppls-pc179.ppls sas-dis-0020.sasg syma data-nas3.ppls zaadu hack3d mailfe11.staffmail www.marcos hss-ppls-adl24.ppls swag www.marina hss-hca-0019.shca www.comunicate mvm-ri-d127142.roslin www.matrix www.theghost www.dico csg-corp-0014.csg faecbook csg-saf-0035.csg pasarela www.darkempire sce-coll-0042.scieng hss-ppls-0210.ppls mvm-ccbs-060401.ccbs sas-dis-0025.sasg scieng0.scieng mvm-ri-l067166.roslin hss-ppls-0215.ppls sas-dis-0031.sasg mastergamers hss-health-0004.health mvm-ri-d115176.roslin csg-fin-0108.csg www.tcr meb www.matematik www.sociales hss-health-l18.health 22-2sciennes-g-siteoffice-mfp-bw.csg ktnlaser01.roslin soniya cordova csg-est-0037.csg sone mvm-ccbs-060417.ccbs freeup www.abs www.ade honeybone-ltop.ppls www.afs sispro www.aki stadtplan mediaone ppls-skype.ppls www.ani gartner mvms lmao hca-spglab-021.shca www.ark csg-as-0000853.csg ppls-laby2-002.ppls newhaven-touch.scieng sjqy tamo www.ccp csg-est-0087.csg mvm-ri-d107199.roslin www.cdp coolpage sfss www.cle hca-spglab-026.shca csg-sec-0011.csg stelios www.crc csg-est-0147.csg mvm-ccbs-060428.ccbs ebr-bcd2.roslin www.cst www.cvc hca-jpglab-004.shca mvm-ri-l127186.roslin ris-vlxweb02.roslin sas-alumni-0039.sasg hca-spglab-037.shca www.gci hca-rc-002.shca www.gif www.fsm mvm-ri-d125068.roslin hca-jpglab-009.shca mvm-ccbs-060440.ccbs www.gpa hca-spglab-043.shca hca-rc-007.shca ebri003158.roslin sctc ris-vlxnbmaster.roslin ppls-igel-b-21b.ppls csg-est-0317.csg www.jjm mvm-ri-d127123.roslin www.memory hca-spglab-048.shca hca-rc-013.shca www.las mvm-ri-d086122.roslin www.micronet csg-saf-0029.csg hca-jpglab-021.shca homebanking mvm-ccbs-060451.ccbs www.mcr mvm-ccns-0021.ccns mvm-ri-d105248.roslin mvm-ri-l095144.roslin hca-jpglab-026.shca mvm-ccns-0026.ccns toscana ppls-printer8.ppls www.mna googgle scat mvm-ri-v125139.roslin www.mrp hca-jpglab-032.shca www.mrx www.a-team rite www.pal mvm-ri-l137078.roslin mvm-ri-l107188.roslin terserah mvm-ri-d136072.roslin slayer hca-jpglab-037.shca www.pit www.pkm www-dev.wisard.registry www.rad www-trn.star.euclid estadoavatar hss-health-0136.health photogroup www.rma www.sdx www.rok www.sfs csg-cse-0021.csg www.sgp phhh-mfp-reader.csg sce-coll-0006.scieng www.shp www.smt www.sok www.sos weir-g-14-mfp-bw.scieng nounours g2cdbdev1.ccbs www-test.eauthorisations.finance www.mga www.tsh backup-atm umesh csg-hr-0014.csg www.marvin wolfteam www.nora csg-eusu-0006.csg hss-iad-0046.iad www.precios www.slipknot darkanime mvm-ri-d116252.roslin health-omq-039.health mundoanime www.paranoia rj45 csg-hr-0064.csg webfrontend-lb.staffmail zones cmacbookdsb.ppls habboz habbux weir-g-11-mfp-bw.scieng radiator rads health-omq-028.health www.feri mvm-ccns-0054.ccns www.judgement www.victorhugo eplab2.ppls mvm-ri-m086015.roslin www.fakebook ccbs-mvm-060455.ccbs csg-fin-0059.csg mvm-ri-l137150.roslin xfactor csg-pps-0024.csg ibrahem mvm-ri-l096148.roslin mvm-ccns-0065.ccns www.today epis1.scieng mateus mvm-ri-i115139.roslin www.newstyle solano csg-est-0149.csg www.kosmetyki sas-ssp-0015.sasg adult-dating sce-coll-0067.scieng virtualtuning escalante cam-mac005.sasg www.chihuahua thedie ooo0 hss-ppls-0067.ppls asdfasdf nce psy-tmp-phd-01.ppls sas-alumni-0002.sasg bioinformatica eso-laptop1.csg blackdead www.familia www.pcdoctor www.santander blackfire pjuegos www.playstation khamim jhyun mvm-ri-l127151.roslin olaf www.infinity mvm-ri-d096075.roslin cam-mac011.sasg tdt mailfe12.staffmail mechatronics bax csg-corp-0015.csg stavros chanty csg-saf-0036.csg www.modelo www.exseed hss-health-0029.health baracuda masster sigmar sas-alumni-0007.sasg www.pars csg-fin-0093.csg much mytestsite liss mvm-ccns-0082.ccns www.jalisco cyberdevil www.tango syncmaster metalmilitia hss-health-l44.health ppls-stlaptop.ppls cdd guevara www.mgr antique nimi csg-fin-0049.csg geo-cc-004.scieng sombras sas-alumni-0013.sasg mvm-ccns-0087.ccns csg-fin-0099.csg crayola luba sas-reg-0044.sasg www.guatemala lect-cassem-001.sasg sas-alumni-0018.sasg csg-fin-0120.csg mvm-ccns-0103.ccns flicker hakan www.sou mane wrw-01m-30-mfp-bw.shca csh-g-g20-mfp-col.csg flashpoint 10dc-g-siteoffice-mfp-bw.csg icerose megapromo sherman ml-3-3-31-sfp-bw.sasg losperros ladii ddg hss-health-0020.health m.english csg-est-0038.csg millions creaweb nase www.paramore mediosdecomunicacion www.admin.careers musicblog margherita www.nikita sportscience gnss msanchez acs1 nabd sas-alumni-0024.sasg mvm-ccns-0098.ccns cpo jesuschrist baru netbanking airs rituraj csg-as-0000854.csg iptv1 ebd myusi csgo www.infotech csg-fin-0220.csg msasa www.enfermeria mvm-ri-i134158.roslin ral maza canoa pinv sinfronteras revo eed csg-est-0088.csg baloon mailbe8.staffmail edy shangrila mvm-ri-d137147.roslin efm clayton www.batman sas-alumni-0029.sasg basant scieng-ps1.scieng pcassist nicolass csh-b-b1.6-mfp-bw.csg leod www.banquetes mvm-ri-l107153.roslin mvm-ri-d136036.roslin csg-sec-0012.csg hickory csg-est-0148.csg scifunlaptop8.scifun atticus mare mvm-ri-d125094.roslin deadlock hss-health-0091.health saf030.csg alfadesign xingyu sas-alumni-0019.sasg lightyear kewl csg-est-0198.csg ourfriends joes jodi ixan www.players spinoza sci072.scieng sas-alumni-0041.sasg utility1 sorteos www.anorexia antioquia kitesurf vasilis mvm-ccns-0094.ccns varios ggc ipsectest echizen minihacker tsm2 mccc mark121 kathleen ebri073212.roslin ebrboxisrv1.roslin fsk jims sebas xibalba csg-est-0258.csg bestsoft gfl065242.roslin sas-alumni-0046.sasg gmk www.mylove pizzaking netmgr wright ppls-psylib-03.ppls tutube tutweb www.francais www.mystic csg-cse-0039.csg www.lala ris-plx02.roslin thecrow griffin csg-est-0318.csg dinasty negociodigital sas-reg-0050.sasg endgame ivas sas-alumni-0052.sasg www.dominios janu zcm victorbravo sas-cam-0010.sasg korisnik ihab gopher clanforum tryit anticrisis pruebaweb globes wrk043.csg bestgame studioadmin odontologia www.parati alumno csg-nad-002.csg oc-2-copyroom-mfp-bw.sasg spaceweb www120 funn wspa www121 urbana hasa elitehacker views jjm hillary kerk sas-alumni-0057.sasg jkl bias www.reporting.euclid doreen torabora cows csg-bems-0002.csg gewinnspiele relocation mvm-ri-d096217.roslin www.docs.sasg sce-coll-0032.scieng rii-115124.roslin csg-est-0065.csg karna nazareth sbattemp.ppls csg-cse-0022.csg visita www.santalucia shca-laptop-dei.shca mvm-ri-d126108.roslin mvm-ri-d086218.roslin rng lightyagami www.lfs phi-pythag.ppls solex alexgames unkoman hss-health-l08.health nosomosnada csg-hr-0015.csg hss-iad-0047.iad animex sas-mac002.sasg sk8 www.miri soltec fastmoney csg-hr-0065.csg rameshkumar ppls-mac020.ppls verkaufen www.navi rim-107087.roslin csg-sec-0030.csg www.alumnos bestflowers dsb-et1a.ppls don1 indexhtml www.raja mvm-ri-d116110.roslin www.serial huma mvm-ri-l076115.roslin svnproto.ppls www.mam mvm-ri-d125236.roslin csg-est-0120.csg echa csg-pps-0025.csg kostenlos www.nena www.myproject www-dev.events health-lap64.health webfox ril-104171.roslin psy-hcn-nas3.ppls sci-jet20.iad felicidad mateolaptop.ppls www.orbita hss-health-l69.health sci036.scieng www.primaria preview03 haka ris-esx04.roslin ftp.mobile www-test.exseed csg-fin-0001.csg csg-corp-0016.csg maverick1 pcweb recetasdecocina csg-saf-0037.csg donmez peritus nde societe dfdf disconnected appfacebook carlitos hyves farideh mvm-ri-l127008.roslin hss-health-l02.health www.rama allsolutions csg-fin-0051.csg mailbe8r.staffmail onelan.sasg.001.sasg mvm-ri-m124186.roslin rosarito csg-est-0170.csg csg-fin-0111.csg csg-est-0158.csg dsb-4-05-mfp-col.ppls m.tr jaga mut phonecard ris-esx03-nic2.roslin mvm-ri-m126241.roslin stmedia csg-est-0040.csg lacosta mvm-ri-d096172.roslin aboutme csg-as-0000855.csg tios csg-fin-0221.csg rip-colour0102.roslin softwaredownload mvm-ri-d125130.roslin csg-est-0090.csg hss-health-0126.health csg-est-0175.csg csg-fin-0196.csg bertrand platinium nta sas-reg-0005.sasg sci097.scieng csg-sec-0013.csg www.page csg-est-0150.csg fahmi pca mymovies www.drps hardstyle www.oviedo 33bp-basement-b1-mfp-bw.sasg acaiberry sas-reg-0011.sasg whocares csg-est-0210.csg freeporn vallarta www.buscador mc-1-siteoffice-mfp-bw.csg csg-est-0202.csg spek nbn vijesti mvm-ri-v127006.roslin sas-reg-0016.sasg amad www.arquitecto health-omq-018.health playback pmk abogado intex www.mastergamers superanimes mvm-ri-l105205.roslin csg-est-0259.csg rid-115174.roslin www.pipe www-test.salfor.finance sas-reg-0022.sasg www.eves.myed mvm-ri-d087116.roslin www.madan kanchan 7777 csg-est-0320.csg maligno hss-ppls-0179.ppls katyperry pug theanswer sas-reg-0027.sasg mvm-ri-d096243.roslin dbz-episodes freehabbocredits csg-pps-0010.csg www.rasta herramientas karthick www.maple www.dreamteam www.sun phhh-g-lab-mfp-bw.csg wrk104.csg uben csg-bems-0003.csg www.prensa sas-reg-0033.sasg sce-coll-0057.scieng www.prints csg-est-0235.csg mvm-ri-m126134.roslin sas-reg-0038.sasg optik www.rafael ebrpttse.roslin www.enlaces www.pronet playhard wini www.mercado www.anormal mvm-ri-d096065.roslin mvm-ri-m115202.roslin workpc memberservice mvm-ri-d125023.roslin sblel1.ppls mvm-sbms-130293.ccns businesscenter www.merry jehad hss-health-0019.health hss-health-l34.health soptec jacaranda pl-b-catering-mfp-bw.csg sitemusic csg-cse-0023.csg sce-coll-0039.scieng technetium.ucs hss-ppls-0009.ppls elsaka keller www.real mvm-sbms-130271.ccns blazers sas-reg-0049.sasg www.psycho hca-mac002.shca csg-hr-0016.csg ecci-3-307-mfp-col.scieng api.money www.cristovive sas-reg-0055.sasg hca-mac007.shca faceeboook realcom kicha mvm-ri-m095203.roslin mvm-ri-l136090.roslin bestteam qwertyui hss-iad-0048.iad csh-1-1.3-mfp-col.csg schooldemo csg-hr-0066.csg sas-reg-0061.sasg newslist anorexia marimba ml-3-photocopy-mfp-col.sasg sas-reg-0066.sasg hca-mac018.shca www-test.adminermis.planning www.obb wisata mvm-ri-d077235.roslin softwaretest maquina elmatador www.regina ugm mvm-ccns-srv1lom.ccns mvm-ri-d096136.roslin www.paginaprueba www.juguetes serviciosweb pluto2 csg-pps-0026.csg gothic www-test.eit.finance system1 alarabia mvm-sbms-130303.ccns sas-reg-0072.sasg martial xiomara www-test.forums nightowl sfp mvm-ri-l115158.roslin tvc privaters www.mov browsergames santra sas-reg-0077.sasg hca-mac029.shca king123 freegold sci062.scieng ebri073202.roslin www.sexo mvm-ri-d077039.roslin mvm-ri-d127138.roslin hca-mac030.shca sas-bu-0009.sasg hca-mac035.shca mvm-ri-d126027.roslin labib www.epis mvm-ri-l116092.roslin fbgame www.roxy oscom adim www.shoe www.petcare thekiller csg-fin-0002.csg csg-saf-0038.csg sas-reg-0088.sasg jaypee silentkiller www.freechat networksolutions specialforces hca-mac041.shca elmas-mac.ppls animeland fanfan www.ricardo www.slap susy www.cvresearch petcare www.regalos vri melu openbook phlaptop.ppls unipol audiomaster solver suspend hackersworld blacker gangxta sbimgtest.ppls wibawa hss-ppls-0191.ppls image170 mahavir csg-fin-0052.csg sas-reg-0094.sasg hca-mac046.shca hotmarket mvm-ri-d116028.roslin csg-fin-0112.csg www.alf www.ami worldwid shailesh mydatabase facbok www.are sas-reg-0109.sasg www.cad mac24arg.ppls www.asg www.ata fatalerror tomomitsu www.avm tik-tak www.boo goodstuff gamehub itran www.cim login111 www.transparencyadmin.fec ris-vlx11.roslin vone www.ddr aquaservice www.cpc tmw mcfly spooks www.dmb www.dnc www.formula www.cvt nimbuzz dron www.dps www.dsb dispenda sas-reg-0115.sasg www.fdm logiclab www.fds anshuman www.epo www.fic www.flg www.fmc www.flp iwc www.gep f4rr3ll monokawa www.gio mvm-ri-l115230.roslin banlist rt-test helpinghands paypals freecredits www.hrh www.jac sce-coll-0022.scieng www.jaz softworld csg-as-0000856.csg molto double www.detox www.isa www.isi csg-fin-0222.csg biz3 facetoface abhinav evilboy www.jon sas-reg-0121.sasg madhead csg-est-0101.csg www.lou gamersclub alienware www.mit www.mps dondon www.mus www.astra www.uspeh www.ott alarm www.psa www.krzyz krzyz www.ren kalai mvm-ri-l067146.roslin www.ses sas-reg-0083.sasg csg-est-0189.csg www.rps www.rrr sas-reg-0126.sasg csg-est-0151.csg www.rvr www.sot www.rejestracja cyber2 digimap itbbs ris-biolx01.roslin est-forhill-g-keys.csg facebooook www.engine www.vms www.vsm dante.ppls sas-reg-0132.sasg facebook32 facebook20 canggih www.zzz www.singer prevencion kalinga trotamundos ryuichi nightrider csg-est-0211.csg florin linweb gfl035235.roslin fotografias autodiscover.cse bibliotek jayaram webdisk.cse autoconfig.cse www.mileycyrus musicrecords blackspider sas-reg-0137.sasg www.alcatraz sumaho mitiendita www.bestofthebest zac onlinevideo www.pc-gamers securemail1 psse buchen www.fanfiction mvm-ri-l105053.roslin sas-leaps-0005.sasg www.marathon sas-reg-0143.sasg csg-est-0321.csg www.pintura truefriends sas-leaps-0011.sasg sas-reg-0148.sasg consultas phstl-b-financeoffice-mfp-bw.csg optec syko www.supra www.radiostyle merk vinhxuan www.rick infosystems www.ton netcenter lect-health-001.health toner base4 base3 base6 mvm-ri-d107212.roslin dineroextra tvt base8 traspaso all4all ufd base7 www.serialkiller base5 sas-reg-0154.sasg www.movistar petrovic ris-esxi02.roslin vis1.scieng ris-lx09.roslin sorrylove www.fotografias modt coolgames owc smarteye www.madagascar www.testtesttest justinbieber guadalupe www.mercadolibre mvm-ri-d115227.roslin communaute ppls-chltop.ppls www.pad specialist rodolfo www.motocross phi-plato.ppls facebo0k omp heller loca csh-g-g21-mfp-bw.csg testarea globalchat wlkt hss-health-l59.health sas-reg-0159.sasg wakwak sci026.scieng rajakumar mvm-ri-l094181.roslin sas-reg-0165.sasg www.webs injection wakaka mvm-ri-l087098.roslin www.entrepreneur giftshop www.pepsi www.target ric67255.roslin disable www.xboxlive www.uriel camila cerc3.roslin csg-cse-0024.csg cuartoa www.yamato www.monavie sv74 www.student-experience sas-reg-0171.sasg fanfics riv-vc02.roslin csg-hr-0017.csg fastline sollid hss-iad-0049.iad fenerium animelatino libe csg-fin-0101.csg memes suicide www.maristas esx12 sudhakar csg-cse-0057.csg metatron spamgw-fb mvm-ri-m126231.roslin www.gigabyte www.soluciones finplan csg-hr-0067.csg sas-reg-0182.sasg www.tra bashayer portalcliente tumoda www.gamecenter overseas dartagnan www.newyear www.intra.vacancies www-dev.admin.careers www-beta.myed www.socios hss-health-0116.health totalwar www.robin rid-096215.roslin www.radiomax www.salvador sas-reg-0187.sasg ashwani www-dev.pubs.recordsmanagement blackwolves television facebookk facebooki ytrewq besiktas magistral www.apuntes forum.beta faceboock revshare sprzedaz wep bimde csg-est-0209.csg pemilu dipika www.thewalkingdead clickhere saral www.recovery youporn piccolo mvm-ri-d134246.roslin www.fight csclub www.ruben csg-pps-0027.csg sas-reg-0104.sasg artedigital www.calentamientoglobal wrk-jet10.csg coolradio www.bigboss ppsxer2.csg sas-reg-0189.sasg www.prime mvm-ri-d086163.roslin aerosol opteron hca-netprint-bw11.shca firedragon www.stella ncis thestig thespot detodoparatodos nightmares chatcam nasiri www.tqmobile.dev health-omq-008.health sinlimites webdesing teenangels hss-hca-0102.shca csg-fin-0085.csg tupagina pspstore tdcom internetwork www.styles hss-health-0105.health www.trinidad solochat handc-mhist15.shca promocja optimusprime www.mechanics csg-saf-0040.csg www.show mvm-ri-m106233.roslin amirul payesh fortesting ppls-macbook2.ppls csg-fin-0053.csg health-omq-029.health renova csg-fin-0113.csg hca-tlab-020.shca patrimonio www.summit dika sce-coll-0047.scieng vigo thehive www.armenia anabella summoner zuniga mian kconspiracy.ppls www.mp3music sb2012eval.ppls sas-reg-0099.sasg radiofm thelover www.salem propools csg-est-0042.csg poop www.trauma www.itsmylife clancsi grancanaria gustavomartinez health-mac004.health rid-057082.roslin www.raf hss-health-0009.health csg-est-0102.csg vgs hss-health-l24.health enternet papaz www.liverpool pcscifun11.scifun ebri023162.roslin www.gabriel distancia prokom www.cfd cyberlink premiergolf socute eitin www.mystore uidev mecal c600c c600b apibeta ecal uidemo uibeta ichikawa www.tukasa psico c600a eitin-email hombres ceitin test.reports ptp2 www.netcom www.arsenal apiprod antoniosantos uiprod ptademo og sonicteam jangueo cmeitin oghma csg-as-0000238.csg hss-hca-0107.shca psoft www.projectx www.oconnor temptation csg-est-0152.csg mvm-ri-d117236.roslin enriqueiglesias sasg-oldcoll-r203.sasg www.dineroextra imprenta www.teamo www.radiomix mvm-ri-m135073.roslin mx99 contratacion www.newweb www.sampler csg-est-0212.csg www.refused mvm-ri-l106190.roslin www.tekno ppls-bert2.ppls ril-106002.roslin cas-mlb3-004.sasg www.sofia csg-est-0262.csg dreamroad sas-bu-0005.sasg www.casino-online www.jennifer www.contactus www.freegames horacio difusion hca-tlab-008.shca rcmodels cas-mlb3-010.sasg headshot todalamusica bestportal angielski grosik www.rssjobs.careers wrk053-2.csg elvs01ts02.roslin csg-est-0322.csg oudev www.megajuegos scsn2 pinna foxsports sas-bu-0011.sasg www.viktor www.alm gisap-ov exch7-ov fwwlan cfmh juancarlos primera selectron www.promocja mvm-ri-d076057.roslin hca-tlab-014.shca thebeat csg-est-0220.csg cas-mlb3-015.sasg puebla www-test.downloads.euclid phpcoder hss-health-l31.health sas-bu-0016.sasg www.wagner facebook-login sas-bu-0037.sasg hca-tlab-019.shca sapling incentive mvm-ri-l115229.roslin wrk106.csg www-dev.scs.euclid sas-bu-0022.sasg www.sensor mvm-ri-d107059.roslin watchmen scifun2.scifun skd ohlala www.mountainbike csg-as-0000839.csg ppls-barbmac.ppls redflag videoadmin rid-077044.roslin politec xmix sas-bu-0027.sasg csg-fin-0195.csg www.akropolis sas-bu-0033.sasg elcloset aguilas canarias ppls-y2lab-120.ppls www.todojuegos csg-cse-0025.csg saf064.csg sas-bu-0038.sasg hss-iad-0001.iad offprinter3.scifun sas-bu-0044.sasg innovacion nouri hss-iad-0051.iad graficos sumt sec03.roslin rii-115189.roslin technomarket csg-hr-0068.csg mvm-ri-l115220.roslin csg-as-0000830.csg bombay sce-coll-0012.scieng nt6 recargas mvm-ri-m106020.roslin shua vrc mikel nailart shaun.ee www.cul wwms01m27igel.shca www.rcmodels rip-e01m4.roslin sask sar7 www.blackwolves psy-pc021.ppls mvm-ri-l127095.roslin avecamour mysterio csg-pps-0028.csg crieff www.industrial stelizabethannseton mobydick mvm-ri-i075016.roslin www.sgs www.nicole health-omq-034.health pepi fredo www.spectrum chabab hss-health-l64.health ordu ucu4.ucu remas yoo student11 myit tvh gourou www.gas www.nouri www.topgames pitagoras www.evm lau02.roslin lsbb www.velas mexy lois www.wizard mailbe11.staffmail progreso teka mvm-ri-d116080.roslin prettygirl granados loft mvm-ri-l096154.roslin www.sombras klnm imedios csg-fin-0004.csg www.lamoon gamearea r222 kedu a-team www.imperium jmjm yudha irus www.acme jari riv-idr8aud.roslin www.agus ris-buildlx01.roslin www.bara csg-saf-0041.csg www.alba www.bart www.alef www.alma iedu www.amix xzerox voltron hati ebri033186.roslin csg-fin-0054.csg csg-sec-0014.csg www.argo isg-lj500.ccns demo.unidesk qa.gateway esko gaad www.slm cope www.cctv www.arboretum purr www.bomb mvm-ri-d107192.roslin www.chao emlak sinema csg-fin-0114.csg www.chic hca-escreen-02.shca maxam botn www.cisa cerl www.dart 7gs-g-5-mfp-col.ppls www.cmcc msj www.vcm www.cody www.desk jalali yaghoobi gamehack www.dice dlf hss-health-0035.health plone3.ppls sepehri dpl hss-health-l49.health www.earn www.eden www.eddy stasi crazyjane balmoral www.down dmccarth-macb.ppls astrosoc www.eman fairlight www.alessandro skap www.fifa csg-est-0043.csg www.find www.gaia 7gs-g-10-mfp-bw.ppls www.ersa www.gala www.even www.flog www.flor crazylab fire-net www.eauthorisations.finance www.foxy disturbed csg-est-0167.csg www-dev.eves.myed www.hair abcdefghijklmnopqrstuvwxyz www.hana csg-as-0000858.csg buyung lect-hca-006.shca csg-est-0103.csg mvm-ri-d116151.roslin haida ppls-y2lab-006.ppls ktncolour01.roslin csg-sec-0016.csg csg-est-0153.csg www.jazz frontdesk www.inco www.jeep eccc001.scieng ppls-y2lab-012.ppls www.kala ppls-igel-f-30.ppls portoalegre www.jojo health-lap-023.health www.juan www.judo www.lead csg-est-0213.csg psy-haloscopic.ppls www-test.wisard.registry jharris www.lina www.mane gimel ppls-y2lab-017.ppls cookingclass 32bp-g-corridor-mfp-col.sasg www.mccc mvm-ri-d134250.roslin eldoctor www.mesh www.loki hss-ppls-0060.ppls www.long hss-health-0106.health www.mian csg-est-0323.csg gameplay img50 img51 pixelstudios ebri003189.roslin www.lulu minegocio info21 volia mvm-ri-m126043.roslin www.mono mvm-ri-d077040.roslin www.more www.wanda ultrapurewater wrk107.csg weir-g-29corr-mfp-col.scieng sausages.cache mvm-ri-d086153.roslin ris-vlxbio03.roslin speles www.pera rii-pda1.roslin sas-cam-0001.sasg denny.ppls siltop.ppls hca-spglab-040.shca sas-cam-0006.sasg www.posh saf008.csg phil-mcltop.ppls wwms126igel.shca www.ropa winsrv1.ppls www.ross royalarmy srv057.csg sas-cam-0012.sasg csg-scecc-0003.scieng hss-iad-0002.iad mvm-ri-i055151.roslin www.snow www.snte www.song csg-hr-0020.csg sce-coll-0037.scieng www.iptv mvm-ccbs-060001.ccbs www.ssss sas-cam-0017.sasg www.tuki www.unik www.vlad hss-iad-0052.iad vis005.sasg csg-hr-0069.csg pritchard-lptop.ppls mvm-ri-d086224.roslin fabiana www.doctorwho libertad twk sas-cam-0023.sasg geo-cc-005.scieng vis011.sasg serafin cas115.sasg avpn athletic www.jjj hss-health-l14.health sas-cam-0028.sasg ebri103169.roslin www.iss pitter vis016.sasg linko csg-pps-0029.csg mvm-ri-d127047.roslin retrospect1.ccns mvm-gf-l115206.roslin mytvonline www.astral mvm-ri-l137181.roslin mvm-ccbs-060023.ccbs sas-chap-0005.sasg www.jol mvm-ri-d125242.roslin newhaven-netlinx.scieng www.khb hca-rc-009.shca globalsolutions usenet fanlisting www.peternakan ppls-m-sonnet.ppls www.think ppls-y2lab-100.ppls csg-saf-0042.csg ppls-mac029.ppls geinternalip1.ccbs www.toys maill melvin mvm-ri-d096116.roslin csg-fin-0055.csg ppls-y2lab-105.ppls www.blossom rid-096160.roslin 7gs-g-5-mfp-bw.ppls hss-health-l75.health www.tcm sas-cas-0007.sasg sci042.scieng csg-fin-0115.csg habbocash ppls-y2lab-111.ppls sas-cas-0013.sasg csg-fin-0165.csg www.ksm ppls-y2lab-116.ppls www.mcb www.aviator www.crearte csg-est-0044.csg mvm-ri-d115065.roslin www.mcm ebri993167.roslin habboking habbolife csg-as-0000860.csg electronica www.sto sas-cas-0018.sasg csg-fin-0225.csg ediciondigital cas160.sasg ppls-y2lab-122.ppls csg-est-0094.csg habboside sas-cas-0024.sasg immobiliare www.transparency.fec ppls-y2lab-127.ppls www.mim oldhome csg-sec-0017.csg csg-est-0154.csg mvm-ri-l137074.roslin publimajes sas-cas-0030.sasg hss-ppls-0076.ppls mavi www.everest afterschool mvm-ri-d126246.roslin csg-est-0214.csg venu massimi-ltop.ppls zapateria producciones sonder actimel ris-netbackup.roslin hss-health-0132.health tchoukball www.playstation3 int-jet11.sasg wormwood www.florian sas-cas-0035.sasg sce-coll-0002.scieng jonathang sas-cas-0041.sasg il-mac03.sasg mvm-ri-d106010.roslin www.digitalmedia www.msp csg-est-0324.csg laser13-wp.roslin mvm-ri-d086178.roslin rid-046104.roslin pruebasweb greendragon csg-corp-0009.csg waterlife mlearning antibullying siat wifiman redbeard.ppls health-omq-024.health csg-hr-0071.csg ris-onelan01.roslin mvm-ri-m086011.roslin ppls-pc11.ppls www-beta.pure need blackhat degrassi mvm-ri-d116069.roslin earn-money villalobos feb sas-cas-0057.sasg hca-lab3-mac21.shca sas-cas-0063.sasg www.steel ccnsm073.ccns www.per fridge www.warzone connor www.bite ebri093168.roslin hca-lab3-mac26.shca www.tibor www-dev.hesa.star.euclid blessed sce-coll-0063.scieng sci174.scieng sas-cas-0068.sasg ghost3 0707 ris-pttse.roslin modelos sch-admin.ppls fbgames bestcollection sas-reg-0110.sasg www.anonymous onlinejobs hss-iad-0003.iad ecotours mvm-ri-m115207.roslin rip-colour0001.roslin webmail.student www.ram www.ottoman sas-cas-0074.sasg mvm-ri-d125028.roslin omega-zcdr.ccns hss-health-0025.health ris-lx10.roslin hss-iad-0053.iad th14 ris-vwlx05.roslin hss-hca-0001.shca www.rex hss-health-l40.health sas-cas-0079.sasg ris-vwinftp.roslin hss-hca-0006.shca giacmo sas-cas-0085.sasg hca-netprint-bw5.shca designhome mvm-ri-d136199.roslin www.zafer lionold.ppls hss-hca-0012.shca mainoffprinter.scifun videos1 hss-health-l60.health rafaela mailbe10r.staffmail beerworld ecron ppls-y2lab-204.ppls ppls-pc50.ppls mvm-ccbs-060138.ccbs www.wolfteam hss-hca-0017.shca princesa sas-reg-0160.sasg mvm-ri-i134154.roslin mvm-ri-m136032.roslin ppls-y2lab-209.ppls mvm-ri-d077184.roslin www.airsoft mbplvdev.ccns hss-hca-0023.shca sas-sra-0014.sasg www-test.transparencyadmin.fec phoenixcorp melchett52.ppls scifunlaptop4.scifun www.younes a12345678 ebri073156.roslin hss-hca-0028.shca rii-115144.roslin csg-saf-0043.csg hca-jpglab-034.shca aap062.sasg csg-fin-0104.csg mvm-ri-i124155.roslin secom www.helen hss-hca-0034.shca csg-fin-0056.csg mvm-ri-d097075.roslin aegis ppls-cm.ppls rip-brfm7.roslin www-dev.downloads.euclid hss-hca-0039.shca csg-fin-0116.csg glamur uids mvm-ri-l136166.roslin www.sunflowers mvm-ri-l105165.roslin jorgeblanco mvm-ccbs-060166.ccbs hss-hca-0045.shca www.yugioh csg-fin-0166.csg csg-est-0045.csg hss-health-0092.health mvm-ri-d067017.roslin ekspert www.thc hss-iad-0029.iad csg-as-0000861.csg spritz hss-hca-0051.shca csg-fin-0226.csg csg-cse-0007.csg www.portalweb hss-ppls-0103.ppls velasco www.vic www.vik csg-est-0105.csg hss-hca-0056.shca www.tab sas-sra-0019.sasg csg-est-0155.csg aeros scripps mvm-ri-i060001.roslin www.miniportfolio.euclid hss-ppls-0002.ppls mailbe9.staffmail www.miyazaki health-mac007.health hca-jpglab-039.shca csg-est-0215.csg hss-ppls-0007.ppls odoriko2 test-cake okurin kenpou odoriko testshutv hss-hca-0067.shca licensing.research-innovation piedrahita standalone sas-princ-0002.sasg bmt vcs-157058a.roslin mvm-ri-d115162.roslin biz2 mvm-ccbs-060204.ccbs hss-health-l04.health printer24.ppls wintest csg-est-0325.csg hss-ppls-0018.ppls mvm-ccbs-060209.ccbs www.hastane ailehekimligi pps-laptop-csh.csg mlive hss-hca-0078.shca zawiercie temp-dcarmel.ppls edneuro-mbp.ccns tofu www.zawiercie siedlce hss-ppls-0024.ppls starwap flykit ppls-g26-014.ppls ril-047134.roslin hss-hca-0084.shca parking1 hss-health-0013.health csg-est-0050.csg lync.corp ppls-psy-004.ppls ris-vlx07.roslin mobilebookwiresvc mybip bisnes demo.doe hss-ppls-0029.ppls hss-hca-0089.shca hss-ppls-0035.ppls lect-health-006.health mvm-ri-d107217.roslin hss-hca-0095.shca dns23 dns24 mvm-ri-d096106.roslin csg-cse-0028.csg hss-ppls-0041.ppls cam-laptop2.csg hss-hca-0111.shca www.soc mvm-ri-i005075.roslin sas-intl-0020.sasg hss-health-l65.health kiba hss-iad-0004.iad hss-ppls-0046.ppls csg-hr-0022.csg joliette hss-hca-0116.shca wham hss-iad-0054.iad hss-ppls-0052.ppls s2000 health-pc20-1.health readbook mishmash www.nanako csg-hr-0072.csg hss-hca-0122.shca www.calum-maclean.celtscot randt heavens www.heavens iwa ghazi lcn hss-iad-0039.iad santhoshkumar www.homeandgarden kuwa exist mvm-ri-l005043.roslin hss-ppls-0057.ppls www.assist m.www mvm-ri-l105129.roslin ppls-g26-020.ppls magadmin jcmb-pc-1 www.hmoob jcmb-pc-2 jcmb-pc-3 wwwq jcmb-pc-4 ccdemo www.0 buscar hmoob kht esx24 mobilia esx23 esx22 esx21 www.version1 mvm-sbms-0055.ccns sas-reg-0176.sasg local5 rl2 news4 www.domain-registration wlm korma hss-ppls-0114.ppls garlic csg-est-0099.csg direct123 hue snlaptop.ppls ipv6test hss-ppls-0063.ppls mvm-ri-i134180.roslin ppls-printer18.ppls hss-iad-0050.iad mvm-ri-d076098.roslin palapa www.ccts.careers hss-ppls-0068.ppls corpdev stage.admin palmer mailout01 mvm-ri-l126132.roslin sgadmin csg-fin-card1.csg bestworld ppls-printer24.ppls csg-hr-0051.csg mediaserver2 huduma ospace hadoop1 hadoop2 newreports licenses hss-health-0122.health seishu hss-ppls-0074.ppls algoma refworks books2 dataverse sas-sra-0001.sasg spkt mvm-ri-d134252.roslin pgl mvm-ri-d077042.roslin scotsman-1 scotsman-2 purpose mvm-ri-d127170.roslin hss-ppls-0080.ppls bogor www.ateam csg-fin-0007.csg pinfo ijoh bengkulu sas-sra-0006.sasg endah jambi sas-scs-0005.sasg csg-saf-0044.csg 152 srv012.csg esist ftp.server weblin commonground karafarini glasgow sas-intl-0001.sasg darman ppls-g26-001.ppls webmktg4 mhrc exchangeserver hss-ppls-0085.ppls ip9 keshavarz csg-fin-0057.csg origin-attach www.lhs template2 farabi 520 tucana aen pserver ihc sweeper connect1 connect4 hotdeal joomlatest hotdeals sas-sra-0012.sasg rssdev sas-scs-0011.sasg health-omq-014.health sas-intl-0006.sasg rid-115170.roslin mnt sarmad ppls-g26-006.ppls myac gku tort huffman www.db2 phppgadmin schulweb abri wel walentynki hss-ppls-0101.ppls sas-sra-0017.sasg gmis www.ile www.cct www.schulen sas-scs-0016.sasg sas-intl-0012.sasg autoconfig.club autodiscover.club eccc-mac001.scieng hss-ppls-0120.ppls csg-est-0160.csg ppls-g26-012.ppls hss-ppls-0106.ppls e-prihlaska csg-fin-0167.csg sas-sra-0023.sasg mvm-ri-d086195.roslin searchdemo sas-scs-0022.sasg csg-est-0046.csg sas-intl-0017.sasg autoconfig.card mvm-ri-l126193.roslin autodiscover.card webdisk.web-hosting 11infst-1-drawingoffice-mfp-col.csg ppls-g26-017.ppls hss-ppls-0112.ppls aaaaaaa snihon riv-vc01.roslin shizuka mvm-ri-d084185.roslin csg-est-0096.csg sas-intl-0023.sasg sce-coll-0065.scieng sce-coll-0053.scieng sci176.scieng mukai ppls-g26-023.ppls numbertwo hss-ppls-0117.ppls jpns suivi sas-sra-0034.sasg hiv autoconfig.transport comm7 www.curs managers webdisk.transport ettest.ppls autodiscover.transport mailguard csg-sec-0020.csg csg-est-0156.csg nursie.ppls sas-intl-0028.sasg health-mac010.health hss-health-0021.shca daisy.ppls ris-vdlx01.roslin hss-health-0015.health csg-est-0216.csg hca-netprint-bw3.shca hss-health-l30.health csg-est-0193.csg hss-ppls-0128.ppls sas-intl-0040.sasg chp006.sasg hss-ppls-0134.ppls csg-est-0326.csg ridley sas-intl-0045.sasg ris-winnbevault.roslin hss-hca-0010.shca hss-ppls-0140.ppls sas-intl-0051.sasg int-usbmac6.sasg canser brookes stir 1gs-g-corridor-mfp-bw.ccns dundee napier www.cla ngage psy-lap-06.ppls oc-g-reception-mfp-bw.sasg sms-studies.ppls wgh-worksprinter.csg demo.m mailfe10.staffmail mvm-ri-d136022.roslin data.hanscom wachusett-rhs fps-web ns1.sps ppls-mac002.ppls vybory bcu aru csh-3-3.2-mfp-col.sasg hss-ppls-0151.ppls ris-vblx03.roslin mvm-ri-d125079.roslin brd sas-intl-0062.sasg mvm-ri-l115154.roslin tellurium.ucs hss-ppls-0156.ppls monah sci057.scieng redondombp.ccns csg-cse-0030.csg gcu mvm-ri-l615161.roslin buckingham glm ppls-mac013.ppls hss-ppls-0162.ppls mvm-ri-d067069.roslin hss-iad-0005.iad hwu ppls-mac018.ppls csg-hr-0023.csg hss-ppls-0167.ppls sas-reg-0193.sasg mmu csg-est-0269.csg mvm-ri-d115209.roslin ucw as12 www.archer nwi dmu presenze edinburgh ppls-mac024.ppls atel csg-hr-0073.csg hss-ppls-0173.ppls hss-ppls-adl03.ppls ppls-mac030.ppls hss-ppls-0178.ppls hss-ppls-adl08.ppls new-smtp ris-vlx06.roslin a500-repo uatcms mtrade rize burs ppls-mac035.ppls malatya rii-085136.roslin hss-ppls-0184.ppls sas-dis-0010.sasg corum wgb sas-intl-0042.sasg pipeline01.roslin michaels sce-coll-0017.scieng csg-fin-card2.csg eknowledge hss-ppls-0200.ppls ish sas-dis-0015.sasg hss-ppls-adl20.ppls mvm-ri-d136155.roslin mailwfe6.staffmail mvm-ri-d086204.roslin ucu3.ucu hss-ppls-0205.ppls sas-dis-0021.sasg data-nas4.ppls hss-ppls-adl25.ppls relayd1 health-omq-040.health csg-saf-0045.csg hss-ppls-0211.ppls sas-dis-0026.sasg rss1 ebri093197.roslin mvm-ri-m116085.roslin rip-brfc1.roslin csg-fin-0058.csg hss-ppls-0216.ppls sas-dis-0032.sasg tmp-psy-mac.ppls csg-fin-0118.csg sra-mac.sasg mvm-ccbs-060413.ccbs provatest rip-brfm2.roslin www.admin.eves.myed www.groupware serv03 rid-v076077.roslin csg-fin-0168.csg nara.ppls spam.cn csg-est-0047.csg mvm-ri-l134244.roslin hca-spglab-022.shca mvm-ri-d107197.roslin gfl105249.roslin csg-est-0107.csg ppls-pc58.ppls oversea dsb-lptp1.ppls weihu temphiss.health cmfs hca-spglab-027.shca dsb-pc2.ppls v10 ris-lx05.roslin mvm-ri-d115223.roslin riv-nlinxaud.roslin vpn.cn hca-spglab-033.shca www.nils hca-jpglab-005.shca hsu mvm-ccbs-060435.ccbs work2 www.elma www.arbeitsschutz www.datenschutz reklamlar hca-spglab-038.shca arbeitsschutz hca-rc-003.shca ademo yonet prion cadburybeta synthos snipe tfbasic redpoll pell pracodawca mcbeta ris-fas1a.roslin wedelbeta udtbeta rako fileserver3 vpn.au drongo hca-jpglab-011.shca hca-spglab-044.shca ehs hca-rc-008.shca skua inflight hca-jpglab-016.shca tern mvm-ccns-0016.ccns www.venue landadmin dictionnaire cormorant mvm-ri-i134169.roslin hca-spglab-049.shca hca-rc-014.shca wrw-01m-26-mfp-bw.shca vmo hca-jpglab-022.shca dcds gull mvm-ccns-0022.ccns kcms ppls-printer4.ppls wrk112.csg rodc phi-m-mattch.ppls ip12 hss-health-0112.health fileserver4 csg-saf-0039.csg hca-jpglab-027.shca mvm-ccbs-060457.ccbs mvm-ccns-0027.ccns mvm-ri-l115180.roslin pod1 pod2 w04 ppls-printer9.ppls bex test.services.learn macmini-royw.ppls www.bex mandr w16 w17 www.abbey webaccess2 hca-jpglab-033.shca mvm-ccns-0033.ccns eflow w02 mvm-ri-d107208.roslin flatland w05 w03 www.videoblog mvm-ri-i125029.roslin spam1.cn rupert mupd4.staffmail zachary hca-jpglab-038.shca csg-cse-0031.csg pickup vpn-nyc health-omq-004.health axis2 itis mvm-ri-l125249.roslin mvm-ri-d104174.roslin hss-iad-0006.iad voir heaf wrw-02m-25-mfp-bw.shca dayang busdev mybackup csg-hr-0024.csg www-dev.eauthorisations.finance mvm-ccns-0049.ccns eudb interscan tsmith bsmtp fa2 fa1 sas-alumni-0010.sasg layton ianmac-mac.sasg csg-hr-0074.csg box21 csg-est-0319.csg avupdate jewish lion.ppls mvm-ccns-0055.ccns eplab3.ppls sce-coll-0043.scieng lrc health-lap14.health scieng1.scieng darw-8-810.csg mvm-ri-d096051.roslin csg-fin-0070.csg kronos2 mvm-ccns-0066.ccns mvm-ri-d086229.roslin cam-mac001.sasg ehud hss-health-0005.health mvm-ri-l136253.roslin mvm-ri-d115177.roslin 5forhill-4-attic-mfp-col.sasg hss-health-l19.health mvm-ccns-0072.ccns sjohnson mvm-ri-d074176.roslin sas-ssp-0016.sasg rohde-laptop.ppls cam-mac006.sasg mvm-ri-d115224.roslin bs1 ktnlaser02.roslin sas-alumni-0003.sasg cam-mac012.sasg uat-dig uat-ftp csg-fin-0009.csg uat-online cqm b08printer.ppls uat-start corp-relay nonasp-nfusion o1.pulse uat-connect eccc-0002.scieng bert-ltop.ppls sas-alumni-0008.sasg csg-fin-0060.csg sas-alumni-0014.sasg mvm-ccns-0100.ccns mvm-ccns-0088.ccns guard1 csg-as-0000754.csg csg-fin-0119.csg mvm-ri-l097128.roslin lect-cassem-002.sasg sas-alumni-0020.sasg mvm-ccns-0104.ccns sas-pharm-0001.sasg csg-fin-0170.csg csg-est-0048.csg sas-alumni-0025.sasg csg-fin-0129.csg csh-2-2.15-mfp-bw-1.csg mvm-ccns-0099.ccns dsb-2-19-mfp-bw.ppls switch10 ppls-mac010.ppls cmacbook.ppls switch9 csg-est-0108.csg sas-alumni-0031.sasg linuxpc.roslin grizzly flounder mvm-ri-d127124.roslin csg-as-0000239.csg csg-sec-0022.csg mvm-ri-d086123.roslin sneezy switch11 winstats mvm-ri-d136251.roslin csg-est-0330.csg csg-est-0218.csg mailback sas-alumni-0042.sasg csg-est-0268.csg sas-alumni-0047.sasg mvm-ccns-0095.ccns mvm-ri-l107189.roslin tcms csg-est-0328.csg sas-alumni-0053.sasg dcs2 wrk053.csg cisco01 www-test.tqtelethon.dev hss-health-0137.health www-test.ccts.careers www-test.secure.vle sce-coll-0007.scieng dsb-1-19-mfp-bw.ppls csg-fin-0179.csg handc-mesh02.shca health-omq-030.health hss-iad-0008.iad www.omerta mvm-ri-m086016.roslin csg-cse-0032.csg ms-dw6-2-7-mfp-bw.health maldives www.py rinkon04.roslin csg-hr-0009.csg kyrgyzstan cityd gambia luxembourg southafrica mvm-ccbs-000002.ccbs haiti suriname hss-iad-0007.iad anguilla hss-health-0010.health mvm-ri-d125212.roslin ftp03 vbv ecampus2 derrik www.dreamgirl ris-vlx04.roslin mvm-ri-l125107.roslin epis2.scieng ppls-attest.ppls ppls-jesper.ppls mvm-ri-v096076.roslin csg-hr-0075.csg ppls-m-tzu.ppls hss-hca-0050.shca mvm-ri-d107223.roslin www.org.planning leilao majalah gfl095239.roslin mvm-ri-m115213.roslin 15bp-4-attic-mfp-col-1.sasg hss-health-0031.health csg-as-0000475.csg icl wrk105.csg hss-health-l45.health webdisk.www1 sci012.scieng o3.email hss-ppls-0169.ppls cas-lap2-kb.sasg csg-fin-card4.csg ris-vlxweb03.roslin csg-hr-0060.csg 7-1enp-g-siteoffice-mfp-bw.csg ebri053187.roslin arrnc-is.ccbs csg-fin-0011.csg crdp2 mailbe12.staffmail csg-saf-0047.csg mvm-ri-i134159.roslin autoconfig.test1 rip-d01c4.roslin webdisk.insurance csg-fin-0061.csg sra-jet11.sasg mvm-ri-d096147.roslin onelan.sasg.002.sasg autodiscover.arts autoconfig.resellers autodiscover.resellers autodiscover.local nbr autoconfig.insurance mvm-ri-d095036.roslin autoconfig.local mvm-ltsel21.lts csg-fin-0121.csg webdisk.local hss-health-0102.health mvm-ri-l115169.roslin josephs webdisk.pets www.construction mvm-ri-i124161.roslin flows csg-est-0049.csg hss-hca-0060.shca cm1 webdisk.arts sas-reg-0001.sasg npi777253.ccbs leyou csg-est-0110.csg sas-reg-0006.sasg api-old autoconfig.arts mvm-ri-d104164.roslin autodiscover.insurance www.suppliers www.marine ub3 mydomains csg-sec-0023.csg img41 testint csg-est-0159.csg ris-lxbio01.roslin sas-reg-0012.sasg csg-est-0219.csg csh-2-2.7-mfp-col.csg www-test.hesa.star.euclid sas-reg-0017.sasg mvm-ri-d095097.roslin csg-est-0270.csg envy.ph 256 shca-laptop-mac1.shca stat8 149 sas-reg-0023.sasg infini sce-coll-0033.scieng csg-est-0329.csg hca-tlab-003.shca lp3e 142 sas-reg-0028.sasg www.eval www.impress mvm-ri-d115167.roslin adecco sas-reg-0034.sasg rygel hss-health-l10.health mvm-ri-d115190.roslin sauvignon vent csg-pps-0020.csg 227 sas-reg-0040.sasg mvm-ri-d086042.roslin mvm-ri-d116111.roslin 242 mail70 mail100 manganese sas-reg-0045.sasg www.gpr sukusuku mvm-ri-m125237.roslin mvm-ri-l126244.roslin csg-cse-0033.csg mvm-sbms-130272.ccns sas-reg-0051.sasg aagc gbpackbell.scieng ppls-igel-s-38.ppls mailbb mycpanel iemail saf065.csg health-lap65.health sas-reg-0056.sasg hca-mac008.shca mvm-ri-l107118.roslin r21 mvm-ri-d096112.roslin med-000616a.roslin webdisk.ufa csg-hr-0076.csg sas-reg-0062.sasg hss-health-l71.health webdisk.samara webdisk.kazan mvm-ri-l134243.roslin mvm-sbms-130288.ccns sas-reg-0067.sasg hca-mac020.shca netstore mvm-ri-d126003.roslin csg-pps-0036.csg cas-mlb3-009.sasg profusion mail.35 sas-reg-0073.sasg hca-mac025.shca psy-actv1.ppls autoconfig.subscribe autodiscover.subscribe webdisk.subscribe wave3 vergabe www.vergabe livedemo seoservices phwifiprint demo00 ereserve hhwifiprint host73 host87 ccwifiprint hv1 t14 www.onlinekatalog traci bork pabx plataforma svr2 mbone beard ktai nali tauro brighton-hove.foi nuernberg tilma barrowbc.petitions augsburg parlvid c.tilma b.tilma guardian.services a.tilma guildford.petitions nottinghamshire.petitions citizenconnect.staging citizenconnect stedmundsbury.petitions wellingborough.petitions westminster.petitions planning.barnet surrey.petitions citizenconnect-uat.staging gaze asp3 sbdc1.petitions suffolkcoastal.petitions bassetlaw.petitions runnymede.petitions disko stevenage.petitions bins.barnet fpa.staging congbao brighton-hove.foi-register.staging thanhtra forest-heath.petitions passengerfocus.staging barrow.petitions waveney.petitions rbwm.petitions barnet.petitions melton.petitions eastcambs.petitions tilma-osm mansfield.petitions islington.petitions sbdc.petitions hounslow.petitions newforest.petitions east-northamptonshire.petitions rushcliffe.petitions jed.whatdotheyknow.dev salford.petitions blackburn.petitions ipswich.petitions lichfield.petitions sholland.petitions air-test www.d1 cv1 spacesoft recman bbn jugend www.statistik crowley www.coroner vpn15 shinho blueice vpn12 evaluator vpn7 konsultant vard vcse1 fatest-mbp.cit faitspare_mbp.cit www.libraries bluefire agava ncdm greening ggcc test.mail hpss passwd redhawk www.vis vpn14 www.university www.summerschool www.tlm vpn13 badmin linkup rocketseed zoning www.fax betasite productinfo smds-gw bala.cit www.dnn eweb2 fajphillip-mp.cit baller comdev newdelhi sexylove inspections coders vmd01 smtpout4 pingtest copland herkules l14 www.editor eliminator ibss heartnet cctest uke www.nowa ilikepie sexylady www.sleep www95 medprof osv-support motelgw syglc sfe blogfaro clickpb1 clickpb2 blogdovictor verychic dercio swvx ssml osv-message kvmde debackup osv-exchange shamtech www.collocation macu de-1 de-2 www.hypernet flickr.com dev2ns ns10.hyperhosting.gr www.grdomains www.flickr.com dv1 afrodite collocation c5p4m4 sw31 xen-de debackup-old tc22 tc21 ns9.hyperhosting.gr grdomains host5b hypernet video165 video164 video163 define reactor tc3 iroda be2 p78 theothers tstyle pressclub jaikumar newsrv justin-bieber ip124 ip125 ip126 ip127 ip128 greenmile ip134 ip135 ip137 www.arthouse spartak ip141 ip142 ip143 ip144 ip145 scriptstest ws8 sm8 ip149 ip152 ch1 www.pavlodar ns222 piko ns165 abc1234 ns164 skater sistec manpreet aliceinwonderland freethings waheed ns149 fighter starsteam ns146 mail.eu vagent mimoza stream01 dentista pornstar bino docentia medicalgroup maya2 iraqsong reserve2 gamescenter shailendra solucionesdigitales darren mmtest whatson gaudi danial carpark agat journalist danang dalnet tto data13 zhongwen minerals sibbs vim erick gplus autodiscover.twitter webdisk.linkedin autoconfig.twitter nelapsi-servers beatmix textart orthanc mc2pro daewoo blog.lib kerdoiv innov ip150 prishtina chuszz graphix fos aztech aps1 charliebrown warrants th-diary ts02 qps pravo city3 city1 www.sonda www.gryf hsmx webedge gryf sourcing virtualhost x200 priroda referee xhamster linux7 mindhack autodiscover.mx l19 brainz mysql58 webdisk.mx autoconfig.mx mysql17 mysql54 webdisk.ru cfd125 morini fotbal stab magic2 shoppers fume exer cennik gastronomia liuxue www.trader ccu saeideros mtlive alip daiko officevpn examenes cfdme01 clients2 prokat cheezy funnel ebox cheche kamilo copier www.alliance front21 ali1 charli exchas www.goldenkey asd1234 goldenkey chachu app-1 app-2 mailsec tragamonedas bags 2fast4you pili books1 loginid sg101 thepearl criminals surfer nikunj tetsuya webimages boonboon cybertech cedar2 constantine isadora adli mx29 thenexus kowalski basher jharkhand morefun testing12345 subodh bob123 succes homicides ritu cyberking virat stereo bloggy dzalgeria steady maryann ogma stbkat aveiro embla stars2 priscilla star25 tinky nunki digits cinedb devmy moviehouse govideo music4fun medoo alphatest newsbox venster teranet caoliu x55 spunky x77 howcom x87 x89 kpas piaf eurofins oldptu tonekunst klinikholmberg thaiscanhomes purekidsforside prodenmark x30 min-baad bygroth-uk x12 x13 udviklingskompagniet x15 x16 x17 designedwithpleasure x20 x21 fuldkorn x23 x24 amroptest x26 x27 model47 x29 ilearntypo3 x33 x34 x35 x36 x37 x38 x41 albertslundweb origin-secure kddi optimair koelnmesse kognitivpraksis skraldetrumf livingage breakoutimage skysupport nannaleschly urtekram-fi nyhedsbrevholm hkiintranet user010 sundhedsrevolutionen sundstafetten gespage2 portail-wifi deltakoncept gespage eric-photo urtekram-de model4 model3 model2 thysen-nielsen connecting-fields pintxos-tapas advocatel tpoemobil isfo curait nester eilersen costakalundborgkaffe bornholms veins dvin urtekram nageshop tand-klinikken lhengros familieopstilling solagergaarden scopti whatcanido sbf tys istatistik hjernebarnet cttm skovdyrkerne shopteam lisereitz tryknet 2900larocca.dk stiki zen-garden mploy dosyalar solander topmotion denfriedanskepresse holm-old implantatcenter hs3 alt1 swiftdeposit gucuhb securemobile nadine multivaco ck-travel fsfp flytteforretning ebmaalmand hrapp bookingblotter mobilsite fwpeak10 logistics2 birm releaselog codecompliance amrop vendorapp activeinmatestwenty bsocrimescene municipalordinance firecop pawnshop nutana webeocbk icereport vendorregistration bookingregister2 hrapp2 bsovpn combilent raaschou kunstnergaarden bookingregister sundhedsrev miketest vm-1 pallium loftlys larocca karrierecafeen pharmaforce fsgh noramobil kajvhansen urtekramblog jeton minbaad-shop sadra isy spbridge tug2 sancy kurfood geolab bodyschool enallia hydrogennet el-light tartufo vzweb1 onlinefragt kryten ivanmadsen bioactive innerpower umahro enalia humanvision frieser horoscopes nageold nielsahansen vinstedet motivaco signuption nivaagaard tolbod dacapo-aps rrjny wiik designdev karlshoej bovesse wwi shopinvent-ny komandskab www2007 urtekram-uk kernesund sitescreen slipslikket emediate maintest danskfamilieopstiling shopinvest certify tpoe urtekram-se circulodosmilionarios www.circulodosmilionarios amalienborg en-stillads thesociety accellion beckett teikei photostore fs111 candra nabchelny exec73 calido kanri1 calama simson healthadmin invicta therealworld airports cmsplc heathcote-ivory ryodan jarjar nicenice dartington mikimotoitalian bakerross howiespro staging.bakerross mothma veers mikimotomobile fbcomp powervamp staging.yellowmoon luckyangel pukkaholland mikimotofrench howies-de powervampracing mikimoto dev.yellowmoon gymworld electionresults mikimotogerman dynamix marajade simonsays network-services bulkpowders needa endocott medisin bvwindows gauntlet iphone4 bhutan chukshelp staging.bbq ozzel ee-1-12-0-2 bismillah teebo2 tvgstudios tarkin2 anakin2 staging.calor padme2 chewbacca2 dnsin2.in sportfish cmsplcold farlows dooku2 mobile.yellowmoon nps1 dnsin.in asddsa mikimoto-old mikimotospanish tarkin greedo enterprisedemo dev.calor scrubspro arman2 mobile.bakerross dev.pukkaherbs wicket scrubsuk aquino bulkhelp staging.pukkaherbs dev.bbq mikimotorussian howies-test effekta admiralblank stephenarnold mikimotoamerica hum piett sidious2 elderberry bathroomvillage bikram dziekanat dev.bakerross lyco brainfood.howies mobilefun4kids lightingdirect labhut howiesmobile lygo jango2 maxxis ackbar2 nserver1 m.calor images12 buy-online asalam stadtbibliothek psbank esh sparsh www.westend spania wunschkennzeichen thenorthface lovenight nettech spam11 adv1 coen buran arafat theodore flood lovepage netserv soft14 netserv2 casdev tensai hadrian wireless-dhcp238231.dod webdisk.anunturi mail.cs replics gilles dnsa ezproxy.lib pic-upload lovelife www.sdc tristate acidburn vlan311.c1.dsl demonoid bbdb2 livraison vinco peano.math guildwars2 dns-backup matchdaymail oldforums darkdivinity drzwi www.minfin creed ironmail zc1 icy parlament documente albena grandchase tse02 statistica imap5 tse04 www.aac www.surabaya www.bandung atis arcims skyway kickboxing secftp waterman worldweb maybach snowboarding socialgame www.armani tesla1 autodiscover.students nosik matricula rockheart mecanica hmp rgl djblack artemisa www.artis huyhoang athene www.wellington berater www.andromeda asistencia asia1 coolfriends daniel88 texasholdem yousuf oab webcaster www.syt www.asia1 linares upcode mackenzie reis setec magadan photos1 packers slamet tatata wi-fi gammi www.uniquedesign silverknight alhambra www.daflow rmtweb www.faccebook daflow demohost raytheon unicall dungeon vashdom www.mebel avis enef rosreestr smallworld likeaboss proekt annonce remington faceb0ok x-games essay pultehomes sodapop glink amparo autoconfig.dashboard dosantos autodiscover.dashboard mezcal flats crafty tessera garagedoors lab10 marcial finearts nat14 seabreeze oliva bharath economie vip-web layla voeux www.regions friendsnetwork agis10g hagen kivanet10g kassel magdeburg potsdam dortmund tajimi int-prezza ftp.drupal darty ftp.magento mclub duisburg darmstadt minden empretecno www.z2 mononoke afi conquer hick takeda shukri futureman aoyama madame shruti 4b turniej zafer www.4b basura www.turniej ditu 8000 kundenservice qz origen-movil www.progress andrew1 giordano bugfree w107 finance1 kdc1 kdc2 basera devilsadvocate barium 008 shogun kinzig www.of isearch kalbach phpbb2 newnews ffm.members rio-de-la-plata wwwserv steinbach of.members www.hessen westerbach jangtsekiang nidda agws sonam bakili www.logic vb3 kdg bbs0 searchapi bmg testns1 testns2 khachhang shihan somebody net2ftp vanhoa orionweb chiva portal22 www.economic coolcat truelife rajeev hesoyam badges shariq sharin poseidon02 asjp waa prace aa2 shanel sinister deven capes gabana com-vatk1 com-nytk4 com-nytk6 pando-dns1 pando-dns2 pando-dns3 pando-rss-vip aikman c1026-services pando-dummytk fcuk accessdenied pando-bliptk1 com-cache-vip bugs-vip glustercl1 com-cks-vip glustervm1 glustervm2 glustervm3 pokaz glustervm4 pando-tk1 office-dr1 office-dr3 com-dd pando-tk2 office-dr2 pando-protk1 pando-tk4 shaddy pando-dws1 ft-ecomm shaadi com-publisher-vip pando-dd x1-ws1 publisher-vip testssi2 pando-oob com-eutk1 wanem-20 com-nytk1 com-nytk2 com-nytk3 com-nytk5 com-nytk7 com-nytk8 pando-cache-vip gf-test preddy pando-dgr-vip pando-plustk1 pando-tk3 x1-sp1 pando-oob-mail pando-sb1 x1-tk1 tahari pando-ptk1 pando-ptk2 dsta sex-dating pando-cks-vip pando-ws-vip fla ib3 ayhan netforce esso rommel www3stage accm encuentro wmtest pond9 cgate mail-b nmrserver mx24 softy mx22 setting seci curp serhan goszakaz sneakcode hermsen abonnement sam123456 intranettest meis www.sispro concour labinf jacques mobile7 awais www.renew sapa nicola myimages venedig vitec freemont dima7 axistv ghetto ndbs www.freemont svp ferrets traxx rpb easyserv arc2 andreys ta3lim post1 svk al3ilm img.cams mail.cams amazinginfo assaf techman easymail binladen itemshop onezero artix www.whocares amrica saydon ucl www.motd www.servlet finans pdrives wastelands vedic blogfarm www.pj quadro labrat countingtweets twittrd nyt mrpeople as24 adinda bellaluna sanwar autodiscover.postgrad webdisk.invoice autodiscover.invoice cmsstage autoconfig.invoice salinas thanxx sandip methods sanaka 222222 webdisk.reports serverbackup shohada autoconfig.training autodiscover.training webdisk.training awesomeness openaccess dresses oar saiyan g-mail iet eastwest renewaltest cybertest akr safiya ambika sam007 ggb logz riet cnbc glide aboali leonhart eastman gridmon spare1 snsgwy.zdv wm01 medizin saanvi domainrenewal best2 betac rws qqqwww planer anuncios2 dianne helpinghand democrazy ayeha autodiscover.affiliates autoconfig.affiliates azmoodeh autodiscover.testsite autoconfig.testsite tlg anmol finanzen pitagora gopi hemanth ardis catdog s4.sq fsecure rcis csps www.sof ftech ns.s bramj 1234567890 dxpt mercury2 pushkar xjgl mainstream jp1 jp3 gabvirtual2 andie sistemas2 s005 s003 circlek skillz s004 runes file7 fia mail-02 akuma mail-04 newcolors www.soup rodrigues assist5.sq tunisia-sat kamini afg afu akb veer qwerty12 grundbuch matras anons hfd sport1 jasmina automania kmu ksb fileexchange tiko cyberfox b245 www.gadgets callmanager2 globalservices www.nuts micheal videoconference cornetto enligne guest2 informatix visualkei socialgo www.admin2 vmanager ristoranti blocker bahar mickeymouse beholder viaggi racedrivergrid siv webtek giti nhp foofighters www.studenten almanara myguitar inquery severus okadakisho tibiia vz7 woodpecker sys5 sys6 celebs vz24 localhost.dev dds100 dds101 feisbuk daas gt4 mgate marsh punkrock s6.sq fergie mail-vip rolls-royce fairbanks dvc vipmail riverdale hera2 ni2 lib4.lib statecollege b.ns.chmail design4 d.ns.chmail mas1 origin-signup.mobile.devstage7 memberstest a.ns.chmail f.ns.chmail nasu c.ns.chmail e.ns.chmail www.abiturient www.pass www.faces www.alumniforum imi colleges www.colleges www.distant alumniforum ceas pump xboxpoints locales nazar bdb1 kemi webmail-test www.poem risc thewizard razvoj t-shirts s1.ds varejo sa-loadbalancer1 testlog sa-db1 sa-workers1 sa-archive tarun jxpt sa-www1 admin-2 nfuse m.buy seatwave angler changeworks blackwater meredith www.poisk balashiha seker peca gvll00989 img.m staging.mobile seiya www.kiosk daiichi htc76 zdalna newip goldbar www.smax www.publicidade ussd fields lineservice ad-test k-1 export2 test.stats test.exchange www.scotland test.register invoicecentral apogee iphone3gs pdesign 123asd psteam shr krasotki rashmi rashid ipphone2 mc3 mc4 rapido mg3 ioan maquette cryptshare casa2 webdisk.katalog eblast rtmail assist4.sq youthclub camchat videostage nte hart securemail2 mxs1 nl2 enhance lb-origin mail.ci watervdi coawts coabenefits www.test8 myatlis atlis coavdi supportbridge courtview coaspam atlisdoc qls sslc catstest sjh jypx sjz yousendit catsprod pwops webmailatl atlopen atlisdoc2 citycouncil xrd coaworkaway zjy xn myatlis2 catcrp atl26 elmsencoder01 atlis2 xmail2 assist6.sq rt2 nyoman skripsi simpel fnet d170 hjp s5.sq probe1 webmail8 webmail12 webmail14 jnf webmail22 mgh mjg webmail30 webmail24 webmail18 assist8.sq d150 changzhou d156 jiankang d159 d144 d145 dedicated2 d146 athkar www.mybb www.topics d147 d149 d151 d152 d153 d154 d155 d157 d158 d160 d161 d162 d163 d164 d166 d167 www.katalog-stron katalog-stron d168 d169 srvmail d171 d172 geoff probe2 shoppay innu mlib 1010 libs gridui tky zzc sjjx www.yf wwt 10010 doxygen gec ezri webdisk.sub chris2 duvel jcd slideshow airforce gqt www.pobeda kansei ikd plat tpower ftp.blogs dionis sgu navic artnet xon suslik harukaze ksuzuki3 openspace iseeds acb postcards suteki caa kasaneno jenni chk orga e-district jsac regd tomonokai eapada sameti hellosensei cobanks eaapada hgh daa.aguime matsuya naoto diaries jah saitama hrw mottainai eizo glim clear1 jpl kagawa rewrite donut ehime comco heb niigata mqm sofuto iwate minhdang dangquang game7 anhduc hanami hoangnhan game10 nhi maigia vanity game9 richy gialong isdn www.bratsk koiru rankurusu perushian dooburu every-pokemon-ever matsuura floors systemy markham 2play techfaq hyperlink tmlite jivko test.mobile ez1 mr01 ec-test rdn www.lines mail.img lines abis cbw pen wbsnhes apps01 psystems otb ecorp vopforms granicus webdesktop etrakit oth univega kuvat services.int saj mahad rux ryb sop koreii priest dpf trd kukai companyweb taigame tsvb trangchu clang ww01 thumbs4 ote ms03 validacion static-3 fwsm trr fp1 web-mail webdisk.tracker henan wai zyzx rbj kazak yoshiya webforms vw4 alfactory www.stmarys s8.sq aerc xueke jfx gce crear arch2 zulutrade depth moebius worksite webdisk.r extra3 allsouls yoshimitsu nst1 sample101 ogura pcshop tsearch pc9 ucupdates mapp mindscope buyer autoconfig.banner idgroup akind youtuber secure-dev esthe er3 autodiscover.banner webdisk.banner coral2 peyvand admain tshop muumi pressa pc30 trinusduo pine.wan takku dawin pc19 pt-br saifu spare2 eurydice lyj tact assist7.sq nakai llb smartsolar res8.sq sample11 lgb linos telemaque olympe sample12 sftest melma infopoint ater isoft concorso gdl saito neron dnl fatou moloch ploiesti crios bbdd pandore mathgraph ecole sjj rrb01 slj rakuchin fujiya logstash youtrack www.cro personalmail www.789 milehigh backes kikuken ksuzuki4 mothers ttac univa templ pt.dev homestead loreto fayette muta taiba john1 vpn.office autodiscover.ask bruna autoconfig.ask harrington link2012 coastline w52 birchwood res6.sq iwantyou downeast pokerface brevard dioni fats solid1 tsn lise lovelove haxball socool mlsti arabesque diimo tenryu appetite mixture hillcountry jjoo spellbound odell inche123 katze ballin medicare rivervalley jixie clarks duonet api6 kamas license4 www.svadba odonto cccs feijao usi jeen takagi streamserver battlefield3 estafeta l2l signage inset joejoe streetball imyme iwai layouts serv207 broccoli amoremio asterism benxi shiv ftp.uat petworld doubled ultraman wowow betula res5.sq www.otto horseshoe viceversa deadant 00 jmsa onlineapps 3x aabbcc bcy www.albion boulansserie www.ntp zps apathy s7.sq arakawa wpress 333 llv mmx lxr ibps lanker horie luntan tvshop letters sxt lessismore xgs diimonet persistence 225 puchar www.puchar goteam mail1a mail2a bb1.mtq gentle coool mof majdi sisi webdisk.server1 autodiscover.server1 wangfeng quoka springer machine autoconfig.server1 lag kikimimi marverick mucchin hate 250 kondo hawthorne seasons mysql-dev appetizer girafe habi slhost gazelle grove cnn kikugawa ours benzy smtown requin jpress thewave linki bessel mpi2 mcds doomed yangzi ponta delusion ksworks edger webdisk.html midas777 tarhely minori websl m.secure novato ispy www.platform www.orbit mitsumoto hirogaku apothiki jptest serv48 serv46 submarine www.bus serv44 eraser www.uppic dvor alum tbrown radic fiberarts moonstar serv43 www.radic hanji www.martian serv42 www.fornax www.butters serv41 vitamin9 hanae vodokanal ftp.ns marieke www.qmail anakku villain mammatus ftp.ns3 named4 market9 radar1 bbcs www.pz talisphere www.fiberarts leming www.jjmusic sbs01 www.rs3 sweetcelebrations jjmusic supermoon www.parked www.mmedia www85 verynice www.jsd woodruffs ftp.lists telephonie www.radianthealth haccp habit radianthealth www.bounce gijoe www.jamestest weyl venerdi autodiscover.notes www.webmarket webdisk.notes ulva www.shortcuts autoconfig.notes free4 res2.sq www.sweetcelebrations smartdata www.squid losm angelique mconnect mcv autoconfig.exchange ezbiz mcdermott webdisk.exchange sads ao.www cordial getup adtech lacolmena cayenne samenwerken aboutus doha www.paper dobe mydear ardbeg elbruto flush navtest humanitarian testuk chambre mha ridgeback fourseason origin-www3 sv13 arys gazel hodges leica gblog digo ashida kofax scan01 redsys morita moco tsuchiura ashiya galle days7 ritmo coli thallium further ksuzuki5 ok123 clue grunwald 8community rokas ecook www.monalisa dain kangin ds20 darma miura www.mywedding www.farmer adrenalin sgl sandc bestlink res1.sq kompas demodemo darkages jordan3 rizon jordans fault xproject freesia mistest duong moonbeam disillusion swoboda peachblossom sincity limno qwerty123456789 maldi ap2012 doran marc2 vhost103 vhost104 monochrome dokdo autodiscover.correo olivaw dodam dnine amit after12 webdisk.correo autoconfig.correo highquality happy77 graviton ballet inthesky vgk echo2 modtech super4 www.profi botticelli cstar shaho contec akasha goodmorning mejis ds54 munzer spareparts wolfs fifaonline dimon acetech dhome emic vps201 autodiscover.fun crave acro dvorak autoconfig.fun nbs1 const cook2 conco comma newalliance chise is3 triplea feel20 ddos1 galleryb debut kellycodetectors 347878-web1 347879-web2 sb_0601388345bc6cd8 sb_0601388345bc450b close gearlink asumil vpngate2 webcrm fryingpan sile opac2 nbs intuition affection sqldev quirk testsql radagast nctest voffice ea2 dpms asd123456 res3.sq kp2 xwgk jwjc www.taiwan pl.test es.test webtrain www.bn elysian ns281 tabloid creativex ccftp musicnet wosp autodiscover.sport czaplinek www.wosp frodon barrier conges gb4 minerve scmail assist1.sq hschool detailing josselin ldapx autodiscover.article autoconfig.article space12 www.recreation www-6 www-7 liberator proxydev testsp gws cetis bohum raze jarek majesty mailpro znane ns-slave galleries2 hr2 mofa cus smok mikro www.giochi mpay maravillas autor tunnel1 inference ftp.test2 pro02 miniminilion fatura attic demosrv www.lis tht csg2 moat wisely yongo subway e119 db001 host001 login-test qa02-ca.qa tamsa qa02-va.qa prod03-fl.prod.new prod03-ca.prod.tools qa01-fl.qa.tools prod03-ca.prod.new prod03-fl.prod tm-glb-dns-validate salestools qa02-va.qa.legacy prod03-ca.prod prod03-va.prod 2271 qa02-ca.qa.legacy qa01-fl.qa qa01-fl.qa.legacy prod03-va.prod.tools s1.sq dev.tools prod03-fl.prod.tools prod03-va.prod.new dev.legacy gopoiskmedia sanko wmn vmart jito mizan webmail.support monsieur compile gangnamstyle apure smgw rmanager arare memcache rt-dev sneaker arang freetest gisdev spdc cas5 yjy fazheng waiyu ojd ftp.eu onceuponatime smtp-02 rsync.us produk msbd oldvpn ircache www.arhiv russianwomen ms22 ntp1.srv dedicate ms9 ntp2.srv egi www.horror redakcja plikownia www.muzyka in3 securedev admin22 think3 www.exams in11 rest1 www.yuva csat n234 www.kvm assist3.sq webdisk.global anony u4 v0 www.proc n50 da-test n66 sitex devel.int being pillowtalk n67 n68 hp3 idh informer2 n71 estore.local ipad.local neon1 selina andro ofcgw.012 beans uxguidelines dstyle downloadtubevideos beads along ipad-app bdragon wakawaka amboy sg-staging sandstorm genyou aimin oki smtpenterprise2 jfk madara ap200 kogetsu rule bonheur reggae ctlfrlay ctlfrcm ctlfrspt ctxnorth examiner rika ffx kejian lishi seemeee www.ecard www.value heine www.munin landesk schiller opie jager daj aesop gxs lights worldclass youthcenter mailin01 backupbackup soba jyj kv2 s2.sq www.livechat sensational clicktocall timebomb beta.search vsb newonline storage01 audio1 interia buss desq packaging ebp ereport mti ices firefighters kweb peony homepages s3.sq www-uk webdisk.halloween fishbone inq sysdb autoconfig.halloween aerius autodiscover.halloween digitel leti refrigerator fanpage exotika cpweb01 fundamentals nasdaq wnc vpn-mtl aaaa1 tropical sidewinder obis mgiri gandaki dosyagonder www.kopia seehotel emp3 urbangear koval soporte2 h02 mjnet mail.media dialin26 pg1 kenshikai www.push heimdal pipes dialin29 testweb01 test212 lester awaken plotters wtk mailing3 mailing4 img.shop 311 motorshow ftp100 minimum archive.mail dialin33 starmoon www.kabin suntar nine999 neogroup redmoon estatico easygame login-dev www.webpro sime faa www.faa www.p2 adminold saveme quickr n61 matest db-old n44 dragonknights n17 mthorpe dsa123 admintool dialin39 tabriz ofd sasasa xxxxxxx pcprof noaccess battlezone towel spacewar n69 voctest onemore redbone vmware3 verify1 samsan hmt arara soft2 toyoshima madteaparty sanford miyasaka ludo1 inane calgon lacie2 www.musteri musteri transcripts avin lyapunov bluejay macaron smtp21 prest quiniela sr4 danielh ripper wdesign origo fifteen hello123 saehan webmailus p10 sip.it sr8 autodiscover.corp www78 metaverse sipi dsvr assist2.sq seventy op1 roms verto weasel rpgcentral nortia stats.ads www.rpgcentral webdisk.up www.bloodlust www.sen autoconfig.up www.solace autodiscover.up www.parse foodsafety wc2006 news7 mcash news6 sys3 leaders wido prolab blanket itrack utel kbc lhotse ekaterina bpj res4.sq regista lovelygirls libmedia grouper unitas doyouknow puente view-security sml-104-2931 gemini4 www.foo ledger openldap dobong www.rcc pva mckenzie wamp host146 marvellous swebmail remart animaster araki nisystem gk2 keid web-stats moodle-test mafs artshow vps21 vps22 vps32 res7.sq sumika gtk tv123 johni jinyi dhcp5 mcast ascend nangman webdisk.avia pc232 pc231 tradmin agena project4 pc224 pc222 pc221 pc188 pc187 yourday pc171 www.switzerland tokimemo pc151 www.sweden pc103 pc210 pc99 netherlands pc160 neverending sip4 old-forum les2 atkins potatochip onandon rhs pc203 pc202 indians hampton ecolab dewitt pc201 kjk brady ipsentry adver youknow edutech lakewood balloon native de15 asin wilson1 saratoga humming another siker mayfly pro04 asder pro03 vasoula ufs hypercube killzone sdesign topliste www.kultur www.iks monimoni autoconfig.speedtest webdisk.speedtest ingenue stinger autoconfig.kb heights autodiscover.speedtest autodiscover.kb roam www.nbg hackett melaleuca benibana prices pr5 pr9 miracl pr8 s244 pr7 gibraltar biosphere cloud01 www.02 pakupaku vidocq alphaomega hacksite lx2 redeye latenight blackblack entreprise shiningstar www.association edoas moremi faj springday coer webpac jeffery urbane gateway3 adminka summerhouse sybase bgt netque dayou arial bacc webasp directors www.ntc supremacy dqxy vtw durov garret smtps.pec zerohour bluecat media15 teensworld smarthome evanescence weapon zaygr sokolov highlight maus ipr jit watchcat powerdown justone ales redfox slb sova yin rayman accom frankfort downland wei denpasar soybean orange1 smee fresnel leek kuznetsov loveni annex2 alexk scrat lovein godin webhome pusdiklat manowar elysion ahimsa www.palermo plab 2gis emailarchive trisland host254 waggawagga thenine veracity dnsweb turnover koikoi alamode kyobashi motel analyser imaps.pec paran www.kobe ueno phpmyadmin9 umeda www.shanghai sakae phpmyadmin7 tsukuba zinnia www.nara akiba phpmyadmin10 thucnghiem napster vbox1 uprising pop3s.pec webdisk.codex webdisk.control zimbra01 lonely stockage servera atwork autodiscover.free www.exp revues bootcamp autoconfig.free destinations portaleducacional vast norther important www360 nginx2 musicspace reaction static7 rtmp4wowza nsd3 costco rtmp5red5 rhsa rtmp1red5 boroda rtmp5wowza rtmp5host dunkan rtmp1host whitesoul cdn3.cache twiggy autoconfig.br cdn4.cache autodiscover.br rtmp4red5 rtmp3wowza core10 webdisk.br cdn5.cache pinkchoco cdn2.cache mr7 soocool rtmp4host websms www.success rtmp2host semicolon aftp fortpoint btl rtmp3red5 wikimoodleadmin rtmp2wowza twenty prserver vimeo chatme yolo www.fmsadmin cdn1.cache www.wikimoodleadmin rtmp2red5 rtmp3host rtmp1wowza tanuki home7 mukda mathsci devile agnieszka squiz optimist handshake detail hiroko ndroo www270 monkey01 cisweb asca carrollton-dvr2 carrollton-dvr1 gpsinfo atw statistiken dientu mail52 gozer xxxxxxxxxx mail88 angeltest grotto armonia mail89 michiel routine idrissi www.funds iproject capybara csm1 mydarling www.jobcenter jobcenter marielle autodiscover.liriklagu bsn monsieur64-com spoool-cojp hilucon-com xn--nckxa3g7cq2b5304djmxc-biz sundesu-com kpc-entertainment-com gary01-com angesalon-com soundremix-com nikibin-biz kusai-biz ad-japan-com sishuu-xsrvjp en-yukari-com tanpopo-eduhk lgts-biz kurohige-biz cosmicray-cojp autoconfig.liriklagu xsample125-xsrvjp meditationscan-info yukihitotrend-com kaitaikainou-com consultant-labo-com grit-xsrvjp most-h-com mizu-shori-com naniwaku-jp officewill-xsrvjp kurofune37-xsrvjp reconnection-lightyourfire-jp iinkaigyo-navi-net kyotango-grjp sneaktip-tokyo-com sunforest-kinoe-cojp catjp-info emigocoro-com planclair-com wccf-kaitori-com sairiyou-cojp angels-swing-com gakujutsu-com aroedance-xsrvjp dental-mg-com unagi-matsukawa-cojp s-seeing-cojp hyakushojuku-com nimurasekizai-com two-roses22-xsrvjp ikedahikaru-com sqlcore-net bibiten-com ikejin01-xsrvjp 1yes-me rootxx-com italiacity-com hinacyan-xsrvjp athome-hiei-com urayasuconpa-com miyabi-est-com test-xsample35-xserver-com aibofund-net craftbeer-tokyo-info appruns-xsrvjp shingen0905-com tubo-test-xsrvjp xsample208-xsrvjp suomikyoukai-xsrvjp toyama-maguro-cojp clinocompass-com xinfo530-xsrvjp eathalal-jp asa-kudamono-com zero-house-net xinfo764-xsrvjp kamijin-fanta-info luxury-wedding-jp hibiyacon-com o-bje-net nap-net-jp kenritsu-edu-com ivis-xsrvjp e-laguna-net kitagawa-planning-cojp nagochare-org xsample55-xsrvjp nijiironokoe-com doorico-net xn--cckcdp5nyc8g2837ahhi954c-jp viteras-jp gscsrv-xsrvjp kaedefa-com battlestar-cojp eigonokai-jp jj-office-net zqbfcx-com xinfo524-xsrvjp jinbrave-com ajdm-biz xsample156-xsrvjp pison-us t-kawai-net matubarabara-xsrvjp sudou-h-info b-mode02-xsrvjp onishilaw-com tcds-biz ximera-jp r-mhoot-com luifle-com hirayama-k-com tirell-cojp pointfort-biz tukasak-xsrvjp moneyymmt-com koubesannomiyaconh-com s-plat-jp xsample302-xsrvjp yumepocky-com xn--28j4bvdyc334s6knv0o-net trend-toybox-com matsuya-bento-com fandp-biz ngtselect-com fd-k-com snowstyle-tv aa11-me ginga-card-xsrvjp yamaukamaboko-com pc7-jp retorushop-xsrvjp horaiya-cojp consulting-firm-jp stepmailmagazine-net 010system-com crystal-dolphin-jp takanoshinkyu-com naniwaku-com pmafamily-com test-xinfo757-xserver-com wanokurashi-jp compia-info test-xinfo747-xserver-com kuma8088-com sarasarahair-net gundoujo-net a-jingumae-com xn--ruqs6f40az48fx3pk4y-com ms-kun-com x007-biz xsample86-xsrvjp s-rimo-com kogaoseitai-com howssupport-jp e-katana-biz test-xinfo727-xserver-com overflow-xsrvjp ecokoro-jp so-na-ta-net flashpool-jp aspire-co-jp waraok1-xsrvjp test-xinfo717-xserver-com hrc-mmc-com xinfo555-xsrvjp yasuragi-seitai-com kanahebi-com nagasakishiroari-com cleaning-every-jp test-xinfo707-xserver-com antiaging-jc-com pokerface-cojp drepla-kyoto-com gomi-cleaners-com menuiun-com f-magic-xsrvjp fufu-design-jp tsuruya-info jidousuisen-com tokkushouzai-com denkisogo-jp yama-net-jp idb-aaa-cojp nariagari63-com machidadecon-com pe-co-com zenkaikyou-orjp page-nabe-xsrvjp smile2u-info gakugeidaicon-com hair-baizu-com yumeya-eps-net tech-angle-net xinfo701-xsrvjp kasugaurara-xsrvjp bushuya-xsrvjp oecmikage-jp aozoranote-com xhamx-com 0all-net japan-af-com urakata-biz veggie-kouso-info topparty-jp webdisk.liriklagu mamekichi-xsrvjp twinow-jp gan-gan-xsrvjp chayamachi-yasuhei-com osaka-footballcon-com crerea-info xsample312te-xsrvjp ordering iruma-shaken-com daibutu-com pikarin01-com y-ecotech-jp himeji-shaken-com topic-path-com mailaffiliate-info massage-bed-net rekishiya-com suma-pula-com berkarte-com gekidan-ise-com project-zero-biz e-bibi-com futabakikaku-xsrvjp taiyo-shokuhin-com somecco-cojp it-walker-com onna-hitoritabi-com suemasa-cojp rimtam-com niji-web-net xn--7ck2d4a8083aybt3yv-com value-stone-com japan-smilist-org logo-cookie-com watarai-xsrvjp kyusyu-koiki-com mitsutaso-com test-xinfo557-xserver-com ykdgroup-com pachislot777-jpncom xsample228-xsrvjp fukuya-gh-jp donguri-nihongo-com test-xinfo547-xserver-com detailflower-com fromhimuka-com wsugugiya-xsrvjp beatmania-clearlamp-com negishi-nbm-com kanankaga-com test-xinfo537-xserver-com daicyu-jp imayuu-net houkikougei-com haqbi-com aurens3-xsrvjp jibai-biz test-xinfo527-xserver-com hiro-emaga-net hiraknet-cojp ngc-office-net ecogunma-jp woodynouen-com nakanocon-com test-xinfo517-xserver-com p-w-name repro-nikibi-info cgi-library-com dent-miracle-com xinfo732-xsrvjp xinfo346-xsrvjp bonn-jp tazaki-info muro-gnomise-com test-xinfo507-xserver-com tetsufuku-com ht-backyard-com nishisawa-com apricotpark-xsrvjp manamazu-net lcfp-jp xn--n8jwkwb3d155rfvd1osyt9a-com jpcg-cojp yamazumi-info kankyotou-jp genkibitorelay-com osaka-con-com mutsumi-dc-com nagoya-cci-xsrvjp friendsnet-biz npo-yulife-com sakata5-xsrvjp t-plus-p-com ayakakinoshita-fc-com sanuki-hoken-net tetsxserverdomain701-com ap-g-net honetsugi-kenshin-com saeki-ce-xsrvjp j-sp-net shunan-rh-jp xsample124-xsrvjp xn--u9jy52g80cpwok9qjzosrpsxue7ghkv-com misawasi-com creva-xsrvjp tvkansou-info mages-et-cie-com lifeworld-cojp igarashi-asia wkmarch-jp meiyo1-xsrvjp juen-info takahide73-com kajikazuaki-com hachioji-s-o-com cityonline robin-s-com gcapps-jp minobu-sakura-com usbmemory-info ohssebs-cojp universemove-cojp xsvx1015036-xsrvjp zxdxdl-com gafu-biz hyugadsgroup-com sjeng altervistas-com get-wave-com deco-shine-com topix gasnukiya-com halla-jp giropponcon-com belpon-com sannomiya-yasuhei-com kichijoji-de-con-com philknot-com aritajin-com terry-f-com plan-do-japan-com greenbird-net-com macco-xsrvjp test-xsample222-xserver-com xn--u9jxfma8gra4a5989bhzh976brkn72bo46f-com arths-net-xsrvjp sunnytrend-info test-xinfo357-xserver-com seikoshokai-cojp fujitaippu-com xinfo763-xsrvjp testsp1208274-com ecobaza-com dreamcreate-jp singlemalt-club-com test-xinfo347-xserver-com xn--ecki4eoz9849l-biz www.daleel macshoppe-com gz-burst-xsrvjp testsp1208279-com goku-raku-info yonsei-tounyu-com xsample54-xsrvjp hanabicon-com lucky555-xsrvjp xn--y8jvc027l5cav97szrms90clsb-com sennokyaku-com biznsr-xsrvjp nikken-n-com saidaiji-yasu-com mtymxykhk-com gaka-serizawa-sachiko-com toyota-shigikai-jp 220088-net kouhata-net fly-tabitomo-net tsunechan-net xinfo523-xsrvjp ekinozusaadet-com testsp1208301-com ando-furniture-com mix-colors-com kamejikan-com xsample155-xsrvjp weegeni-com musashino-rokuto-com meitoku-xsrvjp compa-yado-net salliance-org arrangebit-com nagasawakazami-com adoo-mi-cojp tokunori-net win-technos-com b-nishijin-cojp test-bloom-blooming-com joint-elements-com hatenumura-com cawacon-com alliumu-com n-plaza-xsrvjp seoul-inn-com budoya-jp lauderdale-cojp e-worldshop-net b-and-c-jp caggio-com kakeizu-s-jp xsample301-xsrvjp ms-uni-xsrvjp office-kisook-com insideworld-biz himawari-day-xsrvjp office-shiratori-com oita-kaibutu-xsrvjp jr7yrc-net glow-united-xsrvjp tamalll-com diet-trend-net manat0-com mirahalo-xsrvjp communicationss7-info newfrontier-biz pcfureai-com r102-jp okazaki-shaken-com orekuma-net shonensanso-com mikurencia-com ndc-office-com xinfo350-xsrvjp xn--lckxc7c-com xsample69-xsrvjp nikko-shaken-com xinfo342-xsrvjp teis-jp denpun-com enjoyrose-info dreamspaces-org primegate-t-jp mobadis-xsrvjp web240 hm-lab-net nakamori-shinji-net yoshida-ya-org ex-profit-biz cosmicray-xsrvjp linkstyle33-com softwaregaming-net xn--t8j3b111p8cgqtb3v9a8tm35k-jp xsample85-xsrvjp morikumado-com import-lecture-com sru-xsrvjp bakery-cork-com honyakukonnyaku-com zipaddr2-com urawacon-com trill j-trader-net arahama-org crapre-net atnnta-net glamoroush-com houkaiji-net xsample92-xsrvjp xinfo554-xsrvjp ueno-sr-com tai-gee-com revive-kawagoe-net temple3930-com nlp-jp-com godiving-jp nandemoya-com weightlossgains-com jikkoujitsugen-com keiba-twitter-com xn--zck3adi4kpbxc0dh-net aajd-biz azoo-xsrvjp melkare-com findsports-jp shonansmile-com anela-kilika-com b-official-jp sukuhiko-xsrvjp lacherie-jp netdesoho-com ikeikegolf-com washokuan-sara-com e-iwatate-jp webboo-xsrvjp shitakke610-xsrvjp nihongi-web-com yamazaki-js-jp jubancon-com finanza-asset-com socket-cojp fastingmana-net worldoasislife-net xsample332-xsrvjp liba21-com moromoro-info win5pro-xsrvjp nikkai-info infinity-create-jp jichangwook-jp xsample220-xsrvjp yoisaito-net mituba-xsrvjp tender-kaigo-com nuc-xsrvjp keb-inc-xsrvjp sorano-biz little-newton-jp ai-serv-com bolly-jp contents-marketing-jp ductblade-com ikebukurocon-com kumonoyasuragi-net naruhodoshop-com udono-com yubiz123-com willowtree-jp herbest-biz hitachinaka-shaken-com shatikushota-info ashiga-body-xsrvjp hachimoku-com nigarimai-jp dreamconcept-gfx-com fwdsclub-net test10-xsample30-xserver-com ultim-jp frenchstylejouy-com hkky09hiro-xsrvjp emix-cojp human-kyu-com xinfo561-xsrvjp omote-xsrvjp www.ibf xinfo585-xsrvjp shiki-magokoro-jp r-sun24-xsrvjp terradonorte-xsrvjp sakifuji-com xn--new-h93bucszlkray7gqe-jp xsample227-xsrvjp pay-off-bills-net xn--2-uc7a56k9z0ag5f2zfgq0d-jp ono-lc-jp maihonya-com atout-jp tef2-net r-onward-com test-xsample220-xserver-com tanopasopcs-com inu-recipi-com northfacle-com prede-com cfk-xsrvjp nanosolution-cojp rj-works-com nkginfortec-net nuutori777-com juri-jpnet jibundesumaho-com zippersoft-jp xn--pckam4ohe2b9aya2mf9574hyfduy9g-com vstlink-net ishikawa-nu-acjp maeam-net xinfo731-xsrvjp ripple-k-com publafabbrica-com sk66-xsrvjp jun-okawa-com xn--68j4bva0f0871b88tc-com zimbabwecheapflights-com okayama-shaken-senmon-com acperience-biz rakurinza-com danceahero-jp apparel-logistics-master-com beachrocket-xsrvjp avante-act-com karadafactory-com iqb-cojp hr67ekh4-xsrvjp athleticgolf-xsrvjp tbc-direct-net full-throttles-com willmatch-xsrvjp open777-xsrvjp kigyoujin-info lets-import-com pentan-xsrvjp xsample123-xsrvjp bk-1-com prime97-xsrvjp royalsalon-vip-com sundubu-xsrvjp keage-jp motto-tokyojp xn--w8jm3fycxc-com kampo-yamato-xsrvjp mizumotoryu-shinto-com ff-spa-com teiyobi-net kurashi-kyoiku-com m-mindset-xsrvjp fp-service-no1-com ideal-partner-org intibali-biz mr-webinar-com xsample120-xsrvjp fxbookmaker-info kisarazu-shaken-com egcg-info ad-innosence-xsrvjp for-others-com denshibato-net npo-jambo-jp milliona-sd-com aibrain-orjp softrance-com yamau-xsrvjp siramitsubushi-net smartphonesite-info hanshinkaen-green-com yosimitu17-com otokuna-life-com akirasblog-com healing-spot-com xn--mck0a9jm25le99ae3b91q-com inmoss-com ryo331-com alfastart-net suncompany-cojp tukasa-saba-jp kouchouen-com alfactory-xsrvjp specbrothers-com 1-web-jp xn--68jza6c5o5cqhlgz994b-jp k-balance-com fly-system-biz morebeauty-jp xinfo762-xsrvjp jbiz-cojp 11desune-com fullcollection-jp garden-kinokawa-jp kancraft-com sugiuravet-com gan-bare-jp kokko-net-xsrvjp r-m3-jp nightworkwe3-com toshiki-cc makiko2nd-obog-com xn--zck3adi4kpbxc7d2131c5g2au9css5o-jp xn--u9j5h1btf1e9236atkap9eil-jp xsample53-xsrvjp buranara-com yotsuba-insatsu-com mailbess-com web-business-freeman-review-com hataya-ah-com raku2-kenko-com hageno-ikumou-info tri-works-cojp yasukuteiiie-jpncom two-d-net yoshikawateien-jp yukki-lanakila-creations-com iruma-mobi xinfo522-xsrvjp a-koike-grjp xn--7-hju882iudfymevpi891bvkcm7t-com dateformc-com zinen-xsrvjp xsample154-xsrvjp xsample309-xsrvjp oonishikoumuten-jp merumeru5252-biz lions-forum-org hotel-yagi-cojp smilehonpo-com sunflower-kashiwaya-com burapan-xsrvjp floramor-net shachu-haku-com rbs-xsrvjp jubancon-net n-yomiuri-com battlemusic-net jbn-xsrvjp xinfo706-xsrvjp asbmain-net zasso-taisaku-com bonbon-chouchoux-com sv3rd-com asayake-jp xn--u9j5h1btf1en15qnfb9z6hxg3a-jp genkishop-jp aajd-net calmcalm-net xsample300-xsrvjp kikimethod-com arigatou13-xsrvjp artepo-com midjapan-jp yokota-camera-com nksmmc-xsrvjp rakuzanet-jp lappi-jp minatokobe-hanabicon-com acnweb-xsrvjp xjs-xsrvjp yamatsu-jpncom heart-oasis-xsrvjp happyrich8-com e-gakki-com kumamoto-roumu-com ja-kumamotoshi-jp yamadajimusyo-com subarudayo-com tekka-merumaga-com xinfo51-xsrvjp mckokoro-com www.kwp xn--54qq0q0en86ikgxilmjza-biz papaben-club-com hkazuf53-xsrvjp crazyken-com torisyou-jp lhotel-du-lac-com suigekka-jp active60-jp-com daitreck-com shutoku-info xsample84-xsrvjp takechi-info andseeyou-jp bjmz-jp ts1981-xsrvjp meiko-plus-academy-com interior-option-com 10english-net satelliteworks-asia youvision-jp nanosui-com pison-net abiesmikuriyacake-com web-business-freeman-com xinfo553-xsrvjp sf2727-xsrvjp gokugero-com j-crew-sc-info yakuzaishi-fc-com kurema-cojp tansan-beauty-com hiroshi-project-jp sisei-orjp baikyaku-kyoto-life-jp xn--1cr778h-com biz4apple-com manten-ff-com donnatokimo-info next-color-xsrvjp gouhime-com yamada-dc-info kokorozashi7-net kenmana-xsrvjp ii-yado-net italian-otto-com kusugula-com ryuka338-xsrvjp heian-suzuki-cojp shihou-jpnet xsample331-xsrvjp lamphouse-jp original1930-com aiwish-xsrvjp kimayu-com grow-up77-com chukeikyo-xsrvjp diesel-watchshop-com sachis-pocket-com masiki-denchi-cojp nice-pc-xsrvjp mamma-cojp yrnetmind-xsrvjp fbms444-xsrvjp studio-hinemos-com rakurita-com mamegen-com japan-cmc-jp sure-oil-com funeralville13-com xsample218-xsrvjp en-job-com asia-create-xsrvjp perfect-fucoidan-net ecoms-store-xsrvjp visage-group-net kaientai-to doronko-rokko-net hana-aprico-com kagami-town-xsrvjp jpcrossroads-asp-com yasuhiro-tanaka-com temp5 ashiya-grace-com outlawdesigner-org diamondlight-cojp dropsite-xsrvjp vagstp01-jp setdeem-com fraise15-com meiyo-is-com organic-nana-net hairmake-polish-com is-style-mode-com grit-inc-com hospitalities-cojp silvers-site-org webrent3-xsrvjp sawamemo-com xn--live-995g-com gene-potential-com ryukou-butsudan-com genko-nyuko-com powerfarm-info anemptyspace-org izumos-info englishosaka-com xsample226-xsrvjp ten10-xsrvjp moneychild-com campus-web-jp ashitakaasatte-com meteor7-xsrvjp junjimu-jp hold-chance-party-com xn--t8j9b3du706b3ud-net kandasr-com kobo-cuoluce-com nanba-yasuhei-com wsp-jp evina-biz bis-project-com colors-leaf-jp etoca-net seibouan-com daikuru-com reopardi-cojp gargantia-jp onsen1126-net or-nitta-com suuudesign-xsrvjp naritareal-com xinfo730-xsrvjp xinfo344-xsrvjp wealthhappy-info throughsky-xsrvjp yukitake-jp rebcreation-com tsuruoka-jc-info tamate-jp aoteapacific-xsrvjp testdomainx324-com takemitsu33-com yoshihiko01-com inaka-pipe-xsrvjp freedom-benefit-com kuroiso-bagel-com inging-cojp testdomainx329-com kukankaihatsukobo-com hara-ringo-net inugumi-xsrvjp yota8000-com jtp-corporation-com bigone-cojp testdomainx335-com la-chouette-fuji-com xsample122-xsrvjp fujimurabl-com brandbay2012-xsrvjp kantan-hp-net littleany-com painter blogyanwei-com happystylelife-com hand7-jp fretta-jp test2-xinfo744-xserver-com kojima-mf-xsrvjp originalbook-net nitii-info camuro-grjp hp-tuneup-com threey-net 6notes-jp xn--facebook-9s4goej6w4khkpe-com yonago-giken-cojp xn--eck3a2bze7g088r1tnu2vn7l46v-com 2oku-jp hunabashi-yabusaki-syaken-com endingnote-music-com a7works-com baisersvoles-net style-lab-biz united7-xsrvjp craft-mai-jp tomioka-suga-shaken-com sagi-yattukeyou-com nanomi-xsrvjp youvisiondenotest-com loran1990-net maru777-xsrvjp can-cara-com duzele-com notokids-net yuyu-rlx-xsrvjp styliv-com openerp-asia-net visual-exchange-com gokugero-xsrvjp jp789-xsrvjp soola-jp cloud-www1-xsrvjp elocalgov-xsrvjp denkikai-com i-m3-jp yosibo54-xsrvjp plussoft-cojp kokona922-com blackyuushi-com its-ec-com xsample52-xsrvjp xn--qckr4fj9ii2a7e-jp api-master-com chatoran-com joy-circle-com murakoh-jp jiyubito7-xsrvjp kassist-xsrvjp yui-aragaki-net eapuranntu-xsrvjp xinfo521-xsrvjp dreamlife-invitation-biz y-guard-com yorozuya-system-com xsample153-xsrvjp delmot-tea-com bizzone-xsrvjp nanikowa-com como-nejp pla-neta-cojp asp-kawahara0202-biz sezaki-cho-com sakuzei-com teccsearch-xsrvjp kyoto-shaken-com mebel-antique-com rubowa-jp sidebrains-com karuizawa-silk-com pazzot-net collabox-xsrvjp keisei-cs-com houdinisportswear-jp acmeloo-net admi-biz celebrity-rich-biz starhill-cojp odakesyokuhin-cojp jun25-biz heartful-travel-com kk-to-bu-cojp tailor-yoshidaya-jp yamazakiminoru-biz hoken-consul-jp itousanfujinka-com carve-jp nusoft-jp uenodecon-com kawagoecc-com sasakitchen-biz furubayashi-eye-com kamo-jinjya-orjp h5910lv8000-com yurai tanagokoro-kyoto-com crerea-net otonworks-com studio-carrot-com us-vocal-info manzashop-net slightfeverboy-com kou-mei-ok-com yukimanta0808-com otonohachan-com tnc-ep-cojp kenou-info mellow-touch-com apa-inc-cojp syouhachi-com ieda-dc-jp xsample83-xsrvjp yamagatagift-info currencytradingexpert-org testxdomain305-com 787navi-com rpmoutsourcing-com watchrepair110-com habu-kouji-com infotrek-xsrvjp katsuyama-g-jp adropmeet-com rep-power-jp testxdomain311-com haridekenkou-com xinfo552-xsrvjp murakami-kagaku-jp nafooe-com gotouchi-japan-com aiwa-f-nejp neco-store-com n-insurance-cojp sanom-net fpp-jpnet testxdomain316-com tsubomi203-xsrvjp global-smi-com ogasa-biz ism-blue-com usadrumshop-com mahoo-net grocen-shop-com nomiiko-com nakayama-kids-com wildcard-jp-com uruoi-water-com muex-net ht-backyard-xsrvjp yumikp-xsrvjp w-life-jp test-xinfo745-xserver-com xn--kckky1j2cwa8f1cb-net kotomine-event-info e2-square-cojp truck-asahi-com juggler-jpncom musashinogroup-com tototoclub-com test-xinfo735-xserver-com xsample329-xsrvjp ro-haircare-jp xn--u9j5h1btf1eo45u111ac9hf95c-com oo0n-net acr-net-xsrvjp test-xinfo725-xserver-com yuyasawada-xsrvjp clubcafe-gr2-jp jream-jp test-xinfo715-xserver-com maaaks kami-to-nuno-com food07-com normanet-cojp olive5-xsrvjp odaiba-con-com test-xinfo705-xserver-com xsample151-xsrvjp art-craft33-com volleyball-coach-info liv-design-net himeji-jv-com log-research-com shop-pro-jpnet hkwspace-xsrvjp hikaru114-com shonanbank-xsrvjp sanda-kokuzo-com salmon007-com roumu-sodan-com 820-co matsuda-siko-xsrvjp horie-yasuhei-com christianpeau-com clarity-life-jp inter-act-jp tsujiguchi-jp tmk-xsrvjp yujinetwork-info testkimura34php4-com siestarea-com rakanka-com nipponhomeopathy-com tokaibun-com hunabashi-coating-com vellsheena-jp teitoukentouki-com localfoundation-jp xinfo583-xsrvjp imagebank-nejp xsample225-xsrvjp daisycreate-com ristoranteilcanto-com hitachi-shaken-com add02tv-xsrvjp makinos-biz bs-mebius-xsrvjp ietateru-com stakao-net xn--t8j0cgq9xucf2ooiyhodz566d8m0a-com neko-free-com gofun-xsrvjp xinfo121a-xsrvjp takuya-yoshimura-jp check-the-rhyme-com megamatu-net libgarden-com homare001-com kjmail-biz sell-car-info xn--3kqvs447ab16b-net gaobu-xsrvjp cipiu-com test-xinfo585-xserver-com wapos kitashinchicon-com xinfo728-xsrvjp xinfo343-xsrvjp style-lab-net fbms1-xsrvjp higotokou-com nouen-chokuhan-com n-t-lab-com fatal-encount-com hanacupid-plus-net myt-p-com myanmar-partners-com med-takaoka-xsrvjp takayuki-1973-com offshoring-digest-com e-kagayaki-jp ii-kao-m-com ishikaitoriya-com kzyhsgw-com test-xinfo555-xserver-com jinbochou-com hands-on-it-com eyomo-xsrvjp trashcan-xsrvjp design-omakase-com test-xinfo545-xserver-com iwamoto-clinic-jp xinfo737-xsrvjp xinfo352-xsrvjp new.new junwa-jp aiaokayama-orjp g-orion-com kuwabara-dental-com wawer spinell-biz test-xinfo535-xserver-com picocraft-xsrvjp wakuwakuart-com xsample121-xsrvjp chofu-daikokuya-com hypr-info story-kobori-com test-xinfo525-xserver-com ctrans-org test-xinfo515-xserver-com test-xinfo505-xserver-com fishing-shopping-com style-lab-org y-jig-com m-shinkyuin-com sipweb-xsrvjp esdirect-shop-com wood-roots-com h-yoshikawa-com sowa-com-com hotel-tenjinplace-com enjoylifeafi-com bgm21-com kazuart-cojp test-xsample330-xserver-com web-main-biz jeffnipplesworld-com kakinoshizuku-com enduromasa-com mitumorisien-com rightcure-net evis-xsrvjp gatturikun-com wealthhappy13-info homus-cojp gontakun-xsrvjp momo00-com connect-k-com inexpenshop-xsrvjp xn--eckm3b6d2a9b3gua9f2d2431c1m6a-com everythingdoeswell-com test-xsample309-xserver-com kanewa-m-com mc-ken-cojp nail-frosty-net xsample333-xsrvjp k-go-biz chuo-f-com test-xsample300-xserver-com eaupure-org calibexpress-com rsapo-com sxscontrol-com vd23-xsrvjp takasaki-nagai-shaken-com gdchoice-jp ows-npo-org la-maison-courtine-com dr-fukuoka-net pharmacistnavi-net flets-jp-com shdanavi-com kurofunemarketing-com slashowy-com xn--fdkc8h2az097bv1wbh4e-jp brens-jp nichiei-cojp test-aflat-com rlize-org jouhousyouzaimassatu-com yukabon-xsrvjp trendwadai-com binarygift-biz siraisi-cojp seodelink-com smart-housing-biz xinfo519-xsrvjp sansak-jp genzankai-xsrvjp homepage-ya-info theyarehogtied-com futurepirate-asia taimai77777-com woody-life-cojp rokko-dog-net tajimagyu-sushi-com test-xinfo355-xserver-com syakosyoumei-hiroshima-com avantijapan-com samuraiclick-japan-com saeki-jibika-com felicejapan-net test-xinfo345-xserver-com tomenokome-com e-pro5-com ebook-jpnet skjioudhcuy656dius-com jey-string-jp kazami-com global-trendmkt-com business-strategy-meeting-com kobayashi-og-net design-the-way-com l-com-xsrvjp rjbb-xsrvjp yahabus-com e-maku-com xn--yckvb0d4245c-jp frigus-jp kireinadiet-com xn--i0tq7meooqf-com testxdomain307-com ginga-card-com izu-xsrvjp form-com 4c-session-com haisyanokunitora-com kome-shibahara-com kyorindo-com ktscope-com inthegarage-jp milumoda-xsrvjp kumomakurax8-info dowkakoh-cojp yamatonadeshiko-biz xn--39ja4cb4nqb6d4fu546bkkucpl7d-jp oita-cando-com daiki-suisan-com unfixedsystem-com xsample82-xsrvjp kataoka-kaikei-orjp hok-me airakirishima-com panopano-jp jorjia-comtw cheerful-xsrvjp taka02dive-xsrvjp goe001up-jp testxserverdomain12030159-com m-benz-cojp taxiway-jp xinfo551-xsrvjp kikusui-sushi-com break-through-net-com low-cost-jp suemasa-xsrvjp silverrush-jp excy-biz xn--u9j0goar6iyfrb7809ddyvakw0e2vh-biz miyake-office-com freeken01-com dance-studio-itsuki-net tetuzuki-dairi-com unpatta-com 2chomecon-com a-cnet-cojp hirosaki-redapple-com kokai-jp xsample129-xsrvjp sendai-proxy-service-com morii-tatami-jp jewelrydisk-com akabanedecon-com kurashikihanpu-com parchive-xsrvjp hello358charlie-info sm-solutions-biz anac-jp xsample328-xsrvjp osakapeer2010-com surg2-twmu-jp cubik-com-net xn--nckuad2au4azb6dvd8fna2594hb0sc-biz karadano-com heart-full-com pasosuku-com aiuto-jp okazakitokki-cojp honmahajiku-com fphokensoudan-com avatarhp-com oki-xsrvjp u-amon-com yamatocool-com babyumiwake-com san-ei-info asupro-jp mavericks09-com rakuyasu-e-net iizo-info tamalink-biz stylegate-jp ecollab-cojp amjinternational-net akazukin-xsrvjp fan-gate-info slot-1game-xsrvjp ogino-dental-com zeal-xsrvjp nailstudioasa-com umedaconh-com prime-more-com t-tcn-jp pojiiki-com ryukyu-goten-com yukatajapan-com e-janai-com aicle-bu-com isiwatari-com v-fort-com tui-cojp ikejiridecon-com toeishinyaku-com tanabereform-xsrvjp autoconfig.booking morinonaka-net enkara-net watanabe-gate-biz lesthetic-net comm-w-com yurumean-com yumyin-com trendmaturi24-net sync15-xsrvjp liberal-woman-com niji-nejp satou666-com tcplus-cojp matsu-nomi-com naganocon-com shoeip-cojp minatoku-kaigoren-com wakamatu-biz sunbeltpartners-cojp neo-create-com xinfo582-xsrvjp webdisk.booking niiza-syaken-com xsample224-xsrvjp hiramatsukenzai-com haradajun-info 1100club-jp airial0525-xsrvjp ayumikuro-xsrvjp junkbuyer-mac-com kyuudann-com webstyle-cojp kaitonaka-xsrvjp sin-kaisha-jp sgsg-jp invest2001-com meichashop-com kintenshi-com humanlink-xsrvjp vvuvvu-info sikumi-jiyuu-com smount-com bahamas-freeport-info xinfo727-xsrvjp cote-to-com thesoundofthousands-com posy-xsrvjp is-token-com tatuo-xsrvjp yumizclub-com marungai-info worldrings-hana-net ddbistro-com kijima-lab-com king-soukutu-com ohmiya-com g3company-com kitesky-net shimizu-motorcycle-com kumafukucen-com japantrading-cc wlb-xsrvjp bambisystem-xsrvjp vaomusic-com bailojapan-com igam-info motsuya-olc-com catseye-jpncom xn--eckm3b6d2a9b3gua9f2d6658ehctafoz-jp iine-kawanishi-com shonai-ya-com kozantyaya-com hr67ekh1-xsrvjp dreamcreate8-xsrvjp autodiscover.booking kaigyoushien-com roppongi-con-com acqwords-com hoshino-me xsample119-xsrvjp townace-pro-com arrowcom-net avantijapan-net trend7shin-com yoshiihoikuen-com yasooo-net heart-furufuru-com goodreform-navi-com animesoku-com tc-sanwa-cojp xinfo148a-xsrvjp hakodate-shi-com hss-web-jp seijo-dosokai-info bass-gatsun-com pyonchi-info iloveharajuku-com wajoy-xsrvjp avon-shop-jp jyuzen-dental-com grand-plan-com sakabeclinic-com xn--line-yn4ckbymxil606bodya-jp fujihomes-com ehhen-com shoda-pack-cojp mo4c-com anvar ticketlife-jp mizuha-jp nakahara-agency-com yarukiswitch-biz surge-hair-com paint-kumamoto-com bi-frecce-com chuuka-com xinfo124a-xsrvjp enpelancer-com kindai-mansion-com jwvaughan-com l-guldy-xsrvjp meiyo-biz maod-jp ilt2-biz xinfo586-xsrvjp yaseru-asia asa-eshop-com ryugakuseiwork-com xinfo758-xsrvjp la-confy-com cross-share-com imagiq-jp osaka-denkikouji-com sugar-lake-com yuri-pharma-xsrvjp jiyugaokacon-com mikihifuka-jp tme-i-jp ieys2-xsrvjp entanna-com hirotakanet-com do-inaka-com karada-koubou-com turuta-jp xsample50-xsrvjp hayakawa1456-com kazu-hirono-xsrvjp tsunageru-net almetyevsk chuen-navi-xsrvjp xinfo549-xsrvjp sabo-kanon-jp rikuafijyutu-com xn--pride-ym4dqj0d4g-com xinfo518-xsrvjp test-xinfo716-xserver-com ilt2-com taku222-com honatsugi-con-com xn--u9jxhkb1qu36p2lc-com ijinjin-xsrvjp pethelper-tumugi-com turigu-ten-com g-zipangu-jp 8010-cojp minamisenba-yasu-com theisao-xsrvjp machikado-xsrvjp magropan-xsrvjp xn--eck7ake2fza4b-jpnet shimatomo-com kokkoya-net mikasasports-asia non0804-xsrvjp rirema-xsrvjp amc-seiwakai-jp hs-dhr-com 4415-jp namikawa-gear-jp accessall-xsrvjp test-xinfo541-xserver-com luxury-music-jp membering-jp akeru-an-com parco-jiyugaoka-cojp yellowstone-jp xn--zck9awe6d5565ccnra-biz sapporo-recycleichiba-com eikoudo-com kondodenki-jp zest-camera-02-com xn--cckueqa6319czn9a-com iris-eyelash-com uttigogogo-com testament-xsrvjp kobadesigns-xsrvjp sawata-cojp cyber-i01-xsrvjp terasaka-xsrvjp gh-yanagi-com knowhowrecipe-com kota-papa-com fkuykoukdoa-xsrvjp miryu-ya-com venus-space-com gyoseishoshi-shiose-com hutako-com piano-renshu-com e-okinet-com 9pt-jp xn--u8j7b0f9doa5d4g3281ak25ctkc-com mystery-room-org test-xinfo534-xserver-com fbms33-xsrvjp jenrobgroup-com netter1-xsrvjp sen-ju-com office-sam-com sho01-com saiseikai-gotsu-jp okakaikei-cojp nankankyo-net mae-ca-com evahs-eternal-com eigoforth-biz 7gates-net shiraiwamitsugu-com kazunobu7878-com sylphide-m-xsrvjp tuapse lagunadental-jp milky-holmes-ofc-com train55-com xsample81-xsrvjp tenryosui-com fxchips-com aroma-na-net dimitrovgrad tom-sawyer-net rihabirikan-net earth-t-jp estax-cojp tanaka-group-cojp nobukisaito-com nabetabebe-com hk-teahouse-com 111e-jp homestyle-bz officetom-xsrvjp xinfo550-xsrvjp yasumochi-law-net mitsutomoltd-com xn--zck9awe6d692p972a905d-jp eccome-jp saitsu-com dmd-nejp sweet-beauty-jp yao-ec-cojp tiffany-ogoto-com isiscoltd-xsrvjp xn--tor55ycb159b1ndz7ifa3356d-biz giulietta1886-com sawadayuya-com broslink-cojp kayaxiv-net foxhdy-xsrvjp tenogeka-com w-clutch-cojp nail-aries-com amochi-jp kpro93-com xn--jdka9gb-net dorotonyusekken-info fx-crosses-com drbarkus-com h-bee-com saika-sports-com heart-cushion-com sale-xsrvjp gucci0122-com tokyo-roujin-jp umaoh-com dearmine-net catservant-xsrvjp tourgorilla-biz hikari-flets-com aliatokyo-com icreative-jp kotonoha32-com kobeee-com metaltech-8-cojp yoshikk-com hokuken-xsrvjp website83-com tvaom-com uta1-xsrvjp t-intl-cojp paintory-com hoken-sukkiri-com macross-fanclub-com xn--y8j2eb0209aooq-biz popcul-net mirei-uranai-info tukuba-con-com soujukai-net i-leaf-hanahata-jp kkinjo-com eco-up2012-com waocon-com handcreation-net toyosudecon-com ecconnexion-xsrvjp publishable-biz kibino-com xinfo581-xsrvjp verylen-com kyodokun-net ogataengei-xsrvjp rsw01-com xsample223-xsrvjp pleasuregene-xsrvjp yagurazushi-com c21-ogswr-com la-matie-com noa-moving-com denden0375-xsrvjp delsole-bios-com beauty-art-ryo-com haisyanonishikawa-com kagayashio-xsrvjp webkentop-com shihatsudo-xsrvjp ki2-xsrvjp 3dsatsuei-com terry-f-p-com pman-bros-com k-ravi-com bgtv-xsrvjp tatamidani-com xsample327-xsrvjp manabu53-com bloomspace-kannai-jp balakovo center53-jp uchiwa-ooyabu-com kareisyuu-biz you-tak-com estage-biz ogawa-shika-orjp xinfo726-xsrvjp xinfo341-xsrvjp kagawacoop-com dokuzimesen-com bo-doya-com u-archi-cojp tabi-con-jp worldholdings-jp takayuki-ll-xsrvjp devil8-com risokakaku-com mayumbb-com akane-e-com sefuri-shaken-com fucker sihousyosi-houjyou-jp syougatuapp-com nogami-wedding-jp syosendo-xsrvjp kotobayo-tv qjin55-com sapuri-kenkou-com kaigahanbai-com xsample118-xsrvjp riddlepuzzle-xsrvjp mie-sports-orjp kanto-clinic-com ziggy007-net goko-h-com hidamari-b-jp king13-xsrvjp s-kensha-com cloverhomes-cojp xn--zck3adi4kpbxc7d-biz subete1-com wwwxyz-jp gaiaokane-xsrvjp takaragi-iin-xsrvjp wing7878-com homard-festa-info ohakanomadoguchi-com xn--duz45k-com archm-com shibano222-biz volzhsky yokohama21-com nakasuhaken-com dddmmm-info relcc-com ile-jpncom paparazzi-tokudane-com wubarosiermaschine-com stencilhair-com shihiro-info g-kscom-xsrvjp zare-goto-com kashiwadecon-com evisevis-info 0906daiki-com e-mediasystem-biz pier-stone-com yusukeaoki-biz xn--u9j5h1btf1e330r917aok7b5id-com shvideo-biz boxystyle-com minasayo3734-xsrvjp clic-clac-jp jushin-biz kelbox-com cer-n-net xn--ujqp84atlah52f-com koto-note-com denritsu-cojp cookiec-com bike-ridestar-com eym-xsrvjp filingcabinetscheap-org yual-jp aquastudy-jp o-bs-cojp hotelgranbois-com gong-yoo-jp aoi-nakamura-net xn--news-4c4cuuha3z9b3580f16c-jp round-dev-org xinfo757-xsrvjp test-xsample318-xserver-com happy3-org sansak2-xsrvjp tenryosui-net pallu-jp ebisuyasan-jp next100-mobi headway-xsrvjp all381-com humanlink-r-com erika-jpnet ehimeokayama-com bastiani al-medic-com k-plus-nail-net egaonojikan-com test-xsample315-xserver-com sv0-xsrvjp fd02-info palmgate-xsrvjp yamashow-reform-com findanect-com technopolice-jp kabu-michishirube-com yamato-ac-com nobuyukieto-com kagi-qq-jp adsl3 xinfo517-xsrvjp mid-nation-com carole sunnyshmail-net shigacon-net xsample149-xsrvjp yuyasawada1-com al5586-xsrvjp kotosangenkyousitu-com porphyria-jp enter-word-com tokyo-sundubu-net facebook-page-jpncom xn--zck3adi4kpbxc7d3858d8zc-com jstaf-jp cosa-xsrvjp himito-com seirios-net wih-viewer-com teryori-jp jen-xsrvjp bid-xsrvjp dream-east-info tachikawacon-com htn-cc crazykenband-com bltc-cojp light01-xsrvjp go33l-com hagicyosu-dou-com 10pipstrader-com maristhand-com psychotherapy-jp saykei-com svcdeaf-org cressence-salon-com nt-mc-com doredoko-xsrvjp xn--k9j703lrer-com yuhiglass-com nakayamaderavet-com xinfo127a-xsrvjp cl-hearts-com yasooo-xsrvjp onishia-xsrvjp leadea-xsrvjp brixc-com test-xsample31-xserver-com pit-design-com yellow1003-com nets-han-com fit-leading-cojp abccraft-xsrvjp maltholic-com makotonohsan-com premier-ballet-com 1streform-jp xn--gdkxar8d4dc-com xn--n9j8gnb1bza2am-jp ishigaki-wedding-jp toryburchoutletv-com cepavinis-com woo-yan-net hpservice-jp js2013-net koara-kids-com piececlub-jp risshun-info mahalo-web-com xsample80-xsrvjp japinglish-com bellbell-info hana-salon-jp xinfo103a-xsrvjp suisokan-org sansyu-ya-cojp testdomainx322-com studio-angel-net ba-chi01-com xn--zck4ba9kwb1956ag23ad2za-com recolon46-biz nishiazabu-con-com tokyofanhaus-com wattam01-com blobiz-xsrvjp xinfo548-xsrvjp pclub-xsrvjp intention-xsrvjp taikyoku-en-com beastpets-com element-bz okane-antena-com tbo38-com daikichido-net astone-info ryugu007-xsrvjp sun-face-jp musou-gakuen-com photopierre-com src123-xsrvjp le-kind-com s-motoclub-com fis-xsrvjp studiomym-com s-treat-com guiters-biz pluspeace-net dip-dev-net jhigh-net kawaiolaokona-jp le-bretagne-com angeproduction-net fieldofpine-com kurumecb-com ecollab-biz basskiti-com xsample326-xsrvjp nihonweed-cojp iphone-iresh-com 3maison-cojp hanamine-com otanjoubi-cake-com tij-babysitter-com 44ok-biz xn--9ckkn5226aut1aee3bgbf6ma-jp brandoffkaitori-com hro777-com hiyoko-f-xsrvjp honmahajiku-xsrvjp mikamiyui-com eikaeika-xsrvjp thinkingbirds-jp incenx-com toriii-xsrvjp kyouritu-f-com mms12-jp iwakuni-ymca-xsrvjp test-xinfo763-xserver-com hthththt-com yoshino-koumuten-com ngsk-dha-org kumamoto-hp-com iscle-com 5rion-jp sinsaibashi-com easypachi-com kampo-yamato-jp test-xinfo743-xserver-com imokoi-com 0257762813-com entrust-xsrvjp amu-web-xsrvjp www.spirit petone1-net asmik-xsrvjp test-xinfo733-xserver-com atsuko-coubo-com kul-site-com test-xinfo723-xserver-com testsp1208270-com hot100fm-com xinfo204-xsrvjp rehman2039-com test-xinfo713-xserver-com l-create-com xsample222-xsrvjp boribonoeuf-net testsp1208275-com test-xinfo703-xserver-com nixon-watchshop-com ebisucon-com xn--ecki4eoz2903cuuwhdt-biz mocjp-com esthe-core-com gori3355-com hamakazetarou-com aigi-net-com itp-xsrvjp yuminn-xsrvjp yuki-inoue-com soylatte-jp korudeo777-com tereza-cojp takken-mobi md123-net shinkikakutoku-com meiyo-jp xinfo725-xsrvjp noni-happy-xsrvjp canal-interior-com skeppshult-jp nano0321-com yuzumo-com s-a-jinzai-net assist21-orjp meichu-cojp taaf-shinjuku-org alphatau-net xn--88j6ea1a4250bdrdi9am84bkx5cbp2b8xe-asia luciole-classe-com gigeinc-com keeno-asia uranai2012-biz gijiroku-center-cojp green-2-com shimomatsu-com homus1-xsrvjp saiki-nejp dik-xsrvjp vd23-com kaguyahime-f-com richquest-org footballshop-legends-com sweet-loveletter-com shinjuku-conpa-com toramaru02-xsrvjp all-cosme-jp monodukurijapan-com xn--cckwaf4jng-com er-nerima-com fit-hip-com u-bike-com ipnetfarm-com projectexceller-com memory-travel-com one-mode-jp terrapin21-com xsample117-xsrvjp kigyo-kokuchi-com baketu-cojp junko21-com 7-cs-blog-net vakcom-info badgeblackbox-com test-xinfo593-xserver-com daaue-com eeyorechan-info template-party-com auc-aifa-com 100seo-jp sentei-kumamoto-com yukuru-honten-com neoapx2121-xsrvjp yukyu-h-com tanizawa01-xsrvjp test-xinfo563-xserver-com nakatsurutomoko-com nakatomo-step-com eyehorn-net novelsounds-jp test-xinfo553-xserver-com puru2-org studio-th-com infinity88-jp shoga3-jp seoky-xsrvjp test-xinfo543-xserver-com karate-jp-com club-s2-com eden-japan-jp xn--u9jz52g24i4sa42enx9aeir8k1b-net m0523t-xsrvjp uud-info test-xinfo533-xserver-com koreaichiba-xsrvjp diginfo-xsrvjp facebookapp-xsrvjp ipaa-nagoya-com e-enak-com xsample140-xsrvjp theory-ken-xsrvjp epa-c-com test-xinfo523-xserver-com parama-xsrvjp houjo-cojp xinfo756-xsrvjp simple-smile-net test-xinfo513-xserver-com mc-sss-com slip-case-com fl432-com takeuchi-hoken-com hiro-guitars-com b0 odairashoukai-jp test-xinfo503-xserver-com c-sharing-xsrvjp 81smile-com yod-on-xsrvjp xn--pcka3d5a7ly86z14i-biz welcometo-nejp nagase-syaken-hikawa-com motionworks-jp st-tajima-biz takasakidecon-com nightfactory-info dental-no1-com kaoku-biz xsvx1011020-xsrvjp kickboxing-kashiwa-com test-xsample327-xserver-com harimitsu-cojp atelier-mamemaki-com herbteapresents-com most-adult-xsrvjp onara-kusai-com pachiloca-net xinfo516-xsrvjp test-xsample317-xserver-com ampchan-com 5-es-com sg-transmgr-xsrvjp try-and-buy-net xsample148-xsrvjp re-sound-jp test-xsample307-xserver-com kousikai-net esa-sawamura-com seikoukai-zushi-orjp super-compa-net akashi-syaken-com psclub-jp fishmind-jp bantyou-org g-s-c-cojp designbatake-jp 1chou-jp teppanteppan-com air-victory-jp sogacha-com ace13-info matusitakoumutenn-com hatachi-xsrvjp eishin-ac naluto-net intercross-info mediaserver1 yumemarche-com 1919okinawa-com f-maruka-com isshisha-com yamatoroman-biz smtown-passport-com nkk2-xsrvjp hukugyou-shoukai-com 045310-com yoppy009-xsrvjp implant jbja-jp rouxdistaff-cojp hoaloha-ohanaband-com pcsidejob-com xn--ddkf1h-com koikurozu-com blanchett-hair-com hondaisuki-com west-m-jp 6pmn-com koiz-me noh-oshima-com test-xinfo344-xserver-com xn--u9j5h1btfxee0254c9vzb-com test-xinfo353-xserver-com murakon-net four-friend-com xn--ecki4eoz6990n-net doutonboricon-com app48-jp-com test-xinfo343-xserver-com dynamiteking-org xn--u9j1b755lhwlmhm0pjeia182v-com pointmaster-biz bekotei-jp b-trust-systems-com test-xinfo341-xserver-com markc1 xsample78-xsrvjp kagami-tm-jp nanbacon-com la3-beam-com fitsdiet-com augolfjp-llp-com sm-link-xsrvjp alpalp-xsrvjp royal-body-jp webone-cc athome-mj-cojp zone-portal-com otopost-net xinfo547-xsrvjp jp-hyperweb-com fr3 chefclub-com ginzaconpa-com kappou-kikuya-com cpk-hh-com europort-ironprint-com xn--n8jwa6c-com azvogel-com admini-s-com gaia0369-com newbabygiftbaskets-net kamig-jp tag-dake-com barikan-blog-net sakamoto-engei-jp gocebu-jp minato-auto-jp tarabya-boschservisi-com seach-c-com msinter-pv-com ventitre-xsrvjp wk-apple-asia xn--u8je2227b-com re-frames-com sabureview-com tm-ad-cojp xsample325-xsrvjp dr-suisosui-com webject-biz tenjinhanabicon-com nara-conh-com ya-maki-com toyofumikaneko-com kazuno-meishi-com santoku-net-xsrvjp kengyofx-biz keep-life-com office-sr-net webooman-com kyonara10-xsrvjp onlinecasinodekanemoti-com primavera1997-com truenature-jp vtwins-net celebstyle-japan-com owlview-jp s-ponii-info muko-shaken-com dance-sports-net nemlino-jp car-seibi-com xn--tdkg5cc9fc7935nm0f-biz hito-chiiki-org thaisrs-com tokyo-ic-xsrvjp cradle-to-grave-net uji-chara-net soundspice-jp takakurashinji-com jbiz-xsrvjp tsukamoto-dental-net alpine-apps-xsrvjp ascorbic-box-com fc01-xsrvjp selfish-cm-xsrvjp worldcycle-info katsuragigarden-com xinfo106a-xsrvjp secondstage-car-com sanjyuushi-xsrvjp ein-xsrvjp jubjub-jp transfer2 kandai-mansion-com asunaro-grp-jp r-pep-com sat-mental-net wec-future-com ootani-net xinfo560-xsrvjp datsu-colle-com boschsecurity-jp-net hirosaki-ringo-com tkmyume-xsrvjp koutazeroism-xsrvjp haisyahatap-com xinfo578-xsrvjp npo-jfta-org hispano mistgrass-com ioris-xsrvjp xsample221-xsrvjp netter1-com kumage-rk-jp testsp120423424-com k3-style-com hand-yume-com minohharmony-com 6777-jp theoutdoor-jp farfaro-com penplus-jp korakudo-com makkoy-xsrvjp takashimabio-com freelifelike-com 12sunhome-com steak-ichiban-com lcs-jikken-com spawn-dev-com sakura-cosme-com w-workhome-com teikokusoken-cojp makibi-com hachioji-con-com 0507sun-field-jp kankouniiza-xsrvjp xinfo724-xsrvjp xinfo338-xsrvjp stra-ws-com adonary-com bangnacoupon-com idarts-cojp amalpha12-com magic-gu-com freedom-corp-com gz-burst-com kawasaki-sougi-net rekishi1-xsrvjp coloplfan-com focal-p-xsrvjp jwebcreation-com bloomsbury-photo-com seitai-kumeda-com jobpla-com joy-strike-com znf-cc ayuda-biz gori2012-xsrvjp atsumaru-xsrvjp sishuu-com makoto2008-net em-agency-xsrvjp test-xsample319-xserver-com liflow-net tint-jp chubuoudan-com nonhoi-farm-jp teiken-xsrvjp kishimotosyouten-com style-lab-xsrvjp fisphoto-com xsample116-xsrvjp ooidekan-com p-pr-info xn--pcka3d5a7ly86z14i-net with-planning-jp cyber-cubic-com hibinotatami-xsrvjp kokumotsu-saikan-jp fukumachi-cojp ikawa-xsample50-xserver-com artificial-photosynthesis-net testxdomain320-com nagoshi01-com arujanaika-com xn--ruqr59dpuht2t50er1m-jp azureblue-xsrvjp r-mizuno-xsrvjp gakushif-com influentialmen-net samaa-cojp silc-jp ee-english-com senbokumomoyamadai-doin-jp cecodel-org ssid-xsrvjp seibunsha-info web-matrix-jp webarx-cojp shikitu-net tokusuru-print-com mydays-off-com japanadvancedmall-cojp musicmmm-xsrvjp sanoyas-eng-cojp gpc-kyushu-com irezumi-ya-sl hiro-odecon-com kouninkaikeisitoyo-com mamasnote-com aquarela-jp niveusjp-com lsstatsuta-com atlantisfalling-com ahti-jp siw-jp fantanet-jp harbarlandcon-com ntc-tool-com zero-sys-cojp bijincoupon-com 1day-implant-net couleur2013-com minami-yasu-com jgt-tour-com kizan-kouyou-com kaiungoods-jp counselornavi-net green-dental-me trendoffice55-com cobee-jpncom xn--hckqzd2f3dwc2d3a-com kyoubashi-cul-com xinfo515-xsrvjp facebook-app-biz runchan-jp keiko12-com heimat-ltd-com xsample147-xsrvjp xn--zck9awe6d418qo4jbw1c-jp okumura-sekkei-net m-tree-info takatec-info lebouquet-bz maiko-hotel-cojp arklab-biz aslynx-xsrvjp es-lash-jp arcras-com akaike-ss-com image-nail-net misao09110704-xsrvjp tsi-xsrvjp shinga-cojp proxy03 geppappixi-xsrvjp karaj forest-kk-com reitakukai-jp oki-navi-net mikuriya-xsrvjp eco-imagine-com n-rock-xsrvjp rakujisha-net akion-cojp tem-pus-com tomtak-com fb-jisenkai-com powerstone-rin-com healing-spot-xsrvjp sousha-net ripd-info kawasaki-syaken-com happybank-cojp br-tokuyama-hcp-com arakazz-info 1-1st-com whitoa-com roupeiro-com 12suh-jp takeshi97-com econowa-org wee-xsrvjp jrps-org rjen-asia bilbao-jp mohemohe-net 121btl-com rimowa-suitcaseshop-com ijci-info miyoki-cojp omotenashi-job-jp onsen1126-xsrvjp rinotter-k-xsrvjp tsuruda-ganka-com tempur-com ito-consul-com kaga-fes-com i-lightly-com matsudaiyaku-cojp graphicbeat-xsrvjp lbks-jp winningfield-net lib-job-com t-lostbarrel-xsrvjp kyoubashi-yasu-com web-blend-com xn--cckc3m9cq08p0u3ai3w-biz ainsel-info xsample77-xsrvjp shoppeta1104-xsrvjp en-pc-jp web-arte-biz uesportal-com launch-pad-jp zigzag-label-com g-ks-com mistgrass-net hacophoto-xsrvjp pug1-net chargercam-com cyberdesign-xsrvjp cp-av-com higashishinsaibashi-yasu-com ideaman-nu kameyamashachu-nejp varuna-xsrvjp mental-h-xsrvjp nori1-xsrvjp moba-net-info onejustice-biz haniwa02-xsrvjp dreamplus-biz tukasayou-xsrvjp kanayama-cl-com golgol-xsrvjp yokadoichi-com djr69-com okashinosakai-cojp e-hm-life-com xn--cckc3m9cq08p0u3ai3w-com expand-muchiuchi-com balletstudio-reverance-com testdomainx325-com soylatte-xsrvjp hai-saga-jp jubjub-asia hk715-com kawano-tm-com social-game-biz bishukan-com umihair-com mtshastajapanhealingfoundation-com h-h-lab-com testdomainx331-com ris2r-com k-i-jp kimuragosei-cojp nissei-cc life3-xsrvjp shiraibutsuri-com hyper-kenchiku-com xsample324-xsrvjp mental-cojp jyokoshoken-cojp poco-a-biz www.pardis testdomainx336-com mk-financial-xsrvjp ebook-jp-net premium-life-info e-takino-com xn--kckwar5itb7grc-com testxserverdomain585-com ashiba-cojp shirakabako-biz cihs-courage-org taa-xsrvjp touch--me-com qtopia-jp rto lapps-jp big8686-com satellite-seo-com mame-no-sato-com kaigojoho-hokkaido-jp d-linnet-com sym-q-xsrvjp kagushop-biz osakakita-hanabicon-com affili8-marketing-com lukema3-xsrvjp slaves-jp joowon-net whiteline-bicycle-com ayuzak-info kuroiso-net enecost-cojp otakuism-net kazupk66-com rakuikumama-jp xn--00-bh4a8cuhme-jp suidousetubi-xsrvjp denoukeiba-com olivenoniwa-ookubo-com montejapan-jp www204 sus-wako-cojp collegehula-com marrrtaru-com bistro-vignoble-info bonia-jp xn--n9jxild6c580r9ygq36b1ocor6evm4b39d-com japanflower-net prosemi-com shimamura-reform-com peekaboo-xsrvjp xinfo577-xsrvjp oumigawa-com xsample219-xsrvjp scryypy-com solare-kenchomae-com reito2274-com cobaten-com sprouts-xsrvjp sideway-jp you-our-com jes-co-jp blisslife-jp xinfo158a-xsrvjp aipet-cojp yousai-jiten-com osnews-org arcadia-systems-net tintlab-com xinfo723-xsrvjp xinfo337-xsrvjp tipmarketer-com hatomove-com yamaurakensetsu-com kieishouji-com sr-onetop-xsrvjp xn--p8j5cxcyjlcygn342e-com dounano-net xn--u9j9eud6c3b3bzb3015d38xbyhc-biz kagurazaka-con-com f-estate-cojp taiyakitei-com plusdesign-info soltilo-com yuutasiro-com sakadesign-xsrvjp afortuneteller-biz affiliate-negoro-biz tokimekihonpo-com lib-gate-cojp l-deza-com kiyoshi1180-com tokorozawacon-com clincash-com test-html-com kimono01-com sumahotuuhan-com rakutarojp-com hapicom-jp kita0770-xsrvjp xsample115-xsrvjp toolbox-repair-com jumonji-u-net mkcore-com aspect-dp-jp v-softball-info aomori-me fukuokabiz-com scale-xsrvjp raku-nakano-com eco-imagine-net xinfo109a-xsrvjp kakuyasujoho-com belle-cheveu-com g-wks-com loisir-hakodate-com kumamoto-investment-com ys-square-jp zakkanowa-com facebook-app-net a-business-mail-com smo-labs-net densyoku-net orb-pro-jp test-xinfo726-xserver-com japanesedesigncollectibles-com sanjo-b-com fullplusca-com oogai-com westfieldhousebnb-com umekantei-com greendaikou-com fineartstudio-info samuz-net testxdomain301-com note-123-com iine1-xsrvjp modernforest-xsrvjp ladykaga-me newentertainer-com kamata-con-com hokkaido-traveling-com igial-com design-sample-com kurumedecon-com boy3-net testxdomain306-com kouhoukai-jp tsukasen-com kakazujimai-com shinjukuconpa-com kurokawaonsen-xsrvjp smartphone-club-info e-iwatate-xsrvjp kazu-bz rakugofan-xsrvjp xn--cckagl3fc6czknac2gn3hscza2hzgf0225npksd-com 39antenna-com testxdomain312-com koshigaya-dc-com partyglide-com addplaza-net g-excellent-com momosign-com miki-soft-com bellegraph-com n-insurance-xsrvjp adman-cojp ecomott-cojp testxdomain317-com lomy-thai-com anesakiapart-com f1-gate-com moicom-xsrvjp keishin-net-net santomiya-jp yes-2784-com yogurtia-net kyotoujigawa-hanabicon-com goyoutashi-jp keyringpics-com eco-works-jp jellnail-dvd-com xinfo514-xsrvjp o2ocafe-net ishiwata-rashi-jp shougai-navi-com allmato-me xn--cckc3m9cq08p0u3ai3w-net ankul-com lovesquare-info atozwindows-com yoshino-i-cojp gyakutensaiban-info nichiei-sv-xsrvjp tomidvd-com sakura-marche-info independent4-xsrvjp apptongs-com jens-e-jp sfa-chitose-com franco-jp mermaid-xsrvjp shinkodo-jpncom ittaku-xsrvjp mtcr-jp xn--yckc3dwa2295ckj8ah82a-com xsample35domain-com jlr-kobe-com rinotter01-com dream-stone-jp tomohirokinoshita-com xinfo340-xsrvjp adworks24-cojp meo-auto-biz tom16-com liveinasia-info about-doors-xsrvjp yanbaru-jp soulofgold-net tekken2-biz chisuibrass-com xn--ick9dc3e7aa8i-biz pinkorokakumei-com goodreform-biz probbax-jp-jp media-producer-net myaru-com estenad-bigan-info xn--zck9awe6d4687a257a-jp griter-biz l-w-xsrvjp lisec-orjp 622334-com testup-net rokugo-asia kiyoshi17-biz densisyoseki-reader-com saizou01-com camonoe-com aris-kg-com monozukuri-nippon-com easycom-cojp newglasgownovascotia-com dayori-net asahi-agency-xsrvjp nogizakacon-com ebrietas-org takahata-auto-jp mashuk-jp info-netbiz-com quick-eigo-com mallorca-western-festival-com matusima-xsrvjp vanah-nakatsu-com onsenken-jp seina-xsrvjp fifty7tk0188-xsrvjp zakinosuke-com kinkmonster-com atelier-nobara-com fcsakuragaoka-com kk-sc-net xsample76-xsrvjp ktaiseed-com horie-t-jp gavaiyoka-com optronics-auction-jp xn--t8jo4884a-jp jsfs-info yoikode-xsrvjp quesera-yuki-com arailaws-com xinfo545-xsrvjp mori-photo-com bongyaku-com testsp1205552242-com katuos-com autm-hamamatsu-jp media-producer-org celebrity-pro-am-classics-com aurens-info under-the-tree-com haco-photo-com yuugajapan-com 1515-tv happyabundance-info km-land-xsrvjp packb2b-net assorezo-com demo30 guchikiki-chamomile-com suninlet-com shopafroaudio-com yuri-medical-jp j-forest-com asumia-jp shinsuke2315-xsrvjp jakujoen-com info-movie-com happyrich-biz smtn-jp fusenya-biz isogube-xsrvjp wishcraft-cojp uvd6-xsrvjp pilkasiatkowa-com xn--cck0a2a1dug6be8l-com hellogoodbye-xsrvjp fujinomiya-dry-cojp irisartjapan-xsrvjp xsample323-xsrvjp ogasa-xsrvjp km-land-net bebit-com xinfo379-xsrvjp kokoronoisan-com karenaiki-com wp-sample-info ryouridougarecipe-com thecomputersolution-net xn--39jube-com xn--cckwaj0kmd4e9bd-com xn--nbkzdraq9b9dtevlv08xj5b1vh-com hikarinotane-com tre-ca-xsrvjp xsample150-xsrvjp otowa-wedding-jp superb-cojp tomosdeputyservice-com orugae-com ihavetogo-asia macha13-com sakaisouzoku-com function-five-com hashimoto-schule-com successrecipe-biz keihan-exterior-plan-com getphonetic-com xn--kckb1c4m-jp matuya-knit-com aquapress-xsrvjp bujutsukarate-com gestaltschwarze-info ekenzai-com hsk-archi-xsrvjp bestplanning-xsrvjp tuuhan1-com ts-ado-com chuo-dc-net c-how-biz gangnambeauty-jp 1okuen-com garam-dinnings-com cpsjp-com bit-com-jp himawari-shinkyuin-com kokorono-resort-com 7go-jp zaxtuta-com kellch-com plan-kimono-com furanotourism-com xn--n8jvdsa6soa5jz01vtb9bg6lk11hdbi-jp specialforce2-net xinfo576-xsrvjp marathon-festival-medical-net soooooooooon-com design-cha-com roots-eng-com yurakucho-con-com pset-xsrvjp aquafarm-cojp kenaf780-net sp-vision-xsrvjp gallerybooth-com mcls-xsrvjp kanagawa-roujin-jp wind3000-com daiwakogyo-net soralink-com celemarry-com merumeru5252-xsrvjp net-businesses-biz laneige-info earlyservce-com golden-item-xsrvjp yururi-web-net xinfo722-xsrvjp test-xinfo741-xserver-com yutakajutaku-com i-seikotsuin-jp komon-se-com test-xinfo731-xserver-com fufuzukan-com meimonconsul-com niku-kitayoshi-net mhplan-net coniconi-card-com test-xinfo721-xserver-com granpia-jp yo1-xsrvjp yumemagic-net bloom-blooming-com test-xinfo711-xserver-com cvsiy-info moe-jk-com blue-drop-xsrvjp gyakusenkyo-com gyusujicurry-com test-xinfo701-xserver-com samegai-me sendai21-com office-akashiya-com xn--cckcn4a7gwa5p-com xsample114-xsrvjp kotsuban-belt-jp fudemojihonpo-com samansa-eco-com dailymnews-com miurazoen-com sleepnightsheep19-com facebookmultilingual-com astalive666-com bidtest-info jbn-cc jishamap-com hana--home-com test-xinfo107a-xserver-com hired-cojp club-hanasakura-com nichihaku-com e-fuzzy-jp juice-no1-info dl-sys-xsrvjp 1985games-com cosmo-mizu-info mic-fishing-com triplearrows-jp forum6 do-ticket-air-com bscreate-xsrvjp coco39-com horaiya-net vizdev-xsrvjp xx00123-com asa-pro-net happybirthdaypresent-net slim-free-jp mimatsu-wd-jp fly-journey-net smaho-media-net atelier-niji-com hack-you-org test-xsample312te-xserver-com scachan-com dogwoodgreensboro-org machipri-com hikaku-jouhou-com ebisu-go-jp test-xinfo591-xserver-com addtrust-cojp hodou-jp art-law-jp hakoniwa-toybox-com test-xinfo581-xserver-com quafolium-com tk0324-xsrvjp taguchi-xsrvjp ms-cl-com sannomiya-yasu-com kunikotakahashi-com waganse-jp nakamegurocon-com bp-labo-com r-mansion-net eco-power-jp test-xinfo561-xserver-com uttishop-com test-xinfo551-xserver-com kazukasegu-com horiba-gafu-com jiyugaoka-orjp it-serv-jp xn--jprz31c82x93etka-com xinfo513-xsrvjp sousha-jp aijanren-com landjp-com dream-g-info aglo-shop-jp utayuki-com roks-xsrvjp xsample145-xsrvjp gakuho-net test-xinfo531-xserver-com blessvery-com gunma-kansenjohokyoyu-net ishiyy-com test-xinfo521-xserver-com yotume-com bousai-bread-com test-xinfo511-xserver-com tsuyamakoyou-xsrvjp zz5-biz machiori-xsrvjp aginfo00-com schoolie-jp arcadia-ex-cojp mizunasu-org hsfdf119-com test-xinfo501-xserver-com xn--n8j4mybtf1e2217b-jp shophidamari-com ntcsd-xsrvjp la-neigh-net amashiro-asia keirin-campaign-com www103 matchkk-com chiezou-xsrvjp nihongo-daisuki-com uovo-kyoto-com webstyleair-xsrvjp maruka-nouen-com pcjp-com phine-jp kanto3-xsrvjp funabook-com goalkaramiru-com olc-xsrvjp cafeterrace-syu-jp arteq-jp kaminishi-xsrvjp test-xsample305-xserver-com twinv-info pagejp-com keicyousou-net kashiwada-xsrvjp satotti33-com ogikubo-magazine-com 221b-net sakematsuri-com isseico-xsrvjp mrmk3-com anotherselect-com soma-bikeseat-com at-attain-com admans-xsrvjp egaodaisuki-jp xsample75-xsrvjp cowabunga-app-com thedcdimension-com rengoku-circus-info matusima4494-com imonobito-net heart-cocktail-net yutaget100-com aotate-com sakurado-xsrvjp cranky-hb-xsrvjp sogo-hone-com rokushu-com kagayashio-cojp tsujishikaiin-com yossy01-com poplifejapan-org swish-xsrvjp ji-beer-com xinfo544-xsrvjp travelingbirder-com malzel-com casablanca-jp 5on-biz atplus-cojp zanimoenfolie-com sailingstyle-cojp lovpap-info god-cleaner-com omoti-biz yoshu-shoji-com nishitaka-jp funai-consul-xsrvjp pees-cc xsv-xsrvjp ggoodnews-com test-xinfo351-xserver-com ankhresearchinstitute-com yullyanna-com techno-pia-com tomasuke-com jc-project-xsrvjp malaz delight-workshop-com xsample322-xsrvjp kumakko-jp xinfo592te-xsrvjp xn--qiq69x-saitamajp testdomain1072123-com 0da-biz tabi-yoyaku-com kyugoro-xsrvjp bvbox-net mangoflag-com kumashinren-com lc-takatori-jp masa-don-com androjapan-xsrvjp yoihanko-jp dekomechan01-com two-roses-com cloverhomes-jp xinfo540-xsrvjp tobira5963-xsrvjp fs-xuxu-jp freedom555-biz kurumacom-xsrvjp ogoutatamiten-jp suppli-kaiin-com 1031produce-com kote-site-com to-ko-ne-com igamblingreview-com senkyo-navi-me ispice-jp beauty-salon-la-alegria-ubecity-com cocolable-xsrvjp ozawaayumu-com pasoall-com pinachee-com uxf-cojp garlic-onion-com attosystem-cojp kumitori711-xsrvjp nagoya-con-com pre-style-com meimonedu-cojp sakata5-com tea-studio-y2-cojp shiroyandesu-xsrvjp xinfo575-xsrvjp okw-snowmobile-com richness-xsrvjp kujukushima-visitorcenter-jp xsample217-xsrvjp enjoy5key-com ks-corporation-jp action24-jp yumekanau-k-com ohnoseikotsu-com mizuhokai-jp lopple-xsrvjp besty-ichigomilk-info w-bukkyo-jp xn--z9j3g6bzc7bxc8c4074d4nud-biz abundance13-info ds-shikinoie-cojp vendium-net netapp1 emoto-dental-net announcement-xsrvjp kurose-info dreamaffilistyl-com hs-group-cojp linx-corporation-cojp toyota-kansenkyo-com tsuruhashicon-com tanakashika-com fkohuman-com 114tx-net skeidai-3l-com fudousan-nagano-com paperhousesha-cojp rikon-bengoshi110ban-com thinkplanet-xsrvjp xinfo721-xsrvjp server-ptsd-xsrvjp north-giken-net kataigi-xsrvjp xinfo566-xsrvjp turning-point-biz battlespirits-kaitori-com benriya-net minken-net-com shidou-seitai-com mz-corp-jp gotanda-mien-org valueup-info syousuke-jp miu111-xsrvjp touho-yamawa-cojp youvision-info otokukasegu-xsrvjp xn--6oq618aoxf4r6al3h-biz gakuseievent-xsrvjp e-douguya-info aiheart-jp xsample79-xsrvjp libertyandmoney-com umehara-biz xsample60-xsrvjp tryangle-sys-com xsample113-xsrvjp test-xinfo109a-xserver-com extreamposition-com miki-mobi testxserverdomain120301356-com fukensan-jp wonderparty-net test-xinfo108a-xserver-com tribuddha-xsrvjp misato-kome-net 7and6-net holiday-homestay-com gojo-aijien-net nagasaki-sam-com m-davide-net aroma-shikaku-com lyl-jp portalshake-com re-pair-biz test-xinfo106a-xserver-com idumi-g-cojp xn--28jzf747o512b-jp test-xinfo105a-xserver-com pacoten-xsrvjp yamada-tatami-jp ignis-nejp sharedsoft-xsrvjp dhcp1a xn--pcka4lj0a1as2jf5847fr93b-net bbboso-jp shinsaibashi-con-com mikado-bekkan-jp testsp120821test-com piisko-xsrvjp mitumame-jp test-xinfo103a-xserver-com aiware-distribution-com babybaby2012-net web-shin-xsrvjp londongeisha-com test-xinfo102a-xserver-com nioistop-net murakami-b-com goodchance-xsrvjp amazon9948-xsrvjp nds3 testxdomain315-com test-xinfo101a-xserver-com gofun-p-net 6230ongaku-com officels3-xsrvjp basekobe-xsrvjp thegate-key-com asa-hh-com come-x2-com hakkou2-xsrvjp bfesca-com uni-space-com sanwakougei-com unhwa-cojp myt-p-info infinite-as-com globalimporter-jp 33abundance-com xn--a-5fu2f3a-com zepto-jp machiako-san-xsrvjp bethpage-jp 4ssb-com fusacorp-xsrvjp lai-inc-jp xn--k-pfuybek0nvb2cue-com yoshixx-com kekoberry-com enomad-jp xinfo512-xsrvjp afl-design-com wakouki-com xsample144-xsrvjp mogabrook-jp starvictory-com datusara-net jin-1999-xsrvjp o9obank2-xsrvjp rakuzanet-xsrvjp mekakushi-fence-com fukuchiyama-shaken-com freelife100-com independent2-xsrvjp chibadecon-com nfo-bridge-xsrvjp carelearning-jp ys-office-xsrvjp meguminosono-net promotion-writer-biz lifecore-cts-com advanbill-com takamiyaki-jp eaglebowl-jp sie-ric-com tabi-17-info deceuninck-thyssenpolymer-com test-xinfo539-xserver-com metaltex-jp double-in-com testbsoy-info t-marunouchicon-com zaidan-zenyokukyo-com kyoka-biz m-nakamura-biz testsp1203334243-com luggage-mania-com whynotme-xsrvjp oh-bento-com lipostore-xsrvjp becasse-jp 1create-es-com clsc-biz kaguray-com testdomainx327-com guitarland-hagoromo-com josei-kigyou-info bwest-net cyrano-studio-com xn--pcksd1bza2ae0c0qsen902bcxvc-net cne ocatcon-com honeycomb-tani-com browniedesign-xsrvjp apps-f-net maruxen-jp takarakujimeteor-com go-youtatsu-com lc-takatori-com afiri-navi-com kateru-jp hzm-jp netpost-biz a-itc-xsrvjp tetsuro-matsumoto-com kenpo-cojp nijino65-info kandadecon-com powerstones-jpncom homecare-net-it-com sanom-xsrvjp minami-skh-com near-sendai-com xsample74-xsrvjp xn--zck9awe6dr30vedfmxiwrkn2c-jp ikecon-xsrvjp liberators-jp tomochiku-com si-man-com shihou-jp-com yumemorita614-com cuoluce-com bunbunshop-net xinfo543-xsrvjp boatrace-tokoname-com japanflower-jp cyber-intelligence-jp kawaoto-jp atrapas-net noizumi-org tomihata-dc-com sunkujira-pj-com kouei-wellcab-net hokuroku-com club-zex-jp osakanaichiba-net stylemart-jp clarity-xsrvjp leadea-org fukuoka-shaken-com atomic-synergy-cojp unc-xsrvjp acnekill-jp arugeki-net esanyasou-com iphoen-net e-kurozu-com antidote adcee-jp evis-jp tonbi1-xsrvjp outmatch-jp nasdebarraca-com magokoroichi-com hosokawa-k-net xsample321-xsrvjp aisai-home-jp elitedance-jp ttcom-jp echo1456ms-xsrvjp hoscoco-com shouhinhikaku-com shiseikan-biz server08-xsrvjp taste-technology-com morito-xsrvjp runjapan-net sdj7-com iki-shokusai-com kumacafe-com irohamai-com ogreservice-com theisaoharikyuu-jp sokuhoyo-xsrvjp kanankaga-xsrvjp zappa-st jdg-toyohashi-com yeast-cojp miebbf-com xn--z8j2b6je2iphpbxa6it546f-com waterbottlepeople-com nmas-xsrvjp multipharma-cojp denritsu-solar-com oyaizu-xsrvjp mantanya-com pandwitch-ishikiri-jp clavor-xsrvjp amihata-com tonkatsutei-com studio-kawamura-com yumepi-com soft999-xsrvjp k2s-xsrvjp feru-g-com fit-labo-jp qhm-lab-info testdomainx328-com trusty-co-jp brandingbox-net testmail-xsrvjp calintjp-xsrvjp adachisekiyu-com okabe-medical-com moneychild-xsrvjp office-sugiyama-com xinfo574-xsrvjp sozokobo-xsrvjp h-osaka-jp kansai55-com steer-wimax-jp testxdomain319-com jbg-ongakuin-com xn--u9jtfobzbycc5c2d5a7kxky383a900c-biz fd01-info jsn-hokkaido-com itukinosato-com ikoh-jp gchaoo-com schonbu-com handsome-xsrvjp jobcrew-jp 2waraji-com e-hanjyo-com mayser-jp y-jig-xsrvjp mm2850-xsrvjp diamond-dust-jp aoi-cosmetic-net hatsuneya-net cds-xsrvjp lc-g-jp ballanconsulting-net tanabe12-xsrvjp kamei-acjp shinwa-sprt-jp roots-eshop-com pendet-com xinfo719-xsrvjp ca-room-com teppouya-com koba-labo-info creli-com hibino-tatami-com lushlife237-com ddhouse-xsrvjp gen-mu 4976-jp fujibaba-xsrvjp karadalab-xsrvjp xn--zck9awe6d872rezhp3y9g1f-jp abinvestag-com listforless-sc-com cgi-kudoshoten-com bla-cojp micrya-com heartful-trust-jp seibudai-com rootx-xsrvjp xsample112-xsrvjp horitaclub-com fujii-nouen-cojp p-ch-info reframe-jp-com e053-com magnolia-coffee-com mienaidaigaku-com tosuseitai-com sakaikunmeidou-com purple-stitch-net jap-xsrvjp crossabi-xsrvjp osakasouzoku-net takkensyuninsya-info sinminato-com ikujiikumen-com hayatombo-com teisuiyu-xsrvjp la-cle-jp xsvx1023248-xsrvjp xn--fdkc8h2a1876bp0k-net hatomaga-com fdo3-com alpa-sys-cojp reibee-com syakarikiya-com kvit-xsrvjp tomomo-jp baytradingclothing-com doris-spanish-com caleb098-com golden-angel111-jp dsplus002-xsrvjp liucompany-xsrvjp xn--w8j6ctc930wo9za2qf-com y-matanity-com nakayama-shouji-jp e-nichido-net seconddreamstage-biz withyou7-com planju-cojp a-itc-info meimon-edu-jp xn--88j6ea1a3393bcta3o5g868o374cpxo-biz asia-create-jp techsupport-jp oirastar-com satoyama-land-com ddwh-xsrvjp love-phantom-xsrvjp iteya-office-com mollymaidjapan-cojp fujiyoshiya-xsrvjp about-a-stitch-com casa-bebel-com acehive-cojp afilife-com xinfo759-xsrvjp aijinkai-xsrvjp shimizu-ya-jp xsample160-xsrvjp kanemitsu-gaku-com ikkyu-me junk-buyer-com goldcard-web-com tkms3256-xsrvjp ozkuni-com xinfo511-xsrvjp netjapan-xsrvjp seven-to xsample143-xsrvjp ankhcloud-com kisoku2784-com jyuushou-com itabashi-shaken-com jiw-fc-jp suzuran21-com ad-income-com sosakujo-xsrvjp hypnoroom-cielbleu-com lineishikawa-com dailyrootsfinder-com nposalvage-com shinjukucon-com jmb-orjp gaogofing-info uesaka o-yoga-jp kashuestyle-xsrvjp nikorinoie-com mugendou-xsrvjp dr-support-jp happy-cre-com tech-web-info kabu-sokuhou-com xm-net-com komachi-akita-com linadream-net kabuatoz-xsrvjp bit-blog-jp dodorufin-xsrvjp honki-mode-com us-vocal-biz neo-hair-com emurashika-jp alive-marketing-com hubcafe-jp dbm1 royz-fc-com rom4-xsrvjp kikanshi-web-xsrvjp kishinjyuku-com maido-ari-xsrvjp ariakesangyo-xsrvjp einstein-net-cojp xn--cckcdp5nyc8g2745a3y4a-biz rainbowwin-net test-xinfo759-xserver-com katakome-com at-breeder-net coursfrancaisparinternet-com guchikiki-biz 2han10-net you-yu-com bono-table-cojp xn--dckix0be3bww9s3erh-net eyecen-xsrvjp ch01 testsp1208271-com hm99qq-xsrvjp gambarou-com e-mikan-xsrvjp us-vocal-com bows1989-xsrvjp noto-p-com honeytokyo-azukaritai-com xsample73-xsrvjp quick-worker-xsrvjp testsp1208276-com hatalab-org yoshiki201-com kototama-himehiko-com kumano-jinjya-com nakamedecon-com yoridoko-net breeze-xsrvjp xinfo542-xsrvjp zentokyo-orjp fukuta-shoji-com kyouzon-xsrvjp m-ins-cojp robotkiyosaki-com storage-jp-com kanoya-in miserve-xsrvjp freeillustclub-net free-style24-com core-japan-net yamamoto-gyosei-com kvit-cojp otsu-shaken-com sun-apricot-com photofixx-com equal-825-com shiomishika-jp dips-a-jp asanet-xsrvjp hiraknet-com axis-training-jp kankyo-mirai-com vietnamfes-jp xinfo710-xsrvjp xn--t8j0a6ivbyo0d2h2g2785a340f-jp happychance-xsrvjp imo-syaken-com futo18-com wakuwakudayori-com gakki-kaitorihonpo-com rainbow-br-com mypre01-xsrvjp jiten8-net jdatabank-com fukutomi-yutaka-com sho-ichinose-info thadogpound-net o2cloud-cojp kobe-arima-jp movie-monroe-jp xinfo168a-xsrvjp belpon-jp yabagawa-com okayamacon-com orion-dispatch-com luvisto-net s-e-r-jp color-shikaku-com tokai2x4-com sikakustyle-net yoruan-xsrvjp roidshop-biz tanshinbox-com palace-iwaya-jp atn38-net puku89-com unique-sunaba-com koutsujiko110ban-com 2012parallelworldexpress-com kanbanmitumori-navi-com zala-tribune-com h-colors-com yeti-net-com centlaw-xsrvjp test-xinfo729-xserver-com guchi-talk-com fpnomori-com body-shaving-com kazuok66-xsrvjp navit-j-net ki-ketsu-sui-com xn--eckd5a1es53u4s4bnvb-com ku-kan-jp 6sasi-com testdomainx339-com test-xinfo739-xserver-com iikamo-me r09-jp nanela-com syu0128-com mayuzo-com c-throb-cojp w-angelica-com toeic-technic-info xinfo573-xsrvjp webkohbo20-net mobile-pc-jp grandeborsa-com nrj-acjp cent-law-com ahb-rs-jp fussa-net akb48ob-com kenkouni-xsrvjp murphy-xsrvjp ilt2-xsrvjp shoukichi-staging-org greenerfaqs-com whitestar7-com sumabu-com event-kyuden-xsrvjp skao-info citabria-xsrvjp xinfo120a-xsrvjp smakl-net toshiyuki-biz oshie-k-com test-xinfo720-xserver-com bcsv1-xsrvjp haklak-com shiga-kaigotaiken-jp xinfo718-xsrvjp supertaikyu-com tokuringi-com crystallize-jp minami-cl-com itiman-net yamatoyo-cojp elimsmile-jp kansya888-com pier-s-com flaviahair-com originalbook-xsrvjp kolocle-com donald1 mogmog-xsrvjp ktskk-com xn--vcsu3i28mez0b-biz deliver-xsrvjp alpep-com netbus-jp parts-depot-jp kotoba-gift-com ikeconnight-com rameatlantique-com niigata-tmc-com test-xinfo710-xserver-com server9-xsrvjp xsample111-xsrvjp cyberdesign-cojp xsvx1009156-xsrvjp inaba-koji-com sweets-orjp aircon-clean-com nccard-xsrvjp mythoswork-biz hana-mido-com wedding-maria-com satohya-com willdrive-net soudan1-com mizu-fiore-xsrvjp x-side-net sumi-orthod-com test-xinfo738-xserver-com araimotors-com jars-jp minani2468-xsrvjp test-xinfo728-xserver-com gioncon-com a-site-me rom10-xsrvjp test-xinfo718-xserver-com saiyou55-com mignonette-jp whitecrow a-lash-com ahsma3662-xsrvjp sal-nejp kashiwa-vocal-info test-xinfo708-xserver-com monifihi-xsrvjp baseballshop-legends-com okazaky-xsrvjp titti-orjp dreambuild2011-com hayspec-com hyse-biz alta-marea-jp hotelkensaku-info netshop-studio-com hikage-xsrvjp soulofgold-xsrvjp adnacom-jp jinyublog-net mizukakifu-com idolrevolution-jp decome2012-biz sunace-biz sunburst-n-cojp xn--zck9awe6d5989b6fc-jp kotox100-com hello-mystyle-com eyecen-com a-sapo-jp sabotenya-com sakihi-xsrvjp sugenosato-com pc8137 m1182-com kirara-shinyuri-com kagari-jewelry-com skjmd-com ariege-patrick-immo-com mokuteki-net nextone-srv-xsrvjp h-tb-biz xinfo510-xsrvjp 13abundance-com t-aliveestate-cojp onesmileoffice-com xsample142-xsrvjp funteamhs-cojp shepard-navi-com tochi-bus-com supamankazu-com tv-valve-cojp kikuimo-sato-com img-jp yamaiku-com matsuda-siko-com kitpas-com chirashi-print-net svnl-info xn--hckp3ac2l-jp stylejam-xsrvjp solvic-net adomi-xsrvjp uchihamono-xsrvjp meichu-biz tomson1-xsrvjp ikebukuro-con-com testxserverspdomain121030-com lovelyjazzchan-com nijinotane-xsrvjp dogs-fvh-net tennoujicon-com guruguru-gourmet-com test-xinfo558-xserver-com buschool-xsrvjp ochaukeya-com e-plant-me ncare-m-ch-jp baistone-jp kumamiya-com kukumu-g-com test-xinfo548-xserver-com luna-shine-net oirasekiyoraka-com simple-work-net test-xinfo538-xserver-com thedodo-jp misato-mariage-com fruit-garlic-com test-xinfo528-xserver-com dancestudio123-com yunomi-us kazumis-biz xinfo339-xsrvjp honzo-mall-aichijp mk0088 dai-anshin-com awesomediet-net xn--asp-ei4btb8qwj6169acyva-com free-way-xsrvjp aandgweb-cojp exformation-jp shimada-clinic-jp test-xinfo508-xserver-com yagishika-jp flm13-jp 5oku-com nanela-net nlight-xsrvjp xsample72-xsrvjp karadacure-com ipi-radio-info more-com-xsrvjp project99-xsrvjp slowliving-conz hanryu-eikoh-com obubutea-com test-xsample333-xserver-com inatani-shika-com nittokyo-xsrvjp kondo-shoten-xsrvjp xsample90-xsrvjp xinfo541-xsrvjp benefix-cojp trendtrend-info wonder-poems-com rinrin3-jp takumi-qol-com st0p-net nakai-iin-net a-cue-com gardensite-xsrvjp kenu-xsrvjp beautycosmer-com sakaedecon-com masa-keiba-com kitasenjudecon-com biztask-net test-xsample303-xserver-com r-creatives-com 4nen-com lensman-jp rumi-kg-com hokenbooks-com xn--7-kgu4es24uf5q-jp pentalab-cojp fleurshair-com zero-free-xsrvjp omotesandou-net rooky-jp f-cre-com smirnoff77-xsrvjp tamai-chuo-com yumeflower-com bon-marriage-com regalsense-com studio-ibis-com carhonpo-com dental-com xn--u9j360h32opa140d-com hiroshimade-com sedai50-net s-publish-com sprachschule-xsrvjp human-respect-cojp bookend-xsrvjp lbm-xsrvjp gacchiri-jp rakunadiet-com genkigoo-com centrair-bluechip-com chayamachicon-com cosmicengine-biz zenta-tv kazart-jp xinfo595-xsrvjp 2102-jp you-yu-xsrvjp ube-shaken-com sasaki2228-xsrvjp test-xinfo358-xserver-com celtislab-net daigo555-info xn--t8j0a6ivbyo0d2h2g-jp herbkenkyujo-spur-jp mikami-masa-jp kusakaya-jp test-xinfo348-xserver-com autoflex2000-com twds-jp tamabayashi-cojp gokujyouwagyu-com digital-sensation-jp iijimakazunao-com wano-tv taka-afiri-xsrvjp hanyuxuexiban-com familyhall-kounandai-com ichikawa-shaken-com toriikengo-com inpres-jp homepage-desite-info xinfo572-xsrvjp longtail-seo-jp happystyle555-com sorasys-com tennouji-yasu-com asobigokoro-info stemflag-com haruri-jp tyube-yokkaichi-syaken-com xinfo761te-xsrvjp 4-home-teeth-whitening-com yamazakishika-jp teen-affair-com saiminjuku-com isc-kansai-com hotel-yagi-xsrvjp kameoka-trust-shaken-com yuanchuang-hk-net aginc50-com saitama-tokiwa-shaken-com fujieda-info 1plus1-cojp ec-aichitriennale-info krk6868-com someiyoshino-com xinfo717-xsrvjp xinfo332-xsrvjp mb-mori-com hanaya-3a-com rasc-xsrvjp muj-orjp tc-legal-net you-creative-com ontic-to spa-thai-com olimpiade ticketsoko-xsrvjp carecreates-com kazu-alohi-apopo-info ayatocom-net toyoda-eri-com senmon-web-com m-shien-com kaitori-kan-com sancha-de-con-com ktimz-xsrvjp custom-fk-xsrvjp macco-cojp kijpn-com inotaka-xsrvjp matthew-mcconaughey-org zy-x-com magic-sense-com lader-xsrvjp pointkeyword-com giocondos-com omise-org xsample109-xsrvjp akazukin-cojp bobble-asia takasumi-com evolution365-net kobe-syaken-com multi-pure-info shinagawadecon-com theliksun-com bistorot-le-reve-com soba-kochi-com reibee-xsrvjp cosmo-s-net sekiryu-xsrvjp umenomochi-com sentaku-llc-cojp tetsuzan-xsrvjp neo-ah-com d-stage-xsrvjp cd-ok-com xn--vck5d6ae0cyc7801bnpyb-jp med-takaoka-jp yamako-f-com yamato-h-com allsedori-com xinfo123a-xsrvjp niwaya-info ragress-com tokushima-syaken-com gs-yumekoubou-com hiyoshi-net-com pacg-jp musashinogolf-com taguchi-tax-jp lifeup-nejp jnome-jp onamae-taiso-com xsample310-xsrvjp furumoripopopiano-com yanaibrands-xsrvjp chintai-jpn-com otakaland-com b-life-id-com planclair-xsrvjp ehon-app-com testdomainx321-com i-loceo-com seo-tail-com fellows-japan-com monodzukurikidsfund-org xn--u9j5h1btf1e613xpbuzkc252m-jp tanaka-iin-jp palais-riviere-com himawari-day-com testdomainx326-com eport1984-xsrvjp xinfo508-xsrvjp artbird-jp canalsalon-com mahounoikuji-jp trno-biz karatsujuku-com facebook-connection-com hibimarche-net xsample141-xsrvjp ymsthrs-com super-raku-net testdomainx332-com zipaddr-com deaikei-max-net oita-golf-com msr-pro-com tetta-jp la-lu-ce-com testdomainx337-com sunadesignlab-net retoru-com luxury-photo-jp yoichiro01-net kyokuto-h-com yourmenucreations-com ph-sister-com tokyo-sk-com isitaka-mokko-com xn--ppc-773bzqgah5a30akezjj654f-com hub-create-com n-chemitech-com titania-cojp ambient-nejp thisistrend-com sayaka-dp-com b-map-jpncom cappee-net mobile-japan-ok-com kyoto-alice-com ito-coffee-com rjen-cojp tms-first-xsrvjp waocon-test-com hiver-shop-net showtimes-xsrvjp refresh-kaatsu-com penplustown-com jyutaku-k-cojp rgh-jp web-kaisha-com 510office-jp kousyu-fukuoka-com adtec-xsrvjp levpiece-jp fuwairu-com news9plus2-com 1-3-cojp direct321-xsrvjp tsuge-seitaiin-net heroicstory-biz ninbai-nejp upat-jp idessey-com testsp1208445524-com sasazukadecon-com kenko-ya-xsrvjp 753st-net aspix-archives-com xsample71-xsrvjp xsv08-xsrvjp kawagoecon-com kan-ki-jp makitt-biz shusaku-sasada-com naisou-mitumori-com ivy616-com actginza-cojp kazelu-jp clementia-inc-com thedykeenies-com sports1230-com ncef-manel-com onomichi-bbs-com xinfo539-xsrvjp esukei-xsrvjp tidalism-com brandbank-cojp tomsonking-com test-xinfo560-xserver-com kanamonokouhou-com lamb-cloud-com autospeed-jp bisamobi-net uruoi-gel-com oita-mbbl-jp fd-works-com hifu-mi-com shinryo-info 1writing-com mishimashika-com syoknin-com azzip-azzip-com naturalcurlist-org test-xsample304-xserver-com dreamwarp-jp overagain1059-com mail-pal-com tensai21-com tomakomai-shaken-com tsubamesanjo-jc-orjp musashi-soil-com test-xinfo595-xserver-com kanto3-com tottoko-net akirazx-xsrvjp xsample317-xsrvjp k-flat-net incenx-xsrvjp sabu-official-com rena-nounen-net misuno-net taiten-hoikuen-com paint-fukuoka-com aimistone-com osamukubota-net test-xinfo550-xserver-com vient-net-xsrvjp beta-beauty-xsrvjp ag-ent-net vvfm-net e-conomyhotels-jp hiroshimakoigokoro-jp values-break-com chiangmailanna-spa-com hamamatsucon-com xsample216-xsrvjp okinawanoni-juice-jp fukuoka-ot-com gkconsul-xsrvjp pachinkoslot-biz f-kimono-com kanjyou-com design-cube-jp capelli-di-arte-com heart-oasis-com iidabashi-kagura-com polepoleti-me a-rec-com fbapple-info the-greatful-life-com cafebar-cross-com egao-c-a-com xn--elq250e1mhg47a-jp gengochoukakushiken-com netbusiness-jpnet info-camp-xsrvjp handsome-web-net photo-prime-com aishin-housing-com ontheroad-jp forcearound-com kazuno-com daimyou-net m-gene-com epatrol-info testxdomain302-com yumimega-com pc11112 pc11111 grooverider-net af-binary-biz wg995-com aoba-fudousan-net geek-boys-com info-utu-aid-com xsample213-xsrvjp fresh-terrace-com yuyu104-com aoivvu-info testxdomain313-com milumoda-net careebyte-com fk-kenchiku-com testxdomain318-com pcgiken-xsrvjp desite-jp xsvx1022093-xsrvjp ouensha-oita-net manmaru0701-xsrvjp xinfo716-xsrvjp tanimotoyoshiaki-jp test-xinfo530-xserver-com kitchenfactory-ac-com ulvac-es-cojp ecocker-jp mpgd-net kcs-fc-info aichi-roujin-jp burningrain-net aprs-jp musics-xsrvjp doyu-ichihara-jp golfbar-star-jp sbproject-xsrvjp gokoushokuhin-com pc103-com mhplan1-biz cyber-ec-xsrvjp xn--gmqq3i52e2nhgrdevx-biz piropi55-xsrvjp highest999air-info isuppo-xsrvjp niigata-shaken-com sylvieann-com osakabeshinkyuin-com actors-u-com lli-insurance-com xn--ickhj5b7d6fua4f-com forty-one-biz shinshu-comprehensive-jp lototrial-jp daikitkgs-com sinzan-cojp jiko-pr-jp nature-v-com otogr-net kmasato-com columbus-in-phil-org sswd-jp a-pu-pu-com xsample108-xsrvjp lifeart-nyan-com akasakadecon-com satomisou-net test-xinfo519-xserver-com gloseq5-info fairy-kiss-jp simon01-com career-searcher-info ogataengei-com tugunari55-xsrvjp rickun0401-com asentia-cojp botaniquelife-com axceed-tax-com seigyobako-com yuya00yuya-com sekatu-com sakaizyukuanimationclubmemberonly-com vaomusic-xsrvjp kuranomachikado-com anshin-jutaku-com mdex-xsrvjp wings-shop-com syadan-net officels-xsrvjp united-smiles-com costech-xsrvjp housewand7stone-com inter56-com biyoujyuku-info ces-ent-com fukushikikai-com burse favori-tokyo-com hizanaoshikata-com test-xinfo509-xserver-com mothercloud-biz ryou1212-com a3s3f23rsadfasf-com kiwanda-jp kando-honda-jp pbear-jp xinfo720-xsrvjp higuma-xsrvjp riquan-cojp xn--88j6ea1a3393bcta1uk721ac9l-asia valueyume-com gimix-tv sunao-corp-com n-hoikukai-jp suzuki-jun-xsrvjp no1eigo-biz tazima-net out-sourcing-cojp bookbooth-jp cssnite-sapporo-jp blockfun-net cia-j-com cloveregg-com mt-japan2-xsrvjp koishi0105-com awaji-mandai-jp neko22-com ah-tokyo-com garden-one-net michimoto-cl-com xinfo507-xsrvjp pcnet-nejp smsfacil-net minshuku-toshiya-com brainphantasm-com katteni-kanko-com satoshi001-com xsample139-xsrvjp fukamayu-com m-hico-com sukegawa-office-com tenjinsita-com interwindow-cojp aplan-cojp hikakuichiran-com xn--av-693a1dpa20aaa2gsa2gd1bd4a8bzooolevh5230egdpb-com nsbz-net kawai-orjp pref-shizuokajp noble-trust-com nfa-g-com help-cashing-com united-studio-com nogiya-com shijyou-karasumacon-com peeeeeee7-com katokoyodo-com bkk-bz kikaku-keiei-com tu-han-shop-com gasenenews-citygas-com ubijin-com jin-cycle-xsrvjp xinfo126a-xsrvjp zenkaikyou-xsrvjp satoshi001-xsrvjp goenno-wa-com takatori38-xsrvjp ganbanchip-com fujiishinji-com gicland-cojp xsample51-xsrvjp fbms22-xsrvjp webya-3-com 4mr-method-com kogure21-cojp kushida-koumuten-jp shibuyacon-com web-design-office-net odawaracon-com leffervescence-jp camp-map-com johosyozai-biz zone-portal-info testdomainx340-com xsample57-xsrvjp xsample70-xsrvjp equipment-com yushoya-com layer-s-com xinfo102a-xsrvjp asuka-fujiwara-jp tsujikawa-net c3d-xsrvjp okonomi-sugino-com beniiche-jp kokushi-musou-com twchain-com japinglish-xsrvjp nyankox2-xsrvjp super-sozai-com xinfo538-xsrvjp egao-kondo-com project-mm-com illust-bag-com mothers-inc-com gluonz-com kindaikobo-com akiraclub-xsrvjp music-ikehara-net sanwahd-net game1mart-com tyube-nisshin-syaken-com enyuu-ji-com dougamarketing-com alcarentacarny-com test2-xinfo745-xserver-com next-commu-xsrvjp inuzakura-xsrvjp saksrv7-com kouichi541-com balboa-trading-com butugu-net-com national-st-com trendprichan-info com-alpha-com v-glame-jp okawari-japan-com pcmania tomiget-com spica-bs-jp inkyo-nyuudo-xsrvjp xsample316-xsrvjp onshinan-xsrvjp shizenkeitai-tamura-com ndai-xsrvjp kyoubashicon-com social-tour-com xn--eckm3b6d2a9b3gua9f2dz124ebp0a-jp shinko-denki-xsrvjp test-xsample314-xserver-com ii-anbai-xsrvjp fischer-golf-com gion-yasu-com english-box-com edocon-jp xn--vekz09jiqk-com ictsg-net kaiwajyutu-net mirumirukogao-com stdesign-jp friends-ah-net higashiumeda-yasu-com dolphin50-com ktmn-biz tkdore-xsrvjp be-flat-xsrvjp team-cellacise-com jnapcdc-com i-photokg-com zen-clean-com xn--4gq539c5gsb3a-com zzz00zzz-com ukiuki-shopping-biz rokkosan-net s-click-net vachao-com reo825-net nobletrustfb-xsrvjp obentoutei-xsrvjp jeo-stylist-com 38hawaii-com tanimoto-ironworks-com xn--n8j9cqo2a0nk59oghe-com poco-a-poco-tokyo-com giang jeb-bz 1010teisuiyu-net pluss295-xsrvjp freepiero-xsrvjp joemaguiredesign-com kaoru-nioi-com japanflower-xsrvjp kkkanri-xsrvjp appliyakun-xsrvjp hunabashi-rentacar-com xsample212-xsrvjp cambodia-today-com owl-office-com 18teen-jp e-fugu-com kitakyucon-jp denkiya-me maemukikotoba-net matsudatetakayuki-com test-xsample34-xserver-com srv-350-net daisyo-biz hosoda-nousan-cojp adusamdodo-info kodomokai-jp mito-con-com bamboo-i-cojp kagamix-xsrvjp yumiz-jp aspmanblog-info webdesign-jp-net rwive-com allthezeal-com xinfo715-xsrvjp 20pips-com setagaya-jpnet ianextproject-net katazome-style-com ohanashi-rosecafe-com barbie-c-com universal-joy-net tcp-makeup-jp sada-office-jp mizutama-tv alohabeststyle-com ame-ha-biz cbhomefield-com l-communication-net asaicrop-com 1lunch-marketing-com angie-xsrvjp majcalmami-com dekogang-xsrvjp toho-premium2012-jp xinfo735-xsrvjp deko-gang-com heart-cs-com xinfo349-xsrvjp tsuiteru-cojp umedacon-com 012-vc pets-e-com palca-xsrvjp mafu29-com airsplan-xsrvjp xsample107-xsrvjp clover-realestate-com sonic-labo-com lesson5-com micreate-jp chokubai-com moritagakuen-edjp f-kizuna-com xn--88j6ea1a0780bctddtas67ckx5cbp2b8xe-asia sendai-con-com solarnavi-net ura-keizai-com vivloom-com hama-shou-cojp hanacel-com ezomac-com portal5 muura50-com shinbashidecon-com ai523-com yuta77-com ynny-xsrvjp rinohome-com hale29014129-xsrvjp xn--pckwb0cua2ei-jp joyplaza-cojp karadano-xsrvjp designroom-xsrvjp tukasayou-com kasahara-shika-com nail-shikaku-com cont-p-com japanphoenix-xsrvjp ohnojyousousai-cojp csss-jp gallery-dan-com sho-info-com test-xinfo766-xserver-com locreo-jp waisu-net iyashi-no-ma-com sym-sym-net tynsystem-xsrvjp test-xinfo756-xserver-com shukutoku-yoyaku-com kizuna0615-xsrvjp sato-club-com romandeal-com acai-tripleberry-com chain12step-xsrvjp isilon2 delico kashiwa-kaburaki-shaken-com test-xinfo746-xserver-com xn--b9j2a1gzmkb4n-com cosmo-group-info yumetrain-jp neko-nikuq-net mitsuandjigens-com nh-purelyshop-com mamorigami-com test-xinfo736-xserver-com isilon1 shintaroubiz-com ibako28-xsrvjp saka-design-com miu-flower-com tamagomura-com shioyama-info drsmart-biz kitaya-dental-clinic-com blooming-dear-com b-life-mail-com sokuyokudou-com inoue-orjp mmsharon-xsrvjp kouchanservice-jp leapair-net hamamatsu-con-com sunnan-cojp business88-biz test-xinfo706-xserver-com xinfo506-xsrvjp humans-y-com xsample138-xsrvjp runimagine-com level3-xsrvjp ohtsubo-clinic-jp eskobe-com umeda-yasu-com xn--dckiy8ad8fl0jub0bzhub-com k-tominaga-net asp-rsv-jp platinacon-com fmharo-cojp gomi-calendar-info lapps-xsrvjp sportscosme-com thaicom-cojp herbnoaruseikatsu-com tti-i-cojp estem-group-com 4x4-cojp app-producer-net clearstone-jp ogatanouen-xsrvjp maca-xsrvjp tectron-jp nishii-com web-bz-com web2tokyo-net aseanfes-jp axiomaticmagazine-com snd-xsrvjp sfy-cojp net-oyaji-com hiro3237-xsrvjp ep-coat-com acnalumni-com ganriki-jp-net keitai-custom-com auction-daiko-net hamamatsu-bankin-com ag-tax-orjp yumegoal-com test-xinfo586-xserver-com matsukun0-com heavenshemp-com usuge-chiryou-info s-suppli-cojp sym-q-com dekitate-site-com milkywayproject-com shimizu-esperanza-biz tk-ikebukuro-xsrvjp seo358-com mariko-cook-com xsample68-xsrvjp test-xinfo566-xserver-com doll-kaitai-com suisolife-com tekunaka-com oride-jp xn--eckp2gt04l48ehp0a8v3ams3b-com kashimako-com test-xinfo556-xserver-com yoshikawa-wedding-com facebook01-xsrvjp learning-playce-com test-xinfo546-xserver-com xinfo537-xsrvjp samec-ct-com cultivate-xsrvjp miraira-affiliate-com infopremier-jp re-seul-com xsample169-xsrvjp seo-ex-com gamegekiyasu-com eitai-org test-xinfo536-xserver-com hi-as-eco-jp super-propolis-com admac-jp xn--edktc2a4827cket59b-com strider-jp mokkinsedori-com xn--p8judqlpc9fsf-jp test-xinfo526-xserver-com test-xsample227-xserver-com peicolor-jp naisyhoku-biz kihodo-jp sg119 organic-tshirts-net sakaicon-com the-hoken-com test-xinfo516-xserver-com love-project-net uedakaihatsu-com yutaka-style-com xn--tdkl0c-com okusurifujin-com yamanisi-info infodesign-jpn-net test-xinfo506-xserver-com usami001-xsrvjp tsuchiura-info nattoku-naitei-jp tabiji-org hiratacy-com anblend-jp xsample315-xsrvjp uchiyama-gg-cojp js-ps-orjp test-xsample221-xserver-com e-biss-jp rep81-com media-producer-jp syoueibms-com football-fukuyama-com charites-nail-com pronto-xsrvjp blossom-hotel-com xinfo129a-xsrvjp xn--pckwbo6k815nvjfp43bt81d-jp test-xinfo360-xserver-com unamu-ch-xsrvjp yamatoya-cleaning-com smile-com-net fishtone-com kscompany-xsrvjp takanorik66-xsrvjp ashula-king-com fenikkusu-com old-domain-sale-com test-xsample301-xserver-com inovation-xsrvjp test-xinfo356-xserver-com penmaru3cg-com e-takara-com nlight-info blend-blog-com horaiya-jp matkaa-com aki-takahashi-net morisige-hotel-jp zest-camera-info kyu-be-info c-road-jp xsample99-xsrvjp dreamrice-jp xinfo105a-xsrvjp unicco-kyotojp pisces678-com sg118 fast-lifestyle-info koyasan-xsrvjp gallery-mura-com jscoach-com yositaro-xsrvjp omphalos-xsrvjp test-xinfo350-xserver-com freedomshigoto-com builderyoshi-xsrvjp hunabashi-shaken-com dilshad masahome-cojp xsample211-xsrvjp web2sendai-com my-esu-com kasyu-jp designex-jp catacrico-jp 1tokkun-com s-ogikubo-net fudekoubou-com cocomo-interior-com meirin-seni-cojp cadio-biz toraikatz-xsrvjp sunlight-cleaning-jp sekkotsu-in japan-italia-com toitoitoi-net raggachina-com d-strage-jp toresenkeiba-com kyoumihonten-cojp singi-biz nakagawa39-com bizm-ag hachiouji-shaken-com test-xinfo346-xserver-com citabria-cojp get1000man-com xinfo714-xsrvjp copasystem-xsrvjp optimization-service-com kichijoji-con-com ryom-design-com moto888-net smaphosticker-com shop-degree-jp matsmile-jp bellness-com ana-pr-jp nakano-suginami-syaken-com eikaiwakoushi-com tycoon-com-com studiog-xsrvjp backsnet-com xsample106-xsrvjp ami-amie-jp maruka-uchiyama-com kindlenotukaikata-com wine-ec asmec-cojp abikobar-com mclamego-com uni-axis-com unking hiroisatoru-com kekkonsite-biz tomybikepark-com aomori-wats-com sp-c-org xn--n8j4mybtf1e613xwn2bc64b-jp horie-yasu-com tenjinplace-com h-s-xsrvjp lyrical-works-com edogawa-town-com lifejam-jp car-uni-com infozapper-biz neo-hair-jp hakkou-sushi-jp kagoshima-syaken-com niwadani-cojp dash-man-jp sinn9-com minoru7227-xsrvjp kudoken4-xsrvjp shop-orb-com money-sense-net developer-xsrvjp takariha02dive-com degu-factory-com haima-tonosato-com 7082abc-com cool-rock-com storageroom-jp xn--tckybd3guczb1829b7ghx6trhlupd-jp otera-net stampp2-xsrvjp homepark-xsrvjp ipl-soft-xsrvjp u66-info rom-test-net sea-design-cojp zin-blue025z-com yume-affiliate-com info-z-net twitterjp-net xinfo359-xsrvjp net-sidejob-com xn--ccktea4bylb8496czbtysx-com xn--veky30o2gq-com hotel-kiyosato-com tontonton-jp fumisedori-com mr-pages-com haggis-on-whey-com momokuri-xsrvjp gobousei-info 7memo-com xn--eckyb5bg3k-com four-d-org chunichi-kodomojuku-com happyplan-net-com alicestone-xsrvjp changethemindandworld-com silky-closet-com butsujuji-xsrvjp rb-apps-com atozrentacar-com fp-partners-com fukuzawa-xsrvjp webpro-xsrvjp test-xinfo-xserver342-com immm21-com gourmet-circus-jp kumiyama-shaken-com qqpm5cb89-xsrvjp narashino-jp shibajimusho-orjp xinfo505-xsrvjp super-arts-com moebiarc-com ace-pro-air-jp iwaken-studio-com tuchi-con-com xsample137-xsrvjp yokoyan201-com homepark-cojp plus-a-me kounotori-honpo-jp steelkogyo-com matsudocon-com ijinjin-com tskym-jp kyouikukoyou-org grapparetto-xsrvjp sylph-biz moriokw-com doroawa-sekken-info uenode-con-com cocoro-esthetics-com apple-pie2-com pclibs-com asahi-pack-com zumi-xsrvjp aquacube-xsrvjp augking-lab-info clsc-jp yuri-pharma-com otoku-tsuhan-com aplaninc-xsrvjp aaronbrowne-jp hishi-ki-cojp xn--pck2bza7489c4ld-com fujibus-cojp affiliate-school-net denden0375-com painting-mouse-com lc-takatori-xsrvjp tajima-takamiya-com musubinoayumi-com lahal-net daim-global-com e-sakaki-com ultraseo-net mfun-jp unhwa-mobi yuu-shi-kai-com celebstyle-xsrvjp toyoda-wedding-com pages-xsrvjp musashino-hp-jp machiko-biz h-water-net e-gokai-jp xsample67-xsrvjp hkwj-cojp med-plan-jp furano-areaguide-com sweets-sakai-com zombie-star-com toretate-net reveassocie-com e-bene-com yod-on-com morito-k-cojp merveille-ushimado-com vanah-kawagoe-com meichu-jp body-tc-info iaso-supple-com otaniah-com kokusan-takegami-com xinfo536-xsrvjp cdr-jp xn--vck8crcy307btiva-jpnet socpartners-xsrvjp seo-clare-com test-xinfo767-xserver-com xsample168-xsrvjp vakcom-xsrvjp arata0613-com okashinosakai-xsrvjp utamaro-denki-com taikokk-com xdock-net dbmagic-biz advance-chirouka-com onishi-amimono-com p-c-rescue-com daikanyama-con-com riddlepuzzle-com news-share-xsrvjp apt-japan-com kitashinchi-yasu-com kankoku-keitai-com xn--gps-pg2j70g-net nihoneco-org e-interiorshop-com otoxxxoto-net alohi-apopo-biz xinfo766-xsrvjp tanba-shaken-com i-mao-net jf-aji-net iphoneer-jp graphium66-xsrvjp onejam-biz maki-nameart-com toriikengo-xsrvjp xsample314-xsrvjp t340-com message-japan-com sonicwave-nejp existence-inc-com grandeporte-net kk-union-biz kobeco-net gyousename-com shinseikai-dental-com reito2274-xsrvjp doi-chiro-com aristo-net-cojp yoshi-affili-com saisinstar-com contrax-cojp webeer-info logorin-com christmas-giftcards-com little-ribbon-com granmacoltd-com goemon-the-web-com taguchikaikei-com xinfo729-xsrvjp soleado-t-xsrvjp suzuki-kobo-com musee-biz kagaloli-jp the10-biz cui-cojp you-photo-com take-c2009-com oz-ucar-jp ariakesangyo-cojp destiny01-xsrvjp xsample98-xsrvjp kaisekislot-com makusora-jp takanawa-clinic-com becoca-xsrvjp stkmwdzm7-com junkoh-jp sub-click-xsrvjp test-willgate-com ncyell-com petanque-asia kudo114-com test-xinfo592te-xserver-com yldc-org 0nq-net advance-ec-jp kartepost-com machiori-jp ion-ginza-com faxdm-org xsample210-xsrvjp xcely-ht-com drawiz-jp masu-kazu-com tekkyo-biz versa-jp geihoku-minsyuku-kamioka-com monifihi-com aha-online-shop-com j-sweat-com afirieitoshu-xsrvjp social-sendai-jp xinfo157a-xsrvjp yamada-ot-xsrvjp xn--88j2foda3h0b8ny00x2i5adx6d-jp kensaku-xsrvjp guccionliner-com okusamaya-com kompetis-com minds-farm-com led-kumamoto-com ishi-kura-jp xn--n8jtcugwh9cqhlg845v6k6d-com molamo-labs-com xinfo713-xsrvjp around-jpn-com stock-capital-com trust-rb-com 2580-org infonich-cojp tomoyan11-info xn--gps-rm0e442jhgp-com black007-biz k-thp-xsrvjp tagukaikei-xsrvjp ondrecords-com otakeiki-com tanmo-net bonne-chance-co musashikoyamacon-com xn--kckk7aw5tpb8c-com opus77-xsrvjp ootone-reien-com sakai-manekin-com kaigyojunbi-com universalcitycon-com osaka-roujin-jp enjoystreet-jp test-xinfo591te-xserver-com xn--m-u8ts56nvoza-biz xn--3dsll-z53dvhlb9bwe97aphtgm016cftxa1m0b-com cleangreen-nagoya-com solare-muromi-com harmonicsdesign-cojp xsample105-xsrvjp shop-authentic-com xn--b9j6am4izjxd2h2gq122d-jp team-6eco-com sg117 xn--qckq9mc4ac-com maebashicon-net uni-p-net esaki-onlineshop-com webaxel-jp meigetudou-com tomkatsy-xsrvjp k2rinc-jp xinfo108a-xsrvjp woof-jp shirahamafuminori-com central-medical-cojp daikaen-mishima-com xn--vckg5a9g8fj6937cw1bjtsha205u-com 2chinfo-com europort-cutting-com kobeya-me ars-town-com hold-chance-xsrvjp bcc-xsrvjp xn--u9j0c604kneons8a-com wakaba-f-net slimtaikei-com glow-united-com testdomainx330-com kanngosi-kyuzinn-com oyaizu-cojp yousworld-com genkuu-jp cs-delight-cojp xn--u9j1hsdzb9d9bv308dff9c-net silk-jubai-com pcfureaiforest-com xn--eck6e6b987uy7i-jp testsp1208272-com nishinocho-com siriasu-info latour-jp sps-mg-xsrvjp autm-hama-xsrvjp kouenjin-xsrvjp igakubu-guide-com bouquet-de-bianca-jp event-kyuden-jp testsp1208277-com xsvx1019774-xsrvjp xinfo744-xsrvjp xinfo358-xsrvjp furiahau-com one-kyoto-jp opt-01-com patec-xsrvjp digital-global-agency-com s-eiken-com tosa-kanran-xsrvjp 5june-com gantarou-com jiin-xsrvjp starfield00-biz pet-hatakeshimeji-com ayu-aclass-com marushige-chicken-com fluentgarden-com xsample35-xsrvjp exercise-and-diet-net storedx-net ym-advice-com sg116 matsugenn-com iineclub-com freeman-affiliatekouza-com okusurishop-com yumekanaeyo-com xinfo504-xsrvjp kimuracooking-net mcprogram-com avante-act-cojp xsample136-xsrvjp wakuwaku-tsuhan-com xn--gckg0b0b8evmbbb4044fll9bk5iqk9i-com tassmania-biz kana-xsrvjp tongdee-com mma-xsrvjp pha08069-xsrvjp sanfuroa-com hiro042928-com linxstone-com dokokanocafe-com t-bs-net arcadiafp-net 1000goku-net tpz-xsrvjp iine-p6-info taxiyoyaku-com chuchu3-com tsubasa114-com pongsitgolden-com motomachi-yasu-com d-rentacar-com touhokumiyage-cojp fudousan-neta-com tnknbyk0103-xsrvjp reclaimthestreets-net next11-xsrvjp eishin-re-com mikasasports-cojp iloveyou-fc-com nextstage-produce-com gklineconsulting-com houki-ganka-com c-bz-net kitchen-kyoto-com dlappli-com chiken-navi-jp lingua-franca-jp stella-sr-net webkohbo10-net papa3-com nin-fan-net alohi-apopo-net it-osaka-jp takayukikawase-com heat-tech-biz m28-xsrvjp optsa-cojp relaxstart-net midenaru-biz youtubejp-xsrvjp tsuhan-faq-com toyoriken-cojp 9nine-fan-net urayasusunclinic-jp shimabara-shaken-com x-system-biz kyougakukan-jp naka2220-xsrvjp hiro-design-jp naturezo-jp ryokounokensakudayo-biz wakeshoten-cojp note-sp-com xsample66-xsrvjp tenalux-jp kokkororen-com light-hous-com alabrava-com carcenter-khoki-com yama1pm-com xn--nbk1d7buav9cududsezd4619b-com 2cv-club-com xinfo360-xsrvjp xinfo535-xsrvjp rmtop-jp xsample167-xsrvjp futekigou-xsrvjp izumi-k1-jp hokkaido-ra-jp news-trend-jp sv2nd-com ancreate-jp yumepi-net room-worker-com nedlize-us kishiwada-syaken-com labellart-com junpa-com tsuruya015-xsrvjp 8project-jp mendokorosato-com maccarina-cojp miyanur-com onshinan-com sato-bankin-jp komazawa-ttc-com amritara-com xn--pckuae6a2167c95i-biz gaiji-movie-jp onlinestoreexchange-com ipasso-jp xsample313-xsrvjp s340-com wassalon-jp lotopj-xsrvjp tyokkan-com runchan-net tomtrade-xsrvjp 1fineday-biz at-iroha-xsrvjp suntruss-cojp naret-jp isotope25jun-xsrvjp wakuwakudouga-com chouju-orjp webtest-client-com tennenzinen-com morita-shika-net shirafuji-xsrvjp futekigo-com ukuuku-com harta miyama-satoko-com mikuyaproject-com touch-japan-net eastshining-com gen-en-monitor-com ejan-biz spock-xsrvjp jptravel-asia kurohigehonpo-com tsbizs-com seiwakoumuten-com cw-shonan-info kurofune37-com yumerita7769-com mietakun-com adamforcongress-com chibakogao-com 8one-jp easyfreemind-com xsample97-xsrvjp mooncom-jp technaceres-com e-sanoshopping-com morioka-ind-cojp sinsihuku-club-com mk-bikelove-com isochugoku-cojp sato-bankin-xsrvjp fureai-navi-com yo111-net pasoigusa-com friendship-jr-com rs12-xsrvjp iphoneworldmap-com shiranecycle-com deltazulu-xsrvjp sohjusha-cojp election-xsrvjp steels-jp storeworks-jp kasegu888-com yao-en-com profit-gym-jp fujishina-com skw777-com shabering-com kaiyoutei-com wakasa-obama-jp gatherlink-net no1-marketingcoach-com atagosan-xsrvjp club-rize-com miteyan-com hokkaido-shikinoaji-com hitokoto1221-com zen-platform-jp xinfo712-xsrvjp si-a-net jey-string-net jyosyu-udon-jp raisuhatakefuji-com cocoro-rhythm-com mm-style-net learve-jp team-sns-jp contrax-xsrvjp didier nobuaki-xsrvjp imaizumi-dc-com samurai-ticket-com minamoto-jitsugyo-com xn--mdko7702aecw-com souzirou-com webworkroom-com kanagawaku-net souzoku-houki-org humainus-info musashikosugicon-com gsxsetp1-com fujir-net mcprogram-net marketing-mindset-com ta-93-com xxxkawaii-info danceconnection-jp jyuku-me pridejapan-net mahalo-love-com tokyo-skytree-navi-com st-angelina-com novartis-app-xsrvjp snok-com saikinokai-com sosyaken-jp geinouch-com xn--48j7bzfzeohwa4c1c7a5ah7pd1297hupq830awta860ojid-net vegaworld-xsrvjp jinpu-kai-jp imaccer-com chuyo-denon-cojp marufuku-nouen-com senbeido-kyoto-com kenko-dna-com youbook-xsrvjp minobusan-trail-com office-koh-com sekizawa-biz tohoku-chuo-com exercisediet-xsrvjp kamikamihobby-net looping-jp fussa-shaken-com williamhill-japan-info oisii-takoyaki-com hangahokkaido-com yokamon-biz momokane-com racersnavi-com light-kan-com piaaplus-com yarujan-xsrvjp ohisamahouse-xsrvjp atomvetme-com duelmasters-kaitori-com oo0n-xsrvjp 3d-printers-jp tkt-center-xsrvjp sg115 hikari-ntt-com partsya-com best-fresh-net lastier-com nikken-ltd-cojp pkcreek-com m-takato-com open-chirashi-com chamrocca-com atamidecon-com yama-toku-com sancoa-hbs-com sunrise-inc-com goodchance-biz seminar-jp-info yu-i-net xinfo743-xsrvjp xinfo357-xsrvjp salon-lyn-com minoritougei-com creclamitaka-com sakicorp-com horyukai-com kaztas-com fukuyama-mokukei-com shiseibi-jp stupidproxy-com xsample34-xsrvjp wings-consulting-jp celtislab-xsrvjp thefukugyou-com jamselection-com hyuma2010-com onotoukisokuryou-com kk-hinode-cojp graceflowerart-com chip-pe sokabe-biz strelicarski-savez-srbije-org iboji-net washizucleaning-com dysczs-com yanheejapan-info surgery-iwate-med-jp xinfo503-xsrvjp tokyowill-lionsclub-org kagula-xsrvjp daimon-cl-com xsample135-xsrvjp nlp-island-jp lfamille-com test-xinfo764-xserver-com refresh-kaatsu-jp hondainsatsu-com office-ogawa-biz so-na-507-com sakura-0322-xsrvjp bizsp-net xn--n9jtb0cui4i1f2488azjtak97d-net nishikawa-camera-com fujimura-shika-com yokohamaconpa-com ise-lotasclub-shaken-com swagger-co-com kyokawaseikeigeka-com kudamonooyasai-com ecatch-mhss-net nanba-dance-com choishimichi-com spoiler denritsu-lighting-com test-xinfo734-xserver-com sg114 uecyan-net thebluesky-xsrvjp maruyo-xxx1-com takahashi-jun-com test-xinfo724-xserver-com r-sun24-com hamamatsu-coating-com pc-katekyo-com g-laser-net jas-pet-com test-xinfo714-xserver-com webkikaku-com rarewater-biz deecrea-com dearmine-jp miecon-net test-xinfo704-xserver-com inter-plan-jp infowinwin-net shinafu-jp tetsutabi-xsrvjp miraikentiku-com tobie0508-com eajpn-com test5150-asia ks-holdings-com hazama-design-com iworkin-asia mao-mao-cojp mietakun-net hijirinone-com d-cruies-com a-gaienmae-com xn--kckj3dudb-biz iscn-xsrvjp golfcraftjapan-com sun-i-org kawasho-hl-jp e-youkan-com infinityinfo-xsrvjp murisoku1-biz itukinosato-xsrvjp xsample65-xsrvjp studio-phiz-com theunbookables-com i-arc-com only1fashion-com itajiki-com 990933-com michiga-com asdageorgeclothingrange-com w-catalog-net sg113 shoprakuten-com xinfo534-xsrvjp xn--p8j0c259m22li4s-net xsample166-xsrvjp eggconsul-com soranoao-xsrvjp ageo-shaken-com isujkn-com pricewave-net xn--yckc2auxd4b1246f4y1b-jp xinfo591te-xsrvjp chiffoncolor-com designote-jp asebyebye-info test-xinfo594-xserver-com xn--nckg8jh0ek1dbb7f7459eehdhr8gg18a977c-net osho-fragrance-com 13office-com sarobetu-info pitchshifter-net oc1-xsrvjp rakudoku-akashi-com xsample320-xsrvjp yukendou-com admaterial-cojp komazawacon-com nanba-yasu-com nanmoku-net japanese-movie-info orihu-net lunion-biz santoku-net-cojp kashinotakanori-com dokuritujison-com mirakuruza-com pmc-cr-jp taikai-jp janzzysbar-com jats-cojp daily-speech-com trade-king-biz test-xinfo554-xserver-com thaiivf-com jp-alna-com make-sms-com test-xinfo544-xserver-com rehabilitation-jp xn--49s538bm8ux8c-net i-utsuwa-com smaphoappli-factory-info green-cycle-biz umai-yo-com intrepid-project-org joshin-xsrvjp xn--line-tk4c0cf2ooiyhod-jp alpinawater-info otogr-shizuoka-net shougaihoken-info munakata-cl-jp test-xinfo524-xserver-com ve-g-com freeinfoapp-com xn--pckhnj8ayp6atu7e2djb-com meiyu-ip-jp kenkou-bi-biz hakurin-com test-xinfo514-xserver-com palulu-jp barpolaris-com adic-orjp trust-solution-jp test-xinfo504-xserver-com xsample96-xsrvjp tosakanran-com hyuga-daiichihotel-com konwakai-jp xn--fa-og4aod4a8v-com longsmart-mobi m-design-xsrvjp xn--5ckhs7czfb6c0dd-com atstyle-xsrvjp tese0903-com oda-estate-com csw-jyuken-com dreammanager-info sg109 osaka-shaken-senmon-com jardin-favori-com atelier7-jp yatsutakamikoshi-com aimistone-xsrvjp rs11-xsrvjp anomaly-cojp tmp-inc-com xsample207-xsrvjp handsfreedigitalcamera-com kaorigikoubou-cojp tokeishop-jp crp-sapporo-com europort-cameo-com nihonbashiconpa-com suna-lab-com test-xsample308-xserver-com trimworks-jp kawaramachi-yasu-com browser-check-jp merrittmurals-com sakuyafb-xsrvjp cardboard-art-com mnmj-asia kyushugodo-jp tokudax-com altechjp-com testsp1208319-com camonoe-jp yumesiokaze-com xn--lurea-mm4dysia-jp inaka-nakoudo-com xinfo711-xsrvjp tcmic-net w-shinkyu-com mssrv-org chugeikanko-com xn--3kqu3oh0b77g34dt2lxzn4mre5ohlvlx1c-com frou-frou-org h2works-jp xn--akb-fu0e63gwsk9wi4dt38bp4bk6ivrnww8e2uwcils-com houkon50-com green-dental-info chayamachi-yasu-com testdomainx333-com infinitewisdom8-com rucksackspace-com eigo-joutatsu-net sg106 europa-artist-com rocohouse-jp kingrocker7-com afwd081028-xsrvjp testdomainx338-com yushonokai-com xn--ihqw3zba21d-biz test-xinfo761te-xserver-com tomimido28-com irinamihira-net izunousagi-jp nomikaisiyouze-com xsample103-xsrvjp ion-ceramic-com central-bldg-clean-com test-xinfo354-xserver-com golfshoshinsya-com pochitama-jp htz8513-xsrvjp koura-takeshi-com kangoshi-service-com themanwhomarriedhimself-com tenshoko-com hamamatsuchocon-com fukudashika-jp ringo-no-ki-com densai-s-com kaisen-fan-com heartwing-info e-joho-com civil-design-net life21inc-com tani-you-com villa3-jp choanshin-com syugaa0415-com crapre-kawasaki-net wakayama-yasu-com to-ritsu-cojp tomonphoto-com akashisyuhan-com twproducts-jp xinfo156a-xsrvjp funeralville-xsrvjp sakaearumi-cojp makibi-xsrvjp sweep-aside-com jiin-net kouenjin-com fushigiplate-com roc-cojp kansaibridal-com f-magic-com 4tune-nejp mikagesushi-net ryouhei0206-com photoria-jp ydental-com akihonda-com sasanobu2228-com manwatching2010-com xinfo742-xsrvjp xinfo356-xsrvjp ateam-cojp smilinghpj-org smartphone-affili-com am-shika-com sni-tobitakyu-orjp ofc-osaka-com realize-iboc-com advance-soleil-com sannou-r-jp kotobus-com bbq-con-com hopewill-net asbestos-jp xn--1sq130aw9j5qh-com dunan123-xsrvjp kirikui-com nakasendo-cycle-com xinfo739-xsrvjp yachimata-ds-com atsushitagawa-com guitarstylist-com xinfo502-xsrvjp xsample134-xsrvjp parallel-xsrvjp double-moon-info mankintan-net invside-jp snag-golf-net faith-hair-jp bs-saori-com li-ta-jp dalmatian-jp actionscript4flash-com 5con-jp ust-tsu-jp studio-zeal-com office-nis-com ohta-cl-com p-con-net sekisondb-xsrvjp mcrownroyal-xsrvjp mentalcafe-net yumesake-com tokubetu-orjp hobbymall-xsrvjp oita-syaken-com inuno-cage-com jones5672-com psychicno9-com marei-me inc88-xsrvjp mocolife-xsrvjp abundance3313-com masudaya-net news24s-asia katesippey-com pha10074-xsrvjp tsi-p-com raysfactory-jp xsample335-xsrvjp moki tenmabashicon-com orionxserver-xsrvjp nmtjapan-com futami-xsrvjp radia-xsrvjp testxdomain303-com guggenheim-m-com nikibitosayonara-com kis-s-com lush-xsrvjp atelier-stellar-com a-cherry-blossom-com ishimorikusa-com testxdomain308-com mei-san-cojp kawaramachi-yasuhei-com itb-cojp yoshi0308-com xsample64-xsrvjp uchiyama-kikou-jp naown-jp k-fukuda-dental-clinic-com rhrinks-com hotshot358-net nextplan-info testxdomain314-com kyasshinngu-info lockonshop-xsrvjp nh-pma-com xinfo533-xsrvjp trd2-xsrvjp tre-ca-com 39city-net xsample165-xsrvjp shopuu-sedori-com sensatsu-com network-jp-com tabekuru-net stayconnecticut-com all-cosme-xsrvjp okuei-com 0250587150-com rokusetsu-com onlyrealinfo-com gakuseievent-com itanaka0722-com makaino-com notch502-xsrvjp opus77-net the-secret3-com glittering-stars-com rumi-ne2-xsrvjp lien365-com tora2011-xsrvjp hanashite-sukkiri-com gamajapan-com sapporo2jyou-net msg-philos-jp fresh-yamamoto-jp shinseikai-d-xsrvjp plus-q-net moriya-cooking-jp catsway-net dreamer-xsrvjp trendstars-biz lead-next-com xsample311-xsrvjp shinshu-u-acjp twitter-xsrvjp awamori-cojp trophyqueen-jp kenko-ya-jp crystalfallsmotel-com u-tan-jp nakajima-reiji-com fujix-corp-com i4wave-com paikaji1-cojp 4mix-cocktail-com fukuikaikei-com fun-music-school-biz xsample215-xsrvjp dancealive-tv keihan-green-com kintaroueco-com jtreasures-com mensfaltusyon-info venus-times-xsrvjp tresrey-d-com china-phs-com nmaj-xsrvjp senryukensetsu-com flicks-cojp wp-affiliate-info nas-recovery-jp kibune1923-com project-ex-net rotier-xsrvjp pazpaz7-com whity-whity-net toufu-yamato-com sisei-jp xsample95-xsrvjp bitclay-com t8-itakura-xsrvjp subaru-juku-jp cbc-canada-com richesse-hij-com tokei-akashiya-com ty-plan-net test62-xsrvjp marupuri-jp gmunion-xsrvjp detopush-com holidayclothesforwomen-com ontamashop-com mr-clean-net wano-xsrvjp super-r-xsrvjp philoballet-com nichibei-xsrvjp xsample206-xsrvjp babyraids-net aoyama-nail-com eiken-home-com galaxy-universe-com sg103 start-trust-jp dog-yamamoto-net iwamun-xsrvjp takada4976-com stech-pro-cojp osaka-transport-cojp blacksanta-cojp mvhits-com harajukudecon-com kingburak-net bnca-jp yamatoya21-jp le-reve-nail-com mtplace-biz crecer-client-com webessentials-biz webbingstudio-com sps-mg-com create-o-com rusty2-com xinfo709-xsrvjp mfimp-com konkatsu28-com sect-xsrvjp propodentalex-net bio-s-net xn--y8jua4a3aa5irgf4841fknvi-asia kasegujoho-com nordic-showcase-com power-rips-com satoshi002-com zero-family-com famicom-market-jp arths-net-cojp momose-orjp testsp1201231231-com golftool-net minamihorie-yasu-com yanehoken-com plaisir-beauty-com galenhall-jp karesansui-biz restaurant-rumi-com hosomi-kogyo-cojp mugendou-osaka-com sg102 koubou-imaya-com satotti-xsrvjp 0507landbrain-com xsample102-xsrvjp ryomolive-net iwakuni-ymca-jp ba373-xsrvjp optronics-ebook-com trend7777-com renkon777-com enflor-net koshibasaki-com diemilch-com freelifec-com handworkcafe-jp 3dphoto-ar-com morisitaya-com xinfo369-xsrvjp wtte-xsrvjp sea730-com nkohichi-com premiersoundfactory-com ta-me-shi-te-net testxdomain300-com tohan-co-com vin-nerd-com pcsubnet-com create01-xsrvjp crimp-jp yrnetmind-net vivify-xsrvjp c-how-jp omotesandou-h-net affiliate-matutake-com concaragan-com globalshopper4u-com cuisine-xsrvjp sept-couleur-com contech-jp kouboukujyaku-com xinfo741-xsrvjp xinfo355-xsrvjp xn--u8jua8gqbf5b9c-com colmn-cojp hoc-jp-com kumachan-info xn--ehqvz02f3w2b4ha256p-com mic-fishing-xsrvjp megumibaby-com xinfo107a-xsrvjp nazegroup-jp big8787-net sapporoshi-shaken-com elle-jt-net strongroove-com sss-mizuno-cojp miyasaka-ss-com mc-academy-info francheeno-com allmymate-com nichido-monthly-net egbaism-com xinfo501-xsrvjp toko-08campaign-com lakalomi-com pokertips4beginners-com asaichuzo-xsrvjp k-tanigawa-com rokusetsu-net xsample133-xsrvjp fujigaoka-service-com primo-st-com my-nemuri-jp walker-id-com npo-panda-jp wakasho-xsrvjp thykm-net mmaru-biz jtta2013-org goodkyoto-com cesiumkafun-com takitoh-com ebmtrading-com kodokai-net kon-gene-com kk-morita-ss-cojp corocorooon-com sskgroup-info iwaki-shaken-com midpalm-com netcross-usr-xsrvjp trader7-net ikealife-net vege-tore-com nagoya-cci-com poca-ket-com sweet-emotion-net ikefuku-xsrvjp ult-japan-com enes-cojp longwin-cojp netdegungun-com money369-net fs-lifeworks-com martinique-barreau-com kishimoto-hideo-jp kamoike-com seruraito-info sym-sym-xsrvjp stillkid-net 851-jp sandaekimae-com kyoutani358-jp diamond13-info centurion-club-com comleading-qrs-com lifecyclopedia-jp gateau-shirahama-com soryusha-com libary-tv 9demo-info rosn-info ys-grp-com hqt-jp iharats-xsrvjp marry-port-com i-friends-biz xsample63-xsrvjp akadon-biz amilove-net daisei-loginsystem-net uotake-jp wealth13-info se7en m-tresor-info century21cosmoland-net kasaiportal-com bluewings-xsrvjp mechanic-recruit-tsu-com 82905236-com xinfo532-xsrvjp c-ty-jp xsample164-xsrvjp komaya-info fauvizme-xsrvjp niiza-net subaru-chuhan-jp learningplay-xsrvjp kijuna-net kamig-cojp 2d6y-jp net-newstyle-jp yoiko-sakuragumi-com geo-plan-cojp newday-r-xsrvjp phahp-info hii-peple-com xn--a-geuzc8b9bxq-com akibeach666-com xn--ockc3d5hu632b-com toco2dog-com happy-777-biz real-aide-com avenier6288-com aki2844-com xenoland-net itkids-jp headandhand-xsrvjp miyazu-net fugetsu-sapporo-cojp dragon-cross-xsrvjp owlinone-xsrvjp tm-ms-com sci-jpnet okusuripet-com sk-design-cojp yo-affiliate-info excel-ins-jp phoenipro2-xsrvjp zgmfx20a-com allaboutplumbing-inc-com aul-jp suuu-design-com garage-candle-com oniku-xsrvjp test-xinfo768-xserver-com lamb-cloud-xsrvjp office-eql-com koufu-con-com npo-jcia-com netapp2b uks-cc miyako-aquaticadventure-com lakalomi-jp zaitakujosi-com xdock-xsrvjp estenadsonic-mobi insatu-hikaku-com test-xinfo765-xserver-com wabisabi-ya-com xsample94-xsrvjp md-trunk-box-com vital-life-cojp design-memo-net kusatsujuku-jp testsiefafasdf121219-com sw201212-com legend-mj-com asaichuzo-com fleugel-xsrvjp xn--u9j282gwio42bb83h-com xinfo563-xsrvjp room-coating-com r-union-org nayamikokuhuku-com celebstyle-jp livetp-com mrise-xsrvjp oyayubi-cojp test-xinfo758-xserver-com gasenenews-xsrvjp born-in-the-darkforest-com credi-hikkoshi-com 108-octo-com nayaminai-net hfog-info arafor-com ulife-reform-com kyoryu-shougi-com muramatsunews-info a2unit-com shikishiki-com baseballgear-jp consult-semi-com sesame123-net kurahashi-hifuka-com sasahaya8-xsrvjp ootani-xsrvjp golden-item-cojp yutaking-com xinfo708-xsrvjp xn--z8j2bwkxag2fvhmi9cc9847r-com rafjp-org mholi-com suzutech-com rimosuke-net erena-ono-net iowanazkids-org dn-net-cojp kyabaraku-jp keihin-technical-com josho-kiryu-com you242-com aruz-shop-com saisokunews-com mitsukawa-net hairsupple-jp rt-planning-com hoken-partner-com arbel-xsrvjp b-garden-com ryu-tan1945-com test2-xinfo701-xserver-com wellnext-info xn--ols92risjhpv-asia ksl-auction-com hanaoka-dc-net rom9-xsrvjp xsample101-xsrvjp xxsunflowerxx-com noto-xsrvjp tcplus-xsrvjp xn--u9j5h1btf1es15qifb9z6hcj5d-jp tsunagaru-ktq-com myhome-uehara-com akihisakondo-fc-net bmarket-inc-com bestplanning-nejp kessetsu-net fly-sky-asia meiyobiz-xsrvjp tjvm01-com lapilos-pure-com yoyakuweb-net immersion-xsrvjp aval-jp jpzekken-com kichijoji-unmei-com fuku-sui-net hamacon-cojp bestlife-ytf-cojp xinfo594-xsrvjp mutsumi-rental-com xn--eck7alg1e2b-biz youngmate-jp throb-xsrvjp anpeiji-net xn--u9j5h1btf1e613xwr2drrjbqs-com miyagikankou-xsrvjp hys-inc-com nananasalon-com crerea-d-com m-shop-net dr-hiro-com excelpon-com delta-group-xsrvjp ezcite-net test-xsample30-xserver-com neo708-xsrvjp all-dietary-supplements-net x1gg-com keb-xsrvjp xn--u9j0c2f2crdwc2cwdv219fiuc-biz xsample330-xsrvjp satyrise-xsrvjp rt-planning-xsrvjp cutout-jag-com xinfo740-xsrvjp xinfo354-xsrvjp shigeno-motors-com oisii-wan-info keepcool-biz yuukyuu-com memokore-com kenko-coffee-com good113-com realgrow-cojp xn--68je3c7dsev110a6cu7y0e6xk71t-jp worldwidejob-info xsample31-xsrvjp micro-powder-cojp t-moving-com designbnk-com ryouguchi-salon-com japanese-goods-biz nexenta1 fbmarketing-lecture-com haripanda-com fnettest-com nabeshika-com flysky-xsrvjp heartfultrust-xsrvjp xsample132-xsrvjp liveplus-xsrvjp ashibatobi-orjp hp-omakase-com augace81-com srsrsrno-1-com talkwith-jp xn--u9jb5p4ctkpbzdu307a19ai49kda-jp easy-pace-com sky-aff-com 6348-cojp m-styles-jp kazoorock-com ja-suzuka-orjp mtb-production-info trd-xsrvjp wwvision-xsrvjp ontaya-com xn--vck0et49h-com kenkou-dajya-com bunkagakuin-net sutekini-net blackma-n-com omiyacon-com engtests-cojp mayub0628-com link-face-com hoken-opinion-com gessyu50man-com uduki65-com kusuki-biz macbook-fan-com willowtree-xsrvjp ckb-xsrvjp ciel-c-jp uedafumio-xsrvjp takaranoyado-com xsample209-xsrvjp test-xinfo762-xserver-com tarinukarte-com shirasaki-hifuka-com yushoya-net mekikijuku-jp ve-gate-com yoneharu-net koube-shaken-com dolphin-watch-net panarl-cojp sweet-w-com test-xinfo742-xserver-com muw-do-com sedorinomirai-com xn--zckqft4pu73w8go-jp ravenrileyisahottie-com biyakusalon-com test-xinfo732-xserver-com xsample62-xsrvjp xn--30r99m89hxoam8ze2n05l-biz netviewer kite-misawa-com ajajajajajaw-xsrvjp teruhito-thank-com yuasisu-net test-xinfo722-xserver-com test-xinfo702-xserver-com k-kotani-com ikebukuro-tk-com tem-baby-com test-xinfo712-xserver-com xinfo531-xsrvjp cpa-museum-com xn--icko4ae3d6o-jp xsample163-xsrvjp eishinjuku-xsrvjp originaltshirt-jp vision-industries-cojp candy-0210-xsrvjp sonicjob-com bijinkan1988-com ykd-cojp appliyakun-net imperial-bms-com jiko-jitugen-info tprint-info matsushitasatomi-com remedier-net rakupa-com wp-customize-net tatsuokw-com codes-a-com s-unit-xsrvjp dreamtoma-com haatm-net sky-afiri-com sisan-unnyou-asia hawaiiwater-tohoku-com goods1-com alex-ah-com youvision-biz isa-grjp xsample308-xsrvjp fumitan-net kizimun-net machinaka-link-net karadalab-jp sptm-i-xsrvjp 653655-com d-salescopy-com amano38-com a-cue-info kawaramachi-ponto-com fujiwara-ahp-com garden2495-xsrvjp sky-afiri-xsrvjp modernchild-jp-com y-studio-jp kimanmakoubou-kikori-com monnickendam-dia-com firewing-xsrvjp plan-menkyo-com assam89-net test-xinfo592-xserver-com support-surunara-com nobunobu981-xsrvjp hyugads-xsrvjp join-with-jp osusume-net-com tkitano-com kaigyo-kekkon-com yokosuka-shaken-com keituiherunia-com atrapas1-xsrvjp xsample93-xsrvjp teru-dental-com kyo-kure-com real-trade-cojp credoseitai-xsrvjp new-figyua-com test-xinfo562-xserver-com seiko-kaiun-com googoojapan-xsrvjp jorro-design-com xn--v8jvcby2l2b4hqftnh804cpktafq8h-net land-create-cojp guitar-shop-cojp frosty-school-com test-xinfo552-xserver-com yunifurerm-com xinfo562-xsrvjp meishi-plus-com clipmusic-cojp sap-inc-cojp xn--line-ym4cqkvg9752bcyva-jp senior-care-cojp crazywedding-jp dreamstage-weekly-net test-xinfo542-xserver-com toruscloud-com satoo-biz okeya2525-xsrvjp brand-shop-xsrvjp yuzuruhassamu-biz ikkyu-seikotu-com pet-academy-com test-xinfo532-xserver-com nadia-bz portal-website-biz heart-flow-com masu-okazu-com hidamarinet-com test-xinfo522-xserver-com alienfunnypot-com network-hikari-com skystream-info kessai-ikkatsuhikaku-com takepon7-com test-xinfo512-xserver-com l-bamboo-com pdevelop-xsrvjp kenshoukan-com sugaoreiko-com officesakura-com tech-angle-xsrvjp xinfo707-xsrvjp test-xinfo502-xserver-com fusa-cojp modelcase-net g-factory-xsrvjp xn--vsqv9lppf53f-com xhtml5-jp keihan-ophelia-com 2week-info brand-repair-com mmm-cx unicolabo-jp yokkaichi-mj-com my-powerspot-com btest-xsrvjp koba-i-xsrvjp minacom-xsrvjp t-eigo-com ndu-ec-com organicvegereview-com plusone-ps-com yuki0509-com test-xsample326-xserver-com bamstest-com peace-shop-com hikaku-creditcard-net nano69-jp chokki-com ohimesama-info djtomo-com popcorn-papa-com life-go-info sofuken-com test-xsample306-xserver-com yokoi-site-studio-cojp tmc-labo-com rom8-xsrvjp tmi-st-com branduce-xsrvjp sunnysh-xsrvjp kurt120-xsrvjp tsuyahime-org anti-aging-club-net propeller-pigs-com shuihubook-com one-sky-net mkksh-jp technosound-cojp yumaishodo-xsrvjp b33-org sayuu-jp kiyotaki3-com tontonlife-com netokaru-com tenpoo-xsrvjp xsvx1019633-xsrvjp akitacon-com xinfo593-xsrvjp xsvx1013269-xsrvjp selection-up-com kuma4864-com jandc-xsrvjp daieltuto-info hanjyo-info garasunosato-com directoryfound-com my-days-off-com storey-s-com land-21-com xinfo122a-xsrvjp xn--t8j3b4ef5oa1c8e1srau1b8r-jp kyara-jpncom europort-stika-com test-xinfo352-xserver-com yt-kaikei-com snaptokyo-jp collect-xsrvjp xinfo353-xsrvjp hiserve-cojp tokyodegibe-xsrvjp rockeys-biz ii-kao-com ayabeshi-jp toint-net ainsel-xsrvjp fumika-shimizu-net mhousing-jp takatora7-com horiecon-com machikado-tokyojp the-kobetsu-com mdt-cms-net sakiyama-bc-com infolma-xsrvjp innervision-xsrvjp appri-ya-com crimage-jp springwater-h-com englishfamiliar-com s-d-h-com woorom-com akasaka-eyes-com xinfo546-xsrvjp chibadiet-m-com mizu-shori-xsrvjp xn--3-4eu4ewb4f-jp xsample131-xsrvjp matusima9656-com arga1039-xsrvjp artoria-xsrvjp bigtrout80up-xsrvjp xn--navi-ul4c1e8bg9i0h4h-jp jtta2012-org koneko-navi-com stella-si-com kyoto-ennosato-com nijiironotane-com studiobibi-cojp shahotaiou-com ryokanichinoi-com e-crom-com xinfo509-xsrvjp baat-memory-com dumpvars-com s-atoz-com cbs-datsumou-com packuntyo-xsrvjp seifuku-labo-com cozy-cafe-grace-com yasui-press-com herbest-college-com shi-gyo-com bijin007-com haraganka-orjp high-top-jp bluemurder-biz rea-lizar-com tahatsu-net pitat-nabari-xsrvjp beautybeast-cafe-com yoruslim-info kayama-sakaki-cojp sagawa-construction-com homebs-net sumizoku-com alive-corp-cojp saikounosumai-com tiger-dragon-org xn--0ck0d1a2et21sbko82s-com tcigp-net testxdomain310-com hochzeit-profis-com bonn0815-info medical-chain-orjp koizumi-orjp xn--t8jg7fsgvi0d2h2g-jp agir-osaka-com adman-jp jsotop-com seiko-kaiun-net xsample61-xsrvjp muryo-offer-com qdcop-com lsecretservice-com toushirou-web-com fukushi9000-com ht-produce-xsrvjp takeshi-dream-biz xn--eck2csav0byit522b1t9a6fk2u5d-biz xn--cgi-qs9d423tgelegd-net abundance33-info semco-okuda-com xinfo529-xsrvjp ktt-school-jp p-fine-biz xsample162-xsrvjp successmindset-info yu-momo-com ichinoi-jp maru8maru8-com akizukiminami-com utahutah-com onokan-jp g-freak-com newbiz-task-com testsaba-hiroo-prime-com weilaigongben-com wirelesspencamera-net cycle-force-com neltutokasegu-biz rlifesupport-com cattly-com rose-royale-com raytenor-com erb-xsrvjp ukiukishop-xsrvjp logue-jp effort-corp-jp line2-tv shinku-ya-jp padm-jp reject2-net j-alliance-com moe-jk-xsrvjp peace-shop-xsrvjp akb48akb84-jp ecomado-net works-jobs-com firstitpro-com keiba-info-net kjyu-art-com xsample307-xsrvjp pro-13-info earthpolish-com kyoto-kyoto-net adworks-design-com boribon-net nakasuhaken-xsrvjp asayoko-net pokkarigumo-com getti-info machida-shaken-com yukaisoukai-com clinic-webseminar-com localstock-jpnet internet-agent-net popran-net sato-iin-info vanguard-kaitori-com french-code-com decormaison-jp jagdd-net inuyamachuohospital-orjp tess211-xsrvjp sugita-photo-jp inexpenshop-com koshigaya-con-com shin-ei-kan-com officek-s-com xn--nckgh0pyb4cb0662e3ze8mpt2h2w6bmjzaoh9a-net webzou-info barakamon-com def-hair-com studio-arai-com nnn00001-com seiryuunouen-com one-piececollection-com takada-babadecon-com rikoh-s-com kawagoe-com relaxrich-com yands-jp doutonbori-yasu-com testsp1208273-com m-credo-cojp touch-express-net sympret-com kyoeihomes-com rio3 1024-cojp shantishanti-info i-exec-jp dct-japan-cojp kyotanba-dog-com suzuna-web-com fullsato-jp testsp1208278-com xsample203-xsrvjp wedding-pipi-com asukamura-jp info-abaku-com 805-ch rengenosato-cojp regal3-bg-com excelsuke-com fukushimadance-higashimatsuyama-jp 66sk-org s-pro4-com sekainomadopower-com kagoshima-shaken-com you-rec-cojp overload-xsrvjp fujir-biz yusyutu-business-info girlslovin-com beppy-xsrvjp slabri-com fuusui-kantei-com xn--y8jl1nr86je03c-net takagi-jds-com seizen-zouyo-net p-fucoidan-xsrvjp siota0913-com i-country-cojp parts1-amagasaki-com xn--u9j5h1btf1e9236ag6b1v8idc0a-jp yuyasawada-com toxictwostep-com youclub-jp kootec-jp sakashita-s-jp k2style-jp chintaisoudan-com banyan-therapystyle-com moemore-jp novus-dairiten-jp miduho-seikotsuin-jp iroha-affi-com e-goyoukiki-com xn--pcktab2b3dta2oze-jp h-kazama-net snowflakes-xsrvjp meadow ske-xsrvjp kumanomai-com kotohogi2672-com oumi-tankai-shaken-com touchkun-com abe-iin-org michinoeki-totsukawago-com masturbatiomenu-com afoi23j4ofadf-com rise-p-info mhcolors-com sawhde-com unitedstyle-cojp akahori-print-cojp netbizch-com tetta-xsrvjp officetecchan-com xn--54q764c9gar1l-biz kotog-jp amb21-com calender55-com clover-factoring-jp move-s-jp minamo-ichiba-com php-factory-net suiso-water-com ateam-xsrvjp 225nikkei-biz ecoaichi-com grandia-cojp yukinanjo-com seitouen-net wisdomdesign-jp hxgjp-com xinfo592-xsrvjp homepage-sokkurisan-com xn--t8j3b4ef5mpcvq0dvb-jp banbankasegu-com terada-jpnet takenakawasai-com osaka-gentei-com seasea-jpnet ccrcjapan-com otoriyosecurry-com safety-finance-com search-c-com kizuna-cafe-jp officesam-xsrvjp ncare-a-ch-jp ongakujan-com furano-kankou-com xsample204-xsrvjp it-success-net melissa-acp-com jeunesse-espoir-com post-announcement-com hahacom-jp ryuka338-com xn--eckle2a3a6k5eucvec7hu028b33tg-net osanpo-shopping-com cross-farm-com joy-space-xsrvjp hsk-archi-cojp roks-dev-com nikemercurialvapors-com imaizumi-gardens-com posao takahirofree-com r93yu1130-xsrvjp pr-jp-com nakayoshi-hoikuen-com newral-info rocket-english-com at-cynthia-com hokodate-jp hokutokeibi-xsrvjp bicimp-xsrvjp tennoujiconh-com fgroup-jp green-ceremony-com chip-clip-com arigatougozaimasu33-com xsample130-xsrvjp sample1 i-exo-com maruni-seiki-com skincare-style-info it-force-info nekretnine lgtv-cmp-xsrvjp tashiro-ent-jp neostage-info vixell-net handsfreevideorecorder-com sp-shoppro-com sanwa-de-com ozak-cojp slimfan-xsrvjp remaria-com towatowa-cojp facebook-lab-biz growniche1-xsrvjp mahae-cojp atopy-stop-jp reisyu-xsrvjp firstitpro-net affirieman-biz burlesque-style-com vegaworld-biz monochro-org akashiyanet-xsrvjp yasutom-com com10mo-com ms-garlands-com soc-p-cojp transpace-jp namba-ten-jp sanneisya-com risktec-jp j-premier-com ikel-cojp kazukuniyuri-xsrvjp how-to-wordpress-biz ngc205-biz miracle-fun-com hinoshin-com dq-sei-com measurement-labo-cojp bluetiida-xsrvjp xinfo125a-xsrvjp rocksocks-jp camp-sej-com takamatsucon-net shin-ei-kan-net ecoa3-com happylifeysh-net yukakun-com shinkyuin-com kansaibridal-xsrvjp xn--98j8ah3e9333bwksbg2d-net sumideny-xsrvjp xinfo768-xsrvjp muraki-ltd-cojp alohatherapy2002-com tryday-xsrvjp patine-jp pearl-house-com test-xinfo518-xserver-com kawaoto-xsrvjp sprout-grjp best-future-net vontesi-com aidparty-xsrvjp testxserverdomain363-com lineaworks-net navi49-xsrvjp xsample319-xsrvjp m-davide-xsrvjp bose-xsrvjp uranai-uranau-com asa-eirakusou-com 11code-net xsample59-xsrvjp 4get1self-com autogalaxy-jp xinfo101a-xsrvjp heavendays-net best-relation-com shinhwa-fc-jp tsukurie-jp ujiharablog-com tradeli-com aries8-com infor-mations-com hunabashi-bankin-com oekaki-factory-com nature-jpnet inugumi-net trust-cars-com lancers-high-info kitanihon-xsrvjp xn--t8j4aa4nt10m093dusc-com xinfo528-xsrvjp gift-campaign-net mint-rua-com magni-hyogo-com xsample161-xsrvjp sptm-so-au-com ys-office-cojp highkicktattoo-com tohotv-jp cocoro-kiku-com hanakobo-juran-net heavy-rotation-jp yoi-hanarabi-jp perfume-mens-info yscube-com mydays-off-xsrvjp gk-asiapremier-com oita-eikosha-cojp kenkoumai-com freeofferfreelife-com lscart-xsrvjp xsvx1024554-xsrvjp kyushubiz-com office-tsh-net dreamv1-com kite-image-cojp forvisionaries-com webbing-hp-com kigyouka7-xsrvjp pictonico-com xsample306-xsrvjp ringo33-xsrvjp social-marketing-orjp testkimuraphp5-com datumo-asia ebook-fj-com min-han-net j-c-y-com mitamachicon-com station-fc-com net-kigyou-info office-koi-com hasegawa-r-com 1stcreate-com libero-3star-cojp mokotarou-com haitai-cojp mashike-winery-jp matsuiisamu-com futaba-dd-jp rleia-net artplayer-jp katadukeichiban-com foodening-jp dez-cojp rio1 tmdu-mo-com dabetabe-xsrvjp xn--x8jc3d5hp94mb34d3m4a-jp sekainomado100-com xn--eckg4cd6wc6i-com 1tomodati-com kessetsu-xsrvjp thegoldenratio-net 1jsma-com p-answer-com tmc-labo4-xsrvjp ireba-pikako-jp xinfo559-xsrvjp organiccolors-jp pulse-group-biz xsample202-xsrvjp direcsion-com sunny-gem-jp naps-web-jp sitifukujin-xsrvjp saiko-tei-com inafami-com chikyukazoku2020-com webris-net linesystem-jp mydoykadoya-com worthliving-cojp yossi01-com ridestar-xsrvjp light01-com esprituals-com phantom7-xsrvjp xn--t8jxd7cyb-jp xinfo705-xsrvjp interior-mk-com effectorweb-com xn--24-zb4aym5cqhlgl55v9p2b-jp welcomeroom-net afdiscovery-com 3soeurs-com djc-xtension-xsrvjp bejilife-info kondo-shoten-cojp yushonokai-xsrvjp nakain-com 29mailmaga-com stocktonspringsme-com j-online-jp dream-mt-xsrvjp knc-xsrvjp xn--cckl9b3gza2011c8f9e-biz olao-jp kazoorock-xsrvjp xn--p8jn4h6d6kxd2h2g-jp yakuzenn-com jporg-net biyouch-com xn--ddk0a0ev93mf5jpqm7g9a01bjvzkyih1est2f-com primetime-kozaru-com 532up-jp ryouhei-rea10naru-com test-xsample320-xserver-com sukedai-net thefirststep-info xn--hck9an9sbc3455c1ye8x1mr56a-net dogtraining-f-com nomadaffiri-com rokkomokko66-xsrvjp test-xsample316-xserver-com seo-don-tatsumi-com dear-wig-com mailsien-net ichiko-oki-jp zipanguhunter-com testsp12042343332-com xinfo591-xsrvjp kencyomae-matsuya-com kamig-xsrvjp kaorumorita-info ariga10noie-com whiteblackdesign-com xn--gckvas0t2a-biz test-xsample313-xserver-com te-cross-com machicom-tokusyu-com satukou-com dr-monroe-jp australie sronetgw-com pgengo-com uggstovlarforsaljning-com machi-link-info xn--yckc2auxd4b6564dogvcf7g-jp miyazuke-com energize-cojp maedaphoto-net xn--58j5bk8cwnpc8czq6095c-jp xn--pckj3hf8gj-biz koubou-imaya-xsrvjp test-xsample310-xserver-com yoloport-com debcheebo-com thinkingtest-xsrvjp kurihara0999-biz adsky-jp nakazawa-sekkei-com xinfo736-xsrvjp xinfo351-xsrvjp uwakaishop-com kawahara0202-com xn--bcke3b8a3d7d8jlc4234hersb-com harajiri-com ebrietas-xsrvjp s-a-biz fujiyoshiya-online-com waocon-xsrvjp hibio-orjp hmmr0403-xsrvjp cnvsx-com youtube-club-com med-infom-com moko-lp-net logo-r-jp xn--u9ju31pa341jhjg-com nxi-xsrvjp art-repair-com ineed-jp nakazono-kensetsu-cojp jpinfo-you-com colorwirecraft-com ogata-h-com seoplus-jp apbot-info nanomi-me rideout-biz felice2004-net shihatsudo-orjp s-kouenji-net sunbridal-jp xsample128-xsrvjp ujilc50th-net diginfostation-jp amigo-latinshop-com go-nagomi-com midorimushi-kenko-com kijima-xsrvjp shiobara-arai-shaken-com goodlistener-biz teradox-jp jinvtm-com mahou-awa-com neco-inc-com anet-inc-jp puttyo-com kitaurasenkou-com xinfo760-xsrvjp xn--18j3fvcefx9ttdwi0233e-com suginami-town-net lilacgray-com yaeyama-yacht-club-com rucion-com 5489-in tyube-ichinomiya-syaken-com acda-jp fisland-info npo-nsa-jp ggoodnews-xsrvjp ryokufu-sya-com kbr1971-com taiyo3333-com cuibap honmakale-xsrvjp wvroadbuilders-com sbjel-info followmatic-info eco-easy-jp k-handc-com k-decoration-com slackline-xsrvjp syufudada-com acr-net-com pasokonlife-com union-bz satisaffili-com gshuhou-com plan-lasik-com hollywood-air-jp marutakeya-com anc58749-xsrvjp mikanno-com xinfo767-xsrvjp yss-school-jp mitsuo-tosou-com yamato-pub-jp kumasyasui-com patec-tech-jp madangler-jp hawk01-com shinbangumi-net yamamototatami-com speedarea-biz gebo-affili-info tenposhuukyaku-jp bicycle-stage-com crane-xsrvjp wellsrich-xsrvjp xn--n8jub7qsb3inewa4c7463e-biz yata-garasu-info sporture-tv clarenet-biz xsample58-xsrvjp junkbuyer-form-com vois-net-jp howto-manual-net synchronote-net tsukeobi-com npo-polano-orjp hs-eternalstudio-com arihiro-gallery-com weboons-com grandhill-net hair-climb-info kouritu-info xn--48j1ar8krh1b6dyk4649eygh-com hp1980-com xinfo527-xsrvjp pepentel-com testdomainx323-com hokkorisan-net goken-g-cojp xsample159-xsrvjp gomutimes-cojp junction-xsrvjp finefeatherheads-jp tanaka-stn-cojp nightresort-com lavous-com namgite-com test-xinfo760-xserver-com hananotakumi-net xn--1rw4k17v0yq-biz tikabou-biz fc-kyoto-info mms-xsrvjp gashintei-com azure-style-com devayoko-com xsample318-xsrvjp yokosakata-com testdomainx334-com maki-nao-com megurocon-com test-xinfo740-xserver-com jyokoshoken-xsrvjp zero-school-com kyoualice-com eraberu-hoken-com pino-books-info sawada-cooking-net freedomken02-com test-xinfo730-xserver-com best-book-biz smatre-news-com rapislazuli0678-com xsample305-xsrvjp n-hakko-com tora-corp-net tokupri-xsrvjp dadada000-xsrvjp test-xinfo719-xserver-com xn--38j9do54hodfw8a26fyr7e-com dreamsguide-net gojune-xsrvjp transurl-xsrvjp titan4 xn--h9j8c2b370ru87b3rya-com ajiwaiya-gen-com test-xinfo709-xserver-com xinfo128a-xsrvjp horsedealeronline-com sowa-com-xsrvjp yumegift-net specs-jp beau-magasin-com code-r-xsrvjp wakakusa-call-com nagomi-gh-jp ad-car-jp retoto-com dash2012-xsrvjp ysvs-xsrvjp beachbreaktx-com wa-ipi-com itasui-xsrvjp chaos-grjp akebono-seitai-com tatsukawa-dental-net turu503-com onestead-com within24-biz pontajapan-com wecop-net voiceapp-xsrvjp sachinoka-com aplanning-info porce-in f01fuji01-xsrvjp xn--4gr53rqoa84h99wywlvrxf7n-net machi-shirube-net devrm-net line-t-com hyphening-com san-ten-net tokushima-shaken-com bath-paint-com tachikichi6-com worldrings-net risounopapa-com classtream-jp xinfo558-xsrvjp sakurafubuki-xsrvjp morisige2356-com kami01-com datsu-genpatsu-info aaa-icons-com tanimuratakahiko-com rougo-asia susweb-cojp satoshop-com best-3-biz naritatomisato-hp-jp r313-net i-himawari-cojp alice-pg-com tatsuyafukuda-com xn--swqq1zt9i4xa94dl3f-net ouenryoku-net kinkipesodan-xsrvjp imagebank-cojp cycle-esaka-com mysticalbullmastiffs-com marukin-ad-jp itoshima-in tamai-tsuriclub-com vinhlong xinfo520-xsrvjp e-oguni-com hamuchiri-xsrvjp xinfo704-xsrvjp techno-factory-com isamuhazama-info europort-craftrobo-com kumosukedango-jp minoru-asia air-studio-jp pluton-jp rigakunishi-com test-xinfo559-xserver-com aruz-saifukaban-net process-1-cojp smtown-passport-jp to-1-info test-xinfo549-xserver-com herbery-jp fbms55-xsrvjp j-officeweb-jp giulietta-xsrvjp fstory-jp test-xinfo540-xserver-com kawaisakusen-com takatori38-com mikelab-xsrvjp test-xinfo529-xserver-com xsvx1016120-xsrvjp iinet-n-com facts-xsrvjp rom5-xsrvjp blend-shop-com ymtenjin-jp matsuda-ph-com test-xinfo520-xserver-com test-xsample226-xserver-com ktscopex-xsrvjp sabre-jp naritetu-xsrvjp a-pf-com minaoshi-1-com shinsaibashi-yasu-com test-xinfo510-xserver-com mint-rua-xsrvjp enecost-com ropponginohaha-com amaeco-com platform-xsrvjp ji-ji-affiliate-com seminar-kasui-com lsecret-info ssr-orangetantei-com frantz-fanon-com gentei-kumanavi-com re-use-biz aononet-xsrvjp risshun-net tknd-info handshake-orjp tula-xsrvjp nagoya-adm-com piers2011-com smzh-xsrvjp sokuhoukan-info furano-melon-jp osakabijin-com yumemaga-com hunabashi-taiya-com jita-premium-com gogobusiness-info testxdomain304-com cosplaytravel-net lockone-service-com class-shonan-com career-staff-com dk-daiko-com greaterpittsburghciogroup-org ikebanaohara-com sv1st-com testxdomain309-com net-cross-com tassmania-xsrvjp digital-crest-tv zenyokukyo-xsrvjp spsjapan-com enchan0408-com bbphp-net 500yen-net shigesg-com eastadventure-jp xn--y8jp0mua-jp tanio-hoken-cojp mamanurse-com wscape-xsrvjp tsumekusa-net xn--uckg3gj1hd8c0399cdf1bux7bxfd5ub-com bisamobi-xsrvjp dcsblog-xsrvjp iyasinoamore-com tm-ad-xsrvjp naotjewelry-com chapter-xsrvjp nosyoko-jp worldwalker-jpnet saiseisuru-info tobiken-divetofree-net xn--88j6ea1a3393bhfatv1xi104a0ln8if-biz xn--cckj1c2j2bwf6044bomgf76b-net uoshige-biz kyoto-rentacar-com nki-print-com hotta-ganka-com cancionvivaradio-com bavi-plh-com hmhits-com tkt-center-info waisu-xsrvjp cs-delight-xsrvjp fairyparadise-com k2k2-jp prenew-xsrvjp gifu-notiku-com sol-tec-cojp sorahime-com db08 gates-xsrvjp xinfo738-xsrvjp soooooooooon-xsrvjp marukyo-net-cojp kimono-united-com denebola-jp 4-lips-com e-melon-net cocowa-net yasumuro-plan-net apurituru-com xsample127-xsrvjp napoleon-hill-jp atelier-iki-com fushimiyoujien-jp bikkurimeisi-com test-xinfo359-xserver-com fine-one-jp nishiumeda-yasu-com chaigo-info smile-switch-net sidebrains-xsrvjp test-xinfo349-xserver-com shinnihon-koukoku-tokyojp whyling-jp kinshichodecon-com takagi-biken-net test-xinfo342-xserver-com yamamu-net bayshin-craft-com ke-tai2-com air-i-xsrvjp golfwalker-jp xn--zckwa8eyf040sre5d-jp tanu3355-xsrvjp smedic-xsrvjp roi-pro-net eurotexjapan-com fukuokare-com shiminuki-takedaya-com aplan-house-com seisenryo-jp nmf-acjp magokoro-ticket-com td-honeywife-com broslink-net fans-xsrvjp wintechnos-xsrvjp junjimu-net uggeinkaufenboots-com mt-east-com koubesannomiyacon-com grk55-com ktstv-cojp lookphotography-net hanagasa-net kouta-zero-ism-com xn--n8jub3du45qx2ykjyeow-com kamineko-info maru01-com houmu-jpnet hatakeyama-dc-com lockey-group-com ohariko-onaoshi-com windows-nt40-com kishokai-orjp golfer-apps-com enshunavi-xsrvjp d-k-o-info flowertriangle-com infonity-jp-com ariake-oak-jp u-fphoken-com tryforce2000-com hiyoko-f-jp kikoijapan-jp xn--dcklt3fn2gyc8fzfz425ac76g-com easelhome-jp sakuragaokacon-com picoslab-com jack-o-lantern-in ryumeikan-tokyo-jp pongsityume-com kotoni-copint-com futamura-orjp gamification-marketing-com self-shop-com pitat-nabari-com xinfo526-xsrvjp xn--i8s707c3pk-com xn--cckyb9em8gz324b8q4a-com tax-adviser-info xsample158-xsrvjp jouhoumax-net nccard-nejp gyousei-jp kizunakeikaku-com b-partners-xsrvjp saintegenevieve-org yamashiro-onsen-com xn--eckwb2en5f611vnxq34uzyntm0b3z9b-biz fukugo-jp xn--n8j0ao7f9a7304bz1zayk3ai7h-com ogikubo-i-com hino-comu-com surutan01-xsrvjp xn--u9jz52gfmk3iag51dizovw7adwx-net eigode5-com satonoria-com favori-tokyo-xsrvjp elieze-com basketballshop-legends-com onishi-housing-cojp xn--yckc0gk6h-com taiyok-cojp hiro-ok-org cpa-library-com xsample304-xsrvjp motherlip-net kosodate-saitamajp kawata-s-com yonehouse-jp syuluxnxn-xsrvjp movie-sign-com issinmaru-com after3-in tsukumo-biz kk-uchikoshi-jp ohimachi-net solare-hirao-com bookend-cojp uxf-xsrvjp j-acp-com xsample214-xsrvjp nikibichiryou-info art1922-xsrvjp spainbar-gracia-com yoppi-asmec-com menuetto-net gooddealing-com xsvx1020066-xsrvjp toukai-shaken-com hp-mail-org aliciaadamsalpaca-cojp neko-z-com mm-design-jp takuryu-jp getmoney-2swordstyle-com bellrin-com kbit-cojp kawaehonpo-jp xsample88-xsrvjp webstyle-xsrvjp konosoranohana-jp itamiakira-jp mushinashi-kaiteki-com nisinihon-info densiteikan-com sophora-xsrvjp lcc-sky-com inaka-pipe-net sodsugar-com ysai-xsrvjp tsuyakuguide-org ohashi-eye-jp xinfo557-xsrvjp yiizhu-com nichido-monthly-tokyo-net hotbook-biz studiokakita-com ecomohonyaku-net kuroda-studio-com xn--cckwcxetd-jpnet morise-kaigo-com tdg-okayama-xsrvjp gucciz03-com kobeco-xsrvjp livuhey-com auctionsite55-com kakogawa-matsuricon-com 1102k-com standup07-com eco-h-cojp bluefreeuk-com w-server-jp id-cmp-com takajin0524-xsrvjp kakushin-group-com dragoon75-com gasho-an-com designam-com yokoya-xsrvjp xinfo703-xsrvjp e-buy-cojp koukokai-jp matsumura-parts-com skytown-jp builderyoshi-com tenkokuart-com la-beaute-info gion-kyoto-net future-c-net-jp matsuiseijyo-com sonejapan-com snopiek-com aemk-orjp la-mariage-cojp louis777-com keih87-com y-motomachi-com innosence-xsrvjp bizcube-jp shumiplus-net hibinoiro-net design-symph-xsrvjp accettazione kawakamiya-com htwing-com 450k-net palca-jp ii-anbai-net violinjp-com dougaldrich-com llpbookend-cojp livre-jp lifeinnovation-jp kishiike-com xn--v6qz1w6gr96i6dfrk9a-com mentor0511-com junkbuyer-ipad-com xn--2-jeum8gra4a4456m88i-biz hirayama0925-xsrvjp hirokouren-kango-net taikou-kensetsu-com hatakawa-aijien-com curtain-semi-com tomomist-net kawaimagokoro-cl-net nippon-wine-com ishis-piecemontee-com kenbungaku-com kitano-sumai-jp notch-cojp guramu-net tensodo-xsrvjp air-upt-e-com excel-xsrvjp conferlist-jp xsvx1011070-xsrvjp ncp-acjp tmre-jp xsvx1014136-xsrvjp sinmiura-jp purple-dahlia-scene-com xsample231-xsrvjp unveil-xsrvjp 29014-info iwate-megabank-org friendear-net xn--u9jz52go0jr6al94bizovw7ajzq-net nksj-car-com tanuchan-in ihara-web-net moekoosawa-com japanpage-jp yutakakk-xsrvjp vegelife-kouso-info takatora-xsrvjp ia-project-mobi o-bikers-jp fly-solotravel-net hokkaido-partners-cojp takenogakkou-xsrvjp shirobei-com kumagayacon-com ishida-s-net xinfo734-xsrvjp xinfo348-xsrvjp ebizou-info xn--u9j8frbzkk62uxef9lo-com torijiman-cock-com xn--t8j4aa4nwj5byg4ih4e4eb6496q264d-com xn--czr78lt57a-jp atnworks-xsrvjp labayj-com japandental-cojp youvision-xsrvjp kokorozashi-jpncom health-support-japan-com yuto-nakagawa-com xn--w8j3k0bua1eyf0cz786bewa-com cinselhaz-com nara-con-com xn--fx-mg4avc2gyk-biz green-pocket-toshima-com as-job-com chapt-info market1-xsrvjp nats-planning-com kandkcollection-com chayamachiconh-com fa-style-com premiermember-jp sg110 dreamstage-info noto180-com superdice-net xsample126-xsrvjp tula-cojp bur-juman-com ip-agent-biz creative-h-cojp pw-wedding-com ryuuseinogotoku-trend-com shoukichi-org nishikawa-shika-jp rom-jsys-com skampermusic-com otopost-xsrvjp cpe-s-com wincul-cojp gluck-jp-net ikeikehiroshi-com clinicalart-atelier-nae-com japandental-xsrvjp popteen-jp xn--ecki1b5br0ae8iyd3due-jpnet kango-fair-com membersite-xsrvjp first8-xsrvjp cpa-toyohara-com dosakan-net ebisuconpa-com kiyox-com onoue-tatami-net a-zu-net shimokita-con-com izunet-jp ac6162-com plustest-xsrvjp wcd-xsrvjp design-pack-net m2k-xsrvjp hiroshima-cu-net wadai01-com 4ta9-com maido-navi-com hando-law-com mugenprtest-com naomicious-com otanjoubi-xsrvjp xinfo765-xsrvjp xinfo380-xsrvjp health-beauty-no1-com pt-algarve-com ypj-jp suzukisanfujinka-com with-music-net cnet105-xsrvjp bear007xp-xsrvjp easternstudiesdatabase-com kizna-club-com colkdesign-jp yscube-xsrvjp biz-abroad-net yuri-akitajp nyudani-net m884-com himono-hashidate-com xsample56-xsrvjp novum-jp ayumi-k-xsrvjp funabashicon-biz r93yu1130-com okiattend-com umeda-yasuhei-com xsample230-xsrvjp mailinfo1-xsrvjp 49764mominoki-net koreaichiba-jp affiliatecenter-net dogrun-navi-com xinfo525-xsrvjp clubking-xsrvjp unveil-cojp hirano-unyu-cojp u-801-com validate-js-com xsample157-xsrvjp nm-archiseeds-cojp totoka-jpncom d-fuctory-com g25krishna-info jimoez-com b-town-jp mocomocolife-com xn--n8jubz39q56dpy2a01gj60a-com tenpoukaku-jp si-himeji-cojp minamoya-info obatec-jp sharedsoft-com drcaco-jp bni-kinshachi-com cocoon-wave-com tenmabashi-yasu-com prenup-hiroshima-com elm-gakuen-com sonejapan-net xsample303-xsrvjp takezo-jack-com bihadadou-xsrvjp bonic-info mensato-xsrvjp dr-monroe-cojp tk-housing-jp kumamotoshi-shaken-com charis-arts-com xn--qcklm0bzd1dvkk82tdv9au53b-com gekiumawin-com kt-manage-xsrvjp olao-org xsample146-xsrvjp jp-harg-jp tujitaiga-info leo-house-com slackline-jp learning-with-me afi-hisyo-com valuation-cojp an-aim-com misyukudecon-com tmatoba-xsrvjp rouet-jp chinzao-com okitokuski-com kosuge-shimazono-com a-mue-cojp jqa sanpachi-cojp tachikawa-town-net mudage-asia bennpi-asia xsample87-xsrvjp niigata-tatami-jp fujihomes-xsrvjp tkrd-biz yamatsu-kk-cojp xsample110-xsrvjp syowasangyo-jp webelement-jp saori-mizuno-xsrvjp takayamaseika-cojp ctwpromotion-xsrvjp firstitpro-jp over-flow-net xinfo556-xsrvjp lopple-jp senkyo-goods-com codenight-com fours-cc jmp7-com torunkmr-xsrvjp e-hda-jp inforeport-jp saito-takao-com interplan-xsrvjp ryokan-kaikou-net mayumi-fukasawa-biz shimane-u-xsrvjp iris-scarlet-info sallp-xsrvjp xn--qckyd1cv50v-jp music-spark-com ishibashiblog-com synx-in netbisiness-saikou-biz sstechno-cojp damedamefx-com afs-net-com red-con-xsrvjp raimu-nagasaki-com toda-shaken-com koike1265-com shikitsu-net dai1cred-com esute-tv xinfo702-xsrvjp takaranoyume-xsrvjp kuushitsu99-com kogakusatei-otasuketai-net xsample334-xsrvjp kontown-jp easy-style-jp officebeans-net hiroakix10-xsrvjp bd-gs ssijp-net sevennananana-info tokuyama-rh-jp funabashi-xsrvjp pccqq-com iyashi-kotsubu-com granheart-jp pfolios-com tecjapan-biz tukkysedori-com clear-healing-info wakeyumeup-biz wtte-info saimuseiri-hotline-info jolijoli-jp nanbaconh-com kamikawa-xsrvjp dr-monroe-biz 330hm-niigata-cojp credoseitai-com doublesteal-xsrvjp smbanana-jp sakamotokogyo-com tyrant iris-accounting-com saitama-souma-shaken-com hyugaginou-com tenderlove-pcb-biz japantn-xsrvjp xsample229-xsrvjp miyukinoko-com shahzad sakai-yasu-com kaminaritei-cojp ikegaku-org yu-touch-com syoujiki-com eikeis-com kakeru-net 2ch-kakunou-com yodoyabashift-com tomochige-com xinfo159a-xsrvjp shoppingphone2-info enkadestar-xsrvjp overload-nejp gyouza-cojp viewland-jp the-xlive-com ishizo-com doghug-jp tamuranouen-jp xinfo733-xsrvjp xinfo347-xsrvjp clayblock-info techno-energy-jp xn--n8jl84alc9fsf5446c-com corepan-com freedrapery-com galpachi-tv mariage-space-com cocowa-store-com santam-jp touenji-jp pharmaco hellohello home5 ns301 z3 ns242 kakeibo curling webdisk.ls yubi ftp46 mwtest ssl0 zerr test-mobile mutsumi kibinago absinthe deeper brenna www.bellevue zelos space8 yaho xero ein sunshineboy chartreux srv51 bluewhale tida masai genso turnos kind rembrandt smilehome whim lifehacker residential weby www.repo msn04 wlsy intradoc dds112 www.peach ycbf8 himitsu vitoria suap results3 very twix detsad unit gubernator pereselenie tete ctmx kands gakushi takeru mahoroba www.funtime www.preschool preschool www.others www.preteen preteen highwind nambu gulf tott udin teaparty mh4 tkog maruzen kuruma tion neustadt devz nss1 www.okami snaps www.personals hijiri img.new soda globalwarming slit www.greencard suk tbox jtc kcj macca kyoka sinsa siso www.izumi stepup siho justhere vilya katsuno roya board2 rowo yamatai shaa fs32 pdesk tokidoki kawabata nodo2 nmk nodo6 nodo7 nodo8 nodo9 nodo10 nodo11 takanashi nodo13 nodo14 hks flt appmobile seah versailles angelle azurite bkc gudrun teamfortress2 aol2 craftcrazy kamal12 www.craftcrazy sant berthe sbbs sylvie softwareinfo www.softwareinfo buratino san3 zork sna www.69 print2 www.62 webfax rian www.58 www.57 www.54 www.03 www.01 qnet anita1 zakshop courierjournal gilgamesh upgrading irregular freeshare www.autocad vs11 berenson mazika soss thenewage darkrealm pray gamgam pote webdisk.learn us02 us03 www.desaparecidos guizza muscle ppc3 ppc2 prince93 accademia avco spxw jxzyk pipi juso jyxx valcea desaparecidos hawks animeclub piel orai oraa maw idi www1.n redis1.n db1.n oooo workers1.n dairen peoo bikers cfa rv1 phpinfo www.comune www.hosted princeofpersia icont www.was paky pala rcl chaoyang www.wolfpack www.nwa www.igs wardo testwap bello zhongshan huabei parus minzdrav yuncheng lanzhou ust waves xtreme2 minsport hangzhou nong kinomax minobr autenticador spamwall siping guilin autodiscover.property fpga shijiazhuang murf newpro pfj mumu ryanm mubi niza abtest obey ycopy pusatsukan www.publications bendahari ezra electrical sitedev mond node02 uweb1 pusatislam neti cil pusatkesihatan miqbal dwa fbdev productie cere keselamatan bids sibnet bumbum yoitsme mob1 shapley ioncube lure zim1 autoconfig.espanol mmm3 autodiscover.espanol webdisk.espanol www.deutsch luny pendaftar luco redac mjmj mso miru intsys autoconfig.stiri www.question phpmyadmin.test autodiscover.stiri mimp miky www.philos webdisk.stiri mx2-out autoconfig.s1 autodiscover.s1 nabi miga abramo lona kawaly www.2b dowcipy www.ping hiltonhead katalog2 imprezy pcn denim mela autodiscover.team downloadcenter autoconfig.team dzzw prenota olc ktkr telnet2 lfe conference2 topspin mamu malo magi krol crussell maed foods quill marron forexreviews www.imgs pitch steamboat kyoshin d02 aventail mbanking ssl21 webmail6 seattle2 ssbprod juna gdg gway autodiscover.edu laon lfa myservices buildbot www.usosweb www.mbp izzy kidz phpfox www.tokyo milionar miliardar uus joon jong ethiopia killroy kep2 yarrow mail.c publikacje uniba-gw tellmemore karb wapgame testowy hjxy ebook1 sjy irim flynet immi masterminds icar husi vms02 manawa mystere vms03 p03 monsite thorax huge mailwall jaun assalam automatic lavigne ip69 info-tech iax hoot pstutorials sanu travaux uyu iden testdir testmap autoconfig.dvd gumi autodiscover.dvd guma ibon hiya orderdesk dcg grip woori manten gpis abstest nsmail italie duitsland manner authorize manman gkgk wpdev data01 www.front neighbor inmemoriam otic hibiki expt fois mandoo mi5 xp1 s250 ovis was3 aweb cassettetape fairytales mmedia10 apd envi elle l226 infocomp aquario betavmadmin fhweb l007 l004 dorr images1e eerr advantage2 c119 c129 c249 ip11 a23 ny-site2 a35 a36 a37 a38 a39 a41 a42 a43 a44 a88 webdisk.2013 rahuls eazy mama11 gamesd www.wbg noscript byun cord como coil derf direktori pemilu2009 cobi toolserver quad2 bubi dask quad1 rbh proxie kph azzi hideout betavmadmin1 ciel axyz chie chee b54 chap idl b56 auna b58 bot1 bois b62 europe1 b64 beta-inventory1 tera01 awin b68 atto aszx ccem betavminventory b78 sp2digital lioness ch20 swh ch13 b87 b88 bion art2 aple b96 anen amam rmm1a ajun aeve www.arhiva rmm1e aeco acre acle tsubaki wonderboys aang abad mbs01 nml jdesign decoder rmmglx0 sasamoto aube saturday rmmglx1 d211 careerfit proba1 rmmglx2 onboard webcm pahan adminapi dpus rmm2u inventory2 upload2u looloo kesehatan hoja c77 demolink orson www-tst hellos c001 betavmad xenserver3 myvalentine mol distribute wildwild xenserver4 toytoy marrakech mahogany evil666 urmom d38 d52 mi-lvs1 d57 d58 d59 ny-site1 d62 d63 sliders d65 images1u d68 d69 d71 d72 d73 d74 d75 d76 d77 d78 d79 d81 d82 d83 d84 d85 d86 d87 d88 dpreports d94 d98 right-click moonwalker tumbleweed e14 cci4admin mbase pref cis2 creditosgratis pjocuri manchesterunited verus skydrive adam20 i18n images2u delhtca06 invetalcom e99 eurasia f15 delhtca05 emobile g18 delhtca03 ministry delhtca02 cm8testdigital h92 h93 h94 h95 h96 h97 h98 h99 j24 rmm1u k23 l11 upload1e a102 a103 a104 a105 a106 a111 northridge w28 ny-lvs1 m73 m70 pramod ny-lvs2 pradee zonedirector longtime www.mikail tvbox betavmad1 cci4ad upload1u b116 pa-lvs1 pa-lvs2 gamesplanet btest1 www.offtopic zolb mms.noscript yuli yugi thequeen www.evdenevenakliyat longtail mail.ucakbileti www.chivalry xyzx healer wrangler we2 papercup newsmail b150 operahouse www.turkforum jyoung www.west toon www.haxball highcolor b160 b162 b163 zary b190 www.highschoolmusical b240 c110 c111 c112 c113 c114 c115 c116 zis www.the-best c118 c120 c121 c122 singo c124 c125 c126 c127 c130 c157 mail.android c212 c213 c216 c241 c242 c243 c244 tokki c248 xtc pentagon wartime allfree f105 f106 f109 f112 paramount f168 yese wweb h102 h103 h104 h105 h106 h107 h108 h110 h112 h114 h115 honeydew h117 h118 h119 h121 h122 yeah takashi h125 yala macvpn maninder chaterbox www.ilahi h135 vyas uzu xela h138 fuentes parole www.eyebook partho wapi pathak onlinejob vish poweruser rs01 h151 wadi h153 deadline doktor tung vara h211 h212 vanu vani szyx h217 h218 h219 h222 f250 i123 i124 i125 i131 thecracker suffolk k139 testprojects a59 immo megumi syw b60 b70 servicemaster b90 tomm e104 greenish ambroise c90 luminous payday d70 d80 suju sukh turbo1 tb2 h109 meitan h124 stim www.badcompany tiwi paxton title starx pchelp reminiscence h220 a205 ssad paypol www.hifi sensations b159 ryuk spsp painel2 anchovy cometa chicha sory pazuzu spfm anonymous2 soga smps ns.img test.my omaker rongcheng chirashi creeper source2 xgeneration onurair ruma atyourservice adldap biznet fireheart thy jstreet skol lmy lnk ws05 ecredit sunexpress anadolujet borajet taky autoconfig.bm macherie webftp2 autodiscover.bm shut kkt webdisk.bm www.renaissance s1025 s1026 s1027 sidi kickass sid1 theagency rots s1028 s1011a s1011b teeth ini jee fq ext00 mydb jby coretest team5 romy s1032 shindou s1033 s1034 sens s1035 selo s1036 s1012a roan gse s1012b s737ipmi s1013a s1013b s4348ipmi s1014a skyofking hatred s1014b s101a s101b gks riya slime s4354ipmi s1015a sakr hag s102a evv sajt carlyle s1031 polyglot wfl s1016a saim s103a rbg uniq10 flowerpower s103b s1017a itsmine yoghurt tasak partyanimal beta2013 wmin stride mobile-device mortgageapp-pa documatix-slc propointslave documatix-den mail5.mail mail4.mail mail3.mail click1.mail mail2.mail mail7.mail myarticles mail1.mail mail6.mail s1017b k55 geovany s1102 ironport01 dhk s104a webdisk.123 boring scandal shock inton noproblem chachacha s1105 shiri skyblack 12345678 s1106 jworld rida gdz s1107 mandark ceylon s1108 websitehosting s1018a rere s1018b oneandonly sevgi s1112 webdisk.me rena melancholy soapbox feed2 s1113 seory s1114 pinata ws190 trickster ws203 ws195 ws199 ws200 ws194 sekai s1115 ws120 interlude ws179 momofuku ws183 ws184 ws185 ws186 ws187 ws188 ws189 s1116 ws193 ws196 ws197 ws198 rye ws180 clamav s1117 snl mytest1 s1118 s1019a hamham s1019b scoop scene s1122 s1123 s106a pop.test s106c vide s1127 s1128 sugar03 s1021a bmfresh s1021b pros rafi www.back furukawa s1132 mysql21 goodshop s1133 boiler radh s1135 s1136 storyteller hmaster youngjin manni s1138 choopa s1022a 8.ab1 pras freeid prag michelle2 fwp connectra s1022b moran3 ltm hollyweb aviram s207ipmi s108a poma continent s1023a 1.ab1 1.ab4 pogo iomega hitachino 2.ab4 ouma s1023b s1334ipmi osun pixe goodmail 3.ab1 videoz qais bidon pips webdisk.pro associates micro6 micro5 micro4 micro3 shirka s1024a w00w w00t s1024b opic s111a s902a pero s1025a s1025b s112a s112b s1026a s1026b s213ipmi s113a s113b paps s1027a flex3 flex2 okay s1027b upw paki rab scamper lazare s114a s114b s114c tusa trinity2 lea1 bkmain masquerade netwise doron 31337 mss2 parkiet s1028a twyla cotopaxi pc158 puchi anir sonny2 nomen mylab rzadmin s115a nosa s115b s-gcclientadmin eaglegatefa mmconline s-gcglobaladmin americansentinel globalview s-gcwebserver neci globalcampus reportservices s-gcwebservice pophost s115c cosc nomi stripe bbsm nnnn s1029a s1223 s116a s116b survival hazmat www.hrd builder.login sunmail fabrica ranga withlove www.hazmat navigare mums stefanie s116c www.livezilla epbx muni dobbie rabin muko bkp3 muki store8 muka fcs2 s1031a emptiness painel3 bdirect acri portaledu5 s1031b dnsnowy msky planete s117a s117b s1236 s1237 s1238 s1240 s1032b datenbank s1242 www.belka ps137 ps136 www.grc suffix goaway s1243 popol goodgame s118a s118b moti mosh mssql10 bloomberg s1033a free24 s1033b campusnet s120a atlas1b netz atlas2b lqfb tase out33 s119b blumen passive tw1 moju seasonsgreetings2012 secureportal s4111ipmi mohd ostar treasure beautifulgirls s1034a s1034b hortus vendorportal blooming s121a s121b neek maringa s1035a mail1-uk s1035b s122a lsn kfq boz s122b withyou s1323ipmi layback kvm2-1 kvm2-2 kvm2-3 liya mfp napo nang perfection jnj sk01 applepie s123a s1test www.010 s123b www.kf synchron test12345678 www.pv www.sw www.sz t168 pennylane www.xz s1351ipmi optimal www.yx www.yy www.zx webdisk.jd sunglass appellini hanjie databassano s1037b s1302 sitetest www.gk lavish s1303 hjys s1304 s1305 weld loth loni s1306 opus2 opus1 www.66 0701 tissue 0912 s1307 www.xj s1308 www.shy www.zang zang s1038a ciaociao animecity ollie embrace wmsaiglive keypartner s1311 meko s1312 s1313 kusu s1314 redribbon trickstar soundwave s1315 director2 sdev font med1 perido s1316 twdvd mail.vul blackswan mail.3d-sex-and-zen mail.pornhub 6k pornhub xvdieo router01 4399 s1317 s1318 kudy mail.4399 mail.xh mail.bbs-tw mail.ben10 instagram mail.twdvd mawi mail.xveedeo noway s1039a mail.fungo s1039b disscuss4u 666pic mail.666pic 3d-sex-and-zen contabil mail.01 poki 999av s1322 636 s1323 mail.ff s126a mail.qk s1325 mail.thisav mail.tube mail.xvideos edulis toyworld discuss4u foodie lanice santateresa mail.xvdieo wagdy graylady mail.6k mail.u6 thisav kkclub mail.kkclub bbs-tw blackpink mail.ut mail.zgame mail.999av xveedeo mail.tt1069 greengreen mail.disscuss4u andantino mail.sex169 mail.discuss4u s1326 mail.redtube s1327 hdcctv arecont iqeyeedge1 opssecurity iqeye vivotek zseries americandynamics stardot codero sserieslite s-series-demo evapi axisedge4 axisedge3 axisedge2 axisedge1 evwebtest exacqsecurity adtrac fourboard sanyo iqeyeedge2 kermit30 cesars laurac s1328 s1329 hilltop test77 s1331 montblanc s1332 betaforum newskin breaker gso s1333 nismo mahi s127a s1335 clayworks queserasera bluejam gna teardrops jurist s1336 pillars nicki wimax s1337 pallet s1338 koon mailbak s1339 geopia touhoku dazzling golfclub newsa rbldns wsdy selection fukfuk zeropage nella blackhand s1341 abaris s1342 s128a simak kaimin gender s128b s1346 minero lusty michelangelo s1347 aconite creativeweb s1348 phone7 disabled tent s1350 leng s1351 s1352 naver nagara trams fogbugz mixed namoo slxsync qa.congressional isbnws test.pubeasy testbed1.congressional mpe-web nebula-dc4 imageweb beta.bows s1353 marimari testbed2.congressional beta.isbnws mydiary pubtrack syndetics securenfuse olbers prediction leka seventeen s129a takenaka sunsoft mailorder amedia serverreg s129b olink neogene ldapprod dr-vpn learntest admin111 student-dev worldpeace s1356 auth-dev shine99 cloudcity s1357 s1358 lotte aixin itedu ebl s1359 bberry s1361 s1362 infoblox mbs2 starlet neuf thefly monello phantasma moji s1363 shimoda www.rw s1364 s1365 s1366 s1367 s1368 yacy pdu-a1-1 apmail pdu-a1-2 thebox jportal muttley s1372 backroom autoconfig.au mutant blauer s1373 s1374 duckduck maid s1375 breed cvsup s132c meetu haitham s1362ipmi bgw yorokobi lumi s133a www.mil ecohouse kwang lame webdisk.origin div bridgit martinique norisuke mislab ysl behavior mpx webhost4 vagues s133b yks yhk asdfas hal9000 thinkagain nari parkman wmi xax carmel store3 store4 store5 wad hone tyc basestation uhc resource1 um2 tob hoco tmh sfd hkit spz solitaire zed tgw s133f wins02 s1391 attis s1392 neuronet googoo s1395 cas6 dill hypnotherapy lisp s1408 directmail costume rook s1399 jord jsbach s1411 mbook maybe joyfull w0w pok sudhi s1412 own otf paraiba www.norilsk dmitry pjm dinc pel allergy calec noo myb juiced ds2012 atama chun wakako vanquish bucuresti nmm bw1 webdreams odi ode nkc no9 psnext keno topaze wiser nn2 mnj nee luv mmd myfreedom dlinks mjh frogger naruho kus maruo smtp03-out liv kow ansy farmhouse merami joce keka aff1 ker joh kdw nozawa hisashi nagios01 hyp krolik hyj funakoshi ine hsj pinkpearl jai auth02 auth03 marvin2 iie pitcrew iez sunray3 manara gwmobile iaa webreporter kronus moose s1367ipmi s1432 dc1.ad s137b miv ms0 her hdw hek hdp gnf linebreak hdk happytrading tasuke huckle cisco8 autodiscover.whmcs s1437 hci autoconfig.status n26 s1438 n21 hai autodiscover.maps bakchos s1439 autodiscover.status autoconfig.whmcs manja autoconfig.maps webdisk.maps ynb duvar cvport s1441 rjh icache2 misite www.sevastopol s1442 s1443 s138a bebeto dbserv s138b astore kshop open2 24x7 exe eur bdw s138c project5 bf8 epl s1448 s1449 nextworld fam renovatio csh mrgreen newgen s1451 kbot soest ayo kaza angelstar autodiscover.youtube autoconfig.youtube domen transhelp s1452 s1453 www.uv s140a specialevents www.correio lls pocas s139b vhost6 s1456 blg s1457 twcprod tdgdev dragun h2s keriomail gridjoyweb1 sshstaging ohsuf sshprod promoaid ablogs aot seoplink karm webact s1458 s1459 aee s1461 spaceship s1463 worldgames s141a oaweb s141b d90 fineday rabbitman s1468 bo2 pdu-a2-1 seong samhan gingko gayline pdu-a2-2 lethe benzaiten kano azmoodehcomplex lefty s1107ipmi leeco narciso jitu lovesick snowflowers test00 kako webtop bmaster s142b kahn judai isha s1101 www.worldgames arashi kadi s1478 s1479 magrathea s1481 jial s1482 s1483 suva tta3 cadiz onc sibiu www.amsterdam jshop zmta stanford wlan-gw s143a icecube s143b hampshire td01 www.reservations tondu s1480b s806b s144a tarragona kimek topanga jbh ducati nsj webhouse iphone4s maputo s144b s1104 izmir leefamily s527ipmi cranberry cworks larisa services1 webdisk.sklep sakura39 tenten tenshi khaki s746 wr1 wl3 aitken showroom3 switch7 dallas2 midge homburg happymondays albarr associate patz scotte stas mattk aar s427ipmi pro1 s1113ipmi psv mailvip lyncpool01 s4315b kiki.ads ns-test external1 dh10 pubtest webfarm s4144ipmi s1110 autodiscover.mob s630a autoconfig.mob frauen s1111 www.frauen www.52 www.63 mersey bfl ilja jays s533ipmi pleione beta-www s642ipmi galinka s1328ipmi s1118ipmi moneysaver s1474 vsphere1 webct1 mailer6 steen clinical cimarron touchnet ikki worth grenada rayleigh malthus s4149ipmi s622ipmi s153a casweb s814ipmi vpn-inside osteo dts2 cwserver chambers s4316b misentry s1029 hildebrand kcn belloc s1390ipmi s1124ipmi s156a s156b www.kokomo shopping2 www.megami xpert redm adportal s1013ipmi illuminate s4142a consulthts vmview pakwest pakwestx s1124 consulthtsx wlzx blog-en s819ipmi s1471ipmi iheb gjzx s1126 wserv s913 s4317a mailhub3 mailhub4 s1405ipmi s50a s1129ipmi s729a s4161ipmi s1131 s825ipmi s163a s163b s195 dev.media secure12 secure02 passport1 icrm strato immo1 mysecure cloudsupport rust tease eliana host-2 recruiters arquitetura s4330a s1209a pop-gw ocsinventory-ng babi s1209b s1411ipmi ircd suckhoe s4270ipmi s1135ipmi internalcrm s4130b vps2.serverel.com sanit s4166ipmi s831ipmi webrep s4318b aow lyncadmin s4333ipmi s1140 swu dev200 s1416ipmi iees calamari s4230ipmi s4220a s708ipmi s4172ipmi sold webweb s834ipmi s734a eftp barbi johnjohn hellgate server-8 bittern server-6 avocet server-5 server-4 miyakawa webforum easytrack adnet2 kgn s836ipmi tfh pma3 s285ipmi faleconosco weegee tdp mailgw02 baltimoredc s934ipmi shukatsu camil ftp.p hscm www.outdoors s173a s173b autodiscover.invest webdisk.invest autoconfig.invest rangoon oai danielw s1422ipmi s4320b www.comps maigret ras06 s320a wpmu node21 vshield netapp01 ras05 iradio citrix02 ras01 ras02 hastur synology s801 siw s4179ipmi s4177ipmi lindsey tabs www.dog s175a www.igri lasvegas.dev pauling agent1 s175b giskard s842ipmi s176a advs yingjie img.blog s176b sage3 thor2 san01 s301ipmi footprints01 grot s1101a hind s1101b jbbs s1369 s320b gepetto thalamus athens.dev phoenix.dev rivka test43 s1102a test45 s167ipmi test50 s4132b yttrium k02 quaoar cyclades education2 s1401a s1103a saucer s4183ipmi dev07 cross-reference dcdctest usso mehqnotes4 s1391b ussotest test-psearch glomis protector2 s1104a mehqnotes1 mehqnotes2 glomis-rep imsrv1 smartbomtest mobile2.dev hqmailsrv1 cross-reference2 muratavoip smartbom quotetest ocenter mesjnotes1 dcdc s1105a campanhas s1105b s920 galaxy1 s4365ipmi sm153 thestudio man01 s1106a osirix s1106b ivanhoe s1107a snarf osmium okane s4188ipmi kazunori www.americanstudies cybercrime sound2 sound5 s1018ipmi sound6 sound7 sound8 soundx s1108a s185a sound10 soury s1402a testtest1 cidep farfalla piata margus www.tfb tfb donbot boxy tinnytim crushinator coilette mail-p source1 source3 motis vdt backup04 www.loadtest iexternaldb korund soscenter oweb monkey12 services.dev s1110a nei s312ipmi snip cisco4-2 njn s186a daa3 s186b s186c carolan s1111a midias lcp4 lcp3 s303ipmi lcp2 s1438ipmi nancy1 grapes2 s1112a portmaster vally pdu9 jtb drteeth s822 intmed duckie ket s4204ipmi infra11 s1113a portier synaps boadicea infra10 s1470ipmi lodging s190a s190b hoian s1114a s317ipmi vinno s1115a s620a mailadm hospitalists bhsftp physicianupdates s1444ipmi extmail1 physicianupdate a380 cenp epicproxy extmail2 bpa2 quarantine51 mdportal towerpacs ellen2 ssstage residency veena webdisk.devel g-star do1 maccer mstock motech read2 flyspray nicolash mackie cjp s202a lscs s1393a s1116a blazar medgen2 notepc yorozu santoku topkapi dialin13 cc5 dialin14 negima kasturi dialin15 dialin16 dialin17 dialin18 casiopea dialin19 dialin21 dialin22 dialin23 dialin24 dialin25 dialin27 dialin28 dialin32 dialin34 dialin37 s1393b nugo vmwww cappella auva lcp1 nabiki shadok s4209ipmi ecommerce1 s830 s1117a s204a parc idmap s1429ipmi partner-test s1118a bulk2 s323ipmi s205a debs1 s1120a s1120b mobileqa1 dialin20 dialin30 dialin31 420 z8 ciscolab s1449ipmi dialin35 dialin36 dialin38 s206b dialin40 helo dialin41 dialin42 fogo s1121a ftir bedford purifier s1121b s207a s207b flights euclides old-blog conf2013 s1122a fiber diffy s1122b dreamline s208a pushpin s1394a eames s1123a krab s1123b s1394b mwanza luno feline s209a paytest s210c s842b prod01 s1124a s1124b s4110a s211a pc05 pc06 eeepc retoure www.kunde s1455ipmi www.intern s1125a lectures s1125b gutscheine s842 s1126a s1126b purl dom11 sbin svn5 newbeta s213b smtp153 rood 206.182.105.184.mtx.apn-outbound malindi s1127a s1127b smtp180 184.182.105.184.mtx.pascal tira ns-svwh smtp160 189.182.105.184.mtx.pascal bartel s609ipmi geochron eu-ns outscan-200 outscan-202 mailspike outscan-201 outscan 201.182.105.184.mtx.outscan outscan-231 outscan-232 outscan-233 outscan-230 outscan-235 outscan-237 outscan-238 outscan-239 hostkarma-eu 204.182.105.184.mtx.outscan s214a smtp174 s334ipmi outscan-real 205.182.105.184.mtx.apn-outbound smtp177 spamstore appletree-outbound smtp129 smtp131 s1340ipmi smtp133 smtp134 smtp135 smtp136 smtp137 retry2 smtp139 smtp141 s1128a smtp143 smtp144 smtp145 smtp146 smtp147 zamowienia smtp149 209.182.105.184.mtx.apn-outbound smtp152 smtp154 smtp155 smtp156 smtp157 smtp158 smtp159 smtp161 smtp162 s1128b smtp163 smtp164 smtp165 smtp166 smtp167 smtp168 smtp169 smtp171 smtp172 smtp173 s215a smtp175 smtp176 jef-admin smtp178 smtp179 smtp181 smtp182 digiweb-outbound smtp184 smtp185 smtp186 s1405a generals smtp189 smtp188 smtp190 ob-230 ob-232 ob-233 ob-234 ob-235 s1461ipmi ob-236 ob-237 ob-238 apn-outbound ns-prgmr hostingsource 185.182.105.184.mtx.pascal mailspike2 182.182.105.184.mtx.pascal smtp183 ns-t3n 3a s1130b bpel 200.182.105.184.mtx.outscan outscan-236 203.182.105.184.mtx.outscan s1395b 208.182.105.184.mtx.apn-outbound s216a ob-231 180.182.105.184.mtx.pascal apn-outbound-205 apn-outbound-206 apn-outbound-207 apn-outbound-208 apn-outbound-209 183.182.105.184.mtx.pascal mailview ob-239 segan 188.182.105.184.mtx.pascal smtp187 nick1 nick3 187.182.105.184.mtx.pascal neonova-outbound t3n outscan-backup smtp130 spamd0 s4226ipmi smtp151 207.182.105.184.mtx.apn-outbound rbl0 rbl3 rbl4 rbl5 rbl6 rbl7 rbl8 rbl9 181.182.105.184.mtx.pascal s1131a ubuntulinux outscan-234 202.182.105.184.mtx.outscan smtp138 186.182.105.184.mtx.pascal sugar01 outscan-203 outscan-204 sugar02 bobdylan kyy hostingsource-195 hostingsource-196 hostingsource-197 hostingsource-198 duran s1131b dummy3 dummy4 www.robbie smtp191 masscheck s217a smtp150 makeweb s217b www.ozzy www.biblioteka ddns3 www.beatles stones gino www.abba gdns1 gdns2 cgi01 belgia s1132b www.ledzeppelin s615ipmi www.rem s218a s218b s339ipmi celinedion dialup3 newsold gigs www.s12 thedoors www.bonjovi www.britney presley ayame azuma s1133a s1133b roselle s1133c aerosmith databank selab ledzeppelin ac-dc s219a ap10 www.tori s1466ipmi shamash www.celinedion s1134a stpexch hadoop01 hadoop02 hadoop03 s1134b koji trui s1134c s221a spirits gw-test wyvern www.middleeast s221b www.mum wayf s221d s4232ipmi incarose www.yss jobstest safehaven s1135a subscription www.dobre cmssandbox dobre tdh s1135b #pop3 video10 video11 xchange1 ftp.wap s222a base10 base14 base13 base11 base09 base08 freshman base07 arthistory base06 gwh itcnet fotobuch alid webdisk.host3 www.cruise csharp 4a ftpwork relaunch2 single furien transporter s1406a ifi pilkada hoaipk nabeel hadish www.mos apunts latihan www.paypal www.host3 gitit www.christine s4127ipmi kunduz dns178 renderer s1136a alexpc carioca dns114 dns112 dns111 colo2 seotool subasta www.train kaolin dns105 dns104 s1136b www.pisa abt dns103 dns102 erikm gtr repeater zys ega cyh s1396b t1ns karine cbh kennethv s223a licserv1 f50 ntop s223b roberta flits iwm ksn communicationsftp kzr www.arif www.basic sites2 s224a nur venpur s4331ipmi ever4 lachesis gjacll eddspermits thietke wba cjis-dr cjis-webdev s1472ipmi iskender tulipa s1030a genix ejury s1138b veliyayla www.journey geezer musab www.walker pdinfo-new metal123 stmichel www.she s1206ipmi www.chatchat www.bugtrack labelle postdoctor shorouk s225a pecora www.surajit sanjesh eddsplanreviewdev qlvb minhhoang www.badminton dwrarcgis ourlove www.seminar s225b jcats www.cihan www.rental s1140a s1140b www.asptest phimviet xfire market24 essits www.kolaypara debs2 gwinnettftp sanitationftp saeid eddspermitsdev sadeh sacom charlot zag www.programci employeeaccess s226d pdinfo operator1 uperform www.cosmo ticaret gcecc merkez s902ipmi abbasi s748ipmi onshop biodata www.giaitriviet www.lazaro website1 cjis indigentdefense wif s626ipmi computerfreaks www.webapp www.pharma s1224 s1225 rith s1407a www.filmclub shel meloen silver2 bhavik s931 s1209ipmi eddsplanreview sadegh s1407b fruits boudoir www.bon www.cso biofuel artemis2 zatopek provid daingean framboise cortez gabbro www.babacan kayseri monkey11 mohpc dev-m twitch s1212ipmi filler www.tpc www.salimi www.ttt www.addons hooba eponline testowe s230a kevindm portobello www.sample s230b wowza1 s4243ipmi promedia patrickb empower trunghieu veolia webpanel salaam eskimo www.lojavirtual snappy moller quiksilver cengiz www.yusuf nhacpro thanhvn palmon www.mymoney www.tiny www.artgallery przepisy www.haber s907ipmi averhuls tempdemo thesis1 www.1234 s510a charisma pcounter www.yellowpages s233a s1219a www.hasan www.automoto s1483ipmi www.election goldmane cografya mark109 s1217ipmi lede fractal boreas wrzuta s234b hulshout simay ieper brecht hutech s720ipmi go4 www.teksty www.egysoft salessupport rims stinky s4248ipmi micron haylaz www.dostlarfm www.healthy s235a thaian thong pot s235b tale mdbs diederik prevail nas6 hdgh server79 www.experimental server68 tvg waw www.furkan ikbox www.info1 net02 server65 star6 s510b xss s913ipmi vdh gays sufi toofan s1440a hieumu server54 s237a hqfw amigos4ever furkan www.jimbo www.restoran server36 akhil www.astrology www.pdfs pishro s237b pond1 nas7 s1032a www.earthquake justnews www.gara websolution s238a utf8 www.citrix beos s1223ipmi ingilizce www.daemon s1241 s1120ipmi bijay homewiki motif s4254ipmi maciek bluey gmusic s239a scenic s240b thunghiem www.iranit www.daugia s934 tantale www.800 s241a s241b winterfell seyhan fluor rimsky amid topol berg aosa ara3 sk2 boro teszt3 www.malik azin iranit buty companies www.marta s241c lunca ns2.cloud dimi wiera www.gomobile dev.my ns1.cloud vario s1345ipmi s242a s1410a quickplace spaniel wikidev eisk fox5 quasimodo tatara japo infohub s1410b s243a thanhtrung mahesh fizi www.fathi s1228ipmi www.sendsms marcio extranet-dev nissim miramar ebdaa yehia s4330b s4259ipmi s901 www.okyanus www.asso neel www.azad itcyber creativesoft bestanden www.buty ophrys s630ipmi www.bahonar berkeley s924ipmi mad-dog www.egov www.clearwater slon ower www.enes cent www.hh www.qd www.etis amozesh packard auburn saud s206a s4222a sgfs s1222a sika mitra huseyin wpg www.japo etab picsgall1 poldi southside s119a s1234ipmi www.joko s120b www.nab s4265ipmi coolfish www.myhost gadi horiba www.knightonlineworld wscr www.mira www.spartan galls777 www.myapp dzup gargantua www.omid s1029ipmi s908 www.workspace notos www.oyun s810a s910 www.pages shalin sevdagul forestpark maihama www.soap www.brisbane justtest brin sitest anhtung component postadmin s407a chakwal carson s1240ipmi s253a s253b leith www.aksehir s4271ipmi s528ipmi www.hme fblogin s4143a s935ipmi www.intermed www.apollo s255a cisco5-1 www.seattle s118ipmi www.plesk supplement medford www.frederick melike www.tampa mahmoudi carp1 testme kolaypara www.peterborough seguimiento conroe truongpro www.tpl filo estat s331b evanston stgeorge realmadrid4ever coventry giaitriviet nokiazone www.prism www.pibid www.yas telemed hoangdinh leading brampton s1412b www.sanjesh brookvale bentre alisveris canton s256a s256b habesha sarasota braintree s919 www.newcity vandai s921 clovis www.easymetin2 s258a studentinfo www.centurion www.rohit chantilly s258b s941ipmi facebbook richmondhill isams www.shree www.noavaran dover www.site2 softline www.tales bestwishes chatham marietta mehmetali www.sohbet s260a chemgio prakash avanish egitimci s260b s823z 1964 s4178b cf3 santarosa compsci s240ipmi s420ipmi s224ipmi arlington s262a s262b bayside serv6 s941 linuxsrv hillview stpetersburg s930 humanities wifi-portal s1450b kimbo s264a www.clinton cxy s1391ipmi hermitage artarmon zikao s405ipmi autodiscover.ru s1036a gold.chem stowarzyszenie wwwssl kumu s130ipmi smtp00 framework s265a www.epscor uhsp s265b s1036b s265d teax s942 www.shelby pftest s4260a edytor astro11 frameworks debata s266a meadows logistyka cms-dev futuresite bak184 s1420a ex4200-1 ex4200-2 futuretech ihs vika simferopol s610 petruk s4240ipmi sudak modtools vcs2 stargate2 vcs1 www.prashant buriram s134a phichit s411ipmi proxy29 s409ipmi bima s270a webdisk.pagerank s270b s940 s312b s1102ipmi sdb1 www.fortuna www.astrakhan merchandise autodiscover.pagerank autodiscover.offer autoconfig.offer www.hebrew olimpic s271a autoconfig.pagerank s271b s1037a seomedia origin-image testcss platinum1 www.podolsk blogstaging www.rybinsk s4303ipmi mysql.web test.intranet solman s1305b s272a oskol www.nova mail.mailtest webmx s272b s1301 tripoli navy kerokero host98 s501b mtx s134b s1040a misfits s416ipmi s141ipmi designpark ie6 siakad gozinesh s1226b www.aig hed cepe cloud8 eci btt partner.test s124a scorpion2 s102393ipmi scorpion1 s1002ipmi mirada s4308ipmi s276a s276b medialib s4116ipmi stangel www.maharashtra karnataka s1201a inpac quant maharashtra s1201b s4112a entrepreneurship virage autoconfig.money webdisk.money gc2006 s603ipmi autodiscover.money s1202a malayalam webdisk.songs autoconfig.songs autodiscover.songs tinymce s1202b s278a autodiscover.egypt nzz s278b wdm083 webdisk.japan s1038b s1203a smalls autoconfig.japan s1203b dhcp-1 autodiscover.japan cr2 jette webdisk.egypt hbi s1007ipmi autoconfig.egypt s1204a wwwdr gwtest nim mail.alumni s1204b sw14-1 direct1 gwmta2 testzone physlab amms mail.student pascasarjana forumsdev s4314ipmi mini3 s1205a s1205b immanuel inkubator huey ttu262114 s703ipmi brk service7 mmt s1206a cnap starfleet s1206b s1416b stations mcp2 ou flix s1207a m.account s1207b s1208a tctest webg emir zblog latam hdb s1208b otd antena3 wapuk wapus hendri s285a megafon2 ttu275560 s285b s1321 frequency s1210a radius7 s1210b sepa antero tj3 logindev rapor tmp2 s4360ipmi s1228a www.ja autoconfig.nl lowcost lov deca s1211a restorani s1211b wingspan s433ipmi webdisk.nl autodiscover.nl s1409 luna2 proaction s287b www.freeads s1324 s1212a skatt eproxy s1212b www.atendimento zerg cheqa jaci musicvideos projectserver infierno s288a 206 s288b s1213a kpg gelendjik autoconfig.ca autodiscover.ca webdisk.ca 147 s1213b s731ipmi sinau p21 158 s4325ipmi 174 179 181 garagestore 183 184 s1214a box29 nd209 aither pythia 194 ts-cat4900-gw vm004 s1214b reservoir s301a s1340a s1215a web-forward ksj zwierzaki narty www.narty http7-00 beta.preprod wdb7 test-equinix nocache.promo hb03-preprodwwwphp01 http6 http7 http8 http9 http3-00 rueduco20 wdb5 devphp1 http1-00 hb06-smtp01 cdn.preprod http10 http11 http12 http13 wdb7-00 wdb7-10 nocache.ressources http13-00 ssl.preprod hb05-smtp01 test-iliad hb01-smtp01 hb01-smtp02 wdb5-00 wdb5-10 http9-00 http11-00 http11-01 eptica.preprod khk www.0001 provide s1215b appointments kef skh brandcentre s1406ipmi ucv lins s438ipmi relaydump relaybackup s163ipmi harveys partsweb www.reminder www.contador metcalfes nt3 s1216a s1216b nt2 s303a devgit s303b s1229a tula1 star-sat nana123 s1290ipmi daru s1217a sinitsa s1217b s1024ipmi antarctica websys rmsdemo tmpftp clickheat mobiel devtools smarthealth zerno afina mail.strela mail.med vehicle s1229b diadema agent-test wapadmin analyse s304b www.szg xia cssource s218ipmi s1340b summercamp webmail.s s1218a mysql28 ftp.s s1218b s4149b inoue s305a s305b teacher1 vr1 timisoara constanta wg11 sikora s1220a ns4-3 s1220b hp3000 eserver s719ipmi wg3 wg5 ssbdev wg6 unta wg7 spyro2 manage-vps mailrescue shopftp s306a relay100 box5vm2 serval druid veranda mailhosting paid mg80 fakel wssl skip box5vm4 enews2 s1356ipmi arama this mail.love whserver evgenia wwwp vilena box10 jastreb worldvision s516ipmi snms shox s1221a nd187 ftp.black mandela biashara nd200 sail notary betterlife healthyliving auhans2 dxbans2 auhans1 dxbans1 nd191 puls www1a www2a www3a ftp.god nd192 tatjana klv gcms.qatools cms.qatools wwapp.qatools2 gcmsadmin.qatools preview.qatools ww30.psqa wwapp.qatools cms.qatools2 nd203 web1702 s1221b web912 web914 web915 web916 web917 web918 web920 web921 web922 web923 web924 web925 web926 nd196 web930 web931 nd208 web932 web933 web934 web935 web936 web937 web938 web940 web941 web942 web943 web945 web946 web947 web948 web950 web951 web952 web1239 web954 web955 web957 web958 web960 web961 web962 web963 web964 web333 web967 web968 web970 web971 web972 web973 web974 web975 web976 web977 test6359 web980 web981 web982 web983 web984 web985 web986 web987 web988 web991 web992 web993 web994 web995 web996 nd210 web997 vm003 web1249 web1253 web913 nuni web1259 chas dobro web919 pani nd212 web1266 web338 web1269 web1699 factor web927 web1273 web929 web340 web1280 web1286 web1288 web944 web1290 web1291 web1293 web1294 web949 web1295 web1296 web1297 web953 web1298 web1299 nd214 web956 web959 web346 web965 web966 web1323 nd215 web969 nd216 web1330 web979 cbia web1339 gud web990 web1349 web353 web998 web999 alga web1359 web1370 nd190 web1379 web360 web1389 web1391 web1393 web1394 web1405 web1406 web1397 web1398 web1410 web1428 nd204 web1430 nado test6394 mija s307a web1440 s1305ipmi web1449 s1222b mail.black test6399 mail.happy waterford krim naira behealth lagu fortunate feelgood web1530 nake s1030ipmi s308a web386 web1539 kedr s4336ipmi dudi duch web1549 lavinia businesshouse web390 web1560 web391 web1565 s139ipmi sv374 ifly rados web1569 web1572 svetlana web394 web1578 web1579 ourlife millioner web395 web549 web1585 s1223a web406 web1589 web1591 web1592 web1603 galo web1594 web397 s1223b web1595 web1596 web1597 web1608 gain web1599 web398 gago mail.total web410 web1620 woz greenpower s309a web1628 web1630 s310b s932ipmi web1639 s1224a wmp2 web416 web1650 www.eep eep narek web1660 s1224b web419 web1669 brzeg mail.piter web1679 s725ipmi web423 s311a s311b web1688 web1689 web1701 web539 s1344 web1693 web1694 web1705 web1696 web1697 alya web1698 web1709 wellnesslife s1225a bady web1719 s1225b s1345 dorian web1730 sapfir s312a web1740 stroke mail.ural makarova web1749 s1419a position merri web436 fbcc allworld welly serp ws03dev000 s620 web439 kostanay lvis muslima web1819 s1226a web219 game24 wita web1849 mail.vip ftp.freedom s1311ipmi zas s1420b web456 s1410ipmi kulik web1828 curs-valutar use web1829 s1035ipmi web459 masini rvp test6489 s313b laif web2023 web1924 web2025 web1926 web1927 powerstation web1928 web2030 qaz plg web1931 web2032 web1933 mail.god web1934 web1935 s4342ipmi web1936 web1937 web2038 ltd web2039 web1941 web1839 web1943 web1944 s1227a web2045 s1227b web470 web1946 web1947 web1948 s4122ipmi www.feminin s314a margo web1958 test6498 web1959 s314b wellcom web473 web1964 web1965 giv suplementy s601ipmi web1969 s1349 web475 akt web1978 web476 web1979 vipstar bao s1228b gradina vilma web1990 s315a s1230a lidya web479 greenway web2616 www.poze web2115 s1230b ftp.sakura ftp.deal web483 fady ejay soli web2128 www.curs-valutar web2129 best1 rodnik s316a web2139 www.dictionar taishin vella viktorija web1858 aniya web2149 web488 zdorovje s316b ter web2160 web491 www.i1 kakimoto beautylife s4347ipmi web492 s1231a virt1 web2169 web493 healthlibrary katrin s1231b web494 s1316ipmi web495 ehms web1866 shoppingcart web2188 web506 web2190 s317a web2191 web2619 web2193 web2194 milena web497 elizaveta web2195 error2 web2196 zs1 web2197 smjy web2198 www.sbe web2209 web498 s317b syl artikel aliga s1354 s1232a web509 s1232b s1355 plain jabber2 testcp lavie web1873 s318a web2229 gavan ree naso web2239 s1421a test6292 healthandbeauty narayana s1233a sasc eger web2249 dood receitas web2251 egel web2258 web2259 web2265 web520 beleza holger web2269 s1233b s319a web2278 web2279 web2285 va1-middev01 web2288 web2300 web2291 web2293 web525 web2294 web2295 web1886 web2296 web2297 web2308 web526 web2309 bcrtfl1-inqa01 stngva1-dc01 web1888 web1900 stngva1-an01 web529 web1901 web2328 web2329 web1902 dev03-web web1903 web2339 web533 web1904 qa02-web idsfeed web2348 web2349 web1905 remedy1-21 ar-dev web1906 bcrtfl1-arsbx02 bcrtfl1-arsbx01 web1907 abtools stngva1-ar07 stngva1-ar06 web1908 stngva1-ar05 stngva1-ar04 stngva1-ar03 stngva1-ar02 web540 bcrtfl1-wdev02 web1911 bcrtfl1-wdev01 web1912 bcrtfl1-rqa01 web1913 web223 ar-qa web1914 web378 web1915 web2890 bcrtfl1-arqa02 web2016 bcrtfl1-arqa01 web546 nccqa1 ids09 web1917 api_portal_dev web1918 web1889 devrvip web2430 bcrtfl1-indev01 web2019 webp1 web550 stngva1-web02 web2437 web1921 stngva1-web01 web2439 ar-prod web1922 web2445 fisheyedev stngva1-dc03 web1923 web2449 bcrtfl1-ardev02 web2458 web1925 bcrtfl1-ardev01 api_web_dev web2469 comvault api-web-dev web2479 web2029 web2483 stngva1-rkm02 virtual-vr web2500 web2491 web2492 web2493 web1932 web2494 web2495 web2496 web2497 web2498 web2509 web1899 web2528 web2529 stngva1-wqa01 vbi1 web1938 web2539 web1940 stngva1-rkm01 stngva1-in01 web2549 vmop web1942 web380 web2560 web2566 qa04-web web2569 web1945 web2573 remedyreply dev-greenhopper turkiye web2580 stngva1-wdev01 tmpids04 arsdocs web2586 web2588 web2590 stngva1-dhb02 web2049 web2593 web2594 web2595 stngva1-dhb01 web2597 web2598 web2609 fl1-middev01 web1952 greenhopper webp2 remedy1-18 bcrtfl1-wqa01 vdsm-devmail qa05-web web2630 web1950 portal-net-sb01 web2639 tmpids05 fl1-midqa01 b.test web2649 stngva1-ar08 va1-midqa01 rkm api_webi_dev rr2 stngva1-ar01 rkm-prod web610 web2719 web1972 artfac web2729 web1892 web2749 dev-fisheye web393 ids04 ids03 web2760 ids02 web2764 web2769 bot.search web2779 qawebp2 web2790 web2791 web2792 web2793 web2794 c.test web2795 web2796 web2797 web2798 web2809 remedy-qa dev-jira web2819 web1989 web629 qawebp1 web2830 widgetmanager web2915 web2839 web2849 widget00 s319b client00.chat web2916 web329 web119 web1893 web2917 ircip1 web1310 ircbot.search web2909 web1909 web2923 web2924 web2925 parteneri web2926 web2927 www.parteneri web2928 web3029 clientsearch web2931 web2918 web2119 web2933 web2934 web2935 web2936 web650 web2937 web2938 web3039 web2941 web2942 web2943 my.chat web2944 web2945 web2946 web2947 web2948 web3049 wbf-mdm mx-10-brighthouse web3060 web2920 evserver1 web3068 web3069 web656 remote-filter web-dmz01 web489 co-op web3079 web660 web2921 web3088 web3090 web3091 web3092 web3093 web3094 wbf-mobilesurf web3095 web3096 web3097 web3098 web3109 ircip4 web663 sha2 ircip2 web3120 web2922 web3139 web668 web1894 ircip3 web3149 web359 web3158 web3159 netgraphs web3169 webdisk.foto web675 web609 web3179 web676 web3200 web3191 web3192 web3193 web3194 web3195 web3196 web679 web3197 web3198 web3209 s1234a web3219 web683 web3228 web3229 cherries s1234b s185ipmi web3239 s321a www.dacha web339 web3249 web2159 web690 s1360 s1235b web693 graves kundenbereich rs4 web706 don4 web1895 web2919 s507a s1322ipmi s322a dodi web699 s322b test98 edi2 pdu10-1 pdu10-2 web519 s323a k219 s323b s1237a cric s1237b web57 web58 s324a web66 web67 web68 s324b web71 web72 web73 web74 web84 diaa coob devb web2950 s511ipmi s1238a desh s1238b litecommerce s325a junkyard dela web3b s1422a mail.ufa s1239a s1240b webdisk.library cisco6-2 web2298 web2299 s1327ipmi s235ipmi s1241a clad dara s1241b dami daff dado web2315 web2319 web2322 s4124ipmi rbg-web2 web3059 chileanplants s0-0-0.gw1 s0-0-0.gw2 devcelebratelife lo0.gw2 lo0.gw1 gw-internal congotrees fa0-0.gw2 fa0-0.gw1 devgreenpages greenpages web649 briz chon ayub s327a s327b s1370 sellers s1242b reyco s328a portonovo zamin paddock vmhost s328b marija www.vak bozo test.service s747ipmi s1243a s1243b s206ipmi azam s331a s1333ipmi s132a s63a s4241ipmi web928 www.fastcash s4364ipmi s332a befragung s1376 pdu11-2 pdu11-3 s333a s334a consent apc5-bad web2939 offerta s335a vgm s1338ipmi s1020 web403 cisco1-1test s336b s1235a s646ipmi bling s337a s1219ipmi web2419 s1424b s339a s339b becker s339c s1344ipmi s604ipmi s341a s4109ipmi s1390 s511a s342a pdu12-1 vsetovary pdu12-2 s1236a s1393 s1010a s1236b s1394 s1350ipmi s705 s1396 s1006ipmi s1397 s504ipmi s710a dl53 dltotal dlfiber2 s228ipmi wertyuiop s435f s4313ipmi dlpaintcopy dlfiber poc01 dltefal dlplato dlpaint2copy dltefal2 dltank dl42 dltank3 dl43 dlpress2 dlmatrix2 dl44 dlpacman2 dlplato3 dltotal2 dlpaint5 dlpaint dltank2 dlplato2 dlmatrix dlpaint2 dlpaint3 dlpaint4 s1355ipmi video19 s927 dl52 router2a router2b s4121ipmi s135a away s135b fsb s509ipmi pdu13-1 pdu13-2 s1426b s1361ipmi sp10 s241ipmi s742ipmi s4126ipmi online-shop bizon s435ipmi s617a s4220b s515ipmi bak11 s136a catz s1366ipmi s1101ipmi s4223ipmi s702ipmi s4132ipmi s4347a vpnhq s521ipmi s514a pdu14-1 pdu14-2 pdu14-3 onestep s1372ipmi s1106ipmi aspx 999999 s1240a arza s1433 ciara s1239b s137a billiard stasik s802ipmi reinout web2429 www.reinout s1436 s4356b s326a s1112ipmi s1440 s4143ipmi s4133ipmi s807ipmi s532ipmi test6249 test6251 test6252 test6256 test6258 s256ipmi asid test6263 s1444 s4358ipmi test6265 test6267 web389 test6269 s1445 test6272 www.demo01 arne s901a test6279 s1430a test6284 test6285 test6290 test6302 asar test6294 test6306 test6297 test6308 test6309 test6319 web2929 test6327 web1006 test6331 test6332 s1117ipmi web978 web392 test6335 s1446 s1430b s4350a test6349 test6356 test6360 test6361 test6366 test6368 test6369 test6372 bigg s4148ipmi test6379 ctw web2459 web989 test6390 s4350b test6391 test6392 test6393 test6404 s813ipmi web1019 s1450 test6409 s537ipmi test6413 web939 sg0 test6419 s262ipmi s1290a s1290b test6429 s1242a test6438 s1123ipmi test6439 s1301b tmp4 s139a test6449 s4154ipmi s1302a appy s1302b s140b web396 s640 anup s1303a test6459 s1303b test6461 ansh s4259a beno cisco1-2bad s1304a s1304b s1394ipmi s1305a test6469 s1128ipmi s4159ipmi test6472 s1306a s1306b s1435 s4259b s1307a s1307b tmp6 s1308a s1308b test6479 amro beep cisco7-1 anda test6490 s1399ipmi test6491 s1310a test6492 test6494 s1310b test6495 test6506 test6497 test6508 test6499 anam s1134ipmi s329a s707ipmi s1311a hayes s1311b almi s743ipmi s1312a s1312b s829ipmi s1373ipmi s278ipmi s1313a s1313b s1415ipmi web409 s1314b web2490 akil s1140ipmi s401a s142a s1315a s1315b s1475 s402a bant s1316a s1316b ajit s835ipmi s403a s1317a carotte s1009a forum126 s404a kiwi2 s1318a s1421ipmi modem1 s405a s1320a s1320b geode s406a aiai web2179 afcc poc02 adit adik s1321a abus s1321b s1010b s1484 abii s1322a s1322b abdi abbs s408a aa11 pconline telenor cisco2-1bad jira.dev gm2 it0 s1323a s1323b s1426ipmi s409a s1324a s1324b eau www.ri s411a carl3 hl01 s1325a s1325b s412a handicap s1326a nat144 nat146 s1326b s305ipmi ip204-110 thehunter s413a ageforum s413b pdu11-1 cmpunk s1327a s1327b bastia paypall taranis s1432ipmi s414a thesee miage s1328a test-support kazino s1328b s415a auch s1329a sapir s1329b raisin s1201ipmi smartkey eminent s1331a s1331b web2499 s311ipmi s417a humboldt s1109 s1332a s1332b cassis web2932 s1437ipmi s418b ws01qanet009 s1333a s1333b visioconf s419a s4203ipmi rion elsayed s1334a s1334b s4150a s421a ppp-12 web2519 ppp-13 ppp-14 ppp-15 suze s1335a s1335b perceval s316ipmi etoiles s1336a s1336b pdu4-1 s423a s1443ipmi web366 s1337a s1337b s424a s4150b www.parser s4208ipmi botiga mediaworld web670 web1859 s1338a s1338b testededns s425a s1339a s1339b s426a s322ipmi s1341a s1341b s427a s427b s1448ipmi s1342a s1342b s428a s4214ipmi s1343a s1343b s429a s430b ws02qa005 ws02qa006 s1344a s1344b s431a s327ipmi s1345a s1345b s432a s1454ipmi s1346a web199 s1346b uaz s433a web1100 s4219ipmi s1347a web1093 s1347b s434a s434b s4170a s1348a cp05qa001 cp05qa002 s1348b cp05qa003 cp05qa004 s4170b s435a cp05qa006 cp05qa007 s435b web1020 web1099 web2189 s333ipmi s4338a ip204-115 s1349a s1349b community-test s929ipmi s336a web349 web496 s1459ipmi ip204-116 s1351a s1351b s437a s101393ipmi web2559 s1352a agent2 ds922 ds0210 s1352b sacem s1352c web2192 s4104ipmi s525b s1353a s1353b s439a s439b s338ipmi s1354a web1919 s1354b s441a s441b web379 web3189 web1130 s4329ipmi s1355a s1355b s808ipmi s442a cisco1-1old s1356a s1356b s1439b s4360a s1357a testbn s1357b web1220 web2579 s924a s619ipmi s-1001001 s-1001002 s-1001003 ip204-118 mac3 eurolines webagent s-1001004 webengine euroline s1359a s1360b web689 s1205ipmi s1361a s1361b s4236ipmi web2589 cisco1-1 cisco1-2 s901ipmi s625ipmi s1363a web2591 s1363b s338a web2592 s4305b s1364a s1364b web399 s1476ipmi s1211ipmi s217ipmi s1120 s1365a web2596 s1365b s718ipmi s4242ipmi web429 web2599 web2199 s4105ipmi s1366a s1366b s906ipmi s631ipmi s1367a s1367b s917a s1368a s1368b s1482ipmi cisco8-1 s1216ipmi s1369a s1370b asak s1442b s340a s430a s1371a s1371b s912ipmi cisco2-1 cisco2-2 s339d ip204-119 s1373a s1373b s1455 s1222ipmi s1374a s1374b s4253ipmi ip204-121 s4150ipmi s1375a s1375b s906a s1376a ip204-122 s1376b s906b s318b s911a s1227ipmi s530a s4258ipmi s745ipmi s529b s4110ipmi s923ipmi s1317ipmi cisco3-1 ip204-124 cisco3-2 s4335ipmi s4340a s1233ipmi s907b s4264ipmi s1480ipmi s928ipmi s531a s112ipmi s4340b s404ipmi s102396b holod s720a s1238ipmi s1460 s4269ipmi s1390a s1390b s1440ipmi s908b s1391a s117ipmi cisco4-1 s1392b s223ipmi s724ipmi s1403a s1403b s1404a s1404b s940ipmi vip-club s1395a valid valia s1405b s123ipmi myvision s910a zdorovie smilelife vipgroup s1396a mail.world pdu1-1 pdu1-2 kamchatka tovar bonappetit viet s909b s173ipmi eticaret lees s1397a dbprod candidate s1397b s1456b flashlight s1130 s1408a basis s1408b aceware s1399a s1399b s128ipmi s910ipmi careless ce1 dwtest s1411a cline starfighter web159 dbtest s1411b web2623 slpda2 s1412a flogger cisco5-2 s4155ipmi oasis2 websp digitallife s634ipmi web696 web2629 www.static2 s1413a cszx 21st ccip jsjxy devl www.devl webdisk.devl autoconfig.devl autodiscover.devl s1413b chenkuo abdulrehman s911b kk888 telsis tuthanika ds110 topspeed rathna stpatrick starfoot s4263a rucker devecser dev.linksoflindon www.fundraising s1414a linksoflondon s1414b mailrelay4 yucca s134ipmi mailrelay3 frans fsi rubidium strange helion brinda starker s1310ipmi vpn-6 s1415a tushar s1415b potassium leopold isaias senecio s502a fatman merritt micael gedeon huashan s502b pablito out9 karnaugh s1416a pdu2-1 pdu2-2 host60 ip204-130 s4302ipmi matias host84 host54 host47 host48 host49 s503a host56 host57 host59 host61 host62 host63 out7 s503b out10 s4115ipmi out8 www.myjobs myjobs moises jateng lyncfe znc ldn s1417a s1417b haiyu ftpserv s504a testserv s504b s4180a s1418a www.rsonline fms3 s1418b s415ipmi sis1 s4180b s505a s140ipmi s102392ipmi s1419b fluke s4341ipmi s4352a s506a s506b qutaiba akpinar s820ipmi jianyi s1001ipmi www.muir shopp s1421b ikea mail-m s4307ipmi cisco6-1 www.marcin lmu1 dcomalumni test-gateway blenc03sl04 blenc01sl08 s1422b lmufedserv dsolmediasite changemypassword mediasiteiis avstmobile mediasitewms teststudent s508a s1423a webdisk.mailing s1423b s421ipmi s509a pointer s509b s1424a gjjl yiliao www.web2 pm04-1 pm03-1 mop s102397ipmi pkpk cisco-res1 cisco-res3 daweb skazka anhkhoa nzs s511b yag ai100 s4301ipmi s1425a s1425b s512a s1450a mbox2 s1426a pdu3-1 pdu3-2 galias mail.29 smsh esite www.obmen gpweb s513a www.demo6 s1427a sanchar s1427b s426ipmi s330a s1428a s1428b s515a rd02 s1429a s1429b s1012ipmi s516a s730ipmi s4318ipmi srv-1 s1431a ss13 s1431b s517a sr12 xxbs www.zy s517b www.ln www.jc www.material s1432a mdm2 cisco7-2 cisco7-3 s1395ipmi dajie webmail.film www.komputery ns.film s518a mail.film germany2 s432ipmi s156ipmi econ03 s1433a econ02 mail.ap klemens zmx usk calendrier shadow1 thuvien macewindu zenworks special3 special2 s1433b s519a ip204-114 douzi s520b s1339ipmi acf s1434a s1434b s1017ipmi s521a sitebrand xenpig www.miner s521b s4324ipmi s1435a s1435b vaccine jpmalltest inqshare www.delo s522a s522b s1436a sa12 oldcms s1436b tkt pdu4-2 bbs5 vpos igrs mobilecity uwallet s713ipmi ppsm s523a directadmin s523b s437ipmi lnd1 olna sng1 s1030 s1437a s1437b s524a s524b s1438a s1438b s1023ipmi wolontariat s1452a s102392a s1439a testcore komfort s1440b teacherstore scg-pub tnsmtp www.nd gp1 fuzoku s1452b horizont s526a balaji autoconfig.bookmark s526b jimmy01 autodiscover.bookmark liew webdisk.bookmark libo s1441a cgiirc s1441b sv533 darkover s527a s527b s1442a azazel cisco8-2 esus s528a s528b sipproxy vz02 wildman s1443a s1443b jsyl s1304ipmi s529a kiri s1028ipmi jab backupmail2 scanmail s1444a smtp-gw2 s1444b s1039ipmi s436e s531b s1445a s1445b s532a submission ff14-new snappring eclipsofeden onepiece-musou2 seimado 3dsgirlsmode chaos-heroes divinesoul suparoboux ys-celceta granado-espada parutena hekiku-grace s532b pokemon-magunagate onepiece-romancedawn puzfanwiki-3246 dungeonhero guiltgear-plusr arche-age class9 castlevania-makyou biohazard6 mapleland fightersclub dragon-quest7 extroopers rustyhearts xn--3ds-z63b4f2a1b0dw667e mamesangoku dragonpoker koisurukyabajogp s1446a toukiden luigi-mansion livetalk s1446b pdu5-2 s533a faqs educloud isen s533b s1447a yxb jwc2 s1447b verve testss bian s1309ipmi chenyi bizz d03 hung s534a larochelle dcgou s534b s1034ipmi s1448a s1448b s535a arzamas photonet vidau vidas egloo s535b s1449a s1449b s536a s536b balajitech s729ipmi s4264b hitc smartlab s1451a shahty chelny www.state osmp fest nav2 titan3 timkiem amss korek hiba mryellow amazigh stabilo speedgame flippy 1st s1451b www.knights abaddon bbbb manojk s537a bbe s537b bwd crv kraz cisco9-1 cisco9-2 s4306ipmi gue s1315ipmi itu s1040ipmi s1453a s1453b s4346ipmi s1454a u-s fregat s1454b plp rdi redbaron s4120a rwh smz s510ipmi s1455a s1455b ttv boas wiw strannik s1456a pdu6-1 gleysmo pdu6-2 nulled olorin sanctus trafford wuhuan ggmm smirnoff www.genetics s1321ipmi s234ipmi s1457a lazio adis77 wiseguy www.secured s1457b s735ipmi s4352ipmi linh sals s1458a good4u kernelpanic patievn hacker1991 pdu13-3 acrobat sofd sparks s741ipmi s1459a s1459b www.ihb grav www.kcb s190ipmi s1461a dyxx www.wee mobitest s1461b s1326ipmi www.fishi xphone narcotic 51av revealer ufuk designor vaka s1462a hailin s1462b s4357ipmi s1463a alexs chaseman adw burglar cge granplus esxi2 xdns xdot fun-forum manal fiz audioman s1463b lingdu s930a jia free-hosting kmw s4342b a1234567890 yhwyxl rak s621ipmi gmaiil sailormoon triangulum syk falc uob yojoy xcn www.fortune www.robson www.testdomain momk fellini yszm bigmama thegladiator www.fontane cray dadafarid shahram express1 paddington s1464a www.nassau n0n4m3 ap28 www.lessons s1464b scenery s915ipmi anse arad s1480 cato nofuture allyouneed s1465a s1465b s1332ipmi www.marek cmon buzu cotl j2me cvrd dobo czom fars dxsj epix gant angelos s1466a exco pdu7-1 pdu7-2 pdu7-3 gobi alhayah mygallery poesie o51k hlzx hmsn hpjs htpc kodi s920b me10 linx menz naba cory ensi mmss nemi s4363ipmi s1467a kuk s1467b s1468a daher orcamentos rew2 minhthanh s1468b saja sex5 kbo s730a smis s1469a cloe thom ssmm s1469b s1337ipmi toya ugur vima vlin darc possum s1471a wfjt wika gsb123 wong mianfei www.tardis xuhu s1471b zhao qidian efserver ytuu s4368ipmi dsquared s287a asperger hhzwly s1472a peko acess roflcopter kompendium www.pussy guildwars starlite www.remax s1472b ws01qanet001 ws01qanet002 ws01qanet003 ws01qanet004 www.hotspot ws01qanet006 ws01qanet007 ws01qanet008 ws01qanet010 s921a thisandthat rayden s1473a team-elite lixinghua www.openerp backupftp peak s1473b s216ipmi s1474a menfan s1474b deluxer s330ipmi techstore bux4 s1343ipmi s1475b s1476a mybus otherland jwforum skys215 pdu8-1 cerbero outlawz laotse benni huang1qi2 claro sabeur suprema pdu8-2 huaiji jsrong alik sex8 abydos pdu8-3 jishui shia y1y2 www.webserver s1477a s1477b parcerias danilo1051 lovecards yyhns cassy s1478a www.vitalis s1478b s922a s1479a hotsprings s1348ipmi airen basty alexd s1458b hycssq gbren sensiz djaligator confixx s1481a s1481b web2219 cally s4114ipmi legendkiller s1482a htonline chary s1482b shaded tman burak zied212 bagger madeline hackbase one23 stor11 galaxytool maggio s503ipmi tastypear merrigan frostmourne signed ra7el dudul s1483a dzbbs time2kill homeboy etang ganja s1483b flagi s1484a s1484b gifty s1354ipmi www.kan hk008 andpey s239ipmi s734b hekui gohsy s742b miles s4119ipmi s1460a prenew pdu9-1 grunt crossline puyizhen filehosting pdu9-2 mediator janan smilie mtgw aolzol partnerzy shabbir mementomori s508ipmi mediaportal isola www.ontheroad xbpjzx s233ipmi kewell dilys mikj kicks klbbs terrox rockitman www.whitehouse 51xx bir www.gekko s1360ipmi bml s4125ipmi manno s735a manus matis zkb s514ipmi mbyte s238ipmi pre2 lucky110 animeforum s640ipmi steffi losty keyshop dwf s1365ipmi lujun t-rex s4131ipmi caowei capone ninad mrtom sdv cassie hkt mutou haikal nnsky nosek raptimes mysky dominika fishi ut1 paoli madhur blackwood preferences judson mhk s519ipmi plany rsleech muk s1371ipmi s1105ipmi fager s4136ipmi xinxi www.garrison proxi qq163 uoit x2828 blf boondock s4319ipmi s440ipmi inplay fantasy88 rls sahan dreambox home-business dreamfly s410ipmi schat scorp leminh bonker brt shima admin.t partner.t s801ipmi s525ipmi zdjecia s1376ipmi qazqaz slava s1111ipmi uta slobo securitas lsav s-1003002a sneki s4310a zithromax snoox sonos yangjian webcomp sorin gwen wls turkforum freewebhost webdisk.wptest siggy hoss s4142ipmi s737a mylaner tolar testboard autoconfig.wptest fafa1688 bkvpn rbd vanem vassa referenzen autodiscover.wptest webspell city80 sccf danime dapengtx magier whity s601a web169 s601b web1229 www.suspended s806ipmi s-1003004a davidb web3129 cego wiingaard mits wx123 marcop s707 xiong s531ipmi web2889 marten siem www.feng 00001 s602a www.goya uploadserver theville s602b xssmw s255ipmi theoc ds9 monge s926a etudiant fennec aeronaut s603a p4p caillou web2759 www.sign chimere cocoty s4310b noora apresentacao web719 acamatzu klemmster web2489 sq4 gungnir web1260 thescream test6389 s1116ipmi contao theband s1460b merlyn s604a s4147ipmi ppr asw arf pal4 s-1003007a 4seasons web2940 web659 game-cheats s605a habboch msn1 s-1003008a s536ipmi tpvpn xiaocharm bjunioren web1860 ovid ringerfotos ovh1 s607a patos web2739 s607b 51free s4337ipmi web1289 starmedia cursed ashuohu bdd web1302 raddex s1122ipmi web1303 pa2.lync motorhome web1600 espaceclient imail1 s608a pa1.lync hcw mimir s746ipmi s4153ipmi pb1.lync lsmods testcitrix s609a www.traff s4266a onlineuk shahar nassau calico michael87 s610e pb2.lync downunder web1309 weltwind multiplayer s610f perfectworld 7seven tianxin s817ipmi orar elite-hacker ndlm46 s611a erol torn-ams5 free4you streamline web1316 kalinin s266ipmi s611f s733ipmi kairu web1319 vautour s612a s612e s1403ipmi web669 xiaoxi s1127ipmi s613a zenzen phproxy s4227ipmi s613e s613f s4158ipmi s614a lostcity s614b miyamoto seyuhai momo90 cp05qa009 eagleone s743b web1329 s823ipmi candykey esr kintaro dragao pdu14-4 carparking technix headstrong s272ipmi xiaoyao web2289 visao baihua ipost pittbull www.minigolf smtps3 smtps2 me1 s616a s616b zhiliao ads5 mymoodle tie-up farmgw gmg sohu permanent web1869 huasende mydriver blacklotus test-select www.referenzen my-dev ad5 img-test kami001 gb1 test-column makarov s1408ipmi s1130ipmi mulder s1133ipmi jiangfei ingredients csserver sasquatch guckstdu etienne web2789 test6296 bluestorm mursel wireshark s617b litocaa eastree www.cupid s4122a cccp missyou test6247 test6248 test6250 alexius test6253 test6254 test6255 s4164ipmi test6257 test6259 test6261 test6262 s618a test6264 test6266 res09 test6270 test6271 test6273 test6274 test6275 test6276 test6277 test6280 test6281 test6282 test6283 res07 test6287 test6288 test6300 test6301 test6293 test6304 test6305 res06 test6307 cisco4-1-bad test6310 test6311 test6312 test6313 test6314 test6315 test6320 test6322 test6323 test6324 test6325 res05 test6328 test6330 s619a test6333 test6334 test6336 test6337 test6338 test6340 test6341 web524 s619b test6350 test6351 test6352 test6353 test6354 test6355 test6357 s932a s621a test6358 s741b s709a test6362 test6363 test6364 test6365 res10 test6370 test6371 dude123 test6373 test6374 test6375 test6376 test6377 test6378 test6380 test6381 test6382 test6383 test6384 test6385 liuxing test6388 test6400 test6401 test6402 test6403 nobelman test6405 test6406 test6397 test6408 s1414ipmi test6410 test6411 test6412 web2799 test6414 test6415 test6417 test6418 test6420 test6421 test6422 test6423 test6424 test6425 test6427 test6428 test6430 test6431 test6432 test6433 test6434 test6435 s622a test6440 test6441 test6442 test6443 test6444 test6445 test6446 test6447 test6448 test6450 test6451 test6452 test6453 test6454 test6455 test6456 test6457 test6458 test6460 test6462 test6463 test6464 test6465 test6466 test6467 test6468 test6470 test6471 thl test6474 test6475 test6476 test6477 test6478 test6480 test6481 test6482 test6486 test6487 test6488 test6500 test6501 test6502 test6493 test6504 test6505 s1138ipmi test6507 s1466b s4169ipmi s4137ipmi vh01 faul beatbreak eoin distrib blackriver mynick erdzan thesilence demopage equity finanz vh02 wqdman blackspace balint s624a cello s624b traderportal basalt likenoother zzm270782357 daxiongmao pedroferreira s920a daylite jatek sandstone pams s4246ipmi web196 s625a s1419ipmi wiki-dev fms5 s626a esm5 web469 esm6 esm7 web2829 esm8 esm9 esm10 s626b webdisk.sitebuilder ftp.gallery s4175ipmi st17 st24 st25 st27 st31 st9 st19 st30 agility s627b ykc ikuei koutoku toyokawa web198 gbcp panopto thing2 uphinh edari zirconia testfiles wmiller suchart alexi akmal s4208a staging.dev babyx hammoud lazerpoint hy1 goo adhoc pru s628a ekatalog s840ipmi epbx2 synxis longhorn sisu s931a web2302 web1390 giangnt s4353ipmi jffnms s288ipmi s600 web534 web1392 web1880 wwwwwww multidevice bluesun fringe web1929 npp kinen s630b web1399 s4108ipmi valverde sm69 s1425ipmi salak s632a docworks sakusaku webhelp hisho s4181ipmi s4311a newapi s633a web2859 mins somphong chekui anicet www.collections s633b mtest2 web1420 s526ipmi envoi mailsv1 ocean11 web59 s743a ns1.dec www.futures izu s610ipmi s304ipmi fmat proofs patientclinic myminicity www.thenews www.gamersparadise s4101a www.sparky heartrhythmclinic www.theda maytinh malin tamam web2869 talib ladyp hashim regulators www.starz www.noorsat phillyskaters s4101b ansarysa www.abood blackwatch ricksplace www.adnan legio www.bandofbrothers affguild cardiosurgery web69 s202ipmi s635a 6rb numerology pavlovic horseheaven www.godlike zhangbo www.newengland myvoice siteweb www.regulators lve rohclan terrafirma www.alternativeenergy icemage www.testingplace web2879 www.thedoghouse r131gzhbxci3cnaq2to9878u6mx7asr7vepltmpq baladna www.kidney www.trick scionsoffate s2s egr s1431ipmi blazed etw s4102b igt applicants confused web79 www.sithacademy s636a s4103a s4103b t3m noh owe psq rcr rfm s637a www.blackwatch row www.theway www.ricksplace theburrow vd3 wthfwcluster wal s4104a wgr www.playtime www.numerology tl1 hpclub web2900 justforkicks web2891 web220 wthfwmgmt hamami web2892 www.sacredrealm web2893 wthadfs web2894 www.xerxes web1890 www.amipest amipest web2895 s4104b thebus www.thetardis web2896 s1427ipmi animefreak diablerie hooligans web2897 ihotblack thesithacademy shadesofink www.magnacarta web2898 saihu s726ipmi web2899 doglovers web1891 biteme www.cappa web2911 www.dbadmintrillian cesar1 web2912 selva www.roughnecks saicomputers higherground web2913 s638a thenewfrontier 360clan www.jediknights www.week4 web2914 www.renegades web1000 web1001 web1002 web1003 web1004 web1005 web1007 web1008 web1010 web1011 web1012 web1014 web1015 web1016 s309ipmi web1017 web1018 www.animefreak web1022 web1023 web1024 web1025 web1026 web1027 web1028 web1030 web1031 web1032 web1033 web1034 web1035 web1036 web1037 web1038 web1040 web1041 web1042 web1043 web1044 web1045 web1047 web1048 web1049 web1051 web1052 web1053 web1054 web1055 web1056 web1057 web1058 web1060 web1061 web1062 web1063 web1064 web1065 web1066 web1067 web1068 web1069 web1071 web1072 web1074 web1075 web1076 web1077 web1078 web1079 web1081 web1082 web1083 web1084 web1085 web1087 www.crhs web1090 web1091 web1092 web1094 web1095 web1106 smartphones web1097 web1098 web1110 splitinfinity web1112 web1113 web1114 web1115 www.comworld web1117 web1118 web1120 web1121 web1122 web1124 s4105b web1125 web1126 www.wesam web1128 videoplanet web1132 web1133 web1134 web1135 web1136 web1137 web1138 web1140 web1141 web1142 web1143 web1144 web1145 web1146 web1147 web1148 web1150 www.blazed web3019 www.nintendowifi pwm www.bones web1211 web1212 web1213 web1214 web1215 web1216 web1217 web1218 web1221 web1222 web1223 web1224 web1225 web1227 web1228 web1230 web1231 web1232 web1233 web1234 web1235 web1236 web1237 web1238 web1240 web1241 web1242 web1243 web1244 web1245 web1246 web1247 web1248 web1250 web1251 web1252 web1254 web1255 web1256 web1257 web1258 web1261 web1262 web1263 web1264 web1265 web1267 web1268 web1270 web1271 web1272 web1274 web1275 web1276 web1277 web1278 web1279 web1281 web1282 web1283 web1284 web1285 web1287 leosplace web1300 web1301 web1292 web1304 web1305 web1306 web1307 web1308 web1311 web1312 web1313 web1314 web1315 web1317 web1318 web1320 web1321 web1322 web1324 web1325 web1326 web1327 web1328 web1331 web1332 web1333 web1334 web1335 web1336 web1337 web1338 web1340 web1341 web1342 web1343 web1344 web1345 web1346 web1347 web1348 web1350 web1351 web1352 web1353 web1354 web1355 web1356 web1357 web1358 web1360 web1361 web1362 web1363 web1364 web1365 s639a web1366 web1367 web1368 web1369 web1371 web1372 web1373 web1374 web1375 web1376 web1377 web1378 web1380 web1381 web1382 web1383 web1384 web1385 web1386 web1387 web1388 web1400 web1401 web1402 web1403 web1404 web1395 web1396 web1407 web1408 web1409 web1411 web1412 web1413 web1414 web1415 web1416 web1417 web1418 web1419 web1421 web1422 web1423 web1424 web1425 web1426 web1427 www.gamedev web1429 web1431 web1432 web1433 web1434 web1435 web1436 web1437 web1438 web1439 web1441 web1442 web1443 web1444 web1445 web1446 web1447 web1448 web1450 hostile web363 www.desouza retouching web2930 web1511 web1512 web1513 web1514 web1515 web1516 web1517 web1518 web1520 web1521 web1522 s4106a web1523 web1524 web1525 web1526 web1527 web1528 web1531 web1532 web1533 web1534 web1535 web1536 web1537 web1538 web1540 web1541 web1542 web1543 web1544 web1545 web1546 web1547 web1548 web1550 web1551 web1552 web1553 web1554 web1555 web1556 web1557 web1558 web1559 web1561 web1562 web1563 web1564 thorns web1566 web1567 web1568 web1570 web1571 theprence web1573 web1574 web1575 web1576 web1577 manna web1580 web1581 web1582 web1583 web1584 www.dbzuniverse web1586 web1587 web1588 web1601 web1602 web1593 web1604 web1605 web1606 web1607 web1598 web1609 web1611 web1612 web1613 web1614 www.chums web1616 web1617 web1618 web1619 web1621 web1622 web1623 web1624 web1625 web1626 web1627 realms web1629 web1631 web1632 web1633 web1634 web1635 web1636 web1637 web1638 web1640 web1641 web1642 web1643 web1644 web1645 web1646 web1647 web1648 s1436ipmi web1649 web1651 web1652 web1653 web1654 web1655 web1656 web1657 web1658 web1659 web1661 web1662 web1663 web1664 web1665 web1666 web1667 web1668 web1670 web1671 s740a web1672 web1673 web1674 web1675 web1676 web1677 web1678 web1680 web1681 web1682 web1683 web1684 web1685 web1686 web1687 www.zamalek web1690 web1691 web1692 web1703 web1704 web1695 web1706 web1707 web1708 web1710 web1711 web1712 web1713 web1714 web1715 web1716 web1717 web1718 web1720 web1721 web1722 web1723 web1724 web1725 web1726 web1727 web1728 web1729 web1731 web1732 web1733 web1734 web1735 web1736 web1737 web1738 web1739 web1741 web1742 web1743 web1744 web1745 web1746 web1747 web1748 web1750 nightriders phonebill web1910 web1896 emarati web490 web1811 web1812 web1813 web1814 web1815 web1816 web1817 web1818 web1820 web1821 web1822 web1823 web1824 web1825 web1826 web1827 www.epay web1830 web1831 web1832 web1833 web1834 web1835 web1836 web1837 web1838 web1840 web1841 web1842 web1843 web1844 s744a web1845 web1846 web1847 web1848 web1850 web1851 web1852 web1853 web1854 web1855 web1856 web1857 macgyver web1861 web1862 web1863 web1864 web1865 web1867 web1868 web1870 web1871 web1872 web1874 web1875 web1876 web1877 web1878 web1881 web1882 web1883 web1884 web1885 web1887 thetardis web2000 web2001 web2002 web2003 web2004 s641a 6688 yourweb web2014 web2015 web2017 web2018 www.insanesanity web2021 web2022 web2024 molham web2026 web2027 web2028 web2031 chicanorap web2033 web2034 web2035 web2036 web2037 www.mysample web2040 web2041 web2042 web2043 web2044 thedoghouse web2046 web2047 web2048 web2050 web1951 ws01qanet005 web1953 web1954 web1955 web1956 web1957 romane web1960 web1961 web1962 web1963 web1897 animeuniverse web1966 web1967 web1968 web1970 web1971 www.thedeathsquad web1973 web1974 web1975 web1976 web1977 toby web1980 web1981 web1982 web1983 web1984 web1985 web1986 web1987 web1988 web1991 web1992 web1993 web1994 web1995 web1996 web1997 web1998 web1999 web2111 web2112 web2113 web2114 web2116 web2117 web2118 web2120 web2121 web2122 web2123 web2124 web2125 web2126 web2127 milkman web2130 web2131 web2132 web2133 web2134 web2135 web2136 web2137 web2138 web2140 web2141 web2142 web2143 web2144 web2145 web2146 web2147 web2148 web2150 web2151 web2152 web2153 web2154 web2155 web2156 web2157 web2158 web2161 web2162 web2163 web2164 web2165 web2166 web2167 web2168 web2170 web2171 web2172 web2173 web2174 web2175 web2176 web2177 web2178 web2180 web2181 web2182 web2183 web2184 web2185 web2186 web2187 www.puddles web2200 web2201 web2202 web2203 web2204 web2205 web2206 web2207 web2208 web2210 web2211 web2212 web2213 web2214 web2215 web2216 web2217 web2218 web2220 web2221 web2222 web2223 web2224 web2225 web2226 web2227 web2228 web2230 web2231 web2232 web2233 web2234 web2235 web2236 web2237 web2238 web2240 web2241 web2242 web2243 web2244 web2245 web2246 web2247 web2248 web2250 web1898 web2252 web2253 web2254 web2255 web2256 web2257 freebieworld web2260 web2261 web2262 web2263 web2264 s4107a web2266 web2267 web2268 web2270 web2271 www.kurdistan web2273 web2274 web2275 web2276 web2277 whitecliffs web2280 web2281 web2282 web2283 web2284 s4107b web2286 web2287 mercenaries web2301 www.weareafamily web2303 web2304 web2305 web2306 web2307 temp09 web2310 web2311 web2312 web2313 web2314 urbanchaos web2316 web2317 web2318 web2320 web2321 sunt web2323 web2324 web2325 web2326 web2327 www.gatelords web2330 web2331 web2332 web2333 web2334 web2335 web2336 web2337 web2338 web2340 web2341 web2342 web2343 web2344 web2345 web2346 web2347 www.newhorizon web2350 www.crimsonrose www.darkbrotherhood s4202ipmi web2272 s642a web2411 web2412 web2413 web2414 web2415 web2416 web2417 web2418 web2420 web2421 web2422 web2423 web2424 web2425 web2426 web2427 web2428 web2431 web2432 web2433 web2434 web2435 web2436 madhatters web2438 web2440 web2441 web2442 web2443 web2444 web2446 web2447 web2448 web2450 web2451 web2452 web2453 web2454 s1470a web2455 web2456 web2457 chickens web2460 web2461 web2462 web2463 web2464 web2465 web2466 web2467 web2468 web2470 web2471 web2472 web2473 web2474 web2475 web2476 web2477 web2478 web2480 web2481 web2482 web2484 web2485 web2486 web2487 web2488 web2501 web2502 web2503 web2504 web2505 web2506 web2507 web2508 web2510 web2511 web2512 web2513 web2514 web2515 web2516 web2517 web2518 web2520 web2521 web2522 web2523 web2524 web2525 web2526 web2527 www.payback web2530 web2531 web2532 web2533 web2534 web2535 web2536 web2537 web2538 web2540 web2541 web2542 web2543 web2544 web2545 web2546 web2547 web2548 web2550 web2551 web2552 web2553 web2554 web2555 web2556 web2557 web2558 web2561 web2562 web2563 web2564 web2565 web2567 web2568 web2570 web2571 web2572 web2574 web2575 web2576 web2577 web2578 web2581 web2582 web2583 web2584 web2585 web2587 daniel2 web2600 web2601 web2602 web2603 web2604 web2605 web2606 web2607 web2608 web2610 web2611 web2612 web2613 web2614 web2615 web2617 web2618 web2620 web2621 web2622 web2624 web2625 web2626 web2627 web2628 web2631 web2632 web2633 web2634 web2635 web2636 web2637 web2638 web2640 web2641 web2642 web2643 web2644 web2645 web2646 web2647 web2648 web2650 web1519 s4108b web2711 web2712 web2713 web2714 web2715 web2716 web2717 web2718 web2720 web2721 web2722 web2723 web2724 web2725 web2726 web2727 web2728 web2730 web2731 web2732 web2733 web2734 web2735 web2736 web2737 web2738 web2740 web2741 web2742 web2743 web2744 web2745 web2746 web2747 web2748 web2750 web2751 web2752 web2753 web2754 web2755 web2756 web2757 web2758 web2761 web2762 web2763 web2765 web2766 web2767 web2768 web2770 web2771 web2772 web2773 web2774 web2775 web2776 web2777 web2778 web2780 web2781 web2782 web2783 web2784 web2785 web2786 web2787 web2788 web2800 web2801 web2802 web2803 web2804 web2805 web2806 web2807 web2808 web2810 web2811 web2812 web2813 web2814 web2815 web2816 web2817 web2818 web2820 web2821 web2822 web2823 web2824 web2825 web2826 web2827 s933a web2828 web2831 web2832 web2833 web2834 web2835 s642e web2836 web2837 web2838 web2840 web2841 web2842 web2843 web2844 web2845 web2846 web2847 web2848 web2850 web2851 web2852 web2853 web2854 web2855 web2856 web2857 web2858 web2860 web2861 web2862 web2863 web2864 web2865 web2866 web2867 web2868 web2870 web2871 web2872 web2873 web2874 web2875 web2876 web2877 web2878 web2880 web2881 web2882 web2883 web2884 web2885 web2886 web2887 web2888 web2901 web2902 web2903 web2904 web2905 web2906 web2907 web2908 web2910 web3011 web3012 web3013 web3014 web3015 web3016 web3017 web3018 web3020 web3021 web3022 web3023 web3024 web3025 web3026 web3027 web3028 web3030 web3031 s642f web3032 web3033 web3034 web3035 web3036 web3037 web3038 web3040 web3041 web3042 web3043 web3044 web3045 web3046 web3047 web3048 web3050 web3051 web3052 web3053 web3054 web3055 web3056 web3057 web3058 web3061 web3062 web3063 web3064 web3065 web3066 web3067 triggerhappy web3070 web3071 web3072 web3073 web3074 web3075 web3076 web3077 web3078 web3080 web3081 web3082 web3083 web3084 web3085 web3086 web3087 faisal1 web3100 web3101 web3102 web3103 web3104 web3105 web3106 web3107 web3108 web3110 web3111 web3112 web3113 web3114 web3115 web3116 web3117 web3118 web1529 web3121 web3122 web3123 web3124 web3125 web3126 web3127 web3128 web3131 web3132 web3133 web3134 web3135 web3136 web3137 web3138 web3140 web3141 web3142 web3143 web3144 web3145 web3146 web3147 web3148 web3150 web3151 web3152 web3153 web3154 web3155 web3156 web3157 mesfichiers web3160 web3161 web3162 web3163 web3164 web3165 web3166 web3167 web3168 web3170 web3171 web3172 web3173 web3174 web3175 web3176 web3177 web3178 web3180 web3181 web3182 web3183 web3184 web3185 web3186 web3187 web3188 web3201 web3202 web3203 web3204 web3205 web3206 web3207 web3208 web3210 web3211 web3212 web3213 web3214 web3215 web3216 web3217 web3218 web3220 web3221 web3222 web3223 web3224 web3225 web3226 web3227 s1470b web3230 web3231 web3232 web3233 web3234 web3235 web3236 web3237 web3238 web3240 web3241 web3242 web3243 web3244 web3245 web3246 web3247 web3248 web3250 s4109a www.chicanorap www.coffeetalk elmagic realdeal www.daedalus 2222 www.erepublik www.freeforall fsgroup izaphod fabulations amonline glr 1212 www.rst agoraphobia fragglerock www.acrossthepond www.urbanchaos s315ipmi www.bluray pps01 childrenofthenight www.oddfellow www.handson www.madhatters s4111a www.theelites dbadminmarvin www.hangman thechosenfew www.zappa www.chooseme www.elsaedy noorsat poema nadim s4111b skyf m38 theswarmwar www.elves www.amnesty www.wargods www.sailor patiyut wutang www.abf www.theimperiallegion tm2 cics s1442ipmi www.bcr www.btw mobilepalace www.crg www.dla archimede www.dkt conservatoire www.dow www.egr www.kamensk-uralskiy www.eoa web2292 www.etw www.postyourstuff www.yerbamate www.hos elitewarriors www.jak s712ipmi vremeto www.justus serenityguild www.maa www.lod sondos www.salama mailgw3 s-1003007 www.mog www.noh www.ork www.owe www.ppt www.psq teremok www.sc2 www.rov www.row www.islarti s-1003008 www.trg cricri www.uhs www.vba www.trt kupon www.funit s4112b www.wgr www.zmm numerique www.moneymaking www.ahlamontada voodoocrew s4207ipmi www.soundsource ffforum sher s721 www.chatroom www.footballforum www.scionsoffate www.superc justus blendedlearning www.thesithacademy funkytown www.contacts hamada2010 pavlik www.warpigs relic s646a www.htmltest sanane wolfclan www.morrow www.chatterbox www.justforkicks dch moviemagic sportlife www.hastings s4113a brokenstraw awf www.voodoocrew superc www.satsat thaifood www.spiders www.deviance www.1001 beardeddragons fighterace revue www.totaleclipse s4113b www.sweets www.phillyskaters 4jesus www.haste ceridian yerbamate www.havoc s4114a www.highschool wwwtm s4114b norris stopsmoking www.moviemagic eworkshop s321ipmi samra s744b www.higherground www.rednecks testo adulthood montest www.primrose www.thebus www.fighterace www.hivemind footyfans www.ladyp desouza s4115a www.guardians www.adulthood www.4all www.azerty dkt chatalot zik footballfrenzy www.catalyst www.back2back therefuge www.rainclan zamalek formas flyingcircus teamworkshop myislam luntai therebellion palstine liverpoolfans mohamedzaki www.thenewfrontier ldgaming comworld www.sharpie www.diablerie nobilis konoki www.ihotblack myles www.iford www.stickwar www.thepit theda creativecorner www.doglovers insaneasylum theimperiallegion s4115b www.horseheaven www.printing cavaliers www.noob katoteros www.simulation www.fathers camelia www.lunaris tcf kodclan www.shadesofink tt9 uhs www.numberone urd bat2 gangstaparadise alfnan web1916 www.deathinc www.leosplace deathscythe p005 madcows s934a www.splitinfinity s1447ipmi www.xsquad exiledro s101390a youdecide www.programmersparadise www.hybrid s4116a www.elders narutorpg www.anrforum s4116b www.sellit trick alkamar alaseer www.parklands www.dynamite bader darkhearts www.beardeddragons xsquad www.elhamd haflinger www.townline cisco12-2 sori sejours almot elsaedy www.nightriders elders mystik2 www.thechosenfew www.nwoclan sportsnetwork www.animeuniverse theartofwar divers s4213ipmi www.starcity www.revelation wargods futurefiction roughnecks web3089 exohax turkteam hot1 www.chaotic elhamd www.darkhearts www.dungeons devgames fables www.alibaba userbars islarti theasylum back2back anhlam www.footballfrenzy slaughter www.selfish kimvan www.wolfclan s4117a www.kiran s4117b chooseme warpigs numberone noursat www.legionofdarkness www.chatter legionnaire stmichaels s4118a sktao s4118b www.sportsbetting s326ipmi week4 programmersparadise s4119a sandanski www.prisonbreak www.hesham foxscape woodbine legionofdarkness jedimasters eclips www.creativecorner www.fabulations battleroyale adsa bd16 www.agoraphobia chums parinya bedo sriram atef cctb s4119b www.dbadminmarvin insanesanity microsoftwindows steg ws123 clanex www.emoney zms azhr www.liviu mehrshad www.discussion www.6rb s1453ipmi s4121a milla wr3an baljeet habilar mapdev www.thegods orangebox knuckles s4121b fade duha s3eed www.tribalwars vpn-us-west th1 www.roadtrips homeschool weareafamily www.marwan www.theswarmwar s4218ipmi www.stigmata www.rstools www.nutter www.serenityguild www.theunderworld hoda www.guesswho htfc hupt thedon www.blendedlearning s4213b gali s4103ipmi s4122b www.group4 lexo www.abdo www.karnage kannan www.mitie www.funkytown shimmy www.alaa www.bedo vpn-au www.lovehome masrya thegreatescape www.aucc www.srsm alsace www.equinox newp www.habilar s4123a www.chen flanders www.cogs s4123b rednecks s332ipmi www.dmo3 tsj vendome s4124a toh www.therebellion sharpie www.thesims s4124b s306ipmi www.entity qne www.liverpoolfans www.dust www.b3 oui akhbar pshl s1458ipmi www.gaza s419ipmi pwnd footballforum testxml s4125a bjbjbj simplehelp s4125b www.hala gdw thesims sithacademy s101392ipmi www.software4free federer rsps s4224ipmi www.hood srsm www.htfc suba www.insaneasylum ca2 rainclan www.iman euroleague entity real4ever sacredrealm www.faithless patterson smarttech s4126a s4126b www.dystopia xintuo xaoc www.aliman soundsource s4127a www.chitchat elves tollfree swapitshop www.mizo s4127b www.nate www.mofo www.affguild www.nita s613ipmi s337ipmi s4128a stickwar web2949 www.hiking www.katoteros s4128b myfirstforum s101392a s4129a minime www.none www.yourhealth allsaints www.talent www.euroleague www.denial class2d thoughtcrime sumana www.sart coton www.serc www.sportsnetwork mancave s4129b site4u hiking jediknights www.swapitshop leonjackson www.alsadr deathinc www.tigerclan tigerclan www.void dbadmintrillian www.mohamedzaki s4229ipmi forgottencoast testingplace www.abdelrahman dbzuniverse web3099 www.rohclan www.childrenofthenight www.slarti anrforum www.baladna www.cavaliers www.ultras s4131a tapion king1 alsadr www.thehill web186 s4131b www.demigod s4132a aliance theunderworld townline s1433ipmi s618ipmi s4133a s4133b s1469ipmi s4134a s1204ipmi s717ipmi s4235ipmi s4135a s4135b s937a s4136a s4136b s624ipmi router1ipmi s4137a s4137b s1475ipmi s4138a s4138b s1210ipmi s4139a s4139b www.lotto s4141a s4141b www.forward s905ipmi s629ipmi s1475a s4142b s938a s1481ipmi s4143b s1215ipmi s4144a s4144b s4145a s4145b s911ipmi tpsmtp fcmi tmsg2 webhr irmtrade apitwca tpsmtp2 goldtwca s635ipmi tmsg webrtqt03 webrtqt01 webrtqt bctrade webrtqt05 webrtqt04 s4146a elearnap webrtqt02 rmtrade nbclient1 s4146b s1303ipmi s4147a s4147b orders2 netops gwanak www.nsw s1221ipmi s745b wandoo tmp1 s185b s4148a s4148b s4252ipmi tmp8 lubin tmp9 www.jaroslaw s1476b s4149a s229ipmi www.ostroda s916ipmi www.znin s607ipmi www.gliwice s641ipmi znin s4151a s4151b www.wolsztyn s1109a s4152a s4152b slupsk s1226ipmi s4153a s4153b s4257ipmi s4154a ostroda marki rt3 www.debica www.osiek s4154b s922ipmi s640a www.brzozow hel thw s4155a s4155b s4156a mieszkowice milakowo s4156b chorzele piaseczno avaya s1232ipmi brzozow s1309 s701a s4157a s4157b s4360b s4263ipmi s702a s4158a s4158b s927ipmi s703a s1130a osiek www.gizycko s4159b kolbuszowa s111ipmi nightline s704a s4161a www.rzeszow s4161b orneta www.rozan s1237ipmi s705a s222ipmi www.bialystok s4162b gizycko s4268ipmi www.lubaczow s824ipmi s706a s4163a www.turek www.gostyn s4163b s933ipmi s707a s4164a s4164b www.milakowo www.chorzele s116ipmi s708a s4165a czestochowa s4165b s1243ipmi nintendoland s4166a s4166b www.mielec s711a s4167a lesko s4167b s4322ipmi s712a s1480a s4168b s1479b s122ipmi s4169a strzyzow ropczyce turek s4169b s908ipmi www.lesko s714a s4171a s4171b s715a s4172a s4172b s716a s4173a s4173b www.jaslo www.slupsk www.ilawa www.tarnobrzeg s640b s403ipmi s717a s4174a s4174b s4366ipmi s718a s4175a s4175b lubaczow s740 s719a s4176a s4176b s721a s4177a s4177b s408ipmi jaroslaw s722a s4178a s133ipmi tarnobrzeg s635b jaslo s4340ipmi s723a ilawa www.scp s4179a s4179b wolsztyn s818ipmi s724a s4181a s4181b s746b s725a www.strzyzow www.ropczyce s4182a oldsmtp s4182b s414ipmi s4183a s4183b gostyn s102391ipmi www.orneta s727a s4184a s4184b s728a s4185a pd1 s4185b s918ipmi s409 www.kolbuszowa s4186a mielec s4186b s731a s4187a s4187b s144ipmi s713a s102396ipmi s732a s4188a s4188b s227ipmi s1005ipmi www.livescores ftp.old ftp.game s733a oftp2 localnet periwinkle s4312ipmi s1020a mailin1 valerian s4201a nmr mailin2 rsl s4201b s701ipmi s1404ipmi s4202a s4202b s736a gridview s4203a s4203b s505ipmi s1011ipmi rushmore shasta s4204a s4204b s4317ipmi d2l s738a s4205a s4205b s706ipmi s4206a s4206b s431ipmi s741a petition s4207a s4207b s742a s1016ipmi anc1 s4208b s4323ipmi s4160ipmi s4314a relais2 s4209a s4209b www.ultimate global1 s4320a talento2 crossroad s4211a s4211b autoconfig.library autodiscover.library s436ipmi s4226b s745a chapo s4212a www.harley s4212b s746a webdisk.cp s4213a coimbatore s1022ipmi www.coimbatore s4314b parent s4328ipmi zacharias sportmaster s747a s4120ipmi geab s4214b s620b strand mazars harlequin benq xlnt s748a e-butik fns oneoff alfa3 s4215a s4215b s442ipmi samhall s525a questionmark s4216a webgui procom xcri s4216b www.fencing s902b cisco3-1bad s4159a s4217b s1027ipmi s4334ipmi infoserv s4218a s4218b s4219a s4219b s723ipmi s4221a s4221b s4160b s1119a www.bestdeals bestdeals s1308ipmi s4222b ewr s1033ipmi s4339ipmi s4223a s4223b s4224a vss2 webdisk.tm autoconfig.tm autodiscover.tm s1450ipmi s728ipmi s747b s4225a s4226a s1314ipmi s1038ipmi vpn-us s4345ipmi s4227a s4228a s4228b s734ipmi s1409ipmi s4229a s4230b s1309a images-nc images-na images-ns images-ni images-no images-ng s930ipmi s1309b s4231a s4230a s1319ipmi s4215ipmi s4232a s4232b refill compliance kob11 s4168a s739ipmi s1359ipmi s919ipmi s4235a cathaylife chinatrust s1325ipmi s735 s4236a s4356ipmi s4165ipmi s720 s4237a s4237b www.f1 vpn201 vpn205 www.country vpn200 vpn202 vpn203 vpn204 s337b s4238a s4238b s1320ipmi fialka selfish www.konvict www.limelight www.diplomacy royston funit lodi redtoblack dtw s4239a dli fma www.pnt s4239b lim1 s1331ipmi www.youdecide gnome www.mrm thedeathsquad www.skp s422ipmi dungeons angelhaven www.deathscythe www.nomore crimsonrose s4241a stela www.ldgaming www.battleroyale jodie www.6arab www.redtoblack s4241b gatelords sliver s4362ipmi www.factory www.rawan telethon prodotti www.360clan polska thegods s4242a www.recon ics2 muzammil s4242b rateme darkbrotherhood www.angelhaven www.ravenous sias exp3 www.futurefiction iford s4243a s4243b s803ipmi s4244a s210a mail-int s1336ipmi iod s4245a s4245b s4367ipmi s4102ipmi s4246a s4246b access6 s4247a s4247b inspektorat s215ipmi s4248a uci s4248b s1230ipmi s1342ipmi web1920 s4249a topman outfit s4249b wallis ptk s4107ipmi s4251a s4233a s4252a r15 s4252b nexus2 s320ipmi v14 s221ipmi s4253a v15 v11 v20 v24 s4253b s1347ipmi linode1 linode2 linode3 linode4 linode5 linode6 ipaddress2web www.winxp orochi s4254a s4254b s740ipmi orkutt s4113ipmi s4255a s4255b s823y s4256a nomina s4256b s1314a s502ipmi s226ipmi s801a s4257a ldap5 rootdir s4234a s1432b www.projetos 6dkj s748b s1353ipmi s4258a s4258b s4221ipmi s803a s4118ipmi s4250ipmi s804a s4261a s4261b s507ipmi s232ipmi s4262a graphics3 ext1 s4262b s806a sslgw s1358ipmi s4263b s4171ipmi autoconfig.a s4264a integracja autodiscover.a s213a s4320ipmi s808a magnolie s4265a s4265b s833ipmi s513ipmi s809a campari s237ipmi s4266b s811a s4267a s1364ipmi pinklady www.hum s812a s4268a s4268b s4129ipmi s813a s4269a s4269b s1226 s518ipmi s814a s4271a s4271b s812ipmi s815a s4272a s4272b s1369ipmi s813x s1104ipmi s813z s816a s4273a s4273b s4135ipmi s1010ipmi web3119 architect s817a s524ipmi s819a s820b s1375ipmi s1110ipmi s1317b s4141ipmi s822a ppmail s822b adminer s520ipmi s2b vps.serverel.com s529ipmi s904a s824a ipmi14-2 s1129a s1115ipmi sbl s825a rscomp baykal s825b s1129b s-108 s-110 s826a potok s826b s904b s811ipmi www.citforum s827b s4162a s260ipmi s828a s828b s1121ipmi s829b s4152ipmi s831a s831b s816ipmi s832b s638b s265ipmi s833a s833b s1319a s1402ipmi s1319b s1126ipmi s4240a s4176ipmi s-201 s835a s4302a s4302b s926b s4303a s4303b s271ipmi s837a s4304a s4304b s1132a s1397ipmi s838a s4305a s1132ipmi s732 s4163ipmi s4306a s4306b s4307a s4307b s276ipmi s842a s4308a s4308b s340ipmi s1413ipmi s4309a s4309b s4240b s4168ipmi s4311b s4312a s4312b greenhotel s4313a ftp.survey s4313b 06 07 www.trac segway 08 vbg s1418ipmi s220a www.greenhotel www.segway s340b ellada s4315a s4174ipmi s4316a s219d s838ipmi cisco3-2bad eximstats s287ipmi s4317b s4318a s1424ipmi test.static dwg s4319a s4319b matos s4321a s4321b darkdragon 9999 stj s4322a s-34a s410a s4323a s4323b s1430ipmi s4324a s4324b autodiscover.accounts s711ipmi s4185ipmi autoconfig.account s1239 webdisk.accounts s4344ipmi s4325a s4325b s4326a s4326b s308ipmi s602 autodiscover.account s905b s4327a s4327b s1435ipmi s4244b s4328a www.knowledgebase s4328b s4182ipmi s4201ipmi s4329a s4329b s4331a autoconfig.accounts s4331b s314ipmi s4332a s4332b s1441ipmi s4333a s4333b s4206ipmi s119ipmi s4334a s4334b sv60 s4335a s4335b s319ipmi s4336a prawo s4336b s1446ipmi s4337a xds sv18 s4337b sv22 sv23 sv24 sv25 sv26 sv27 sv29 s4130a web3130 s4212ipmi ipmi-a1-1 ipmi-a1-2 sv36 sv37 sv38 s1040b s4338b s4339a s4339b s325ipmi sv61 sv62 sv63 s4341a s4341b s1452ipmi mail2b s4342a p11 p12 rajneesh s328ipmi s4217ipmi s4343a s4343b nimda s4344a s4344b s606ipmi s1138a s1401b s331ipmi s4345a rachael cache4 autodiscover.top autoconfig.thumbs webdisk.click s4345b s1457ipmi webdisk.thumbs s4346a autodiscover.click s4346b www.konto s101391ipmi autoconfig.ny webdisk.ny autoconfig.top autodiscover.ny webdisk.top kvm25 autodiscover.thumbs autoconfig.click s4347b ipmi-a2-1 www.trojans amesmtp localhost.shop ipmi-a2-2 kvm24 s4348a s4348b s612ipmi bonitasprings s336ipmi www.worms k13 s4349a s4349b s1463ipmi s4351a s4351b s4237ipmi s716ipmi kvm18 s4228ipmi astest s4352b s4353a s4353b kvm17 s617ipmi s342ipmi s4354a s226a s4359ipmi s226b kvm22 s1468ipmi s4355b geodaten s1203ipmi s4304ipmi shaiya interbase s4187ipmi dl104 dl103 dl102 s4356a s4234ipmi s4357a lutsk s4357b s102390a s102390b s623ipmi ipmi-a3-1 ipmi-a3-2 s4358a s4358b s102391a s102391b s903a s4359a coldwellbanker s1474ipmi s1330a s1208ipmi s102392b s1330b s4361a s4250a s4239ipmi s102393a s102393b s4250b s905a monitor01 work1 s4362a s4362b mob01 s102394a webdisk.test123 autoconfig.test123 autodiscover.test123 s102394b s628ipmi s416a trojans filesend s4363a s4363b s530b s102395a s102395b s907a s4364a s4364b s1479ipmi stats.test s102396a s1214ipmi s908a auto2 s4365a s4365b s4245ipmi s102397a s102397b s1454 s909a s4366a s4366b s138ipmi s909ipmi s4367a s4367b s520a s912a s4368a s4368b ack s1220ipmi s913b s4251ipmi s914a s914b stjoseph s1477ipmi s606a s915a s639ipmi s916a s916b s1225ipmi s917b dpanel s636ipmi s1392a s918a s918b s921ipmi s418a s919b s830a s804 s921b s1402b s1231ipmi s922b s-91a s722ipmi s4262ipmi s923a s923b s924b s925a s925b s1040 s420a s1236ipmi s-95a s420b s4267ipmi usability telemarketing s927a s927b s928a gw04 s928b s929a s115ipmi bauk s931b fik s1242ipmi s4273ipmi s932b s632ipmi smartcampus s933b s937ipmi s1464ipmi airi oia snmptn s934b s121ipmi s610a bapsi www.bars divas s935a s935b s808 psw s936a s936b local2 s4210b autoservicio s937b eclectic s4210ipmi s402ipmi s938b s422a s941a s941b s942a s942b vdev vweb2 mqa www.aj s642b s407ipmi s234a s611e s827ipmi s423b s938ipmi s413ipmi s137ipmi s102390ipmi s4305ipmi s4257b webadv s1393ipmi s425ipmi s418ipmi s143ipmi s102395ipmi s424b s1004ipmi s424c s4311ipmi s613b s4354b digitalpub feedfetcher s424ipmi s802a s412ipmi s4157ipmi s1009ipmi s4316ipmi gravitron s637ipmi media-ext s4210a edi1 s705ipmi s429ipmi liquidweb s1015ipmi wwwi1 regie proline wwwi2 clipper s426b wwwi3 s920ipmi s1021ipmi rails2 238 s805b web1590 s4327ipmi holytrinity ssf s441ipmi s1302ipmi skillsoft s1026ipmi s1307ipmi s805a s1032ipmi s4338ipmi s240a s727ipmi slashcode tkc s176ipmi s4160a s1313ipmi s1037ipmi community-resources s319 raritan1 raritan3 web373 s230ipmi s1318ipmi s4349ipmi s738ipmi lucru clubforum www.ucom s807a www.hdd www.musicclub arcserv1 s1324ipmi s823b s4355ipmi s242b s404 s405 s242c s407 ns2.barrie localnnf wms7 s423 s1329ipmi s741 smtp-temp clouddevnnf devnnf cloudnnf s208ipmi s828ipmi s827 s4310ipmi s1335ipmi s4322b vigilantes www.webnews s4180ipmi bdh mi1 s4101ipmi simpleviewftp s501 saptest homo dildo xtive s502 s503 newdevapps promo3 s504 s505 s506 s507 s508 s214ipmi s1341ipmi s4260ipmi www.speakup s4106ipmi s47a s47b afk aph blt range s219ipmi urm ifg s49a s50b s49c s50d s1346ipmi s4220ipmi s4112ipmi s811b suita s53c s501ipmi onlinetutor s4267b imd s4140a s225ipmi s603 s604 enquiry s605 s606 inbtest s607 s608 s609 moblin atl-sql-serv.dc02 pcos s612 s1352ipmi s614 imageupload origin-staging s615 s616 s617 s618 xandros s621 slax knoppix s4170ipmi s623 s4117ipmi s625 s626 cheatcode aznakaevo testv3 habboville s623a s629 s631 kirishi s632 s633 chns rtd s635 atd cdn7 cdn6 cdn0 s636 s637 s638 fb0 s506ipmi sechs academi livraria s641 remote01.co remote02.co wolfman.co cocatnt06.co cocatnt18.co library.co s642 idd s231ipmi s646 s58d s1357ipmi s4134b s522ipmi s4123ipmi www.bpm fti s4130ipmi astoc s608ipmi s512ipmi s236ipmi s63b s63c s701 pueraria s702 s703 ns7.x s704 s1363ipmi s706 report.dev s435e s708 internal230.dev fundir s709 s711 s1350a ns4.x ns3.l s4128ipmi nugget pdu5-1 ftp201 rw3 s1350b s722 s4270a 6789 internal201 s724 6666 internalfc.dev web1610 web2290 rebates web431 webupload201 masseffect microchip s4270b admin201 s517ipmi s242ipmi internal.dev ftp202 webupload202 internalru.dev s737 ns2.x s738 esc123 s436a s742 s743 s744 dhcp-37-29 s745 host-209-149-115-165 host-209-149-115-60 host-209-149-115-93 host-209-149-115-96 host-209-149-115-209 host-209-149-115-160 host-209-149-115-158 host-209-149-114-251 host-209-149-115-90 host-209-149-114-249 host-209-149-115-89 host-209-149-114-247 host-209-149-115-152 host-209-149-115-77 host-209-149-115-143 host-209-149-116-7 host-209-149-115-228 host-209-149-115-150 host-209-149-114-99 host-209-149-114-98 host-209-149-114-97 host-209-149-114-96 host-209-149-114-95 host-209-149-114-94 host-209-149-114-93 host-209-149-114-9 host-209-149-114-91 host-209-149-114-89 host-209-149-114-88 host-209-149-114-87 host-209-149-114-86 host-209-149-114-8 host-209-149-114-84 host-209-149-114-83 host-209-149-114-82 tisiphone host-209-149-114-81 host-209-149-114-79 host-209-149-114-240 bu01 host-209-149-114-77 host-209-149-114-38 host-209-149-114-75 host-209-149-114-74 host-209-149-114-73 host-209-149-114-6 host-209-149-114-71 bio313 s1368ipmi s747 host-209-149-114-69 host-209-149-114-68 host-209-149-114-67 host-209-149-114-209 host-209-149-114-5 host-209-149-114-64 host-209-149-114-63 host-209-149-114-62 host-209-149-114-61 host-209-149-114-59 host-209-149-114-4 charpac host-209-149-114-57 host-209-149-114-56 host-209-149-114-55 host-209-149-114-54 host-209-149-114-53 host-209-149-114-3 host-209-149-114-51 s748 s1103ipmi s4134ipmi s1460ipmi hrlaser s523ipmi s436f s4140b host-209-149-114-49 s814b s1374ipmi host-209-149-114-48 host-209-149-114-47 host-209-149-114-46 host-209-149-114-234 host-209-149-114-44 web1615 host-209-149-114-43 host-209-149-114-42 host-209-149-114-41 host-209-149-114-39 host-209-149-114-233 host-209-149-114-37 host-209-149-114-36 host-209-149-114-35 host-209-149-114-34 host-209-149-114-33 s1108ipmi s803 suzuki2 s744ipmi s805 s806 s4139ipmi s809 s812 s813 s814 host-209-149-114-232 host-209-149-114-31 host-209-149-114-29 host-209-149-112-255 host-209-149-112-254 host-209-149-112-253 host-209-149-112-252 host-209-149-112-251 host-209-149-112-250 host-209-149-112-248 host-209-149-112-247 host-209-149-112-246 host-209-149-112-245 host-209-149-112-244 host-209-149-112-243 host-209-149-112-242 host-209-149-112-241 host-209-149-112-239 host-209-149-112-238 host-209-149-112-237 host-209-149-112-236 host-209-149-112-235 host-209-149-112-234 host-209-149-112-233 host-209-149-112-232 host-209-149-112-231 host-209-149-112-229 host-209-149-112-228 host-209-149-112-227 host-209-149-112-226 host-209-149-112-225 host-209-149-112-224 host-209-149-112-223 host-209-149-112-222 host-209-149-112-221 host-209-149-112-219 host-209-149-112-218 host-209-149-112-217 host-209-149-112-216 hiraki host-209-149-112-215 host-209-149-112-214 host-209-149-112-213 host-209-149-112-212 host-209-149-112-211 host-209-149-112-210 host-209-149-112-198 host-209-149-112-197 host-209-149-112-196 host-209-149-112-205 host-209-149-112-194 host-209-149-112-193 host-209-149-112-192 host-209-149-112-191 host-209-149-112-189 host-209-149-112-188 host-209-149-112-187 host-209-149-112-186 host-209-149-112-185 host-209-149-112-184 host-209-149-112-183 host-209-149-112-182 s815 host-209-149-112-181 host-209-149-112-180 host-209-149-112-178 host-209-149-112-177 host-209-149-112-176 host-209-149-112-175 s819 host-209-149-112-174 host-209-149-112-173 dscp1 host-209-149-112-172 cva host-209-149-112-171 pdb1 host-209-149-112-170 www.parents host-209-149-112-168 yourgames acrossthepond host-209-149-112-167 host-209-149-112-166 host-209-149-112-165 host-209-149-112-164 s804ipmi host-209-149-112-163 host-209-149-112-162 host-209-149-112-161 host-209-149-112-160 host-209-149-112-158 host-209-149-112-157 host-209-149-112-156 host-209-149-112-155 host-209-149-112-154 host-209-149-112-153 host-209-149-112-152 host-209-149-112-151 host-209-149-112-150 host-209-149-112-148 host-209-149-112-147 host-209-149-112-146 host-209-149-112-145 sonorous host-209-149-112-144 host-209-149-112-143 host-209-149-112-142 zorin host-209-149-112-141 ksys host-209-149-112-140 host-209-149-112-138 kimono pontvisio pstage afaf host-209-149-112-137 host-209-149-112-136 host-209-149-112-135 host-209-149-112-134 ikkome akamal host-209-149-112-133 host-209-149-112-132 host-209-149-112-131 host-209-149-112-130 host-209-149-112-128 host-209-149-112-127 host-209-149-112-126 host-209-149-112-125 host-209-149-112-124 vere host-209-149-112-123 host-209-149-112-122 host-209-149-112-121 host-209-149-112-120 host-209-149-112-118 mprobst ucats host-209-149-112-117 host-209-149-112-116 host-209-149-112-115 mega10 host-209-149-112-114 host-209-149-112-113 fujiwara jest host-209-149-112-112 apex2 host-209-149-112-111 host-209-149-112-110 host-209-149-112-108 host-209-149-112-107 host-209-149-112-106 host-209-149-112-105 host-209-149-112-104 host-209-149-112-103 ems01 host-209-149-112-102 host-209-149-112-101 host-209-149-112-100 mancini biomet host-209-149-114-206 hibo host-209-149-115-112 host-209-149-114-205 host-209-149-114-204 web1930 comit conceptmart host-209-149-115-110 host-209-149-112-209 ghsaedge host-209-149-114-202 host-209-149-114-201 ghswebedge host-209-149-114-190 host-209-149-115-207 host-209-149-115-200 host-209-149-115-104 host-209-149-115-45 vocalise host-209-149-115-87 host-209-149-115-86 host-209-149-115-85 host-209-149-115-84 locals domingo host-209-149-115-83 host-209-149-114-182 host-209-149-116-29 host-209-149-115-81 host-209-149-114-180 host-209-149-116-27 host-209-149-115-78 host-209-149-116-26 host-209-149-115-136 bc03 pharmacist host-209-149-114-177 host-209-149-115-29 host-209-149-115-76 host-209-149-115-75 host-209-149-116-23 host-209-149-115-62 host-209-149-114-58 host-209-149-116-30 host-209-149-115-73 host-209-149-115-222 host-209-149-115-72 host-209-149-115-202 host-209-149-116-20 host-209-149-115-71 brainbus host-209-149-114-170 host-209-149-115-59 host-209-149-115-68 host-209-149-115-130 host-209-149-116-16 leciel host-209-149-115-215 host-209-149-115-208 epforum host-209-149-115-66 host-209-149-116-14 caruso sniegs host-209-149-115-65 host-209-149-114-164 gamay estaticos host-209-149-115-50 diario web513 web516 host-209-149-115-63 host-209-149-115-198 fw0 www.games2 host-209-149-115-206 host-209-149-116-10 host-209-149-115-61 host-209-149-114-230 itorapp host-209-149-114-160 host-209-149-115-58 host-209-149-115-57 host-209-149-115-213 host-209-149-113-250 host-209-149-114-155 host-209-149-114-154 host-209-149-115-53 host-209-149-115-37 host-209-149-115-74 host-209-149-115-52 host-209-149-115-212 cfusion host-209-149-114-150 host-209-149-115-48 host-209-149-115-47 host-209-149-115-46 host-209-149-113-240 host-209-149-114-7 host-209-149-115-221 host-209-149-115-44 host-209-149-115-43 host-209-149-114-142 host-209-149-114-141 host-209-149-114-92 host-209-149-114-139 host-209-149-114-140 host-209-149-114-138 host-209-149-114-225 host-209-149-114-90 gmmcgrnappisc01.gmmc host-209-149-114-137 host-209-149-114-136 host-209-149-115-92 host-209-149-113-230 host-209-149-114-20 host-209-149-114-135 host-209-149-114-134 host-209-149-114-85 host-209-149-114-133 host-209-149-114-132 onlinem host-209-149-113-225 host-209-149-115-31 uscsomgapp ntpc host-209-149-114-130 host-209-149-114-50 host-209-149-115-28 host-209-149-115-197 host-209-149-114-80 host-209-149-115-27 host-209-149-114-78 host-209-149-115-26 host-209-149-113-220 host-209-149-115-79 host-209-149-115-25 host-209-149-114-76 host-209-149-115-24 host-209-149-115-23 host-209-149-115-196 securelink host-209-149-115-22 host-209-149-115-21 host-209-149-114-72 host-209-149-114-120 host-209-149-115-18 host-209-149-115-120 host-209-149-114-70 host-209-149-114-117 spectron host-209-149-115-205 host-209-149-115-220 host-209-149-115-16 host-209-149-113-209 radius-1 host-209-149-115-15 host-209-149-114-66 host-209-149-113-208 host-209-149-115-14 host-209-149-114-65 chem3 host-209-149-113-207 host-209-149-115-13 host-209-149-113-98 host-209-149-113-206 host-209-149-116-28 host-209-149-115-12 host-209-149-115-204 host-209-149-116-25 host-209-149-116-24 host-209-149-113-205 host-209-149-116-22 host-209-149-115-11 host-209-149-114-220 host-209-149-116-18 host-209-149-116-17 host-209-149-113-204 s1420ipmi s1349ipmi s825 host-209-149-116-15 s826 s253ipmi s828 s829 s831 s832 s833 s834 s836 s837 host-209-149-114-110 host-209-149-116-13 s838 s840 s1114ipmi s4225ipmi s4145ipmi s815b host-209-149-116-12 s809ipmi s534ipmi s1370ipmi s258ipmi s438a s1119ipmi s813y s304a s627a render2 s4151ipmi s902 host-209-149-116-11 host-209-149-113-203 host-209-149-114-60 s903 s904 s905 host-209-149-113-202 host-209-149-114-45 s906 s907 host-209-149-113-201 host-209-149-115-203 s4251b s909 s912 host-209-149-113-190 host-209-149-115-42 host-209-149-115-67 host-209-149-115-192 host-209-149-114-52 host-209-149-113-183 host-209-149-115-88 host-209-149-113-99 s815ipmi host-209-149-113-97 host-209-149-113-96 rutherford host-209-149-113-95 s914 host-209-149-113-94 s915 host-209-149-113-93 host-209-149-113-92 host-209-149-113-91 host-209-149-113-89 webgroup host-209-149-113-88 s916 host-209-149-113-87 s917 host-209-149-113-86 s918 host-209-149-113-85 s264ipmi appraisal kaur host-209-149-113-180 s1330ipmi host-209-149-113-83 fesztivity host-209-149-113-82 openbravo manage1 host-209-149-113-81 mlp.fantasy host-209-149-113-79 host-209-149-113-78 portalantiguo consultpermcarga viajeroseguro mapale siginvias host-209-149-113-77 host-209-149-113-76 host-209-149-113-75 host-209-149-113-74 s922 host-209-149-113-73 host-209-149-113-72 host-209-149-113-71 s923 host-209-149-113-69 test6289 s924 s926 host-209-149-113-68 host-209-149-113-67 s928 s929 host-209-149-113-66 imagestorage s1401ipmi s932 host-209-149-113-65 s933 s1125ipmi host-209-149-113-64 host-209-149-113-63 s935 s936 host-209-149-113-62 s937 partnertest s938 grade s4355a ref1 s440a host-209-149-113-61 s4156ipmi s501a s614ipmi s821ipmi s270ipmi host-209-149-113-59 host-209-149-113-58 host-209-149-113-57 www-24 www-23 host-209-149-113-56 www-21 host-209-149-113-55 s4361ipmi host-209-149-113-54 host-209-149-113-53 host-209-149-113-52 host-209-149-113-51 host-209-149-113-49 host-209-149-113-48 host-209-149-113-47 host-209-149-113-46 host-209-149-113-45 host-209-149-113-44 host-209-149-113-43 host-209-149-113-42 host-209-149-113-41 host-209-149-113-39 host-209-149-113-38 host-209-149-113-37 s1396ipmi s1131ipmi host-209-149-113-36 host-209-149-113-35 host-209-149-113-34 www-10 host-209-149-113-33 host-209-149-113-32 s4162ipmi www-12 www-20 host-209-149-113-31 host-209-149-113-29 host-209-149-113-28 host-209-149-113-27 web1879 host-209-149-113-26 host-209-149-113-25 ew53680r99pzgc s830ipmi host-209-149-113-170 www-11 host-209-149-113-23 docdir dlink1 host-209-149-113-21 eas2 dlink2 dlink3 host-209-149-113-19 host-209-149-113-18 host-209-149-113-17 host-209-149-113-16 host-209-149-113-15 host-209-149-113-14 host-209-149-113-13 host-209-149-113-12 host-209-149-113-11 host-209-149-113-10 dlink4 host-209-149-114-32 host-209-149-114-40 s826ipmi s1239ipmi s1412ipmi s1136ipmi s629a s1406b s4167ipmi s1465ipmi s818a s834b s1417ipmi s4173ipmi s4120b s837ipmi s631a s1423ipmi s820a s4231ipmi s710ipmi s4178ipmi s313a s302ipmi s612f s1428ipmi s1310 s1109ipmi s4184ipmi hyman host-209-149-114-30 s821a hb2 s912b host-209-149-114-28 host-209-149-113-80 host-209-149-114-27 s307ipmi s255b host-209-149-113-160 s4138ipmi host-209-149-114-26 s1434ipmi s620ipmi s904ipmi prodigy s4217a s313ipmi s1358a s1439ipmi host-209-149-114-25 host-209-149-115-254 host-209-149-115-253 s1358b s4205ipmi biomedic s1019ipmi host-209-149-115-252 s318ipmi host-209-149-115-251 s919a host-209-149-115-249 host-209-149-114-24 s634a s1445ipmi s805ipmi s634b host-209-149-115-247 cisco10-1 host-209-149-115-246 cisco10-2 host-209-149-115-245 host-209-149-115-244 host-209-149-115-243 s4211ipmi s1360a host-209-149-112-249 host-209-149-115-241 host-209-149-115-239 host-209-149-115-238 host-209-149-115-237 host-209-149-115-236 test6298 host-209-149-114-22 s823a test6299 web619 host-209-149-115-234 web623 web626 web630 host-209-149-115-233 web3190 web636 host-209-149-115-232 web639 host-209-149-115-231 web643 host-209-149-115-229 noether host-209-149-114-21 host-209-149-115-227 host-209-149-115-226 host-209-149-115-225 host-209-149-115-224 host-209-149-115-223 host-209-149-114-19 host-209-149-113-90 host-209-149-115-219 host-209-149-115-218 host-209-149-115-217 host-209-149-115-216 host-209-149-114-18 host-209-149-115-214 host-209-149-113-70 aslonline host-209-149-115-132 host-209-149-115-211 host-209-149-115-199 host-209-149-114-17 gmmcgrnappisc01 host-209-149-113-150 host-209-149-115-195 enctech host-209-149-115-194 host-209-149-115-193 web1009 host-209-149-114-16 host-209-149-115-191 host-209-149-115-189 host-209-149-115-188 host-209-149-115-187 host-209-149-115-186 host-209-149-114-15 host-209-149-115-184 host-209-149-115-183 host-209-149-115-182 kamery host-209-149-115-181 host-209-149-115-179 host-209-149-114-14 host-209-149-115-177 web1013 host-209-149-115-176 host-209-149-115-175 host-209-149-115-174 host-209-149-115-173 lending host-209-149-114-13 host-209-149-115-171 mail.dev2 host-209-149-115-169 s4224b s1359b host-209-149-114-203 s530ipmi s324ipmi s739a host-209-149-115-167 host-209-149-115-166 s1451ipmi s4216ipmi s4102a s605ipmi host-209-149-114-12 host-209-149-115-164 host-209-149-115-163 host-209-149-115-162 host-209-149-115-161 host-209-149-115-159 host-209-149-114-11 videocms host-209-149-115-157 host-209-149-115-156 s329ipmi host-209-149-115-155 host-209-149-115-154 host-209-149-115-153 host-209-149-114-10 host-209-149-115-151 host-209-149-115-149 host-209-149-115-148 host-209-149-115-147 host-209-149-115-146 host-209-149-115-145 host-209-149-115-144 host-209-149-113-60 host-209-149-115-142 host-209-149-115-141 s1456ipmi host-209-149-115-10 host-209-149-115-138 host-209-149-115-137 host-209-149-113-140 s509 host-209-149-115-135 host-209-149-115-134 host-209-149-115-133 host-209-149-114-208 host-209-149-115-131 s101390ipmi s715ipmi host-209-149-115-129 host-209-149-115-128 hidaka host-209-149-115-127 vmhost04 login.beta host-209-149-115-126 host-209-149-115-125 ironport04 ironport03 host-209-149-115-124 host-209-149-115-123 host-209-149-115-122 host-209-149-115-121 host-209-149-115-119 host-209-149-115-118 host-209-149-115-117 login.test s4222ipmi vmax host-209-149-115-116 web1029 host-209-149-115-115 web1949 host-209-149-115-114 host-209-149-115-113 host-209-149-112-230 host-209-149-115-111 host-209-149-115-109 hs01 host-209-149-115-108 cisco11-1 uter host-209-149-115-107 host-209-149-115-106 host-209-149-115-105 securitybackup host-209-149-115-103 host-209-149-115-102 coppola host-209-149-115-101 host-209-149-115-100 cisco11-2 host-209-149-114-207 host-209-149-115-39 host-209-149-113-50 s611ipmi host-209-149-114-210 s335ipmi s1462ipmi torn-ams2 hacienda host-209-149-113-129 cp05qa005 s4260b host-209-149-112-3 s4186ipmi host-209-149-115-56 host-209-149-112-1 staging.intranet host-209-149-113-126 s1362a s1362b host-209-149-112-220 host-209-149-115-69 host-209-149-113-84 host-209-149-115-55 s616ipmi host-209-149-113-40 host-209-149-113-120 host-209-149-112-90 host-209-149-115-54 s341ipmi host-209-149-112-199 s714ipmi web3199 s1467ipmi web1039 www.dvds s913a s1202ipmi s4330ipmi s823x accounts1 s4233ipmi s4146ipmi s1320 s-109 s637b cisco12-1 s101390b cisco12-3 s101391a s101391b s1473ipmi s1207ipmi s101392b host-209-149-112-208 web700 host-209-149-112-207 s4238ipmi s101393a s101393b web691 web1046 s1219b s903ipmi web692 s627ipmi s310ipmi host-209-149-112-206 s1478ipmi s1213ipmi web703 sunet s827a fotos1 web694 s4244ipmi s535ipmi s633ipmi cisco13-1 host-209-149-112-195 host-209-149-113-30 web1050 web695 cisco13-2 cisco13-3 cisco13-4 s810ipmi s1484ipmi s1218ipmi s4249ipmi s639b s914ipmi s4106b 3333 s638ipmi s926ipmi cp05qa008 web697 s1224ipmi cobacoba s220ipmi web698 web709 cp05qa010 web713 web1059 mariachi s4255ipmi web720 ns1.barrie web721 s103ipmi web726 web1073 web729 mathlab3 web1086 s641b web1088 web1089 web1101 sva web1102 web1103 s50c s1229ipmi s4359b web1104 web124 web1105 web1096 web1107 bfa jamsession s829a web1108 s4261ipmi s830b web164 s264b web174 s4140ipmi s925ipmi s1235ipmi s4266ipmi s129ipmi web200 s4108a s910b s4256ipmi host-209-149-112-204 web221 web222 web1119 web228 web1123 web1939 host-209-149-113-110 host-209-149-112-79 s931ipmi s114ipmi host-209-149-112-203 web1129 test6339 s1241ipmi s4272ipmi s1001b s936ipmi web325 web327 host-209-149-116-9 web331 web332 host-209-149-116-8 web335 web336 web337 web341 web342 web343 web344 web345 web347 web348 munin2 web350 web351 web352 web1139 web354 web355 web357 web358 web361 web362 web364 web365 web367 web368 web370 web371 web372 web374 web375 web376 web377 web381 web382 web383 web384 web385 web387 web388 web400 web401 web402 web404 web405 web407 s803b web411 web412 web413 web414 web415 web417 web418 web420 web421 web422 web1149 swta web424 web425 web426 web427 web428 web432 web433 web434 web435 s1330 web437 web438 web452 web453 web454 web455 web457 web458 web460 web461 web462 web463 web464 web465 web466 web467 web468 host-209-149-115-82 web471 web472 web474 s120ipmi web477 web478 web480 web481 web482 web484 web485 web486 web487 web501 web502 web503 web504 web505 web507 web508 web510 web511 web512 grace2 web514 web515 web517 web518 web521 web522 web523 s4110b s832a web527 web528 web530 web531 web532 web535 web536 omfg web537 web538 web541 web542 web543 s4350ipmi web544 web545 web547 s266b web548 host-209-149-112-202 web607 web608 web611 web612 host-209-149-116-5 web613 web614 web615 web616 web617 web618 web620 web621 architekt new-test web622 web624 host-209-149-116-4 web625 web627 web628 web631 web632 web633 web634 s942ipmi web635 web637 web638 web640 web641 web642 web644 web645 web646 web647 web648 web651 web652 web653 web654 web655 web657 web658 web661 web662 host-209-149-116-2 web664 web665 web666 web667 web671 web672 web673 web674 web677 web678 web680 web681 web682 pweb web684 web685 cloudy web686 web687 web688 web701 web702 web704 web705 web707 web708 web710 web711 web712 web714 host-209-149-115-201 web715 web716 web718 s1002a web722 web723 web724 web725 web727 web728 web730 web326 s401ipmi web1219 web1700 s204d web330 web1226 s4351ipmi cyjy zzxx s736ipmi host-209-149-112-201 host-209-149-112-200 host-209-149-113-24 host-209-149-115-38 sdesk sko ldi myhp host-209-149-113-22 ccaa vidistar s1370a ghsavedge s1369b s406ipmi galactic host-209-149-113-20 s131ipmi s4247ipmi s1003b s1392ipmi s834a host-209-149-112-70 naumen s4301a s1409a s4301b s726a s-201a s602ipmi www.japanese s417ipmi www.french s613 host-209-149-115-70 giresun pinot pelvoux host-209-149-115-49 vercors faucon host-209-149-112-179 host-209-149-114-200 host-209-149-115-9 r03 s142ipmi s186ipmi host-209-149-115-8 s102394ipmi paquerette s1409b s1003ipmi fred1 panthere s646b ensigate s4309ipmi s238b host-209-149-115-7 malte s832ipmi s1372a vanoise s4361b sambuy godot s1372b s423ipmi hakka cocktail hanuman s4105a s622 host-209-149-115-6 s1008ipmi host-209-149-115-5 host-209-149-115-4 host-209-149-115-3 host-209-149-115-2 moring topnotch host-209-149-115-1 s4315ipmi s624 class8 groseille host-209-149-115-0 cola s704ipmi beaumont r-viallet1 v125 nefer s428ipmi s430ipmi s836a s628 s822ipmi a19 a17 s1014ipmi a15 jarl s630 s4321ipmi host-209-149-112-59 host-209-149-115-98 a07 sphynx1 a06 balboa gazon a05 mics a04 a03 s709ipmi host-209-149-112-169 traverse darhan fangio host-209-149-115-140 brenner host-209-149-112-55 neb host-209-149-115-91 mjollnir host-209-149-116-6 rude host-209-149-114-255 mtp1 amorgos host-209-149-114-254 host-209-149-114-253 andaman host-209-149-114-252 albator host-209-149-114-23 s434ipmi kayak gmmcnfuseisc01.gmmc patator host-209-149-114-248 host-209-149-112-49 host-209-149-114-246 host-209-149-114-245 host-209-149-114-244 www.stable afex getitnow www.getitnow host-209-149-114-243 www.afex host-209-149-114-242 host-209-149-114-241 host-209-149-114-239 host-209-149-114-238 s1340 host-209-149-114-237 macs s1020ipmi s4326ipmi xtender s915b host-209-149-114-236 host-209-149-114-235 host-209-149-114-2 s837b host-209-149-114-1 host-209-149-114-0 host-209-149-114-231 host-209-149-114-229 www.cx host-209-149-114-228 host-209-149-114-227 host-209-149-114-226 www.kp host-209-149-112-159 host-209-149-114-224 host-209-149-114-223 www.tn host-209-149-114-222 www.li s639 www.oscommerce host-209-149-114-221 mail.trash host-209-149-114-219 asano host-209-149-114-218 host-209-149-114-217 midorikodomo host-209-149-114-216 host-209-149-114-215 host-209-149-114-214 host-209-149-114-213 s439ipmi host-209-149-114-212 host-209-149-114-211 host-209-149-114-199 s1301ipmi shinoda s1025ipmi funayama host-209-149-114-198 host-209-149-114-197 okuda host-209-149-114-196 host-209-149-114-195 baldur host-209-149-114-194 s732ipmi host-209-149-114-193 host-209-149-114-192 host-209-149-114-191 host-209-149-114-189 www.podpora shirasaki doujin host-209-149-114-188 host-209-149-114-187 s4332ipmi kufa ganka host-209-149-114-186 sagawa host-209-149-114-185 host-209-149-114-184 host-209-149-114-183 gmmccsgisc01.gmmc host-209-149-114-181 host-209-149-114-179 host-209-149-114-178 miyoshi sasakinaika sousei s721ipmi s1407ipmi host-209-149-112-39 motomura maruyama libstats hananoki host-209-149-114-176 host-209-149-114-175 takizawa s101390 kawada s101391 s101392 shibasaki host-209-149-114-174 s101393 tsubakigaoka shigeta host-209-149-114-173 host-209-149-114-172 mysql3.sgmanaged.com turukawa s1306ipmi host-209-149-114-171 s1001a nishikawa juku host-209-149-114-169 host-209-149-114-168 suzumura 1206 host-209-149-114-167 mizonokuchi s1031ipmi s4214a host-209-149-114-166 s1002b host-209-149-114-165 host-209-149-114-163 s1343 host-209-149-114-162 host-209-149-114-161 s1003a s1301a host-209-149-114-159 s175ipmi s1004a jpo1 host-209-149-114-158 host-209-149-114-157 host-209-149-114-156 host-209-149-112-149 s1004b host-209-149-113-210 host-209-149-114-153 host-209-149-114-152 s917ipmi logon2 host-209-149-114-151 host-209-149-114-149 host-209-149-114-148 s1312ipmi www.dominio host-209-149-114-147 marcon s1005a host-209-149-114-146 www.tolyatti s1005b nizhniy-tagil host-209-149-114-145 s1036ipmi www.photoshop s310a s4343ipmi host-209-149-114-144 host-209-149-114-143 host-209-149-113-9 s840a host-209-149-113-8 host-209-149-113-7 1346 s1006a s505b s1007a s1003 s1005 host-209-149-113-6 host-209-149-113-5 s1006 host-209-149-113-4 host-209-149-113-3 s1007 inns s1008a sipeg host-209-149-113-2 www.rostov-na-donu host-209-149-113-1 hd2 host-209-149-113-0 cyw s1009b host-209-149-114-131 host-209-149-114-129 host-209-149-114-128 ncs2 host-209-149-114-127 host-209-149-114-126 s1021 screensavers ob2 host-209-149-114-125 host-209-149-114-124 host-209-149-114-123 monkeybutt media9 cvm1 host-209-149-114-122 host-209-149-114-121 host-209-149-114-119 host-209-149-114-118 host-209-149-112-30 host-209-149-114-116 host-209-149-114-115 host-209-149-114-114 hotornot host-209-149-114-113 rss8 autoconfig.oldsite host-209-149-114-112 host-209-149-114-111 host-209-149-114-109 host-209-149-114-108 host-209-149-114-107 host-209-149-114-106 host-209-149-114-105 dashboard2 autodiscover.oldsite host-209-149-114-104 host-209-149-114-103 host-209-149-114-102 host-209-149-114-101 host-209-149-114-100 rappelz host-209-149-112-139 gatewayproxy host-209-149-115-41 lyncextweb cmaster ghslink host-209-149-112-20 newspapers host-209-149-112-9 host-209-149-112-8 circles toe image03 image02 host-209-149-112-7 host-209-149-112-6 vps035 host-209-149-112-5 vps037 host-209-149-112-4 vps041 host-209-149-112-99 host-209-149-112-98 host-209-149-112-97 host-209-149-112-96 host-209-149-112-95 host-209-149-112-94 ranjeet host-209-149-112-93 ip25 ip24 ip22 ip21 myespace ip16 feed3 host-209-149-112-92 fif host-209-149-112-91 routerbackup host-209-149-112-89 host-209-149-112-88 www.tutos vps121 vps123 gseweryn host-209-149-112-87 host-209-149-112-86 caphus host-209-149-112-85 host-209-149-112-84 countyline host-209-149-112-83 host-209-149-112-82 filter01 host-209-149-112-81 host-209-149-112-80 sb01 wap01 host-209-149-112-78 host-209-149-112-77 host-209-149-112-76 host-209-149-112-75 vps040 host-209-149-112-74 host-209-149-112-73 host-209-149-112-72 host-209-149-112-71 host-209-149-112-69 host-209-149-112-68 routerwifi host-209-149-112-67 fns1 vps122 lecerta host-209-149-112-66 host-209-149-112-65 host-209-149-112-64 from-atm freitag cauta host-209-149-112-63 host-209-149-112-62 pictor spex host-209-149-112-61 northeast wmb from-gts hp3050 previews host-209-149-112-60 host-209-149-112-58 slserver host-209-149-112-57 host-209-149-112-56 host-209-149-112-54 wc4 host-209-149-112-53 www.siberia corrus fns2 www.arkhangelsk www.entekhabat prestasklep hp1522 koenig burg host-209-149-112-52 tjumen entekhabat host-209-149-112-51 centralka www.odesa kolpino tweglinska www.stuttgart rejestracja.scs sagita www.finlandia emon www.estonia atm-ksk host-209-149-112-50 berdyansk dulo dgma economicas www.phystech sklep_test sinxron teresardp host-209-149-112-48 www.latvia nlpro kishinev www.nightclub wirelesscontroller host-209-149-112-47 kharkiv host-209-149-112-46 ternopol rdp3 ak-to-ksk www.hse www.dnepr leopoldina www.reflex host-209-149-112-45 vyatka host-209-149-112-44 ksk-to-ak finlandia marica teresardp2 host-209-149-112-43 www.msu booth www.viborg www.kirovograd campos albus viborg www.derbent quested www.volga omega7 autoconfig.stamps www.ehr saintpetersburg host-209-149-112-42 aviv webdisk.stamps mendes vinnica cev host-209-149-112-41 www.uzbekistan huodong cej www.tuts host-209-149-112-40 phystech autodiscover.stamps autoconfig.host2 autodiscover.host2 www.prague mgu www.ukraine www.new-york dro www.umnik host-209-149-112-38 host-209-149-112-37 host-209-149-112-36 hermod host-209-149-112-35 www.vyborg www.petersburg host-209-149-112-34 umnik coi1 rovno host-209-149-112-33 123a host-209-149-112-32 host-209-149-112-31 host-209-149-112-29 www.luk host-209-149-112-28 enformatik h3c www.albus host-209-149-112-27 host-209-149-112-26 host30 host-209-149-112-25 host-209-149-112-24 valentines social1 cryptonector data7 host-209-149-112-23 host-209-149-112-22 unql darcy host-209-149-112-21 serv15 michelson host-209-149-112-19 host-209-149-112-18 host-209-149-112-17 host-209-149-112-16 sb02 host-209-149-112-15 host-209-149-112-14 host-209-149-112-13 host-209-149-112-12 host-209-149-112-11 axia host-209-149-112-10 host-209-149-115-51 host-209-149-115-36 solusvm1 ssl-test 64studio host-209-149-115-250 host-209-149-115-248 host-209-149-115-80 cl04 cl03 customers2 host-209-149-112-109 host-209-149-115-64 host-209-149-115-35 ghscontent host-209-149-115-242 officetracker host-209-149-115-240 host-209-149-115-30 host-209-149-115-34 therejects www.theartofwar dfserver host-209-149-116-1 symfony host-209-149-113-200 host-209-149-112-129 dspc playready host-209-149-115-235 oldserver ghsedge host-209-149-115-33 resolver3 unicampus host-209-149-115-19 host-209-149-115-230 homeaccess patrons host-209-149-115-32 host-209-149-112-2 www.ravens lostsouls corail diable www.almuslim host-209-149-115-210 host-209-149-115-95 pcencryption bego cp10 www.angelsofdeath arago www.sadia host-209-149-113-255 www.sadik nbd host-209-149-113-254 host-209-149-113-253 www.salah oddfellow host-209-149-113-252 amgm host-209-149-113-251 host-209-149-113-249 host-209-149-113-248 host-209-149-113-247 host-209-149-113-246 www.iwonko host-209-149-113-245 host-209-149-113-244 host-209-149-113-243 host-209-149-113-242 host-209-149-113-241 host-209-149-113-239 jazan www.sandanski theelites safeguard www.ayman ait3 dolph testserver5 www.realdeal housekeeper ravens www.forgottencoast businesstechnology www.theforum host-209-149-113-238 offerte host-209-149-113-237 host-209-149-113-236 presentatie host-209-149-113-235 www.therejects host-209-149-113-234 www.tur vcsmtp www.naughty host-209-149-113-233 postyourstuff www.attorneybrisbane iwonko hashembaddad www.salvation host-209-149-113-232 xbox36o www.maarouf www.jedimasters host-209-149-113-231 konferens nsider attorneybrisbane www.lostandfound www.toontown www.faisal1 host-209-149-113-229 host-209-149-113-228 www.lucky13 ivpn www.elmagic nexusforums ebrahim www.christianity abc4 www.izaphod braca wowguild poinx cas02 host-209-149-113-227 host-209-149-113-226 utility5 gmmcctxwebisc05.gmmc host-209-149-113-224 host-209-149-113-223 jxxy bg2 host-209-149-113-222 fetch host-209-149-113-221 www.inc mypanel host-209-149-113-219 host-209-149-113-218 occa host-209-149-113-217 nortech host-209-149-113-216 enviro kna lietuva tools2 tinar obits www.ligamistrzow ligamistrzow t001 vn1 bossa neotelecom completel host-209-149-113-215 drywall webdisk.casino radis r10 host-209-149-113-214 geisha host-209-149-113-213 radius02 dhcp05 host-209-149-113-212 autoconfig.resources autodiscover.resources host-209-149-113-211 webdisk.resources tfl bluefish host-209-149-113-199 host-209-149-113-198 ultima2 hanley sasha0 wheelers host-209-149-113-197 venik localhost.nano izida host-209-149-113-196 host-209-149-113-195 polimer autoconfig.thailand autodiscover.thailand host-209-149-113-194 elbrus www.commerce host-209-149-113-193 host-209-149-113-192 host-209-149-113-191 host-209-149-113-189 host-209-149-113-188 host-209-149-113-187 host-209-149-113-186 host-209-149-113-185 host-209-149-113-184 webdisk.islam autoconfig.islam gmmcctxcsgisc01.gmmc host-209-149-113-182 host-209-149-113-181 autodiscover.islam baze host-209-149-113-179 mailgva autodiscover.board wende autoconfig.board wishes darkblue whistleblower host-209-149-113-178 dui xcache host-209-149-113-177 host-209-149-113-176 host-209-149-113-175 host-209-149-113-174 www.acp host-209-149-113-173 host-209-149-113-172 host-209-149-113-171 host-209-149-113-169 host-209-149-113-168 host-209-149-113-167 host-209-149-113-166 host-209-149-113-165 host-209-149-113-164 host-209-149-113-163 host-209-149-113-162 host-209-149-113-161 host-209-149-113-159 soha host-209-149-113-158 host-209-149-113-157 host-209-149-113-156 host-209-149-113-155 mysqldumper valuation clipart www.webhost dudley host-209-149-113-154 tristar host-209-149-113-153 r1softbackup1 wgy flv3 pth rpsp xle lingqcentral-de monitorizacion owatest host-209-149-113-152 lingqcentral-cs lingqcentral-ru lingqcentral-en host-209-149-113-151 lingqcentral-th www.delivery.platform lingqcentral-es host-209-149-113-149 ked lingqcentral-sv blogsetup lingqcentral-tr google-translate host-209-149-113-148 lingqcentral-fr host-209-149-113-147 mx15 mx16 lingqcentral-zh-tw lingqcentral-ja host-209-149-113-146 host-209-149-113-145 lingqcentral-hu staging.community lingqcentral-zh-cn chogori lingqcentral-it host-209-149-113-144 lingqcentral-ko lingqcentral-lt host-209-149-113-143 lingqcentral-lv lingqcentral-nl lingqcentral-beta lingqcentral-ar lingqcentral-pl host-209-149-113-142 www.apitest tennant shopdev donald6 donald5 host-209-149-113-141 sql03 lingqcentral-pt formazione narzedzia host-209-149-113-139 aberfoyle differenttan midy1dev chatterbirds-qa fullrefund eltelby seriouscallersonly gaghalfrunt offler ofetta cendrawasih host-209-149-113-138 fenchurch hotblackdesiato polyhymnia bobjobdev ithoughthewaswithyou host-209-149-113-137 goyourownway kidzglobal asnaf doji ethicsgradient howandaland karluvmost blartversenwald ipl kirsten-host host-209-149-113-136 perrycox shahrdari basicspi somuchforsubtlety prazskyhrad notwantedonvoyage cargocult arthurdent vstore gallagher vps.unilux host-209-149-113-135 kirsten2 uninvitedguest jaundicedoutlook redalien elliott oidong giediprime foreigner callioper mendeddrum iuliar deathsdomain stemcell djelibeybi eccentricagallumbits tradesurplus wuziprack dedicatedservers brentcrude sb-us1 dolcefarniente iqgeek spacemonster bigsexybeast host-209-149-113-134 dpcs01 hummakavula sb-at1 sb-at2 helenar backups.unilux dresseduptoparty david2 chatterbirds-dev limitingfactor medialibrary nervousenergyr bacula-s1 babelfish galaxyfx-vps hildesheim host-209-149-113-133 domitia ngs01 staremesto epunk porcia mountlofty lofty serviceforhosting justpassingthrough tiamatr dns-br www.acm miriel www.redes magnumderby worralorrasurfa edgeofseventeen lth-ns2 prostetnicvogonjeltz host-209-149-113-132 younaughtymonsters host-209-149-113-131 host-209-149-113-130 palyang lucillar sb-us2 nineveh arresteddevelopment salusasecundus w31fmt2 socalpai elliotreid freeserver www.naturaleza ciat lth-ns1 dishoftheday wunderwuzis humerdev bobkelso onlyslightlybent livefeed melian triadian midy2dev veetvoojagig cant karluvmostr dormouse cyrener nervousenergy melqart twoflower clearairturbulence fateamenabletochange theshaymen carthage yoodenvranx angelface halletcove host-209-149-113-128 feanor ignacio unfortunateconflictofevidence nofixedabode enviroinfo pompeia www2.epunk networkclean coventgarden cg-gw-prg1 orienta securecommercesite msx001 snapshot1 zarniwoopvanharl host-209-149-113-127 verylittlegravitasindeed youllthankmelater coffeenostra fortytwo ghsms ovz-s1 host-209-149-113-125 nevertalktostrangers mdh congenitaloptimist welliwasintheneighbourhood porkbellies finetillyoucamealong cosifantutte aphroditer carthagor justreadtheinstructions wunziprack llamedos zaphodbeeblebrox host-209-149-113-124 bidev lobsangludd hanovere irregularapocalypse malastrana host-209-149-113-123 chatterbirds bidpunk-db nomoremrniceguy lovina subtleshiftinemphasis krtek waterstones abrissbirne host-209-149-113-122 tacticalgrace spinningtop attitudeadjuster www.ciat hurlingfrootmig emupoint pico1 host-209-149-113-121 highurtenflurst biddingbedangdev cg-gw-fmt2 ankhmorpork secureserver growthr prostheticconscience donttrythisathome blandford problemchild v-cust-vps168 partialphoticboundary ldexw3h trintagula nowwetryitmyway foocity wowbagger frankexchangeofviews lallafa rhiannonr prazskejaro cygnusx1 strangerheremyself armchairtraveller theshades ashipwithaview ns1-praha kashnkari host-209-149-113-119 ofcourseistillloveyou bennybunny virtualprivateserver hanoverer reospeedwagon host-209-149-113-118 utro www.policy cultural divisions helios2 host-209-149-113-117 fabro oastest host-209-149-113-116 dhcp0 host-209-149-113-115 sslvpn1 webdisk.malaysia sqtest host-209-149-113-114 host-209-149-113-113 autoconfig.malaysia ams1 ams3 clamp autodiscover.malaysia pol1 www.inst host-209-149-113-112 host-209-149-113-111 www.tutoriales host-209-149-113-109 host-209-149-113-108 hopkins www.real-estate citech webdisk.scratchcard webdisk.flash autoconfig.journal www.hopkins financial-planning hedwig autodiscover.journal www.periodismo mailmems absensi host-209-149-113-107 www.trials host-209-149-113-106 awr host-209-149-113-105 host-209-149-113-104 host-209-149-113-103 demoblog cui host-209-149-113-102 host-209-149-113-101 panel4 rbk host-209-149-113-100 host-209-149-115-190 onu bolsatrabajo host-209-149-115-94 presnya host-209-149-115-185 cloudm host-209-149-115-40 host-209-149-115-180 rodica host-209-149-115-178 yna ysd saladeprensa host-209-149-115-99 opinasantafe coreo coordsantafe jalalpa territorialsanangel tolteca planparcialsantafe img.php host-209-149-115-139 host-209-149-112-119 host-209-149-115-20 host-209-149-115-172 somgftp koran host-209-149-115-170 host-209-149-115-168 ip220-116 ip220-193 cs10 ip220-194 ip204-9 ip204-7 cs14 cs21 host-209-149-115-97 cs29 host-209-149-115-17 myvps cs9 ip204-5 ip204-4 inscripciones intercambios smtp.zimbra autoconfig.toko d1-7 d1-6 ip204-99 poaui hipernet webdisk.imobiliaria imobiliaria webdisk.projetos autodiscover.toko internal202 voyance naturaleza ip204-98 interspire ip204-97 ip204-96 ip204-95 ip204-94 sendit www.dent ip204-93 ip204-92 commune ip204-89 ip204-88 kerrigan ip204-87 ip204-86 ip204-85 ip204-84 ip204-83 ip204-82 ip204-81 ip204-79 ip204-78 ip204-77 ip204-76 ip204-75 ip204-74 ip204-73 tw.member tw.portal tw.class ip204-72 ip204-71 host36 www.nutricion lekarstva ip204-68 tulum ns1.x ip204-67 ip204-66 ip204-65 stuweb ip204-64 card1 kxx ip204-63 ip204-62 josie ns3.x ip204-61 ip204-59 parkes gebuilding.hol upsmon leach ns5.x ns6.x ip204-58 alex7 ip204-57 autoconfig.art khp ip204-56 cuthbert ip204-55 decs autodiscover.art ip204-54 ip204-53 ip204-52 printserver2 ip204-51 ip204-49 linux03 ip204-48 venturi ip204-47 ip204-46 giftcards erecord deianira ip204-45 ip204-44 ssotest3 ip204-41 ip204-39 ip204-38 cornell helicon keylogger ip204-37 ip204-35 www.newsroom www.premier vdesk www.intercambios ip204-34 ip204-33 ip204-32 ip204-31 alderaan www.frontpage ip204-27 ip204-26 www.slots taw tdd kurzy fotokonyv kpe qubit ip204-25 kroeber ip204-24 www88 www109 cdu jueves www243 ip204-22 bigfarm www89 ip204-21 ip204-19 ip204-18 ip204-17 ip204-15 www.bigfarm development1 ip204-14 streamtest yudian www.sqladmin activecollab beta15 bladerunner webdisk.s1 smtpext brel trium www.cgi autodiscover.stats sirius2 autoconfig.stats navneet fangorn local1 sawneeexc10b sawneeexc sawneearcsrv krc sawneecas2 sawneecas1 sawneearcgis sawneeexc07 sawneesftp sawneeexcfrt www.cazari cazari sawneemail sawneeecx10a sawneelync ray1122 eao dhcp253 dhcp252 dhcp251 dhcp250 dhcp248 dhcp247 dhcp246 dhcp245 dhcp244 dhcp243 dhcp242 dhcp241 dhcp239 dhcp238 dhcp237 dhcp236 dhcp235 dhcp234 dhcp233 dhcp232 dhcp231 dhcp229 dhcp228 dhcp227 dhcp226 dhcp225 dhcp224 dhcp223 dhcp222 dhcp221 dhcp219 dhcp218 dhcp217 dhcp216 dhcp215 dhcp214 dhcp213 dhcp212 dhcp199 dhcp198 dhcp197 dhcp196 dhcp195 dhcp204 dhcp203 dmn dhcp192 dhcp200 meteoweb burwood dhcp249 dhcp240 dhcp230 dhcp220 dhcp211 dhcp210 dhcp208 dhcp207 dhcp206 dhcp205 dhcp194 dhcp193 dhcp202 dhcp201 aristote yeu dhcp209 maslo snb hi-fi website-promotion www.website-promotion www.web-designing web-designing carlisle aboshop qwerty1234 game4 400 suddenattack fb-app ip204-13 chuangye alberich ip204-12 corwin eridanus mihir asiansensation sexmovies steak netx ccadmin www.mpl mailserver4 hardcoremovie autodiscover.oh webdisk.oh autoconfig.oh smtp-bigip jezebel tomkat bluetooth 88say discuzx www.vpc ip204-240 ip220-198 ip204-6 sp5 timr testapp1 ip204-70 ip204-43 ip204-30 ip204-28 ip204-23 ip204-10 secureforms hardcorehentai ip220-166 ip204-204 ip204-203 tinhdonphuong share1 ip204-190 smut ip204-91 ip204-90 ip204-80 ip204-69 ip204-60 ip220-156 ip204-50 ip204-42 ip204-40 ip204-36 ip204-29 ip204-16 ip220-188 ip220-187 ip220-184 ip220-182 ip220-181 ip220-179 ip220-177 ip220-172 ip220-169 ip220-168 ip220-167 ip220-165 ip220-164 ip220-161 ip220-160 ip220-158 ip220-155 ip220-153 ip220-113 megsons ip220-191 wge wct ip220-190 ip220-140 ip220-171 ip220-152 www.wi ip220-149 ip220-144 ip220-139 ip220-136 seocat qisserver ip220-133 ip220-131 ip220-128 falstaff ip220-126 ip220-122 elnath support-dev ip220-117 support-ext navidad ip220-109 ip220-107 ip220-124 bild ofi ip220-106 nol 1208 baldrick ip220-100 payslip ip204-210 lockss spare-16 spare-17 spare-18 ip204-150 ip220-119 ip204-192 xantia collaboratori ip204-182 scuba1 ip204-163 ip204-158 ditracker betaonline mobilenow ip220-115 ip204-254 ip204-253 ip204-252 ip204-251 ip204-248 ip204-247 ip204-245 yds2 ip204-243 ip204-242 ip204-241 ip204-239 ip204-237 ip204-235 ip204-234 ip204-232 ip204-231 ip204-229 ip204-228 ip204-225 ip204-224 ip204-223 ip204-219 ip204-218 ip204-217 ip204-215 ip204-214 ip204-213 ip204-179 ip204-177 ip204-175 ip204-174 ip204-173 ip204-172 bdn bunya command ip204-171 sociologia malone ip204-167 hosting7 oldsearch ip204-165 ip204-162 ip204-159 ip204-157 portsnap ip204-155 ip204-152 ikon ip204-151 ip204-147 ip204-143 bsl110 sipus ip204-141 ip204-139 ip204-137 ace01 ip204-133 ip204-132 ip204-131 ip204-129 ip204-128 ip204-127 ip204-126 www-cache v800 ip204-123 banyan poodle rhun sapdb ip204-113 ip204-112 ip204-111 origin-extras ip204-108 contributestage ip204-107 ip204-106 ip204-104 ip204-103 isl ip204-102 gcp ip204-101 hartree gamemaster ip204-100 ip220-110 v002 ip204-250 susanita samba1 ip220-129 ip204-246 ssl48 chaucer ssl27 ssl25 ssl23 ssl19 ssl17 stubbs ip204-238 ip220-189 ip220-186 ip220-185 ip220-180 ip220-176 ip220-175 ramsey ip220-173 scrabble ip220-163 ip220-148 phalanx ip220-147 manasseh krym perfmon ip220-145 ip220-141 ip220-138 ip220-134 ip220-127 ip220-125 ip220-123 ip220-121 ip220-118 ip220-114 ip220-111 ip220-105 ip220-104 ip220-102 ip220-101 ip204-212 ip204-209 www.cbt ip204-208 ip204-207 ip204-206 ip204-205 ip204-249 ip204-201 ip204-244 ip204-236 ip204-233 ip204-230 adminv3 ip204-227 ip204-226 ip204-222 ip204-221 alu tylerc d136 distr-2-out fw2-ext cms-old ip204-220 park3 pns1 ip204-216 fw1-ext georgian minichat sung nmo habboonline anitha ip204-211 clones amazinggrace alperen ip204-199 training3 www.espana urbanp ardent ip204-198 fpro davidlee vulcan2 ssl50 texas2 matche ip204-197 onlive visp server101 melc ip204-196 yangzhou lone cc7 blx lite3 ip204-195 ip204-194 ip204-193 flooding d143 peipei ip204-202 reklamy nmt byrd nvg ip204-191 os8 pga testestest ip204-189 mispel ip204-188 rsn neustar sww ip204-187 wh1 imap.mail crazy123 visacard autoloan ip204-186 ip204-185 ip204-184 vauxhall nowandzen onfire ip204-183 mike1 foreclosures spec1 arthur2 testbox kikaku dcmail2 ip220-196 ip204-181 ip204-180 hkb bullets detektiv poker2 netad xmedia patt informant hm1 hosted.by teszt2 e002 ops1 training5 ip204-178 soroosh market13 ip204-169 munro ip204-168 ip204-166 sabamail nezarat ip204-164 ip204-176 sepid mcb-erp bluemaple ssl49 redpandaplus ip204-161 hszh ip204-160 mcdonald ip204-156 titan5 newzone cs0 peek2 list2 ip220-120 ip220-197 loretta ip204-154 aurion www.siva ip204-153 ecom2 ip204-146 test987 ccmail ip204-145 coldfusion ip204-144 ip204-142 encom users1 it033605 server108 janus1 janus2 ip204-140 storm8 ip204-138 ip204-136 mtest1 navigation ip204-200 ip204-8 www.domainnames dottie system68 domainnames www.showyourcolours sfp1 ip204-135 super5 hudsons ip204-134 showyourcolours rogerfederer haider gamegame teamon2 www.apollon cessna remoteapps msx002 ip204-170 ip204-125 acadmin bolla paulsen tipweb goodwill apro jc1 sp12 ip204-120 ip204-109 sugiyama1 ip204-105 nichop ip204-117 ip204-149 hazelnut access11 ns2.cs hitech1 ns2.cc ip204-148 email5 www.forumtest koko10 ingatlan tbsoc take-survey ================================================ FILE: docker/agent/Dockerfile ================================================ # ============================================ # XingRin Agent - 轻量心跳上报镜像 # 用途:心跳上报 + 负载监控 + 版本检查 # 基础镜像:Alpine Linux (~5MB) # 最终大小:~10MB # ============================================ FROM alpine:3.19 # 构建参数:版本号 ARG IMAGE_TAG=unknown # 安装必要工具 RUN apk add --no-cache \ bash \ curl \ procps # 复制 agent 脚本 COPY backend/scripts/worker-deploy/agent.sh /app/agent.sh RUN chmod +x /app/agent.sh # 将版本号写入环境变量(运行时可用) ENV IMAGE_TAG=${IMAGE_TAG} # 工作目录 WORKDIR /app # 默认命令 CMD ["bash", "/app/agent.sh"] ================================================ FILE: docker/docker-compose.dev.yml ================================================ services: # PostgreSQL(可选,使用远程数据库时不启动) # 本地模式: docker compose --profile local-db up -d # 远程模式: docker compose up -d(需配置 DB_HOST 为远程地址) # 使用自定义镜像,预装 pg_ivm 扩展 postgres: profiles: ["local-db"] build: context: ./postgres dockerfile: Dockerfile image: ${DOCKER_USER:-yyhuni}/xingrin-postgres:${IMAGE_TAG:-dev} restart: always environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./postgres/init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh ports: - "${DB_PORT}:5432" command: > postgres -c shared_preload_libraries=pg_ivm healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine restart: always healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 server: build: context: .. dockerfile: docker/server/Dockerfile restart: always env_file: - .env environment: - IMAGE_TAG=${IMAGE_TAG:-dev} ports: - "8888:8888" depends_on: redis: condition: service_healthy volumes: # 统一挂载数据目录 - /opt/xingrin:/opt/xingrin - /var/run/docker.sock:/var/run/docker.sock # OOM 优先级:-500 保护核心服务 oom_score_adj: -500 healthcheck: # 使用专门的健康检查端点(无需认证) test: ["CMD", "curl", "-f", "http://localhost:8888/api/health/"] interval: 30s timeout: 10s retries: 3 start_period: 60s # Agent:心跳上报 + 负载监控 + 版本检查 agent: build: context: .. dockerfile: docker/agent/Dockerfile args: IMAGE_TAG: ${IMAGE_TAG:-dev} restart: always environment: - SERVER_URL=http://server:8888 - WORKER_NAME=Local-Worker - IS_LOCAL=true - IMAGE_TAG=${IMAGE_TAG:-dev} - WORKER_API_KEY=${WORKER_API_KEY} depends_on: server: condition: service_healthy volumes: - /proc:/host/proc:ro frontend: build: context: .. dockerfile: docker/frontend/Dockerfile args: IMAGE_TAG: ${IMAGE_TAG:-dev} restart: always # OOM 优先级:-500 保护 Web 界面 oom_score_adj: -500 depends_on: server: condition: service_healthy nginx: build: context: .. dockerfile: docker/nginx/Dockerfile restart: always # OOM 优先级:-500 保护入口网关 oom_score_adj: -500 depends_on: server: condition: service_healthy frontend: condition: service_started ports: - "8083:8083" volumes: # SSL 证书挂载(方便更新) - ./nginx/ssl:/etc/nginx/ssl:ro # Worker:扫描任务执行容器(开发模式下构建) worker: build: context: .. dockerfile: docker/worker/Dockerfile image: docker-worker:${IMAGE_TAG:-latest}-dev restart: "no" volumes: - /opt/xingrin:/opt/xingrin command: echo "Worker image built for development" volumes: postgres_data: networks: default: name: xingrin_network # 固定网络名,不随目录名变化 ================================================ FILE: docker/docker-compose.yml ================================================ # ============================================ # 生产环境配置 - 使用 Docker Hub 预构建镜像 # ============================================ # 用法: docker compose up -d # # 开发环境请使用: docker compose -f docker-compose.dev.yml up -d # ============================================ services: # PostgreSQL(可选,使用远程数据库时不启动) # 使用自定义镜像,预装 pg_ivm 扩展 postgres: profiles: ["local-db"] build: context: ./postgres dockerfile: Dockerfile image: ${DOCKER_USER:-yyhuni}/xingrin-postgres:${IMAGE_TAG:?IMAGE_TAG is required} restart: always environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./postgres/init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh ports: - "${DB_PORT}:5432" command: > postgres -c shared_preload_libraries=pg_ivm healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine restart: always healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 server: image: ${DOCKER_USER:-yyhuni}/xingrin-server:${IMAGE_TAG:?IMAGE_TAG is required} restart: always env_file: - .env environment: - IMAGE_TAG=${IMAGE_TAG} depends_on: redis: condition: service_healthy volumes: # 统一挂载数据目录 - /opt/xingrin:/opt/xingrin # Docker Socket 挂载:允许 Django 服务器执行本地 docker 命令(用于本地 Worker 任务分发) - /var/run/docker.sock:/var/run/docker.sock # OOM 优先级:-500 降低被 OOM Killer 选中的概率,保护核心服务 oom_score_adj: -500 healthcheck: # 使用专门的健康检查端点(无需认证) test: ["CMD", "curl", "-f", "http://localhost:8888/api/health/"] interval: 30s timeout: 10s retries: 3 start_period: 60s # ============================================ # Agent:轻量心跳上报 + 负载监控(~10MB) # 扫描任务通过 task_distributor 分发到动态容器 # ============================================ agent: image: ${DOCKER_USER:-yyhuni}/xingrin-agent:${IMAGE_TAG:?IMAGE_TAG is required} container_name: xingrin-agent restart: always environment: - SERVER_URL=http://server:8888 - WORKER_NAME=Local-Worker - IS_LOCAL=true - IMAGE_TAG=${IMAGE_TAG} - WORKER_API_KEY=${WORKER_API_KEY} depends_on: server: condition: service_healthy volumes: - /proc:/host/proc:ro frontend: image: ${DOCKER_USER:-yyhuni}/xingrin-frontend:${IMAGE_TAG:?IMAGE_TAG is required} restart: always # OOM 优先级:-500 保护 Web 界面 oom_score_adj: -500 depends_on: server: condition: service_healthy nginx: image: ${DOCKER_USER:-yyhuni}/xingrin-nginx:${IMAGE_TAG:?IMAGE_TAG is required} restart: always # OOM 优先级:-500 保护入口网关 oom_score_adj: -500 depends_on: server: condition: service_healthy frontend: condition: service_started ports: - "8083:8083" volumes: - ./nginx/ssl:/etc/nginx/ssl:ro volumes: postgres_data: networks: default: name: xingrin_network # 固定网络名,不随目录名变化 ================================================ FILE: docker/frontend/Dockerfile ================================================ # 前端 Next.js Dockerfile # 使用多阶段构建 + BuildKit 缓存优化 # ==================== 依赖安装阶段 ==================== FROM node:20-alpine AS deps WORKDIR /app # 安装 pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # 复制依赖文件 COPY frontend/package.json frontend/pnpm-lock.yaml ./ # 安装依赖(使用 BuildKit 缓存加速) RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile # ==================== 构建阶段 ==================== FROM node:20-alpine AS builder WORKDIR /app RUN corepack enable && corepack prepare pnpm@latest --activate # 复制依赖 COPY --from=deps /app/node_modules ./node_modules COPY frontend/ ./ # 设置环境变量(构建时使用) ARG NEXT_PUBLIC_API_URL ARG IMAGE_TAG=unknown ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} ENV NEXT_PUBLIC_VERSION=${IMAGE_TAG} # Docker 内部网络使用服务名 server 作为后端地址 ENV API_HOST=server # 构建(使用 BuildKit 缓存加速) RUN --mount=type=cache,target=/app/.next/cache \ pnpm build # ==================== 运行阶段 ==================== FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production # 创建非 root 用户 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs # 复制构建产物 COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" CMD ["node", "server.js"] ================================================ FILE: docker/nginx/Dockerfile ================================================ FROM nginx:1.27-alpine # 复制 nginx 配置和证书 COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf COPY docker/nginx/ssl /etc/nginx/ssl ================================================ FILE: docker/nginx/nginx.conf ================================================ worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 上游服务 upstream backend { server server:8888; } upstream frontend { server frontend:3000; } # HTTPS 反代(将证书放在 /docker/nginx/ssl 下映射到 /etc/nginx/ssl) server { listen 8083 ssl http2; server_name _; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; client_max_body_size 50m; # HTTP 请求到 HTTPS 端口时自动跳转 error_page 497 =301 https://$host:$server_port$request_uri; # 指纹特征 - 用于 FOFA/Shodan 等搜索引擎识别 add_header X-Powered-By "Xingrin ASM" always; location /api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 300s; # 5分钟,支持大数据量导出 proxy_send_timeout 300s; proxy_pass http://backend; } # WebSocket 反代 location /ws/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 86400; # 24小时,防止 WebSocket 超时 } # 前端反代 location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://frontend; } } } ================================================ FILE: docker/nginx/ssl/README.md ================================================ 此处放置你的 SSL 证书文件,例如: fullchain.pem privkey.pem ================================================ FILE: docker/postgres/Dockerfile ================================================ FROM postgres:15 # 安装编译依赖 RUN apt-get update && apt-get install -y \ build-essential \ postgresql-server-dev-15 \ git \ && rm -rf /var/lib/apt/lists/* # 编译安装 pg_ivm RUN git clone https://github.com/sraoss/pg_ivm.git /tmp/pg_ivm \ && cd /tmp/pg_ivm \ && make \ && make install \ && rm -rf /tmp/pg_ivm # 配置 shared_preload_libraries # 注意: 这个配置会在容器启动时被应用 RUN echo "shared_preload_libraries = 'pg_ivm'" >> /usr/share/postgresql/postgresql.conf.sample ================================================ FILE: docker/postgres/init-user-db.sh ================================================ #!/bin/bash set -e # 创建应用数据库(生产 + 开发) # 使用条件创建避免与 POSTGRES_DB 自动创建的数据库冲突 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "postgres" <<-EOSQL SELECT 'CREATE DATABASE xingrin' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'xingrin')\gexec SELECT 'CREATE DATABASE xingrin_dev' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'xingrin_dev')\gexec GRANT ALL PRIVILEGES ON DATABASE xingrin TO "$POSTGRES_USER"; GRANT ALL PRIVILEGES ON DATABASE xingrin_dev TO "$POSTGRES_USER"; EOSQL # 启用 pg_trgm 扩展(用于文本模糊搜索索引) psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "xingrin" <<-EOSQL CREATE EXTENSION IF NOT EXISTS pg_trgm; EOSQL psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "xingrin_dev" <<-EOSQL CREATE EXTENSION IF NOT EXISTS pg_trgm; EOSQL ================================================ FILE: docker/restart.sh ================================================ #!/bin/bash set -e cd "$(dirname "$0")" source "./scripts/common.sh" init_docker_env_with_env_check # 颜色 CYAN='\033[0;36m' GREEN='\033[0;32m' NC='\033[0m' echo -e "${CYAN}[RESTART]${NC} 重启服务..." # 尝试重启两种模式的容器 if [ -f "docker-compose.yml" ]; then ${COMPOSE_CMD} -f docker-compose.yml restart 2>/dev/null || true fi if [ -f "docker-compose.dev.yml" ]; then ${COMPOSE_CMD} -f docker-compose.dev.yml restart 2>/dev/null || true fi echo -e "${GREEN}[OK]${NC} 服务已重启" ================================================ FILE: docker/scripts/common.sh ================================================ #!/bin/bash # 公共函数库 - 被其他脚本 source 引用 # ==================== 颜色定义 ==================== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # ==================== 日志函数 ==================== log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # ==================== Docker 环境检查 ==================== check_docker() { if ! command -v docker >/dev/null 2>&1; then log_error "未检测到 docker 命令,请先安装 Docker。" exit 1 fi if ! docker info >/dev/null 2>&1; then log_error "Docker 守护进程未运行,请先启动 Docker。" exit 1 fi } # ==================== Docker Compose 命令检测 ==================== detect_compose_cmd() { if docker compose version >/dev/null 2>&1; then COMPOSE_CMD="docker compose" elif command -v docker-compose >/dev/null 2>&1; then COMPOSE_CMD="docker-compose" else log_error "未检测到 docker-compose 或 docker compose。" exit 1 fi export COMPOSE_CMD } # ==================== 环境变量文件检查 ==================== check_env_file() { if [ ! -f .env ]; then log_error "未找到 .env 配置文件。" echo " 请先根据 .env.example 创建 .env 文件。" exit 1 fi } # ==================== 数据库配置检测 ==================== detect_db_profile() { DB_HOST=$(grep -E "^DB_HOST=" .env | cut -d'=' -f2 | tr -d ' "'"'" || echo "postgres") if [[ "$DB_HOST" == "postgres" || "$DB_HOST" == "localhost" || "$DB_HOST" == "127.0.0.1" ]]; then echo "[DB] 使用本地 PostgreSQL 容器" PROFILE_ARG="--profile local-db" else echo "[DB] 使用远程 PostgreSQL: $DB_HOST" PROFILE_ARG="" fi export PROFILE_ARG } # ==================== 获取 docker 目录路径 ==================== get_docker_dir() { # common.sh 位于 docker/scripts/,所以 docker 目录是上一级 local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" echo "$(dirname "$script_dir")" } # ==================== 初始化检查(一次性调用) ==================== init_docker_env() { DOCKER_DIR="$(get_docker_dir)" cd "$DOCKER_DIR" check_docker detect_compose_cmd export DOCKER_DIR } init_docker_env_with_env_check() { init_docker_env check_env_file } ================================================ FILE: docker/scripts/init-data.sh ================================================ #!/bin/bash # # 数据初始化脚本(公共模块) # # 包含: # - 数据库迁移 # - 初始化默认引擎配置 # - 初始化字典 # - 初始化 Nuclei 模板仓库 # # 被以下脚本调用: # - install.sh(安装时) # - start.sh(启动时) # - update.sh(更新时) # set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DOCKER_DIR="$(dirname "$SCRIPT_DIR")" cd "$DOCKER_DIR" # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' log_info() { echo -e " ${GREEN}OK${NC} $1"; } log_warn() { echo -e " ${YELLOW}!${NC} $1"; } log_step() { echo -e " ${CYAN}>>${NC} $1"; } # 检查服务是否运行 check_server() { # 使用 docker compose ps 的 --format 选项获取服务状态 # 这种方式不依赖容器名称格式,只检查服务名 if ! docker compose ps --format '{{.Service}} {{.State}}' 2>/dev/null | grep -E "^server\s+running" > /dev/null; then echo "Server 容器未运行,跳过数据初始化" return 1 fi return 0 } # 等待服务就绪 wait_for_server() { log_info "等待 Server 服务就绪..." local max_attempts=30 local attempt=0 while [ $attempt -lt $max_attempts ]; do if docker compose exec -T server python backend/manage.py check &>/dev/null; then log_info "Server 服务已就绪" return 0 fi attempt=$((attempt + 1)) sleep 2 done log_warn "等待 Server 服务超时" return 1 } # 数据库迁移 run_migrations() { log_step "执行数据库迁移..." # 迁移文件应手动生成并提交到仓库,这里只执行 migrate docker compose exec -T server python backend/manage.py migrate --noinput log_info "数据库迁移完成" } # 初始化引擎配置 init_engine_config() { log_step "初始化引擎配置..." docker compose exec -T server python backend/manage.py shell -c " from apps.engine.models import ScanEngine from pathlib import Path yaml_path = Path('/app/backend/apps/scan/configs/engine_config_example.yaml') if not yaml_path.exists(): print('未找到配置文件,跳过') exit(0) new_config = yaml_path.read_text() # 检查是否已有 full scan 引擎 engine = ScanEngine.objects.filter(name='full scan').first() if engine: # 直接覆盖为最新配置 engine.configuration = new_config engine.save(update_fields=['configuration']) print(f'已更新引擎配置: {engine.name}') else: # 创建引擎 engine = ScanEngine.objects.create( name='full scan', configuration=new_config, ) print(f'已创建引擎: {engine.name}') " log_info "引擎配置初始化完成" } # 初始化字典 init_wordlists() { log_step "初始化字典..." docker compose exec -T server python backend/manage.py init_wordlists log_info "字典初始化完成" } # 初始化指纹库 init_fingerprints() { log_step "初始化指纹库..." docker compose exec -T server python backend/manage.py init_fingerprints log_info "指纹库初始化完成" } # 初始化 Nuclei 模板仓库 init_nuclei_templates() { log_step "初始化 Nuclei 模板仓库..." # 只创建数据库记录,git clone 由 install.sh 在容器外完成(支持 Git 加速) docker compose exec -T server python backend/manage.py init_nuclei_templates log_info "Nuclei 模板仓库初始化完成" } # 初始化 admin 用户 init_admin_user() { log_step "初始化 admin 用户..." docker compose exec -T server python backend/manage.py init_admin log_info "admin 用户初始化完成" } # 主函数 main() { # 解析参数 DEV_MODE=false SKIP_MIGRATION=false while [[ $# -gt 0 ]]; do case $1 in --dev) DEV_MODE=true; shift ;; --skip-migration) SKIP_MIGRATION=true; shift ;; *) shift ;; esac done echo "" echo -e "${BOLD}${BLUE}────────────────────────────────────────${NC}" echo -e "${BOLD}${BLUE} 数据初始化${NC}" echo -e "${BOLD}${BLUE}────────────────────────────────────────${NC}" echo "" if ! check_server; then return 1 fi wait_for_server || return 1 if [ "$SKIP_MIGRATION" = "false" ]; then run_migrations fi init_engine_config init_wordlists init_fingerprints init_nuclei_templates init_admin_user echo "" echo -e " ${GREEN}数据初始化完成${NC}" echo "" } # 如果直接执行此脚本 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi ================================================ FILE: docker/scripts/install-pg-ivm.sh ================================================ #!/bin/bash # pg_ivm 一键安装脚本(用于远程自建 PostgreSQL 服务器) # 要求: PostgreSQL 13+ 版本 set -e echo "==========================================" echo "pg_ivm 一键安装脚本" echo "要求: PostgreSQL 13+ 版本" echo "==========================================" echo "" # 检查是否以 root 运行 if [ "$EUID" -ne 0 ]; then echo "错误: 请使用 sudo 运行此脚本" exit 1 fi # 检测 PostgreSQL 版本 detect_pg_version() { if command -v psql &> /dev/null; then psql --version | grep -oP '\d+' | head -1 elif [ -n "$PG_VERSION" ]; then echo "$PG_VERSION" else echo "15" fi } PG_VERSION=${PG_VERSION:-$(detect_pg_version)} # 检测 PostgreSQL if ! command -v psql &> /dev/null; then echo "错误: 未检测到 PostgreSQL,请先安装 PostgreSQL" exit 1 fi echo "检测到 PostgreSQL 版本: $PG_VERSION" # 检查版本要求 if [ "$PG_VERSION" -lt 13 ]; then echo "错误: pg_ivm 要求 PostgreSQL 13+ 版本,当前版本: $PG_VERSION" exit 1 fi # 安装编译依赖 echo "" echo "[1/4] 安装编译依赖..." if command -v apt-get &> /dev/null; then apt-get update -qq apt-get install -y -qq build-essential postgresql-server-dev-${PG_VERSION} git elif command -v yum &> /dev/null; then yum install -y gcc make git postgresql${PG_VERSION}-devel else echo "错误: 不支持的包管理器,请手动安装编译依赖" exit 1 fi echo "✓ 编译依赖安装完成" # 编译安装 pg_ivm echo "" echo "[2/4] 编译安装 pg_ivm..." rm -rf /tmp/pg_ivm git clone --quiet https://github.com/sraoss/pg_ivm.git /tmp/pg_ivm cd /tmp/pg_ivm make -s make install -s rm -rf /tmp/pg_ivm echo "✓ pg_ivm 编译安装完成" # 配置 shared_preload_libraries echo "" echo "[3/4] 配置 shared_preload_libraries..." PG_CONF_DIRS=( "/etc/postgresql/${PG_VERSION}/main" "/var/lib/pgsql/${PG_VERSION}/data" "/var/lib/postgresql/data" ) PG_CONF_DIR="" for dir in "${PG_CONF_DIRS[@]}"; do if [ -d "$dir" ]; then PG_CONF_DIR="$dir" break fi done if [ -z "$PG_CONF_DIR" ]; then echo "警告: 未找到 PostgreSQL 配置目录,请手动配置 shared_preload_libraries" echo "在 postgresql.conf 中添加: shared_preload_libraries = 'pg_ivm'" else if grep -q "shared_preload_libraries.*pg_ivm" "$PG_CONF_DIR/postgresql.conf" 2>/dev/null; then echo "✓ shared_preload_libraries 已配置" else if [ -d "$PG_CONF_DIR/conf.d" ]; then echo "shared_preload_libraries = 'pg_ivm'" > "$PG_CONF_DIR/conf.d/pg_ivm.conf" echo "✓ 配置已写入 $PG_CONF_DIR/conf.d/pg_ivm.conf" else if grep -q "^shared_preload_libraries" "$PG_CONF_DIR/postgresql.conf"; then sed -i "s/^shared_preload_libraries = '\(.*\)'/shared_preload_libraries = '\1,pg_ivm'/" "$PG_CONF_DIR/postgresql.conf" else echo "shared_preload_libraries = 'pg_ivm'" >> "$PG_CONF_DIR/postgresql.conf" fi echo "✓ 配置已写入 $PG_CONF_DIR/postgresql.conf" fi fi fi # 重启 PostgreSQL echo "" echo "[4/4] 重启 PostgreSQL..." if systemctl is-active --quiet postgresql; then systemctl restart postgresql echo "✓ PostgreSQL 已重启" elif systemctl is-active --quiet postgresql-${PG_VERSION}; then systemctl restart postgresql-${PG_VERSION} echo "✓ PostgreSQL 已重启" else echo "警告: 无法自动重启 PostgreSQL,请手动重启" fi echo "" echo "==========================================" echo "✓ pg_ivm 安装完成" echo "==========================================" echo "" echo "验证安装:" echo " psql -U postgres -c \"CREATE EXTENSION IF NOT EXISTS pg_ivm;\"" echo "" ================================================ FILE: docker/scripts/setup-swap.sh ================================================ #!/bin/bash # # Ubuntu/Debian 一键开启交换分区脚本 # 用法: sudo ./setup-swap.sh [大小GB] # 示例: sudo ./setup-swap.sh 4 # 创建 4GB 交换分区 # sudo ./setup-swap.sh # 默认创建与内存相同大小的交换分区 # set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # 检查 root 权限 if [ "$EUID" -ne 0 ]; then log_error "请使用 sudo 运行此脚本" exit 1 fi # 检查是否已有交换分区 CURRENT_SWAP_KB=$(grep SwapTotal /proc/meminfo | awk '{print $2}') CURRENT_SWAP_GB=$(awk "BEGIN {printf \"%.0f\", $CURRENT_SWAP_KB / 1024 / 1024}") if [ "$CURRENT_SWAP_GB" -gt 0 ]; then log_warn "系统已有 ${CURRENT_SWAP_GB}GB 交换分区" swapon --show read -p "是否继续添加新的交换分区?(y/N) " -r if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "已取消" exit 0 fi fi # 获取系统内存大小(GB,四舍五入) TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') TOTAL_MEM_GB=$(awk "BEGIN {printf \"%.0f\", $TOTAL_MEM_KB / 1024 / 1024}") # 确定交换分区大小 if [ -n "$1" ]; then SWAP_SIZE_GB=$1 else # 默认与内存相同,最小 1GB,最大 8GB SWAP_SIZE_GB=$TOTAL_MEM_GB [ "$SWAP_SIZE_GB" -lt 1 ] && SWAP_SIZE_GB=1 [ "$SWAP_SIZE_GB" -gt 8 ] && SWAP_SIZE_GB=8 fi SWAP_FILE="/swapfile_xingrin" log_info "系统内存: ${TOTAL_MEM_GB}GB" log_info "将创建 ${SWAP_SIZE_GB}GB 交换分区: $SWAP_FILE" # 检查磁盘空间(向下取整,保守估计) AVAILABLE_GB=$(df / | tail -1 | awk '{printf "%.0f", $4/1024/1024}') if [ "$AVAILABLE_GB" -lt "$SWAP_SIZE_GB" ]; then log_error "磁盘空间不足!可用: ${AVAILABLE_GB}GB,需要: ${SWAP_SIZE_GB}GB" exit 1 fi # 创建交换文件 log_info "正在创建交换文件(可能需要几分钟)..." dd if=/dev/zero of=$SWAP_FILE bs=1G count=$SWAP_SIZE_GB status=progress # 设置权限 chmod 600 $SWAP_FILE # 格式化为交换分区 mkswap $SWAP_FILE # 启用交换分区 swapon $SWAP_FILE # 添加到 fstab(开机自动挂载) if ! grep -q "$SWAP_FILE" /etc/fstab; then echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab log_info "已添加到 /etc/fstab,开机自动启用" fi # 优化 swappiness(降低交换倾向,优先使用内存) SWAPPINESS=10 if ! grep -q "vm.swappiness" /etc/sysctl.conf; then echo "vm.swappiness=$SWAPPINESS" >> /etc/sysctl.conf fi sysctl vm.swappiness=$SWAPPINESS >/dev/null log_info "交换分区创建成功!" echo "" echo "当前交换分区状态:" swapon --show echo "" free -h ================================================ FILE: docker/scripts/setup-system-monitor.sh ================================================ #!/bin/bash # 系统监控初始化脚本:8G Swap + Netdata + OOM 保护 # 需要 root 权限运行 set -e SWAP_SIZE="8G" SWAP_FILE="/swapfile" echo "========== 系统监控初始化 ==========" # 1. 设置 Swap echo "[1/3] 配置 ${SWAP_SIZE} Swap..." if swapon --show | grep -q "${SWAP_FILE}"; then echo " Swap 已存在,跳过" else fallocate -l ${SWAP_SIZE} ${SWAP_FILE} chmod 600 ${SWAP_FILE} mkswap ${SWAP_FILE} swapon ${SWAP_FILE} # 添加到 fstab(如果不存在) if ! grep -q "${SWAP_FILE}" /etc/fstab; then echo "${SWAP_FILE} none swap sw 0 0" >> /etc/fstab fi echo " Swap 配置完成" fi # 2. 安装 Netdata echo "[2/3] 安装 Netdata..." if command -v netdata &> /dev/null; then echo " Netdata 已安装,跳过" else curl -fsSL https://get.netdata.cloud/kickstart.sh -o /tmp/netdata-kickstart.sh bash /tmp/netdata-kickstart.sh --non-interactive --stable-channel rm -f /tmp/netdata-kickstart.sh echo " Netdata 安装完成" fi # 3. 设置 Netdata OOM 保护 echo "[3/3] 配置 OOM 保护..." OOM_CONF_DIR="/etc/systemd/system/netdata.service.d" OOM_CONF_FILE="${OOM_CONF_DIR}/oom.conf" if [ -f "${OOM_CONF_FILE}" ]; then echo " OOM 保护已配置,跳过" else mkdir -p ${OOM_CONF_DIR} cat > ${OOM_CONF_FILE} << 'EOF' [Service] OOMScoreAdjust=-1000 EOF systemctl daemon-reload systemctl restart netdata echo " OOM 保护配置完成" fi echo "" echo "========== 配置完成 ==========" echo "Swap: $(swapon --show --bytes | awk 'NR==2{print $3/1024/1024/1024 " GB"}')" echo "Netdata: http://$(hostname -I | awk '{print $1}'):19999" echo "" ================================================ FILE: docker/scripts/test-pg-ivm.sh ================================================ #!/bin/bash # pg_ivm 安装验证测试 # 在 Docker 容器中测试 install-pg-ivm.sh 的安装流程 set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" CONTAINER_NAME="pg_ivm_test_$$" IMAGE_NAME="postgres:15" echo "==========================================" echo "pg_ivm 安装验证测试" echo "==========================================" # 清理函数 cleanup() { echo "" echo "[清理] 删除测试容器..." docker rm -f "$CONTAINER_NAME" 2>/dev/null || true } trap cleanup EXIT # 1. 启动临时容器 echo "" echo "[1/5] 启动临时 PostgreSQL 容器..." docker run -d --name "$CONTAINER_NAME" \ -e POSTGRES_PASSWORD=test \ -e POSTGRES_USER=postgres \ -e POSTGRES_DB=testdb \ -e PG_VERSION=15 \ "$IMAGE_NAME" echo "等待 PostgreSQL 启动..." sleep 10 if ! docker ps | grep -q "$CONTAINER_NAME"; then echo "错误: 容器启动失败" exit 1 fi # 2. 复制并执行安装脚本 echo "" echo "[2/5] 执行 pg_ivm 安装脚本..." docker cp "$SCRIPT_DIR/install-pg-ivm.sh" "$CONTAINER_NAME:/tmp/install-pg-ivm.sh" # 在容器内模拟安装(跳过 systemctl 重启,手动重启容器) docker exec "$CONTAINER_NAME" bash -c " set -e export PG_VERSION=15 echo '安装编译依赖...' apt-get update -qq apt-get install -y -qq build-essential postgresql-server-dev-15 git echo '编译安装 pg_ivm...' rm -rf /tmp/pg_ivm git clone --quiet https://github.com/sraoss/pg_ivm.git /tmp/pg_ivm cd /tmp/pg_ivm make -s make install -s rm -rf /tmp/pg_ivm echo '✓ pg_ivm 编译安装完成' " # 3. 配置 shared_preload_libraries 并重启 echo "" echo "[3/5] 配置 shared_preload_libraries..." docker exec "$CONTAINER_NAME" bash -c " echo \"shared_preload_libraries = 'pg_ivm'\" >> /var/lib/postgresql/data/postgresql.conf " echo "重启 PostgreSQL..." docker restart "$CONTAINER_NAME" sleep 8 # 4. 验证扩展是否可用 echo "" echo "[4/5] 验证 pg_ivm 扩展..." docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -c "CREATE EXTENSION IF NOT EXISTS pg_ivm;" > /dev/null 2>&1 EXTENSION_EXISTS=$(docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -t -c "SELECT COUNT(*) FROM pg_extension WHERE extname = 'pg_ivm';") if [ "$(echo $EXTENSION_EXISTS | tr -d ' ')" != "1" ]; then echo "错误: pg_ivm 扩展未正确加载" exit 1 fi echo "✓ pg_ivm 扩展已加载" # 5. 测试 IMMV 功能 echo "" echo "[5/5] 测试 IMMV 增量更新功能..." docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -c " CREATE TABLE test_table (id SERIAL PRIMARY KEY, name TEXT, value INTEGER); SELECT pgivm.create_immv('test_immv', 'SELECT id, name, value FROM test_table'); INSERT INTO test_table (name, value) VALUES ('test1', 100); INSERT INTO test_table (name, value) VALUES ('test2', 200); " > /dev/null 2>&1 IMMV_COUNT=$(docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -t -c "SELECT COUNT(*) FROM test_immv;") if [ "$(echo $IMMV_COUNT | tr -d ' ')" != "2" ]; then echo "错误: IMMV 增量更新失败,期望 2 行,实际 $(echo $IMMV_COUNT | tr -d ' ') 行" exit 1 fi echo "✓ IMMV 增量更新正常 (2 行数据)" # 测试更新 docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -c "UPDATE test_table SET value = 150 WHERE name = 'test1';" > /dev/null 2>&1 UPDATED_VALUE=$(docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -t -c "SELECT value FROM test_immv WHERE name = 'test1';") if [ "$(echo $UPDATED_VALUE | tr -d ' ')" != "150" ]; then echo "错误: IMMV 更新同步失败" exit 1 fi echo "✓ IMMV 更新同步正常" # 测试删除 docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -c "DELETE FROM test_table WHERE name = 'test2';" > /dev/null 2>&1 IMMV_COUNT_AFTER=$(docker exec "$CONTAINER_NAME" psql -U postgres -d testdb -t -c "SELECT COUNT(*) FROM test_immv;") if [ "$(echo $IMMV_COUNT_AFTER | tr -d ' ')" != "1" ]; then echo "错误: IMMV 删除同步失败" exit 1 fi echo "✓ IMMV 删除同步正常" echo "" echo "==========================================" echo "✓ 所有测试通过" echo "==========================================" echo "" echo "pg_ivm 安装验证成功,可以继续构建自定义 PostgreSQL 镜像" ================================================ FILE: docker/server/Dockerfile ================================================ FROM python:3.10-slim-bookworm WORKDIR /app # 安装系统依赖 (用于编译某些 Python 包) RUN apt-get update && apt-get install -y \ gcc \ libpq-dev \ curl \ git \ && rm -rf /var/lib/apt/lists/* # 安装 Docker CLI(用于本地 Worker 任务分发) # 只安装 docker-ce-cli,避免安装完整 Docker 引擎 RUN apt-get update && \ apt-get install -y ca-certificates gnupg && \ install -m 0755 -d /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ chmod a+r /etc/apt/keyrings/docker.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" > /etc/apt/sources.list.d/docker.list && \ apt-get update && \ apt-get install -y docker-ce-cli && \ rm -rf /var/lib/apt/lists/* # 安装 uv(超快的 Python 包管理器) RUN pip install uv # 安装 Python 依赖(使用 uv 并行下载,速度快 10-100 倍) COPY backend/requirements.txt . RUN --mount=type=cache,target=/root/.cache/uv \ uv pip install --system -r requirements.txt # 复制后端代码 COPY backend /app/backend ENV PYTHONPATH=/app/backend # 暴露端口 # 8888: Django/uvicorn EXPOSE 8888 # 复制启动脚本 COPY docker/server/start.sh /app/start.sh RUN chmod +x /app/start.sh CMD ["/app/start.sh"] ================================================ FILE: docker/server/start.sh ================================================ #!/bin/bash set -e echo "[START] 启动 XingRin Server..." # 1. 执行数据库迁移(迁移文件应提交到仓库,这里只执行 migrate) echo " [1/3] 执行数据库迁移..." cd /app/backend python manage.py migrate --noinput echo " ✓ 数据库迁移完成" echo " [1.1/3] 初始化默认扫描引擎..." python manage.py init_default_engine --force echo " ✓ 默认扫描引擎已就绪" echo " [1.2/3] 初始化默认目录字典..." python manage.py init_wordlists echo " ✓ 默认目录字典已就绪" echo " [1.3/3] 初始化默认指纹库..." python manage.py init_fingerprints echo " ✓ 默认指纹库已就绪" # 2. 启动 Django uvicorn 服务 (ASGI) # 定时任务由内置 APScheduler 处理,在 Django 启动时自动启动 echo " [2/3] 启动 Django uvicorn (ASGI)..." uvicorn config.asgi:application --host 0.0.0.0 --port 8888 ================================================ FILE: docker/start.sh ================================================ #!/bin/bash set -e cd "$(dirname "$0")" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' # 解析参数 WITH_FRONTEND=true DEV_MODE=false QUIET_MODE=false for arg in "$@"; do case $arg in --no-frontend) WITH_FRONTEND=false ;; --dev) DEV_MODE=true ;; --quiet) QUIET_MODE=true ;; esac done # 选择 compose 文件 if [ "$DEV_MODE" = true ]; then COMPOSE_FILE="docker-compose.dev.yml" echo -e "${YELLOW}[MODE]${NC} 开发模式 - 本地构建镜像" else COMPOSE_FILE="docker-compose.yml" echo -e "${GREEN}[MODE]${NC} 生产模式 - 使用 Docker Hub 镜像" fi # 检查 Docker 环境 if ! command -v docker >/dev/null 2>&1; then echo -e "${RED}[ERROR]${NC} 未检测到 docker 命令,请先安装 Docker" exit 1 fi if ! docker info >/dev/null 2>&1; then echo -e "${RED}[ERROR]${NC} Docker 守护进程未运行,请先启动 Docker" exit 1 fi if docker compose version >/dev/null 2>&1; then COMPOSE_CMD="docker compose" elif command -v docker-compose >/dev/null 2>&1; then COMPOSE_CMD="docker-compose" else echo -e "${RED}[ERROR]${NC} 未检测到 docker compose,请先安装" exit 1 fi # 检查配置文件 if [ ! -f .env ]; then echo -e "${RED}[ERROR]${NC} 未找到 .env 配置文件" echo " 请先复制 .env.example 为 .env 并配置" exit 1 fi # 确保数据目录存在 DATA_DIR="/opt/xingrin" if [ ! -d "$DATA_DIR/results" ] || [ ! -d "$DATA_DIR/logs" ]; then echo -e "${CYAN}[INIT]${NC} 创建数据目录: $DATA_DIR" sudo mkdir -p "$DATA_DIR/results" "$DATA_DIR/logs" sudo chmod -R 755 "$DATA_DIR" fi # 读取数据库配置 DB_HOST=$(grep -E "^DB_HOST=" .env | cut -d'=' -f2 | tr -d ' "'"'" || echo "postgres") if [[ "$DB_HOST" == "postgres" || "$DB_HOST" == "localhost" || "$DB_HOST" == "127.0.0.1" ]]; then echo -e "${CYAN}[DB]${NC} 使用本地 PostgreSQL 容器" PROFILE_ARG="--profile local-db" else echo -e "${CYAN}[DB]${NC} 使用远程 PostgreSQL: $DB_HOST" PROFILE_ARG="" fi # 启动服务(启用 BuildKit 缓存 + 并行构建加速) export DOCKER_BUILDKIT=1 export COMPOSE_DOCKER_CLI_BUILD=1 export BUILDKIT_INLINE_CACHE=1 # 使用指定的 compose 文件 COMPOSE_ARGS="-f ${COMPOSE_FILE} ${PROFILE_ARG}" SERVICES="$(${COMPOSE_CMD} ${COMPOSE_ARGS} config --services)" service_exists() { echo "$SERVICES" | grep -qx "$1" } BACKEND_SERVICES=() for s in redis server agent; do if service_exists "$s"; then BACKEND_SERVICES+=("$s") fi done # 如果使用本地数据库,先启动 postgres 并等待健康 start_postgres_first() { if [ -n "$PROFILE_ARG" ]; then echo -e "${CYAN}[DB]${NC} 启动 PostgreSQL 容器..." ${COMPOSE_CMD} ${COMPOSE_ARGS} up -d postgres echo -e "${CYAN}[DB]${NC} 等待 PostgreSQL 就绪..." local max_wait=30 local count=0 while [ $count -lt $max_wait ]; do if ${COMPOSE_CMD} ${COMPOSE_ARGS} exec -T postgres pg_isready -U postgres >/dev/null 2>&1; then echo -e "${GREEN}[DB]${NC} PostgreSQL 已就绪" return 0 fi sleep 1 count=$((count + 1)) done echo -e "${YELLOW}[WARN]${NC} PostgreSQL 等待超时,继续启动其他服务..." fi } echo "" if [ "$DEV_MODE" = true ]; then # 开发模式:本地构建 if [ "$WITH_FRONTEND" = true ]; then echo -e "${CYAN}[BUILD]${NC} 并行构建镜像..." ${COMPOSE_CMD} ${COMPOSE_ARGS} build --parallel start_postgres_first echo -e "${CYAN}[START]${NC} 启动全部服务..." ${COMPOSE_CMD} ${COMPOSE_ARGS} up -d else echo -e "${CYAN}[BUILD]${NC} 并行构建后端镜像..." ${COMPOSE_CMD} ${COMPOSE_ARGS} build --parallel "${BACKEND_SERVICES[@]}" start_postgres_first echo -e "${CYAN}[START]${NC} 启动后端服务..." ${COMPOSE_CMD} ${COMPOSE_ARGS} up -d "${BACKEND_SERVICES[@]}" fi else # 生产模式:拉取 Docker Hub 镜像 # pull 后 up -d 会自动检测镜像变化并重建容器 if [ "$WITH_FRONTEND" = true ]; then echo -e "${CYAN}[PULL]${NC} 拉取最新镜像..." ${COMPOSE_CMD} ${COMPOSE_ARGS} pull start_postgres_first echo -e "${CYAN}[START]${NC} 启动全部服务..." ${COMPOSE_CMD} ${COMPOSE_ARGS} up -d else echo -e "${CYAN}[PULL]${NC} 拉取后端镜像..." ${COMPOSE_CMD} ${COMPOSE_ARGS} pull "${BACKEND_SERVICES[@]}" start_postgres_first echo -e "${CYAN}[START]${NC} 启动后端服务..." ${COMPOSE_CMD} ${COMPOSE_ARGS} up -d "${BACKEND_SERVICES[@]}" fi fi echo -e "${GREEN}[OK]${NC} 服务已启动" # 数据初始化 if [ "$DEV_MODE" = true ]; then ./scripts/init-data.sh --dev else ./scripts/init-data.sh fi # 静默模式下不显示结果(由调用方显示) if [ "$QUIET_MODE" = true ]; then exit 0 fi # 获取访问地址 PUBLIC_HOST=$(grep "^PUBLIC_HOST=" .env 2>/dev/null | cut -d= -f2) if [ -n "$PUBLIC_HOST" ] && [ "$PUBLIC_HOST" != "server" ]; then ACCESS_HOST="$PUBLIC_HOST" else ACCESS_HOST="localhost" fi # 显示结果 echo "" echo -e "${BOLD}${GREEN}════════════════════════════════════════${NC}" echo -e "${BOLD}${GREEN} 服务启动成功!${NC}" echo -e "${BOLD}${GREEN}════════════════════════════════════════${NC}" echo "" echo -e "${BOLD}访问地址${NC}" if [ "$WITH_FRONTEND" = true ]; then echo -e " XingRin: ${CYAN}https://${ACCESS_HOST}:8083/${NC}" echo -e " ${YELLOW}(HTTP 会自动跳转到 HTTPS)${NC}" else echo -e " API: ${CYAN}通过前端或 nginx 访问(后端未暴露 8888)${NC}" echo "" echo -e "${YELLOW}[TIP]${NC} 前端未启动,请手动运行:" echo " cd frontend && pnpm dev" fi echo "" ================================================ FILE: docker/stop.sh ================================================ #!/bin/bash set -e cd "$(dirname "$0")" source "./scripts/common.sh" init_docker_env # 颜色 CYAN='\033[0;36m' GREEN='\033[0;32m' NC='\033[0m' echo -e "${CYAN}[STOP]${NC} 停止服务..." # 尝试停止两种模式的容器(生产模式和开发模式) if [ -f "docker-compose.yml" ]; then ${COMPOSE_CMD} -f docker-compose.yml down 2>/dev/null || true fi if [ -f "docker-compose.dev.yml" ]; then ${COMPOSE_CMD} -f docker-compose.dev.yml down 2>/dev/null || true fi echo -e "${GREEN}[OK]${NC} 服务已停止" ================================================ FILE: docker/worker/Dockerfile ================================================ # 第一阶段:使用 Go 官方镜像编译工具 FROM golang:1.24 AS go-builder ENV GOPROXY=https://goproxy.cn,direct # Naabu 需要 CGO 和 libpcap ENV CGO_ENABLED=1 # 安装编译依赖(libpcap-dev 用于 naabu,git/build-essential 用于编译 massdns) RUN apt-get update && apt-get install -y \ libpcap-dev \ git \ build-essential \ && rm -rf /var/lib/apt/lists/* # 安装 massdns(puredns 依赖) RUN git clone https://github.com/blechschmidt/massdns.git /tmp/massdns && \ cd /tmp/massdns && \ make && \ cp bin/massdns /usr/local/bin/massdns # 安装 ProjectDiscovery 等 Go 工具(需要 CGO 的工具如 naabu) RUN go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest && \ go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latest && \ go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest && \ go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest && \ go install -v github.com/projectdiscovery/katana/cmd/katana@latest && \ go install -v github.com/tomnomnom/assetfinder@latest && \ go install -v github.com/ffuf/ffuf/v2@latest && \ go install -v github.com/d3mondev/puredns/v2@latest && \ go install -v github.com/yyhuni/xingfinger@latest # 安装漏洞扫描器 RUN go install github.com/hahwul/dalfox/v2@latest # 第二阶段:运行时镜像 FROM ubuntu:24.04 # 避免交互式提示 ENV DEBIAN_FRONTEND=noninteractive # 设置工作目录 WORKDIR /app # 1. 安装基础工具和 Python # 注意:ARM64 使用 ports.ubuntu.com,可能存在镜像同步延迟,需要重试机制 RUN apt-get update && \ apt-get install -y --no-install-recommends \ python3 \ python3-pip \ python3-venv \ pipx \ git \ curl \ wget \ unzip \ jq \ tmux \ nmap \ masscan \ libpcap-dev \ ca-certificates \ fonts-liberation \ libnss3 \ libxss1 \ libasound2t64 \ || (rm -rf /var/lib/apt/lists/* && apt-get update && apt-get install -y --no-install-recommends \ python3 python3-pip python3-venv pipx git curl wget unzip jq tmux nmap masscan libpcap-dev \ ca-certificates fonts-liberation libnss3 libxss1 libasound2t64) \ && rm -rf /var/lib/apt/lists/* # 安装 Chromium(通过 Playwright 安装,支持 ARM64 和 AMD64) # Ubuntu 24.04 的 chromium-browser 是 snap 过渡包,Docker 中不可用 RUN pip install playwright --break-system-packages && \ playwright install chromium && \ apt-get update && \ playwright install-deps chromium && \ rm -rf /var/lib/apt/lists/* # 设置 Chrome 路径供 httpx 等工具使用(Playwright 安装位置) ENV CHROME_PATH=/root/.cache/ms-playwright/chromium-*/chrome-linux/chrome # 创建软链接确保 httpx 的 -system-chrome 能找到浏览器 RUN CHROME_BIN=$(find /root/.cache/ms-playwright -name chrome -type f 2>/dev/null | head -1) && \ ln -sf "$CHROME_BIN" /usr/bin/chromium-browser && \ ln -sf "$CHROME_BIN" /usr/bin/chromium && \ ln -sf "$CHROME_BIN" /usr/bin/chrome && \ ln -sf "$CHROME_BIN" /usr/bin/google-chrome-stable # 建立 python 软链接 RUN ln -s /usr/bin/python3 /usr/bin/python # 2. 使用 pipx 安装 Python 扫描工具 ENV PATH="/root/.local/bin:$PATH" RUN pipx install uro && \ pipx install waymore && \ pipx install dnsgen # 3. 安装 Sublist3r(Python 脚本工具,放在 /usr/local/share 标准目录) RUN git clone https://github.com/aboul3la/Sublist3r.git /usr/local/share/Sublist3r && \ pip3 install --no-cache-dir -r /usr/local/share/Sublist3r/requirements.txt --break-system-packages # 4. 从 go-builder 阶段复制 Go 环境和编译好的工具 # 创建项目专用工具目录(符合 FHS 标准,/opt 用于独立软件包) # 避免与系统工具或 Python 包冲突,避免被 /opt/xingrin 挂载覆盖 RUN mkdir -p /opt/xingrin-tools/bin ENV GOPATH=/root/go ENV GOPROXY=https://goproxy.cn,direct COPY --from=go-builder /usr/local/go /usr/local/go # 从 go-builder 复制扫描工具到专用目录(避免与系统工具或 Python 包冲突) COPY --from=go-builder /go/bin/* /opt/xingrin-tools/bin/ COPY --from=go-builder /usr/local/bin/massdns /opt/xingrin-tools/bin/massdns # 将专用工具目录添加到 PATH(优先级高于 /usr/local/bin,避免冲突) ENV PATH=/opt/xingrin-tools/bin:/usr/local/go/bin:/usr/local/bin:$PATH:$GOPATH/bin # 5. 安装 uv( Python 包管理器)并安装 Python 依赖 COPY backend/requirements.txt . RUN pip install uv --break-system-packages && \ uv pip install --system -r requirements.txt --break-system-packages && \ rm -f /usr/local/lib/python3.*/dist-packages/argparse.py && \ rm -rf /usr/local/lib/python3.*/dist-packages/__pycache__/argparse* && \ rm -rf /root/.cache/uv && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 6. 设置 Prefect 配置目录(避免 home 目录不存在的警告) ENV PREFECT_HOME=/app/.prefect RUN mkdir -p /app/.prefect # 7. 复制后端代码 COPY backend /app/backend ENV PYTHONPATH=/app/backend # 工作目录设置为 backend,方便运行 python -m 命令 WORKDIR /app/backend # 默认命令(实际由 TaskDistributor 指定具体脚本) CMD ["python", "--version"] ================================================ FILE: docker-push.sh ================================================ #!/bin/bash # 目前采用github action自动版本构建,用 # git tag v1.0.9 # git push origin v1.0.9 # ============================================ # Docker Hub 镜像推送脚本 # 用途:构建并推送所有服务镜像到 Docker Hub # 多架构构建:./docker-push.sh -p linux/amd64,linux/arm64 worker # ============================================ set -e # 启用 BuildKit(支持高级缓存功能) export DOCKER_BUILDKIT=1 # ==================== 配置 ==================== # 切换到脚本所在目录(项目根目录) SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # 从 Git Tag 获取版本号(必须有 tag 才能构建) get_version() { local tag tag=$(git describe --tags --exact-match 2>/dev/null) if [ -n "$tag" ]; then echo "$tag" else echo -e "\033[0;31m[ERROR]\033[0m 当前 commit 没有 Git Tag,无法构建" echo " 请先打 tag: git tag v1.x.x && git push --tags" exit 1 fi } GIT_VERSION=$(get_version) # Docker Hub 用户名(修改为你的用户名) DOCKER_USER="${DOCKER_USER:-yyhuni}" # 镜像版本标签(从 Git Tag 获取) VERSION="$GIT_VERSION" # 是否推送(默认 yes,设为 no 则只构建不推送) PUSH="${PUSH:-yes}" # 构建平台(默认当前架构,可设为 linux/amd64,linux/arm64 进行多架构构建) PLATFORM="${PLATFORM:-}" # 镜像列表 IMAGES=( "xingrin-server:docker/server/Dockerfile" "xingrin-frontend:docker/frontend/Dockerfile" "xingrin-nginx:docker/nginx/Dockerfile" "xingrin-worker:docker/worker/Dockerfile" "xingrin-agent:docker/agent/Dockerfile" ) # 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # ==================== 帮助信息 ==================== show_help() { cat << EOF 用法: $0 [选项] [镜像名...] 版本号从 Git Tag 自动获取,无 tag 时使用 dev-。 选项: -u, --user USER Docker Hub 用户名 (默认: $DOCKER_USER) -p, --platform PLAT 构建平台 (如: linux/amd64,linux/arm64) --no-push 只构建不推送 -h, --help 显示帮助 镜像名 (可选,不指定则构建全部): server 后端服务 frontend 前端服务 nginx Nginx 反向代理 worker 扫描 Worker agent 心跳上报 Agent(轻量) 示例: $0 # 构建并推送所有镜像 $0 server frontend # 只构建 server 和 frontend $0 --no-push # 只构建不推送 $0 -p linux/amd64,linux/arm64 # 多架构构建 环境变量: DOCKER_USER Docker Hub 用户名 PUSH 是否推送 (yes/no) PLATFORM 构建平台 EOF exit 0 } # ==================== 解析参数 ==================== SELECTED_IMAGES=() while [[ $# -gt 0 ]]; do case $1 in -u|--user) DOCKER_USER="$2" shift 2 ;; -p|--platform) PLATFORM="$2" shift 2 ;; --no-push) PUSH="no" shift ;; -h|--help) show_help ;; server|frontend|nginx|worker|agent) SELECTED_IMAGES+=("$1") shift ;; *) log_error "未知参数: $1" show_help ;; esac done # ==================== 检查 Docker 登录 ==================== check_docker_login() { if [ "$PUSH" = "yes" ]; then log_info "检查 Docker Hub 登录状态..." if ! docker info 2>/dev/null | grep -q "Username"; then log_warn "未登录 Docker Hub,请先执行: docker login" read -p "是否现在登录?(y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then docker login else log_error "需要登录才能推送镜像" exit 1 fi fi log_success "Docker Hub 已登录" fi } # ==================== 构建镜像 ==================== build_image() { local name=$1 local dockerfile=$2 local full_name="${DOCKER_USER}/${name}:${VERSION}" log_info "构建镜像: $full_name" log_info " Dockerfile: $dockerfile" # 构建命令 local build_cmd="docker build" # 多架构构建使用 buildx if [ -n "$PLATFORM" ]; then build_cmd="docker buildx build --platform $PLATFORM" if [ "$PUSH" = "yes" ]; then build_cmd="$build_cmd --push" fi fi # 执行构建(只打版本标签,不打 latest) $build_cmd \ -t "$full_name" \ -f "$dockerfile" \ . if [ $? -eq 0 ]; then log_success "构建成功: $full_name" else log_error "构建失败: $full_name" exit 1 fi # 推送(非 buildx 模式) if [ "$PUSH" = "yes" ] && [ -z "$PLATFORM" ]; then log_info "推送镜像: $full_name" docker push "$full_name" log_success "推送成功: $full_name" fi } # ==================== 主流程 ==================== main() { echo "" echo "==========================================" echo " Docker Hub 镜像构建与推送" echo "==========================================" echo "" log_info "用户: $DOCKER_USER" log_warn "版本: ${VERSION}" log_info "推送: $PUSH" [ -n "$PLATFORM" ] && log_info "平台: $PLATFORM" echo "" # 确认版本号,防止误覆盖 if [ "$PUSH" = "yes" ]; then echo -e "${YELLOW}[!] 请确认版本号 ${VERSION} 是否正确${NC}" echo -e "${YELLOW} 如需修改,请打新的 Git Tag: git tag v1.x.x${NC}" echo -e "${RED} 覆盖版本号会导致所有用户的旧版本拉取出现问题!!!${NC}" read -p "确认推送?(y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "已取消" exit 0 fi fi check_docker_login # 切换到项目根目录 cd "$(dirname "$0")" # 如果指定了特定镜像,只构建那些 if [ ${#SELECTED_IMAGES[@]} -gt 0 ]; then for sel in "${SELECTED_IMAGES[@]}"; do for item in "${IMAGES[@]}"; do name="${item%%:*}" dockerfile="${item##*:}" if [[ "$name" == "xingrin-$sel" ]]; then build_image "$name" "$dockerfile" fi done done else # 构建所有镜像 for item in "${IMAGES[@]}"; do name="${item%%:*}" dockerfile="${item##*:}" build_image "$name" "$dockerfile" done fi echo "" echo "==========================================" log_success " 完成!" echo "==========================================" echo "" if [ "$PUSH" = "yes" ]; then log_info "镜像已推送到 Docker Hub:" for item in "${IMAGES[@]}"; do name="${item%%:*}" echo " - docker pull ${DOCKER_USER}/${name}:${VERSION}" done fi } main ================================================ FILE: docs/README.md ================================================ # XingRin - 星环 技术文档 ## 文档目录 ### 架构设计 - [版本管理架构](./version-management.md) - Git Tag 驱动的自动化版本管理系统 - [安全检测模板架构](./nuclei-template-architecture.md) - 检测模板仓库的存储、同步、分发机制 - [字典文件架构](./wordlist-architecture.md) - 字典文件的存储、同步、分发机制 ### 开发指南 - [快速开始](./quick-start.md) - 一键安装和部署指南 - API 文档(🚧 待补充) - 开发环境搭建(🚧 待补充) ### 运维手册 - 故障排查(待补充) - 性能优化(待补充) - 监控告警(待补充) ## 快速导航 ### 常见问题 - **版本不一致**:参考 [版本管理 - 故障排查](./version-management.md#故障排查) - **镜像拉取失败**:检查网络和 Docker Hub 连接 - **远程 Worker 部署**:参考版本管理文档中的部署流程 ### 核心概念 - **IMAGE_TAG**:版本锁定机制,确保所有组件版本一致 - **--pull=missing**:镜像拉取策略,优先使用本地缓存 - **task_distributor**:负载感知任务分发器 ## 贡献指南 ### 文档更新 1. 新增功能时同步更新相关文档 2. 使用 Mermaid 图表描述复杂流程 3. 提供具体的命令示例和配置 ### 文档规范 - 使用中文编写 - 代码块标注语言类型 - 重要概念使用**粗体**标注 - 提供完整的示例和说明 ================================================ FILE: docs/nuclei-template-architecture.md ================================================ # Nuclei 模板管理架构 本文档介绍 XingRin 中 Nuclei 模板的存储、同步和使用机制。 ## 目录结构 ``` /opt/xingrin/nuclei-repos/ ├── nuclei-templates/ # 官方模板仓库(按仓库名命名) │ ├── .git/ │ ├── http/ │ ├── network/ │ └── ... └── custom-repo/ # 自定义模板仓库 ``` ## 一、存储位置 | 配置项 | 默认值 | 说明 | |--------|--------|------| | `NUCLEI_TEMPLATES_REPOS_BASE_DIR` | `/opt/xingrin/nuclei-repos` | 模板仓库根目录 | 每个模板仓库会在根目录下创建独立子目录,目录名由仓库名称 slugify 生成。 ## 二、数据模型 ``` NucleiTemplateRepo ├── id # 仓库 ID ├── name # 仓库名称(用于前端展示和 Worker 查询) ├── repo_url # Git 仓库地址 ├── local_path # 本地克隆路径(自动生成) ├── commit_hash # 当前同步的 commit hash └── last_synced_at # 最后同步时间 ``` ## 三、Server 端同步流程 1. 用户在前端添加模板仓库(填写名称和 Git URL) 2. 点击「同步」触发 `NucleiTemplateRepoService.refresh_repo()` 3. 首次同步:`git clone --depth 1`(浅克隆,节省空间) 4. 后续同步:`git pull --ff-only`(快进合并) 5. 同步成功后更新数据库:`commit_hash`、`last_synced_at` ``` ┌──────────────────────────────────────────────────────────────────────────┐ │ Server 容器 │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 前端 UI │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ 添加仓库 │ │ 同步仓库 │ │ 浏览模板 │ │ │ │ │ │ name + url │ │ 点击刷新 │ │ 目录树 │ │ │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────────┘ │ │ │ └─────────┼───────────────────┼───────────────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ NucleiTemplateRepoViewSet │ │ │ │ POST /api/nuclei/repos/ | POST .../refresh/ │ │ │ └─────────────────────────────┬───────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ NucleiTemplateRepoService │ │ │ │ │ │ │ │ ┌────────────────────┐ ┌────────────────────────────────┐ │ │ │ │ │ ensure_local_path()│ │ refresh_repo() │ │ │ │ │ │ 生成本地目录路径 │ │ 执行 Git 同步 │ │ │ │ │ └────────────────────┘ └───────────────┬────────────────┘ │ │ │ └────────────────────────────────────────────┼────────────────────┘ │ │ │ │ │ ┌───────────────┴───────────────┐ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ 首次同步(无 .git) │ │ 后续同步(有 .git) │ │ │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ git clone --depth 1 │ │ git pull --ff-only │ │ │ │ │ │ │ │ │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ │ │ │ │ └──────────────┬─────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ git rev-parse HEAD │ │ │ │ 获取当前 commit hash │ │ │ └──────────────────────────┬──────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ PostgreSQL 数据库 │ │ │ │ │ │ │ │ UPDATE nuclei_template_repo SET │ │ │ │ local_path = '/opt/xingrin/nuclei-repos/xxx', │ │ │ │ commit_hash = 'abc123...', │ │ │ │ last_synced_at = NOW() │ │ │ │ WHERE id = ? │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 文件系统 │ │ │ │ /opt/xingrin/nuclei-repos/ │ │ │ │ ├── nuclei-templates/ # 官方模板 │ │ │ │ │ ├── .git/ │ │ │ │ │ ├── http/ │ │ │ │ │ ├── network/ │ │ │ │ │ └── ... │ │ │ │ └── custom-repo/ # 自定义模板 │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────────────┘ │ │ git clone / pull ▼ ┌─────────────────────┐ │ GitHub / GitLab │ │ 远程 Git 仓库 │ └─────────────────────┘ ``` ## 四、Worker 端同步流程 Worker 执行扫描任务时,通过 `ensure_nuclei_templates_local()` 确保本地模板与 Server 版本一致: 1. 从数据库查询仓库记录,获取 `repo_url` 和 `commit_hash` 2. 检查本地是否存在仓库目录 - 不存在:`git clone --depth 1` - 存在:比较本地 commit hash 与 Server 的 `commit_hash` 3. 如果 commit 不一致:`git fetch` + `git checkout ` 4. 返回本地模板目录路径,供 nuclei 命令使用 ``` ┌──────────────────────────────────────────────────────────────────────────┐ │ Worker 容器 │ │ │ │ ┌─────────────┐ │ │ │ 扫描任务 │ │ │ │ 开始执行 │ │ │ └──────┬──────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────┐ ┌─────────────────────────────────┐ │ │ │ ensure_nuclei_ │ │ PostgreSQL │ │ │ │ templates_local() │─────▶│ 查询 NucleiTemplateRepo 表 │ │ │ │ │ │ 获取 repo_url, commit_hash │ │ │ └───────────┬─────────────┘ └─────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────┐ │ │ │ 检查本地 .git 目录 │ │ │ └───────────┬─────────────┘ │ │ │ │ │ ┌───────┴───────┐ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────┐ ┌────────────┐ │ │ │ 不存在 │ │ 存在 │ │ │ └───┬────┘ └─────┬──────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────────┐ ┌─────────────────────┐ │ │ │ git clone │ │ 比较 commit hash │ │ │ │ --depth 1 │ │ local vs server │ │ │ └─────┬──────┘ └──────────┬──────────┘ │ │ │ │ │ │ │ ┌───────┴───────┐ │ │ │ │ │ │ │ │ ▼ ▼ │ │ │ ┌──────────┐ ┌──────────────┐ │ │ │ │ 一致 │ │ 不一致 │ │ │ │ │ 直接使用 │ │ │ │ │ │ └────┬─────┘ └───────┬──────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────────┐ │ │ │ │ │ git fetch origin │ │ │ │ │ │ git checkout │ │ │ │ │ │ │ │ │ │ │ └────────┬─────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 返回本地模板目录路径 │ │ │ │ /opt/xingrin/nuclei-repos// │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 执行 nuclei 扫描 │ │ │ │ nuclei -t /opt/xingrin/nuclei-repos/xxx/ -l targets.txt │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────────────┘ ``` ## 五、版本一致性保证 - Server 同步时记录 `commit_hash` - Worker 使用前检查本地 hash 是否与 Server 一致 - 不一致时自动同步到指定 commit - 确保所有节点使用相同版本的模板 ## 六、配置项 在 `docker/.env` 或环境变量中配置: ```bash # Nuclei 模板仓库根目录 NUCLEI_TEMPLATES_REPOS_BASE_DIR=/opt/xingrin/nuclei-repos ``` ## 七、常见问题 ### Q: Worker 报错「未找到模板仓库」? A: 需要先在 Server 端添加并同步模板仓库,Worker 通过数据库查询仓库信息。 ### Q: 如何添加自定义模板仓库? A: 在前端「Nuclei 模板」页面点击添加,填写仓库名称和 Git URL,然后点击同步即可。 ### Q: 模板更新后 Worker 如何获取最新版本? A: 在 Server 端点击「同步」更新模板,Worker 下次执行扫描时会检测到 commit hash 不一致并自动同步。 ================================================ FILE: docs/plans/2026-03-08-oss-readiness-design.md ================================================ # XingRin OSS Readiness Design **Background** XingRin is an actively maintained open-source attack surface management and authorized security automation project. The repository currently has a standards issue: the root `LICENSE` file is GPL-3.0, while the public README still advertises `PolyForm NC`. This mismatch creates ambiguity for contributors, users, and external programs that evaluate open-source eligibility. **Goal** Make the repository clearly and consistently open source, reduce adoption friction, and improve its presentation for open-source program applications such as Codex for OSS. **Non-Goals** - No product feature changes - No backend or frontend behavior changes - No infrastructure refactors - No legal customizations beyond selecting a standard OSI-style license ## Approach Options ### Option 1: Keep GPL-3.0 and clean inconsistencies Pros: - Lowest legal change risk - No relicensing concern if additional contributors exist - Still qualifies as a standard open-source license Cons: - Higher downstream adoption friction - Less aligned with the stated goal of lowering usage barriers ### Option 2: Relicense to MIT and clean inconsistencies **(Recommended)** Pros: - Lowest friction for users, contributors, and evaluators - Simple, familiar, and unambiguous - Best fit for “make OSS status obvious and permissive” goal Cons: - Removes copyleft protection - Requires confidence that relicensing authority is clear ### Option 3: Relicense to Apache-2.0 and clean inconsistencies Pros: - Permissive like MIT - Includes explicit patent grant language - Friendly for organizations evaluating adoption Cons: - Slightly more complex than MIT - Provides little extra benefit for this repository’s immediate application goal ## Chosen Design Adopt `MIT` as the single repository license and perform a full consistency cleanup. ## Scope of Changes 1. Replace the root `LICENSE` with MIT. 2. Update README license badge and legal wording. 3. Add clear “authorized/defensive use only” wording without adding non-open-source usage restrictions. 4. Add `SECURITY.md` with reporting guidance. 5. Add `CONTRIBUTING.md` with contribution process and relicensing note. 6. Add `CODE_OF_CONDUCT.md` using a standard community format. 7. Tighten README positioning for open-source maintenance and legitimate security workflows. 8. Update repository metadata files that expose license information. ## Risks and Mitigations - **Risk: accidental contradiction between permissive license and usage policy** Mitigation: keep “authorized use only” as project policy and ethics guidance, not as extra legal restrictions beyond MIT. - **Risk: relicensing history ambiguity** Mitigation: note contribution licensing expectations in `CONTRIBUTING.md`; rely on maintainer confirmation that substantive contributions are solely owned. - **Risk: repository still looks ambiguous to reviewers** Mitigation: align badge, license file, README language, and community docs in one pass. ## Validation - Search repository for legacy license strings such as `PolyForm`, `Noncommercial`, and stale GPL wording references. - Confirm all newly added markdown files are present and coherent. - Optionally update GitHub repository metadata (description/topics/homepage) to better match the cleaned positioning. ================================================ FILE: docs/plans/2026-03-08-oss-readiness.md ================================================ # XingRin OSS Readiness Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Make the XingRin repository clearly permissive, internally consistent, and better presented for open-source program applications. **Architecture:** This change is documentation- and metadata-driven. It standardizes licensing, removes contradictory repository messaging, adds baseline community files, and improves public positioning without changing runtime behavior. **Tech Stack:** Markdown, GitHub repository metadata, standard MIT license text --- ### Task 1: Add repository planning artifacts **Files:** - Create: `docs/plans/2026-03-08-oss-readiness-design.md` - Create: `docs/plans/2026-03-08-oss-readiness.md` **Step 1:** Create the approved design document. **Step 2:** Create the implementation plan. **Step 3:** Verify both files render as plain markdown. ### Task 2: Replace the repository license **Files:** - Modify: `LICENSE` - Check: `frontend/package.json` **Step 1:** Replace GPL-3.0 text with MIT. **Step 2:** Confirm any manifest-level license field is consistent. **Step 3:** Search for stale GPL references. ### Task 3: Clean README licensing and positioning **Files:** - Modify: `README.md` **Step 1:** Replace the stale license badge. **Step 2:** Update the project positioning to emphasize open-source, authorized, defensive use. **Step 3:** Refresh the maintenance/rewrite wording so it reads like active open-source stewardship. **Step 4:** Keep feature content intact while removing contradictory or high-risk phrasing where possible. ### Task 4: Add baseline community and security docs **Files:** - Create: `SECURITY.md` - Create: `CONTRIBUTING.md` - Create: `CODE_OF_CONDUCT.md` **Step 1:** Add vulnerability reporting instructions. **Step 2:** Add contribution workflow and licensing expectations. **Step 3:** Add a standard code of conduct. ### Task 5: Validate repository consistency **Files:** - Check: `README.md` - Check: `LICENSE` - Check: `SECURITY.md` - Check: `CONTRIBUTING.md` - Check: `CODE_OF_CONDUCT.md` **Step 1:** Search for `PolyForm`, `Noncommercial`, and stale GPL references. **Step 2:** Confirm new docs are linked or discoverable. **Step 3:** Review final public-facing text for clarity. ### Task 6: Update GitHub metadata if beneficial **Files:** - External: GitHub repository settings via `gh api` **Step 1:** Update repository description if the current description is too tool-centric or ambiguous. **Step 2:** Keep topics aligned with authorized security and asset management. **Step 3:** Verify metadata reflects the README positioning. ================================================ FILE: docs/quick-start.md ================================================ # 🚀 XingRin - 星环 快速开始 ## 系统要求 ### 硬件要求 - **CPU**: 2 核心以上 - **内存**: 4GB 以上 - **存储**: 20GB 可用空间 - **网络**: 互联网连接(用于拉取 Docker 镜像) ### 软件要求 - **操作系统**: Ubuntu 18.04+ / Debian 10+ - **权限**: sudo 管理员权限 - **端口要求**: 需要开放以下端口 - `8083` - HTTPS 访问(主要访问端口) - `5432` - PostgreSQL 数据库(如使用本地数据库且有远程 Worker) - 后端 API 仅容器内监听 8888,由 nginx 反代到 8083,对公网无需放行 8888 - Redis 仅在 Docker 内部网络使用,无需对外开放 ## 一键安装 ### 1. 下载项目 ```bash git clone https://github.com/你的用户名/xingrin.git cd xingrin ``` ### 2. 执行安装 ```bash # 生产环境安装 sudo ./install.sh # 开发环境安装(本地构建镜像) sudo ./install.sh --dev # 只安装后端(前端单独部署) sudo ./install.sh --no-frontend ``` ### 3. 访问系统 安装完成后,访问: - **Web 界面**: https://你的服务器IP:8083/ **默认账号**: - 用户名: `admin` - 密码: `admin` ⚠️ **首次登录后请立即修改密码!** ## ☁️ 云服务器部署注意事项 ### 端口安全组配置 **阿里云/腾讯云/华为云等云服务器默认开启安全策略,需要手动放行端口!** #### 必须放行的端口 ``` 8083 - HTTPS 访问(主要访问端口) 5432 - PostgreSQL(如使用本地数据库且有远程 Worker) ``` #### 推荐方案 - **国外 VPS**:如 Vultr、DigitalOcean、Linode 等,默认开放所有端口,无需额外配置 - **国内云服务器**:需要在安全组中手动放行端口,否则无法正常访问 ⚠️ **重要提醒**:端口未放行会导致: - 无法访问 Web 界面 - 扫描功能异常 - 远程 Worker 连接失败 ## 安装过程说明 ### 自动安装内容 ```mermaid graph TD A[执行 install.sh] --> B[检查系统环境] B --> C[安装 Docker] C --> D[生成配置文件] D --> E[拉取 Docker 镜像] E --> F[启动服务] F --> G[安装完成] style A fill:#e1f5fe style G fill:#e8f5e8 ``` ### 安装步骤详解 1. **环境检查**: 检测操作系统、安装缺失的基础命令 2. **Docker 安装**: 自动安装 Docker 和 docker-compose 3. **配置生成**: 创建 `.env` 配置文件,生成随机密钥 4. **数据库配置**: 支持本地 PostgreSQL 或远程数据库 5. **SSL 证书**: 自动生成自签名 HTTPS 证书 6. **服务启动**: 启动所有容器服务 ## 服务管理 ### 常用命令 ```bash # 启动服务 ./start.sh # 停止服务 ./stop.sh # 重启服务 ./restart.sh # 卸载系统 ./uninstall.sh ``` ### 服务状态检查 ```bash # 查看容器状态 docker ps # 查看服务日志 docker logs xingrin-server docker logs xingrin-frontend docker logs xingrin-nginx docker logs xingrin-agent # 查看系统资源 docker stats ``` ## 配置说明 ### 主要配置文件 ``` docker/.env # 主配置文件 docker/nginx/ssl/ # SSL 证书目录 /opt/xingrin/results/ # 扫描结果存储 /opt/xingrin/logs/ # 系统日志存储 ``` ### 重要配置项 ```bash # 数据库配置 DB_HOST=postgres # 数据库地址 DB_PORT=5432 # 数据库端口 DB_NAME=xingrin # 数据库名称 DB_USER=postgres # 数据库用户 DB_PASSWORD=随机生成 # 数据库密码 # 服务配置 SERVER_PORT=8888 # 后端容器内部端口(仅 Docker 内网监听) PUBLIC_HOST=server # 对外访问地址(远程 Worker 用,配置外网 IP 或域名) DEBUG=False # 调试模式 # 版本配置 IMAGE_TAG=v1.0.0 # 镜像版本(自动设置) ``` ## 远程 Worker 部署 ### 1. 主服务器添加节点 1. 登录 Web 界面 2. 进入 **系统管理** → **Worker 节点** 3. 点击 **添加节点**,填写远程服务器信息: - 节点名称 - IP 地址 - SSH 端口(默认 22) - SSH 用户名 - SSH 密码 ### 2. 一键部署 点击 **部署** 按钮,系统会自动: 1. SSH 连接到远程服务器 2. 安装 Docker 环境 3. 拉取 Worker 镜像 4. 启动 Agent 容器 ### 3. 验证部署 - 节点状态显示为 **在线** - 可以看到节点的 CPU、内存负载 - 任务分发时会自动选择最优节点 ## 故障排查 ### 常见问题 #### 1. 端口被占用 ```bash # 检查端口占用 sudo netstat -tlnp | grep :8083 # 停止占用端口的服务 sudo systemctl stop apache2 # 如果是 Apache sudo systemctl stop nginx # 如果是 Nginx ``` #### 2. Docker 权限问题 ```bash # 添加用户到 docker 组 sudo usermod -aG docker $USER # 重新登录或执行 newgrp docker ``` #### 3. 服务启动失败 ```bash # 查看详细错误日志 docker logs xingrin-server --tail 50 # 检查配置文件 cat docker/.env # 重新生成配置 cp docker/.env.example docker/.env # 重新配置后启动 ``` ### 日志查看 ```bash # 实时查看日志 docker logs -f xingrin-server docker logs -f xingrin-agent # 查看最近日志 docker logs --tail 100 xingrin-server docker logs --tail 100 xingrin-agent # 查看系统日志 tail -f /opt/xingrin/logs/*.log ``` ## 下一步 安装完成后,建议阅读: - [版本管理文档](./version-management.md) - 了解系统更新机制 - [API 文档](./api.md) - 集成开发接口(🚧 待完善) - [最佳实践](./best-practices.md) - 使用建议和优化(🚧 待完善) ## 获得帮助 - 📖 [技术文档](./README.md) - 🐛 [问题反馈](https://github.com/你的用户名/xingrin/issues) - 💬 [讨论区](https://github.com/你的用户名/xingrin/discussions) - 📧 联系邮箱: your-email@example.com ================================================ FILE: docs/scan-flow-architecture.md ================================================ # 扫描流程架构 ## 完整扫描流程 ```mermaid flowchart TB START[Start Scan] TARGET[Input Target] START --> TARGET subgraph STAGE1["Stage 1: Discovery Sequential"] direction TB subgraph SUB["Subdomain Discovery"] direction TB SUBFINDER[subfinder] AMASS[amass] SUBLIST3R[sublist3r] ASSETFINDER[assetfinder] MERGE[Merge & Deduplicate] BRUTEFORCE[puredns bruteforce
    Dictionary Attack] MUTATE[dnsgen + puredns
    Mutation Generation] RESOLVE[puredns resolve
    Alive Verification] SUBFINDER --> MERGE AMASS --> MERGE SUBLIST3R --> MERGE ASSETFINDER --> MERGE MERGE --> BRUTEFORCE BRUTEFORCE --> MUTATE MUTATE --> RESOLVE end subgraph PORT["Port Scan"] NAABU[naabu
    Port Discovery] end subgraph SITE["Site Scan"] HTTPX1[httpx
    Web Service Detection] end subgraph FINGER["Fingerprint Detect"] XINGFINGER[xingfinger
    Tech Stack Detection] end RESOLVE --> NAABU NAABU --> HTTPX1 HTTPX1 --> XINGFINGER end TARGET --> SUBFINDER TARGET --> AMASS TARGET --> SUBLIST3R TARGET --> ASSETFINDER subgraph STAGE2["Stage 2: URL Collection Parallel"] direction TB subgraph URL["URL Fetch"] direction TB WAYMORE[waymore
    Historical URLs] KATANA[katana
    Crawler] URO[uro
    URL Deduplication] HTTPX2[httpx
    Alive Verification] WAYMORE --> URO KATANA --> URO URO --> HTTPX2 end subgraph DIR["Directory Scan"] FFUF[ffuf
    Directory Bruteforce] end end XINGFINGER --> WAYMORE XINGFINGER --> KATANA XINGFINGER --> FFUF subgraph STAGE3["Stage 3: Screenshot Sequential"] direction TB SCREENSHOT[Playwright
    Page Screenshot] end HTTPX2 --> SCREENSHOT FFUF --> SCREENSHOT subgraph STAGE4["Stage 4: Security Checks"] direction TB subgraph VULN["Security Checks"] direction LR DALFOX[dalfox
    XSS Check] NUCLEI[nuclei
    Security Check] end end SCREENSHOT --> DALFOX SCREENSHOT --> NUCLEI DALFOX --> FINISH NUCLEI --> FINISH FINISH[Scan Complete] style START fill:#ff9999 style FINISH fill:#99ff99 style TARGET fill:#ffcc99 style STAGE1 fill:#e6f3ff style STAGE2 fill:#fff4e6 style STAGE3 fill:#ffe6f0 ``` ## 执行阶段定义 ```python # backend/apps/scan/configs/command_templates.py # Stage 1: 资产发现 - 子域名 → 端口 → 站点探测 → 指纹识别 # Stage 2: URL 收集 - URL 获取 + 目录扫描(并行) # Stage 3: 截图 - 在 URL 收集完成后执行,捕获更多发现的页面 # Stage 4: 安全检测 - 最后执行 EXECUTION_STAGES = [ {'mode': 'sequential', 'flows': ['subdomain_discovery', 'port_scan', 'site_scan', 'fingerprint_detect']}, {'mode': 'parallel', 'flows': ['url_fetch', 'directory_scan']}, {'mode': 'sequential', 'flows': ['screenshot']}, {'mode': 'sequential', 'flows': ['vuln_scan']}, ] ``` ## 各阶段输出 | Flow | 工具 | 输出表 | |------|------|--------| | subdomain_discovery | subfinder, amass, sublist3r, assetfinder, puredns | Subdomain | | port_scan | naabu | HostPortMapping | | site_scan | httpx | WebSite | | fingerprint_detect | xingfinger | WebSite.tech(更新) | | url_fetch | waymore, katana, uro, httpx | Endpoint | | directory_scan | ffuf | Directory | | screenshot | Playwright | Screenshot | | vuln_scan | dalfox, nuclei | SecurityFinding | ================================================ FILE: docs/version-management.md ================================================ # XingRin - 星环 版本管理架构 ## 概述 XingRin - 星环 采用基于 Git Tag 的自动化版本管理系统,确保所有组件(主服务器、远程 Worker)使用一致的版本,避免兼容性问题。 ## 核心原理 ### 版本号来源 - **单一版本源**:Git Tag(如 `v1.1.0`) - **版本文件**:`VERSION` 文件由 CI 自动维护 - **环境变量**:`IMAGE_TAG` 锁定运行时版本 ### 版本一致性保证 ``` Git Tag → CI 构建镜像 → VERSION 文件 → IMAGE_TAG → 所有节点统一版本 ``` ## 完整发布流程 ```mermaid graph TD A[开发完成] --> B[git commit & push] B --> C[git tag v1.1.0] C --> D[git push --tags] D --> E[GitHub Actions 触发] E --> F[构建 5 个镜像] F --> G[推送到 Docker Hub] G --> H[更新 VERSION 文件] H --> I[commit 回 main 分支] style E fill:#e1f5fe style F fill:#f3e5f5 style G fill:#e8f5e8 ``` ### 镜像构建矩阵 | 镜像 | 用途 | 标签 | |------|------|------| | `xingrin-server` | 主服务器 | `v1.1.0` + `latest` | | `xingrin-frontend` | 前端界面 | `v1.1.0` + `latest` | | `xingrin-nginx` | 反向代理 | `v1.1.0` + `latest` | | `xingrin-worker` | 任务执行 | `v1.1.0` + `latest` | | `xingrin-agent` | 心跳监控 | `v1.1.0` + `latest` | ## 用户部署流程 ### 初始安装 ```mermaid graph TD A[用户下载代码] --> B[sudo ./install.sh] B --> C[读取 VERSION 文件] C --> D[写入 docker/.env] D --> E[IMAGE_TAG=v1.1.0] E --> F[拉取对应版本镜像] F --> G[启动服务] style C fill:#fff3e0 style E fill:#e8f5e8 ``` ### 版本更新 ```mermaid graph TD A[./update.sh] --> B[git pull 拉取新代码] B --> C[读取新 VERSION 文件] C --> D[更新 IMAGE_TAG=v1.2.0] D --> E[重启服务] E --> F[使用新版本镜像] style C fill:#fff3e0 style D fill:#e8f5e8 ``` ## 任务分发架构 ### 镜像版本管理 ```mermaid graph LR A[主服务器] --> B[task_distributor] B --> C[本地 Worker] B --> D[远程 Worker 1] B --> E[远程 Worker N] F[settings.IMAGE_TAG] --> B B --> G[yyhuni/xingrin-worker:v1.1.0] G --> C G --> D G --> E style F fill:#e1f5fe style G fill:#f3e5f5 ``` ### 执行流程对比 | 场景 | 镜像拉取策略 | 说明 | |------|-------------|------| | **本地 Worker** | `--pull=missing` | 主服务器本机执行,使用本地镜像 | | **远程 Worker** | `--pull=missing` | SSH 到远程执行,使用远程本地镜像 | ## 镜像拉取策略 ### 安装时预拉取 ```bash # 主服务器安装 docker compose up -d # 拉取所有服务镜像 # 远程 Worker 安装 docker pull yyhuni/xingrin-worker:v1.1.0 # 预拉取 worker 镜像 ``` ### 执行时策略 ```bash # 任务执行时 docker run --pull=missing yyhuni/xingrin-worker:v1.1.0 ``` **`--pull=missing` 行为**: - ✅ 本地有镜像 → 直接使用,不检查网络 - ✅ 本地无镜像 → 从 Docker Hub 拉取 - ✅ 版本更新后 → 自动拉取新版本 ## 版本同步机制 ### 主服务器更新 ```mermaid sequenceDiagram participant U as 用户 participant S as 主服务器 participant H as Docker Hub participant W as 远程 Worker U->>S: ./update.sh S->>S: git pull (新 VERSION) S->>S: IMAGE_TAG=v1.2.0 S->>S: 重启服务 Note over S: 分发任务时 S->>W: SSH docker run worker:v1.2.0 W->>H: 本地无 v1.2.0,拉取镜像 H->>W: 返回 v1.2.0 镜像 W->>W: 执行任务 ``` ### 版本一致性保证 1. **主服务器**:`IMAGE_TAG` 锁定版本 2. **远程 Worker**:按需拉取对应版本 3. **自动同步**:update.sh 统一更新版本号 ## Agent 自动更新机制 ### 概述 Agent 是运行在每个 Worker 节点上的轻量级心跳服务(~10MB),负责上报节点状态和负载信息。当主服务器更新后,Agent 需要同步更新以保持版本一致。 ### 版本检测流程 ```mermaid sequenceDiagram participant A as Agent participant S as Server participant H as Docker Hub A->>S: POST /api/workers/{id}/heartbeat/ Note right of A: {"cpu": 50, "mem": 60, "version": "v1.0.8"} S->>S: 比较 agent_version vs IMAGE_TAG alt 版本匹配 S->>A: {"status": "ok", "need_update": false} else 版本不匹配 (远程 Worker) S->>S: 设置状态为 updating S->>A: {"status": "ok", "need_update": true} S-->>H: SSH: docker pull agent:v1.0.19 S-->>A: SSH: 重启 agent 容器 else 版本不匹配 (本地 Worker) S->>S: 设置状态为 outdated S->>A: {"status": "ok", "need_update": true} Note over S: 需用户手动 ./update.sh end ``` ### Worker 状态流转 | 场景 | 状态变化 | 说明 | |------|---------|------| | 首次心跳 | `pending/deploying` → `online` | Agent 启动成功 | | 远程 Worker 版本不匹配 | `online` → `updating` → `online` | 服务端自动 SSH 更新 | | 远程 Worker 更新失败 | `updating` → `outdated` | SSH 执行失败 | | 本地 Worker 版本不匹配 | `online` → `outdated` | 需手动 update.sh | | 版本匹配 | `updating/outdated` → `online` | 恢复正常 | ### 更新触发条件 1. **远程 Worker**:服务端检测到版本不匹配时,自动通过 SSH 执行更新 2. **本地 Worker**:用户执行 `./update.sh` 时,docker-compose 会拉取新镜像并重启 ### 防重复机制 使用 Redis 锁防止同一 Worker 在 60 秒内重复触发更新: ``` lock_key = f"agent_update_lock:{worker_id}" redis.set(lock_key, "1", nx=True, ex=60) ``` ### 相关文件 | 文件 | 作用 | |------|------| | `backend/apps/engine/views/worker_views.py` | 心跳 API,版本检测和更新触发 | | `backend/scripts/worker-deploy/agent.sh` | Agent 心跳脚本,上报版本号 | | `backend/scripts/worker-deploy/start-agent.sh` | Agent 启动脚本 | | `docker/agent/Dockerfile` | Agent 镜像构建,注入 IMAGE_TAG | ## 开发环境配置 ### 本地开发测试 ```bash # docker/.env 中添加(开发模式会自动设置) TASK_EXECUTOR_IMAGE=docker-worker:v1.1.0-dev # 指向本地构建镜像 ``` ### 开发模式启动 ```bash # 使用本地构建镜像(自动构建并标记为 ${VERSION}-dev) ./install.sh --dev ./start.sh --dev ``` ## 配置文件说明 ### VERSION 文件 ``` v1.1.0 ``` - 由 CI 自动维护 - 用户安装时读取此文件 ### docker/.env ```bash IMAGE_TAG=v1.1.0 # 锁定版本 TASK_EXECUTOR_IMAGE= # 可选:覆盖镜像名 ``` ### settings.py 逻辑 ```python if IMAGE_TAG: # 主服务器:构建镜像名 TASK_EXECUTOR_IMAGE = f'{DOCKER_USER}/xingrin-worker:{IMAGE_TAG}' else: # Worker 容器:不需要此配置 TASK_EXECUTOR_IMAGE = '' ``` ## Agent 自动更新机制 ### 概述 Agent 是运行在每个 Worker 节点上的轻量级心跳服务,负责上报节点状态和负载信息。当主服务器更新后,Agent 需要同步更新以保持版本一致。 ### 版本检测流程 ### 版本不一致问题 **症状**:任务执行失败,兼容性错误 **排查**: ```bash # 检查主服务器版本 cat VERSION grep IMAGE_TAG docker/.env # 检查远程 Worker 镜像 ssh worker_host "docker images | grep xingrin-worker" ``` **解决**: ```bash # 主服务器更新 ./update.sh # 远程 Worker 会自动拉取新版本(下次任务执行时) ``` ### 镜像拉取失败 **症状**:`docker run` 报错,无法拉取镜像 **排查**: ```bash # 检查网络连接 docker pull yyhuni/xingrin-worker:v1.1.0 # 检查版本是否存在 curl -s https://hub.docker.com/v2/repositories/yyhuni/xingrin-worker/tags/ ``` ## 最佳实践 ### 版本发布 1. ✅ 严格遵循语义化版本(v1.2.3) 2. ✅ 有改动必须更新版本号 3. ✅ 通过 CI 自动构建,不手动推送 4. ✅ 测试版本使用 `-dev.x` 后缀 ### 部署运维 1. ✅ 定期执行 `./update.sh` 获取更新 2. ✅ 监控 Docker Hub 镜像拉取状态 3. ✅ 备份重要配置文件(.env) 4. ✅ 使用 `docker system prune` 清理旧镜像 ### 开发调试 1. ✅ 本地测试使用 `--dev` 模式(自动构建 `docker-worker:${VERSION}-dev`) 2. ✅ 远程测试先推送测试版本到 Hub 3. ✅ 生产环境避免使用 `latest` 标签,始终使用明确版本号 4. ✅ 开发环境使用 `-dev` 后缀区分开发版本 5. ✅ 版本回滚通过修改 `IMAGE_TAG` 实现 ================================================ FILE: docs/wordlist-architecture.md ================================================ # 字典文件管理架构 本文档介绍 XingRin 中字典文件的存储、同步和使用机制。 ## 目录结构 ``` /opt/xingrin/wordlists/ ├── common.txt # 通用字典 ├── subdomains.txt # 子域名字典 ├── directories.txt # 目录字典 └── ... ``` ## 一、存储位置 | 配置项 | 默认值 | 说明 | |--------|--------|------| | `WORDLISTS_BASE_PATH` | `/opt/xingrin/wordlists` | 字典文件存储目录 | ## 二、数据模型 ``` Wordlist ├── id # 字典 ID ├── name # 字典名称(唯一,用于查询) ├── description # 描述 ├── file_path # 文件绝对路径 ├── file_size # 文件大小(字节) ├── line_count # 行数 └── file_hash # SHA256 哈希值(用于校验) ``` ## 三、Server 端上传流程 1. 用户在前端上传字典文件 2. `WordlistService.create_wordlist()` 处理: - 保存文件到 `WORDLISTS_BASE_PATH` 目录 - 计算 SHA256 哈希值 - 统计文件大小和行数 - 创建数据库记录 ```mermaid flowchart TB subgraph SERVER["🖥️ Server 容器"] direction TB subgraph UI["前端 UI"] direction LR UPLOAD["📤 上传字典
    选择文件"] EDIT["✏️ 编辑内容
    在线修改"] DELETE["🗑️ 删除字典"] end UPLOAD --> API EDIT --> API subgraph API["API 层"] VIEWSET["WordlistViewSet
    POST /api/wordlists/
    PUT .../content/"] end API --> SERVICE subgraph SERVICE["业务逻辑层"] CREATE["create_wordlist()
    创建字典"] UPDATE["update_wordlist_content()
    更新字典内容"] end CREATE --> PROCESS UPDATE --> PROCESS subgraph PROCESS["处理流程"] direction TB STEP1["1️⃣ 保存文件到
    /opt/xingrin/wordlists/"] STEP2["2️⃣ 计算 SHA256 哈希值"] STEP3["3️⃣ 统计文件大小和行数"] STEP4["4️⃣ 创建/更新数据库记录"] STEP1 --> STEP2 STEP2 --> STEP3 STEP3 --> STEP4 end STEP4 --> DB STEP1 --> FS subgraph DB["💾 PostgreSQL 数据库"] DBRECORD["INSERT INTO wordlist
    name: 'subdomains'
    file_path: '/opt/xingrin/wordlists/subdomains.txt'
    file_size: 1024000
    line_count: 50000
    file_hash: 'sha256...'"] end subgraph FS["📁 文件系统"] FILES["/opt/xingrin/wordlists/
    ├── common.txt
    ├── subdomains.txt
    └── directories.txt"] end end style SERVER fill:#e6f3ff style UI fill:#fff4e6 style API fill:#f0f0f0 style SERVICE fill:#d4edda style PROCESS fill:#ffe6f0 style DB fill:#cce5ff style FS fill:#e2e3e5 ``` ## 四、Worker 端获取流程 Worker 执行扫描任务时,通过 `ensure_wordlist_local()` 获取字典: 1. 根据字典名称查询数据库,获取 `file_path` 和 `file_hash` 2. 检查本地是否存在字典文件 - 存在且 hash 匹配:直接使用 - 存在但 hash 不匹配:重新下载 - 不存在:从 Server API 下载 3. 下载地址:`GET /api/wordlists/download/?wordlist=` 4. 返回本地字典文件路径 ```mermaid flowchart TB subgraph WORKER["🔧 Worker 容器"] direction TB START["🎯 扫描任务
    需要字典"] START --> ENSURE ENSURE["ensure_wordlist_local()
    参数: wordlist_name"] ENSURE --> QUERY QUERY["📊 查询 PostgreSQL
    获取 file_path, file_hash"] QUERY --> CHECK CHECK{"🔍 检查本地文件
    /opt/xingrin/wordlists/"} CHECK -->|不存在| DOWNLOAD CHECK -->|存在| HASH HASH["🔐 计算本地文件 SHA256
    与数据库 hash 比较"] HASH -->|一致| USE HASH -->|不一致| DOWNLOAD DOWNLOAD["📥 从 Server API 下载
    GET /api/wordlists/download/?wordlist=name"] DOWNLOAD --> SERVER SERVER["🌐 HTTP Request"] SERVER -.请求.-> API["Server (Django)
    返回文件内容"] API -.响应.-> SERVER SERVER --> SAVE SAVE["💾 保存到本地
    /opt/xingrin/wordlists/filename"] SAVE --> RETURN USE["✅ 直接使用"] --> RETURN RETURN["📂 返回本地字典文件路径
    /opt/xingrin/wordlists/subdomains.txt"] RETURN --> EXEC EXEC["🚀 执行扫描工具
    puredns bruteforce -w /opt/xingrin/wordlists/xxx.txt"] end style WORKER fill:#e6f3ff style START fill:#fff4e6 style CHECK fill:#ffe6f0 style HASH fill:#ffe6f0 style USE fill:#d4edda style DOWNLOAD fill:#f8d7da style RETURN fill:#d4edda style EXEC fill:#cce5ff ``` ## 五、Hash 校验机制 - 上传时计算 SHA256 并存入数据库 - Worker 使用前校验本地文件 hash - 不匹配时自动重新下载 - 确保所有节点使用相同内容的字典 ## 六、本地 Worker vs 远程 Worker 本地 Worker 和远程 Worker 获取字典的方式相同: 1. 从数据库查询字典元数据(file_hash) 2. 检查本地缓存是否存在且 hash 匹配 3. 不匹配则通过 HTTP API 下载 **注意**:Worker 容器只挂载了 `results` 和 `logs` 目录,没有挂载 `wordlists` 目录,所以字典文件需要通过 API 下载。 ```mermaid sequenceDiagram participant W as Worker (本地/远程) participant DB as PostgreSQL participant S as Server API participant FS as 本地缓存 W->>DB: 1️⃣ 查询数据库获取 file_hash DB-->>W: 返回 file_hash W->>FS: 2️⃣ 检查本地缓存 alt 存在且 hash 匹配 FS-->>W: ✅ 直接使用 else 不存在或不匹配 W->>S: 3️⃣ GET /api/wordlists/download/ S-->>W: 4️⃣ 返回文件内容 W->>FS: 5️⃣ 保存到本地缓存
    /opt/xingrin/wordlists/ FS-->>W: ✅ 使用缓存文件 end Note over W,FS: 本地 Worker 优势:
    • 网络延迟更低(容器内网络)
    • 缓存可复用(同一宿主机多次任务) ``` ### 本地 Worker 的优势 虽然获取方式相同,但本地 Worker 有以下优势: - 网络延迟更低(容器内网络) - 下载后的缓存可复用(同一宿主机上的多次任务) ## 七、配置项 在 `docker/.env` 或环境变量中配置: ```bash # 字典文件存储目录 WORDLISTS_PATH=/opt/xingrin/wordlists # Server 地址(Worker 用于下载文件) PUBLIC_HOST=your-server-ip # 远程 Worker 会通过 https://{PUBLIC_HOST}/api 访问 SERVER_PORT=8888 # 后端容器内部端口,仅 Docker 内网监听 ``` ## 八、常见问题 ### Q: 字典文件更新后 Worker 没有使用新版本? A: 更新字典内容后会重新计算 hash,Worker 下次使用时会检测到 hash 不匹配并重新下载。 ### Q: 远程 Worker 下载文件失败? A: 检查: 1. `PUBLIC_HOST` 是否配置为 Server 的外网 IP 或域名 2. Nginx 8083 (HTTPS) 是否可达(远程 Worker 通过 nginx 访问后端) 3. Worker 到 Server 的网络是否通畅 ### Q: 如何批量导入字典? A: 目前只支持通过前端逐个上传,后续可能支持批量导入功能。 ================================================ FILE: frontend/.gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.* .yarn/* !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/versions # testing /coverage # next.js /.next/ /out/ # production /build # misc .DS_Store *.pem # debug npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* # env files (can opt-in for committing if needed) .env* # vercel .vercel # typescript *.tsbuildinfo next-env.d.ts certificates ================================================ FILE: frontend/app/[locale]/dashboard/data.json ================================================ [ { "id": 1, "header": "Cover page", "type": "Cover page", "status": "In Process", "target": "18", "limit": "5", "reviewer": "Eddie Lake" }, { "id": 2, "header": "Table of contents", "type": "Table of contents", "status": "Done", "target": "29", "limit": "24", "reviewer": "Eddie Lake" }, { "id": 3, "header": "Executive summary", "type": "Narrative", "status": "Done", "target": "10", "limit": "13", "reviewer": "Eddie Lake" }, { "id": 4, "header": "Technical approach", "type": "Narrative", "status": "Done", "target": "27", "limit": "23", "reviewer": "Jamik Tashpulatov" }, { "id": 5, "header": "Design", "type": "Narrative", "status": "In Process", "target": "2", "limit": "16", "reviewer": "Jamik Tashpulatov" }, { "id": 6, "header": "Capabilities", "type": "Narrative", "status": "In Process", "target": "20", "limit": "8", "reviewer": "Jamik Tashpulatov" }, { "id": 7, "header": "Integration with existing systems", "type": "Narrative", "status": "In Process", "target": "19", "limit": "21", "reviewer": "Jamik Tashpulatov" }, { "id": 8, "header": "Innovation and Advantages", "type": "Narrative", "status": "Done", "target": "25", "limit": "26", "reviewer": "Assign reviewer" }, { "id": 9, "header": "Overview of EMR's Innovative Solutions", "type": "Technical content", "status": "Done", "target": "7", "limit": "23", "reviewer": "Assign reviewer" }, { "id": 10, "header": "Advanced Algorithms and Machine Learning", "type": "Narrative", "status": "Done", "target": "30", "limit": "28", "reviewer": "Assign reviewer" }, { "id": 11, "header": "Adaptive Communication Protocols", "type": "Narrative", "status": "Done", "target": "9", "limit": "31", "reviewer": "Assign reviewer" }, { "id": 12, "header": "Advantages Over Current Technologies", "type": "Narrative", "status": "Done", "target": "12", "limit": "0", "reviewer": "Assign reviewer" }, { "id": 13, "header": "Past Performance", "type": "Narrative", "status": "Done", "target": "22", "limit": "33", "reviewer": "Assign reviewer" }, { "id": 14, "header": "Customer Feedback and Satisfaction Levels", "type": "Narrative", "status": "Done", "target": "15", "limit": "34", "reviewer": "Assign reviewer" }, { "id": 15, "header": "Implementation Challenges and Solutions", "type": "Narrative", "status": "Done", "target": "3", "limit": "35", "reviewer": "Assign reviewer" }, { "id": 16, "header": "Security Measures and Data Protection Policies", "type": "Narrative", "status": "In Process", "target": "6", "limit": "36", "reviewer": "Assign reviewer" }, { "id": 17, "header": "Scalability and Future Proofing", "type": "Narrative", "status": "Done", "target": "4", "limit": "37", "reviewer": "Assign reviewer" }, { "id": 18, "header": "Cost-Benefit Analysis", "type": "Plain language", "status": "Done", "target": "14", "limit": "38", "reviewer": "Assign reviewer" }, { "id": 19, "header": "User Training and Onboarding Experience", "type": "Narrative", "status": "Done", "target": "17", "limit": "39", "reviewer": "Assign reviewer" }, { "id": 20, "header": "Future Development Roadmap", "type": "Narrative", "status": "Done", "target": "11", "limit": "40", "reviewer": "Assign reviewer" }, { "id": 21, "header": "System Architecture Overview", "type": "Technical content", "status": "In Process", "target": "24", "limit": "18", "reviewer": "Maya Johnson" }, { "id": 22, "header": "Risk Management Plan", "type": "Narrative", "status": "Done", "target": "15", "limit": "22", "reviewer": "Carlos Rodriguez" }, { "id": 23, "header": "Compliance Documentation", "type": "Legal", "status": "In Process", "target": "31", "limit": "27", "reviewer": "Sarah Chen" }, { "id": 24, "header": "API Documentation", "type": "Technical content", "status": "Done", "target": "8", "limit": "12", "reviewer": "Raj Patel" }, { "id": 25, "header": "User Interface Mockups", "type": "Visual", "status": "In Process", "target": "19", "limit": "25", "reviewer": "Leila Ahmadi" }, { "id": 26, "header": "Database Schema", "type": "Technical content", "status": "Done", "target": "22", "limit": "20", "reviewer": "Thomas Wilson" }, { "id": 27, "header": "Testing Methodology", "type": "Technical content", "status": "In Process", "target": "17", "limit": "14", "reviewer": "Assign reviewer" }, { "id": 28, "header": "Deployment Strategy", "type": "Narrative", "status": "Done", "target": "26", "limit": "30", "reviewer": "Eddie Lake" }, { "id": 29, "header": "Budget Breakdown", "type": "Financial", "status": "In Process", "target": "13", "limit": "16", "reviewer": "Jamik Tashpulatov" }, { "id": 30, "header": "Market Analysis", "type": "Research", "status": "Done", "target": "29", "limit": "32", "reviewer": "Sophia Martinez" }, { "id": 31, "header": "Competitor Comparison", "type": "Research", "status": "In Process", "target": "21", "limit": "19", "reviewer": "Assign reviewer" }, { "id": 32, "header": "Maintenance Plan", "type": "Technical content", "status": "Done", "target": "16", "limit": "23", "reviewer": "Alex Thompson" }, { "id": 33, "header": "User Personas", "type": "Research", "status": "In Process", "target": "27", "limit": "24", "reviewer": "Nina Patel" }, { "id": 34, "header": "Accessibility Compliance", "type": "Legal", "status": "Done", "target": "18", "limit": "21", "reviewer": "Assign reviewer" }, { "id": 35, "header": "Performance Metrics", "type": "Technical content", "status": "In Process", "target": "23", "limit": "26", "reviewer": "David Kim" }, { "id": 36, "header": "Disaster Recovery Plan", "type": "Technical content", "status": "Done", "target": "14", "limit": "17", "reviewer": "Jamik Tashpulatov" }, { "id": 37, "header": "Third-party Integrations", "type": "Technical content", "status": "In Process", "target": "25", "limit": "28", "reviewer": "Eddie Lake" }, { "id": 38, "header": "User Feedback Summary", "type": "Research", "status": "Done", "target": "20", "limit": "15", "reviewer": "Assign reviewer" }, { "id": 39, "header": "Localization Strategy", "type": "Narrative", "status": "In Process", "target": "12", "limit": "19", "reviewer": "Maria Garcia" }, { "id": 40, "header": "Mobile Compatibility", "type": "Technical content", "status": "Done", "target": "28", "limit": "31", "reviewer": "James Wilson" }, { "id": 41, "header": "Data Migration Plan", "type": "Technical content", "status": "In Process", "target": "19", "limit": "22", "reviewer": "Assign reviewer" }, { "id": 42, "header": "Quality Assurance Protocols", "type": "Technical content", "status": "Done", "target": "30", "limit": "33", "reviewer": "Priya Singh" }, { "id": 43, "header": "Stakeholder Analysis", "type": "Research", "status": "In Process", "target": "11", "limit": "14", "reviewer": "Eddie Lake" }, { "id": 44, "header": "Environmental Impact Assessment", "type": "Research", "status": "Done", "target": "24", "limit": "27", "reviewer": "Assign reviewer" }, { "id": 45, "header": "Intellectual Property Rights", "type": "Legal", "status": "In Process", "target": "17", "limit": "20", "reviewer": "Sarah Johnson" }, { "id": 46, "header": "Customer Support Framework", "type": "Narrative", "status": "Done", "target": "22", "limit": "25", "reviewer": "Jamik Tashpulatov" }, { "id": 47, "header": "Version Control Strategy", "type": "Technical content", "status": "In Process", "target": "15", "limit": "18", "reviewer": "Assign reviewer" }, { "id": 48, "header": "Continuous Integration Pipeline", "type": "Technical content", "status": "Done", "target": "26", "limit": "29", "reviewer": "Michael Chen" }, { "id": 49, "header": "Regulatory Compliance", "type": "Legal", "status": "In Process", "target": "13", "limit": "16", "reviewer": "Assign reviewer" }, { "id": 50, "header": "User Authentication System", "type": "Technical content", "status": "Done", "target": "28", "limit": "31", "reviewer": "Eddie Lake" }, { "id": 51, "header": "Data Analytics Framework", "type": "Technical content", "status": "In Process", "target": "21", "limit": "24", "reviewer": "Jamik Tashpulatov" }, { "id": 52, "header": "Cloud Infrastructure", "type": "Technical content", "status": "Done", "target": "16", "limit": "19", "reviewer": "Assign reviewer" }, { "id": 53, "header": "Network Security Measures", "type": "Technical content", "status": "In Process", "target": "29", "limit": "32", "reviewer": "Lisa Wong" }, { "id": 54, "header": "Project Timeline", "type": "Planning", "status": "Done", "target": "14", "limit": "17", "reviewer": "Eddie Lake" }, { "id": 55, "header": "Resource Allocation", "type": "Planning", "status": "In Process", "target": "27", "limit": "30", "reviewer": "Assign reviewer" }, { "id": 56, "header": "Team Structure and Roles", "type": "Planning", "status": "Done", "target": "20", "limit": "23", "reviewer": "Jamik Tashpulatov" }, { "id": 57, "header": "Communication Protocols", "type": "Planning", "status": "In Process", "target": "15", "limit": "18", "reviewer": "Assign reviewer" }, { "id": 58, "header": "Success Metrics", "type": "Planning", "status": "Done", "target": "30", "limit": "33", "reviewer": "Eddie Lake" }, { "id": 59, "header": "Internationalization Support", "type": "Technical content", "status": "In Process", "target": "23", "limit": "26", "reviewer": "Jamik Tashpulatov" }, { "id": 60, "header": "Backup and Recovery Procedures", "type": "Technical content", "status": "Done", "target": "18", "limit": "21", "reviewer": "Assign reviewer" }, { "id": 61, "header": "Monitoring and Alerting System", "type": "Technical content", "status": "In Process", "target": "25", "limit": "28", "reviewer": "Daniel Park" }, { "id": 62, "header": "Code Review Guidelines", "type": "Technical content", "status": "Done", "target": "12", "limit": "15", "reviewer": "Eddie Lake" }, { "id": 63, "header": "Documentation Standards", "type": "Technical content", "status": "In Process", "target": "27", "limit": "30", "reviewer": "Jamik Tashpulatov" }, { "id": 64, "header": "Release Management Process", "type": "Planning", "status": "Done", "target": "22", "limit": "25", "reviewer": "Assign reviewer" }, { "id": 65, "header": "Feature Prioritization Matrix", "type": "Planning", "status": "In Process", "target": "19", "limit": "22", "reviewer": "Emma Davis" }, { "id": 66, "header": "Technical Debt Assessment", "type": "Technical content", "status": "Done", "target": "24", "limit": "27", "reviewer": "Eddie Lake" }, { "id": 67, "header": "Capacity Planning", "type": "Planning", "status": "In Process", "target": "21", "limit": "24", "reviewer": "Jamik Tashpulatov" }, { "id": 68, "header": "Service Level Agreements", "type": "Legal", "status": "Done", "target": "26", "limit": "29", "reviewer": "Assign reviewer" } ] ================================================ FILE: frontend/app/[locale]/dashboard/page.tsx ================================================ import { DashboardStatCards } from "@/components/dashboard/dashboard-stat-cards" import { AssetTrendChart } from "@/components/dashboard/asset-trend-chart" import { VulnSeverityChart } from "@/components/dashboard/vuln-severity-chart" import { DashboardDataTable } from "@/components/dashboard/dashboard-data-table" /** * Dashboard page component * This is the main dashboard page of the application, containing cards, charts and data tables * Layout structure has been moved to the root layout component */ export default function Page() { return ( // Content area containing cards, charts and data tables
    {/* Top statistics cards */} {/* Chart area - Trend chart + Vulnerability distribution */}
    {/* Asset trend line chart */} {/* Vulnerability severity distribution */}
    {/* Vulnerabilities / Scan history tab */}
    ) } ================================================ FILE: frontend/app/[locale]/layout.tsx ================================================ import type React from "react" import type { Metadata } from "next" import { NextIntlClientProvider } from 'next-intl' import { getMessages, setRequestLocale, getTranslations } from 'next-intl/server' import { notFound } from 'next/navigation' import { locales, localeHtmlLang, type Locale } from '@/i18n/config' // Import global style files import "../globals.css" // Import Noto Sans SC local font import "@fontsource/noto-sans-sc/400.css" import "@fontsource/noto-sans-sc/500.css" import "@fontsource/noto-sans-sc/700.css" // Import color themes import "@/styles/themes/bubblegum.css" import "@/styles/themes/quantum-rose.css" import "@/styles/themes/clean-slate.css" import "@/styles/themes/cosmic-night.css" import "@/styles/themes/vercel.css" import "@/styles/themes/vercel-dark.css" import "@/styles/themes/violet-bloom.css" import "@/styles/themes/cyberpunk-1.css" import { Suspense } from "react" import Script from "next/script" import { QueryProvider } from "@/components/providers/query-provider" import { ThemeProvider } from "@/components/providers/theme-provider" import { UiI18nProvider } from "@/components/providers/ui-i18n-provider" // Import common layout components import { RoutePrefetch } from "@/components/route-prefetch" import { RouteProgress } from "@/components/route-progress" import { AuthLayout } from "@/components/auth/auth-layout" // Dynamically generate metadata export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: 'metadata' }) return { title: t('title'), description: t('description'), keywords: t('keywords').split(',').map(k => k.trim()), generator: "Xingrin ASM Platform", authors: [{ name: "yyhuni" }], openGraph: { title: t('ogTitle'), description: t('ogDescription'), type: "website", locale: locale === 'zh' ? 'zh_CN' : 'en_US', }, robots: { index: true, follow: true, }, } } // Use Noto Sans SC + system font fallback, fully loaded locally const fontConfig = { className: "font-sans", style: { fontFamily: "'Noto Sans SC', system-ui, -apple-system, PingFang SC, Hiragino Sans GB, Microsoft YaHei, sans-serif" } } // Generate static parameters, support all languages export function generateStaticParams() { return locales.map((locale) => ({ locale })) } interface Props { children: React.ReactNode params: Promise<{ locale: string }> } /** * Language layout component * Wraps all pages, provides internationalization context */ export default async function LocaleLayout({ children, params, }: Props) { const { locale } = await params // Validate locale validity if (!locales.includes(locale as Locale)) { notFound() } // Enable static rendering setRequestLocale(locale) // Load translation messages const messages = await getMessages() return ( {/* Load external scripts */} ', param: 'q', payload: '', evidence: '', cwe: 'CWE-79', }, createdAt: '2024-12-28T10:30:00Z', }, { id: 2, target: 1, url: 'https://api.acme.com/v1/users', vulnType: 'CVE-2024-1234', severity: 'high', source: 'nuclei', cvssScore: 8.5, description: 'SQL Injection in user API endpoint', rawOutput: { 'template-id': 'CVE-2024-1234', 'matched-at': 'https://api.acme.com/v1/users', host: 'api.acme.com', info: { name: 'SQL Injection', description: 'SQL injection vulnerability in user endpoint', severity: 'high', tags: ['sqli', 'cve'], reference: ['https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-1234'], classification: { 'cve-id': 'CVE-2024-1234', 'cwe-id': ['CWE-89'], }, }, }, createdAt: '2024-12-28T10:45:00Z', }, { id: 3, target: 1, url: 'https://acme.com/login', vulnType: 'xss-stored', severity: 'high', source: 'dalfox', cvssScore: 8.2, description: 'Stored XSS in user profile', rawOutput: { type: 'S', inject_type: 'inHTML-TAG', method: 'POST', param: 'bio', payload: '', }, createdAt: '2024-12-27T14:20:00Z', }, { id: 4, target: 2, url: 'https://acme.io/api/config', vulnType: 'information-disclosure', severity: 'medium', source: 'nuclei', cvssScore: 5.3, description: 'Exposed configuration file', rawOutput: { 'template-id': 'exposed-config', 'matched-at': 'https://acme.io/api/config', host: 'acme.io', info: { name: 'Exposed Configuration', description: 'Configuration file accessible without authentication', severity: 'medium', tags: ['exposure', 'config'], }, }, createdAt: '2024-12-27T15:00:00Z', }, { id: 5, target: 3, url: 'https://techstart.io/admin', vulnType: 'open-redirect', severity: 'medium', source: 'nuclei', cvssScore: 4.7, description: 'Open redirect vulnerability', rawOutput: { 'template-id': 'open-redirect', 'matched-at': 'https://techstart.io/admin?redirect=evil.com', host: 'techstart.io', info: { name: 'Open Redirect', description: 'URL redirect without validation', severity: 'medium', tags: ['redirect'], }, }, createdAt: '2024-12-26T09:30:00Z', }, { id: 6, target: 4, url: 'https://globalfinance.com/.git/config', vulnType: 'git-config-exposure', severity: 'high', source: 'nuclei', cvssScore: 7.5, description: 'Git configuration file exposed', rawOutput: { 'template-id': 'git-config', 'matched-at': 'https://globalfinance.com/.git/config', host: 'globalfinance.com', info: { name: 'Git Config Exposure', description: 'Git configuration file is publicly accessible', severity: 'high', tags: ['git', 'exposure'], }, }, createdAt: '2024-12-25T11:15:00Z', }, { id: 7, target: 8, url: 'https://retailmax.com/product?id=1', vulnType: 'sqli', severity: 'critical', source: 'nuclei', cvssScore: 9.8, description: 'SQL Injection in product parameter', rawOutput: { 'template-id': 'generic-sqli', 'matched-at': "https://retailmax.com/product?id=1'", host: 'retailmax.com', info: { name: 'SQL Injection', description: 'SQL injection in product ID parameter', severity: 'critical', tags: ['sqli'], classification: { 'cwe-id': ['CWE-89'], }, }, }, createdAt: '2024-12-21T12:00:00Z', }, { id: 8, target: 1, url: 'https://acme.com/robots.txt', vulnType: 'robots-txt-exposure', severity: 'info', source: 'nuclei', description: 'Robots.txt file found', rawOutput: { 'template-id': 'robots-txt', 'matched-at': 'https://acme.com/robots.txt', host: 'acme.com', info: { name: 'Robots.txt', description: 'Robots.txt file detected', severity: 'info', tags: ['misc'], }, }, createdAt: '2024-12-28T10:00:00Z', }, { id: 9, target: 2, url: 'https://acme.io/sitemap.xml', vulnType: 'sitemap-exposure', severity: 'info', source: 'nuclei', description: 'Sitemap.xml file found', rawOutput: { 'template-id': 'sitemap-xml', 'matched-at': 'https://acme.io/sitemap.xml', host: 'acme.io', info: { name: 'Sitemap.xml', description: 'Sitemap.xml file detected', severity: 'info', tags: ['misc'], }, }, createdAt: '2024-12-27T14:00:00Z', }, { id: 10, target: 3, url: 'https://techstart.io/api/v2/debug', vulnType: 'debug-endpoint', severity: 'low', source: 'nuclei', cvssScore: 3.1, description: 'Debug endpoint exposed', rawOutput: { 'template-id': 'debug-endpoint', 'matched-at': 'https://techstart.io/api/v2/debug', host: 'techstart.io', info: { name: 'Debug Endpoint', description: 'Debug endpoint accessible in production', severity: 'low', tags: ['debug', 'exposure'], }, }, createdAt: '2024-12-26T10:00:00Z', }, ] export function getMockVulnerabilities(params?: { page?: number pageSize?: number targetId?: number severity?: VulnerabilitySeverity search?: string }): GetVulnerabilitiesResponse { const page = params?.page || 1 const pageSize = params?.pageSize || 10 const targetId = params?.targetId const severity = params?.severity const search = params?.search?.toLowerCase() || '' let filtered = mockVulnerabilities if (targetId) { filtered = filtered.filter(v => v.target === targetId) } if (severity) { filtered = filtered.filter(v => v.severity === severity) } if (search) { filtered = filtered.filter( v => v.url.toLowerCase().includes(search) || v.vulnType.toLowerCase().includes(search) || v.description?.toLowerCase().includes(search) ) } const total = filtered.length const totalPages = Math.ceil(total / pageSize) const start = (page - 1) * pageSize const vulnerabilities = filtered.slice(start, start + pageSize) return { vulnerabilities, total, page, pageSize, totalPages, } } export function getMockVulnerabilityById(id: number): Vulnerability | undefined { return mockVulnerabilities.find(v => v.id === id) } ================================================ FILE: frontend/mock/data/websites.ts ================================================ import type { WebSite, WebSiteListResponse } from '@/types/website.types' export const mockWebsites: WebSite[] = [ { id: 1, target: 1, url: 'https://acme.com', host: 'acme.com', location: '', title: 'Acme Corporation - Home', webserver: 'nginx/1.24.0', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 45678, responseBody: '...', tech: ['React', 'Next.js', 'Node.js', 'Tailwind CSS'], vhost: false, subdomain: 'acme.com', createdAt: '2024-12-28T10:00:00Z', }, { id: 2, target: 1, url: 'https://www.acme.com', host: 'www.acme.com', location: 'https://acme.com', title: 'Acme Corporation - Home', webserver: 'nginx/1.24.0', contentType: 'text/html; charset=utf-8', statusCode: 301, contentLength: 0, responseBody: '', tech: [], vhost: false, subdomain: 'www.acme.com', createdAt: '2024-12-28T10:01:00Z', }, { id: 3, target: 1, url: 'https://api.acme.com', host: 'api.acme.com', location: '', title: 'Acme API', webserver: 'nginx/1.24.0', contentType: 'application/json', statusCode: 200, contentLength: 234, responseBody: '{"status":"ok","version":"1.0"}', tech: ['Django', 'Python', 'PostgreSQL'], vhost: false, subdomain: 'api.acme.com', createdAt: '2024-12-28T10:02:00Z', }, { id: 4, target: 1, url: 'https://admin.acme.com', host: 'admin.acme.com', location: '', title: 'Admin Panel - Acme', webserver: 'nginx/1.24.0', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 23456, responseBody: '...', tech: ['React', 'Ant Design'], vhost: false, subdomain: 'admin.acme.com', createdAt: '2024-12-28T10:03:00Z', }, { id: 5, target: 2, url: 'https://acme.io', host: 'acme.io', location: '', title: 'Acme Developer Platform', webserver: 'cloudflare', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 56789, responseBody: '...', tech: ['Vue.js', 'Vitepress', 'CloudFlare'], vhost: false, subdomain: 'acme.io', createdAt: '2024-12-27T14:30:00Z', }, { id: 6, target: 2, url: 'https://docs.acme.io', host: 'docs.acme.io', location: '', title: 'Documentation - Acme.io', webserver: 'cloudflare', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 67890, responseBody: '...', tech: ['Vue.js', 'Vitepress'], vhost: false, subdomain: 'docs.acme.io', createdAt: '2024-12-27T14:31:00Z', }, { id: 7, target: 3, url: 'https://techstart.io', host: 'techstart.io', location: '', title: 'TechStart - Innovation Hub', webserver: 'Apache/2.4.54', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 34567, responseBody: '...', tech: ['WordPress', 'PHP', 'MySQL'], vhost: false, subdomain: 'techstart.io', createdAt: '2024-12-26T08:45:00Z', }, { id: 8, target: 4, url: 'https://globalfinance.com', host: 'globalfinance.com', location: '', title: 'Global Finance - Your Financial Partner', webserver: 'Microsoft-IIS/10.0', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 56789, responseBody: '...', tech: ['ASP.NET', 'C#', 'jQuery', 'SQL Server'], vhost: false, subdomain: 'globalfinance.com', createdAt: '2024-12-25T16:20:00Z', }, { id: 9, target: 6, url: 'https://healthcareplus.com', host: 'healthcareplus.com', location: '', title: 'HealthCare Plus - Digital Health', webserver: 'nginx/1.24.0', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 45678, responseBody: '...', tech: ['Angular', 'TypeScript', 'Node.js'], vhost: false, subdomain: 'healthcareplus.com', createdAt: '2024-12-23T11:00:00Z', }, { id: 10, target: 7, url: 'https://edutech.io', host: 'edutech.io', location: '', title: 'EduTech - Learn Anywhere', webserver: 'cloudflare', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 67890, responseBody: '...', tech: ['Vue.js', 'Nuxt.js', 'PostgreSQL'], vhost: false, subdomain: 'edutech.io', createdAt: '2024-12-22T13:30:00Z', }, { id: 11, target: 8, url: 'https://retailmax.com', host: 'retailmax.com', location: '', title: 'RetailMax - Shop Everything', webserver: 'nginx/1.22.0', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 89012, responseBody: '...', tech: ['React', 'Redux', 'Node.js', 'MongoDB'], vhost: false, subdomain: 'retailmax.com', createdAt: '2024-12-21T10:45:00Z', }, { id: 12, target: 10, url: 'https://cloudnine.host', host: 'cloudnine.host', location: '', title: 'CloudNine Hosting', webserver: 'LiteSpeed', contentType: 'text/html; charset=utf-8', statusCode: 200, contentLength: 34567, responseBody: '...', tech: ['PHP', 'Laravel', 'MySQL'], vhost: false, subdomain: 'cloudnine.host', createdAt: '2024-12-19T16:00:00Z', }, ] export function getMockWebsites(params?: { page?: number pageSize?: number search?: string targetId?: number }): WebSiteListResponse { const page = params?.page || 1 const pageSize = params?.pageSize || 10 const search = params?.search?.toLowerCase() || '' const targetId = params?.targetId let filtered = mockWebsites if (targetId) { filtered = filtered.filter(w => w.target === targetId) } if (search) { filtered = filtered.filter( w => w.url.toLowerCase().includes(search) || w.title.toLowerCase().includes(search) || w.host.toLowerCase().includes(search) ) } const total = filtered.length const totalPages = Math.ceil(total / pageSize) const start = (page - 1) * pageSize const results = filtered.slice(start, start + pageSize) return { results, total, page, pageSize, totalPages, } } export function getMockWebsiteById(id: number): WebSite | undefined { return mockWebsites.find(w => w.id === id) } ================================================ FILE: frontend/mock/data/wordlists.ts ================================================ import type { Wordlist, GetWordlistsResponse } from '@/types/wordlist.types' export const mockWordlists: Wordlist[] = [ { id: 1, name: 'common-dirs.txt', description: '常用目录字典', fileSize: 45678, lineCount: 4567, fileHash: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6', createdAt: '2024-12-20T10:00:00Z', updatedAt: '2024-12-28T10:00:00Z', }, { id: 2, name: 'subdomains-top1million.txt', description: 'Top 100万子域名字典', fileSize: 12345678, lineCount: 1000000, fileHash: 'b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7', createdAt: '2024-12-20T10:01:00Z', updatedAt: '2024-12-28T10:01:00Z', }, { id: 3, name: 'api-endpoints.txt', description: 'API 端点字典', fileSize: 23456, lineCount: 2345, fileHash: 'c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8', createdAt: '2024-12-20T10:02:00Z', updatedAt: '2024-12-28T10:02:00Z', }, { id: 4, name: 'params.txt', description: '常用参数名字典', fileSize: 8901, lineCount: 890, fileHash: 'd4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9', createdAt: '2024-12-20T10:03:00Z', updatedAt: '2024-12-28T10:03:00Z', }, { id: 5, name: 'sensitive-files.txt', description: '敏感文件字典', fileSize: 5678, lineCount: 567, fileHash: 'e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0', createdAt: '2024-12-20T10:04:00Z', updatedAt: '2024-12-28T10:04:00Z', }, { id: 6, name: 'raft-large-directories.txt', description: 'RAFT 大型目录字典', fileSize: 987654, lineCount: 98765, fileHash: 'f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1', createdAt: '2024-12-20T10:05:00Z', updatedAt: '2024-12-28T10:05:00Z', }, ] export const mockWordlistContent = `admin api backup config dashboard debug dev docs download files images js login logs manager private public static test upload users v1 v2 wp-admin wp-content` export function getMockWordlists(params?: { page?: number pageSize?: number }): GetWordlistsResponse { const page = params?.page || 1 const pageSize = params?.pageSize || 10 const total = mockWordlists.length const totalPages = Math.ceil(total / pageSize) const start = (page - 1) * pageSize const results = mockWordlists.slice(start, start + pageSize) return { results, total, page, pageSize, totalPages, } } export function getMockWordlistById(id: number): Wordlist | undefined { return mockWordlists.find(w => w.id === id) } export function getMockWordlistContent(): string { return mockWordlistContent } ================================================ FILE: frontend/mock/data/workers.ts ================================================ import type { WorkerNode, WorkersResponse } from '@/types/worker.types' export const mockWorkers: WorkerNode[] = [ { id: 1, name: 'local-worker', ipAddress: '127.0.0.1', sshPort: 22, username: 'root', status: 'online', isLocal: true, createdAt: '2024-01-01T00:00:00Z', updatedAt: '2024-12-29T10:00:00Z', info: { cpuPercent: 23.5, memoryPercent: 45.2, }, }, { id: 2, name: 'worker-01', ipAddress: '192.168.1.101', sshPort: 22, username: 'scanner', status: 'online', isLocal: false, createdAt: '2024-06-15T08:00:00Z', updatedAt: '2024-12-29T09:30:00Z', info: { cpuPercent: 56.8, memoryPercent: 72.1, }, }, { id: 3, name: 'worker-02', ipAddress: '192.168.1.102', sshPort: 22, username: 'scanner', status: 'online', isLocal: false, createdAt: '2024-07-20T10:00:00Z', updatedAt: '2024-12-29T09:45:00Z', info: { cpuPercent: 34.2, memoryPercent: 58.9, }, }, { id: 4, name: 'worker-03', ipAddress: '192.168.1.103', sshPort: 22, username: 'scanner', status: 'offline', isLocal: false, createdAt: '2024-08-10T14:00:00Z', updatedAt: '2024-12-28T16:00:00Z', }, ] export function getMockWorkers(page = 1, pageSize = 10): WorkersResponse { const total = mockWorkers.length const totalPages = Math.ceil(total / pageSize) const start = (page - 1) * pageSize const results = mockWorkers.slice(start, start + pageSize) return { results, total, page, pageSize, } } export function getMockWorkerById(id: number): WorkerNode | undefined { return mockWorkers.find(w => w.id === id) } ================================================ FILE: frontend/mock/index.ts ================================================ /** * Mock 数据统一导出 * * 使用方式: * import { USE_MOCK, mockData } from '@/mock' * * if (USE_MOCK) { * return mockData.dashboard.assetStatistics * } */ export { USE_MOCK, MOCK_DELAY, mockDelay } from './config' // Dashboard export { mockDashboardStats, mockAssetStatistics, mockStatisticsHistory7Days, mockStatisticsHistory30Days, getMockStatisticsHistory, } from './data/dashboard' // Organizations export { mockOrganizations, getMockOrganizations, } from './data/organizations' // Targets export { mockTargets, mockTargetDetails, getMockTargets, getMockTargetById, } from './data/targets' // Scans export { mockScans, mockScanStatistics, getMockScans, getMockScanById, } from './data/scans' // Vulnerabilities export { mockVulnerabilities, getMockVulnerabilities, getMockVulnerabilityById, } from './data/vulnerabilities' // Endpoints export { mockEndpoints, getMockEndpoints, getMockEndpointById, } from './data/endpoints' // Websites export { mockWebsites, getMockWebsites, getMockWebsiteById, } from './data/websites' // Subdomains export { mockSubdomains, getMockSubdomains, getMockSubdomainById, } from './data/subdomains' // Auth export { mockUser, mockMeResponse, mockLoginResponse, mockLogoutResponse, } from './data/auth' // Engines export { mockEngines, getMockEngines, getMockEngineById, } from './data/engines' // Workers export { mockWorkers, getMockWorkers, getMockWorkerById, } from './data/workers' // Notifications export { mockNotifications, getMockNotifications, getMockUnreadCount, } from './data/notifications' // Scheduled Scans export { mockScheduledScans, getMockScheduledScans, getMockScheduledScanById, } from './data/scheduled-scans' // Directories export { mockDirectories, getMockDirectories, getMockDirectoryById, } from './data/directories' // Fingerprints export { mockEholeFingerprints, mockGobyFingerprints, mockWappalyzerFingerprints, mockFingersFingerprints, mockFingerPrintHubFingerprints, mockARLFingerprints, mockFingerprintStats, getMockEholeFingerprints, getMockGobyFingerprints, getMockWappalyzerFingerprints, getMockFingersFingerprints, getMockFingerPrintHubFingerprints, getMockARLFingerprints, getMockFingerprintStats, } from './data/fingerprints' // IP Addresses export { mockIPAddresses, getMockIPAddresses, getMockIPAddressByIP, } from './data/ip-addresses' // Search export { getMockSearchResults, } from './data/search' // Tools export { mockTools, getMockTools, getMockToolById, } from './data/tools' // Wordlists export { mockWordlists, mockWordlistContent, getMockWordlists, getMockWordlistById, getMockWordlistContent, } from './data/wordlists' // Nuclei Templates export { mockNucleiTemplateTree, mockNucleiTemplateContent, getMockNucleiTemplateTree, getMockNucleiTemplateContent, } from './data/nuclei-templates' // System Logs export { mockLogFiles, mockSystemLogContent, mockErrorLogContent, getMockLogFiles, getMockSystemLogs, } from './data/system-logs' // Notification Settings export { mockNotificationSettings, getMockNotificationSettings, updateMockNotificationSettings, } from './data/notification-settings' // Blacklist export { getMockGlobalBlacklist, updateMockGlobalBlacklist, getMockTargetBlacklist, updateMockTargetBlacklist, } from './data/blacklist' ================================================ FILE: frontend/next.config.ts ================================================ import type { NextConfig } from "next"; import createNextIntlPlugin from 'next-intl/plugin'; const withNextIntl = createNextIntlPlugin('./i18n/request.ts'); // Check if running on Vercel const isVercel = process.env.VERCEL === '1'; const nextConfig: NextConfig = { // Use standalone mode for Docker deployment (not needed on Vercel) ...(isVercel ? {} : { output: 'standalone' }), // Disable Next.js automatic add/remove trailing slash behavior // Let us manually control URL format skipTrailingSlashRedirect: true, // Don't interrupt production build due to ESLint errors (keep lint in dev environment) eslint: { ignoreDuringBuilds: true, }, // Allow LAN IP access to dev server (eliminate CORS warnings) allowedDevOrigins: ['192.168.*.*', '10.*.*.*', '172.16.*.*'], async rewrites() { // Skip rewrites on Vercel when using mock data if (isVercel) { return []; } // Use server service name in Docker environment, localhost for local development const apiHost = process.env.API_HOST || 'localhost'; return [ // Only match API paths with trailing slash { source: '/api/:path*/', destination: `http://${apiHost}:8888/api/:path*/`, }, ]; }, }; export default withNextIntl(nextConfig); ================================================ FILE: frontend/package.json ================================================ { "name": "xingrin", "version": "0.1.0", "private": true, "license": "MIT", "scripts": { "dev": "next dev --turbopack", "dev:mock": "NEXT_PUBLIC_USE_MOCK=true next dev --turbopack", "dev:noauth": "NEXT_PUBLIC_SKIP_AUTH=true next dev --turbopack", "build": "next build --turbopack", "start": "next start", "lint": "eslint" }, "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@fontsource/noto-sans-sc": "^5.2.8", "@hookform/resolvers": "^5.2.2", "@monaco-editor/react": "^4.7.0", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.10", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-hover-card": "^1.1.6", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-use-controllable-state": "^1.2.2", "@radix-ui/react-visually-hidden": "^1.2.3", "@tabler/icons-react": "^3.35.0", "@tanstack/react-query": "^5.90.2", "@tanstack/react-table": "^8.21.3", "@xterm/addon-fit": "^0.10.0", "@xterm/addon-web-links": "^0.11.0", "@xterm/xterm": "^5.5.0", "ansi-to-html": "^0.7.2", "axios": "^1.12.2", "camelcase-keys": "^10.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "cron-parser": "^5.4.0", "cronstrue": "^3.9.0", "date-fns": "^4.1.0", "framer-motion": "^12.23.26", "geist": "^1.5.1", "is-ip": "^5.0.1", "js-yaml": "^4.1.0", "lottie-react": "^2.4.1", "lucide-react": "^0.544.0", "next": "^15.5.9", "next-intl": "^4.6.1", "next-themes": "^0.4.6", "nextjs-toploader": "^3.9.17", "psl": "^1.15.0", "react": "19.1.2", "react-day-picker": "^9.11.2", "react-dom": "19.1.2", "react-dropzone": "^14.3.8", "react-hook-form": "^7.65.0", "recharts": "2.15.4", "snakecase-keys": "^9.0.2", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1", "tldts": "^6.1.86", "validator": "^13.15.15", "vaul": "^1.1.2", "zod": "^4.1.12" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@tanstack/react-query-devtools": "^5.90.2", "@types/js-yaml": "^4.0.9", "@types/node": "^20.19.19", "@types/react": "^19", "@types/react-dom": "^19", "@types/validator": "^13.15.3", "eslint": "^9", "eslint-config-next": "15.5.7", "msw": "^2.11.6", "tailwindcss": "^4", "tw-animate-css": "^1.4.0", "typescript": "^5" }, "msw": { "workerDirectory": [ "public" ] } } ================================================ FILE: frontend/postcss.config.mjs ================================================ const config = { plugins: ["@tailwindcss/postcss"], }; export default config; ================================================ FILE: frontend/public/animations/Security000-Purple.json ================================================ {"v":"5.7.7","fr":30,"ip":0,"op":91,"w":3710,"h":3710,"nm":"Cloud Computing Security","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Arm R","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328.648,176.87,0],"ix":2,"l":2},"a":{"a":0,"k":[161.776,-9.236,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.759,0.536],[-0.538,-0.76],[0,0],[-0.462,0.908],[-0.832,-0.427],[0.423,-0.829],[76.776,-32.874]],"o":[[0,0],[-0.538,-0.759],[0.756,-0.543],[0,0],[74.91,-32.841],[0.421,-0.825],[0.828,0.421],[-0.47,0.92],[0,0]],"v":[[-58.1,64.348],[-67.705,50.766],[-67.302,48.419],[-64.956,48.82],[-56.926,60.176],[64.822,-63.188],[67.086,-63.921],[67.82,-61.656],[-56.849,63.812]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.083,156.696],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.498,0],[0.309,0.243],[-0.576,0.73],[-18.069,45.788],[-0.873,-0.358],[0.34,-0.864],[0.534,-0.674]],"o":[[-0.365,0],[-0.729,-0.575],[0.531,-0.673],[0.341,-0.865],[0.865,0.342],[-18.253,46.248],[-0.332,0.421]],"v":[[-35.824,58.802],[-36.867,58.44],[-37.144,56.076],[34.247,-57.497],[36.433,-58.444],[37.381,-56.261],[-34.501,58.161]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.97,59.052],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Arm L Line","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.407,217.677,0],"ix":2,"l":2},"a":{"a":0,"k":[11.949,61.788,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.003,0.926],[-0.199,0.68],[-0.896,-0.26],[0.261,-0.89],[-0.168,-50.776],[0.931,-0.003]],"o":[[-0.927,0],[-0.17,-51.272],[0.261,-0.888],[0.892,0.26],[-0.199,0.675],[0.003,0.93],[0,0]],"v":[[-9.858,61.442],[-11.541,59.766],[8.218,-60.041],[10.308,-61.182],[11.45,-59.095],[-8.174,59.753],[-9.853,61.442]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.961,61.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Laptop","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-223.819,363.13,0],"ix":2,"l":2},"a":{"a":0,"k":[245.616,162.77,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.759,0],[-0.187,0.011],[0,0],[0.303,6.004],[5.984,-0.404],[0,0],[-0.303,-6.005]],"o":[[0.186,0],[0,0],[6.004,-0.302],[-0.303,-6.006],[0,0],[-6.003,0.301],[0.295,5.816]],"v":[[-121.448,17.218],[-120.889,17.204],[121.989,4.928],[132.312,-6.492],[120.889,-16.815],[-121.989,-4.538],[-132.311,6.883]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[355.694,307.307],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.4,-12.92],[-7.234,3.585],[6.401,12.92],[7.235,-3.585]],"o":[[6.401,12.921],[7.235,-3.584],[-6.401,-12.921],[-7.235,3.583]],"v":[[-13.1,6.489],[11.589,23.394],[13.099,-6.489],[-11.589,-23.394]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.245,120.161],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[12.149,0.831],[0,0],[-3.906,-11.127],[0,0],[-9.275,-0.937],[0,0]],"o":[[0,0],[-3.497,-11.664],[0,0],[-11.766,-0.805],[0,0],[3.088,8.796],[0,0],[0,0]],"v":[[124.006,153.273],[38.272,-132.642],[12.263,-153.412],[-103.489,-161.333],[-120.1,-139.516],[-24.257,133.531],[-3.997,149.48],[109.989,162.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[124.256,162.388],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Head","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[10]},{"t":90,"s":[-5]}],"ix":10},"p":{"a":0,"k":[43.714,48.794,0],"ix":2,"l":2},"a":{"a":0,"k":[193.754,259.215,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-17.56,-15.287],[20.117,-6.413]],"o":[[0,0],[17.561,15.288],[0,0]],"v":[[-23.341,11.767],[5.78,-20.03],[-18.915,35.318]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.672988712086,0.661611998315,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[234.411,154.694],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.401,2.671],[6.167,10.95],[32.401,-17.44],[28.652,15.254],[-73.827,-13.867],[0.21,2.85],[-28.66,9.083],[-6.05,-7.307],[-1.697,2.215],[-32.121,-14.156],[0.437,-10.154],[-2.992,1.377],[-12.485,-15.643],[7.399,-4.917],[0.009,-1.455],[24.587,-27.671],[1.241,2.955],[0,0],[2.162,-0.697]],"o":[[-2.571,0.829],[-1.22,-8.123],[0,0],[-32.4,17.438],[-27.934,-14.873],[2.809,0.528],[-0.908,-12.302],[26.821,-8.502],[1.78,2.151],[8.035,-10.49],[26.456,11.659],[-0.142,3.291],[8.102,-3.732],[17.259,21.625],[-1.212,0.806],[-0.07,11.247],[-2.129,2.396],[0,0],[-0.879,-2.094],[0,0]],"v":[[55.473,54.233],[49.809,50.743],[39.376,15.596],[10.201,21.492],[-99.516,49.294],[-81.92,-26.563],[-76.738,-31.123],[-47.765,-80.811],[-0.211,-69.898],[6.57,-70.006],[68.545,-88.665],[98.679,-50.556],[104.868,-46.413],[138.488,-36.441],[123.684,8.854],[121.709,12.45],[95.301,100.425],[87.996,99.164],[69.065,54.057],[63.688,51.586]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[155.997,103.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.801,-27.059],[-22.243,66.335],[0,0]],"o":[[0,0],[33.8,27.059],[0,0],[0,0]],"v":[[-84.106,-42.045],[-37.792,73.005],[84.106,13.355],[39.787,-100.064]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.672988712086,0.661611998315,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[166.69,183.974],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Neck","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[209.141,90.844,0],"ix":2,"l":2},"a":{"a":0,"k":[53.835,111.217,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.351,-2.295],[43.932,16.219],[0.435,5.338],[0,0]],"o":[[0,0],[1.167,3.889],[-12.253,8.391],[-5.025,-1.855],[0,0],[0,0]],"v":[[27.352,-60.18],[52.802,24.703],[49.177,35.099],[-39.032,43.961],[-47.936,32.075],[-53.969,-41.871]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.672988712086,0.661611998315,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.218,60.43],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Hand R","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[46.053,161.17,0],"ix":2,"l":2},"a":{"a":0,"k":[443.962,45.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[32.906,26.019],[148.712,-20.133],[28.58,-12.509],[0,0],[0,0],[-90.219,109.483]],"o":[[0,0],[0,0],[-28.579,12.51],[0,0],[0,0],[-7.26,-38.311]],"v":[[168.95,-101.529],[-96.078,56.33],[-163.091,33.801],[-230.856,101.529],[-39.91,101.529],[230.856,-14.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.672988712086,0.661611998315,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.106,101.779],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Body","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[974.912,340.998,0],"ix":2,"l":2},"a":{"a":0,"k":[200.98,309.541,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[53.365,54.575],[-8.998,110.579],[19.144,11.357],[-3.134,6.491],[-6.376,1.591],[-100.101,-136.922],[194.9,-187.332]],"o":[[0,0],[0,0],[-6.199,-3.677],[14.075,-29.158],[34.656,-8.649],[42.96,58.763],[-62.714,10.209]],"v":[[-206.824,214.413],[-155.961,-9.968],[-205.733,-47.649],[-211.139,-65.595],[-105.572,-210.831],[171.314,-150.136],[-32.111,276.85]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[214.523,287.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Hand L","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.852,244.246,0],"ix":2,"l":2},"a":{"a":0,"k":[336.185,15.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90.614,6.968],[180.388,-72.992],[0,0],[0,0],[0,0],[-68.166,138.854]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.252,-4.588]],"v":[[102.949,-139.437],[-114.256,118.061],[-178.421,110.499],[-193.562,134.641],[-43.049,139.437],[153.773,-50.376]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.672988712086,0.661611998315,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[193.812,139.687],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Leg R","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[182.412,504.738,0],"ix":2,"l":2},"a":{"a":0,"k":[725.756,0.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[35.424,-246.39],[-35.303,-3.101],[-76.992,136.348],[0,0],[-52.336,80.538]],"o":[[0,0],[0,0],[0,0],[0,0],[94.404,-167.181],[89.852,19.83],[0,0]],"v":[[215.844,-216.45],[-126.146,-212.747],[-356.873,195.227],[-327.45,216.45],[-132.381,2.982],[149.05,-88.944],[362.753,-157.03]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[363.003,216.7],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shooes R","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.042,401.617,0],"ix":2,"l":2},"a":{"a":0,"k":[205.872,0.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.004,10.234],[-9.322,8.168],[-31.723,4.226],[-25.487,14.805],[61.347,1.698]],"o":[[6.033,-6.856],[-3.224,19.326],[32.629,-4.346],[-31.945,27.245],[-13.626,-0.377]],"v":[[-72.35,-0.251],[-49.295,-23.15],[-16.119,11.119],[81.355,-28.081],[-60.542,26.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.604,88.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.224,19.326],[-70.393,8.628],[0,0],[27.733,-23.651],[32.628,-4.346]],"o":[[30.603,-26.815],[0,0],[0,0],[-25.487,14.805],[-31.723,4.225]],"v":[[-85.169,13.52],[64.588,-52.015],[88.393,-37.454],[45.481,8.589],[-51.992,47.79]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.478,52.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Leg L","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44.798,576.06,0],"ix":2,"l":2},"a":{"a":0,"k":[553.395,396.937,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[41.854,108.787],[0,0],[147.011,24.975],[-107.785,-244.076],[-18.089,11.553],[-2.36,5.806],[0,0],[-33.233,-32.271]],"o":[[0,0],[0,0],[0,0],[8.671,19.634],[5.41,-3.456],[0,0],[0,0],[33.233,32.271]],"v":[[252.335,70.993],[179.305,70.993],[-191.853,-201.531],[-186.403,173.174],[-135.393,189.978],[-123.738,176.085],[-132.405,-32.316],[92.025,167.179]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.439,201.781],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shooes L","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[138.183,375.875,0],"ix":2,"l":2},"a":{"a":0,"k":[150.157,19.634,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.575,22.49],[-47.84,17.664],[-17.702,12.71],[-0.229,-3.836],[108.4,-17.122],[-2.934,7.699]],"o":[[18.854,6.103],[46.284,-17.088],[0.395,3.445],[0,0],[-8.137,1.285],[5.264,-13.815]],"v":[[-70.536,-18.196],[4.449,-3.047],[102.844,-54.884],[103.799,-44.005],[-89.213,53.599],[-100.866,39.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.05,117.285],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-77.566,38.613],[-4.244,-71.199],[108.399,-17.122],[-2.933,7.699]],"o":[[0,0],[0,0],[-8.139,1.285],[13.96,-36.633]],"v":[[59.542,-81.688],[98.393,-8.657],[-90.254,80.403],[-75.944,17.152]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.457,81.937],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Security","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2457.188,2064.126,0],"ix":2,"l":2},"a":{"a":0,"k":[594.999,698.885,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[11.36,0],[0,0],[-2.653,11.048],[0,0],[-1.62,30.689],[-39.725,2.467],[0,-45.417],[23.133,-13.829]],"o":[[2.653,11.046],[0,0],[-11.362,0],[0,0],[-24.27,-14.509],[2.099,-39.745],[46.034,-2.86],[0,28.91],[0,0]],"v":[[61.135,105.571],[44.055,127.239],[-44.057,127.239],[-61.137,105.569],[-40.576,19.985],[-79.091,-52.331],[-5.059,-127.081],[79.201,-48.036],[40.573,19.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[26.183,0],[0,0],[0,-26.183],[0,0],[-26.184,0],[0,0],[0,26.184],[0,0]],"o":[[0,0],[-26.184,0],[0,0],[0,26.184],[0,0],[26.183,0],[0,0],[0,-26.183]],"v":[[213.644,-211.374],[-213.645,-211.374],[-261.056,-163.965],[-261.056,163.963],[-213.645,211.375],[213.644,211.375],[261.054,163.963],[261.054,-163.965]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[595.385,765.304],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.552,0],[0,0],[0,12.552],[0,0],[30.926,0],[0,0],[0,-30.926],[0,0],[12.552,0],[0,0],[0,12.552],[0,0],[-69.989,0],[0,0],[0,-69.99],[0,0]],"o":[[0,0],[-12.552,0],[0,0],[0,-30.926],[0,0],[-30.927,0],[0,0],[0,12.552],[0,0],[-12.551,0],[0,0],[0,-69.99],[0,0],[69.99,0],[0,0],[0,12.552]],"v":[[182.316,117.926],[157.039,117.926],[134.312,95.199],[134.312,8.801],[78.315,-47.196],[-78.311,-47.196],[-134.308,8.801],[-134.308,95.199],[-157.035,117.926],[-182.312,117.926],[-205.038,95.199],[-205.038,8.801],[-78.311,-117.926],[78.315,-117.926],[205.043,8.801],[205.043,95.199]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[595.383,415.613],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.461,1.262],[0,0],[0,0],[-119.819,160.696],[28.283,322.694],[3.826,0.284],[161.56,107.203],[2.644,-2.373],[133.637,0],[0,0],[1.488,-1.517],[-0.04,-2.096],[0,0],[-64.907,-177.691],[-213.257,-136.323]],"o":[[0,0],[0,0],[55.505,-28.528],[160.519,-215.29],[-0.338,-3.834],[-122.739,-9.046],[-2.962,-1.965],[-147.168,131.873],[0,0],[-2.256,0],[-1.466,1.49],[0,0],[2.807,159.984],[72.602,198.749],[2.335,1.493]],"v":[[-9.529,619.339],[-8.286,621.759],[-9.529,619.339],[307.827,346.411],[507.111,-464.352],[499.926,-471.459],[-14.402,-618.888],[-23.921,-618.199],[-505.446,-427.299],[-505.449,-427.299],[-511.193,-424.947],[-513.406,-419.384],[-513.023,-397.997],[-442.123,121.001],[-17.308,618.956]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.069,0],[2.173,1.387],[73.026,199.913],[2.82,160.406],[0,0],[-2.498,2.546],[-3.613,0],[0,0],[-146.1,130.913],[-5.032,-3.337],[-122.208,-9.006],[-0.572,-6.506],[161.342,-216.391],[55.842,-28.704]],"o":[[-2.498,0],[-214.297,-136.99],[-65.221,-178.547],[0,0],[-0.067,-3.568],[2.519,-2.563],[0,0],[132.713,0],[4.485,-4.02],[160.528,106.514],[6.501,0.481],[28.406,324.065],[-120.502,161.609],[-1.888,0.97]],"v":[[-13.073,625.63],[-20.241,623.542],[-447.234,122.866],[-518.465,-397.896],[-518.847,-419.283],[-515.074,-428.763],[-505.563,-432.74],[-505.558,-432.74],[-27.55,-622.253],[-11.394,-623.42],[500.325,-476.884],[512.53,-464.828],[312.19,349.662],[-7.043,624.18]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[595.381,702.828],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.301,7.774],[-11.33,-1.019],[-147.757,151.182],[-11.761,-8.789],[-94.558,-5.2],[-2.021,-19.487],[112.155,-53.124],[11.517,7.172],[7.73,335.497]],"o":[[8.3,-7.773],[121.174,10.897],[10.26,-10.499],[164.326,122.816],[19.56,1.076],[85.993,830.543],[-12.26,5.807],[-558.973,-348.175],[-0.262,-11.37]],"v":[[-596.251,-477.4],[-565.401,-488.019],[-70.391,-686.672],[-29.668,-682.448],[501.605,-528.999],[539.056,-493.263],[-27.866,691.364],[-66.077,689.156],[-608.87,-447.309]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.299,697.421],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Security 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":90,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2457.188,2064.126,0],"ix":2,"l":2},"a":{"a":0,"k":[594.999,698.885,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[100,100,100]},{"t":90,"s":[130,130,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.301,7.774],[-11.33,-1.019],[-147.757,151.182],[-11.761,-8.789],[-94.558,-5.2],[-2.021,-19.487],[112.155,-53.124],[11.517,7.172],[7.73,335.497]],"o":[[8.3,-7.773],[121.174,10.897],[10.26,-10.499],[164.326,122.816],[19.56,1.076],[85.993,830.543],[-12.26,5.807],[-558.973,-348.175],[-0.262,-11.37]],"v":[[29.048,220.021],[59.899,209.402],[554.909,10.749],[595.631,14.973],[1126.905,168.422],[1164.356,204.158],[597.433,1388.785],[559.223,1386.577],[16.43,250.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Security 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":60,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2457.188,2064.126,0],"ix":2,"l":2},"a":{"a":0,"k":[594.999,698.885,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"t":60,"s":[130,130,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.301,7.774],[-11.33,-1.019],[-147.757,151.182],[-11.761,-8.789],[-94.558,-5.2],[-2.021,-19.487],[112.155,-53.124],[11.517,7.172],[7.73,335.497]],"o":[[8.3,-7.773],[121.174,10.897],[10.26,-10.499],[164.326,122.816],[19.56,1.076],[85.993,830.543],[-12.26,5.807],[-558.973,-348.175],[-0.262,-11.37]],"v":[[29.048,220.021],[59.899,209.402],[554.909,10.749],[595.631,14.973],[1126.905,168.422],[1164.356,204.158],[597.433,1388.785],[559.223,1386.577],[16.43,250.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":30,"op":210,"st":30,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Security 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":30,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2457.188,2064.126,0],"ix":2,"l":2},"a":{"a":0,"k":[594.999,698.885,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"t":30,"s":[130,130,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.301,7.774],[-11.33,-1.019],[-147.757,151.182],[-11.761,-8.789],[-94.558,-5.2],[-2.021,-19.487],[112.155,-53.124],[11.517,7.172],[7.73,335.497]],"o":[[8.3,-7.773],[121.174,10.897],[10.26,-10.499],[164.326,122.816],[19.56,1.076],[85.993,830.543],[-12.26,5.807],[-558.973,-348.175],[-0.262,-11.37]],"v":[[29.048,220.021],[59.899,209.402],[554.909,10.749],[595.631,14.973],[1126.905,168.422],[1164.356,204.158],[597.433,1388.785],[559.223,1386.577],[16.43,250.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Setting","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":90,"s":[-360]}],"ix":10},"p":{"a":0,"k":[2549.826,1119.711,0],"ix":2,"l":2},"a":{"a":0,"k":[231.589,234.578,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.477,0],[2.728,0.214],[17.863,20.883],[-0.004,23.671],[-23.754,20.317],[-36.874,-43.112],[-0.285,-0.338],[-3.048,-5.395],[-0.01,-0.02],[-0.043,-0.079],[-0.079,-0.138],[-0.042,-0.075],[-0.132,-0.243],[0,0],[4.304,5.036],[32.978,-8.111],[11.352,-9.709],[0.003,-26.196],[-14.929,-17.454],[-38.877,33.259],[-5.31,15.863],[0,0],[14.173,-12.122]],"o":[[-2.709,0],[-27.397,-2.134],[-16.556,-19.352],[0,-29.047],[43.106,-36.882],[0.29,0.335],[3.998,4.801],[0.012,0.023],[0.046,0.082],[0.079,0.141],[0.043,0.078],[0.136,0.243],[0,0],[-3.12,-5.773],[-23.55,-27.525],[-13.602,3.347],[-21.42,18.326],[0,21.347],[33.256,38.871],[12.779,-10.931],[0,0],[-5.892,17.596],[-18.799,16.083]],"v":[[2.813,102.865],[-5.347,102.546],[-75.533,66.852],[-100.187,0.046],[-64.23,-78.201],[80.823,-66.898],[81.684,-65.883],[92.288,-50.539],[92.324,-50.476],[92.459,-50.236],[92.695,-49.815],[92.823,-49.582],[93.221,-48.849],[84.337,-44.049],[73.15,-60.336],[-19.671,-90.07],[-57.667,-70.528],[-90.094,0.039],[-67.86,60.289],[62.958,70.481],[90.607,29.523],[100.188,32.732],[69.52,78.155]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[225.761,236.073],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.181,0],[6.027,-8.512],[-13.931,-9.856],[-8.127,1.397],[-4.774,6.746],[1.393,8.147],[6.746,4.774]],"o":[[-9.712,0],[-9.856,13.933],[6.749,4.777],[8.15,-1.394],[4.777,-6.749],[-1.395,-8.151],[-5.418,-3.837]],"v":[[0.032,-30.941],[-25.274,-17.882],[-17.889,25.262],[5.21,30.506],[25.252,17.881],[30.496,-5.221],[17.871,-25.263]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.327,0],[7.01,4.961],[-13.072,18.476],[-10.806,1.848],[-8.945,-6.332],[-1.848,-10.806],[6.336,-8.949],[10.806,-1.848]],"o":[[-8.42,0],[-18.476,-13.075],[6.335,-8.953],[10.81,-1.851],[8.953,6.336],[1.851,10.81],[-6.335,8.952],[-2.341,0.401]],"v":[[-0.096,41.059],[-23.722,33.508],[-33.519,-23.714],[-6.935,-40.462],[23.703,-33.509],[40.451,-6.928],[33.497,23.714],[6.917,40.461]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[229.278,236.047],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.087,0.472],[0,0],[7.466,14.426],[0,0],[0.77,0.901],[0,0],[1.101,-0.434],[0,0],[15.044,4.782],[0,0],[1.182,0.092],[0,0],[0.471,-1.087],[0,0],[14.426,-7.466],[0,0],[0.9,-0.77],[0,0],[-0.435,-1.103],[0,0],[4.782,-15.044],[0,0],[0.093,-1.18],[0,0],[-1.088,-0.472],[0,0],[-7.466,-14.427],[0,0],[-0.77,-0.901],[0,0],[-1.102,0.435],[0,0],[-15.043,-4.782],[0,0],[-1.181,-0.093],[0,0],[-0.473,1.086],[0,0],[-14.427,7.466],[0,0],[-0.9,0.771],[0,0],[0.433,1.102],[0,0],[-4.783,15.043],[0,0],[-0.093,1.183]],"o":[[0.092,-1.181],[0,0],[-2.395,-15.603],[0,0],[0.6,-1.022],[0,0],[-0.772,-0.9],[0,0],[-13.097,-9.61],[0,0],[-0.298,-1.146],[0,0],[-1.181,-0.093],[0,0],[-15.603,2.395],[0,0],[-1.022,-0.601],[0,0],[-0.9,0.769],[0,0],[-9.61,13.097],[0,0],[-1.145,0.299],[0,0],[-0.091,1.181],[0,0],[2.394,15.602],[0,0],[-0.6,1.022],[0,0],[0.77,0.9],[0,0],[13.097,9.611],[0,0],[0.298,1.147],[0,0],[1.181,0.091],[0,0],[15.602,-2.395],[0,0],[1.02,0.599],[0,0],[0.902,-0.771],[0,0],[9.61,-13.097],[0,0],[1.147,-0.298],[0,0]],"v":[[179.051,-6.382],[177.389,-9.145],[146.387,-22.612],[131.626,-67.973],[148.734,-97.099],[148.45,-100.312],[122.096,-131.12],[118.966,-131.899],[87.542,-119.509],[45.014,-141.117],[36.511,-173.832],[34.038,-175.9],[-6.382,-179.05],[-9.144,-177.387],[-22.612,-146.386],[-67.974,-131.625],[-97.1,-148.733],[-100.311,-148.449],[-131.121,-122.094],[-131.9,-118.964],[-119.509,-87.542],[-141.118,-45.012],[-173.832,-36.51],[-175.901,-34.039],[-179.051,6.383],[-177.387,9.146],[-146.386,22.613],[-131.626,67.975],[-148.734,97.101],[-148.451,100.312],[-122.095,131.123],[-118.966,131.899],[-87.542,119.51],[-45.014,141.118],[-36.511,173.832],[-34.039,175.903],[6.382,179.052],[9.146,177.389],[22.612,146.388],[67.974,131.626],[97.1,148.736],[100.312,148.45],[131.12,122.096],[131.9,118.968],[119.508,87.542],[141.118,45.015],[173.83,36.511],[175.901,34.039]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[229.268,236.046],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.171,0],[0.259,1.66],[0.927,4.303],[-1.817,0.391],[-0.392,-1.815],[-0.701,-4.474],[1.838,-0.286]],"o":[[-1.631,0],[-0.678,-4.349],[-0.392,-1.818],[1.849,-0.391],[0.953,4.428],[0.285,1.838],[-0.176,0.026]],"v":[[1.26,10.139],[-2.064,7.292],[-4.484,-5.747],[-1.904,-9.748],[2.098,-7.167],[4.59,6.253],[1.781,10.1]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[457.995,192.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.174,0],[0.259,1.656],[-1.838,0.289],[-9.012,0.381],[-0.075,-1.861],[1.857,-0.079],[8.615,-1.362]],"o":[[-1.627,0],[-0.293,-1.838],[8.866,-1.404],[1.861,-0.039],[0.079,1.858],[-8.755,0.368],[-0.177,0.029]],"v":[[-62.934,-64.322],[-66.254,-67.162],[-63.457,-71.012],[-36.511,-73.702],[-33.006,-70.48],[-36.229,-66.975],[-62.406,-64.364]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.489,0],[0.289,0.076],[8.654,1.258],[-0.27,1.838],[-1.851,-0.315],[-8.697,-2.308],[0.477,-1.798]],"o":[[-0.286,0],[-8.443,-2.242],[-1.841,-0.267],[0.266,-1.845],[8.909,1.296],[1.794,0.476],[-0.401,1.506]],"v":[[33.057,-59.397],[32.188,-59.509],[6.423,-64.785],[3.575,-68.599],[7.39,-71.447],[33.918,-66.018],[36.308,-61.899]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.502,0],[0.588,1.184],[-1.664,0.828],[-8.49,3.058],[-0.631,-1.749],[1.749,-0.628],[7.808,-3.883]],"o":[[-1.24,0],[-0.829,-1.666],[8.045,-3.998],[1.758,-0.624],[0.631,1.749],[-8.245,2.969],[-0.484,0.24]],"v":[[-129.458,-43.1],[-132.475,-44.968],[-130.959,-49.481],[-106.045,-60.111],[-101.74,-58.082],[-103.764,-53.775],[-127.961,-43.452]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[1.118,0],[0.558,0.352],[7.87,3.78],[-0.806,1.676],[-1.687,-0.815],[-7.608,-4.806],[0.994,-1.571]],"o":[[-0.614,0],[-7.391,-4.671],[-1.677,-0.806],[0.801,-1.677],[8.104,3.893],[1.571,0.996],[-0.64,1.013]],"v":[[97.031,-31.471],[95.237,-31.991],[72.24,-44.727],[70.662,-49.218],[75.152,-50.797],[98.833,-37.685],[99.882,-33.04]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0.834,0],[0.661,0.694],[-1.343,1.282],[-1.394,1.276],[-5.662,4.298],[-1.124,-1.486],[1.483,-1.124],[5.109,-4.662],[1.325,-1.266]],"o":[[-0.888,0],[-1.282,-1.348],[1.366,-1.298],[5.26,-4.8],[1.48,-1.127],[1.128,1.479],[-5.497,4.179],[-1.358,1.243],[-0.655,0.621]],"v":[[-186.581,-2.921],[-189.017,-3.963],[-188.906,-8.724],[-184.77,-12.587],[-168.312,-26.297],[-163.597,-25.652],[-164.241,-20.938],[-180.229,-7.616],[-184.256,-3.851]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0.773,0],[0.667,0.783],[1.802,1.976],[4.446,4.155],[-1.269,1.358],[-1.361,-1.272],[-4.226,-4.632],[-1.768,-2.077],[1.414,-1.207]],"o":[[-0.949,0],[-1.716,-2.018],[-4.109,-4.501],[-1.357,-1.273],[1.272,-1.361],[4.57,4.278],[1.853,2.029],[1.204,1.417],[-0.634,0.539]],"v":[[149.74,14.346],[147.176,13.162],[141.898,7.172],[129.01,-5.873],[128.854,-10.634],[133.614,-10.792],[146.871,2.635],[152.303,8.796],[151.923,13.544]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0.442,0],[0.546,1.282],[4.334,7.599],[-1.615,0.92],[-0.924,-1.614],[-3.518,-8.282],[1.713,-0.727]],"o":[[-1.307,0],[-3.413,-8.042],[-0.92,-1.614],[1.614,-0.921],[4.458,7.825],[0.726,1.709],[-0.428,0.181]],"v":[[186.473,73.741],[183.374,71.69],[171.702,48.12],[172.962,43.528],[177.553,44.787],[189.573,69.06],[187.789,73.475]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[257.198,73.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":9,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.118,0],[0.559,0.353],[-0.992,1.575],[-2.633,3.686],[-1.51,-1.079],[1.082,-1.513],[2.35,-3.732]],"o":[[-0.614,0],[-1.572,-0.989],[2.417,-3.839],[1.082,-1.509],[1.515,1.081],[-2.558,3.58],[-0.638,1.015]],"v":[[-3.747,9.181],[-5.538,8.661],[-6.591,4.019],[1.024,-7.32],[5.719,-8.102],[6.501,-3.407],[-0.896,7.61]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.461,105.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.286,0],[0.4,1.509],[0.904,4.442],[-1.826,0.372],[-0.365,-1.824],[-1.127,-4.254],[1.798,-0.476]],"o":[[-1.489,0],[-1.161,-4.376],[-0.372,-1.822],[1.821,-0.371],[0.881,4.314],[0.477,1.795],[-0.29,0.076]],"v":[[1.499,10.068],[-1.752,7.564],[-4.862,-5.728],[-2.235,-9.697],[1.732,-7.07],[4.757,5.841],[2.364,9.957]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.484,287.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.621,0],[0.641,1.007],[3.998,8.239],[-1.674,0.812],[-0.812,-1.67],[-4.79,-7.48],[1.568,-1.003]],"o":[[-1.107,0],[-4.934,-7.699],[-0.812,-1.674],[1.679,-0.809],[3.883,7.999],[1.003,1.565],[-0.562,0.361]],"v":[[-177.388,-37.602],[-180.225,-39.153],[-193.685,-63.169],[-192.126,-67.667],[-187.629,-66.108],[-174.557,-42.782],[-175.576,-38.134]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.799,0],[0.664,0.743],[-1.388,1.237],[0,0],[-5.309,5.967],[-1.39,-1.242],[1.237,-1.387],[6.096,-5.56],[0,0]],"o":[[-0.924,0],[-1.239,-1.387],[0,0],[5.921,-5.402],[1.233,-1.397],[1.391,1.237],[-5.461,6.145],[0,0],[-0.644,0.572]],"v":[[171.568,10.561],[169.056,9.436],[169.326,4.682],[171.305,2.896],[188.23,-14.235],[192.981,-14.515],[193.26,-9.764],[175.841,7.875],[173.81,9.706]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.965,0],[0.628,0.525],[6.309,6.654],[-1.348,1.279],[-1.275,-1.347],[-6.8,-5.678],[1.194,-1.427]],"o":[[-0.76,0],[-7,-5.843],[-1.28,-1.351],[1.351,-1.276],[6.132,6.471],[1.426,1.19],[-0.664,0.799]],"v":[[-130.452,15.636],[-132.606,14.854],[-152.664,-3.981],[-152.539,-8.741],[-147.779,-8.617],[-128.292,9.686],[-127.866,14.427]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0.457,0],[0.558,1.249],[-1.696,0.759],[-7.627,4.553],[-0.957,-1.598],[1.597,-0.954],[8.357,-3.735]],"o":[[-1.289,0],[-0.76,-1.7],[8.117,-3.626],[1.588,-0.957],[0.953,1.598],[-7.855,4.691],[-0.447,0.2]],"v":[[111.992,49.148],[108.915,47.156],[110.614,42.708],[134.344,30.379],[138.961,31.542],[137.797,36.158],[113.363,48.855]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[1.328,0],[0.417,0.168],[8.022,4.419],[-0.897,1.628],[-1.633,-0.891],[-8.219,-3.34],[0.7,-1.723]],"o":[[-0.424,0],[-8.463,-3.439],[-1.628,-0.898],[0.898,-1.627],[7.792,4.29],[1.719,0.7],[-0.532,1.306]],"v":[[-69.627,52.17],[-70.896,51.923],[-95.738,40.081],[-97.063,35.507],[-92.49,34.183],[-68.358,45.683],[-66.507,50.072]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0.125,0],[0.194,1.719],[-1.848,0.207],[-8.627,2.006],[-0.421,-1.815],[1.811,-0.42],[9.12,-1.023]],"o":[[-1.692,0],[-0.208,-1.848],[8.86,-0.993],[1.795,-0.44],[0.421,1.812],[-8.884,2.068],[-0.128,0.012]],"v":[[43.489,67.762],[40.146,64.771],[43.118,61.05],[69.472,56.531],[73.512,59.047],[70.998,63.088],[43.867,67.744]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[1.738,0],[0.089,0.006],[8.959,1.769],[-0.358,1.822],[-1.815,-0.361],[-8.87,-0.697],[0.146,-1.851]],"o":[[-0.089,0],[-9.13,-0.72],[-1.825,-0.361],[0.364,-1.824],[8.709,1.723],[1.855,0.148],[-0.137,1.766]],"v":[[-0.542,68.477],[-0.809,68.467],[-28.074,64.715],[-30.727,60.76],[-26.772,58.106],[-0.284,61.752],[2.81,65.373]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[213.007,400.392],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":9,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.15,0],[0.539,0.319],[-0.946,1.601],[-2.002,3.879],[-1.66,-0.848],[0.851,-1.654],[2.331,-3.933]],"o":[[-0.582,0],[-1.601,-0.947],[2.263,-3.82],[0.852,-1.65],[1.651,0.852],[-2.062,3.995],[-0.628,1.062]],"v":[[-3.264,9.49],[-4.978,9.02],[-6.158,4.407],[0.27,-7.195],[4.806,-8.642],[6.253,-4.105],[-0.365,7.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[433.012,346.702],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Setting","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":90,"s":[360]}],"ix":10},"p":{"a":0,"k":[1976.14,908.807,0],"ix":2,"l":2},"a":{"a":0,"k":[447.134,454.057,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[46.518,0],[5.185,0.404],[33.943,39.682],[0,46.518],[-0.405,5.188],[-39.686,33.945],[-52.063,-4.057],[-33.942,-39.682],[-6.573,-12.168],[0,0],[8.601,10.05],[49.371,3.847],[37.635,-32.186],[3.849,-49.371],[0,-4.882],[-28.984,-33.882],[-49.372,-3.847],[-37.628,32.189],[-10.61,31.697],[0,0],[26.932,-23.037]],"o":[[-5.146,0],[-52.065,-4.054],[-30.565,-35.728],[0,-5.148],[4.057,-52.06],[39.676,-33.943],[52.065,4.054],[9.065,10.593],[0,0],[-6.234,-11.54],[-32.189,-37.635],[-49.371,-3.814],[-37.63,32.193],[-0.382,4.918],[0,44.114],[32.19,37.632],[49.407,3.85],[25.542,-21.85],[0,0],[-11.191,33.43],[-35.728,30.563]],"v":[[5.391,195.51],[-10.107,194.905],[-143.48,127.08],[-190.434,0.316],[-189.829,-15.189],[-122.001,-148.56],[20.264,-194.907],[153.636,-127.082],[177.203,-92.778],[168.319,-87.978],[145.962,-120.516],[19.482,-184.84],[-115.439,-140.887],[-179.762,-14.403],[-180.335,0.3],[-135.806,120.517],[-9.325,184.838],[125.595,140.885],[180.855,59.034],[190.435,62.243],[132.158,148.558]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[435.86,456.42],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.338,0],[3.709,-0.635],[10.034,-14.179],[-29.271,-20.712],[-17.133,2.923],[-10.034,14.179],[2.929,17.122],[14.179,10.034]],"o":[[-3.686,0],[-17.122,2.929],[-20.716,29.271],[14.18,10.037],[17.122,-2.929],[10.037,-14.181],[-2.933,-17.122],[-11.11,-7.861]],"v":[[0.115,-65.049],[-10.994,-64.099],[-53.106,-37.568],[-37.591,53.084],[10.952,64.101],[53.06,37.57],[64.081,-10.97],[37.546,-53.082]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[4.258,0],[12.832,9.081],[-23.93,33.817],[-19.782,3.386],[-16.379,-11.589],[-3.383,-19.779],[11.593,-16.379],[19.782,-3.386]],"o":[[-15.409,0.004],[-33.817,-23.93],[11.593,-16.382],[19.782,-3.377],[16.383,11.596],[3.387,19.782],[-11.591,16.382],[-4.283,0.733]],"v":[[-0.181,75.151],[-43.424,61.329],[-61.352,-43.4],[-12.697,-74.054],[43.378,-61.328],[74.032,-12.676],[61.305,43.402],[12.654,74.056]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[442.639,456.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.115,0.919],[0,0],[14.534,28.085],[0,0],[1.499,1.753],[0,0],[2.144,-0.845],[0,0],[29.287,9.31],[0,0],[2.298,0.179],[0,0],[0.918,-2.115],[0,0],[28.085,-14.534],[0,0],[1.754,-1.499],[0,0],[-0.846,-2.146],[0,0],[9.309,-29.285],[0,0],[0.179,-2.299],[0,0],[-2.116,-0.919],[0,0],[-14.534,-28.086],[0,0],[-1.499,-1.752],[0,0],[-2.145,0.846],[0,0],[-29.286,-9.309],[0,0],[-2.3,-0.179],[0,0],[-0.92,2.117],[0,0],[-28.085,14.535],[0,0],[-1.752,1.499],[0,0],[0.845,2.146],[0,0],[-9.311,29.284],[0,0],[-0.18,2.3]],"o":[[0.179,-2.299],[0,0],[-4.662,-30.373],[0,0],[1.169,-1.989],[0,0],[-1.5,-1.753],[0,0],[-25.497,-18.708],[0,0],[-0.58,-2.232],[0,0],[-2.301,-0.179],[0,0],[-30.374,4.662],[0,0],[-1.989,-1.169],[0,0],[-1.752,1.499],[0,0],[-18.71,25.496],[0,0],[-2.231,0.581],[0,0],[-0.18,2.299],[0,0],[4.662,30.373],[0,0],[-1.167,1.988],[0,0],[1.499,1.753],[0,0],[25.495,18.71],[0,0],[0.579,2.233],[0,0],[2.299,0.178],[0,0],[30.373,-4.663],[0,0],[1.987,1.168],[0,0],[1.753,-1.499],[0,0],[18.709,-25.496],[0,0],[2.232,-0.58],[0,0]],"v":[[348.565,-12.424],[345.329,-17.802],[284.976,-44.021],[256.242,-132.327],[289.545,-189.028],[288.993,-195.281],[237.687,-255.256],[231.597,-256.772],[170.421,-232.653],[87.629,-274.719],[71.076,-338.403],[66.265,-342.432],[-12.423,-348.563],[-17.802,-345.328],[-44.02,-284.977],[-132.326,-256.24],[-189.027,-289.545],[-195.28,-288.992],[-255.257,-237.686],[-256.772,-231.594],[-232.651,-170.419],[-274.717,-87.63],[-338.403,-71.076],[-342.433,-66.264],[-348.564,12.425],[-345.328,17.803],[-284.976,44.021],[-256.241,132.329],[-289.547,189.03],[-288.993,195.281],[-237.686,255.259],[-231.595,256.772],[-170.42,232.652],[-87.628,274.719],[-71.076,338.403],[-66.263,342.433],[12.425,348.564],[17.804,345.328],[44.021,284.978],[132.328,256.24],[189.029,289.547],[195.28,288.993],[255.256,237.687],[256.774,231.596],[232.652,170.422],[274.718,87.631],[338.403,71.076],[342.433,66.265]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[442.617,456.41],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.171,0],[0.26,1.66],[0.822,4.382],[-1.828,0.342],[-0.342,-1.825],[-0.697,-4.461],[1.838,-0.285]],"o":[[-1.631,0],[-0.685,-4.396],[-0.339,-1.828],[1.819,-0.316],[0.829,4.448],[0.285,1.838],[-0.176,0.027]],"v":[[1.151,10.129],[-2.172,7.282],[-4.428,-5.885],[-1.736,-9.813],[2.193,-7.121],[4.482,6.243],[1.673,10.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[889.192,377.526],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.079,0],[0.123,1.772],[-1.855,0.128],[-9.294,0.079],[0,0],[-0.017,-1.848],[1.857,-0.016],[9.104,-0.637]],"o":[[-1.752,0],[-0.13,-1.857],[9.245,-0.651],[0,0],[1.848,0],[0.016,1.86],[-9.16,0.079],[-0.082,0.007]],"v":[[-74.354,-157.223],[-77.708,-160.353],[-74.587,-163.946],[-46.649,-165.044],[-46.619,-165.044],[-43.252,-161.707],[-46.59,-158.311],[-74.114,-157.233]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.634,0],[0.172,0.026],[9.108,0.829],[-0.167,1.851],[-1.89,-0.174],[-9.173,-1.407],[0.283,-1.837]],"o":[[-0.168,0],[-9.041,-1.387],[-1.85,-0.168],[0.171,-1.851],[9.242,0.842],[1.838,0.283],[-0.253,1.667]],"v":[[25.987,-153.094],[25.472,-153.133],[-1.874,-156.47],[-4.921,-160.129],[-1.262,-163.177],[26.492,-159.787],[29.31,-155.951]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.257,0],[0.364,1.548],[-1.808,0.428],[-9.13,1.562],[-0.312,-1.832],[1.831,-0.313],[8.92,-2.104]],"o":[[-1.525,0],[-0.424,-1.808],[9.054,-2.133],[1.874,-0.296],[0.316,1.834],[-8.995,1.538],[-0.26,0.059]],"v":[[-146.325,-146.301],[-149.6,-148.895],[-147.095,-152.946],[-119.689,-158.515],[-115.803,-155.766],[-118.55,-151.88],[-145.549,-146.39]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[1.421,0],[0.345,0.112],[8.856,2.282],[-0.463,1.798],[-1.773,-0.461],[-8.82,-2.86],[0.571,-1.768]],"o":[[-0.341,0],[-8.689,-2.818],[-1.802,-0.463],[0.464,-1.802],[8.991,2.317],[1.77,0.572],[-0.461,1.424]],"v":[[96.795,-136.3],[95.757,-136.464],[69.311,-144.148],[66.888,-148.247],[70.988,-150.67],[97.835,-142.869],[100,-138.628]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0.43,0],[0.539,1.296],[-1.716,0.717],[-8.798,3.032],[-0.605,-1.759],[1.756,-0.605],[8.426,-3.505]],"o":[[-1.319,0],[-0.713,-1.715],[8.551,-3.554],[1.765,-0.601],[0.605,1.759],[-8.666,2.988],[-0.421,0.174]],"v":[[-215.586,-123.912],[-218.697,-125.987],[-216.879,-130.389],[-190.731,-140.318],[-186.451,-138.233],[-188.536,-133.952],[-214.294,-124.168]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[1.22,0],[0.494,0.256],[8.374,3.682],[-0.75,1.704],[-1.706,-0.756],[-8.238,-4.251],[0.852,-1.651]],"o":[[-0.519,0],[-8.117,-4.185],[-1.703,-0.747],[0.743,-1.703],[8.499,3.735],[1.655,0.852],[-0.598,1.16]],"v":[[163.963,-108.306],[162.424,-108.68],[137.574,-120.535],[135.847,-124.971],[140.283,-126.697],[165.508,-114.664],[166.959,-110.13]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0.609,0],[0.638,1.026],[-1.578,0.983],[-8.177,4.416],[-0.881,-1.63],[1.634,-0.884],[7.759,-4.829]],"o":[[-1.124,0],[-0.983,-1.578],[7.874,-4.901],[1.643,-0.891],[0.884,1.638],[-8.058,4.349],[-0.552,0.345]],"v":[[-280.312,-90.578],[-283.172,-92.166],[-282.093,-96.802],[-257.902,-110.847],[-253.34,-109.486],[-254.7,-104.922],[-278.536,-91.088]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[1.029,0],[0.605,0.447],[7.656,4.985],[-1.016,1.558],[-1.569,-1.016],[-7.45,-5.537],[1.108,-1.493]],"o":[[-0.698,0],[-7.338,-5.455],[-1.559,-1.012],[1.012,-1.556],[7.769,5.059],[1.493,1.108],[-0.661,0.888]],"v":[[225.708,-69.803],[223.701,-70.467],[201.106,-86.196],[200.122,-90.854],[204.781,-91.837],[227.719,-75.872],[228.412,-71.161]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0.785,0],[0.665,0.759],[-1.4,1.222],[-7.338,5.665],[-1.135,-1.467],[1.47,-1.137],[6.901,-6.03]],"o":[[-0.938,0],[-1.222,-1.4],[7.007,-6.119],[1.483,-1.131],[1.134,1.473],[-7.233,5.579],[-0.638,0.559]],"v":[[-338.812,-47.223],[-341.348,-48.374],[-341.029,-53.124],[-319.413,-70.882],[-314.687,-70.273],[-315.296,-65.549],[-336.597,-48.055]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0.844,0],[0.66,0.681],[6.776,6.178],[-1.253,1.374],[-1.371,-1.256],[-6.437,-6.638],[1.335,-1.295]],"o":[[-0.878,0],[-6.343,-6.539],[-1.374,-1.252],[1.252,-1.381],[6.878,6.273],[1.295,1.335],[-0.654,0.635]],"v":[[280.414,-21.832],[277.998,-22.855],[258.229,-42.019],[258.008,-46.776],[262.765,-46.996],[282.83,-27.543],[282.757,-22.783]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0.97,0],[0.628,0.523],[-1.187,1.431],[-6.371,6.79],[-1.361,-1.272],[1.272,-1.355],[5.82,-7.01]],"o":[[-0.756,0],[-1.43,-1.186],[5.908,-7.114],[1.273,-1.357],[1.354,1.276],[-6.283,6.69],[-0.667,0.802]],"v":[[-389.644,4.88],[-391.791,4.104],[-392.231,-0.637],[-373.725,-21.593],[-368.964,-21.744],[-368.814,-16.983],[-387.05,3.664]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[0.668,0],[0.655,0.937],[5.701,7.164],[-1.453,1.157],[-1.158,-1.453],[-5.316,-7.595],[1.525,-1.068]],"o":[[-1.061,0],[-5.237,-7.479],[-1.157,-1.456],[1.46,-1.164],[5.786,7.276],[1.064,1.522],[-0.585,0.411]],"v":[[326.809,34.262],[324.047,32.825],[307.564,10.755],[308.099,6.024],[312.831,6.56],[329.565,28.966],[328.736,33.654]],"c":true},"ix":2},"nm":"Path 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0.49,0],[0.579,1.203],[4.458,7.963],[-1.624,0.911],[-0.908,-1.621],[-4.03,-8.384],[1.674,-0.806]],"o":[[-1.256,0],[-3.972,-8.259],[-0.907,-1.621],[1.624,-0.901],[4.521,8.081],[0.806,1.677],[-0.47,0.227]],"v":[[363.576,97.09],[360.538,95.183],[347.837,70.736],[349.133,66.153],[353.716,67.448],[366.607,92.264],[365.033,96.758]],"c":true},"ix":2},"nm":"Path 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[0.312,0],[0.431,1.469],[3.109,8.6],[-1.749,0.634],[-0.632,-1.749],[-2.613,-8.91],[1.785,-0.523]],"o":[[-1.457,0],[-2.571,-8.775],[-0.632,-1.747],[1.742,-0.639],[3.159,8.726],[0.523,1.785],[-0.317,0.092]],"v":[[389.664,165.044],[386.432,162.624],[377.868,136.441],[379.889,132.131],[384.201,134.152],[392.896,160.73],[390.611,164.909]],"c":true},"ix":2},"nm":"Path 14","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[487.88,165.294],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":16,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.118,0],[0.559,0.353],[-0.993,1.572],[-2.525,3.758],[-1.542,-1.042],[1.036,-1.542],[2.37,-3.762]],"o":[[-0.615,0],[-1.571,-0.989],[2.404,-3.813],[1.035,-1.542],[1.545,1.039],[-2.492,3.706],[-0.639,1.015]],"v":[[-3.669,9.241],[-5.461,8.722],[-6.513,4.08],[0.881,-7.282],[5.553,-8.199],[6.47,-3.528],[-0.818,7.671]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.549,208.315],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.256,0],[0.364,1.552],[0.901,4.425],[-1.821,0.369],[-0.368,-1.828],[-1.019,-4.34],[1.809,-0.424]],"o":[[-1.529,0],[-1.033,-4.406],[-0.371,-1.822],[1.819,-0.368],[0.888,4.36],[0.424,1.812],[-0.259,0.06]],"v":[[1.422,10.09],[-1.852,7.493],[-4.756,-5.753],[-2.129,-9.722],[1.839,-7.095],[4.703,5.954],[2.194,10.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.377,550.784],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.424,0],[0.533,1.309],[2.824,8.337],[-1.762,0.595],[-0.598,-1.762],[-3.285,-8.085],[1.722,-0.7]],"o":[[-1.329,0],[-3.331,-8.203],[-0.595,-1.759],[1.746,-0.595],[2.782,8.209],[0.7,1.722],[-0.414,0.168]],"v":[[-389.817,-124.474],[-392.937,-126.574],[-402.212,-151.501],[-400.101,-155.77],[-395.834,-153.658],[-386.697,-129.105],[-388.551,-124.72]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.589,0],[0.631,1.052],[4.074,7.795],[-1.65,0.862],[-0.862,-1.65],[-4.494,-7.487],[1.594,-0.957]],"o":[[-1.144,0],[-4.563,-7.598],[-0.858,-1.647],[1.644,-0.857],[4.011,7.677],[0.957,1.595],[-0.543,0.326]],"v":[[-358.867,-62.533],[-361.757,-64.167],[-374.773,-87.365],[-373.346,-91.909],[-368.802,-90.482],[-355.984,-67.633],[-357.137,-63.013]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.003,0],[0.615,0.48],[-1.141,1.467],[-4.912,7.137],[-1.526,-1.052],[1.053,-1.528],[5.444,-6.989]],"o":[[-0.724,0],[-1.466,-1.141],[5.362,-6.888],[1.059,-1.532],[1.531,1.055],[-4.988,7.25],[-0.664,0.851]],"v":[[383.376,-17.693],[381.311,-18.403],[380.723,-23.127],[396.205,-44.263],[400.887,-45.132],[401.754,-40.45],[386.036,-18.991]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0.76,0],[0.667,0.799],[5.254,7.108],[-1.493,1.108],[-1.105,-1.49],[-5.559,-6.674],[1.431,-1.19]],"o":[[-0.966,0],[-5.642,-6.773],[-1.105,-1.496],[1.506,-1.105],[5.175,7.006],[1.19,1.427],[-0.628,0.523]],"v":[[-318.754,-6.094],[-321.344,-7.306],[-337.763,-28.227],[-337.056,-32.938],[-332.345,-32.23],[-316.17,-11.614],[-316.604,-6.873]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0.829,0],[0.664,0.7],[-1.352,1.276],[-5.961,6.316],[-1.352,-1.269],[1.277,-1.351],[6.427,-6.066]],"o":[[-0.893,0],[-1.275,-1.355],[6.335,-5.977],[1.279,-1.348],[1.351,1.279],[-6.052,6.407],[-0.652,0.611]],"v":[[336.779,33.507],[334.33,32.451],[334.469,27.69],[353.001,9.167],[357.762,9.03],[357.899,13.791],[339.091,32.59]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0.931,0],[0.641,0.565],[6.276,6.244],[-1.312,1.318],[-1.318,-1.313],[-6.493,-5.747],[1.233,-1.394]],"o":[[-0.795,0],[-6.589,-5.833],[-1.318,-1.312],[1.312,-1.315],[6.185,6.147],[1.391,1.233],[-0.668,0.75]],"v":[[-270.543,43.613],[-272.775,42.769],[-292.166,24.571],[-292.179,19.811],[-287.419,19.797],[-268.311,37.724],[-268.021,42.479]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0.657,0],[0.655,0.947],[-1.529,1.056],[-6.862,5.352],[-1.144,-1.467],[1.466,-1.144],[7.269,-5.017]],"o":[[-1.069,0],[-1.054,-1.532],[7.164,-4.941],[1.465,-1.141],[1.141,1.466],[-6.967,5.427],[-0.586,0.401]],"v":[[282.921,77.082],[280.145,75.628],[281.004,70.944],[302.141,55.432],[306.868,56.018],[306.283,60.745],[284.831,76.487]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[1.108,0],[0.562,0.361],[7.13,5.188],[-1.095,1.506],[-1.502,-1.091],[-7.325,-4.698],[1.003,-1.565]],"o":[[-0.621,0],[-7.433,-4.767],[-1.503,-1.094],[1.098,-1.503],[7.019,5.112],[1.565,1.002],[-0.644,1.003]],"v":[[-215.349,85.356],[-217.164,84.824],[-239.112,69.819],[-239.852,65.115],[-235.148,64.375],[-213.528,79.156],[-212.512,83.809]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0.49,0],[0.582,1.206],[-1.677,0.809],[-7.607,4.238],[-0.907,-1.624],[1.624,-0.904],[7.953,-3.83]],"o":[[-1.253,0],[-0.806,-1.674],[7.831,-3.771],[1.634,-0.901],[0.905,1.624],[-7.723,4.3],[-0.47,0.227]],"v":[[223.052,111.882],[220.014,109.976],[221.589,105.48],[244.855,93.411],[249.435,94.717],[248.13,99.296],[224.508,111.55]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[1.295,0],[0.441,0.194],[7.835,4.021],[-0.849,1.654],[-1.66,-0.849],[-7.973,-3.515],[0.749,-1.7]],"o":[[-0.454,0],[-8.094,-3.567],[-1.654,-0.848],[0.851,-1.647],[7.716,3.961],[1.703,0.749],[-0.556,1.259]],"v":[[-154.369,118.093],[-155.724,117.806],[-179.727,106.368],[-181.183,101.834],[-176.65,100.378],[-153.008,111.646],[-151.285,116.083]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0.322,0],[0.441,1.454],[-1.779,0.539],[-8.146,3.001],[-0.643,-1.746],[1.746,-0.645],[8.465,-2.565]],"o":[[-1.446,0],[-0.54,-1.778],[8.34,-2.529],[1.739,-0.641],[0.642,1.746],[-8.268,3.047],[-0.327,0.098]],"v":[[158.534,137.023],[155.312,134.633],[157.558,130.435],[182.402,122.101],[186.725,124.095],[184.73,128.419],[159.511,136.878]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[1.485,0],[0.289,0.079],[8.377,2.771],[-0.585,1.766],[-1.778,-0.579],[-8.403,-2.246],[0.48,-1.795]],"o":[[-0.289,0],[-8.532,-2.279],[-1.766,-0.582],[0.582,-1.762],[8.252,2.728],[1.799,0.48],[-0.401,1.506]],"v":[[-89.049,141.051],[-89.92,140.936],[-115.4,133.324],[-117.537,129.07],[-113.283,126.934],[-88.185,134.432],[-85.801,138.552]],"c":true},"ix":2},"nm":"Path 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0.154,0],[0.237,1.679],[-1.842,0.259],[-8.522,1.716],[-0.368,-1.821],[1.822,-0.368],[8.746,-1.233]],"o":[[-1.654,0],[-0.26,-1.842],[8.616,-1.213],[1.805,-0.366],[0.364,1.822],[-8.65,1.743],[-0.161,0.023]],"v":[[90.913,151.932],[87.582,149.036],[90.446,145.232],[116.274,140.817],[120.239,143.453],[117.602,147.418],[91.386,151.899]],"c":true},"ix":2},"nm":"Path 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[1.696,0],[0.122,0.014],[8.686,1.456],[-0.306,1.831],[-1.824,-0.318],[-8.663,-0.937],[0.201,-1.848]],"o":[[-0.122,0],[-8.794,-0.953],[-1.834,-0.31],[0.306,-1.835],[8.562,1.437],[1.848,0.2],[-0.187,1.726]],"v":[[-20.99,153.738],[-21.356,153.718],[-47.7,150.088],[-50.465,146.212],[-46.589,143.447],[-20.632,147.024],[-17.647,150.732]],"c":true},"ix":2},"nm":"Path 14","mn":"ADBE Vector Shape - Group","hd":false},{"ind":14,"ty":"sh","ix":15,"ks":{"a":0,"k":{"i":[[6.848,0],[1.989,0.027],[-0.022,1.861],[-1.838,0],[0,0],[-8.693,0.394],[-0.082,-1.86],[1.858,-0.085]],"o":[[-1.989,0],[-1.857,-0.026],[0.027,-1.841],[0,0],[8.709,0.119],[1.732,-0.119],[0.085,1.858],[-6.839,0.309]],"v":[[27.733,156.365],[21.769,156.324],[18.448,152.912],[21.815,149.592],[21.861,149.592],[48.058,149.171],[51.572,152.383],[48.36,155.897]],"c":true},"ix":2},"nm":"Path 15","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[417.68,751.499],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":17,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.184,0],[0.517,0.289],[-0.904,1.624],[-2.039,3.952],[-1.66,-0.848],[0.851,-1.653],[2.2,-3.959]],"o":[[-0.552,0],[-1.627,-0.904],[2.167,-3.899],[0.852,-1.65],[1.651,0.852],[-2.072,4.012],[-0.615,1.107]],"v":[[-3.179,9.536],[-4.811,9.112],[-6.119,4.536],[0.188,-7.241],[4.723,-8.688],[6.171,-4.151],[-0.234,7.804]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[842.422,666.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Lock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1896.529,2431.411,0],"ix":2,"l":2},"a":{"a":0,"k":[86.599,112.545,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.757,0],[0,0],[-0.878,3.654],[0,0],[-0.536,10.15],[-13.139,0.816],[0,-15.022],[7.652,-4.574]],"o":[[0.878,3.653],[0,0],[-3.758,0],[0,0],[-8.028,-4.799],[0.694,-13.148],[15.227,-0.946],[0,9.563],[0,0]],"v":[[20.222,34.92],[14.573,42.088],[-14.573,42.088],[-20.222,34.919],[-13.422,6.61],[-26.161,-17.308],[-1.673,-42.035],[26.198,-15.89],[13.421,6.61]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[8.661,0],[0,0],[0,-8.66],[0,0],[-8.661,0],[0,0],[0,8.661],[0,0]],"o":[[0,0],[-8.661,0],[0,0],[0,8.661],[0,0],[8.661,0],[0,0],[0,-8.66]],"v":[[70.667,-69.917],[-70.667,-69.917],[-86.349,-54.234],[-86.349,54.234],[-70.667,69.917],[70.667,69.917],[86.349,54.234],[86.349,-54.234]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.599,154.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.151,0],[0,0],[0,4.152],[0,0],[10.23,0],[0,0],[0,-10.229],[0,0],[4.152,0],[0,0],[0,4.152],[0,0],[-23.151,0],[0,0],[0,-23.151],[0,0]],"o":[[0,0],[-4.152,0],[0,0],[0,-10.229],[0,0],[-10.23,0],[0,0],[0,4.152],[0,0],[-4.151,0],[0,0],[0,-23.151],[0,0],[23.151,0],[0,0],[0,4.152]],"v":[[60.304,39.006],[51.943,39.006],[44.425,31.49],[44.425,2.911],[25.903,-15.61],[-25.904,-15.61],[-44.426,2.911],[-44.426,31.49],[-51.944,39.006],[-60.305,39.006],[-67.822,31.49],[-67.822,2.911],[-25.904,-39.006],[25.903,-39.006],[67.822,2.911],[67.822,31.49]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.6,39.257],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"loading Line 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1667.146,2764.849,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.004,24.662,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-60,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-15,"s":[0,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":75,"s":[0,100,100]},{"t":120,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.946,0],[0,0],[0,2.946],[0,0],[-2.946,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.946,0],[0,0],[0,-2.946],[0,0],[2.946,0],[0,0],[0,2.946]],"v":[[157.29,24.661],[-157.295,24.661],[-162.628,19.327],[-162.628,-19.328],[-157.295,-24.661],[157.29,-24.661],[162.624,-19.328],[162.624,19.327]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[162.624,24.662],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"loading Line 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1667.146,2684.435,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.004,24.665,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-75,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-30,"s":[0,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[0,100,100]},{"t":105,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.946,0],[0,0],[0,2.945],[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0],[2.946,0],[0,0],[0,2.945]],"v":[[269.114,24.661],[-269.12,24.661],[-274.453,19.328],[-274.453,-19.328],[-269.12,-24.661],[269.114,-24.661],[274.448,-19.328],[274.448,19.328]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[274.448,24.665],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"loading Line 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1665.449,2605.613,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.001,24.663,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-90,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-45,"s":[0,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[0,100,100]},{"t":90,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.945,0],[0,0],[0,2.945],[0,0],[-2.946,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.946,0],[0,0],[0,-2.946],[0,0],[2.945,0],[0,0],[0,2.945]],"v":[[269.117,24.663],[-269.117,24.663],[-274.451,19.33],[-274.451,-19.326],[-269.117,-24.659],[269.117,-24.659],[274.45,-19.326],[274.45,19.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[274.45,24.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Doc Line 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1022.39,2843.612,0],"ix":2,"l":2},"a":{"a":0,"k":[0,24.661,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.945,0],[0,0],[0,2.945],[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0],[2.945,0],[0,0],[0,2.945]],"v":[[185.561,24.661],[-185.562,24.661],[-190.895,19.328],[-190.895,-19.328],[-185.562,-24.661],[185.561,-24.661],[190.894,-19.328],[190.894,19.328]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.894,24.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Doc Line 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1021.638,2764.849,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.002,24.662,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.945,0],[0,0],[0,2.946],[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0],[2.945,0],[0,0],[0,2.946]],"v":[[185.561,24.661],[-185.562,24.661],[-190.896,19.327],[-190.896,-19.328],[-185.562,-24.661],[185.561,-24.661],[190.894,-19.328],[190.894,19.327]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.894,24.662],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Doc Line 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1019.402,2684.435,0],"ix":2,"l":2},"a":{"a":0,"k":[0.002,24.665,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.946,0],[0,0],[0,2.945],[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0],[2.946,0],[0,0],[0,2.945]],"v":[[185.562,24.661],[-185.561,24.661],[-190.894,19.328],[-190.894,-19.328],[-185.561,-24.661],[185.562,-24.661],[190.895,-19.328],[190.895,19.328]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.896,24.665],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Doc Line 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1018.651,2605.671,0],"ix":2,"l":2},"a":{"a":0,"k":[0.001,24.661,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.946,0],[0,0],[0,2.945],[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0]],"o":[[0,0],[-2.945,0],[0,0],[0,-2.946],[0,0],[2.946,0],[0,0],[0,2.945]],"v":[[376.457,49.322],[5.334,49.322],[0.001,43.989],[0.001,5.333],[5.334,0],[376.457,0],[381.79,5.333],[381.79,43.989]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Document Bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1226.408,2697.161,0],"ix":2,"l":2},"a":{"a":0,"k":[317.795,404.108,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.658,0],[0,0],[0,20.658],[0,0],[-21.204,-0.811],[0,0],[0,-20.101],[0,0]],"o":[[0,0],[-20.658,0],[0,0],[0,-21.219],[0,0],[20.087,0.769],[0,0],[0,20.658]],"v":[[280.141,403.467],[-280.14,403.467],[-317.545,366.063],[-317.545,-365.277],[-278.71,-402.655],[281.571,-381.215],[317.546,-343.837],[317.546,366.063]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[317.795,403.716],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Laptop","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1619.189,2712.431,0],"ix":2,"l":2},"a":{"a":0,"k":[895.075,527.973,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.109,0],[0,0],[0,3.109],[0,0],[3.111,0],[0,0],[0,-3.11],[0,0]],"o":[[0,0],[3.11,0],[0,0],[0,-3.11],[0,0],[-3.109,0],[0,0],[0,3.109]],"v":[[-889.171,38.323],[889.171,38.323],[894.825,32.669],[894.825,-32.671],[889.171,-38.324],[-889.171,-38.324],[-894.825,-32.671],[-894.825,32.669]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[895.075,1016.896],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.121,0],[0,0],[-0.033,2.147],[0,0],[8.681,8.317],[1.084,-0.051],[0,0],[-0.058,2.148],[-2.288,-0.194],[0,0],[-18.241,-17.477],[-0.078,-16.875],[0,0]],"o":[[0,0],[-2.15,-0.031],[0,0],[-0.068,-14.611],[-16.203,-15.524],[0,0],[-2.148,-0.054],[0.056,-2.148],[0,0],[2.826,-0.167],[10.262,9.833],[0,0],[-0.032,2.129]],"v":[[253.636,159.681],[253.577,159.681],[249.743,155.731],[253.354,-90.248],[240.171,-124.842],[197.158,-139.523],[-257.295,-151.71],[-261.08,-155.703],[-257.085,-159.487],[197.098,-147.3],[245.556,-130.464],[261.138,-90.21],[257.525,155.847]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1392.359,234.571],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.121,0],[0,0],[-0.033,2.152],[0,0],[-2.121,0],[0,0],[0.032,-2.151],[0,0]],"o":[[0,0],[-2.17,-0.031],[0,0],[0.03,-2.129],[0,0],[2.169,0.031],[0,0],[-0.032,2.129]],"v":[[-0.468,36.004],[-0.507,36.004],[-4.361,32.053],[-3.419,-32.17],[0.47,-36.004],[0.508,-36.004],[4.362,-32.055],[3.421,32.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1644.152,515.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-14.606,0],[0,0],[0,14.605],[0,0],[25.327,-1.012],[0,0],[9.639,-9.614],[-0.341,-13.61]],"o":[[0,14.605],[0,0],[14.607,0],[0,0],[-1.404,-47.656],[0,0],[-13.61,-0.364],[-9.639,9.615],[0,0]],"v":[[-749.365,433.825],[-722.808,460.383],[732.375,460.383],[758.933,433.825],[770.852,-358.1],[702.34,-421.872],[-719.505,-460.019],[-755.912,-445.526],[-770.511,-409.143]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.12156862745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[900.476,494.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-15.439,0],[0,0],[0,15.424],[0,0],[33.304,-2.263],[0,0],[13.718,-13.673],[-0.458,-19.355]],"o":[[0,15.424],[0,0],[15.438,0],[0,0],[0,-15.423],[0,0],[-19.371,-0.501],[-13.717,13.674],[0,0]],"v":[[-782.729,463.232],[-754.658,491.276],[763.332,491.276],[791.403,463.232],[804.035,-409.116],[752.557,-452.389],[-730.99,-490.775],[-782.811,-470.148],[-803.577,-418.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[906.126,491.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[1855,2079.442,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[1855,2129.442,0],"to":[0,0,0],"ti":[0,0,0]},{"t":90,"s":[1855,2079.442,0]}],"ix":2,"l":2},"a":{"a":0,"k":[1457.664,834.54,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-72.82,310.808],[-163.923,40.348],[-91.391,-44.95],[-8.398,33.377],[-338.381,0],[0,-411.403],[0.187,-14.317],[-19.556,-3.28],[-6.856,-163.896],[183.708,0],[0,0]],"o":[[39.377,-168.069],[112.699,-27.742],[30.312,14.908],[80.789,-321.076],[401.242,0],[0,10.921],[1.421,30.764],[157.204,16.775],[7.871,188.186],[0,0],[-290.889,0]],"v":[[-1202.679,156.969],[-870.615,-183.385],[-558.399,-151.289],[-483.669,-186.636],[219.832,-744.911],[946.344,-0.001],[945.944,40.154],[980.021,87.262],[1267.629,400.812],[942.41,744.911],[-756.852,744.911]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.379145573635,0.416115405513,0.963032382142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1431.885,923.919],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.558,348.1],[-183.592,45.19],[-102.357,-50.344],[-9.407,37.383],[-378.982,0],[0,-460.765],[0.208,-16.034],[-21.901,-3.674],[-7.678,-183.561],[205.75,0],[0,0]],"o":[[44.102,-188.235],[126.221,-31.069],[33.948,16.697],[90.482,-359.599],[449.386,0],[0,12.232],[1.591,34.456],[176.069,18.789],[8.817,210.766],[0,0],[-325.792,0]],"v":[[-1346.983,175.804],[-975.075,-205.389],[-625.399,-169.442],[-541.701,-209.03],[246.208,-834.291],[1059.891,0],[1059.443,44.973],[1097.609,97.731],[1419.724,448.905],[1055.484,834.291],[-847.662,834.291]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.21568627450980393,0.7568627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1428.791,834.541],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Background Shape","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1876.955,1891.635,0],"ix":2,"l":2},"a":{"a":0,"k":[1473.364,1375.013,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[110,110,100]},{"t":90,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[168.339,-402.166],[596.684,93.25],[235.668,213.24],[-365.966,572.834],[-453.695,-11.821],[-329.144,-275.374],[-96.098,-152.478]],"o":[[-258.302,617.093],[-97.093,-15.175],[-453.675,-410.503],[266.36,-416.923],[97.727,2.547],[48.346,40.447],[225.657,358.046]],"v":[[1262.172,445.366],[-280.871,1314.907],[-879.814,1041.292],[-1064.545,-754.895],[132.986,-1396.336],[934.384,-1102.721],[1185.457,-813.682]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9450980392156862,0.9333333333333333,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1430.761,1408.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} ================================================ FILE: frontend/public/mockServiceWorker.js ================================================ /* eslint-disable */ /* tslint:disable */ /** * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. */ const PACKAGE_VERSION = '2.11.6' const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() addEventListener('install', function () { self.skipWaiting() }) addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) addEventListener('message', async function (event) { const clientId = Reflect.get(event.source || {}, 'id') if (!clientId || !self.clients) { return } const client = await self.clients.get(clientId) if (!client) { return } const allClients = await self.clients.matchAll({ type: 'window', }) switch (event.data) { case 'KEEPALIVE_REQUEST': { sendToClient(client, { type: 'KEEPALIVE_RESPONSE', }) break } case 'INTEGRITY_CHECK_REQUEST': { sendToClient(client, { type: 'INTEGRITY_CHECK_RESPONSE', payload: { packageVersion: PACKAGE_VERSION, checksum: INTEGRITY_CHECKSUM, }, }) break } case 'MOCK_ACTIVATE': { activeClientIds.add(clientId) sendToClient(client, { type: 'MOCKING_ENABLED', payload: { client: { id: client.id, frameType: client.frameType, }, }, }) break } case 'CLIENT_CLOSED': { activeClientIds.delete(clientId) const remainingClients = allClients.filter((client) => { return client.id !== clientId }) // Unregister itself when there are no more clients if (remainingClients.length === 0) { self.registration.unregister() } break } } }) addEventListener('fetch', function (event) { const requestInterceptedAt = Date.now() // Bypass navigation requests. if (event.request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. if ( event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin' ) { return } // Bypass all requests when there are no active clients. // Prevents the self-unregistered worked from handling requests // after it's been terminated (still remains active until the next reload). if (activeClientIds.size === 0) { return } const requestId = crypto.randomUUID() event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) }) /** * @param {FetchEvent} event * @param {string} requestId * @param {number} requestInterceptedAt */ async function handleRequest(event, requestId, requestInterceptedAt) { const client = await resolveMainClient(event) const requestCloneForEvents = event.request.clone() const response = await getResponse( event, client, requestId, requestInterceptedAt, ) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { const serializedRequest = await serializeRequest(requestCloneForEvents) // Clone the response so both the client and the library could consume it. const responseClone = response.clone() sendToClient( client, { type: 'RESPONSE', payload: { isMockedResponse: IS_MOCKED_RESPONSE in response, request: { id: requestId, ...serializedRequest, }, response: { type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, headers: Object.fromEntries(responseClone.headers.entries()), body: responseClone.body, }, }, }, responseClone.body ? [serializedRequest.body, responseClone.body] : [], ) } return response } /** * Resolve the main client for the given event. * Client that issues a request doesn't necessarily equal the client * that registered the worker. It's with the latter the worker should * communicate with during the response resolving phase. * @param {FetchEvent} event * @returns {Promise} */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) if (activeClientIds.has(event.clientId)) { return client } if (client?.frameType === 'top-level') { return client } const allClients = await self.clients.matchAll({ type: 'window', }) return allClients .filter((client) => { // Get only those clients that are currently visible. return client.visibilityState === 'visible' }) .find((client) => { // Find the client ID that's recorded in the // set of clients that have registered the worker. return activeClientIds.has(client.id) }) } /** * @param {FetchEvent} event * @param {Client | undefined} client * @param {string} requestId * @param {number} requestInterceptedAt * @returns {Promise} */ async function getResponse(event, client, requestId, requestInterceptedAt) { // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). const requestClone = event.request.clone() function passthrough() { // Cast the request headers to a new Headers instance // so the headers can be manipulated with. const headers = new Headers(requestClone.headers) // Remove the "accept" header value that marked this request as passthrough. // This prevents request alteration and also keeps it compliant with the // user-defined CORS policies. const acceptHeader = headers.get('accept') if (acceptHeader) { const values = acceptHeader.split(',').map((value) => value.trim()) const filteredValues = values.filter( (value) => value !== 'msw/passthrough', ) if (filteredValues.length > 0) { headers.set('accept', filteredValues.join(', ')) } else { headers.delete('accept') } } return fetch(requestClone, { headers }) } // Bypass mocking when the client is not active. if (!client) { return passthrough() } // Bypass initial page load requests (i.e. static assets). // The absence of the immediate/parent client in the map of the active clients // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet // and is not ready to handle requests. if (!activeClientIds.has(client.id)) { return passthrough() } // Notify the client that a request has been intercepted. const serializedRequest = await serializeRequest(event.request) const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, interceptedAt: requestInterceptedAt, ...serializedRequest, }, }, [serializedRequest.body], ) switch (clientMessage.type) { case 'MOCK_RESPONSE': { return respondWithMock(clientMessage.data) } case 'PASSTHROUGH': { return passthrough() } } return passthrough() } /** * @param {Client} client * @param {any} message * @param {Array} transferrables * @returns {Promise} */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() channel.port1.onmessage = (event) => { if (event.data && event.data.error) { return reject(event.data.error) } resolve(event.data) } client.postMessage(message, [ channel.port2, ...transferrables.filter(Boolean), ]) }) } /** * @param {Response} response * @returns {Response} */ function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create // a Response instance with status code 0, handle that use-case separately. if (response.status === 0) { return Response.error() } const mockedResponse = new Response(response.body, response) Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { value: true, enumerable: true, }) return mockedResponse } /** * @param {Request} request */ async function serializeRequest(request) { return { url: request.url, mode: request.mode, method: request.method, headers: Object.fromEntries(request.headers.entries()), cache: request.cache, credentials: request.credentials, destination: request.destination, integrity: request.integrity, redirect: request.redirect, referrer: request.referrer, referrerPolicy: request.referrerPolicy, body: await request.arrayBuffer(), keepalive: request.keepalive, } } ================================================ FILE: frontend/services/api-key-settings.service.ts ================================================ import { api } from '@/lib/api-client' import type { ApiKeySettings } from '@/types/api-key-settings.types' export class ApiKeySettingsService { static async getSettings(): Promise { const res = await api.get('/settings/api-keys/') return res.data } static async updateSettings(data: Partial): Promise { const res = await api.put('/settings/api-keys/', data) return res.data } } ================================================ FILE: frontend/services/auth.service.ts ================================================ /** * Authentication service */ import { api } from '@/lib/api-client' import type { LoginRequest, LoginResponse, MeResponse, LogoutResponse, ChangePasswordRequest, ChangePasswordResponse } from '@/types/auth.types' import { USE_MOCK, mockDelay, mockLoginResponse, mockLogoutResponse, mockMeResponse } from '@/mock' /** * User login */ export async function login(data: LoginRequest): Promise { if (USE_MOCK) { await mockDelay() return mockLoginResponse } const res = await api.post('/auth/login/', data) return res.data } /** * User logout */ export async function logout(): Promise { if (USE_MOCK) { await mockDelay() return mockLogoutResponse } const res = await api.post('/auth/logout/') return res.data } /** * Get current user information */ export async function getMe(): Promise { if (USE_MOCK) { await mockDelay() return mockMeResponse } const res = await api.get('/auth/me/') return res.data } /** * Change password */ export async function changePassword(data: ChangePasswordRequest): Promise { if (USE_MOCK) { await mockDelay() return { message: 'Password changed successfully' } } const res = await api.post('/auth/change-password/', data) return res.data } ================================================ FILE: frontend/services/command.service.ts ================================================ import { api } from "@/lib/api-client" import type { Command, GetCommandsRequest, GetCommandsResponse, CreateCommandRequest, UpdateCommandRequest, CommandResponseData, BatchDeleteCommandsResponseData, } from "@/types/command.types" /** * Command service */ export class CommandService { /** * Get command list */ static async getCommands( params: GetCommandsRequest = {} ): Promise { const response = await api.get( "/commands/", { params } ) return response.data } /** * Get single command */ static async getCommandById(id: number): Promise { const response = await api.get( `/commands/${id}/` ) return response.data } /** * Create command */ static async createCommand( data: CreateCommandRequest ): Promise { const response = await api.post( "/commands/create/", data ) return response.data } /** * Update command */ static async updateCommand( id: number, data: UpdateCommandRequest ): Promise { const response = await api.put( `/commands/${id}/`, data ) return response.data } /** * Delete command */ static async deleteCommand( id: number ): Promise { await api.delete( `/commands/${id}/` ) } /** * Batch delete commands */ static async batchDeleteCommands( ids: number[] ): Promise { const response = await api.post( "/commands/batch-delete/", { ids } ) return response.data } } ================================================ FILE: frontend/services/dashboard.service.ts ================================================ import { api } from '@/lib/api-client' import type { DashboardStats, AssetStatistics, StatisticsHistoryItem } from '@/types/dashboard.types' import { USE_MOCK, mockDelay, mockDashboardStats, mockAssetStatistics, getMockStatisticsHistory } from '@/mock' export async function getDashboardStats(): Promise { if (USE_MOCK) { await mockDelay() return mockDashboardStats } const res = await api.get('/dashboard/stats/') return res.data } /** * Get asset statistics data (pre-aggregated) */ export async function getAssetStatistics(): Promise { if (USE_MOCK) { await mockDelay() return mockAssetStatistics } const res = await api.get('/assets/statistics/') return res.data } /** * Get statistics history data (for line charts) */ export async function getStatisticsHistory(days: number = 7): Promise { if (USE_MOCK) { await mockDelay() return getMockStatisticsHistory(days) } const res = await api.get('/assets/statistics/history/', { params: { days } }) return res.data } ================================================ FILE: frontend/services/directory.service.ts ================================================ import { api } from "@/lib/api-client" // Bulk create directories response type export interface BulkCreateDirectoriesResponse { message: string createdCount: number } // Bulk delete response type export interface BulkDeleteResponse { deletedCount: number } /** Directory related API service */ export class DirectoryService { /** * Bulk delete directories * POST /api/assets/directories/bulk-delete/ */ static async bulkDelete(ids: number[]): Promise { const response = await api.post( `/assets/directories/bulk-delete/`, { ids } ) return response.data } /** * Bulk create directories (bind to target) * POST /api/targets/{target_id}/directories/bulk-create/ */ static async bulkCreateDirectories( targetId: number, urls: string[] ): Promise { const response = await api.post( `/targets/${targetId}/directories/bulk-create/`, { urls } ) return response.data } /** Export all directory URLs by target (text file, one per line) */ static async exportDirectoriesByTargetId(targetId: number): Promise { const response = await api.get(`/targets/${targetId}/directories/export/`, { responseType: "blob", }) return response.data } /** Export all directory URLs by scan task (text file, one per line) */ static async exportDirectoriesByScanId(scanId: number): Promise { const response = await api.get(`/scans/${scanId}/directories/export/`, { responseType: "blob", }) return response.data } } ================================================ FILE: frontend/services/disk.service.ts ================================================ import { api } from '@/lib/api-client' import type { DiskStats } from '@/types/disk.types' export async function getDiskStats(): Promise { const res = await api.get('/system/disk-stats/') return res.data } ================================================ FILE: frontend/services/endpoint.service.ts ================================================ import { api } from "@/lib/api-client" import type { Endpoint, CreateEndpointRequest, UpdateEndpointRequest, GetEndpointsRequest, GetEndpointsResponse, BatchDeleteEndpointsRequest, BatchDeleteEndpointsResponse } from "@/types/endpoint.types" import { USE_MOCK, mockDelay, getMockEndpoints, getMockEndpointById } from '@/mock' // Bulk create endpoints response type export interface BulkCreateEndpointsResponse { message: string createdCount: number } // Bulk delete response type export interface BulkDeleteResponse { deletedCount: number } export class EndpointService { /** * Bulk delete endpoints * POST /api/assets/endpoints/bulk-delete/ */ static async bulkDelete(ids: number[]): Promise { const response = await api.post( `/assets/endpoints/bulk-delete/`, { ids } ) return response.data } /** * Bulk create endpoints (bind to target) * POST /api/targets/{target_id}/endpoints/bulk-create/ */ static async bulkCreateEndpoints( targetId: number, urls: string[] ): Promise { const response = await api.post( `/targets/${targetId}/endpoints/bulk-create/`, { urls } ) return response.data } /** * Get single Endpoint details * @param id - Endpoint ID * @returns Promise */ static async getEndpointById(id: number): Promise { if (USE_MOCK) { await mockDelay() const endpoint = getMockEndpointById(id) if (!endpoint) throw new Error('Endpoint not found') return endpoint } const response = await api.get(`/endpoints/${id}/`) return response.data } /** * Get Endpoint list * @param params - Query parameters * @returns Promise */ static async getEndpoints(params: GetEndpointsRequest): Promise { if (USE_MOCK) { await mockDelay() return getMockEndpoints(params) } // api-client.ts automatically converts camelCase params to snake_case const response = await api.get('/endpoints/', { params }) return response.data } /** * Get Endpoint list by target ID (dedicated route) * @param targetId - Target ID * @param params - Other query parameters * @param filter - Smart filter query string * @returns Promise */ static async getEndpointsByTargetId(targetId: number, params: GetEndpointsRequest, filter?: string): Promise { // api-client.ts automatically converts camelCase params to snake_case const response = await api.get(`/targets/${targetId}/endpoints/`, { params: { ...params, filter } }) return response.data } /** * Get Endpoint list by scan ID (historical snapshot) * @param scanId - Scan task ID * @param params - Pagination and other query parameters * @param filter - Smart filter query string */ static async getEndpointsByScanId( scanId: number, params: GetEndpointsRequest, filter?: string, ): Promise { const response = await api.get(`/scans/${scanId}/endpoints/`, { params: { ...params, filter }, }) return response.data } /** * Batch create Endpoints * @param data - Create request object * @param data.endpoints - Endpoint data array * @returns Promise */ static async createEndpoints(data: { endpoints: Array }): Promise { // api-client.ts automatically converts camelCase request body to snake_case const response = await api.post('/endpoints/create/', data) return response.data } /** * Delete Endpoint * @param id - Endpoint ID * @returns Promise */ static async deleteEndpoint(id: number): Promise { await api.delete(`/endpoints/${id}/`) } /** * Batch delete Endpoints * @param data - Batch delete request object * @param data.endpointIds - Endpoint ID list * @returns Promise */ static async batchDeleteEndpoints(data: BatchDeleteEndpointsRequest): Promise { // api-client.ts automatically converts camelCase request body to snake_case const response = await api.post('/endpoints/batch-delete/', data) return response.data } /** Export all endpoint URLs by target (text file, one per line) */ static async exportEndpointsByTargetId(targetId: number): Promise { const response = await api.get(`/targets/${targetId}/endpoints/export/`, { responseType: 'blob', }) return response.data } /** Export all endpoint URLs by scan task (text file, one per line) */ static async exportEndpointsByScanId(scanId: number): Promise { const response = await api.get(`/scans/${scanId}/endpoints/export/`, { responseType: 'blob', }) return response.data } } ================================================ FILE: frontend/services/engine.service.ts ================================================ import apiClient from '@/lib/api-client' import type { ScanEngine } from '@/types/engine.types' import { USE_MOCK, mockDelay, getMockEngines, getMockEngineById } from '@/mock' /** * Engine API service */ /** * Get engine list */ export async function getEngines(): Promise { if (USE_MOCK) { await mockDelay() return getMockEngines() } // Engines are usually not many, get all const response = await apiClient.get('/engines/', { params: { pageSize: 1000 } }) // Backend returns paginated data: { results: [...], total, page, pageSize, totalPages } return response.data.results || response.data } /** * Get engine details */ export async function getEngine(id: number): Promise { if (USE_MOCK) { await mockDelay() const engine = getMockEngineById(id) if (!engine) throw new Error('Engine not found') return engine } const response = await apiClient.get(`/engines/${id}/`) return response.data } /** * Create engine */ export async function createEngine(data: { name: string configuration: string }): Promise { const response = await apiClient.post('/engines/', data) return response.data } /** * Update engine */ export async function updateEngine( id: number, data: Partial<{ name: string configuration: string }> ): Promise { const response = await apiClient.patch(`/engines/${id}/`, data) return response.data } /** * Delete engine */ export async function deleteEngine(id: number): Promise { await apiClient.delete(`/engines/${id}/`) } ================================================ FILE: frontend/services/fingerprint.service.ts ================================================ /** * Fingerprint management API service */ import apiClient from "@/lib/api-client" import type { PaginatedResponse } from "@/types/api-response.types" import type { EholeFingerprint, GobyFingerprint, WappalyzerFingerprint, FingersFingerprint, FingerPrintHubFingerprint, ARLFingerprint, BatchCreateResponse, BulkDeleteResponse, FingerprintStats } from "@/types/fingerprint.types" // Paginated query parameters interface QueryParams { page?: number pageSize?: number filter?: string } export const FingerprintService = { // ==================== EHole ==================== /** * Get EHole fingerprint list */ async getEholeFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/ehole/", { params }) return response.data }, /** * Get EHole fingerprint details */ async getEholeFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/ehole/${id}/`) return response.data }, /** * Create single EHole fingerprint */ async createEholeFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/ehole/", data) return response.data }, /** * Update EHole fingerprint */ async updateEholeFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/ehole/${id}/`, data) return response.data }, /** * Delete single EHole fingerprint */ async deleteEholeFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/ehole/${id}/`) }, /** * Batch create EHole fingerprints */ async batchCreateEholeFingerprints(fingerprints: Omit[]): Promise { const response = await apiClient.post("/fingerprints/ehole/batch_create/", { fingerprints }) return response.data }, /** * File import EHole fingerprints */ async importEholeFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/ehole/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * Bulk delete EHole fingerprints */ async bulkDeleteEholeFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/ehole/bulk-delete/", { ids }) return response.data }, /** * Delete all EHole fingerprints */ async deleteAllEholeFingerprints(): Promise { const response = await apiClient.post("/fingerprints/ehole/delete-all/") return response.data }, /** * Export EHole fingerprints */ async exportEholeFingerprints(): Promise { const response = await apiClient.get("/fingerprints/ehole/export/", { responseType: "blob" }) return response.data }, /** * Get EHole fingerprint count */ async getEholeCount(): Promise { const response = await apiClient.get("/fingerprints/ehole/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== Goby ==================== /** * Get Goby fingerprint list */ async getGobyFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/goby/", { params }) return response.data }, /** * 获取 Goby 指纹详情 */ async getGobyFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/goby/${id}/`) return response.data }, /** * 创建单条 Goby 指纹 */ async createGobyFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/goby/", data) return response.data }, /** * 更新 Goby 指纹 */ async updateGobyFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/goby/${id}/`, data) return response.data }, /** * 删除单条 Goby 指纹 */ async deleteGobyFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/goby/${id}/`) }, /** * 文件导入 Goby 指纹 */ async importGobyFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/goby/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * 批量删除 Goby 指纹 */ async bulkDeleteGobyFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/goby/bulk-delete/", { ids }) return response.data }, /** * 删除所有 Goby 指纹 */ async deleteAllGobyFingerprints(): Promise { const response = await apiClient.post("/fingerprints/goby/delete-all/") return response.data }, /** * 导出 Goby 指纹 */ async exportGobyFingerprints(): Promise { const response = await apiClient.get("/fingerprints/goby/export/", { responseType: "blob" }) return response.data }, /** * 获取 Goby 指纹数量 */ async getGobyCount(): Promise { const response = await apiClient.get("/fingerprints/goby/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== Wappalyzer ==================== /** * 获取 Wappalyzer 指纹列表 */ async getWappalyzerFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/wappalyzer/", { params }) return response.data }, /** * 获取 Wappalyzer 指纹详情 */ async getWappalyzerFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/wappalyzer/${id}/`) return response.data }, /** * 创建单条 Wappalyzer 指纹 */ async createWappalyzerFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/wappalyzer/", data) return response.data }, /** * 更新 Wappalyzer 指纹 */ async updateWappalyzerFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/wappalyzer/${id}/`, data) return response.data }, /** * 删除单条 Wappalyzer 指纹 */ async deleteWappalyzerFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/wappalyzer/${id}/`) }, /** * 文件导入 Wappalyzer 指纹 */ async importWappalyzerFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/wappalyzer/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * 批量删除 Wappalyzer 指纹 */ async bulkDeleteWappalyzerFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/wappalyzer/bulk-delete/", { ids }) return response.data }, /** * 删除所有 Wappalyzer 指纹 */ async deleteAllWappalyzerFingerprints(): Promise { const response = await apiClient.post("/fingerprints/wappalyzer/delete-all/") return response.data }, /** * 导出 Wappalyzer 指纹 */ async exportWappalyzerFingerprints(): Promise { const response = await apiClient.get("/fingerprints/wappalyzer/export/", { responseType: "blob" }) return response.data }, /** * 获取 Wappalyzer 指纹数量 */ async getWappalyzerCount(): Promise { const response = await apiClient.get("/fingerprints/wappalyzer/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== Fingers ==================== /** * 获取 Fingers 指纹列表 */ async getFingersFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/fingers/", { params }) return response.data }, /** * 获取 Fingers 指纹详情 */ async getFingersFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/fingers/${id}/`) return response.data }, /** * 创建单条 Fingers 指纹 */ async createFingersFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/fingers/", data) return response.data }, /** * 更新 Fingers 指纹 */ async updateFingersFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/fingers/${id}/`, data) return response.data }, /** * 删除单条 Fingers 指纹 */ async deleteFingersFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/fingers/${id}/`) }, /** * 文件导入 Fingers 指纹 */ async importFingersFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/fingers/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * 批量删除 Fingers 指纹 */ async bulkDeleteFingersFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/fingers/bulk-delete/", { ids }) return response.data }, /** * 删除所有 Fingers 指纹 */ async deleteAllFingersFingerprints(): Promise { const response = await apiClient.post("/fingerprints/fingers/delete-all/") return response.data }, /** * 导出 Fingers 指纹 */ async exportFingersFingerprints(): Promise { const response = await apiClient.get("/fingerprints/fingers/export/", { responseType: "blob" }) return response.data }, /** * 获取 Fingers 指纹数量 */ async getFingersCount(): Promise { const response = await apiClient.get("/fingerprints/fingers/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== FingerPrintHub ==================== /** * 获取 FingerPrintHub 指纹列表 */ async getFingerPrintHubFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/fingerprinthub/", { params }) return response.data }, /** * 获取 FingerPrintHub 指纹详情 */ async getFingerPrintHubFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/fingerprinthub/${id}/`) return response.data }, /** * 创建单条 FingerPrintHub 指纹 */ async createFingerPrintHubFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/fingerprinthub/", data) return response.data }, /** * 更新 FingerPrintHub 指纹 */ async updateFingerPrintHubFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/fingerprinthub/${id}/`, data) return response.data }, /** * 删除单条 FingerPrintHub 指纹 */ async deleteFingerPrintHubFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/fingerprinthub/${id}/`) }, /** * 文件导入 FingerPrintHub 指纹 */ async importFingerPrintHubFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/fingerprinthub/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * 批量删除 FingerPrintHub 指纹 */ async bulkDeleteFingerPrintHubFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/fingerprinthub/bulk-delete/", { ids }) return response.data }, /** * 删除所有 FingerPrintHub 指纹 */ async deleteAllFingerPrintHubFingerprints(): Promise { const response = await apiClient.post("/fingerprints/fingerprinthub/delete-all/") return response.data }, /** * 导出 FingerPrintHub 指纹 */ async exportFingerPrintHubFingerprints(): Promise { const response = await apiClient.get("/fingerprints/fingerprinthub/export/", { responseType: "blob" }) return response.data }, /** * 获取 FingerPrintHub 指纹数量 */ async getFingerPrintHubCount(): Promise { const response = await apiClient.get("/fingerprints/fingerprinthub/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== ARL ==================== /** * 获取 ARL 指纹列表 */ async getARLFingerprints(params: QueryParams = {}): Promise> { const response = await apiClient.get("/fingerprints/arl/", { params }) return response.data }, /** * 获取 ARL 指纹详情 */ async getARLFingerprint(id: number): Promise { const response = await apiClient.get(`/fingerprints/arl/${id}/`) return response.data }, /** * 创建单条 ARL 指纹 */ async createARLFingerprint(data: Omit): Promise { const response = await apiClient.post("/fingerprints/arl/", data) return response.data }, /** * 更新 ARL 指纹 */ async updateARLFingerprint(id: number, data: Partial): Promise { const response = await apiClient.put(`/fingerprints/arl/${id}/`, data) return response.data }, /** * 删除单条 ARL 指纹 */ async deleteARLFingerprint(id: number): Promise { await apiClient.delete(`/fingerprints/arl/${id}/`) }, /** * 文件导入 ARL 指纹(支持 YAML 和 JSON) */ async importARLFingerprints(file: File): Promise { const formData = new FormData() formData.append("file", file) const response = await apiClient.post("/fingerprints/arl/import_file/", formData, { headers: { "Content-Type": "multipart/form-data" } }) return response.data }, /** * 批量删除 ARL 指纹 */ async bulkDeleteARLFingerprints(ids: number[]): Promise { const response = await apiClient.post("/fingerprints/arl/bulk-delete/", { ids }) return response.data }, /** * 删除所有 ARL 指纹 */ async deleteAllARLFingerprints(): Promise { const response = await apiClient.post("/fingerprints/arl/delete-all/") return response.data }, /** * 导出 ARL 指纹(YAML 格式) */ async exportARLFingerprints(): Promise { const response = await apiClient.get("/fingerprints/arl/export/", { responseType: "blob" }) return response.data }, /** * 获取 ARL 指纹数量 */ async getARLCount(): Promise { const response = await apiClient.get("/fingerprints/arl/", { params: { pageSize: 1 } }) return response.data.total || 0 }, // ==================== 统计 ==================== /** * 获取所有指纹库统计 */ async getStats(): Promise { // 并行获取各指纹库数量 const [eholeCount, gobyCount, wappalyzerCount, fingersCount, fingerprinthubCount, arlCount] = await Promise.all([ this.getEholeCount(), this.getGobyCount(), this.getWappalyzerCount(), this.getFingersCount(), this.getFingerPrintHubCount(), this.getARLCount(), ]) return { ehole: eholeCount, goby: gobyCount, wappalyzer: wappalyzerCount, fingers: fingersCount, fingerprinthub: fingerprinthubCount, arl: arlCount, } }, } ================================================ FILE: frontend/services/global-blacklist.service.ts ================================================ import { api } from '@/lib/api-client' import { USE_MOCK, mockDelay, getMockGlobalBlacklist, updateMockGlobalBlacklist } from '@/mock' export interface GlobalBlacklistResponse { patterns: string[] } export interface UpdateGlobalBlacklistRequest { patterns: string[] } /** * Get global blacklist rules */ export async function getGlobalBlacklist(): Promise { if (USE_MOCK) { await mockDelay() return getMockGlobalBlacklist() } const res = await api.get('/blacklist/rules/') return res.data } /** * Update global blacklist rules (full replace) */ export async function updateGlobalBlacklist(data: UpdateGlobalBlacklistRequest): Promise { if (USE_MOCK) { await mockDelay() return updateMockGlobalBlacklist(data) } const res = await api.put('/blacklist/rules/', data) return res.data } ================================================ FILE: frontend/services/ip-address.service.ts ================================================ import { api } from "@/lib/api-client" import type { GetIPAddressesParams, GetIPAddressesResponse } from "@/types/ip-address.types" // Bulk delete response type export interface BulkDeleteResponse { deletedCount: number } export class IPAddressService { /** * Bulk delete IP addresses * POST /api/assets/ip-addresses/bulk-delete/ * Note: IP addresses are aggregated, so we pass IP strings instead of IDs */ static async bulkDelete(ips: string[]): Promise { const response = await api.post( `/assets/ip-addresses/bulk-delete/`, { ips } ) return response.data } static async getTargetIPAddresses( targetId: number, params?: GetIPAddressesParams ): Promise { const response = await api.get(`/targets/${targetId}/ip-addresses/`, { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, ...(params?.filter && { filter: params.filter }), }, }) return response.data } static async getScanIPAddresses( scanId: number, params?: GetIPAddressesParams ): Promise { const response = await api.get(`/scans/${scanId}/ip-addresses/`, { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, ...(params?.filter && { filter: params.filter }), }, }) return response.data } /** Export all IP addresses by target (text file, one per line) */ static async exportIPAddressesByTargetId(targetId: number): Promise { const response = await api.get(`/targets/${targetId}/ip-addresses/export/`, { responseType: 'blob', }) return response.data } /** Export all IP addresses by scan task (text file, one per line) */ static async exportIPAddressesByScanId(scanId: number): Promise { const response = await api.get(`/scans/${scanId}/ip-addresses/export/`, { responseType: 'blob', }) return response.data } } ================================================ FILE: frontend/services/notification-settings.service.ts ================================================ import { api } from '@/lib/api-client' import type { GetNotificationSettingsResponse, UpdateNotificationSettingsRequest, UpdateNotificationSettingsResponse, } from '@/types/notification-settings.types' export class NotificationSettingsService { static async getSettings(): Promise { const res = await api.get('/settings/notifications/') return res.data } static async updateSettings( data: UpdateNotificationSettingsRequest ): Promise { const res = await api.put('/settings/notifications/', data) return res.data } } ================================================ FILE: frontend/services/notification.service.ts ================================================ /** * Notification service * Handles all notification-related API requests */ import api from '@/lib/api-client' import type { Notification, GetNotificationsRequest, GetNotificationsResponse, } from '@/types/notification.types' import { USE_MOCK, mockDelay, getMockNotifications, getMockUnreadCount } from '@/mock' export class NotificationService { /** * Get notification list * 后端返回分页格式: { results, total, page, pageSize, totalPages } */ static async getNotifications( params: GetNotificationsRequest = {} ): Promise { if (USE_MOCK) { await mockDelay() return getMockNotifications(params) } const response = await api.get('/notifications/', { params, }) return response.data } /** * Mark all notifications as read * 后端返回: { updated: number } */ static async markAllAsRead(): Promise<{ updated: number }> { if (USE_MOCK) { await mockDelay() return { updated: 2 } } const response = await api.post<{ updated: number }>('/notifications/mark-all-as-read/') return response.data } /** * Get unread notification count * 后端返回: { count: number } */ static async getUnreadCount(): Promise<{ count: number }> { if (USE_MOCK) { await mockDelay() return getMockUnreadCount() } const response = await api.get<{ count: number }>('/notifications/unread-count/') return response.data } } ================================================ FILE: frontend/services/nuclei-git.service.ts ================================================ import { api } from "@/lib/api-client" import type { GetNucleiGitSettingsResponse, UpdateNucleiGitSettingsRequest, UpdateNucleiGitSettingsResponse, } from "@/types/nuclei-git.types" export class NucleiGitService { static async getSettings(): Promise { const res = await api.get("/settings/nuclei-templates-git/") return res.data } static async updateSettings( data: UpdateNucleiGitSettingsRequest ): Promise { const res = await api.put("/settings/nuclei-templates-git/", data) return res.data } } ================================================ FILE: frontend/services/nuclei-repo.api.ts ================================================ /** * Nuclei template repository API */ import { api } from "@/lib/api-client" const BASE_URL = "/nuclei/repos/" export interface NucleiRepoResponse { id: number name: string repoUrl: string localPath: string commitHash: string | null lastSyncedAt: string | null createdAt: string updatedAt: string } export interface CreateRepoPayload { name: string repoUrl: string } export interface UpdateRepoPayload { repoUrl?: string } export interface TemplateTreeResponse { roots: Array<{ type: "folder" | "file" name: string path: string children?: Array<{ type: "folder" | "file" name: string path: string children?: unknown[] }> }> } export interface TemplateContentResponse { path: string name: string content: string } /** Paginated response format */ interface PaginatedResponse { results: T[] total: number page: number pageSize: number totalPages: number } export const nucleiRepoApi = { /** Get repository list */ listRepos: async (): Promise => { // Repositories are usually not many, get all const response = await api.get>(BASE_URL, { params: { pageSize: 1000 } }) // Backend returns paginated format, take results array return response.data.results }, /** Get single repository */ getRepo: async (repoId: number): Promise => { const response = await api.get(`${BASE_URL}${repoId}/`) return response.data }, /** Create repository */ createRepo: async (payload: CreateRepoPayload): Promise => { const response = await api.post(BASE_URL, payload) return response.data }, /** Update repository (partial update) */ updateRepo: async (repoId: number, payload: UpdateRepoPayload): Promise => { const response = await api.patch(`${BASE_URL}${repoId}/`, payload) return response.data }, /** Delete repository */ deleteRepo: async (repoId: number): Promise => { await api.delete(`${BASE_URL}${repoId}/`) }, /** Refresh repository (Git clone/pull) */ refreshRepo: async (repoId: number): Promise<{ message: string; result: unknown }> => { const response = await api.post<{ message: string; result: unknown }>( `${BASE_URL}${repoId}/refresh/` ) return response.data }, /** Get template directory tree */ getTemplateTree: async (repoId: number): Promise => { const response = await api.get( `${BASE_URL}${repoId}/templates/tree/` ) return response.data }, /** Get template content */ getTemplateContent: async (repoId: number, path: string): Promise => { const response = await api.get( `${BASE_URL}${repoId}/templates/content/`, { params: { path } } ) return response.data }, } ================================================ FILE: frontend/services/nuclei.service.ts ================================================ import { api } from "@/lib/api-client" import type { NucleiTemplateTreeNode, NucleiTemplateContent, NucleiTemplateTreeResponse, UploadNucleiTemplatePayload, SaveNucleiTemplatePayload, } from "@/types/nuclei.types" export async function getNucleiTemplateTree(): Promise { const response = await api.get("/nuclei/templates/tree/") return response.data.roots || [] } export async function getNucleiTemplateContent(path: string): Promise { const response = await api.get("/nuclei/templates/content/", { params: { path }, }) return response.data } export async function refreshNucleiTemplates(): Promise { await api.post("/nuclei/templates/refresh/") } export async function saveNucleiTemplate(payload: SaveNucleiTemplatePayload): Promise { await api.post("/nuclei/templates/save/", payload) } export async function uploadNucleiTemplate(payload: UploadNucleiTemplatePayload): Promise { const formData = new FormData() formData.append("scope", payload.scope) formData.append("file", payload.file) await api.post("/nuclei/templates/upload/", formData, { headers: { "Content-Type": undefined, }, }) } ================================================ FILE: frontend/services/organization.service.ts ================================================ import { api } from "@/lib/api-client" import type { Organization, OrganizationsResponse } from "@/types/organization.types" import { USE_MOCK, mockDelay, getMockOrganizations, mockOrganizations } from '@/mock' export class OrganizationService { // ========== Organization basic operations ========== /** * Get organization list * @param params - Query parameter object * @param params.page - Current page number, 1-based * @param params.pageSize - Page size * @returns Promise> * @description Backend is fixed to sort by update time in descending order, does not support custom sorting */ static async getOrganizations(params?: { page?: number pageSize?: number search?: string }): Promise> { if (USE_MOCK) { await mockDelay() return getMockOrganizations(params) } const response = await api.get>( '/organizations/', { params } ) return response.data } /** * Get single organization details * @param id - Organization ID * @returns Promise */ static async getOrganizationById(id: string | number): Promise { if (USE_MOCK) { await mockDelay() const org = mockOrganizations.find(o => o.id === Number(id)) if (!org) throw new Error('Organization not found') return org } const response = await api.get(`/organizations/${id}/`) return response.data } /** * Get organization's target list * @param id - Organization ID * @param params - Query parameters * @returns Promise */ static async getOrganizationTargets(id: string | number, params?: { page?: number pageSize?: number search?: string }): Promise { const response = await api.get( `/organizations/${id}/targets/`, { params } ) return response.data } /** * Create new organization * @param data - Organization information object * @param data.name - Organization name * @param data.description - Organization description * @returns Promise - Organization information object after successful creation */ static async createOrganization(data: { name: string description: string }): Promise { const response = await api.post('/organizations/', data) return response.data } /** * Update organization information * @param data - Organization information object * @param data.id - Organization ID, number or string type * @param data.name - Organization name * @param data.description - Organization description * @returns Promise - Organization information object after successful update */ static async updateOrganization(data: { id: string | number name: string description: string }): Promise { const response = await api.put(`/organizations/${data.id}/`, { name: data.name, description: data.description }) return response.data } /** * Delete organization (using separate DELETE API) * * @param id - Organization ID, number type * @returns Promise */ static async deleteOrganization(id: number): Promise<{ message: string organizationId: number organizationName: string deletedCount: number deletedOrganizations: string[] detail: { phase1: string phase2: string } }> { const response = await api.delete<{ message: string organizationId: number organizationName: string deletedCount: number deletedOrganizations: string[] detail: { phase1: string phase2: string } }>(`/organizations/${id}/`) return response.data } /** * Batch delete organizations * @param organizationIds - Array of organization IDs, number type * @returns Promise<{ message: string; deletedOrganizationCount: number }> * * Note: Deleting organizations will not delete domain entities, only unlink associations */ static async batchDeleteOrganizations(organizationIds: number[]): Promise<{ message: string deletedCount: number deletedOrganizations: string[] }> { const response = await api.post<{ message: string deletedCount: number deletedOrganizations: string[] }>('/organizations/bulk-delete/', { ids: organizationIds // Backend expects 'ids' parameter }) return response.data } // ========== Organization and target association operations ========== /** * Link target to organization (single) * @param data - Link request object * @param data.organizationId - Organization ID * @param data.targetId - Target ID * @returns Promise<{ message: string }> */ static async linkTargetToOrganization(data: { organizationId: number targetId: number }): Promise<{ message: string }> { const response = await api.post<{ message: string }>( `/organizations/${data.organizationId}/targets/`, { targetId: data.targetId // Interceptor will convert to target_id } ) return response.data } /** * Remove targets from organization (batch) * @param data - Remove request object * @param data.organizationId - Organization ID * @param data.targetIds - Array of target IDs * @returns Promise<{ unlinkedCount: number; message: string }> */ static async unlinkTargetsFromOrganization(data: { organizationId: number targetIds: number[] }): Promise<{ unlinkedCount: number; message: string }> { const response = await api.post<{ unlinkedCount: number; message: string }>( `/organizations/${data.organizationId}/unlink_targets/`, { targetIds: data.targetIds // Interceptor will convert to target_ids } ) return response.data } } ================================================ FILE: frontend/services/scan.service.ts ================================================ import { api } from '@/lib/api-client' import type { GetScansParams, GetScansResponse, InitiateScanRequest, InitiateScanResponse, QuickScanRequest, QuickScanResponse, ScanRecord } from '@/types/scan.types' import { USE_MOCK, mockDelay, getMockScans, getMockScanById, mockScanStatistics } from '@/mock' /** * Get scan list */ export async function getScans(params?: GetScansParams): Promise { if (USE_MOCK) { await mockDelay() return getMockScans(params) } const res = await api.get('/scans/', { params }) return res.data } /** * Get single scan details * @param id - Scan ID * @returns Scan details */ export async function getScan(id: number): Promise { if (USE_MOCK) { await mockDelay() const scan = getMockScanById(id) if (!scan) throw new Error('Scan not found') return scan } const res = await api.get(`/scans/${id}/`) return res.data } /** * Initiate scan task (for existing targets/organizations) * @param data - Scan request parameters * @returns Scan task information */ export async function initiateScan(data: InitiateScanRequest): Promise { const res = await api.post('/scans/initiate/', data) return res.data } /** * Quick scan (automatically create target and scan immediately) * @param data - Quick scan request parameters * @returns Scan task information */ export async function quickScan(data: QuickScanRequest): Promise { const res = await api.post('/scans/quick/', data) return res.data } /** * Delete single scan record * @param id - Scan ID */ export async function deleteScan(id: number): Promise { await api.delete(`/scans/${id}/`) } /** * Bulk delete scan records * @param ids - Array of scan IDs * @returns Deletion result */ export async function bulkDeleteScans(ids: number[]): Promise<{ message: string; deletedCount: number }> { const res = await api.post<{ message: string; deletedCount: number }>('/scans/bulk-delete/', { ids }) return res.data } /** * Stop scan task * @param id - Scan ID * @returns Operation result */ export async function stopScan(id: number): Promise<{ message: string; revokedTaskCount: number }> { const res = await api.post<{ message: string; revokedTaskCount: number }>(`/scans/${id}/stop/`) return res.data } /** * Scan statistics data type */ export interface ScanStatistics { total: number running: number completed: number failed: number totalVulns: number totalSubdomains: number totalEndpoints: number totalWebsites: number totalAssets: number } /** * Get scan statistics data * @returns Statistics data */ export async function getScanStatistics(): Promise { if (USE_MOCK) { await mockDelay() return mockScanStatistics } const res = await api.get('/scans/statistics/') return res.data } /** * Scan log entry type */ export interface ScanLog { id: number level: 'info' | 'warning' | 'error' content: string createdAt: string } /** * Get scan logs response type */ export interface GetScanLogsResponse { results: ScanLog[] hasMore: boolean } /** * Get scan logs params type */ export interface GetScanLogsParams { afterId?: number limit?: number } /** * Get scan logs * @param scanId - Scan ID * @param params - Query parameters (afterId for cursor, limit for max results) * @returns Scan logs with hasMore indicator */ export async function getScanLogs(scanId: number, params?: GetScanLogsParams): Promise { const res = await api.get(`/scans/${scanId}/logs/`, { params }) return res.data } ================================================ FILE: frontend/services/scheduled-scan.service.ts ================================================ import { api } from '@/lib/api-client' import type { GetScheduledScansResponse, ScheduledScan, CreateScheduledScanRequest, UpdateScheduledScanRequest } from '@/types/scheduled-scan.types' import { USE_MOCK, mockDelay, getMockScheduledScans, getMockScheduledScanById } from '@/mock' /** * Get scheduled scan list */ export async function getScheduledScans(params?: { page?: number pageSize?: number search?: string targetId?: number organizationId?: number }): Promise { if (USE_MOCK) { await mockDelay() return getMockScheduledScans(params) } // Convert camelCase to snake_case for query params (djangorestframework-camel-case doesn't convert query params) const apiParams: Record = {} if (params?.page) apiParams.page = params.page if (params?.pageSize) apiParams.pageSize = params.pageSize if (params?.search) apiParams.search = params.search if (params?.targetId) apiParams.target_id = params.targetId if (params?.organizationId) apiParams.organization_id = params.organizationId const res = await api.get('/scheduled-scans/', { params: apiParams }) return res.data } /** * Get scheduled scan details */ export async function getScheduledScan(id: number): Promise { if (USE_MOCK) { await mockDelay() const scan = getMockScheduledScanById(id) if (!scan) throw new Error('Scheduled scan not found') return scan } const res = await api.get(`/scheduled-scans/${id}/`) return res.data } /** * Create scheduled scan */ export async function createScheduledScan(data: CreateScheduledScanRequest): Promise<{ message: string scheduledScan: ScheduledScan }> { const res = await api.post<{ message: string; scheduledScan: ScheduledScan }>('/scheduled-scans/', data) return res.data } /** * Update scheduled scan */ export async function updateScheduledScan(id: number, data: UpdateScheduledScanRequest): Promise<{ message: string scheduledScan: ScheduledScan }> { const res = await api.put<{ message: string; scheduledScan: ScheduledScan }>(`/scheduled-scans/${id}/`, data) return res.data } /** * Delete scheduled scan */ export async function deleteScheduledScan(id: number): Promise<{ message: string; id: number }> { const res = await api.delete<{ message: string; id: number }>(`/scheduled-scans/${id}/`) return res.data } /** * Toggle scheduled scan enabled status */ export async function toggleScheduledScan(id: number, isEnabled: boolean): Promise<{ message: string scheduledScan: ScheduledScan }> { const res = await api.post<{ message: string; scheduledScan: ScheduledScan }>( `/scheduled-scans/${id}/toggle/`, { isEnabled } ) return res.data } ================================================ FILE: frontend/services/screenshot.service.ts ================================================ import { api } from "@/lib/api-client" // Screenshot type export interface Screenshot { id: number url: string statusCode: number | null createdAt: string updatedAt: string } // Screenshot snapshot type (for scan results) export interface ScreenshotSnapshot { id: number url: string statusCode: number | null createdAt: string } // Paginated response export interface PaginatedResponse { results: T[] total: number page: number pageSize: number totalPages: number } // Bulk delete response export interface BulkDeleteResponse { deletedCount: number } /** * Screenshot related API service */ export class ScreenshotService { /** * Get screenshots by target * GET /api/targets/{target_id}/screenshots/ */ static async getByTarget( targetId: number, params?: { page?: number; pageSize?: number; filter?: string } ): Promise> { const response = await api.get>( `/targets/${targetId}/screenshots/`, { params } ) return response.data } /** * Get screenshot image URL * Returns the URL to fetch the image binary */ static getImageUrl(screenshotId: number): string { return `/api/assets/screenshots/${screenshotId}/image/` } /** * Get screenshot snapshots by scan * GET /api/scans/{scan_id}/screenshots/ */ static async getByScan( scanId: number, params?: { page?: number; pageSize?: number; filter?: string } ): Promise> { const response = await api.get>( `/scans/${scanId}/screenshots/`, { params } ) return response.data } /** * Get screenshot snapshot image URL */ static getSnapshotImageUrl(scanId: number, snapshotId: number): string { return `/api/scans/${scanId}/screenshots/${snapshotId}/image/` } /** * Bulk delete screenshots * POST /api/assets/screenshots/bulk-delete/ */ static async bulkDelete(ids: number[]): Promise { const response = await api.post( `/assets/screenshots/bulk-delete/`, { ids } ) return response.data } } ================================================ FILE: frontend/services/search.service.ts ================================================ import { api } from "@/lib/api-client" import type { SearchParams, SearchResponse, AssetType } from "@/types/search.types" /** * 资产搜索 API 服务 * * 搜索语法: * - field="value" 模糊匹配(ILIKE %value%) * - field=="value" 精确匹配 * - field!="value" 不等于 * - && AND 连接 * - || OR 连接 * * 支持的资产类型: * - website: 站点(默认) * - endpoint: 端点 * * 示例: * - host="api" && tech="nginx" * - tech="vue" || tech="react" * - status=="200" && host!="test" */ export class SearchService { /** * 搜索资产 * GET /api/assets/search/ */ static async search(params: SearchParams): Promise { const queryParams = new URLSearchParams() if (params.q) queryParams.append('q', params.q) if (params.asset_type) queryParams.append('asset_type', params.asset_type) if (params.page) queryParams.append('page', params.page.toString()) if (params.pageSize) queryParams.append('pageSize', params.pageSize.toString()) const response = await api.get( `/assets/search/?${queryParams.toString()}` ) return response.data } /** * 导出搜索结果为 CSV * GET /api/assets/search/export/ * * 使用浏览器原生下载,支持显示下载进度 */ static async exportCSV(query: string, assetType: AssetType): Promise { const queryParams = new URLSearchParams() queryParams.append('q', query) queryParams.append('asset_type', assetType) // 直接打开下载链接,使用浏览器原生下载管理器 // 这样可以显示下载进度,且不会阻塞页面 const downloadUrl = `/api/assets/search/export/?${queryParams.toString()}` window.open(downloadUrl, '_blank') } } ================================================ FILE: frontend/services/subdomain.service.ts ================================================ import { api } from "@/lib/api-client" import type { Subdomain, GetSubdomainsParams, GetSubdomainsResponse, GetAllSubdomainsParams, GetAllSubdomainsResponse, GetSubdomainByIDResponse, BatchCreateSubdomainsResponse } from "@/types/subdomain.types" import { USE_MOCK, mockDelay, getMockSubdomains, getMockSubdomainById } from '@/mock' // Bulk create subdomains response type export interface BulkCreateSubdomainsResponse { message: string createdCount: number skippedCount: number invalidCount: number mismatchedCount: number totalReceived: number } export class SubdomainService { /** * Bulk create subdomains (bind to target) * POST /api/targets/{target_id}/subdomains/bulk-create/ */ static async bulkCreateSubdomains( targetId: number, subdomains: string[] ): Promise { const response = await api.post( `/targets/${targetId}/subdomains/bulk-create/`, { subdomains } ) return response.data } // ========== Subdomain basic operations ========== /** * Bulk create subdomains (bind to assets) */ static async createSubdomains(data: { domains: Array<{ name: string }> assetId: number }): Promise { const response = await api.post('/domains/create/', { domains: data.domains, assetId: data.assetId // [OK] CamelCase, interceptor converts to asset_id }) return response.data } /** * Get single subdomain details */ static async getSubdomainById(id: string | number): Promise { if (USE_MOCK) { await mockDelay() const subdomain = getMockSubdomainById(Number(id)) if (!subdomain) throw new Error('Subdomain not found') return subdomain } const response = await api.get(`/domains/${id}/`) return response.data } /** * Update subdomain information (PATCH) */ static async updateSubdomain(data: { id: number name?: string description?: string }): Promise { const requestBody: any = {} if (data.name !== undefined) requestBody.name = data.name if (data.description !== undefined) requestBody.description = data.description const response = await api.patch(`/domains/${data.id}/`, requestBody) return response.data } /** Bulk delete subdomains (supports single or multiple, using unified interface) */ static async bulkDeleteSubdomains( ids: number[] ): Promise<{ message: string deletedCount: number requestedIds: number[] cascadeDeleted: Record }> { const response = await api.post<{ message: string deletedCount: number requestedIds: number[] cascadeDeleted: Record }>( `/assets/subdomains/bulk-delete/`, { ids } ) return response.data } /** Delete single subdomain (using separate DELETE API) */ static async deleteSubdomain(id: number): Promise<{ message: string subdomainId: number subdomainName: string deletedCount: number deletedSubdomains: string[] detail: { phase1: string phase2: string } }> { const response = await api.delete<{ message: string subdomainId: number subdomainName: string deletedCount: number deletedSubdomains: string[] detail: { phase1: string phase2: string } }>(`/assets/subdomains/${id}/`) return response.data } /** Bulk delete subdomains (alias, compatible with old code) */ static async batchDeleteSubdomains(ids: number[]): Promise<{ message: string deletedCount: number requestedIds: number[] cascadeDeleted: Record }> { return this.bulkDeleteSubdomains(ids) } /** Batch remove subdomains from organization */ static async batchDeleteSubdomainsFromOrganization(data: { organizationId: number domainIds: number[] }): Promise<{ message: string successCount: number failedCount: number }> { const response = await api.post( `/organizations/${data.organizationId}/domains/batch-remove/`, { domainIds: data.domainIds, // Interceptor converts to domain_ids } ) return response.data } /** Get organization's subdomain list (server-side pagination) */ static async getSubdomainsByOrgId( organizationId: number, params?: { page?: number pageSize?: number } ): Promise { const response = await api.get( `/organizations/${organizationId}/domains/`, { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, } } ) return response.data } /** Get all subdomains list (server-side pagination) */ static async getAllSubdomains(params?: GetAllSubdomainsParams): Promise { if (USE_MOCK) { await mockDelay() return getMockSubdomains(params) } const response = await api.get('/domains/', { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, } }) return response.data } /** Get target's subdomain list (supports pagination and filtering) */ static async getSubdomainsByTargetId( targetId: number, params?: { page?: number pageSize?: number filter?: string } ): Promise { const response = await api.get(`/targets/${targetId}/subdomains/`, { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, ...(params?.filter && { filter: params.filter }), } }) return response.data } /** Get scan's subdomain list (supports pagination and filtering) */ static async getSubdomainsByScanId( scanId: number, params?: { page?: number pageSize?: number filter?: string } ): Promise<{ results: Array<{ id: number name: string createdAt: string // Backend automatically converts to camelCase cname: string[] isCdn: boolean // Backend automatically converts to camelCase cdnName: string // Backend automatically converts to camelCase ports: Array<{ number: number serviceName: string description: string isUncommon: boolean }> ipAddresses: string[] // IP address list }> total: number page: number pageSize: number // Backend automatically converts to camelCase totalPages: number // Backend automatically converts to camelCase }> { const response = await api.get(`/scans/${scanId}/subdomains/`, { params: { page: params?.page || 1, pageSize: params?.pageSize || 10, ...(params?.filter && { filter: params.filter }), } }) return response.data as any } /** Export all subdomain names by target (text file, one per line) */ static async exportSubdomainsByTargetId(targetId: number): Promise { const response = await api.get(`/targets/${targetId}/subdomains/export/`, { responseType: 'blob', }) return response.data } /** Export all subdomain names by scan task (text file, one per line) */ static async exportSubdomainsByScanId(scanId: number): Promise { const response = await api.get(`/scans/${scanId}/subdomains/export/`, { responseType: 'blob', }) return response.data } } ================================================ FILE: frontend/services/system-log.service.ts ================================================ import apiClient from "@/lib/api-client" import type { SystemLogResponse, LogFilesResponse } from "@/types/system-log.types" const BASE_URL = "/system/logs" export const systemLogService = { /** * 获取日志文件列表 */ async getLogFiles(): Promise { const response = await apiClient.get(`${BASE_URL}/files/`) return response.data }, /** * 获取日志内容 */ async getSystemLogs(params?: { file?: string; lines?: number }): Promise { const searchParams = new URLSearchParams() if (params?.file != null) { searchParams.set("file", params.file) } if (params?.lines != null) { searchParams.set("lines", String(params.lines)) } const query = searchParams.toString() const url = query ? `${BASE_URL}/?${query}` : `${BASE_URL}/` const response = await apiClient.get(url) return response.data }, } ================================================ FILE: frontend/services/target.service.ts ================================================ /** * Target Service - Target management API */ import { api } from '@/lib/api-client' import type { Target, TargetsResponse, CreateTargetRequest, UpdateTargetRequest, BatchDeleteTargetsRequest, BatchDeleteTargetsResponse, BatchCreateTargetsRequest, BatchCreateTargetsResponse, } from '@/types/target.types' import { USE_MOCK, mockDelay, getMockTargets, getMockTargetById, getMockTargetBlacklist, updateMockTargetBlacklist } from '@/mock' /** * Get all targets list (paginated) */ export async function getTargets(page = 1, pageSize = 10, search?: string): Promise { if (USE_MOCK) { await mockDelay() return getMockTargets({ page, pageSize, search }) } const response = await api.get('/targets/', { params: { page, pageSize, ...(search && { search }), }, }) return response.data } /** * Get single target details */ export async function getTargetById(id: number): Promise { if (USE_MOCK) { await mockDelay() const target = getMockTargetById(id) if (!target) throw new Error('Target not found') return target } const response = await api.get(`/targets/${id}/`) return response.data } /** * Create target */ export async function createTarget(data: CreateTargetRequest): Promise { const response = await api.post('/targets/', data) return response.data } /** * Update target */ export async function updateTarget(id: number, data: UpdateTargetRequest): Promise { const response = await api.patch(`/targets/${id}/`, data) return response.data } /** * Delete single target (using separate DELETE API) */ export async function deleteTarget(id: number): Promise<{ message: string targetId: number targetName: string deletedCount: number deletedTargets: string[] detail: { phase1: string phase2: string } }> { const response = await api.delete<{ message: string targetId: number targetName: string deletedCount: number deletedTargets: string[] detail: { phase1: string phase2: string } }>(`/targets/${id}/`) return response.data } /** * Batch delete targets */ export async function batchDeleteTargets( data: BatchDeleteTargetsRequest ): Promise { const response = await api.post('/targets/bulk-delete/', data) return response.data } /** * Batch create targets */ export async function batchCreateTargets( data: BatchCreateTargetsRequest ): Promise { const response = await api.post('/targets/batch_create/', data) return response.data } /** * Get target's organization list */ export async function getTargetOrganizations(id: number, page = 1, pageSize = 10) { const response = await api.get(`/targets/${id}/organizations/`, { params: { page, pageSize } }) return response.data } /** * Link organizations to target */ export async function linkTargetOrganizations( id: number, organizationIds: number[] ): Promise<{ message: string }> { const response = await api.post<{ message: string }>(`/targets/${id}/organizations/`, { organizationIds }) return response.data } /** * Unlink target from organizations */ export async function unlinkTargetOrganizations( id: number, organizationIds: number[] ): Promise<{ message: string }> { const response = await api.post<{ message: string }>(`/targets/${id}/organizations/unlink/`, { organizationIds }) return response.data } /** * Get target's endpoint list */ export async function getTargetEndpoints( id: number, page = 1, pageSize = 10, filter?: string ): Promise { const response = await api.get(`/targets/${id}/endpoints/`, { params: { page, pageSize, ...(filter && { filter }), }, }) return response.data } /** * Get target's blacklist rules */ export async function getTargetBlacklist(id: number): Promise<{ patterns: string[] }> { if (USE_MOCK) { await mockDelay() return getMockTargetBlacklist(id) } const response = await api.get<{ patterns: string[] }>(`/targets/${id}/blacklist/`) return response.data } /** * Update target's blacklist rules (full replace) */ export async function updateTargetBlacklist( id: number, patterns: string[] ): Promise<{ count: number }> { if (USE_MOCK) { await mockDelay() const result = updateMockTargetBlacklist(id, { patterns }) return { count: result.patterns.length } } const response = await api.put<{ count: number }>(`/targets/${id}/blacklist/`, { patterns }) return response.data } ================================================ FILE: frontend/services/tool.service.ts ================================================ import { api } from "@/lib/api-client" import type { Tool, GetToolsResponse, CreateToolRequest, UpdateToolRequest, GetToolsParams } from "@/types/tool.types" export class ToolService { /** * Get tool list * @param params - Query parameter object * @param params.page - Current page number, 1-based * @param params.pageSize - Page size * @returns Promise * @description Backend is fixed to sort by update time in descending order, does not support custom sorting */ static async getTools(params?: GetToolsParams): Promise { const response = await api.get( '/tools/', { params } ) return response.data } /** * Create new tool * @param data - Tool information object * @param data.name - Tool name * @param data.repoUrl - Repository URL * @param data.version - Version number * @param data.description - Tool description * @returns Promise<{ tool: Tool }> */ static async createTool(data: CreateToolRequest): Promise<{ tool: Tool }> { const response = await api.post<{ tool: Tool }>('/tools/create/', data) return response.data } /** * Update tool * @param id - Tool ID * @param data - Updated tool information (all fields optional) * @returns Promise<{ tool: Tool }> */ static async updateTool(id: number, data: UpdateToolRequest): Promise<{ tool: Tool }> { const response = await api.put<{ tool: Tool }>(`/tools/${id}/`, data) return response.data } /** * Delete tool * @param id - Tool ID * @returns Promise */ static async deleteTool(id: number): Promise { await api.delete(`/tools/${id}/`) } } ================================================ FILE: frontend/services/version.service.ts ================================================ import { api } from '@/lib/api-client' import type { VersionInfo, UpdateCheckResult } from '@/types/version.types' export class VersionService { static async getVersion(): Promise { const res = await api.get('/system/version/') return res.data } static async checkUpdate(): Promise { const res = await api.get('/system/check-update/') return res.data } } ================================================ FILE: frontend/services/vulnerability.service.ts ================================================ import { api } from "@/lib/api-client" import type { GetVulnerabilitiesParams, Vulnerability } from "@/types/vulnerability.types" import { USE_MOCK, mockDelay, getMockVulnerabilities } from '@/mock' export class VulnerabilityService { /** Get all vulnerabilities list (used by global vulnerabilities page) */ static async getAllVulnerabilities( params: GetVulnerabilitiesParams, filter?: string, ): Promise { if (USE_MOCK) { await mockDelay() return getMockVulnerabilities(params) } const response = await api.get(`/assets/vulnerabilities/`, { params: { ...params, filter }, }) return response.data } /** Get single vulnerability by ID */ static async getVulnerabilityById(id: number): Promise { const response = await api.get(`/assets/vulnerabilities/${id}/`) return response.data } /** Get vulnerability snapshot list by scan task (used by scan history page) */ static async getVulnerabilitiesByScanId( scanId: number, params: GetVulnerabilitiesParams, filter?: string, ): Promise { const response = await api.get(`/scans/${scanId}/vulnerabilities/`, { params: { ...params, filter }, }) return response.data } /** Get vulnerability asset list by target (used by target details page) */ static async getVulnerabilitiesByTargetId( targetId: number, params: GetVulnerabilitiesParams, filter?: string, ): Promise { const response = await api.get(`/targets/${targetId}/vulnerabilities/`, { params: { ...params, filter }, }) return response.data } } ================================================ FILE: frontend/services/website.service.ts ================================================ import { api } from "@/lib/api-client" // Bulk create websites response type export interface BulkCreateWebsitesResponse { message: string createdCount: number } // Bulk delete response type export interface BulkDeleteResponse { deletedCount: number } /** * Website related API service * All frontend website interface calls should be centralized here */ export class WebsiteService { /** * Bulk delete websites * POST /api/assets/websites/bulk-delete/ */ static async bulkDelete(ids: number[]): Promise { const response = await api.post( `/assets/websites/bulk-delete/`, { ids } ) return response.data } /** * Bulk create websites (bind to target) * POST /api/targets/{target_id}/websites/bulk-create/ */ static async bulkCreateWebsites( targetId: number, urls: string[] ): Promise { const response = await api.post( `/targets/${targetId}/websites/bulk-create/`, { urls } ) return response.data } /** Export all website URLs by target (text file, one per line) */ static async exportWebsitesByTargetId(targetId: number): Promise { const response = await api.get(`/targets/${targetId}/websites/export/`, { responseType: "blob", }) return response.data } /** Export all website URLs by scan task (text file, one per line) */ static async exportWebsitesByScanId(scanId: number): Promise { const response = await api.get(`/scans/${scanId}/websites/export/`, { responseType: "blob", }) return response.data } } ================================================ FILE: frontend/services/wordlist.service.ts ================================================ import apiClient from "@/lib/api-client" import type { GetWordlistsResponse, Wordlist } from "@/types/wordlist.types" // Dictionary (Wordlist) API service // Get wordlist list export async function getWordlists(page = 1, pageSize = 10): Promise { const response = await apiClient.get("/wordlists/", { params: { page, pageSize, }, }) return response.data } // Upload wordlist file export async function uploadWordlist(payload: { name: string description?: string file: File }): Promise { const formData = new FormData() formData.append("name", payload.name) if (payload.description) { formData.append("description", payload.description) } formData.append("file", payload.file) const response = await apiClient.post("/wordlists/", formData, { headers: { "Content-Type": "multipart/form-data", }, }) return response.data } // Delete wordlist export async function deleteWordlist(id: number): Promise { await apiClient.delete(`/wordlists/${id}/`) } // Get wordlist content export async function getWordlistContent(id: number): Promise { const response = await apiClient.get<{ content: string }>(`/wordlists/${id}/content/`) return response.data.content } // Update wordlist content export async function updateWordlistContent(id: number, content: string): Promise { const response = await apiClient.put(`/wordlists/${id}/content/`, { content }) return response.data } ================================================ FILE: frontend/services/worker.service.ts ================================================ /** * Worker node management API service */ import apiClient from '@/lib/api-client' import type { WorkerNode, WorkersResponse, CreateWorkerRequest, UpdateWorkerRequest, } from '@/types/worker.types' import { USE_MOCK, mockDelay, getMockWorkers, getMockWorkerById } from '@/mock' const BASE_URL = '/workers' export const workerService = { /** * Get Worker list */ async getWorkers(page = 1, pageSize = 10): Promise { if (USE_MOCK) { await mockDelay() return getMockWorkers(page, pageSize) } const response = await apiClient.get( `${BASE_URL}/?page=${page}&page_size=${pageSize}` ) return response.data }, /** * Get single Worker details */ async getWorker(id: number): Promise { if (USE_MOCK) { await mockDelay() const worker = getMockWorkerById(id) if (!worker) throw new Error('Worker not found') return worker } const response = await apiClient.get(`${BASE_URL}/${id}/`) return response.data }, /** * Create Worker node */ async createWorker(data: CreateWorkerRequest): Promise { const response = await apiClient.post(`${BASE_URL}/`, { name: data.name, ip_address: data.ipAddress, ssh_port: data.sshPort ?? 22, username: data.username ?? 'root', password: data.password, }) return response.data }, /** * Update Worker node */ async updateWorker(id: number, data: UpdateWorkerRequest): Promise { const response = await apiClient.patch(`${BASE_URL}/${id}/`, { name: data.name, ssh_port: data.sshPort, username: data.username, password: data.password, }) return response.data }, /** * Delete Worker node */ async deleteWorker(id: number): Promise { await apiClient.delete(`${BASE_URL}/${id}/`) }, /** * Deploy Worker node (placeholder implementation, currently only used to eliminate frontend type errors) */ async deployWorker(id: number): Promise { return Promise.reject(new Error(`Worker deploy is not implemented for id=${id}`)) }, /** * Restart Worker */ async restartWorker(id: number): Promise<{ message: string }> { const response = await apiClient.post<{ message: string }>(`${BASE_URL}/${id}/restart/`) return response.data }, /** * Stop Worker */ async stopWorker(id: number): Promise<{ message: string }> { const response = await apiClient.post<{ message: string }>(`${BASE_URL}/${id}/stop/`) return response.data }, } ================================================ FILE: frontend/styles/themes/bubblegum.css ================================================ /** * Bubblegum 主题 - 粉色泡泡糖风格(亮色) */ [data-theme="bubblegum"] { --background: oklch(0.9399 0.0203 345.6985); --foreground: oklch(0.4712 0 0); --card: oklch(0.9498 0.0500 86.8891); --card-foreground: oklch(0.4712 0 0); --popover: oklch(1.0000 0 0); --popover-foreground: oklch(0.4712 0 0); --primary: oklch(0.6209 0.1801 348.1385); --primary-foreground: oklch(1.0000 0 0); --secondary: oklch(0.8095 0.0694 198.1863); --secondary-foreground: oklch(0.3211 0 0); --muted: oklch(0.8800 0.0504 212.0952); --muted-foreground: oklch(0.5795 0 0); --accent: oklch(0.9195 0.0801 87.6670); --accent-foreground: oklch(0.3211 0 0); --destructive: oklch(0.7091 0.1697 21.9551); --destructive-foreground: oklch(1.0000 0 0); --border: oklch(0.6209 0.1801 348.1385); --input: oklch(0.9189 0 0); --ring: oklch(0.7002 0.1597 350.7532); --chart-1: oklch(0.7002 0.1597 350.7532); --chart-2: oklch(0.8189 0.0799 212.0892); --chart-3: oklch(0.9195 0.0801 87.6670); --chart-4: oklch(0.7998 0.1110 348.1791); --chart-5: oklch(0.6197 0.1899 353.9091); --sidebar: oklch(0.9140 0.0424 343.0913); --sidebar-foreground: oklch(0.3211 0 0); --sidebar-primary: oklch(0.6559 0.2118 354.3084); --sidebar-primary-foreground: oklch(1.0000 0 0); --sidebar-accent: oklch(0.8228 0.1095 346.0184); --sidebar-accent-foreground: oklch(0.3211 0 0); --sidebar-border: oklch(0.9464 0.0327 307.1745); --sidebar-ring: oklch(0.6559 0.2118 354.3084); --font-sans: Poppins, sans-serif; --font-serif: Lora, serif; --font-mono: Fira Code, monospace; --radius: 0.4rem; --shadow-color: hsl(325.78 58.18% 56.86% / 0.5); --shadow-2xs: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 0.50); --shadow-xs: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 0.50); --shadow-sm: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --shadow: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --shadow-md: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --shadow-lg: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --shadow-xl: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --shadow-2xl: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1.00); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/clean-slate.css ================================================ /** * Clean Slate 主题 - 简洁蓝灰风格(亮色) */ [data-theme="clean-slate"] { --background: oklch(0.9842 0.0034 247.8575); --foreground: oklch(0.2795 0.0368 260.0310); --card: oklch(1.0000 0 0); --card-foreground: oklch(0.2795 0.0368 260.0310); --popover: oklch(1.0000 0 0); --popover-foreground: oklch(0.2795 0.0368 260.0310); --primary: oklch(0.5854 0.2041 277.1173); --primary-foreground: oklch(1.0000 0 0); --secondary: oklch(0.9276 0.0058 264.5313); --secondary-foreground: oklch(0.3729 0.0306 259.7328); --muted: oklch(0.9670 0.0029 264.5419); --muted-foreground: oklch(0.5510 0.0234 264.3637); --accent: oklch(0.9299 0.0334 272.7879); --accent-foreground: oklch(0.3729 0.0306 259.7328); --destructive: oklch(0.6368 0.2078 25.3313); --destructive-foreground: oklch(1.0000 0 0); --border: oklch(0.8717 0.0093 258.3382); --input: oklch(0.8717 0.0093 258.3382); --ring: oklch(0.5854 0.2041 277.1173); --chart-1: oklch(0.5854 0.2041 277.1173); --chart-2: oklch(0.5106 0.2301 276.9656); --chart-3: oklch(0.4568 0.2146 277.0229); --chart-4: oklch(0.3984 0.1773 277.3662); --chart-5: oklch(0.3588 0.1354 278.6973); --sidebar: oklch(0.9670 0.0029 264.5419); --sidebar-foreground: oklch(0.2795 0.0368 260.0310); --sidebar-primary: oklch(0.5854 0.2041 277.1173); --sidebar-primary-foreground: oklch(1.0000 0 0); --sidebar-accent: oklch(0.9299 0.0334 272.7879); --sidebar-accent-foreground: oklch(0.3729 0.0306 259.7328); --sidebar-border: oklch(0.8717 0.0093 258.3382); --sidebar-ring: oklch(0.5854 0.2041 277.1173); --font-sans: Inter, sans-serif; --font-serif: Merriweather, serif; --font-mono: JetBrains Mono, monospace; --radius: 0.5rem; --shadow-color: hsl(0 0% 0%); --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05); --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05); --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10); --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10); --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10); --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10); --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10); --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/cosmic-night.css ================================================ /** * Cosmic Night 主题 - 宇宙紫夜风格(暗色) */ [data-theme="cosmic-night"], [data-theme="cosmic-night"].dark { --background: oklch(0.1743 0.0227 283.7998); --foreground: oklch(0.9185 0.0257 285.8834); --card: oklch(0.2284 0.0384 282.9324); --card-foreground: oklch(0.9185 0.0257 285.8834); --popover: oklch(0.2284 0.0384 282.9324); --popover-foreground: oklch(0.9185 0.0257 285.8834); --primary: oklch(0.7162 0.1597 290.3962); --primary-foreground: oklch(0.1743 0.0227 283.7998); --secondary: oklch(0.3139 0.0736 283.4591); --secondary-foreground: oklch(0.8367 0.0849 285.9111); --muted: oklch(0.2710 0.0621 281.4377); --muted-foreground: oklch(0.7166 0.0462 285.1741); --accent: oklch(0.3354 0.0828 280.9705); --accent-foreground: oklch(0.9185 0.0257 285.8834); --destructive: oklch(0.6861 0.2061 14.9941); --destructive-foreground: oklch(1.0000 0 0); --border: oklch(0.3261 0.0597 282.5832); --input: oklch(0.3261 0.0597 282.5832); --ring: oklch(0.7162 0.1597 290.3962); --chart-1: oklch(0.7162 0.1597 290.3962); --chart-2: oklch(0.6382 0.1047 274.9117); --chart-3: oklch(0.7482 0.1235 244.7492); --chart-4: oklch(0.7124 0.0977 186.6761); --chart-5: oklch(0.7546 0.1831 346.8124); --sidebar: oklch(0.2284 0.0384 282.9324); --sidebar-foreground: oklch(0.9185 0.0257 285.8834); --sidebar-primary: oklch(0.7162 0.1597 290.3962); --sidebar-primary-foreground: oklch(0.1743 0.0227 283.7998); --sidebar-accent: oklch(0.3354 0.0828 280.9705); --sidebar-accent-foreground: oklch(0.9185 0.0257 285.8834); --sidebar-border: oklch(0.3261 0.0597 282.5832); --sidebar-ring: oklch(0.7162 0.1597 290.3962); --font-sans: Inter, sans-serif; --font-serif: Georgia, serif; --font-mono: JetBrains Mono, monospace; --radius: 0.5rem; --shadow-color: hsl(240 30% 25%); --shadow-2xs: 0px 4px 10px 0px hsl(240 30% 25% / 0.06); --shadow-xs: 0px 4px 10px 0px hsl(240 30% 25% / 0.06); --shadow-sm: 0px 4px 10px 0px hsl(240 30% 25% / 0.12); --shadow: 0px 4px 10px 0px hsl(240 30% 25% / 0.12); --shadow-md: 0px 4px 10px 0px hsl(240 30% 25% / 0.12); --shadow-lg: 0px 4px 10px 0px hsl(240 30% 25% / 0.12); --shadow-xl: 0px 4px 10px 0px hsl(240 30% 25% / 0.12); --shadow-2xl: 0px 4px 10px 0px hsl(240 30% 25% / 0.30); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/cyberpunk-1.css ================================================ /** * Cyberpunk 主题 - 赛博朋克风格(暗色) */ [data-theme="cyberpunk-1"], [data-theme="cyberpunk-1"].dark { --background: oklch(0.1786 0.0167 284.5816); --foreground: oklch(0.9085 0.0052 228.8253); --card: oklch(0.2191 0.0214 284.4920); --card-foreground: oklch(0.9085 0.0052 228.8253); --popover: oklch(0.2191 0.0214 284.4920); --popover-foreground: oklch(0.9085 0.0052 228.8253); --primary: oklch(0.9054 0.1546 194.7689); --primary-foreground: oklch(0.1786 0.0167 284.5816); --secondary: oklch(0.3579 0.1469 302.2195); --secondary-foreground: oklch(0.9085 0.0052 228.8253); --muted: oklch(0.2973 0.0276 284.5974); --muted-foreground: oklch(0.6854 0.0185 229.1283); --accent: oklch(0.4238 0.1894 310.7570); --accent-foreground: oklch(0.9193 0.1285 195.1501); --destructive: oklch(0.6333 0.2001 24.9320); --destructive-foreground: oklch(0.1786 0.0167 284.5816); --border: oklch(0.3418 0.0333 284.5008); --input: oklch(0.2973 0.0276 284.5974); --ring: oklch(0.9054 0.1546 194.7689); --chart-1: oklch(0.9089 0.1478 194.8663); --chart-2: oklch(0.5817 0.2729 300.2277); --chart-3: oklch(0.6702 0.2462 356.4011); --chart-4: oklch(0.8342 0.1594 79.5067); --chart-5: oklch(0.7323 0.2492 142.4953); --sidebar: oklch(0.1483 0.0109 284.9903); --sidebar-foreground: oklch(0.9392 0.0035 228.7981); --sidebar-primary: oklch(0.9065 0.1525 194.7986); --sidebar-primary-foreground: oklch(0.1483 0.0109 284.9903); --sidebar-accent: oklch(0.4238 0.1894 310.7570); --sidebar-accent-foreground: oklch(0.9276 0.1137 195.3712); --sidebar-border: oklch(0.2973 0.0276 284.5974); --sidebar-ring: oklch(0.9065 0.1525 194.7986); --font-sans: "Exo 2", sans-serif; --font-serif: Georgia, serif; --font-mono: "Hack", monospace; --radius: 0.2rem; --shadow-color: hsl(220 30% 10%); --shadow-2xs: 0px 4px 12px 0px hsl(220 30% 10% / 0.15); --shadow-xs: 0px 4px 12px 0px hsl(220 30% 10% / 0.15); --shadow-sm: 0px 4px 12px 0px hsl(220 30% 10% / 0.30), 0px 1px 2px -1px hsl(220 30% 10% / 0.30); --shadow: 0px 4px 12px 0px hsl(220 30% 10% / 0.30), 0px 1px 2px -1px hsl(220 30% 10% / 0.30); --shadow-md: 0px 4px 12px 0px hsl(220 30% 10% / 0.30), 0px 2px 4px -1px hsl(220 30% 10% / 0.30); --shadow-lg: 0px 4px 12px 0px hsl(220 30% 10% / 0.30), 0px 4px 6px -1px hsl(220 30% 10% / 0.30); --shadow-xl: 0px 4px 12px 0px hsl(220 30% 10% / 0.30), 0px 8px 10px -1px hsl(220 30% 10% / 0.30); --shadow-2xl: 0px 4px 12px 0px hsl(220 30% 10% / 0.75); --tracking-normal: 0.01em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/eva-01.css ================================================ /** * EVA-01 初号机主题 - 新世纪福音战士(暗色) * 经典紫色和荧光绿配色 */ [data-theme="eva-01"], [data-theme="eva-01"].dark { --background: oklch(0.12 0.04 300); --foreground: oklch(0.92 0.02 300); --card: oklch(0.18 0.05 300); --card-foreground: oklch(0.92 0.02 300); --popover: oklch(0.18 0.05 300); --popover-foreground: oklch(0.92 0.02 300); --primary: oklch(0.50 0.22 300); --primary-foreground: oklch(0.95 0.01 300); --secondary: oklch(0.75 0.25 145); --secondary-foreground: oklch(0.15 0.03 145); --muted: oklch(0.25 0.06 300); --muted-foreground: oklch(0.65 0.04 300); --accent: oklch(0.25 0.06 300); --accent-foreground: oklch(0.65 0.25 300); --destructive: oklch(0.55 0.25 25); --destructive-foreground: oklch(0.95 0.01 25); --border: oklch(0.30 0.08 300); --input: oklch(0.22 0.06 300); --ring: oklch(0.50 0.22 300); --chart-1: oklch(0.50 0.22 300); --chart-2: oklch(0.80 0.28 145); --chart-3: oklch(0.55 0.25 25); --chart-4: oklch(0.70 0.18 60); --chart-5: oklch(0.60 0.20 250); --sidebar: oklch(0.10 0.035 300); --sidebar-foreground: oklch(0.92 0.02 300); --sidebar-primary: oklch(0.50 0.22 300); --sidebar-primary-foreground: oklch(0.95 0.01 300); --sidebar-accent: oklch(0.80 0.28 145); --sidebar-accent-foreground: oklch(0.12 0.04 145); --sidebar-border: oklch(0.25 0.06 300); --sidebar-ring: oklch(0.50 0.22 300); --font-sans: Geist, sans-serif; --font-serif: Georgia, serif; --font-mono: Geist Mono, monospace; --radius: 0.15rem; --shadow-x: 0px; --shadow-y: 1px; --shadow-blur: 2px; --shadow-spread: 0px; --shadow-opacity: 0.20; --shadow-color: hsl(300 40% 5%); --shadow-2xs: 0px 1px 2px 0px hsl(300 40% 5% / 0.10); --shadow-xs: 0px 1px 2px 0px hsl(300 40% 5% / 0.10); --shadow-sm: 0px 1px 2px 0px hsl(300 40% 5% / 0.20), 0px 1px 2px -1px hsl(300 40% 5% / 0.20); --shadow: 0px 1px 2px 0px hsl(300 40% 5% / 0.20), 0px 1px 2px -1px hsl(300 40% 5% / 0.20); --shadow-md: 0px 1px 2px 0px hsl(300 40% 5% / 0.20), 0px 2px 4px -1px hsl(300 40% 5% / 0.20); --shadow-lg: 0px 1px 2px 0px hsl(300 40% 5% / 0.20), 0px 4px 6px -1px hsl(300 40% 5% / 0.20); --shadow-xl: 0px 1px 2px 0px hsl(300 40% 5% / 0.20), 0px 8px 10px -1px hsl(300 40% 5% / 0.20); --shadow-2xl: 0px 1px 2px 0px hsl(300 40% 5% / 0.50); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/index.css ================================================ /** * 主题文件索引 * 所有颜色主题都在这里引入 */ @import "./vercel-dark.css"; @import "./violet-bloom.css"; @import "./bubblegum.css"; @import "./quantum-rose.css"; @import "./clean-slate.css"; @import "./cosmic-night.css"; @import "./cyberpunk-1.css"; @import "./eva-01.css"; ================================================ FILE: frontend/styles/themes/quantum-rose.css ================================================ /** * Quantum Rose 主题 - 玫瑰量子风格(亮色) */ [data-theme="quantum-rose"] { --background: oklch(0.9692 0.0192 343.9344); --foreground: oklch(0.4426 0.1653 352.3762); --card: oklch(0.9837 0.0107 339.3288); --card-foreground: oklch(0.4426 0.1653 352.3762); --popover: oklch(0.9837 0.0107 339.3288); --popover-foreground: oklch(0.4426 0.1653 352.3762); --primary: oklch(0.6002 0.2414 0.1348); --primary-foreground: oklch(1.0000 0 0); --secondary: oklch(0.9230 0.0701 326.1273); --secondary-foreground: oklch(0.4426 0.1653 352.3762); --muted: oklch(0.9429 0.0363 344.2604); --muted-foreground: oklch(0.5740 0.1732 352.0544); --accent: oklch(0.8766 0.0828 344.8849); --accent-foreground: oklch(0.4426 0.1653 352.3762); --destructive: oklch(0.5831 0.1911 6.3410); --destructive-foreground: oklch(1.0000 0 0); --border: oklch(0.8881 0.0747 344.3866); --input: oklch(0.9230 0.0701 326.1273); --ring: oklch(0.6002 0.2414 0.1348); --chart-1: oklch(0.6002 0.2414 0.1348); --chart-2: oklch(0.5979 0.1750 345.0378); --chart-3: oklch(0.6009 0.1243 311.7958); --chart-4: oklch(0.5849 0.1178 283.2937); --chart-5: oklch(0.6479 0.1871 267.9684); --sidebar: oklch(0.9629 0.0227 345.7485); --sidebar-foreground: oklch(0.4426 0.1653 352.3762); --sidebar-primary: oklch(0.6002 0.2414 0.1348); --sidebar-primary-foreground: oklch(1.0000 0 0); --sidebar-accent: oklch(0.8766 0.0828 344.8849); --sidebar-accent-foreground: oklch(0.4426 0.1653 352.3762); --sidebar-border: oklch(0.9311 0.0448 343.3135); --sidebar-ring: oklch(0.6002 0.2414 0.1348); --font-sans: Poppins, sans-serif; --font-serif: Playfair Display, serif; --font-mono: Space Mono, monospace; --radius: 0.5rem; --shadow-color: hsl(330 70% 30% / 0.12); --shadow-2xs: 0px 3px 0px 0px hsl(330 70% 30% / 0.09); --shadow-xs: 0px 3px 0px 0px hsl(330 70% 30% / 0.09); --shadow-sm: 0px 3px 0px 0px hsl(330 70% 30% / 0.18); --shadow: 0px 3px 0px 0px hsl(330 70% 30% / 0.18); --shadow-md: 0px 3px 0px 0px hsl(330 70% 30% / 0.18); --shadow-lg: 0px 3px 0px 0px hsl(330 70% 30% / 0.18); --shadow-xl: 0px 3px 0px 0px hsl(330 70% 30% / 0.18); --shadow-2xl: 0px 3px 0px 0px hsl(330 70% 30% / 0.45); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/vercel-dark.css ================================================ /** * Vercel Dark 主题 - Vercel 暗色风格 */ [data-theme="vercel-dark"], [data-theme="vercel-dark"].dark { --background: oklch(0 0 0); --foreground: oklch(1 0 0); --card: oklch(0.1400 0 0); --card-foreground: oklch(1 0 0); --popover: oklch(0.1800 0 0); --popover-foreground: oklch(1 0 0); --primary: oklch(1 0 0); --primary-foreground: oklch(0 0 0); --secondary: oklch(0.2500 0 0); --secondary-foreground: oklch(1 0 0); --muted: oklch(0.2300 0 0); --muted-foreground: oklch(0.7200 0 0); --accent: oklch(0.3200 0 0); --accent-foreground: oklch(1 0 0); --destructive: oklch(0.6900 0.2000 23.9100); --destructive-foreground: oklch(0 0 0); --border: oklch(0.2600 0 0); --input: oklch(0.3200 0 0); --ring: oklch(0.7200 0 0); --chart-1: oklch(0.8100 0.1700 75.3500); --chart-2: oklch(0.5800 0.2100 260.8400); --chart-3: oklch(0.5600 0 0); --chart-4: oklch(0.4400 0 0); --chart-5: oklch(0.9200 0 0); --sidebar: oklch(0.1800 0 0); --sidebar-foreground: oklch(1 0 0); --sidebar-primary: oklch(1 0 0); --sidebar-primary-foreground: oklch(0 0 0); --sidebar-accent: oklch(0.3200 0 0); --sidebar-accent-foreground: oklch(1 0 0); --sidebar-border: oklch(0.3200 0 0); --sidebar-ring: oklch(0.7200 0 0); --font-sans: Geist, sans-serif; --font-serif: Georgia, serif; --font-mono: Geist Mono, monospace; --radius: 0.5rem; --shadow-color: hsl(0 0% 0%); --shadow-2xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-sm: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow-md: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 2px 4px -1px hsl(0 0% 0% / 0.18); --shadow-lg: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 4px 6px -1px hsl(0 0% 0% / 0.18); --shadow-xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 8px 10px -1px hsl(0 0% 0% / 0.18); --shadow-2xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.45); --tracking-normal: 0em; --spacing: 0.25rem; } ================================================ FILE: frontend/styles/themes/vercel.css ================================================ [data-theme="vercel"] { --background: oklch(0.9900 0 0); --foreground: oklch(0 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0 0 0); --popover: oklch(0.9900 0 0); --popover-foreground: oklch(0 0 0); --primary: oklch(0 0 0); --primary-foreground: oklch(1 0 0); --secondary: oklch(0.9400 0 0); --secondary-foreground: oklch(0 0 0); --muted: oklch(0.9700 0 0); --muted-foreground: oklch(0.4400 0 0); --accent: oklch(0.9400 0 0); --accent-foreground: oklch(0 0 0); --destructive: oklch(0.6300 0.1900 23.0300); --destructive-foreground: oklch(1 0 0); --border: oklch(0.9200 0 0); --input: oklch(0.9400 0 0); --ring: oklch(0 0 0); --chart-1: oklch(0.8100 0.1700 75.3500); --chart-2: oklch(0.5500 0.2200 264.5300); --chart-3: oklch(0.7200 0 0); --chart-4: oklch(0.9200 0 0); --chart-5: oklch(0.5600 0 0); --sidebar: oklch(0.9900 0 0); --sidebar-foreground: oklch(0 0 0); --sidebar-primary: oklch(0 0 0); --sidebar-primary-foreground: oklch(1 0 0); --sidebar-accent: oklch(0.9400 0 0); --sidebar-accent-foreground: oklch(0 0 0); --sidebar-border: oklch(0.9400 0 0); --sidebar-ring: oklch(0 0 0); --font-sans: Geist, sans-serif; --font-serif: Georgia, serif; --font-mono: Geist Mono, monospace; --radius: 0.5rem; --shadow-x: 0px; --shadow-y: 1px; --shadow-blur: 2px; --shadow-spread: 0px; --shadow-opacity: 0.18; --shadow-color: hsl(0 0% 0%); --shadow-2xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-sm: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow-md: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 2px 4px -1px hsl(0 0% 0% / 0.18); --shadow-lg: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 4px 6px -1px hsl(0 0% 0% / 0.18); --shadow-xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 8px 10px -1px hsl(0 0% 0% / 0.18); --shadow-2xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.45); --tracking-normal: 0em; --spacing: 0.25rem; } .dark[data-theme="vercel"], [data-theme="vercel"].dark { --background: oklch(0 0 0); --foreground: oklch(1 0 0); --card: oklch(0.1400 0 0); --card-foreground: oklch(1 0 0); --popover: oklch(0.1800 0 0); --popover-foreground: oklch(1 0 0); --primary: oklch(1 0 0); --primary-foreground: oklch(0 0 0); --secondary: oklch(0.2500 0 0); --secondary-foreground: oklch(1 0 0); --muted: oklch(0.2300 0 0); --muted-foreground: oklch(0.7200 0 0); --accent: oklch(0.3200 0 0); --accent-foreground: oklch(1 0 0); --destructive: oklch(0.6900 0.2000 23.9100); --destructive-foreground: oklch(0 0 0); --border: oklch(0.2600 0 0); --input: oklch(0.3200 0 0); --ring: oklch(0.7200 0 0); --chart-1: oklch(0.8100 0.1700 75.3500); --chart-2: oklch(0.5800 0.2100 260.8400); --chart-3: oklch(0.5600 0 0); --chart-4: oklch(0.4400 0 0); --chart-5: oklch(0.9200 0 0); --sidebar: oklch(0.1800 0 0); --sidebar-foreground: oklch(1 0 0); --sidebar-primary: oklch(1 0 0); --sidebar-primary-foreground: oklch(0 0 0); --sidebar-accent: oklch(0.3200 0 0); --sidebar-accent-foreground: oklch(1 0 0); --sidebar-border: oklch(0.3200 0 0); --sidebar-ring: oklch(0.7200 0 0); --font-sans: Geist, sans-serif; --font-serif: Georgia, serif; --font-mono: Geist Mono, monospace; --radius: 0.5rem; --shadow-x: 0px; --shadow-y: 1px; --shadow-blur: 2px; --shadow-spread: 0px; --shadow-opacity: 0.18; --shadow-color: hsl(0 0% 0%); --shadow-2xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-xs: 0px 1px 2px 0px hsl(0 0% 0% / 0.09); --shadow-sm: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 1px 2px -1px hsl(0 0% 0% / 0.18); --shadow-md: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 2px 4px -1px hsl(0 0% 0% / 0.18); --shadow-lg: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 4px 6px -1px hsl(0 0% 0% / 0.18); --shadow-xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.18), 0px 8px 10px -1px hsl(0 0% 0% / 0.18); --shadow-2xl: 0px 1px 2px 0px hsl(0 0% 0% / 0.45); } ================================================ FILE: frontend/styles/themes/violet-bloom.css ================================================ /** * Violet Bloom 主题 - 紫罗兰花朵风格(亮色) */ [data-theme="violet-bloom"] { --background: oklch(0.9940 0 0); --foreground: oklch(0 0 0); --card: oklch(0.9940 0 0); --card-foreground: oklch(0 0 0); --popover: oklch(0.9911 0 0); --popover-foreground: oklch(0 0 0); --primary: oklch(0.5393 0.2713 286.7462); --primary-foreground: oklch(1.0000 0 0); --secondary: oklch(0.9540 0.0063 255.4755); --secondary-foreground: oklch(0.1344 0 0); --muted: oklch(0.9702 0 0); --muted-foreground: oklch(0.4386 0 0); --accent: oklch(0.9393 0.0288 266.3680); --accent-foreground: oklch(0.5445 0.1903 259.4848); --destructive: oklch(0.6290 0.1902 23.0704); --destructive-foreground: oklch(1.0000 0 0); --border: oklch(0.9300 0.0094 286.2156); --input: oklch(0.9401 0 0); --ring: oklch(0 0 0); --chart-1: oklch(0.7459 0.1483 156.4499); --chart-2: oklch(0.5393 0.2713 286.7462); --chart-3: oklch(0.7336 0.1758 50.5517); --chart-4: oklch(0.5828 0.1809 259.7276); --chart-5: oklch(0.5590 0 0); --sidebar: oklch(0.9777 0.0051 247.8763); --sidebar-foreground: oklch(0 0 0); --sidebar-primary: oklch(0 0 0); --sidebar-primary-foreground: oklch(1.0000 0 0); --sidebar-accent: oklch(0.9401 0 0); --sidebar-accent-foreground: oklch(0 0 0); --sidebar-border: oklch(0.9401 0 0); --sidebar-ring: oklch(0 0 0); --font-sans: Plus Jakarta Sans, sans-serif; --font-serif: Lora, serif; --font-mono: IBM Plex Mono, monospace; --radius: 1.4rem; --shadow-color: hsl(0 0% 0%); --shadow-2xs: 0px 2px 3px 0px hsl(0 0% 0% / 0.08); --shadow-xs: 0px 2px 3px 0px hsl(0 0% 0% / 0.08); --shadow-sm: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 1px 2px -1px hsl(0 0% 0% / 0.16); --shadow: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 1px 2px -1px hsl(0 0% 0% / 0.16); --shadow-md: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 2px 4px -1px hsl(0 0% 0% / 0.16); --shadow-lg: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 4px 6px -1px hsl(0 0% 0% / 0.16); --shadow-xl: 0px 2px 3px 0px hsl(0 0% 0% / 0.16), 0px 8px 10px -1px hsl(0 0% 0% / 0.16); --shadow-2xl: 0px 2px 3px 0px hsl(0 0% 0% / 0.40); --tracking-normal: -0.025em; --spacing: 0.27rem; } ================================================ FILE: frontend/tsconfig.json ================================================ { "compilerOptions": { "target": "ES2017", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": ["./*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } ================================================ FILE: frontend/types/api-key-settings.types.ts ================================================ /** * API Key 配置类型定义 * 用于 subfinder 第三方数据源配置 */ // 单字段 Provider 配置(hunter, shodan, zoomeye, securitytrails, threatbook, quake) export interface SingleFieldProviderConfig { enabled: boolean apiKey: string } // FOFA Provider 配置(email + apiKey) export interface FofaProviderConfig { enabled: boolean email: string apiKey: string } // Censys Provider 配置(apiId + apiSecret) export interface CensysProviderConfig { enabled: boolean apiId: string apiSecret: string } // 完整的 API Key 配置 export interface ApiKeySettings { fofa: FofaProviderConfig hunter: SingleFieldProviderConfig shodan: SingleFieldProviderConfig censys: CensysProviderConfig zoomeye: SingleFieldProviderConfig securitytrails: SingleFieldProviderConfig threatbook: SingleFieldProviderConfig quake: SingleFieldProviderConfig } // Provider 类型 export type ProviderKey = keyof ApiKeySettings // Provider 配置联合类型 export type ProviderConfig = FofaProviderConfig | CensysProviderConfig | SingleFieldProviderConfig ================================================ FILE: frontend/types/api-response.types.ts ================================================ // Common API response types // // 新响应格式: // - 成功响应:直接返回数据 T(无包装) // - 分页响应:{ results: T[], total, page, pageSize, totalPages } // - 错误响应:{ error: { code, message?, details? } } // // 注意:旧的 { code, state, message, data } 格式已废弃 /** * 错误响应类型 */ export interface ApiErrorResponse { error: { code: string; message?: string; details?: unknown[]; }; } /** * 旧版 API 响应类型(已废弃,仅保留以向后兼容) * @deprecated 请直接使用数据类型 T,后端不再使用此包装格式 */ export interface LegacyApiResponse { code: string; // HTTP status code, e.g. "200", "400", "500" state: string; // Business state, e.g. "success", "error" message: string; // Response message data?: T; // Response data } // Common batch create response data (corresponds to backend BaseBatchCreateResponseData) // Applicable to: domains, endpoints and other batch create operations export interface BatchCreateResponse { message: string // Detailed description, e.g. "Processed 5 domains, created 3 new, 2 existed, 1 skipped" requestedCount: number // Total requested count createdCount: number // Newly created count existedCount: number // Already existed count skippedCount?: number // Skipped count (optional) skippedDomains?: Array<{ // Skipped domains list (optional) name: string reason: string }> } // Paginated response type export interface PaginatedResponse { results: T[] total: number page: number pageSize: number totalPages?: number } ================================================ FILE: frontend/types/auth.types.ts ================================================ /** * Authentication related type definitions */ // User info export interface User { id: number username: string isStaff: boolean isSuperuser: boolean } // Login request export interface LoginRequest { username: string password: string } // Login response export interface LoginResponse { message: string user: User } // Get current user response export interface MeResponse { authenticated: boolean user: User | null } // Logout response export interface LogoutResponse { message: string } // Change password request export interface ChangePasswordRequest { oldPassword: string newPassword: string } // Change password response export interface ChangePasswordResponse { message: string } ================================================ FILE: frontend/types/command.types.ts ================================================ import { Tool } from "./tool.types" /** * Command model */ export interface Command { id: number createdAt: string updatedAt: string toolId: number tool?: Tool name: string displayName: string description: string commandTemplate: string } /** * Get commands list request parameters */ export interface GetCommandsRequest { page?: number pageSize?: number toolId?: number } /** * Get commands list response */ export interface GetCommandsResponse { commands: Command[] page: number pageSize: number // Backend returns camelCase format total: number // Unified total field totalPages: number // Backend returns camelCase format // Compatibility fields (backward compatible) page_size?: number total_count?: number total_pages?: number } /** * Create command request */ export interface CreateCommandRequest { toolId: number name: string displayName?: string description?: string commandTemplate: string } /** * Update command request */ export interface UpdateCommandRequest { name?: string displayName?: string description?: string commandTemplate?: string } /** * Command response data */ export interface CommandResponseData { command: Command } /** * Batch delete commands response data */ export interface BatchDeleteCommandsResponseData { deletedCount: number } ================================================ FILE: frontend/types/common.types.ts ================================================ // Common type definitions // Pagination info interface export interface PaginationInfo { total: number page: number pageSize: number totalPages: number } // Pagination and sorting parameters interface export interface PaginationParams { page?: number pageSize?: number sortBy?: string // Sort field: id, name, created_at, updated_at (using snake_case) sortOrder?: "asc" | "desc" // Sort direction: asc, desc search?: string // Search keyword } ================================================ FILE: frontend/types/dashboard.types.ts ================================================ export interface DashboardStats { totalTargets: number totalSubdomains: number totalEndpoints: number totalVulnerabilities: number } /** * Asset statistics data (pre-aggregated) */ export interface VulnBySeverity { critical: number high: number medium: number low: number info: number } export interface AssetStatistics { totalTargets: number totalSubdomains: number totalIps: number totalEndpoints: number totalWebsites: number totalVulns: number totalAssets: number runningScans: number updatedAt: string | null // Change values changeTargets: number changeSubdomains: number changeIps: number changeEndpoints: number changeWebsites: number changeVulns: number changeAssets: number // Vulnerability severity distribution vulnBySeverity: VulnBySeverity } /** * Statistics history data (for line charts) */ export interface StatisticsHistoryItem { date: string totalTargets: number totalSubdomains: number totalIps: number totalEndpoints: number totalWebsites: number totalVulns: number totalAssets: number } ================================================ FILE: frontend/types/data-table.types.ts ================================================ import type { ColumnDef, SortingState, VisibilityState, Table, Header, Column, RowData } from "@tanstack/react-table" import type { ReactNode } from "react" /** * Extend TanStack Table's ColumnMeta type * Used to store column metadata such as title */ declare module '@tanstack/react-table' { interface ColumnMeta { /** Column title, used for column header and column visibility control */ title?: string } } /** * Pagination state */ export interface PaginationState { pageIndex: number pageSize: number } /** * Server-side pagination info */ export interface PaginationInfo { total: number totalPages: number page: number pageSize: number } /** * Filter field definition * Note: description is required, consistent with SmartFilterInput component */ export interface FilterField { key: string label: string description: string } /** * Download option */ export interface DownloadOption { key: string label: string icon?: ReactNode onClick: () => void disabled?: boolean | ((selectedCount: number) => boolean) } /** * Delete confirmation dialog configuration */ export interface DeleteConfirmationConfig { title?: string description?: string | ((count: number) => string) confirmLabel?: string cancelLabel?: string } /** * Unified data table component props */ export interface UnifiedDataTableProps { // Core data data: TData[] columns: ColumnDef[] getRowId?: (row: TData) => string // Pagination pagination?: PaginationState setPagination?: React.Dispatch> paginationInfo?: PaginationInfo onPaginationChange?: (pagination: PaginationState) => void hidePagination?: boolean pageSizeOptions?: number[] // Toolbar hideToolbar?: boolean toolbarLeft?: ReactNode toolbarRight?: ReactNode // Search/Filter searchMode?: 'simple' | 'smart' searchPlaceholder?: string searchValue?: string onSearch?: (value: string) => void isSearching?: boolean filterFields?: FilterField[] filterExamples?: string[] // Selection enableRowSelection?: boolean rowSelection?: Record onRowSelectionChange?: (selection: Record) => void onSelectionChange?: (selectedRows: TData[]) => void // Bulk operations onBulkDelete?: () => void bulkDeleteLabel?: string showBulkDelete?: boolean // Add operation onAddNew?: () => void onAddHover?: () => void addButtonLabel?: string showAddButton?: boolean // Bulk add operation onBulkAdd?: () => void bulkAddLabel?: string showBulkAdd?: boolean // Download operations downloadOptions?: DownloadOption[] // Column control columnVisibility?: VisibilityState onColumnVisibilityChange?: (visibility: VisibilityState) => void // Sorting sorting?: SortingState onSortingChange?: (sorting: SortingState) => void defaultSorting?: SortingState // Empty state emptyMessage?: string emptyComponent?: ReactNode // Confirmation dialog deleteConfirmation?: DeleteConfirmationConfig // Styling className?: string tableClassName?: string // Auto column sizing /** Enable automatic column width calculation based on content */ enableAutoColumnSizing?: boolean } /** * Toolbar component props */ export interface DataTableToolbarProps { // Search searchMode?: 'simple' | 'smart' searchPlaceholder?: string searchValue?: string onSearch?: (value: string) => void isSearching?: boolean filterFields?: FilterField[] filterExamples?: string[] // Left side custom content leftContent?: ReactNode // Right side actions children?: ReactNode // Styling className?: string } /** * Pagination component props */ export interface DataTablePaginationProps { table: Table paginationInfo?: PaginationInfo pageSizeOptions?: number[] onPaginationChange?: (pagination: PaginationState) => void className?: string } /** * Column header component props */ export interface DataTableColumnHeaderProps { column: Column title: string className?: string } /** * Column resizer component props */ export interface ColumnResizerProps { header: Header className?: string } ================================================ FILE: frontend/types/directory.types.ts ================================================ /** * Directory related type definitions */ export interface Directory { id: number url: string status: number | null contentLength: number | null // Backend returns contentLength words: number | null lines: number | null contentType: string duration: number | null websiteUrl: string // Backend returns websiteUrl createdAt: string // Backend returns createdAt } export interface DirectoryFilters { url?: string status?: number contentType?: string } export interface DirectoryListResponse { results: Directory[] total: number page: number pageSize: number totalPages: number } ================================================ FILE: frontend/types/disk.types.ts ================================================ export interface DiskStats { totalBytes: number usedBytes: number freeBytes: number usedPercent: number } ================================================ FILE: frontend/types/endpoint.types.ts ================================================ // Endpoint specific data type definitions // Note: Backend returns snake_case, but api-client.ts automatically converts to camelCase import type { BatchCreateResponse } from './api-response.types' export interface Endpoint { id: number url: string // HTTP metadata (may be null in some scenarios) method?: string statusCode: number | null // Backend: status_code (pointer type, may be null) title: string contentLength: number | null // Backend: content_length (pointer type, may be null) contentType?: string | null // Backend: content_type (optional) responseTime?: number | null // Backend: response_time (in seconds, optional) gfPatterns?: string[] | null // Backend: matched_gf_patterns, GF pattern matching results // Site/endpoint dimension additional info (used by both asset table and snapshot table) host?: string location?: string webserver?: string responseBody?: string tech?: string[] vhost?: boolean | null responseHeaders?: string createdAt?: string // Legacy domain association fields (may not exist in some APIs) domainId?: number // Backend: domain_id subdomainId?: number // Backend: subdomain_id domain?: string subdomain?: string updatedAt?: string // Backend: updated_at } // Endpoint list request parameters // Backend sorts by update time descending export interface GetEndpointsRequest { page?: number pageSize?: number search?: string } // Endpoint list response data // Note: Backend returns snake_case, but api-client.ts automatically converts to camelCase export interface GetEndpointsResponse { endpoints: Endpoint[] total: number page: number pageSize: number // Backend returns camelCase format totalPages: number // Backend returns camelCase format // Compatibility fields (backward compatible) page_size?: number total_pages?: number } // Create Endpoint request parameters export interface CreateEndpointRequest { url: string // Required method?: string // Optional statusCode?: number | null // Optional title?: string // Optional contentLength?: number | null // Optional contentType?: string | null // Optional responseTime?: number | null // Optional gfPatterns?: string[] | null // Optional, GF pattern matching results domain?: string // Optional subdomain?: string // Optional } // Create Endpoint response (extends common batch create response) export interface CreateEndpointsResponse extends BatchCreateResponse { // Inherited fields: message, requestedCount, createdCount, existedCount } // Update Endpoint request parameters export interface UpdateEndpointRequest { id: number url?: string method?: string statusCode?: number title?: string contentLength?: number contentType?: string | null responseTime?: number | null gfPatterns?: string[] | null domain?: string subdomain?: string } // Batch delete Endpoint request parameters export interface BatchDeleteEndpointsRequest { endpointIds: number[] } // Batch delete Endpoint response data export interface BatchDeleteEndpointsResponse { message: string deletedCount: number } ================================================ FILE: frontend/types/engine.types.ts ================================================ /** * Scan engine type definitions * * Backend actual return fields: id, name, configuration, created_at, updated_at */ // Scan engine interface export interface ScanEngine { id: number name: string configuration?: string // YAML configuration content createdAt: string updatedAt: string } // Create engine request export interface CreateEngineRequest { name: string configuration: string } // Update engine request export interface UpdateEngineRequest { name?: string configuration?: string } ================================================ FILE: frontend/types/fingerprint.types.ts ================================================ /** * Fingerprint related type definitions */ // EHole fingerprint type export interface EholeFingerprint { id: number cms: string method: string location: string keyword: string[] isImportant: boolean type: string createdAt: string } // Goby rule type export interface GobyRule { label: string feature: string is_equal: boolean } // Goby fingerprint type export interface GobyFingerprint { id: number name: string logic: string rule: GobyRule[] createdAt: string } // Wappalyzer fingerprint type export interface WappalyzerFingerprint { id: number name: string cats: number[] cookies: Record headers: Record scriptSrc: string[] js: string[] implies: string[] meta: Record html: string[] description: string website: string cpe: string createdAt: string } // Fingers rule type export interface FingersRule { regexps?: { regexp: string group?: number }[] vuln?: string version?: string body?: string header?: string title?: string send_data_type?: string send_data?: string favicon_hash?: string[] } // Fingers fingerprint type export interface FingersFingerprint { id: number name: string link: string rule: FingersRule[] tag: string[] focus: boolean defaultPort: number[] createdAt: string } // FingerPrintHub HTTP matcher type export interface FingerPrintHubHttpMatcher { method?: string path?: string matchers?: { type: string part?: string words?: string[] regex?: string[] status?: number[] condition?: string }[] extractors?: { type: string part?: string regex?: string[] group?: number }[] } // FingerPrintHub metadata type export interface FingerPrintHubMetadata { product?: string vendor?: string verified?: boolean shodan_query?: string fofa_query?: string } // FingerPrintHub fingerprint type export interface FingerPrintHubFingerprint { id: number fpId: string name: string author: string tags: string severity: string metadata: FingerPrintHubMetadata http: FingerPrintHubHttpMatcher[] sourceFile: string createdAt: string } // ARL fingerprint type export interface ARLFingerprint { id: number name: string rule: string createdAt: string } // Batch create response export interface BatchCreateResponse { created: number failed: number } // Bulk delete response export interface BulkDeleteResponse { deleted: number } // Fingerprint statistics export interface FingerprintStats { ehole: number goby: number wappalyzer: number fingers: number fingerprinthub: number arl: number } ================================================ FILE: frontend/types/ip-address.types.ts ================================================ export interface Port { number: number serviceName: string description: string isUncommon: boolean } export interface IPAddress { ip: string // IP address (unique identifier) hosts: string[] // Associated hostname list ports: number[] // Associated port list createdAt: string // First creation time } export interface GetIPAddressesParams { page?: number pageSize?: number filter?: string // Smart filter syntax string } export interface GetIPAddressesResponse { results: IPAddress[] total: number page: number pageSize: number totalPages: number } ================================================ FILE: frontend/types/notification-settings.types.ts ================================================ export interface DiscordSettings { enabled: boolean webhookUrl: string } export interface WeComSettings { enabled: boolean webhookUrl: string } /** Notification category - corresponds to backend NotificationCategory */ export type NotificationCategory = 'scan' | 'vulnerability' | 'asset' | 'system' /** Notification switches by category */ export interface NotificationCategories { scan: boolean // Scan tasks vulnerability: boolean // Vulnerability discovery asset: boolean // Asset discovery system: boolean // System messages } export interface NotificationSettings { discord: DiscordSettings wecom: WeComSettings categories: NotificationCategories } export type GetNotificationSettingsResponse = NotificationSettings export type UpdateNotificationSettingsRequest = NotificationSettings export interface UpdateNotificationSettingsResponse { message: string discord: DiscordSettings wecom: WeComSettings categories: NotificationCategories } ================================================ FILE: frontend/types/notification.types.ts ================================================ /** * Notification type definitions */ // Notification type enum (corresponds to backend NotificationCategory) export type NotificationType = "vulnerability" | "scan" | "asset" | "system" // Severity level (corresponds to backend NotificationLevel) export type NotificationSeverity = "low" | "medium" | "high" | "critical" // Backend notification level (consistent with backend) export type BackendNotificationLevel = NotificationSeverity // Backend notification data format export interface BackendNotification { id: number category?: NotificationType title: string message: string level: BackendNotificationLevel created_at?: string createdAt?: string read_at?: string | null readAt?: string | null is_read?: boolean isRead?: boolean } // Notification interface export interface Notification { id: number type: NotificationType title: string description: string detail?: string time: string unread: boolean severity?: NotificationSeverity createdAt?: string } // Get notifications list request parameters export interface GetNotificationsRequest { page?: number pageSize?: number type?: NotificationType unread?: boolean } // Get notifications list response export interface GetNotificationsResponse { results: BackendNotification[] total: number page: number pageSize: number // Backend returns camelCase format totalPages: number // Backend returns camelCase format // Compatibility fields (backward compatible) page_size?: number total_pages?: number } ================================================ FILE: frontend/types/nuclei-git.types.ts ================================================ export type NucleiGitAuthType = "none" | "token" export interface NucleiGitSettings { repoUrl: string authType: NucleiGitAuthType authToken: string } export type GetNucleiGitSettingsResponse = NucleiGitSettings export type UpdateNucleiGitSettingsRequest = NucleiGitSettings export interface UpdateNucleiGitSettingsResponse { message: string settings: NucleiGitSettings } ================================================ FILE: frontend/types/nuclei.types.ts ================================================ export type NucleiTemplateNodeType = "folder" | "file" export interface NucleiTemplateTreeNode { type: NucleiTemplateNodeType name: string path: string children?: NucleiTemplateTreeNode[] templateId?: string severity?: string tags?: string[] } export interface NucleiTemplateTreeResponse { roots: NucleiTemplateTreeNode[] } export interface NucleiTemplateContent { path: string name: string templateId?: string severity?: string tags?: string[] content: string } export type NucleiTemplateScope = "custom" | "public" export interface UploadNucleiTemplatePayload { scope: NucleiTemplateScope file: File } export interface SaveNucleiTemplatePayload { path: string content: string } ================================================ FILE: frontend/types/organization.types.ts ================================================ import { ColumnDef } from "@tanstack/react-table" import { PaginationInfo } from "./common.types" // Organization statistics data export interface OrganizationStats { totalDomains?: number // Total domains count totalEndpoints?: number // Total endpoints count totalTargets?: number // Total targets count } // Organization related type definitions (matches backend Organization model) export interface Organization { id: number name: string description: string createdAt: string // Backend created_at auto-converted to camelCase by Django updatedAt: string // Backend updated_at // Associated data (added via serializer) targets?: Array<{ id: number name: string }> // Statistics data (optional, obtained via aggregate query) stats?: OrganizationStats targetCount?: number // Target count (for list display) domainCount?: number // Domain count (for list display) endpointCount?: number // Endpoint count (for list display) } // Organization list response type (matches backend actual response format) export interface OrganizationsResponse { results: T[] // Organization data list total: number // Total record count (backend actual field) page: number // Current page number pageSize: number // Page size totalPages: number // Total pages // Compatibility fields count?: number // DRF standard field (backward compatible) next?: string | null // Next page link (DRF standard field) previous?: string | null // Previous page link (DRF standard field) organizations?: T[] pagination?: { total: number page: number pageSize: number totalPages: number } } // Create organization request type export interface CreateOrganizationRequest { name: string description: string } // Update organization request type export interface UpdateOrganizationRequest { name: string description: string } // Organization data table component props type definition export interface OrganizationDataTableProps { data: Organization[] // Organization data array columns: ColumnDef[] // Column definitions array onAddNew?: () => void // Add new organization callback onBulkDelete?: () => void // Bulk delete callback onSelectionChange?: (selectedRows: Organization[]) => void // Selected rows change callback searchPlaceholder?: string // Search input placeholder searchColumn?: string // Column name to search searchValue?: string // Controlled: search input current value (server-side search) onSearch?: (value: string) => void // Controlled: search input change callback (server-side search) isSearching?: boolean // Searching state (show loading animation) // Pagination related props pagination?: { pageIndex: number pageSize: number } setPagination?: (pagination: { pageIndex: number; pageSize: number }) => void paginationInfo?: PaginationInfo onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void } ================================================ FILE: frontend/types/psl.d.ts ================================================ declare module 'psl' { export interface ParsedDomain { input: string tld: string | null sld: string | null domain: string | null subdomain: string | null listed: boolean error?: Error } export function parse(domain: string): ParsedDomain export function get(domain: string): string | null export function isValid(domain: string): boolean } ================================================ FILE: frontend/types/scan.types.ts ================================================ /** * Scan task status enum * Consistent with backend ScanStatus */ export type ScanStatus = "cancelled" | "completed" | "failed" | "initiated" | "running" /** * Scan stage (dynamic, from engine_config key) */ export type ScanStage = string /** * Stage progress status */ export type StageStatus = "pending" | "running" | "completed" | "failed" | "cancelled" /** * Single stage progress info */ export interface StageProgressItem { status: StageStatus order: number // Execution order (starting from 0) startedAt?: string // ISO time string duration?: number // Execution duration (seconds) detail?: string // Completion details error?: string // Error message reason?: string // Skip reason } /** * Stage progress dictionary (dynamic keys) */ export type StageProgress = Record export interface ScanRecord { id: number target?: number // Target ID (corresponds to backend target) targetName: string // Target name (corresponds to backend targetName) workerName?: string | null // Worker node name (corresponds to backend worker_name) summary: { subdomains: number websites: number directories: number endpoints: number ips: number vulnerabilities: { total: number critical: number high: number medium: number low: number } } engineIds: number[] // Engine ID list (corresponds to backend engine_ids) engineNames: string[] // Engine name list (corresponds to backend engine_names) createdAt: string // Creation time (corresponds to backend createdAt) status: ScanStatus errorMessage?: string // Error message (corresponds to backend errorMessage, has value when failed) progress: number // 0-100 currentStage?: ScanStage // Current scan stage (only has value in running status) stageProgress?: StageProgress // Stage progress details yamlConfiguration?: string // YAML configuration string } export interface GetScansParams { page?: number pageSize?: number status?: ScanStatus search?: string target?: number // Filter by target ID } export interface GetScansResponse { results: ScanRecord[] // Corresponds to backend results field total: number page: number pageSize: number totalPages: number } /** * Initiate scan request parameters (for existing target/organization) */ export interface InitiateScanRequest { organizationId?: number // Organization ID (choose one) targetId?: number // Target ID (choose one) configuration: string // YAML configuration string (required) engineIds: number[] // Scan engine ID list (required) engineNames: string[] // Engine name list (required) } /** * Quick scan request parameters (auto-create target and scan) */ export interface QuickScanRequest { targets: { name: string }[] // Target list configuration: string // YAML configuration string (required) engineIds: number[] // Scan engine ID list (required) engineNames: string[] // Engine name list (required) } /** * Quick scan response */ export interface QuickScanResponse { count: number // Number of scan tasks created targetStats: { created: number skipped: number failed: number } assetStats: { websites: number endpoints: number } errors: Array<{ input: string; error: string }> scans: ScanTask[] } /** * Single scan task info */ export interface ScanTask { id: number target: number // Target ID engineIds: number[] // Engine ID list engineNames: string[] // Engine name list status: ScanStatus createdAt: string updatedAt: string } /** * Initiate scan response */ export interface InitiateScanResponse { message: string // Success message count: number // Number of scan tasks created scans: ScanTask[] // Scan task list } ================================================ FILE: frontend/types/scheduled-scan.types.ts ================================================ /** * Scheduled scan type definitions */ // Scheduled scan status export type ScheduledScanStatus = "active" | "paused" | "expired" // Scan mode export type ScanMode = 'organization' | 'target' // Scheduled scan interface export interface ScheduledScan { id: number name: string engineIds: number[] // Associated scan engine ID list engineNames: string[] // Associated scan engine name list organizationId: number | null // Organization ID (organization scan mode) organizationName: string | null // Organization name targetId: number | null // Target ID (target scan mode) targetName: string | null // Target name (target scan mode) scanMode: ScanMode // Scan mode cronExpression: string // Cron expression isEnabled: boolean // Whether enabled nextRunTime?: string // Next run time lastRunTime?: string // Last run time runCount: number // Execution count createdAt: string updatedAt: string } // Create scheduled scan request (organizationId and targetId are mutually exclusive) export interface CreateScheduledScanRequest { name: string configuration: string // YAML configuration string (required) engineIds: number[] // Engine ID list (required) engineNames: string[] // Engine name list (required) organizationId?: number // Organization scan mode targetId?: number // Target scan mode cronExpression: string // Cron expression, format: minute hour day month weekday isEnabled?: boolean } // Update scheduled scan request (organizationId and targetId are mutually exclusive) export interface UpdateScheduledScanRequest { name?: string configuration?: string // YAML configuration string engineIds?: number[] // Engine ID list (optional, for reference) engineNames?: string[] // Engine name list (optional, for reference) organizationId?: number // Organization scan mode (clears targetId when set) targetId?: number // Target scan mode (clears organizationId when set) cronExpression?: string isEnabled?: boolean } // API response export interface GetScheduledScansResponse { results: ScheduledScan[] total: number page: number pageSize: number totalPages: number } ================================================ FILE: frontend/types/search.types.ts ================================================ // 资产类型 export type AssetType = 'website' | 'endpoint' // Website 搜索结果类型 export interface WebsiteSearchResult { id: number url: string host: string title: string technologies: string[] statusCode: number | null contentLength: number | null contentType: string webserver: string location: string vhost: boolean | null responseHeaders: Record responseBody: string createdAt: string | null targetId: number vulnerabilities: Vulnerability[] } // Endpoint 搜索结果类型 export interface EndpointSearchResult { id: number url: string host: string title: string technologies: string[] statusCode: number | null contentLength: number | null contentType: string webserver: string location: string vhost: boolean | null responseHeaders: Record responseBody: string createdAt: string | null targetId: number matchedGfPatterns: string[] } // 通用搜索结果类型(兼容旧代码) export type SearchResult = WebsiteSearchResult | EndpointSearchResult export interface Vulnerability { id?: number name: string severity: 'critical' | 'high' | 'medium' | 'low' | 'info' | 'unknown' vulnType: string url?: string } // 搜索状态 export type SearchState = 'initial' | 'searching' | 'results' // 搜索响应类型 export interface SearchResponse { results: SearchResult[] total: number page: number pageSize: number totalPages: number assetType: AssetType } // 搜索操作符类型 export type SearchOperator = '=' | '==' | '!=' // 单个搜索条件 export interface SearchCondition { field: string operator: SearchOperator value: string } // 搜索表达式(支持 AND/OR 组合) export interface SearchExpression { conditions: SearchCondition[] // 同一组内的条件用 AND 连接 orGroups?: SearchExpression[] // 多组之间用 OR 连接 } // 发送给后端的搜索参数 export interface SearchParams { q?: string // 完整的搜索表达式字符串 asset_type?: AssetType // 资产类型 page?: number pageSize?: number } ================================================ FILE: frontend/types/subdomain.types.ts ================================================ import { ColumnDef } from "@tanstack/react-table" import { PaginationParams, PaginationInfo } from "./common.types" import type { Organization } from "./organization.types" import type { BatchCreateResponse } from "./api-response.types" import type { Port } from "./ip-address.types" // Subdomain related type definitions (renamed from domain.types.ts) // Basic subdomain type (consistent with frontend camelCase naming convention) // Note: Backend returns snake_case, but response interceptor auto-converts to camelCase export interface Subdomain { id: number name: string createdAt: string // Creation time } // Get subdomains list request parameters export interface GetSubdomainsParams extends PaginationParams { organizationId: number } // Get subdomains list response (field 'domains' kept consistent with backend) export interface GetSubdomainsResponse { domains: Subdomain[] total: number page: number pageSize: number // [OK] Using camelCase totalPages: number // [OK] Using camelCase } // Get all subdomains request parameters // Backend sorts by update time descending, custom sorting not supported export interface GetAllSubdomainsParams { page?: number pageSize?: number search?: string } // Get all subdomains response (field 'domains' kept consistent with backend) export interface GetAllSubdomainsResponse { domains: Subdomain[] total: number page: number pageSize: number totalPages: number } // Get single subdomain detail response (backend returns object directly) export type GetSubdomainByIDResponse = Subdomain // Subdomain data table component props type definition export interface SubdomainDataTableProps { data: Subdomain[] // Subdomain data array columns: ColumnDef[] // Column definitions array onAddNew?: () => void // Add new subdomain callback onBulkDelete?: () => void // Bulk delete callback onSelectionChange?: (selectedRows: Subdomain[]) => void // Selected rows change callback searchPlaceholder?: string // Search input placeholder searchColumn?: string // Column name to search // Pagination related props pagination?: { pageIndex: number pageSize: number } setPagination?: (pagination: { pageIndex: number; pageSize: number }) => void paginationInfo?: PaginationInfo onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void } // Subdomain batch create response (reuse common type) export type BatchCreateSubdomainsResponse = BatchCreateResponse ================================================ FILE: frontend/types/system-log.types.ts ================================================ export interface SystemLogResponse { content: string } export type LogCategory = 'system' | 'error' | 'performance' | 'container' export interface LogFile { filename: string category: LogCategory size: number modifiedAt: string } export interface LogFilesResponse { files: LogFile[] } ================================================ FILE: frontend/types/target.types.ts ================================================ /** * Target type definitions */ /** * Target type */ export type TargetType = 'domain' | 'ip' | 'cidr' /** * Target basic info (for list display) */ export interface Target { id: number name: string type: TargetType // Backend field: type description?: string createdAt: string // Backend field: created_at, auto-converted to createdAt lastScannedAt?: string // Backend field: last_scanned_at, auto-converted to lastScannedAt // Associated data (added via serializer) organizations?: Array<{ id: number name: string }> } /** * Target detail info (includes statistics data) */ export interface TargetDetail extends Target { summary: { subdomains: number websites: number endpoints: number ips: number vulnerabilities: { total: number critical: number high: number medium: number low: number } } } /** * Target list response type */ export interface TargetsResponse { results: Target[] total: number // Backend returns total, not count page: number // Current page number pageSize: number // Page size totalPages: number // Total pages // Compatibility fields (for backward compatibility) count?: number // Optional, equivalent to total next?: string | null previous?: string | null } /** * Create target request parameters */ export interface CreateTargetRequest { name: string description?: string } /** * Update target request parameters */ export interface UpdateTargetRequest { name?: string description?: string } /** * Batch delete targets request parameters */ export interface BatchDeleteTargetsRequest { ids: number[] } /** * Batch delete targets response */ export interface BatchDeleteTargetsResponse { deletedCount: number failedIds?: number[] } /** * Batch create targets request parameters */ export interface BatchCreateTargetsRequest { targets: Array<{ name: string description?: string }> organizationId?: number // Optional: associate with specified organization } /** * Batch create targets response */ export interface BatchCreateTargetsResponse { createdCount: number reusedCount: number failedCount: number failedTargets: Array<{ name: string reason: string }> message: string } ================================================ FILE: frontend/types/tool.types.ts ================================================ // Tool type enum export type ToolType = 'opensource' | 'custom' // Tool type definition (matches frontend camelCase converted format) // Note: Backend returns snake_case, api-client.ts auto-converts to camelCase export interface Tool { id: number name: string // Tool name type: ToolType // Tool type: opensource/custom (backend: type) repoUrl: string // Repository URL (backend: repo_url) version: string // Version number description: string // Tool description categoryNames: string[] // Category tags array (backend: category_names) directory: string // Tool path (backend: directory) installCommand: string // Install command (backend: install_command) updateCommand: string // Update command (backend: update_command) versionCommand: string // Version query command (backend: version_command) createdAt: string // Backend: created_at updatedAt: string // Backend: updated_at } // Tool category name to display name mapping // All categories reference backend model design document export const CategoryNameMap: Record = { subdomain: 'Subdomain Scan', vulnerability: 'Vulnerability Scan', port: 'Port Scan', directory: 'Directory Scan', dns: 'DNS Resolution', http: 'HTTP Probe', crawler: 'Web Crawler', recon: 'Reconnaissance', fuzzer: 'Fuzzing', wordlist: 'Wordlist Generation', screenshot: 'Screenshot Tool', exploit: 'Exploitation', network: 'Network Scan', other: 'Other', } // Tool list response type (api-client.ts auto-converts to camelCase) export interface GetToolsResponse { tools: Tool[] total: number page: number pageSize: number // Backend returns camelCase format totalPages: number // Backend returns camelCase format // Compatibility fields (backward compatible) page_size?: number total_pages?: number } // Create tool request type export interface CreateToolRequest { name: string type: ToolType // Tool type (required) repoUrl?: string version?: string description?: string categoryNames?: string[] // Category tags array directory?: string // Tool path (required for custom tools) installCommand?: string // Install command (required for opensource tools) updateCommand?: string // Update command (required for opensource tools) versionCommand?: string // Version query command (required for opensource tools) } // Update tool request type export interface UpdateToolRequest { name?: string type?: ToolType // Tool type (for command field validation) repoUrl?: string version?: string description?: string categoryNames?: string[] // Category tags array directory?: string // Tool path installCommand?: string // Install command updateCommand?: string // Update command versionCommand?: string // Version query command } // Tool query parameters // Backend sorts by update time descending, custom sorting not supported export interface GetToolsParams { page?: number pageSize?: number } // Tool filter type export type ToolFilter = 'all' | 'default' | 'custom' ================================================ FILE: frontend/types/version.types.ts ================================================ export interface VersionInfo { version: string githubRepo: string } export interface UpdateCheckResult { currentVersion: string latestVersion: string hasUpdate: boolean releaseUrl: string releaseNotes: string | null publishedAt: string | null } ================================================ FILE: frontend/types/vulnerability.types.ts ================================================ import { ColumnDef } from "@tanstack/react-table" import { PaginationParams, PaginationInfo } from "./common.types" import type { BatchCreateResponse } from "./api-response.types" // Vulnerability related type definitions // Vulnerability severity export type VulnerabilitySeverity = "critical" | "high" | "medium" | "low" | "info" // Vulnerability status export type VulnerabilityStatus = "open" | "in_progress" | "resolved" | "false_positive" | "accepted" // Tool raw output (JSON) export interface VulnerabilityRawOutput { // Dalfox fields type?: string // R=Reflected, S=Stored inject_type?: string // Injection type method?: string // HTTP method data?: string // URL param?: string // Parameter name payload?: string // Payload evidence?: string // Evidence cwe?: string // CWE message_str?: string // Message // Nuclei fields "template-id"?: string "template-path"?: string "matched-at"?: string host?: string request?: string response?: string "curl-command"?: string ip?: string info?: { name?: string description?: string severity?: string tags?: string[] reference?: string[] classification?: { "cve-id"?: string "cwe-id"?: string[] } } // Other fields [key: string]: unknown } // Basic vulnerability type (field names match backend DRF serializer output - camelCase format) export interface Vulnerability { id: number target?: number // Associated target ID url: string // URL where vulnerability exists vulnType: string // Vulnerability type (e.g. xss-reflected, template-id) severity: VulnerabilitySeverity source: string // Vulnerability source (dalfox, nuclei) cvssScore?: number // CVSS score description?: string // Simplified description rawOutput?: VulnerabilityRawOutput // Tool raw output createdAt: string // Creation time } // Get vulnerabilities list request parameters export interface GetVulnerabilitiesParams extends PaginationParams { targetId?: number domainId?: number endpointId?: number severity?: VulnerabilitySeverity status?: VulnerabilityStatus filter?: string // Smart filter syntax } // Get vulnerabilities list response export interface GetVulnerabilitiesResponse { vulnerabilities: Vulnerability[] total: number page: number pageSize: number totalPages: number } // Get single vulnerability detail response export type GetVulnerabilityByIDResponse = Vulnerability // Vulnerability data table component props type definition export interface VulnerabilityDataTableProps { data: Vulnerability[] columns: ColumnDef[] onAddNew?: () => void onBulkDelete?: () => void onSelectionChange?: (selectedRows: Vulnerability[]) => void searchPlaceholder?: string searchColumn?: string pagination?: { pageIndex: number pageSize: number } setPagination?: (pagination: { pageIndex: number; pageSize: number }) => void paginationInfo?: PaginationInfo onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void } // Vulnerability batch create response export type BatchCreateVulnerabilitiesResponse = BatchCreateResponse ================================================ FILE: frontend/types/website.types.ts ================================================ /** * WebSite related type definitions */ export interface WebSite { id: number scan?: number target?: number url: string host: string location: string title: string webserver: string contentType: string statusCode: number contentLength: number responseBody: string tech: string[] vhost: boolean | null subdomain: string responseHeaders?: string createdAt: string } export interface Technology { id: number name: string version?: string category?: string } export interface WebSiteFilters { url?: string title?: string statusCode?: number webserver?: string contentType?: string } export interface WebSiteListResponse { results: WebSite[] total: number page: number pageSize: number totalPages: number } ================================================ FILE: frontend/types/wordlist.types.ts ================================================ // Wordlist related types import type { PaginationInfo } from "@/types/common.types" // Wordlist basic info export interface Wordlist { id: number name: string description?: string // File size (bytes), optional, returned by backend fileSize?: number // Line count, for estimating duration, optional, returned by backend lineCount?: number // File SHA-256 hash, for cache validation fileHash?: string createdAt: string updatedAt: string } // Get wordlists list response (follows unified pagination structure) export interface GetWordlistsResponse extends PaginationInfo { results: Wordlist[] } ================================================ FILE: frontend/types/worker.types.ts ================================================ /** * Worker node related type definitions */ // Worker status enum (unified between frontend and backend) export type WorkerStatus = 'pending' | 'deploying' | 'online' | 'offline' | 'updating' | 'outdated' // Worker node export interface WorkerNode { id: number name: string ipAddress: string sshPort: number username: string status: WorkerStatus isLocal: boolean // Whether it's a local node (inside Docker container) createdAt: string updatedAt?: string info?: { cpuPercent?: number memoryPercent?: number } } // Create Worker request export interface CreateWorkerRequest { name: string ipAddress: string sshPort?: number username?: string password: string } // Update Worker request export interface UpdateWorkerRequest { name?: string sshPort?: number username?: string password?: string } // Worker list response export interface WorkersResponse { results: WorkerNode[] total: number page: number pageSize: number } ================================================ FILE: frontend/vercel.json ================================================ { "$schema": "https://openapi.vercel.sh/vercel.json", "framework": "nextjs", "buildCommand": "pnpm build", "installCommand": "pnpm install", "env": { "NEXT_PUBLIC_USE_MOCK": "true", "NEXT_PUBLIC_SKIP_AUTH": "true" } } ================================================ FILE: install.sh ================================================ #!/bin/bash set -e # ============================================================================== # 用法: # sudo ./install.sh 生产模式(拉取 Docker Hub 镜像) # sudo ./install.sh --dev 开发模式(本地构建 + 调试日志) # sudo ./install.sh --no-frontend 安装并只启动后端 # sudo ./install.sh --dev --no-frontend 开发模式 + 只启动后端 # ============================================================================== # 解析参数 START_ARGS="" DEV_MODE=false GIT_MIRROR="" for arg in "$@"; do case $arg in --dev) DEV_MODE=true START_ARGS="$START_ARGS --dev" ;; --no-frontend) START_ARGS="$START_ARGS --no-frontend" ;; --mirror) GIT_MIRROR="https://gh-proxy.org" ;; --mirror=*) GIT_MIRROR="${arg#*=}" ;; esac done # ============================================================================== # 颜色定义 # ============================================================================== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' RESET='\033[0m' # ============================================================================== # 额外颜色定义 # ============================================================================== MAGENTA='\033[0;35m' DIM='\033[2m' BG_BLUE='\033[44m' BG_CYAN='\033[46m' # ============================================================================== # 日志函数 # ============================================================================== info() { echo -e " ${CYAN}▸${RESET} $1" } success() { echo -e " ${GREEN}✔${RESET} $1" } warn() { echo -e " ${YELLOW}⚠${RESET} $1" } error() { echo -e " ${RED}✖${RESET} $1" } step() { echo -e "\n${BOLD}${CYAN}┌── $1${RESET}" } header() { echo -e "" echo -e "${BOLD}${BLUE}╔══════════════════════════════════════════════════════════╗${RESET}" echo -e "${BOLD}${BLUE}║${RESET} $1" echo -e "${BOLD}${BLUE}╚══════════════════════════════════════════════════════════╝${RESET}" } # ============================================================================== # 显示横幅 # ============================================================================== show_banner() { clear echo -e "" echo -e "${CYAN}${BOLD} ██╗ ██╗██╗███╗ ██╗ ██████╗ ██████╗ ██╗███╗ ██╗${RESET}" echo -e "${CYAN} ╚██╗██╔╝██║████╗ ██║██╔════╝ ██╔══██╗██║████╗ ██║${RESET}" echo -e "${BLUE}${BOLD} ╚███╔╝ ██║██╔██╗ ██║██║ ███╗██████╔╝██║██╔██╗ ██║${RESET}" echo -e "${BLUE} ██╔██╗ ██║██║╚██╗██║██║ ██║██╔══██╗██║██║╚██╗██║${RESET}" echo -e "${MAGENTA}${BOLD} ██╔╝ ██╗██║██║ ╚████║╚██████╔╝██║ ██║██║██║ ╚████║${RESET}" echo -e "${MAGENTA} ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝${RESET}" echo -e "" echo -e "${DIM} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo -e "${BOLD} 🔒 分布式安全扫描平台 │ 一键部署 (Ubuntu)${RESET}" echo -e "${DIM} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo -e "" } # ============================================================================== # 权限检查 # ============================================================================== if [ "$EUID" -ne 0 ]; then error "请使用 sudo 运行此脚本" echo -e " 正确用法: ${BOLD}sudo ./install.sh${RESET}" exit 1 fi # 获取真实用户(通过 sudo 运行时 $SUDO_USER 是真实用户) REAL_USER="${SUDO_USER:-$USER}" # macOS 没有 getent,使用 dscl 或 ~$USER 替代 if command -v getent &>/dev/null; then REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) else REAL_HOME=$(eval echo "~$REAL_USER") fi # 项目根目录 ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT_DIR" # 从 VERSION 文件读取版本号 VERSION_FILE="$ROOT_DIR/VERSION" if [ -f "$VERSION_FILE" ]; then APP_VERSION=$(cat "$VERSION_FILE" | tr -d '[:space:]') else error "VERSION 文件不存在,无法确定安装版本" exit 1 fi # 显示标题 show_banner info "当前用户: ${BOLD}$REAL_USER${RESET}" info "项目路径: ${BOLD}$ROOT_DIR${RESET}" info "安装版本: ${BOLD}$APP_VERSION${RESET}" if [ -n "$GIT_MIRROR" ]; then info "Git 加速: ${BOLD}${GREEN}已启用${RESET} - $GIT_MIRROR" fi # ============================================================================== # 工具函数 # ============================================================================== # 生成随机字符串 generate_random_string() { local length="${1:-32}" if command -v openssl >/dev/null 2>&1; then openssl rand -hex "$length" 2>/dev/null | cut -c1-"$length" else date +%s%N | sha256sum | cut -c1-"$length" fi } # 跨平台 sed -i(兼容 macOS 和 Linux) sed_inplace() { if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' "$@" else sed -i "$@" fi } # 更新 .env 文件中的某个键 update_env_var() { local file="$1" local key="$2" local value="$3" if grep -q "^$key=" "$file"; then sed_inplace "s|^$key=.*|$key=$value|" "$file" else echo "$key=$value" >> "$file" fi } # 用于保存生成的密码,方便最后显示 GENERATED_DB_PASSWORD="" GENERATED_DJANGO_KEY="" # 生成自签 HTTPS 证书(使用容器,避免宿主机 openssl 兼容性问题) generate_self_signed_cert() { local ssl_dir="$DOCKER_DIR/nginx/ssl" local fullchain="$ssl_dir/fullchain.pem" local privkey="$ssl_dir/privkey.pem" if [ -f "$fullchain" ] && [ -f "$privkey" ]; then success "检测到已有 HTTPS 证书,跳过自签" return fi info "未检测到 HTTPS 证书,正在生成自签证书(localhost)..." mkdir -p "$ssl_dir" # 使用容器生成证书,避免依赖宿主机 openssl 版本 if docker run --rm -v "$ssl_dir:/ssl" alpine/openssl \ req -x509 -nodes -newkey rsa:2048 -days 365 \ -keyout /ssl/privkey.pem \ -out /ssl/fullchain.pem \ -subj "/C=CN/ST=NA/L=NA/O=XingRin/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" \ >/dev/null 2>&1; then success "自签证书已生成: $ssl_dir" else warn "自签证书生成失败,请手动放置证书到 $ssl_dir" fi } # 自动为 docker/.env 填充敏感变量 auto_fill_docker_env_secrets() { local env_file="$1" info "自动生成 DJANGO_SECRET_KEY、DB_PASSWORD 和 WORKER_API_KEY..." GENERATED_DJANGO_KEY="$(generate_random_string 64)" GENERATED_DB_PASSWORD="$(generate_random_string 32)" GENERATED_WORKER_API_KEY="$(generate_random_string 32)" update_env_var "$env_file" "DJANGO_SECRET_KEY" "$GENERATED_DJANGO_KEY" update_env_var "$env_file" "DB_PASSWORD" "$GENERATED_DB_PASSWORD" update_env_var "$env_file" "WORKER_API_KEY" "$GENERATED_WORKER_API_KEY" success "密钥生成完成" } # 配置 Docker 镜像加速 # 使用国内公共镜像源(pull-through cache 模式,首次拉取会从 Docker Hub 同步) configure_docker_mirror() { local daemon_json="/etc/docker/daemon.json" # 这些镜像源采用 pull-through cache 模式: # - 首次拉取:从 Docker Hub 获取并缓存 # - 后续拉取:直接从缓存返回 # - 支持所有公开镜像,包括用户上传的最新镜像 local mirrors='[ "https://docker.1ms.run", "https://docker.1panel.live", "https://hub.rat.dev", "https://docker.m.daocloud.io", "https://dockerproxy.net" ]' info "配置 Docker 镜像加速..." # 确保 Docker 配置目录存在 mkdir -p /etc/docker if [ ! -f "$daemon_json" ]; then # 文件不存在,直接创建 echo "{\"registry-mirrors\": $mirrors}" | jq '.' > "$daemon_json" success "Docker 镜像加速配置完成" else # 文件存在,用 jq 合并配置 if jq -e '.' "$daemon_json" >/dev/null 2>&1; then # 有效的 JSON,合并配置 local temp_file=$(mktemp) jq --argjson mirrors "$mirrors" '. + {"registry-mirrors": $mirrors}' "$daemon_json" > "$temp_file" mv "$temp_file" "$daemon_json" success "Docker 镜像加速配置已合并到现有配置" else # 无效的 JSON,备份后重新创建 warn "现有 daemon.json 格式无效,已备份为 daemon.json.bak" cp "$daemon_json" "${daemon_json}.bak" echo "{\"registry-mirrors\": $mirrors}" | jq '.' > "$daemon_json" success "Docker 镜像加速配置完成" fi fi # 重启 Docker 使配置生效 if systemctl is-active --quiet docker; then info "重启 Docker 服务..." systemctl restart docker sleep 2 if systemctl is-active --quiet docker; then success "Docker 服务重启完成" else warn "Docker 服务重启失败,请手动检查" fi fi } # 获取加速后的 Docker 镜像地址(保留函数以兼容现有代码) get_accelerated_image() { local image="$1" # 镜像加速通过 daemon.json 的 registry-mirrors 实现 # 这里直接返回原始地址 echo "$image" } # 检测远程 PostgreSQL 是否有 pg_ivm 扩展 check_pg_ivm() { local db_host="$1" local db_port="$2" local db_user="$3" local db_password="$4" local db_name="$5" info "检测 pg_ivm 扩展..." # 尝试创建 pg_ivm 扩展 if docker run --rm \ -e PGPASSWORD="$db_password" \ postgres:15 \ psql "postgresql://$db_user@$db_host:$db_port/$db_name" \ -c "CREATE EXTENSION IF NOT EXISTS pg_ivm;" 2>/dev/null; then success "pg_ivm 扩展已启用" return 0 else echo error "pg_ivm 扩展未安装或无法启用" echo echo -e "${YELLOW}==========================================" echo -e "pg_ivm 是必需的扩展,用于增量维护物化视图" echo -e "要求: PostgreSQL 13+ 版本" echo -e "==========================================${RESET}" echo echo -e "请在远程 PostgreSQL 服务器上执行以下命令一键安装:" echo echo -e " ${BOLD}curl -sSL https://raw.githubusercontent.com/yyhuni/xingrin/main/docker/scripts/install-pg-ivm.sh | sudo bash${RESET}" echo echo -e "安装完成后,请重新运行 install.sh" echo -e "${YELLOW}==========================================${RESET}" return 1 fi } # 显示安装总结信息 show_summary() { echo if [ "$1" = "success" ]; then # 成功 Banner echo -e "" echo -e "${GREEN}${BOLD} ╔═══════════════════════════════════════════════════╗${RESET}" echo -e "${GREEN}${BOLD} ║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ██████╗ ██████╗ ███╗ ██╗███████╗██║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ██╔══██╗██╔═══██╗████╗ ██║██╔════╝██║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ██║ ██║██║ ██║██╔██╗ ██║█████╗ ██║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ██║ ██║██║ ██║██║╚██╗██║██╔══╝ ╚═╝ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ██████╔╝╚██████╔╝██║ ╚████║███████╗██║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝╚═╝ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ║${RESET}" echo -e "${GREEN}${BOLD} ║ ✨ XingRin 平台部署成功! ║${RESET}" echo -e "${GREEN}${BOLD} ║ ║${RESET}" echo -e "${GREEN}${BOLD} ╚═══════════════════════════════════════════════════╝${RESET}" echo -e "" else header "安装完成 Summary" fi if [ -f "$DOCKER_DIR/.env" ]; then # 从 .env 读取配置用于显示 DB_HOST=$(grep "^DB_HOST=" "$DOCKER_DIR/.env" | cut -d= -f2) DB_USER=$(grep "^DB_USER=" "$DOCKER_DIR/.env" | cut -d= -f2) DB_PASSWORD=$(grep "^DB_PASSWORD=" "$DOCKER_DIR/.env" | cut -d= -f2) echo -e "${DIM} ──────────────────────────────────────────────────────${RESET}" echo -e " ${YELLOW}🗄 数据库配置${RESET}" echo -e " ${DIM}├─${RESET} 服务器地址: ${BOLD}${DB_HOST:-未知}${RESET}" echo -e " ${DIM}├─${RESET} 用户名: ${BOLD}${DB_USER:-未知}${RESET}" echo -e " ${DIM}└─${RESET} 密码: ${BOLD}${DB_PASSWORD:-未知}${RESET}" echo fi # 获取访问地址 PUBLIC_HOST=$(grep "^PUBLIC_HOST=" "$DOCKER_DIR/.env" 2>/dev/null | cut -d= -f2) if [ -n "$PUBLIC_HOST" ] && [ "$PUBLIC_HOST" != "server" ]; then ACCESS_HOST="$PUBLIC_HOST" else ACCESS_HOST="localhost" fi echo -e "${DIM} ──────────────────────────────────────────────────────${RESET}" echo -e " ${GREEN}🌐 访问地址${RESET}" echo -e " ${DIM}└─${RESET} XingRin: ${BOLD}${CYAN}https://${ACCESS_HOST}:8083/${RESET}" echo echo -e "${DIM} ──────────────────────────────────────────────────────${RESET}" echo -e " ${MAGENTA}🔑 默认登录${RESET}" echo -e " ${DIM}├─${RESET} 用户名: ${BOLD}admin${RESET}" echo -e " ${DIM}└─${RESET} 密码: ${BOLD}admin${RESET}" echo -e " ${YELLOW} ⚠ 请首次登录后修改密码!${RESET}" echo if [ "$1" = "success" ]; then : # 成功模式,不显示后续命令 else echo -e "${DIM} ──────────────────────────────────────────────────────${RESET}" echo -e " ${BLUE}🚀 后续命令${RESET}" echo -e " ${DIM}├─${RESET} ./start.sh ${DIM}# 启动所有服务${RESET}" echo -e " ${DIM}├─${RESET} ./start.sh --no-frontend ${DIM}# 只启动后端${RESET}" echo -e " ${DIM}└─${RESET} ./stop.sh ${DIM}# 停止所有服务${RESET}" echo fi echo -e "${DIM} ──────────────────────────────────────────────────────${RESET}" echo -e " ${YELLOW}⚠ 云服务器端口提醒${RESET}" echo -e " ${DIM}└─${RESET} 某些厂商默认开启安全策略(阿里云/腾讯云/华为云)" echo -e " 端口未放行可能导致无法访问,请在云控制台放行: ${BOLD}8083, 5432${RESET}" echo } # ============================================================================== # 安装流程 # ============================================================================== step "[1/3] 检查基础命令" MISSING_CMDS=() for cmd in git curl jq; do if ! command -v "$cmd" >/dev/null 2>&1; then MISSING_CMDS+=("$cmd") warn "未安装: $cmd" else success "已安装: $cmd" fi done if [ ${#MISSING_CMDS[@]} -gt 0 ]; then info "正在安装缺失命令: ${MISSING_CMDS[*]}..." apt update -qq apt install -y "${MISSING_CMDS[@]}" success "基础命令安装完成" fi step "[2/3] 检查 Docker 环境" if command -v docker >/dev/null 2>&1; then success "已安装: docker" else info "正在安装 Docker..." # 根据是否启用加速选择下载方式 if [ -n "$GIT_MIRROR" ]; then # 使用阿里云 Docker 安装脚本(国内加速) info "使用国内镜像安装 Docker..." if curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun; then success "Docker 安装完成(使用阿里云镜像)" else warn "阿里云镜像安装失败,尝试官方源..." if curl -fsSL https://get.docker.com | sh; then success "Docker 安装完成" else error "Docker 安装失败" exit 1 fi fi else # 默认从官方源下载 if curl -fsSL https://get.docker.com | sh; then success "Docker 安装完成" else error "Docker 安装脚本下载失败" error "如果您在中国大陆,建议使用 --mirror 参数启用加速" exit 1 fi fi usermod -aG docker "$REAL_USER" # 配置 Docker 镜像加速(仅当启用 --mirror 时) if [ -n "$GIT_MIRROR" ]; then configure_docker_mirror fi fi # 如果 Docker 已安装但启用了 --mirror,也配置镜像加速 if [ -n "$GIT_MIRROR" ] && command -v docker &>/dev/null; then # 检查是否已配置镜像加速 if [ ! -f "/etc/docker/daemon.json" ] || ! grep -q "registry-mirrors" /etc/docker/daemon.json 2>/dev/null; then configure_docker_mirror fi fi # 检查 docker compose if docker compose version >/dev/null 2>&1; then success "已安装: docker compose" else info "正在安装 docker-compose-plugin..." apt install -y docker-compose-plugin success "docker compose 安装完成" fi # ============================================================================== # 交换分区配置(仅 Linux) # ============================================================================== if [[ "$OSTYPE" == "linux-gnu"* ]]; then # 获取当前内存大小(GB,四舍五入) TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') TOTAL_MEM_GB=$(awk "BEGIN {printf \"%.0f\", $TOTAL_MEM_KB / 1024 / 1024}") # 获取当前交换分区大小(GB,四舍五入) CURRENT_SWAP_KB=$(grep SwapTotal /proc/meminfo | awk '{print $2}') CURRENT_SWAP_GB=$(awk "BEGIN {printf \"%.0f\", $CURRENT_SWAP_KB / 1024 / 1024}") # 推荐交换分区大小(与内存相同,最小1G,最大8G) RECOMMENDED_SWAP=$TOTAL_MEM_GB [ "$RECOMMENDED_SWAP" -lt 1 ] && RECOMMENDED_SWAP=1 [ "$RECOMMENDED_SWAP" -gt 8 ] && RECOMMENDED_SWAP=8 echo "" info "系统内存: ${TOTAL_MEM_GB}GB,当前交换分区: ${CURRENT_SWAP_GB}GB" # 如果交换分区小于推荐值,提示用户 if [ "$CURRENT_SWAP_GB" -lt "$RECOMMENDED_SWAP" ]; then echo -n -e "${BOLD}${CYAN}[?] 是否开启 ${RECOMMENDED_SWAP}GB 交换分区?可提升扫描稳定性 (Y/n) ${RESET}" read -r setup_swap echo if [[ ! $setup_swap =~ ^[Nn]$ ]]; then info "正在配置 ${RECOMMENDED_SWAP}GB 交换分区..." if bash "$ROOT_DIR/docker/scripts/setup-swap.sh" "$RECOMMENDED_SWAP"; then success "交换分区配置完成" else warn "交换分区配置失败,继续安装..." fi else info "跳过交换分区配置" fi else success "交换分区已足够: ${CURRENT_SWAP_GB}GB" fi fi step "[3/3] 初始化配置" # 创建数据目录 info "创建数据目录..." mkdir -p /opt/xingrin/{results,logs,fingerprints,wordlists,nuclei-repos} chmod -R 777 /opt/xingrin success "数据目录已创建: /opt/xingrin/" DOCKER_DIR="$ROOT_DIR/docker" if [ ! -d "$DOCKER_DIR" ]; then error "未找到 docker 目录,请确认项目结构。" exit 1 fi if [ -f "$DOCKER_DIR/.env.example" ]; then cp "$DOCKER_DIR/.env.example" "$DOCKER_DIR/.env" success "已创建: docker/.env" auto_fill_docker_env_secrets "$DOCKER_DIR/.env" # 写入版本号(锁定安装时的版本) update_env_var "$DOCKER_DIR/.env" "IMAGE_TAG" "$APP_VERSION" success "已锁定版本: IMAGE_TAG=$APP_VERSION" # Git 加速仅用于安装过程,不写入运行时配置 # 运行时用户如需加速,可通过代理或其他方式自行配置 if [ -n "$GIT_MIRROR" ]; then info "Git 加速已启用(仅用于安装阶段)" fi # 开发模式:开启调试日志 if [ "$DEV_MODE" = true ]; then info "开发模式:开启调试配置..." update_env_var "$DOCKER_DIR/.env" "DEBUG" "True" update_env_var "$DOCKER_DIR/.env" "LOG_LEVEL" "INFO" update_env_var "$DOCKER_DIR/.env" "ENABLE_COMMAND_LOGGING" "true" success "已开启: DEBUG=True, LOG_LEVEL=INFO, ENABLE_COMMAND_LOGGING=true" fi # 询问数据库配置 echo "" echo -n -e "${BOLD}${CYAN}[?] 是否使用远程 PostgreSQL 数据库?(y/N) ${RESET}" read -r use_remote_db echo if [[ $use_remote_db =~ ^[Yy]$ ]]; then echo -e "${CYAN} 请输入远程 PostgreSQL 配置:${RESET}" # 服务器地址(必填) echo -n -e " ${CYAN}服务器地址: ${RESET}" read -r db_host if [ -z "$db_host" ]; then error "服务器地址不能为空" exit 1 fi # 端口(可选) echo -n -e " ${CYAN}端口 [5432]: ${RESET}" read -r db_port db_port=${db_port:-5432} # 用户名(必填) echo -n -e " ${CYAN}用户名: ${RESET}" read -r db_user if [ -z "$db_user" ]; then error "用户名不能为空" exit 1 fi # 密码(必填) echo -n -e " ${CYAN}密码: ${RESET}" read -r db_password if [ -z "$db_password" ]; then error "密码不能为空" exit 1 fi # 验证远程 PostgreSQL 连接(使用官方 postgres 镜像中的 psql) echo info "正在验证远程 PostgreSQL 连接..." # 使用 postgres 默认库验证连接(每个 PostgreSQL 都有这个库) if ! docker run --rm \ -e PGPASSWORD="$db_password" \ postgres:15 \ psql "postgresql://$db_user@$db_host:$db_port/postgres" -c 'SELECT 1' >/dev/null 2>&1; then echo error "无法连接到远程 PostgreSQL,请检查 IP/端口/用户名/密码是否正确" echo " 尝试连接: postgresql://$db_user@$db_host:$db_port/postgres" exit 1 fi success "远程 PostgreSQL 连接验证通过" # 尝试创建业务数据库(如果不存在) info "检查并创建数据库..." db_name=$(grep "^DB_NAME=" "$DOCKER_DIR/.env" | cut -d= -f2) db_name=${db_name:-xingrin} prefect_db=$(grep "^PREFECT_DB_NAME=" "$DOCKER_DIR/.env" | cut -d= -f2) prefect_db=${prefect_db:-prefect} docker run --rm -e PGPASSWORD="$db_password" postgres:15 \ psql "postgresql://$db_user@$db_host:$db_port/postgres" \ -c "CREATE DATABASE $db_name;" 2>/dev/null || true docker run --rm -e PGPASSWORD="$db_password" postgres:15 \ psql "postgresql://$db_user@$db_host:$db_port/postgres" \ -c "CREATE DATABASE $prefect_db;" 2>/dev/null || true success "数据库准备完成" # 检测 pg_ivm 扩展 if ! check_pg_ivm "$db_host" "$db_port" "$db_user" "$db_password" "$db_name"; then exit 1 fi sed_inplace "s/^DB_HOST=.*/DB_HOST=$db_host/" "$DOCKER_DIR/.env" sed_inplace "s/^DB_PORT=.*/DB_PORT=$db_port/" "$DOCKER_DIR/.env" sed_inplace "s/^DB_USER=.*/DB_USER=$db_user/" "$DOCKER_DIR/.env" sed_inplace "s/^DB_PASSWORD=.*/DB_PASSWORD=$db_password/" "$DOCKER_DIR/.env" success "已配置远程数据库: $db_user@$db_host:$db_port" else info "使用本地 PostgreSQL 容器" fi # 是否为远程 VPS 部署(需要从其它机器 / Worker 访问本系统) echo "" echo -n -e "${BOLD}${CYAN}[?] 当前是否为远程 VPS 部署?(y/N) ${RESET}" read -r set_public_host echo if [[ $set_public_host =~ ^[Yy]$ ]]; then echo -n -e " ${CYAN}请输入当前远程 vps 的外网 IP 地址(例如 10.1.1.1): ${RESET}" read -r public_host if [ -z "$public_host" ]; then warn "未输入外网ip地址,将保持 .env 中已有的 PUBLIC_HOST(请确保 Worker 能访问该地址)" else update_env_var "$DOCKER_DIR/.env" "PUBLIC_HOST" "$public_host" success "已配置对外访问地址: $public_host" fi else info "检测为本机 docker 部署,将 PUBLIC_HOST 设置为 server(容器内部访问后端服务名)" update_env_var "$DOCKER_DIR/.env" "PUBLIC_HOST" "server" fi else error "未找到 docker/.env.example" exit 1 fi # 准备 HTTPS 证书(无域名也可使用自签) generate_self_signed_cert # ============================================================================== # 预拉取 Worker 镜像(避免扫描时等待) # ============================================================================== step "预拉取 Worker 镜像..." DOCKER_USER=$(grep "^DOCKER_USER=" "$DOCKER_DIR/.env" 2>/dev/null | cut -d= -f2) DOCKER_USER=${DOCKER_USER:-yyhuni} WORKER_IMAGE="${DOCKER_USER}/xingrin-worker:${APP_VERSION}" # 开发模式下构建本地 worker 镜像 if [ "$DEV_MODE" = true ]; then info "开发模式:构建本地 Worker 镜像..." if docker compose -f "$DOCKER_DIR/docker-compose.dev.yml" build worker; then # 设置 TASK_EXECUTOR_IMAGE 环境变量指向本地构建的镜像(使用版本号-dev标识) update_env_var "$DOCKER_DIR/.env" "TASK_EXECUTOR_IMAGE" "docker-worker:${APP_VERSION}-dev" success "本地 Worker 镜像构建完成: docker-worker:${APP_VERSION}-dev" else error "开发模式下本地 Worker 镜像构建失败!" error "请检查构建错误并修复后重试" exit 1 fi else info "正在拉取: $WORKER_IMAGE" # 镜像加速通过 daemon.json 的 registry-mirrors 实现 PULL_IMAGE="$WORKER_IMAGE" if [ -n "$GIT_MIRROR" ]; then info "已配置 Docker 镜像加速,拉取将自动走加速通道" fi if docker pull "$PULL_IMAGE"; then success "Worker 镜像拉取完成" else error "Worker 镜像拉取失败,无法继续安装" error "镜像地址: $WORKER_IMAGE" echo if [ -z "$GIT_MIRROR" ]; then warn "如果您在中国大陆,建议使用 --mirror 参数启用加速:" echo -e " ${BOLD}sudo ./install.sh --mirror${RESET}" else warn "镜像加速已配置,但拉取仍然失败,可能原因:" echo -e " 1. 镜像源暂时不可用,请稍后重试" echo -e " 2. 网络连接问题" echo -e " 3. 镜像不存在或版本错误" fi echo exit 1 fi fi # ============================================================================== # 预下载 Nuclei 模板仓库(在容器外执行,支持 Git 加速) # ============================================================================== step "预下载 Nuclei 模板仓库..." NUCLEI_TEMPLATES_DIR="/opt/xingrin/nuclei-repos/nuclei-templates" NUCLEI_TEMPLATES_REPO="https://github.com/projectdiscovery/nuclei-templates.git" # 确保目录存在 mkdir -p /opt/xingrin/nuclei-repos if [ -d "$NUCLEI_TEMPLATES_DIR/.git" ]; then info "Nuclei 模板仓库已存在,跳过下载" else # 构建 clone URL(如果启用了 Git 加速) if [ -n "$GIT_MIRROR" ]; then CLONE_URL="${GIT_MIRROR}/${NUCLEI_TEMPLATES_REPO}" info "使用 Git 加速下载: $CLONE_URL" else CLONE_URL="$NUCLEI_TEMPLATES_REPO" fi # 执行 git clone if git clone --depth 1 "$CLONE_URL" "$NUCLEI_TEMPLATES_DIR"; then success "Nuclei 模板仓库下载完成" else warn "Nuclei 模板仓库下载失败,将在服务启动后重试" warn "您也可以稍后在 Web 界面「Nuclei 模板」中手动同步" fi fi # ============================================================================== # 启动服务 # ============================================================================== step "正在启动服务..." "$ROOT_DIR/start.sh" ${START_ARGS} --quiet # ============================================================================== # 完成总结 # ============================================================================== show_summary "success" ================================================ FILE: restart.sh ================================================ #!/bin/bash # 重启服务(Docker 部署) cd "$(dirname "$0")" exec ./docker/restart.sh ================================================ FILE: start.sh ================================================ #!/bin/bash # 启动服务(所有服务均在 Docker 中运行) # # 用法: # ./start.sh 生产模式 - 拉取 Docker Hub 镜像启动 # ./start.sh --dev 开发模式 - 本地构建镜像启动 # ./start.sh --no-frontend 只启动后端(前端手动启动) # ./start.sh --dev --no-frontend 开发模式 + 只启动后端 cd "$(dirname "$0")" exec ./docker/start.sh "$@" ================================================ FILE: stop.sh ================================================ #!/bin/bash # 停止服务(所有服务均在 Docker 中运行) cd "$(dirname "$0")" exec ./docker/stop.sh "$@" ================================================ FILE: uninstall.sh ================================================ #!/bin/bash set -e # ============================================================================== # 颜色定义 # ============================================================================== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' RESET='\033[0m' # ============================================================================== # 日志函数 # ============================================================================== info() { echo -e "${BLUE}[INFO]${RESET} $1" } success() { echo -e "${GREEN}[OK]${RESET} $1" } warn() { echo -e "${YELLOW}[WARN]${RESET} $1" } error() { echo -e "${RED}[ERROR]${RESET} $1" } step() { echo -e "\n${BOLD}${CYAN}>>> $1${RESET}" } header() { echo -e "${BOLD}${BLUE}============================================================${RESET}" echo -e "${BOLD}${BLUE} $1${RESET}" echo -e "${BOLD}${BLUE}============================================================${RESET}" } # ============================================================================== # 权限检查 # ============================================================================== if [ "$EUID" -ne 0 ]; then error "请使用 sudo 运行此脚本" echo -e " 正确用法: ${BOLD}sudo ./uninstall.sh${RESET}" exit 1 fi ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" DOCKER_DIR="$ROOT_DIR/docker" header "XingRin 一键卸载脚本 (Ubuntu)" info "项目路径: ${BOLD}$ROOT_DIR${RESET}" if [ ! -d "$DOCKER_DIR" ]; then error "未找到 docker 目录,请确认项目结构。" exit 1 fi # ============================================================================== # 1. 停止并删除全部容器/网络 # ============================================================================== step "[1/5] 是否停止并删除全部容器/网络?(Y/n)" read -r ans_stop ans_stop=${ans_stop:-Y} if [[ $ans_stop =~ ^[Yy]$ ]]; then info "正在停止并删除容器/网络..." cd "$DOCKER_DIR" if command -v docker compose >/dev/null 2>&1; then COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" fi # 先强制停止并删除可能占用网络的容器(xingrin-agent 等) docker rm -f xingrin-agent xingrin-watchdog 2>/dev/null || true # 清理所有可能的 XingRin 相关容器 docker ps -a | grep -E "(xingrin|docker-)" | awk '{print $1}' | xargs -r docker rm -f 2>/dev/null || true # 停止两种模式的容器(不带 -v,volume 在第 5 步单独处理) [ -f "docker-compose.yml" ] && ${COMPOSE_CMD} -f docker-compose.yml down 2>/dev/null || true [ -f "docker-compose.dev.yml" ] && ${COMPOSE_CMD} -f docker-compose.dev.yml down 2>/dev/null || true # 手动删除网络(以防 compose 未能删除) docker network rm xingrin_network docker_default 2>/dev/null || true success "容器和网络已停止/删除(如存在)。" else warn "已跳过停止/删除容器/网络。" fi # ============================================================================== # 2. 删除 /opt/xingrin 数据目录 # ============================================================================== OPT_XINGRIN_DIR="/opt/xingrin" step "[2/5] 是否删除数据目录 ($OPT_XINGRIN_DIR)?(Y/n)" echo -e " ${YELLOW}包含:扫描结果、日志、指纹库、字典、Nuclei 模板等${RESET}" read -r ans_data ans_data=${ans_data:-Y} if [[ $ans_data =~ ^[Yy]$ ]]; then info "正在删除数据目录..." rm -rf "$OPT_XINGRIN_DIR" success "已删除 $OPT_XINGRIN_DIR" else warn "已保留数据目录。" fi # ============================================================================== # 3. 删除 docker/.env 配置文件 # ============================================================================== ENV_FILE="$DOCKER_DIR/.env" step "[3/5] 是否删除配置文件 ($ENV_FILE)?(Y/n)" echo -e " ${YELLOW}注意:删除后下次安装将生成新的随机密码。${RESET}" read -r ans_env ans_env=${ans_env:-Y} if [[ $ans_env =~ ^[Yy]$ ]]; then info "正在删除配置文件..." rm -f "$ENV_FILE" success "已删除 $ENV_FILE。" else warn "已保留 $ENV_FILE。" fi # ============================================================================== # 4. 删除本地 Postgres 容器及数据卷(如果使用本地 DB) # ============================================================================== step "[4/5] 若使用本地 PostgreSQL 容器:是否删除数据库容器和 volume?(Y/n)" read -r ans_db ans_db=${ans_db:-Y} if [[ $ans_db =~ ^[Yy]$ ]]; then info "尝试删除与 XingRin 相关的 Postgres 容器和数据卷..." # 删除可能的容器名(不同 compose 版本命名不同) docker rm -f docker-postgres-1 xingrin-postgres postgres 2>/dev/null || true # 删除可能的 volume 名(取决于项目名和 compose 配置) # 先列出要删除的 volume for vol in postgres_data docker_postgres_data xingrin_postgres_data; do if docker volume inspect "$vol" >/dev/null 2>&1; then if docker volume rm "$vol" 2>/dev/null; then success "已删除 volume: $vol" else warn "无法删除 volume: $vol(可能正在被使用,请先停止所有容器)" fi fi done success "本地 Postgres 数据卷清理完成。" else warn "已保留本地 Postgres 容器和 volume。" fi step "[5/5] 是否删除与 XingRin 相关的 Docker 镜像?(Y/n)" read -r ans_images ans_images=${ans_images:-Y} if [[ $ans_images =~ ^[Yy]$ ]]; then info "正在删除 Docker 镜像..." # 从 .env 读取版本号,如果不存在则使用 latest if [ -f "$DOCKER_DIR/.env" ]; then DOCKER_USER=$(grep "^DOCKER_USER=" "$DOCKER_DIR/.env" | cut -d= -f2 || echo "yyhuni") IMAGE_TAG=$(grep "^IMAGE_TAG=" "$DOCKER_DIR/.env" | cut -d= -f2 || echo "latest") else DOCKER_USER="yyhuni" IMAGE_TAG="latest" fi # 删除指定版本的镜像 docker rmi "${DOCKER_USER}/xingrin-server:${IMAGE_TAG}" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-frontend:${IMAGE_TAG}" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-nginx:${IMAGE_TAG}" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-agent:${IMAGE_TAG}" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-worker:${IMAGE_TAG}" 2>/dev/null || true # 同时删除 latest 标签(如果存在) if [ "$IMAGE_TAG" != "latest" ]; then docker rmi "${DOCKER_USER}/xingrin-server:latest" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-frontend:latest" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-nginx:latest" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-agent:latest" 2>/dev/null || true docker rmi "${DOCKER_USER}/xingrin-worker:latest" 2>/dev/null || true fi docker rmi redis:7-alpine 2>/dev/null || true # 删除本地构建的开发镜像 docker rmi docker-server docker-frontend docker-nginx docker-agent docker-worker 2>/dev/null || true docker rmi "docker-worker:${IMAGE_TAG}-dev" 2>/dev/null || true success "Docker 镜像已删除(如存在)。" else warn "已保留 Docker 镜像。" fi # 清理构建缓存(可选,会导致下次构建变慢) echo "" echo -n -e "${BOLD}${CYAN}[?] 是否清理 Docker 构建缓存?(y/N) ${RESET}" echo -e "${YELLOW}(清理后下次构建会很慢,一般不需要)${RESET}" read -r ans_cache ans_cache=${ans_cache:-N} if [[ $ans_cache =~ ^[Yy]$ ]]; then info "清理 Docker 构建缓存..." docker builder prune -af 2>/dev/null || true success "构建缓存已清理。" else warn "已保留构建缓存(推荐)。" fi success "卸载流程已完成。" ================================================ FILE: update.sh ================================================ #!/bin/bash # ============================================ # XingRin 系统更新脚本 # 用途:更新代码 + 同步版本 + 重建镜像 + 重启服务 # ============================================ # # 更新流程: # 1. 停止服务 # 2. git pull 拉取最新代码 # 3. 合并 .env 新配置项 + 同步 VERSION # 4. 构建/拉取镜像(开发模式构建,生产模式拉取) # 5. 启动服务(server 启动时自动执行数据库迁移) # # 用法: # sudo ./update.sh 生产模式更新(拉取 Docker Hub 镜像) # sudo ./update.sh --dev 开发模式更新(本地构建镜像) # sudo ./update.sh --no-frontend 更新后只启动后端 # sudo ./update.sh --dev --no-frontend 开发环境更新后只启动后端 cd "$(dirname "$0")" # 权限检查 if [ "$EUID" -ne 0 ]; then printf "\033[0;31m✗ 请使用 sudo 运行此脚本\033[0m\n" printf " 正确用法: \033[1msudo ./update.sh\033[0m\n" exit 1 fi # 跨平台 sed -i(兼容 macOS 和 Linux) sed_inplace() { if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' "$@" else sed -i "$@" fi } # 解析参数判断模式 DEV_MODE=false for arg in "$@"; do case $arg in --dev) DEV_MODE=true ;; esac done # 颜色定义 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' BLUE='\033[0;34m' CYAN='\033[0;36m' DIM='\033[2m' BOLD='\033[1m' NC='\033[0m' # 日志函数 log_step() { printf "${CYAN}▶${NC} %s\n" "$1"; } log_ok() { printf " ${GREEN}✓${NC} %s\n" "$1"; } log_info() { printf " ${DIM}→${NC} %s\n" "$1"; } log_warn() { printf " ${YELLOW}!${NC} %s\n" "$1"; } log_error() { printf "${RED}✗${NC} %s\n" "$1"; } # 合并 .env 新配置项(保留用户已有值) merge_env_config() { local example_file="docker/.env.example" local env_file="docker/.env" if [ ! -f "$example_file" ] || [ ! -f "$env_file" ]; then return fi local new_keys=0 while IFS= read -r line || [ -n "$line" ]; do [[ -z "$line" || "$line" =~ ^# ]] && continue local key="${line%%=*}" [[ -z "$key" || "$key" == "$line" ]] && continue if ! grep -q "^${key}=" "$env_file"; then printf '%s\n' "$line" >> "$env_file" log_info "新增配置: $key" ((new_keys++)) fi done < "$example_file" if [ $new_keys -gt 0 ]; then log_ok "已添加 $new_keys 个新配置项" else log_ok "配置已是最新" fi } # 显示标题 printf "\n" printf "${BOLD}${BLUE}┌────────────────────────────────────────┐${NC}\n" if [ "$DEV_MODE" = true ]; then printf "${BOLD}${BLUE}│${NC} ${BOLD}XingRin 系统更新${NC} ${BOLD}${BLUE}│${NC}\n" printf "${BOLD}${BLUE}│${NC} ${DIM}开发模式 · 本地构建${NC} ${BOLD}${BLUE}│${NC}\n" else printf "${BOLD}${BLUE}│${NC} ${BOLD}XingRin 系统更新${NC} ${BOLD}${BLUE}│${NC}\n" printf "${BOLD}${BLUE}│${NC} ${DIM}生产模式 · Docker Hub${NC} ${BOLD}${BLUE}│${NC}\n" fi printf "${BOLD}${BLUE}└────────────────────────────────────────┘${NC}\n" printf "\n" # 警告提示 printf "${YELLOW}┌─ 注意事项 ─────────────────────────────┐${NC}\n" printf "${YELLOW}│${NC} • 此功能为测试性功能,可能导致升级失败 ${YELLOW}│${NC}\n" printf "${YELLOW}│${NC} • 升级会覆盖所有默认引擎配置 ${YELLOW}│${NC}\n" printf "${YELLOW}│${NC} • 自定义配置请先备份或创建新引擎 ${YELLOW}│${NC}\n" printf "${YELLOW}│${NC} • 推荐:卸载后重新安装以获得最佳体验 ${YELLOW}│${NC}\n" printf "${YELLOW}└────────────────────────────────────────┘${NC}\n" printf "\n" printf "${YELLOW}是否继续更新?${NC} [y/N] " read -r ans_continue ans_continue=${ans_continue:-N} if [[ ! $ans_continue =~ ^[Yy]$ ]]; then printf "\n${DIM}已取消更新${NC}\n" exit 0 fi printf "\n" # Step 1: 停止服务 log_step "停止服务..." ./stop.sh 2>&1 | sed 's/^/ /' log_ok "服务已停止" # Step 2: 拉取代码 printf "\n" log_step "拉取最新代码..." if git pull --rebase 2>&1 | sed 's/^/ /'; then log_ok "代码已更新" else log_error "git pull 失败,请手动解决冲突后重试" exit 1 fi # Step 3: 检查配置更新 + 版本同步 printf "\n" log_step "同步配置..." merge_env_config # 版本同步:从 VERSION 文件更新 IMAGE_TAG if [ -f "VERSION" ]; then NEW_VERSION=$(cat VERSION | tr -d '[:space:]') if [ -n "$NEW_VERSION" ]; then if grep -q "^IMAGE_TAG=" "docker/.env"; then sed_inplace "s/^IMAGE_TAG=.*/IMAGE_TAG=$NEW_VERSION/" "docker/.env" else printf '%s\n' "IMAGE_TAG=$NEW_VERSION" >> "docker/.env" fi log_ok "版本同步: $NEW_VERSION" fi fi # Step 4: 构建/拉取镜像 printf "\n" log_step "更新镜像..." if [ "$DEV_MODE" = true ]; then # 开发模式:本地构建所有镜像(包括 Worker) log_info "构建 Worker 镜像..." # 读取 IMAGE_TAG IMAGE_TAG=$(grep "^IMAGE_TAG=" "docker/.env" | cut -d'=' -f2) if [ -z "$IMAGE_TAG" ]; then IMAGE_TAG="dev" fi # 构建 Worker 镜像(Worker 是临时容器,不在 compose 中,需要单独构建) docker build -t docker-worker -f docker/worker/Dockerfile . 2>&1 | sed 's/^/ /' docker tag docker-worker docker-worker:${IMAGE_TAG} 2>&1 | sed 's/^/ /' log_ok "Worker 镜像: docker-worker:${IMAGE_TAG}" log_info "其他服务镜像将在启动时构建" else log_info "镜像将在启动时从 Docker Hub 拉取" fi # Step 5: 启动服务 printf "\n" log_step "启动服务..." ./start.sh "$@" # 完成提示 printf "\n" printf "${GREEN}┌────────────────────────────────────────┐${NC}\n" printf "${GREEN}│${NC} ${BOLD}${GREEN}✓${NC} ${BOLD}更新完成${NC} ${GREEN}│${NC}\n" printf "${GREEN}└────────────────────────────────────────┘${NC}\n" printf "\n"