（备份-嫑改）Pink Botnet
<!--kg-card-begin: markdown--><h1 id="">概述</h1>
<p>2019年11月21日，安全社区的信任伙伴给我们提供了一个全新的僵尸网络样本，相关样本中包含大量以 pink 为首的函数名，所以我们称之为 PinkBot。</p>
<p>Pinkbot 是我们六年以来观测到最大的僵尸网络，其攻击目标主要是 mips 光猫设备，已知总感染量超过160万，其中 96% 位于中国。</p>
<p>PinkBot 具有很强的技术能力：</p>
<ol>
<li>PinkBot 架构设计具备很好的健壮性，它能够通过多种方式（通过第三方服务分发配置信息/通过 P2P 方式分发配置信息/通过 CNC 分发配置信息）自发寻址控制端，并对控制端通信有完备的校验，确保僵尸节点不会因某一个环节的阻杀而丢失或被接管；甚至对光猫固件做了多处改动后，还能确保光猫能够正常使用；</li>
<li>PinkBot对部分域名的解析查询采取了 DNS-Over-HTTPS 的方式，这个也是在传统BotNet中不太常见的一种手段；</li>
<li>在与相关厂商的屡次攻防博弈中，PinkBot 的运营者都占据了明显的对抗优势。</li>
</ol>
<p>可以说，PinkBot 在整个过程中表现出了极强的针对性和专业性，各方面能力都很均衡，甚至有些可怕。</p>
<h1 id="">规模及影响范围</h1>
<p>我们通过对多个数据源的交叉对比，推测 PinkBot 的感染量在百万量级。三个评估的数据源如下：</p>
<ol>
<li>2019-11-30我们从可信任的安全伙伴手里拿到一个统计数字，日活去重 1,962,308 个IP;</li>
<li>2020-01-02从CNCERT拿到的统计结果：<br>
<code>“该僵尸网络的规模目前无法准确测算。根据NetFlow数据、主动探测数据、实时监测数据等多个维度的数据测算，该僵尸网络关联的Bot节点IP地址数量超过500万。对这些IP地址的定位数据进行统计发现，IP主要为联通的家庭宽带用户地址。因家庭宽带IP是动态分配的，背后的真实感染设备规模无法精确估计，推测实际感染设备数量在百万级，测算的一个主要依据为曾监测到1分钟内连接C2的IP数量超过百万。”</code></li>
<li>根据我们 (360NetLab) 在全网范围内持续探测的数据评估，2020-01-08 当天活跃的受感染 IP 数量为 165 万。</li>
</ol>
<p>在我们全网探测的测量数据中，受感染的 IP 主要集中在中国 (96%)，遍及全国 33 个省。受影响的运营商主要涉及中国联通（&gt;80%）和中国电信（&gt;15%）。</p>
<p>目前已确认有三款设备受到影响：TEWA-800E，KD-YUN-811E 和 ipTIME-N904NS。</p>
<h1 id="pinkbot">PinkBot 技术架构</h1>
<p>PinkBot是一个同时融合了“P2P”和“CNC”的混合结构僵尸网络。一般情况下，它将时效性要求不高的指令（如管理配置信息）通过P2P的方式传递，将时效性要求较高的指令通过CNC模式集中分发（例如：发起ddos攻击，向用户访问的HTTP网站中插广告）。</p>
<h2 id="">配置信息</h2>
<p>对于每一个Bot来说，最重要的一步是找到自己的管理员。而管理员的信息就包含在“配置”之中，下面是最新截获的配置信息：</p>
<pre><code>{
  &quot;verify&quot;: &quot;1585065675&quot;,
  &quot;cncip1&quot;: &quot;144.202.109.110&quot;,
  &quot;cncport1&quot;: &quot;32876&quot;,
  &quot;dlc&quot;: &quot;5b62596bc1453d51cc7241086464f294&quot;,
  &quot;dl&quot;: &quot;http【:】//155.138.140.245/dlist.txt&quot;,
  &quot;dlc1&quot;: &quot;484417e6f65c8e18e684d60c03c4680a&quot;,
  &quot;dl1&quot;: &quot;https【:】//gitee.com/johncase/zip/raw/master/dlist.txt&quot;,
  &quot;sd0&quot;: &quot;1.1.1.1&quot;,
  &quot;sdp0&quot;: &quot;443&quot;,
  &quot;srvk&quot;: &quot;FJAz37XiKgnTLtVpmhjxZcavTJUU5r4XN3Wl5nhTpg0=&quot;,
  &quot;pxy&quot;: &quot;1&quot;
}
</code></pre>
<ol>
<li>其中 verify 字段为指令发布的时间戳，Bot会根据这个时间戳筛选出最新的有效指令。</li>
<li>随后的 cncip 和 cncport 字段指明了僵尸网络的最新CNC地址，攻击者会根据自身需求随时切换这个控制地址。</li>
<li>再随后的“dlc/dl”和 “dlc1/dl1” 字段组为最新的Bot更新地址，其中dlc和dlc1为对应内容的Hash校验字段，算法伪代码为：MD5(MD5(dlist_content)+SHA256(dlist_content))。</li>
<li>“sd0/sdp0”字段为安全DNS地址，对于每一个Bot来说，当需要查询DNS解析记录时，将通过这里指定的DNS服务来查询。且方式为DNS-Over-HTTPS。</li>
<li>srvk字段为服务端的公钥内容（base64编码）。对于每一个bot来说，它和CNC的通讯都是加密的。所以实际通讯前要先经过ECDH的密钥协商得到一个唯一的私钥。在这里指定了CNC端的公钥后，还可以顺带完成了Bot对CNC身份的验签。这是对原有 ECDH 的扩展使用。</li>
<li>pxy字段，推测是一个代理上线的选项。目前没有看到使用迹象，不清楚具体的工作逻辑。</li>
</ol>
<h3 id="">配置信息的保护</h3>
<p>通过上一节的介绍，不难发现“配置信息”其实就是这个僵尸网络的核心，它保证了攻击者对僵尸网络的绝对控制能力。<br>
为了防止其他人发现配置信息，传递的配置信息都是异或加密过的密文。异或加解密算法是对称的，其解密代码逻辑如下：</p>
<pre><code>def easydecrpyt(message):
    res = &quot;&quot;
    for cursor in range(0, len(message)):
        mbt = ord(message[cursor])
        res += (chr((mbt ^ (cursor%0xff) ^ 0xae ^ 0xac ^ 0xbe ^ 0xef) &amp; 0xff))
    return res
