aircrack-ng 介绍、功能测试及部分源码分析

2023-10-29

aircrack-ng 介绍、功能测试及部分源码分析

【实验目的】
1、理清aircrack-ng的总体设计框架,包括各模块的功能与联系;
2、核心模块的实现原理(aircrack-ng、aireplay-ng、airodump-ng)
【实验要求】
1、 查找aircrack-ng软件相关资料,搞清楚是什么的问题。
2、 分析aircrack-ng的功能以及对应的实现模块和各模块的依赖关系
3、 主要攻击方式和流程介绍
4、 对WPA/WPA2加密方式和破解进行深入探究
5、 阅读aircrack-ng,aireplay-ng,airodump-ng三个关键模块的代码并注释,绘制流程图
6、 梳理aircrack-ng的整体框架
7、 ——较为详细地描述实验的具体要求(包括针对的数据、实现的功能、处理步骤、结果的形式等)
【实验环境】
1、 VMware Workstation虚拟机
2、 Kali操作系统
3、 USB网卡一块
【实验过程】

一、 实验步骤与关键问题分析

(一)、aircrack-ng简介

  Aircrack- ng是一套完整的评估 WiFi 网络安全性的工具,是一个与802.11标准的无线网络分析有关的安全软件,主要功能有:网络侦测,数据包嗅探,WEP和WPA/WPA2-PSK破解。Aircrack-ng可以工作在任何支持监听模式的无线网卡上并嗅探802.11a,802.11b,802.11g的数据。它侧重于 WiFi 安全的不同领域:

 监控:数据包捕获并将数据导出到文本文件以供第三方工具进一步处理
 攻击:通过数据包注入进行重放攻击、取消身份验证、伪造接入点等
 测试:检查 WiFi 卡和驱动程序功能(捕获和注入)
 破解:WEP 和 WPA PSK(WPA 1 和 2)
所有工具都是命令行,允许编写繁重的脚本。很多 GUI 都利用了这个特性。它主要适用于 Linux,但也适用于 Windows、macOS、FreeBSD、OpenBSD、NetBSD,以及 Solaris 甚至 eComStation 2。

(二)、aircrack套件
1、主要套件
 airbase-ng - 旨在攻击客户端而不是接入点 (AP) 本身的多用途工具。
 aircrack-ng – 802.11 WEP 和 WPA/WPA2-PSK 密钥破解程序。
 airdecap-ng – 解密 WEP/WPA/WPA2 捕获文件。
 airdecloak-ng – 从数据包捕获文件中删除 WEP Cloaking™。
 airdrop - ng——基于规则的无线解除认证工具。
 aireplay-ng – 注入和重放无线帧。
 airgraph-ng – 绘制无线网络。
 airmon-ng – 在无线接口上启用和禁用监控模式。
 airodump-ng – 捕获原始 802.11 帧。
 airolib-ng – 在数据库中预先计算 WPA/WPA2 密码短语,以便稍后与 aircrack-ng 一起使用。
 airserv-ng – 无线网卡 TCP/IP 服务器,允许多个应用程序使用无线网卡。
 airtun-ng – 虚拟隧道接口创建者。
 packetforge-ng – 创建可用于注入的各种类型的加密数据包。

2、不稳定的实验性套件

 easside-ng – 可在不知道密钥的情况下与 WEP 加密的接入点进行通信。
 tkiptun-ng – WPA/TKIP 攻击的概念验证实现:将一些帧注入具有 QoS 的 WPA TKIP 网络
 wesside-ng – 结合了多种技术,可在几分钟内无缝获取 WEP 密钥。

 由于WEP加密方式存在安全问题,现在已经被安全性更强WPA/WPA2加密方式取代,故我们将主要精力放在WPA/WPA2的研究上。

(三)、aircrack关键套件功能测试及使用方法
主要分为四部分介绍:
1、网络侦测套件
2、数据包嗅探套件
3、破解攻击套件
4、基础支撑工具模块

一、网络侦测套件
(一)、airmon-ng(无线监听工具)

1、功能:
1、此脚本可用于在无线接口上启用和禁用监控模式。
2、它也可用于从监控模式返回到托管模式。
3、输入不带参数的 airmon-ng 命令将显示接口状态。
4、列出 / 杀死可能干扰的程序配合无线网卡操作

2、用法概述

(1)、命令格式

(2)、用法示例

  (2.1)、显示接口状态

airmon-ng

(2.2)、检测干扰进程

许多过程会干扰airmon-ng,使用check选项可以查看干扰的进程,可以使airmon-ng check kill 杀死它们,因为它们会通过改变通道进行干扰,有时还会将接口恢复到托管模式。

airmon-ng check

(2.3)、开启无线监听

(3.4)、关闭无线监听

二、数据包嗅探套件
(一)、Airodump-ng
1、数据包嗅探:将无线网络数据输送到PCAP或IVS文件并显示网络信息描述Airodump-ng是用来抓包的,尤其适合为破解WEP收集IVs(初始向量),再用这些IVs来破解密码。另外,如果我们的电脑连接有GPS定位装置,那么airodump-ng则能够定位到它所找到的接入点的位置坐标。airodump-ng也能将接入点和客户端的信息写入文件中。

2、在使用airodump-ng之前,我们可先用airmon-ng列出检测到的无线接口。另外,建议同时使用Kismet和airodump-ng。我们可以将 .cap或者 .dump文件转化为 .ivs文件,或者将他们合并。

三、破解攻击套件
(一)、aircrack-ng破解WEP和WPA秘钥(暴力破解)
1、功能:
主要用于WEP及WPA-PSK密码的恢复,只要aircrack-ng收集到足够数量的数据包,aircrack-ng就可以自动检测数据包并判断是否可以破解。Aircrack-ng可以在使用airodump-ng捕获足够的加密数据包后恢复WEP密钥。aircrack-ng 套件的这一部分使用两种基本方法确定 WEP 密钥。第一种方法是通过PTW方法(Pyshkin,Tews,Weinmann)。默认的破解方法是PTW。这分两个阶段完成。在第一阶段,aircrack-ng 仅使用 ARP 数据包。如果未找到密钥,则它将使用捕获中的所有数据包。但并非所有数据包都可用于 PTW 方法。PTW攻击目前只能破解40位和104位WEP密钥,PTW 方法的主要优点是需要少的数据报就可以破解 WEP 密钥。
另一种较旧的方法是FMS/ KoreK方法。FMS/KoreK 方法结合了各种统计攻击来发现 WEP 密钥,并将其与暴力破解结合使用。它需要比PTW更多的数据包,但当PTW失败时,它能够恢复密码。
此外,该程序还提供了用于确定 WPA/WPA2密钥的字典方法。aircrack-ng仅仅提供了字典方法暴力破解WPA/WPA2 密钥,需要"四向握手"作为输入。对于 WPA 握手,一个完整的握手由四个数据包组成。而aircrack-ng只需2个数据包即可成功工作。
2、工作方式:
(1)第一种方法是PTW方法(Pychkine,Tews,Weinmann)。2005年,Andreas Klein提出了对RC4流密码的另一项分析。Klein表明,RC4密钥流和密钥之间的相关性比Fluhrer,Mantin和Shamir发现的相关性更多,这些可能还用于破坏WEP。PTW 方法扩展了 Klein 的攻击,并针对 WEP 进行了优化。它实质上使用下一节中介绍的增强型 FMS 技术。一个特别重要的约束是,它仅适用于 arp 请求/回复数据包,不能用于其他流量。
(2)第二种方法是FMS / Korek方法,它结合了多种技术。
在这种方法中,结合了多种技术来破解WEP密钥:
A:FMS ( Fluhrer, Mantin, Shamir) attacks - 统计技术
B:Korek攻击 - 统计技术
C: 暴力破解
当使用统计技术破解 WEP 密钥时,密钥的每个字节基本上都是单独处理的。使用统计数学,当为特定键字节捕获正确的初始化向量(IV)时,正确猜测键中的某个字节的可能性高达15%。从本质上讲,某些 IV 会"泄漏"特定密钥字节的机密 WEP 密钥。这是统计技术的基本基础。
通过使用一系列称为FMS和Korek攻击的统计测试,可以累积对秘密WEP密钥的每个密钥字节的可能密钥的投票。不同的攻击具有不同数量的投票,因为每次攻击产生正确答案的概率在数学上有所不同。特定潜在键值累积的投票越多,它就越有可能是正确的。对于每个密钥字节,屏幕显示可能的密钥及其到目前为止累积的票数。票数最多的密钥很可能是正确的,但不能保证。Aircrack-ng随后将测试密钥以确认它。可用的数据越多,aircrack-ng确定秘密WEP密钥的机会就越大。
上述技术和方法不适用于 WPA/WPA2 密钥。破解WPA/WPA2密钥的唯一方法是通过字典攻击。
使用WPA/WPA2密钥,客户端和接入点建立密钥材料,以便在客户端首次与接入点关联时,在开始时用于其通信。客户端和接入点之间有四次握手。airodump-ng可以捕捉到这种四向握手。用于 WPA/WPA 暴力破解的字典需要每行包含一个密码。aircrack-ng 使用来自提供的单词列表(字典)的输入,复制四向握手,以确定单词列表中的特定条目是否与四向握手的结果匹配。如果是这样,则表示已成功标识预共享密钥。由于计算量特别大,在实践中,不太可能确定非常长或不寻常的预共享密钥。一个高质量的单词列表将给你最好的结果。另一种方法是使用像开膛手约翰这样的工具来生成密码猜测,这些猜测又被输入到aircrack-ng中。
下面是一些常用的模式选项:

