攻击环境
Raspbian+tee
https://zhuanlan.zhihu.com/p/147061445
docker container
tee部分的环境搭建使用师兄编译好的docker容器内的环境
docker ps -a #查看所有docker容器
#因为rpi3的docker container还未开启,需要激活
docker start containerID
docker stop containerID
docker exec -it containerID /bin/bash(COMMAND) #exec进入容器后退出时容器不会停止 推荐
docker run -t -i ubuntu:15.10 /bin/bash #使用版本为15.10的ubuntu系统镜像来运行容器,然后便直接进入容器中,这个适用于只有镜像的时候,想直接开启容器
docker rm containerID
docker rmi imageID
root@containerID:~# #表示已经进入container
container内部
编译完成后会产生out文件夹,查看目录结构
cd ./root
cd raspbian-tee
cd out
tree -L 4
.
|-- boot
| |-- armstub8.bin
| |-- bcm2710-rpi-3-b-plus.dtb
| |-- bcm2710-rpi-3-b.dtb
| |-- config.txt
| |-- uImage
| `-- uboot.env
`-- rootfs
|-- bin
| |-- optee_example_acipher
| |-- optee_example_aes
| |-- optee_example_hello_world
| |-- optee_example_hotp
| |-- optee_example_random
| |-- optee_example_secure_storage
| `-- tee-supplicant
`-- lib
|-- libteec.so -> libteec.so.1
|-- libteec.so.1 -> libteec.so.1.0
|-- libteec.so.1.0
|-- modules
| `-- 4.14.98-v7
`-- optee_armtz
|-- 484d4143-2d53-4841-3120-4a6f636b6542.ta
|-- 5dbac793-f574-4871-8ad3-04331ec17f24.ta
|-- 8aaaf200-2450-11e4-abe2-0002a5d5c51b.ta
|-- a734eed9-d6a1-4244-aa50-7c99719e7b7b.ta
|-- b6c53aba-9669-4668-a7f2-205629d00f86.ta
`-- f4e750bb-1437-4fbf-8785-8d3580c34994.ta
因为这是container里面的内容,需将之导出,再压缩,下载到本地后,方便之后直接拷贝到sd卡上
docker cp containerID:/path/filename /home/hky
tar -zcvf out.tar.gz out # 将DirName和其下所有文件(夹)压缩
Raspbian
为保证optee正常使用,下载2019-06-20-raspbian-buster版本。使用镜像烧录工具imager将img烧录到sd卡中。
烧录完成后,查看是否挂载,一般会自动挂载。
$ sudo cp ./out/boot/* /media/htwu/boot
$ sudo cp -r ./out/rootfs/* /media/htwu/rootfs
同时,开启ssh服务,在boot文件夹下新增SSH文件(注意无后缀)。
touch SSH
optee
进入optee验证,成功
pi@raspberrypi:~ $ ls /dev/tee*
/dev/tee0 /dev/teepriv0 # this prove tee driver & optee-os works.
pi@raspberrypi:~ $ sudo tee-supplicant &
[1] 620
pi@raspberrypi:~ $ sudo optee_example_hello_world
Invoking TA to increment 42
TA incremented value to 43
但是第二天再登录 就发现这样的问题
需注意,tee-supplicant只能运行一次,否则会出错,且vscode无法远程登陆。
服务器重新安装系统时,会报这样的错
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
原因是第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中。重新安装了一个新系统,再ssh时会报错。解决方法:
ssh-keygen -R 服务器端的ip地址
会出现如下提示:
# Host [服务器IP] found: line 1 type RSA
/用户home目录/.ssh/known_hosts updated.
Original contents retained as /用户home目录/.ssh/known_hosts.old
再ssh时,会出现以下提示,输入yes即可重新连接:
The authenticity of host '[服务器IP] (服务器IP)' can't be established.
RSA key fingerprint is da:f7:3e:ba:f7:00:e6:44:76:f2:58:6e:48:****.
Are you sure you want to continue connecting (yes/no)?
另,压缩文件的指令还不熟,以下分别是压缩和解压缩
tar -zcvf [目标文件名].tar.gz [原文件名/目录名] (压缩包会放在你当前路径)
tar -zxvf jpgs.tar.gz
查看目录里的文件夹的大小(不包括文件)
du . -d 1 -h
关于打包容器到本地,但是因为需要在本地也配置docker并且太大了,所以最后没这么做
https://www.csdn.net/tags/Mtjacg2sOTAzNzktYmxvZwO0O0OO0O0O.html
docker export 1e560fca3906 > ./ubuntu.tar
然后需要在docker里对程序编译,将编译好的二进制文件放到树莓派中运行
问题来了,编译内核的路径是啥???
最后还是让师兄帮忙配置了一下编译环境
需要把板子挂到公网上,接在服务器上,用frp穿透,并且服务器端已经配置好了
https://blog.csdn.net/weixin_43922901/article/details/109261700?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_default&utm_relevant_index=1
服务期端配置:
版本:0.38.0
ip:yuhangji.cn
$cat frps.ini
[common]
bind_port = 6579
vhost_http_port = 1324
token = jyh38038
客户端:
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_arm.tar.gz
mkdir frp
tar -zxvf frp_0.38.0_linux_amd64.tar.gz -C /home/pi/frp
vim frpc.ini
frpc.ini内容:
[common]
server_addr = yuhangji.cn
server_port = 6579
token = jyh38038
[ssh_1]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7878;服务器端需保证7878端口开放
- 其中,一开始写的[ssh],报错[ssh] start error: proxy name [ssh] is already in use,原因是当前是ssh到板子上进行操作的,冲突了,改为别名就好。[ssh]这样的名称必须全局唯一,即就算有多个客户端,也只能使用一次,其他的可以用[ssh2]、[ssh3]等;意思就是说,如果你要配置多个客户端,必须将另外的客户端的[ssh]改为[ssh2]、[ssh3]等,并且remote_port也要变,比如6002,6003等
pi@raspberrypi:~/frp/frp_0.38.0_linux_arm $ ./frpc -c ./frpc.ini
2022/04/14 11:03:04 [I] [service.go:301] [e8e0fd7bce1e573c] login to server success, get run id [e8e0fd7bce1e573c], server udp port [0]
2022/04/14 11:03:04 [I] [proxy_manager.go:144] [e8e0fd7bce1e573c] proxy added: [ssh_1]
2022/04/14 11:03:04 [I] [control.go:180] [e8e0fd7bce1e573c] [ssh_1] start proxy success
frp后台开启方法:
//服务端
nohup ./frps -c frps.ini >/dev/null 2>&1 &
//客户端
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
//先找到这个进程
ps -aux|grep frp| grep -v grep
root 3600 0.1 0.1 110188 9484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
//杀死进程
kill -9 3600
此时服务器可登录树莓派进行操作。
尝试编译hello_world模块:
make
sudo insmod hello.ko
lsmod
(有hello.ko的记录,表示已成功加载内核)
sudo depmod -a
sudo rmmod hello.ko
dmesg
HELLO!
BYEBYE!
编译TruSpy模块,出现问题:
make -C /lib/modules/4.14.98-v7/build M=/home/pi/TruSpy/KernelAttack modules
make[1]: Entering directory '/linux'
CC [M] /home/pi/TruSpy/KernelAttack/./src/armCache.o
armCache.s: Assembler messages:
armCache.s:100: Error: selected processor does not support `smc 0x0' in ARM mode
armCache.s:170: Error: selected processor does not support `smc 0x0' in ARM mode
armCache.s:242: Error: selected processor does not support `smc 0x0' in ARM mode
armCache.s:317: Error: selected processor does not support `smc 0x0' in ARM mode
armCache.s:1240: Error: selected processor does not support `smc 0x0' in ARM mode
make[2]: *** [scripts/Makefile.build:327: /home/pi/TruSpy/KernelAttack/./src/armCache.o] Error 1
make[1]: *** [Makefile:1535: _module_/home/pi/TruSpy/KernelAttack] Error 2
make[1]: Leaving directory '/linux'
make: *** [Makefile:9: all] Error 2
原因是smc汇编指令在当前的处理器上不支持,那么为何要用smc指令,并且如何解决/替代这个问题/指令?
内核对于当前toolchain来说太老,或者说代码写法与当前编译器有冲突,需要在代码中声明扩展指令段。即在涉及到SMC 0x0(将Arm core切换到trustzone模式下),添加安全扩展。
- asm volatile("smc 0x0\n\t");
+ asm volatile(".arch_extension sec\n\t"
+ "smc 0x0\n\t");
备份系统的时候搞崩了,重新装一边遍系统
1.烧录raspbian
2.sudo cp ./out/boot/* /media/hky/boot
sudo cp -r ./out/rootfs/* /media/hky/rootfs/
3.在boot下 touch SSH
4.tar -xvf linux.tar.gz
5.sudo mv linux/* /linux
6.cd /linux
sudo make scripts
sudo make tools/
7.正常情况下就能编译了
因为更新过sd卡,所以windows里的vscode再连接时,之前生成的公钥还在文件中,无法ssh上。所以需要删除.ssh下的known_hosts中相同ip地址的那一行,才能重新ssh。
本地编译环境:
在ta/Makefile中添加
TA_DEV_KIT_DIR=/home/pi/optee_os/out/arm/export-ta_arm32/
在集成好的hello_world目录下
make clean
make
此时ta目录下的uuid.ta文件拷贝到/lib/optee_armtz中
在host目录下
pi@raspberrypi:~/optee_examples/hello_world/host $ ls
main.c main.o Makefile optee_example_hello_world
pi@raspberrypi:~/optee_examples/hello_world/host $ sudo ./optee_example_hello_world
Invoking TA to increment 42
TA incremented value to 43
总结
开机后,先开启tee
sudo tee_supplicant &
再进入d2/kenable开启用户空间访问PMC
sudo insmod enable.ko
然后运行
sudo LD_LIBRARY_PATH=/home/pi/tee/aes ./elimi
或者需要涉及tee的就运行
sudo ./TEEencrypt