首页 > 其他分享 >135端口DCERPC协议扫描主机

135端口DCERPC协议扫描主机

时间:2024-11-13 17:14:40浏览次数:3  
标签:osinfo ip args 端口 DCERPC list result 135 import

百度百科

135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够包括HTTP协议在内的多种网络传输。

135端口探测

通过DCERPC协议的ping附带NTLMSSP来获取到目标的版本号,主机名,域名,DNS等信息。

原项目地址

https://github.com/komomon/Dcerpc_Find_OSInfo

代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author:Komomon
# @Time:2022/5/27 17:32

'''
完整版
通过DCERPC+NTLMSSP探测目标主机信息

usage
python3 Dcerpc_Find_OSInfo.py -i 192.168.31
python3 Dcerpc_Find_OSInfo.py -i ip.txt
python3 Dcerpc_Find_OSInfo.py -i 192.168.1.1-192.168.2.2


'''
#域控原本IP
from base64 import b64encode
from argparse import ArgumentParser, FileType
from queue import Queue
from threading import Thread
import sys
import socket
import logging
import binascii, time

TIME_OUT = 3
RESULT_LIST = []
length = 0


def get_ip_list(ip) -> list:
    ip_list = []
    iptonum = lambda x: sum([256 ** j * int(i) for j, i in enumerate(x.split('.')[::-1])])
    numtoip = lambda x: '.'.join([str(int(x / (256 ** i)) % 256) for i in range(3, -1, -1)])
    if '-' in ip:
        ip_range = ip.split('-')
        ip_start = int(iptonum(ip_range[0]))
        ip_end = int(iptonum(ip_range[1]))
        ip_count = ip_end - ip_start
        if ip_count >= 0 and ip_count <= 65536:
            for ip_num in range(ip_start, ip_end + 1):
                ip_list.append(numtoip(ip_num))
        else:
            print('-i wrong format')

    elif '.txt' in ip:
        ip_config = open(ip, 'r')
        for ip in ip_config:
            ip_list.extend(get_ip_list(ip.strip()))
        ip_config.close()
    else:
        ip_split = ip.split('.')
        net = len(ip_split)
        if net == 2:
            for b in range(1, 255):
                for c in range(1, 255):
                    ip = "%s.%s.%d.%d" % (ip_split[0], ip_split[1], b, c)
                    ip_list.append(ip)
        elif net == 3:
            for c in range(1, 255):
                ip = "%s.%s.%s.%d" % (ip_split[0], ip_split[1], ip_split[2], c)
                ip_list.append(ip)
        elif net == 4:
            ip_list.append(ip)
        else:
            print("-i wrong format")

    return ip_list


def attribute_name(Target_Info_bytes):
    global length
    att_name_length = int.from_bytes(Target_Info_bytes[length + 2:length + 4], byteorder='little')
    att_name = Target_Info_bytes[length + 4:length + 4 + att_name_length].replace(b"\x00", b"").decode(
        encoding="unicode_escape")
    length = length + 4 + att_name_length
    return att_name


def send_packet(ip):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.settimeout(TIME_OUT)
        sock.connect((ip, 135))
        buffer_v1 = b"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x01\x00\x00\x00\xb8\x10\xb8\x10\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00\x00\x33\x05\x71\x71\xba\xbe\x37\x49\x83\x19\xb5\xdb\xef\x9c\xcc\x36\x01\x00\x00\x00"
        sock.send(buffer_v1)
        packet1 = sock.recv(1024)
        digit = "x86"
        if b"\x33\x05\x71\x71\xBA\xBE\x37\x49\x83\x19\xB5\xDB\xEF\x9C\xCC\x36" in packet1:
            digit = "x64"
        return digit
    except Exception as e:
        # print(e)
        return -1
    finally:
        sock.close()


def get_osinfo(ip):
    global length
    osinfo = {
        "NetBIOS_domain_name": "",
        "DNS_domain_name": "",
        "DNS_computer_name": "",
        "DNS_tree_name": "",
    }
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.settimeout(TIME_OUT)
        sock.connect((ip, 135))
        buffer_v2 = b"\x05\x00\x0b\x03\x10\x00\x00\x00\x78\x00\x28\x00\x03\x00\x00\x00\xb8\x10\xb8\x10\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\xa0\x01\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00\x0a\x02\x00\x00\x00\x00\x00\x00\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x07\x82\x08\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\xb1\x1d\x00\x00\x00\x0f"
        sock.send(buffer_v2)
        packet2 = sock.recv(4096)
        digit = send_packet(ip)
        OS_Version_bytes = packet2[int('0xa0', 16) - 54 + 10:int('0xa0', 16) - 54 + 18]
        Major_Version = int.from_bytes(OS_Version_bytes[0:1], byteorder='little')
        Minor_Version = int.from_bytes(OS_Version_bytes[1:2], byteorder='little')
        Build_Number = int.from_bytes(OS_Version_bytes[2:4], byteorder='little')
        NTLM_Current_Reversion = int.from_bytes(OS_Version_bytes[7:8], byteorder='little')
        OS_Verison = "Windows Version {0}.{1} Build {2} {3}".format(Major_Version, Minor_Version, Build_Number, digit)

        Target_Info_Length_bytes = packet2[int('0xa0', 16) - 54 + 2:int('0xa0', 16) - 54 + 4]
        Target_Info_Length = int.from_bytes(Target_Info_Length_bytes, byteorder='little')
        Target_Info_bytes = packet2[-Target_Info_Length:-4]  # 最后四个0x00000000
        print("[*] " + ip)
        print("\t[->]", "OS_Verison :", OS_Verison)
        for k in osinfo.keys():
            osinfo[k] = attribute_name(Target_Info_bytes)
            print("\t[->]", k, ":", osinfo[k])
        length = 0
        osinfo["OS_Verison"] = OS_Verison
        result = {ip: osinfo}
        return result
    except Exception as e:
        return -1
    finally:
        sock.close()