</code></pre>
<p>信息加密后，为了防止他人伪造。攻击者还使用了ecdsa对配置信息进行了签名，签名细节如下：</p>
<ol>
<li>签名校验使用的密码库为 mbedtls；</li>
<li>签名算法为 ECDSA；</li>
<li>签名时使用的曲线为：MBEDTLS_ECP_DP_SECP192R1；</li>
<li>验签所用公钥为： <code>04 8D 54 71 71 44 A0 61 DA 5A B4 EA 40 55 2F 21 B1 9B 6C A5 17 92 0F 10 B5 11 56 ED 14 DB 54 47 1A 94 48 06 06 3C 7A B4 3B 25 D1 AC 9F 85 AF 33 9E</code></li>
</ol>
<h3 id="">配置信息的分发</h3>
<p>除了保证配置信息的机密性和完整性外，攻击者还使用了多种手段来分发配置信息，以确保其可用性。</p>
<h4 id="a">a) 通过第三方服务分发配置信息</h4>
<ol>
<li>通过 BTC+GITHUB 分发配置信息</li>
</ol>
<p>该分发渠道的核心是一个隐藏在GITHUB上的项目，比如最近一次看到的项目就是（mypolo111/vfg），可以看到这个项目的README中，有两行内容。</p>
<p><img src="__GHOST_URL__/content/images/2019/11/pink_readme.png" alt="" loading="lazy"></p>
<p>其中，模式为<code>P!!&lt;base64&gt;I!!</code>行是配置签名，模式为<code>N!!&lt;base64&gt;K!!</code>行是配置信息的密文。</p>
<p>但对于每一个Bot来说，想要找到这个隐藏项目却很复杂。最初，先从一个固定的BTC钱包[<code>1GQNam6xhzYVLWWXvRfu3EjsFon6n6GxMF</code>] 的转账记录生成一个 topic 标签，在逆向样本相关代码之后，我还原了这个过程，如下图所示（BTC钱包的查询用到了四个web服务，具体的地址也如图中所示）：</p>
<p><img src="__GHOST_URL__/content/images/2019/11/image.png" alt="" loading="lazy"></p>
<p>对于每一个可能的topic标签，都有很多相关的github项目。遍历这些项目的ISSUES，寻找一个格式为 <code>...!&lt;base64&gt;...?</code> 的字串，比如我们最近找到的一个就是 <code>...!L215cG9sbzExMS92Zmc=...?</code> 将这个base64 还原，就是隐藏项目的地址了 <code>mypolo111/vfg</code></p>
<p>再通过搜索 GITHUB 的 Topics 和 ISSUES，找到那个隐藏的GIT项目。</p>
<p>另：mypolo111 这个账号在多个项目中提交过ISSUES，相关截图如下所示：</p>
<p><img src="__GHOST_URL__/content/images/2019/11/mypolo111_issues.png" alt="" loading="lazy"></p>
<p>PS：在这一套寻址逻辑下，攻击者可以通过为 “特定BTC钱包” 增加交易记录的方式，来切换最终找到的 GITHUB 项目。在这样的前提下须封掉指定BTC钱包才能破坏这个僵尸网络以 GITHUB 为主的分发逻辑。</p>
<ol start="2">
<li>通过 百度tieba 分发配置信息</li>
</ol>
<p>攻击者在少部分样本中还尝试利用“百度tieba”分发配置信息，这一部分的逻辑和利用GITHUB分发的逻辑相似。</p>
<p>2022年3月1日，百度的同事找到了贴吧相关。<a href="https://tieba.baidu.com/home/main?id=tb.1.17f95408.DWQgYsTdICFVLfwoPkWw4g&amp;fr=pb">pkbidu_001</a>,以及多个该账号相关的帖子https://tieba.baidu.com/p/5949662828?red_tag=2156548834 和 <a href="https://tieba.baidu.com/p/6418396904?pid=129106150828&amp;cid=#129106150828">https://tieba.baidu.com/p/6418396904?pid=129106150828&amp;cid=#129106150828</a></p>
<p>其帖子内容经过base64编码解密后，可直接关联到 pink。</p>
<pre><code>$ echo aHR0cDovL2NuYy5waW5rbGFuZGVyLmNvbS9w | base64 -d
http://cnc.pinklander.com/p
$ echo aHR0cHM6Ly9naXRodWIuY29tL215cG9sbzExMS92Zmcv | base64 -d
https://github.com/mypolo111/vfg/
</code></pre>
<p><img src="__GHOST_URL__/content/images/2022/03/pink_baidu_tieba_--_3.png" alt="pink_baidu_tieba_--_3" loading="lazy"></p>
<p><img src="__GHOST_URL__/content/images/2022/03/pink_baidu_tieba_--.png" alt="pink_baidu_tieba_--" loading="lazy"></p>
<h4 id="bp2p">b) 通过 P2P 方式分发配置信息</h4>
<ol>
<li>P2P-Over-UDP123 分发配置信息</li>
</ol>
<p>Bot节点运行后，会在本地监听 UDP-123 端口，该端口原本是NTP服务默认端口，所用的协议也具有一定的迷惑性。一段时间后，会向公网的四个B段地址（&quot;114.25.0.0/16&quot;，&quot;36.227.0.0/16&quot;，&quot;59.115.0.0/16&quot;，&quot;1.224.0.0/16&quot;）发起 Peer 探测请求，内容为 <code>1C 00 00 00</code> 当目标为正常的 NTP 服务器时会得到 NTP 时间，而如果目标为一个Bot节点时，则有两种回复：</p>
<ul>
<li>当目标Bot未取得主控信息时回复 <code>1D 00 00 00</code>；</li>
<li>当目标Bot拿到主控信息时，会将主控信息的签名和相应密文回复，发送前，会在信息头补充 0xE3 字节。</li>
</ul>
<p>下图是最近捕获到的UDP-123 传递的配置信息。</p>
<p><img src="__GHOST_URL__/content/images/2020/03/UDP-123-hexdata.png" alt="UDP-123-hexdata" loading="lazy"></p>
<ol start="2">
<li>通过 P2P-Over-TCP 分发配置信息</li>
</ol>
<p>Bot 节点运行后，还会在本地监听一个 TCP 端口，且端口号是通过其公网 IP 计算后得到的，代码如下图所示：</p>
<p><img src="__GHOST_URL__/content/images/2020/01/p2p_getport_byip.png" alt="" loading="lazy"></p>
<p>交互协议的格式同UDP123上的相同。</p>
<h4 id="ccnc">c) 通过 CNC 分发配置信息</h4>
<p>攻击者在部分样本中内置了一个域名 cnc.pinklander.com ，当该域名启用后，会展示一个web页面，页面内容和GITHUB项目的内容相同。也是base64 编码后的配置信息。</p>
<h2 id="pinkbot">PinkBot 指令</h2>
<h3 id="">指令格式</h3>
<p>每条指令至少包含7字节，含义依此如下：</p>
<ol>
<li>Token字段，长度4字节，该字段值由服务器端指定，指定后将一直使用这个值。设置方式为：Bot启动后首先会向CC发送新生成的ECDH的公钥，此刻Token为0，当服务端接受后，会分配一个Token值给Bot，这就算指定成功了。</li>
<li>指令字段，长度1字节。CC发出指令后，Bot也要用相同的指令码把执行结果返回。</li>
<li>内容长度字段，长度2字节。当指令不包含具体内容时，设置为零，否则这里填充内容的字节长度数，并追加密文内容。</li>
<li>指令内容。当指令包含内容时，此处填写密文的指令内容。解密方法请继续向下阅读。</li>
</ol>
<p>这里附上一张截图供参阅，其中红框标记的就是指令字段：</p>
<p><img src="__GHOST_URL__/content/images/2020/03/Snip20191130_9.png" alt="Snip20191130_9" loading="lazy"></p>
<h3 id="">指令传输方式</h3>
<h4 id="a">a) 通讯加密</h4>
<p>上述配置信息中的 cncip1 和 cncport1 便是攻击者实际使用的主控节点。PinkBot 连接到 cnc 后将通过密钥交换方式来做加密通信，细节如下：</p>
<ol>
<li>使用的密码学库为：<code>mbedtls</code>;</li>
<li>密钥交换阶段使用的交换算法 <code>ecdh</code>，加载曲线为 <code>MBEDTLS_ECP_DP_CURVE25519</code>;</li>
<li>服务端ECDH公钥前期为硬编码在样本中，跟踪后期，则改为在配置信息中指定。但内容没有变化过：<code>14 90 33 DF B5 E2 2A 09 D3 2E D5 69 9A 18 F1 65 C6 AF 4C 95 14 E6 BE 17 37 75 A5 E6 78 53 A6 0D</code></li>
<li>报文加密/解密阶段使用的算法为 <code>aes</code>, key 为密钥交换后的secret，加载参数为 <code>MBEDTLS_AES_ENCRYPT</code> 和<code>MBEDTLS_AES_DECRYPT</code>;</li>
<li>在ECDH的标准中，一般双方的公私钥是每次都要重新生成。但在 PinkBot 中，却只要求了 Bot 侧每次不同，而服务端则指定一对固定的公私钥。这种内置服务端公钥的方式，就等于让 Bot 有能力对 CNC 进行身份验证，从而杜绝了通讯过程被中间人攻击的可能性。</li>
</ol>
<h4 id="b">b) 指令内容编码</h4>
<p>为了能够同时适配 mipsb/mipsl 机型中字节序列的分布不同，传输的内容其实是经过开源库<a href="https://github.com/nanopb/nanopb">nanopb</a> 转化后的内容，这个库可以通过约定模版的方式来抽象序列化和反序列化的过程，从而忽略掉大/小端内存的干扰。</p>
<h3 id="">指令功能</h3>
<p>PinkBot 指令具有丰富的控制能力：</p>
<blockquote>
<ol>
<li>文件下载</li>
<li>系统命令执行</li>
<li>DDoS攻击（HTTP攻击和 UDP 攻击）</li>
<li>扫描功能（扫描的具体内容可以通过指令设置）</li>
<li>汇报设备信息（CPU/系统类型/内存信息/系统版本/硬件信息）</li>
<li>自身更新（将新版本保存到 /tmp/client 后运行）</li>
<li>P2P节点列表同步（直接推送一组P2P节点到Bot）</li>
<li>http报文注入广告（在受害设备上，嗅探交互报文，遇到http网页时，插入广告js脚本）</li>
<li>启动sock5代理服务（在Bot端架设 Socks5 代理服务，账号密码通过指令设置）</li>
<li>下载文件并执行</li>
<li>停止攻击</li>
<li>重置watchdog</li>
</ol>
</blockquote>
<h2 id="pinkbot">PinkBot 持久化方式</h2>
<p>与我们常见到的 botnet 不同，PinkBot 为了保持对感染设备的绝对控制权，会在感染光猫后，重新刷写原有的光猫固件。在刷写后的固件中，包含了 PinkBot 的下载器母体和配套的启动程序。</p>
<p>下图是被感染后新增/修改的文件列表：</p>
<p><img src="__GHOST_URL__/content/images/2020/03/pink_flash_tree_diff.png" alt="pink_flash_tree_diff" loading="lazy"></p>
<p>其中tmp目录的内容可以暂时忽略，这是样本运行中生成的临时文件。</p>
<p>关键文件说明：</p>
<ul>
<li>/bin/protect：<code>md5:9ec5bd857b998e60663e88a70480b828</code></li>
</ul>
<p>protect 文件是被刷写固件中的Bot母本。文件中未发现收益类功能，换句话说它更像是一个下载器，在这个样本中可以看到以上5种获取配置信息的代码。它最主要的功能，就是启动后会从配置信息中拿到最新的样本并把它们运行起来。</p>
<ul>
<li>/bin/tr69c:  <code>md5:451a3cf94191c64b5cd1be1a80be7799</code></li>
</ul>
<p>tc69c 文件是光猫原始固件中 tr69c 的一个patch版本。通过对比分析，发现该patch主要移除了光猫的更新功能。也就是说，被刷写的光猫，将无法通过 tr69c 进行固件升级。这应该是攻防对抗中引入的持久化操作。</p>
<h1 id="pinkbot">PinkBot 规模评估与指令跟踪</h1>
<h2 id="">规模评估</h2>
<p>前面提到，每个受感染的 PinkBot 都会通过 udp 123 端口以 p2p 方式来分发配置信息。利用这个特性，我们在全网范围内对 PinkBot 的感染量进行了持续评估（评估数据统计那堆表要不要列一波？）。</p>
<h2 id="">指令跟踪</h2>
<p>我们通过模拟 PinkBot 来实时接收CNC主控分发的指令。<br>
除了日常的维护类指令（心跳指令/peerlist同步指令）外，我们还收到了多条向WEB网页插入广告的指令，例如：</p>
<pre><code>&lt;script async src=&quot;http【:】//45.32.21.251/j/?$$&quot;&gt;&lt;/script&gt;
&lt;script async src=&quot;http【:】//167.179.80.159/j/?$$&quot;&gt;&lt;/script&gt;
&lt;script async src=“http【:】//114.55.124.13/j/?$$“&gt;&lt;/script&gt;
</code></pre>
<h1 id="pinkbot">番外：与 PinkBot 对抗的那些事儿</h1>
<p>在对 PinkBot 僵尸网络分析跟踪的过程中。我们注意到，攻击者和相关厂商进行了多次的攻防对抗。<br>
这一章节将简单梳理下我们了解到的与 PinkBot 攻防对抗的尝试。</p>
<h2 id="">设备厂商的对抗（此章节涉及到厂商利益，慎重公开）</h2>
<p>根据一个涉事厂商（四川天邑）提供的信息，对抗最早发生在 2019 年 11 月中旬。受攻击的漏洞源于一个 TCP-17998 的管控服务，该服务是对运营商提供的一个管理家用光猫的接口。由于服务配置和实现的失误，向公网开放了访问权限，攻击者通过它获取了相关光猫的控制权。</p>
<p><em>第一次对抗</em>: 厂商在发现这个问题后，开始试图在公网上通过相同的漏洞，修复自家设备。但很快就被攻击者发现并马上采取行动，通过 iptables 关闭了 TCP-17998 的外网访问能力，从设备内部阻止了厂商的进一步修复。</p>
<p><em>第二次对抗</em>：此次攻防的焦点在 tr069 升级通道。厂商从运营商侧可以在设备启动瞬间利用 tr096 进去修复设备。然而此次攻击者仍然在第一时间察觉到问题，并迅速更新固件关掉了tr096 的更新通道。</p>
<p><em>第三次对抗</em>：厂商又尝试利用设备上 LAN 侧的 TCP-80 HTTP 服务来进行设备修复，然而，同样的结局，攻击者很快又更新固件把设备上的 HTTP 服务文件干掉了。至此，所有的光猫都成了网络孤岛，它们只能提供终端用户的正常网上冲浪的能力，却再没有网络端口可以供外侧管理访问。</p>
<p><em>最后的方案</em>：厂商已经完全没有还击的筹码了。如果要修复这些孤岛，只能派人入户接触光猫，拆解出调试接口或者干脆为用户更换光猫。</p>
<p><em>复盘总结</em>：设备厂商与攻击者多轮的攻防对抗中，双方的信息和能力是不对等的。厂商在无法获知全网受害情况的前提下，从互联网上一个IP一个IP的发现设备/修复设备。而攻击者通过集中C&amp;C的机制，统一下发关服务指令。虽然，厂商修复了一部分设备得到了局部胜利，但攻击者仍然保住了大部分胜利果实获取了全局胜利。</p>
<h2 id="github">GITHUB 封相关账号</h2>
<p>我们在实际跟踪中通过残留的早期指令发现，PinkBot 至少已经存在一年以上了，最早可以追溯到 2018年10月16日，当时使用的 github 帐号为 pink78day（这个账号早就已经看不到了，我们通过搜索Google的网页快照服务追溯）。</p>
<p><img src="__GHOST_URL__/content/images/2020/03/pink78day.png" alt="pink78day" loading="lazy"></p>
<p>目前 PinkBot 使用的帐号是 2019年11月下旬注册的 mypolo111，而 pink78day 这个账号已经无法在 Github 上搜索到，所以我们推测，Github 在发现这个项目后对帐号采取了屏蔽措施，而最近一次攻防也就发生在 2019年11下旬 PinkBot 换帐号这个时间点。</p>
<p><em>复盘总结</em>：对于GITHUB来说，PinkBot 数量巨大，且访问的项目是一个明显恶意的项目，会消耗较多的服务资源，于情于理，GITHUB 都要封杀这个僵尸网络。问题在于，他们误认为 pink78day 是一个集中分发指令的渠道，以为单纯封杀这个账号就没事了。但事实上，这个账号只是一个相对下游的控制手段。攻击者通过增加BTC钱包的交易记录就可以瞬间将Bot重定向到一个新的账号上。消耗资源的问题依然存在，此次攻防无所谓成功失败。Nice try.</p>
<h1 id="ioc">IOC</h1>
<h2 id="cc">C&amp;C地址</h2>
<p>通过长期跟踪，攻击者使用过的CNC地址有：</p>
<pre><code>cnc.pinklander[.]com
144.202.109.110:40080
144.202.109.110:32876
207.148.70.25:12368
45.32.125.150:12368
45.32.125.188:12368
45.32.174.105:12368
5.45.79.32:12368
</code></pre>
<p><strong>PS</strong>: 其中 cnc.pinklander.com 在2019年12月28日，已经被我们的DNSMon系统自动识别并加黑处理了。</p>
<h2 id="">同步服务</h2>
<p>PinkBot 会通过HTTP服务同步样本，用于更新或扩大感染。所用的HTTP服务有一些是公有服务，有一些是临时建立的HTTP服务。<br>
在长期的跟踪中，我们确定至少存在以下URL被用于样本同步。这些URL均提取自 PinkBot 的<code>配置信息</code>中。</p>
<pre><code>http[:]//1.198.50.63:1088/dlist.txt
http[:]//1.63.19.10:19010/var/sss/dlist.txt
http[:]//104.207.142.132/dlist.txt
http[:]//108.61.158.59/dlist.txt
http[:]//111.61.248.32:1088/dlist.txt
http[:]//112.26.43.199:81/dlist.txt
http[:]//113.106.175.43:19010/tmp/pinkdown/dlist.txt
http[:]//117.131.10.102:1088/d/dlist.txt
http[:]//123.13.215.89:8005/d/dlist.txt
http[:]//125.74.208.220:81/dlist.txt
http[:]//140.82.24.94/dlist.txt
http[:]//140.82.30.245/d/dlist.txt
http[:]//140.82.53.129/dlist.txt
http[:]//144.202.38.129/dlist.txt
http[:]//149.28.142.167/p/dlist.txt
http[:]//149.28.142.167/p1/dlist.txt
http[:]//155.138.140.245/dlist.txt
http[:]//167.179.110.44/dlist.txt
http[:]//173.254.204.124:81/dlist.txt
http[:]//182.139.215.4:82/dlist.txt
http[:]//207.148.4.202/dlist.txt
http[:]//218.25.236.62:1987/d/dlist.txt
http[:]//218.25.236.62:1988/d/dlist.txt
http[:]//222.216.226.29:81/dlist.txt
http[:]//45.32.26.220/dlist.txt
http[:]//45.76.104.146/dlist.txt
http[:]//45.77.165.83/p1/dlist.txt
http[:]//45.77.198.232/p1/dlist.txt
http[:]//45.88.42.38/p1/dlist.txt
http[:]//61.149.204.230:81/dlist.txt
http[:]//66.42.114.73/dlist.txt
http[:]//66.42.67.148/dlist.txt
http[:]//8.6.193.191/dlist.txt
http[:]//95.179.238.22/dlist.txt
https[:]//fse7.oss-cn-shanghai.aliyuncs.com/dlist.txt
https[:]//fys6y.oss-cn-shanghai.aliyuncs.com/dlist.txt
https[:]//gitee.com/b9g/zt/raw/master/dlist.txt
https[:]//gitee.com/bg64/gy/raw/master/dlist.txt
https[:]//gitee.com/bg64/xt/raw/master/dlist.txt
https[:]//gitee.com/d3fg/su/raw/master/dlist.txt
https[:]//gitee.com/fe354/xx/raw/master/dlist.txt
https[:]//gitee.com/fh8y/i9/raw/master/dlist.txt
https[:]//gitee.com/g6y/qu/raw/master/dlist.txt
https[:]//gitee.com/g7u/hi/raw/master/dlist.txt
https[:]//gitee.com/gb7e/sh/raw/master/dlist.txt
https[:]//gitee.com/ggf2/zt/raw/master/dlist.txt
https[:]//gitee.com/hni/cfi/raw/master/dlist.txt
https[:]//gitee.com/ji9/zg/raw/master/dlist.txt
https[:]//gitee.com/johncase/zip/raw/master/dlist.txt
https[:]//gitee.com/k9o/st/raw/master/dlist.txt
https[:]//gitee.com/k9o/u8/raw/master/dlist.txt
https[:]//gitee.com/mh8i/zt/raw/master/dlist.txt
https[:]//gitee.com/nick908/hello/raw/master/dlist.txt
https[:]//gitee.com/nick908/sc/raw/master/dlist.txt
https[:]//gitee.com/oubv/bh/raw/master/dlist.txt
https[:]//gitee.com/s7y/xx/raw/master/dlist.txt
https[:]//gitee.com/t9i/y7/raw/master/dlist.txt
https[:]//gitee.com/u8i/fo/raw/master/dlist.txt
https[:]//gitee.com/ujh5/ho/raw/master/dlist.txt
https[:]//gitee.com/vd5/y8/raw/master/dlist.txt
https[:]//gitee.com/vd5/y9/raw/master/dlist.txt
https[:]//gitee.com/vr6/sh/raw/master/dlist.txt
https[:]//gitee.com/y7u/bh/raw/master/dlist.txt
https[:]//gitee.com/y7u/eg/raw/master/dlist.txt
https[:]//gitee.com/y7u/lp/raw/master/dlist.txt
https[:]//gitee.com/y7u/rt/raw/master/dlist.txt
https[:]//gitee.com/y7u/xc/raw/master/dlist.txt
https[:]//hj9o.oss-cn-hangzhou.aliyuncs.com/dlist.txt
https[:]//hjis.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//kol5.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//n609.coding.net/p/t/d/t/git/raw/master/dlist.txt
https[:]//okp9.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//raw.githubusercontent.com/pink78day/helloworld/master/dlist.txt
</code></pre>
<h2 id="md5">MD5</h2>
<p>通过跟踪获取到的相关样本（ELF）汇总如下：</p>
<pre><code>9ec5bd857b998e60663e88a70480b828 /bin/protect
451a3cf94191c64b5cd1be1a80be7799 /bin/tr69c
06d6ad872e97e47e55f5b2777f78c1ba slient_l
07cd100c7187e9f4c94b54ebc60c0965 slient_b
0f25b0d54d05e58f5900c61f219341d3 client_b
0f89e43ea433fdfd18a551f755473388 slient_l
1197994610b2ffb60edbb5ab0c125bc0 client_b
167364ad0d623d17332f09dbb23a980e client_b
175b603082599838d9760b2ab264da6f slient_l
1a6dce9916b9b6ae50c1457f5f1dfbbd slient_l
229503686c854bb39efdc84f05b071b9 slient_b
25a07e3ef483672b4160aa12d67f5201 client_l
262a4e242c9ebeba79aa018d8b38d229 client_l
29d0afd2a244c9941976ebf2f0f6597f client_l
2befedd020748ff6d9470afad41bd28c slient_b
2ca5810744173889b2440e4f25b39bd4 client_l
36e48e141943a67c6fdeaa84d7af21cc client_b
3a620ff356686b461e0e1a12535bea24 slient_l
41bbe8421c0a78067bae74832c375fe8 slient_l
45ee78d11db54acfdda27c19e44c3126 client_l
4830c3950957093dac27d4e87556721e slient_l
484761f281cb2e64d9db963a463efca5 client_l
48a7f2799bf452f10f960159f6a405d3 client_l
494412638dc8d573172c1991200e1399 client_l
4c83ad66189a7c4d2f2afdbfb94d0e65 slient_b
50270de8d5783bb0092bf1677b93c97b slient_l
54aa9e716567bd0159f4751916f7f0d1 client_l
5ae1fec20c2f720269c2dc94732187e8 slient_b
5b62a9bd3431c2fd55283380d81c00fa client_b
5c322610e1845d0be9ccfc8a8b6a4c4f client_l
5c4f8dae67dad8cac141afa00847b418 slient_b
5d0d034845bd69179bf678104c046dc1 client_b
60658ef214c960147200d432eece3e13 slient_l
60a2b1bb02a60ac49f7cc1b47abdf60c client_l
610f0aadba3be1467125607bf2ba2aaf slient_l
66a068fd860bda7950fde8673d1b5511 client_b
6c4de9bd490841f0a6c68638f7253c65 client_b
72c531a813b637af3ea56f288d65cdb7 slient_b
7608b24c8dcf3cd7253dbd5390df8b1f client_b
7645a30a92863041cf93a7d8a9bfba1a client_b
857fc3c7630859c20d35d47899b75699 slient_b
861af6b5a3fea01f2e95c90594c62e9d client_l
8e86be3be36094e0f5b1a6e954dbe7c2 client_l
8fbcd7397d451e87c60a0328efe8cd5d client_b
987a9befb715b6346e7ad0f6ac87201f slient_b
9eb147e3636a4bb35f0ee1540d639a1b slient_b
aa2fc46dd94cbf52aef5e66cdd066a40 client_l
ae8b519504afc52ee3aceef087647d36 slient_b
b0202f1e8bded9c451c734e3e7f4e5d8 slient_b
b6f91ad027ded41e2b1f5bea375c4a42 slient_b
b9935859b3682c5023d9bcb71ee2fece slient_b
b9d1c31f59c67289928e1bb7710ec0ba client_l
bec2f560b7c771d7066da0bee5f2e001 client_b
c2efa35b34f67a932a814fd4636dd7cb slient_l
c839aff2a2680fb5676f12531fecba3b slient_b
c94504531159b8614b95c62cca6c50c9 slient_l
dfe0c9d36062dd3797de403a777577a6 client_b
e19a1106030e306cc027d56f0827f5ce slient_l
f09b45daadc872f2ac3cc6c4fe9cff90 client_b
f5381892ea8bd7f5c5b4556b31fd4b26 client_b
f55ad7afbe637efdaf03d4f96e432d10 slient_b
f62d4921e3cb32e229258b4e4790b63a client_b
f81c8227b964ddc92910890effff179b slient_b
fc5b55e9c6a9ddef54a256cc6bda3804 client_b
fe8e830229bda85921877f606d75e96d slient_l
fee6f8d44275dcd2e4d7c28189c5f5be client_l
</code></pre>
<!--kg-card-end: markdown-->
概述


