一个基于Python+Go的端口扫描及服务探测脚本

portscan 一个基于 Python+Go 的端口扫描及服务探测脚本 0x00 前言 近期由于公司环境整改/迭代以及历史弱口令等撞库,运维同事将内网测试环境的一些 SSH 等敏感端口对外

本文包含相关资料包-----> 点击直达获取<-------

portscan

一个基于 Python+Go 的端口扫描及服务探测脚本

0x00 前言

近期由于公司环境整改/迭代以及历史弱口令等撞库,运维同事将内网测试环境的一些 SSH 等敏感端口对外,导致被挖矿团伙利用进行挖矿,虽然生产环境存在物理隔离,但仍存在极大安全风险,对此需要对所有用户进行端口对外开放监控。

0x01 确定方案

通过网上调研,发现滴滴安全应急响应中心发过一个相关的文章

需求基本一致,使用了下文章中提到的代码进行测试,可能我环境/带宽/目标等多种因素,导致测试之后发现并不理想,扫描速度慢且有时不稳定。

经过 GitHub、sourceforge、stackoverflow 等一番搜索及疯狂复制粘贴,完成了个勉强算的上的成品。

代码逻辑如下:

1.1 用户输入目标处理

```shell

单独IP/HOST

ip: 127.0.0.1 ip_list: 127.0.0.1

CIDR

ip: 127.0.0 ip_list: 127.0.0.1, 127.0.0.2, 127.0.0.3 ... 127.0.0.254

IP访问

ip: 127.0.0.1-127.0.0.20 ip_list: 127.0.0.1, 127.0.0.2, 127.0.0.3 ... 127.0.0.20

文件

ip: ip.txt ip_list: Same as above ```

1.2 目标存活探测

使用 ICMP 协议进行 ping 检测,使用的第三方库 pyping(该库不支持 python3,若要用 py3 需要自己转换下)

1.3 Go 脚本探测

编译 port_scan.go

shell go build -buildmode=c-shared -o portscan.so portscan.go

探测结果返回:

```

单个端口

94.191.42.58:22

多个端口

94.191.42.58:22, 9099 ```

1.4 nmap 指纹识别

根据 go 探测结果进行解析,分别使用 nmap 库进行服务识别

bash pip install python-nmap

返回结果:

shell 127.0.0.1:22/ssh 127.0.0.1:9999:unknown ...

1.5 Web service

若 nmap 结果返回为 http unknown sun-answerbook 等时,尝试连接获取 title

0x02 代码实现

2.1 用户输入处理

```python def get_ip_list(ip): ''' ip: 127.0.0.1 ip_list: 127.0.0.1

ip: 127.0.0
ip_list: 127.0.0.1, 127.0.0.2, 127.0.0.3 ... 127.0.0.254

ip: 127.0.0.1-127.0.0.20
ip_list: 127.0.0.1, 127.0.0.2, 127.0.0.3 ... 127.0.0.20

ip: ip.txt
ip_list: Same as above
'''
ip_list = []
iptonum = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
numtoip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])

pattern = re.compile(
    r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|'
    r'([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|'
    r'([a-zA-Z0-9][-_.a-zA-Z0-9]{0,61}[a-zA-Z0-9]))\.'
    r'([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})$'
    )

if '-' in ip:
    ip_range = ip.split('-')
    ip_start = long(iptonum(ip_range[0]))
    ip_end = long(iptonum(ip_range[1]))
    ip_count = ip_end - ip_start
    # print(ip_range,ip_start, ip_end, ip_count)
    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('wrong format')
elif '.txt' in ip:
    ip_file = open(ip, 'r')
    for ip in ip_file:
        ip_list.extend(get_ip_list(ip.strip()))
    ip_file.close()
elif pattern.match(ip):
    ip_list.append(ip)
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('wrong format')
return ip_list

```

2.2 目标存活探测

