1619, 1/81 ȸ¿ø°¡ÀÔ  ·Î±×ÀΠ 
   ÇØÅ·ÀßÇϰí½Í´Ù
   http://¾øÀ½
   realip_finder

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=8615 [º¹»ç]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

// »ö»ó ÄÚµå (ÇØÄ¿ °¨¼º & °¡µ¶¼º)
#define COLOR_RED     "\x1b[31m"
#define COLOR_GREEN   "\x1b[32m"
#define COLOR_YELLOW  "\x1b[33m"
#define COLOR_RESET   "\x1b[0m"

// Cloudflare IPv4 ´ë¿ª (Ãà¾àµÊ, ÇÊ¿ä½Ã ÃֽЏ®½ºÆ®·Î ¾÷µ¥ÀÌÆ®)
const char *CF_RANGES[] = {
    "173.245.48.0/20", "103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22",
    "141.101.64.0/18", "108.162.192.0/18", "190.93.240.0/20", "188.114.96.0/20",
    "197.234.240.0/22", "198.41.128.0/17", "162.158.0.0/15", "104.16.0.0/13",
    "104.24.0.0/14", "172.64.0.0/13", "131.0.72.0/22", NULL
};

// CIDR °è»ê ÇÔ¼ö
int is_ip_in_cidr(const char *ip_str, const char *cidr_str) {
    char cidr_copy[32];
    strncpy(cidr_copy, cidr_str, 31);
    char *slash = strchr(cidr_copy, '/');
    if (!slash) return 0;
    *slash = '\0';
    
    int prefix_len = atoi(slash + 1);
    struct in_addr ip_addr, net_addr;
    
    if (inet_pton(AF_INET, ip_str, &ip_addr) != 1) return 0;
    if (inet_pton(AF_INET, cidr_copy, &net_addr) != 1) return 0;
    
    uint32_t ip = ntohl(ip_addr.s_addr);
    uint32_t net = ntohl(net_addr.s_addr);
    uint32_t mask = (prefix_len == 0) ? 0 : (~0U << (32 - prefix_len));
    
    return (ip & mask) == (net & mask);
}

// Cloudflare ÆÇº° ·ÎÁ÷
int check_if_cloudflare(const char *ip) {
    for (int i = 0; CF_RANGES[i] != NULL; i++) {
        if (is_ip_in_cidr(ip, CF_RANGES[i])) return 1;
    }
    return 0;
}

// µµ¸ÞÀÎ -> IP º¯È¯ ¹× ÆÇº°
void analyze_domain(char *domain) {
    // °³Çà ¹®ÀÚ Á¦°Å
    domain[strcspn(domain, "\n")] = 0;
    
    struct addrinfo hints, *res;
    char ip_str[INET_ADDRSTRLEN];
    
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    
    if (getaddrinfo(domain, NULL, &hints, &res) != 0) {
        // DNS Á¶È¸ ½ÇÆÐ ½Ã Á¶¿ëÈ÷ ³Ñ¾î°¨ (¼Óµµ¸¦ À§ÇØ)
        return;
    }
    
    struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
    inet_ntop(AF_INET, &(ipv4->sin_addr), ip_str, INET_ADDRSTRLEN);
    
    if (check_if_cloudflare(ip_str)) {
        printf("[CF]   %s -> %s\n", domain, ip_str);
    } else {
        // [Áß¿ä] ¸®¾ó IP ¹ß°ß ½Ã »¡°£»ö °­Á¶ Ãâ·Â
        printf(COLOR_RED "[REAL] %s -> %s (Target Found!)" COLOR_RESET "\n", domain, ip_str);
    }
    
    freeaddrinfo(res);
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("»ç¿ë¹ý: %s <target-domain>\n", argv[0]);
        return 1;
    }

    char cmd[512];
    char line[256];

    printf(COLOR_GREEN "=== Auto Real-IP Detector Started ===\n" COLOR_RESET);
    printf("Target: %s\n", argv[1]);
    printf("Scanning subdomains using 'subfinder'...\n\n");

    // 1. subfinder¸¦ ÆÄÀÌÇÁ(popen)·Î ½ÇÇà (Á¶¿ëÈ÷ ½ÇÇà: -silent ¿É¼Ç)
    // ÁÖÀÇ: ½Ã½ºÅÛ¿¡ subfinder°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÔ
    snprintf(cmd, sizeof(cmd), "subfinder -d %s -silent", argv[1]);
    
    FILE *fp = popen(cmd, "r");
    if (fp == NULL) {
        perror("Subfinder ½ÇÇà ½ÇÆÐ (¼³Ä¡ È®ÀÎ ÇÊ¿ä)");
        return 1;
    }

    // 2. subfinder°¡ ¹ñ¾î³»´Â ¼­ºêµµ¸ÞÀÎÀ» ÇÑ ÁÙ¾¿ ½Ç½Ã°£À¸·Î ÀÐÀ½
    while (fgets(line, sizeof(line), fp) != NULL) {
        analyze_domain(line);
    }

    pclose(fp);
    printf(COLOR_GREEN "\n=== Scan Completed ===\n" COLOR_RESET);

    return 0;
}

  Hit : 706     Date : 2026/02/05 07:25