防抓包(证书攻击)策略-iOS

1、客户端进行判断是否设置了代理(对测试人员不友好)

+ (BOOL)getProxyStatus {
    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
    NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (CFDictionaryRef)proxySettings) autorelease]);
    NSDictionary *settings = [proxies objectAtIndex:0];
    
    NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
    NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
    NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
    
    if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
    {
        //没有设置代理
        return NO;
    }
    else
    {
        //设置代理了
        return YES;
    }
}

2、客户端本地做证书校验,并且设置不仅仅校验公钥,设置完整的正式校验模式

2.1把证书机构签完的公钥证书放到工程里名称为"server.cer" 2.2设置AFSSLPinningMode

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    AFSSLPinningModeNone,//(默认级别),客户端无条件信任任何下发的公钥证书
    AFSSLPinningModePublicKey,//客户端本地去验证服务端下发的公钥证书的 public keys部分。如果正确才通过
    AFSSLPinningModeCertificate,//客户端本地去验证服务端下发的公钥证书的所有部分。如果正确才通过
};

使用AFSSLPinningModePublicKey和AFSSLPinningModeCertificate方法基本可以防止青花瓷等的证书攻击

+(AFSecurityPolicy*)customSecurityPolicy
{
    // /先导入证书
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];//证书的路径
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    // AFSSLPinningModeCertificate 使用证书验证模式 (AFSSLPinningModeCertificate是证书所有字段都一样才通过认证,AFSSLPinningModePublicKey只认证公钥那一段,AFSSLPinningModeCertificate更安全。但是单向认证不能防止“中间人攻击”)
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
    // 如果是需要验证自建证书,需要设置为YES
    securityPolicy.allowInvalidCertificates = YES;

    //validatesDomainName 是否需要验证域名,默认为YES;
    //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。

    //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
    //如置为NO,建议自己添加对应域名的校验逻辑。
    securityPolicy.validatesDomainName = YES;
    NSSet<NSData*> * set = [[NSSet alloc]initWithObjects:certData  , nil];
    securityPolicy.pinnedCertificates = set;
        
    return securityPolicy;
}

!bug

所有方法都是有漏洞的,iOS的app够安全,但是圈内依然有一群逆向工程师

方法1中在使用Class-Dump还是能够找到方法并且运行时替换或者直接hook方法进行修改返回逻辑,动态库注入方式,再使用企业签名把ipa包进行重新签名ios-app-signerfir发布

方法2中在逆向工程师眼里也是很简单破解的,app砸壳,再显示包内容,依然可以直接把你证书放在青花瓷中使用。

只是提高了破解难度,有树叶遮羞总比裸露在外面好一点

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

iOS保证下载资源的可靠性(二)

前言 前文iOS如何保证下载资源的可靠性介绍了基于RSA的下载资源验证方案,这次详细介绍开发过程中的问题。 iOS接入步骤 ? 后台上传资源文件,配置平台对文件...

4109
来自专栏安智客

密码技术之消息认证码

上一节我们知道消息的完整性保护需要通过单向散列函数来保证。但是光完整性还不够,我们还有确认消息的来源必须是正确的发送者。

1975
来自专栏极客编程

Swift编写的EOS区块链开源框架SwiftyEOS

SwiftyEOS是一个用于与EOS交互的开源框架,用Swift编写。可以在iOS和macOS上使用。

1512
来自专栏农夫安全

【干货】骚姿势破解后台管理员密码

骚姿势破解后台管理员密码 0x01 前言 该文为admin原创文章 当你某个时候通过注入得到了admin的密码,然后把他放到md5解密的时候,激动不已的等待着结...

4876
来自专栏北京马哥教育

Linux基于OpenSSL实现私有CA构建

前言 随着互联网的迅猛发展,网络通信已经成为传递信息的主要途径。而通信时的数据传输大部分却是明 文传输的,在网络这个不安全的环境下,如果没有一套数据加密机制,就...

3847
来自专栏一“技”之长

深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)

    本篇博客主要讨论如何在客户端与服务端之间进行HTTPS网络传输,为了深入理解网络传输的基础原理,更加灵活的校验证书,博客的前半部分也将介绍一些HTTPS...

1915
来自专栏FreeBuf

一个纯JS脚本的文档敲诈者剖析(附解密工具)

0x00 概述 近日,腾讯反病毒实验室拦截到一个名为RAA的敲诈者木马,其所有的功能均在JS脚本里完成。这有别于过往敲诈者仅把JS脚本当作一个下载器,去下载和执...

5317
来自专栏黑白安全

App渗透中常见的加密与解密

前言:本文主要介绍了目前App数据传输过程中几种常见的加密方式,以及一些常规的解密手段,并不涵盖并应对所有情况,在实战过程中还须具体情况具体分析,随机应变;同时...

2.6K1
来自专栏IMWeb前端团队

从运营商小广告到HTTPS

相信很多人都试过这样的经历,浏览一个正常的网站时,右下突然角弹出一堆小广告,而且这些广告的内容和你浏览的网站格格不入: 前几天还有某微博用户爆料访问gith...

41910
来自专栏张绍文的专栏

基于 TLS 1.3的微信安全通信协议 mmtls 介绍(下)

随着近些年网络安全事情的频繁发生,使得用户对网络通信安全的意识越来越强。国内外的网络服务提供商都逐渐提供全站的安全通信服务,如国内的淘宝、百度先后宣布已经完成了...

2K1

扫码关注云+社区

领取腾讯云代金券