漏洞挖掘(转载整理)

date
May 8, 2023
slug
漏-洞-挖-掘
status
Published
tags
Website
summary
type
Post
Text

0x00 前言

引用一句话:直接发漏洞细节很生硬,大家也学不到什么,只有带入感情,留下笔者的想法,才能产生共鸣,真正的帮助到别人。本文章整合网上已有信息,例外记录个人挖洞实际记录,既帮助自己也帮助他人成长提升!

描述顺序:

0x01 存储过程sql注入

首先我先介绍我近期挖到的第一个漏洞:sql server exec存储过程处 sql injection。
这是我在挖国外遇到的一个网站,遇到的一个真实案例,一个后台的某个功能点,存在存储过程sql注入,使用单引号测试,发现他报错了。
这个报错很特别,和我平时看到的sql server报错信息不一样,我第一时间去谷歌搜索了下这个报错信息,很快就找到了一篇文章。
stackoverflow查看网站报错信息真的很方便,很方便帮我们判断使用了哪些技术.  虽然我英语很差,但是谷歌浏览器自带的翻译功能就够了,很快我就知道这是个sql server的存储过程报错。
话说回来,不通过谷歌搜索报错语句,通过单引号报错,其实就可能猜出来个大概。
我还是很常规的测试,因为报错了,所以我企图用最简单的方法让其报错出user/database等,尝试poc:
发现没有出user,甚至仍然报错,其实这是正常的。后续测试发现,只要我在后面添加内容,他就会一直报错...,他好像不允许添加过多的注入payload
notion image
我开始从报错注入,转为布尔类型注入测试
类似这样的payload,结局是泪目的,语句又是各种报错。我发现不能再这样搞了,这样搞的话思路肯定不对。
先从理解sql报错信息开始,理解存储过程,sql server的存储过程的语法是这样的:
它本身其实不需要任何单引号的闭合,因为它不是字符串类型注入,重新调整测试,测试就是学习的过程,再次上payload:
一顿fuzz,延时3s:
notion image
说明我的这个poc没有问题,一开始踩了一个坑,一个认知问题,惯性思维导致的错误。
这里误以为sql server的if也是和mysql的if使用一样,其实完全不一样,sql server等同mysql if函数的是iif函数.
我们知道,sql server报错有个很爽的技巧就是基于类型错误:int+varchar,尝试报错出db_name()。
报错注入poc:
notion image
至此,这个注入算搞定了,我可以提交了。

0x02 table头注入

第二个分享的案例仍然是注入,sql server table头注入,有意思的地方在于rce处,利用一个sql server特性我rce了它。
某天我挖一个站,发现一个功能点存在注入,是那种很常规的注入,通过查看js,我发现了一个接口:
我看到了table参数,我觉得这可能是sql server table头注入,这是经常做安全测试的一种直觉,我直接输入了sysobject,他给我大量返回了信息:
notion image
我很惊喜,那么它代码的实现很大可能是:
那么我可以做的事情变得很多很多,这个注入利用成本很低,我觉得他就是个任意sql语句执行漏洞。
我尝试rce,为了再次确定他是表头注入,我尝试在可控点处添加where等条件语句,尝试Payload。
notion image
很幸运,没任何报错,直接响应了:
notion image
我开始尝试rce,我们都知道sql server rce的条件是需要支持堆叠,我尝试;waitfor delay '0:0:3';直接给我报错了,那么大概率可能不支持堆叠查询
不过这个注入点非常特别,是表头注入,它满足一定的条件,即使不支持堆叠,只要权限够高,我们也可以rce。
先开启xp_cmdshell扩展:
执行命令:
直接页面显示了whoami信息:
notion image
我是幸运的,很快,我就提交了漏洞给相关厂商。
因为是表头注入,所以不需要堆叠了,因为sql server的select支持 select x select x
notion image
sql server容错率很强大 不同类型在一起,不会报错,会做自动区分:
notion image
notion image
第二个漏洞分享结束,开始第三个url跳转漏洞分享。

0x03 通用的url跳转