python def get_target_status(target): try: r = pyping.ping(target) if r.ret_code == 0: return True else: return False except: return False

2.3 Go 脚本探测

```python

lib = cdll.LoadLibrary(u'./portscan.so') lib.Scan.argtypes = [c_char_p] lib.Scan.restype = c_char_p

def run(ip): if get_target_status(ip): print("\033[32m[ * ] {} is alive\033[0m".format(ip)) ip = str(ip).encode("utf-8") temp_result = str(lib.Scan(ip)) print('\033[33mScan Result:{}\033[0m'.format(temp_result)) if ',' in temp_result: port_list = temp_result.split(':')[1].split(',') # print(port_list) port_num = len(port_list) if port_num > 30: print('Possible WAF/CND on target.') else: for i in range(len(port_list)): port = str(port_list[i]).strip() # print(port, int(port)) nmap_scan(ip=ip, port=int(port), arg="-sS -Pn --version-all --open -p") else: port_list = temp_result.split(':')[1] # print(port_list) nmap_scan(ip=ip,port=port_list,arg="-sS -Pn --version-all -p") else: print("\033[31m[ * ] {} is not alive\033[0m".format(ip)) ```

1.4 nmap 指纹识别

```python nm =nmap.PortScanner() def nmap_scan(ip,port,arg): try: ret = nm.scan(ip, arguments=arg+str(port)) # print(ret) service_name = ret['scan'][ip]['tcp'][int(port)]['name']

    if 'http' in service_name  or service_name == 'sun-answerbook' or 'unknown' in service_name:
        if service_name == 'https' or service_name == 'https-alt':
            scan_url = 'https://{}:{}'.format(ip,port)
            title = get_title(scan_url)
            service_name = '{}(title:{})'.format(service_name,title)
        else:
            scan_url = 'http://{}:{}'.format(ip,port)
            title = get_title(scan_url)
            service_name = '{}(title:{})'.format(service_name,title)

    print('\033[32m[ * ] {}:{}/{}\033[0m'.format(ip, port, service_name))

except nmap.nmap.PortScannerError:
    print("Please run -O method for root privileges")

```

1.5 Web service

python def get_title(scan_url): try: r = requests.get(scan_url,timeout=5, verify=False) r_detectencode = chardet.detect(r.content) # print(r_detectencode) actual_encode = r_detectencode['encoding'] response = re.findall(u'<title>(.*?)</title>', r.content, re.S) # print(response) if response == []: return None else: title = response[0].decode(actual_encode).decode('utf-8') # banner = r.headers['server'] return title except Exception as e: pass

0x03 运行效果

以 tx 云的一台 VPS 为例,全端口扫描 + 服务识别我测试的稳定在 40s 之内,还可以。但是有些 IP 不知什么情况会比较慢,还需进行优化。

go 代码就不放了,太烂了,完全 cv 拼凑的,若有兴趣可私聊讨论。

参考文章

https://medium.com/@KentGruber/building-a-high-performance-port-scanner-with-golang-9976181ec39d

https://github.com/golang/go/blob/master/src/cmd/cgo/doc.go

https://www.coder.work/article/202337

https://www.kancloud.cn/kancloud/web-application-with-golang/

https://www.yuyang.io/post/python-go-dynamic/

https://ejin66.github.io/2018/09/15/go-to-so-android.html

https://github.com/tkuebler/pyping

https://ixyzero.com/blog/archives/4171.html

