过程
用nmap对目标主机做全端口扫描,dirb做目录扫描,结果如下:
8888端口开放一个web服务,存在Basic认证,试了爆破无果,sun-answerbook是一个在线文档系统,但不知道具体版本,测了未授权访问的历史漏洞,发现不存在。
进入antibot_image路径下,找到info.php文件,访问发现是phpinfo信息,在注释中找到了文件包含的命令。但根据phpinfo,allow_url_include是Off,不能进行远程文件包含。
Basic认证爆破
basic认证,即在请求的Header中添加一个请求头,内容为"用户名:密码"的base64的值。
爆破也容易,把payload设置为字典,添加两个预处理,第一个时添加前缀可以为用户名+冒号例如:"admin:",第二个预处理为base64编码。
SSH写日志getshell
22端口关闭,但2211端口上运行的也是ssh服务。ssh日志记录在/var/log/auth.log
,例如我们使用用户名123尝试登录,登录失败后,用户名将被记录在日志中。
那么使用登录命令:ssh '<?php @eval($_POST["a"]); ?>'@192.168.6.174 -p 2211
就可以将一句话木马写入该日志文件,从而getshell。
PHP过滤器无文件RCE
PHP过滤器(PHP Filter)原是PHP中验证和过滤数据的工具,例如我们可以使用php://filter/string.rot13/resource=
对字符串执行ROT13转换。无文件RCE的原理是利用php过滤器中的convert.iconv.UTF8.CSISO2022KR
会始终将\x1b$)C
添加到待转字符串之前,而convert.base64-decode
会忽略掉任何无效的base64字符串。
因此可以利用一些字符串编码的转换,对\x1b$)C
进行转换,使得只有我们想要的字符在整段字符串中是"有效"的,再利用base64的编码与解码,将"无效"的删除掉。最初的博文是做了BASE64可见字符的转换表,php_filter_chain_generator在此基础上,做了更多可见字符的转换表。
SESSION_UPLOAD_PROGRESS getshell
根据phpinfo,拿到session保存的位置:/var/lib/php/sessions。且session.auto
不过这里的session.auto_start
的值为Off,不会自动化初始Session。到这里我想,既然可以读到php文件了,那是否可以去找有初始化session的文件来利用呢?
很遗憾没有找到。但为了验证猜想,在获得root权限后,新写入一个test文件,这个文件什么内容都没有,只有一句session_start();
。
本地写一个html文件,内容为:
随便上传一个文件,主要是为了让php生成session。
设置空payload,但数量大,不断发包,维持恶意session文件的存储。此时若结合条件竞争,上传一个不死马,并不断访问,即可getshell。
提权
这个提权没什么好说的,内核提权找payload。searchsploit linux 4.4.0
用的内核提权最终找到: CVE-2017-16995 (45010)
。靶机上没有gcc,在kali上编译后下载到靶机上执行。gcc 45010.c -o pwn -static
总结
- 本地文件包含对策:SESSION_UPLOAD_PROGRESS getshell、PHP过滤器链RCE、日志写shell
- 利用SESSION_UPLOAD_PROGRESS写恶意session时只需要php启用session即可,不需要该文件session有意义。