python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器
目录
1 2 3 | FTP弱口令扫描器 简单端口扫描器 |
参考:
https://blog.csdn.net/rebelqsp/article/details/22109925
https://www.aliyun.com/jiaocheng/434055.html?spm=5176.100033.2.10.3571581eheCuHX
FTP弱口令扫描器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # Ftp匿名扫描器的实现,需要使用FTP这个类 # Ftp这个类实现了Ftp客户端的大多数功能,比如连接Ftp服务器、查看服务器中的文件、上传、下载文件等功能, import ftplib import time import argparse #FTP匿名登录扫描 # 首先用主机名构造了一个Ftp对象(即ftp),然后用这个ftp调用不带任何参数的login()函数即表示要匿名登录这个Ftp服务器,如果登录过程中没有产生异常,则表明匿名登录成功,否则匿名登录失败! def anonScan(hostname): #参数是主机名 try : with ftplib.FTP(hostname) as ftp: #创建Ftp对象 ftp.login() #Ftp匿名登录 print ( '\n[*] ' + str (hostname) + " FTP Anonymous login successful!" ) #不抛出异常则表明登录成功 return True except Exception as e: #抛出异常则表明匿名登录失败 print ( '\n[-] ' + str (hostname) + " FTP Anonymous logon failure!" ) return False # FTP弱口令扫描==暴力破解 # Ftp弱口令的扫描依赖于用户名和密码字典,我们的实验环境中会提供 pwd.txt 作为密码字典,字典的格式如下图所示: # 用户名:密码 # 循环从字典中读取用户名和密码并尝试登陆,登陆成功则表明找到用户名和密码。由于这个函数将主机名定义成了可以用“,”分割的字符串。找到密码并不会终止程序,而是会继续扫描其他主机的弱口令,直到所有的主机都扫描一遍。 def vlcLogin(hostname, pwdFile): #参数(主机名,字典文件) try : with open (pwdFile, 'r' ) as pf: #打开字典文件 for line in pf.readlines(): #循环读取字典文件中的每一行 time.sleep( 1 ) #等待1秒 userName = line.split( ':' )[ 0 ] #从读取的内容中取出用户名 passWord = line.split( ':' )[ 1 ].strip( '/r' ).strip( '/n' ) #从读取的内容中取出密码 print ( '[+]' + str (hostname) + ':Trying: ' + userName + ':' + passWord) try : with ftplib.FTP(hostname) as ftp: #以主机名为参数构造Ftp对象 ftp.login(userName, passWord) #使用读取出的用户名密码登录Ftp服务器 #如果没有产生异常则表示登录成功,打印主机名、用户名和密码 print ( '[*] ' + str (hostname) + ' FTP Login successful: ' + userName + ':' + passWord) return (userName, passWord) except Exception as e: # 产生异常表示没有登录成功,这里我们不用管它,继续尝试其他用户名、密码 pass print ( "破解失败" ) except IOError as e: print ( 'Error: the password file does not exist!' ) print ( '[-] Cannot crack the FTP password, please change the password dictionary try again!' ) return ( None , None ) def main(): parser = argparse.ArgumentParser(description = 'FTP Scanner' ) # 添加-H命令dest可以理解为咱们解析时获取-H参数后面值的变量名,help是这个命令的帮助信息 parser.add_argument( '-H' , dest = 'hostName' , help = 'The host list with ","space' ) parser.add_argument( '-f' , dest = 'pwdFile' , help = 'Password dictionary file' ) options = None try : options = parser.parse_args() except : print (parser.parse_args([ '-h' ])) ip = str (options.hostName) pwdFile = str (options.pwdFile) if anonScan(ip): pass else :vlcLogin(ip,pwdFile) if __name__ = = '__main__' : main() |
简单端口扫描器
1 2 | 这里使用多线程的操作是很有必要的。这里,一个很自然的思路就是为每一个端口单独开一个线程进行扫描。 所以你也可以将需要扫描的端口列表定为从Nmap中得到的前 1000 个使用频率最高的端口,例如下面:<br>port_list = [ 1 , 3 , 6 , 9 , 13 , 17 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 30 , 32 , 37 , 42 , 49 , 53 , 70 , 79 , 80 , 81 , 82 , 83 , 84 , 88 , 89 , 99 , 106 , 109 , 110 , 113 , 119 , 125 , 135 , 139 , 143 , 146 , 161 , 163 , 179 , 199 , 211 , 222 , 254 , 255 , 259 , 264 <br>, 280 , 301 , 306 , 3 ] |
1 2 3 | 对于一个给定的ip地址,扫描的过程是这样的: 1. 每一个端口创建一个线程,添加到线程列表 2. 利用connect_ex函数对该(ip,port)进行连接操作。 <br> 3. 调用thread.start()和thread.join()方法,使扫描的子线程开始工作并且命令主线程等待子线程死亡后再结束。<br> 4. 重复这个过程直到所有的端口都被扫描过。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import socket, time, threading socket.setdefaulttimeout( 3 ) def socket_port(ip,port): """ 输入IP和端口号,扫描判断端口是否开放 """ try : if port> = 65535 : print ( '端口扫描结束' ) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = s.connect_ex((ip,port)) #返回值为0则表示端口open if result = = 0 : print (ip + ':' ,port, '端口开放' ) s.close() # except : print ( '端口扫描异常' ) def ip_scan(ip,thread_list): """ 输入IP,扫描IP的0-65534端口情况 """ try : print ( '开始扫描 %s' % ip) start_time = time.time() for i in range ( 0 , 65534 ): t = threading.Thread(target = socket_port,args = (ip,i)) t.start() thread_list.append(t) for thread in thread_list: thread.join() print ( '扫描端口完成,总共用时 :%.2f' % (time.time() - start_time)) except : print ( '扫描ip出错' ) if __name__ = = '__main__' : ip = input ( 'Input the ip you want to scan:\n' ) thread_list = [] lock = threading.Lock() ip_scan(ip,thread_list) |
分类:
Socket
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?