Censys使用教程#

软件介绍#

Censys是一款强大的互联网搜索引擎和安全平台,用于发现网络设备、服务和基础设施。它提供对全球互联网设备的实时视图,支持搜索、监控和分析网络资产,是网络安全研究和威胁情报收集的重要工具。

主要功能#

  • 互联网设备搜索和发现
  • 证书透明度日志查询
  • 网络资产监控
  • 安全漏洞扫描
  • 威胁情报收集
  • 攻击面管理
  • 合规性检查
  • 自动化API接口

适用场景#

  • 网络安全研究
  • 渗透测试
  • 资产发现和管理
  • 威胁情报收集
  • 安全评估
  • 攻击面分析

入门级使用#

安装Censys CLI#

使用pip安装#

# 安装Censys命令行工具
pip install censys

# 验证安装
censys --version

使用Docker安装#

# 使用Docker运行Censys
docker run -it --rm censys/censys:latest

# 或安装到本地
docker pull censys/censys:latest

注册账号和获取API密钥#

注册Censys账号#

  1. 访问 https://search.censys.io/
  2. 点击"Sign Up"注册免费账号
  3. 验证邮箱地址
  4. 登录获取API ID和API Secret

配置API密钥#

# 配置API密钥
censys config

# 按提示输入API ID和API Secret

# 或设置环境变量
export CENSYS_API_ID="your_api_id"
export CENSYS_API_SECRET="your_api_secret"

基本搜索#

搜索特定IP#

# 搜索特定IP地址
censys search ip:8.8.8.8

# 输出示例
Found 1 result

8.8.8.8
  Autonomous System: AS15169 Google LLC
  Location: Mountain View, California, United States
  Operating System: Linux
  Services:
    - 53/tcp: DNS
    - 443/tcp: HTTPS

搜索特定端口#

# 搜索开放特定端口的设备
censys search "services.port:443"

# 搜索开放多个端口的设备
censys search "services.port:22 and services.port:80"

搜索特定服务#

# 搜索运行Apache的设备
censys search "services.software.product:Apache"

# 搜索运行Nginx的设备
censys search "services.software.product:Nginx"

初级使用#

高级搜索语法#

布尔运算符#

# AND运算符
censys search "services.port:80 and services.port:443"

# OR运算符
censys search "services.software.product:Apache or services.software.product:Nginx"

# NOT运算符
censys search "services.port:80 and not services.software.product:Apache"

通配符搜索#

# 使用通配符搜索
censys search "services.software.product:Apache*"

# 搜索特定国家
censys search "location.country_code:US"

范围搜索#

# 搜索特定IP范围
censys search "ip:[1.1.1.1 TO 1.1.1.100]"

# 搜索特定ASN范围
censys search "autonomous_system.asn:[15169 TO 15200]"

按地理位置搜索#

按国家搜索#

# 搜索美国的设备
censys search "location.country_code:US"

# 搜索中国的设备
censys search "location.country_code:CN"

# 搜索多个国家
censys search "location.country_code:(US OR CN OR JP)"

按城市搜索#

# 搜索特定城市的设备
censys search "location.city:Mountain View"

# 搜索特定地区的设备
censys search "location.province:California"

按服务搜索#

搜索Web服务器#

# 搜索HTTP服务器
censys search "services.service_name:HTTP"

# 搜索HTTPS服务器
censys search "services.service_name:HTTPS"

# 搜索FTP服务器
censys search "services.service_name:FTP"

搜索数据库服务#

# 搜索MySQL服务器
censys search "services.service_name:MYSQL"

# 搜索PostgreSQL服务器
censys search "services.service_name:POSTGRESQL"

# 搜索MongoDB服务器
censys search "services.service_name:MONGODB"

中级使用#

证书搜索#

搜索SSL证书#

# 搜索特定域名的证书
censys search "parsed.names:example.com"

# 搜索特定CA颁发的证书
censys search "parsed.issuer.common_name:Let's Encrypt"

