直接查/proc/net/tcp可识别非标SSH端口上无进程归属的隐蔽连接,关键在于发现“连接存在但无人认领”的孤儿socket,结合uid、inode、TCP状态码及远端IP综合判定是否为rootkit后门。

直接查 /proc/net/tcp 是最底层、最难被绕过的手段,尤其适合监控非标准 SSH 端口(如 2222、3389、4444、6010)上是否藏着没进程归属的隐蔽连接。关键不是看端口数字本身,而是验证“连接存在但没人认领”这一破绽。
定位非标SSH端口对应的十六进制地址
SSH 服务监听时,本地地址字段格式为 IP:PORT,其中 PORT 是大端十六进制。例如:
- 端口 2222 → 十六进制为
08AE(2222 = 0x8AE,补前导零成 4 位) - 端口 6010 →
177A - 端口 4444 →
115C
执行命令快速匹配(以 2222 为例):
awk '$2 ~ /:[0-9A-F]{4}$/ && index($2, "08AE") {print $0}' /proc/net/tcp
注意:$2 是 local_address 字段,形如 0100007F:08AE;匹配时用正则确保是完整端口部分,避免误中高位字节。
揪出“有监听、无进程”的孤儿连接
找到目标端口行后,重点看最后两列:uid 和 inode:
-
uid 非 0 且对应用户在
ps -u UID中查不到任何进程 → 高度可疑 -
inode 值(如
12345678)在/proc/[0-9]*/fd/下完全找不到socket:[12345678]软链接 → 确认为“孤儿 socket”
验证脚本片段(替换 INODE 为实际值):
for d in /proc/[0-9]*; do [ -d "$d/fd" ] && ls -l "$d/fd/" 2>/dev/null | grep -q "socket:\[INODE\]" && echo "$d"; done
若无任何输出,说明该连接未绑定到任何可见进程,极可能是内核模块或 rootkit 创建的隐藏监听。
结合状态码判断真实活跃性
/proc/net/tcp 第 4 列 st 是 TCP 状态码,不能忽略:
-
0A→ LISTEN(仅监听,需进一步确认是否有 ESTABLISHED 连接) -
01→ ESTABLISHED(已建立连接,必须立刻追踪远端 IP 和数据流向) -
06→ TIME_WAIT(通常可忽略,除非大量堆积)
对 st == "01" 的行,提取远端地址($3),转成点分十进制后比对是否异常(如来自高危 ASN、已知 C2 域名解析 IP)。可用简单转换辅助:
echo "7F000001" | sed 's/../&\n/g' | tac | xargs -I{} printf "%d." 0x{} | sed 's/\.$//' → 得到 127.0.0.1
排除干扰:区分真 SSH 和伪装行为
非标端口不等于后门,但以下特征组合应触发警报:
- 监听在
0.0.0.0:2222(而非仅127.0.0.1) - uid 为普通用户(如 1001),但该用户无
sshd或自定义 SSH 服务配置记录 -
ss -tunlp | grep :2222显示 PID 为空或为 “-” -
lsof -i :2222返回空或can't identify protocol
此时再查 /proc/net/tcp 中该端口的 inode 是否失联,就能闭环确认是否为隐蔽连接。

