def worker(q):
    while True:
        try:
            data = q.get()
            result = get_osinfo(data)
            if result != -1:
                RESULT_LIST.append(result)
        except Exception as e:
            sys.stderr.write(str(e))
        finally:
            q.task_done()


def main():
    parser = ArgumentParser()
    parser.add_argument('-i', '--ip', help=u'IP Address', required=True)
    parser.add_argument('-t', '--threads', help=u'threads', default=20, type=int)
    parser.add_argument('-o', '--output', help=u'Output result', default='log.txt', type=FileType('a+'))

    args = parser.parse_args()
    if args.ip is None:
        print("Some Wrong.")
    q = Queue(args.threads)

    for _ in range(args.threads):
        t = Thread(target=worker, args=(q,))
        t.daemon = True
        t.start()

    ip_list = get_ip_list(args.ip)
    for i in ip_list:
        q.put(i)
    q.join()
    for osinfo_dict in RESULT_LIST:
        for ip in osinfo_dict.keys():
            args.output.write("[*] " + ip + "\n")
            for k, v in osinfo_dict[ip].items():
                args.output.write("\t[->] " + k + ":" + v + "\n")
        # print(osinfo_dict)


if __name__ == '__main__':
    main()

效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标签:osinfo,ip,args,端口,DCERPC,list,result,135,import
From: https://blog.csdn.net/qq_63451318/article/details/143748093

相关文章

  • 【STC8H】IO端口低功耗
    ①、不用的IO口禁止数字输入使能 默认情况下,所有引脚的数字输入是使能的,可能产生耗电的情况。我的引脚图里,有这些是没有使用的,因此需要设置为禁止数字输入使能。 ......
  • 2.2_内网IP&端口&密码抓取
    内网IP扫描ICMP命令Windowsfor/L%Iin(1,1,254)[email protected].%I|findstr"TTL=#windows"Linuxforkin$(seq1255);doping-c1192.168.99.$k|grep"ttl"|awk-F"[:]+"'{print$4}';done工具Nmap......
  • 乐维网管平台(六):如何正确管理设备端口
    一、什么是端口下联在网络环境中,端口下联是指网络设备(通常是交换机)的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备,其端口下联可以连接多种类型的终端设备,如计算机、服务器、IP电话等,也可以连接下级网络设备,如接入层交换机连接到汇聚层交换机。从物......
  • 「杂题乱刷2」CF1354E
    题目链接CF1354EGraphColoring(*2100)解题思路发现这个东西就是类似于二分图染色的东西。因为\(2\)只能和\(1,3\)链接。其余种类的点都不能连接。不妨把\(1,3\)都看成同一个点放到最后处理。那么我们就相当于是要找到一种方案使得选择每个联通快的黑点或白点,使得最......
  • STM32的端口引脚的复用功能及重映射功能解析
    STM32微控制器因其强大的外设功能和灵活的引脚复用能力而被广泛应用于嵌入式系统设计中。本文将详细介绍STM32的端口引脚复用功能和重映射功能,以及如何通过代码实现这些功能。端口引脚复用功能STM32的GPIO端口可以被复用为多种外设功能,如USART、SPI、I2C等。这种复用功能......
  • 135机型-初识
    NikonFE生产年代:1978年机型:35mm单反(35mm胶片非常有电影感)亮点:第一款将光电传感器直接集成到电路封装的相机上快门:电子快门,速度8秒到1/1000秒操作性:手动对焦,兼具A档和M档  OlympusPenFv/Ft生产年代:PenF-1963年9月,FT-1966年(内置测光表),FV-1967年(没有测光系统)......
  • 通过 SSH 隧道将本地端口转发到远程主机
    由于服务器防火墙,只开放了22端口,想要通过5901访问服务器上的远程桌面,可以通过下面的方式进行隧道转发。一、示例命令这条代码的作用是通过SSH创建一个本地端口转发,将你本地的端口(5901)通过加密的SSH隧道连接到远程服务器上的端口(5901)。这种方式通常用于在防火墙或......
  • Leetcode 每日一题 135.分发糖果
    问题描述给定一个整数数组ratings,表示一排孩子的评分。我们需要按照以下规则给孩子们分发糖果:每个孩子至少得到1个糖果。相邻两个孩子中,评分更高的孩子会得到更多的糖果。我们的目标是计算出按照这些规则分发糖果所需的最少糖果数。输入输出格式输入:一个整数数组 rating......
  • LeetCode LCR135[报数]
    题目链接LeetCodeLCR135[报数]详情实例题解思路通过pow函数对10进行幂运算,来获取报数范围然后循环遍历通过push_back方法将数字加入到容器内代码classSolution{public:vector<int>countNumbers(intcnt){vector<int>iRetVec;......
  • 解决mysql 的 [HY000][1356] View ‘information_schema.TABLES‘ references invalid
    同事在修改mysql用户权限时修改了关于mysql.infoschema的权限信息,导致无法访问information_schema库下的所有视图,使用数据库连接工具连接MySQL数据库时出现报错情况,使用MySQL终端登录并执行show命令同样报错。报错信息如下:ERROR1356(HY000):View'information_s......