# 搜索即将过期的证书
censys search "parsed.validity.not_after:[NOW TO NOW+30d]"

搜索证书信息#

# 搜索自签名证书
censys search "parsed.extensions.self_signed:true"

# 搜索通配符证书
censys search "parsed.names:*"

# 搜索特定组织的证书
censys search "parsed.subject.organization:Google"

网络资产监控#

监控特定IP#

# 监控特定IP的变化
censys view 8.8.8.8

# 查看IP的历史变化
censys view 8.8.8.8 --at-time "2024-01-01"

监控特定ASN#

# 搜索特定ASN的所有设备
censys search "autonomous_system.asn:15169"

# 搜索特定ASN的特定服务
censys search "autonomous_system.asn:15169 and services.port:443"

批量查询#

从文件批量查询#

#!/bin/bash
# 批量查询IP信息

IP_FILE="ip_list.txt"
OUTPUT_FILE="censys_results.txt"

while read ip; do
    echo "=== $ip ===" >> "$OUTPUT_FILE"
    censys view "$ip" >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
done < "$IP_FILE"

echo "批量查询完成,结果已保存到 $OUTPUT_FILE"

批量搜索#

#!/bin/bash
# 批量搜索不同条件

SEARCH_TERMS=(
    "services.port:22"
    "services.port:3306"
    "services.port:6379"
    "services.port:27017"
)

OUTPUT_FILE="batch_search_results.txt"

for term in "${SEARCH_TERMS[@]}"; do
    echo "=== 搜索: $term ===" >> "$OUTPUT_FILE"
    censys search "$term" --max-records 10 >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
done

echo "批量搜索完成"

中上级使用#

高级过滤#

按操作系统过滤#

# 搜索Windows设备
censys search "operating_system.os:Windows"

# 搜索Linux设备
censys search "operating_system.os:Linux"

# 搜索特定版本的操作系统
censys search "operating_system.os:Ubuntu 20.04"

按软件版本过滤#

# 搜索特定版本的软件
censys search "services.software.version:2.4.41"

# 搜索包含特定漏洞的设备
censys search "services.software.version:2.4.41 and services.service_name:HTTP"

数据导出#

导出为JSON#

# 导出搜索结果为JSON
censys search "services.port:443" --format json > results.json

# 导出特定字段
censys search "services.port:443" --format json --fields ip,location.country_code,location.city > results.json

导出为CSV#

# 导出搜索结果为CSV
censys search "services.port:443" --format csv > results.csv

# 导出特定字段
censys search "services.port:443" --format csv --fields ip,location.country_code,location.city > results.csv

API编程#

Python API示例#

#!/usr/bin/env python3
from censys.search import CensysHosts

# 初始化API
h = CensysHosts(api_id="your_api_id", api_secret="your_api_secret")

# 搜索特定端口
query = h.search("services.port:443", fields=["ip", "location.country_code", "location.city"])

# 遍历结果
for page in query:
    for host in page:
        print(f"IP: {host['ip']}")
        print(f"国家: {host['location']['country_code']}")
        print(f"城市: {host['location']['city']}")
        print()

批量查询示例#

#!/usr/bin/env python3
from censys.search import CensysHosts
import json

# 初始化API
h = CensysHosts(api_id="your_api_id", api_secret="your_api_secret")

# 批量查询IP列表
ip_list = ["8.8.8.8", "1.1.1.1", "208.67.222.222"]
results = []

for ip in ip_list:
    try:
        host = h.view(ip)
        results.append(host)
        print(f"查询成功: {ip}")
    except Exception as e:
        print(f"查询失败: {ip} - {e}")

# 保存结果
with open("censys_results.json", "w") as f:
    json.dump(results, f, indent=2)

print("批量查询完成")

高级使用#

攻击面分析#

分析组织攻击面#

#!/bin/bash
# 组织攻击面分析脚本

DOMAIN="example.com"
OUTPUT_DIR="attack_surface_analysis"
mkdir -p "$OUTPUT_DIR"