参考文献

  • 互联网系统漏洞检测技术集成应用研究(贵州大学·庞晓康)
  • 互联网系统漏洞检测技术集成应用研究(贵州大学·庞晓康)
  • 基于IDEFO模型的云计算服务安全监测平台研究(华北电力大学(北京)·汪澄)
  • 基于Linux平台的网络入侵检测系统的设计与实现(华中科技大学·汪道周)
  • 基于静态分析的Go语言内存安全检测研究(西安石油大学·高潮)
  • 基于静态分析的Go语言内存安全检测研究(西安石油大学·高潮)
  • 文本综合处理平台的研究与实现(济南大学·王孟孟)
  • 基于PaaS的网络探测系统的设计与实现(山东大学·申小军)
  • 基于Python的非结构化数据检索系统的设计与实现(南京邮电大学·董海兰)
  • 基于深度学习的网络入侵检测系统的设计与实现(华中科技大学·晏子骏)
  • 基于PaaS的网络探测系统的设计与实现(山东大学·申小军)
  • 面向B/S系统的自动化测试框架设计与实现(中国海洋大学·高峰凯)
  • WEB GIS的JAVA解决方案研究(西南交通大学·石琴琴)
  • 基于Web应用安全扫描器的设计与实现(西北师范大学·段鹏飞)
  • 面向PC端恶意应用的自动化测试系统设计与实现(山东大学·杨岐晓)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计货栈 ,原文地址:https://m.bishedaima.com/yuanma/35930.html

相关推荐

  • 房屋租赁系统

    这是一个🔥🔥基于SpringBoot框架的房屋租赁系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于SpringBoot框架的教学辅助平台

    这是一套采用Java编程语言,基于SpringBoot框架构建的教育辅助系统源代码,开发过程中,我们运用了SpringBoot和Vue技术栈,同时支持Idea或Eclipse作为开发工具
    2024年05月23日
    3 1 2
  • 智闯鬼屋之Python

    智闯鬼屋 问题一 总体思路: 第一步 机器人猜想鬼所有可能的位置作为知识库 第二步 输入机器人的位置和寒意值,不断更新知识库 第三步 通过知识库来做决策
    2024年05月14日
    3 1 1
  • 基于Python密码的加密

    密码的加密 一,绪论 本章是全篇的绪论部分,首先描述了 DES 算法的整体研究背景并论述了加密技术的重大意义;其次在阅览大量中英文文献后针对当前国内外对于 DES 应用的研究现状做了综述;最后概括性地总结了本文的主要研究工作以及全篇的结构安排
    2024年05月14日
    1 1 1
  • 基于SSM框架的二手商品售卖网站、javaweb+maven

    在当前数字化时代,电子商务平台的发展已成为社会经济的重要组成部分,基于SSM框架的二手商品售卖网站,结合了JavaWeb技术和Maven构建工具,旨在实现一个高效,稳定的二手交易平台
    2024年05月07日
    31 1 6
  • 基于springboot的客户关系管理系统

    在当今数字化时代,客户关系管理系统(CRM系统)在企业管理中扮演着至关重要的角色,基于Spring Boot的CRM系统是一种现代化的解决方案,它利用了Spring Boot和MySQL等技术
    2024年05月07日
    4 1 1
  • 基于JSP和MySQL开发的酒店管理系统的设计与实现

    基于JSP和MySQL的酒店管理系统 1 开发背景 1,1 系统开发背景与意义 近年来随着生活水平的提高,人们会利用假期到全国各地旅游与消费,这促进了酒店业进入了一个快速发展的轨道
    2024年05月14日
    9 1 1
  • 基于JAVA的干部档案管理系统

    基于JAVA的干部档案管理系统 摘 要 当今,随着网络和信息技术的发展,各行各业都采用高效率的软件生产,办公,交流,管理,二十一世纪以来,随着互联网的快速发展
    2024年05月14日
    4 1 2
  • 编程训练系统

    这是一个🔥🔥基于SpringBoot框架的编程训练系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • JSP+Sqlserver实现威客任务平台(源码+论文)

    这是一个🔥🔥JSP+Sqlserver实现威客任务平台🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 威客任务平台开发技术栈为JSP项目,可以作为毕业设计课程设计作业基于jsp+servlet+sqlserver实现一个威客众包任务平台
    2024年05月23日
    6 1 2

发表回复

登录后才能评论