1.9 Windows系统提权基础命令
在第1.1节中,我们对提权进行了介绍。在实际提权过程中,常常需要通过WebShell来执行各种命令,以获取操作系统(内网系统)服务器所开启的端口、进程、系统服务、已安装程序、系统安全设置等信息。对这些信息的探测,都是建立在可以执行基本命令的WebShell上的。
1.9.1 获取IP地址信息
IP地址主要有两种,一种是内网IP地址,另一种是外网IP地址。在渗透提权过程中,如果遇到外网IP地址,可以在该服务器上启用3389后直接登录;如果遇到内网IP地址,则需要配合一些代理程序(例如lcx等)才能登录。
IP地址的获取比较简单,有的WebShell上会自己显示(但仅显示IP地址)。在Windows中使用“ipconfig/all”命令,在Linux中使用“ifconfig-a”命令,通过显示的信息来获取IP地址。如图1-75所示,获取Windows下某主机的IP地址信息,其中包含了很多重要信息。本例是无线网络,如果是域内主机,则可以通过DNS等信息获取DNS服务器IP地址等。
图1-75 获取IP地址信息
1.9.2 获取端口信息
我们习惯使用“netstat-an”命令来获取目前主机所有端口的开放情况及网络连接情况。端口开放情况也可以通过NMap等扫描软件获取。使用Netstat一般是在有一定权限的情况下,例如获取了3389开放的端口等。Netstat可以附加一些参数来显示更加详细的信息,具体如下。
· -b:显示包含于创建每个连接或监听端口的可执行组件。在某些情况下,已知可执行组件拥有多个独立组件,且包含于创建连接或监听端口的组件序列将被显示。执行此选项可能需要很长时间,如果没有足够的权限,可能会失败。
· -o:显示与每个连接相关的所属进程ID。
· -v:与“-b”选项一起使用时将显示包含于为所有可执行组件创建连接或监听端口的组件。
“netstat-anb”命令用于获取进程号(PID)、端口开放情况、开放端口程序及服务组件等信息。“netstat-ano”命令用于获取TCP/UDP协议信息、端口和进程号。“netstat-anvb”命令用于获取进程名、对应的进程PID、端口所用的协议、调用的可执行组件、相应的组件和第三方进程的系统路径。
1.9.3 获取服务信息和进程信息
1.获取服务信息
在Windows下有很多第三方程序是通过服务运行的,如果攻击者从服务信息中获取了第三方程序的名称,就可以利用其相关漏洞进行提权。服务信息的获取还可以用于关闭杀毒软件和防火墙,以及关闭某些防护进程。可以通过“net start”命令查看系统所开启的所有服务,通过“net stop servicesname”命令停止服务,通过“net start servicename”命令开启服务。
2.获取进程信息
通过“tasklist/svc”命令可以获取运行的进程名称、服务和PID。可以通过msinfo32命令获取更加详细的进程信息,示例如下。
start /wait msinfo32.exe /report c:\windows\list.txt /categories swenv+SWEnvRunningTasks
·获取环境变量,示例如下。
start /wait msinfo32.exe /report c:\windows\temp\Startup.txt /categories swenv+SWEnvEnvVars
·获取程序组信息(可以获取目标服务器所安装的软件信息),示例如下。
start /wait msinfo32.exe /report c:\windows\temp\programs.txt /categories swenv+SWEnvStartupPrograms
·获取启动程序相关信息,示例如下。
start /wait msinfo32.exe /report c:\windows\temp\Startup.txt /categories swenv+SWEnvStartupPrograms
1.9.4 进程结束命令
在提权过程中需要关闭或者结束一些杀毒软件或者防护软件的进程。结束进程命令除了系统自带的之外,还有pskill,下面进行介绍。
1.taskkill命令
taskkill是Windows自带的终止进程程序,其命令规则如下。
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]
比较常用的参数是“/im”及“/f”。例如,强制关闭360杀毒程序,命令如下。
taskkill /im 360tray.exe /f
taskill一般需要配合tasklist使用。通过tasklist,可以查看系统目前运行的进程,获取其PID。如图1-76所示,获取httpd.exe进程的PID为452,则杀死该进程的命令为“taskkill/pid 452/F”。如图1-77所示,成功将该进程杀死。
图1-76 获取所有的进程
图1-77 结束某个进程
2.PsKill命令
PsKill程序是PsTools包中的一个子程序,其功能与taskkill类似,第一次运行时需要加入参数accepteula,即使用“pskill/accepteula”命令接受其许可。
PsTools的下载地址为https://download.sysinternals.com/files/PSTools.zip,其命令规则如下。
pskill [-t] [\\computer [-u username [-p password]]] <process ID | name>
常见用法为“pskill进程号(或者名字)”。例如,结束notepad.exe进程,命令为“pskill notepad”,如图1-78所示。
图1-78 PsKill结束进程
1.9.5 用户管理命令
对Windows操作系统来说,系统访问一般是通过用户口令来实现的。大多数提权是通过漏洞利用程序获取system权限,添加管理员用户账号到系统中,开启3389端口登录系统的。用户管理可以通过控制台进行,也可以在命令行中进行。需要注意的是,有些系统设置了密码复杂度,也就是说,如果不满足复杂度,将无法添加用户。
1.添加用户temp为管理员
net user temp T@#qweasd2016 /add & net Localgroup Administrators temp/Add
上面的命令可以分开写,具体如下。
net user temp T@#qweasd2016 /add net Localgroup Administrators temp /Add
查看当前系统管理员用户,命令如下。
net Localgroup Administrators
加入远程桌面用户组,命令如下。
net localgroup “Remote Desktop Users“ temp /add
查看指定用户的信息,命令如下。
Net user temp
2.激活guest用户
net user guest /active:yes
修改guest用户的密码,命令如下。
net user guest 1234
1.9.6 开启3389端口
在Windows Server 2003中,使用cmd命令开启3389端口,示例如下。
wmic path win32_terminalservicesetting where (__CLASS ! = “”) call setallowtsconnections 1
在Windows Server 2008/7/Server 2012中,使用cmd命令开启3389端口,示例如下。
1 wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS ! = “”) call setallowtsconnections 1 2 wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1 3 reg add “HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
在Windows Server 2012和Windows 7中只需要使用前两条命令。