在网络运维与网络安全领域,Telnet协议作为一款经典的远程登录协议,曾广泛应用于设备远程管理,但因其明文传输的致命缺陷,如今成为了网络安全的薄弱环节。而Telnet暴力破解工具,正是依托这一协议的漏洞实现功能的特殊程序,接下来我们将从含义、原理、设计思路到相关知识点,全面拆解这款工具。
一、 什么是Telnet暴力破解工具(核心含义)
首先要明确两个前提:一是Telnet协议的特性——它在传输账号、密码及后续指令时均不进行加密处理,所有数据以明文形式在网络中传输,且很多老旧设备、嵌入式设备仍默认开启Telnet服务并使用简单默认密码;二是暴力破解的核心逻辑——枚举法,即批量尝试所有可能的验证组合,直到匹配成功。
基于这两个前提,Telnet暴力破解工具本质上是一款自动化程序:它预先存储大量常用的Telnet账号密码组合,通过并发连接技术批量对接目标Telnet服务,自动尝试账号密码登录,最终筛选出可成功登录的目标设备及对应凭证,同时具备超时管理、蜜罐识别、结果持久化等辅助功能。
需要特别强调的是,这款工具具有双重属性:合法用途是运维人员批量检测自身设备的Telnet弱密码漏洞,及时加固防护;非法用途是未经授权攻击他人设备,窃取控制权或植入恶意程序,这违反《网络安全法》等相关法律法规,需坚决抵制。
二、 核心代码实现原理
结合提供的代码,我们可以将工具的实现原理拆解为7个核心模块,每个模块都对应着工具的关键功能:
...
typedef struct
{
char *username, *password;
int username_len, password_len;
} Combo;
extern int cindex;
extern Combo *combos;
void combo_add(char *, char *);
void combos_init(void);
...
void start_connection(char *, Brute *);
void check_connection(int, int);
void disconnect(Brute *);
void *watch_time();
int check_honeypot(Brute *);
typedef struct
{
enum
{
BR_IACS,
BR_USERNAME,
BR_PASSWORD,
BR_SEND_ENABLE,
BR_SEND_LSHELL,
BR_SEND_SYSTEM,
BR_SEND_SH,
BR_SEND_BUSYBOX,
BR_WAITING_TOKEN_RESP
} stage;
Combo *auth;
int fd, rdbuf_pos, last_recv;
char rdbuf[RDBUF_SIZE], address[16];
uint8_t tries;
} Brute;
Brute *bruter;
void control_epoll(int, int, uint32_t);
...
typedef struct
{
int queued;
char address[16];
} Queue;
Queue *queue;
void *handle_queued();
void bruter_queue_ip(char *);
...
int check_password_resp(Brute *);
int check_login_resp(Brute *);
...
int main(int argc, char **argv)
{
...
if(argc != 2)
{
printf("Error Invalid Amount of Arguements\nExample: %s 1\n", argv[0]);
exit(0);
}
char rdbuf[16];
int threads = atoi(argv[1]);
pthread_t rec[threads], thread_writer[3];
tport = htons(23);
epfd = epoll_create1(0);
bruter = calloc(MAX_CONS, sizeof(Brute));
queue = calloc(999999, sizeof(Queue));
combos_init();
pthread_mutex_init(&mutex, NULL);
pthread_create(&thread_writer[0], NULL, &writer_init, NULL);
pthread_create(&thread_writer[1], NULL, &watch_time, NULL);
pthread_create(&thread_writer[2], NULL, &handle_queued, NULL); // handle_queued()
pthread_create(&rec[0], NULL, &epoll_thread, NULL);
while(1)
{
memset(rdbuf, 0, 16);
if(fgets(rdbuf, 16, stdin) == NULL)
break;
remove_newline(rdbuf);
if(strlen(rdbuf))
{
if(processing < ACTUAL_MAX_CONS)
start_connection(rdbuf, NULL);
else
bruter_queue_ip(rdbuf);
ATOMIC_INC(&processed);
}
}
for(int i = 1; i < threads; i++)
pthread_create(&rec[i], NULL, &epoll_thread, NULL);
printf("Finished Reading\n");
while(1)
sleep(1);
return 0;
}
If you need the complete source code, please add the WeChat number (c17865354792)
测试方式1:简单单IP测试(优先验证工具能否正常运行)
这种方式适合先验证工具是否可用,无需依赖zmap,直接手动输入目标IP(必须是你自己拥有权限的设备,比如本地虚拟机、自己的嵌入式设备,非法测试他人设备违法)。
步骤:
- 进入工具目录(已在目录下可跳过)
cd ./telnet-bruter/ - 运行工具,指定线程数(
<threads>替换为具体数字,如4、8、16,建议先选小线程数测试,比如4)./telnet-bruter 4 - 工具启动后,会进入实时统计界面(每秒打印处理数、失败数等信息),此时手动输入你自己的目标IP(比如本地开启Telnet服务的设备IP:192.168.1.100),输入后按回车即可
# 示例输入(替换为你的合法IP) 192.168.1.100 - 工具会自动发起连接,尝试预设的默认账号密码组合,你可以实时在终端(stdout)看到运行状态
- 查看结果:
- 实时结果:终端会打印「Found Deivce」(破解成功)或「Honeypot Found」(识别到蜜罐)
- 持久化结果:运行后会在当前目录生成两个文件
bruted.txt:存储破解成功的IP、端口、账号密码(格式:IP:23 用户名:密码)honeypots.txt:存储识别到的蜜罐设备信息
- 停止工具:按
Ctrl + C即可终止运行
###测试方式2:批量IP测试(对应你提供的zmap命令)
这种方式是批量扫描开放23端口(Telnet默认端口)的IP,并自动进行暴力破解,依赖zmap(高速端口扫描工具)。
步骤:
- 先安装zmap
- Ubuntu/Debian系统
sudo apt update && sudo apt install zmap -y - CentOS/RHEL系统
sudo yum install zmap -y
- Ubuntu/Debian系统
- 执行你提供的批量扫描命令(替换
<threads>为具体线程数,如8)zmap -p 23 | ./telnet-bruter 8 - 命令解释(帮你理解背后逻辑):
zmap -p 23:zmap会高速扫描网络中开放23号端口(Telnet端口)的IP地址|:管道符,将zmap扫描到的开放23端口的IP,直接传递给后面的telnet-bruter工具./telnet-bruter 8:工具以8个线程,批量处理zmap传递过来的IP,自动进行暴力破解
- 运行与结果查看:
- 工具会后台自动处理批量IP,终端实时打印统计信息
- 结果同样会写入
bruted.txt和honeypots.txt文件,可在工具运行中或停止后查看
- 停止工具:按
Ctrl + C即可终止zmap和telnet-bruter的运行
1. 预设弱密码组合库:暴力破解的“弹药库”
暴力破解的基础是有足够多的账号密码组合,代码中的combos_init()函数就是这个“弹药库”的初始化入口,它通过combo_add()函数预设了几十种常用弱密码(如root/root、admin/admin、root/123456等)。
这些组合会被存储在Combo结构体数组中,结构体不仅记录了用户名和密码的明文,还记录了两者的长度(username_len、password_len),方便后续网络传输时精准控制数据长度,避免冗余传输。这个模块的设计逻辑很简单:利用大多数用户/运维人员不修改默认密码的惯性,提高破解成功率。
2. 多线程并发:提升破解效率的“发动机”
工具采用POSIX线程(pthread)实现多任务并行,不同线程各司其职,避免单一任务阻塞影响整体流程,这是提升破解效率的关键:
writer_init线程:负责实时打印运行统计信息(已处理IP数、并发连接数、失败数、成功数等),方便使用者掌握工具运行状态;watch_time线程:负责超时连接检测,避免无效连接占用资源;handle_queued线程:负责待连接IP队列的处理,实现“先排队、后处理”;epoll_thread线程:核心网络事件处理线程,负责对接Telnet服务、发送账号密码及接收响应。
多线程的分工设计,让工具在处理海量IP时,既能保证高并发,又能维持稳定运行。
3. epoll高性能I/O:支撑海量并发的“核心骨架”
代码中使用了Linux下的epoll机制(epoll_create1、epoll_wait、control_epoll函数),这是实现海量并发连接的核心技术。
相比传统的select/poll机制,epoll采用事件驱动模式,无需每次遍历所有连接,只需处理有事件触发(如可读、可写)的连接,CPU资源占用极低,能轻松支撑数万个并发Telnet连接(代码中MAX_CONS设为99999,实际并发上限ACTUAL_MAX_CONS设为30000)。简单来说,epoll让一个线程就能“看管”成千上万个Telnet连接,这是工具高性能的核心保障。
4. 原子操作:保证并发安全的“防护锁”
代码中定义了ATOMIC_ADD、ATOMIC_INC等宏(基于GCC内置__sync_fetch_and_add函数),这是原子操作的实现。
为什么需要原子操作?因为多线程会同时修改同一个全局变量(如processed、failed、found等统计变量,processing并发连接数变量),如果不用原子操作,会出现“竞态条件”(比如两个线程同时给failed加1,最终结果只加了1,导致统计数据错误)。原子操作的优势是无需频繁加锁(比互斥锁效率高),能保证变量修改的“不可分割性”,确保多线程环境下数据的准确性。
5. 超时管理:释放无效资源的“清洁工”
watch_time线程每隔1秒遍历所有已建立的连接,对比当前时间和连接的最后一次接收数据时间(last_recv),如果时间差超过预设超时时间(TIMEOUT=30秒),就会调用disconnect函数关闭该连接,并将failed计数加1。
这个模块的作用是及时清理无效连接,避免这些连接占用文件描述符和网络资源,保证工具长时间运行不会因为资源耗尽而崩溃。
6. 登录验证与蜜罐识别:判断结果的“裁判”
工具通过两个核心函数实现登录结果判断,还内置了蜜罐识别功能,避免攻击到陷阱设备:
check_login_resp函数:通过查找服务端响应数据中的关键词(如“sername”“ogin”“assword”,对应“Username”“Login”“Password”),判断是否需要发送用户名或密码,实现登录流程的自动化切换;check_password_resp函数:一是查找“ncorrect”“ailed”等错误提示,判定登录失败;二是查找“:”“>”“$”“#”等命令行提示符,判定登录成功(这些符号代表已获取设备控制台权限);check_honeypot函数:通过查找响应数据中的“richard”关键字,识别蜜罐设备,避免工具的攻击行为被蜜罐捕获和溯源。
7. 队列缓冲与结果持久化:保证稳定性与可追溯性
- 队列缓冲:当并发连接数达到上限时,
bruter_queue_ip函数会将目标IP存入队列,等待后续并发数有空余时再处理,避免IP丢失,实现“缓冲”效果; - 结果持久化:登录成功后,
write_to_file函数会将目标IP、端口、账号密码写入bruted.txt文件;识别到蜜罐后,会写入honeypots.txt文件,方便使用者后续查看和使用结果。
三、 设计思路与流程架构
这款工具的整体设计理念是:以高性能并发为核心,兼顾稳定性、易用性和可追溯性,所有模块都围绕这个理念展开,其整体流程架构可通过以下步骤清晰呈现:
1. 简易文字流程图
初始化阶段 → 输入与排队阶段 → 并发连接与暴力破解阶段 → 统计与持久化阶段 → 循环运行阶段
2. 各阶段详细拆解
(1) 初始化阶段:做好前期准备
- 加载“弹药库”:调用
combos_init()初始化账号密码组合库; - 初始化核心组件:创建
epoll实例、互斥锁、Brute结构体数组(存储连接信息)、IP队列(存储待连接IP); - 启动工作线程:创建统计线程、超时检测线程、队列处理线程、epoll网络线程,所有线程进入循环等待状态,随时准备工作。
(2) 输入与排队阶段:接收目标并分流
- 读取目标IP:从标准输入读取目标IP,调用
remove_newline函数去除换行符,避免格式错误; - 并发数判断:
- 若当前并发连接数(
processing)小于上限(ACTUAL_MAX_CONS):直接调用start_connection发起Telnet连接; - 若已达上限:调用
bruter_queue_ip将IP存入队列,等待后续处理;
- 若当前并发连接数(
- 统计更新:递增
processed变量,记录已处理的IP总数。
(3) 并发连接与暴力破解阶段:核心执行流程
- 队列消费:
handle_queued线程循环检测,当并发数有空余时,从队列取出IP发起连接; - epoll事件处理:
epoll_thread线程监听网络事件,按阶段执行操作:
- 连接建立(EPOLLOUT事件):进入Telnet协议协商阶段(BR_IACS),处理IAC协议交互,完成连接初始化;
- 接收响应(EPOLLIN事件):按破解阶段依次执行操作:
- 用户名阶段:检测到登录提示,发送预设用户名,切换到密码阶段;
- 密码阶段:检测到密码提示,发送对应密码,切换到命令发送阶段;
- 命令阶段:依次发送
enable、linuxshell等命令,尝试获取系统控制权; - 结果判断:判定登录失败/成功/蜜罐,更新对应统计变量,关闭连接并释放资源;
- 超时清理:
watch_time线程循环检测,及时关闭超时无效连接。
(4) 统计与持久化阶段:输出与保存结果
- 实时统计:
writer_init线程每秒打印一次运行状态,方便使用者监控; - 结果保存:登录成功或识别蜜罐后,将结果写入对应文件,实现持久化存储,方便后续查看。
(5) 循环运行阶段:持续工作
工具会一直循环读取输入IP、处理队列、维持并发连接,直到使用者手动停止程序,保证对海量目标IP的持续处理能力。
四、 相关领域核心知识点总结
这款工具涉及软件开发和网络安全两大领域的多个核心知识点,这些知识点不仅是工具实现的基础,也是相关领域的重点内容:
1. 软件开发领域核心知识点
- POSIX多线程编程:掌握线程创建、互斥锁使用、任务解耦,是实现高并发程序的基础;
- Linux高性能I/O(epoll):I/O多路复用的核心技术,适用于网络扫描、即时通讯、服务器等海量并发场景;
- 原子操作:解决多线程竞态问题的高效方案,相比互斥锁,在简单计数场景下效率更高;
- 生产者-消费者模型:通过队列实现任务缓冲,解决生产速度与消费速度不匹配的问题,提升程序稳定性;
- 动态内存管理:使用
calloc、realloc、free函数管理动态内存,保证内存有序分配与释放。
2. 网络安全领域核心知识点
- Telnet协议漏洞:明文传输是其最大安全隐患,现已被SSH(加密传输)替代,运维中应尽量禁用Telnet服务;
- 暴力破解原理:基于枚举法的攻击手段,不仅适用于Telnet,还适用于SSH、FTP、网页登录等各类验证场景;
- 弱密码防护:默认密码、简单密码是暴力破解的主要突破口,防护核心是使用复杂密码、定期修改密码、禁用默认账号;
- 蜜罐技术:一种网络安全防御手段,通过模拟脆弱设备诱捕攻击者,记录攻击行为,为安全防护提供参考;
- 网络攻击与合规:未经授权使用暴力破解工具攻击他人设备属于违法行为,需坚守网络安全合规底线。
五、 总结
Telnet暴力破解工具是“技术特性”与“人为漏洞”结合的产物:它依托Telnet协议的明文传输漏洞,利用多线程、epoll等高性能技术,实现了对弱密码设备的批量破解。从技术角度看,它的设计思路清晰、模块分工明确,是学习高并发网络编程的典型参考案例;从安全角度看,它提醒我们:网络安全的核心不仅是技术防护,更在于人为的安全意识——修改默认密码、禁用不安全协议、使用复杂密码,才能从根源上抵御这类暴力破解攻击。
同时,我们必须明确:技术本身无善恶,关键在于使用者的立场。将这款工具用于自身设备的安全检测,是提升运维安全的有效手段;若用于非法攻击,则会触犯法律,承担相应的刑事责任。
Welcome to follow WeChat official account【程序猿编码】
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/chen1415886044/article/details/156432298



