第93篇:记一次国护零失分的防守经验总结(上篇)

4e322e533bc1da4662398820afbe6332.png

 Part1 前言 

大家好,我是ABC_123。一年一度的网络安全“大考”就要开始了,笔者了解到很多朋友都在为蓝队防守问题发愁,我曾经有幸在一家防守单位担任技术方面的主防研判的角色,在团队的共同努力下,实现了零失分的成绩,保障了甲方客户的网络安全。ABC_123总结以前的经验,把一些简单有效可以快速落地的方法分享给大家,后续会逐步形成一个蓝队防守的知识体系,会做一个思维导图发出来。

注:“希潭实验室”公众号作为自媒体,会一直保持中立原则,未与任何公司绑定,在文章中也不会评论任何厂商的安全设备的好坏,所以关于设备的选择需要大家自己斟酌,适合自己的就是最好的

注:应很多网友要求和期望,“希潭实验室”公众号开设一个新的板块“安全咨询”,后续我会以多年红队实战经验的视角,写一些关于安全体系建设方面的文章,敬请期待。

 Part2 技术研究过程 

  • 异构WAF设备串联部署

虽然Web打点越来越难,但是目前蓝队防守还是会花费很大精力在防守Web打点上。攻击队会使用某OA的0day漏洞、某CMS的0day漏洞、框架级0day漏洞(Fastjson、Dubbo、Thinkphp)、中间件级别的0day漏洞(Weblogic、Websphere)等植入一个webshell或者内存马,然后做Socks5代理攻击内网。

19c352c2a901c16892d63eaf0b66cac3.png

所以waf设备实际上是第一道有效的防线,攻击者在前期构造攻击数据包的时候,就会想方设法绕过waf的防护:

1.  使用超大数据包或者脏数据包使waf放行。

2.  使用畸形数据包使waf的正则表达式识别不了。

3.  利用协议解析问题中间件解析特性使waf识别不了但是中间件可以解析等各种方法绕过waf的防护。

4.  在最近的攻防比赛中,对于Java反序列化漏洞的绕waf的数据包,更加偏向于使其看起来像正常业务的流量数据,以绕过流量监控的检查。

所以这里有一个很好的策略就是waf设备的异构,就是用两个不同厂商的waf进行串联,这样攻击者费尽心力构造一个绕waf的数据包,可以绕过一个厂商的waf,但是难以同时绕过两个厂商的waf

缺点:两个不同厂商的waf串联,在部分场合会影响业务的正常运行,所以要在业务低峰期,进行一下测试与评估。如果确实影响业务,可以在保证首选WAF产品不更换的前提下,将另一个waf产品进行更换适配进行重新测试,这个问题可能会得到解决。

  • 终端安全防护多元化

主机层面的edr防护可能是防范攻击者入侵的最后一道防线,这里可以尝试用两个不同品牌的EDR或者HIDS或者杀软防护进行异构,这样做的原因有以下几点:

6b4d8ee028240abf5bb667c22ea83c21.jpeg

1、防止攻击队拥有该品牌的0day漏洞导致整体无告警。场景如下:攻击者进入内网之后,采用“擒贼先擒王”的策略,在内网快速找到该EDR产品的服务管理地址,使用0day漏洞直接将内网的edr防护全部关掉或者告警全部关掉;在此情况下,另一个品牌的EDR或者杀软还能继续发挥重要作用。

2、防止一个品牌的edr终端防护被轻易绕过。两个品牌的EDR就更保险一些,类似于前面所说的,攻击者的攻击行为绕过其中一个EDR产品的防护策略相对容易,但是一个攻击行为同时绕过两个品牌EDR的防护,难度是非常大的。

缺点:两个不同品牌的edr可能会不兼容,出现相互“打架”的问题。这个就需要实际测试一下,可以在首选的edr产品不更换的前提下,换一个能够与其兼容的edr或者终端防护产品。此外,公司员工对两个终端防护可能会非常反感,策略过于敏感会出现各种提示框,影响日常工作,从而引起多名员工要求卸载的情况。

  • 资产管理与暴露面收紧

