抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

第四章 路由器web漏洞

xss利用站点内的信任用户,跨站攻击是指入侵者在远程web页面的HTML页面中插入具有恶意代码的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面时,嵌入其中的脚本将被解释执行。

CSRF跨站请求伪造通过伪装来自受信任用户的请求达到利用受信任的网站的目的。

第五章 路由器后门漏洞

第六章 路由器溢出漏洞

MIPS32架构函数调用时对堆栈的分配和使用方式与x86架构有相似之处,但又有很大的区别。区别具体体现在:

  • 栈操作:与x86架构一样,都是向低地址增长的。但是没有EBP(栈底指针),进入一个函数时,需要将当前栈指针向下移动n比特,这个大小为n比特的存储空间就是此函数的栈帧存储存储区域。
  • 调用:如果函数A调用函数B,调用者函数(函数A)会在自己的栈顶预留一部分空间来保存被调用者(函数B)的参数,称之为调用参数空间。
  • 参数传递方式:前四个参数通过$a0-$a3传递,多余的参数会放入调用参数空间。
  • 返回地址:在x86架构中,使用call命令调用函数时,会先将当前执行位置压入堆栈,MIPS的调用指令把函数的返回地址直接存入$RA寄存器而不是堆栈中。

叶子函数:当前函数不再调用其他函数。
非叶子函数:当前函数调用其他函数。

函数调用的过程:父函数调用子函数时,复制当前$PC的值到$RA寄存器,然后跳到子函数执行;到子函数时,子函数如果为非叶子函数,则子函数的返回地址会先存入堆栈,否则仍在$RA寄存器中;返回时,如果子函数为叶子函数,则”jr $ra”直接返回,否则先从堆栈取出再返回。

利用堆栈溢出的可行性:在非叶子函数中,可以覆盖返回地址,劫持程序执行流程;而在非叶子函数中,可通过覆盖父函数的返回地址实现漏洞利用。

第七章 基于MIPS的shellcode开发

mips中可使用syscall指令来进行系统调用,调用的方法为:在使用系统调用syscall之前,$v0保存需要执行的系统调用的调用号,并且按照mips调用规则构造将要执行的系统调用参数。syscall调用的伪代码为:“syscall($v0,$a1,$a2,$a3,$a4…)”。

shellcode编码优化包括指令优化和shellcode编码。
指令优化:指令优化是指通过选择一些特殊的指令避免在shellcode中直接生成坏字符。

通常来说,shellcode可能会受到限制:首先,所有的字符串函数都会对“NULL”字节进行限制;其次,在某些处理流程中可能会限制0x0D(\r)、0x0A(\n)、或者0x20(空格)字符;最后,有些函数会要求shellcode必须为可见字符(ascii)或Unicode值。有些时候,还会受到基于特征的IDS系统对shellcode的拦截。

绕过以上限制的方法主要有两个:指令优化及shellcoe编码。后者更为通用。

shellcoe编码通常包含以下三种:base64编码、alpha_upper编码、xor编码。

第八章 路由器文件系统与提取

路由器漏洞的分析与利用的关键环节有获取固件、提取文件系统、漏洞分析与利用及漏洞挖掘。其中获取固件及提取文件系统是进行漏洞分析与利用的基础。

路由器固件中包含操作系统的内核及文件系统。路由器的固件不是硬件而是软件,因为在路由器中它通常是被固化在只读存储器中,所以称为固件。

在进行漏洞分析时获取路由器的固件通常有两种方式:一种是从路由器厂商提供的更新网站下载;一种是通过硬件接入,从路由器的Flash中提取固件。

文件系统

文件系统是操作系统的重要组成部分,是操作运行的基础。根文件系统会被打包成当前路由器所使用的文件系统格式,然后组装到固件中。路由器总是希望文件系统越小越好,所以这些文件系统中各种压缩格式随处可见。

Squashfs是一个只读格式的文件系统,具有超高压缩率,可达34%。当系统启动后,会将文件系统保存在一个压缩过的文件系统文件中,这个文件可以使用换回的形式挂载并对其中的文件进行访问,当进程需要某些文件时,仅将对应部分的压缩文件解压缩。Squashfs文件系统常用的压缩格式有GZIP、LZMA、LZO、XZ(LZMA2),在路由器中被普遍采用。

手动提取文件系统

文件系统中包含实现路由器各种功能的基础应用程序。文件系统能从固件中提取,而从路由器固件中提取文件系统是一个难点,原因之一在于不同的操作系统使用的文件系统不同。另外,路由器的文件系统压缩算法也有差异,有些路由器甚至会使用非标准的压缩算法打包文件系统。

