简约大气标题
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
场景还原
在服务器遭受入侵时,一些rootkit往往会通过劫持、替换等方式让netstat、lsof、ps等指令失效,这加大了应急响应的难度。
当我们发现服务器端口被占用,而这些常用指令无法使用时,可以通过Linux系统的proc文件系统来帮助我们跳过这些指令,找到端口占用对应的进程,帮助我们进行应急响应。
利用proc文件系统找到进程号
可以通过读取这两个文件来确定占用端口的pid:
- /proc/net/tcp
- /proc/net/udp
这两个文件是 Linux /proc 文件系统中的两个特殊文件,用来展示系统的网络信息。分别包含有关当前TCP和UDP网络连接的信息,以及与这些连接相关的各种统计数据。
一个典型的 /proc/net/tcp 或 /proc/net/udp 文件的每一行代表一个活跃的连接或监听端口,并包含以下列:
- sl: 套接字的内部编号。
- local_address: 本地端的IP地址和端口号,显示为16进制的小端格式。
- rem_address: 远程端的IP地址和端口号,也显示为16进制的小端格式。
- st: 套接字的状态,用16进制表示。
- tx_queue:rx_queue: 发送队列和接收队列的大小。用于表示正在传输的数据量,并可能包含未确认的数据段。
- tr:tm->when: 计时器状态和时间信息。
- retrnsmt: 重试计数/超时信息。
- uid: 打开套接字的用户ID。
- timeout: 超时值。
- inode: 与套接字相关的inode。每个inode与文件系统中的一个唯一位置相关联。
- 额外的列,如:引用计数、指向套接字结构的指针、协议特定的记分板索引,等等,这些信息对于内核或网络编程人员可能是有用的。
我们要检查是否存在80,443端口,就需要先计算出80和443的16进制小端形式,分别为:
- 80 - 0050
- 443 - 01BB
所以查询指令是:
- grep ':0050 ' /proc/net/tcp grep ':01BB ' /proc/net/tcp
- grep ':01BB ' /proc/net/tcp grep ':01BB ' /proc/net/tcp
会查询到占用的inode号:
图,占用的inode为91391206
然后创建一个脚本,填入如下内容,记得把your_inode改为实际的inode号:
for
pid
in
$(ls /proc/ | grep
'^[0-9]*$'
);
do
if
ls -l /proc/
$pid
/fd/* 2> /dev/null | grep -q
"socket:[your_inode]"
;
then
echo
"PID:
$pid
"
fi
done
就可以找到了:
原理
/proc 是一个虚拟文件系统,它提供了一个接口来访问内核数据结构。它不包含实际的文件,而是在访问时动态生成文件内容。在 /proc/[PID]/fd/ 目录中,可以找到代表进程打开的文件描述符的符号链接。对于网络套接字,这些链接指向形如 socket:[inode号] 的条目。
原文始发于微信公众号(赛博安全狗):【应急响应】当netstat、lsof等命令失效时如何找到占用某端口的pid?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论