一般来讲,企业暴露在外网的资产越多,留给攻击者的攻击面越大,被打穿的可能性也就越大。如果一个企业有500到1000个子域名,暴露面如此之大,难保1000个子域名攻击者挖不出一个0day漏洞,那么被打穿的可能性就会很大;如果500个子域名对外网暴露最后经过整改变为50个子域名暴露,那么被打穿的可能性会减少很多。

24b28897096e30f8b2060ced931fe019.png

所以做好前期的资产收集工作,将无用的老旧系统通通下线,对一些无需对外开放的系统,可以收缩到内网访问,或者通过VPN进行访问。尤其是一些OA系统、记账系统、工单系统、报表系统、CMS系统,尽量收到内网之后;因为这些系统广泛使用,各家攻击队可能会掌握其大量代码,审计出0day漏洞,导致直接被打穿。

  • 主机外联全面封禁

攻击者如果已经Web打点成功,获取了外网的一个入口点。为了扩大战果,攻击者会搭建Socks5代理进行内网横向,最好的办法是在内网主机上植入一个反向Socks5代理程序,像登录VPN一样连入企业内部网络,进行内网扫描与横向拓展。

在这种情况下,攻击者想要反向Socks5代理成功,找到一台能够与攻击者C2服务器通信的内网主机,于是一个简单且有效的方法就是禁止所有主机连接互联网,需要注意的是,不仅仅要封禁TCP端口的外连,UDP端口同样也需要封堵,尤其是UDP的53端口;此外,DNS协议、ICMP协议要同样封堵,因为攻击队的反向代理隧道可以伪装成DNS协议、ICMP协议、UDP协议以绕过传统防火墙的拦截

3b73e3f23efaea47c6472f0186b893f0.jpeg

注:根据以往的红队经验,对于UDP的53端口,很多厂商都没有禁止其外连,因此攻击队会依靠此端口实现Socks5代理隧道或ICMP实现Socks5代理隧道。

优点:为攻击者的内网横向带来很大阻力,极大减慢攻击者内网横移的速度,逼迫攻击者使用速度慢且不稳定的HTTP隧道代理,或者使用真正的端口复用程序。

缺点:防不了以内存马形式植入的HTTP隧道代理,防不了真正的端口复用程序。好在这两种方式搭建代理都不太稳定。

  • 内网邮箱防钓鱼策略

在防止钓鱼邮件方面,曾经的主防单位在半年前就进行了极大的努力,防守策略很简单,公司邮箱强制要求只能在内网使用或者登录VPN之后才可以收发邮件,从根源上彻底封堵邮件钓鱼的可能性

b4839156c95dd89494eedce1e5efa75e.jpeg

缺点:1、对于一个甲方公司来讲,已经习惯了十多年的外网邮箱使用,为了网络安全去推进这个防守措施,难度极大,部分公司可能会无法推进。2、通过VPN登录内网邮箱很麻烦,员工为了使用方便,逐步出现了大量使用自己原有的个人邮箱126、163邮箱、qq邮箱来存储公司的办公文件或excel密码列表的现象,反而带来了其它的安全隐患。

  • 密码安全与弱口令防治

在历年的大小攻防比赛中,弱口令问题失分占基本上都在50%到80%左右,弱口令问题在经过这么多年的攻防比赛检验之后,依然严重,依然是外网入口及内网横向中的一个很大的薄弱点。

所以攻防演练比赛之前,一般会要求运维人员或者公司员工,对自己的外网密码、内网服务器密码、网络设备密码等等都需要修改一遍。除了防止弱口令的问题之外,还要防止前期红队人员在长期对一家单位进行红队评估过程中,逐步积累的一些该公司的密码规律。所有员工尤其是运维人员,都要清空浏览器的自动记录密码功能,防止攻击者对员工进行邮件钓鱼,导致浏览器记录的密码完全被抓到,导致VPN密码被抓到,直接内网沦陷。

