Kali 里装完 amass,第一件事是运行amass -version,结果终端只回了一行:
sudo: libpostal_data: command not found没有版本号,没有用法,什么都没有。我以为是装失败了,重装了三遍,dpkg -l显示包好好地在那儿,5.1.1-0kali1。
真正的原因在半小时后才搞清楚。Kali 的/usr/bin/amass不是二进制,是个 shell 脚本:
file /usr/bin/amass/usr/bin/amass: POSIX shell script, ASCII text executable打开看,前几行是:
#!/bin/sh set -e if [ ! -e /usr/share/libpostal/transliteration ]; then sudo libpostal_data download all /var/lib/libpostal fi /usr/lib/amass/amass "$@"它先检查一个叫 libpostal 的可选依赖在不在,不在就去下载。我这台机器没装 libpostal,sudo libpostal_data直接报 command not found,加上上面那句set -e,脚本就此退出,后面真正的二进制一次都没跑起来。
所以任何人第一次在 Kali 上敲 amass 都会撞上这个。知道了原因,处理起来就三选一。
最省事的是绕开这个壳,命令直接写全路径:
/usr/lib/amass/amass -versionv5.1.1第二种是骗过它的检查,造个空文件放在它找的位置:
sudo mkdir -p /usr/share/libpostal && sudo touch /usr/share/libpostal/transliteration之后amass就能正常起。这个文件本身是空的,libpostal 真正的用途是把街道地址做音译解析,跟你要扫域名没关系,官方把它列成可选件。
第三种是按官方文档老老实实编译 libpostal 再自己编译 amass,数据包是 GB 级的,新手没必要走这条。下面所有命令我都用全路径写。
先把规矩说清楚
amass 是给一个域名,把这家组织名下的子域名、IP、网段、ASN、证书、联系人翻出来的工具。它默认几乎不发包给目标,靠公开数据源和 DNS 查询。
但它的-active模式会真的去连目标,做区域传送、抓证书、爬站。官方教程原话是 ensure you are authorized to perform active searches against the target。
所以练手的目标只有两类:自己搭的靶场,和公开声明欢迎扫描的实验域名,比如 scanme.nmap.org。别人的域名、别人的服务器,没有书面授权就别碰。《刑法》第 285、286 条管的就是这个。
它干的是侦察链最前面那一段
给一个域名,它回答的是这些问题:这个组织还有哪些子域名活着,它们解析到哪些 IP,这些 IP 属于哪个网段、哪个 ASN,HTTPS 证书里露出过哪些名字,谁是这堆资产的注册联系人。
| 它做 | 它不做 |
|---|---|
| 域名、子域名、IP、网段、ASN、证书、联系人,织成一张资产图谱 | 端口扫描 |
| 靠 60 多个公开数据源加 DNS 枚举来收集 | 密码爆破、漏洞利用 |
| 把结果存进图数据库,支持增量对比 | 帮你判断这些资产该怎么用 |
数据源那一头挺杂。API 类的有 45 个,Shodan、VirusTotal、FOFA、Censys、SecurityTrails 这些都在里面。证书类的 8 个,靠证书透明日志反查名字,crt.sh 是典型。DNS 枚举那头有字典爆破、反向 DNS 扫段、NSEC 走区、区域传送。另外还有路由类、爬虫类、网页归档类、WHOIS 类各一批。
没 API KEY 也能跑。表里一多半是免费匿名查询,要 KEY 的(Shodan、VirusTotal、Censys 这些)在配置里空着就行,没填的源会被跳过,不会崩。
v5 和你搜到的教程不是一个东西
这一点最重要。现在网上能搜到的 amass 中文教程,绝大多数是 v3 时代的,讲的还是amass intel、amass enum、amass db三件套。我装的 v5.1.1 里没有 intel,也没有 db。
看它的帮助就能看清当前的真实命令:
amass -hUsage: amass [assoc|engine|enum|subs|track|viz] [options] Subcommands: assoc Query the OAM along the walk defined by the triples engine Run the Amass collection engine to populate the OAM database enum Interface with the engine that performs enumerations subs Analyze and present discovered subdomains track Analyze OAM data to identify newly discovered assets viz Analyze OAM data to generate graph visualizations六个子命令,各管一头:enum是入口,配范围、发起侦察;engine是采集引擎,枚举时会自动拉起来;subs查已发现的子域名;track跟上次扫描比新增;viz出可视化文件;assoc做图数据库的三元组查询,这一篇不碰。
顺手记两个小坑。amass version会报 subcommand provided but not defined,v5 没有 version 这个子命令,只能用-version。man amass也没有,Kali 这个包没带 man 页,只能靠-h和官方文档。
结果存在哪儿
v5 把发现的东西存进一个叫 OAM 的图数据库,Open Asset Model 的缩写。默认落在~/.config/amass/asset.db,是个 SQLite 文件,跑起来会多出asset.db-shm和asset.db-wal两个伴生文件。
它存的不是一张表,是一张图。节点按资产类型分:FQDN、IPAddress、Netblock、AutonomousSystem、TLSCertificate、ContactRecord、Organization,官方说有 21 类。边是它们之间的关系:a_record、ptr_record、contains、announces、registration、subsidiary 这些。
所以 amass 的产物不是一个 txt 列表,是可以反复查、能拿上次结果做对照的资产图谱。这也解释了为什么 v5 干脆把-json、-csv这类导出旗标去掉了,库本身就是产物。
跑通第一次
用 scanme.nmap.org,这个域名公开声明欢迎扫描。
/usr/lib/amass/amass enum -d scanme.nmap.org屏幕上先是一个 ASCII logo,然后是一条不断被覆盖的进度条:
0 / 1 [______________________] 0.00% ? p/s 4 / 8 [--->_________________] 50.00% 7 p/s 7 / 8 [------------->_______] 87.50% 3 p/s 8 / 8 [-------------------->] 100.00% 0 p/s左边是已完成和总的查询任务数,右边是每秒完成几个。一行覆盖一行,看着像卡住,其实在动。
同时后台起了一个引擎进程,占着 4000 端口:
pgrep -af amass20588 /usr/lib/amass/amass engine端口那头也占着 4000:
LISTEN 0 4096 *:4000 *:* users:(("amass",pid=20588,fd=16))扫完没有任何总结输出,不打印发现了什么,也不统计。v5 就是这个设计,结果全在库里。我这次跑了大概四五分钟。
库里到底存了什么
直接查 SQLite:
sqlite3 ~/.config/amass/asset.db "SELECT fqdn FROM fqdn LIMIT 10;"scanme.nmap.org f.2.b.b.8.1.e.f.f.f.1.9.c.3.0.f.0.0.0.0.0.0.0.0.1.0.c.3.0.0.6.2.ip6.arpa rdap.apnic.net akamai.com 156.32.33.45.in-addr.arpa那两条.arpa是反查记录,rdap.apnic.net和akamai.com是从 IP 反查出来的归属信息,不是 scanme 的子域名。
数一下各类节点,我这次的账是:
autnumrecord 1 | autonomoussystem 1 | contactrecord 4 | fqdn 5 ipaddress 2 | netblock 2 | organization 4 | phone 3 | url 4 | identifier 31边那头,出现最多的是id33、subsidiary4、dns_record4、url3、phone3,再往下是ptr_record2、contains2、announces2。
四五分钟的活,换回来一个域名、两个 IP、两个网段、一条 ASN 记录、几个联系人和 URL,全部互相连着。这就是所谓资产图谱的实际样子。
三种模式,差别在碰不碰目标
| 模式 | 参数 | 干什么 |
|---|---|---|
| 默认 | 不加参数 | 从数据源拿种子,再用 DNS 验证一遍,并继续在范围内扩展名字空间 |
| 只查 | -passive | 只拿数据源的结果,不做 DNS 验证,照单全收 |
| 主动 | -active | 在默认模式基础上,去连已发现的资产,抓 TLS 证书、试区域传送、走 NSEC、爬站 |
默认模式最常见,白天跑它就行。它是靠 DNS 判断"这个子域名还活着没有",所以比 passive 干净。
-passive适合只想知道这域名历史上露出过什么名字,比如做钓鱼域名盘点。它在-h里标着 Deprecated since passive is the default setting,意思是官方认为现在默认就近被动,但参数还能用。
-active会发包,-p 80,443,8080可以指定端口,默认 80 和 443。再说一遍,只对书面授权的资产用。
一次枚举要定的四件事
| 定什么 | 参数 |
|---|---|
| 目标 | -d a.com,b.com或-df domains.txt |
| 模式 | 默认、-passive、-active |
| 用哪些数据源 | -include、-exclude,或配置文件里配 KEY |
| 结果存哪 | 默认~/.config/amass/asset.db,或-dir PATH |
后两项里有坑。-dir在 5.1.1 上有个实际问题:你以为结果会写进-dir指定的目录,实际上 enum 自动拉起的引擎还是写默认库。我自己试过,-dir目录里最后没有 asset.db 数据。所以读结果就去默认库读,别指望 -dir。
-log的路径也是按-dir那个库目录做相对拼接的。写绝对路径会报 failed to open the log file,然后直接退出。
配置文件
它会自己找配置,顺序是:命令行-config,环境变量AMASS_CONFIG,然后$XDG_CONFIG_HOME/amass/config.yaml、$HOME/.config/amass/config.yaml、/etc/amass/config.yaml。
跑过一次之后,默认目录里会有一份自动写下的config.yaml,长这样:
scope: ports: - 80 - 443 - 8000 - 8080 - 8443 - 8888 options: datasources: "./datasources.yaml" # database: "postgres://amass:amass4OWASP@assetdb:5432/assetdb" bruteforce: enabled: false wordlists: - "./wordlists/short-wordlist.txt"scope底下还能放 domains、ips、cidrs、blacklist。options.database那行注释掉的是 PostgreSQL 地址,生产形态用得上。
数据源的 KEY 在datasources.yaml里填,格式是每个源一段,写 apikey 或者 username/password。
Kali 包里带了一份配置样例,位置在/usr/share/doc/amass/resources/:
| 文件 | 干什么 |
|---|---|
config.yaml | 默认、范围、模式配置样例 |
datasources.yaml | 各数据源 API KEY |
alterations.txt | 名字变体词表 |
namelist.txt.gz | 子域名爆破字典 |
命令行参数和配置文件冲突时,命令行优先。爆破默认是关的,bruteforce.enabled: false,要用就加-brute。
拿到库之后能干什么
三件事:跟上次比新增、出图、直接查库。
跟上次比,多出来什么
/usr/lib/amass/amass track -d scanme.nmap.org第一次跑,它把库里所有资产都算作新增,直接打印域名。第二次扫完再跑,打出来的就是差集。前提是同一个库、同一个输出目录,官方原话是 Amass tracking can be used only against the same graph database and output directory。所以老库别删。
出图看关系
/usr/lib/amass/amass viz -dot -d scanme.nmap.org -o /tmp/amass-out目录里会生成amass.dot,我这次这个文件 7852 字节,开头是:
digraph "OWASP Amass Network Mapping" { node [label="scanme.nmap.org",color="green",type="FQDN"]; n1; node [label="2600:3c01::f03c:91ff:fe18:bb2f",color="orange",type="IPAddress"]; n2; node [label="45.33.32.156",color="orange",type="IPAddress"]; n3; node [label="2600:3c01::/32",color="pink",type="Netblock"]; n6; node [label="45.33.32.0/19",color="pink",type="Netblock"]; n7; node [label="63949",color="",type="AutonomousSystem"]; n8;域名、双栈 IP、两个网段、一个 ASN,一条线串下来。转成图看:
dot -Tsvg /tmp/amass-out/amass.dot -o /tmp/amass-out/amass.svg同一个命令还有-d3出 HTML 交互图,-gexf出 Gephi 能读的格式。
直接查库
想要什么形状的清单,自己写 SQL 就行,比等它导出一份文件快。
单独跑引擎
枚举时会自动拉起引擎,也可以手动起一个,供外部工具或者多人复用:
/usr/lib/amass/amass engine -log-dir /tmp/amass-logLinux 下它会在那个目录写带时间戳的日志,我这次拿到的是amass_engine_2026-11-01T00:55:26.log。日志归日志,图还是存进 config 里options.database配的地方。
生产环境两条路。本机 SQLite,什么都不用配,就是~/.config/amass/asset.db一个文件。要正经一点就上 PostgreSQL,官方给了 Docker Compose 的流程,clone 下来改assetdb.env里的密码,然后docker compose run --rm enum -active -d example.org。单发也有:
docker run --rm -it -v ~/.config/amass:/.config/amass amass:latest enum -d owasp.org踩过的坑,一次列完
| 现象 | 原因 | 怎么办 |
|---|---|---|
敲 amass 只回sudo: libpostal_data: command not found | Kali 的 wrapper 脚本在缺 libpostal 时提前退出 | 用/usr/lib/amass/amass,或 touch 那个空文件 |
amass version报 subcommand not defined | v5 没有 version 子命令 | 用-version |
man amass说没有手册页 | 包没带 man 页 | 看-h |
enum -list说没提供根域名 | v5 里 -list 的用法变了 | 先用-d给目标 |
enum -list -d 目标卡住一分钟以上不返回 | 5.1.1 上 -list 的实际表现 | 别把它当工作路径,数据源看官方仓库的 README |
-log /abs/path.log报 failed to open the log file 后退出 | 日志路径按库目录相对拼接 | 用相对文件名,或者不写 -log |
| 扫完 -dir 目录里没有数据 | 5.1.1 的引擎仍写默认库 | 去~/.config/amass/asset.db读 |
subs -d ...只打印 Usage | 5.1.1 上 subs 各种参数组合都失败,我试了六种 | 用 track、viz、sqlite3 替代 |
| 官方 user_guide 还在讲 intel 和 db | 文档落后于 v5 改版 | 以-h的输出为准 |
| 查库时 fqdn 数是 0,扫得也飞快 | 进程还活着,SQLite 的 WAL 没 checkpoint | 等它自然结束,或者过一会儿再查 |
| 扫某个域名一点结果没有 | 数据源被限流或墙了,或者目标是纯内网名 | 先-passive试种子,加 API KEY,授权后再-active |
命令速查
# 修 Kali 的 wrapper 坑,二选一 mkdir -p /usr/share/libpostal && touch /usr/share/libpostal/transliteration # 或者全程用 /usr/lib/amass/amass # 最小被动枚举,不碰目标 /usr/lib/amass/amass enum -passive -d owasp.org # 默认模式,第一次就按这个跑 /usr/lib/amass/amass enum -d owasp.org # 跟上次比新增 /usr/lib/amass/amass track -d owasp.org # 出图再转 SVG /usr/lib/amass/amass viz -dot -d owasp.org -o /tmp/amass-out dot -Tsvg /tmp/amass-out/amass.dot -o /tmp/amass-out/amass.svg # 主动模式加端口,只对书面授权的资产用 /usr/lib/amass/amass enum -active -d owasp.org -p 80,443,8080 # 字典爆破加递归层数 /usr/lib/amass/amass enum -brute -max-depth 3 -d owasp.org /usr/lib/amass/amass enum -brute -w /usr/share/doc/amass/resources/namelist.txt.gz -d owasp.org # 名字变体,拼写感知 /usr/lib/amass/amass enum -alts -aw /usr/share/doc/amass/resources/alterations.txt -d owasp.org # 多目标 /usr/lib/amass/amass enum -d d1.com,d2.com /usr/lib/amass/amass enum -df domains.txt # 黑名单 /usr/lib/amass/amass enum -bl admin.owasp.org -blf /path/blk.txt -d owasp.org # 排除指定数据源 /usr/lib/amass/amass enum -exclude Shodan,VirusTotal -d owasp.org # 直接查库 sqlite3 ~/.config/amass/asset.db "SELECT fqdn FROM fqdn;" sqlite3 ~/.config/amass/asset.db "SELECT addr FROM ipaddress;" # 单独起引擎 /usr/lib/amass/amass engine -log-dir /tmp/amass-log最后一件事:换目标之前先确认你有没有权限。amass 的默认模式确实不怎么发包,但-active会,这个界限要自己守住。