文章      动态     相关文章     最新文章     手机版动态     相关动态     |   首页|会员中心|保存桌面|手机浏览

0g21hq

http://fabua.ksxb.net/com0g21hq/

相关列表
文章列表
  • 暂无文章
推荐文章
联系方式
  • 联系人:汪女士
  • 电话:18051396568
[免费专栏] ATTACK安全之检测车机中ADB远程调试控制Android系统攻击手机设备「[免费专栏] ATTACK安全之检测车机中ADB远程调试控制Android系统攻击」
发布时间:2025-01-12        浏览次数:1        返回列表

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球

感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步


ATTACK付费专栏长期更新,本篇最新内容请前往

  • [车联网安全自学篇] ATTACK安全之检测车机中ADB远程调试控制Android系统攻击

我们常说的adb,也称为Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用,并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件

  • 客户端(adb:用于发送命令。客户端在开发机器上运行,您可以通过发出 adb 命令从命令行终端调用客户端
  • 守护程序 (adbd):用于在设备上运行命令,守护程序在每个设备上作为后台进程运行
  • 服务器(adb server:用于管理客户端与守护程序之间的通信,服务器在开发机器上作为后台进程运行

:Android adb源码路径为,根据adb运行的地方不同,可以分为PC端和Android 手机设备端两部分

  • PC端: 和是运行在PC端,adb就是控制台命令adb,是由出的一个常驻后台的子进程,作为adb的server进程,就是kill掉这个进程。adb与通过进行通信
  • Android 手机设备端:adbd运行在Android 手机设备端,是在内核初始化完毕之后,由init进程启动

在这里插入图片描述

adb 包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 下。也可以单独下载独立的 Android SDK 平台工具软件包

1)adb工作原理

当用户启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令,所有 adb 客户端均通过端口 5037 与 adb 服务器通信,adb原理图如下

在这里插入图片描述

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如,如下

  • 模拟器 A,控制台:5554
    • 模拟器 A,adb:5555
  • 模拟器 B,控制台:5556
    • 模拟器 B,adb:5557
  • :以此类推,如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个

服务器与所有设备均建立连接后,用户就可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端(或从某个脚本)控制任意设备

2)Android APK 的root 权限和USB ADB 权限的区别

USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权限,通常如果adb shell 看到是

  • Android 10版本 (以树莓派为例):
 

在这里插入图片描述

即表明adb 的连接是root 权限的,相反如果看到是$ 即表明是shell 权限。 Android 的APK 本身都是不具备root 权限的,如果想启用root 权限,那么就必须借助具有root 权限的进程或者具有s bit 的文件,目前比较通用的手法是,手机root 后,内置了su到system/bin, 然后普通APP 即可借助su 命令来达到root 权限切换。

网络上已经有同仁修改su 命令,并通过一个APK 来控制su 命令的权限控制。 如常见的Superuser 即可人为的控制root 权限的使用(Superuser 因很久都没有更新了,只能用于ICS 以及以前的版本,不推荐使用, SuperSU (也老了,不推荐使用),推荐使用Magisk (更新速度快,推荐使用

在这里插入图片描述

  • 进程列表

在这里插入图片描述

无需特殊权限,部分高版本设备无法获取进程列表

  • 检测init.svc.adbd属性取值是否running

在这里插入图片描述

adbd守护进程:只要是操作系统,就肯定会运行着一些守护进程(daemon)来完成重复或繁琐的工作。通过Android系统中的文件可以发现,其中每个service中就包含着系统后台服务进程。而这些服务被分为

  • core类服务)和main类服务
    • main类服务又分为
      • 网络类服务)、图形及媒体类服务)、其他类服务

  • :Android在启动过程中读取的启动脚本文件,主要完成一些初级的初始化,在中解析。rc 经常被用作程序之启动脚本的文件名。它是“”(运行命令)的缩写
  • :与具体CPU相关的启动脚本,比如对于MTK的CPU,名字为。在init.rc之后得到解析

Android adbd:Android 系统特有的ADB功能中运行在Android设备端的守护进程,其在根目录下的或中的启动配置如下

在这里插入图片描述

下面是该文件的一些注释信息

 

  • 在默认情况下,adbd是以的权限启动的。不过它还会通过函数主动把自己降到: shell和几个GID权限,源码地址

