commit 8f0d00ac94ae4d27d3f926080788d0860119dfcc Author: agatha Date: Sat Nov 25 15:38:52 2023 -0500 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..1fa1223 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# org2ranges +Collect IP ranges with a [bgp.tools](https://bgp.tools) search query. + +Searches [bgp.tools](https://bgp.tools) for organizations IP ranges and creates three files: +- `ranges.txt`: Contains all IP ranges belonging to the ASNs. +- `ipv4.txt`: All IPv4 ranges for `zmap` or other IPv4-only tools. +- `ipv6.txt`: All IPv6 ranges that can be scanned separately if needed. + +As the organization search is loose, you will be asked to edit the input list before `asn2ranges` is called. + +## Shoutouts +- Greetz to acidvegas for `asn2ranges` and `asn2search` bash functions. + +## Troubleshooting +You may have to edit the User-Agent if you have trouble getting the lists from [bgp.tools](https://bgp.tools). \ No newline at end of file diff --git a/org2ranges.sh b/org2ranges.sh new file mode 100644 index 0000000..e510d42 --- /dev/null +++ b/org2ranges.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +# org2ranges.sh +# +# written by agatha with bgp.tools scripts provided by acidvegas +# +# usage: ./org2ranges.sh +# searches bgp.tools for organizations ip ranges and creates three files: +# - ranges.txt: contains all ip ranges belonging to the asns +# - ipv4.txt: all ipv4 ranges for zmap or other ipv4-only tools +# - ipv6.txt: all ipv6 ranges that can be scanned separately if needed +# +# as the organization search is loose, you will be asked to edit the input +# list before asn2ranges is called. + +asn2ranges() { + local cache_file="/tmp/.bgp_tools_table_cache" + local current_time=$(date +%s) + local update_interval=$((24 * 60 * 60)) # 2 hours in seconds + if [ -f "$cache_file" ]; then + local last_update=$(date -r "$cache_file" +%s) + local time_diff=$(($current_time - $last_update)) + if [ $time_diff -gt $update_interval ]; then + curl -A 'bgp.tools cli - originally by acidvegas' -s https://bgp.tools/table.txt -o "$cache_file" + fi + else + curl -A 'bgp.tools cli - originally by acidvegas' -s https://bgp.tools/table.txt -o "$cache_file" + fi + awk -v asn="$1" '$NF == asn {print $1}' "$cache_file" +} + +asn2search() { + local search_string="$1" + local cache_file="/tmp/.bgp_tools_asn_cache" + local current_time=$(date +%s) + local update_interval=$((24 * 60 * 60)) # 24 hours in seconds + if [ -f "$cache_file" ]; then + local last_update=$(date -r "$cache_file" +%s) + local time_diff=$(($current_time - $last_update)) + if [ $time_diff -gt $update_interval ]; then + curl -v -A 'bgp.tools cli - originally by acidvegas' -s https://bgp.tools/asns.csv -o "$cache_file" + fi + else + curl -A 'bgp.tools cli - originally by acidvegas' -s https://bgp.tools/asns.csv -o "$cache_file" + fi + grep -i "$search_string" "$cache_file" +} + +# org2ranges main +if [[ -z "$1" ]]; then + echo "[!] No organization provided." + exit 1 +fi + +search_string="$*" + +echo "[*] Searching for \"$search_string\"..." +as_list=$(asn2search "$search_string") + +if [[ -n "$as_list" ]]; then + echo "[+] ASNs found for \"$search_string\". Validate the list before continuing." + read -rp "[*] Press Enter to continue." + + temp_file=$(mktemp) + printf "%s\n" "$as_list" > "$temp_file" + + "${EDITOR:-vim}" "$temp_file" + + if ! [[ -s "$temp_file" ]]; then + echo "[!] Could not find temp_file." + exit 1 + fi + + num_asns=$(wc -l "$temp_file" | awk '{print $1}') + echo "[*] Gathering IP ranges for $num_asns ASNs..." + + ranges_file="ranges.txt" + + # Delete ranges_file if it already exists + if [[ -f "$ranges_file" ]]; then + rm "$ranges_file" + fi + + while IFS= read -r line; do + as_number=$(echo "$line" | grep -oP '\bAS\d+\b' | sed 's/^AS//') + + if [[ -n $as_number ]]; then + asn2ranges "$as_number" >> "$ranges_file" + fi + done < "$temp_file" + + grep -v ":" "$ranges_file" > ipv4.txt + grep ":" "$ranges_file" > ipv6.txt + + echo "[+] Created ranges.txt, ipv4.txt, and ipv6.txt!" + + num_v4=$(wc -l ipv4.txt | awk '{print $1}') + num_v6=$(wc -l ipv6.txt | awk '{print $1}') + echo "[+] IPv4 range count: $num_v4" + echo "[+] IPv6 range count: $num_v6" + echo "[*] Happy hunting!" + + rm "$temp_file" +else + echo "[!] No ASNs found." +fi +