手动提取文件系统类型包括:

  1. 使用file命令查看文件系统类型。
  2. 手动判断文件类型,包含如下步骤:”strings|grep”检索文件系统magic签名头;“hexdump|grep”检索magic签名偏移;“dd|file”确定magic签名偏移处的文件类型。
  3. 手动提取文件系统。:安装工具,sudo apt-get install squashfs-tools该工具目前仅支持GZIP、LZO、XZ(LZMA2)不支持LZMA格式。可以使用firmware-mod-kit解压缩,解压后得到所有文件。安装命令:
1
2
3
4
git clone https://github.com/mirror/firmware-mod-kit.git
sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic
cd firmware-mod-kit
./configure && make

自动提取文件系统

binwalk是路由器固件分析的必备工具,该工具最大的优点是可以自动完成指令文件的扫描,智能发掘潜藏在文件中所有可疑地文件类型及文件系统。

binwalk&&libmagic

binwalk提取与分析过程:

  1. 固件扫描。通过扫描binwalk可发现目标文件中包含的所有可识别文件类型。
1
binwaklk firmware.bin
  1. 提取文件。选项“-e”和“–extract”用于按照预定义的配置文件中的提取方法从固件中提取探测到的文件及系统。选项“-M”,用于递归扫描。“-d”用于递归深度的限制。
1
binwaklk -e firmware.bin
  1. 显示完整的扫描结果。选项“-I”或“–invalid”用于显示扫描的所有结果。
  2. 指令系统分析。选项“-A”和“–opcode”用于扫描指定文件中通用cpu架构的可执行代码。
1
binwaklk -A 70|more

通常binwalk可对绝大多数路由器固件进行文件提取,如遇到无法识别的固件,可向binwalk添加下列提取规则和提取方法,实现对新的文件系统进行扫描和提取:

  1. 基于magic签名文件自动提取。
  2. 基于binwalk配置文件的提取。

第九章 漏洞分析简介

漏洞分析是指在代码中迅速定位漏洞,弄清攻击原理,准确地估计潜在的漏洞利用方式和风险等级的过程。

  • POC(Proof of Concept)

漏洞证明,漏洞报告中,通过一段描述或一个样例来证明漏洞确实存在

  • EXP(Exploit)

漏洞利用,某个漏洞存在EXP,意思就是该漏洞存在公开的利用方式(比如一个脚本)

漏洞分析方法

可以通过一些漏洞公布网站获取漏洞信息。网上公布的poc有很多形式,只要能触发漏洞、重现攻击过程即可。在得到poc后,就需要部署漏洞分析实验环境,利用poc重现攻击过程,定位漏洞函数,分析漏洞产生的具体原因,根据poc和漏洞情况实现对漏洞的利用。

漏洞分析中常用的两种分析方法:动态调试以及静态分析。

第十六章 路由器硬件的提取

路由器flash

FLASH 也叫闪存,是路由器中常用的一种内存类型。它是可读写的存储器,在系统重新启动或关机之后仍能保存数据。FLASH中存放着当前正在使用的路由器操作系统等信息

bootloader:主要功能是对硬件环境进行初始化、更新固件及认识操作系统的文件格式并将内核加载到内存中去执行。“CFE”是“Common Firmware Environment”(统一固件环境)的缩写,它是 Broadcom公司专门针对自己生产的MIPS 架构的处理器开发的一款Bootloader软件,Linksys WRT54G v2路由器使用的就是CFE。
Kernel:操作系统的内核。
Root Filesystem:操作系统的根文件系统,如 squashfs、rootfs等。
NVRAM:作用是保存路由器中的配置文件。路由器在启动之后会从NVRAM中读取配置文件,对路由器进行设置。用户修改路由器设置后,系统会将修改后的参数写回NVRAM中。

image-20221013152603176

硬件提取的思路

通过路由器主板上的JTAG 接口提取FLASH、NVRAM等。这种方法的优点是只需要一根 JTAG线,不需要太多的辅助设备,缺点是需要路由器CPU支持JTAG,主板上要有JTAG接口。

从主板上取下的 FLASH芯片中提取。这种方法可以在路由器不支持JTAG 方式时使
用,但缺点也很明显——从主板上取出芯片可能会对路由器造成物理损伤。

使用测试夹从FLASH芯片中提取。使用测试夹的优点是不需要从路由器上取下芯片,
只需要用测试夹夹住芯片引脚即可,缺点是对不同引脚数的FLASH芯片需要使用对应的测试夹。

路由器串口

在路由器中,我们要寻找的串口指UART(通用异步收发器),它是路由器设备中比较常见的一种接口。

首先,我们通过肉眼观察路由器主板上的引脚。一般来说,UART至少包含以下4个引脚。Vcc (vcC) :电源电压。该引脚电压较稳定。