2019年11月21日，安全社区的信任伙伴给我们提供了一个全新的僵尸网络样本，相关样本中包含大量以 pink 为首的函数名，所以我们称之为 PinkBot。


Pinkbot 是我们六年以来观测到最大的僵尸网络，其攻击目标主要是 mips 光猫设备，已知总感染量超过160万，其中 96% 位于中国。


PinkBot 具有很强的技术能力：


 1. PinkBot 架构设计具备很好的健壮性，它能够通过多种方式（通过第三方服务分发配置信息/通过 P2P 方式分发配置信息/通过 CNC 分发配置信息）自发寻址控制端，并对控制端通信有完备的校验，确保僵尸节点不会因某一个环节的阻杀而丢失或被接管；甚至对光猫固件做了多处改动后，还能确保光猫能够正常使用；
 2. PinkBot对部分域名的解析查询采取了 DNS-Over-HTTPS 的方式，这个也是在传统BotNet中不太常见的一种手段；
 3. 在与相关厂商的屡次攻防博弈中，PinkBot 的运营者都占据了明显的对抗优势。


可以说，PinkBot 在整个过程中表现出了极强的针对性和专业性，各方面能力都很均衡，甚至有些可怕。



规模及影响范围


我们通过对多个数据源的交叉对比，推测 PinkBot 的感染量在百万量级。三个评估的数据源如下：


 1. 2019-11-30我们从可信任的安全伙伴手里拿到一个统计数字，日活去重 1,962,308 个IP;
 2. 2020-01-02从CNCERT拿到的统计结果：
    
    “该僵尸网络的规模目前无法准确测算。根据NetFlow数据、主动探测数据、实时监测数据等多个维度的数据测算，该僵尸网络关联的Bot节点IP地址数量超过500万。对这些IP地址的定位数据进行统计发现，IP主要为联通的家庭宽带用户地址。因家庭宽带IP是动态分配的，背后的真实感染设备规模无法精确估计，推测实际感染设备数量在百万级，测算的一个主要依据为曾监测到1分钟内连接C2的IP数量超过百万。”
 3. 根据我们 (360NetLab) 在全网范围内持续探测的数据评估，2020-01-08 当天活跃的受感染 IP 数量为 165 万。