# 搜索组织的所有证书
echo "=== 证书分析 ===" > "$OUTPUT_DIR/certificates.txt"
censys search "parsed.names:$DOMAIN" --max-records 100 >> "$OUTPUT_DIR/certificates.txt"

# 搜索组织的所有IP
echo "=== IP地址分析 ===" > "$OUTPUT_DIR/ips.txt"
censys search "parsed.names:$DOMAIN" --fields ip --format csv | cut -d',' -f1 | sort -u >> "$OUTPUT_DIR/ips.txt"

# 分析每个IP的服务
echo "=== 服务分析 ===" > "$OUTPUT_DIR/services.txt"
while read ip; do
    echo "=== $ip ===" >> "$OUTPUT_DIR/services.txt"
    censys view "$ip" >> "$OUTPUT_DIR/services.txt"
    echo "" >> "$OUTPUT_DIR/services.txt"
done < "$OUTPUT_DIR/ips.txt"

echo "攻击面分析完成,结果保存在 $OUTPUT_DIR 目录"

子域名发现#

#!/bin/bash
# 子域名发现脚本

DOMAIN="example.com"
OUTPUT_FILE="subdomains.txt"

# 搜索包含域名的证书
censys search "parsed.names:*.$DOMAIN" --fields parsed.names --format csv | \
    grep -o "[a-zA-Z0-9-]*\.$DOMAIN" | \
    sort -u > "$OUTPUT_FILE"

echo "发现 $(wc -l < "$OUTPUT_FILE") 个子域名"
echo "子域名列表已保存到 $OUTPUT_FILE"

漏洞扫描#

搜索易受攻击的设备#

#!/bin/bash
# 搜索易受攻击的设备脚本

OUTPUT_FILE="vulnerable_devices.txt"

# 搜索运行旧版本Apache的设备
echo "=== 旧版本Apache设备 ===" > "$OUTPUT_FILE"
censys search "services.software.product:Apache and services.software.version:2.4.* and services.software.version:<2.4.50" --max-records 50 >> "$OUTPUT_FILE"

# 搜索运行旧版本Nginx的设备
echo "=== 旧版本Nginx设备 ===" >> "$OUTPUT_FILE"
censys search "services.software.product:Nginx and services.software.version:1.18.* and services.software.version:<1.18.1" --max-records 50 >> "$OUTPUT_FILE"

# 搜索开放危险端口的设备
echo "=== 开放危险端口的设备 ===" >> "$OUTPUT_FILE"
censys search "services.port:23" --max-records 50 >> "$OUTPUT_FILE"

echo "漏洞扫描完成,结果已保存到 $OUTPUT_FILE"

检测配置错误#

#!/bin/bash
# 检测配置错误脚本

OUTPUT_FILE="misconfigurations.txt"

# 搜索未加密的FTP服务
echo "=== 未加密的FTP服务 ===" > "$OUTPUT_FILE"
censys search "services.service_name:FTP and not services.tls.certificate.parsed.names:*" --max-records 50 >> "$OUTPUT_FILE"

# 搜索弱SSL配置
echo "=== 弱SSL配置 ===" >> "$OUTPUT_FILE"
censys search "services.tls.certificate.parsed.names:* and services.tls.version:TLSv1.0" --max-records 50 >> "$OUTPUT_FILE"

# 搜索开放的管理端口
echo "=== 开放的管理端口 ===" >> "$OUTPUT_FILE"
censys search "services.port:3389" --max-records 50 >> "$OUTPUT_FILE"

echo "配置错误检测完成,结果已保存到 $OUTPUT_FILE"

大师级使用#

自动化监控#

持续监控脚本#

#!/bin/bash
# 持续监控脚本

MONITOR_TARGET="example.com"
OUTPUT_DIR="monitoring"
INTERVAL=3600  # 每小时检查一次
mkdir -p "$OUTPUT_DIR"

