2019-04-15 07:42:42 +00:00
<?xml version="1.0" encoding="utf-8"?>
2019-08-08 12:47:43 +00:00
<search >
<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
2019-07-25 14:22:59 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-25 14:22:59 +00:00
</categories>
2019-08-08 12:47:43 +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-24 03:51:42 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-24 03:51:42 +00:00
</categories>
2019-08-08 12:47:43 +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
2019-07-24 03:51:42 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > web </category>
2019-07-24 03:51:42 +00:00
</categories>
2019-08-08 12:47:43 +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> 之前介绍了Windows x86平台下栈溢出漏洞的开放与利用, 鉴于CTF基本都是Linux, 还有实际开发环境, 很多智能设备的系统都是基于Linux, 所以从很现实的需求出发, 一定要学习学习Linux下漏洞的分析。</p> <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 st
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > Pwn二进制漏洞 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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[<p> 这部分是对Window x86平台下的几个典型漏洞利用方式的介绍, 从最基础的、没有开启任何保护的漏洞程序入手, 然后开启GS, 最后通过rop绕过DEP。</p> <hr > <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> 关闭防御<EFBFBD>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > Pwn二进制漏洞 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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> 这篇文章是对afl的简单使用, 可大致分为黑盒测试和白盒测试两个部分。白盒测试从对目标程序的插桩编译开始, 然后使用fuzzer对其模糊测试发现崩溃, 最后对测试的代码覆盖率进行评估。黑盒测试则演示得较简略。<br > 参考:<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> <b
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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[<p> 接触这个词语已经有一年了, 但还没有学习过更没有上手实践过, 正好趁这个机会好好弄弄AFL。提起模糊测试, 我们总会联想起这样或那样的专业术语——测试用例、代码覆盖率、执行路径等等, 你可能和我一样一头雾水, 这次我们就来看个明白</p> <hr > <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= "no
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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> 壳是最早出现的一种专用加密软件技术。一些软件会采取加壳保护的方式。<br > 壳附加在原始程序上, 通过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(即
</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 >
2019-08-08 12:47:43 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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 >
2019-08-08 12:47:43 +00:00
<category > 顶会论文 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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 >
2019-08-08 12:47:43 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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.wzsite.cn/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.wzsite.cn/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.wzsite.cn/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= "line" > 12</span> <b
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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 > <
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 杂七杂八 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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 >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 加密解密 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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= "./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= "./2-Man_in_the_middle_attack.svg.png" 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= "./3-Connection_TCP.png" 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。当服务端收到这个ACK的时候, 就完成了三路握手, 并进入了连接创建状态。此时包的序号被设定为收到的确认号A+1, 而响应号则为B+1。</li>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 顶会论文 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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[<h1 id="TCPDUMP-4-5-1-拒绝服务攻击漏洞分析"> <a href= "#TCPDUMP-4-5-1-拒绝服务攻击漏洞分析" class= "headerlink" title= "TCPDUMP 4.5.1 拒绝服务攻击漏洞分析" > </a> TCPDUMP 4.5.1 拒绝服务攻击漏洞分析</h1> <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 c l a
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 二进制 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 顶会论文 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +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.
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > IOT </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +00:00
<tags >
<tag > 小米 </tag>
<tag > miio </tag>
<tag > 中间人 </tag>
<tag > 重放攻击 </tag>
</tags>
</entry>
<entry >
<title > 利用python实现BIBA模型</title>
<link href= "/2018/11/16/BIBA%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E6%A8%A1%E5%9E%8B%E5%AE%9E%E7%8E%B0(python)/" />
<url > /2018/11/16/BIBA%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E6%A8%A1%E5%9E%8B%E5%AE%9E%E7%8E%B0(python)/</url>
<content type= "html" > <![CDATA[<h1 id="基于python语言的BIBA模型图形界面实现"> <a href= "#基于python语言的BIBA模型图形界面实现" class= "headerlink" title= "基于python语言的BIBA模型图形界面实现" > </a> 基于python语言的BIBA模型图形界面实现</h1> <h2 id= "实验目的:" > <a href= "#实验目的:" class= "headerlink" title= "实验目的:" > </a> 实验目的:</h2> <ol > <li > <strong > 查阅资料, 了解biba安全模型的相关知识</strong> </li> <li > <strong > 通过编程实现基于biba模型的完整性访问控制, 进一步掌握biba模型的规则</strong> </li> <li > <strong > 使用python语言实现, 熟练pyqt的图形界面设计方法</strong> </li> </ol> <hr > <h2 id= "实验环境:" > <a href= "#实验环境:" class= "headerlink" title= "实验环境:" > </a> 实验环境:</h2> <ul > <li > 操作系统: Windows10</li> <li > 工具版本: python3.7, pyqt5</li> </ul> <hr > <h2 id= "实验原理:" > <a href= "#实验原理:" class= "headerlink" title= "实验原理:" > </a> 实验原理:</h2> <h4 id= "什么是安全模型" > <a href= "#什么是安全模型" class= "headerlink" title= "什么是安全模型" > </a> 什么是安全模型</h4> <ul > <li > 系统的元素 <blockquote > <p > 具有行为能力的主体<br > 不具有行为能力的客体</p> </blockquote> </li> <li > 系统的操作行为<blockquote > <p > 可以执行的命令:读、写、执行</p> </blockquote> </li> <li > 对系统行为的约束方式<blockquote > <p > 对行为的控制策略</p> </blockquote> </li> <li > 模型从抽象层次规定了系统行为和约束行为的方式</li> <li > 模型往往用状态来表示<blockquote > <p > 系统行为所依赖的环境<br > 行为对系统产生的效果</p> </blockquote> <h4 id= "biba完整性模型: " > <a href= "#biba完整性模型: " class= "headerlink" title= "biba完整性模型: " > </a> biba完整性模型: </h4> <ul > <li > 完整性威胁问题<blockquote > <p > 完整性的威胁就是一个子系统在初始时刻认为不正常的修改行为;<br > 来源:内部& 外部;<br > 类型:直接& 间接</p> </blockquote> </li> </ul> </li> </ul> <table > <thead > <tr > <th > 外部的直接</th> <th > 外部的间接</th> <th > 内部的直接</th> <th > 内部的间接</th> </tr> </thead> <tbody > <tr > <td > 外部系统恶意地篡改另一个系统的数据或程序</td> <td > 一个外部系统插入恶意的子程序</td> <td > 修改自己的代码</td> <td > 修改自己的指针</td> </tr> </tbody> </table> <ul > <li > biba模型的完整性定义<blockquote > <p > 完整性级别高的实体对完整性低的实体具有完全的支配性,反之如果一个实体对另一个实体具有完全的控制权,说明前者完整性级别更高,这里的实体既可以是主体也可以是客体。<br > 完整性级别和可信度有密切的关系,完整级别越高,意味着可信度越高。</p> </blockquote> </li> <li > biba模型的规则 </li> </ul> <ul > <li style= "list-style: none" > <input type= "checkbox" > 对于写和执行操作,有如下规则:<blockquote > <p > <strong > 写规则控制</strong> <br > 当且仅当主体S的完整性级别大于或等于客体O的完整性级别时, 主体S可以写客体O,一般称之为<strong > 上写</strong> 。<br > <strong > 执行操作控制</strong> <br > 当且仅当主体S2的完整性级别高于或等于S1,主体S1可以执行主体S2。 </p> </blockquote> </li> <li style= "list-style: none" > <input type= "checkbox" > 关于读操作,有不同的控制策略:<blockquote > <p > <strong > 低水标模型</strong> <br > 任意主体可以读任意完整性级别的客体,但是如果主体读完整性级别比自己低的客体时,主体的完整性级别将为客体完整性级别,否则,主体的完整性级别保持不变。<br > <strong > 环模型</strong> <br > 不管完整性级别如何,任何主体都可以读任何客体<br > <strong > 严格完整性模型</strong> <br > 这个模型对读操作是根据主客体的完整性级别严格控制的,即只有完整性级别低或相等的主体才可以读完整性级别高的客体,称为<strong > 下读</strong> </p> </blockquote> </li> </ul> <p > <strong > 一般都是指毕巴<EFBFBD>
2019-07-16 09:15:34 +00:00
<categories >
2019-08-08 12:47:43 +00:00
<category > 理论学习 </category>
2019-07-16 09:15:34 +00:00
</categories>
2019-08-08 12:47:43 +00:00
<tags >
<tag > 模型实现 </tag>
<tag > python </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>