提取“便携版” Nmap
一、背景说明
Nmap 是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
Nmap 套件中,还包含的 Ncat 和 Nping 功能强大且更为通用的工具。尤其是 Ncat,被称为“网络工具箱里的『瑞士军刀』”,能胜任除扫描外更为通用的一些功能。详情参见 Ncat Users' Guide 和《Ncat 使用方法整理》。
在 Linux 上,Nmap 的安装一般需要通过源码编译或者安装 rpm 包的方式来进行。但是在实际应用场景中,生产环境的服务器可能不具备编译环境,或者不具备权限进行安装工作,导致无法使用。本文的目标是提取出一个无需安装的“便携版”,解决因环境因素不能安装的问题。
二、提取“绿色版”
1、问题分析
Nmap 之所以需要安装,是因为存在依赖库,并需要把依赖的库复制到系统的特定位置,还需要集成帮助文档。对于“便携版”来说,可以把依赖的库放到有权限访问的位置,文档的集成先不需要。所以理论上可行。
本文以 CentOS 7.6 为例,提取 Nmap 便携版。
2、必备文件列表
安装命令:
$ sudo yum install -y nmap
安装成功后,提取以下文件:
/usr/bin/ncat
/usr/bin/ndiff
/usr/bin/nmap
/usr/bin/nping
/usr/lib64/libpcap.so.1 → libpcap.so.1.5.3
其中的 /usr/lib64/libpcap.so.1
是应用程序依赖的库。为了多版本库并存,所以 libpcap.so.1
作为一个 SymbolLink 存在,指向实际文件的不同版本,如:libpcap.so.1.5.3
,在收集文件时,根据实际情况选择版本。但是软件在访问的时候,还是会读取 libpcap.so.1
。
通过如下命令创建 SymbolLink:
$ ln -sf 'libpcap.so.1.5.3' 'libpcap.so.1'
3、解决库的访问路径问题
(1)文件整理
通过前面的步骤,已经把文件搜集齐,集中放到有权限访问的位置,假设存放在 ~/portable_nmap/
,文件列表如下:
~/portable_nmap/ncat
~/portable_nmap/ndiff
~/portable_nmap/nmap
~/portable_nmap/nping
~/portable_nmap/libpcap.so.1
~/portable_nmap/libpcap.so.1.5.3
其中的 libpcap.so.1
为 SymbolLink,指向 libpcap.so.1.5.3
。
(2)执行
执行 nmap
或者 ncat
,发现还是报找不到库的错误。
原因是 Linux 与 Windows 对于动态链接库搜索的机制不同导致的。Windows 会优先搜索当前路径和可执行文件所在目录,但 Linux 只会搜索系统指定的位置,但这些位置基本都需要访问权限,为了规避权限问题,不能使用这些位置。所以我们需要让系统到我们指定的位置搜索需要的动态链接库。参考《Linux 指定动态库搜索路径五种方法及优先级》。
我们采用指定环境变量的方法:
$ export LD_LIBRARY_PATH=~/portable_nmap
运行成功。
三、配置运行脚本
前面已经把用到的文件、执行原理和配置说清楚介绍完,这里提供一个用于设置运行环境的脚本,主要完成以下工作:
- 为
libpcap.so.1.5.3
在相同目录创建 SymbolLinklibpcap.so.1
- 为文件赋予可执行权限
- 设置
PATH
环境变量,保证在任何位置都可以使用可执行文件 - 设置
LD_LIBRARY_PATH
环境变量,用于指定动态链接库libpcap.so.1
的搜索位置
此脚本用于设置执行环境,需要与之前提取的 Nmap 可执行文件存放在相同目录。
# setup.sh
# 此脚本用于设置执行环境,应与其余 Nmap 文件放在相同目录
set -u
# 获取脚本所在路径
BASH_SOURCE_NAME=${BASH_SOURCE[0]}
SCRIPT_FILE=$(readlink -f "${BASH_SOURCE_NAME}")
BASE_PATH_NMAP=$(dirname "${SCRIPT_FILE}")
# 创建动态链接库的链接
ln -sf "${BASE_PATH_NMAP}/libpcap.so.1.5.3" "${BASE_PATH_NMAP}/libpcap.so.1"
# 为文件赋予执行权限
chmod 755 "${BASE_PATH_NMAP}"/*
# 设置 PATH 环境变量
PATH=${PATH}:${BASE_PATH_NMAP}
# 设置访问动态链接库的环境变量
export LD_LIBRARY_PATH=${BASE_PATH_NMAP}
脚本执行方式:
$ . setup.sh
# 或
$ source setup.sh
注意:
必须通过 .
或 source
来执行此脚本,不能在新启动的 Shell 中运行此脚本。
执行脚本后,切换到任何路径都能正常执行 nmap
或 ncat
命令,表示配置成功。
四、完整收集脚本
通过上述过程已经可以整理出一份便携版的 Nmap,并且可以正常运行。
这里把上面的过程整理成一个脚本,用于:
- 将需要的文件收集到一起
- 同时生成用于配置的脚本
此脚本在已经安装了 Nmap 的环境执行,就可以把相关文件收集到一起,同时生成配置运行脚本
,并存放到相同目录下。
#!/bin/bash
# nmap_packager.sh
# 此脚本在已经安装了 Nmap 的环境执行,用于把相关文件收集到一起,同时生成`配置运行脚本`,并存放到相同目录下
set -eux
# 获取收集内容存放的目录,默认放在 ~/portable_nmap
NMAP_PATH=${1:-~/portable_nmap}
# 创建目录
mkdir -p "${NMAP_PATH}"
# 复制文件
cp /usr/bin/ncat "${NMAP_PATH}/"
cp /usr/bin/ndiff "${NMAP_PATH}/"
cp /usr/bin/nmap "${NMAP_PATH}/"
cp /usr/bin/nping "${NMAP_PATH}/"
cp /usr/lib64/libpcap.so.1.5.3 "${NMAP_PATH}/"
# 生成配置脚本 setup.sh
cat << EOF > "${NMAP_PATH}/setup.sh"
set -u
# 获取脚本所在路径
BASH_SOURCE_NAME=\${BASH_SOURCE[0]}
SCRIPT_FILE=\$(readlink -f "\${BASH_SOURCE_NAME}")
BASE_PATH_NMAP=\$(dirname "\${SCRIPT_FILE}")
# 创建动态链接库的链接
ln -sf "\${BASE_PATH_NMAP}/libpcap.so.1.5.3" "\${BASE_PATH_NMAP}/libpcap.so.1"
# 为文件赋予执行权限
chmod 755 "\${BASE_PATH_NMAP}"/*
# 设置 PATH 环境变量
PATH=\${PATH}:\${BASE_PATH_NMAP}
# 设置访问动态链接库的环境变量
export LD_LIBRARY_PATH=\${BASE_PATH_NMAP}
EOF
收集到的文件可以复制到需要的环境,并执行其中的 setup.sh
来进行环境初始化后,即可使用 Nmap 相关功能。
本文讲述过程及脚本在 CentOS 7.6 中验证测试通过。
(完)