在这里插入图片描述

  • 在版本的系统中(系统属性为),或通过命令让adbd恢复root权限(通过修改系统属性

手机端的adbd是在init解析rc文件的时候启动的,具体可以查看init.rc中的配置信息。根据注释,可以了解到adbd的启动是根据一个属性触发器来控制的,具体的触发器在文件中,如下

 

接着,跟进去看看,看看在文件中如何定义触发器。触发器根据的值来决定是否启动adbd,其实就是仅当的值中包含adb选项时才会启动adbd

 

:Android O新增的关于usb的三个属性【】

  • :该属性默认为0,通过判断kernel是否支持configfs,即判断存在设置为1,代码在init.qcom.usb.sh中(高通平台下
  • :当设置为none时,设置为0。每次设置的属性有adb时,会先start adbd。如时,在中有(如下代码,然后在中,会调用,进而调用函数中,然后调用init_functionfs()初始化该属性为1。只有时,才能开启adb端口
 
  • :当设置为none时,设置为0。android O新增,当功能为mtp或者ptp时,在 函数中会先发送一次广播给mtpReceiver
    • 给数据库添加
    • 调用,最后调用设置属性为1,才能响应,然后收到kernel发送的uevent后,再发一次广播

Android 手机设备端USB模式

  • PTP:“图像传输协议【Picture Transfer Protocol】”(PTP),为文件传输模式(PTP
    • 在接入Windows系统之后可以更好地被系统和应用程序所共享,尤其在网络传输方面,系统可以直接访问这些设备用于建立网络相册时图片的上传、网上聊天时图片的传送等
    • PTP适合多播消息的分布式网络通信系统,同时提供单播消息的支持
  • MTP:“媒体传输协议【Media Transfer Protocol】”,是基于PTP(Picture Transfer Protocol)协议的扩展,主要用于传输媒体文件。如果选择MTP模式连接的话,电脑上和手机上都可以读取内置和外置SD卡
    • 其应用分两种角色,一个是作为Initiator,另一个作为Responder。Responder都是被动的回复Initiator的命令,不会主动发命令。主要的用途是传输媒体文件,并从设备关联元数据,对设备的远程控制有可选的额外支持,读取和设置设备参数,如特别的DRM相关的受限内容设备参数
    • MTP既可以实现在USB协议上,也可以实现在TCP/IP协议上,它属于上层的应用协议,而不关心底层传输协议

adbd的启动代码在中,其中main函数在获取了selinux标签、banner名称、版本信息参数以及设置一些调试信息后,调用了完成启动过程。adbd是一个linux程序,通过tcp或者usb与PC端的adb server通信,调用logcat shell等等程序实现各种调试功能,源码地址如下

 
 

adbd启动过程中的权限处理,在函数中调用了进行降权处理。因为由init启动的进程启动,所以同样拥有和init一样的root权限。root权限过高,如果不是非必要,就要进行降权处理。如果当为true时,可以不用降权,维持root权限。简而言之就是当为1且为0的时候不用降权

 
 

1.4.1 修改ro.adb.secure和ro.secure属性

修改,修改ro.secure和位0,注释掉或者将其设置为true

 

1.4.2 修改selinux

修改,将的返回值调整为false。这里还有另外一种改法,就是在里面对进行编辑,添加

 

1.4.3 修改adb模块的android.mk文件

修改中的编译选项,允许,如下

 

1.4.4 设置默认打开adb端口

配置或者,设置USB配置选项,添加adb功能

 
 

大家在通过adb连接设备的时候,是否会有提示让确认是否允某台设备要进行USB调试的确认框(如下

在这里插入图片描述

ADB具有功能非常强大的调试和跟踪功能,尽管它是以shell这个UID的身份运行,但由于shell这个UID是好几个组(log、graphic等)的成员,这也使得它具有很强的能力。使用ADB可以访问到用户的个人数据,也能把任意APP、Native层可执行文件上传到设备中。因此,在Android 4.3 以后的Android系统中引入了公钥认证机制(前提条件,让ADB的安全性进一步提高

AUTH消息将作为对OPEN消息的响应,发送到电脑端,要求在其执行任何命令之前,先完成认证。AUTH消息的参数总是一个TOKEN,它是由移动设备中的随机数发生器()生成的一个大小为20个字节的随机数数组。移动设备端将等待电脑端用自己的私钥(该私钥应该己经生成,并存放在这个文件中)对这个TOKEN 进行签名,然后回复一个消息,把用私钥签名过的随机数数组放在这个消息里返回给移动设备端。如果移动设备知道相应的公钥,那么验证就能继续,而且如过验证通过了,该会话就会切换到online状态上去

因为,所有这些操作都依赖于公钥,比如怎么让Android 手机设备端提前就知道这个公钥,并将其用于验证呢

:允许电脑端响应一个消息。因为此时这个公钥是不可信的,ADB将把这个公钥通过/dev/socket/adbd这个UDS传递给system_server(特别是由启动的,然后,system_server将会弹出一个对话框(,要求用户确认该公钥的指纹(MD5 Hash)。如果用户选择信任该公钥,这个公钥就会被添加到adb的(位于)中去。作为厂商的话可以重新编译adbd,删掉这一功能(相关代码位于adb_auth_client.c中的adb_auth_/confirm/i_key()函数中,源码地址

在这里插入图片描述

输入命令,就能查看当前USB调试状态以及当前使用的,如下

在这里插入图片描述

USB调试者,可直接在PC上使用adb命令对设备进行调试,也可通过DDMS命令间接调试。在调试之前,要在系统开发者模式中打开“USB调试”的开关,其在底层(不太理解的话,可以看看0x01中的内容)其实是通过修改系统属性的值为adb时打开,大家看到这里可能想问通过里是否存在adb调试来判断是否开启,那么怎么判断Android 设备端是否有adb连入呢

先用来搜索看看,有几个能匹配

 

在这里插入图片描述

匹配到如下几个,具体啥意思,就是字面意思

  • :设置当前ADB开启状态的值
  • :设置当前USB功能的值
    • 如果其值为1,则会使用文件中相关条目,否则将使用文件中的相关条目

对于Android系统,和应用,要改变usb gadget通过配置如下两个prop属性: 【设置当前ADB开启状态的值】和【设置当前USB功能的值】,【设置当前ADB开启状态的值】和【设置当前USB功能的值】该属性的值包含adb这个字段则会触发打开adb功能,即可实现关闭或打开USB调试和文件传输功能,其中mtp表示文件传输,adb表示adb调试,none表示都不启用

进程检测分为两种方式

  • 【不推荐】进程对应的端口号,比如adb无线调试默认端口5555【此方法比较适合Wi-Fi adb无线调试,加上判断+是否默认端口来检测,跟我们后面要讲的通过网络流量形式检测adbd是否接入的规则类似】
    • :此端口是可更改的,单独以端口来判断,会超多误报,因为不能保障5555端口会不会被其它进程占用
  • 【推荐】进程名,比如监视进程里面匹配上的adbd名字的进程

1)进程对应的端口号

先在PC端用tasklist命令查询adb相关的进程

  • 此处第一个标红的地方有一个3172号进程,再通过netstat命令查询3172号进程对应的端口,发现3172号进程占用的端口是5037。根据adb原理图1,得知此adb是服务端
  • 此处第二个标红的地方有一个22344号进程,再通过netstat命令查询22344号进程对应的端口,发现22344号进程占用的端口是22630。根据adb原理图2,得知此adb是客户端

在这里插入图片描述

:由上可知,adb服务端和客户端都是sdk下的adb.exe

接下来,我们进入adb shell后使用netstat命令,发现有一个2014号进程(adbd)占用5555端口,此进程即为守护进程

 

在这里插入图片描述

通过上面的了解,可以发现可通过来定位,可以看到会有一个连接的进程,这里就是后面要讲的域套接字形式的检测。在介绍下面一种之前,同学们肯定有一个疑问,咋是5555端口?其实这里是Wi-Fi 连接adb默认配置的端口,你配置什么端口就是什么端口,所以,就衍生到第二种通过adbd子进程来检测

2)进程名

聊聊通过进程名来判断adbd来确定是否有adb接入Android 设备,执行如下命令

 

在这里插入图片描述

:上面这里大家可能看到有个socket链接的进程,就是下面要讲的通过域套接字形式来检测adb是否连入Android 设备

  • 域套接字的概念:进程与进程之间通讯的一种方式,客户端与服务端建立连接,需要有相同的套接字,和相应的服务端端口号,套接字处于监控状态,监听客户端发送的请求

这里没什么好讲的,直接晒出结果吧,如下

  • 通过检测adbd是否有子进程来确定是否有客户端连入

为了有明显区别对比,此处我们再次新开一个cmd窗口,然后执行如下命令

 

在这里插入图片描述

再次查看adb的子进程,其中已经少了一个adbd的子进程,如下

 

在这里插入图片描述

  • 最后,我们检测/proc/net/unix 中是否有dev/socket/adbd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.1 Wi-Fi 调试(Android 11 及更高版本,无需借助 USB

从 Android 11 开始支持 ADB 以无线方式连接手机调试,可以彻底摆脱 USB 线

  • 1)手机和电脑需连接在同一 Wi-Fi 下
  • 2)保证 SDK 为最新版本
  • 3)手机启用开发者选项和无线调试模式(会提示确认
  • 4)允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号
  • 5)运行,使用第 4 步中的 IP 地址和端口号
  • 6)根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对
  • 7(仅适用于 Linux 或 Windows)运行

3.3.2 WLAN 调试(Android 10 及更低版本,需要借助 USB

做过Android 开发的基本都知道,平常一般都是直接通过 USB 线或者 Type C线的方式连接,来完成日常的开发和调试,这种开发模式存在几个问题点,是一个极简主义者所不能忍受的

  • 电脑的 USB 口比较少,特别是 MAC 电脑,新版的就更是少得可怜
  • 有时候有些功能模块比较耗电的时候,手机耗电的速度会比电脑充电的速度慢,比如开发直播间模块,要长时间开摄像头的情况下

Android 10以及更低的版本,必须通过 USB 连接后,才可实现同一 WLAN 下无线调试

  • 手机和电脑需连接在同一 WiFi 下
  • 手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即,可以查看到手机
  • 设置手机的监听
  • 拔掉 USB 线,找到手机的 IP 地址
  • 通过 IP 连接到手机(端口默认:5555
  • 命令查看

:Android 8 以上默认是开启Wi-Fi调试模式的,Android 4~Android 8默认是不开启Wi-Fi调试模式的

1)手机和电脑通过USB方式连接

  • 输入adb tcpip PORT,PORT表示要开启WI-FI调试的端口,建议使用默认端口5555
 

  • 使用adb shell在手机端执行命令,port表示要开启WI-FI调试的端口,建议使用默认端口5555
  • 使用adb shell在手机端执行stop adbd
  • 使用adb shell在手机端执行start adbd。执行adb shell会默认启动adbd,所以adbd start不是必须执行的
 

2)不需要adb的方式

  • root的手机不需要用usb链接电脑使用adb的方式来开启WI-FI调试模式。不过需要安装一个可以执行命令的App

  • 手机需要Root,且安装了可以执行命令的App。下载安装,然后打开“模拟终端”,然后执行以下命令

    • Android-Terminal-Emulator下载地址

在这里插入图片描述

TCP/IP方式

 

 

USB方式

 
  • 保证手机和电脑在同一个局域网内,查看手机Wi-Fi的IP地址,并且手机开启了Wi-Fi调试功能
  • 使用与手机进行连接,port默认5555
 

断开WI-FI调试连接的命令

 

3.3.3 网络流量形式检测是否攻击者adb接入Android 设备方法

网络形式的ADB会监听一个端口,那有一个非常简单的方法就是判断这个端口是不是有TCP连接,只要有连接,我们就认为被ADB控制了(很简单的判断,没去管有无数据传输,就算没得数据传输,但是连接了,说明这个设备其实也被ADB控制过

:表示网络无线ADB要配置的默认端口

回到检测规则上来,如果没设置的话,得到的应该是空值或啥也没有回显

在这里插入图片描述

  • 先用getprop命令去得到adb监听的端口,如果为空的话就是5555,然后就可以看adb监听的端口是否有连接,下面是统计5555端口连接次数,来判断当前有几个掉毛接入进来
 

在这里插入图片描述

  • 统计adb已连接的次数,状态为"established"
 

在这里插入图片描述

补充:还有一个方法,是获取TCP流量data数据的二进制流,来检测adbd接收到的TCP数据包中是否包含,且相应回去的TCP数据包中包含有,就告警。但许多时候Android 终端因为隐私问题,数据采集受限,感兴趣的可以自行尝试一下,博主同学这里没有没有去尝试

参考链接

https://www.jianshu.com/p/790b29b80117

https://cloud.tencent.com/developer/article/1809910

https://blog.csdn.net/Xiaoma_Pedro/article/details/103919142

https://blog.csdn.net/u014135607/article/details/80011192

https://www.jianshu.com/p/a47e1c90b9bf

https://zhuanlan.zhihu.com/p/472198430

https://cczheng.blog.csdn.net/article/details/103434756

http://www.shibaking.com/blog/2020-04-08-Android%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91user%E7%89%88%E6%9C%AC%E9%BB%98%E8%AE%A4%E5%BC%80%E5%90%AFadb%E8%B0%83%E8%AF%95.html