5011ff1b40398a21b67cbdb1739eb5e0.png

解决弱口令问题临时想到有两个解决方案:

1、研发源头限制。研发人员在写注册密码功能代码的时候,就需要从根源上限制用户设置的密码复杂度足够高,至少8位、涵盖大小写及特殊字符等,并且禁止键盘连号。

2、双因子认证。外网或者内网的业务系统,使用用户名密码登录入口统一可以添加短信认证,并且杜绝逻辑漏洞导致短信验证可以绕过的问题,同时也要进行万能验证码的情况发生。

  • 一到两次的前期红队评估检验

所有的防守体系搭建完成之后,一定要邀请不同公司的红队进行红队评估,实战演练可以对防守体系进行查漏补缺。

b0180cd7b3144a1be35fe7b58bbf26c2.jpeg

通过实战打一遍,可以得知是否还有未下线的老旧资产、攻击流量是否都流经了安全设备、全流量设备是否存下了攻击流量、探针部署是否合理、内网蜜罐是否告警、蜜罐是否进行了有效的网络隔离、EDR的各种防护模块是否开启并进行了有效拦截、一些漏洞是否得到了有效修复等等。只有经过实战的红队评估检验,这些容易被疏忽的问题才会显露出来

 Part3 总结 

1.  这里给出的防守建议是一些实现简单而又能快速奏效的方法,其它的总结还在继续研究,后期会发出来,敬请期待。

2.  依赖单一供应商的解决方案可能导致企业被锁定进特定的技术生态系统,而异构性提供了选择的自由,减少了单一供应商风险和成本。

45cfe618f73f58d8787dd1e2bd4a33a9.png

公众号专注于网络安全技术分享,包括安全咨询、APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com

(replace # with @)

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是一个简单的接苹果小游戏的Python代码示例: ```python import pygame import random # 初始化Pygame pygame.init() # 定义游戏窗口大小 screen_width = 600 screen_height = 800 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("接苹果小游戏") # 定义颜色 white = (255, 255, 255) # 加载图片 bg_img = pygame.image.load("background.jpg") apple_img = pygame.image.load("apple.png") basket_img = pygame.image.load("basket.png") # 定义角色和苹果的初始位置 basket_x = 250 apple_x = random.randint(50, screen_width - 50) apple_y = 0 # 定义角色和苹果的移动速度 basket_speed = 10 apple_speed = 5 # 定义得分 score = 0 font = pygame.font.SysFont(None, 40) # 游戏循环 running = True while running: # 监听事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 监听键盘事件 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: basket_x -= basket_speed elif event.key == pygame.K_RIGHT: basket_x += basket_speed # 绘制背景 screen.blit(bg_img, (0, 0)) # 绘制苹果 apple_y += apple_speed if apple_y > screen_height: apple_x = random.randint(50, screen_width - 50) apple_y = 0 score -= 1 screen.blit(apple_img, (apple_x, apple_y)) # 绘制角色 screen.blit(basket_img, (basket_x, screen_height - 100)) # 判断是否接到苹果 if apple_y + 100 > screen_height - 100: if abs(apple_x - basket_x) < 50: apple_x = random.randint(50, screen_width - 50) apple_y = 0 score += 1 # 绘制得分 score_text = font.render("得分:" + str(score), True, white) screen.blit(score_text, (10, 10)) # 刷新屏幕 pygame.display.update() # 退出Pygame pygame.quit() ``` 在运行代码前,需要在当前目录下准备好`background.jpg`、`apple.png`和`basket.png`三张图片。 该代码实现了一个简单的接苹果小游戏,玩家需要控制篮筐接住从上方掉落的苹果,若苹果掉落到地面或者篮筐头上,则玩家失分。玩家可以使用键盘左右方向键来控制篮筐的移动,得分会在屏幕左上角显示。 希望以上内容对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希潭实验室

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值