在我们全网探测的测量数据中，受感染的 IP 主要集中在中国 (96%)，遍及全国 33 个省。受影响的运营商主要涉及中国联通（>80%）和中国电信（>15%）。


目前已确认有三款设备受到影响：TEWA-800E，KD-YUN-811E 和 ipTIME-N904NS。



PinkBot 技术架构


PinkBot是一个同时融合了“P2P”和“CNC”的混合结构僵尸网络。一般情况下，它将时效性要求不高的指令（如管理配置信息）通过P2P的方式传递，将时效性要求较高的指令通过CNC模式集中分发（例如：发起ddos攻击，向用户访问的HTTP网站中插广告）。



配置信息


对于每一个Bot来说，最重要的一步是找到自己的管理员。而管理员的信息就包含在“配置”之中，下面是最新截获的配置信息：


{
  "verify": "1585065675",
  "cncip1": "144.202.109.110",
  "cncport1": "32876",
  "dlc": "5b62596bc1453d51cc7241086464f294",
  "dl": "http【:】//155.138.140.245/dlist.txt",
  "dlc1": "484417e6f65c8e18e684d60c03c4680a",
  "dl1": "https【:】//gitee.com/johncase/zip/raw/master/dlist.txt",
  "sd0": "1.1.1.1",
  "sdp0": "443",
  "srvk": "FJAz37XiKgnTLtVpmhjxZcavTJUU5r4XN3Wl5nhTpg0=",
  "pxy": "1"
}



 1. 其中 verify 字段为指令发布的时间戳，Bot会根据这个时间戳筛选出最新的有效指令。
 2. 随后的 cncip 和 cncport 字段指明了僵尸网络的最新CNC地址，攻击者会根据自身需求随时切换这个控制地址。
 3. 再随后的“dlc/dl”和 “dlc1/dl1” 字段组为最新的Bot更新地址，其中dlc和dlc1为对应内容的Hash校验字段，算法伪代码为：MD5(MD5(dlist_content)+SHA256(dlist_content))。
 4. “sd0/sdp0”字段为安全DNS地址，对于每一个Bot来说，当需要查询DNS解析记录时，将通过这里指定的DNS服务来查询。且方式为DNS-Over-HTTPS。
 5. srvk字段为服务端的公钥内容（base64编码）。对于每一个bot来说，它和CNC的通讯都是加密的。所以实际通讯前要先经过ECDH的密钥协商得到一个唯一的私钥。在这里指定了CNC端的公钥后，还可以顺带完成了Bot对CNC身份的验签。这是对原有 ECDH 的扩展使用。
 6. pxy字段，推测是一个代理上线的选项。目前没有看到使用迹象，不清楚具体的工作逻辑。



配置信息的保护


通过上一节的介绍，不难发现“配置信息”其实就是这个僵尸网络的核心，它保证了攻击者对僵尸网络的绝对控制能力。

为了防止其他人发现配置信息，传递的配置信息都是异或加密过的密文。异或加解密算法是对称的，其解密代码逻辑如下：


def easydecrpyt(message):
    res = ""
    for cursor in range(0, len(message)):
        mbt = ord(message[cursor])
        res += (chr((mbt ^ (cursor%0xff) ^ 0xae ^ 0xac ^ 0xbe ^ 0xef) & 0xff))
    return res



信息加密后，为了防止他人伪造。攻击者还使用了ecdsa对配置信息进行了签名，签名细节如下：


 1. 签名校验使用的密码库为 mbedtls；
 2. 签名算法为 ECDSA；
 3. 签名时使用的曲线为：MBEDTLS_ECP_DP_SECP192R1；
 4. 验签所用公钥为： 04 8D 54 71 71 44 A0 61 DA 5A B4 EA 40 55 2F 21 B1 9B 6C A5 17 92 0F 10 B5 11 56 ED 14 DB 54 47 1A 94 48 06 06 3C 7A B4 3B 25 D1 AC 9F 85 AF 33 9E



配置信息的分发


除了保证配置信息的机密性和完整性外，攻击者还使用了多种手段来分发配置信息，以确保其可用性。


a) 通过第三方服务分发配置信息


 1. 通过 BTC+GITHUB 分发配置信息


该分发渠道的核心是一个隐藏在GITHUB上的项目，比如最近一次看到的项目就是（mypolo111/vfg），可以看到这个项目的README中，有两行内容。





其中，模式为P!!<base64>I!!行是配置签名，模式为N!!<base64>K!!行是配置信息的密文。


但对于每一个Bot来说，想要找到这个隐藏项目却很复杂。最初，先从一个固定的BTC钱包[1GQNam6xhzYVLWWXvRfu3EjsFon6n6GxMF] 的转账记录生成一个 topic 标签，在逆向样本相关代码之后，我还原了这个过程，如下图所示（BTC钱包的查询用到了四个web服务，具体的地址也如图中所示）：





对于每一个可能的topic标签，都有很多相关的github项目。遍历这些项目的ISSUES，寻找一个格式为 ...!<base64>...? 的字串，比如我们最近找到的一个就是 ...!L215cG9sbzExMS92Zmc=...? 将这个base64 还原，就是隐藏项目的地址了 mypolo111/vfg


再通过搜索 GITHUB 的 Topics 和 ISSUES，找到那个隐藏的GIT项目。


另：mypolo111 这个账号在多个项目中提交过ISSUES，相关截图如下所示：





PS：在这一套寻址逻辑下，攻击者可以通过为 “特定BTC钱包” 增加交易记录的方式，来切换最终找到的 GITHUB 项目。在这样的前提下须封掉指定BTC钱包才能破坏这个僵尸网络以 GITHUB 为主的分发逻辑。


 2. 通过 百度tieba 分发配置信息


攻击者在少部分样本中还尝试利用“百度tieba”分发配置信息，这一部分的逻辑和利用GITHUB分发的逻辑相似。


2022年3月1日，百度的同事找到了贴吧相关。pkbidu_001,以及多个该账号相关的帖子https://tieba.baidu.com/p/5949662828?red_tag=2156548834 和 https://tieba.baidu.com/p/6418396904?pid=129106150828&cid=#129106150828


其帖子内容经过base64编码解密后，可直接关联到 pink。


$ echo aHR0cDovL2NuYy5waW5rbGFuZGVyLmNvbS9w | base64 -d
http://cnc.pinklander.com/p
$ echo aHR0cHM6Ly9naXRodWIuY29tL215cG9sbzExMS92Zmcv | base64 -d
https://github.com/mypolo111/vfg/









b) 通过 P2P 方式分发配置信息


 1. P2P-Over-UDP123 分发配置信息


Bot节点运行后，会在本地监听 UDP-123 端口，该端口原本是NTP服务默认端口，所用的协议也具有一定的迷惑性。一段时间后，会向公网的四个B段地址（"114.25.0.0/16"，"36.227.0.0/16"，"59.115.0.0/16"，"1.224.0.0/16"）发起 Peer 探测请求，内容为 1C 00 00 00 当目标为正常的 NTP 服务器时会得到 NTP 时间，而如果目标为一个Bot节点时，则有两种回复：


 * 当目标Bot未取得主控信息时回复 1D 00 00 00；
 * 当目标Bot拿到主控信息时，会将主控信息的签名和相应密文回复，发送前，会在信息头补充 0xE3 字节。


下图是最近捕获到的UDP-123 传递的配置信息。





 2. 通过 P2P-Over-TCP 分发配置信息


Bot 节点运行后，还会在本地监听一个 TCP 端口，且端口号是通过其公网 IP 计算后得到的，代码如下图所示：





交互协议的格式同UDP123上的相同。


c) 通过 CNC 分发配置信息


攻击者在部分样本中内置了一个域名 cnc.pinklander.com ，当该域名启用后，会展示一个web页面，页面内容和GITHUB项目的内容相同。也是base64 编码后的配置信息。



PinkBot 指令



指令格式


每条指令至少包含7字节，含义依此如下：


 1. Token字段，长度4字节，该字段值由服务器端指定，指定后将一直使用这个值。设置方式为：Bot启动后首先会向CC发送新生成的ECDH的公钥，此刻Token为0，当服务端接受后，会分配一个Token值给Bot，这就算指定成功了。
 2. 指令字段，长度1字节。CC发出指令后，Bot也要用相同的指令码把执行结果返回。
 3. 内容长度字段，长度2字节。当指令不包含具体内容时，设置为零，否则这里填充内容的字节长度数，并追加密文内容。
 4. 指令内容。当指令包含内容时，此处填写密文的指令内容。解密方法请继续向下阅读。


这里附上一张截图供参阅，其中红框标记的就是指令字段：






指令传输方式


a) 通讯加密


上述配置信息中的 cncip1 和 cncport1 便是攻击者实际使用的主控节点。PinkBot 连接到 cnc 后将通过密钥交换方式来做加密通信，细节如下：


 1. 使用的密码学库为：mbedtls;
 2. 密钥交换阶段使用的交换算法 ecdh，加载曲线为 MBEDTLS_ECP_DP_CURVE25519;
 3. 服务端ECDH公钥前期为硬编码在样本中，跟踪后期，则改为在配置信息中指定。但内容没有变化过：14 90 33 DF B5 E2 2A 09 D3 2E D5 69 9A 18 F1 65 C6 AF 4C 95 14 E6 BE 17 37 75 A5 E6 78 53 A6 0D
 4. 报文加密/解密阶段使用的算法为 aes, key 为密钥交换后的secret，加载参数为 MBEDTLS_AES_ENCRYPT 和MBEDTLS_AES_DECRYPT;
 5. 在ECDH的标准中，一般双方的公私钥是每次都要重新生成。但在 PinkBot 中，却只要求了 Bot 侧每次不同，而服务端则指定一对固定的公私钥。这种内置服务端公钥的方式，就等于让 Bot 有能力对 CNC 进行身份验证，从而杜绝了通讯过程被中间人攻击的可能性。


b) 指令内容编码


为了能够同时适配 mipsb/mipsl 机型中字节序列的分布不同，传输的内容其实是经过开源库nanopb 转化后的内容，这个库可以通过约定模版的方式来抽象序列化和反序列化的过程，从而忽略掉大/小端内存的干扰。



指令功能


PinkBot 指令具有丰富的控制能力：




 1.  文件下载
 2.  系统命令执行
 3.  DDoS攻击（HTTP攻击和 UDP 攻击）
 4.  扫描功能（扫描的具体内容可以通过指令设置）
 5.  汇报设备信息（CPU/系统类型/内存信息/系统版本/硬件信息）
 6.  自身更新（将新版本保存到 /tmp/client 后运行）
 7.  P2P节点列表同步（直接推送一组P2P节点到Bot）
 8.  http报文注入广告（在受害设备上，嗅探交互报文，遇到http网页时，插入广告js脚本）
 9.  启动sock5代理服务（在Bot端架设 Socks5 代理服务，账号密码通过指令设置）
 10. 下载文件并执行
 11. 停止攻击
 12. 重置watchdog




PinkBot 持久化方式