rGround (GND):接地。该引脚电压通常为0。

Transmit(TXD):数据发送引脚。

Receive (RXD):数据接收引脚。

辨别引脚:

目测:

( 1 ) VCC引脚的特点
VCC 引脚通常被做成方形。从路由器主板上可以看到较宽的走线,那么该引脚极有可能也是VCC引脚
( 2 )GND引脚的特点
GND引脚通常存在多条走线连接到周围的地线(GND)。

万用表:

( 1)测试GND引脚
将万用表调到电阻测量的最小档。然后,我们需要确定万用表的两只表笔应该放在哪些位置。通常金属屏蔽是一个方便测试的接地点,因此,将一只表笔放在金属屏蔽罩上,用另一只表笔分别接触10 个引脚,测试金属屏蔽罩与串口的10个引脚,电阻为0的引脚即为GND引脚。

(2)测试VCC引脚

虽然VCC 引脚对于我们使用路由器的串口是无关紧要的,但是确定 VCC 引脚可以排除它作为RXD引脚和TXD引脚的可能性,因此也是有必要的。在目测中,我们怀疑1号和2号引脚是VCC 引脚,那么接下来我们就用万用表来验证这一猜测。

( 3 )测试TXD引脚
当串行端口处于激活状态并发送数据(否则无法测试出发送引脚)时,发送引脚是相当容易识别的。主板上的发送引脚被拉高到与VCC引脚相同的电压,通常是3.3伏特。在有数据发送时,电压将下降到0。当读取的是一个不断变化的直流电压时,数字万用表将显示最终的平均采样电压。因此,如果万用表显示引脚电压下降,表示该引脚有数据发送,由此可以判断该引脚是TXD引脚。
在路由器中,引导程序、内核、系统的所有启动信息都将被打印到串口,因此,我们测试TXD引脚的最佳时机就在系统启动阶段。

在识别了串口的各个引脚之后,我们就可以通过一条USB 转 UART 适配器的TTL-232R-3V3线连接进行连接了。将UART 适配器的USB接口端插入计算机的USB 接口,将UART适配器连接到路由器串行端口中,使用方式如下。
将适配器的GND连接到串口的GND。将适配器的RXD连接到串口的 TXD。将适配器的TXD连接到串口的RXD。接下来,我们开始进行硬件连接的准备工作。

将适配器的GND连接到串口的GND。

将适配器的RXD连接到串口的TXD。

将适配器的TXD连接到串口的RXD。

硬件方面的操作到这里基本上已经完成了,接下来,我们需要检查串行端口的协议设置。串行端口有多种设置,但是在这里我们只需要完成波特率的设置即可。尝试错误是识别波特率最快和最简单的方法。因为串行端口通常用于显示调试信息(即它们发送 ASCII 数据),并且只有少数可能频率的波特率,所以我们可以循环逐一测试可能的波特率,直到输出可理解的数据(如ASCII码)时,就找到了当前串口的波特率。

读取路由器数据

1.通过miniterm.py连接路由器串口

2.路由器CFE命令模式

3.路由器Linux系统模式

FLASH 芯片中存储了路由器的固件,其中包含路由器的 bootloader信息。因为每个路由器厂商在对操作系统进行编码和压缩的时候可能会使用一些非标准的算法,因此,有些时候,提取和分析 bootloader也是很有必要的。在无法通过网络下载路由器固件的时候,我们可以通过JTAG方式读取路由器FLASH中的固件,对文件系统及 bootloader进行提取和分析。

路由器的配置文件都存放在 NVRAM中,因此,通过读取NVRAM可以得到路由器的所有配置信息。使用brjtag 读取路由器NVRAM的基本命令如下。
brjtag -backup:nvram:备份NVRAM。
brjtag -crase:nvram:擦除NVRAM。brjtag -flash:nvram:写入NVRAM。

第十七章 路由器漏洞挖掘技术

审计:

(1)部分用户提供数据来源的相关函数命令行参数: argv操作。
环境变量: getenv()。

输入数据文件: read()、fscanf()、getc()、fgetc()、fgets()、vfscanf()。

键盘输入/stdin: read()、scanf()、getchar()、gets()。

网络数据: read()、recv()、 recvfrom()。
(2)部分数据操作相关的危险函数字符串复制: strcpy). strncpyO。

命令执行: system()、execve()系列。字符串合并:strcat()。

格式化字符串: sprintf()、snprintf()。
在目标程序中,定位以上危险函数,然后根据危险函数参数个数、类型跟踪各参数,分析各缓冲区大小,判断是否存在安全漏洞。

评论

Related Issues not found

Please contact @1ens to initialize the comment