Nmap源码分析(主机发现)

2023-11-20

Nmap源码分析(主机发现)

2012年8月9日

Nmap在进行真正的端口扫描之前,通常需要确定目标主机是否在线(主机发现过程),以免发送大量探测包到不在线的主机。主机发现作为Nmap的基本功能之一,用户也可以单独运用。例如,仅仅需要确定局域网内哪些IP在线,那么可用“主机发现”功能扫描所有机器,枚举出在线主机即可,而没有必要进行端口扫描、服务侦测、OS侦测等更加详细的操作。

1      简单回顾

命令行参数

Nmap提供的主机发现参数相对较少,易于掌握:

-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。
-sn: Ping Scan 只进行主机发现,不进行端口扫描。
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。
-PS/PA/PU/PY[portlist]: 使用TCP SYN/ACK或SCTP INIT/ECHO方式进行发现。
-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocol list]: 使用IP协议包探测对方主机是否开启。
-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。
--dns-servers <serv1[,serv2],...>: 指定DNS服务器。
--system-dns: 指定使用系统的DNS服务器
--traceroute: 追踪每个路由节点

2      实现框架

Nmap主机发现部分的源码比较简洁。在nmap_main()函数的主循环部分,通过nexthost()函数进行具体的主机发现过程,在nexthost()函数中主要分为两个阶段:地址解析阶段、实际探测阶段。地址解析阶段:主要负责从主机表达式中解析出目标主机地址,将之存放在hostbatch中,并配置该主机所需的路由、网口、MAC地址、源IP等信息。实际发现阶段:分别对解析出来的目标主机,进行实际的探测以及获取RDNS相关信息,例如采用ARP包发现局域网内主机是否在线。

流程图如下所示:


2.1    地址解析阶段

从主机表达式中获取目标主机地址,主要思想包括以下几个方面:

批量进行主机发现

批量处理,可以加快主机发现的速率。默认配置以4096个目标地址作为一批(batch),若配置了--randomize-hosts选项,每个batch大小为4096*4(以便能有更多的IP地址混合洗牌、乱序扫描)。

从主机表达式获取目标主机地址

主机表达式(hostexpression),是Nmap用于管理主机的方式,该数据结构对应到用户在命令行中传入的目标机地址。例如,命令行nmap192.168.1-10.1-254  scanme.nmap.org/24中,192.168.1-10.1-254为一个主机表达式,而scanme.nmap.org/24为另一个主机表达式。Nmap需扫描的目标地址,即逐个解析该表达式包含的各个IP分别是多少,如scanme.nmap.org/24,首先需要进行DNS域名查询,获取scanme.nmap.org对应的IP地址,然后将与此地址的高24位相同的C类IP地址都将被获取出来。

跳过被排除的地址

如果使用--exclude或--exclude-file指定了排除地址,主机发现时应当跳过该类型地址。

设置已转换地址

若该地址在已经被转换解析,即在解析主机表达式过程中(parse_expr()函数),已经处理了该地址,那么设置该地址对应的转换的地址或名字。例如,在上述例子中,scanme.nmap.org/24表达式在解析过程中,scanme.nmap.org的地址会被DNS查询出来,记录在主机表达式中。如果在从该表达式过程取地址时,取出的地址正好对应的scanme.nmap.org的IP地址,那么说明该地址之前已被转换解析,此时让该主机记录被转换解析的表达式名字(此处为scanme.nmap.org/24),并记录转换地址列表(同一域名可能对应到多个不同IP地址)。

获取所需源IP与网络设备

需要配置源端的IP地址与网卡信息,当且仅当:用户具有系统权限(以root运行),并至少满足以下三个条件之一:

1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nmap源码分析(主机发现) 的相关文章

  • 有人可以解释 Solaris 中“dirent”结构的定义吗?

    最近 我正在研究 dirent 结构 在 dirent h 中 对其定义有点困惑 注意 此头文件来自我学校的 Solaris 计算机 typedef struct dirent ino t d ino off t d off unsigne
  • 在结构体中动态分配结构体

    我正在动态分配一个具有不同结构作为成员的结构 struct a other members struct b struct b基本上持有一个指向另一个的指针struct b 所以想到struct b作为链接列表 如果我动态分配struct
  • 声明没有声明任何东西:警告?

    include
  • 如何在golang中嵌入其他包的结构

    我知道如何在同一包中的结构中嵌入其他结构 但是如何嵌入其他包的结构 dog go package dog import fmt type Dog struct Name string func this Dog callMyName fmt
  • 传递给 CUDA 的结构中的指针

    我已经搞砸了一段时间了 但似乎无法正确处理 我正在尝试将包含数组的对象复制到 CUDA 设备内存中 然后再复制回来 但当我遇到它时我会跨过那座桥 struct MyData float data int dataLen void copyT
  • 将结构指针转换为另一个结构

    此代码片段打印该值5 我不明白为什么 include
  • 检查 DST 是否生效

    In PHP date I 会告诉我夏令时是否有效 这是否告诉我 DST 是否专门针对我的服务器配置的时区有效 或者是否在有效期间 我在亚利桑那州 那里不遵守夏令时 因此 我需要我的服务器认识到纽约现在比我早 2 小时 但是当明年 3 月夏
  • C 中的结构体数组初始化

    这是我的代码的一部分 我只想初始化arraylist 0 as arraylist 0 x 0 and arraylist 0 y 0 我不需要初始化结构体数组的其余部分 我该怎么做 谢谢 include
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这
  • 将数组分配给结构体中的数组

    我正在尝试将一个数组分配给 typedef 结构的一个字段 但实际上找不到一种方法 我已经搜索过这个问题 但我似乎找到的只是 char 数组的答案 这不是我正在寻找的 我只是试图将一个数组分配给一个 int 数组 并寻找一种实用的方法下面的
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 多个结构体,需要在方法中访问相同的字段

    我目前尝试用 C 语言编写一些简单的控制台游戏来娱乐 为此 我需要能够在 嗯 C 中打印类似窗口的结构 我想使用通用渲染方法 让我们称之为frame render 渲染所有不同的 ui 元素 现在的问题是 如何解决这个问题 给定场景 The
  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • 我们可以有一个可变长度数组类型的结构元素吗? [复制]

    这个问题在这里已经有答案了 我们可以声明一个可变长度的结构元素吗 条件如下 typedef struct uint8 t No Of Employees uint8 t Employee Names No Of Employees 15 s
  • C++:初始化结构体并设置函数指针

    我正在尝试使用函数指针初始化结构 但是除非使用全局函数完成 否则我很难这样做 以下代码有效 float tester float v return 2 0f v struct MyClass Example typedef float My
  • 结构体tag和name,为什么声明为name的局部变量会编译?

    在我最近看到的一些代码中 有一个如下定义的结构 typedef struct tagMyStruct int numberOne int numberTwo MYSTRUCT 按照我的理解 tagMyStruct是新的数据类型并且MYSTR
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的

