Showing preview only (2,447K chars total). Download the full file or copy to clipboard to get everything.
Repository: v1s1t0r1sh3r3/airgeddon
Branch: master
Commit: d7e24237acd3
Files: 24
Total size: 2.3 MB
Directory structure:
gitextract_6cbgby3e/
├── .airgeddonrc
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug_report.yml
│ │ ├── 2-general_question.yml
│ │ ├── 3-feature_request.yml
│ │ ├── 4-compatibility_enhancement.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── dev.yml
│ └── master.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── airgeddon.sh
├── language_strings.sh
├── pindb_checksum.txt
└── plugins/
├── missing_dependencies.sh
└── plugin_template.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .airgeddonrc
================================================
#Enabled true / Disabled false - Auto update feature (it has no effect on development mode) - Default value true
AIRGEDDON_AUTO_UPDATE=true
#Enabled true / Disabled false - Skip intro (it has no effect on development mode) - Default value false
AIRGEDDON_SKIP_INTRO=false
#Enabled true / Disabled false - Allow colorized output - Default value true
AIRGEDDON_BASIC_COLORS=true
#Enabled true / Disabled false - Allow extended colorized output (ccze tool needed, it has no effect on disabled basic colors) - Default value true
AIRGEDDON_EXTENDED_COLORS=true
#Enabled true / Disabled false - Auto change language feature - Default value true
AIRGEDDON_AUTO_CHANGE_LANGUAGE=true
#Enabled true / Disabled false - Dependencies, root and bash version checks are done silently (it has no effect on development mode) - Default value false
AIRGEDDON_SILENT_CHECKS=false
#Enabled true / Disabled false - Print help hints on menus - Default value true
AIRGEDDON_PRINT_HINTS=true
#Enabled true / Disabled false - Enable 5Ghz support (it has no effect if your cards are not 5Ghz compatible cards) - Default value true
AIRGEDDON_5GHZ_ENABLED=true
#Enabled true / Disabled false - Force to use iptables instead of nftables (it has no effect if nftables are not present) - Default value false
AIRGEDDON_FORCE_IPTABLES=false
#Enabled true / Disabled false - Force to kill Network Manager before launching Evil Twin attacks - Default value true
AIRGEDDON_FORCE_NETWORK_MANAGER_KILLING=true
#Available values: mdk3, mdk4 - Define which mdk version is going to be used - Default value mdk4
AIRGEDDON_MDK_VERSION=mdk4
#Enabled true / Disabled false - Enable plugins system - Default value true
AIRGEDDON_PLUGINS_ENABLED=true
#Enabled true / Disabled false - Enable ESSID stripping during Evil Twin attacks - Default value true
AIRGEDDON_EVIL_TWIN_ESSID_STRIPPING=true
#Enabled true / Disabled false - Enable sounds for Evil Twin attacks - Default value true
AIRGEDDON_EVIL_TWIN_SOUNDS=true
#Enabled true / Disabled false - Development mode for faster development skipping intro and all initial checks - Default value false
AIRGEDDON_DEVELOPMENT_MODE=false
#Enabled true / Disabled false - Debug mode for development printing debug information - Default value false
AIRGEDDON_DEBUG_MODE=false
#Available values: xterm, tmux - Define the needed tool to be used for windows handling - Default value xterm
AIRGEDDON_WINDOWS_HANDLING=xterm
================================================
FILE: .editorconfig
================================================
#EditorConfig: http://editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
[*.{sh,db,txt}]
trim_trailing_whitespace = true
[*.{sh,db}]
indent_style = tab
indent_size = 4
[Dockerfile]
indent_style = tab
indent_size = 4
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto eol=lf
# Text files and source code
*.txt text
*.yml text
*.sh text
*.md text
*.db text
# Executable binaries/packages
*.deb binary
*.xz binary
# Binary image formats
*.png binary
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: v1s1t0r1sh3r3
buy_me_a_coffee: v1s1t0r
custom: ['https://www.paypal.com/paypalme/airgeddon', 'https://airgeddon.creator-spring.com/']
================================================
FILE: .github/ISSUE_TEMPLATE/1-bug_report.yml
================================================
name: Bug Report
description: Create a report to help us improve
title: "[Possible Bug]: "
labels: ["needs triage", "bug"]
projects: ["v1s1t0r1sh3r3/airgeddon"]
body:
- type: markdown
attributes:
value: |
Please, consider asking your questions in the very active Discord community before opening an issue here. Issues must be opened in English. Submissions that are incomplete or incorrectly filled out will be automatically closed. For more info, check our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
- type: input
id: version
attributes:
label: airgeddon version
description: What is your airgeddon version? You can check it at the beginning of the script, in the title on the main menu, and in the "About & Credits / Sponsorship mentions" menu option
placeholder: e.g., v11.50
validations:
required: true
- type: input
id: os
attributes:
label: O.S. and version
description: What is your Linux OS and what version?
placeholder: e.g., Kali Linux 2025.1, Ubuntu 22.04
validations:
required: true
- type: dropdown
id: virtualization
attributes:
label: Virtualization
description: Is your O.S. running in native mode or is a virtualized system?
options:
- Native mode, no virtualization (Default)
- VMware
- VirtualBox
- Hyper-V
- Parallels Desktop
- Other
default: 0
validations:
required: true
- type: input
id: chipset
attributes:
label: Adapter and chipset
description: What is the chipset of your wireless adapter? check "lsusb" command's output or launch "airmon-ng --verbose" command to check it
placeholder: e.g., Alfa AWUS036AXML, chipset Mediatek MT7921AUN
validations:
required: true
- type: textarea
id: description
attributes:
label: Issue description
description: Describe the issue and the steps to reproduce it. Add screenshots if they help us understand your problem
placeholder: Tell us what it's about!
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Acceptance of Issue Creation Policy
description: By submitting this issue, you agree to follow our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
options:
- label: I agree to follow this project's Issue Creation policy
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/2-general_question.yml
================================================
name: General Question
description: Ask some general question
title: "[General Question]: "
labels: ["question"]
projects: ["v1s1t0r1sh3r3/airgeddon"]
body:
- type: markdown
attributes:
value: |
Please, consider asking your questions in the very active Discord community before opening an issue here. Issues must be opened in English. Submissions that are incomplete or incorrectly filled out will be automatically closed. For more info, check our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
- type: input
id: technology
attributes:
label: Related technology
description: Is your question related to any specific technology (e.g., chipset, driver, OS)? If not, type N/A
placeholder: e.g., Docker, Mediatek chipsets, VMware virtualization
validations:
required: true
- type: textarea
id: question
attributes:
label: Issue description
description: Please describe your question in as much detail as possible so we can better assist you
placeholder: Write your question here...
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Acceptance of Issue Creation Policy
description: By submitting this issue, you agree to follow our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
options:
- label: I agree to follow this project's Issue Creation policy
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/3-feature_request.yml
================================================
name: Feature Request
description: Suggest a new idea to improve this project
title: "[Feature Request]: "
labels: ["needs triage", "feature request"]
projects: ["v1s1t0r1sh3r3/airgeddon"]
body:
- type: markdown
attributes:
value: |
Please, consider asking your questions in the very active Discord community before opening an issue here. Issues must be opened in English. Submissions that are incomplete or incorrectly filled out will be automatically closed. For more info, check our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
- type: textarea
id: feature
attributes:
label: Feature description
description: Please describe your feature request in as much detail as possible so we can properly evaluate it
placeholder: Write your idea here...
validations:
required: true
- type: input
id: benefits
attributes:
label: Benefits
description: What would be the benefits of implementing this feature?
placeholder: e.g., Improves performance, enhances usability
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Acceptance of Issue Creation Policy
description: By submitting this issue, you agree to follow our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
options:
- label: I agree to follow this project's Issue Creation policy
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/4-compatibility_enhancement.yml
================================================
name: Compatibility Enhancement
description: Request to expand compatibility support
title: "[Compatibility Enhancement]: "
labels: ["needs triage", "compatibility enhancement"]
projects: ["v1s1t0r1sh3r3/airgeddon"]
body:
- type: markdown
attributes:
value: |
Please, consider asking your questions in the very active Discord community before opening an issue here. Issues must be opened in English. Submissions that are incomplete or incorrectly filled out will be automatically closed. For more info, check our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
- type: textarea
id: compatibility
attributes:
label: Compatibility Request Description
description: Describe the compatibility issue or request in as much detail as possible, including hardware, drivers, OS, or environment
placeholder: Describe what you'd like to see supported...
validations:
required: true
- type: input
id: affectedtech
attributes:
label: Technology or environment
description: Specify the hardware, chipset, driver, OS, or any other component involved
placeholder: e.g., PCLinuxOS, BlendOS
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Acceptance of Issue Creation Policy
description: By submitting this issue, you agree to follow our [Issue Creation Policy](https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#issue-creation-policy)
options:
- label: I agree to follow this project's Issue Creation policy
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Get airgeddon's Discord Community Support
url: https://discord.gg/sQ9dgt9
about: Consider asking your questions in the very active Discord community before opening an issue here.
- name: Check the FAQ & Troubleshooting Wiki
url: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/FAQ%20&%20Troubleshooting
about: Your question might already be answered in our FAQ & Troubleshooting section. Please check it before opening a new issue.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--- Please, before sending a pull request read the Git Workflow Policy on Contributing section of the project. Link here: https://github.com/v1s1t0r1sh3r3/airgeddon/blob/master/CONTRIBUTING.md#git-workflow-policy -->
<!--- If you have doubts about how to proceed, consider to contact us on Discord or IRC before doing the PR. More info and Discord invitation link here: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Contact -->
<!-- Pull requests to the master branch are not allowed. They should usually target the dev branch instead -->
<!--- Write in English only -->
<!--- If your pull request is about a plugin, don't do it! airgeddon is not storing plugins. Read this about what to do: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20Hall%20of%20Fame -->
<!--- If the pull request is not matching the policy, it will be closed -->
#### Describe the purpose of the pull request
<!--- Insert answer here -->
================================================
FILE: .github/workflows/dev.yml
================================================
#Workflow for docker autobuild in dev branch
name: 'Docker CI dev'
on:
push:
branches: dev
paths:
- '**.md'
- '**.sh'
- '**.txt'
- '**.db'
- '.airgeddonrc'
- 'Dockerfile'
workflow_dispatch:
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Docker Hub login
uses: docker/login-action@v1
with:
username: v1s1t0r1sh3r3
password: ${{ secrets.DOCKERHUB_TOKEN }}
logout: true
- name: Check out code
uses: actions/checkout@v2
- name: Build and push
uses: docker/build-push-action@v2
with:
tags: v1s1t0r1sh3r3/airgeddon:beta
context: .
no-cache: true
push: true
================================================
FILE: .github/workflows/master.yml
================================================
#Workflow for docker autobuild in master branch
name: 'Docker CI master'
on:
push:
branches: master
paths:
- '**.md'
- '**.sh'
- '**.txt'
- '**.db'
- '.airgeddonrc'
- 'Dockerfile'
workflow_dispatch:
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Docker Hub login
uses: docker/login-action@v1
with:
username: v1s1t0r1sh3r3
password: ${{ secrets.DOCKERHUB_TOKEN }}
logout: true
- name: Check out code
uses: actions/checkout@v2
- name: Build and push
uses: docker/build-push-action@v2
with:
tags: v1s1t0r1sh3r3/airgeddon:latest
context: .
no-cache: true
push: true
================================================
FILE: .gitignore
================================================
.DS_Store*
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
desktop.ini
.dropbox*
.idea
================================================
FILE: CHANGELOG.md
================================================
### 11.61
- Added check to detect if operating in a Virtual Machine
- Added beep sounds to Evil Twin attacks to alert about different events
- Created an option to avoid playing sounds during Evil Twin attacks
- Fixed colors of some vendors for the advanced captive portal
- Improvements in WPA3 menu to allow more WPA3 plugins
- Fixed minor bug detecting hashcat hash format
- Fixed bug. Prevent DoS Pursuit mode from switching 2.4‑only deauth interfaces to 5 GHz channels
- Improved internet interface validation for VPN compatibility
- Fixed a rare bug that caused a hang after closing scan windows
### 11.60
- Added validation to reject multicast BSSID values when manually entered as targets
- Improved Enterprise fake AP compatibility
- Improved cleanup routine to remove temporary files on unexpected script termination
- Modified the lighttpd web server configuration during the Evil Twin captive portal attack to facilitate integration with certain plugins
- Added downgrade attack against WPA2/WPA3 Transitional (Mixed Mode) networks in the WPA3 menu
- Added support for Handshake and PMKID hashcat hash files in the personal offline decryption menu
- Validations added and improved code for all offline decryption attacks
### 11.52
- Add WPA3 attacks menu as hookable function to facilitate WPA3 existing plugins integration
- Improved adapter 802.11be standard support detection
- Improved Evil Twin fake APs to add 802.11be if supported by the adapter
- Created an option to avoid using ESSID stripping during Evil Twin attacks
- Enhancements to enterprise certificate analysis and identities capture functionalities
- Small improvements in WEP All-in-One attack
### 11.51
- ESSID stripping using invisible char to bypass Apple SSID grouping in Evil Twin attacks
- Improved captive portal's HTML and JS to make it work even in Apple CNA (Captive Network Assistant)
- Modified plugin system to allow multiple hooks from different plugins on functions marked as "hookable"
- Replaced legacy Github Markdown issue creation templates with structured YAML-based forms
- Compatibility extended to Puppy and CachyOS Linux
- Improved internal interface-to-MAC mapping logic for better reliability
- Refactor tool compatibility check to display in columns that adapt dynamically to terminal width for improved readability
### 11.50
- Enterprise certificate analysis feature
- Fixed WEP besside-ng attack when hex key contains non-numeric chars
- Added DoS to enterprise identities capture process to improve reliability
- Added functions to simplify hooking menus and hints from plugins
- Added new variables to check support of 802.11n/802.11ac/802.11ax/802.11be standards
- Improved Evil Twin fake APs to add 802.11n/802.11ac/802.11ax if supported by the adapter
- Added support for detecting enterprise networks that report CMAC as their authentication method
- Fixed an issue in some DoS attacks with ESSIDs containing spaces
- Improved BSSID digit randomization to prevent fake AP from using the same MAC address as the original one
- Enhanced captive portal behaviour to avoid detection as suspicious network on Samsung devices
### 11.41
- Added a function to simplify hooking language strings from plugins
- Enterprise identities capture feature
- Fixed broken dependency menu validation
- Added a flag to distinguish and validate personal and enterprise networks
- Implemented validations to ensure enterprise attacks are not executed on personal networks and vice versa
- Removed prefix and suffix hint symbols. Now scrambled arabic hint strings are fixed
### 11.40
- Code refactor of the heredocs used for the Evil Twin, WEP and WPS attacks
- Standardize xterm parameters and adjust some colors to override the system's default settings
- Fixed bug parsing version number for newer hcxdumptool versions
- Added WEP besside-ng attack
- Added network decloaking feature using two methods
- Changed third available DoS attack (out of DoS attacks menu)
- Fix auto-update check from Docker
### 11.31
- Fixed graphics system detection when launched on a headless system using remote X windows
- Fixed minor bug on paths when selecting a directory instead of a file while saving a trophy file
- Improvements on OS/distro detection
- Added feature to know during an Evil Twin captive portal attack, if the client accessed the portal
- Added feature to know during an Evil Twin attack, if the client is still present on the network
- Minor visual improvements on Evil Twin's captive portal
- Improvement on command line while capturing PMKID. Now, faster performance and less default timeout (Thank you to "alexl83")
- Fixed bug on view after a failed asleap attack from offline decryption menu
- Fixed issue on default choice when y/n question is asked while capturing a trap
- Fixed issue to prevent the trap function from being executed multiple times on consecutive Ctrl+C inputs
### 11.30
- Added Multi-instance support to launch more than one airgeddon at a time
- Improvements on 5Ghz country code check and 5Ghz band capability detection on adapters
- Fixed bug to avoid set advanced captive portal on second time if is not desired after setting it previously
- Now channel is automatically updated on control window during "DoS pursuit mode" for all Evil Twin attacks
- Fixed error shown while checking if a handshake is wpa2 when wpa3 handshake is captured
### 11.22
- Possibility to add manually ESSID name for selected hidden networks
- Improvement on process killing on Evil Twin attacks
- Add WPS version to network selection menu for WPS networks
- Reordered networks on network selection menus (standard and WPS), now networks with the strongest received signal will be placed last to avoid scrolling
- Fixed small bug on Evil Twin captive portal attack for passwords containing more than one space char
- Fixed Docker routing problem
### 11.21
- Chinese language translation added (Thank you to "zcbxx")
- Fixed bug parsing cracked PIN on WPS reaver Pixie Dust attack for newer reaver versions
- Fixed error on PMKID capturing due hcxdumptool different params for newer versions using bpf filters
- Fixed error on interfaces and process killing on "DoS pursuit mode"
### 11.20
- Improvements and fixes on "DoS pursuit mode"
- Fixed bug on Evil Twin captive portal attack when relative paths used
- Added Consistent Network Device Naming detection check upon interface selection
- Fixed bug on filtered WPA scans when pure WPA3 (SAE) present
- Fixed WPS attacks error message appearing on some Linux distributions
- Fixed bug in graphics system detection for non-systemd systems
- Added optional advanced captive portal including vendor logos
### 11.11
- Custom enterprise certificates creation fix (now sha256) for modern hostapd-wpe versions
- Fixed Docker distro shown (now Kali based)
- Fixed PMKID hashcat hash parsing
- Improvements on graphics system and resolution detection
- Fixed 5Ghz Evil Twin attacks DoS problems
- Added 5Ghz country code check
- Improvements on OS/distro detection
### 11.10
- Fixed problem for latest BeEF
- Fixed broken dependency menu validation
- Added sponsorship mentions
- WPS attacks modified to avoid saved sessions messages
- Adapted conversion for hashcat modern versions
### 11.02
- Fixed minor bug in minimum length setting while bruteforcing using hashcat
- Improvement hashcat use forcing it to use -m 22000 instead of old -m 2500 over handshakes cracking for hashcat modern versions
- Added WSL/WSL2 detection to force exit due to incompatibility
- Extended compatibility to use lspci 3.8 not accepting 0x
- Fixed error showing connected clients in Evil Twin captive portal attack
### 11.01
- Fixed busy ports checks
- Added PIN to WPS trophy file
- Fixed Evil Twin route problems for modern mobile devices (Android, Kali Nethunter, etc.)
- Improvement in missing dependencies plugin to be able to check output when errors occur
- Adapted WPA/WPA2 attacks (handshake capture, PMKID and Evil Twin captive portal) to work with WPA2/WPA3 mixed networks
- Fix error launching sslstrip2 using old Bettercap 1.x
### 11.0
- Improvements in plugins system
- GPU support for hashcat
- Keep compatibility for hashcat -m 2500 on new hashcat versions
- Improvement for busy ports checks on Evil Twin attacks, now show conflicting process
- Fixed error on captive portal trophy file path when only dir (no file) specified
- Added CI files to be used in Github actions for Docker automated building
### 10.42
- Changed airmon compatibility check to fit same method used by airmon
- VIF support check added before launching Evil Twin attacks
- airgeddon version shown in title at main menu
- Fixed arabic scrambled strings and added missing arabic strings to missing dependencies plugin
- Fixed debug mode malfunction
- Added busy ports checks on Evil Twin attacks
- Dockerfile rollback to Arch (ArchStrike image as base) due to Parrot repos problems
### 10.41
- Fixed error on PMKID hash validation
- Created an option to avoid Network Manager force killing on Evil Twin attacks
- Code improvements to allow new kind of arguments based plugins
- Dsniff Evil Twin captive portal DNS black hole replaced by dnsmasq
- Dockerfile rollback to Parrot (Parrot Security image as base) to avoid Arch Glibc + Dockerhub automated builds problem
### 10.40
- Removed deprecated route command
- Fixed error on WPS PINs found in database counter
- Sslstrip Evil Twin attack replaced by Bettercap-Sslstrip2 Evil Twin attack, sslstrip dependency removed
- Fixed error on Evil Twin attacks when tmux and Bettercap 2.x used
- Fixed wrong username shown on asleap decryption after capture for Enterprise Evil Twin attack
- Fixed freezing while trying to resume reaver session
### 10.31
- Fixed error of no returning to DoS menu after fail on handshake capture for Evil Twin Captive portal attack
- Fixed error of no returning to Evil Twin main menu for some special situations on BeEF attack
- Removed deprecated hcxpcaptool, replaced by hcxpcapngtool
- Replaced old PMKID hash format to be used in hashcat, from 16800 to 22000
- Improved responsive behaviour of Evil Twin Captive Portal web page
- Compatibility extended to Bettercap 2.x (>=2.28) for sslstrip2/BeEF Evil Twin attack
### 10.30
- Fixed error on internet interface selection menu when no number provided
- Fixed BeEF error due forced config file changes for some versions
- Fixed weird error for endless loop while capturing handshake on some devices
- Fixed terminal freeze problem when Ctrl+C pressed on path prompt
- Fixed Network Manager problem on fake AP used for Evil Twin attacks
- Arabic language translation added (Thank you to "darthvader-htb")
### 10.21
- Improved hostapd-wpe config for some conflicting Linux
- Dockerfile migrated to Arch (ArchStrike image as base) to avoid Debian based missing packages problem
- After PMKID capturing, now additionally can transform captured file into .cap aircrack-ng file format
### 10.20
- Big language strings array now loaded only once and printing system changed. Speed highly improved
- Fixed problem for handshake detection on captured files containing only handshake (without pmkid)
- Missing dependencies plugin adapted to install some special (missing on repos due retirement) packages
- Dockerfile adapted to work flawlessly with the deprecated retired packages
### 10.11
- Fixed error on PMKID capturing due hcxdumptool different params for different versions
- Added feature to detect captured PMKID while capturing Handshake
- Integration of PMKID on Evil Twin Captive Portal
### 10.10
- PMKID capture feature
- PMKID offline decryption feature
- Tested compatibility with Manjaro Linux
- Fixed error on auto_update plugin on some Linux distros
### 10.01
- Removed deprecated ifconfig and iwconfig commands and dependencies
- Fixed error on enterprise certificates validation
- Added autoselection for secondary interface if only one existing
- Airmon compatibility check system refactored
- Fixed error in default paths trophy files for Ettercap/Bettercap
### 10.0
- Added plugins system
- Added example plugin: Missing dependencies auto-installation for some distros (Kali, Parrot, BlackArch)
- Improvements for Evil Twin on captive portal detection for newer devices
- Missing 5Ghz channels added
- Github pull request template added and issue templates updated
- Fixed error on hex2ascii conversion for some WEP passwords
### 9.23
- Fixed error printing hints
- Fixed problem with default values on options file creation
### 9.22
- Improved certificates validations and error messages
- Removed useless internet access DNS resolution method for captive portal Evil Twin, now pure dnsspoof
- Fixed exit on tmux launch if tmux not installed
- Added more charset combinations for hashcat bruteforce attacks
- Fixed length problem on hashcat bruteforce decryption attacks
- Fixed handshake capture menu error
- Compatibility extended to Pentoo Linux
- Removed unneeded expect (unbuffer) dependency
- Added tab autocompletion for every path input
### 9.21
- Fixed non-closing windows on some "DoS pursuit mode" attacks
- Added retrocompatibility for mdk3, added option in .airgeddonrc file to handle it
- Fixed bug on WEP all-in-one attack (Fake Auth) for SSIDs containing spaces
- Fixed repeated enterprise plain passwords captured on trophy files
- Added custom certificates creation for enterprise attacks
- Fixed error on BeEF attack using tmux
### 9.20
- Added option to use tmux instead of xterm (Thank you to "xpz3")
- Added WPS null PIN attack (reaver)
### 9.11
- Fixed error shown on enterprise attacks for some wifi cards
- Fixed BeEF error due forced config file changes on BeEF 0.4.7.1 and 0.4.7.2 versions
- Added ipv6 support for BeEF
- Options .airgeddonrc file now also updated on automatic update keeping user's preferences
### 9.10
- mdk3 replaced by mdk4
- Fixed some minor bugs on enterprise plain text captured password process
- Fixed minor bug forcing interface mode change after smooth enterprise attack
- Tested compatibility with Wifislax 64-2.x and Kali 2019.x
- Fixed dependency problem to avoid use of xxd
- Routing rules adapted to work with nftables
### 9.01
- Improvements on options environment var system
- Minor fixes for ARM devices
- Fixed iptables (nf_tables) problem
### 9.0
- New WPA/WPA2 enterprise attacks menu
- New WPA/WPA2 enterprise offline decryption menu
- Compatibility extended to Linux Mint 18.x
- Flag system for options based on fallback substitution variables (config file, command line and menus)
- Fixed error on hashcat bruteforce decryption attacks regarding length
### 8.12
- Fixed error on WPS attacks for strange chars in some SSIDs
- Tested compatibility with Kali 2018.3/4, Fedora 28, Backbox 5.x and BlackArch 2018.06.01
- Added prompt symbol for every user interaction
- Improved regex for BSSID check
- Changes on contributing policies
- Github pull request template added and issue templates updated
- Added Wayland graphic system support (Thank you to "fr0xk")
- Fixed print error on flying saucer intro for some terminals
### 8.11
- Turkish language translation added (Thank you to "UN5T48L3")
- Extended cards compatibility. Now airmon non compatible cards can be used
- Fixed error on captive portal for some SSID strange chars
- Fixed error showing SSIDs containing spaces on WPS network selection menu
- Fixed error on chipset detection for some cards
### 8.10
- WPS decrypted networks now have trophy file
- Tested compatibility with Kali 2018.2, Ubuntu 18.04 and Parrot 4.x
- Controlled error for unsupported Bettercap 2.x version
- Automatic check added on Handshake capture (Thank you to "IwraStudios")
- Fixed card detection bug on some Linux
### 8.01
- German language translation added (Thank you to "hamperfait")
- Filters enabled on scannings based on menu or kind of attack
- WPS PIN database now is updated on startup updates too
- Return option now always at position 0 on all menus
- Removed --weak--hash-threshold option for hashcat 4.0.0 or higher
- Tested compatibility with Parrot 3.11
- Fixed aspect of network selection menu when network power is equal to -1
### 8.0
- Added 5Ghz full support (scans, attacks, card detection, etc.)
- Tested compatibility with Kali 2018.1, BlackArch 2017.12.11, Fedora 27, Gentoo 20180206, OpenSUSE 42.3 and Parrot 3.10
- Fixed error setting ESSID on some wash versions while scanning
- Fixed error on secondary interface selection menu for "DoS pursuit mode"
### 7.23
- Fixed error in Docker container on some host O.S.
- Fixed error message on offline Arcadyan PIN algorithm calculation
- Polish language translation added (Thank you to "dodg3rmaq")
- Added "DoS pursuit mode" on DoS attacks (including DoS used on Evil Twin attacks) to avoid AP channel hopping
- Tested compatibility with Parrot 3.9, BlackArch 2017.08.30 and Kali 2017.3
### 7.22
- Fixed error caused by Bettercap. Bug: https://github.com/evilsocket/bettercap/issues/356
- Arcadyan WPS PIN generation algorithm integrated
- Tested compatibility with Kali 2017.2 and Parrot 3.8
- WPS Bully bruteforce attack modified to use --sequential (-S) argument
- Added WPS offline PIN generation and database menu option
### 7.21
- Italian language translation added (Thank you to "salu90")
- Tested compatibility with Parrot 3.7, Fedora 26 and Wifislax 64-1.1
- Improved check for root permissions, now mandatory
- Fixed bug for some menu inputs using special chars. Now sanitized
- Code improvements, removed new shellcheck warnings
- Fixed bug launching BeEF Evil Twin attack twice
### 7.20
- Improved chipset detection
- New language and options menu
- Colorization, auto-update and startup language autodetection now can be enabled/disabled persistently from menu
- Language can be set permanently from menu even for next startup after an update
- New check using xset internal tool to check for a working X window system in order to avoid uncontrolled xterm errors
### 7.11
- Added hccapx support for hashcat 3.40 or higher
- Decrypted hashcat trophy files beautified
- Added confirm questions before attacks if no target selected
- WPA/WPA2 decrypted files using aircrack now have trophy file
- Some outputs colorized using ccze
### 7.10
- Added default choice for some yes/no question. Regexp improved
- Tested compatibility with Backbox 4.7 and Parrot 3.6
- Improved curl and wget methods. Now autodetect if http proxy is set and needed
- WPS Reaver attacks modified. Removed --auto (-a) argument causing problems on some Reaver versions
- Dockerfile updated
### 7.02
- Improved internet checking. Now ip address and host based methods
- Internet checking function splitted. Now separated from repository access
- Fixed error shown when handling interfaces without MAC address
- Tested compatibility with Ubuntu 17.04
### 7.01
- Fixed bug while changing interface mode if the destination interface name is in use
- Removed util-linux dependency for rev use
- The existing iptables rules before the launch of airgeddon are now restored upon exiting if modified
- Fixed bug while checking for NetworkManager's version on some Linux distributions
- Tested compatibility with Kali Linux 2017.1 and Parrot 3.5
- Dockerfile updated
### 7.0
- New WEP attacks menu
- Added All-in-One WEP attack
- Fixed bug on Handshake capture validations
### 6.21
- Improved chipset detection, lsusb added to internal tools
- Improved internet checking. Now more methods, not only icmp
- Fixed error executing airgeddon after auto-update on some Linux distributions
- Added LICENSE.md and README.md files to Kali package
### 6.20
- Docker support added
- Default save path system detecting if executed in Docker container
### 6.12
- Fixed bug on network detection
- Fixed bug causing strange behaviour on some Linux handling optional_tools array
### 6.11
- Optional MAC spoofing added for all Evil Twin attacks
- Spoofed MAC addresses restored on exit
### 6.10
- Network selection menus now colorized
- Language strings now in a separated file for easy handling and translating
- Validation and self-downloading system for new language strings file
### 6.01
- Shebang changed to a more portable one `#!/usr/bin/env bash`
- New extra-verbose debug mode added
- README.md major modifications
- Added CONTRIBUTING.md
- Unexpected errors on wash scanning are controlled now
- Improved distro detection for some arm Linux
### 6.0
- New system for possible tool aliases checking the requirements
- Evil Twin attack added: Bettercap-Sslstrip2 and BeEF browser exploitation framework
- Option to manage custom BeEF location if manually installed and not found. Script polymorphism rewriting itself to make it persistent even after updates
- README.md beautified
- Colors changed. Now blocking errors in red
- License and changelog files updated to markdown format
- Updated minimum bash version check (v4.2)
- Tested compatibility with OpenSUSE 42.2 and Parrot 3.4.1
- Fixed error trying to download PIN db file on WPS attacks when curl isn't installed
### 5.14
- Timeout changed while searching for "bad FCS" to avoid problems in old systems
- WPS Reaver attacks modified to use --no-nacks (-N) argument
- Github issue template updated
- Check added to skip intro if not enough window size
- Tested compatibility with BlackArch 2016.12.29
### 5.13
- WPS default timeouts changed
- WPS parameterizable timeouts, users can decide how many seconds for each WPS attack
- More traps handled. Auto restore managed mode on interface after SIGINT/SIGHUP
### 5.12
- Fixed bug for wash scanning on reaver 1.5.3. Now new method works for all versions because the version doesn't care anymore
### 5.11
- Custom PIN, bruteforce and Pixie Dust WPS attacks integrated in new parser system
- Fixed bug for wash scanning on custom reaver 1.5.4 for Wifislax
- Some code improvements
### 5.10
- Integrated online PIN database for "known WPS PINs attack" (reaver and bully)
- Zhao Chunsheng WPS PIN generation algorithm integrated (ComputePIN)
- Stefan Viehböck WPS PIN generation algorithm integrated (EasyBox)
- Some language strings changed
- Fixed bug showing selected charset for hashcat v3.0 on bruteforce offline decrypt attack
### 5.01
- WPS bruteforce PIN attacks (reaver and bully)
- New system for arm architecture detection
- Compatibility extended to Parrot arm version on Raspberry Pi
- Some WPS attacks improvements
- Compatibility extended for hashcat v3.0 or higher
### 5.0
- WPS attacks menu added
- WPS scanning based on wash tool. Self-parametrization to avoid "Bad FCS" problem
- WPS Custom PIN association
- WPS Pixie Dust attacks integrated with reaver and bully
- Some code improvements
### 4.32
- Some code improvements and refactors. Warnings removed based on shellcheck tool
- README.md small modifications
- Fix on language menu selecting greek language
- Fixed problem on renew_ifaces_and_macs_list function when there are interfaces without MAC (like some tunnel interfaces)
### 4.31
- Now optionally on Evil Twin captive portal attack you can choose between to have internet access or to use a "dns trick"
- Fixed bug writing Handshake files on some paths
- Added possibility to get back to Evil Twin main menu from the internet interface selection menu
### 4.30
- Evil Twin attack added: captive portal
- Some language strings changed
- Now initial forwarding state is restored on exit
- Fix for Linux which change interface name to a very different name while getting back to managed from monitor mode
### 4.22
- Portuguese translation updated (Thank you to "Luan")
- Paypal donate button added on README.md
- Bitcoin hash changed and bitcoin donate button added on README.md
- Tested compatibility with Kali Linux 2016.2
### 4.21
- Greek language translation added (Thank you to "xtonousou")
### 4.20
- Evil Twin attack added: with integrated sniffing using sslstrip
- Evil Twin control window beautified and optimized for small windows
### 4.11
- Russian language translation added (Thank you to "MiAl")
### 4.10
- Evil Twin attack added: with integrated sniffing
- Log parsing for Evil Twin attack with sniffing
### 4.03
- Some compatibility improvements for Raspberry Pi Raspbian Linux
- Additional check for systems which use airmon-zc, now checks for lspci to avoid errors
- Compatibility extended to OpenMandriva Linux
- Compatibility extended to Kali arm version on Raspberry Pi
### 4.02
- New windows sizes calculation method for better viewing even in small resolutions. Dynamic system
- Fixed bug restarting Network Manager on Arch Linux
- Fixed bug restarting Network Manager using debug mode on some Linux distributions
- Suggestion added about possible packet names after failing a dependency check
### 4.01
- Fixed bug cleaning temp files for Evil Twin attack
### 4.0
- Evil Twin attack added: Only AP to sniff with external sniffer
- Created under construction message for non finished menu options
- README.md beautified
- Screen resolution correction feature added for some Linux distributions
- Some minor improvements and bugfixes
### 3.44
- Screen resolution detection for optimal windows viewing
- Some language strings changed
- Deleted ods translations file. It was impractical
### 3.43
- Function created to generate dynamic separators on menus
- Some language strings changed
### 3.42
- Compatibility extended to Arch Linux
- Compatibility extended to Raspbian Linux for Raspberry Pi
- Additional check for systems which use airmon-zc, now checks for ethtool to avoid errors
- Portuguese language translation added
- Auto-update can be disabled using a var (useful for repositories versions)
- Auto change language feature can be disabled using a var
### 3.41
- Show network cards chipset while selecting interface
- Some language strings changed
- License updated to GPL3+
- Added Open Document SpreadSheet for easy translation to be used by collaborating translators
- System of prefixes and colors for hints and strings pending of translation [PoT]
### 3.40
- Improved regexp to get new interface names after a change
- Fixed bug managing paths containing blank spaces
- New feature, drag and drop files on console window to entering file paths
- New offline decrypting attacks based on cpu hashcat (dictionary, bruteforce and rule based)
- Debug mode for faster development skipping intro and initial checks
- Bash version check improved for future versions
- Exit script code changes to differentiate when script was interrupted
### 3.34
- Ascii art intro added on script startup (animated flying saucer!!)
- Bug fixed after putting card in monitor mode and the card name changed on some Linux distributions
- Compatibility extended to Gentoo, Fedora and Red Hat Linux
### 3.33
- Bug fixed relaunching script after donwload a new version
- Credits beautified
- Known compatible distros unified in one array
- "No check kill needed" feature method changed. Now based on Network Manager version
- Changes on rfkill method
### 3.32
- Bash version check simplified
- Bug with long interface names fixed
- Changed trap management, now with buffered messages
- Curl removed from essential tools. Now the script performs a separated check for update tools only used for auto-update
- Compatibility extended to CentOS Linux
### 3.31
- Check for root permissions after failed essential tools check
- Improved missing optional tools detection method and integration with menus
- Menu separator lines extracted to functions
### 3.30
- SIGTSTP trap now handled
- Minimum bash version check (v4)
- Some language strings changed
- Non Linux OS check added (Solaris, FreeBSD, OSX)
- Compatibility extended to OpenSUSE Linux
- README.md updated about Mac OSX incompatibility
- Improved OS language detection method
- Fixed bug in auto-update
### 3.23
- Compatibility extended to Cyborg Hawk Linux
- Needed tools divided, essential and optional. Script can run now with essential tools even without some of the optional tools
- Changed "No check kill needed" feature method. Now improved for Kali and Wifislax future versions
- Bug fixed while checking for updates on slow connections
- README.md beautified
### 3.22
- Cleaning Handshake files now perform some checks to avoid corruption file problem
- Capture files are checked before cracking looking for Handshakes and easy targeting
- Fixed bug checking existence of files
### 3.21
- Auto-update feature. Script checks for newer version
- Some language strings changed
### 3.20
- New offline password decrypt menu
- Aircrack option to perform dictionary/bruteforce attacks against capture files
- Removed autoclean after capturing a Handshake file
- Changed version var to airgeddon_version for future version check (auto-update feature)
### 3.11
- Optional autoclean captured Handshake file feature
- Some language strings changed
### 3.10
- Restoring initial state of cards on exit feature
- "No check kill needed" feature added while putting card in monitor mode for some Linux distributions
- Fixed bug checking tools
### 3.02
- Cleaning tasks on exit
- Minor code refactor
- Some language strings changed
- Hint method improved
### 3.01
- Handshake tools menu added
- Handshake capture feature
- Handshake cleaning/optimizing feature
- Random helping hints added (regarding the script zone)
### 3.0
- New menus, new structure
- New Handshake features preparation (not working yet in this revision)
- Code normalization
### 2.33
- Catalan language translation added (Thank you to "El Padrino")
### 2.32
- Autodetect OS language feature added
- Some language strings changed
### 2.31
- French language translation added (Thank you to "kcdtv")
- Only one network autoselect bug fixed
### 2.30
- Compatibility extended to Parrot, Blackarch and Backbox Linux
- Essential tools check improved
- Distro compatibility check improved
- Iwconfig use fix based on version
- Pink color added
### 2.23
- Read "pause" functions now integrated with language strings
- Title generator extracted to function
- Improvements on colors
- Changelog order changed. New changes now upper
### 2.22
- Minor print fail in ascii art at credits fixed
- Disclaimer and requirements updated
- Some typo errors fixed
- Changes on compatibility check structure
- Ubuntu and Debian Linux compatibility check added
### 2.21
- Wifislax 64bits compatibility bug fixed
- Removed version from README.md file
### 2.20
- Changes to manage Wifislax airmon command in a better way
### 2.11
- More color features
- Compatibility check minor bug fixed
### 2.10
- Compatibility check at beginning to support more Linux distributions
- Changelog file added to project
### 2.03
- Interface detection method changed
- Fixed bug for Kali 2016.1
### 2.02
- Menu titles improvement
- Converted to UTF-8 enconding. Special spanish chars bug fixed
- Some minor code improvements
### 2.01
- Multilanguage support feature included
- English and Spanish languages added
### 2.0
- Code restructuration
- WIDS confusion attack added
- Old attacks menu included
- Traps managing feature
### 1.03
- Secondary xterm windows added
- Explore for targets feature included
- Code improvements
### 1.02
- Improved echo messages and colors
- Aireplay deauth attack included
- Monitor and managed options added
### 1.01
- Detect distro functionality included
- Kali and Wifislax Linux compatibility
- Rfkill added
### 1.0
- Initial commit
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting us at [v1s1t0r.1s.h3r3@gmail.com]. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][Homepage], version 1.4,
available at [https://contributor-covenant.org/version/1/4][Version]
<!-- Code of Conduct -->
[Homepage]: https://contributor-covenant.org
[Version]: https://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
Hi there! We are thrilled that you would like to contribute to this project. Your help is essential for keeping it great.
When contributing to this repository, please first discuss the change you wish to make via issue,
email, or any other method with the owners of this repository before making a change. Please read the Issue Creation Policy shown below before creating it.
Please note we have a [Code of Conduct], please follow it in all your interactions with the project.
---
## Issue Creation Policy
1. Please, consider to contact us on [IRC] channel or [Discord] server before opening an issue. More info at [Wiki Contact Section].
2. Before opening an issue, keep in mind that many of the common questions are already addressed in the [Wiki FAQ Section]. Please avoid asking questions that are already answered there.
3. Filling the issue template with *ALL* the requested info is mandatory. Otherwise, the issue can be marked as "invalid" and closed immediately.
4. Issues must be opened in English.
5. If an issue is opened and more info is needed, `airgeddon` staff will request it. If there is no answer in 7 days or the OP is not collaborating, the issue will be closed.
6. If the issue is not related to airgeddon or the root cause is out of scope, it will be closed. `airgeddon` staff is not a helpdesk support service.
7. Try to be sure that your problem is related to airgeddon and that is not a driver issue. A good practice is always to try to perform the same operation without using `airgeddon` in order to see if the problem or the behavior can be reproduced. In that case, probably the issue should not be created.
8. Don't talk or mention references to other tools. If you want to talk about other similar tools you can do it on their pages/GitHub. `airgeddon` issues are to talk about `airgeddon`.
## Collaborating Translators
1. ALWAYS ask before starting a translation to add a new language. You can do so by contacting us via email at [v1s1t0r.1s.h3r3@gmail.com], through Twitter (X) at [@OscarAkaElvis], via [IRC] channel, or on the [Discord] server. Please reach out to the development team to clarify your intentions. You will then be informed about how to proceed.
2. Translate the strings located in `language_strings.sh`, the existing strings of _language_strings_handling_messages_ function in `airgeddon.sh` and the strings of _missing_dependencies_text_ function in `missing_dependencies.sh` (this last file is in plugins dir).
3. If you want to create a pull request with a new language to be added, at least the 80% of the phrases must be translated and the rest must be done with at least _an automatic-translation_ system and marked with PoT (Pending of Translation) mark. Anyway, always ask first.
4. Remember that pull requests done over master branch will be rejected. Read the git workflow policy first.
5. After verification of and acceptation of the pull request, you can be added as a collaborator on the project to push directly on the repository instead of submitting pull requests.
6. Knowledge about `git` is mandatory (at least basic commands) to push directly into the project repository.
## Collaborating Developers and Plugins Development
#### For direct interaction with the repository (plugins development excluded):
1. First ask ALWAYS before performing a development. Ask the developement team to set what is going to be.
2. Tweak *"AIRGEDDON_DEVELOPMENT_MODE"* variable to "true" for faster development skipping intro and initial checks or change *"AIRGEDDON_DEBUG_MODE"* variable for verbosity.
3. Respect the **4 width tab indentation**, code style and the **UTF-8 encoding**.
4. Use **LF** (Unix) line break type (not CR or CRLF).
5. Use [Shellcheck] to search for errors and warnings on code. (Thanks [xtonousou] for the tip :wink:). To avoid false positive warnings you must launch shellcheck using `-a -x` arguments to follow source files and from the directory where `airgeddon.sh` is. For example: `~# cd /path/to/airgeddon && shellcheck -a -x airgeddon.sh`
6. Increase the version numbers in `airgeddon.sh`, in [Readme] and in [Changelog] to the new version that the script represents. The versioning scheme we use is *X.YZ*. Where:
- *X* is a major release with a new menu (e.g. WPS menu)
- *Y* is a minor release with a new feature for an existing menu or a new submenu for an existing feature
- *Z* is a minor release with new bug fixes, small modifications or code improvements
7. Split your commits into parts. Each part represents a unique change on files.
8. Direct push to [Master] is not allowed. Pull Requests to [Master] are not allowed. Should be done over [Dev] or any other branch. They require revision and approvement. Read the git workflow policy first.
9. All the development and coding must be in English.
*Be sure to merge the latest from "upstream" before submitting a pull request!*
#### For plugins development:
1. Read carefully the [Wiki Plugins Development Section].
2. Plugins Pull Requests will never be accepted. Plugins MUST be external to this repository.
3. Develop your plugin following the guidelines and using the plugin template to keep the needed structure.
4. If you want to add your plugin to [Wiki Plugins Hall of Fame Section], follow the instructions explained there. Don't open an issue.
We also have a private Telegram group for *trusted collaborators* for more agile discussion about developments, improvements, etc.
To be added on it, you must first prove that you are a *trusted collaborator* through your contributions.
Anything can be also discussed on public [IRC] channel or [Discord] server. More info at [Wiki Contact Section].
## WPS PIN Database Collaborators
1. Send MAC of the BSSID and the default PIN to [v1s1t0r.1s.h3r3@gmail.com]. If you are going to push directly into the repository, keep reading the next points and remember about the git workflow policy.
2. Remember that all PINs must be 8 digits and must be working PINs (verified that they work).
3. Add PINs ordered by the key in the associative array located in the `known_pins.db` file. (Keys are the first 6 BSSID digits).
4. Update the `pindb_checksum.txt` file with the calculated checksum of the already modified database file using `md5sum` tool.
*PINs should be from devices that generate generic ones.*
## Beta Testers
1. Download the main version from the [Master] branch or the beta testing version from the development branch called [Dev]. Temporary branches may be existing for specific features that can also be tested.
2. Report any issues or bugs via [IRC] channel, [Discord] server, or submit GitHub issue requests [here] after reading the Issue Creation Policy.
## Git Workflow Policy
1. Direct push to [Master] is not allowed.
2. Pull Requests to [Master] are not allowed.
3. Usually, commits and pull requests should be done on [Dev] branch. If you have any doubt, don't hesitate to ask first.
4. Temporary branches may be existing for specific features, be pretty sure that the branch you are going to commit on is the right one. Ask first if you have any doubt.
5. Any branch will be finally merged to [Dev], there it will be reviewed and tested deeply before being merged to [Master].
6. All merges from [Dev] to [Master] are a new `airgeddon` release. This merges to [Master] will be performed and reviewed exclusively by [v1s1t0r]/[OscarAkaElvis].
---
## Donate or buy merchandising
If you enjoyed the script, feel free to donate. Support the project through PayPal or sending a fraction any of the cryptocurrencies listed below. Any amount, not matter how small (1, 2, 5 $/€) is welcome.
Another way to contribute is buying some merchandising (mugs, T-shirts, etc.). A little portion of each payment (after deducting material, printing and shipping) will be to support the project. Check the [merchandising-online-shop].
<table>
<tr>
<td>
<b>PayPal</b>: <em>v1s1t0r.1s.h3r3@gmail.com</em> <br/>
<b>Bitcoin</b>: <em>bc1qymhcwsdmw0rn773czet7dv220a4u9fn0278r76</em> <br/>
<b>Bitcoin Cash</b>: <em>1GspqR87pn8569etY1Qfs3amUGQo9S5a1w</em> <br/>
<b>BAT</b>: <em>0x1b844e8251Db6A938813466Cf033FAF70c7c94bB</em> <br/>
<b>Ethereum</b>: <em>0xaEf16Ffbd03A742Ab6DAB8Bd60C6014726099583</em> <br/>
<b>Litecoin</b>: <em>ltc1q3ncz8gxzvzuekupatpm29k6u3c26cf78tw3zjx</em> <br/>
<b>Pi</b>: <em>GBWAREEMQJ6VRPXOH2UTXUYSQSKQDJLNKHSDUCBUJVWC2CFIASAZ6I5T</em>
</td>
</tr>
</table>
<br/>
<div align="center">
<a href="https://www.paypal.com/paypalme/airgeddon"><img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/paypal_donate.png" alt="PayPal" title="PayPal"/></a>
<a href="https://www.buymeacoffee.com/v1s1t0r"><img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/buymeacoffee.png" alt="Buy me a coffee" title="Buy me a coffee"/></a>
</div>
<br/>
<div align="center">
<table>
<tr>
<td>
Bitcoin QR code:
</td>
<td>
Bitcoin Cash QR code:
</td>
<td>
BAT QR code:
</td>
</tr>
<tr>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/bitcoin_qr.png" alt="Bitcoin" title="Bitcoin"/>
</td>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/bitcoincash_qr.png" alt="Bitcoin Cash" title="Bitcoin Cash"/>
</td>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/bat_qr.png" alt="BAT" title="BAT"/>
</td>
</tr>
<tr>
<td>
Ethereum QR code:
</td>
<td>
Litecoin QR code:
</td>
<td>
Pi QR code:
</td>
</tr>
<tr>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/ethereum_qr.png" alt="Ethereum" title="Ethereum"/>
</td>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/litecoin_qr.png" alt="Litecoin" title="Litecoin"/>
</td>
<td>
<img src="https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/pi_qr.png" alt="Pi" title="Pi"/>
</td>
</tr>
</table>
</div>
---
## Discord Server Boosting
You can also contribute using your Nitro Boosts on our [Discord] server. After boosting, your name will appear as a _Server Booster_ contributor there. Check [Wiki Contact Section] for more info about how to join to it.
<!-- MDs -->
[Readme]: README.md
[Changelog]: CHANGELOG.md
[Code of Conduct]: CODE_OF_CONDUCT.md
<!-- Github -->
[Shellcheck]: https://github.com/koalaman/shellcheck "shellcheck.hs"
[Here]: https://github.com/v1s1t0r1sh3r3/airgeddon/issues/new/choose
[Master]: https://github.com/v1s1t0r1sh3r3/airgeddon/tree/master
[Dev]: https://github.com/v1s1t0r1sh3r3/airgeddon/tree/dev
[xtonousou]: https://github.com/xtonousou "xT"
[v1s1t0r]: https://github.com/v1s1t0r1sh3r3
[OscarAkaElvis]: https://github.com/OscarAkaElvis
[Wiki Contact Section]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Contact
[Wiki FAQ Section]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/FAQ%20&%20Troubleshooting
[Wiki Plugins Development Section]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20Development
[Wiki Plugins Hall of Fame Section]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20Hall%20of%20Fame
<!-- Other -->
[@OscarAkaElvis]: https://twitter.com/OscarAkaElvis
[Discord]: https://discord.gg/sQ9dgt9
[IRC]: https://web.libera.chat/
[merchandising-online-shop]: https://airgeddon.creator-spring.com/
================================================
FILE: Dockerfile
================================================
#airgeddon Dockerfile
#Base image
FROM kalilinux/kali-rolling:latest
#Credits & Data
LABEL \
name="airgeddon" \
author="v1s1t0r <v1s1t0r.1s.h3r3@gmail.com>" \
maintainer="OscarAkaElvis <oscar.alfonso.diaz@gmail.com>" \
description="This is a multi-use bash script for Linux systems to audit wireless networks."
#Env vars
ENV AIRGEDDON_URL="https://github.com/v1s1t0r1sh3r3/airgeddon.git"
ENV HASHCAT2_URL="https://github.com/v1s1t0r1sh3r3/hashcat2.0.git"
ENV DEBIAN_FRONTEND="noninteractive"
#Update system
RUN apt update
#Set locales
RUN \
apt -y install \
locales && \
locale-gen en_US.UTF-8 && \
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="en_US.UTF-8"' > /etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=en_US.UTF-8
#Env vars for locales
ENV LANG="en_US.UTF-8"
ENV LANGUAGE="en_US:en"
ENV LC_ALL="en_US.UTF-8"
#Install airgeddon essential tools
RUN \
apt -y install \
gawk \
iw \
aircrack-ng \
xterm \
iproute2 \
pciutils \
procps \
tmux
#Install airgeddon internal tools
RUN \
apt -y install \
ethtool \
usbutils \
rfkill \
x11-utils \
wget \
ccze \
systemd \
x11-xserver-utils \
arping \
sox
#Install update tools
RUN \
apt -y install \
curl \
git
#Install airgeddon optional tools
RUN \
apt -y install \
crunch \
hashcat \
mdk3 \
mdk4 \
hostapd \
lighttpd \
iptables \
nftables \
ettercap-text-only \
bettercap \
isc-dhcp-server \
dnsmasq \
reaver \
bully \
pixiewps \
hostapd-wpe \
asleap \
john \
openssl \
hcxtools \
hcxdumptool \
beef-xss \
tshark \
tcpdump \
hostapd-mana
#Env var for display
ENV DISPLAY=":0"
#Create volume dir for external files
RUN mkdir /io
VOLUME /io
#Set workdir
WORKDIR /opt/
#airgeddon install method 1 (only one method can be used, other must be commented)
#Install airgeddon (Docker Hub automated build process)
RUN mkdir airgeddon
COPY . /opt/airgeddon
#airgeddon install method 2 (only one method can be used, other must be commented)
#Install airgeddon (manual image build)
#Uncomment git clone line and one of the ENV vars to select branch (master->latest, dev->beta)
#ENV BRANCH="master"
#ENV BRANCH="dev"
#RUN git clone -b ${BRANCH} ${AIRGEDDON_URL}
#Remove auto update
RUN sed -i 's|AIRGEDDON_AUTO_UPDATE=true|AIRGEDDON_AUTO_UPDATE=false|' airgeddon/.airgeddonrc
#Force use of iptables
RUN sed -i 's|AIRGEDDON_FORCE_IPTABLES=false|AIRGEDDON_FORCE_IPTABLES=true|' airgeddon/.airgeddonrc
#Make bash script files executable
RUN chmod +x airgeddon/*.sh
#Downgrade Hashcat
RUN \
git clone ${HASHCAT2_URL} && \
cp /opt/hashcat2.0/hashcat /usr/bin/ && \
chmod +x /usr/bin/hashcat
#Clean packages
RUN \
apt clean && \
apt autoclean && \
apt autoremove -y
#Clean files
RUN \
rm -rf /opt/airgeddon/imgs > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/.github > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/.editorconfig > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/CONTRIBUTING.md > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/CODE_OF_CONDUCT.md > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/pindb_checksum.txt > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/Dockerfile > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/binaries > /dev/null 2>&1 && \
rm -rf /opt/hashcat2.0 > /dev/null 2>&1 && \
rm -rf /opt/airgeddon/plugins/* > /dev/null 2>&1 && \
rm -rf /tmp/* > /dev/null 2>&1 && \
rm -rf /var/lib/apt/lists/* > /dev/null 2>&1
#Expose BeEF control panel port
EXPOSE 3000
#Create volume for plugins
VOLUME /opt/airgeddon/plugins
#Start command (launching airgeddon)
CMD ["/bin/bash", "-c", "/opt/airgeddon/airgeddon.sh"]
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# airgeddon
[![Version-shield]](https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/CHANGELOG.md) [![Bash4.2-shield]](http://tldp.org/LDP/abs/html/bashver4.html#AEN21220) [![License-shield]](https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/LICENSE.md) [![Docker-shield]](https://hub.docker.com/r/v1s1t0r1sh3r3/airgeddon/) [![Discord-shield]](https://discord.gg/sQ9dgt9)
[![Paypal-shield]](https://www.paypal.com/paypalme/airgeddon) [![Cryptocurrencies-shield]](https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Contributing-&-Code-of-Conduct)
> This is a multi-use bash script for Linux systems to audit wireless networks.
![Banner]
---
All the needed info about how to "install | use | enjoy" `airgeddon` is present at [GitHub's Wiki].
- *I. Content & Features*
- [Home]
- [Features]
- [Screenshots]
- [Wallpapers]
- *II. Requirements*
- [Requirements]
- [Compatibility]
- [Cards and Chipsets]
- [Wayland]
- [Consistent Network Device Naming]
- [Kali Nethunter]
- [Essential Tools]
- [Optional Tools]
- [BeEF Tips]
- [Hashcat Tips]
- [Bettercap Tips]
- [Update Tools]
- [Internal Tools]
- [Known incompatibilities]
- *III. Getting started*
- [Installation & Usage]
- [Options]
- [Docker]
- [Linux]
- [Mac OSX]
- [Windows]
- [Other Sources]
- [FAQ & Troubleshooting]
- *IV. Learning*
- [CWP Certification]
- *V. Project & Development*
- [Plugins system]
- [Plugins development]
- [Plugins Hall of Fame]
- [Supported Languages]
- [Contributing & Code of Conduct]
- [Merchandising Online Shop]
- [Changelog]
- [Disclaimer & License]
- [Contact]
- *VI. Acknowledgments & References*
- [Hat Tip To]
- [Inspiration]
---
[Banner]: https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/imgs/banners/airgeddon_banner.png "We will conquer the earth!!"
[GitHub's Wiki]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki
[Home]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki
[Features]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Features
[Screenshots]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Screenshots
[Wallpapers]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Wallpapers
[Requirements]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Requirements
[Compatibility]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Compatibility
[Cards and Chipsets]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Cards%20and%20Chipsets
[Wayland]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Wayland
[Consistent Network Device Naming]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Consistent%20Network%20Device%20Naming
[Kali Nethunter]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Kali%20Nethunter
[Essential Tools]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Essential%20Tools
[Optional Tools]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Optional%20Tools
[BeEF Tips]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/BeEF%20Tips
[Hashcat Tips]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Hashcat%20Tips
[Bettercap Tips]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Bettercap%20Tips
[Update Tools]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Update%20Tools
[Internal Tools]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Internal%20Tools
[Known incompatibilities]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Known%20incompatibilities
[Installation & Usage]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Installation%20&%20Usage
[Options]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Options
[Docker]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker
[Linux]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker%20Linux
[Mac OSX]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker%20Mac%20OSX
[Windows]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker%20Windows
[Other Sources]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Other%20Sources
[FAQ & Troubleshooting]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/FAQ%20&%20Troubleshooting
[CWP Certification]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/CWP%20Certification
[Plugins system]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20System
[Plugins development]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20Development
[Plugins Hall of Fame]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Plugins%20Hall%20of%20Fame
[Supported Languages]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Supported%20Languages
[Contributing & Code of Conduct]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Contributing-&-Code-of-Conduct
[Merchandising Online Shop]: https://airgeddon.creator-spring.com/
[Changelog]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Changelog
[Disclaimer & License]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Disclaimer%20&%20License
[Contact]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Contact
[Hat Tip To]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Hat%20Tip%20To
[Inspiration]: https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Inspiration
[Version-shield]: https://img.shields.io/badge/version-11.61-blue.svg?style=flat-square&colorA=273133&colorB=0093ee "Latest version"
[Bash4.2-shield]: https://img.shields.io/badge/bash-4.2%2B-blue.svg?style=flat-square&colorA=273133&colorB=00db00 "Bash 4.2 or later"
[License-shield]: https://img.shields.io/badge/license-GPL%20v3%2B-blue.svg?style=flat-square&colorA=273133&colorB=bd0000 "GPL v3+"
[Docker-shield]: https://img.shields.io/docker/automated/v1s1t0r1sh3r3/airgeddon.svg?style=flat-square&colorA=273133&colorB=a9a9a9 "Docker rules!"
[Discord-shield]: https://img.shields.io/discord/629812069964840991.svg?style=flat-square&colorA=273133&colorB=CBA317&logo=discord&label=Discord%20chat
[Paypal-shield]: https://img.shields.io/badge/donate-paypal-blue.svg?style=flat-square&colorA=273133&colorB=b008bb "Paypal"
[Cryptocurrencies-shield]: https://img.shields.io/badge/donate-cryptocurrencies-blue.svg?style=flat-square&colorA=273133&colorB=f7931a "Cryptocurrencies"
================================================
FILE: airgeddon.sh
================================================
#!/usr/bin/env bash
#Title........: airgeddon.sh
#Description..: This is a multi-use bash script for Linux systems to audit wireless networks.
#Author.......: v1s1t0r
#Version......: 11.61
#Usage........: bash airgeddon.sh
#Bash Version.: 4.2 or later
#Global shellcheck disabled warnings
#shellcheck disable=SC2154,SC2034
#Language vars
#Change this line to select another default language. Select one from available values in array
language="ENGLISH"
declare -A lang_association=(
["en"]="ENGLISH"
["es"]="SPANISH"
["fr"]="FRENCH"
["ca"]="CATALAN"
["pt"]="PORTUGUESE"
["ru"]="RUSSIAN"
["gr"]="GREEK"
["it"]="ITALIAN"
["pl"]="POLISH"
["de"]="GERMAN"
["tr"]="TURKISH"
["ar"]="ARABIC"
["zh"]="CHINESE"
)
rtl_languages=(
"ARABIC"
)
#Tools vars
essential_tools_names=(
"iw"
"awk"
"airmon-ng"
"airodump-ng"
"aircrack-ng"
"xterm"
"ip"
"lspci"
"ps"
)
optional_tools_names=(
"wpaclean"
"crunch"
"aireplay-ng"
"mdk4"
"hashcat"
"hostapd"
"dhcpd"
"nft"
"ettercap"
"etterlog"
"lighttpd"
"dnsmasq"
"wash"
"reaver"
"bully"
"pixiewps"
"bettercap"
"beef"
"packetforge-ng"
"hostapd-wpe"
"asleap"
"john"
"openssl"
"hcxpcapngtool"
"hcxdumptool"
"tshark"
"tcpdump"
"besside-ng"
"hostapd-mana"
"hcxhash2cap"
"hcxhashtool"
)
update_tools=("curl")
declare -A possible_package_names=(
[${essential_tools_names[0]}]="iw" #iw
[${essential_tools_names[1]}]="awk / gawk" #awk
[${essential_tools_names[2]}]="aircrack-ng" #airmon-ng
[${essential_tools_names[3]}]="aircrack-ng" #airodump-ng
[${essential_tools_names[4]}]="aircrack-ng" #aircrack-ng
[${essential_tools_names[5]}]="xterm" #xterm
[${essential_tools_names[6]}]="iproute2" #ip
[${essential_tools_names[7]}]="pciutils" #lspci
[${essential_tools_names[8]}]="procps / procps-ng" #ps
[${optional_tools_names[0]}]="aircrack-ng" #wpaclean
[${optional_tools_names[1]}]="crunch" #crunch
[${optional_tools_names[2]}]="aircrack-ng" #aireplay-ng
[${optional_tools_names[3]}]="mdk4" #mdk4
[${optional_tools_names[4]}]="hashcat" #hashcat
[${optional_tools_names[5]}]="hostapd" #hostapd
[${optional_tools_names[6]}]="isc-dhcp-server / dhcp-server / dhcp" #dhcpd
[${optional_tools_names[7]}]="nftables" #nft
[${optional_tools_names[8]}]="ettercap / ettercap-text-only / ettercap-graphical" #ettercap
[${optional_tools_names[9]}]="ettercap / ettercap-text-only / ettercap-graphical" #etterlog
[${optional_tools_names[10]}]="lighttpd" #lighttpd
[${optional_tools_names[11]}]="dnsmasq" #dnsmasq
[${optional_tools_names[12]}]="reaver" #wash
[${optional_tools_names[13]}]="reaver" #reaver
[${optional_tools_names[14]}]="bully" #bully
[${optional_tools_names[15]}]="pixiewps" #pixiewps
[${optional_tools_names[16]}]="bettercap" #bettercap
[${optional_tools_names[17]}]="beef-xss / beef-project" #beef
[${optional_tools_names[18]}]="aircrack-ng" #packetforge-ng
[${optional_tools_names[19]}]="hostapd-wpe" #hostapd-wpe
[${optional_tools_names[20]}]="asleap" #asleap
[${optional_tools_names[21]}]="john" #john
[${optional_tools_names[22]}]="openssl" #openssl
[${optional_tools_names[23]}]="hcxtools" #hcxpcapngtool
[${optional_tools_names[24]}]="hcxdumptool" #hcxdumptool
[${optional_tools_names[25]}]="tshark / wireshark-cli / wireshark" #tshark
[${optional_tools_names[26]}]="tcpdump" #tcpdump
[${optional_tools_names[27]}]="aircrack-ng" #besside-ng
[${optional_tools_names[28]}]="hostapd-mana" #hostapd-mana
[${optional_tools_names[29]}]="hcxtools" #hcxhash2cap
[${optional_tools_names[30]}]="hcxtools" #hcxhashtool
[${update_tools[0]}]="curl" #curl
)
#More than one alias can be defined separated by spaces at value
declare -A possible_alias_names=(
["beef"]="beef-xss beef-server"
)
#General vars
airgeddon_version="11.61"
language_strings_expected_version="11.61-1"
standardhandshake_filename="handshake-01.cap"
standardpmkid_filename="pmkid_hash.txt"
standardpmkidcap_filename="pmkid.cap"
timeout_capture_handshake_decloak="20"
timeout_capture_pmkid="45"
timeout_capture_identities="45"
timeout_certificates_analysis="45"
timeout_wpa3_downgrade="25"
osversionfile_dir="/etc/"
plugins_dir="plugins/"
ag_orchestrator_file="ag.orchestrator.txt"
system_tmpdir="/tmp/"
minimum_bash_version_required="4.2"
resume_message=224
abort_question=12
pending_of_translation="[PoT]"
escaped_pending_of_translation="\[PoT\]"
standard_resolution="1024x768"
curl_404_error="404: Not Found"
rc_file_name=".airgeddonrc"
alternative_rc_file_name="airgeddonrc"
language_strings_file="language_strings.sh"
broadcast_mac="FF:FF:FF:FF:FF:FF"
minimum_hcxdumptool_filterap_version="6.0.0"
minimum_hcxdumptool_bpf_version="6.3.0"
#5Ghz vars
ghz="Ghz"
band_24ghz="2.4${ghz}"
band_5ghz="5${ghz}"
valid_channels_24_ghz_regexp="([1-9]|1[0-4])"
valid_channels_24_and_5_ghz_regexp="([1-9]|1[0-4]|3[68]|4[02468]|5[02468]|6[024]|10[02468]|11[02468]|12[02468]|13[2468]|14[0249]|15[13579]|16[15])"
minimum_wash_dualscan_version="1.6.5"
#aircrack vars
aircrack_tmp_simple_name_file="aircrack"
aircrack_pot_tmp="${aircrack_tmp_simple_name_file}.pot"
aircrack_pmkid_version="1.4"
#hashcat vars
hashcat3_version="3.0"
hashcat4_version="4.0.0"
hashcat_hccapx_version="3.40"
hashcat_hcx_conversion_version="6.2.0"
minimum_hashcat_pmkid_version="6.0.0"
hashcat_2500_deprecated_version="6.2.4"
hashcat_handshake_cracking_plugin="2500"
hashcat_pmkid_cracking_plugin="22000"
hashcat_enterprise_cracking_plugin="5500"
hashcat_tmp_simple_name_file="hctmp"
hashcat_tmp_file="${hashcat_tmp_simple_name_file}.hccap"
hashcat_pot_tmp="${hashcat_tmp_simple_name_file}.pot"
hashcat_output_file="${hashcat_tmp_simple_name_file}.out"
hccapx_tool="cap2hccapx"
possible_hccapx_converter_known_locations=(
"/usr/lib/hashcat-utils/${hccapx_tool}.bin"
)
#john the ripper vars
jtr_tmp_simple_name_file="jtrtmp"
jtr_pot_tmp="${jtr_tmp_simple_name_file}.pot"
jtr_output_file="${jtr_tmp_simple_name_file}.out"
#WEP vars
wep_data="wepdata"
wepdir="wep/"
wep_attack_file="ag.wepattack.sh"
wep_key_handler="ag.wep_key_handler.sh"
wep_processes_file="wep_processes"
wep_besside_log="ag.besside.log"
#WPA3 vars
aircrack_wpa3_version="1.7"
plugin_x="under_construction_message"
plugin_x_under_construction="under_construction"
plugin_y="under_construction_message"
plugin_y_under_construction="under_construction"
plugin_z="under_construction_message"
plugin_z_under_construction="under_construction"
#Docker vars
docker_based_distro="Kali"
docker_io_dir="/io/"
#WPS vars
minimum_reaver_pixiewps_version="1.5.2"
minimum_reaver_nullpin_version="1.6.1"
minimum_bully_pixiewps_version="1.1"
minimum_bully_verbosity4_version="1.1"
minimum_wash_json_version="1.6.2"
known_pins_dbfile="known_pins.db"
pins_dbfile_checksum="pindb_checksum.txt"
wps_default_generic_pin="12345670"
wps_attack_script_file="ag.wpsattack.sh"
wps_out_file="ag.wpsout.txt"
timeout_secs_per_pin="30"
timeout_secs_per_pixiedust="30"
#Repository and contact vars
repository_hostname="github.com"
github_user="v1s1t0r1sh3r3"
github_repository="airgeddon"
branch="master"
script_filename="airgeddon.sh"
urlgithub="https://${repository_hostname}/${github_user}/${github_repository}"
urlscript_directlink="https://raw.githubusercontent.com/${github_user}/${github_repository}/${branch}/${script_filename}"
urlscript_pins_dbfile="https://raw.githubusercontent.com/${github_user}/${github_repository}/${branch}/${known_pins_dbfile}"
urlscript_pins_dbfile_checksum="https://raw.githubusercontent.com/${github_user}/${github_repository}/${branch}/${pins_dbfile_checksum}"
urlscript_language_strings_file="https://raw.githubusercontent.com/${github_user}/${github_repository}/${branch}/${language_strings_file}"
urlscript_options_config_file="https://raw.githubusercontent.com/${github_user}/${github_repository}/${branch}/${rc_file_name}"
urlgithub_wiki="https://${repository_hostname}/${github_user}/${github_repository}/wiki"
urlmerchandising_shop="https://airgeddon.creator-spring.com/"
mail="v1s1t0r.1s.h3r3@gmail.com"
author="v1s1t0r"
wpa3_online_attack_plugin_repo="https://${repository_hostname}/OscarAkaElvis/airgeddon-plugins"
wpa3_dragon_drain_plugin_repo="https://${repository_hostname}/Janek79ax/dragon-drain-wpa3-airgeddon-plugin"
wpa3_cookie_guzzler_plugin_repo="https://${repository_hostname}/OscarAkaElvis/airgeddon-plugins"
#Dhcpd, Hostapd, Hostapd-wpe, Hostapd-mana and misc Evil Twin vars
loopback_ip="127.0.0.1"
loopback_ipv6="::1/128"
loopback_interface="lo"
routing_tmp_file="ag.iptables_nftables"
dhcpd_file="ag.dhcpd.conf"
dhcpd_pid_file="dhcpd.pid"
dnsmasq_file="ag.dnsmasq.conf"
internet_dns1="8.8.8.8"
internet_dns2="8.8.4.4"
internet_dns3="139.130.4.5"
bettercap_proxy_port="8080"
bettercap_dns_port="5300"
dns_port="53"
dhcp_port="67"
www_port="80"
https_port="443"
minimum_bettercap_advanced_options="1.5.9"
minimum_bettercap_fixed_beef_iptables_issue="1.6.2"
bettercap2_version="2.0"
bettercap2_sslstrip_working_version="2.28"
ettercap_file="ag.ettercap.log"
bettercap_file="ag.bettercap.log"
bettercap_config_file="ag.bettercap.cap"
bettercap_hook_file="ag.bettercap.js"
beef_port="3000"
beef_control_panel_url="http://${loopback_ip}:${beef_port}/ui/panel"
jshookfile="hook.js"
beef_file="ag.beef.conf"
beef_pass="airgeddon"
beef_db="beef.db"
beef_default_cfg_file="config.yaml"
beef_needed_brackets_version="0.4.7.2"
beef_installation_url="https://${repository_hostname}/beefproject/beef/wiki/Installation"
hostapd_file="ag.hostapd.conf"
hostapd_wifi7_version="2.12"
hostapd_wpe_wifi7_version="2.12"
hostapd_wpe_file="ag.hostapd_wpe.conf"
hostapd_wpe_log="ag.hostapd_wpe.log"
hostapd_wpe_default_log="hostapd-wpe.log"
hostapd_mana_file="ag.hostapd_mana.conf"
hostapd_mana_log="ag.hostapd_mana.log"
hostapd_mana_out="ag.hostapd_mana.hccapx"
control_et_file="ag.et_control.sh"
control_enterprise_file="ag.enterprise_control.sh"
enterprisedir="enterprise/"
certsdir="certs/"
certspass="airgeddon"
default_certs_path="/etc/hostapd-wpe/certs/"
default_certs_pass="whatever"
mana_pass="airgeddon"
mana_cap_file="ag.mana.cap"
mana_tmp_file="ag.mana.txt"
webserver_file="ag.lighttpd.conf"
webserver_log="ag.lighttpd.log"
webdir="www/"
indexfile="index.htm"
checkfile="check.htm"
cssfile="portal.css"
jsfile="portal.js"
pixelfile="pixel.png"
attemptsfile="ag.et_attempts.txt"
currentpassfile="ag.et_currentpass.txt"
et_successfile="ag.et_success.txt"
enterprise_successfile="ag.enterprise_success.txt"
et_processesfile="ag.et_processes.txt"
asleap_pot_tmp="ag.asleap_tmp.txt"
channelfile="ag.et_channel.txt"
customportals_php_as_cgi=1
possible_dhcp_leases_files=(
"/var/lib/dhcp/dhcpd.leases"
"/var/state/dhcp/dhcpd.leases"
"/var/lib/dhcpd/dhcpd.leases"
)
possible_beef_known_locations=(
"/usr/share/beef/"
"/usr/share/beef-xss/"
"/opt/beef/"
"/opt/beef-project/"
"/usr/lib/beef/"
#Custom BeEF location (set=0)
)
#Connection vars
ips_to_check_internet=(
"${internet_dns1}"
"${internet_dns2}"
"${internet_dns3}"
)
#Distros vars
known_compatible_distros=(
"Wifislax"
"Kali"
"Parrot"
"Backbox"
"BlackArch"
"Cyborg"
"Ubuntu"
"Mint"
"Debian"
"SuSE"
"CentOS"
"Gentoo"
"Fedora"
"Red Hat"
"Arch"
"OpenMandriva"
"Pentoo"
"Manjaro"
"CachyOS"
"Puppy"
)
known_incompatible_distros=(
"Microsoft"
)
known_arm_compatible_distros=(
"Raspbian"
"Raspberry Pi OS"
"Parrot arm"
"Kali arm"
)
#Sponsors
sponsors=(
"Raleigh2016"
"hmmlopl"
"codythebeast89"
"Kaliscandinavia"
"Furrycoder"
"Jonathon Coy"
"Matthew Ebert"
)
#Hint vars
declare main_hints=(128 134 163 437 438 442 445 516 590 626 660 697 699 712 739)
declare dos_hints=(129 131 133 697 699)
declare handshake_pmkid_decloaking_hints=(127 130 132 664 665 697 699 728 729)
declare dos_handshake_decloak_hints=(142 697 699 733 739)
declare dos_info_gathering_enterprise_hints=(697 699 733 739)
declare decrypt_hints=(171 179 208 244 163 697 699)
declare personal_decrypt_hints=(171 178 179 208 244 163 697 699)
declare enterprise_decrypt_hints=(171 179 208 244 163 610 697 699)
declare select_interface_hints=(246 697 699 712 739)
declare language_hints=(250 438)
declare option_hints=(445 250 448 477 591 626 697 699)
declare evil_twin_hints=(254 258 264 269 309 328 400 509 697 699 739)
declare evil_twin_dos_hints=(267 268 509 697 699)
declare wpa3_dos_hints=(267 268 697 699 777)
declare beef_hints=(408)
declare wps_hints=(342 343 344 356 369 390 490 625 697 699 739)
declare wep_hints=(431 429 428 432 433 697 699 739)
declare enterprise_hints=(112 332 483 518 629 301 697 699 739 742)
declare wpa3_hints=(128 134 437 438 442 445 516 590 626 660 697 699 764)
#Charset vars
crunch_lowercasecharset="abcdefghijklmnopqrstuvwxyz"
crunch_uppercasecharset="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
crunch_numbercharset="0123456789"
crunch_symbolcharset="!#$%/=?{}[]-*:;"
hashcat_charsets=("?l" "?u" "?d" "?s")
#Tmux vars
airgeddon_uid=""
session_name="airgeddon"
tmux_main_window="airgeddon-Main"
no_hardcore_exit=0
#Check coherence between script and language_strings file
function check_language_strings() {
debug_print
if [ -f "${scriptfolder}${language_strings_file}" ]; then
language_file_found=1
language_file_mismatch=0
#shellcheck source=./language_strings.sh
source "${scriptfolder}${language_strings_file}"
set_language_strings_version
if [ "${language_strings_version}" != "${language_strings_expected_version}" ]; then
language_file_mismatch=1
fi
else
language_file_found=0
fi
if [[ "${language_file_found}" -eq 0 ]] || [[ "${language_file_mismatch}" -eq 1 ]]; then
language_strings_handling_messages
generate_dynamic_line "airgeddon" "title"
if [ "${language_file_found}" -eq 0 ]; then
echo_red "${language_strings_no_file[${language}]}"
if [ "${airgeddon_version}" = "6.1" ]; then
echo
echo_yellow "${language_strings_first_time[${language}]}"
fi
elif [ "${language_file_mismatch}" -eq 1 ]; then
echo_red "${language_strings_file_mismatch[${language}]}"
fi
echo
echo_blue "${language_strings_try_to_download[${language}]}"
read -p "${language_strings_key_to_continue[${language}]}" -r
if check_repository_access; then
if download_language_strings_file; then
echo
echo_yellow "${language_strings_successfully_downloaded[${language}]}"
read -p "${language_strings_key_to_continue[${language}]}" -r
clear
return 0
else
echo
echo_red "${language_strings_failed_downloading[${language}]}"
fi
else
echo
echo_red "${language_strings_failed_downloading[${language}]}"
fi
echo
echo_blue "${language_strings_exiting[${language}]}"
echo
hardcore_exit
fi
}
#Download the language strings file
function download_language_strings_file() {
debug_print
local lang_file_downloaded=0
remote_language_strings_file=$(timeout -s SIGTERM 15 curl -L ${urlscript_language_strings_file} 2> /dev/null)
if [[ -n "${remote_language_strings_file}" ]] && [[ "${remote_language_strings_file}" != "${curl_404_error}" ]]; then
lang_file_downloaded=1
else
http_proxy_detect
if [ "${http_proxy_set}" -eq 1 ]; then
remote_language_strings_file=$(timeout -s SIGTERM 15 curl --proxy "${http_proxy}" -L ${urlscript_language_strings_file} 2> /dev/null)
if [[ -n "${remote_language_strings_file}" ]] && [[ "${remote_language_strings_file}" != "${curl_404_error}" ]]; then
lang_file_downloaded=1
fi
fi
fi
if [ "${lang_file_downloaded}" -eq 1 ]; then
echo "${remote_language_strings_file}" > "${scriptfolder}${language_strings_file}"
chmod +x "${scriptfolder}${language_strings_file}" > /dev/null 2>&1
#shellcheck source=./language_strings.sh
source "${scriptfolder}${language_strings_file}"
return 0
else
return 1
fi
}
#Set messages for language_strings handling
function language_strings_handling_messages() {
declare -gA language_strings_no_file
language_strings_no_file["ENGLISH"]="Error. Language strings file not found"
language_strings_no_file["SPANISH"]="Error. No se ha encontrado el fichero de traducciones"
language_strings_no_file["FRENCH"]="Erreur. Fichier contenant les traductions absent"
language_strings_no_file["CATALAN"]="Error. No s'ha trobat el fitxer de traduccions"
language_strings_no_file["PORTUGUESE"]="Erro. O arquivo de tradução não foi encontrado"
language_strings_no_file["RUSSIAN"]="Ошибка. Не найден языковой файл"
language_strings_no_file["GREEK"]="Σφάλμα. Το αρχείο γλωσσών δεν βρέθηκε"
language_strings_no_file["ITALIAN"]="Errore. Non si trova il file delle traduzioni"
language_strings_no_file["POLISH"]="Błąd. Nie znaleziono pliku tłumaczenia"
language_strings_no_file["GERMAN"]="Fehler. Die Übersetzungsdatei wurde nicht gefunden"
language_strings_no_file["TURKISH"]="Hata. Çeviri dosyası bulunamadı"
language_strings_no_file["ARABIC"]="خطأ. ملف اللغة غير موجود"
language_strings_no_file["CHINESE"]="错误。未找到语言支持文件"
declare -gA language_strings_file_mismatch
language_strings_file_mismatch["ENGLISH"]="Error. The language strings file found mismatches expected version"
language_strings_file_mismatch["SPANISH"]="Error. El fichero de traducciones encontrado no es la versión esperada"
language_strings_file_mismatch["FRENCH"]="Erreur. Les traductions trouvées ne sont pas celles attendues"
language_strings_file_mismatch["CATALAN"]="Error. El fitxer de traduccions trobat no és la versió esperada"
language_strings_file_mismatch["PORTUGUESE"]="Erro. O a versão do arquivos de tradução encontrado é a incompatível"
language_strings_file_mismatch["RUSSIAN"]="Ошибка. Языковой файл не соответствует ожидаемой версии"
language_strings_file_mismatch["GREEK"]="Σφάλμα. Το αρχείο γλωσσών που έχει βρεθεί δεν αντιστοιχεί με την προαπαιτούμενη έκδοση"
language_strings_file_mismatch["ITALIAN"]="Errore. Il file delle traduzioni trovato non è la versione prevista"
language_strings_file_mismatch["POLISH"]="Błąd. Znaleziony plik tłumaczenia nie jest oczekiwaną wersją"
language_strings_file_mismatch["GERMAN"]="Fehler. Die gefundene Übersetzungsdatei ist nicht die erwartete Version"
language_strings_file_mismatch["TURKISH"]="Hata. Bulunan çeviri dosyası beklenen sürüm değil"
language_strings_file_mismatch["ARABIC"]="خطأ. ملف اللغة غيرمتطابق مع الإصدار المتوقع"
language_strings_file_mismatch["CHINESE"]="错误。发现语言支持文件与预期版本不匹配"
declare -gA language_strings_try_to_download
language_strings_try_to_download["ENGLISH"]="airgeddon will try to download the language strings file..."
language_strings_try_to_download["SPANISH"]="airgeddon intentará descargar el fichero de traducciones..."
language_strings_try_to_download["FRENCH"]="airgeddon va essayer de télécharger les fichiers de traductions..."
language_strings_try_to_download["CATALAN"]="airgeddon intentarà descarregar el fitxer de traduccions..."
language_strings_try_to_download["PORTUGUESE"]="O airgeddon tentará baixar o arquivo de tradução..."
language_strings_try_to_download["RUSSIAN"]="airgeddon попытается загрузить языковой файл..."
language_strings_try_to_download["GREEK"]="Το airgeddon θα προσπαθήσει να κατεβάσει το αρχείο γλωσσών..."
language_strings_try_to_download["ITALIAN"]="airgeddon cercherá di scaricare il file delle traduzioni..."
language_strings_try_to_download["POLISH"]="airgeddon spróbuje pobrać plik tłumaczeń..."
language_strings_try_to_download["GERMAN"]="airgeddon wird versuchen, die Übersetzungsdatei herunterzuladen..."
language_strings_try_to_download["TURKISH"]="airgeddon çeviri dosyasını indirmeye çalışacak..."
language_strings_try_to_download["ARABIC"]="سيحاول airgeddon تنزيل ملف سلاسل اللغة ..."
language_strings_try_to_download["CHINESE"]="airgeddon 将尝试下载语言支持文件..."
declare -gA language_strings_successfully_downloaded
language_strings_successfully_downloaded["ENGLISH"]="Language strings file was successfully downloaded"
language_strings_successfully_downloaded["SPANISH"]="Se ha descargado con éxito el fichero de traducciones"
language_strings_successfully_downloaded["FRENCH"]="Les fichiers traduction ont été correctement téléchargés"
language_strings_successfully_downloaded["CATALAN"]="S'ha descarregat amb èxit el fitxer de traduccions"
language_strings_successfully_downloaded["PORTUGUESE"]="O arquivo de tradução foi baixado com sucesso"
language_strings_successfully_downloaded["RUSSIAN"]="Языковой файл был успешно загружен"
language_strings_successfully_downloaded["GREEK"]="Το αρχείο γλωσσών κατέβηκε με επιτυχία"
language_strings_successfully_downloaded["ITALIAN"]="Il file delle traduzioni è stato scaricato con successo"
language_strings_successfully_downloaded["POLISH"]="Plik z tłumaczeniem został pomyślnie pobrany"
language_strings_successfully_downloaded["GERMAN"]="Die Übersetzungsdatei wurde erfolgreich heruntergeladen"
language_strings_successfully_downloaded["TURKISH"]="Çeviri dosyası başarıyla indirildi"
language_strings_successfully_downloaded["ARABIC"]="تم تنزيل ملف سلاسل اللغة بنجاح"
language_strings_successfully_downloaded["CHINESE"]="语言支持文件已成功下载"
declare -gA language_strings_failed_downloading
language_strings_failed_downloading["ENGLISH"]="The language string file can't be downloaded. Check your internet connection or download it manually from ${normal_color}${urlgithub}"
language_strings_failed_downloading["SPANISH"]="No se ha podido descargar el fichero de traducciones. Comprueba tu conexión a internet o descárgalo manualmente de ${normal_color}${urlgithub}"
language_strings_failed_downloading["FRENCH"]="Impossible de télécharger le fichier traduction. Vérifiez votre connexion à internet ou téléchargez le fichier manuellement ${normal_color}${urlgithub}"
language_strings_failed_downloading["CATALAN"]="No s'ha pogut descarregar el fitxer de traduccions. Comprova la connexió a internet o descarrega'l manualment de ${normal_color}${urlgithub}"
language_strings_failed_downloading["PORTUGUESE"]="Não foi possível baixar o arquivos de tradução. Verifique a sua conexão com a internet ou baixe manualmente em ${normal_color}${urlgithub}"
language_strings_failed_downloading["RUSSIAN"]="Языковой файл не может быть загружен. Проверьте подключение к Интернету или загрузите его вручную с ${normal_color}${urlgithub}"
language_strings_failed_downloading["GREEK"]="Το αρχείο γλωσσών δεν μπορεί να κατέβει. Ελέγξτε τη σύνδεση σας με το διαδίκτυο ή κατεβάστε το χειροκίνητα ${normal_color}${urlgithub}"
language_strings_failed_downloading["ITALIAN"]="Impossibile scaricare il file delle traduzioni. Controlla la tua connessione a internet o scaricalo manualmente ${normal_color}${urlgithub}"
language_strings_failed_downloading["POLISH"]="Nie można pobrać pliku tłumaczenia. Sprawdź połączenie internetowe lub pobierz go ręcznie z ${normal_color}${urlgithub}"
language_strings_failed_downloading["GERMAN"]="Die Übersetzungsdatei konnte nicht heruntergeladen werden. Überprüfen Sie Ihre Internetverbindung oder laden Sie sie manuell von ${normal_color}${urlgithub} runter"
language_strings_failed_downloading["TURKISH"]="Çeviri dosyası indirilemedi. İnternet bağlantınızı kontrol edin veya manuel olarak indirin ${normal_color}${urlgithub}"
language_strings_failed_downloading["ARABIC"]="${normal_color}${urlgithub}${red_color} لا يمكن تنزيل ملف اللغة. تحقق من اتصالك بالإنترنت أو قم بتنزيله يدويًا من"
language_strings_failed_downloading["CHINESE"]="无法下载语言支持文件。检查您的互联网连接或从 手动下载 ${normal_color}${urlgithub}"
declare -gA language_strings_first_time
language_strings_first_time["ENGLISH"]="If you are seeing this message after an automatic update, don't be scared! It's probably because airgeddon has different file structure since version 6.1. It will be automatically fixed"
language_strings_first_time["SPANISH"]="Si estás viendo este mensaje tras una actualización automática, ¡no te asustes! probablemente es porque a partir de la versión 6.1 la estructura de ficheros de airgeddon ha cambiado. Se reparará automáticamente"
language_strings_first_time["FRENCH"]="Si vous voyez ce message après une mise à jour automatique ne vous inquiétez pas! A partir de la version 6.1 la structure de fichier d'airgeddon a changé. L'ajustement se fera automatiquement"
language_strings_first_time["CATALAN"]="Si estàs veient aquest missatge després d'una actualització automàtica, no t'espantis! probablement és perquè a partir de la versió 6.1 l'estructura de fitxers de airgeddon ha canviat. Es repararà automàticament"
language_strings_first_time["PORTUGUESE"]="Se você está vendo esta mensagem depois de uma atualização automática, não tenha medo! A partir da versão 6.1 da estrutura de arquivos do airgeddon mudou. Isso será corrigido automaticamente"
language_strings_first_time["RUSSIAN"]="Если вы видите это сообщение после автоматического обновления, не переживайте! Вероятно, это объясняется тем, что, начиная с версии 6.1, airgeddon имеет другую структуру файлов. Проблема будет разрешена автоматически"
language_strings_first_time["GREEK"]="Εάν βλέπετε αυτό το μήνυμα μετά από κάποια αυτόματη ενημέρωση, μην τρομάξετε! Πιθανόν είναι λόγω της διαφορετικής δομής του airgeddon μετά από την έκδοση 6.1. Θα επιδιορθωθεί αυτόματα"
language_strings_first_time["ITALIAN"]="Se stai vedendo questo messaggio dopo un aggiornamento automatico, niente panico! probabilmente è perché a partire dalla versione 6.1 é cambiata la struttura dei file di airgeddon. Sarà riparato automaticamente"
language_strings_first_time["POLISH"]="Jeśli widzisz tę wiadomość po automatycznej aktualizacji, nie obawiaj się! To prawdopodobnie dlatego, że w wersji 6.1 zmieniła się struktura plików airgeddon. Naprawi się automatycznie"
language_strings_first_time["GERMAN"]="Wenn Sie diese Nachricht nach einem automatischen Update sehen, haben Sie keine Angst! Das liegt vermutlich daran, dass ab Version 6.1 die Dateistruktur von airgeddon geändert wurde. Es wird automatisch repariert"
language_strings_first_time["TURKISH"]="Otomatik bir güncellemeden sonra bu mesajı görüyorsanız, korkmayın! muhtemelen 6.1 sürümünden itibaren airgeddon dosya yapısı değişmiştir. Otomatik olarak tamir edilecektir"
language_strings_first_time["ARABIC"]="إذا كنت ترى هذه الرسالة بعد التحديث التلقائي ، فلا تخف! ربما يرجع السبب في ذلك إلى أن airgeddon له بنية ملفات مختلفة منذ الإصدار 6.1. سيتم إصلاحه تلقائيًا "
language_strings_first_time["CHINESE"]="如果您在自动更新后看到此消息,请不要害怕!这可能是因为 airgeddon 从 6.1 版本开始有不同的文件结构。会自动修复"
declare -gA language_strings_exiting
language_strings_exiting["ENGLISH"]="Exiting airgeddon script v${airgeddon_version} - See you soon! :)"
language_strings_exiting["SPANISH"]="Saliendo de airgeddon script v${airgeddon_version} - Nos vemos pronto! :)"
language_strings_exiting["FRENCH"]="Fermeture du script airgeddon v${airgeddon_version} - A bientôt! :)"
language_strings_exiting["CATALAN"]="Sortint de airgeddon script v${airgeddon_version} - Ens veiem aviat! :)"
language_strings_exiting["PORTUGUESE"]="Saindo do script airgeddon v${airgeddon_version} - Até breve! :)"
language_strings_exiting["RUSSIAN"]="Выход из скрипта airgeddon v${airgeddon_version} - До встречи! :)"
language_strings_exiting["GREEK"]="Κλείσιμο του airgeddon v${airgeddon_version} - Αντίο :)"
language_strings_exiting["ITALIAN"]="Uscendo dallo script airgeddon v${airgeddon_version} - A presto! :)"
language_strings_exiting["POLISH"]="Wyjście z skryptu airgeddon v${airgeddon_version} - Do zobaczenia wkrótce! :)"
language_strings_exiting["GERMAN"]="Sie verlassen airgeddon v${airgeddon_version} - Bis bald! :)"
language_strings_exiting["TURKISH"]="airgeddon yazılımından çıkış yapılıyor v${airgeddon_version} - Yakında görüşürüz! :)"
language_strings_exiting["ARABIC"]="الخروج من البرنامج airgeddon v${airgeddon_version}- نراكم قريبًا! :)"
language_strings_exiting["CHINESE"]="退出 airgeddon 脚本 v${airgeddon_version} - 待会见! :)"
declare -gA language_strings_key_to_continue
language_strings_key_to_continue["ENGLISH"]="Press [Enter] key to continue..."
language_strings_key_to_continue["SPANISH"]="Pulsa la tecla [Enter] para continuar..."
language_strings_key_to_continue["FRENCH"]="Pressez [Enter] pour continuer..."
language_strings_key_to_continue["CATALAN"]="Prem la tecla [Enter] per continuar..."
language_strings_key_to_continue["PORTUGUESE"]="Pressione a tecla [Enter] para continuar..."
language_strings_key_to_continue["RUSSIAN"]="Нажмите клавишу [Enter] для продолжения..."
language_strings_key_to_continue["GREEK"]="Πατήστε το κουμπί [Enter] για να συνεχίσετε..."
language_strings_key_to_continue["ITALIAN"]="Premere il tasto [Enter] per continuare..."
language_strings_key_to_continue["POLISH"]="Naciśnij klawisz [Enter] aby kontynuować..."
language_strings_key_to_continue["GERMAN"]="Drücken Sie die [Enter]-Taste um fortzufahren..."
language_strings_key_to_continue["TURKISH"]="Devam etmek için [Enter] tuşuna basın..."
language_strings_key_to_continue["ARABIC"]="اضغط على مفتاح [Enter] للمتابعة ..."
language_strings_key_to_continue["CHINESE"]="按 [Enter] 键继续..."
}
#Generic toggle option function
function option_toggle() {
debug_print
local required_reboot=0
if [[ -n "${2}" ]] && [[ "${2}" = "required_reboot" ]]; then
required_reboot=1
fi
local option_var_name="${1}"
local option_var_value="${!1}"
if "${option_var_value:-true}"; then
sed -ri "s:(${option_var_name})=(true):\1=false:" "${rc_path}" 2> /dev/null
if ! grep "${option_var_name}=false" "${rc_path}" > /dev/null; then
return 1
fi
if [ "${required_reboot}" -eq 0 ]; then
eval "export ${option_var_name}=false"
fi
else
sed -ri "s:(${option_var_name})=(false):\1=true:" "${rc_path}" 2> /dev/null
if ! grep "${option_var_name}=true" "${rc_path}" > /dev/null; then
return 1
fi
if [ "${required_reboot}" -eq 0 ]; then
eval "export ${option_var_name}=true"
fi
fi
case "${option_var_name}" in
"AIRGEDDON_BASIC_COLORS")
remap_colors
;;
"AIRGEDDON_EXTENDED_COLORS")
initialize_extended_colorized_output
;;
"AIRGEDDON_5GHZ_ENABLED")
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
secondary_phy_interface=$(physical_interface_finder "${secondary_wifi_interface}")
check_interface_supported_bands "${secondary_phy_interface}" "secondary_wifi_interface"
;;
"AIRGEDDON_EVIL_TWIN_SOUNDS")
initialize_sounds
;;
esac
return 0
}
#Get current permanent language
function get_current_permanent_language() {
debug_print
current_permanent_language=$(grep "language=" "${scriptfolder}${scriptname}" | grep -v "auto_change_language" | head -n 1 | awk -F "=" '{print $2}')
current_permanent_language=$(echo "${current_permanent_language}" | sed -e 's/^"//;s/"$//')
}
#Set language as permanent
function set_permanent_language() {
debug_print
sed -ri "s:^([l]anguage)=\"[a-zA-Z]+\":\1=\"${language}\":" "${scriptfolder}${scriptname}" 2> /dev/null
if ! grep -E "^[l]anguage=\"${language}\"" "${scriptfolder}${scriptname}" > /dev/null; then
return 1
fi
return 0
}
#Print the current line of where this was called and the function's name. Applies to some (which are useful) functions
function debug_print() {
if "${AIRGEDDON_DEBUG_MODE:-true}"; then
declare excluded_functions=(
"airmon_fix"
"ask_yesno"
"check_pending_of_translation"
"clean_env_vars"
"contains_element"
"create_instance_orchestrator_file"
"create_rcfile"
"echo_blue"
"echo_brown"
"echo_cyan"
"echo_green"
"echo_green_title"
"echo_pink"
"echo_red"
"echo_red_slim"
"echo_white"
"echo_yellow"
"env_vars_initialization"
"env_vars_values_validation"
"fix_autocomplete_chars"
"flying_saucer"
"generate_dynamic_line"
"initialize_colors"
"initialize_instance_settings"
"initialize_script_settings"
"instance_setter"
"interrupt_checkpoint"
"language_strings"
"last_echo"
"physical_interface_finder"
"print_hint"
"print_large_separator"
"print_simple_separator"
"read_yesno"
"register_instance_pid"
"remove_warnings"
"set_absolute_path"
"set_script_paths"
"special_text_missed_optional_tool"
"store_array"
"under_construction_message"
)
if (IFS=$'\n'; echo "${excluded_functions[*]}") | grep -qFx "${FUNCNAME[1]}"; then
return 1
fi
echo "Line:${BASH_LINENO[1]}" "${FUNCNAME[1]}"
fi
return 0
}
#Set the message to show again after an interrupt ([Ctrl+C] or [Ctrl+Z]) without exiting
function interrupt_checkpoint() {
debug_print
if [ -z "${last_buffered_type1}" ]; then
last_buffered_message1=${1}
last_buffered_message2=${1}
last_buffered_type1=${2}
last_buffered_type2=${2}
else
if [[ "${1}" -ne "${resume_message}" ]] 2> /dev/null && [[ "${1}" != "${resume_message}" ]]; then
last_buffered_message2=${last_buffered_message1}
last_buffered_message1=${1}
last_buffered_type2=${last_buffered_type1}
last_buffered_type1=${2}
fi
fi
}
#Add the text on a menu when you miss an optional tool
function special_text_missed_optional_tool() {
debug_print
declare -a required_tools=("${!3}")
allowed_menu_option=1
if ! "${AIRGEDDON_DEVELOPMENT_MODE:-false}"; then
tools_needed="${optionaltool_needed[${1}]}"
for item in "${required_tools[@]}"; do
if [ "${optional_tools[${item}]}" -eq 0 ]; then
allowed_menu_option=0
tools_needed+="${item} "
fi
done
fi
local message
message=$(replace_string_vars "${@}")
if [ "${allowed_menu_option}" -eq 1 ]; then
last_echo "${message}" "${normal_color}"
else
[[ ${message} =~ ^([0-9]+)\.(.*)$ ]] && forbidden_options+=("${BASH_REMATCH[1]}")
tools_needed=${tools_needed:: -1}
echo_red_slim "${message} (${tools_needed})"
fi
}
#Generate the chars in front of and behind a text for titles and separators
function generate_dynamic_line() {
debug_print
local type=${2}
if [ "${type}" = "title" ]; then
if [[ "${FUNCNAME[2]}" = "main_menu" ]] || [[ "${FUNCNAME[2]}" = "main_menu_override" ]]; then
ncharstitle=91
else
ncharstitle=78
fi
titlechar="*"
elif [ "${type}" = "separator" ]; then
ncharstitle=58
titlechar="-"
fi
titletext=${1}
titlelength=${#titletext}
finaltitle=""
for ((i=0; i < (ncharstitle/2 - titlelength+(titlelength/2)); i++)); do
finaltitle="${finaltitle}${titlechar}"
done
if [ "${type}" = "title" ]; then
finaltitle="${finaltitle} ${titletext} "
elif [ "${type}" = "separator" ]; then
finaltitle="${finaltitle} (${titletext}) "
fi
for ((i=0; i < (ncharstitle/2 - titlelength+(titlelength/2)); i++)); do
finaltitle="${finaltitle}${titlechar}"
done
if [ $((titlelength % 2)) -gt 0 ]; then
finaltitle+="${titlechar}"
fi
if [ "${type}" = "title" ]; then
echo_green_title "${finaltitle}"
elif [ "${type}" = "separator" ]; then
echo_blue "${finaltitle}"
fi
}
#Wrapper to check managed mode on an interface
function check_to_set_managed() {
debug_print
check_interface_mode "${1}"
case "${ifacemode}" in
"Managed")
echo
language_strings "${language}" 0 "red"
language_strings "${language}" 115 "read"
return 1
;;
"(Non wifi adapter)")
echo
language_strings "${language}" 1 "red"
language_strings "${language}" 115 "read"
return 1
;;
esac
return 0
}
#Wrapper to check monitor mode on an interface
function check_to_set_monitor() {
debug_print
check_interface_mode "${1}"
case "${ifacemode}" in
"Monitor")
echo
language_strings "${language}" 10 "red"
language_strings "${language}" 115 "read"
return 1
;;
"(Non wifi adapter)")
echo
language_strings "${language}" 13 "red"
language_strings "${language}" 115 "read"
return 1
;;
esac
return 0
}
#Check for monitor mode on an interface
function check_monitor_enabled() {
debug_print
mode=$(iw "${1}" info 2> /dev/null | grep type | awk '{print $2}')
current_iface_on_messages="${1}"
if [[ ${mode^} != "Monitor" ]]; then
return 1
fi
return 0
}
#Check if an interface is a Wi-Fi adapter or not
function check_interface_wifi() {
debug_print
iw "${1}" info > /dev/null 2>&1
return $?
}
#Create a list of interfaces associated to their MAC addresses
function renew_ifaces_and_macs_list() {
debug_print
readarray -t IFACES_AND_MACS < <(ip link | grep -E "^[0-9]+" | cut -d ':' -f 2 | awk '{print $1}' | grep -E "^lo$" -v | grep "${interface}" -v)
declare -gA ifaces_and_macs
for iface_name in "${IFACES_AND_MACS[@]}"; do
if [ -f "/sys/class/net/${iface_name}/address" ]; then
mac_item=$(cat "/sys/class/net/${iface_name}/address" 2> /dev/null)
if [ -n "${mac_item}" ]; then
ifaces_and_macs[${iface_name}]=${mac_item}
fi
fi
done
declare -gA ifaces_and_macs_switched
for iface_name in "${!ifaces_and_macs[@]}"; do
ifaces_and_macs_switched[${ifaces_and_macs[${iface_name}]}]=${iface_name}
done
}
#Check the interface coherence between interface names and MAC addresses
function check_interface_coherence() {
debug_print
renew_ifaces_and_macs_list
interface_auto_change=0
interface_found=0
for iface_name in "${!ifaces_and_macs[@]}"; do
if [ "${interface}" = "${iface_name}" ]; then
interface_found=1
interface_mac=${ifaces_and_macs[${iface_name}]}
break
fi
done
if [ "${interface_found}" -eq 0 ]; then
if [ -n "${interface_mac}" ]; then
for iface_mac in "${ifaces_and_macs[@]}"; do
iface_mac_tmp=${iface_mac:0:15}
interface_mac_tmp=${interface_mac:0:15}
if [ "${iface_mac_tmp}" = "${interface_mac_tmp}" ]; then
interface=${ifaces_and_macs_switched[${iface_mac}]}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
interface_auto_change=1
break
fi
done
fi
fi
return ${interface_auto_change}
}
#Check if an adapter is compatible to airmon
function check_airmon_compatibility() {
debug_print
if [ "${1}" = "interface" ]; then
set_chipset "${interface}" "read_only"
if iw phy "${phy_interface}" info 2> /dev/null | grep -iq 'interface combinations are not supported'; then
interface_airmon_compatible=0
else
interface_airmon_compatible=1
fi
else
set_chipset "${secondary_wifi_interface}" "read_only"
if ! iw dev "${secondary_wifi_interface}" set bitrates legacy-2.4 1 > /dev/null 2>&1; then
secondary_interface_airmon_compatible=0
else
secondary_interface_airmon_compatible=1
fi
fi
}
#Add contributing footer to a file
function add_contributing_footer_to_file() {
debug_print
{
echo ""
echo "---------------"
echo ""
echo "${footer_texts[${language},0]}"
} >> "${1}"
}
#Prepare the vars to be used on wps pin database attacks
function set_wps_mac_parameters() {
debug_print
six_wpsbssid_first_digits=${wps_bssid:0:8}
six_wpsbssid_first_digits_clean=${six_wpsbssid_first_digits//:}
six_wpsbssid_last_digits=${wps_bssid: -8}
six_wpsbssid_last_digits_clean=${six_wpsbssid_last_digits//:}
four_wpsbssid_last_digits=${wps_bssid: -5}
four_wpsbssid_last_digits_clean=${four_wpsbssid_last_digits//:}
}
#Check if wash has JSON option
function check_json_option_on_wash() {
debug_print
wash -h 2>&1 | grep "\-j" > /dev/null
return $?
}
#Check if wash has dual scan option
function check_dual_scan_on_wash() {
debug_print
wash -h 2>&1 | grep "2ghz" > /dev/null
return $?
}
#Perform wash scan using -j (json) option to gather needed data
function wash_json_scan() {
debug_print
rm -rf "${tmpdir}wps_json_data.txt" > /dev/null 2>&1
rm -rf "${tmpdir}wps_fifo" > /dev/null 2>&1
mkfifo "${tmpdir}wps_fifo"
wash_band_modifier=""
if [ "${wps_channel}" -gt 14 ]; then
if [ "${interfaces_band_info['main_wifi_interface','5Ghz_allowed']}" -eq 0 ]; then
echo
language_strings "${language}" 515 "red"
language_strings "${language}" 115 "read"
return 1
else
wash_band_modifier="-5"
fi
fi
timeout -s SIGTERM 240 wash -i "${interface}" --scan -n 100 -j "${wash_band_modifier}" 2> /dev/null > "${tmpdir}wps_fifo" &
wash_json_pid=$!
tee "${tmpdir}wps_json_data.txt"< <(cat < "${tmpdir}wps_fifo") > /dev/null 2>&1 &
while true; do
sleep 5
wash_json_capture_alive=$(ps uax | awk '{print $2}' | grep -E "^${wash_json_pid}$" 2> /dev/null)
if [ -z "${wash_json_capture_alive}" ]; then
break
fi
if grep "${1}" "${tmpdir}wps_json_data.txt" > /dev/null; then
serial=$(grep "${1}" "${tmpdir}wps_json_data.txt" | awk -F '"wps_serial" : "' '{print $2}' | awk -F '"' '{print $1}' | sed 's/.*\(....\)/\1/' 2> /dev/null)
kill "${wash_json_capture_alive}" &> /dev/null
wait "${wash_json_capture_alive}" 2> /dev/null
break
fi
done
return 0
}
#Calculate pin based on Zhao Chunsheng algorithm (ComputePIN), step 1
function calculate_computepin_algorithm_step1() {
debug_print
hex_to_dec=$(printf '%d\n' 0x"${six_wpsbssid_last_digits_clean}") 2> /dev/null
computepin_pin=$((hex_to_dec % 10000000))
}
#Calculate pin based on Zhao Chunsheng algorithm (ComputePIN), step 2
function calculate_computepin_algorithm_step2() {
debug_print
computepin_pin=$(printf '%08d\n' $((10#${computepin_pin} * 10 + checksum_digit)))
}
#Calculate pin based on Stefan Viehböck algorithm (EasyBox)
#shellcheck disable=SC2207
function calculate_easybox_algorithm() {
debug_print
hex_to_dec=($(printf "%04d" "0x${four_wpsbssid_last_digits_clean}" | sed 's/.*\(....\)/\1/;s/./& /g'))
[[ ${four_wpsbssid_last_digits_clean} =~ ${four_wpsbssid_last_digits_clean//?/(.)} ]] && hexi=($(printf '%s\n' "${BASH_REMATCH[*]:1}"))
c1=$(printf "%d + %d + %d + %d" "${hex_to_dec[0]}" "${hex_to_dec[1]}" "0x${hexi[2]}" "0x${hexi[3]}")
c2=$(printf "%d + %d + %d + %d" "0x${hexi[0]}" "0x${hexi[1]}" "${hex_to_dec[2]}" "${hex_to_dec[3]}")
K1=$((c1 % 16))
K2=$((c2 % 16))
X1=$((K1 ^ hex_to_dec[3]))
X2=$((K1 ^ hex_to_dec[2]))
X3=$((K1 ^ hex_to_dec[1]))
Y1=$((K2 ^ 0x${hexi[1]}))
Y2=$((K2 ^ 0x${hexi[2]}))
Z1=$((0x${hexi[2]} ^ hex_to_dec[3]))
Z2=$((0x${hexi[3]} ^ hex_to_dec[2]))
easybox_pin=$(printf '%08d\n' "$((0x$X1$X2$Y1$Y2$Z1$Z2$X3))" | awk '{for(i=length; i!=0; i--) x=x substr($0, i, 1);} END {print x}' | cut -c -7 | awk '{for(i=length; i!=0; i--) x=x substr($0, i, 1);} END {print x}')
}
#Calculate pin based on Arcadyan algorithm
function calculate_arcadyan_algorithm() {
debug_print
local wan=""
if [ "${four_wpsbssid_last_digits_clean}" = "0000" ]; then
wan="fffe"
elif [ "${four_wpsbssid_last_digits_clean}" = "0001" ]; then
wan="ffff"
else
wan=$(printf "%04x" $((0x${four_wpsbssid_last_digits_clean} - 2)))
fi
K1=$(printf "%X\n" $(($((0x${serial:0:1} + 0x${serial:1:1} + 0x${wan:2:1} + 0x${wan:3:1})) % 16)))
K2=$(printf "%X\n" $(($((0x${serial:2:1} + 0x${serial:3:1} + 0x${wan:0:1} + 0x${wan:1:1})) % 16)))
D1=$(printf "%X\n" $((0x$K1 ^ 0x${serial:3:1})))
D2=$(printf "%X\n" $((0x$K1 ^ 0x${serial:2:1})))
D3=$(printf "%X\n" $((0x$K2 ^ 0x${wan:1:1})))
D4=$(printf "%X\n" $((0x$K2 ^ 0x${wan:2:1})))
D5=$(printf "%X\n" $((0x${serial:3:1} ^ 0x${wan:2:1})))
D6=$(printf "%X\n" $((0x${serial:2:1} ^ 0x${wan:3:1})))
D7=$(printf "%X\n" $((0x$K1 ^ 0x${serial:1:1})))
arcadyan_pin=$(printf '%07d\n' $(($(printf '%d\n' "0x$D1$D2$D3$D4$D5$D6$D7") % 10000000)))
}
#Calculate the last digit on pin following the checksum rule
function pin_checksum_rule() {
debug_print
current_calculated_pin=$((10#${1} * 10))
accum=0
accum=$((accum + 3 * (current_calculated_pin/10000000 % 10)))
accum=$((accum + current_calculated_pin/1000000 % 10))
accum=$((accum + 3 * (current_calculated_pin/100000 % 10)))
accum=$((accum + current_calculated_pin/10000 % 10))
accum=$((accum + 3 * (current_calculated_pin/1000 % 10)))
accum=$((accum + current_calculated_pin/100 % 10))
accum=$((accum + 3 * (current_calculated_pin/10 % 10)))
control_digit=$((accum % 10))
checksum_digit=$((10 - control_digit))
checksum_digit=$((checksum_digit % 10))
}
#Manage the calls to check common wps pin algorithms
function check_and_set_common_algorithms() {
debug_print
echo
language_strings "${language}" 388 "blue"
declare -g calculated_pins=("${wps_default_generic_pin}")
if ! check_if_type_exists_in_wps_data_array "${wps_bssid}" "ComputePIN"; then
calculate_computepin_algorithm_step1
pin_checksum_rule "${computepin_pin}"
calculate_computepin_algorithm_step2
calculated_pins+=("${computepin_pin}")
fill_wps_data_array "${wps_bssid}" "ComputePIN" "${computepin_pin}"
else
calculated_pins+=("${wps_data_array["${wps_bssid}",'ComputePIN']}")
fi
if ! check_if_type_exists_in_wps_data_array "${wps_bssid}" "EasyBox"; then
calculate_easybox_algorithm
pin_checksum_rule "${easybox_pin}"
easybox_pin=$(printf '%08d\n' $((current_calculated_pin + checksum_digit)))
calculated_pins+=("${easybox_pin}")
fill_wps_data_array "${wps_bssid}" "EasyBox" "${easybox_pin}"
else
calculated_pins+=("${wps_data_array["${wps_bssid}",'EasyBox']}")
fi
if ! check_if_type_exists_in_wps_data_array "${wps_bssid}" "Arcadyan"; then
able_to_check_json_option_on_wash=0
if [ "${wps_attack}" = "pindb_bully" ]; then
if hash wash 2> /dev/null; then
able_to_check_json_option_on_wash=1
else
echo
language_strings "${language}" 492 "yellow"
echo
fi
elif [ "${wps_attack}" = "pindb_reaver" ]; then
able_to_check_json_option_on_wash=1
fi
if [ "${able_to_check_json_option_on_wash}" -eq 1 ]; then
if check_json_option_on_wash; then
ask_yesno 485 "no"
if [ "${yesno}" = "y" ]; then
echo
language_strings "${language}" 489 "blue"
serial=""
if wash_json_scan "${wps_bssid}"; then
if [ -n "${serial}" ]; then
if [[ "${serial}" =~ ^[0-9]{4}$ ]]; then
calculate_arcadyan_algorithm
pin_checksum_rule "${arcadyan_pin}"
arcadyan_pin="${arcadyan_pin}${checksum_digit}"
calculated_pins=("${arcadyan_pin}" "${calculated_pins[@]}")
fill_wps_data_array "${wps_bssid}" "Arcadyan" "${arcadyan_pin}"
echo
language_strings "${language}" 487 "yellow"
else
echo
language_strings "${language}" 491 "yellow"
fi
echo
else
echo
language_strings "${language}" 488 "yellow"
echo
fi
fi
fi
else
echo
language_strings "${language}" 486 "yellow"
fi
fi
else
echo
calculated_pins=("${wps_data_array["${wps_bssid}",'Arcadyan']}" "${calculated_pins[@]}")
language_strings "${language}" 493 "yellow"
echo
fi
if integrate_algorithms_pins; then
language_strings "${language}" 389 "yellow"
fi
}
#Integrate calculated pins from algorithms into pins array
function integrate_algorithms_pins() {
debug_print
some_calculated_pin_included=0
for ((idx=${#calculated_pins[@]}-1; idx>=0; idx--)) ; do
this_pin_already_included=0
for item in "${pins_found[@]}"; do
if [ "${item}" = "${calculated_pins[idx]}" ]; then
this_pin_already_included=1
break
fi
done
if [ "${this_pin_already_included}" -eq 0 ]; then
pins_found=("${calculated_pins[idx]}" "${pins_found[@]}")
counter_pins_found=$((counter_pins_found + 1))
some_calculated_pin_included=1
fi
done
if [ "${some_calculated_pin_included}" -eq 1 ]; then
return 0
fi
return 1
}
#Search for target wps bssid MAC address in pin database and set the vars to be used
#shellcheck disable=SC2128
function search_in_pin_database() {
debug_print
bssid_found_in_db=0
counter_pins_found=0
declare -g pins_found=()
for item in "${!PINDB[@]}"; do
if [ "${item}" = "${six_wpsbssid_first_digits_clean}" ]; then
bssid_found_in_db=1
arrpins=("${PINDB[${item//[[:space:]]/ }]}")
pins_found+=("${arrpins[0]}")
counter_pins_found=$(echo "${pins_found[@]}" | wc -w)
fill_wps_data_array "${wps_bssid}" "Database" "${pins_found}"
fi
done
}
#Handler for multiple busy port checkings
function check_busy_ports() {
debug_print
IFS=' ' read -r -a tcp_ports <<< "${ports_needed["tcp"]}"
IFS=' ' read -r -a udp_ports <<< "${ports_needed["udp"]}"
if [[ -n "${tcp_ports[*]}" ]] && [[ "${#tcp_ports[@]}" -ge 1 ]]; then
port_type="tcp"
for tcp_port in "${tcp_ports[@]}"; do
if ! check_tcp_udp_port "${tcp_port}" "${port_type}" "${interface}"; then
busy_port="${tcp_port}"
find_process_name_by_port "${tcp_port}" "${port_type}"
echo
language_strings "${language}" 698 "red"
language_strings "${language}" 115 "read"
return 1
fi
done
fi
if [[ -n "${udp_ports[*]}" ]] && [[ "${#udp_ports[@]}" -ge 1 ]]; then
port_type="udp"
for udp_port in "${udp_ports[@]}"; do
if ! check_tcp_udp_port "${udp_port}" "${port_type}" "${interface}"; then
busy_port="${udp_port}"
find_process_name_by_port "${udp_port}" "${port_type}"
echo
language_strings "${language}" 698 "red"
language_strings "${language}" 115 "read"
return 1
fi
done
fi
return 0
}
#Validate if a given tcp/udp port is busy on the given interface
#shellcheck disable=SC2207
function check_tcp_udp_port() {
debug_print
local port
local port_type
port=$(printf "%04x" "${1}")
port_type="${2}"
local network_interface
local ip_address
local hex_ip_address
network_interface="${3}"
ip_address=$(ip -4 -o addr show "${network_interface}" 2> /dev/null | awk '{print $4}' | cut -d "/" -f 1)
if [ -n "${ip_address}" ]; then
hex_ip_address=$(ip_dec_to_hex "${ip_address}")
else
hex_ip_address=""
fi
declare -a busy_ports=($(awk -v iplist="${hex_ip_address},00000000" 'BEGIN {split(iplist,a,","); for (i in a) ips[a[i]]} /local_address/ {next} {split($2,a,":"); if (a[1] in ips) ports[a[2] $4]} END {for (port in ports) print port}' "/proc/net/${port_type}" "/proc/net/${port_type}6"))
for hexport in "${busy_ports[@]}"; do
if [[ "${port_type}" == "tcp" || "${port_type}" == "tcp6" ]]; then
if [ "${hexport}" = "${port}0A" ]; then
return 1
fi
else
if [[ "${hexport}" = "${port}07" ]] && [[ "${port}" != "0043" ]]; then
return 1
fi
fi
done
return 0
}
#Find process name from a given port
function find_process_name_by_port() {
debug_print
local port
port="${1}"
local port_type
port_type="${2}"
local regexp_part1
local regexp_part2
regexp_part1="${port_type}\h.*?[0-9A-Za-z%\*]:${port}"
regexp_part2='\h.*?\busers:\(\("\K[^"]+(?=")'
local regexp
regexp="${regexp_part1}${regexp_part2}"
if hash ss 2> /dev/null; then
blocking_process_name=$(ss -tupln | grep -oP "${regexp}")
else
blocking_process_name="${unknown_chipsetvar,,}"
fi
}
#Convert an IP address from decimal to hexdecimal returning its value
ip_dec_to_hex() {
debug_print
IFS='.' read -r -a octets <<< "${1}"
local hex
hex=""
for octet in "${octets[@]}"; do
hex="$(printf "%02X%s" "${octet}" "${hex}")"
done
echo "${hex}"
}
#Validate if a wireless adapter is supporting VIF (Virtual Interface Functionality)
function check_vif_support() {
debug_print
if iw "${phy_interface}" info | grep "Supported interface modes" -A 8 | grep "AP/VLAN" > /dev/null 2>&1; then
return 0
else
return 1
fi
}
#Returns warning messages if long Wi-Fi names detected
function check_interface_wifi_longname() {
debug_print
wifi_adapter="${1}"
longname_patterns=("wlx[0-9a-fA-F]{12}")
for pattern in "${longname_patterns[@]}"; do
if [[ ${wifi_adapter} =~ $pattern ]]; then
echo
language_strings "${language}" 708 "yellow"
echo
language_strings "${language}" 709 "yellow"
language_strings "${language}" 115 "read"
return 1
fi
done
return 0
}
#Find the physical interface for an adapter
function physical_interface_finder() {
debug_print
local phy_iface
phy_iface=$(basename "$(readlink "/sys/class/net/${1}/phy80211")" 2> /dev/null)
echo "${phy_iface}"
}
#Check the wireless stamdards supported by a given physical adapter
function check_supported_standards() {
debug_print
if iw phy "${1}" info | grep -Eq 'HT20/HT40' 2> /dev/null; then
standard_80211n=1
else
standard_80211n=0
fi
if iw phy "${1}" info | grep -Eq 'VHT' 2> /dev/null; then
standard_80211ac=1
else
standard_80211ac=0
fi
if iw phy "${1}" info | grep -Eq 'HE40/HE80' 2> /dev/null; then
standard_80211ax=1
else
standard_80211ax=0
fi
if iw phy "${1}" info | grep -Eq 'EHT bw=20 MHz' 2> /dev/null; then
standard_80211be=1
else
standard_80211be=0
fi
}
#Check the bands supported by a given physical adapter
function check_interface_supported_bands() {
debug_print
get_5ghz_band_info_from_phy_interface "${1}"
case "$?" in
"0")
interfaces_band_info["${2},5Ghz_allowed"]=1
interfaces_band_info["${2},text"]="${band_24ghz}, ${band_5ghz}"
;;
"1")
interfaces_band_info["${2},5Ghz_allowed"]=0
interfaces_band_info["${2},text"]="${band_24ghz}"
;;
"2")
interfaces_band_info["${2},5Ghz_allowed"]=0
interfaces_band_info["${2},text"]="${band_24ghz}, ${band_5ghz} (${red_color}${disabled_text[${language}]}${pink_color})"
;;
esac
}
#Check 5Ghz band info from a given physical interface
function get_5ghz_band_info_from_phy_interface() {
debug_print
if iw phy "${1}" channels 2> /dev/null | grep -Ei "5180(\.0)? MHz" > /dev/null; then
if "${AIRGEDDON_5GHZ_ENABLED:-true}"; then
return 0
else
return 2
fi
fi
return 1
}
#Detect country code and if region is set
function region_check() {
debug_print
country_code="$(iw reg get | awk 'FNR == 2 {print $2}' | cut -f 1 -d ":" 2> /dev/null)"
[[ ! ${country_code} =~ ^[A-Z]{2}$|^99$ ]] && country_code="00"
}
#Prepare monitor mode avoiding the use of airmon-ng or airmon-zc generating two interfaces from one for WPA3 downgrade attack
function prepare_wpa3_downgrade_monitor() {
debug_print
disable_rfkill
iface_phy_number=${phy_interface:3:1}
iface_monitor_downgrade_deauth="mon${iface_phy_number}"
iw dev "${interface}" set channel "${channel}" > /dev/null 2>&1
iw phy "${phy_interface}" interface add "${iface_monitor_downgrade_deauth}" type monitor 2> /dev/null
ip link set "${iface_monitor_downgrade_deauth}" up > /dev/null 2>&1
}
#Prepare monitor mode avoiding the use of airmon-ng or airmon-zc generating two interfaces from one for Evil Twin attacks
function prepare_et_monitor() {
debug_print
disable_rfkill
iface_phy_number=${phy_interface:3:1}
iface_monitor_et_deauth="mon${iface_phy_number}"
iw dev "${interface}" set channel "${channel}" > /dev/null 2>&1
iw phy "${phy_interface}" interface add "${iface_monitor_et_deauth}" type monitor 2> /dev/null
ip link set "${iface_monitor_et_deauth}" up > /dev/null 2>&1
}
#Assure the mode of the interface before the Evil Twin or Enterprise process
function prepare_et_interface() {
debug_print
et_initial_state=${ifacemode}
if [ "${ifacemode}" != "Managed" ]; then
check_airmon_compatibility "interface"
if [ "${interface_airmon_compatible}" -eq 1 ]; then
new_interface=$(${airmon} stop "${interface}" 2> /dev/null | grep station | head -n 1)
ifacemode="Managed"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
if check_interface_coherence; then
interface=${new_interface}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
current_iface_on_messages="${interface}"
fi
echo
language_strings "${language}" 15 "yellow"
fi
else
if ! set_mode_without_airmon "${interface}" "managed"; then
echo
language_strings "${language}" 1 "red"
language_strings "${language}" 115 "read"
return 1
else
ifacemode="Managed"
fi
fi
fi
}
#Restore the state of the interfaces after Evil Twin or Enterprise attack process
function restore_et_interface() {
debug_print
echo
language_strings "${language}" 299 "blue"
disable_rfkill
mac_spoofing_desired=0
iw dev "${iface_monitor_et_deauth}" del > /dev/null 2>&1
ip addr del "${et_ip_router}/${std_c_mask}" dev "${interface}" > /dev/null 2>&1
ip route del "${et_ip_range}/${std_c_mask_cidr}" dev "${interface}" table local proto static scope link > /dev/null 2>&1
if [ "${et_initial_state}" = "Managed" ]; then
set_mode_without_airmon "${interface}" "managed"
ifacemode="Managed"
else
if [ "${interface_airmon_compatible}" -eq 1 ]; then
new_interface=$(${airmon} start "${interface}" 2> /dev/null | grep monitor)
desired_interface_name=""
[[ ${new_interface} =~ ^You[[:space:]]already[[:space:]]have[[:space:]]a[[:space:]]([A-Za-z0-9]+)[[:space:]]device ]] && desired_interface_name="${BASH_REMATCH[1]}"
if [ -n "${desired_interface_name}" ]; then
echo
language_strings "${language}" 435 "red"
language_strings "${language}" 115 "read"
return
fi
ifacemode="Monitor"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
interface=${new_interface}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
current_iface_on_messages="${interface}"
fi
else
if set_mode_without_airmon "${interface}" "monitor"; then
ifacemode="Monitor"
fi
fi
fi
control_routing_status "end"
}
#Assure the mode of the interface before the WPA3 downgrade attack process
function prepare_wpa3_downgrade_interface() {
debug_print
downgrade_initial_state=${ifacemode}
if [ "${ifacemode}" != "Managed" ]; then
check_airmon_compatibility "interface"
if [ "${interface_airmon_compatible}" -eq 1 ]; then
new_interface=$(${airmon} stop "${interface}" 2> /dev/null | grep station | head -n 1)
ifacemode="Managed"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
if check_interface_coherence; then
interface=${new_interface}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
current_iface_on_messages="${interface}"
fi
echo
language_strings "${language}" 15 "yellow"
fi
else
if ! set_mode_without_airmon "${interface}" "managed"; then
echo
language_strings "${language}" 1 "red"
language_strings "${language}" 115 "read"
return 1
else
ifacemode="Managed"
fi
fi
fi
}
#Restore the state of the interfaces after WAP3 downgrade attack process
function restore_wpa3_downgrade_interface() {
debug_print
echo
language_strings "${language}" 299 "blue"
disable_rfkill
mac_spoofing_desired=0
iw dev "${iface_monitor_downgrade_deauth}" del > /dev/null 2>&1
if [ "${downgrade_initial_state}" = "Managed" ]; then
set_mode_without_airmon "${interface}" "managed"
ifacemode="Managed"
else
if [ "${interface_airmon_compatible}" -eq 1 ]; then
new_interface=$(${airmon} start "${interface}" 2> /dev/null | grep monitor)
desired_interface_name=""
[[ ${new_interface} =~ ^You[[:space:]]already[[:space:]]have[[:space:]]a[[:space:]]([A-Za-z0-9]+)[[:space:]]device ]] && desired_interface_name="${BASH_REMATCH[1]}"
if [ -n "${desired_interface_name}" ]; then
echo
language_strings "${language}" 435 "red"
language_strings "${language}" 115 "read"
return
fi
ifacemode="Monitor"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
interface=${new_interface}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
current_iface_on_messages="${interface}"
fi
else
if set_mode_without_airmon "${interface}" "monitor"; then
ifacemode="Monitor"
fi
fi
fi
}
#Unblock if possible the interface if blocked
function disable_rfkill() {
debug_print
if hash rfkill 2> /dev/null; then
rfkill unblock all > /dev/null 2>&1
fi
}
#Set the interface on managed mode and manage the possible name change
function managed_option() {
debug_print
if ! check_to_set_managed "${1}"; then
return 1
fi
disable_rfkill
language_strings "${language}" 17 "blue"
ip link set "${1}" up > /dev/null 2>&1
if [ "${1}" = "${interface}" ]; then
if [ "${interface_airmon_compatible}" -eq 0 ]; then
if ! set_mode_without_airmon "${1}" "managed"; then
echo
language_strings "${language}" 1 "red"
language_strings "${language}" 115 "read"
return 1
else
ifacemode="Managed"
fi
else
new_interface=$(${airmon} stop "${1}" 2> /dev/null | grep station | head -n 1)
ifacemode="Managed"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
if check_interface_coherence; then
interface=${new_interface}
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
else
interface="${new_interface}"
fi
current_iface_on_messages="${interface}"
echo
language_strings "${language}" 15 "yellow"
fi
fi
else
if [ "${secondary_interface_airmon_compatible}" -eq 0 ]; then
if ! set_mode_without_airmon "${1}" "managed"; then
echo
language_strings "${language}" 1 "red"
language_strings "${language}" 115 "read"
return 1
fi
else
new_secondary_interface=$(${airmon} stop "${1}" 2> /dev/null | grep station | head -n 1)
[[ ${new_secondary_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_secondary_interface="${BASH_REMATCH[1]}"
if [ "${1}" != "${new_secondary_interface}" ]; then
secondary_wifi_interface=${new_secondary_interface}
current_iface_on_messages="${secondary_wifi_interface}"
echo
language_strings "${language}" 15 "yellow"
fi
fi
fi
echo
language_strings "${language}" 16 "yellow"
language_strings "${language}" 115 "read"
return 0
}
#Set the interface on monitor mode and manage the possible name change
function monitor_option() {
debug_print
if ! check_to_set_monitor "${1}"; then
return 1
fi
disable_rfkill
language_strings "${language}" 18 "blue"
ip link set "${1}" up > /dev/null 2>&1
if [ "${1}" = "${interface}" ]; then
check_airmon_compatibility "interface"
if [ "${interface_airmon_compatible}" -eq 0 ]; then
if ! set_mode_without_airmon "${1}" "monitor"; then
echo
language_strings "${language}" 20 "red"
language_strings "${language}" 115 "read"
return 1
else
ifacemode="Monitor"
fi
else
if [ "${check_kill_needed}" -eq 1 ]; then
language_strings "${language}" 19 "blue"
${airmon} check kill > /dev/null 2>&1
nm_processes_killed=1
fi
desired_interface_name=""
new_interface=$(${airmon} start "${1}" 2> /dev/null | grep monitor)
[[ ${new_interface} =~ ^You[[:space:]]already[[:space:]]have[[:space:]]a[[:space:]]([A-Za-z0-9]+)[[:space:]]device ]] && desired_interface_name="${BASH_REMATCH[1]}"
if [ -n "${desired_interface_name}" ]; then
echo
language_strings "${language}" 435 "red"
language_strings "${language}" 115 "read"
return 1
fi
ifacemode="Monitor"
[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}"
if [ "${interface}" != "${new_interface}" ]; then
if check_interface_coherence; then
interface="${new_interface}"
phy_interface=$(physical_interface_finder "${interface}")
check_interface_supported_bands "${phy_interface}" "main_wifi_interface"
else
interface="${new_interface}"
fi
current_iface_on_messages="${interface}"
echo
language_strings "${language}" 21 "yellow"
fi
fi
else
check_airmon_compatibility "secondary_interface"
if [ "${secondary_interface_airmon_compatible}" -eq 0 ]; then
if ! set_mode_without_airmon "${1}" "monitor"; then
echo
language_strings "${language}" 20 "red"
language_strings "${language}" 115 "read"
return 1
fi
else
if [ "${check_kill_needed}" -eq 1 ]; then
language_strings "${language}" 19 "blue"
${airmon} check kill > /dev/null 2>&1
nm_processes_killed=1
fi
secondary_interface_airmon_compatible=1
new_secondary_interface=$(${airmon} start "${1}" 2> /dev/null | grep monitor)
[[ ${new_secondary_interface} =~ ^You[[:space:]]already[[:space:]]have[[:space:]]a[[:space:]]([A-Za-z0-9]+)[[:space:]]device ]] && desired_interface_name="${BASH_REMATCH[1]}"
if [ -n "${desired_interface_name}" ]; then
echo
language_strings "${language}" 435 "red"
language_strings "${language}" 115 "read"
return 1
fi
[[ ${new_secondary_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_secondary_interface="${BASH_REMATCH[1]}"
if [ "${1}" != "${new_secondary_interface}" ]; then
secondary_wifi_interface="${new_secondary_interface}"
current_iface_on_messages="${secondary_wifi_interface}"
echo
language_strings "${language}" 21 "yellow"
fi
fi
fi
echo
language_strings "${language}" 22 "yellow"
language_strings "${language}" 115 "read"
return 0
}
#Set the interface on monitor/managed mode without airmon
function set_mode_without_airmon() {
debug_print
local error
local mode
ip link set "${1}" down > /dev/null 2>&1
if [ "${2}" = "monitor" ]; then
mode="monitor"
iw "${1}" set monitor control > /dev/null 2>&1
else
mode="managed"
iw "${1}" set type managed > /dev/null 2>&1
fi
error=$?
ip link set "${1}" up > /dev/null 2>&1
if [ "${error}" != 0 ]; then
return 1
fi
return 0
}
#Check the interface mode
function check_interface_mode() {
debug_print
current_iface_on_messages="${1}"
if ! check_interface_wifi "${1}"; then
ifacemode="(Non wifi adapter)"
return 0
fi
modemanaged=$(iw "${1}" info 2> /dev/null | grep type | awk '{print $2}')
if [[ ${modemanaged^} = "Managed" ]]; then
ifacemode="Managed"
return 0
fi
modemonitor=$(iw "${1}" info 2> /dev/null | grep type | awk '{print $2}')
if [[ ${modemonitor^} = "Monitor" ]]; then
ifacemode="Monitor"
return 0
fi
language_strings "${language}" 23 "red"
language_strings "${language}" 115 "read"
exit_code=1
exit_script_option
}
#WPA3 attacks menu
function hookable_wpa3_attacks_menu() {
debug_print
clear
language_strings "${language}" 755 "title"
current_menu="wpa3_attacks_menu"
initialize_menu_and_print_selections
echo
language_strings "${language}" 47 "green"
print_simple_separator
language_strings "${language}" 59
language_strings "${language}" 48
language_strings "${language}" 55
language_strings "${language}" 56
language_strings "${language}" 49
language_strings "${language}" 50 "separator"
language_strings "${language}" 774 wpa3_downgrade_attack_dependencies[@]
language_strings "${language}" 756 "${plugin_x_under_construction}"
language_strings "${language}" 757 "${plugin_y_under_construction}"
language_strings "${language}" 812 "${plugin_z_under_construction}"
print_hint
read -rp "> " wpa3_option
case ${wpa3_option} in
0)
return
;;
1)
select_interface
;;
2)
monitor_option "${interface}"
;;
3)
managed_option "${interface}"
;;
4)
explore_for_targets_option "WPA3"
;;
5)
if contains_element "${wpa3_option}" "${forbidden_options[@]}"; then
forbidden_menu_option
else
current_iface_on_messages="${interface}"
if check_interface_wifi "${interface}"; then
if [ "${adapter_vif_support}" -eq 0 ]; then
ask_yesno 696 "no"
if [ "${yesno}" = "y" ]; then
downgrade_attack_adapter_prerequisites_ok=1
fi
else
downgrade_attack_adapter_prerequisites_ok=1
fi
if [ "${downgrade_attack_adapter_prerequisites_ok}" -eq 1 ]; then
if explore_for_targets_option "WPA3"; then
if validate_wpa3_network "only_mixed" "${tmpdir}nws-01.cap"; then
if validate_network_type "personal"; then
wpa3_dos_menu
fi
fi
fi
fi
else
echo
language_strings "${language}" 281 "red"
language_strings "${language}" 115 "read"
fi
fi
;;
6)
"${plugin_x}"
;;
7)
"${plugin_y}"
;;
8)
"${plugin_z}"
;;
*)
invalid_menu_option
;;
esac
hookable_wpa3_attacks_menu
}
#Option menu
function option_menu() {
debug_print
clear
language_strings "${language}" 443 "title"
current_menu="option_menu"
initialize_menu_and_print_selections
echo
language_strings "${language}" 47 "green"
print_simple_separator
language_strings "${language}" 59
print_simple_separator
language_strings "${language}" 78
print_simple_separator
if "${AIRGEDDON_AUTO_UPDATE:-true}"; then
language_strings "${language}" 455
else
language_strings "${language}" 449
fi
if "${AIRGEDDON_SKIP_INTRO:-true}"; then
language_strings "${language}" 565
else
language_strings "${language}" 566
fi
if "${AIRGEDDON_BASIC_COLORS:-true}"; then
language_strings "${language}" 557
else
language_strings "${language}" 556
fi
if "${AIRGEDDON_EXTENDED_COLORS:-true}"; then
language_strings "${language}" 456
else
language_strings "${language}" 450
fi
if "${AIRGEDDON_AUTO_CHANGE_LANGUAGE:-true}"; then
language_strings "${language}" 468
else
language_strings "${language}" 467
fi
if "${AIRGEDDON_SILENT_CHECKS:-true}"; then
language_strings "${language}" 573
else
language_strings "${language}" 574
fi
if "${AIRGEDDON_PRINT_HINTS:-true}"; then
language_strings "${language}" 584
else
language_strings "${language}" 585
fi
if "${AIRGEDDON_5GHZ_ENABLED:-true}"; then
language_strings "${language}" 592
else
language_strings "${language}" 593
fi
if [ "${AIRGEDDON_WINDOWS_HANDLING}" = "xterm" ]; then
language_strings "${language}" 616
else
language_strings "${language}" 617
fi
if [ "${AIRGEDDON_MDK_VERSION}" = "mdk3" ]; then
language_strings "${language}" 638
else
language_strings "${language}" 637
fi
if "${AIRGEDDON_PLUGINS_ENABLED:-true}"; then
language_strings "${language}" 651
else
language_strings "${language}" 652
fi
if "${AIRGEDDON_FORCE_NETWORK_MANAGER_KILLING:-true}"; then
language_strings "${language}" 688
else
language_strings "${language}" 689
fi
if "${AIRGEDDON_EVIL_TWIN_ESSID_STRIPPING:-true}"; then
language_strings "${language}" 765
else
language_strings "${language}" 766
fi
if "${AIRGEDDON_EVIL_TWIN_SOUNDS:-true}"; then
language_strings "${language}" 804
else
language_strings "${language}" 805
fi
language_strings "${language}" 447
print_hint
read -rp "> " option_selected
case ${option_selected} in
0)
return
;;
1)
language_menu
;;
2)
if "${AIRGEDDON_AUTO_UPDATE:-true}"; then
ask_yesno 457 "no"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_AUTO_UPDATE"; then
echo
language_strings "${language}" 461 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
language_strings "${language}" 459 "yellow"
ask_yesno 458 "no"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_AUTO_UPDATE"; then
echo
language_strings "${language}" 460 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
3)
if "${AIRGEDDON_SKIP_INTRO:-true}"; then
ask_yesno 569 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_SKIP_INTRO"; then
echo
language_strings "${language}" 571 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 570 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_SKIP_INTRO"; then
echo
language_strings "${language}" 572 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
4)
if "${AIRGEDDON_BASIC_COLORS:-true}"; then
ask_yesno 558 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_BASIC_COLORS"; then
echo
language_strings "${language}" 560 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 559 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_BASIC_COLORS"; then
echo
language_strings "${language}" 561 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
5)
if ! hash ccze 2> /dev/null; then
echo
language_strings "${language}" 464 "yellow"
fi
if "${AIRGEDDON_EXTENDED_COLORS:-true}"; then
ask_yesno 462 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EXTENDED_COLORS"; then
echo
language_strings "${language}" 466 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 463 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EXTENDED_COLORS"; then
echo
language_strings "${language}" 465 "blue"
if ! "${AIRGEDDON_BASIC_COLORS:-true}"; then
echo
language_strings "${language}" 562 "yellow"
fi
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
6)
if "${AIRGEDDON_AUTO_CHANGE_LANGUAGE:-true}"; then
ask_yesno 469 "no"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_AUTO_CHANGE_LANGUAGE"; then
echo
language_strings "${language}" 473 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
echo
language_strings "${language}" 471 "yellow"
ask_yesno 470 "no"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_AUTO_CHANGE_LANGUAGE"; then
echo
language_strings "${language}" 472 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
7)
if "${AIRGEDDON_SILENT_CHECKS:-true}"; then
ask_yesno 577 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_SILENT_CHECKS"; then
echo
language_strings "${language}" 579 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 578 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_SILENT_CHECKS"; then
echo
language_strings "${language}" 580 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
8)
if "${AIRGEDDON_PRINT_HINTS:-true}"; then
ask_yesno 586 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_PRINT_HINTS"; then
echo
language_strings "${language}" 588 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 587 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_PRINT_HINTS"; then
echo
language_strings "${language}" 589 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
9)
if "${AIRGEDDON_5GHZ_ENABLED:-true}"; then
ask_yesno 596 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_5GHZ_ENABLED"; then
echo
language_strings "${language}" 598 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 597 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_5GHZ_ENABLED"; then
echo
language_strings "${language}" 599 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
10)
if [ "${AIRGEDDON_WINDOWS_HANDLING}" = "xterm" ]; then
ask_yesno 657 "yes"
if [ "${yesno}" = "y" ]; then
sed -ri "s:(AIRGEDDON_WINDOWS_HANDLING)=(xterm):\1=tmux:" "${rc_path}" 2> /dev/null
echo
language_strings "${language}" 620 "yellow"
language_strings "${language}" 115 "read"
fi
else
ask_yesno 658 "yes"
if [ "${yesno}" = "y" ]; then
sed -ri "s:(AIRGEDDON_WINDOWS_HANDLING)=(tmux):\1=xterm:" "${rc_path}" 2> /dev/null
echo
language_strings "${language}" 620 "yellow"
language_strings "${language}" 115 "read"
fi
fi
;;
11)
ask_yesno 639 "yes"
if [ "${yesno}" = "y" ]; then
mdk_version_toggle
echo
language_strings "${language}" 640 "yellow"
language_strings "${language}" 115 "read"
fi
;;
12)
if "${AIRGEDDON_PLUGINS_ENABLED:-true}"; then
ask_yesno 655 "yes"
else
ask_yesno 656 "yes"
fi
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_PLUGINS_ENABLED" "required_reboot"; then
echo
language_strings "${language}" 620 "yellow"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
;;
13)
if "${AIRGEDDON_FORCE_NETWORK_MANAGER_KILLING:-true}"; then
ask_yesno 692 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_FORCE_NETWORK_MANAGER_KILLING"; then
echo
language_strings "${language}" 694 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 693 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_FORCE_NETWORK_MANAGER_KILLING"; then
echo
language_strings "${language}" 695 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
14)
if "${AIRGEDDON_EVIL_TWIN_ESSID_STRIPPING:-true}"; then
ask_yesno 767 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EVIL_TWIN_ESSID_STRIPPING"; then
echo
language_strings "${language}" 769 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 768 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EVIL_TWIN_ESSID_STRIPPING"; then
echo
language_strings "${language}" 770 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
15)
if "${AIRGEDDON_EVIL_TWIN_SOUNDS:-true}"; then
ask_yesno 806 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EVIL_TWIN_SOUNDS"; then
echo
language_strings "${language}" 808 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
else
ask_yesno 807 "yes"
if [ "${yesno}" = "y" ]; then
if option_toggle "AIRGEDDON_EVIL_TWIN_SOUNDS"; then
echo
language_strings "${language}" 809 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
language_strings "${language}" 115 "read"
fi
fi
;;
16)
ask_yesno 478 "yes"
if [ "${yesno}" = "y" ]; then
get_current_permanent_language
if [ "${language}" = "${current_permanent_language}" ]; then
echo
language_strings "${language}" 480 "red"
else
if "${AIRGEDDON_AUTO_CHANGE_LANGUAGE:-true}"; then
echo
language_strings "${language}" 479 "yellow"
option_toggle "AIRGEDDON_AUTO_CHANGE_LANGUAGE"
fi
if set_permanent_language; then
echo
language_strings "${language}" 481 "blue"
else
echo
language_strings "${language}" 417 "red"
fi
fi
language_strings "${language}" 115 "read"
fi
;;
*)
invalid_menu_option
;;
esac
option_menu
}
#Language change menu
function language_menu() {
debug_print
clear
language_strings "${language}" 87 "title"
current_menu="language_menu"
initialize_menu_and_print_selections
echo
language_strings "${language}" 81 "green"
print_simple_separator
language_strings "${language}" 446
print_simple_separator
language_strings "${language}" 79
language_strings "${language}" 80
language_strings "${language}" 113
language_strings "${language}" 116
language_strings "${language}" 249
language_strings "${language}" 308
language_strings "${language}" 320
language_strings "${language}" 482
language_strings "${language}" 58
language_strings "${language}" 331
language_strings "${language}" 519
language_strings "${language}" 687
language_strings "${language}" 717
print_hint
read -rp "> " language_selected
echo
case ${language_selected} in
0)
return
;;
1)
if [ "${language}" = "ENGLISH" ]; then
language_strings "${language}" 251 "red"
else
language="ENGLISH"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
2)
if [ "${language}" = "SPANISH" ]; then
language_strings "${language}" 251 "red"
else
language="SPANISH"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
3)
if [ "${language}" = "FRENCH" ]; then
language_strings "${language}" 251 "red"
else
language="FRENCH"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
4)
if [ "${language}" = "CATALAN" ]; then
language_strings "${language}" 251 "red"
else
language="CATALAN"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
5)
if [ "${language}" = "PORTUGUESE" ]; then
language_strings "${language}" 251 "red"
else
language="PORTUGUESE"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
6)
if [ "${language}" = "RUSSIAN" ]; then
language_strings "${language}" 251 "red"
else
language="RUSSIAN"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
7)
if [ "${language}" = "GREEK" ]; then
language_strings "${language}" 251 "red"
else
language="GREEK"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
8)
if [ "${language}" = "ITALIAN" ]; then
language_strings "${language}" 251 "red"
else
language="ITALIAN"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
9)
if [ "${language}" = "POLISH" ]; then
language_strings "${language}" 251 "red"
else
language="POLISH"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
10)
if [ "${language}" = "GERMAN" ]; then
language_strings "${language}" 251 "red"
else
language="GERMAN"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
11)
if [ "${language}" = "TURKISH" ]; then
language_strings "${language}" 251 "red"
else
language="TURKISH"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
12)
if [ "${language}" = "ARABIC" ]; then
language_strings "${language}" 251 "red"
else
language="ARABIC"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
13)
if [ "${language}" = "CHINESE" ]; then
language_strings "${language}" 251 "red"
else
language="CHINESE"
language_strings "${language}" 83 "yellow"
fi
language_strings "${language}" 115 "read"
;;
*)
invalid_language_selected
;;
esac
detect_rtl_language
initialize_language_strings
hookable_for_languages
language_menu
}
#Read the chipset for an interface
function set_chipset() {
debug_print
chipset=""
sedrule1="s/^[0-9a-f]\{1,4\} \|^ //Ig"
sedrule2="s/ Network Connection.*//Ig"
sedrule3="s/ Wireless.*//Ig"
sedrule4="s/ PCI Express.*//Ig"
sedrule5="s/ \(Gigabit\|Fast\) Ethernet.*//Ig"
sedrule6="s/ \[.*//"
sedrule7="s/ (.*//"
sedrule8="s|802\.11a/b/g/n/ac.*||Ig"
sedruleall="${sedrule1};${sedrule2};${sedrule3};${sedrule4};${sedrule5};${sedrule6};${sedrule7};${sedrule8}"
if [ -f "/sys/class/net/${1}/device/modalias" ]; then
bus_type=$(cut -f 1 -d ":" < "/sys/class/net/${1}/device/modalias")
if [ "${bus_type}" = "usb" ]; then
vendor_and_device=$(cut -b 6-14 < "/sys/class/net/${1}/device/modalias" | sed 's/^.//;s/p/:/')
if hash lsusb 2> /dev/null; then
if [[ -n "${2}" ]] && [[ "${2}" = "read_only" ]]; then
requested_chipset=$(lsusb | grep -i "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
else
chipset=$(lsusb | grep -i "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
fi
fi
elif [[ "${bus_type}" =~ pci|ssb|bcma|pcmcia ]]; then
if [[ -f /sys/class/net/${1}/device/vendor ]] && [[ -f /sys/class/net/${1}/device/device ]]; then
vendor_and_device=$(sed -e 's/0x//' "/sys/class/net/${1}/device/vendor"):$(sed -e 's/0x//' "/sys/class/net/${1}/device/device")
if [[ -n "${2}" ]] && [[ "${2}" = "read_only" ]]; then
requested_chipset=$(lspci -d "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
else
chipset=$(lspci -d "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
fi
else
if hash ethtool 2> /dev/null; then
ethtool_output=$(ethtool -i "${1}" 2>&1)
vendor_and_device=$(printf "%s" "${ethtool_output}" | grep "bus-info" | cut -f 3 -d ":" | sed 's/^ //')
if [[ -n "${2}" ]] && [[ "${2}" = "read_only" ]]; then
requested_chipset=$(lspci | grep "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
else
chipset=$(lspci | grep "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
fi
fi
fi
fi
elif [[ -f /sys/class/net/${1}/device/idVendor ]] && [[ -f /sys/class/net/${1}/device/idProduct ]]; then
vendor_and_device=$(cat "/sys/class/net/${1}/device/idVendor"):$(cat "/sys/class/net/${1}/device/idProduct")
if hash lsusb 2> /dev/null; then
if [[ -n "${2}" ]] && [[ "${2}" = "read_only" ]]; then
requested_chipset=$(lsusb | grep -i "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
else
chipset=$(lsusb | grep -i "${vendor_and_device}" | head -n 1 | cut -f 3 -d ":" | sed -e "${sedruleall}")
fi
fi
fi
}
#Manage and validate the prerequisites for DoS Pursuit mode integrated on Evil Twin and Enterprise attacks
function dos_pursuit_mode_et_handler() {
debug_print
ask_yesno 505 "no"
if [ "${yesno}" = "y" ]; then
dos_pursuit_mode=1
if [ "${et_dos_attack}" = "Auth DoS" ]; then
echo
language_strings "${language}" 508 "yellow"
language_strings "${language}" 115 "read"
fi
if select_secondary_interface "dos_pursuit_mode"; then
if [[ "${dos_pursuit_mode}" -eq 1 ]] && [[ -n "${channel}" ]] && [[ "${channel}" -gt 14 ]] && [[ "${interfaces_band_info['secondary_wifi_interface','5Ghz_allowed']}" -eq 0 ]]; then
echo
language_strings "${language}" 394 "red"
language_strings "${language}" 115 "read"
if [ -n "${enterprise_mode}" ]; then
return_to_enterprise_main_menu=1
else
return_to_et_main_menu=1
fi
return 1
fi
if ! check_monitor_enabled "${secondary_wifi_interface}"; then
echo
language_strings "${language}" 14 "yellow"
echo
language_strings "${language}" 513 "blue"
language_strings "${language}" 115 "read"
echo
if ! monitor_option "${secondary_wifi_interface}"; then
if [ -n "${enterprise_mode}" ]; then
return_to_enterprise_main_menu=1
else
return_to_et_main_menu=1
fi
return 1
else
echo
language_strings "${language}" 34 "yellow"
language_strings "${language}" 115 "read"
fi
else
echo
language_strings "${language}" 34 "yellow"
language_strings "${language}" 115 "read"
fi
else
return 1
fi
fi
return 0
}
#Secondary interface selection menu for Evil Twin, Enterprise attacks DoS pursuit mode and others
function select_secondary_interface() {
debug_print
if [ "${return_to_et_main_menu}" -eq 1 ]; then
return 1
fi
if [ "${return_to_enterprise_main_menu}" -eq 1 ]; then
return 1
fi
if [ "${return_to_wpa3_main_menu}" -eq 1 ]; then
return 1
fi
clear
if [ -n "${enterprise_mode}" ]; then
current_menu="enterprise_attacks_menu"
case ${enterprise_mode} in
"smooth")
language_strings "${language}" 522 "title"
;;
"noisy")
language_strings "${language}" 523 "title"
;;
esac
elif [ "${FUNCNAME[6]}" = "hookable_wpa3_attacks_menu" ]; then
current_menu="wpa3_attacks_menu"
elif [[ -z "${enterprise_mode}" ]] && [[ -z "${et_mode}" ]]; then
current_menu="dos_attacks_menu"
elif [[ -z "${enterprise_mode}" ]] && [[ -n "${et_mode}" ]]; then
current_menu="evil_twin_attacks_menu"
case ${et_mode} in
"et_onlyap")
language_strings "${language}" 270 "title"
;;
"et_sniffing")
language_strings "${language}" 291 "title"
;;
"et_sniffing_sslstrip2")
language_strings "${language}" 292 "title"
;;
"et_sniffing_sslstrip2_beef")
language_strings "${language}" 397 "title"
;;
"et_captive_portal")
language_strings "${language}" 293 "title"
;;
esac
fi
if [[ "${1}" = "dos_pursuit_mode" ]] || [[ "${1}" = "secondary_interface" ]]; then
readarray -t secondary_ifaces < <(iw dev | grep "Interface" | awk '{print $2}' | grep "${interface}" -v)
elif [ "${1}" = "internet" ]; then
if [ -n "${secondary_wifi_interface}" ]; then
readarray -t secondary_ifaces < <(ip link | grep -E "^[0-9]+" | cut -d ':' -f 2 | awk '{print $1}' | grep -E "^lo$" -v | grep "${interface}" -v | grep "${secondary_wifi_interface}" -v)
else
readarray -t secondary_ifaces < <(ip link | grep -E "^[0-9]+" | cut -d ':' -f 2 | awk '{print $1}' | grep -E "^lo$" -v | grep "${interface}" -v)
fi
fi
if [ ${#secondary_ifaces[@]} -eq 1 ]; then
if [[ "${1}" = "dos_pursuit_mode" ]] || [[ "${1}" = "secondary_interface" ]]; then
secondary_wifi_interface="${secondary_ifaces[0]}"
secondary_phy_interface=$(physical_interface_finder "${secondary_wifi_interface}")
check_interface_supported_bands "${secondary_phy_interface}" "secondary_wifi_interface"
elif [ "${1}" = "internet" ]; then
internet_interface="${secondary_ifaces[0]}"
fi
echo
language_strings "${language}" 662 "yellow"
language_strings "${language}" 115 "read"
return 0
fi
option_counter=0
for item in "${secondary_ifaces[@]}"; do
if [ "${option_counter}" -eq 0 ]; then
if [[ "${1}" = "dos_pursuit_mode" ]] || [[ "${1}" = "secondary_interface" ]]; then
echo
language_strings "${language}" 511
gitextract_6cbgby3e/
├── .airgeddonrc
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug_report.yml
│ │ ├── 2-general_question.yml
│ │ ├── 3-feature_request.yml
│ │ ├── 4-compatibility_enhancement.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── dev.yml
│ └── master.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── airgeddon.sh
├── language_strings.sh
├── pindb_checksum.txt
└── plugins/
├── missing_dependencies.sh
└── plugin_template.sh
Condensed preview — 24 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,620K chars).
[
{
"path": ".airgeddonrc",
"chars": 2429,
"preview": "#Enabled true / Disabled false - Auto update feature (it has no effect on development mode) - Default value true\nAIRGEDD"
},
{
"path": ".editorconfig",
"chars": 264,
"preview": "#EditorConfig: http://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\n\n["
},
{
"path": ".gitattributes",
"chars": 249,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto eol=lf\n\n# Text files and source code\n*.txt text\n*.yml "
},
{
"path": ".github/FUNDING.yml",
"chars": 189,
"preview": "# These are supported funding model platforms\n\ngithub: v1s1t0r1sh3r3\nbuy_me_a_coffee: v1s1t0r\ncustom: ['https://www.payp"
},
{
"path": ".github/ISSUE_TEMPLATE/1-bug_report.yml",
"chars": 2586,
"preview": "name: Bug Report\ndescription: Create a report to help us improve\ntitle: \"[Possible Bug]: \"\nlabels: [\"needs triage\", \"bug"
},
{
"path": ".github/ISSUE_TEMPLATE/2-general_question.yml",
"chars": 1572,
"preview": "name: General Question\ndescription: Ask some general question\ntitle: \"[General Question]: \"\nlabels: [\"question\"]\nproject"
},
{
"path": ".github/ISSUE_TEMPLATE/3-feature_request.yml",
"chars": 1556,
"preview": "name: Feature Request\ndescription: Suggest a new idea to improve this project\ntitle: \"[Feature Request]: \"\nlabels: [\"nee"
},
{
"path": ".github/ISSUE_TEMPLATE/4-compatibility_enhancement.yml",
"chars": 1666,
"preview": "name: Compatibility Enhancement\ndescription: Request to expand compatibility support\ntitle: \"[Compatibility Enhancement]"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 503,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Get airgeddon's Discord Community Support\n url: https://discord."
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 928,
"preview": "<!--- Please, before sending a pull request read the Git Workflow Policy on Contributing section of the project. Link he"
},
{
"path": ".github/workflows/dev.yml",
"chars": 748,
"preview": "#Workflow for docker autobuild in dev branch\n\nname: 'Docker CI dev'\n\non:\n push:\n branches: dev\n paths:\n - '*"
},
{
"path": ".github/workflows/master.yml",
"chars": 759,
"preview": "#Workflow for docker autobuild in master branch\n\nname: 'Docker CI master'\n\non:\n push:\n branches: master\n paths:\n "
},
{
"path": ".gitignore",
"chars": 89,
"preview": ".DS_Store*\n._*\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db\ndesktop.ini\n.dropbox*\n.idea"
},
{
"path": "CHANGELOG.md",
"chars": 31889,
"preview": "### 11.61\n - Added check to detect if operating in a Virtual Machine\n - Added beep sounds to Evil Twin attacks to alert "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3228,
"preview": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and"
},
{
"path": "CONTRIBUTING.md",
"chars": 11707,
"preview": "# Contributing\n\nHi there! We are thrilled that you would like to contribute to this project. Your help is essential for "
},
{
"path": "Dockerfile",
"chars": 3633,
"preview": "#airgeddon Dockerfile\n\n#Base image\nFROM kalilinux/kali-rolling:latest\n\n#Credits & Data\nLABEL \\\n\tname=\"airgeddon\" \\\n\tauth"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 6039,
"preview": "# airgeddon\n[![Version-shield]](https://raw.githubusercontent.com/v1s1t0r1sh3r3/airgeddon/master/CHANGELOG.md) [![Bash4."
},
{
"path": "airgeddon.sh",
"chars": 924965,
"preview": "#!/usr/bin/env bash\n#Title........: airgeddon.sh\n#Description..: This is a multi-use bash script for Linux systems to au"
},
{
"path": "language_strings.sh",
"chars": 1375188,
"preview": "#!/usr/bin/env bash\n#Title........: language_strings.sh\n#Description..: All the translated strings that airgeddon uses a"
},
{
"path": "pindb_checksum.txt",
"chars": 33,
"preview": "c46dd1032c52efb4b291d9e97ce43e9d\n"
},
{
"path": "plugins/missing_dependencies.sh",
"chars": 31453,
"preview": "#!/usr/bin/env bash\n\n#Global shellcheck disabled warnings\n#shellcheck disable=SC2034\n\nplugin_name=\"Missing dependencies "
},
{
"path": "plugins/plugin_template.sh",
"chars": 6401,
"preview": "#!/usr/bin/env bash\n\n#Global shellcheck disabled warnings\n#shellcheck disable=SC2034,SC2154\n\n#Start modifying below this"
}
]
About this extraction
This page contains the full source code of the v1s1t0r1sh3r3/airgeddon GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 24 files (2.3 MB), approximately 611.9k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.