与我们常见到的 botnet 不同，PinkBot 为了保持对感染设备的绝对控制权，会在感染光猫后，重新刷写原有的光猫固件。在刷写后的固件中，包含了 PinkBot 的下载器母体和配套的启动程序。


下图是被感染后新增/修改的文件列表：





其中tmp目录的内容可以暂时忽略，这是样本运行中生成的临时文件。


关键文件说明：


 * /bin/protect：md5:9ec5bd857b998e60663e88a70480b828


protect 文件是被刷写固件中的Bot母本。文件中未发现收益类功能，换句话说它更像是一个下载器，在这个样本中可以看到以上5种获取配置信息的代码。它最主要的功能，就是启动后会从配置信息中拿到最新的样本并把它们运行起来。


 * /bin/tr69c: md5:451a3cf94191c64b5cd1be1a80be7799


tc69c 文件是光猫原始固件中 tr69c 的一个patch版本。通过对比分析，发现该patch主要移除了光猫的更新功能。也就是说，被刷写的光猫，将无法通过 tr69c 进行固件升级。这应该是攻防对抗中引入的持久化操作。



PinkBot 规模评估与指令跟踪



规模评估


前面提到，每个受感染的 PinkBot 都会通过 udp 123 端口以 p2p 方式来分发配置信息。利用这个特性，我们在全网范围内对 PinkBot 的感染量进行了持续评估（评估数据统计那堆表要不要列一波？）。



指令跟踪


我们通过模拟 PinkBot 来实时接收CNC主控分发的指令。

除了日常的维护类指令（心跳指令/peerlist同步指令）外，我们还收到了多条向WEB网页插入广告的指令，例如：


<script async src="http【:】//45.32.21.251/j/?$$"></script>
<script async src="http【:】//167.179.80.159/j/?$$"></script>
<script async src=“http【:】//114.55.124.13/j/?$$“></script>




番外：与 PinkBot 对抗的那些事儿


在对 PinkBot 僵尸网络分析跟踪的过程中。我们注意到，攻击者和相关厂商进行了多次的攻防对抗。

这一章节将简单梳理下我们了解到的与 PinkBot 攻防对抗的尝试。



设备厂商的对抗（此章节涉及到厂商利益，慎重公开）


根据一个涉事厂商（四川天邑）提供的信息，对抗最早发生在 2019 年 11 月中旬。受攻击的漏洞源于一个 TCP-17998 的管控服务，该服务是对运营商提供的一个管理家用光猫的接口。由于服务配置和实现的失误，向公网开放了访问权限，攻击者通过它获取了相关光猫的控制权。


第一次对抗: 厂商在发现这个问题后，开始试图在公网上通过相同的漏洞，修复自家设备。但很快就被攻击者发现并马上采取行动，通过 iptables 关闭了 TCP-17998 的外网访问能力，从设备内部阻止了厂商的进一步修复。


第二次对抗：此次攻防的焦点在 tr069 升级通道。厂商从运营商侧可以在设备启动瞬间利用 tr096 进去修复设备。然而此次攻击者仍然在第一时间察觉到问题，并迅速更新固件关掉了tr096 的更新通道。


第三次对抗：厂商又尝试利用设备上 LAN 侧的 TCP-80 HTTP 服务来进行设备修复，然而，同样的结局，攻击者很快又更新固件把设备上的 HTTP 服务文件干掉了。至此，所有的光猫都成了网络孤岛，它们只能提供终端用户的正常网上冲浪的能力，却再没有网络端口可以供外侧管理访问。


最后的方案：厂商已经完全没有还击的筹码了。如果要修复这些孤岛，只能派人入户接触光猫，拆解出调试接口或者干脆为用户更换光猫。


复盘总结：设备厂商与攻击者多轮的攻防对抗中，双方的信息和能力是不对等的。厂商在无法获知全网受害情况的前提下，从互联网上一个IP一个IP的发现设备/修复设备。而攻击者通过集中C&C的机制，统一下发关服务指令。虽然，厂商修复了一部分设备得到了局部胜利，但攻击者仍然保住了大部分胜利果实获取了全局胜利。



GITHUB 封相关账号


我们在实际跟踪中通过残留的早期指令发现，PinkBot 至少已经存在一年以上了，最早可以追溯到 2018年10月16日，当时使用的 github 帐号为 pink78day（这个账号早就已经看不到了，我们通过搜索Google的网页快照服务追溯）。





目前 PinkBot 使用的帐号是 2019年11月下旬注册的 mypolo111，而 pink78day 这个账号已经无法在 Github 上搜索到，所以我们推测，Github 在发现这个项目后对帐号采取了屏蔽措施，而最近一次攻防也就发生在 2019年11下旬 PinkBot 换帐号这个时间点。


复盘总结：对于GITHUB来说，PinkBot 数量巨大，且访问的项目是一个明显恶意的项目，会消耗较多的服务资源，于情于理，GITHUB 都要封杀这个僵尸网络。问题在于，他们误认为 pink78day 是一个集中分发指令的渠道，以为单纯封杀这个账号就没事了。但事实上，这个账号只是一个相对下游的控制手段。攻击者通过增加BTC钱包的交易记录就可以瞬间将Bot重定向到一个新的账号上。消耗资源的问题依然存在，此次攻防无所谓成功失败。Nice try.



IOC



C&C地址


通过长期跟踪，攻击者使用过的CNC地址有：


cnc.pinklander[.]com
144.202.109.110:40080
144.202.109.110:32876
207.148.70.25:12368
45.32.125.150:12368
45.32.125.188:12368
45.32.174.105:12368
5.45.79.32:12368



PS: 其中 cnc.pinklander.com 在2019年12月28日，已经被我们的DNSMon系统自动识别并加黑处理了。



同步服务


PinkBot 会通过HTTP服务同步样本，用于更新或扩大感染。所用的HTTP服务有一些是公有服务，有一些是临时建立的HTTP服务。

在长期的跟踪中，我们确定至少存在以下URL被用于样本同步。这些URL均提取自 PinkBot 的配置信息中。


http[:]//1.198.50.63:1088/dlist.txt
http[:]//1.63.19.10:19010/var/sss/dlist.txt
http[:]//104.207.142.132/dlist.txt
http[:]//108.61.158.59/dlist.txt
http[:]//111.61.248.32:1088/dlist.txt
http[:]//112.26.43.199:81/dlist.txt
http[:]//113.106.175.43:19010/tmp/pinkdown/dlist.txt
http[:]//117.131.10.102:1088/d/dlist.txt
http[:]//123.13.215.89:8005/d/dlist.txt
http[:]//125.74.208.220:81/dlist.txt
http[:]//140.82.24.94/dlist.txt
http[:]//140.82.30.245/d/dlist.txt
http[:]//140.82.53.129/dlist.txt
http[:]//144.202.38.129/dlist.txt
http[:]//149.28.142.167/p/dlist.txt
http[:]//149.28.142.167/p1/dlist.txt
http[:]//155.138.140.245/dlist.txt
http[:]//167.179.110.44/dlist.txt
http[:]//173.254.204.124:81/dlist.txt
http[:]//182.139.215.4:82/dlist.txt
http[:]//207.148.4.202/dlist.txt
http[:]//218.25.236.62:1987/d/dlist.txt
http[:]//218.25.236.62:1988/d/dlist.txt
http[:]//222.216.226.29:81/dlist.txt
http[:]//45.32.26.220/dlist.txt
http[:]//45.76.104.146/dlist.txt
http[:]//45.77.165.83/p1/dlist.txt
http[:]//45.77.198.232/p1/dlist.txt
http[:]//45.88.42.38/p1/dlist.txt
http[:]//61.149.204.230:81/dlist.txt
http[:]//66.42.114.73/dlist.txt
http[:]//66.42.67.148/dlist.txt
http[:]//8.6.193.191/dlist.txt
http[:]//95.179.238.22/dlist.txt
https[:]//fse7.oss-cn-shanghai.aliyuncs.com/dlist.txt
https[:]//fys6y.oss-cn-shanghai.aliyuncs.com/dlist.txt
https[:]//gitee.com/b9g/zt/raw/master/dlist.txt
https[:]//gitee.com/bg64/gy/raw/master/dlist.txt
https[:]//gitee.com/bg64/xt/raw/master/dlist.txt
https[:]//gitee.com/d3fg/su/raw/master/dlist.txt
https[:]//gitee.com/fe354/xx/raw/master/dlist.txt
https[:]//gitee.com/fh8y/i9/raw/master/dlist.txt
https[:]//gitee.com/g6y/qu/raw/master/dlist.txt
https[:]//gitee.com/g7u/hi/raw/master/dlist.txt
https[:]//gitee.com/gb7e/sh/raw/master/dlist.txt
https[:]//gitee.com/ggf2/zt/raw/master/dlist.txt
https[:]//gitee.com/hni/cfi/raw/master/dlist.txt
https[:]//gitee.com/ji9/zg/raw/master/dlist.txt
https[:]//gitee.com/johncase/zip/raw/master/dlist.txt
https[:]//gitee.com/k9o/st/raw/master/dlist.txt
https[:]//gitee.com/k9o/u8/raw/master/dlist.txt
https[:]//gitee.com/mh8i/zt/raw/master/dlist.txt
https[:]//gitee.com/nick908/hello/raw/master/dlist.txt
https[:]//gitee.com/nick908/sc/raw/master/dlist.txt
https[:]//gitee.com/oubv/bh/raw/master/dlist.txt
https[:]//gitee.com/s7y/xx/raw/master/dlist.txt
https[:]//gitee.com/t9i/y7/raw/master/dlist.txt
https[:]//gitee.com/u8i/fo/raw/master/dlist.txt
https[:]//gitee.com/ujh5/ho/raw/master/dlist.txt
https[:]//gitee.com/vd5/y8/raw/master/dlist.txt
https[:]//gitee.com/vd5/y9/raw/master/dlist.txt
https[:]//gitee.com/vr6/sh/raw/master/dlist.txt
https[:]//gitee.com/y7u/bh/raw/master/dlist.txt
https[:]//gitee.com/y7u/eg/raw/master/dlist.txt
https[:]//gitee.com/y7u/lp/raw/master/dlist.txt
https[:]//gitee.com/y7u/rt/raw/master/dlist.txt
https[:]//gitee.com/y7u/xc/raw/master/dlist.txt
https[:]//hj9o.oss-cn-hangzhou.aliyuncs.com/dlist.txt
https[:]//hjis.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//kol5.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//n609.coding.net/p/t/d/t/git/raw/master/dlist.txt
https[:]//okp9.oss-cn-beijing.aliyuncs.com/dlist.txt
https[:]//raw.githubusercontent.com/pink78day/helloworld/master/dlist.txt




MD5


通过跟踪获取到的相关样本（ELF）汇总如下：


