#!/bin/bash


N='\033[0m'
R='\033[0;31m'
G='\033[0;32m'
O='\033[0;33m'
B='\033[0;34m'
C='\033[0;36m'
W='\033[0;37m'


print_banner() {
    local banner=(
        "******************************************"
        "*                  MisCORS               *"
        "*     CORS Hunter / Vulnerability Tool   *"
        "*                  v1.2.1                *"
        "*      ----------------------------      *"
        "*                        by @ImKKingshuk *"
        "* Github- https://github.com/ImKKingshuk *"
        "******************************************"
    )
    local width=$(tput cols)
    for line in "${banner[@]}"; do
        printf "%*s\n" $(((${#line} + width) / 2)) "$line"
    done
    echo
}


check_internet() {
    echo -e "${O}[+] Checking Internet Connectivity\n"
    sleep 2
    if ! ping -c 1 8.8.8.8 &> /dev/null; then
        echo "No Internet Connection"
        exit 1
    else
        echo "Internet is present"
        sleep 2
    fi
}


cors_check_advanced() {
    local site="$1"
    local output_format="$2"
    local output_file="output.$output_format"
    local timeout=5

    echo -e "${C}\n[+] Searching For CORS Misconfiguration on $site\n"
    
    local response=$(curl -s --max-time "$timeout" -Iv "$site" -H "Origin: evil.com" 2>&1)
    
    case $output_format in
        "json")
            echo -e "{ \"url\": \"$site\", \"result\": {" > "$output_file"
            ;;
        *)
            echo -e "\nURL: $site" > "$output_file"
            ;;
    esac

    echo "$response" >> "$output_file"

    if grep -q "evil.com" <<< "$response"; then
        echo -e "${R}URL: $site  [Vulnerable]\n"
        grep -e "evil.com" -e "access-control-allow-credentials:" "$output_file"
    else
        echo -e "${G}URL: $site  [Not Vulnerable]\n"
    fi

    case $output_format in
        "json")
            echo -e "}}" >> "$output_file"
            ;;
    esac
}


interactive_mode() {
    local option
    echo -e "${O}[+] Interactive Mode"
    echo -e "${O}[+] Options:"
    echo -e "${O}[1] Perform CORS check"
    echo -e "${O}[2] Exit"

    read -r -p "[?] Choose an option: " option

    case $option in
        1)
            read -r -p "${C}\n[+] Enter Site (e.g https://site-url.com): " site

            echo -e "${O}[+] Choose Output Format:"
            echo -e "${O}[1] Normal text"
            echo -e "${O}[2] JSON"
            
            read -r -p "[?] Choose an option: " output_option

            case $output_option in
                1) output_format="txt" ;;
                2) output_format="json" ;;
                *) 
                    echo -e "${R}[!] Invalid output format option. Defaulting to normal text."
                    output_format="txt" 
                    ;;
            esac

            cors_check_advanced "$site" "$output_format"
            ;;
        2)
            echo -e "${O}[+] Exiting..."
            exit 0
            ;;
        *)
            echo -e "${R}[!] Invalid option. Exiting..."
            exit 1
            ;;
    esac
}


trap 'printf "\e[1;77m \n Ctrl+C was pressed, exiting...\n\n \e[0m"; exit 0' 2


print_banner
check_internet
clear
print_banner


while true; do
    interactive_mode
done