while true; do
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    LOG_FILE="$OUTPUT_DIR/monitor_$TIMESTAMP.txt"
    
    echo "=== 监控时间: $(date) ===" > "$LOG_FILE"
    
    # 搜索新的证书
    echo "=== 新证书 ===" >> "$LOG_FILE"
    censys search "parsed.names:$MONITOR_TARGET" --max-records 100 >> "$LOG_FILE"
    
    # 搜索新的IP
    echo "=== 新IP地址 ===" >> "$LOG_FILE"
    censys search "parsed.names:$MONITOR_TARGET" --fields ip --format csv | cut -d',' -f1 | sort -u >> "$LOG_FILE"
    
    # 搜索开放端口
    echo "=== 开放端口 ===" >> "$LOG_FILE"
    while read ip; do
        censys view "$ip" >> "$LOG_FILE"
    done < <(censys search "parsed.names:$MONITOR_TARGET" --fields ip --format csv | cut -d',' -f1 | sort -u)
    
    echo "监控完成,结果已保存到 $LOG_FILE"
    sleep "$INTERVAL"
done

变化检测#

#!/bin/bash
# 变化检测脚本

TARGET="example.com"
PREVIOUS_FILE="previous_state.txt"
CURRENT_FILE="current_state.txt"
CHANGES_FILE="changes.txt"

# 获取当前状态
censys search "parsed.names:$TARGET" --max-records 100 > "$CURRENT_FILE"

# 检查是否有变化
if [ -f "$PREVIOUS_FILE" ]; then
    diff "$PREVIOUS_FILE" "$CURRENT_FILE" > "$CHANGES_FILE"
    
    if [ -s "$CHANGES_FILE" ]; then
        echo "$(date): 检测到变化" >> change_log.txt
        cat "$CHANGES_FILE" >> change_log.txt
        echo "检测到变化,详情已记录到 change_log.txt"
    else
        echo "未检测到变化"
    fi
fi

# 保存当前状态
cp "$CURRENT_FILE" "$PREVIOUS_FILE"

数据分析#

统计分析#

#!/usr/bin/env python3
from censys.search import CensysHosts
import json
from collections import Counter

# 初始化API
h = CensysHosts(api_id="your_api_id", api_secret="your_api_secret")

# 搜索特定端口
query = h.search("services.port:443", fields=["ip", "location.country_code", "services.software.product"])

# 统计数据
countries = []
products = []

for page in query:
    for host in page:
        if 'location' in host and 'country_code' in host['location']:
            countries.append(host['location']['country_code'])
        if 'services' in host:
            for service in host['services']:
                if 'software' in service and 'product' in service['software']:
                    products.append(service['software']['product'])

# 输出统计结果
print("=== 国家分布 ===")
country_counter = Counter(countries)
for country, count in country_counter.most_common(10):
    print(f"{country}: {count}")

print("\n=== 软件分布 ===")
product_counter = Counter(products)
for product, count in product_counter.most_common(10):
    print(f"{product}: {count}")

地理分布分析#

#!/usr/bin/env python3
from censys.search import CensysHosts
import json

# 初始化API
h = CensysHosts(api_id="your_api_id", api_secret="your_api_secret")

# 搜索特定ASN
query = h.search("autonomous_system.asn:15169", fields=["ip", "location.country_code", "location.city", "location.latitude", "location.longitude"])

# 生成地图数据
map_data = []

for page in query:
    for host in page:
        if 'location' in host and 'latitude' in host['location'] and 'longitude' in host['location']:
            map_data.append({
                'ip': host['ip'],
                'country': host['location'].get('country_code', ''),
                'city': host['location'].get('city', ''),
                'lat': host['location']['latitude'],
                'lon': host['location']['longitude']
            })

# 保存地图数据
with open("map_data.json", "w") as f:
    json.dump(map_data, f, indent=2)

print(f"生成了 {len(map_data)} 个地理数据点")

实战案例#

案例1: 企业资产发现#

场景描述#

发现和管理企业的网络资产,包括服务器、域名、证书等。

实施步骤#

#!/bin/bash
# 企业资产发现脚本