随机推荐

  • 内存取证CTF-Memlabs靶场6

    1 挑战说明 我们从情报局收到了这个内存转储 他们说这个证据可能包含黑帮大卫本杰明的一些秘密 这个内存转储是从本周早些时候被 FBI 逮捕的他的一名员工那里获取的 你的工作是通过内存转储 看看你是否能找出一些东西 FBI还表示 大卫通过互联
  • 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)

    普通按钮 普通按钮xml设置
  • [NCTF2019]Fake XML cookbook

    NCTF2019 Fake XML cookbook 日常刷题 打开题目嗯 一开始我的脑子里想到的是禁止自娱自乐 狗头 哈哈 第一想法就是试一下admin 别问为什么 web狗的自觉 果然没这么容易 抓包 将提交的数据放到了doLogin
  • vue router在同界面使用 this.$router跳转路由,mounted不再调用

    1 在vue中 刷新数据常用的办法是 this r o u t e r g o 0 或 者 t h i s router go 0 或者this router go 0 或者this router push path 在最近一次的使用时 发
  • 第三章 总线

    一 系统总线概念 系统总线是计算机内部各个组件之间传输数据和控制信息的通信线路 连接中央处理器 内存 输入输出设备 扩展插槽等各个组件 是计算机系统中最重要的硬件组成部分之一 具有数据传输 控制信号传输和总线协议等功能 系统总线的性能对计算
  • 登录即代表您同意 用户服务协议

    UILabel remindLabel if remindLabel remindLabel UILabel alloc init NSDictionary attributes NSFontAttributeName UIFont sys
  • 一文搞懂Mybatis原理

    文章目录 一 快速入门 二 查询流程分析 2 1首先通过ClassLoader读取配置文件生成输入流 2 2建造者模式加载配置创建SQLSessionFactory 2 2 1SQLSessionFactoryBuilder builder
  • 排序算法(2) 快速排序——快排原理以及快排函数qsort

    上次我们分享了一个基本排序方法 冒泡排序的使用 今天我们来分享第二种排序方法 快速排序 快速排序 我们简称快排 我们先来回顾一下上次的冒泡排序 冒泡排序就是在一个序列里 两两比较并根据大小关系进行换位处理 经过多次从头到尾的比较 从而实现整
  • 百面A/B测试

    1 在对模型进行过充分的离线评估之后 为什么还要进行在线A B测试 1 离线评估无法完全消除模型过拟合的影响 因此 得出的离线评估结果无法完全替代线上评估结果 2 离线评估无法完全还原线上的工程环境 一般来讲 离线评估往往不考虑线上环境的延
  • 华为OD机试真题- 日志首次上报最多积分【2023Q1】

    题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁 会对服务端造成压力 如果上报太晚 会降低用户的体验 如果一次上报的条数太多 会导致超时失败 为此 项目组设计了如下的上报策略 1 每
  • 三种出包命令npm, yarn, webpack的对比

    在出包的时候 总是会在不同项目里看到不同的出包命令 但留心观察了一下 最常被使用的就是下面这三个 npm run XXX yarn run XXX webpack entry file destination for bundled fil
  • C++---之waitKey()函数

    waitKey 函数详解 1 waitKey 这个函数是在一个给定的时间内 单位ms 等待用户按键触发 如果用户没有按下 键 则接续等待 循环 2 如下所示 while 1 if waitKey 100 27 break 在这个程序中 我们
  • eclipse maven 导出项目依赖的jar包

    本文转自至 http blog csdn net andyliulin article details 46544555 一 导出到默认目录 targed dependency 从Maven项目中导出项目依赖的jar包 进入工程pom xm
  • Qt在windows和linux下使用默认浏览器打开设置的链接

    QString webstr http www baidu com 设置要打开的网页 bool openService QDesktopServices openUrl QUrl webstr 使用默认浏览器打开 if openServic
  • Testflight 添加外部测试人员

    内部测试人员 不需要提供所有的metadata 外部测试人员 为了使得外部人员可以测试app的预发布build 必须提供如下的metadata What to test App description Feedback email Mark
  • 利用Python读取MongoDB的数据

    近日在处理数据的时候遇到一个问题 数据存储在MongoDB数据库 如图1 而MongoDB模式自由 具有很大的灵活性 可以把不同结构的文档存储在同一个数据库里 即表的字段不是完全固定的 当某个字段有值时就会显示该字段 而当该字段没有值时就不
  • 3.git 将本地仓库推到远程

    1 创建一个本地仓库 git init 2 把文件添加到版本仓库中 git add 3 生成提交记录 git commit m git init 4 关联到远程库 git remote add origin 你的远程库 5 获取远程库与本地
  • jsoncpp封装和解析字符串、数字、布尔值和数组

    使用jsoncpp进行字符串 数字 布尔值和数组的封装与解析 1 下载jsoncpp的代码库 百度网盘地址 http pan baidu com s 1ntqQhIT 2 解压缩文件 jsoncpp rar unzip jsoncpp ra
  • 解决BeanNotOfRequiredTypeException办法(@Autowired和@Resource注解的不同)

    1 错误信息 org springframework beans factory BeanNotOfRequiredTypeException Bean named aisleService must be of type com gdie
  • Nmap源码分析(主机发现)

    Nmap源码分析 主机发现 2012年8月9日 Nmap在进行真正的端口扫描之前 通常需要确定目标主机是否在线 主机发现过程 以免发送大量探测包到不在线的主机 主机发现作为Nmap的基本功能之一 用户也可以单独运用 例如 仅仅需要确定局域网