9ec5bd857b998e60663e88a70480b828 /bin/protect
451a3cf94191c64b5cd1be1a80be7799 /bin/tr69c
06d6ad872e97e47e55f5b2777f78c1ba slient_l
07cd100c7187e9f4c94b54ebc60c0965 slient_b
0f25b0d54d05e58f5900c61f219341d3 client_b
0f89e43ea433fdfd18a551f755473388 slient_l
1197994610b2ffb60edbb5ab0c125bc0 client_b
167364ad0d623d17332f09dbb23a980e client_b
175b603082599838d9760b2ab264da6f slient_l
1a6dce9916b9b6ae50c1457f5f1dfbbd slient_l
229503686c854bb39efdc84f05b071b9 slient_b
25a07e3ef483672b4160aa12d67f5201 client_l
262a4e242c9ebeba79aa018d8b38d229 client_l
29d0afd2a244c9941976ebf2f0f6597f client_l
2befedd020748ff6d9470afad41bd28c slient_b
2ca5810744173889b2440e4f25b39bd4 client_l
36e48e141943a67c6fdeaa84d7af21cc client_b
3a620ff356686b461e0e1a12535bea24 slient_l
41bbe8421c0a78067bae74832c375fe8 slient_l
45ee78d11db54acfdda27c19e44c3126 client_l
4830c3950957093dac27d4e87556721e slient_l
484761f281cb2e64d9db963a463efca5 client_l
48a7f2799bf452f10f960159f6a405d3 client_l
494412638dc8d573172c1991200e1399 client_l
4c83ad66189a7c4d2f2afdbfb94d0e65 slient_b
50270de8d5783bb0092bf1677b93c97b slient_l
54aa9e716567bd0159f4751916f7f0d1 client_l
5ae1fec20c2f720269c2dc94732187e8 slient_b
5b62a9bd3431c2fd55283380d81c00fa client_b
5c322610e1845d0be9ccfc8a8b6a4c4f client_l
5c4f8dae67dad8cac141afa00847b418 slient_b
5d0d034845bd69179bf678104c046dc1 client_b
60658ef214c960147200d432eece3e13 slient_l
60a2b1bb02a60ac49f7cc1b47abdf60c client_l
610f0aadba3be1467125607bf2ba2aaf slient_l
66a068fd860bda7950fde8673d1b5511 client_b
6c4de9bd490841f0a6c68638f7253c65 client_b
72c531a813b637af3ea56f288d65cdb7 slient_b
7608b24c8dcf3cd7253dbd5390df8b1f client_b
7645a30a92863041cf93a7d8a9bfba1a client_b
857fc3c7630859c20d35d47899b75699 slient_b
861af6b5a3fea01f2e95c90594c62e9d client_l
8e86be3be36094e0f5b1a6e954dbe7c2 client_l
8fbcd7397d451e87c60a0328efe8cd5d client_b
987a9befb715b6346e7ad0f6ac87201f slient_b
9eb147e3636a4bb35f0ee1540d639a1b slient_b
aa2fc46dd94cbf52aef5e66cdd066a40 client_l
ae8b519504afc52ee3aceef087647d36 slient_b
b0202f1e8bded9c451c734e3e7f4e5d8 slient_b
b6f91ad027ded41e2b1f5bea375c4a42 slient_b
b9935859b3682c5023d9bcb71ee2fece slient_b
b9d1c31f59c67289928e1bb7710ec0ba client_l
bec2f560b7c771d7066da0bee5f2e001 client_b
c2efa35b34f67a932a814fd4636dd7cb slient_l
c839aff2a2680fb5676f12531fecba3b slient_b
c94504531159b8614b95c62cca6c50c9 slient_l
dfe0c9d36062dd3797de403a777577a6 client_b
e19a1106030e306cc027d56f0827f5ce slient_l
f09b45daadc872f2ac3cc6c4fe9cff90 client_b
f5381892ea8bd7f5c5b4556b31fd4b26 client_b
f55ad7afbe637efdaf03d4f96e432d10 slient_b
f62d4921e3cb32e229258b4e4790b63a client_b
f81c8227b964ddc92910890effff179b slient_b
fc5b55e9c6a9ddef54a256cc6bda3804 client_b
fe8e830229bda85921877f606d75e96d slient_l
fee6f8d44275dcd2e4d7c28189c5f5be client_l


