-
Notifications
You must be signed in to change notification settings - Fork 0
/
controller.go
92 lines (73 loc) · 2.55 KB
/
controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package scan
import (
"fmt"
"github.com/cimercomcn/gobinscan/pkg/sql"
"os"
"path/filepath"
"github.com/cimercomcn/gobinscan/pkg/common"
"github.com/cimercomcn/gobinscan/pkg/tools"
"github.com/neumannlyu/golog"
)
// 扫描从这里开始
func Start() common.Report {
// 保存固件文件信息
_report.Binfile.Name = filepath.Base(_cfgPtr.BinFile)
if abs, err := filepath.Abs(_cfgPtr.BinFile); !golog.CatchError(err) {
_report.Binfile.Dir = filepath.Dir(abs)
_report.Binfile.MD5 = _report.Binfile.GetMD5()
}
// 1.提取固件
_cfgPtr.Logs.CommonLog.Info(
fmt.Sprintf("[开始提取] %s > %s\n",
_cfgPtr.BinFile, _cfgPtr.BinExtractedDir))
if !tools.BinwalkMe(_cfgPtr.BinFile, _cfgPtr.BinExtractedDir) {
_cfgPtr.Logs.CommonLog.Fatal("提取固件文件失败")
return _report
} else {
_cfgPtr.Logs.OK.Logln(
"[提取完成] 提取的文件保存在 " + _cfgPtr.BinExtractedDir + " 目录下")
}
_cfgPtr.BinExtractedDir = filepath.Join(_cfgPtr.BinExtractedDir,
"_"+filepath.Base(_cfgPtr.BinFile)+".extracted")
// 2. 检查固件加密情况
if isEncrypted() {
_cfgPtr.Logs.CommonLog.Fatal("发现固件被加密,请解密后再尝试分析。\n")
return _report
} else {
_cfgPtr.Logs.Pass.Logln("\n\n\n\t\t\t\t固件加密未加密\n\n\n")
}
// 3. 扫描提取的文件
scanExtractedFiles(_cfgPtr.BinExtractedDir)
// 4. 分析内核漏洞
if !scanKernelVulnerability(_cfgPtr.BinExtractedDir) {
return _report
}
// 5. 分析(中间件)程序
scanProgramVulnerability()
// 资源回收
sql.Isql.Close()
return _report
}
// 检查固件是否被加密
// true: 加密; false: 未加密
func isEncrypted() bool {
// 判断条件1: 是否有 squashfs-root 目录
pass1 := true
fs, err := os.ReadDir(_cfgPtr.BinExtractedDir)
golog.CatchError(err)
// 遍历目录中的文件。如果遇到某些文件时,将跳过。
for _, file := range fs {
if file.IsDir() && file.Name() == "squashfs-root" {
pass1 = false
break
}
}
// 判断2: 正常情况下squashfs-root目录下应该会有多个文件,如果只有一个文件应该就是加密了。
pass2 := false
squashfs_root := filepath.Join(_cfgPtr.BinExtractedDir, "squashfs-root")
fs, err = os.ReadDir(squashfs_root)
if golog.CatchError(err) || len(fs) <= 1 {
pass2 = true
}
return pass1 || pass2
}