其实有时候,运气不是总是很好,漏洞也很难挖,连续好几天,我都没挖到漏洞,我在那边胡乱看着,瞎点着。
有一个站引起了我的兴趣,他的注册接口是这样的。
    我对url参数比较敏感,通常我会测试ssrf/xss,即使他大概率不存在,我也会测试下,很显然,半自动化工具没有发现任何ssrf和xss漏洞。
    我注册了一个账号,我尝试登录,它告诉我,我的账号需要审核,我尝试绕过,我也没有绕过它。
    我发现我没发现漏洞了,那我就随便看看吧,我都不抓包了,右键查看源代码,发现了这么一段代码,以前我就经常做js代码审计,这段代码我不会陌生。
      稍微学过一点js的也不会陌生,不过我们还是要走一遍基础的测试流程,它使用 location.hash.* 去传递参数。
      这个就是锚点符,常用于站内url跳转,记录#/后面的内容,其实这里的本意是做站内url跳转用的,不过这里没在hostname结尾处加/这个字符串,导致可以任意跳转。
      我们简单测试下:
      notion image
      那么如果我们想任意url跳转怎么办???
      只需要让location.hash.substring(1)变成另一个我们的域名即可,构造poc如下:
        他会直接跳转出信任域,实现任意页面url跳转
        notion image
        除了这样还可以通过 @domain 去跳转到第三方网站,更加方便!!!
        他的修复方案也很简单:
          至此第三个漏洞就分享完了。

          0x04 盲ssrf漏洞

          现在分享最后一个漏洞,就是盲的ssrf漏洞。前面我说过,我看到url参数,我就会尝试下ssrf/xss漏洞,这里我发现了一个图片加载功能,存在ssrf。
          首先在分享ssrf实战案例之前,先分享个ssrf安全测试圣经:https://github.com/cujanovic/SSRF-Testing
          github上提供的测试用例:
            如果想探测是否开放gopher,又不想触发waf怎么做?
              这个url地址是可以变化的,测试什么协议就变成什么协议,其他测试样本不再举例,类似的,都可以随意转换
              这里尝试301跳转:
              notion image
              dnslog成功收到请求,注意User-Agent,是libwww,perl的一个请求依赖库:
              使用上面的思路,测试下敏感协议,gopher协议:
              notion image
              有反应,说明大概率是支持gopher协议的,那么它到底支持不支持呢?
              通过查看github libwww代码,就可以得到答案,他支持这些协议,其中包含gopher协议。
              notion image
              这样我们就可以使用gopher协议去批量fuzz探测内网redis等服务,这个点到此为止。
              下面继续科普下盲的ssrf怎么探测?因为一般信息收集不全的情况下,我们没什么内网ip地址,那么我们怎么证明是盲ssrf呢?
                25端口提示我图片类型不对:
                notion image
                250端口,提示我连接被拒绝
                notion image
                这样就可以证明这是个盲的ssrf,它可以探测内网端口开放情况,然后因为它又支持gopher等敏感协议,它可以fuzz内网redis,尝试shell等,危害将会大大升级。
                至此,已经分享完了四个漏洞,通过我的所思所想,希望能给大家带来一些感悟,我该去做饭吃了。
                 

                0x05 Linux OverlayFS权限提升漏洞(CVE-2023-0386)通告

                 

                0x06 安卓渗透测试中常用的一些工具

                 

                Apktool

                Apktool是最常用的一款安卓反编译工具。支持多平台,在Linux中我们可以用apt命令直接安装。
                 
                反编译app,我们用-d命令就可以反编译android apk文件了
                如果需要回编译apk,那么可以使用 -b命令即可
                注意,两者不要搞混淆哦。

                dex2jar

                dex2jar用于将DEX文件转换成JAR文件,我们需要通过阅读程序的源代码,需要此工具。
                载dex2jar的源代码。可以从dex2jar的官方网站下载(https://sourceforge.net/projects/dex2jar/)解压缩源代码压缩包。可以使用终端进入解压缩目录,并执行以下命令进行编译:
                编译完成后,可执行文件位于dex-tools/build/distributions/dex-tools-.zip中。解压该压缩包,即可得到可执行文件。如果不想编译,可以在github仓库中,直接下载编译好的。

                JD-GUI

                需要对普通的Java程序进行反编译,或者需要对Android应用程序进行简单的反编译和查看,可以使用JD-GUI。如果您需要进行更深入的Android应用程序反编译和分析,建议使用JADX。下载地址(http://java-decompiler.github.io/)
                notion image

                Frida

                一款动态代码注入工具,可以在运行时修改和调试Android应用程序
                 

                0x07 kali linux web目录扫描工具汇总

                01 Gobuster

                Gobuster 是一个开源工具,主要用于网站目录扫描和子域名收集。安装也很简单,只需执行下面命令即可!
                apt-get install gobuster
                使用参数:
                • u : –url 网站的域名或者IP
                • w : 用户自定义字典
                • x : 自定义文件类型如php jsp
                示例
                gobuster dir -u http://192.168.0.106/bolt/ -w /usr/share/wordlists/dirb/big.txt -x php

                02 DIRB

                DIRB 是一个 Web 内容扫描器。它是 kali linux 内置的工具,通过对 Web 服务器发起基于字典的攻击并分析响应来工作,但请记住它是内容扫描器而不是漏洞扫描器。 使用也很简单,在DIRB后面直接加目标域名即可。

                03 dirsearch

                Dirsearch 是一个用 Python 编写的暴力扫描工具,用于查找隐藏的 Web 目录和文件。它可以在 Windows、Linux和 macOS上运行,而且终端界面配色也比较漂亮。
                安装dirsearch在kali中默认没有安装,我们只需执行下面命令进行安装。
                apt-get install dirsearch
                使用
                dirsearch -u https://bbskali.cn

                04 Wfuzz

                Wfuzz 在 Kali Linux内置的,因此我们可以通过在终端上键入wfuzz来启动它。参数-u : 目标网址-w : 单词表
                wfuzz -u https://bbskali.cn -w /usr/share/dirb/wordlists/common.txt --hc 400,404,403

                05 Metasploit

                利用metasploit 框架,我们也可以对网站目录进行扫描。
                use auxiliary/scanner/http/dir_scanner set rhosts bbskali.cn set path secnhack/ set dictionary /usr/share/dirb/wordlists/common.txt run
                notion image

                06 DirBuster

                DirBuster是kali自带的一款图形化工具。终端执行命令在其中提交目标详细信息,如下所示。
                notion image
                效果如下:
                notion image
                作者:逍遥子大表哥 https://www.bilibili.com/read/cv18085514/?from=readlist 出处:bilibili
                 

                0x08 钓鱼攻击资源汇总&备忘录

                 
                导航:
                 

                常规钓鱼思路

                VPS基建部署

                可以选择一键lnmp脚本,切记! 切记! 切记!做好高强度加固防止被反打!

                钓鱼文档制作

                可以根据蓝方政企的历史泄露比如百度云上的泄露的一些文档或者官网上的一些文档从中提炼出符合对方政企的文档格式要求。或根据对公司的企查查上的一些负面消息去做一些文章。方法不一看各位经验。
                附上一个常见参考的政企公文文档网址方便精准提取信息

                ditto

                Ditto是一个小型工具,它接受域名作为输入,并为同形异义词攻击生成其所有结果作为输出,并检查哪些可用和哪些已经注册。
                简单来说就是你拿到你想钓鱼的蓝方的域名去利用他快速生成高相似度的钓鱼域名去注册可用的来伪装去骗其蓝方公司安全意识不强的员工来达到你的钓鱼目的。

                SiteCopy

                网站复制,也可称为网站备份。是通过工具将网页上的内容全部保存下来。当然不仅仅只是保存了一个html页面,而是将网页源码内所包含的css、js和静态文件等全部保存,以在本地也可以完整的浏览整个网站。
                通过它快速拿到钓鱼点的前端源码对其进行修改转换PHP或者JAVA修改前端的请求参数和method入口到后端写个api接口接收前端的传参,还可以额外加上获取请求者的IP和UA方便进一步利用。常用的钓鱼点比如OA,邮服,管理平台等等,可以提前准备市面上常见的OA,邮服,管理平台之类的钓鱼点改造的储备。

                PhishingLogin

                脚本作用主要用来接收钓鱼页表单里输入的账号密码,要接收的参数均可根据自己的是需求进行添加,脚本写的粗糙,请弟兄们自行改进 另外,也可把自己的JS探针直接查到钓鱼页里,顺手搜集目标机器信息,实际中尽量用最少的操作去搜集尽可能多的信息

                formphish

                基于网络钓鱼表单的自动网站。该工具可以自动检测基于html表单的网站上的输入,以创建网络钓鱼页面。

                邮服发信平台

                一键大家邮服可用发送钓鱼邮件

                邮服探针

                邮箱探针后台管理系统,此探针可以判断目标是否点击了邮件。

                espoofer

                espoofer是一个开源测试工具,可以绕过电子邮件系统中的SPF,DKIM和DMARC身份验证。它可以帮助邮件服务器管理员和渗透测试人员检查目标电子邮件服务器和客户端是否容易受到电子邮件欺骗攻击或是否可以被滥用来发送欺骗电子邮件。

                PhishAPI

                全面的基于网络的网络钓鱼套件,可快速部署和实时警报!该API具有三个主要功能。一种允许您轻松地部署克隆的登录页面以进行凭据窃取,另一种是武器化的Word文档创建,第三种是保存的电子邮件活动模板。两种攻击方法都集成到Slack中以进行实时警报

                非常规钓鱼思路

                QRLJacking

                QR二维码钓鱼

                lockphish

                在锁定屏幕上进行网络钓鱼攻击的工具,旨在使用https链接获取Windows凭据,Android PIN和iPhone Passcode。这个点可能还需要很多时间去打磨直接丢过去可能对方不会看。

                hmmcookies

                使用快捷方式文件(绕过UAC)从Firefox,Chrome,Opera抓取Cookie
                地址:作者已删库源码本地我存了一份,这个钓鱼点我暂时还没想清楚具体实施的有效性是多少

                asnphishing

                具有otp绕过功能的高级网络钓鱼工具,当蓝方人员输入其凭据时,您需要转到原始网站并使用这些凭据将真实的OTP发送给受害者。一旦他输入该OTP,该OTP也将与您同在,您将被允许在他之前登录该帐户。
                 
                 

                0x09 改机过风控(重置)

                使用某加速器

                风控是什么?

                风控,其实就是字面意思,把这两个字拆开看就可以得到正确的解释,就是 风险 和 控制。
                黑产们制造风险,从而获得相应的利润。
                厂家们为了减少风险或尽量控制住风险,就有了风控这个概念的诞生。

                某加速器的软件的风控点在哪?

                这是一款加速器 App。
                当安装这款加速器 App 后,有两种方式可以使用这款 App。
                第一种方式是:用户注册一个账户来使用,然后每天赠送一个小时的使用时间。
                第二种方式是:当安装这款 App 后,它会自动分配一个体验用户,并且也会赠送每天一个小时的使用时间。
                notion image
                从上面的分析得知,只要安装并且在不手动注册的情况下,就会分配一个体验用户,体验一个小时。
                那么是不是只要卸载再重新安装,就会再体验一个小时呢?
                依次类推,只要到期就卸载,然后一直用 App 赠送的体验时间,就可以达到永久免费使用此款加速器了呢?
                经过卸载在安装后多次的尝试,发现并不能!而且我的信息,也就是我的用户ID,也不会随着卸载和重装而改变。
                所以经过推理得知,用户ID 可能是随机生成的,但用户ID 一定是和使用的手机是绑定的关系。
                所以最终得出的结果就是,这款 App 的风控点就在于识别本机设备。

                过某加速器App风控的思路

                从上面的分析得知,这款 App 的风控点就在于识别本机设备。
                也就是说,App 有一种方式或者几种方式可以识别出本机设备。
                在人类社会中,如何识别出一个人呢?方式大概有以下几种:面部识别,声音识别,身份证识别,家庭地址识别,手机号码识别等等。
                此时假设有一个场景:自然大灾难来临,一个人可以领一个馒头。那怎么样才能领两个馒头呢?
                他只要具备以下几点:首先整容,整的面目全非让别人认不出自己;然后声音变一下发音方式;在做一个假的身份证件;最后谎报家庭地址和手机号码即可。但是他还是他,只是人们认识的“他”变了,他本身没有改变,吃两个馒头的也还是他。
                而在手机世界中,想识别出一个手机的方式非常常用的方式有以下几种:硬件序列号,android_id,IMEI,SIM 序列号,IMSI,WifiMAC。
                过这款加速器的风控和大灾难来临,人如何领两个馒头是一样的。手机想办法改变 App 认识它的所有方式,但最终手机还是那个手机,只不过 App 已经不认识它了,这款加速器 App 会为它分配新的体验用户,也就是再次吃了本应该吃一次的“馒头”。
                下面分别介绍如果更改手机身份信息,先只介绍思路,项目放在后面。

                更改身份之 - 改硬件序列号

                硬件序列号写在了 android.os.Build.SERIAL 中,它是 Android 系统中定义的一个静态字符串常量,用于表示设备的硬件序列号。
                该字符串是由设备制造商生成的,是唯一的,可以用来识别设备。
                该值存储在 android.os.Build 类中,可以通过该类访问该值,安卓系统源码如下
                由于 SERIAL 是静态变量,Xposed 直接调用 setStaticObjectField 即可修改掉变量的值。
                但是细心的话可以看到,SERIAL 的值是通过 getString("no such thing") 方法执行
                跟踪方法,getString(String property) 方法内部调用了 SystemProperties.get() 方法。
                再继续跟踪方法,发现 SystemProperties.get() 方法,调用了 native_get() 方法,而 native_get() 方法是一个 native 方法,已没有跟踪的必要。
                notion image
                所以即使修改了 android.os.Build.SERIAL 的值,App 也可以调用 SystemProperties.get() 方法重新获得一次值,所以要在修改 android.os.Build.SERIAL 的值的基础上,hook SystemProperties.get() 方法并修改其返回值。

                更改身份之 - 改 android_id

                用户首次设置设备时随机生成的 64 位数字(表示为十六进制字符串),对于应用签名密钥、用户和设备的每个组合都是唯一的。 android_id 的值由签名密钥和用户限定。如果在设备上执行恢复出厂设置或 APK 签名密钥更改,则该值可能会更改。
                简而言之,android_id 是 Android 设备里不依赖于硬件的一种半永久标识符,在系统生命周期内不会改变,但系统重置或刷机后会发生变化。而实在没必要因为要过风控去重置或刷机,那就太麻烦。
                并且根据以往逆向经验,核验用户身份时,现在 App 也常常使用 android_id。所以更改 android_id 是非常必要的。
                android.provider.Settings 类的内部类 Secure 的 getString 方法可以获得 android_id。
                所以只需要 hook 住这个方法,修改掉返回值,即可改 android_id。

                更改身份之 - 改 IMEI

                IMEI(International Mobile Equipment Identity,国际移动身份识别码),俗称“手机串号”存储在手机的EEPROM(俗称码片)里,每一个移动设备都对应唯一的 IMEI。用于在移动电话网络中识别每一部独立的手机,相当于移动电话的身份证。
                序列号共有 15~17 位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。接着2位(FAC)是最后装配号(仅在早期机型中存在),代表最终装配地代码。后6位(SNR)是串号,代表生产顺序号。国际移动设备识别码一般贴于机身背面与外包装上,同时也存在于手机存储器中,通过在手机拨号键盘中输入 *#06# 即可查询。
                获得 IMEI 的方法很简单,直接调用 android.telephony.TelephonyManager 的 getDeviceId 方法即可。
                所以只需要 hook 住这个方法,修改掉返回值,即可改 IMEI。

                更改身份之 - 改 SIM 序列号

                上面介绍的:硬件序列号、android_id、IMEI 都是系统或手机自带的。
                SIM 序列号并不是自带的,但是又有哪个人买手机不安装 SIM 卡呢,如果一个手机没有 SIM 卡也会显得很怪异。
                SIM 序列号有唯一性,每个 SIM 卡序列号必须是唯一的,不能与其他 SIM 卡重复,所以只要 SIM 卡不更换,完全可以证明还是那部手机,也就是反向证明了手机设备的唯一性。
                获得 SIM 序列号的方法也很简单,直接调用 android.telephony.TelephonyManager 的 getDeviceId 方法即可。
                所以也只需要 hook 住这个方法,修改掉返回值,即可改 SIM 序列号。

                更改身份之 - 改 IMSI

                国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在 SIM 卡中,可用于区别移动用户的有效信息,所以更改 IMSI 是非常必要的。
                IMSI 其总长度不超过 15 位,同样使用 0~9 的数字。其中 MCC 是移动用户所属国家代号,占 3 位数字,中国的 MCC 规定为 460 ;MNC 是移动网号码,由两位或者三位数字组成,中国移动的移动网络编码(MNC)为 00;用于识别移动用户所归属的移动通信网;MSIN 是移动用户识别码,用以识别某一移动通信网中的移动用户。
                获得 IMSI 的方法也很简单,直接调用 android.telephony.TelephonyManager 的 getSubscriberId 方法即可。
                所以也只需要 hook 住这个方法,修改掉返回值,即可改 IMSI。

                更改身份之 - 改 WifiMAC

                MAC 地址是一种硬件标识符,可帮助在本地网络上找到设备,也就是 MAC 地址和手机是绑定的,修改 WifiMAC 地址肯定是必要的。
                修改 WifiMAC 地址,就没有修改 IMEI 、SIM序列号、IMSI 这么简单了,不是一个 API 就能解决的。
                因为不同版本查看 WifiMAC 地址的方式是不同的。
                1.Android 6.0 之前通过 WifiInfo 获取。
                hook 住 WifiInfo 的 getMacAddress() 方法,并修改掉返回值,即可改掉 WifiMAC。
                2.Android 7.0 以后通过网络接口驱动 wlan0 获取。
                7.0 以后就要麻烦很多了。首先获取网络接口,然后遍历网络接口,如果网络接口的名字是 wlan0 就获取它的值。
                hook 它的话也比较麻烦,hook java.net.NetworkInterface 的 getHardwareAddress 方法,然后获取对象,进行主动调用 getName 普通方法,如果 getName 的值是 wlan0 ,就直接构建一个 byte 数组修改 getHardwareAddress 方法的返回值。

                改机完整项目

                通过上面的分析,已经知道了每一个身份识别长什么样子,也知道如何修改它。
                项目的结构:一共有两个主要文件,HookTest.java 里面是 hook 的主要逻辑。Utis.java 里面是根据规则,随机生成身份识别等字符串。
                Utis.java 代码
                HookTest.java 代码

                过加速器软件风控,实现无限制 使用

                通过设备信息获取 App ,获取到没有改机之前的设备信息如下图:
                notion image
                改机之后的 App 信息如下图所示:
                notion image
                通过上面的两张图可以看到,“大变设备”,设备已经变的面目全非了。
                没改机之前,App 的试用时间已经到期。
                而改机之后,卸载重新安装,App 会认为又是一个新的设备,会为这个设备分配新的临时用户,也就是又可以继续试用,从而达到了改机过风控实现无限制使用的目的。
                 

                0x10 数据包伪造替换、会话劫持、https劫持之探索和测试

                 
                该攻击过程如下:伪造服务器响应客户端的数据包。监听客户端的数据包,用预先伪造的数据包,伪装成服务器返回的数据发送给客户端。
                因为攻击者跟目标在同一个局域网,所以攻击者发送的数据包肯定比服务器的响应数据要快很多,只要数据包构造正确,就一定可以被客户端按正常的数据处理。
                这部分的重点和难点在于,要构造正确的数据包,需要根据攻击者的目的,修改数据包中的数据、MAC、IP、TCP(UDP)层的长度、校验值等多个字段的值,还要兼容多种网络协议,另外还需要高效的处理数据包。
                这部分内容对于熟悉tcp/ip协议栈的程序员来讲非常容易,唯一需要注意的坑就是,udp和tcp封包中的checksum字段的计算,其格式不是简单的tcp和udp包头字节的crc校验,而是:
                1.先将checksum字段清零
                2.再将ip数据包中的 原ip(dword)、目的ip(dword)、包含tcp或者udp包头在内的数据长度值(short)、ip包中的协议字段(short)这4个字段加上tcp或者udp的包头加上数据部分之和(该长度还要2字节对齐,假如长度是奇数的话还要再补一个0)计算出来的校验和值。其结构体如下:
                计算tcp和udp中校验和的代码大体如下所示:
                 
                该模块基于winpcap开发。
                各层封包的包头处理有很多细节需要注意。在实际场景中,抓到的数据包并不是mac层,而是大多是pppoe或者wlan格式,其包头格式如下:
                具体处理流程更多是包头协议格式的解析,在此按下不表。
                本程序支持tcp和udp数据包的伪造、欺骗攻击,其代码主要位于ReplacePacket.cpp中。其中,dns劫持就是一种较为简单的数据包替换攻击,其代码位于 PacketProc.cpp中,要实现攻击需要了解dns数据包的格式,读者请自行百度。其主要数据结构如下:
                如下以下视频中,当dns欺骗未开启时,在nslookup中查询到的www.baidu.com的IP地址是182.61.200.7,而当dns攻击开启时,www.baiducom的ip地址被替换为192.168.101.122,这个地址正好是本机的ip地址,本机上有一个服务器程序,监听443或者80端口的数据,这样就可以当作下一步https攻击的服务器。
                从wireshark可以清晰看到网卡发出的dns伪造数据包。
                notion image
                效果动图请点击文末阅读原文
                notion image

                二 http劫持

                https劫持有多种方式可以实现,比如dns劫持方式和数据包转发。
                数据包转发方式较为复杂,各有各的实现方法。
                一般原理是:
                1.在数据包监听处,有一链路层处理程序S,识别并修改ssl数据包,将目的mac和目的ip地址改为解析程序的mac和ip、并重新校验之后,从链路层发送。
                2.解析程序在recv函数之后,会收到目的地址是自己的数据包,然后调用openssl接口,进入openssl接口处理部分,其返回结果是将https脱去后的明文数据。此时,解析程序可以当作中间人,将客户端数据发送给服务器的数据,从host取出真正的服务器地址,数据部分根据需要加工处理后发送给真正的服务器。对于服务器返回的数据,根据攻击者的目的,处理之后发送给真正的客户端。
                3.最后,S需要将链路层监听到的、跟发送给解析程序相匹配的、返回数据包,在链路层修改原mac和ip地址,并重新校验之后,从链路层上放回原来的数据流中。
                另一种方式较为简单,其过程如下:
                1.预先获取客户端要访问的域名,对其进行dns数据包替换攻击,将客户端对域名M的访问,定向到特定的主机H上
                2.客户端想要访问M域名时,由于伪造的dns数据包中返回的地址指向H,故此时客户端程序会误以为H就是M.
                3.在H主机上有一特定程序,采用中间人方式,对客户端的数据访问伪装成服务器,将客户端数据再次转发给真正的服务器,对于服务务器返回的数据,再次转发给真正的客户端。
                本程序采用第二种方法,主要的https中间人代码在sslEntry.cpp,sslProxyListener.cpp,sslProxy.cpp,makeCert.cpp,sslPublic.cpp等几个文件中,搬砖的工作暂且不表:)。
                在https劫持中一个重要问题就是证书问题。这里采取的方式是,将生成次级证书的根证书导入到本机的根证书授信中心,接下来利用此证书签名的二级证书和三级证书在chrome和edge中的访问都是没问题的,但是firefox有单独的证书认证体系,windows等操作系统认可的证书、包括我们我们导入的证书不在其认可范围之内。
                程序中实现了域名证书证书自动生成功能,可以根据客户端的clienthello数据包中的域名,动态生成域名证书。另外还支持自动检测和生成、导入根证书。
                程序运行需要预先安装openssl。
                在实际测试中,国内大厂包括阿里系,腾讯系的软件大都采用了https传输方式,但是也有极个别软件的服务器域名的ssl流量可以劫持成功,特别是某些Android移动端软件,ios端也发现过此种情况。当然,现在的趋势是验证机制越来越严格,难度越来越大。
                本实例程序运行时,会将ssl数据存放在output目录下的ssl.dat文件中,如下截图所示,当未开启ssl攻击时,浏览器访问正常;当开启ssl劫持后,浏览器依然正常,此时ouput目录下的ssl.dat中存放着https中的明文数据。从host或者域名可以验证我们刚才点击访问的网址,证明ssl劫持成功。
                notion image
                本次测试的具体代码下载地址:点击此处下载https://download.csdn.net/download/m0_37567738/87819471
                该项目具有tcp和udp数据包伪造替换、dns欺骗劫持、https中间人(mid in man)劫持攻击等多种功能。
                 

                0x11 DNS

                1、DNS 检测 :https://browserleaks.com/ip

                 
                2、

                © flyone 2021 - 2025