{"version":"0.3.1","atoms":[],"cards":[["markdown",{"markdown":"# 概述\n2019年11月21日，安全社区的信任伙伴给我们提供了一个全新的僵尸网络样本，相关样本中包含大量以 pink 为首的函数名，所以我们称之为 PinkBot。\n\nPinkbot 是我们六年以来观测到最大的僵尸网络，其攻击目标主要是 mips 光猫设备，已知总感染量超过160万，其中 96% 位于中国。\n\nPinkBot 具有很强的技术能力：\n\n1. PinkBot 架构设计具备很好的健壮性，它能够通过多种方式（通过第三方服务分发配置信息/通过 P2P 方式分发配置信息/通过 CNC 分发配置信息）自发寻址控制端，并对控制端通信有完备的校验，确保僵尸节点不会因某一个环节的阻杀而丢失或被接管；甚至对光猫固件做了多处改动后，还能确保光猫能够正常使用；  \n2. PinkBot对部分域名的解析查询采取了 DNS-Over-HTTPS 的方式，这个也是在传统BotNet中不太常见的一种手段；\n3. 在与相关厂商的屡次攻防博弈中，PinkBot 的运营者都占据了明显的对抗优势。\n\n可以说，PinkBot 在整个过程中表现出了极强的针对性和专业性，各方面能力都很均衡，甚至有些可怕。\n\n# 规模及影响范围\n我们通过对多个数据源的交叉对比，推测 PinkBot 的感染量在百万量级。三个评估的数据源如下：\n1.\t2019-11-30我们从可信任的安全伙伴手里拿到一个统计数字，日活去重 1,962,308 个IP;\n2.\t2020-01-02从CNCERT拿到的统计结果：\n```“该僵尸网络的规模目前无法准确测算。根据NetFlow数据、主动探测数据、实时监测数据等多个维度的数据测算，该僵尸网络关联的Bot节点IP地址数量超过500万。对这些IP地址的定位数据进行统计发现，IP主要为联通的家庭宽带用户地址。因家庭宽带IP是动态分配的，背后的真实感染设备规模无法精确估计，推测实际感染设备数量在百万级，测算的一个主要依据为曾监测到1分钟内连接C2的IP数量超过百万。”```\n3. 根据我们 (360NetLab) 在全网范围内持续探测的数据评估，2020-01-08 当天活跃的受感染 IP 数量为 165 万。\n\n在我们全网探测的测量数据中，受感染的 IP 主要集中在中国 (96%)，遍及全国 33 个省。受影响的运营商主要涉及中国联通（>80%）和中国电信（>15%）。\n\n目前已确认有三款设备受到影响：TEWA-800E，KD-YUN-811E 和 ipTIME-N904NS。\n\n# PinkBot 技术架构\nPinkBot是一个同时融合了“P2P”和“CNC”的混合结构僵尸网络。一般情况下，它将时效性要求不高的指令（如管理配置信息）通过P2P的方式传递，将时效性要求较高的指令通过CNC模式集中分发（例如：发起ddos攻击，向用户访问的HTTP网站中插广告）。\n\n## 配置信息\n\n对于每一个Bot来说，最重要的一步是找到自己的管理员。而管理员的信息就包含在“配置”之中，下面是最新截获的配置信息：\n\n```\n{\n  \"verify\": \"1585065675\",\n  \"cncip1\": \"144.202.109.110\",\n  \"cncport1\": \"32876\",\n  \"dlc\": \"5b62596bc1453d51cc7241086464f294\",\n  \"dl\": \"http【:】//155.138.140.245/dlist.txt\",\n  \"dlc1\": \"484417e6f65c8e18e684d60c03c4680a\",\n  \"dl1\": \"https【:】//gitee.com/johncase/zip/raw/master/dlist.txt\",\n  \"sd0\": \"1.1.1.1\",\n  \"sdp0\": \"443\",\n  \"srvk\": \"FJAz37XiKgnTLtVpmhjxZcavTJUU5r4XN3Wl5nhTpg0=\",\n  \"pxy\": \"1\"\n}\n```\n\n1. 其中 verify 字段为指令发布的时间戳，Bot会根据这个时间戳筛选出最新的有效指令。\n2. 随后的 cncip 和 cncport 字段指明了僵尸网络的最新CNC地址，攻击者会根据自身需求随时切换这个控制地址。\n3. 再随后的“dlc/dl”和 “dlc1/dl1” 字段组为最新的Bot更新地址，其中dlc和dlc1为对应内容的Hash校验字段，算法伪代码为：MD5(MD5(dlist_content)+SHA256(dlist_content))。\n4. “sd0/sdp0”字段为安全DNS地址，对于每一个Bot来说，当需要查询DNS解析记录时，将通过这里指定的DNS服务来查询。且方式为DNS-Over-HTTPS。\n5. srvk字段为服务端的公钥内容（base64编码）。对于每一个bot来说，它和CNC的通讯都是加密的。所以实际通讯前要先经过ECDH的密钥协商得到一个唯一的私钥。在这里指定了CNC端的公钥后，还可以顺带完成了Bot对CNC身份的验签。这是对原有 ECDH 的扩展使用。\n6. pxy字段，推测是一个代理上线的选项。目前没有看到使用迹象，不清楚具体的工作逻辑。\n\n### 配置信息的保护\n通过上一节的介绍，不难发现“配置信息”其实就是这个僵尸网络的核心，它保证了攻击者对僵尸网络的绝对控制能力。\n为了防止其他人发现配置信息，传递的配置信息都是异或加密过的密文。异或加解密算法是对称的，其解密代码逻辑如下：\n\n```\ndef easydecrpyt(message):\n    res = \"\"\n    for cursor in range(0, len(message)):\n        mbt = ord(message[cursor])\n        res += (chr((mbt ^ (cursor%0xff) ^ 0xae ^ 0xac ^ 0xbe ^ 0xef) & 0xff))\n    return res\n```\n\n信息加密后，为了防止他人伪造。攻击者还使用了ecdsa对配置信息进行了签名，签名细节如下：\n\n1. 签名校验使用的密码库为 mbedtls；\n2. 签名算法为 ECDSA；\n3. 签名时使用的曲线为：MBEDTLS_ECP_DP_SECP192R1；\n4. 验签所用公钥为： `04 8D 54 71 71 44 A0 61 DA 5A B4 EA 40 55 2F 21 B1 9B 6C A5 17 92 0F 10 B5 11 56 ED 14 DB 54 47 1A 94 48 06 06 3C 7A B4 3B 25 D1 AC 9F 85 AF 33 9E`\n\n\n### 配置信息的分发\n\n除了保证配置信息的机密性和完整性外，攻击者还使用了多种手段来分发配置信息，以确保其可用性。\n\n#### a) 通过第三方服务分发配置信息\n\n1. 通过 BTC+GITHUB 分发配置信息\n\n该分发渠道的核心是一个隐藏在GITHUB上的项目，比如最近一次看到的项目就是（mypolo111/vfg），可以看到这个项目的README中，有两行内容。\n\n![](__GHOST_URL__/content/images/2019/11/pink_readme.png)\n\n其中，模式为`P!!<base64>I!!`行是配置签名，模式为`N!!<base64>K!!`行是配置信息的密文。\n\n但对于每一个Bot来说，想要找到这个隐藏项目却很复杂。最初，先从一个固定的BTC钱包\\[`1GQNam6xhzYVLWWXvRfu3EjsFon6n6GxMF`\\] 的转账记录生成一个 topic 标签，在逆向样本相关代码之后，我还原了这个过程，如下图所示（BTC钱包的查询用到了四个web服务，具体的地址也如图中所示）：\n\n![](__GHOST_URL__/content/images/2019/11/image.png)\n\n对于每一个可能的topic标签，都有很多相关的github项目。遍历这些项目的ISSUES，寻找一个格式为 `...!<base64>...?` 的字串，比如我们最近找到的一个就是 `...!L215cG9sbzExMS92Zmc=...?` 将这个base64 还原，就是隐藏项目的地址了 `mypolo111/vfg`\n\n\n再通过搜索 GITHUB 的 Topics 和 ISSUES，找到那个隐藏的GIT项目。\n\n另：mypolo111 这个账号在多个项目中提交过ISSUES，相关截图如下所示：\n\n![](__GHOST_URL__/content/images/2019/11/mypolo111_issues.png)\n\n\nPS：在这一套寻址逻辑下，攻击者可以通过为 “特定BTC钱包” 增加交易记录的方式，来切换最终找到的 GITHUB 项目。在这样的前提下须封掉指定BTC钱包才能破坏这个僵尸网络以 GITHUB 为主的分发逻辑。\n\n2. 通过 百度tieba 分发配置信息\n\n攻击者在少部分样本中还尝试利用“百度tieba”分发配置信息，这一部分的逻辑和利用GITHUB分发的逻辑相似。\n\n2022年3月1日，百度的同事找到了贴吧相关。[pkbidu_001](https://tieba.baidu.com/home/main?id=tb.1.17f95408.DWQgYsTdICFVLfwoPkWw4g&fr=pb),以及多个该账号相关的帖子https://tieba.baidu.com/p/5949662828?red_tag=2156548834 和 https://tieba.baidu.com/p/6418396904?pid=129106150828&cid=#129106150828\n\n其帖子内容经过base64编码解密后，可直接关联到 pink。\n\n```\n$ echo aHR0cDovL2NuYy5waW5rbGFuZGVyLmNvbS9w | base64 -d\nhttp://cnc.pinklander.com/p\n$ echo aHR0cHM6Ly9naXRodWIuY29tL215cG9sbzExMS92Zmcv | base64 -d\nhttps://github.com/mypolo111/vfg/\n```\n\n![pink_baidu_tieba_--_3](__GHOST_URL__/content/images/2022/03/pink_baidu_tieba_--_3.png)\n\n![pink_baidu_tieba_--](__GHOST_URL__/content/images/2022/03/pink_baidu_tieba_--.png)\n\n#### b) 通过 P2P 方式分发配置信息\n1. P2P-Over-UDP123 分发配置信息\n\nBot节点运行后，会在本地监听 UDP-123 端口，该端口原本是NTP服务默认端口，所用的协议也具有一定的迷惑性。一段时间后，会向公网的四个B段地址（\"114.25.0.0/16\"，\"36.227.0.0/16\"，\"59.115.0.0/16\"，\"1.224.0.0/16\"）发起 Peer 探测请求，内容为 `1C 00 00 00` 当目标为正常的 NTP 服务器时会得到 NTP 时间，而如果目标为一个Bot节点时，则有两种回复：\n\n  - 当目标Bot未取得主控信息时回复 `1D 00 00 00`；\n  - 当目标Bot拿到主控信息时，会将主控信息的签名和相应密文回复，发送前，会在信息头补充 0xE3 字节。\n\n下图是最近捕获到的UDP-123 传递的配置信息。\n\n![UDP-123-hexdata](__GHOST_URL__/content/images/2020/03/UDP-123-hexdata.png)\n\n2. 通过 P2P-Over-TCP 分发配置信息\n\nBot 节点运行后，还会在本地监听一个 TCP 端口，且端口号是通过其公网 IP 计算后得到的，代码如下图所示：\n\n![](__GHOST_URL__/content/images/2020/01/p2p_getport_byip.png)\n\n交互协议的格式同UDP123上的相同。\n\n#### c) 通过 CNC 分发配置信息\n\n攻击者在部分样本中内置了一个域名 cnc.pinklander.com ，当该域名启用后，会展示一个web页面，页面内容和GITHUB项目的内容相同。也是base64 编码后的配置信息。\n\n\n## PinkBot 指令\n\n### 指令格式\n\n每条指令至少包含7字节，含义依此如下：\n\n1. Token字段，长度4字节，该字段值由服务器端指定，指定后将一直使用这个值。设置方式为：Bot启动后首先会向CC发送新生成的ECDH的公钥，此刻Token为0，当服务端接受后，会分配一个Token值给Bot，这就算指定成功了。\n2. 指令字段，长度1字节。CC发出指令后，Bot也要用相同的指令码把执行结果返回。\n3. 内容长度字段，长度2字节。当指令不包含具体内容时，设置为零，否则这里填充内容的字节长度数，并追加密文内容。\n4. 指令内容。当指令包含内容时，此处填写密文的指令内容。解密方法请继续向下阅读。\n\n这里附上一张截图供参阅，其中红框标记的就是指令字段：\n\n![Snip20191130_9](__GHOST_URL__/content/images/2020/03/Snip20191130_9.png)\n\n### 指令传输方式\n#### a) 通讯加密\n\n上述配置信息中的 cncip1 和 cncport1 便是攻击者实际使用的主控节点。PinkBot 连接到 cnc 后将通过密钥交换方式来做加密通信，细节如下：\n\n1. 使用的密码学库为：`mbedtls`;\n2. 密钥交换阶段使用的交换算法 `ecdh`，加载曲线为 `MBEDTLS_ECP_DP_CURVE25519`;\n3. 服务端ECDH公钥前期为硬编码在样本中，跟踪后期，则改为在配置信息中指定。但内容没有变化过：`14 90 33 DF B5 E2 2A 09 D3 2E D5 69 9A 18 F1 65 C6 AF 4C 95 14 E6 BE 17 37 75 A5 E6 78 53 A6 0D`\n4. 报文加密/解密阶段使用的算法为 `aes`, key 为密钥交换后的secret，加载参数为 `MBEDTLS_AES_ENCRYPT` 和`MBEDTLS_AES_DECRYPT`;\n5. 在ECDH的标准中，一般双方的公私钥是每次都要重新生成。但在 PinkBot 中，却只要求了 Bot 侧每次不同，而服务端则指定一对固定的公私钥。这种内置服务端公钥的方式，就等于让 Bot 有能力对 CNC 进行身份验证，从而杜绝了通讯过程被中间人攻击的可能性。\n\n#### b) 指令内容编码\n\n为了能够同时适配 mipsb/mipsl 机型中字节序列的分布不同，传输的内容其实是经过开源库[nanopb](https://github.com/nanopb/nanopb) 转化后的内容，这个库可以通过约定模版的方式来抽象序列化和反序列化的过程，从而忽略掉大/小端内存的干扰。\n\n### 指令功能\nPinkBot 指令具有丰富的控制能力：\n\n> 1. 文件下载\n> 2. 系统命令执行\n> 3. DDoS攻击（HTTP攻击和 UDP 攻击）\n> 4. 扫描功能（扫描的具体内容可以通过指令设置）\n> 5. 汇报设备信息（CPU/系统类型/内存信息/系统版本/硬件信息）\n> 6. 自身更新（将新版本保存到 /tmp/client 后运行）\n> 7. P2P节点列表同步（直接推送一组P2P节点到Bot）\n> 8. http报文注入广告（在受害设备上，嗅探交互报文，遇到http网页时，插入广告js脚本）\n> 9. 启动sock5代理服务（在Bot端架设 Socks5 代理服务，账号密码通过指令设置）\n> 10. 下载文件并执行\n> 11. 停止攻击\n> 12. 重置watchdog  \n\n\n## PinkBot 持久化方式\n与我们常见到的 botnet 不同，PinkBot 为了保持对感染设备的绝对控制权，会在感染光猫后，重新刷写原有的光猫固件。在刷写后的固件中，包含了 PinkBot 的下载器母体和配套的启动程序。\n\n下图是被感染后新增/修改的文件列表：\n\n![pink_flash_tree_diff](__GHOST_URL__/content/images/2020/03/pink_flash_tree_diff.png)\n\n其中tmp目录的内容可以暂时忽略，这是样本运行中生成的临时文件。\n\n关键文件说明：\n  - /bin/protect：`md5:9ec5bd857b998e60663e88a70480b828`\n\nprotect 文件是被刷写固件中的Bot母本。文件中未发现收益类功能，换句话说它更像是一个下载器，在这个样本中可以看到以上5种获取配置信息的代码。它最主要的功能，就是启动后会从配置信息中拿到最新的样本并把它们运行起来。\n\n  - /bin/tr69c:  `md5:451a3cf94191c64b5cd1be1a80be7799`\n\ntc69c 文件是光猫原始固件中 tr69c 的一个patch版本。通过对比分析，发现该patch主要移除了光猫的更新功能。也就是说，被刷写的光猫，将无法通过 tr69c 进行固件升级。这应该是攻防对抗中引入的持久化操作。\n\n\n# PinkBot 规模评估与指令跟踪\n## 规模评估\n前面提到，每个受感染的 PinkBot 都会通过 udp 123 端口以 p2p 方式来分发配置信息。利用这个特性，我们在全网范围内对 PinkBot 的感染量进行了持续评估（评估数据统计那堆表要不要列一波？）。\n\n## 指令跟踪\n\n我们通过模拟 PinkBot 来实时接收CNC主控分发的指令。\n除了日常的维护类指令（心跳指令/peerlist同步指令）外，我们还收到了多条向WEB网页插入广告的指令，例如：\n\n```\n<script async src=\"http【:】//45.32.21.251/j/?$$\"></script>\n<script async src=\"http【:】//167.179.80.159/j/?$$\"></script>\n<script async src=“http【:】//114.55.124.13/j/?$$“></script>\n```\n\n# 番外：与 PinkBot 对抗的那些事儿\n\n在对 PinkBot 僵尸网络分析跟踪的过程中。我们注意到，攻击者和相关厂商进行了多次的攻防对抗。\n这一章节将简单梳理下我们了解到的与 PinkBot 攻防对抗的尝试。\n\n## 设备厂商的对抗（此章节涉及到厂商利益，慎重公开）\n\n根据一个涉事厂商（四川天邑）提供的信息，对抗最早发生在 2019 年 11 月中旬。受攻击的漏洞源于一个 TCP-17998 的管控服务，该服务是对运营商提供的一个管理家用光猫的接口。由于服务配置和实现的失误，向公网开放了访问权限，攻击者通过它获取了相关光猫的控制权。\n\n*第一次对抗*: 厂商在发现这个问题后，开始试图在公网上通过相同的漏洞，修复自家设备。但很快就被攻击者发现并马上采取行动，通过 iptables 关闭了 TCP-17998 的外网访问能力，从设备内部阻止了厂商的进一步修复。\n\n*第二次对抗*：此次攻防的焦点在 tr069 升级通道。厂商从运营商侧可以在设备启动瞬间利用 tr096 进去修复设备。然而此次攻击者仍然在第一时间察觉到问题，并迅速更新固件关掉了tr096 的更新通道。\n\n*第三次对抗*：厂商又尝试利用设备上 LAN 侧的 TCP-80 HTTP 服务来进行设备修复，然而，同样的结局，攻击者很快又更新固件把设备上的 HTTP 服务文件干掉了。至此，所有的光猫都成了网络孤岛，它们只能提供终端用户的正常网上冲浪的能力，却再没有网络端口可以供外侧管理访问。\n\n*最后的方案*：厂商已经完全没有还击的筹码了。如果要修复这些孤岛，只能派人入户接触光猫，拆解出调试接口或者干脆为用户更换光猫。\n\n*复盘总结*：设备厂商与攻击者多轮的攻防对抗中，双方的信息和能力是不对等的。厂商在无法获知全网受害情况的前提下，从互联网上一个IP一个IP的发现设备/修复设备。而攻击者通过集中C&C的机制，统一下发关服务指令。虽然，厂商修复了一部分设备得到了局部胜利，但攻击者仍然保住了大部分胜利果实获取了全局胜利。\n\n\n## GITHUB 封相关账号\n\n我们在实际跟踪中通过残留的早期指令发现，PinkBot 至少已经存在一年以上了，最早可以追溯到 2018年10月16日，当时使用的 github 帐号为 pink78day（这个账号早就已经看不到了，我们通过搜索Google的网页快照服务追溯）。\n\n![pink78day](__GHOST_URL__/content/images/2020/03/pink78day.png)\n\n目前 PinkBot 使用的帐号是 2019年11月下旬注册的 mypolo111，而 pink78day 这个账号已经无法在 Github 上搜索到，所以我们推测，Github 在发现这个项目后对帐号采取了屏蔽措施，而最近一次攻防也就发生在 2019年11下旬 PinkBot 换帐号这个时间点。\n\n*复盘总结*：对于GITHUB来说，PinkBot 数量巨大，且访问的项目是一个明显恶意的项目，会消耗较多的服务资源，于情于理，GITHUB 都要封杀这个僵尸网络。问题在于，他们误认为 pink78day 是一个集中分发指令的渠道，以为单纯封杀这个账号就没事了。但事实上，这个账号只是一个相对下游的控制手段。攻击者通过增加BTC钱包的交易记录就可以瞬间将Bot重定向到一个新的账号上。消耗资源的问题依然存在，此次攻防无所谓成功失败。Nice try.\n\n# IOC\n## C&C地址\n\n通过长期跟踪，攻击者使用过的CNC地址有：\n\n```\ncnc.pinklander[.]com\n144.202.109.110:40080\n144.202.109.110:32876\n207.148.70.25:12368\n45.32.125.150:12368\n45.32.125.188:12368\n45.32.174.105:12368\n5.45.79.32:12368\n```\n\n**PS**: 其中 cnc.pinklander.com 在2019年12月28日，已经被我们的DNSMon系统自动识别并加黑处理了。\n\n## 同步服务\n\nPinkBot 会通过HTTP服务同步样本，用于更新或扩大感染。所用的HTTP服务有一些是公有服务，有一些是临时建立的HTTP服务。\n在长期的跟踪中，我们确定至少存在以下URL被用于样本同步。这些URL均提取自 PinkBot 的`配置信息`中。\n\n```\nhttp[:]//1.198.50.63:1088/dlist.txt\nhttp[:]//1.63.19.10:19010/var/sss/dlist.txt\nhttp[:]//104.207.142.132/dlist.txt\nhttp[:]//108.61.158.59/dlist.txt\nhttp[:]//111.61.248.32:1088/dlist.txt\nhttp[:]//112.26.43.199:81/dlist.txt\nhttp[:]//113.106.175.43:19010/tmp/pinkdown/dlist.txt\nhttp[:]//117.131.10.102:1088/d/dlist.txt\nhttp[:]//123.13.215.89:8005/d/dlist.txt\nhttp[:]//125.74.208.220:81/dlist.txt\nhttp[:]//140.82.24.94/dlist.txt\nhttp[:]//140.82.30.245/d/dlist.txt\nhttp[:]//140.82.53.129/dlist.txt\nhttp[:]//144.202.38.129/dlist.txt\nhttp[:]//149.28.142.167/p/dlist.txt\nhttp[:]//149.28.142.167/p1/dlist.txt\nhttp[:]//155.138.140.245/dlist.txt\nhttp[:]//167.179.110.44/dlist.txt\nhttp[:]//173.254.204.124:81/dlist.txt\nhttp[:]//182.139.215.4:82/dlist.txt\nhttp[:]//207.148.4.202/dlist.txt\nhttp[:]//218.25.236.62:1987/d/dlist.txt\nhttp[:]//218.25.236.62:1988/d/dlist.txt\nhttp[:]//222.216.226.29:81/dlist.txt\nhttp[:]//45.32.26.220/dlist.txt\nhttp[:]//45.76.104.146/dlist.txt\nhttp[:]//45.77.165.83/p1/dlist.txt\nhttp[:]//45.77.198.232/p1/dlist.txt\nhttp[:]//45.88.42.38/p1/dlist.txt\nhttp[:]//61.149.204.230:81/dlist.txt\nhttp[:]//66.42.114.73/dlist.txt\nhttp[:]//66.42.67.148/dlist.txt\nhttp[:]//8.6.193.191/dlist.txt\nhttp[:]//95.179.238.22/dlist.txt\nhttps[:]//fse7.oss-cn-shanghai.aliyuncs.com/dlist.txt\nhttps[:]//fys6y.oss-cn-shanghai.aliyuncs.com/dlist.txt\nhttps[:]//gitee.com/b9g/zt/raw/master/dlist.txt\nhttps[:]//gitee.com/bg64/gy/raw/master/dlist.txt\nhttps[:]//gitee.com/bg64/xt/raw/master/dlist.txt\nhttps[:]//gitee.com/d3fg/su/raw/master/dlist.txt\nhttps[:]//gitee.com/fe354/xx/raw/master/dlist.txt\nhttps[:]//gitee.com/fh8y/i9/raw/master/dlist.txt\nhttps[:]//gitee.com/g6y/qu/raw/master/dlist.txt\nhttps[:]//gitee.com/g7u/hi/raw/master/dlist.txt\nhttps[:]//gitee.com/gb7e/sh/raw/master/dlist.txt\nhttps[:]//gitee.com/ggf2/zt/raw/master/dlist.txt\nhttps[:]//gitee.com/hni/cfi/raw/master/dlist.txt\nhttps[:]//gitee.com/ji9/zg/raw/master/dlist.txt\nhttps[:]//gitee.com/johncase/zip/raw/master/dlist.txt\nhttps[:]//gitee.com/k9o/st/raw/master/dlist.txt\nhttps[:]//gitee.com/k9o/u8/raw/master/dlist.txt\nhttps[:]//gitee.com/mh8i/zt/raw/master/dlist.txt\nhttps[:]//gitee.com/nick908/hello/raw/master/dlist.txt\nhttps[:]//gitee.com/nick908/sc/raw/master/dlist.txt\nhttps[:]//gitee.com/oubv/bh/raw/master/dlist.txt\nhttps[:]//gitee.com/s7y/xx/raw/master/dlist.txt\nhttps[:]//gitee.com/t9i/y7/raw/master/dlist.txt\nhttps[:]//gitee.com/u8i/fo/raw/master/dlist.txt\nhttps[:]//gitee.com/ujh5/ho/raw/master/dlist.txt\nhttps[:]//gitee.com/vd5/y8/raw/master/dlist.txt\nhttps[:]//gitee.com/vd5/y9/raw/master/dlist.txt\nhttps[:]//gitee.com/vr6/sh/raw/master/dlist.txt\nhttps[:]//gitee.com/y7u/bh/raw/master/dlist.txt\nhttps[:]//gitee.com/y7u/eg/raw/master/dlist.txt\nhttps[:]//gitee.com/y7u/lp/raw/master/dlist.txt\nhttps[:]//gitee.com/y7u/rt/raw/master/dlist.txt\nhttps[:]//gitee.com/y7u/xc/raw/master/dlist.txt\nhttps[:]//hj9o.oss-cn-hangzhou.aliyuncs.com/dlist.txt\nhttps[:]//hjis.oss-cn-beijing.aliyuncs.com/dlist.txt\nhttps[:]//kol5.oss-cn-beijing.aliyuncs.com/dlist.txt\nhttps[:]//n609.coding.net/p/t/d/t/git/raw/master/dlist.txt\nhttps[:]//okp9.oss-cn-beijing.aliyuncs.com/dlist.txt\nhttps[:]//raw.githubusercontent.com/pink78day/helloworld/master/dlist.txt\n```\n\n## MD5\n\n通过跟踪获取到的相关样本（ELF）汇总如下：\n\n```\n9ec5bd857b998e60663e88a70480b828 /bin/protect\n451a3cf94191c64b5cd1be1a80be7799 /bin/tr69c\n06d6ad872e97e47e55f5b2777f78c1ba slient_l\n07cd100c7187e9f4c94b54ebc60c0965 slient_b\n0f25b0d54d05e58f5900c61f219341d3 client_b\n0f89e43ea433fdfd18a551f755473388 slient_l\n1197994610b2ffb60edbb5ab0c125bc0 client_b\n167364ad0d623d17332f09dbb23a980e client_b\n175b603082599838d9760b2ab264da6f slient_l\n1a6dce9916b9b6ae50c1457f5f1dfbbd slient_l\n229503686c854bb39efdc84f05b071b9 slient_b\n25a07e3ef483672b4160aa12d67f5201 client_l\n262a4e242c9ebeba79aa018d8b38d229 client_l\n29d0afd2a244c9941976ebf2f0f6597f client_l\n2befedd020748ff6d9470afad41bd28c slient_b\n2ca5810744173889b2440e4f25b39bd4 client_l\n36e48e141943a67c6fdeaa84d7af21cc client_b\n3a620ff356686b461e0e1a12535bea24 slient_l\n41bbe8421c0a78067bae74832c375fe8 slient_l\n45ee78d11db54acfdda27c19e44c3126 client_l\n4830c3950957093dac27d4e87556721e slient_l\n484761f281cb2e64d9db963a463efca5 client_l\n48a7f2799bf452f10f960159f6a405d3 client_l\n494412638dc8d573172c1991200e1399 client_l\n4c83ad66189a7c4d2f2afdbfb94d0e65 slient_b\n50270de8d5783bb0092bf1677b93c97b slient_l\n54aa9e716567bd0159f4751916f7f0d1 client_l\n5ae1fec20c2f720269c2dc94732187e8 slient_b\n5b62a9bd3431c2fd55283380d81c00fa client_b\n5c322610e1845d0be9ccfc8a8b6a4c4f client_l\n5c4f8dae67dad8cac141afa00847b418 slient_b\n5d0d034845bd69179bf678104c046dc1 client_b\n60658ef214c960147200d432eece3e13 slient_l\n60a2b1bb02a60ac49f7cc1b47abdf60c client_l\n610f0aadba3be1467125607bf2ba2aaf slient_l\n66a068fd860bda7950fde8673d1b5511 client_b\n6c4de9bd490841f0a6c68638f7253c65 client_b\n72c531a813b637af3ea56f288d65cdb7 slient_b\n7608b24c8dcf3cd7253dbd5390df8b1f client_b\n7645a30a92863041cf93a7d8a9bfba1a client_b\n857fc3c7630859c20d35d47899b75699 slient_b\n861af6b5a3fea01f2e95c90594c62e9d client_l\n8e86be3be36094e0f5b1a6e954dbe7c2 client_l\n8fbcd7397d451e87c60a0328efe8cd5d client_b\n987a9befb715b6346e7ad0f6ac87201f slient_b\n9eb147e3636a4bb35f0ee1540d639a1b slient_b\naa2fc46dd94cbf52aef5e66cdd066a40 client_l\nae8b519504afc52ee3aceef087647d36 slient_b\nb0202f1e8bded9c451c734e3e7f4e5d8 slient_b\nb6f91ad027ded41e2b1f5bea375c4a42 slient_b\nb9935859b3682c5023d9bcb71ee2fece slient_b\nb9d1c31f59c67289928e1bb7710ec0ba client_l\nbec2f560b7c771d7066da0bee5f2e001 client_b\nc2efa35b34f67a932a814fd4636dd7cb slient_l\nc839aff2a2680fb5676f12531fecba3b slient_b\nc94504531159b8614b95c62cca6c50c9 slient_l\ndfe0c9d36062dd3797de403a777577a6 client_b\ne19a1106030e306cc027d56f0827f5ce slient_l\nf09b45daadc872f2ac3cc6c4fe9cff90 client_b\nf5381892ea8bd7f5c5b4556b31fd4b26 client_b\nf55ad7afbe637efdaf03d4f96e432d10 slient_b\nf62d4921e3cb32e229258b4e4790b63a client_b\nf81c8227b964ddc92910890effff179b slient_b\nfc5b55e9c6a9ddef54a256cc6bda3804 client_b\nfe8e830229bda85921877f606d75e96d slient_l\nfee6f8d44275dcd2e4d7c28189c5f5be client_l\n```\n\n"}]],"markups":[],"sections":[[10,0],[1,"p",[]]],"ghostVersion":"3.0"}