(二)、Airdecap-ng(解密WPA加密的pcap文件)

1、用法概述
   Airdecap-ng可以解密WPA/WPA2捕获文件,还可以用于从未加密的无线捕获中剥离无线标头。输出一个-dec.cap结尾的新文件,它是输出文件的解密/剥离版本。

2、命令格式

注意:捕获文件必须包含有效的四次握手,只有握手之后的数据包才会被解密。

(三)、Aireplay-ng
用于注入帧。主要功能是生成流量,以便以后在aircrack-ng中用于破解 WEP 和 WPA-PSK 密钥。有不同的攻击可能导致出于捕获 WPA 握手数据、虚假身份验证、交互式数据包重放、手工制作的 ARP 请求注入和 ARP 请求重新注入的目的而取消身份验证。使用packageforge-ng工具,可以创建任意帧。
1、攻击的使用
它目前实施多种不同的攻击:
攻击 0:取消身份验证
攻击 1:虚假身份验证
攻击 2:交互式数据包重放
攻击3:ARP请求重放攻击
攻击4:KoreK斩击攻击
攻击5:碎片攻击
攻击6:咖啡拿铁攻击
攻击 7:面向客户端的碎片攻击
攻击8:WPA迁移模式
攻击9:注射测试

2、用法
对于除取消身份验证和虚假身份验证之外的所有攻击,您可以使用以下筛选器来限制将向特定攻击显示哪些数据包。最常用的过滤器选项是"-b",用于选择特定的接入点。对于典型用法,"-b"是唯一使用的用法。
攻击可以从两个源获取要重播的数据包。第一个是来自无线网卡的数据包的实时流。第二个来自 pcap 文件。标准 Pcap 格式,被大多数商业和开源流量捕获和分析工具所认可。从文件中读取是 aireplay-ng 的一个经常被忽视的功能。这允许您从其他捕获会话读取数据包。请记住,各种攻击会生成 pcap 文件以便于重复使用。

