From 13d417727c1ce7690ef7bf7a4b1121af0e776631 Mon Sep 17 00:00:00 2001 From: aixiao Date: Sun, 26 Jun 2022 19:49:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=91=8A=E8=AD=A6=E3=80=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 +- README.md | 7 +- denyhosts.sh | 1 + rhost | Bin 23216 -> 44240 bytes rhost.c | 352 ++++++++++++++++++++++++++++++++++++++++++++++----- rhost.o | Bin 16176 -> 52280 bytes 6 files changed, 331 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index 4f1f793..8736236 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ CROSS_COMPILE ?= CC := $(CROSS_COMPILE)gcc -CFLAGS += -O2 -g -Wall - +CFLAGS += -g -Wall +LIB += -lcurl OBG = rhost all: rhost.o - $(CC) $(CFLAGS) $^ -o $(OBG) + $(CC) $(CFLAGS) $^ -o $(OBG) $(LIB) clean: rm -rf *.o diff --git a/README.md b/README.md index 60d4639..f6a0071 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ # denyhosts ssh防止暴力破解,适用Debian 8、9 +支持钉钉告警和邮件告警 +支持第三方QQ邮箱告警 +支持一次运行检测、后台运行检测 +请安装libcurl库 -## Help Information cd /root git clone https://github.com/niuyuling/denyhosts.git cd denyhosts @@ -12,3 +15,5 @@ chmod a+x /root/denyhosts/denyhosts.sh crontab 定时任务,像这样. 0 22 * * * /root/denyhosts/denyhosts.sh + + diff --git a/denyhosts.sh b/denyhosts.sh index 35b66a2..fdf6db2 100644 --- a/denyhosts.sh +++ b/denyhosts.sh @@ -42,6 +42,7 @@ function run() mail -s "System Log" ${email_address} < ${log_file} rm ${log_file} fi + sync } diff --git a/rhost b/rhost index 0d124a580ebd2fd767a34dcbdf5a469f55504d86..90f79e1cacbb8addbe659dd452e4b759dea4e4bd 100644 GIT binary patch literal 44240 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≫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 diff --git a/rhost.c b/rhost.c index e845422..27fcbab 100644 --- a/rhost.c +++ b/rhost.c @@ -4,19 +4,212 @@ #include #include #include +#include +#include +#include -#define BUFFER 270 +#define CENTOS_SYSTEM 1 +#define DEBISN_SYSTEM 2 +#define UNKNOWN_SYSTEM 3 + +#define BUFFER 1024 #define LONG_BUFFER 1024*100 -#define TOP_IP 20 -#define AWK "| awk -v num=%d '{a[$1]+=1;} END {for(i in a){if (a[i] >= num) {print i;}}}' " -#define GE_10 "grep -E \"^$(date \"+%h\").$(date \"+%d\")\" /var/log/auth.log | grep failure | grep rhost" -#define LE_10 "grep -E \"^$(date \"+%h\")..$(date | awk '{print $3}')\" /var/log/auth.log | grep failure | grep rhost" -#define IPTABLES "/sbin/iptables -I INPUT -s %s -j DROP" +#define TOP_IP 10 +#define AWK " | awk -v num=%d '{a[$1]+=1;} END {for(i in a){if (a[i] >= num) {print i;}}}' " +#define GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/auth.log | grep failure | grep rhost" +#define LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/auth.log | grep failure | grep rhost" -int main(int argc, char *argv[], char **env) +#define CENTOS_GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/secure | grep failure | grep rhost" +#define CENTOS_LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/secure | grep failure | grep rhost" + +#define IPTABLES "iptables -I INPUT -s %s -j DROP" +#define IPTABLES_CHECK "iptables -C INPUT -s %s -j DROP" + +#define TIME 60 + +#define IS_DIND 1 +#define PHONE "155659790" +#define DING_CURL "https://oapi.dingtalk.com/robot/send?access_token=7f069c672cb878987aa6772cca336740eece4ce36bde12b51b45e9f440e" + +#define IS_MAIL 0 + +#define IS_QQMAIL 0 +#define QQMAIL "qqMail -l smtp.qq.com -p 25 -f 1605227279 -e caczsjchvyibi -q NIUYULING -r 1605227279@QQ.COM -n NIUYULING -s \"System ban IP\" -t \"%s\"" + +// 存储公网IP +char public_ip[BUFFER]; + +// 检测系统 +int check_system() +{ + if (0 == access("/etc/debian_version", F_OK)) { + return DEBISN_SYSTEM; + } else if (0 == access("/etc/centos-release", F_OK)) { + return CENTOS_SYSTEM; + } + + return UNKNOWN_SYSTEM; +} + +// 获取公网IP +char *get_public_ip(char *ip) +{ + FILE *fp; + char buff[BUFFER]; + + memset(buff, 0, BUFFER); + if (NULL == (fp = popen("curl members.3322.org/dyndns/getip --silent", "r"))) { + perror("popen curl"); + } + + while (fgets(buff, BUFFER, fp) != NULL) { + buff[strlen(buff) - 1] = '\0'; + } + + if (NULL != fp) + pclose(fp); + + return strcpy(ip, buff); +} + +// 替换字符串 +int strReplaceAll(char *str, char *sub, char *replace) +{ + if (NULL == str || NULL == sub || NULL == replace) { + printf("strReplaceAll param error\n"); + return 1; + } + + char *p = NULL; + char *t = NULL; + char *q = NULL; + char *dst = NULL; + char *src = NULL; + + int str_len = strlen(str); + int sub_len = strlen(sub); + int replace_len = strlen(replace); + + p = str; + while ('\0' != *p) { + t = str + str_len; + q = strstr(str, sub); + if (NULL == q) /* 没有子串了,那么直接返回吧 */ + break; + + src = q + sub_len; /* 源头, 原有sub后的一个字符 */ + dst = q + replace_len; /* 目的,放完replace后的一个字符 */ + memcpy(dst, src, t - src); /* 原有字符串后移,放出空间 */ + memcpy(q, replace, replace_len); /* 将replace字符拷贝进来 */ + str_len = str_len + replace_len - sub_len; + + p = q + replace_len; /* p 下一轮replace后的一个字符 */ + } + + str[str_len] = '\0'; /* 通过'\0'表示结尾 */ + + return 0; +} + +// 钉钉告警 +int dingding_warning(char *illegal_ip, char *public_ip) +{ + CURL *curl; + CURLcode res; + + curl_global_init(CURL_GLOBAL_ALL); + curl = curl_easy_init(); + if (curl == NULL) { + return 1; + } + + char jsonObj[BUFFER] = "{ \ + \"msgtype\": \"text\", \ + \"text\": { \ + \"content\": \"Alert @PHONE 主机PUBLIC 非法主机IP被封禁! Warning!\" \ + }, \ + \"at\": { \ + \"atMobiles\": [\"PHONE\"], \ + \"isAtAll\": false \ + } \ + }"; + + strReplaceAll(jsonObj, "IP", illegal_ip); + strReplaceAll(jsonObj, "PHONE", PHONE); + strReplaceAll(jsonObj, "PUBLIC", public_ip); + printf("%s\n", jsonObj); + + struct curl_slist *headers = NULL; + headers = curl_slist_append(headers, "Accept: application/json"); + headers = curl_slist_append(headers, "Content-Type: application/json"); + headers = curl_slist_append(headers, "charset: utf-8"); + + curl_easy_setopt(curl, CURLOPT_URL, DING_CURL); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl/0.1"); + + res = curl_easy_perform(curl); + + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return res; +} + +// 邮件告警 +int mail_warning(char *illegal_ip, char *public_ip) +{ + FILE *fp = NULL; + char buff[BUFFER]; + char text[BUFFER] = "echo \"主机:HOST, 禁止IP访问!\" |"; + + memset(buff, 0, BUFFER); + strReplaceAll(text, "IP", illegal_ip); + strReplaceAll(text, "HOST", public_ip); + + strcat(text, " mail -s \"System ban IP\" 1605227279@qq.com"); + + if (NULL == (fp = popen(text, "r"))) { + perror("popen text"); + } + + while (fgets(buff, BUFFER, fp) != NULL) { + buff[strlen(buff) - 1] = '\0'; + } + + if (NULL != fp) + pclose(fp); + + return 0; +} + +// 第三方邮箱告警 +int QQ_mail_warning(char *illegal_ip, char *public_ip) +{ + + char string[BUFFER+(sizeof(QQMAIL))]; + char text[BUFFER] = "主机:HOST, 禁止IP访问!"; + + strReplaceAll(text, "IP", illegal_ip); + strReplaceAll(text, "HOST", public_ip); + + memset(string, 0, BUFFER+(sizeof(QQMAIL))); + sprintf(string, QQMAIL, text); + + system(string); + + return 0; +} + +// 封禁非法IP +int rule() { FILE *fp, *fc; - char p[2], splice_command[LONG_BUFFER], command[LONG_BUFFER], *temp, buffer[BUFFER], awk[BUFFER], iptables[BUFFER]; + char p[2], splice_command[LONG_BUFFER], command[LONG_BUFFER], *temp, buffer[BUFFER], awk[BUFFER], iptables[BUFFER + (sizeof(IPTABLES))], iptables_check[BUFFER + (sizeof(IPTABLES))]; time_t timep; struct tm *tp; @@ -26,20 +219,42 @@ int main(int argc, char *argv[], char **env) memset(command, 0, LONG_BUFFER); memset(buffer, 0, BUFFER); memset(awk, 0, BUFFER); - memset(iptables, 0, BUFFER); + memset(iptables, 0, BUFFER+(sizeof(IPTABLES))); + memset(iptables_check, 0, BUFFER+(sizeof(IPTABLES))); fp = NULL; fc = NULL; - - if (tp->tm_mday >= 10) { - if ((fp = popen(GE_10, "r")) == NULL) { - return 1; + + if (DEBISN_SYSTEM == check_system()) // Debian 系统规则 + { + if (tp->tm_mday >= 10) { + if ((fp = popen(GE_10, "r")) == NULL) { + perror("GE_10"); + return 1; + } + } else { + if ((fp = popen(LE_10, "r")) == NULL) { + perror("LE_10"); + return 1; + } } + } else if (CENTOS_SYSTEM == check_system()) // Centos 7系统规则 + { + if (tp->tm_mday >= 10) { + if ((fp = popen(CENTOS_GE_10, "r")) == NULL) { + perror("CENTOS_GE_10"); + return 1; + } + } else { + if ((fp = popen(CENTOS_LE_10, "r")) == NULL) { + perror("CENTOS_LE_10"); + return 1; + } + } + } else { - if ((fp = popen(LE_10, "r")) == NULL) { - return 1; - } + return UNKNOWN_SYSTEM; } - + while (fgets(buffer, BUFFER, fp) != NULL) { temp = strstr(buffer, "rhost"); sscanf(temp, "rhost=%s", temp); @@ -48,32 +263,107 @@ int main(int argc, char *argv[], char **env) strcat(splice_command, "\n"); } } - printf("%s", splice_command); // 测试没问题 - + printf("%s", splice_command); // 打印所有非法IP + // 拼接命令 sprintf(awk, AWK, TOP_IP); strcpy(command, "echo \""); strcat(command, splice_command); strcat(command, "\""); strcat(command, awk); - //printf("%s", command); // 测试没问题 - if ((fp = popen(command, "r")) == NULL) { // 执行命令 - perror("popen"); + + + if ((fp = popen(command, "r")) == NULL) // 执行命令 + { + perror("popen command"); return 1; } - while (fgets(buffer, BUFFER, fp) != NULL) { - buffer[strlen(buffer) - 1] = '\0'; // 去除回车 + + while (fgets(buffer, BUFFER, fp) != NULL) // 执行命令后, 为空时就不会 + { + + buffer[strlen(buffer) - 1] = '\0'; // 去除回车 sprintf(iptables, IPTABLES, buffer); - if ((fc = popen(iptables, "r")) == NULL) { - perror("popen"); - return 1; + sprintf(iptables_check, IPTABLES_CHECK, buffer); + + + if (0 != system(iptables_check)) // 判断是否存在规则, 不存在时再添加规则 + { + if (IS_DIND == 1) // 钉钉告警 + { + dingding_warning(buffer, public_ip); + sleep(3); + } + + if (IS_MAIL == 1) // 邮件告警 + { + mail_warning(buffer, public_ip); + sleep(3); + } + + if (IS_QQMAIL == 1) // 邮件告警 + { + QQ_mail_warning(buffer, public_ip); + sleep(3); + } + + if ((fc = popen(iptables, "r")) == NULL) { + perror("popen iptables"); + return 1; + } } } - pclose(fp); - pclose(fc); - - + if (fp != NULL) + pclose(fp); + + if (fc != NULL) + pclose(fc); + return 0; } + +static void sig_child(int signo) +{ + pid_t pid; + int stat; + // 处理僵尸进程 + while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) ; + + return; +} + +int main(int argc, char *argv[], char **env) +{ + memset(public_ip, 0, BUFFER); + get_public_ip(public_ip); + + + + signal(SIGCHLD, sig_child); // 创建捕捉子进程退出信号 + + + if (argv[1] != NULL && 0 == strcmp(argv[1], "-d")) + { + if (daemon(1, 1)) // 守护进程 + { + perror("daemon"); + return -1; + } + + while (1) { + rule(); + + sleep(TIME); + } + } + else + { + rule(); + } + + + return 0; +} + diff --git a/rhost.o b/rhost.o index 652b2dcf3ee0e82270041f060c5a33188da4cc73..ab1531c7cfed6ba4f92e9f567869b13bc332a7d2 100644 GIT binary patch literal 52280 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 I#9Ds;2R;~|FaQ7m literal 16176 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 dj|L$9NL^B&+;0r