DOMAIN="example.com"
OUTPUT_DIR="asset_discovery"
mkdir -p "$OUTPUT_DIR"

# 1. 发现所有证书
echo "=== 证书发现 ===" > "$OUTPUT_DIR/certificates.txt"
censys search "parsed.names:$DOMAIN" --max-records 500 > "$OUTPUT_DIR/certificates.txt"

# 2. 提取所有域名
echo "=== 域名列表 ===" > "$OUTPUT_DIR/domains.txt"
censys search "parsed.names:$DOMAIN" --fields parsed.names --format csv | \
    grep -o "[a-zA-Z0-9-]*\.$DOMAIN" | \
    sort -u > "$OUTPUT_DIR/domains.txt"

# 3. 提取所有IP地址
echo "=== IP地址列表 ===" > "$OUTPUT_DIR/ips.txt"
censys search "parsed.names:$DOMAIN" --fields ip --format csv | \
    cut -d',' -f1 | sort -u > "$OUTPUT_DIR/ips.txt"

# 4. 分析每个IP的服务
echo "=== 服务分析 ===" > "$OUTPUT_DIR/services.txt"
while read ip; do
    echo "=== $ip ===" >> "$OUTPUT_DIR/services.txt"
    censys view "$ip" >> "$OUTPUT_DIR/services.txt"
    echo "" >> "$OUTPUT_DIR/services.txt"
done < "$OUTPUT_DIR/ips.txt"

# 5. 统计开放端口
echo "=== 端口统计 ===" > "$OUTPUT_DIR/ports.txt"
censys search "parsed.names:$DOMAIN" --fields services.port --format csv | \
    cut -d',' -f1 | sort | uniq -c | sort -rn >> "$OUTPUT_DIR/ports.txt"

echo "资产发现完成,结果保存在 $OUTPUT_DIR 目录"

案例2: 安全评估#

场景描述#

对目标网络进行安全评估,识别潜在的安全风险和漏洞。

实施步骤#

#!/bin/bash
# 安全评估脚本

TARGET="example.com"
OUTPUT_DIR="security_assessment"
mkdir -p "$OUTPUT_DIR"

# 1. 识别开放端口
echo "=== 开放端口 ===" > "$OUTPUT_DIR/open_ports.txt"
censys search "parsed.names:$TARGET" --fields services.port --format csv | \
    cut -d',' -f1 | sort -u >> "$OUTPUT_DIR/open_ports.txt"

# 2. 识别运行的服务
echo "=== 运行的服务 ===" > "$OUTPUT_DIR/services.txt"
censys search "parsed.names:$TARGET" --fields services.service_name --format csv | \
    cut -d',' -f1 | sort | uniq -c | sort -rn >> "$OUTPUT_DIR/services.txt"

# 3. 识别软件版本
echo "=== 软件版本 ===" > "$OUTPUT_DIR/versions.txt"
censys search "parsed.names:$TARGET" --fields services.software.product,services.software.version --format csv >> "$OUTPUT_DIR/versions.txt"

# 4. 识别SSL/TLS配置
echo "=== SSL/TLS配置 ===" > "$OUTPUT_DIR/ssl_config.txt"
censys search "parsed.names:$TARGET and services.port:443" --fields services.tls.version --format csv | \
    sort | uniq -c >> "$OUTPUT_DIR/ssl_config.txt"

# 5. 识别潜在漏洞
echo "=== 潜在漏洞 ===" > "$OUTPUT_DIR/vulnerabilities.txt"

# 检查旧版本Apache
censys search "parsed.names:$TARGET and services.software.product:Apache and services.software.version:2.4.* and services.software.version:<2.4.50" --max-records 10 >> "$OUTPUT_DIR/vulnerabilities.txt"

# 检查旧版本Nginx
censys search "parsed.names:$TARGET and services.software.product:Nginx and services.software.version:1.18.* and services.software.version:<1.18.1" --max-records 10 >> "$OUTPUT_DIR/vulnerabilities.txt"