3、10种不同的攻击模式
UsageAttack 0: Deauthentication(取消身份验证)此攻击将取消关联数据包发送到当前与特定接入点关联的一个或多个客户端。出于多种原因,可以取消关联客户端:
§ 正在恢复隐藏的 ESSID。这是一个未广播的 ESSID。另一个术语是"隐身"。
§ 通过强制客户端重新进行身份验证来捕获 WPA/WPA2 握手
§ 生成 ARP 请求(Windows 客户端有时会在断开连接时刷新其 ARP 缓存)
当然,如果没有关联的无线客户端或虚假身份验证,则此攻击是完全无用的。

 Attack 1: Fake authentication(虚假身份验证)假身份验证攻击允许您执行两种类型的 WEP 身份验证(开放系统和共享密钥)以及与接入点 (AP) 关联。仅当您在各种aireplay-ng攻击中需要关联的 MAC 地址并且当前没有关联的客户端时,这才有用。应该注意的是,虚假身份验证攻击不会生成任何ARP数据包。虚假身份验证不能用于对 WPA/WPA2 接入点进行身份验证/关联

 Attack 2: Interactive packet replay(交互式数据包重放)此攻击允许您选择要重播(注入)的特定数据包。攻击可以从两个源获取要重播的数据包。第一个是来自无线网卡的数据包的实时流。第二个来自 pcap 文件。标准 Pcap 格式(数据包 CAPture,与 libpcap 库http://www.tcpdump.org相关联)被大多数商业和开源流量捕获和分析工具所认可。从文件中读取是 aireplay-ng 的一个经常被忽视的功能。这允许您从其他捕获会话读取数据包,或者经常,各种攻击会生成pcap文件以便于重用。

 Attack 3: ARP request replay attack(ARP 请求重放攻击)经典的ARP请求重放攻击是生成新的初始化向量(IV)的最有效方法,并且工作非常可靠。程序侦听 ARP 数据包,然后将其重新传输回接入点。反过来,这会导致接入点使用新的 IV 重复 ARP 数据包。该程序一遍又一遍地重新传输相同的 ARP 数据包。但是,接入点重复的每个 ARP 数据包都有一个新的 IV。正是所有这些新的IV确定WEP密钥。

 Attack 4: KoreK chopchop attack此攻击成功后,可以在不知道密钥的情况下解密 WEP 数据包。它甚至可以对抗动态 WEP。此攻击不会恢复WEP密钥本身,而只是揭示了明文。但是,某些接入点不容易受到此攻击。有些起初可能看起来很脆弱,但实际上丢弃的数据包短于60字节。如果接入点丢弃的数据包短于 42 字节,aireplay 会尝试猜测剩余的缺失数据,只要标头是可预测的。如果捕获了 IP 数据包,则在猜测标头的缺失部分后,还会检查标头的校验和是否正确。此攻击至少需要一个 WEP 数据包。
 Attack 5: Fragmentation attack(碎片攻击)此攻击成功后,可以获得 1500 字节的 PRGA(伪随机生成算法)。此攻击不会恢复 WEP 密钥本身,而只是获取 PRGA。然后,PRGA可用于生成具有package-ng的数据包,这些数据包又用于各种注入攻击。它需要从接入点接收至少一个数据包才能发起攻击
 Attack 6: Cafe-latte attack(咖啡拿铁攻击)Cafe Latte 攻击允许从客户端系统获取 WEP 密钥。简而言之,这是通过从客户端捕获ARP数据包,对其进行操作然后将其发送回客户端来完成的。客户端反过来生成数据包,这些数据包可以通过airodump-ng 捕获。随后aircrack-ng可用于确定WEP密钥。
 Attack 7: Client-oriented fragmentation attack(面向客户端的碎片攻击)Hirte攻击是一种客户端攻击,可以使用任何IP或ARP数据包。它通过允许使用任何数据包而不限于客户端ARP数据包来扩展Cafe Latte攻击。
 Attack 8: WPA Migration Mode(WPA迁移模式)
 Attack 9: Injection test(注入测试)注入测试确定您的卡是否可以成功注入并确定对接入点 (AP) 的 ping 响应时间。如果您有两个无线网卡,它还可以确定可以成功执行哪些特定的注入测试。
四、基础支撑工具模块
(一)、支撑模块
1.Tools(混合、转换工具)
WZCook
它从 XP 的无线零配置实用程序中恢复 WEP 密钥。这是实验性软件,因此根据您的 Service Pack 级别,它可能有效,也可能不起作用。
WZCOOK 还可以显示 PMK(成对主密钥),这是一个 256 位值,是密码短语与 ESSID 和 ESSID 长度一起散列 8192 次的结果。密码本身无法恢复 - 但是,知道PMK足以连接到具有wpa_supplicant的受WPA保护的无线网络(请参阅Windows自述文件)。 wpa_supplicant.conf 配置文件应如下所示:
network={
ssid=“my_essid”
pmk=5c9597f3c8245907ea71a89d[…]9d39d08e
}
WZCook 工具还支持静默模式。这是通过向命令添加"–silent"(双短划线)来调用的。程序将运行,但不输出任何消息。这对于批处理文件和脚本非常有用。
如果您不使用 WZC 服务,但使用 USR 实用程序,请获取此注册表值并在此处尝试:
HKey_Current_User/Software/ACXPROFILE/profilename/dot11WEPDefaultKey1
ivstools
此工具处理.ivs文件。可以合并或转换它们。
Merge(合并)
使用 --merge 选项合并多个.ivs文件。例:
ivstools --merge dump1.ivs dump2.ivs dump3.ivs out.ivs
它将把 dump1.ivs、dump2.ivs 和 dump3.ivs 合并到 out.ivs 中。您可以合并 2 个以上的文件,输出文件必须是最后一个参数。注意:aircrack-ng能够打开多个文件(pcap或ivs)

Convert(转换)
使用 --convert 选项将 pcap 文件(默认情况下,它们具有.cap扩展名)转换为.ivs文件。例:
ivstools --convert out.cap out.ivs
它会将out.cap IV保存到out.ivs
注意:Kismet生成pcap文件(扩展名是.dump),可以转换
警告:aircrack的pcap2ivs和aircrack-ng到v0.2.1有一个错误,导致捕获损坏。您不应使用这些版本中的 pcap2ivs。如果您使用损坏的版本时有损坏的IV文件,请尝试使用FixIvs来恢复它。
Versuck-ng
versuck-ng的目的是计算Verizon发布的Actiontec无线路由器的默认WEP密钥。它使用路由器使用的有线 Mac 中的已知硬件 ID 列表来执行此操作。根据BSSID的不同,有时您也可以使用它。OUI 需要在无线和有线 Mac 上进行匹配,才能使用 BSSID 才能正常工作。
Usage: versuck-ng options -m -e

Options:
-h, --help show this help message and exit
-m MAC, --mac=MAC Mac Address
-e ESSID, --essid=ESSID essid

versuck-ng -e ESSID -m WIRED_MAC
buddy-ng
查看easside-ng文档。
makeivs-ng
makeivs-ng 是一个工具,旨在使用输入的 WEP 密钥生成 IVS 转储文件。工具的目的是提供一种使用已知加密密钥创建转储的方法,以便进行测试。
默认情况下,它将生成一个文件,其中包含 100000 个数据包和 16 个字节的密钥流中的 BSSID 01:02:03:04:05:06。IV 将是连续的。可以添加各种参数来测试不同的场景:
选择 描述
-b or –bssid 设置 BSSID(接入点 MAC)。
-f <数字>或 –第一<数字> 生成的第一个 IV 的值。
-k <键>或 –键<键> 目标网络 WEP 密钥以十六进制显示。接受字节之间的分隔符,但不是必需的。
-s <>或 –种子<数> 种子用于设置随机生成器。可与 -p 或 –prng 结合使用。
-w <文件>或 –写入<文件> 要将 IV 写入的文件名。
-c <数>或 –计数<数> 要生成的 IV 量。默认值为 100000。
-d 或 –dupe 重复 IV 的百分比。
-e <数字>或 –错误<数字> 错误密钥流的百分比。
-l <号>或 -长度<号> 密钥流的大小。默认值:16 个字节。
-n 或 –nofms 忽略弱 IV。
-p 或 –prng 生成 IV 时使用随机值。默认值为使用顺序值。
所需的最小参数:-w 和 -k。
kstats
kstats 是一个工具,旨在显示 FMS 算法对具有指定 WEP 密钥的 IVS 转储的投票。IVS转储可以通过使用airodump-ng和ivstools的组合来获得。
用法:
kstats

  1. airdriver-ng(无线设备驱动管理工具)
    Airdriver-ng 是一个脚本,它提供有关系统上无线驱动程序的状态信息以及加载和卸载驱动程序的功能。此外,airdriver-ng允许您安装和卸载驱动程序,以及监控和注入模式所需的补丁。加上许多其他功能。
    以下是该脚本支持的命令的完整列表:
    No Command无命令:在没有命令的情况下运行 airdriver-ng 将显示您正在运行的内核编号和有效的 airdriver-ng 命令。
    Supported支持:列出脚本当前支持的无线堆栈和无线驱动程序。如果未列出所需的堆栈或驱动程序,则 airdriver-ng 当前不支持它。这些不是系统上安装的堆栈或驱动程序。
    Kernel内核:列出已直接编译到内核本身中的任何无线堆栈或无线驱动程序。如果您希望确定特定驱动程序是否已编译到内核中,请使用此选项。如果驱动程序已经是内核的一部分,则无法安装该驱动程序。您首先必须在没有特定驱动程序的情况下重新编译内核。

Installed已安装:列出系统上实际安装的无线堆栈和驱动程序。这些不是系统上当前加载(正在运行)的堆栈/驱动程序。如果您知道系统上是否已安装驱动程序,请使用此选项。这些驱动程序不属于内核。

Loaded已加载:列出当前在内存中加载(正在运行)的无线堆栈和驱动程序。

Load加载:此命令将指定的驱动程序加载到内存中。驱动程序编号是从"已安装"命令的输出中获取的。使用此命令将所需的驱动程序加载到内存中(如果在插入无线设备或启动时未加载)。

Unload卸载:此命令从内存中删除(卸载)指定的驱动程序。驱动程序编号是从"loaded"命令的输出中获取的。重新编译或安装新版本的驱动程序时,有时需要这样做。通常,安装新版本后重新加载就足够了。

Reload重新加载:通过从内存中删除指定的驱动程序,然后再次加载它来重新加载它。驱动程序编号是从"loaded"命令的输出中获取的。在安装新版本的驱动程序后使用它,或者如果您的驱动程序行为不端,它有时会有所帮助。

Install安装:在系统上安装指定的驱动程序并将其加载到内存中。驱动程序编号是从"loaded"命令的输出中获取的。所有必需的步骤都将为您处理,包括获取驱动程序源,获取注入补丁,应用补丁,编译然后将其加载到内存中。这是确保您的驱动程序能够注入的最简单,最简单的方法之一。您可能还需要安装相关堆栈才能使驱动程序完全正常运行。

Remove删除:从系统中删除指定的驱动程序。这将从内存和模块树中删除模块。如果您希望从系统中永久删除驱动程序,请使用此选项。

Install_Stack:在系统上安装指定的堆栈并将其加载到内存中。驱动程序编号是从"loaded"命令的输出中获取的。所有必需的步骤都将为您处理,包括获取堆栈源,获取注入补丁,应用补丁,编译然后将其加载到内存中。这是确保您的系统能够注入的最简单,最简单的方法之一。
Remove_Stack:从系统中删除指定的堆栈。这将从内存和模块树中删除堆栈。
Details详细信息:列出有关模块的详细信息。驱动程序编号是从"已安装"命令的输出中获取的。这对于确认您使用的是正确的版本以及安装时间特别有价值。安装日期位于文件名之后。这可用于确认您实际上正在使用最近编译的模块。一个常见的问题是,其中一个必需的模块是在不同的日期编译的。这通常意味着您有相同模块的两个不同版本,结果是驱动程序失败。如果发生这种情况,请删除所有模块并重新安装或重新编译。
Detect检测:用于确定哪些无线设备连接到系统。没有精确的方法来执行这些类型的检查。这更多地被视为有根据的猜测,而不是确定的信息。话虽如此,它通常会提供非常有用的信息。
该脚本还尝试通过首先确认系统上加载了正确的工具和软件来确保操作成功。如果您的系统无法执行请求的操作,您将收到警告和/或错误消息。尽管airdriver-ng试图将风险降至最低,但它将永远存在。请注意,在使用驱动程序时,这始终会给您的系统带来一定的风险。
3. airolib-ng(保存、管理ESSID密码列表)
Airolib-ng是一个aircrack-ng套件工具,旨在存储和管理essid和密码列表,计算其成对主密钥(PMK)并在WPA / WPA2破解中使用它们。该程序使用轻量级SQLite3数据库作为大多数平台上可用的存储机制。选择 SQLite3 数据库时考虑了平台可用性以及管理、内存和磁盘开销。
WPA/WPA2 破解涉及计算成对主密钥,私有瞬态密钥 (PTK) 就是从中派生出来的。使用PTK,我们可以计算给定数据包的帧消息标识码(MIC),并且可能会发现MIC与数据包相同,因此PTK是正确的,因此PMK也是正确的。
计算 PMK 非常慢,因为它使用 pbkdf2 算法。然而,对于给定的 ESSID 和密码组合,PMK 始终是相同的。这使我们能够预先计算给定组合的PMK,并加快破解wpa/ wpa2握手的速度。测试表明,在aircrack-ng中使用这种技术可以使用预先计算的 PMK 表每秒检查超过 50,000 个密码。
计算PMK仍然是必需的,但我们可以:
预先计算它以供以后和/或共享使用。
使用分布式计算机生成 PMK,并在其他位置使用它们的值。
用法
Usage: airolib [options]
数据库是数据库文件的名称。(可选)指定完整路径。
操作 指定要对数据库执行的操作。有关完整列表,请参见下文。
以下是有效的操作:

  • -stats - 输出有关数据库的一些信息。
  • -sql {sql} - 执行指定的 SQL 语句。
  • -clean [all] - 执行步骤以从旧垃圾中清除数据库。选项"all"还将尽可能减小文件大小并运行完整性检查。
  • -batch - 开始批处理 ESSID 和密码的所有组合。这必须在使用aircrack-ng中的数据库之前运行,或者在添加其他 SSID 或密码之后运行。
  • -verify [all]- 验证一组随机选择的 PMK。如果给出了选项"全部",则 all(!)验证数据库中的 PMK,并删除不正确的 PMK。
  • -export cowpatty {essid} {file} - 导出到 cowpatty 文件。
  • -import cowpatty {file} - 导入一个 cowpatty 文件并创建数据库(如果该数据库不存在)。
  • -import {essid|passwd} {file} - 将文本平面文件作为 ESSID 或密码的列表导入,如果数据库不存在,则创建数据库。此文件每行必须包含一个 essid 或密码。线路应以换行终止。意思是在输入值时按每行末尾的"Enter"。

    使用示例
    以下是每个操作的使用示例。
    Status Operation状态操作
    进入:
    airolib-ng testdb --stats
    testdb 是要创建的数据库的名称。
  • -stats 是要执行的操作。
    系统响应:
    statsThere are 2 ESSIDs and 232 passwords in the database. 464 out of 464 possible combinations have been computed (100%).

ESSID Priority Done
Harkonen 64 100.0
teddy 64 100.0
SQL 操作
以下示例将为 SSID"非常重要的ESSID"提供最大优先级。
进入:
airolib-ng testdb --sql ‘update essid set prio=(select min(prio)-1 from essid) where essid=“VeryImportantESSID”;’
系统响应:
update essid set prio=(select min(prio)-1 from essid) where essid=“VeryImportantESSID”;
Query done. 1 rows affected.
以下示例将在 pmk 中查找非常重要的模式。
进入:
airolib-ng testdb --sql ‘select hex(pmk) from pmk where hex(pmk) like “%DEADBEEF%”’
系统响应:
hex(pmk) BF3F122D3CE9ED6C6E7E1D7D13505E0A41EC4C5A3DEADBEEFFEFF597387AFCE3
Clean Operation
要执行基本清除,请输入:
airolib-ng testdb --clean
系统响应:
cleanDeleting invalid ESSIDs and passwords…
Deleting unreferenced PMKs…
Analysing index structure…
Done.
要执行基本清理,请尽可能减小文件大小并运行完整性检查。输入:
airolib-ng testdb --clean all
系统响应:

Computed 464 PMK in 10 seconds (46 PMK/s, 0 in buffer). No free ESSID found. Will try determining new ESSID in 5 minutes…
Verify Operation验证操作
要验证 1000 个随机 PMK,请输入:
airolib-ng testdb --verify
系统响应:
verifyChecking ~10.000 randomly chosen PMKs…
ESSID CHECKED STATUS
Harkonen 233 OK
teddy 233 OK
要验证所有 PMK,请输入:
airolib-ng testdb --verify all
系统响应:
verifyChecking all PMKs. This could take a while…
ESSID PASSWORD PMK_DB CORRECT
Cowpatty table Export Operation牛板表出口操作
进入:
airolib-ng testdb --export cowpatty test cowexportoftest
系统响应:
exportExporting…
Done.
Import Operation导入操作
要导入 SSID 的 ascii 列表并创建数据库(如果不存在),请输入:
airolib-ng testdb --import essid ssidlist.txt
testdb 是要更新的数据库的名称,如果它不存在,将创建它。

  • -import 是要执行的操作。
    essid 表示它是 SSID 的列表。
    ssidlist.txt是包含 SSID 的文件名。每行一个。可以选择将其完全限定。
    系统响应:
    importReading…
    Writing…
    Done.
    密码
    要导入密码的 ascii 列表并创建数据库(如果不存在),请输入:
    airolib-ng testdb --import passwd password.lst
    testdb 是要更新的数据库的名称,如果它不存在,将创建它。
  • -import 是要执行的操作。
    passwd 表示它是密码列表。
    password.list 是文件名。每行一个。可以选择将其完全限定。
    系统响应:
    importReading…
    Writing… read, 1814 invalid lines ignored.
    Done.
    Cowpatty tables
    导入 cowpatty 表并创建数据库(如果该数据库不存在),请输入:
    airolib-ng testdb --import cowpatty cowexportoftest
    testdb 是要更新的数据库的名称,如果它不存在,将创建它。
  • -import 是要执行的操作。
    cowpatty 表示这是一个 cowpatty 表。
    cowexportoftest 是文件名。每行一个。可以选择将其完全限定。

系统响应:
importReading header…
Reading…
Updating references…
Writing…
4. airserv-ng(允许不同的进程访问无线网卡)
Airserv-ng是一种无线网卡服务器,它允许多个无线应用程序通过客户端 - 服务器TCP网络连接独立使用无线网卡。所有操作系统和无线网卡驱动程序特定的代码都合并到服务器中。这样就无需每个无线应用都包含复杂的无线网卡和驱动程序逻辑。它还支持多种操作系统。
当服务器启动时,它会在特定的 IP 和 TCP 端口号上侦听客户端连接。然后,无线应用程序通过此 IP 地址和端口与服务器进行通信。使用 aircrack-ng 套件功能时,请指定"<服务器 IP 地址>冒号<端口号>",而不是网络接口。例如 127.0.0.1:666。
二、aircrack-ng破解个人手机Wi-Fi密码功能测试

(一)、破解流程
1、监听网卡
2、搜索wifi
3、查看wifi用户
4、发送大量数据报迫使用户下线
5、用户重登录抓取密码数据包
6、字典爆破

(二)、具体过程

1、虚拟机无法连接本机自带网卡,只能使用USB连接网卡。需要准备一块外接无线网卡。

2、查看网络无线网络设备信息,确保网卡连接成功,在kali操作系统下,打开terminal,
输入su命令进入root模式。

3、将网卡设置为监听模式 —— airmon-ng start wlan0
显示在wlan0mon上进行监听

可以看到上图出现了两个可能导致问题的进程,用airmon-ng check kill 命令自动检查冲突程序并强制关闭

4、输入airodump-ng wlan0mon 获取附近能够搜索到的无线网络,挑选一个进行攻击测试。

PWR为信号强度,数值越大,信号强度越高,越稳定。我们应该选取PWR较高的目标进行破解

5、选择一个合适的目标,用airodump-ng 进行抓包

6、新建一个终端,用aireplay-ng对目标发送大量数据包,进行“洪水攻击”,迫使此无线网络的连接用户断开。然后重新连接,捕获用户重新连接过程发送的数据包,主要获取握手包,里面包含了目标网络的验证信息。

成功捕获握手报,下面就可以开始进行字典破解啦

7、字典破解
破解前,首先要准备好破解字典。我们利用kali系统自带的字典rockyou.txt.路径:/usr/share/wordlists

第一次没有成功

第二次实验成功破解了8E:2B:10:EE:69:6C的AP密码。密码为:virgo123
上面我们对aircrack-ng的无线局域网破解功能进行了测试,下面我们将针对过程中使用到的模块进行具体介绍和分析,对WPA2的加密原理和解密原理进行介绍。
三、WPA加解密原理介绍
(一)WPA加密原理
WPA全名为Wi-Fi Protected Access,有WPA、WPA2和WPA3三个标准,是一种保护无线电脑网络(Wi-Fi)安全的系统,它是应研究者在前一代的系统有线等效加密(WEP)中找到的几个严重的弱点而产生的。WPA实作了IEEE 802.11i标准的大部分,是在802.11i完备之前替代WEP的过渡方案。WPA的设计可以用在所有的无线网卡上,但未必能用在第一代的无线取用点上。WPA2具备完整的标准体系,但其不能被应用在某些老旧型号的网卡上。

(二)加密方式
WPA密码其实叫PSK(pre-sharedkey),PSK 运作方式–>利用 PSK+5个参数来生成成对的临时密钥(PTK:Pairwise Transient Key),然后利用该密钥进行加密无线AP与申请者之间的通话信道。
网络的SSID
无线AP随机数 A-Nonce(Authenticator Nonce)
申请者随机数 S-Nonce(Supplicant Nonce)
无线AP MAC 地址
申请者MAC地址
通过wifi信道嗅探可以窃取整个会话过程中的所有5个参数,唯一不可获取的的仅为PSK。PSK生成:由用户提供的WPA-PSK密码外加SSID创建而成。WPA-PSK密码外加SSID都通过基于密码的密钥派生函数(Password-Based Key Derivation Function,PBKDF2)发送,该函数会输出一个256位的共享密钥。PSK长度一般是8-63字节,它加上ssid通过一定的算法可以得到PMK(pairwisemaster key)。PMK=SHA-1(ssid,psk) ,PMK的长度是定长的,都是64字节。由于计算PMK的过程开销比较大,采用以空间换时间的原则把PMK事先生成好,这个表就是HASH表,这个工作就是用airlib-ng这个工具来完成的。
认证的时候会生成一个PTK(pairwisetemporary),这是一组密钥,它采用的哈希算法,参数是连接的客户端MAC地址、AP的BSSID、A-NONCE、S-NONCE、PMK,其中A-NONCE和S-NONCE是两个随机数,确保每次连接都会生成不同的PTK。PTK的计算消耗很小。PTK加上报文数据采用一定的算法(AES或TKIP),得到密文,同时会得到一个签名,叫做MIC(message integrality check)。由于协议方式四次握手的包中含有客户端的MAC地址,AP的BSSID,A-NONCE,S-NONE,MIC,但是PMK和PTK是不包含在握手包里。 认证原理是在获得以上的所有参数后,客户端算出一个MIC,把原文连同MIC一起发给AP,AP采用相同的参数与算法计算出MIC,并与客户端发过来的比较,如果一致,则认证通过,否则失败。
(三)破解方法——字典爆破
当我们获得握手包后,用我们字典中的PSK+ssid先生成PMK(如果有HASH表则略过),然后结合握手包中的(客户端MAC,AP的BSSID,A-NONCE,S-NONCE)计算PTK,再加上原始的报文数据算出MIC并与AP发送的MIC比较,如果一致,那么该PSK就是密钥。

四、主要破解模块代码分析、
注:所有代码均从main()函数开始阅读,只注释关键函数或变量
3.Aircrack-ng破解:
一般wifi的加密方式分为两种:wep和wpa/wpa2.wep加密方式比较简单,利用aircrack-ng可以直接读取到密码,这种加密方式已经淘汰。如今路由器加密已经基本都是wpa/wpa2加密方式。
wpa/wpa2的加密方式相对复杂,针对这种方式加密后的秘钥只能通过暴力破解,暴力破解一般都是基于字典的爆破。网上下载的字典一般集合了很多弱口令或者人们常用的密码。
首先需要利用airodump进行抓握手包,握手包里面包含了加密后的wifi认证信息,认证信息里面就包含着密码。接着用aireplay-ng模块选择期望的攻击模式对目标发起攻击,并将握手包保存在指定的文件中。然后使用aircrack-ng模块对抓到的握手包进行上一节提到的字典爆破。
什么是握手包:
握手包是指无线AP与它的一个合法客户端在进行认证时,捕获“信息原文”和加密后的“密文”
1、当一个无线客户端与一个无线AP连接时,先发出连接认证请求(握手申请:你好!)
2、无线AP收到请求以后,将一段随机信息发送给无线客户端(你是?)
3、无线客户端将接收到的这段随机信息进行加密之后再发送给无线AP (这是我的名片)
4、无线AP检查加密的结果是否正确,如果正确则同意连接 (哦~ 原来是自己人呀!)

(一) aireplay-ng代码分析
1、 从主函数开始分析 源文件第5966行开始到文件结束。
2、 关键结构体变量opt,其中的变量是控制程序进行的关键信号
int main(int argc, char * argv[])//主函数
{
int n, i, ret;

/* check the arguments */

memset(&opt, 0, sizeof(opt));
memset(&dev, 0, sizeof(dev));

opt.f_type = -1;//文件类型
opt.f_subtype = -1;//含有表单数据的控制帧标记
opt.f_minlen = -1;//文件最小长度
opt.f_maxlen = -1;//最大长度
opt.f_tods = -1;//到目的地址的控制帧标记
opt.f_fromds = -1;//从目的地址出发的控制帧标志
opt.f_iswep = -1;//含有wep数据的控制帧标记
opt.ringbuffer = 8;//环形缓冲区

opt.a_mode = -1;//攻击模式标记
opt.r_fctrl = -1;//控制帧中包含的信息标记
opt.ghost = 0;//主机名
opt.delay = 15;
opt.bittest = 0;//比特率测试,仅适用于测试模式
opt.fast = 0;//第一次匹配的数据包标记
opt.r_smac_set = 0;
opt.npackets = 1;
opt.nodetect = 0;
opt.rtc = 1;
opt.f_retry = 0;
opt.reassoc = 0;
opt.deauth_rc = 7; /* By default deauth reason code is Class 3 frame
                      received from nonassociated STA */

3、 使用命令解析函数getopt_long()匹配输入的命令,并返回给option变量
while (1)//根据用户输入的参数,设置opt.mode,选择不同的攻击模式,执行不同的攻击函数;
{
int option_index = 0;

    static struct option long_options[]  
        = {{"deauth", 1, 0, '0'},
           {"fakeauth", 1, 0, '1'},
           {"interactive", 0, 0, '2'},
           {"arpreplay", 0, 0, '3'},
           {"chopchop", 0, 0, '4'},
           {"fragment", 0, 0, '5'},
           {"caffe-latte", 0, 0, '6'},
           {"cfrag", 0, 0, '7'},
           {"test", 0, 0, '9'},
           {"help", 0, 0, 'H'},
           {"fast", 0, 0, 'F'},
           {"bittest", 0, 0, 'B'},
           {"migmode", 0, 0, '8'},
           {"ignore-negative-one", 0, &opt.ignore_negative_one, 1},
           {"deauth-rc", 1, 0, 'Z'},
           {0, 0, 0, 0}};

    int option = getopt_long(argc,//命令解析函数,用传入的参数与短选项和长选项匹配(长选项是短选项的全称),匹配成功,返回相应的值。
                             argv,
                             "b:d:s:m:n:u:v:t:Z:T:f:g:w:x:p:a:c:h:e:ji:r:k:"
                             "l:y:o:q:Q0:1:23456789HFBDR",
                             long_options,
                             &option_index);

4、 根据不同的option值,执行判断语句switch中的不同部分,设置opt结构体中的变量。为攻击函数的执行做准备
//参数1到9对应不同攻击模式,设置opt.a_mode为相应的值,以便最后的判断,这是关键
//除去1~9外,所有选项都可以限制数据包来源,对数据包进行过滤。
switch (option)//判断option值,设置opt结构体中各个变量的值或执行相应的操作
{
case 0:

            break;

        case ':':

            printf("\"%s --help\" for help.\n", argv[0]);
            return (1);

        case '?':

            printf("\"%s --help\" for help.\n", argv[0]);
            return (1);

        case 'b':

            if (getmac(optarg, 1, opt.f_bssid) != 0)//获取目标接入点的mac地址
            {
                printf("Invalid BSSID (AP MAC address).\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'd':

            if (getmac(optarg, 1, opt.f_dmac) != 0)//目的mac
            {
                printf("Invalid destination MAC address.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 's'://源mac

            if (getmac(optarg, 1, opt.f_smac) != 0)
            {
                printf("Invalid source MAC address.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'm'://数据包最小长度

            ret = sscanf(optarg, "%d", &opt.f_minlen);
            if (opt.f_minlen < 0 || ret != 1)
            {
                printf("Invalid minimum length filter. [>=0]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'n'://数据包最大长度

            ret = sscanf(optarg, "%d", &opt.f_maxlen);
            if (opt.f_maxlen < 0 || ret != 1)
            {
                printf("Invalid maximum length filter. [>=0]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'u'://含有关键词的控制帧

            ret = sscanf(optarg, "%d", &opt.f_type);
            if (opt.f_type < 0 || opt.f_type > 3 || ret != 1)
            {
                printf("Invalid type filter. [0-3]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'v'://含有表单数据的控制帧

            ret = sscanf(optarg, "%d", &opt.f_subtype);
            if (opt.f_subtype < 0 || opt.f_subtype > 15 || ret != 1)
            {
                printf("Invalid subtype filter. [0-15]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'T':
            ret = sscanf(optarg, "%d", &opt.f_retry);
            if ((opt.f_retry < 1) || (opt.f_retry > 65535) || (ret != 1))
            {
                printf("Invalid retry setting. [1-65535]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 't'://到目的地址的控制帧

            ret = sscanf(optarg, "%d", &opt.f_tods);
            if ((opt.f_tods != 0 && opt.f_tods != 1) || ret != 1)
            {
                printf("Invalid tods filter. [0,1]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'f'://从目的地址出发的控制帧

            ret = sscanf(optarg, "%d", &opt.f_fromds);
            if ((opt.f_fromds != 0 && opt.f_fromds != 1) || ret != 1)
            {
                printf("Invalid fromds filter. [0,1]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'w'://含有WEP数据的控制帧

            ret = sscanf(optarg, "%d", &opt.f_iswep);
            if ((opt.f_iswep != 0 && opt.f_iswep != 1) || ret != 1)
            {
                printf("Invalid wep filter. [0,1]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

/以上是过滤选项/
//下面是重放选项
case ‘x’:

            ret = sscanf(optarg, "%d", &opt.r_nbpps);
            if (opt.r_nbpps < 1 || opt.r_nbpps > 1024 || ret != 1)
            {
                printf("Invalid number of packets per second. [1-1024]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'Z':

            ret = sscanf(optarg, "%hhu", &opt.deauth_rc);
            if (ret != 1)
            {
                printf("Invalid deauth reason. [0-254]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'o'://每次攻击含数据包的数量

            ret = sscanf(optarg, "%d", &opt.npackets);//将过获取到的参数输入
            if (opt.npackets < 0 || opt.npackets > 512 || ret != 1)
            {
                printf("Invalid number of packets per burst. [0-512]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'q'://持续活动时间

            ret = sscanf(optarg, "%d", &opt.delay);
            if (opt.delay < 1 || opt.delay > 600 || ret != 1)
            {
                printf("Invalid number of seconds. [1-600]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'Q':

            opt.reassoc = 1;
            break;

        case 'p'://设置控制帧中的包含信息

            ret = sscanf(optarg, "%x", &opt.r_fctrl);
            if (opt.r_fctrl > 65535 || ret != 1)
            {
                printf("Invalid frame control word. [0-65535]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'a'://设置杰接入点mac地址

            if (getmac(optarg, 1, opt.r_bssid) != 0)
            {
                printf("Invalid AP MAC address.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'c':

            if (getmac(optarg, 1, opt.r_dmac) != 0)
            {
                printf("Invalid destination MAC address.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'g':

            ret = sscanf(optarg, "%d", &opt.ringbuffer);
            if (opt.ringbuffer < 1 || ret != 1)
            {
                printf("Invalid replay ring buffer size. [>=1]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case 'h':

            if (getmac(optarg, 1, opt.r_smac) != 0)
            {
                printf("Invalid source MAC address.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.r_smac_set = 1;
            break;

        case 'e':

            memset(opt.r_essid, 0, sizeof(opt.r_essid));
            strncpy(opt.r_essid, optarg, sizeof(opt.r_essid) - 1);
            break;

        case 'j':

            opt.r_fromdsinj = 1;
            break;

        case 'D':

            opt.nodetect = 1;
            break;

        case 'k':

            inet_aton(optarg, (struct in_addr *) opt.r_dip);
            break;

        case 'l':

            inet_aton(optarg, (struct in_addr *) opt.r_sip);
            break;

        case 'y':

            if (opt.prga != NULL)
            {
                printf("PRGA file already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            if (read_prga(&(opt.prga), optarg) != 0)
            {
                return (1);
            }
            break;

        case 'i':

            if (opt.s_face != NULL || opt.s_file)
            {
                printf("Packet source already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.s_face = optarg;
            opt.port_in
                = get_ip_port(opt.s_face, opt.ip_in, sizeof(opt.ip_in) - 1);
            break;

        case 'r':

            if (opt.s_face != NULL || opt.s_file)
            {
                printf("Packet source already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.s_file = optarg;
            break;

        case 'z':

            opt.ghost = 1;

            break;

//参数1到9对应不同攻击模式,设置opt.a_mode为相应的值,以便最后的判断,关键一步
case ‘0’:

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 0;

            for (i = 0; optarg[i] != 0; i++)
            {
                if (isdigit((int) optarg[i]) == 0) break;
            }

            ret = sscanf(optarg, "%d", &opt.a_count);
            if (opt.a_count < 0 || optarg[i] != 0 || ret != 1)
            {
                printf("Invalid deauthentication count or missing value. "
                       "[>=0]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case '1':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 1;

            for (i = 0; optarg[i] != 0; i++)
            {
                if (isdigit((int) optarg[i]) == 0) break;
            }

            ret = sscanf(optarg, "%d", &opt.a_delay);
            if (opt.a_delay < 0 || optarg[i] != 0 || ret != 1)
            {
                printf("Invalid reauthentication delay or missing value. "
                       "[>=0]\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            break;

        case '2':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 2;
            break;

        case '3':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 3;
            break;

        case '4':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 4;
            break;

        case '5':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 5;
            break;

        case '6':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 6;
            break;

        case '7':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 7;
            break;

        case '9':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 9;
            break;

        case '8':

            if (opt.a_mode != -1)
            {
                printf("Attack mode already specified.\n");
                printf("\"%s --help\" for help.\n", argv[0]);
                return (1);
            }
            opt.a_mode = 8;
            break;

        case 'F':

            opt.fast = 1;
            break;

        case 'B':

            opt.bittest = 1;//比特率测试标志置为1.
            break;

        case 'H'://输出帮助信息

            printf(usage,
                   getVersion("Aireplay-ng",
                              _MAJ,
                              _MIN,
                              _SUB_MIN,
                              _REVISION,
                              _BETA,
                              _RC));
            return (1);

        case 'R':

            opt.rtc = 0;  //禁止Rtc的使用。
            break;

        default:
            goto usage;//输出help信息
    }
}

5、 接着判断传参是否有误
if (argc - optind != 1)//optind指向argv当前索引值
{
if (argc == 1)//如果argc为1,说明未传递参数,打印使用说明。
{
usage:
printf(usage,
getVersion(“Aireplay-ng”,
_MAJ,
_MIN,
_SUB_MIN,
_REVISION,
_BETA,
_RC));
}
if (argc - optind == 0)//如果optind和argc值相等,说明参数为空,没有向主函数传递任何参数
{
printf(“No replay interface specified.\n”);
}
if (argc > 1) //提示打印帮助信息
{
printf(""%s --help" for help.\n", argv[0]);
}
return (1);
}
6、 最后根据opt.a_mode执行相应的攻击函数。
switch (opt.a_mode)
{
case 0:
return (do_attack_deauth());//
case 1:
return (do_attack_fake_auth());
case 2:
return (do_attack_interactive());
case 3:
return (do_attack_arp_resend());
case 4:
return (do_attack_chopchop());
case 5:
return (do_attack_fragment());
case 6:
return (do_attack_caffe_latte());
case 7:
return (do_attack_cfrag());
case 8:
return (do_attack_migmode());
case 9:
return (do_attack_test());
default:
break;
}
(二) aircrack-ng主要函数代码分析:
(1)函数next-dict:打开已下载的字典:
在这里插入图片描述
在这里插入图片描述

(2)函数do_wpa_crack功能:使用字典中的密码进行认证尝试,相关注释如下截图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(3)函数next_key功能:对投票率最高的几个秘钥进行测试,相关注释截图如下:
在这里插入图片描述

(4)函数crack_wep_dict功能:使用指定的字典破解WEP秘钥,相关注释截图如下:

在这里插入图片描述
在这里插入图片描述

(5)函数crack_wep_ptw功能:使用PTW攻击破解WEP秘钥,相关注释截图如下:
在这里插入图片描述
在这里插入图片描述

五、整体框架图
攻击流程图:
在这里插入图片描述

六、总体框架图
在这里插入图片描述

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

aircrack-ng 介绍、功能测试及部分源码分析 的相关文章

  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 200道网络安全常见面试题合集(附答案解析+配套资料)

    有不少小伙伴面临跳槽或者找工作 本文总结了常见的安全岗位面试题 方便各位复习 祝各位事业顺利 财运亨通 在网络安全的道路上越走越远 所有的资料都整理成了PDF 面试题和答案将会持续更新 因为无论如何也不可能覆盖所有的面试题 php爆绝对路径
  • 软件测试|深入了解Python中的super()函数用法

    简介 Python中的super 函数是一种强大的工具 用于在子类中调用父类的方法 它在面向对象编程中非常有用 可以让你轻松地扩展和重用现有的类 本文将详细介绍super 函数的用法 并提供一些示例来帮助你更好地理解它的功能 什么是supe
  • 软件测试|Python中如何提取列表中索引为奇数的元素

    简介 在Python中 我们经常需要从列表中提取特定位置的元素 如果我们想要提取列表中索引为奇数的元素 可以使用一些简单的方法来实现这一目标 本文将介绍如何在Python中提取列表中索引为奇数的元素 并提供示例代码来帮助大家更好地理解这个过
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 软件测试|Selenium StaleElementReferenceException 异常分析与解决

    简介 Selenium 是一个流行的自动化测试工具 用于模拟用户与网页交互 然而 当我们在使用 Selenium 时 可能会遇到一个常见的异常 即 StaleElementReferenceException 这个异常通常在我们尝试与网页上
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 网络安全(黑客)自学

    1 网络安全是什么 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 2 网络安全市场 一 是市场需求量高 二 则是发展相对成熟入门比较容易 3 所需要的
  • 软件测试|pycharm关联GitHub的详细步骤

    简介 GitHub 是全球最大的开源代码托管平台之一 而 PyCharm 是一款强大的 Python 集成开发环境 将两者结合使用 可以提高团队协作和代码管理的效率 本文将详细介绍如何在 PyCharm 中管理 GitHub 账号 包括如何
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 网络安全:绕过 MSF 的一次渗透测试

    这次渗透的主站是 一个 Discuz 3 4 的搭建 违法招 piao 网站 配置有宝塔 WAF 用 Discuz ML 3 X 的漏洞进行攻击 但是没有成功 发现主站外链会有一个发卡网 引导人们来这充值 是 某某发卡网 而且域名指向也是主
  • 短信系统搭建主要因素|网页短信平台开发源码

    短信系统搭建主要因素 网页短信平台开发源码 随着移动互联网的快速发展 短信系统已成为企业和个人进行信息传递的重要工具 建立一个高效可靠的短信系统对于企业来说非常重要 下面我们将介绍一些影响短信系统搭建的主要因素 1 平台选择 在搭建短信系统
  • 你的服务器还安全吗?用户数据是否面临泄露风险?

    一系列严重的网络安全事件引起了广泛关注 多家知名公司的服务器遭到黑客挟持 用户的个人数据和敏感信息面临泄露的风险 这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性 提醒着企业和个人加强对网络安全的重视 一 入侵案例 1 1 蔚来数据泄露 1
  • 【网络安全】——区块链安全和共识机制

    区块链安全和共识机制 摘要 区块链技术作为一种分布式去中心化的技术 在无需第三方的情况下 使得未建立信任的交易双方可以达成交易 因此 区块链技术近年来也在金融 医疗 能源等多个行业得到了快速发展 然而 区块链为无信任的网络提供保障的同时 也
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全

随机推荐

  • selenium爬虫_selenium爬虫如何避免对isTrusted属性检测?

    1 前言 各位码友 有两天不见 想小码哥了没 哈哈哈 成都疫情在平静9个月之后 又死灰复燃 目前还未找到确切的源头 提醒各位成都的码友一定注意戴口罩 做好自我防护 相信有关部门的防疫措施 一起共渡难关 好了 今天咱们再继续selenium爬
  • MyBatis---缓存-提高检索效率的利器

    目录 让我们来看看官方文档 缓存 一 一级缓存 1 基本介绍 2 一级缓存 3 一级缓存失效分析 二 二级缓存 1 基本介绍 2 二级缓存快速入门 2 1快速入门 3 注意事项和使用陷阱 三 Mybatis 的一级缓存和二级缓存执行顺序 四
  • C++对象模型之内存区的使用

    对象模型是面向对象程序设计语言的一个重要方面 它会直接影响面向对象语言编写程序的运行机制及对内在的使用机制 因此了解对象模型是进行程序优化 的基础 分析一般意义上程序中的数据在内存中的分布 以及程序使用的不同种类的内存等基本的概念 了解对象
  • 第八章(3) 聚类:DBSCAN和簇评估

    基于密度的聚类寻找被低密度区域分离的高密度区域 传统的密度 基于中心的方法 数据集中特定点的密度通过对该点半径之内的点计数 包括本身 来估计 关键是确定半径 根据基于中心的密度进行点分类 稠密区域内的点 核心点 点的邻域由距离函数和指定半径
  • 微信小程序(十)之消息推送配置(token验证失败的解决方案)

    背景 微信小程序开发 准备使用模板消息做些事情 但是发现需要先在微信公众平台的开发 开发设置 消息推送做配置 然后我们后台人员就开始各种配置 但是一到验证token就报错 很是郁闷 然后各种排查 发现了最终原因 过程和代码如下 很多网站给出
  • datx 开启debug

    1 datax源码编译 编译 mvn U clean package assembly assembly Dmaven test skip true 2 创建mysql测试表 SET FOREIGN KEY CHECKS 0 Table s
  • mysql中 SET autocommit=0 与 START TRANSACTION 的区别

    在MySQL中 SET autocommit 0 指事务非自动提交 自此句命令执行以后 每个SQL语句或者语句块所在的事务都需要显式调用commit才能提交事务 不管autocommit 是1还是0 START TRANSACTION co
  • ssh 配置文件中 maxsessions 与 MaxStartups

    MaxStartups 同时允许几个尚未登入的联机画面 所谓联机画面就是在你ssh登录的时候 没有输入密码的阶段 如下图 maxsessions 同一地址的最大连接数 也就是同一个IP地址最大可以保持多少个链接 转载于 https blog
  • CentOS基础命令大全

    1 关机 立即关机 shutdown h now 立即关机 init 0 立即关机 telinit 0 预约时间关机 shutdown h hours minutes 取消预约关机 shutdown c 重启 shutdown r now
  • 一些关于远程仓库操作的git指令

    1 更换项目所关联的仓库 要先删除目前的远程仓库 然后再添加新的远程仓库 1 git remote rm origin 2 git remote add origin 新的仓库地址 3 git remote v 查看现在的远程仓库 4 gi
  • Hausdorff 距离

    Hausdorff 距离是描述两组点集之间相似程度的一种量度 假设有两组集合 则这两个点集之间的单向 Hausdorff 距离 其中 a b 表示 a 与 b 之间的欧氏距离 h A B 也叫前向 Hausdorff 距离 h B A 也叫
  • Android9.0 mm编译失败:ninja: error: 'xxx', needed by 'xxx', missing and no known rule to make it

    Android系统源码环境下使用mm命令单独编译某一个模块 如果该模块依赖其它模块 可能会报如下错误 解决此问题的方法就是改成mma命令编译 mma命令会构建所需要的关联模块 编译命令简单总结 mm 编译当前目录下的模块 当前目录下要有An
  • 获取成员函数地址及获取函数地址

    首先我们定义一个类Ctest 类里面包含三个不同形式的成员函数 静态成员函数statFunc 动态成员函数dynFunc 和虚拟函数virtFunc 在main函数中我们利用cout标准输出流分别输出这三个函数的地址 程序如下所示 incl
  • WebSocket协议深度解析

    WebSocket协议深度解析 1 WebSocket简介 WebSocket相比于Http协议 它有如下几个优点 支持双向通信 更灵活 更高效 可扩展性更好 支持双向通信 实时性更强 更好的二进制支持 较少的控制开销 连接创建后 ws客户
  • NER相关技术

    实体词典匹配 优点 缺点 模型原理 优点 缺点 模型输入 模型输出 实体词典匹配 模型预测两路结果是怎么合并输出的 目前我们采用训练好的CRF权重网络作为打分器 来对实体词典匹配 模型预测两路输出的NER路径进行打分 在词典匹配无结果或是其
  • 随机生成六位不重复数值

    在 Core JAVA 中有个随机生成六位不重复数值的算法 大二用过一次 今天在写 Algorithms 的练习题遇到类似的问题 特贴出 1 随机生成六位不重复的数字 2 private static int generate6BitInt
  • Mybatis的四种分页方式详解

    LIMIT关键字 mapper代码 select from tb user limit pageNo pageSize 业务层直接调用 public List findByPageInfo PageInfo info return user
  • 关于微信小程序在部分PC设备无法打开的问题

    目前为止微信小程序PC端仍处于灰度测试阶段 部分设备无法打开微信小程序 这个问题在启用分包能力后尤为明显 由于我们不能去控制用户通过PC端访问小程序的行为 仍需对PC端兼容性进行测试 下面我们来介绍测试方式 一 安装微信客户端大于3 4 5
  • 【LeetCode75】第五十四题 咒语和药水的成功对数

    目录 题目 示例 分析 代码 题目 示例 分析 题目给我们两个数组 要我们找出第一个数组中每个元素能和另一个数组的元素匹配的数量 匹配的条件是乘积大于特定的值 那么要乘积大于某个值 就需要乘数越大越好 我们可以把表示药水的数组升序排序 接着
  • aircrack-ng 介绍、功能测试及部分源码分析

    aircrack ng 介绍 功能测试及部分源码分析 实验目的 1 理清aircrack ng的总体设计框架 包括各模块的功能与联系 2 核心模块的实现原理 aircrack ng aireplay ng airodump ng 实验要求