#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;
} |