<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络协议 on 嘴强黑客 /pbuff07</title><link>https://pbuff07.github.io/categories/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/</link><description>Recent content in 网络协议 on 嘴强黑客 /pbuff07</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 21 Jul 2024 13:56:01 +0800</lastBuildDate><atom:link href="https://pbuff07.github.io/categories/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>Nmap服务识别过程</title><link>https://pbuff07.github.io/posts/2025-03-28-nmap%E6%9C%8D%E5%8A%A1%E8%AF%86%E5%88%AB%E8%BF%87%E7%A8%8B/</link><pubDate>Sun, 21 Jul 2024 13:56:01 +0800</pubDate><guid>https://pbuff07.github.io/posts/2025-03-28-nmap%E6%9C%8D%E5%8A%A1%E8%AF%86%E5%88%AB%E8%BF%87%E7%A8%8B/</guid><description>&lt;p&gt;了解Nmap的服务识别前先简单介绍下默认配置扫描，如下nmap会对80/443发TCP包探测是否存活除非你指定了-Pn参数默认认可主机是存活的就不会给80/443发包，而是直接使用你指定的参数进行探测。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmap xxx.xxx.xxx.xx -p port
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmap xxx.xxx.xxx.xx -p port -Pn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设你是用-sS -Pn参数指定发起一个TCP SYN扫描且默许远程IP主机存活，nmap会直接发起SYN数据包，如果对方有回应就会回复SYN+ACK数据包（如下图所示）。&lt;/p&gt;
&lt;p&gt;一般来说你没指定-sT进行全连接扫描的话nmap就会发出一个RST数据包中断响应了（因为端口通不通、主机存活与否都可以确认了）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250311185533519.png" alt="image-20250311185533519"&gt;&lt;/p&gt;
&lt;p&gt;那怎么匹配出27017端口就是mongodb服务的呢？&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250311185845017.png" alt="image-20250311185845017"&gt;&lt;/p&gt;
&lt;p&gt;nmap的文件目录下有一个nmap-services文件，该文件存储了端口-服务的映射关系和一个评分，评分是依据历史数据计算出来所属服务的可能性，值越接近1说明可能性越大。&lt;/p&gt;
&lt;p&gt;那么大概知道了因为我们-sS扫描（TCP）加上端口又是27017，所以对应的服务识别成mongodb就很正常了（此处我改成了mongod22做测试）。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250311190059728.png" alt="image-20250311190059728"&gt;&lt;/p&gt;
&lt;p&gt;总的来说这种基于端口+协议方式来识别服务只能说是做参考，要根据特定的探针和响应精准确定服务这样肯定是不行的，当然nmap也是支持的。&lt;/p&gt;
&lt;p&gt;当我们使用了-sV参数的时候，nmap会从nmap-service-probes文件中获取端口可能的探针文件（probe）并作为raw_data发送到服务器，根据服务器的响应来match准确的服务信息、系统信息和版本信息。&lt;/p&gt;
&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;**Probe TCP mongodb：**表示TCP协议，最终的service识别成mongodb，其中探针数据就是q|xxx|中的内容&lt;/p&gt;
&lt;p&gt;**rarity：**表示的该探针的稀缺性，控制探针的扫描优先级，和nmap-services中的评分相反，值越低表示探测常见服务，值越高反而是冷门服务&lt;/p&gt;
&lt;p&gt;**ports：**表示哪些端口会应用这个探针&lt;/p&gt;
&lt;p&gt;**match：**表示对响应内容的匹配，后面还有一些p/xx/ v/xx/ cpe:/xxx/用于匹配具体的组件信息、操作系统等信息&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250311191034868.png" alt="image-20250311191034868"&gt;&lt;/p&gt;
&lt;p&gt;添加-sV参数可以通过Wireshark看到确实三次握手后调用了探针内的内容作为数据发送并获取了对端响应。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250311191925461.png" alt="image-20250311191925461"&gt;&lt;/p&gt;</description></item><item><title>Nmap简单UDP探测</title><link>https://pbuff07.github.io/posts/2024-03-19-nmap%E5%8F%91%E7%94%9F%E4%B8%80%E6%AC%A1%E7%AE%80%E5%8D%95%E7%9A%84udp%E6%8E%A2%E6%B5%8B/</link><pubDate>Tue, 19 Mar 2024 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2024-03-19-nmap%E5%8F%91%E7%94%9F%E4%B8%80%E6%AC%A1%E7%AE%80%E5%8D%95%E7%9A%84udp%E6%8E%A2%E6%B5%8B/</guid><description>&lt;p&gt;Nmap进行TCP/UDP扫描，其中有一些参数经常记不住比如-sS/sT/sA/sW/sM，好好看下说明其实老外写的东西挺好理解的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sS TCP SYn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sT TCP Connect()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sA TCP ACK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sW TCP Window
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sU UDP Scan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;发生一次UDP扫描最简单的就是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmap xxx.xxx.xxx.xxx -sU -p port
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250310223321727.png" alt="image-20250310223321727"&gt;&lt;/p&gt;
&lt;p&gt;Wireshark看下发包过程，发现并不是直接发送UDP数据包，而是在UDP数据包之前伴随着ICMP数据包和TCP数据包。&lt;/p&gt;
&lt;p&gt;**ICMP：**问了AI是因为nmap默认使用ICMP数据确认主机是否存活，可以看到一开始发送了两个ICMP数据包（编号1和4），一个是Echo一个是Timestamp（具体是什么后面再说）然后服务端也响应了了ICMP的reply数据包（编号5和7）。&lt;/p&gt;
&lt;p&gt;**TCP：**也是问了AI说是默认nmap会用TCP协议去确认80/443端口的服务（编号2和3），一方面确认是否主机存活，另一方面有助于获取更多主机的测绘信息，但是很明显不是完整的TCP扫描（没有最基本的三次握手）而且均被服务器响应RST数据包停止了（编号6和8），说明80/443或许根本就没有开放。&lt;/p&gt;
&lt;p&gt;**UDP：**编号19和21是客户端真实想要的UDP数据包，但一般UDP数据包没有响应回包，此处就是。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250310223643693.png" alt="image-20250310223643693"&gt;&lt;/p&gt;
&lt;p&gt;简单说说ICMP协议（Internet Control Message Protocal = 互联网控制消息协议），ICMP协议不传输应用数据，只用于通信正常与否的管理。&lt;/p&gt;
&lt;p&gt;常用的ping命令就是用的ICMP协议（通过评估Echo请求包和响应包中的参数来分析网络故障），同时也有ICMP Flood攻击通过伪造大量的ping请求（Echo包）耗尽服务器资源。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20250310225311722.png" alt="image-20250310225311722"&gt;&lt;/p&gt;</description></item><item><title>Nse脚本编写基础</title><link>https://pbuff07.github.io/posts/2023-11-12-nse%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/</link><pubDate>Sun, 12 Nov 2023 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2023-11-12-nse%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/</guid><description>&lt;h4 id="nmap-nse脚本"&gt;nmap nse脚本&lt;/h4&gt;
&lt;p&gt;Nmap Scripting Engine（NSE）是Nmap的脚本引擎，用Lua编写，可以扩展Nmap的功能。之前用nmap扫端口的时候发现有一些内置脚本挺好用的，比如http-title可以直接拿到网站标题，就想着自己写几个试试。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用法&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sC	全部脚本，运行default类别的脚本
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--script 指定脚本，如 --script http-title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--script-args	指定脚本参数，如 --script-args &amp;#39;user=admin,pass=123456&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--scripts-args-file	从文件读取脚本参数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--script-trace	调试开发，显示脚本执行过程中的输出
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--script-updatedb	更新脚本数据库
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;类别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过脚本中categories = {}来说明，有auth、broadcast、brute、default、discovery、dos、exploit、external、fuzzer、intrusive、malware、safe、version和vuln&lt;/p&gt;
&lt;p&gt;常用的几个类别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auth：鉴别认证绕过相关&lt;/li&gt;
&lt;li&gt;brute：暴力破解&lt;/li&gt;
&lt;li&gt;discovery：信息收集&lt;/li&gt;
&lt;li&gt;safe：对目标影响较小的脚本&lt;/li&gt;
&lt;li&gt;intrusive：可能影响目标服务的脚本&lt;/li&gt;
&lt;li&gt;vuln：漏洞检测&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;参考链接：https://nmap.org/book/nse-usage.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;运行阶段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;prerule：在扫描所有目标前进行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;在目标主机上执行一些预扫描任务，以确定要应用的脚本集合。这些脚本可用于发现可利用的服务和漏洞，以及为后续扫描选择最佳的脚本。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;postrule：在扫描所有目标后运行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;在完成端口扫描和主机扫描之后，执行额外的任务，如输出结果的整理、报告生成、服务指纹识别、漏洞验证等。这些脚本可以在扫描结束后对收集到的数据进行进一步处理和分析。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;hostrule：Nmap 对目标主机执行主机发现、端口扫描、版本检测和操作系统检测后，扫描过程中运行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;对目标主机进行更全面的扫描，包括操作系统检测、探测已开放端口关联的服务和配置等。这些脚本可以提供更详细的主机信息，帮助进行目标环境的评估和漏洞分析。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;portrule：扫描中扫到特定端口上面的服务的时候运行（service rule）如果主机的 Web 服务器在多个端口上运行，则这些脚本可能会运行多次（每个端口一个）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;在端口级别对目标主机进行扫描，根据特定的脚本策略来选择要执行的脚本。这些脚本可以用于识别目标主机上开放的端口、服务版本信息和其他相关的网络特征。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可通过get_script_args获取命令行传入的参数或直接使用生成的lua table（nmap.registry.args）&lt;/p&gt;
&lt;p&gt;命令：nmap localhost -p 7848 &amp;ndash;script test.nse &amp;ndash;script-args &amp;lsquo;user=admin&amp;rsquo;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local shortport &lt;span style="color:#f92672"&gt;=&lt;/span&gt; require &lt;span style="color:#e6db74"&gt;&amp;#34;shortport&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local stdnse &lt;span style="color:#f92672"&gt;=&lt;/span&gt; require &lt;span style="color:#e6db74"&gt;&amp;#34;stdnse&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;author &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;pbuff07&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;license &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Same as Nmap--See https://nmap.org/book/man-legal.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- 扫描指定端口会调用action
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;portrule &lt;span style="color:#f92672"&gt;=&lt;/span&gt; shortport.port_or_service&lt;span style="color:#f92672"&gt;(&lt;/span&gt;7848&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;categories &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;discovery&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;safe&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local arg_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; stdnse.get_script_args&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; or &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- 扫描主机过程中会调用action
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hostrule &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- 扫描主机完成后会调用action
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postrule &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- 扫描主机前进行预检查会调用action
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prerule &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;action &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;host, port&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print&lt;span style="color:#f92672"&gt;(&lt;/span&gt;arg_path&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本格式&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>TCP协议基础</title><link>https://pbuff07.github.io/posts/2022-05-14-tcp%E5%8D%8F%E8%AE%AE%E5%9F%BA%E7%A1%80/</link><pubDate>Sat, 14 May 2022 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2022-05-14-tcp%E5%8D%8F%E8%AE%AE%E5%9F%BA%E7%A1%80/</guid><description>&lt;p&gt;&lt;strong&gt;tcp协议基本连接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;三次握手和四次挥手&lt;/p&gt;
&lt;p&gt;我通过执行&lt;code&gt;curl http://74.121.150.28&lt;/code&gt;捕获的WireShark数据来分析tcp协议的基本连接过程，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20251117234728404.png" alt="image-20251117234728404"&gt;&lt;/p&gt;
&lt;p&gt;59（客户端IP别称）想7428（服务端IP别称）的三次握手如上图所示，59发送SYN数据包到7428，服务端7428收到之后响应SYN+ACK数据包，然后客户端回复ACK数据包以表示收到服务端的响应。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Seq（序列号）：TCP是有序的，当数据包延迟或者提前到达了服务端在无序的状态下也可以根据Seq号进行排序，进而判断出是否丢包、是否乱序等问题。TCP是双向的所以客户端和服务端各维护了一个Seq号。&lt;/p&gt;
&lt;p&gt;Seq的增长方式是Seq = Seq + Len（数据段长度），特别注意：&amp;ldquo;TCP SYN 和 FIN 即便没有数据，也会消耗 1 个序列号&amp;rdquo;&lt;/p&gt;
&lt;p&gt;如上图所示，27号包Seq=0，Len=0，由客户端维护的31号包Seq=1，Len=0（因为SYN包会消耗一个序列号，这是标准行为中确定的）&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20251117234720113.png" alt="image-20251117234720113"&gt;&lt;/p&gt;
&lt;p&gt;我将用上图客户端侧（59）维护的Seq来说明下具体Seq号增长的过程：&lt;/p&gt;
&lt;p&gt;1、初始SYN数据包，Seq=0，因为SYN和FIN即便Len=0没有数据也会消耗一个Seq&lt;/p&gt;
&lt;p&gt;2、所以31号包的Seq=1，Len=0&lt;/p&gt;
&lt;p&gt;3、32号包因为HTTP协议发送了Len=76的数据，Seq=1&lt;/p&gt;
&lt;p&gt;4、46号包的Seq=76+1=77，此时Len=0&lt;/p&gt;
&lt;p&gt;5、47号包的Seq = 77 + Len（0），因为47号包发送的FIN+ACK包，上述说了FIN包也会消耗一个Seq，所以Seq=77+1=78，此时Len=0&lt;/p&gt;
&lt;p&gt;6、56号包是ACK响应包，Seq = 78 + Len（0） = 78&lt;/p&gt;
&lt;p&gt;基于上述的过程，有服务端维护的Seq号也是同样的增长逻辑。分析Seq的需要注意SYN/FIN也会消耗一个Seq&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Ack（确认号）：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nmap的-sS参数扫描&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-sS 使用TCP SYN扫描目标&lt;/p&gt;
&lt;p&gt;-sS参数扫描的显著特点是短时间内向目标IP的指定端口（默认是全部）发送大量的SYN探测数据包。&lt;/p&gt;
&lt;p&gt;如果服务端响应SYN+ACK数据包则说明该端口开放，客户端立即发送RST+ACK数据包断开连接；如果服务端不响应SYN+ACK数据包则说明端口未开放&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20251117234647633.png" alt="image-20251117234647633"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nmap的-sT参数扫描&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-sT使用TCP完整连接扫描目标&lt;/p&gt;
&lt;p&gt;sT参数是全连接，也就是会包含SYN、SYN+ACK、ACK响应三次握手的全过程。如果三次握手成功，则端口开放，客户端在三次握手之后直接发送RST+ACK数据包终止连接；如果三次握手失败则端口不开放。&lt;/p&gt;
&lt;p&gt;如下图所示，建立连接的过程就是标准的三次握手过程，不同的是没有四次挥手（双向的FIN+ACK和ACK确认），而是在服务端响应之后直接RST+ACK数据包关闭连接。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pbuff-blogs-1257793641.cos.ap-chengdu.myqcloud.com//blogsimage-20251118214927798.png" alt="image-20251118214927798"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nmap的-sF参数扫描&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-sF只发送FIN数据包进行探测，如果端口开放则没有任何响应，如果端口关闭则服务端会响应RST数据包，这个和-sS和-sT判断结果方式不太一样，是反着来的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nmap的sW参数扫描&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;87.182.115.208&lt;/p&gt;</description></item></channel></rss>