# 检查弱SSL配置
censys search "parsed.names:$TARGET and services.tls.version:TLSv1.0" --max-records 10 >> "$OUTPUT_DIR/vulnerabilities.txt"

echo "安全评估完成,结果保存在 $OUTPUT_DIR 目录"

案例3: 威胁情报收集#

场景描述#

收集威胁情报,识别与目标相关的潜在威胁和攻击者。

实施步骤#

#!/bin/bash
# 威胁情报收集脚本

TARGET_IP="192.168.1.1"
OUTPUT_DIR="threat_intelligence"
mkdir -p "$OUTPUT_DIR"

# 1. 查询IP的详细信息
echo "=== IP详细信息 ===" > "$OUTPUT_DIR/ip_details.txt"
censys view "$TARGET_IP" > "$OUTPUT_DIR/ip_details.txt"

# 2. 查询同一ASN的其他IP
ASN=$(censys view "$TARGET_IP" | grep "autonomous_system.asn" | cut -d':' -f2 | xargs)
echo "=== 同ASN的其他IP ===" > "$OUTPUT_DIR/same_asn.txt"
censys search "autonomous_system.asn:$ASN" --max-records 100 > "$OUTPUT_DIR/same_asn.txt"

# 3. 查询同一国家的其他IP
COUNTRY=$(censys view "$TARGET_IP" | grep "location.country_code" | cut -d':' -f2 | xargs)
echo "=== 同国家的其他IP ===" > "$OUTPUT_DIR/same_country.txt"
censys search "location.country_code:$COUNTRY" --max-records 100 > "$OUTPUT_DIR/same_country.txt"

# 4. 查询使用相同证书的IP
CERT_HASH=$(censys view "$TARGET_IP" | grep "services.tls.certificate.parsed.fingerprint_sha256" | head -1 | cut -d':' -f2- | xargs)
if [ -n "$CERT_HASH" ]; then
    echo "=== 使用相同证书的IP ===" > "$OUTPUT_DIR/same_cert.txt"
    censys search "services.tls.certificate.parsed.fingerprint_sha256:$CERT_HASH" --max-records 100 > "$OUTPUT_DIR/same_cert.txt"
fi

# 5. 查询开放相同端口的IP
PORTS=$(censys view "$TARGET_IP" | grep "services.port" | cut -d':' -f2 | xargs | tr ' ' ',')
echo "=== 开放相同端口的IP ===" > "$OUTPUT_DIR/same_ports.txt"
censys search "services.port:($PORTS)" --max-records 100 > "$OUTPUT_DIR/same_ports.txt"

echo "威胁情报收集完成,结果保存在 $OUTPUT_DIR 目录"

总结#

Censys是一款功能强大的互联网搜索引擎和安全平台,为网络安全研究和威胁情报收集提供了全面的工具。

核心优势#

  • 全球覆盖: 拥有全球互联网设备的实时视图
  • 深度搜索: 支持复杂的搜索语法和过滤条件
  • 实时数据: 提供实时的网络设备信息
  • API支持: 提供强大的API接口,支持自动化
  • 证书透明度: 集成证书透明度日志,便于证书分析

应用场景#

  • 网络安全研究和渗透测试
  • 企业资产发现和管理
  • 威胁情报收集和分析
  • 安全评估和漏洞扫描
  • 攻击面管理
  • 合规性检查

最佳实践#

  1. API密钥管理: 妥善保管API密钥,避免泄露
  2. 查询优化: 使用精确的搜索条件,减少不必要的数据传输
  3. 结果过滤: 使用字段过滤,只获取需要的信息
  4. 批量操作: 使用脚本或API进行批量查询
  5. 数据缓存: 缓存查询结果,减少重复查询

使用限制#

  • 免费版:每月250次查询,每次最多100条结果
  • 付费版:更高的查询限制和更多功能
  • 需要遵守使用条款和服务协议

通过掌握Censys的各种功能和使用技巧,可以有效地进行网络资产发现、安全评估和威胁情报收集,为网络安全工作提供有力支持。