1.正向连接
正向连接就是受控端主机监听一个端口,由控制端主机主动去连接受控端主机的过程,适用于受控主机具有公网IP的情况下。在下图中,Attacker 和Victim 主机都具有公网IP,Attacker 可以直接通过IP地址访问到Victim,所以能够使用正向连接来控制Victim。
2.反向连接
反向连接是控制端主机监听一个端口,由受控端主机反向去连接控制端主机的过程,
适用于受控端主机没有公网IP的情况。在下图中,Victim是一台位于内网,并且没有公网IP的主机,Attacker 无法直接通过IP地址访问到Victim。 所以此时需要在Attacker.上监听一个端口,让Victim去反向连接Attacker, 从而实现对Victim 的控制。
在渗透测试中,正向连接往往受限于受控主机上的防火墙屏蔽及权限不足等情况,而反向连接可以很好地突破这些限制。
端口转发(Port Forwarding)是网络地址转换(NAT) 的一种应用。通过端口转发,一个网络端口上收到的数据可以被转发给另一个网络端口。转发的端口可以是本机的端口,也可以是其他主机上的端口。
在现实环境中,内网部署的各种防火墙和入侵检测设备会检查敏感端口上的连接情况,如果发现连接存在异样,就会立即阻断通信。通过端口转发,设置将这个被检测的.敏感端口的数据转发到防火墙允许的端口上,建立起一个通信隧道,可以绕过防火墙的检测,并与指定端口进行通信。
端口映射(Port Mapping)也是网络地址转换(NAT) 的一种应用,用于把公网的地址翻译成私有地址。端口映射可以将外网主机收到的请求映射到内网主机上,使得没有公网IP地址的内网主机能够对外提供相应的服务。
注意,根据相关资料,端口转发与端口映射的概念并没有严格的术语解释,有的资料只是定义了这两个术语,并作为同一个术语进行解释,故在下文中也不作区分。
SOCKS全称为Protocol For Sessions Traversal Across Firewall Securely,是一种代理协议,其标准端口为1080。SOCKS代理有SOCKS4和SOCKS5两个版本,SOCKS4只支持TCP,而SOCKS5在SOCKS4的基础上进一步扩展,可以支持UDP和各种身份验证机制等协议。采用SOCKS协议的代理服务器被称为SOCKS服务器,这是一种通用的代理服务器,在网络通信中扮演着一个请求代理人的角色。在内网渗透中,通过搭建SOCKS代理,可以与目标内网主机进行通信,避免多次使用端口转发。
LCX是一款十分经典的内网端口转发工具,基于Socket套接字,具有端口转发和端口映射的功能。但是目前很多杀毒软件已经将LCX加入了特征库,在实际利用时需要自行做免杀处理。
FRP是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、
HTTPS等协议,可以将内网服务以安全、便捷的方式,通过具有公网IP节点的中转暴露
到公网。在进行内网渗透中,FRP是一款常用的隧道工具。
除此之外,FRP支持搭建SOCKS5代理应用。
FRP有Windows系统和Linux系统两个版本,主要包含以下文件: firps,服务端程序;
frps.ini,服务端配置文件; frpc, 客户端程序; frpc.ini, 客户端配置文件。
在目标主机上执行以下命令,查看已安装的系统补丁
systeminfo
测试人员会通过没有列出的补丁号,结合系统版本等信息,借助相关提权辅助网站寻找可用的提权漏洞,如MS18-8120与KB4131188 对应、CVE-2020-0787与KB4540673对应等。
确定目标系统中存在的漏洞后,测试人员便可通过各种方式搜寻漏洞利用程序,然后,上传进行利用。
通常情况下,用户安装的一些应用软件会在本地注册一些服务,并且大多数服务在计算机开机时以系统SYSTEM权限启动。应用软件在注册服务时,会在以下路径中创建相应的注册表项。
HKEY_ LOCAL MACHINE\SYSTEM\CurrentControlSet\services
Windows系统服务在操作系统启动时运行,并在后台调用其相应的二进制文件。 由于大多数系统服务是以系统权限(SYSTEM)启动的,如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。
系统服务类提权从主观上可以归咎于用户的配置疏忽或操作错误,如不安全的服务权限、服务注册表权限脆弱、服务路径权限可控、未引用的服务路径等。
ACL定义了安全对象的访问控制策略,用于规定哪些主体对其拥有访问权限和拥有什么样的权限。Windows的系统服务正是通过ACL来指定用户对其拥有的权限,常见的权限如下表所示。
假设目标主机的用户在配置服务时存在疏忽,使得低权限用户对高权限下运行的系统服务拥有更改服务配置的权限(SERVICE_ QUERY_CONFIG 或SERVICE ALL_ACCESS),就可以通过这个低权限用户直接修改服务启动时的二进制文件路径。
在实战中,AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。AccessChk是微软官方提供的管理工具,常用来枚举或查看系统中指定用户、组对特定资源(包括但不限于文件、文件夹、注册表、全局对象和系统服务等)的访问权限。
低权限用户可以检查“Authenticated Users"组和"INTERACTIVE" 组对系统服务的权限。前者为经过身份验证的用户,包含系统中所有使用用户名、密码登录并通过身份验证的账户,但不包括来宾账户;后者为交互式用户组,包含系统中所有直接登录到计算机进行操作的用户。默认情况下,这两个组为计算机本地“Users” 组的成员。
①执行以下命令:
accesschk.exe /accepteula -uwCqv "Authenticated Users" *
枚举目标主机“Authenticated Users”组是否具有更改服务配置的权限。
②“Authenticated Users” 组对InsproSvc 服务具有SERVICE_ QUERY_ _CONFIG权
限。此时执行以下命令,将该服务启动时执行的二进制文件替换为预先上传的攻击载荷。
当服务重启时,载荷会随着服务的启动继承系统权限。
sc config InsproSvc binpath= "cmd.exe /k C:\Users\Public\reverse_ tcp.exe"
# binpath, 指定服务的二进制文件路径,注意“=”后必须有一个空格
注意,如果当前用户对该服务拥有SERVICE_ STOP 和SERVICE_ START权限,意味着用户拥有对服务的重启权限,可以直接执行以下命令重启服务。
sc stop
sc start
如果没有权限,对于启动类型为“自动”的服务,就可以尝试通过重新启动计算机的方法来实现服务重启。
服务注册表权限脆弱
Windows的注册表中存储了每个系统服务的条目,而注册表使用ACL来管理用户对其所拥有的访问权限。如果注册表的ACL配置错误,使得一个低权限用户对服务的注册表拥有写入权限,此时可以通过修改注册表来更改服务配置。例如,修改注册表中的ImagePath键,从而变更服务启动时的二进制文件路径。
①执行以下命令,通过AccessChk在目标主机中枚举“Authenticated Users”用户组具有写入权限的服务注册表。
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
②“Authenticated Users” 用户组对RegSvc服务的注册表拥有完全控制权限。执行以下命令,将该服务注册表中的ImagePath键指向预先上传的攻击载荷。
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RegSvc /v ImagePath /t
REG_ EXPAND SZ /d "cmd.exe /k C:\Users\Public\reverse_ tcp.exe" /f
③执行以下命令,检查当前用户对该服务是否拥有重启权限。
accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc
服务路径权限可控
如果目标主机上用户存在错误配置或操作,使得一个低权限的用户对此服务调用的二进制文件或其所在目录拥有写入权限,那么可以直接将该文件替换成攻击载荷,并随着服务的启动继承系统权限。
①执行以下命令,用Accesschk 查看InsexeSvc 这个服务的二进制文件所在目录是否有写入权限。
accesschk.exe /accepteula -quv "C:\Program Files \Insecure Executables\"
②在执行结果中可以看到,“INTERACTIVE"组对该文件夹具有完全控制权限,该
组包含所有能够登录到系统的成员。此时,测试人员可以将InsexeSvc 服务的二进制文件
替换成一个同名的攻击载荷,并随着服务的重启继承系统权限。
未引用的服务路径
未引用的服务路径(Unquoted Service Path)漏洞曾被称为可信任的服务路径(Trusted
Service Path), 利用了Windows 文件路径解析的特性。当服务启动所执行的二进制文件
的路径中包含空格且未有效包含在引号中时,就会导致该漏洞。
造成该漏洞的根本原因在于Windows系统中用于创建进程的CreateProcess函数.
如果完整路径中包含空格且未有效包含在引号中,那么对于该路径中的每个空格,Windows会按照从左到右的顺序依次尝试寻找并执行与空格前的名字相匹配的程序。例如,对于路径C:Program Files\Sub Dir\Program Name.exe,系统依次寻找并执行以下程序:C:\Program.exe,C:\Program Files\Sub.exe ,C:\Program Files\Sub Dir\Program.exe ,C:\Program Files\Sub Dir\Program Name.exe。
注意,当系统在依次尝试服务路径中的空格时,会以当前服务所拥有的权限进行。
因此,测试人员可以将一个经过特殊命名的攻击载荷上传到受影响的目录中,当重启服务时,攻击载荷将随着服务的启动继承系统权限。但前提是当前用户对受影响的目录具有写入权限。
①执行以下命令:
wmic service get DisplayName , PathName, StartMode|findstr /i /v "C:\Windows\" |findstr/i /v””
枚举目标聚标主机上所有该漏洞系统服务。
由执行结果可知,UnquotedSvc 这个服务的PathName为C:Program Files\UnquotedPath\Sub Dir\UnquotedSvc.exe,其中存在空格且没用使用引号进行包裹。
②用Accesschk检查受影响的目录,发现当前用户对受影响的目录拥有完全控制权
限。
accesschk.exe /accepteula -quv "Authenticated Users" "C: \Program Files \Unquoted Path\"
此时可以向C:lProgram Files\Unquoted Path目录上传一个名为“Sub.exe” 的攻击载荷。服务重启后,系统会按照前文中说过的顺序依次检查服务路径,当检查到C:lProgramFiles\Unquoted Path\Sub.exe时,攻击载荷将以SYSTEM权限执行。
为了避免该漏洞的影响,在使用sc创建系统服务时,应有效地对存在空格的服务路径使用引号进行包裹,类似如下:
sc create TestSvc binpath= "\"C:\Program Files\Sub Dir\Program Name.exe\""